@dxos/plugin-thread 0.8.4-main.422d1c7879 → 0.8.4-main.4f23b4e393

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 (397) hide show
  1. package/dist/lib/neutral/CallDebugPanel-CXWTCS7A.mjs +172 -0
  2. package/dist/lib/neutral/CallDebugPanel-CXWTCS7A.mjs.map +7 -0
  3. package/dist/lib/neutral/CallSidebar-4USJZ2SB.mjs +25 -0
  4. package/dist/lib/neutral/CallSidebar-4USJZ2SB.mjs.map +7 -0
  5. package/dist/lib/neutral/ChannelChat-6YTD5HWL.mjs +10 -0
  6. package/dist/lib/neutral/ChannelContainer-XHBF2NCK.mjs +9 -0
  7. package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs +208 -0
  8. package/dist/lib/neutral/ThreadCompanion-NQWPS2H6.mjs.map +7 -0
  9. package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs +61 -0
  10. package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs.map +7 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs +89 -0
  12. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  14. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  15. package/dist/lib/neutral/ThreadSettings-5Z5XIHG3.mjs +15 -0
  16. package/dist/lib/neutral/ThreadSettings-5Z5XIHG3.mjs.map +7 -0
  17. package/dist/lib/{browser/add-message-VPPFFLFL.mjs → neutral/add-message-HV5R66K4.mjs} +12 -22
  18. package/dist/lib/neutral/add-message-HV5R66K4.mjs.map +7 -0
  19. package/dist/lib/neutral/app-graph-builder-JDLHZ4XO.mjs +173 -0
  20. package/dist/lib/neutral/app-graph-builder-JDLHZ4XO.mjs.map +7 -0
  21. package/dist/lib/neutral/append-channel-message-PO33DR5V.mjs +40 -0
  22. package/dist/lib/neutral/append-channel-message-PO33DR5V.mjs.map +7 -0
  23. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  24. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  25. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  26. package/dist/lib/neutral/call-manager-JFA4DLWR.mjs +24 -0
  27. package/dist/lib/neutral/call-manager-JFA4DLWR.mjs.map +7 -0
  28. package/dist/lib/neutral/capabilities/index.mjs +29 -0
  29. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  30. package/dist/lib/neutral/chunk-44D7D4ZX.mjs +20 -0
  31. package/dist/lib/neutral/chunk-44D7D4ZX.mjs.map +7 -0
  32. package/dist/lib/{browser/blueprints/index.mjs → neutral/chunk-5T5LPLBN.mjs} +5 -6
  33. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-CROE4U4O.mjs +100 -0
  35. package/dist/lib/neutral/chunk-CROE4U4O.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-D5LGFCUY.mjs +55 -0
  37. package/dist/lib/neutral/chunk-D5LGFCUY.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-FWSMZWBO.mjs +178 -0
  39. package/dist/lib/neutral/chunk-FWSMZWBO.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-JLY4NVTA.mjs +38 -0
  41. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-KRXHIW4P.mjs +164 -0
  43. package/dist/lib/neutral/chunk-KRXHIW4P.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-MXJYXUS2.mjs +8 -0
  45. package/dist/lib/neutral/chunk-MXJYXUS2.mjs.map +7 -0
  46. package/dist/lib/{browser/chunk-VPM44Z35.mjs → neutral/chunk-OZRSYMYO.mjs} +101 -85
  47. package/dist/lib/neutral/chunk-OZRSYMYO.mjs.map +7 -0
  48. package/dist/lib/{browser/index.mjs → neutral/chunk-PZ7WTAA2.mjs} +88 -900
  49. package/dist/lib/neutral/chunk-PZ7WTAA2.mjs.map +7 -0
  50. package/dist/lib/neutral/chunk-S2AKEA2K.mjs +202 -0
  51. package/dist/lib/neutral/chunk-S2AKEA2K.mjs.map +7 -0
  52. package/dist/lib/neutral/components/index.mjs +1230 -0
  53. package/dist/lib/neutral/components/index.mjs.map +7 -0
  54. package/dist/lib/neutral/containers/index.mjs +19 -0
  55. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  56. package/dist/lib/{browser/create-UGT7V733.mjs → neutral/create-C3CICN35.mjs} +8 -11
  57. package/dist/lib/neutral/create-C3CICN35.mjs.map +7 -0
  58. package/dist/lib/neutral/create-channel-UEQESOFT.mjs +19 -0
  59. package/dist/lib/neutral/create-channel-UEQESOFT.mjs.map +7 -0
  60. package/dist/lib/neutral/create-object-HIEWSBZB.mjs +27 -0
  61. package/dist/lib/neutral/create-object-HIEWSBZB.mjs.map +7 -0
  62. package/dist/lib/{browser/create-proposals-CMK7S7VS.mjs → neutral/create-proposals-OZ4NCBBS.mjs} +5 -6
  63. package/dist/lib/neutral/create-proposals-OZ4NCBBS.mjs.map +7 -0
  64. package/dist/lib/{browser/delete-FSFVU6ZA.mjs → neutral/delete-AVFYFWMY.mjs} +8 -10
  65. package/dist/lib/neutral/delete-AVFYFWMY.mjs.map +7 -0
  66. package/dist/lib/{browser/delete-message-XL5M5J33.mjs → neutral/delete-message-EV2MKRTB.mjs} +9 -19
  67. package/dist/lib/neutral/delete-message-EV2MKRTB.mjs.map +7 -0
  68. package/dist/lib/neutral/hooks/index.mjs +19 -0
  69. package/dist/lib/neutral/hooks/index.mjs.map +7 -0
  70. package/dist/lib/neutral/index.mjs +68 -0
  71. package/dist/lib/neutral/index.mjs.map +7 -0
  72. package/dist/lib/neutral/markdown-BUORNCPG.mjs +83 -0
  73. package/dist/lib/neutral/markdown-BUORNCPG.mjs.map +7 -0
  74. package/dist/lib/neutral/meta.json +1 -0
  75. package/dist/lib/neutral/meta.mjs +10 -0
  76. package/dist/lib/neutral/meta.mjs.map +7 -0
  77. package/dist/lib/neutral/on-create-space-NQF7WGEB.mjs +23 -0
  78. package/dist/lib/neutral/on-create-space-NQF7WGEB.mjs.map +7 -0
  79. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  80. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  81. package/dist/lib/neutral/operations/index.mjs +8 -0
  82. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  83. package/dist/lib/neutral/plugin.mjs +16 -0
  84. package/dist/lib/neutral/plugin.mjs.map +7 -0
  85. package/dist/lib/neutral/react-root-VMMNUSSL.mjs +18 -0
  86. package/dist/lib/neutral/react-root-VMMNUSSL.mjs.map +7 -0
  87. package/dist/lib/neutral/react-surface-WPSVOTVG.mjs +94 -0
  88. package/dist/lib/neutral/react-surface-WPSVOTVG.mjs.map +7 -0
  89. package/dist/lib/{browser/restore-2ZGMKUSD.mjs → neutral/restore-MGLYOJ3Y.mjs} +6 -7
  90. package/dist/lib/neutral/restore-MGLYOJ3Y.mjs.map +7 -0
  91. package/dist/lib/{browser/restore-message-OYEGWPII.mjs → neutral/restore-message-ZIOA2MQJ.mjs} +8 -17
  92. package/dist/lib/neutral/restore-message-ZIOA2MQJ.mjs.map +7 -0
  93. package/dist/lib/{browser/select-VG2XLULE.mjs → neutral/select-CVCGBDHA.mjs} +7 -9
  94. package/dist/lib/neutral/select-CVCGBDHA.mjs.map +7 -0
  95. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  96. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  97. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  98. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  99. package/dist/lib/neutral/testing/index.mjs +58 -0
  100. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  101. package/dist/lib/{browser/toggle-resolved-MM6YC5BU.mjs → neutral/toggle-resolved-ZM4BHON5.mjs} +8 -17
  102. package/dist/lib/neutral/toggle-resolved-ZM4BHON5.mjs.map +7 -0
  103. package/dist/lib/neutral/translations.mjs +90 -0
  104. package/dist/lib/neutral/translations.mjs.map +7 -0
  105. package/dist/lib/neutral/types/index.mjs +12 -0
  106. package/dist/lib/neutral/types/index.mjs.map +7 -0
  107. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  108. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  109. package/dist/types/src/ThreadPlugin.d.ts +1 -0
  110. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  111. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  112. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  113. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  114. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  115. package/dist/types/src/blueprints/thread-blueprint.d.ts +2 -2
  116. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -1
  117. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  118. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  119. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  120. package/dist/types/src/calls/speaking-monitor.d.ts +0 -3
  121. package/dist/types/src/calls/speaking-monitor.d.ts.map +1 -1
  122. package/dist/types/src/calls/types.d.ts.map +1 -1
  123. package/dist/types/src/calls/util/audio.d.ts.map +1 -1
  124. package/dist/types/src/calls/util/calls-service.d.ts +2 -2
  125. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  126. package/dist/types/src/calls/util/history-cache.d.ts.map +1 -1
  127. package/dist/types/src/calls/util/media.d.ts.map +1 -1
  128. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  129. package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
  130. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  131. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  132. package/dist/types/src/capabilities/blueprint-definition.d.ts +2 -2
  133. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  134. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  135. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  136. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  137. package/dist/types/src/capabilities/index.d.ts +9 -3
  138. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  139. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  140. package/dist/types/src/capabilities/operation-handler.d.ts +1 -1
  141. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -1
  142. package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
  143. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  144. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  145. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  146. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -1
  147. package/dist/types/src/components/Call/Call.d.ts +32 -4
  148. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  149. package/dist/types/src/components/Call/Toolbar.d.ts +5 -5
  150. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  151. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  152. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  153. package/dist/types/src/components/Chat/index.d.ts +2 -0
  154. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  155. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -1
  156. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +70 -70
  157. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -1
  159. package/dist/types/src/components/Lobby/Lobby.d.ts +24 -3
  160. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  161. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  162. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  163. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  164. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -1
  165. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  166. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -1
  167. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +70 -70
  168. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  169. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  170. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -1
  171. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +70 -70
  172. package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -1
  173. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -1
  174. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +70 -70
  175. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -1
  176. package/dist/types/src/components/index.d.ts +1 -0
  177. package/dist/types/src/components/index.d.ts.map +1 -1
  178. package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -1
  179. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  180. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  181. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  182. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  183. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +1 -1
  184. package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -1
  185. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +70 -70
  186. package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -1
  187. package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -1
  188. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  189. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  190. package/dist/types/src/containers/{ChatContainer/ChatContainer.stories.d.ts → ThreadContainer/ThreadContainer.stories.d.ts} +71 -71
  191. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  192. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  193. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  194. package/dist/types/src/containers/index.d.ts +2 -1
  195. package/dist/types/src/containers/index.d.ts.map +1 -1
  196. package/dist/types/src/extensions/threads.d.ts +3 -3
  197. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  198. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  199. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  200. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  201. package/dist/types/src/index.d.ts +2 -2
  202. package/dist/types/src/index.d.ts.map +1 -1
  203. package/dist/types/src/operations/add-message.d.ts +3 -3
  204. package/dist/types/src/operations/add-message.d.ts.map +1 -1
  205. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  206. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  207. package/dist/types/src/operations/create-channel.d.ts +3 -3
  208. package/dist/types/src/operations/create-channel.d.ts.map +1 -1
  209. package/dist/types/src/operations/create-proposals.d.ts +3 -3
  210. package/dist/types/src/operations/create-proposals.d.ts.map +1 -1
  211. package/dist/types/src/operations/create.d.ts +3 -3
  212. package/dist/types/src/operations/create.d.ts.map +1 -1
  213. package/dist/types/src/operations/delete-message.d.ts +3 -3
  214. package/dist/types/src/operations/delete-message.d.ts.map +1 -1
  215. package/dist/types/src/operations/delete.d.ts +3 -3
  216. package/dist/types/src/operations/delete.d.ts.map +1 -1
  217. package/dist/types/src/operations/index.d.ts +1 -2
  218. package/dist/types/src/operations/index.d.ts.map +1 -1
  219. package/dist/types/src/operations/on-create-space.d.ts +3 -3
  220. package/dist/types/src/operations/on-create-space.d.ts.map +1 -1
  221. package/dist/types/src/operations/restore-message.d.ts +3 -3
  222. package/dist/types/src/operations/restore-message.d.ts.map +1 -1
  223. package/dist/types/src/operations/restore.d.ts +3 -3
  224. package/dist/types/src/operations/restore.d.ts.map +1 -1
  225. package/dist/types/src/operations/select.d.ts +3 -3
  226. package/dist/types/src/operations/select.d.ts.map +1 -1
  227. package/dist/types/src/operations/toggle-resolved.d.ts +3 -3
  228. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -1
  229. package/dist/types/src/plugin.d.ts +4 -0
  230. package/dist/types/src/plugin.d.ts.map +1 -0
  231. package/dist/types/src/testing/data.d.ts.map +1 -1
  232. package/dist/types/src/testing/index.d.ts +1 -1
  233. package/dist/types/src/testing/index.d.ts.map +1 -1
  234. package/dist/types/src/translations.d.ts +70 -70
  235. package/dist/types/src/translations.d.ts.map +1 -1
  236. package/dist/types/src/types/ThreadCapabilities.d.ts +26 -0
  237. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  238. package/dist/types/src/{operations/definitions.d.ts → types/ThreadOperation.d.ts} +864 -1673
  239. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  240. package/dist/types/src/types/index.d.ts +3 -2
  241. package/dist/types/src/types/index.d.ts.map +1 -1
  242. package/dist/types/src/types/types.d.ts +1 -1
  243. package/dist/types/src/types/types.d.ts.map +1 -1
  244. package/dist/types/src/util.d.ts +6 -3
  245. package/dist/types/src/util.d.ts.map +1 -1
  246. package/dist/types/tsconfig.tsbuildinfo +1 -1
  247. package/package.json +124 -86
  248. package/src/ThreadPlugin.node.ts +39 -0
  249. package/src/ThreadPlugin.test.ts +37 -0
  250. package/src/ThreadPlugin.tsx +13 -57
  251. package/src/blueprints/thread-blueprint.ts +3 -4
  252. package/src/calls/util/calls-service.ts +3 -1
  253. package/src/calls/util/stub-media-streams.ts +3 -1
  254. package/src/capabilities/app-graph-builder.ts +21 -19
  255. package/src/capabilities/blueprint-definition.ts +2 -0
  256. package/src/capabilities/call-manager.ts +1 -1
  257. package/src/capabilities/create-object.ts +29 -0
  258. package/src/capabilities/index.ts +3 -1
  259. package/src/capabilities/markdown.ts +6 -2
  260. package/src/capabilities/operation-handler.ts +1 -1
  261. package/src/capabilities/react-surface.tsx +13 -7
  262. package/src/capabilities/settings.ts +1 -3
  263. package/src/capabilities/undo-mappings.ts +1 -1
  264. package/src/components/Call/Call.tsx +5 -5
  265. package/src/components/Call/Toolbar.tsx +1 -1
  266. package/src/components/Chat/Chat.tsx +258 -0
  267. package/src/components/Chat/index.ts +5 -0
  268. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +6 -4
  269. package/src/components/CommentsPanel/CommentsPanel.tsx +4 -4
  270. package/src/components/CommentsPanel/CommentsThread.tsx +2 -3
  271. package/src/components/Lobby/Lobby.tsx +5 -4
  272. package/src/components/MessagePanel/MessagePanel.tsx +8 -9
  273. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +2 -1
  274. package/src/components/ResponsiveGrid/ResponsivePanel.stories.tsx +2 -1
  275. package/src/components/ResponsiveGrid/ResponsivePanel.tsx +3 -5
  276. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +2 -1
  277. package/src/components/index.ts +1 -0
  278. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  279. package/src/containers/ChannelChat/index.ts +8 -0
  280. package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +54 -10
  281. package/src/containers/ChannelContainer/ChannelContainer.tsx +4 -4
  282. package/src/containers/ThreadCompanion/ThreadCompanion.tsx +10 -12
  283. package/src/containers/{ChatContainer/ChatContainer.stories.tsx → ThreadContainer/ThreadContainer.stories.tsx} +10 -11
  284. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  285. package/src/containers/ThreadContainer/index.ts +8 -0
  286. package/src/containers/index.ts +2 -1
  287. package/src/extensions/command.ts +1 -1
  288. package/src/extensions/threads.ts +9 -9
  289. package/src/hooks/analytics.ts +1 -1
  290. package/src/index.ts +4 -3
  291. package/src/operations/add-message.ts +7 -7
  292. package/src/operations/append-channel-message.ts +37 -0
  293. package/src/operations/create-channel.ts +4 -4
  294. package/src/operations/create-proposals.ts +3 -3
  295. package/src/operations/create.ts +4 -4
  296. package/src/operations/delete-message.ts +6 -6
  297. package/src/operations/delete.ts +4 -4
  298. package/src/operations/index.ts +2 -4
  299. package/src/operations/on-create-space.ts +4 -4
  300. package/src/operations/restore-message.ts +5 -5
  301. package/src/operations/restore.ts +4 -4
  302. package/src/operations/select.ts +3 -3
  303. package/src/operations/toggle-resolved.ts +5 -5
  304. package/src/plugin.ts +11 -0
  305. package/src/testing/index.ts +1 -1
  306. package/src/translations.ts +1 -1
  307. package/src/types/ThreadCapabilities.ts +41 -0
  308. package/src/{operations/definitions.ts → types/ThreadOperation.ts} +14 -13
  309. package/src/types/index.ts +4 -2
  310. package/src/types/types.ts +0 -2
  311. package/src/util.ts +36 -4
  312. package/dist/lib/browser/add-message-VPPFFLFL.mjs.map +0 -7
  313. package/dist/lib/browser/blueprints/index.mjs.map +0 -7
  314. package/dist/lib/browser/chunk-MESW3R4Q.mjs +0 -61
  315. package/dist/lib/browser/chunk-MESW3R4Q.mjs.map +0 -7
  316. package/dist/lib/browser/chunk-VPM44Z35.mjs.map +0 -7
  317. package/dist/lib/browser/create-UGT7V733.mjs.map +0 -7
  318. package/dist/lib/browser/create-channel-EF67LCS6.mjs +0 -21
  319. package/dist/lib/browser/create-channel-EF67LCS6.mjs.map +0 -7
  320. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs +0 -28
  321. package/dist/lib/browser/create-channel-thread-CCZTSWQ6.mjs.map +0 -7
  322. package/dist/lib/browser/create-proposals-CMK7S7VS.mjs.map +0 -7
  323. package/dist/lib/browser/delete-FSFVU6ZA.mjs.map +0 -7
  324. package/dist/lib/browser/delete-message-XL5M5J33.mjs.map +0 -7
  325. package/dist/lib/browser/index.mjs.map +0 -7
  326. package/dist/lib/browser/meta.json +0 -1
  327. package/dist/lib/browser/on-create-space-VYS2JGVT.mjs +0 -25
  328. package/dist/lib/browser/on-create-space-VYS2JGVT.mjs.map +0 -7
  329. package/dist/lib/browser/operations/index.mjs +0 -14
  330. package/dist/lib/browser/operations/index.mjs.map +0 -7
  331. package/dist/lib/browser/restore-2ZGMKUSD.mjs.map +0 -7
  332. package/dist/lib/browser/restore-message-OYEGWPII.mjs.map +0 -7
  333. package/dist/lib/browser/select-VG2XLULE.mjs.map +0 -7
  334. package/dist/lib/browser/toggle-resolved-MM6YC5BU.mjs.map +0 -7
  335. package/dist/lib/browser/types/index.mjs +0 -12
  336. package/dist/lib/node-esm/add-message-XWKHLNS6.mjs +0 -98
  337. package/dist/lib/node-esm/add-message-XWKHLNS6.mjs.map +0 -7
  338. package/dist/lib/node-esm/blueprints/index.mjs +0 -38
  339. package/dist/lib/node-esm/blueprints/index.mjs.map +0 -7
  340. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  341. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs +0 -260
  342. package/dist/lib/node-esm/chunk-JTHXNWKJ.mjs.map +0 -7
  343. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs +0 -62
  344. package/dist/lib/node-esm/chunk-SDRAQNSQ.mjs.map +0 -7
  345. package/dist/lib/node-esm/create-XAYNDVU2.mjs +0 -56
  346. package/dist/lib/node-esm/create-XAYNDVU2.mjs.map +0 -7
  347. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs +0 -22
  348. package/dist/lib/node-esm/create-channel-UYWUNB3L.mjs.map +0 -7
  349. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs +0 -29
  350. package/dist/lib/node-esm/create-channel-thread-UQF2SBHS.mjs.map +0 -7
  351. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs +0 -58
  352. package/dist/lib/node-esm/create-proposals-5FJNURKH.mjs.map +0 -7
  353. package/dist/lib/node-esm/delete-WRODXR3E.mjs +0 -60
  354. package/dist/lib/node-esm/delete-WRODXR3E.mjs.map +0 -7
  355. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs +0 -65
  356. package/dist/lib/node-esm/delete-message-TAHCYTW2.mjs.map +0 -7
  357. package/dist/lib/node-esm/index.mjs +0 -2335
  358. package/dist/lib/node-esm/index.mjs.map +0 -7
  359. package/dist/lib/node-esm/meta.json +0 -1
  360. package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs +0 -26
  361. package/dist/lib/node-esm/on-create-space-XDY2YXPV.mjs.map +0 -7
  362. package/dist/lib/node-esm/operations/index.mjs +0 -15
  363. package/dist/lib/node-esm/operations/index.mjs.map +0 -7
  364. package/dist/lib/node-esm/restore-T3QA7TSL.mjs +0 -34
  365. package/dist/lib/node-esm/restore-T3QA7TSL.mjs.map +0 -7
  366. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs +0 -43
  367. package/dist/lib/node-esm/restore-message-WFTEVBEV.mjs.map +0 -7
  368. package/dist/lib/node-esm/select-Q4UDWJJF.mjs +0 -27
  369. package/dist/lib/node-esm/select-Q4UDWJJF.mjs.map +0 -7
  370. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs +0 -46
  371. package/dist/lib/node-esm/toggle-resolved-33XTAK2H.mjs.map +0 -7
  372. package/dist/lib/node-esm/types/index.mjs +0 -13
  373. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +0 -16
  374. package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +0 -1
  375. package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +0 -1
  376. package/dist/types/src/containers/ChatContainer/index.d.ts +0 -4
  377. package/dist/types/src/containers/ChatContainer/index.d.ts.map +0 -1
  378. package/dist/types/src/operations/create-channel-thread.d.ts +0 -5
  379. package/dist/types/src/operations/create-channel-thread.d.ts.map +0 -1
  380. package/dist/types/src/operations/definitions.d.ts.map +0 -1
  381. package/dist/types/src/testing/stories.d.ts +0 -3
  382. package/dist/types/src/testing/stories.d.ts.map +0 -1
  383. package/dist/types/src/types/Channel.d.ts +0 -715
  384. package/dist/types/src/types/Channel.d.ts.map +0 -1
  385. package/dist/types/src/types/capabilities.d.ts +0 -24
  386. package/dist/types/src/types/capabilities.d.ts.map +0 -1
  387. package/src/containers/ChatContainer/ChatContainer.tsx +0 -131
  388. package/src/containers/ChatContainer/index.ts +0 -8
  389. package/src/operations/create-channel-thread.ts +0 -26
  390. package/src/testing/stories.ts +0 -51
  391. package/src/types/Channel.ts +0 -37
  392. package/src/types/capabilities.ts +0 -36
  393. /package/dist/lib/{browser/chunk-J5LGTIGS.mjs.map → neutral/ChannelChat-6YTD5HWL.mjs.map} +0 -0
  394. /package/dist/lib/{browser/types/index.mjs.map → neutral/ChannelContainer-XHBF2NCK.mjs.map} +0 -0
  395. /package/dist/lib/{node-esm/types → neutral/blueprints}/index.mjs.map +0 -0
  396. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  397. /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
@@ -0,0 +1,29 @@
1
+ import "../chunk-J5LGTIGS.mjs";
2
+
3
+ // src/capabilities/index.ts
4
+ import { Capability } from "@dxos/app-framework";
5
+ var AppGraphBuilder = Capability.lazy("AppGraphBuilder", () => import("../app-graph-builder-JDLHZ4XO.mjs"));
6
+ var BlueprintDefinition = Capability.lazy("BlueprintDefinition", () => import("../blueprint-definition-S3EBOH4R.mjs"));
7
+ var CreateObject = Capability.lazy("CreateObject", () => import("../create-object-HIEWSBZB.mjs"));
8
+ var CallManager = Capability.lazy("CallManager", () => import("../call-manager-JFA4DLWR.mjs"));
9
+ var Markdown = Capability.lazy("Markdown", () => import("../markdown-BUORNCPG.mjs"));
10
+ var OperationHandler = Capability.lazy("OperationHandler", () => import("../operation-handler-RU6K2S4L.mjs"));
11
+ var ReactRoot = Capability.lazy("ReactRoot", () => import("../react-root-VMMNUSSL.mjs"));
12
+ var ReactSurface = Capability.lazy("ReactSurface", () => import("../react-surface-WPSVOTVG.mjs"));
13
+ var ThreadSettings = Capability.lazy("ThreadSettings", () => import("../settings-HK4EB6TF.mjs"));
14
+ var ThreadState = Capability.lazy("ThreadState", () => import("../state-UU7VEAKV.mjs"));
15
+ var UndoMappings = Capability.lazy("UndoMappings", () => import("../undo-mappings-HOKL2L3M.mjs"));
16
+ export {
17
+ AppGraphBuilder,
18
+ BlueprintDefinition,
19
+ CallManager,
20
+ CreateObject,
21
+ Markdown,
22
+ OperationHandler,
23
+ ReactRoot,
24
+ ReactSurface,
25
+ ThreadSettings,
26
+ ThreadState,
27
+ UndoMappings
28
+ };
29
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/capabilities/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capability } from '@dxos/app-framework';\n// eslint-disable-next-line unused-imports/no-unused-imports\nimport type { Blueprint, OperationHandlerSet } from '@dxos/compute';\n\nexport const AppGraphBuilder = Capability.lazy('AppGraphBuilder', () => import('./app-graph-builder'));\nexport const BlueprintDefinition = Capability.lazy('BlueprintDefinition', () => import('./blueprint-definition'));\nexport const CreateObject = Capability.lazy('CreateObject', () => import('./create-object'));\nexport const CallManager = Capability.lazy('CallManager', () => import('./call-manager'));\nexport const Markdown = Capability.lazy('Markdown', () => import('./markdown'));\nexport const OperationHandler = Capability.lazy<OperationHandlerSet.OperationHandlerSet>(\n 'OperationHandler',\n () => import('./operation-handler'),\n);\nexport const ReactRoot = Capability.lazy('ReactRoot', () => import('./react-root'));\nexport const ReactSurface = Capability.lazy('ReactSurface', () => import('./react-surface'));\nexport const ThreadSettings = Capability.lazy('ThreadSettings', () => import('./settings'));\nexport const ThreadState = Capability.lazy('ThreadState', () => import('./state'));\nexport const UndoMappings = Capability.lazy('UndoMappings', () => import('./undo-mappings'));\n"],
5
+ "mappings": ";;;AAIA,SAASA,kBAAkB;AAIpB,IAAMC,kBAAkBD,WAAWE,KAAK,mBAAmB,MAAM,OAAO,mCAAA,CAAA;AACxE,IAAMC,sBAAsBH,WAAWE,KAAK,uBAAuB,MAAM,OAAO,sCAAA,CAAA;AAChF,IAAME,eAAeJ,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;AAClE,IAAMG,cAAcL,WAAWE,KAAK,eAAe,MAAM,OAAO,8BAAA,CAAA;AAChE,IAAMI,WAAWN,WAAWE,KAAK,YAAY,MAAM,OAAO,0BAAA,CAAA;AAC1D,IAAMK,mBAAmBP,WAAWE,KACzC,oBACA,MAAM,OAAO,mCAAA,CAAA;AAER,IAAMM,YAAYR,WAAWE,KAAK,aAAa,MAAM,OAAO,4BAAA,CAAA;AAC5D,IAAMO,eAAeT,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;AAClE,IAAMQ,iBAAiBV,WAAWE,KAAK,kBAAkB,MAAM,OAAO,0BAAA,CAAA;AACtE,IAAMS,cAAcX,WAAWE,KAAK,eAAe,MAAM,OAAO,uBAAA,CAAA;AAChE,IAAMU,eAAeZ,WAAWE,KAAK,gBAAgB,MAAM,OAAO,+BAAA,CAAA;",
6
+ "names": ["Capability", "AppGraphBuilder", "lazy", "BlueprintDefinition", "CreateObject", "CallManager", "Markdown", "OperationHandler", "ReactRoot", "ReactSurface", "ThreadSettings", "ThreadState", "UndoMappings"]
7
+ }
@@ -0,0 +1,20 @@
1
+ // src/meta.ts
2
+ import { trim } from "@dxos/util";
3
+ var meta = {
4
+ id: "org.dxos.plugin.thread",
5
+ name: "Chat",
6
+ description: trim`
7
+ Multi-modal communication platform supporting text chat, voice, and video conferencing.
8
+ Create threaded conversations and add contextual comments directly on any workspace object.
9
+ `,
10
+ icon: "ph--video-conference--regular",
11
+ iconHue: "rose",
12
+ source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-thread"
13
+ };
14
+ var THREAD_ITEM = `${meta.id}.item`;
15
+
16
+ export {
17
+ meta,
18
+ THREAD_ITEM
19
+ };
20
+ //# sourceMappingURL=chunk-44D7D4ZX.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/meta.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\n// TODO(wittjosiah): Needs screenshots.\nexport const meta: Plugin.Meta = {\n id: 'org.dxos.plugin.thread',\n name: 'Chat',\n description: trim`\n Multi-modal communication platform supporting text chat, voice, and video conferencing.\n Create threaded conversations and add contextual comments directly on any workspace object.\n `,\n icon: 'ph--video-conference--regular',\n iconHue: 'rose',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-thread',\n};\n\nexport const THREAD_ITEM = `${meta.id}.item`;\n"],
5
+ "mappings": ";AAKA,SAASA,YAAY;AAGd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaJ;;;;EAIbK,MAAM;EACNC,SAAS;EACTC,QAAQ;AACV;AAEO,IAAMC,cAAc,GAAGP,KAAKC,EAAE;",
6
+ "names": ["trim", "meta", "id", "name", "description", "icon", "iconHue", "source", "THREAD_ITEM"]
7
+ }
@@ -1,9 +1,7 @@
1
- import "../chunk-J5LGTIGS.mjs";
2
-
3
1
  // src/blueprints/thread-blueprint.ts
4
- import { Blueprint, Template } from "@dxos/blueprints";
2
+ import { Blueprint, Template } from "@dxos/compute";
5
3
  import { trim } from "@dxos/util";
6
- import { ThreadOperation } from "#operations";
4
+ import { ThreadOperation } from "#types";
7
5
  var BLUEPRINT_KEY = "org.dxos.blueprint.thread";
8
6
  var make = () => Blueprint.make({
9
7
  key: BLUEPRINT_KEY,
@@ -31,7 +29,8 @@ var blueprint = {
31
29
  make
32
30
  };
33
31
  var thread_blueprint_default = blueprint;
32
+
34
33
  export {
35
- thread_blueprint_default as ThreadBlueprint
34
+ thread_blueprint_default
36
35
  };
37
- //# sourceMappingURL=index.mjs.map
36
+ //# sourceMappingURL=chunk-5T5LPLBN.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/blueprints/thread-blueprint.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Blueprint, Template } from '@dxos/compute';\nimport { trim } from '@dxos/util';\n\nimport { ThreadOperation } from '#types';\n\nconst BLUEPRINT_KEY = 'org.dxos.blueprint.thread';\n\nconst make = () =>\n Blueprint.make({\n key: BLUEPRINT_KEY,\n name: 'Thread',\n tools: Blueprint.toolDefinitions({ operations: [ThreadOperation.CreateProposals] }),\n instructions: Template.make({\n // TODO(wittjosiah): Move example to function input schema annotation.\n source: trim`\n You can update markdown documents via proposals.\n For each diff, respond with the smallest possible matching span.\n For example:\n - \"There is a tyop in this sentence.\"\n + \"There is a typo in this sentence.\"\n - \"This id goof.\"\n + \"This is good.\"\n `,\n }),\n });\n\nconst blueprint: Blueprint.Definition = {\n key: BLUEPRINT_KEY,\n make,\n};\n\nexport default blueprint;\n"],
5
+ "mappings": ";AAIA,SAASA,WAAWC,gBAAgB;AACpC,SAASC,YAAY;AAErB,SAASC,uBAAuB;AAEhC,IAAMC,gBAAgB;AAEtB,IAAMC,OAAO,MACXL,UAAUK,KAAK;EACbC,KAAKF;EACLG,MAAM;EACNC,OAAOR,UAAUS,gBAAgB;IAAEC,YAAY;MAACP,gBAAgBQ;;EAAiB,CAAA;EACjFC,cAAcX,SAASI,KAAK;;IAE1BQ,QAAQX;;;;;;;;;EASV,CAAA;AACF,CAAA;AAEF,IAAMY,YAAkC;EACtCR,KAAKF;EACLC;AACF;AAEA,IAAA,2BAAeS;",
6
+ "names": ["Blueprint", "Template", "trim", "ThreadOperation", "BLUEPRINT_KEY", "make", "key", "name", "tools", "toolDefinitions", "operations", "CreateProposals", "instructions", "source", "blueprint"]
7
+ }
@@ -0,0 +1,100 @@
1
+ // src/calls/util/stub-media-streams.ts
2
+ import { scheduleTaskInterval, waitForCondition } from "@dxos/async";
3
+ import { cancelWithContext } from "@dxos/context";
4
+ import { invariant } from "@dxos/invariant";
5
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/stub-media-streams.ts";
6
+ var createBlackCanvasStreamTrack = async ({ ctx, width, height }) => {
7
+ const canvas = document.createElement("canvas");
8
+ canvas.width = width;
9
+ canvas.height = height;
10
+ const canvasCtx = canvas.getContext("2d");
11
+ invariant(canvasCtx, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 16, S: void 0, A: ["canvasCtx", ""] });
12
+ const drawFrame = () => {
13
+ canvasCtx.fillStyle = "black";
14
+ canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
15
+ };
16
+ scheduleTaskInterval(ctx, async () => drawFrame(), 200);
17
+ const track = canvas.captureStream().getVideoTracks()[0];
18
+ drawFrame();
19
+ await cancelWithContext(ctx, waitForCondition({
20
+ condition: () => track.readyState === "live",
21
+ timeout: 1e3
22
+ }));
23
+ return track;
24
+ };
25
+ var audioContextStartedPreviously = false;
26
+ var userGestureEvents = [
27
+ "click",
28
+ "contextmenu",
29
+ "auxclick",
30
+ "dblclick",
31
+ "mousedown",
32
+ "mouseup",
33
+ "pointerup",
34
+ "touchend",
35
+ "keydown",
36
+ "keyup"
37
+ ];
38
+ var createInaudibleAudioStreamTrack = async ({ ctx }) => {
39
+ const audioContext = new window.AudioContext();
40
+ const oscillator = audioContext.createOscillator();
41
+ oscillator.type = "triangle";
42
+ oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
43
+ const gainNode = audioContext.createGain();
44
+ gainNode.gain.setValueAtTime(0, audioContext.currentTime);
45
+ oscillator.connect(gainNode);
46
+ const destination = audioContext.createMediaStreamDestination();
47
+ gainNode.connect(destination);
48
+ let oscillatorStarted = false;
49
+ const ensureOscillatorStarted = () => {
50
+ if (oscillatorStarted) {
51
+ return;
52
+ }
53
+ oscillator.start();
54
+ oscillatorStarted = true;
55
+ };
56
+ const stateChangeHandler = () => {
57
+ if (audioContext.state === "running") {
58
+ audioContextStartedPreviously = true;
59
+ ensureOscillatorStarted();
60
+ }
61
+ if (audioContext.state === "suspended" || audioContext.state === "interrupted") {
62
+ resumeAudioContext();
63
+ }
64
+ };
65
+ audioContext.addEventListener("statechange", stateChangeHandler);
66
+ const resumeAudioContext = () => {
67
+ void audioContext.resume().then(() => {
68
+ cleanUpUserGestureListeners();
69
+ });
70
+ };
71
+ const cleanUpUserGestureListeners = () => {
72
+ userGestureEvents.forEach((gesture) => {
73
+ document.removeEventListener(gesture, resumeAudioContext, {
74
+ capture: true
75
+ });
76
+ });
77
+ };
78
+ if (audioContextStartedPreviously) {
79
+ resumeAudioContext();
80
+ } else {
81
+ userGestureEvents.forEach((gesture) => {
82
+ document.addEventListener(gesture, resumeAudioContext, {
83
+ capture: true
84
+ });
85
+ });
86
+ }
87
+ ctx.onDispose(async () => {
88
+ cleanUpUserGestureListeners();
89
+ oscillator.disconnect();
90
+ oscillator.stop();
91
+ await audioContext.close();
92
+ });
93
+ return destination.stream.getAudioTracks()[0];
94
+ };
95
+
96
+ export {
97
+ createBlackCanvasStreamTrack,
98
+ createInaudibleAudioStreamTrack
99
+ };
100
+ //# sourceMappingURL=chunk-CROE4U4O.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/calls/util/stub-media-streams.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n//\n\nimport { scheduleTaskInterval, waitForCondition } from '@dxos/async';\nimport { type Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Creates a black canvas stream track.\n * We need this to to have black rectangle video that is live (have frames) when video feed is disabled.\n */\nexport const createBlackCanvasStreamTrack = async ({\n ctx,\n width,\n height,\n}: {\n ctx: Context;\n width: number;\n height: number;\n}): Promise<MediaStreamTrack> => {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n\n const canvasCtx = canvas.getContext('2d');\n invariant(canvasCtx);\n const drawFrame = () => {\n canvasCtx.fillStyle = 'black';\n canvasCtx.fillRect(0, 0, canvas.width, canvas.height);\n };\n scheduleTaskInterval(ctx, async () => drawFrame(), 200);\n\n const track = canvas.captureStream().getVideoTracks()[0];\n drawFrame();\n\n await cancelWithContext(ctx, waitForCondition({ condition: () => track.readyState === 'live', timeout: 1_000 }));\n\n return track;\n};\n\nlet audioContextStartedPreviously = false;\nconst userGestureEvents = [\n 'click',\n 'contextmenu',\n 'auxclick',\n 'dblclick',\n 'mousedown',\n 'mouseup',\n 'pointerup',\n 'touchend',\n 'keydown',\n 'keyup',\n];\n\n/**\n * Creates an inaudible audio stream track.\n * We need this to have audio track available when audio is disabled.\n */\nexport const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context }): Promise<MediaStreamTrack> => {\n const audioContext = new window.AudioContext();\n\n const oscillator = audioContext.createOscillator();\n oscillator.type = 'triangle';\n oscillator.frequency.setValueAtTime(20, audioContext.currentTime);\n\n const gainNode = audioContext.createGain();\n gainNode.gain.setValueAtTime(0, audioContext.currentTime);\n oscillator.connect(gainNode);\n\n const destination = audioContext.createMediaStreamDestination();\n gainNode.connect(destination);\n\n let oscillatorStarted = false;\n const ensureOscillatorStarted = () => {\n if (oscillatorStarted) {\n return;\n }\n oscillator.start();\n oscillatorStarted = true;\n };\n\n const stateChangeHandler = () => {\n if (audioContext.state === 'running') {\n audioContextStartedPreviously = true;\n ensureOscillatorStarted();\n }\n\n if (audioContext.state === 'suspended' || (audioContext.state as string) === 'interrupted') {\n resumeAudioContext();\n }\n };\n\n audioContext.addEventListener('statechange', stateChangeHandler);\n\n const resumeAudioContext = () => {\n void audioContext.resume().then(() => {\n cleanUpUserGestureListeners();\n });\n };\n\n const cleanUpUserGestureListeners = () => {\n userGestureEvents.forEach((gesture) => {\n document.removeEventListener(gesture, resumeAudioContext, {\n capture: true,\n });\n });\n };\n\n if (audioContextStartedPreviously) {\n resumeAudioContext();\n } else {\n userGestureEvents.forEach((gesture) => {\n document.addEventListener(gesture, resumeAudioContext, {\n capture: true,\n });\n });\n }\n\n ctx.onDispose(async () => {\n cleanUpUserGestureListeners();\n oscillator.disconnect();\n oscillator.stop();\n await audioContext.close();\n });\n\n return destination.stream.getAudioTracks()[0];\n};\n"],
5
+ "mappings": ";AAKA,SAASA,sBAAsBC,wBAAwB;AACvD,SAAuBC,yBAAyB;AAChD,SAASC,iBAAiB;AAE1B,IAAA,eAAA;AAcSC,IAAK,+BAAGA,OAAAA,EAAAA,KAAAA,OAAAA,OAAAA,MAAAA;AACfC,QAAAA,SAAa,SAAGC,cAAAA,QAAAA;AAEhB,SAAMC,QAAAA;AACNJ,SAAAA,SAAUI;AACV,QAAMC,YAAY,OAAA,WAAA,IAAA;YAChBD,WAAUE,QAAY,EAAA,YAAA,YAAA,GAAA,cAAA,GAAA,IAAA,GAAA,QAAA,GAAA,CAAA,aAAA,EAAA,EAAA,CAAA;QACtBF,YAAUG,MAAQ;AACpB,cAAA,YAAA;AACAV,cAAAA,SAAqBW,GAAK,GAAA,OAAYH,OAAAA,OAAa,MAAA;EAEnD;AACAA,uBAAAA,KAAAA,YAAAA,UAAAA,GAAAA,GAAAA;AAEA,QAAMN,QAAAA,OAAAA,cAAuBD,EAAAA,eAAiB,EAAA,CAAA;YAAEW;QAA8CC,kBAAS,KAAA,iBAAA;IAAM,WAAA,MAAA,MAAA,eAAA;IAE7G,SAAOC;EACP,CAAA,CAAA;AAEEC,SAAAA;AACJ;IACE,gCAAA;IACA,oBAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;EAED;;AAOQC,IAAAA,kCAA0BC,OAAgB,EAAA,IAAA,MAAA;AAChDD,QAAAA,eAAkB,IAAA,OAAA,aAAA;AAClBA,QAAAA,aAAWE,aAAUC,iBAAmBC;AAExC,aAAMC,OAAWD;AACjBC,aAASC,UAAKH,eAAkBC,IAAAA,aAAaG,WAAW;AACxDP,QAAAA,WAAWQ,aAAQH,WAAAA;AAEnB,WAAMI,KAAAA,eAAcL,GAAAA,aAAaM,WAAAA;AACjCL,aAASG,QAAQC,QAAAA;AAEjB,QAAIE,cAAAA,aAAoB,6BAAA;AACxB,WAAMC,QAAAA,WAAAA;MACJ,oBAAID;kCACF,MAAA;AACF,QAAA,mBAAA;AACAX;IACAW;AACF,eAAA,MAAA;AAEA,wBAAME;;6BAEFd,MAAAA;QACAa,aAAAA,UAAAA,WAAAA;AACF,sCAAA;AAEIR,8BAAuB;;AAE3B,QAAA,aAAA,UAAA,eAAA,aAAA,UAAA,eAAA;AACF,yBAAA;IAEAA;EAEA;eACOA,iBAAmB,eAAQ,kBAAA;6BAC9BU,MAAAA;AACF,SAAA,aAAA,OAAA,EAAA,KAAA,MAAA;AACF,kCAAA;IAEA,CAAA;;sCAEgC,MAACC;sBAClB,QAAA,CAAA,YAAA;AACX,eAAA,oBAAA,SAAA,oBAAA;QACF,SAAA;MACF,CAAA;IAEIhB,CAAAA;;AAEJ,MAAA,+BAAO;AACLiB,uBAAkBC;;sBAEL,QAAA,CAAA,YAAA;AACX,eAAA,iBAAA,SAAA,oBAAA;QACF,SAAA;MACF,CAAA;IAEIC,CAAAA;;MAEFlB,UAAAA,YAAWmB;AACXnB,gCAAe;AACf,eAAMI,WAAagB;AACrB,eAAA,KAAA;AAEA,UAAOX,aAAYY,MAAOC;EAC1B,CAAA;;;",
6
+ "names": ["scheduleTaskInterval", "waitForCondition", "cancelWithContext", "invariant", "width", "canvas", "height", "canvasCtx", "drawFrame", "fillStyle", "fillRect", "ctx", "condition", "timeout", "track", "audioContextStartedPreviously", "oscillator", "createOscillator", "frequency", "setValueAtTime", "audioContext", "gainNode", "gain", "currentTime", "connect", "destination", "createMediaStreamDestination", "oscillatorStarted", "ensureOscillatorStarted", "stateChangeHandler", "cleanUpUserGestureListeners", "gesture", "userGestureEvents", "forEach", "onDispose", "disconnect", "close", "stream", "getAudioTracks"]
7
+ }
@@ -0,0 +1,55 @@
1
+ // src/containers/ChannelChat/ChannelChat.tsx
2
+ import React from "react";
3
+ import { useOperationInvoker } from "@dxos/app-framework/ui";
4
+ import { Filter, Obj, Query } from "@dxos/echo";
5
+ import { useMembers, useQuery } from "@dxos/react-client/echo";
6
+ import { useIdentity } from "@dxos/react-client/halo";
7
+ import { Message } from "@dxos/types";
8
+ import { composable, composableProps } from "@dxos/ui-theme";
9
+ import { Chat } from "#components";
10
+ import { useStatus } from "#hooks";
11
+ import { ThreadOperation } from "#types";
12
+ var ChannelChat = composable(({ space, channel, ...props }, forwardedRef) => {
13
+ const identity = useIdentity();
14
+ const members = useMembers(space.id);
15
+ const id = Obj.getDXN(channel).toString();
16
+ const activity = useStatus(space, id);
17
+ const { invokePromise } = useOperationInvoker();
18
+ const feed = channel.feed?.target;
19
+ const messages = useQuery(space.db, feed ? Query.select(Filter.type(Message.Message)).from(feed) : Query.select(Filter.nothing()));
20
+ const readOnly = Obj.getMeta(channel).keys.length > 0;
21
+ const handleSend = (text) => {
22
+ if (readOnly) {
23
+ return false;
24
+ }
25
+ void invokePromise(ThreadOperation.AppendChannelMessage, {
26
+ channel,
27
+ sender: {
28
+ identityDid: identity.did
29
+ },
30
+ text
31
+ });
32
+ return true;
33
+ };
34
+ return /* @__PURE__ */ React.createElement(Chat, {
35
+ ...composableProps(props),
36
+ id,
37
+ identity,
38
+ members,
39
+ messages,
40
+ activity,
41
+ onSend: handleSend,
42
+ orientation: "bottom",
43
+ readOnly,
44
+ ref: forwardedRef
45
+ });
46
+ });
47
+
48
+ // src/containers/ChannelChat/index.ts
49
+ var ChannelChat_default = ChannelChat;
50
+
51
+ export {
52
+ ChannelChat,
53
+ ChannelChat_default
54
+ };
55
+ //# sourceMappingURL=chunk-D5LGFCUY.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/containers/ChannelChat/ChannelChat.tsx", "../../../src/containers/ChannelChat/index.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2026 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { Filter, Obj, Query } from '@dxos/echo';\nimport { type Space, useMembers, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { type Channel, Message } from '@dxos/types';\nimport { composable, composableProps } from '@dxos/ui-theme';\n\nimport { Chat } from '#components';\nimport { useStatus } from '#hooks';\nimport { ThreadOperation } from '#types';\n\nexport type ChannelChatProps = {\n space: Space;\n channel: Channel.Channel;\n};\n\n/**\n * Channel chat: composer pinned to the bottom of the panel, messages scrolling\n * above it (newest at the bottom). Threading via `Message.threadId` is\n * intentionally not reconstructed in this round.\n *\n * Externally-synced channels (any Channel carrying foreign-key `Obj.Meta`,\n * e.g. Slack/Discord-sourced rooms) render read-only — the composer is\n * suppressed because there's no local-write path back to the source.\n */\nexport const ChannelChat = composable<HTMLDivElement, ChannelChatProps>(\n ({ space, channel, ...props }, forwardedRef) => {\n const identity = useIdentity()!;\n const members = useMembers(space.id);\n const id = Obj.getDXN(channel).toString();\n const activity = useStatus(space, id);\n const { invokePromise } = useOperationInvoker();\n\n const feed = channel.feed?.target;\n const messages = useQuery(\n space.db,\n feed ? Query.select(Filter.type(Message.Message)).from(feed) : Query.select(Filter.nothing()),\n );\n\n const readOnly = Obj.getMeta(channel).keys.length > 0;\n\n const handleSend = (text: string) => {\n if (readOnly) {\n return false;\n }\n void invokePromise(ThreadOperation.AppendChannelMessage, {\n channel,\n sender: { identityDid: identity.did },\n text,\n });\n return true;\n };\n\n return (\n <Chat\n {...composableProps(props)}\n id={id}\n identity={identity}\n members={members}\n messages={messages}\n activity={activity}\n onSend={handleSend}\n orientation='bottom'\n readOnly={readOnly}\n ref={forwardedRef}\n />\n );\n },\n);\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport { ChannelChat } from './ChannelChat';\n\nexport { ChannelChat };\nexport default ChannelChat;\n"],
5
+ "mappings": ";AAIA,OAAOA,WAAW;AAElB,SAASC,2BAA2B;AACpC,SAASC,QAAQC,KAAKC,aAAa;AACnC,SAAqBC,YAAYC,gBAAgB;AACjD,SAASC,mBAAmB;AAC5B,SAAuBC,eAAe;AACtC,SAASC,YAAYC,uBAAuB;AAE5C,SAASC,YAAY;AACrB,SAASC,iBAAiB;AAC1B,SAASC,uBAAuB;AAgBzB,IAAMC,cAAcL,WACzB,CAAC,EAAEM,OAAOC,SAAS,GAAGC,MAAAA,GAASC,iBAAAA;AAC7B,QAAMC,WAAWZ,YAAAA;AACjB,QAAMa,UAAUf,WAAWU,MAAMM,EAAE;AACnC,QAAMA,KAAKlB,IAAImB,OAAON,OAAAA,EAASO,SAAQ;AACvC,QAAMC,WAAWZ,UAAUG,OAAOM,EAAAA;AAClC,QAAM,EAAEI,cAAa,IAAKxB,oBAAAA;AAE1B,QAAMyB,OAAOV,QAAQU,MAAMC;AAC3B,QAAMC,WAAWtB,SACfS,MAAMc,IACNH,OAAOtB,MAAM0B,OAAO5B,OAAO6B,KAAKvB,QAAQA,OAAO,CAAA,EAAGwB,KAAKN,IAAAA,IAAQtB,MAAM0B,OAAO5B,OAAO+B,QAAO,CAAA,CAAA;AAG5F,QAAMC,WAAW/B,IAAIgC,QAAQnB,OAAAA,EAASoB,KAAKC,SAAS;AAEpD,QAAMC,aAAa,CAACC,SAAAA;AAClB,QAAIL,UAAU;AACZ,aAAO;IACT;AACA,SAAKT,cAAcZ,gBAAgB2B,sBAAsB;MACvDxB;MACAyB,QAAQ;QAAEC,aAAavB,SAASwB;MAAI;MACpCJ;IACF,CAAA;AACA,WAAO;EACT;AAEA,SACE,sBAAA,cAAC5B,MAAAA;IACE,GAAGD,gBAAgBO,KAAAA;IACpBI;IACAF;IACAC;IACAQ;IACAJ;IACAoB,QAAQN;IACRO,aAAY;IACZX;IACAY,KAAK5B;;AAGX,CAAA;;;AClEF,IAAA,sBAAe6B;",
6
+ "names": ["React", "useOperationInvoker", "Filter", "Obj", "Query", "useMembers", "useQuery", "useIdentity", "Message", "composable", "composableProps", "Chat", "useStatus", "ThreadOperation", "ChannelChat", "space", "channel", "props", "forwardedRef", "identity", "members", "id", "getDXN", "toString", "activity", "invokePromise", "feed", "target", "messages", "db", "select", "type", "from", "nothing", "readOnly", "getMeta", "keys", "length", "handleSend", "text", "AppendChannelMessage", "sender", "identityDid", "did", "onSend", "orientation", "ref", "ChannelChat"]
7
+ }
@@ -0,0 +1,178 @@
1
+ import {
2
+ createBlackCanvasStreamTrack,
3
+ createInaudibleAudioStreamTrack
4
+ } from "./chunk-CROE4U4O.mjs";
5
+
6
+ // src/hooks/analytics.ts
7
+ import { useCallback } from "react";
8
+ import { useOperationInvoker } from "@dxos/app-framework/ui";
9
+ import { Obj } from "@dxos/echo";
10
+ import { ObservabilityOperation } from "@dxos/plugin-observability";
11
+ import { useOnTransition } from "@dxos/react-ui";
12
+ var useOnEditAnalytics = (message, textBlock, editing) => {
13
+ const { invokePromise } = useOperationInvoker();
14
+ const onEdit = useCallback(() => {
15
+ if (!message || !textBlock) {
16
+ return;
17
+ }
18
+ const db = Obj.getDatabase(message);
19
+ if (!db) {
20
+ return;
21
+ }
22
+ void invokePromise(ObservabilityOperation.SendEvent, {
23
+ name: "threads.message.update",
24
+ properties: {
25
+ spaceId: db.spaceId,
26
+ messageId: message.id,
27
+ messageLength: textBlock?.text.length
28
+ }
29
+ });
30
+ }, [
31
+ invokePromise,
32
+ message,
33
+ textBlock
34
+ ]);
35
+ useOnTransition(editing, true, false, onEdit);
36
+ };
37
+
38
+ // src/hooks/useBlackCanvasStreamTrack.tsx
39
+ import { useEffect, useState } from "react";
40
+ import { scheduleTask } from "@dxos/async";
41
+ import { Context } from "@dxos/context";
42
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/hooks/useBlackCanvasStreamTrack.tsx";
43
+ var useBlackCanvasStreamTrack = () => {
44
+ const [blackCanvasStreamTrack, setBlackCanvasStreamTrack] = useState(void 0);
45
+ useEffect(() => {
46
+ const ctx = new Context(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 11 });
47
+ scheduleTask(ctx, async () => {
48
+ const blackCanvasStreamTrack2 = await createBlackCanvasStreamTrack({
49
+ ctx,
50
+ width: 720,
51
+ height: 480
52
+ });
53
+ setBlackCanvasStreamTrack(blackCanvasStreamTrack2);
54
+ });
55
+ return () => {
56
+ void ctx.dispose();
57
+ };
58
+ }, []);
59
+ return blackCanvasStreamTrack;
60
+ };
61
+
62
+ // src/hooks/useDebugMode.ts
63
+ import { useEffect as useEffect2, useState as useState2 } from "react";
64
+ var useDebugMode = () => {
65
+ const [enabled, setEnabled] = useState2(false);
66
+ useEffect2(() => {
67
+ const handler = (ev) => {
68
+ if (ev.key.toLowerCase() === "d" && ev.ctrlKey) {
69
+ ev.preventDefault();
70
+ setEnabled(!enabled);
71
+ }
72
+ };
73
+ document.addEventListener("keypress", handler);
74
+ return () => {
75
+ document.removeEventListener("keypress", handler);
76
+ };
77
+ }, [
78
+ enabled
79
+ ]);
80
+ return enabled;
81
+ };
82
+
83
+ // src/hooks/useInaudibleAudioStreamTrack.tsx
84
+ import { useEffect as useEffect3, useState as useState3 } from "react";
85
+ import { scheduleTask as scheduleTask2 } from "@dxos/async";
86
+ import { Context as Context2 } from "@dxos/context";
87
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/hooks/useInaudibleAudioStreamTrack.tsx";
88
+ var useInaudibleAudioStreamTrack = () => {
89
+ const [audioStreamTrack, setAudioStreamTrack] = useState3(void 0);
90
+ useEffect3(() => {
91
+ const ctx = new Context2(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 11 });
92
+ scheduleTask2(ctx, async () => {
93
+ const audioStreamTrack2 = await createInaudibleAudioStreamTrack({
94
+ ctx
95
+ });
96
+ setAudioStreamTrack(audioStreamTrack2);
97
+ });
98
+ return () => {
99
+ void ctx.dispose();
100
+ };
101
+ }, []);
102
+ return audioStreamTrack;
103
+ };
104
+
105
+ // src/hooks/useStatus.ts
106
+ import { useEffect as useEffect4, useState as useState4 } from "react";
107
+ var useStatus = (space, channel) => {
108
+ const [processing, setProcessing] = useState4(false);
109
+ useEffect4(() => {
110
+ if (!space || !channel) {
111
+ return;
112
+ }
113
+ const unsubscribe = space.listen(`status/${channel}`, (status) => {
114
+ const { event } = status.payload ?? {};
115
+ setProcessing(event === "processing");
116
+ });
117
+ const t = setInterval(() => {
118
+ setProcessing((prev) => {
119
+ if (typeof prev?.ts === "number" && Date.now() - prev.ts > 3e4) {
120
+ return void 0;
121
+ } else {
122
+ return prev;
123
+ }
124
+ });
125
+ }, 1e3);
126
+ return () => {
127
+ unsubscribe();
128
+ clearInterval(t);
129
+ };
130
+ }, [
131
+ space,
132
+ channel
133
+ ]);
134
+ return processing;
135
+ };
136
+
137
+ // src/hooks/useVideoStreamTrack.tsx
138
+ import { useEffect as useEffect5, useRef, useState as useState5 } from "react";
139
+ var useVideoStreamTrack = (videoElement, videoSrc) => {
140
+ const [videoStreamTrack, setVideoStreamTrack] = useState5(void 0);
141
+ const hadRun = useRef(false);
142
+ useEffect5(() => {
143
+ if (!videoElement.current || hadRun.current || !videoSrc) {
144
+ return;
145
+ }
146
+ hadRun.current = true;
147
+ videoElement.current.addEventListener("playing", () => {
148
+ if (videoStreamTrack) {
149
+ return;
150
+ }
151
+ const stream = videoElement.current.captureStream();
152
+ const track = stream.getTracks()[0];
153
+ if (track && !videoStreamTrack) {
154
+ setVideoStreamTrack(track);
155
+ }
156
+ stream.onaddtrack = (event) => {
157
+ if (event.track.kind === "video" && !videoStreamTrack) {
158
+ setVideoStreamTrack(event.track);
159
+ }
160
+ };
161
+ });
162
+ videoElement.current.src = videoSrc;
163
+ }, [
164
+ videoElement.current,
165
+ videoSrc
166
+ ]);
167
+ return videoStreamTrack;
168
+ };
169
+
170
+ export {
171
+ useOnEditAnalytics,
172
+ useBlackCanvasStreamTrack,
173
+ useDebugMode,
174
+ useInaudibleAudioStreamTrack,
175
+ useStatus,
176
+ useVideoStreamTrack
177
+ };
178
+ //# sourceMappingURL=chunk-FWSMZWBO.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/hooks/analytics.ts", "../../../src/hooks/useBlackCanvasStreamTrack.tsx", "../../../src/hooks/useDebugMode.ts", "../../../src/hooks/useInaudibleAudioStreamTrack.tsx", "../../../src/hooks/useStatus.ts", "../../../src/hooks/useVideoStreamTrack.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { Obj } from '@dxos/echo';\nimport { ObservabilityOperation } from '@dxos/plugin-observability';\nimport { useOnTransition } from '@dxos/react-ui';\nimport { type ContentBlock } from '@dxos/types';\n\nexport const useOnEditAnalytics = (\n message: any | undefined,\n textBlock: ContentBlock.Text | undefined,\n editing: boolean,\n) => {\n const { invokePromise } = useOperationInvoker();\n\n const onEdit = useCallback(() => {\n if (!message || !textBlock) {\n return;\n }\n\n const db = Obj.getDatabase(message);\n if (!db) {\n return;\n }\n\n void invokePromise(ObservabilityOperation.SendEvent, {\n name: 'threads.message.update',\n properties: {\n spaceId: db.spaceId,\n messageId: message.id,\n messageLength: textBlock?.text.length,\n },\n });\n }, [invokePromise, message, textBlock]);\n\n useOnTransition(editing, true, false, onEdit);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { scheduleTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\n\nimport { createBlackCanvasStreamTrack } from '../calls/util/stub-media-streams';\n\nexport const useBlackCanvasStreamTrack = () => {\n const [blackCanvasStreamTrack, setBlackCanvasStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);\n useEffect(() => {\n const ctx = new Context();\n scheduleTask(ctx, async () => {\n const blackCanvasStreamTrack = await createBlackCanvasStreamTrack({ ctx, width: 720, height: 480 });\n setBlackCanvasStreamTrack(blackCanvasStreamTrack);\n });\n\n return () => {\n void ctx.dispose();\n };\n }, []);\n\n return blackCanvasStreamTrack;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\n// TODO(burdon): Standardize across plugins/composer.\nexport const useDebugMode = () => {\n const [enabled, setEnabled] = useState(false);\n useEffect(() => {\n const handler = (ev: KeyboardEvent) => {\n if (ev.key.toLowerCase() === 'd' && ev.ctrlKey) {\n ev.preventDefault();\n setEnabled(!enabled);\n }\n };\n\n document.addEventListener('keypress', handler);\n return () => {\n document.removeEventListener('keypress', handler);\n };\n }, [enabled]);\n\n return enabled;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { scheduleTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\n\nimport { createInaudibleAudioStreamTrack } from '../calls/util/stub-media-streams';\n\nexport const useInaudibleAudioStreamTrack = () => {\n const [audioStreamTrack, setAudioStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);\n useEffect(() => {\n const ctx = new Context();\n scheduleTask(ctx, async () => {\n const audioStreamTrack = await createInaudibleAudioStreamTrack({ ctx });\n setAudioStreamTrack(audioStreamTrack);\n });\n\n return () => {\n void ctx.dispose();\n };\n }, []);\n\n return audioStreamTrack;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\n\n// TODO(burdon): Generalize and factor out.\nexport const useStatus = (space?: Space, channel?: string) => {\n const [processing, setProcessing] = useState(false);\n useEffect(() => {\n if (!space || !channel) {\n return;\n }\n\n const unsubscribe = space.listen(`status/${channel}`, (status) => {\n const { event } = status.payload ?? {};\n setProcessing(event === 'processing');\n });\n\n const t = setInterval(() => {\n setProcessing((prev: any) => {\n if (typeof prev?.ts === 'number' && Date.now() - prev.ts > 30_000) {\n return undefined;\n } else {\n return prev;\n }\n });\n }, 1_000);\n\n return () => {\n unsubscribe();\n clearInterval(t);\n };\n }, [space, channel]);\n\n return processing;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type RefObject, useEffect, useRef, useState } from 'react';\n\nexport const useVideoStreamTrack = (videoElement: RefObject<HTMLVideoElement | null>, videoSrc: string) => {\n // Get video stream track.\n const [videoStreamTrack, setVideoStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);\n const hadRun = useRef(false);\n useEffect(() => {\n // This is done to capture only one video stream.\n if (!videoElement.current || hadRun.current || !videoSrc) {\n return;\n }\n hadRun.current = true;\n videoElement.current.addEventListener('playing', () => {\n if (videoStreamTrack) {\n return;\n }\n const stream = (videoElement.current as any).captureStream();\n const track = stream.getTracks()[0];\n if (track && !videoStreamTrack) {\n setVideoStreamTrack(track);\n }\n stream.onaddtrack = (event: MediaStreamTrackEvent) => {\n if (event.track.kind === 'video' && !videoStreamTrack) {\n setVideoStreamTrack(event.track);\n }\n };\n });\n videoElement.current.src = videoSrc;\n }, [videoElement.current, videoSrc]);\n\n return videoStreamTrack;\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["useCallback", "useOperationInvoker", "Obj", "ObservabilityOperation", "useOnTransition", "useOnEditAnalytics", "message", "textBlock", "editing", "invokePromise", "onEdit", "db", "getDatabase", "SendEvent", "name", "properties", "spaceId", "messageId", "id", "messageLength", "text", "length", "useEffect", "useState", "scheduleTask", "Context", "useBlackCanvasStreamTrack", "useEffect", "Context", "scheduleTask", "blackCanvasStreamTrack", "createBlackCanvasStreamTrack", "ctx", "width", "height", "setBlackCanvasStreamTrack", "useEffect", "useState", "useDebugMode", "enabled", "setEnabled", "handler", "ev", "key", "toLowerCase", "ctrlKey", "preventDefault", "document", "addEventListener", "removeEventListener", "useEffect", "useState", "scheduleTask", "Context", "__dxlog_file", "useInaudibleAudioStreamTrack", "useEffect", "Context", "scheduleTask", "audioStreamTrack", "createInaudibleAudioStreamTrack", "ctx", "setAudioStreamTrack", "useEffect", "useState", "useStatus", "space", "channel", "processing", "setProcessing", "unsubscribe", "listen", "status", "event", "payload", "t", "setInterval", "prev", "ts", "Date", "now", "undefined", "clearInterval", "useEffect", "useRef", "useState", "useVideoStreamTrack", "videoElement", "videoSrc", "videoStreamTrack", "setVideoStreamTrack", "undefined", "hadRun", "current", "addEventListener", "stream", "captureStream", "track", "getTracks", "onaddtrack", "event", "kind", "src"]
7
+ }
@@ -0,0 +1,38 @@
1
+ // src/util.ts
2
+ import * as Match from "effect/Match";
3
+ import { generateName } from "@dxos/display-name";
4
+ import { hexToFallback, toFallback } from "@dxos/util";
5
+ var hashString = (s) => {
6
+ let h = 0;
7
+ for (let i = 0; i < s.length; i++) {
8
+ h = h * 31 + s.charCodeAt(i) | 0;
9
+ }
10
+ return h >>> 0;
11
+ };
12
+ var getMessageMetadata = (id, identity, fallbackSender) => {
13
+ const fallback = identity?.identityKey ? hexToFallback(identity.identityKey.toHex()) : toFallback(hashString(fallbackSender?.name ?? fallbackSender?.email ?? "0"));
14
+ return {
15
+ id,
16
+ authorId: identity?.did,
17
+ authorName: identity?.profile?.displayName ?? (identity?.identityKey ? generateName(identity.identityKey.toHex()) : void 0) ?? fallbackSender?.name ?? fallbackSender?.email,
18
+ authorAvatarProps: {
19
+ hue: identity?.profile?.data?.hue ?? fallback.hue,
20
+ emoji: identity?.profile?.data?.emoji ?? fallback.emoji
21
+ }
22
+ };
23
+ };
24
+ var getAnchor = Match.type().pipe(Match.when({
25
+ mode: "single"
26
+ }, (s) => s.id), Match.when({
27
+ mode: "multi"
28
+ }, (s) => s.ids.length > 0 ? s.ids.join(",") : void 0), Match.when({
29
+ mode: "range"
30
+ }, (s) => s.from && s.to ? `${s.from}:${s.to}` : void 0), Match.when({
31
+ mode: "multi-range"
32
+ }, (s) => s.ranges[0] && `${s.ranges[0].from}:${s.ranges[0].to}`), Match.when(void 0, () => void 0), Match.exhaustive);
33
+
34
+ export {
35
+ getMessageMetadata,
36
+ getAnchor
37
+ };
38
+ //# sourceMappingURL=chunk-JLY4NVTA.mjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/util.ts"],
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport * as Match from 'effect/Match';\n\nimport { generateName } from '@dxos/display-name';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type Selection } from '@dxos/react-ui-attention';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback, toFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\n/**\n * Stable hash for an arbitrary string — used as the avatar-fallback seed for\n * external senders who have no DXOS identity (e.g. Slack/Discord-synced\n * messages). djb2-ish, only stability matters.\n *\n * Coerced to unsigned 32-bit via `>>> 0` because `toFallback` does a plain\n * modulo against `idEmoji.length * idHue.length` and JavaScript's `%`\n * preserves the sign of the dividend — a negative hash would index\n * `idEmoji[-x]` and `idHue[-x]` to `undefined`, causing the avatar to fall\n * through to `Avatar.Content`'s default red/ghost.\n */\nconst hashString = (s: string): number => {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (h * 31 + s.charCodeAt(i)) | 0;\n }\n return h >>> 0;\n};\n\nexport const getMessageMetadata = (\n id: string,\n identity?: Identity,\n /**\n * Externally-sourced sender info (Slack/Discord/etc). Used only when no\n * matching DXOS `identity` is available — provides `name`/`email` for the\n * author label and a stable seed for the avatar fallback.\n */\n fallbackSender?: { name?: string; email?: string },\n): MessageMetadata => {\n const fallback = identity?.identityKey\n ? hexToFallback(identity.identityKey.toHex())\n : toFallback(hashString(fallbackSender?.name ?? fallbackSender?.email ?? '0'));\n return {\n id,\n authorId: identity?.did,\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined) ??\n fallbackSender?.name ??\n fallbackSender?.email,\n authorAvatarProps: {\n hue: identity?.profile?.data?.hue ?? fallback.hue,\n emoji: identity?.profile?.data?.emoji ?? fallback.emoji,\n },\n };\n};\n\nexport const getAnchor = Match.type<Selection | undefined>().pipe(\n Match.when({ mode: 'single' }, (s) => s.id),\n Match.when({ mode: 'multi' }, (s) => (s.ids.length > 0 ? s.ids.join(',') : undefined)),\n Match.when({ mode: 'range' }, (s) => (s.from && s.to ? `${s.from}:${s.to}` : undefined)),\n Match.when({ mode: 'multi-range' }, (s) => s.ranges[0] && `${s.ranges[0].from}:${s.ranges[0].to}`),\n Match.when(undefined, () => undefined),\n Match.exhaustive,\n);\n"],
5
+ "mappings": ";AAIA,YAAYA,WAAW;AAEvB,SAASC,oBAAoB;AAK7B,SAASC,eAAeC,kBAAkB;AAe1C,IAAMC,aAAa,CAACC,MAAAA;AAClB,MAAIC,IAAI;AACR,WAASC,IAAI,GAAGA,IAAIF,EAAEG,QAAQD,KAAK;AACjCD,QAAKA,IAAI,KAAKD,EAAEI,WAAWF,CAAAA,IAAM;EACnC;AACA,SAAOD,MAAM;AACf;AAEO,IAAMI,qBAAqB,CAChCC,IACAC,UAMAC,mBAAAA;AAEA,QAAMC,WAAWF,UAAUG,cACvBb,cAAcU,SAASG,YAAYC,MAAK,CAAA,IACxCb,WAAWC,WAAWS,gBAAgBI,QAAQJ,gBAAgBK,SAAS,GAAA,CAAA;AAC3E,SAAO;IACLP;IACAQ,UAAUP,UAAUQ;IACpBC,YACET,UAAUU,SAASC,gBAClBX,UAAUG,cAAcd,aAAaW,SAASG,YAAYC,MAAK,CAAA,IAAMQ,WACtEX,gBAAgBI,QAChBJ,gBAAgBK;IAClBO,mBAAmB;MACjBC,KAAKd,UAAUU,SAASK,MAAMD,OAAOZ,SAASY;MAC9CE,OAAOhB,UAAUU,SAASK,MAAMC,SAASd,SAASc;IACpD;EACF;AACF;AAEO,IAAMC,YAAkBC,WAAI,EAA0BC,KACrDC,WAAK;EAAEC,MAAM;AAAS,GAAG,CAAC5B,MAAMA,EAAEM,EAAE,GACpCqB,WAAK;EAAEC,MAAM;AAAQ,GAAG,CAAC5B,MAAOA,EAAE6B,IAAI1B,SAAS,IAAIH,EAAE6B,IAAIC,KAAK,GAAA,IAAOX,MAAAA,GACrEQ,WAAK;EAAEC,MAAM;AAAQ,GAAG,CAAC5B,MAAOA,EAAE+B,QAAQ/B,EAAEgC,KAAK,GAAGhC,EAAE+B,IAAI,IAAI/B,EAAEgC,EAAE,KAAKb,MAAAA,GACvEQ,WAAK;EAAEC,MAAM;AAAc,GAAG,CAAC5B,MAAMA,EAAEiC,OAAO,CAAA,KAAM,GAAGjC,EAAEiC,OAAO,CAAA,EAAGF,IAAI,IAAI/B,EAAEiC,OAAO,CAAA,EAAGD,EAAE,EAAE,GAC3FL,WAAKR,QAAW,MAAMA,MAAAA,GACtBe,gBAAU;",
6
+ "names": ["Match", "generateName", "hexToFallback", "toFallback", "hashString", "s", "h", "i", "length", "charCodeAt", "getMessageMetadata", "id", "identity", "fallbackSender", "fallback", "identityKey", "toHex", "name", "email", "authorId", "did", "authorName", "profile", "displayName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "getAnchor", "type", "pipe", "when", "mode", "ids", "join", "from", "to", "ranges", "exhaustive"]
7
+ }