@dxos/plugin-thread 0.8.4-main.ead640a → 0.8.4-main.effb148878

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 (600) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs +28 -0
  4. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs.map +7 -0
  5. package/dist/lib/neutral/ChannelChat-LZEDFJVD.mjs +10 -0
  6. package/dist/lib/neutral/CommentsCompanion-3H3ZVIBH.mjs +208 -0
  7. package/dist/lib/neutral/CommentsCompanion-3H3ZVIBH.mjs.map +7 -0
  8. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs +61 -0
  9. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs.map +7 -0
  10. package/dist/lib/neutral/ThreadPlugin.mjs +96 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  12. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  14. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +24 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  16. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
  17. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
  18. package/dist/lib/neutral/add-message-DATVSMVU.mjs +122 -0
  19. package/dist/lib/neutral/add-message-DATVSMVU.mjs.map +7 -0
  20. package/dist/lib/neutral/agent-runner-JK2Y4RU3.mjs +244 -0
  21. package/dist/lib/neutral/agent-runner-JK2Y4RU3.mjs.map +7 -0
  22. package/dist/lib/neutral/app-graph-builder-ACCHZXZA.mjs +120 -0
  23. package/dist/lib/neutral/app-graph-builder-ACCHZXZA.mjs.map +7 -0
  24. package/dist/lib/neutral/append-channel-message-4ACLATZY.mjs +40 -0
  25. package/dist/lib/neutral/append-channel-message-4ACLATZY.mjs.map +7 -0
  26. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  27. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  28. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  29. package/dist/lib/neutral/capabilities/index.mjs +27 -0
  30. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-5T5LPLBN.mjs +36 -0
  32. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-6HC3NAXD.mjs +164 -0
  34. package/dist/lib/neutral/chunk-6HC3NAXD.mjs.map +7 -0
  35. package/dist/lib/neutral/chunk-BHEZLLXG.mjs +55 -0
  36. package/dist/lib/neutral/chunk-BHEZLLXG.mjs.map +7 -0
  37. package/dist/lib/neutral/chunk-D3SCNWLT.mjs +335 -0
  38. package/dist/lib/neutral/chunk-D3SCNWLT.mjs.map +7 -0
  39. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  40. package/dist/lib/{browser/chunk-CP7E2HRE.mjs → neutral/chunk-JLY4NVTA.mjs} +12 -5
  41. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
  43. package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
  44. package/dist/lib/neutral/chunk-TT6PWRR5.mjs +8 -0
  45. package/dist/lib/neutral/chunk-TT6PWRR5.mjs.map +7 -0
  46. package/dist/lib/neutral/chunk-WMP3QCOR.mjs +46 -0
  47. package/dist/lib/neutral/chunk-WMP3QCOR.mjs.map +7 -0
  48. package/dist/lib/neutral/components/index.mjs +541 -0
  49. package/dist/lib/neutral/components/index.mjs.map +7 -0
  50. package/dist/lib/neutral/containers/index.mjs +15 -0
  51. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  52. package/dist/lib/neutral/create-2NJDD73M.mjs +61 -0
  53. package/dist/lib/neutral/create-2NJDD73M.mjs.map +7 -0
  54. package/dist/lib/neutral/create-channel-RYSV44N3.mjs +19 -0
  55. package/dist/lib/neutral/create-channel-RYSV44N3.mjs.map +7 -0
  56. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs +28 -0
  57. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs.map +7 -0
  58. package/dist/lib/neutral/create-proposals-7UZYZ32V.mjs +56 -0
  59. package/dist/lib/neutral/create-proposals-7UZYZ32V.mjs.map +7 -0
  60. package/dist/lib/neutral/delete-JVGAPD46.mjs +57 -0
  61. package/dist/lib/neutral/delete-JVGAPD46.mjs.map +7 -0
  62. package/dist/lib/neutral/delete-message-5EGR3HWH.mjs +54 -0
  63. package/dist/lib/neutral/delete-message-5EGR3HWH.mjs.map +7 -0
  64. package/dist/lib/neutral/hooks/index.mjs +10 -0
  65. package/dist/lib/neutral/index.mjs +32 -0
  66. package/dist/lib/neutral/markdown-B6RNVR2H.mjs +83 -0
  67. package/dist/lib/neutral/markdown-B6RNVR2H.mjs.map +7 -0
  68. package/dist/lib/neutral/meta.json +1 -0
  69. package/dist/lib/neutral/meta.mjs +10 -0
  70. package/dist/lib/neutral/on-create-space-ZQF55KSO.mjs +23 -0
  71. package/dist/lib/neutral/on-create-space-ZQF55KSO.mjs.map +7 -0
  72. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  73. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  74. package/dist/lib/neutral/operations/index.mjs +8 -0
  75. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  76. package/dist/lib/neutral/plugin.mjs +16 -0
  77. package/dist/lib/neutral/plugin.mjs.map +7 -0
  78. package/dist/lib/neutral/react-surface-ZSIQHN5P.mjs +76 -0
  79. package/dist/lib/neutral/react-surface-ZSIQHN5P.mjs.map +7 -0
  80. package/dist/lib/neutral/respond-to-thread-LVLDZON3.mjs +32 -0
  81. package/dist/lib/neutral/respond-to-thread-LVLDZON3.mjs.map +7 -0
  82. package/dist/lib/neutral/restore-Z5PYV7I2.mjs +32 -0
  83. package/dist/lib/neutral/restore-Z5PYV7I2.mjs.map +7 -0
  84. package/dist/lib/neutral/restore-message-B263PLUH.mjs +33 -0
  85. package/dist/lib/neutral/restore-message-B263PLUH.mjs.map +7 -0
  86. package/dist/lib/neutral/select-GXDEAH5D.mjs +24 -0
  87. package/dist/lib/neutral/select-GXDEAH5D.mjs.map +7 -0
  88. package/dist/lib/neutral/set-agent-config-7HHS6KZZ.mjs +20 -0
  89. package/dist/lib/neutral/set-agent-config-7HHS6KZZ.mjs.map +7 -0
  90. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  91. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  92. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  93. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  94. package/dist/lib/neutral/testing/index.mjs +58 -0
  95. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  96. package/dist/lib/neutral/toggle-resolved-LBVNAVVF.mjs +36 -0
  97. package/dist/lib/neutral/toggle-resolved-LBVNAVVF.mjs.map +7 -0
  98. package/dist/lib/neutral/translations.mjs +91 -0
  99. package/dist/lib/neutral/translations.mjs.map +7 -0
  100. package/dist/lib/neutral/types/index.mjs +16 -0
  101. package/dist/lib/neutral/types/index.mjs.map +7 -0
  102. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  103. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  104. package/dist/types/src/ThreadPlugin.d.ts +3 -1
  105. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  106. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  107. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  108. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  109. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  110. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  111. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  112. package/dist/types/src/blueprints/index.d.ts +2 -0
  113. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  114. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  115. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  116. package/dist/types/src/capabilities/agent-runner.d.ts +22 -0
  117. package/dist/types/src/capabilities/agent-runner.d.ts.map +1 -0
  118. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  119. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  120. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  121. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  122. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  123. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  124. package/dist/types/src/capabilities/index.d.ts +16 -15
  125. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  126. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  127. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  128. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  129. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  130. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  131. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  132. package/dist/types/src/capabilities/settings.d.ts +5 -2
  133. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  134. package/dist/types/src/capabilities/state.d.ts +5 -5
  135. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  136. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  137. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  138. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  139. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  140. package/dist/types/src/components/Chat/index.d.ts +2 -0
  141. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  142. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  143. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  144. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  145. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  146. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
  147. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  148. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  149. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  150. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  151. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  152. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  153. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  154. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  155. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  156. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  157. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  158. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  159. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  160. package/dist/types/src/components/index.d.ts +5 -10
  161. package/dist/types/src/components/index.d.ts.map +1 -1
  162. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
  163. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  164. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
  165. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  166. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  167. package/dist/types/src/containers/ChannelArticle/index.d.ts.map +1 -0
  168. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  169. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  170. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  171. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  172. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts +11 -0
  173. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts.map +1 -0
  174. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts +198 -0
  175. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts.map +1 -0
  176. package/dist/types/src/containers/CommentsCompanion/index.d.ts +2 -0
  177. package/dist/types/src/containers/CommentsCompanion/index.d.ts.map +1 -0
  178. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  179. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  180. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
  181. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  182. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  183. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  184. package/dist/types/src/containers/index.d.ts +6 -0
  185. package/dist/types/src/containers/index.d.ts.map +1 -0
  186. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  187. package/dist/types/src/extensions/command.d.ts.map +1 -0
  188. package/dist/types/src/extensions/index.d.ts +1 -0
  189. package/dist/types/src/extensions/index.d.ts.map +1 -1
  190. package/dist/types/src/extensions/threads.d.ts +9 -4
  191. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  192. package/dist/types/src/hooks/analytics.d.ts +2 -3
  193. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  194. package/dist/types/src/hooks/index.d.ts +0 -4
  195. package/dist/types/src/hooks/index.d.ts.map +1 -1
  196. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  197. package/dist/types/src/index.d.ts +2 -3
  198. package/dist/types/src/index.d.ts.map +1 -1
  199. package/dist/types/src/meta.d.ts +2 -2
  200. package/dist/types/src/meta.d.ts.map +1 -1
  201. package/dist/types/src/operations/add-message.d.ts +5 -0
  202. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  203. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  204. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  205. package/dist/types/src/operations/create-channel.d.ts +5 -0
  206. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  207. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  208. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  209. package/dist/types/src/operations/create.d.ts +5 -0
  210. package/dist/types/src/operations/create.d.ts.map +1 -0
  211. package/dist/types/src/operations/delete-message.d.ts +5 -0
  212. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  213. package/dist/types/src/operations/delete.d.ts +5 -0
  214. package/dist/types/src/operations/delete.d.ts.map +1 -0
  215. package/dist/types/src/operations/index.d.ts +3 -0
  216. package/dist/types/src/operations/index.d.ts.map +1 -0
  217. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  218. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  219. package/dist/types/src/operations/respond-to-thread.d.ts +5 -0
  220. package/dist/types/src/operations/respond-to-thread.d.ts.map +1 -0
  221. package/dist/types/src/operations/restore-message.d.ts +5 -0
  222. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  223. package/dist/types/src/operations/restore.d.ts +5 -0
  224. package/dist/types/src/operations/restore.d.ts.map +1 -0
  225. package/dist/types/src/operations/select.d.ts +5 -0
  226. package/dist/types/src/operations/select.d.ts.map +1 -0
  227. package/dist/types/src/operations/set-agent-config.d.ts +5 -0
  228. package/dist/types/src/operations/set-agent-config.d.ts.map +1 -0
  229. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  230. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  231. package/dist/types/src/plugin.d.ts +4 -0
  232. package/dist/types/src/plugin.d.ts.map +1 -0
  233. package/dist/types/src/should-trigger-agent.d.ts +22 -0
  234. package/dist/types/src/should-trigger-agent.d.ts.map +1 -0
  235. package/dist/types/src/should-trigger-agent.test.d.ts +2 -0
  236. package/dist/types/src/should-trigger-agent.test.d.ts.map +1 -0
  237. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +4 -4
  238. package/dist/types/src/testing/data.d.ts.map +1 -0
  239. package/dist/types/src/testing/index.d.ts +1 -1
  240. package/dist/types/src/testing/index.d.ts.map +1 -1
  241. package/dist/types/src/translations.d.ts +142 -74
  242. package/dist/types/src/translations.d.ts.map +1 -1
  243. package/dist/types/src/types/AgentIdentity.d.ts +27 -0
  244. package/dist/types/src/types/AgentIdentity.d.ts.map +1 -0
  245. package/dist/types/src/types/Settings.d.ts +5 -0
  246. package/dist/types/src/types/Settings.d.ts.map +1 -0
  247. package/dist/types/src/types/ThreadCapabilities.d.ts +34 -0
  248. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  249. package/dist/types/src/types/ThreadOperation.d.ts +2409 -0
  250. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  251. package/dist/types/src/types/index.d.ts +4 -1
  252. package/dist/types/src/types/index.d.ts.map +1 -1
  253. package/dist/types/src/types/types.d.ts +3 -458
  254. package/dist/types/src/types/types.d.ts.map +1 -1
  255. package/dist/types/src/util.d.ts +6 -3
  256. package/dist/types/src/util.d.ts.map +1 -1
  257. package/dist/types/tsconfig.tsbuildinfo +1 -1
  258. package/package.json +156 -85
  259. package/src/ThreadPlugin.node.ts +39 -0
  260. package/src/ThreadPlugin.test.ts +37 -0
  261. package/src/ThreadPlugin.tsx +58 -125
  262. package/src/ThreadPlugin.workerd.ts +20 -0
  263. package/src/blueprints/index.ts +5 -0
  264. package/src/blueprints/thread-blueprint.ts +36 -0
  265. package/src/capabilities/agent-runner.ts +291 -0
  266. package/src/capabilities/app-graph-builder.ts +124 -165
  267. package/src/capabilities/blueprint-definition.ts +19 -0
  268. package/src/capabilities/create-object.ts +30 -0
  269. package/src/capabilities/index.ts +16 -12
  270. package/src/capabilities/markdown.ts +53 -36
  271. package/src/capabilities/operation-handler.ts +16 -0
  272. package/src/capabilities/react-surface.tsx +64 -78
  273. package/src/capabilities/settings.ts +26 -12
  274. package/src/capabilities/state.ts +14 -18
  275. package/src/capabilities/undo-mappings.ts +46 -0
  276. package/src/components/Chat/Chat.tsx +259 -0
  277. package/src/components/Chat/index.ts +5 -0
  278. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +94 -0
  279. package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
  280. package/src/components/CommentsPanel/CommentsThread.tsx +176 -0
  281. package/src/components/CommentsPanel/index.ts +6 -0
  282. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +83 -47
  283. package/src/components/MessagePanel/index.ts +5 -0
  284. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  285. package/src/components/ThreadSettings/ThreadSettings.tsx +19 -0
  286. package/src/components/ThreadSettings/index.ts +5 -0
  287. package/src/components/index.ts +5 -12
  288. package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +105 -0
  289. package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
  290. package/src/containers/ChannelArticle/index.ts +5 -0
  291. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  292. package/src/containers/ChannelChat/index.ts +8 -0
  293. package/src/containers/CommentsCompanion/CommentsCompanion.stories.tsx +339 -0
  294. package/src/containers/CommentsCompanion/CommentsCompanion.tsx +216 -0
  295. package/src/containers/CommentsCompanion/index.ts +5 -0
  296. package/src/containers/ThreadContainer/ThreadContainer.stories.tsx +86 -0
  297. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  298. package/src/containers/ThreadContainer/index.ts +8 -0
  299. package/src/containers/index.ts +10 -0
  300. package/src/{components/command-extension.ts → extensions/command.ts} +3 -3
  301. package/src/extensions/index.ts +1 -0
  302. package/src/extensions/threads.ts +88 -43
  303. package/src/hooks/analytics.ts +22 -21
  304. package/src/hooks/index.ts +0 -4
  305. package/src/index.ts +4 -4
  306. package/src/meta.ts +37 -7
  307. package/src/operations/add-message.ts +94 -0
  308. package/src/operations/append-channel-message.ts +37 -0
  309. package/src/operations/create-channel.ts +20 -0
  310. package/src/operations/create-proposals.ts +49 -0
  311. package/src/operations/create.ts +63 -0
  312. package/src/operations/delete-message.ts +53 -0
  313. package/src/operations/delete.ts +63 -0
  314. package/src/operations/index.ts +22 -0
  315. package/src/operations/on-create-space.ts +27 -0
  316. package/src/operations/respond-to-thread.ts +32 -0
  317. package/src/operations/restore-message.ts +38 -0
  318. package/src/operations/restore.ts +38 -0
  319. package/src/operations/select.ts +24 -0
  320. package/src/operations/set-agent-config.ts +24 -0
  321. package/src/operations/toggle-resolved.ts +41 -0
  322. package/src/plugin.ts +11 -0
  323. package/src/should-trigger-agent.test.ts +72 -0
  324. package/src/should-trigger-agent.ts +50 -0
  325. package/src/testing/data.ts +49 -0
  326. package/src/testing/index.ts +1 -1
  327. package/src/translations.ts +75 -75
  328. package/src/types/AgentIdentity.ts +35 -0
  329. package/src/types/Settings.ts +10 -0
  330. package/src/types/ThreadCapabilities.ts +46 -0
  331. package/src/types/ThreadOperation.ts +217 -0
  332. package/src/types/index.ts +5 -1
  333. package/src/types/types.ts +4 -109
  334. package/src/util.ts +37 -5
  335. package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +0 -16
  336. package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +0 -15
  337. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs +0 -171
  338. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +0 -7
  339. package/dist/lib/browser/call-manager-BCKLI4QD.mjs +0 -24
  340. package/dist/lib/browser/call-manager-BCKLI4QD.mjs.map +0 -7
  341. package/dist/lib/browser/chunk-2MUYQOQE.mjs +0 -23
  342. package/dist/lib/browser/chunk-2MUYQOQE.mjs.map +0 -7
  343. package/dist/lib/browser/chunk-B7YQ7QR2.mjs +0 -376
  344. package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +0 -7
  345. package/dist/lib/browser/chunk-CMCVHULC.mjs +0 -986
  346. package/dist/lib/browser/chunk-CMCVHULC.mjs.map +0 -7
  347. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  348. package/dist/lib/browser/chunk-HDEQRBOC.mjs +0 -181
  349. package/dist/lib/browser/chunk-HDEQRBOC.mjs.map +0 -7
  350. package/dist/lib/browser/chunk-L326LSNS.mjs +0 -18
  351. package/dist/lib/browser/chunk-L326LSNS.mjs.map +0 -7
  352. package/dist/lib/browser/chunk-T4KJ5JR4.mjs +0 -15
  353. package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +0 -7
  354. package/dist/lib/browser/chunk-VJMKS4CZ.mjs +0 -619
  355. package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +0 -7
  356. package/dist/lib/browser/chunk-VTYX3SIM.mjs +0 -147
  357. package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-XYUJXHYV.mjs +0 -106
  359. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +0 -7
  360. package/dist/lib/browser/chunk-ZCEU5K23.mjs +0 -1890
  361. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
  362. package/dist/lib/browser/index.mjs +0 -312
  363. package/dist/lib/browser/index.mjs.map +0 -7
  364. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs +0 -427
  365. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +0 -7
  366. package/dist/lib/browser/markdown-R6MGRIA6.mjs +0 -169
  367. package/dist/lib/browser/markdown-R6MGRIA6.mjs.map +0 -7
  368. package/dist/lib/browser/meta.json +0 -1
  369. package/dist/lib/browser/react-root-UMSBTN6H.mjs +0 -28
  370. package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +0 -7
  371. package/dist/lib/browser/react-surface-SXMQEWKE.mjs +0 -109
  372. package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +0 -7
  373. package/dist/lib/browser/settings-TCNF54PN.mjs +0 -22
  374. package/dist/lib/browser/settings-TCNF54PN.mjs.map +0 -7
  375. package/dist/lib/browser/state-ZQ4IPOJT.mjs +0 -34
  376. package/dist/lib/browser/state-ZQ4IPOJT.mjs.map +0 -7
  377. package/dist/lib/browser/toolkit-JF4B4QIO.mjs +0 -84
  378. package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +0 -7
  379. package/dist/lib/browser/types/index.mjs +0 -16
  380. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +0 -17
  381. package/dist/lib/node-esm/ChatContainer-SH6LTFQL.mjs +0 -16
  382. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs +0 -172
  383. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +0 -7
  384. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs +0 -25
  385. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs.map +0 -7
  386. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs +0 -987
  387. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +0 -7
  388. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs +0 -182
  389. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs +0 -108
  391. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  393. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs +0 -148
  395. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +0 -377
  397. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +0 -25
  399. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs.map +0 -7
  400. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +0 -19
  401. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +0 -620
  403. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-OBVAURUU.mjs +0 -17
  405. package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs +0 -1891
  407. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
  408. package/dist/lib/node-esm/index.mjs +0 -313
  409. package/dist/lib/node-esm/index.mjs.map +0 -7
  410. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs +0 -428
  411. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +0 -7
  412. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs +0 -170
  413. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs.map +0 -7
  414. package/dist/lib/node-esm/meta.json +0 -1
  415. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +0 -29
  416. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +0 -7
  417. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs +0 -110
  418. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +0 -7
  419. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs +0 -23
  420. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs.map +0 -7
  421. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs +0 -35
  422. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs.map +0 -7
  423. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +0 -85
  424. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +0 -7
  425. package/dist/lib/node-esm/types/index.mjs +0 -17
  426. package/dist/types/src/calls/call-manager.d.ts +0 -77
  427. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  428. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  429. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  430. package/dist/types/src/calls/index.d.ts +0 -7
  431. package/dist/types/src/calls/index.d.ts.map +0 -1
  432. package/dist/types/src/calls/media-manager.d.ts +0 -60
  433. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  434. package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
  435. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  436. package/dist/types/src/calls/types.d.ts +0 -45
  437. package/dist/types/src/calls/types.d.ts.map +0 -1
  438. package/dist/types/src/calls/util/audio.d.ts +0 -6
  439. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  440. package/dist/types/src/calls/util/calls-service.d.ts +0 -77
  441. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  442. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  443. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  444. package/dist/types/src/calls/util/index.d.ts +0 -5
  445. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  446. package/dist/types/src/calls/util/media.d.ts +0 -6
  447. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  448. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  449. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  450. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  451. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  452. package/dist/types/src/calls-service.stories.d.ts +0 -23
  453. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  454. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  455. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  456. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  457. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  458. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  459. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  460. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  461. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  462. package/dist/types/src/capabilities/toolkit.d.ts +0 -6
  463. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  464. package/dist/types/src/components/Call/Call.d.ts +0 -17
  465. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  466. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  467. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  468. package/dist/types/src/components/Call/index.d.ts +0 -3
  469. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  470. package/dist/types/src/components/CallDebugPanel.d.ts +0 -15
  471. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  472. package/dist/types/src/components/CallSidebar.d.ts +0 -4
  473. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  474. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  475. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  476. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -93
  477. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  478. package/dist/types/src/components/Chat.stories.d.ts +0 -93
  479. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  480. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  481. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  482. package/dist/types/src/components/Comments.stories.d.ts +0 -158
  483. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  484. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  485. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  486. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  487. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  488. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
  489. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  490. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  491. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  492. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  493. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  494. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  495. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  496. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
  497. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  498. package/dist/types/src/components/Media/index.d.ts +0 -3
  499. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  500. package/dist/types/src/components/MessageContainer.d.ts +0 -14
  501. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  502. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  503. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  504. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  505. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  506. package/dist/types/src/components/Participant/index.d.ts +0 -3
  507. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  508. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +0 -12
  509. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  510. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -162
  511. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  512. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  513. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  514. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -176
  515. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  516. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  517. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  518. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  519. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  520. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  521. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  522. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  523. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  524. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  525. package/dist/types/src/components/testing.d.ts.map +0 -1
  526. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
  527. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
  528. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  529. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  530. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  531. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  532. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  533. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  534. package/dist/types/src/testing/stories.d.ts +0 -2
  535. package/dist/types/src/testing/stories.d.ts.map +0 -1
  536. package/dist/types/src/types/schema.d.ts +0 -179
  537. package/dist/types/src/types/schema.d.ts.map +0 -1
  538. package/src/calls/call-manager.ts +0 -246
  539. package/src/calls/call-swarm-synchronizer.ts +0 -350
  540. package/src/calls/index.ts +0 -10
  541. package/src/calls/media-manager.ts +0 -375
  542. package/src/calls/speaking-monitor.ts +0 -85
  543. package/src/calls/types.ts +0 -74
  544. package/src/calls/util/audio.ts +0 -58
  545. package/src/calls/util/calls-service.ts +0 -581
  546. package/src/calls/util/history-cache.ts +0 -27
  547. package/src/calls/util/index.ts +0 -8
  548. package/src/calls/util/media.ts +0 -52
  549. package/src/calls/util/stub-media-streams.ts +0 -127
  550. package/src/calls/util/task-scheduling.ts +0 -92
  551. package/src/calls-service.stories.tsx +0 -229
  552. package/src/capabilities/call-manager.ts +0 -20
  553. package/src/capabilities/capabilities.ts +0 -33
  554. package/src/capabilities/intent-resolver.ts +0 -348
  555. package/src/capabilities/react-root.tsx +0 -17
  556. package/src/capabilities/toolkit.ts +0 -82
  557. package/src/components/Call/Call.tsx +0 -89
  558. package/src/components/Call/Toolbar.tsx +0 -182
  559. package/src/components/Call/index.ts +0 -6
  560. package/src/components/CallDebugPanel.tsx +0 -174
  561. package/src/components/CallSidebar.tsx +0 -18
  562. package/src/components/ChannelContainer.stories.tsx +0 -59
  563. package/src/components/ChannelContainer.tsx +0 -201
  564. package/src/components/Chat.stories.tsx +0 -91
  565. package/src/components/ChatContainer.tsx +0 -145
  566. package/src/components/Comments.stories.tsx +0 -91
  567. package/src/components/CommentsContainer.tsx +0 -72
  568. package/src/components/CommentsThreadContainer.tsx +0 -169
  569. package/src/components/Lobby/Lobby.tsx +0 -119
  570. package/src/components/Lobby/index.ts +0 -5
  571. package/src/components/Media/AudioStream.tsx +0 -67
  572. package/src/components/Media/VideoObject.stories.tsx +0 -60
  573. package/src/components/Media/VideoObject.tsx +0 -58
  574. package/src/components/Media/index.ts +0 -6
  575. package/src/components/Participant/Participant.tsx +0 -63
  576. package/src/components/Participant/ParticipantGrid.tsx +0 -89
  577. package/src/components/Participant/index.ts +0 -6
  578. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +0 -54
  579. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +0 -31
  580. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -158
  581. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  582. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -131
  583. package/src/components/ResponsiveGrid/index.ts +0 -7
  584. package/src/components/ThreadComplementary.tsx +0 -181
  585. package/src/components/ThreadSettings.tsx +0 -16
  586. package/src/components/testing.ts +0 -51
  587. package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
  588. package/src/hooks/useDebugMode.ts +0 -25
  589. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  590. package/src/hooks/useVideoStreamTrack.tsx +0 -36
  591. package/src/testing/stories.ts +0 -54
  592. package/src/types/schema.ts +0 -33
  593. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
  594. package/src/typings.d.ts +0 -8
  595. /package/dist/lib/{browser/ChannelContainer-BGDGZHV4.mjs.map → neutral/ChannelChat-LZEDFJVD.mjs.map} +0 -0
  596. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  597. /package/dist/lib/{browser/ChatContainer-75KJZ4XR.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  598. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
  599. /package/dist/lib/{node-esm/ChannelContainer-OXC6BTU7.mjs.map → neutral/index.mjs.map} +0 -0
  600. /package/dist/lib/{node-esm/ChatContainer-SH6LTFQL.mjs.map → neutral/meta.mjs.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/components/ChannelContainer.tsx", "../../../src/components/Call/Call.tsx", "../../../src/components/Media/AudioStream.tsx", "../../../src/components/Media/VideoObject.tsx", "../../../src/components/Participant/Participant.tsx", "../../../src/components/ResponsiveGrid/ResponsiveContainer.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGrid.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGridItem.tsx", "../../../src/components/Participant/ParticipantGrid.tsx", "../../../src/components/Call/Toolbar.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport React, { type ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { useCapabilities, useCapability } from '@dxos/app-framework';\nimport { Context } from '@dxos/context';\nimport { failUndefined } from '@dxos/debug';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { fullyQualifiedId, getSpace } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { ElevationProvider, Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { ControlGroup, ControlGroupButton, ControlItemInput } from '@dxos/react-ui-form';\nimport { MenuProvider, ToolbarMenu, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { ThreadCapabilities } from '../capabilities';\nimport { meta } from '../meta';\nimport { type ChannelType } from '../types';\n\nimport { Call } from './Call';\nimport ChatContainer from './ChatContainer';\n\nexport type ChannelContainerProps = {\n channel?: ChannelType;\n roomId?: string;\n role?: string;\n fullscreen?: boolean;\n};\n\n/**\n * Renders a call when active, otherwise renders the channel chat.\n */\nexport const ChannelContainer = ({ channel, roomId: _roomId, role, fullscreen }: ChannelContainerProps) => {\n const space = getSpace(channel);\n const callManager = useCapability(ThreadCapabilities.CallManager);\n const roomId = _roomId ?? (channel ? fullyQualifiedId(channel) : failUndefined());\n const identity = useIdentity();\n const isNamed = !!identity?.profile?.displayName;\n const joinSound = useSoundEffect('JoinCall');\n const leaveSound = useSoundEffect('LeaveCall');\n\n const extensions = useCapabilities(ThreadCapabilities.CallExtension);\n useEffect(() => {\n const ctx = new Context();\n callManager.left.on(ctx, (roomId) => {\n extensions.forEach((extension) => {\n void extension.onLeave?.(roomId);\n });\n });\n\n callManager.callStateUpdated.on(ctx, (state) => {\n extensions.forEach((extension) => {\n void extension.onCallStateUpdated?.(state);\n });\n });\n\n callManager.mediaStateUpdated.on(ctx, (state) => {\n extensions.forEach((extension) => {\n void extension.onMediaStateUpdated?.(state);\n });\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [callManager, extensions]);\n\n /**\n * Join the call.\n */\n // TODO(wittjosiah): Show preview before joining?\n const handleJoin = useCallback(async () => {\n if (!roomId || !channel) {\n return;\n }\n\n if (callManager.joined) {\n await callManager.leave();\n }\n\n try {\n void joinSound.play();\n callManager.setRoomId(roomId);\n await callManager.join();\n await Promise.all(extensions.map((extension) => extension.onJoin?.({ channel, roomId })));\n } catch (err) {\n // TODO(burdon): Error sound.\n log.catch(err);\n }\n }, [extensions, channel, roomId]);\n\n /**\n * Leave the call.\n */\n const handleLeave = useCallback(async () => {\n try {\n void leaveSound.play();\n } catch (err) {\n // TODO(burdon): Error sound.\n log.catch(err);\n } finally {\n void callManager.turnAudioOff();\n void callManager.turnVideoOff();\n void callManager.turnScreenshareOff();\n void callManager.leave();\n }\n }, [extensions, roomId]);\n\n const isJoined = callManager.joined && callManager.roomId === roomId;\n\n return (\n <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>\n {isJoined && !isNamed && <DisplayNameMissing />}\n {isJoined && isNamed && (\n <Call.Root>\n <Call.Grid fullscreen={fullscreen} />\n <Call.Toolbar channel={channel} onLeave={handleLeave} />\n </Call.Root>\n )}\n {!isJoined && channel && channel.defaultThread.target && space && (\n <>\n <ChannelToolbar attendableId={fullyQualifiedId(channel)} role={role} onJoinCall={handleJoin} />\n <ChatContainer space={space} thread={channel.defaultThread.target} />\n </>\n )}\n </StackItem.Content>\n );\n};\n\nexport default ChannelContainer;\n\nconst DisplayNameMissing = () => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n const [displayName, setDisplayName] = useState('');\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => setDisplayName(event.target.value), []);\n const handleSave = useCallback(() => client.halo.updateProfile({ displayName }), [client, displayName]);\n\n return (\n <ControlGroup classNames='p-4 place-content-center'>\n <ControlItemInput title={t('display name label')} description={t('display name description')}>\n <Input.TextInput\n value={displayName}\n onChange={handleChange}\n placeholder={t('display name input placeholder')}\n classNames='md:min-is-64'\n />\n </ControlItemInput>\n <ControlGroupButton disabled={!displayName} onClick={handleSave}>\n {t('set display name label')}\n </ControlGroupButton>\n </ControlGroup>\n );\n};\n\nconst useChannelToolbarActions = (onJoinCall?: () => void) => {\n const creator = useMemo(\n () =>\n Rx.make(() => {\n return {\n nodes: [\n createMenuItemGroup('root', {\n label: ['channel toolbar title', { ns: meta.id }],\n }),\n createMenuAction('video-call', () => onJoinCall?.(), {\n label: ['start video call label', { ns: meta.id }],\n icon: 'ph--video-camera--regular',\n type: 'video-call',\n }),\n ],\n edges: [{ source: 'root', target: 'video-call' }],\n };\n }),\n [],\n );\n\n return useMenuActions(creator);\n};\n\ntype ChannelToolbarProps = ThemedClassName<{\n attendableId?: string;\n role?: string;\n onJoinCall?: () => void;\n}>;\n\nconst ChannelToolbar = ({ attendableId, role, onJoinCall, classNames }: ChannelToolbarProps) => {\n const menuProps = useChannelToolbarActions(onJoinCall);\n\n return (\n <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>\n <MenuProvider {...menuProps} attendableId={attendableId}>\n <ToolbarMenu classNames={classNames} />\n </MenuProvider>\n </ElevationProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type FC, type PropsWithChildren } from 'react';\n\nimport { useCapability } from '@dxos/app-framework';\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { ThreadCapabilities } from '../../capabilities';\nimport { useDebugMode } from '../../hooks';\nimport { AudioStream } from '../Media';\nimport { ParticipantGrid } from '../Participant';\n\nimport { Toolbar, type ToolbarProps } from './Toolbar';\n\n//\n// Root\n//\n\ntype CallRootProps = PropsWithChildren<ThemedClassName>;\n\nconst CallRoot: FC<CallRootProps> = ({ children }) => {\n return <div className='relative flex flex-col grow overflow-hidden'>{children}</div>;\n};\n\nCallRoot.displayName = 'CallRoot';\n\n//\n// Audio\n//\n\ntype CallAudioProps = {};\n\nconst CallAudio: FC<CallAudioProps> = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n\n return <AudioStream tracks={call.audioTracksToPlay} />;\n};\n\nCallAudio.displayName = 'CallAudio';\n\n//\n// Room\n//\n\ntype CallGridProps = {\n fullscreen?: boolean;\n};\n\nconst CallGrid: FC<CallGridProps> = ({ fullscreen }) => {\n const debug = useDebugMode();\n const call = useCapability(ThreadCapabilities.CallManager);\n\n return (\n <div className='grid grow p-4 dark:bg-neutral-900'>\n <ParticipantGrid self={call.self} users={call.users} debug={debug} fullscreen={fullscreen} />\n </div>\n );\n};\n\nCallGrid.displayName = 'CallGrid';\n\n//\n// Toolbar\n//\n\ntype CallToolbarProps = Pick<ToolbarProps, 'channel' | 'onLeave'>;\n\nconst CallToolbar: FC<CallToolbarProps> = (props) => {\n return (\n <div className='absolute bottom-0 left-0 right-0 flex justify-center'>\n <Toolbar isInRoom {...props} />\n </div>\n );\n};\n\nCallToolbar.displayName = 'CallToolbar';\n\n//\n// Export\n//\n\nexport const Call = {\n Root: CallRoot,\n Grid: CallGrid,\n Audio: CallAudio,\n Toolbar: CallToolbar,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC, useEffect, useRef } from 'react';\n\nexport type AudioStreamProps = {\n tracks: MediaStreamTrack[];\n};\n\nexport const AudioStream: FC<AudioStreamProps> = ({ tracks }) => {\n const mediaStreamRef = useRef(new MediaStream());\n const ref = useRef<HTMLAudioElement>(null);\n\n useEffect(() => {\n const audio = ref.current;\n if (!audio) {\n return;\n }\n\n const mediaStream = mediaStreamRef.current;\n audio.srcObject = mediaStream;\n }, []);\n\n const resetSrcObject = () => {\n const audio = ref.current;\n const mediaStream = mediaStreamRef.current;\n if (!audio || !mediaStream) {\n return;\n }\n\n // Need to set srcObject again in Chrome and call play() again for Safari\n // https://www.youtube.com/live/Tkx3OGrwVk8?si=K--P_AzNnAGrjraV&t=2533\n // Calling play() this way to make Chrome happy otherwise it throws an error.\n audio.addEventListener('canplay', () => audio.play(), { once: true });\n audio.srcObject = mediaStream;\n };\n\n return (\n <>\n <audio ref={ref} autoPlay />\n {tracks.map((track) => (\n <AudioTrack key={track.id} track={track} mediaStream={mediaStreamRef.current} resetSrcObject={resetSrcObject} />\n ))}\n </>\n );\n};\n\ntype AudioTrackProps = {\n track: MediaStreamTrack;\n mediaStream: MediaStream;\n resetSrcObject: () => void;\n};\n\nconst AudioTrack = ({ track, mediaStream, resetSrcObject }: AudioTrackProps) => {\n useEffect(() => {\n const currentTrack = track;\n mediaStream.addTrack(currentTrack);\n resetSrcObject();\n return () => {\n mediaStream.removeTrack(currentTrack);\n resetSrcObject();\n };\n }, [track, mediaStream]);\n\n return null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type JSX, forwardRef, memo, useEffect, useRef } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nexport type VideoObjectProps = Omit<JSX.IntrinsicElements['video'], 'className' | 'ref'> &\n ThemedClassName<{\n videoStream?: MediaStream;\n flip?: boolean;\n // TODO(burdon): If screenshare then contain.\n contain?: boolean;\n }>;\n\nexport const VideoObject = memo(\n forwardRef<HTMLVideoElement, VideoObjectProps>(({ videoStream, classNames, flip, contain, ...rest }, ref) => {\n const internalRef = useRef<HTMLVideoElement | null>(null);\n\n useEffect(() => {\n const video = internalRef.current;\n if (video && videoStream) {\n video.srcObject = videoStream;\n video.setAttribute('autoplay', 'true');\n video.setAttribute('playsinline', 'true');\n }\n }, [videoStream, internalRef.current]);\n\n // NOTE: The video element typically has a max size of 1280x720.\n return (\n <video\n className={mx(\n 'w-full aspect-video',\n flip && 'scale-x-[-1]',\n contain ? 'object-contain' : 'object-cover',\n classNames,\n )}\n ref={(v) => {\n internalRef.current = v;\n if (ref === null) {\n return;\n }\n\n if (typeof ref === 'function') {\n ref(v);\n } else {\n ref.current = v;\n }\n }}\n {...rest}\n />\n );\n }),\n);\n\nVideoObject.displayName = 'VideoObject';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { memo, useMemo } from 'react';\n\nimport { useCapability } from '@dxos/app-framework';\n\nimport { type EncodedTrackName, type UserState } from '../../calls';\nimport { ThreadCapabilities } from '../../capabilities';\nimport { VideoObject } from '../Media';\nimport { ResponsiveGridItem, type ResponsiveGridItemProps } from '../ResponsiveGrid';\n\nexport const SCREENSHARE_SUFFIX = '_screenshare';\n\nexport const Participant = memo(({ item: user, debug, ...props }: ResponsiveGridItemProps<UserState>) => {\n const call = useCapability(ThreadCapabilities.CallManager);\n const isSelf: boolean = call.self.id !== undefined && user.id !== undefined && user.id.startsWith(call.self.id);\n const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);\n\n const pulledVideoStream =\n !isSelf && isScreenshare && user.tracks?.screenshareEnabled\n ? call.getVideoStream(user.tracks?.screenshare as EncodedTrackName)\n : !isSelf && !isScreenshare && user.tracks?.videoEnabled\n ? call.getVideoStream(user.tracks?.video as EncodedTrackName)\n : undefined;\n\n const videoStream = useMemo<MediaStream | undefined>(() => {\n if (isSelf) {\n if (isScreenshare) {\n return call.media.screenshareVideoStream;\n } else if (!isScreenshare) {\n return call.media.videoStream;\n }\n } else if (!isSelf) {\n return pulledVideoStream;\n }\n }, [isSelf, isScreenshare, call.media.videoStream, call.media.screenshareVideoStream, pulledVideoStream]);\n\n return (\n <ResponsiveGridItem\n {...props}\n item={user}\n name={user.name}\n self={isSelf}\n screenshare={!!call.media.screenshareVideoStream}\n video={call.media.videoEnabled}\n mute={user ? !user.tracks?.audioEnabled : false}\n wave={user.raisedHand}\n speaking={user.speaking}\n debug={debug}\n >\n <VideoObject\n videoStream={videoStream}\n flip={isSelf && !isScreenshare}\n contain={!!isScreenshare}\n classNames='rounded-md'\n />\n </ResponsiveGridItem>\n );\n});\n\nParticipant.displayName = 'Participant';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren } from 'react';\n\nimport { mx } from '@dxos/react-ui-theme';\n\n/**\n * A container component that maintains the child's aspect ratio while centering its content.\n * The container will scale to fit within its parent's bounds while preserving the aspect ratio.\n *\n * @example\n * <ResponsiveContainer>\n * <VideoObject />\n * </ResponsiveContainer>\n */\nexport const ResponsiveContainer = ({ children }: PropsWithChildren) => {\n return (\n // Outer container that takes full size of parent.\n <div role='none' className='relative flex w-full h-full'>\n {/* Absolute positioning layer for centering content. */}\n <div role='none' className='absolute inset-0 flex justify-center items-center'>\n {/* Content container that maintains given aspect ratio and proper scaling. */}\n <div role='none' className={mx('max-h-full max-w-full w-auto h-auto aspect-video')}>\n {children}\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ComponentType, type FC, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { invariant } from '@dxos/invariant';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { type Size } from '@dxos/react-ui-dnd';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { ResponsiveContainer } from './ResponsiveContainer';\nimport { type ResponsiveGridItemProps } from './ResponsiveGridItem';\n\nconst ASPECT_RATIO = 16 / 9;\nconst MIN_GALLERY_HEIGHT = 250;\n\nconst DEFAULT_GAP = 8;\n\nconst maxImageSize = 'w-[2560px] h-[1440px]';\n\n/**\n * Props for the ResponsiveGrid component.\n */\nexport type ResponsiveGridProps<T extends object = any> = ThemedClassName<{\n /** Cell component. */\n Cell: ComponentType<ResponsiveGridItemProps<T>>;\n\n /** Space between grid items in pixels. */\n gap?: number;\n\n /** Function to get the ID of an item. */\n getId?: (item: T) => string;\n\n /** Array of items to display in the grid. */\n items: T[];\n\n /** ID of the pinned item. */\n pinned?: string;\n\n /** Whether to hide the gallery (unpinned items) when an item is pinned. */\n autoHideGallery?: boolean;\n\n /** Whether the divider is resizable. */\n resizable?: boolean;\n\n /** Debug mode. */\n debug?: boolean;\n\n /** Callback when the pinned item changes. */\n onPinnedChange?: (pinned: string | undefined) => void;\n}>;\n\nconst defaultGetId: ResponsiveGridProps<any>['getId'] = (item: any) => item.id;\n\n/**\n * A responsive grid component that automatically adjusts its layout to optimize space usage.\n * Maintains aspect ratio of items while ensuring uniform gaps between them.\n */\nexport const ResponsiveGrid = <T extends object = any>({\n classNames,\n Cell,\n gap = DEFAULT_GAP,\n getId = defaultGetId,\n items,\n pinned,\n autoHideGallery = false,\n debug,\n onPinnedChange,\n}: ResponsiveGridProps<T>) => {\n const {\n width: containerWidth = 0,\n height: containerHeight = 0,\n ref: containerRef,\n } = useResizeDetector<HTMLDivElement>({ refreshRate: 100 });\n const [dividerHeight, setDividerHeight] = useState<Size>(0);\n useEffect(() => {\n if (containerWidth && containerHeight) {\n const { height } = fitAspectRatio(containerWidth, containerHeight, ASPECT_RATIO);\n setDividerHeight(Math.min(height, containerHeight - MIN_GALLERY_HEIGHT));\n }\n }, [containerWidth, containerHeight]);\n\n const pinnedItem = useMemo(() => items.find((item) => getId(item) === pinned), [items, pinned]);\n const mainItems = useMemo(() => items.filter((item) => getId(item) !== pinned), [items, pinned]);\n const hideGallery = autoHideGallery && pinnedItem !== undefined;\n\n //\n // Recalculate optimal layout when container size or items change.\n //\n const [{ time, columns, cellWidth }, setLayout] = useState<Layout>({ time: 0, columns: 0, cellWidth: 0 });\n const { width = 0, height = 0, ref: gridContainerRef } = useResizeDetector<HTMLDivElement>({ refreshRate: 200 });\n useEffect(() => {\n if (containerHeight && width && height) {\n const layout = calculateLayout(width, height, mainItems.length, gap);\n setLayout({ time: Date.now(), ...layout });\n }\n }, [containerHeight, width, height, mainItems.length, gap, pinned]);\n\n //\n // We use the browser to layout invisible divs and then calculate the absolute position of these items,\n // which are animated into position.\n //\n const [bounds, setBounds] = useState<[T, DOMRectBounds][]>([]);\n useLayoutEffect(() => {\n if ((!hideGallery && !gridContainerRef.current) || !containerHeight) {\n return;\n }\n\n // TODO(burdon): Consider directly setting bounds on DOM elementsinstead of state update?\n const t = setTimeout(() => {\n setBounds(\n items\n .filter((item) => !hideGallery || item === pinnedItem)\n .map((item) => {\n invariant(containerRef.current);\n const el = containerRef.current.querySelector(`[data-grid-item=\"${getId(item)}\"]`);\n if (!el) {\n return null;\n }\n\n const bounds = getRelativeBounds(containerRef.current, el as HTMLElement);\n return [item, bounds];\n })\n .filter((item): item is [T, DOMRectBounds] => item !== null),\n );\n });\n\n return () => clearTimeout(t);\n }, [containerHeight, items, pinnedItem, hideGallery, time]);\n\n const handleClick = useCallback(\n (item: T) => onPinnedChange?.(getId(item) === pinned ? undefined : getId(item)),\n [pinned, onPinnedChange],\n );\n\n return (\n <div ref={containerRef} className={mx('relative w-full h-full', classNames)}>\n {/* Placeholder elements to calculate layout. */}\n <div className='absolute inset-0 flex flex-col grow gap-2'>\n {/* Pinned item. */}\n {pinnedItem && (\n <div\n className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && 'h-full')}\n style={hideGallery ? {} : { height: dividerHeight }}\n >\n <SoloItem id={getId(pinnedItem)} debug={debug} />\n </div>\n )}\n\n {/* Gallery. */}\n {!hideGallery && (\n <div\n ref={gridContainerRef}\n className='flex grow-[1] overflow-hidden justify-center items-center'\n style={hideGallery ? {} : { minHeight: MIN_GALLERY_HEIGHT }}\n >\n {mainItems.length === 1 && (\n <div style={{ width: cellWidth }} className='flex h-full'>\n <SoloItem id={getId(mainItems[0])} debug={debug} />\n </div>\n )}\n\n {mainItems.length > 1 && columns > 0 && (\n <div\n role='grid'\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, ${cellWidth}px)`,\n gap: `${gap}px`,\n }}\n >\n {mainItems.map((item) => (\n <div\n key={getId(item)}\n {...{ 'data-grid-item': getId(item) }}\n className={mx(\n 'aspect-video max-h-full max-w-full w-auto h-auto',\n debug && 'border border-primary-500',\n )}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Absolutely positioned items. */}\n <div className={mx(debug && 'opacity-10')}>\n {bounds.map(([item, bounds]) => (\n <Cell\n key={getId(item)}\n classNames='absolute transition-all duration-500'\n item={item}\n style={bounds}\n pinned={getId(item) === pinned}\n onClick={items.length > 1 ? handleClick : undefined}\n />\n ))}\n </div>\n </div>\n );\n};\n\nconst SoloItem: FC<Pick<ResponsiveGridProps, 'debug'> & { id: string }> = ({ debug, id }) => {\n return (\n <ResponsiveContainer>\n <div\n {...{ 'data-grid-item': id }}\n className={mx('aspect-video overflow-hidden', debug && 'z-20 border-2 border-primary-500')}\n >\n {/* Maximum size placeholder image forces aspect ratio. */}\n <img alt='placeholder video' className={mx('opacity-0', maxImageSize)} />\n </div>\n </ResponsiveContainer>\n );\n};\n\ntype DOMRectBounds = Pick<DOMRect, 'top' | 'left' | 'width' | 'height'>;\n\n// TODO(burdon): Reconcile with react-ui-gameboard.\nconst getRelativeBounds = (container: HTMLElement, el: HTMLElement): DOMRectBounds => {\n const containerRect = container.getBoundingClientRect();\n const elementRect = el.getBoundingClientRect();\n return {\n top: elementRect.top - containerRect.top,\n left: elementRect.left - containerRect.left,\n width: elementRect.width,\n height: elementRect.height,\n };\n};\n\ntype Layout = {\n time?: number;\n columns: number;\n cellWidth: number;\n};\n\n/**\n * Calculates the optimal number of columns for a grid layout that minimizes wasted space.\n * @param containerWidth - Width of the container in pixels.\n * @param containerHeight - Height of the container in pixels.\n * @param count - Total number of items to display.\n * @param gap - Space between items in pixels.\n * @param aspectRatio - Desired aspect ratio of items (width/height).\n * @returns The optimal number of columns.\n */\nconst calculateLayout = (\n containerWidth: number,\n containerHeight: number,\n count: number,\n gap: number,\n aspectRatio = ASPECT_RATIO,\n): Layout => {\n if (count === 0) {\n return { columns: 1, cellWidth: 1 };\n }\n\n let minWastedSpace = Infinity;\n let bestColumns = 1;\n let cellWidth = 0;\n\n // Try different rows counts to find the optimal layout that minimizes wasted space.\n for (let rows = 1; rows <= count; rows++) {\n const cols = Math.ceil(count / rows);\n\n // Calculate available space accounting for gaps.\n const { width: itemWidth, height: itemHeight } = fitItemsToGrid(\n containerWidth,\n containerHeight,\n cols,\n rows,\n aspectRatio,\n gap,\n );\n\n // Calculate total wasted space for this configuration.\n const usedWidth = itemWidth * cols + gap * cols - 1;\n const usedHeight = itemHeight * rows + gap * rows - 1;\n\n // Determine if optimal.\n const wastedSpace = containerWidth * containerHeight - usedWidth * usedHeight;\n if (wastedSpace < minWastedSpace) {\n minWastedSpace = wastedSpace;\n bestColumns = cols;\n cellWidth = itemWidth;\n }\n }\n\n return { columns: bestColumns, cellWidth };\n};\n\n/**\n * Returns the size of the largest rectangle with the given aspect ration that fits within the grid.\n */\nconst fitItemsToGrid = (\n outerWidth: number,\n outerHeight: number,\n numCols: number,\n numRows: number,\n aspectRatio: number,\n gap: number,\n): { width: number; height: number } => {\n // Calculate available space accounting for gaps.\n const availableWidth = outerWidth - gap * (numCols - 1);\n const availableHeight = outerHeight - gap * (numRows - 1);\n\n // Calculate max dimensions.\n const maxCellWidth = availableWidth / numCols;\n const maxCellHeight = availableHeight / numRows;\n\n // Use fitAspectRatio to get dimensions that fit within max cell size while maintaining the desired aspect ratio\n return fitAspectRatio(maxCellWidth, maxCellHeight, aspectRatio);\n};\n\n/**\n * Returns the size of the largest rectangle the given aspect ratio that fits within the outer rectangle.\n */\nconst fitAspectRatio = (\n outerWidth: number,\n outerHeight: number,\n aspectRatio: number,\n): { width: number; height: number } => {\n if (outerWidth <= 0 || outerHeight <= 0 || aspectRatio <= 0) {\n return { width: 0, height: 0 };\n }\n\n // First try fitting to width.\n let width = outerWidth;\n let height = width / aspectRatio;\n\n // If too tall, fit to height instead.\n if (height > outerHeight) {\n height = outerHeight;\n width = height * aspectRatio;\n }\n\n return { width, height };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type CSSProperties, type PropsWithChildren, useEffect, useState } from 'react';\n\nimport { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { Waveform } from '@dxos/react-ui-sfx';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';\n\nimport { meta } from '../../meta';\n\nexport type ResponsiveGridItemProps<T extends object = any> = PropsWithChildren<\n ThemedClassName<{\n item: T;\n style?: CSSProperties;\n pinned?: boolean;\n name?: string;\n self?: boolean;\n screenshare?: boolean;\n video?: boolean;\n mute?: boolean;\n wave?: boolean;\n speaking?: boolean;\n debug?: boolean;\n onClick?: (item: T) => void;\n }>\n>;\n\n/**\n * Cell container.\n */\nexport const ResponsiveGridItem = <T extends object = any>({\n children,\n classNames,\n item,\n style,\n name,\n self,\n pinned,\n screenshare,\n video,\n mute,\n wave,\n speaking,\n onClick,\n}: ResponsiveGridItemProps<T>) => {\n const { t } = useTranslation(meta.id);\n const iconProps: Record<string, { icon: string; label: string; classNames?: string }> = {\n wave: {\n icon: 'ph--hand-waving--duotone',\n label: t('icon wave'),\n classNames: 'animate-pulse bg-orange-500',\n },\n mute: {\n icon: 'ph--microphone-slash--regular',\n label: t('icon muted'),\n },\n };\n\n const props = wave && !pinned ? iconProps.wave : mute ? iconProps.mute : speaking ? iconProps.speaking : undefined;\n\n // Debounce speaking indicator.\n const [speakingIndicator, setSpeakingIndicator] = useState(speaking);\n useEffect(() => {\n if (speaking) {\n setSpeakingIndicator(true);\n } else {\n const timeout = setTimeout(() => {\n setSpeakingIndicator(false);\n }, 1_000);\n return () => clearTimeout(timeout);\n }\n }, [speaking]);\n\n return (\n <div\n className={mx(\n 'relative w-full h-full group',\n 'rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500',\n speakingIndicator ? 'outline-green-500' : !video && 'outline-separator',\n classNames,\n )}\n style={style}\n >\n {children}\n\n {/* Action. */}\n {onClick && (\n <div className='z-10 absolute top-1 right-1 flex'>\n <IconButton\n classNames={mx('p-1 min-bs-1 rounded', groupHoverControlItemWithTransition)}\n iconOnly\n icon={pinned ? 'ph--x--regular' : 'ph--arrows-out--regular'}\n size={pinned ? 5 : 4}\n label={pinned ? t('icon unpin') : t('icon pin')}\n onClick={() => onClick?.(item)}\n />\n </div>\n )}\n\n {/* Name. */}\n {name && (\n <div className='z-10 absolute bottom-1 left-8 right-1 flex justify-end gap-1 items-center'>\n {/* TODO(burdon): Replace with avatar for everyone. */}\n {/* {self && <Icon icon='ph--asterisk--regular' size={pinned ? 5 : 4} />} */}\n {screenshare && <Icon icon='ph--broadcast--regular' size={pinned ? 5 : 4} />}\n <div\n className={mx('bg-neutral-800 text-neutral-100 py-0.5 truncate rounded', pinned ? 'px-2' : 'px-1 text-xs')}\n >\n {name}\n </div>\n </div>\n )}\n\n {/* Activity. */}\n <div className='z-10 absolute bottom-1 left-1 flex'>\n {(speaking && <Waveform active size={pinned ? 5 : 4} />) ||\n (props && (\n <IconButton\n classNames={mx('p-1 min-bs-1 rounded', props?.classNames)}\n icon={props?.icon}\n label={props?.label}\n size={pinned ? 5 : 4}\n iconOnly\n />\n ))}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { type UserState } from '../../calls';\nimport { ResponsiveGrid } from '../ResponsiveGrid';\n\nimport { Participant, SCREENSHARE_SUFFIX } from './Participant';\n\nconst getId = (user: UserState): string => user.id!;\n\nexport type ParticipantGridProps = ThemedClassName<{\n self: UserState;\n users: UserState[];\n fullscreen?: boolean;\n debug?: boolean;\n}>;\n\nexport const ParticipantGrid = ({ classNames, self, users, fullscreen, debug }: ParticipantGridProps) => {\n const [pinned, setPinned] = useState<string | undefined>();\n\n const allUsers = useMemo(() => {\n const allUsers: (UserState & { isSelf?: boolean })[] = [];\n users.forEach((user) => {\n if (!user.joined) {\n return;\n }\n\n allUsers.push({ ...user, isSelf: user.id === self.id });\n if (user.tracks?.screenshareEnabled) {\n const screenshare: UserState = {\n ...user,\n id: user.id + SCREENSHARE_SUFFIX,\n tracks: {\n ...user.tracks,\n video: user.tracks.screenshare,\n videoEnabled: user.tracks.screenshareEnabled,\n } as any, // TODO(burdon): Remove cast.\n };\n\n allUsers.push(screenshare);\n }\n });\n\n return allUsers;\n }, [self, users]);\n\n useEffect(() => {\n if (pinned) {\n // Check expanded user is still in call.\n if (!allUsers.find((user) => user.id === pinned)) {\n setPinned(undefined);\n }\n }\n }, [pinned, allUsers]);\n\n // TODO(burdon): Put self last.\n const sortedUsers: UserState[] = allUsers.sort((a, b) => {\n if (a.isSelf) {\n return 1;\n } else if (b.isSelf) {\n return -1;\n } else if (a.tracks?.screenshareEnabled) {\n return -1;\n } else if (b.tracks?.screenshareEnabled) {\n return 1;\n } else {\n return 0;\n }\n });\n\n // TODO(burdon): Show ghost view of user for a second before leaving.\n return (\n <ResponsiveGrid<UserState>\n classNames={classNames}\n Cell={Participant}\n debug={debug}\n getId={getId}\n items={sortedUsers}\n pinned={pinned}\n autoHideGallery={fullscreen}\n onPinnedChange={setPinned}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useAppGraph, useCapability } from '@dxos/app-framework';\nimport { useActions, useNode } from '@dxos/plugin-graph';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\nimport {\n Icon,\n IconButton,\n type IconButtonProps,\n Toolbar as NaturalToolbar,\n type ThemedClassName,\n toLocalizedString,\n useTranslation,\n} from '@dxos/react-ui';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';\n\nimport { ThreadCapabilities } from '../../capabilities';\nimport { meta } from '../../meta';\nimport { type ChannelType } from '../../types';\n\nexport type ToolbarProps = ThemedClassName<{\n channel?: ChannelType;\n participants?: number;\n autoHideControls?: boolean;\n isInRoom?: boolean;\n onJoin?: () => void;\n onLeave?: () => void;\n}>;\n\n// TODO(wittjosiah): Use ToolbarMenu.\nexport const Toolbar = ({\n classNames,\n channel,\n participants,\n autoHideControls = true,\n onJoin,\n onLeave,\n}: ToolbarProps) => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const call = useCapability(ThreadCapabilities.CallManager);\n\n // Channel app graph node.\n const node = useNode(graph, channel && fullyQualifiedId(channel));\n const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === 'toolbar');\n\n // Screen sharing.\n const isScreensharing = call.media.screenshareTrack !== undefined;\n const canSharescreen =\n typeof navigator.mediaDevices !== 'undefined' && navigator.mediaDevices.getDisplayMedia !== undefined;\n\n // TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.\n return (\n <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>\n <NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>\n <ToggleButton\n active={call.media.audioEnabled}\n state={{\n on: {\n icon: 'ph--microphone--regular',\n label: t('mic off'),\n onClick: () => call.turnAudioOff(),\n classNames: 'bg-callActive',\n },\n off: {\n icon: 'ph--microphone-slash--duotone',\n label: t('mic on'),\n onClick: () => call.turnAudioOn(),\n classNames: [call.joined && 'bg-callAlert'],\n },\n }}\n />\n <ToggleButton\n active={call.media.videoEnabled}\n state={{\n on: {\n icon: 'ph--video-camera--regular',\n label: t('camera off'),\n onClick: () => call.turnVideoOff(),\n },\n off: {\n icon: 'ph--video-camera-slash--duotone',\n label: t('camera on'),\n onClick: () => call.turnVideoOn(),\n },\n }}\n />\n\n {(participants !== undefined && (\n <div className='flex justify-center items-center gap-2 is-[5rem] text-xs text-subdued'>\n <Icon icon='ph--users--regular' size={4} />\n <div>{participants}</div>\n </div>\n )) || <NaturalToolbar.Separator variant='gap' />}\n\n {call.joined && (\n <>\n <ToggleButton\n disabled={!canSharescreen}\n active={isScreensharing}\n state={{\n on: {\n icon: 'ph--monitor--regular',\n label: t('screenshare off'),\n onClick: () => call.turnScreenshareOff(),\n },\n off: {\n icon: 'ph--monitor-arrow-up--duotone',\n label: t('screenshare on'),\n onClick: () => call.turnScreenshareOn(),\n },\n }}\n />\n\n {/* Companion actions. */}\n {actions.map((action) => (\n <IconButton\n key={action.id}\n {...defaultButtonProps}\n icon={action.properties.icon}\n label={toLocalizedString(action.properties.label, t)}\n classNames={action.properties.classNames}\n onClick={() => action.data({ node })}\n />\n ))}\n\n <ToggleButton\n active={call.raisedHand}\n state={{\n on: {\n icon: 'ph--hand-waving--regular',\n label: t('lower hand'),\n onClick: () => call.setRaisedHand(false),\n classNames: [call.joined && 'bg-callAlert'],\n },\n off: {\n icon: 'ph--hand-palm--duotone',\n label: t('raise hand'),\n onClick: () => call.setRaisedHand(true),\n },\n }}\n />\n </>\n )}\n {call.joined ? (\n <IconButton variant='destructive' icon='ph--phone-x--regular' label={t('leave call')} onClick={onLeave} />\n ) : (\n <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />\n )}\n </NaturalToolbar.Root>\n </div>\n );\n};\n\nToolbar.displayName = 'MeetingToolbar';\n\ntype ToolbarButtonProps = Pick<IconButtonProps, 'disabled'> & {\n active?: boolean;\n state: {\n on: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n off: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n };\n};\n\nconst defaultButtonProps: Partial<IconButtonProps> = {\n size: 5,\n iconOnly: true,\n};\n\nconst ToggleButton = ({ active, state }: ToolbarButtonProps) => (\n <IconButton\n {...defaultButtonProps}\n classNames={[active ? (state.on.classNames ?? 'bg-callActive') : state.off.classNames]}\n icon={active ? state.on.icon : state.off.icon}\n label={active ? state.on.label : state.off.label}\n onClick={active ? state.on.onClick : state.off.onClick}\n />\n);\n"],
5
- "mappings": "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",
6
- "names": ["Rx", "React", "useCallback", "useEffect", "useMemo", "useState", "useCapabilities", "useCapability", "Context", "failUndefined", "log", "useClient", "fullyQualifiedId", "getSpace", "useIdentity", "ElevationProvider", "Input", "useTranslation", "ControlGroup", "ControlGroupButton", "ControlItemInput", "MenuProvider", "ToolbarMenu", "createMenuAction", "createMenuItemGroup", "useMenuActions", "useSoundEffect", "StackItem", "React", "useCapability", "React", "useEffect", "useRef", "AudioStream", "tracks", "mediaStreamRef", "useRef", "MediaStream", "ref", "useEffect", "audio", "current", "mediaStream", "srcObject", "resetSrcObject", "addEventListener", "play", "once", "autoPlay", "map", "track", "AudioTrack", "key", "id", "currentTrack", "addTrack", "removeTrack", "React", "forwardRef", "memo", "useEffect", "useRef", "mx", "VideoObject", "memo", "forwardRef", "videoStream", "classNames", "flip", "contain", "rest", "ref", "internalRef", "useRef", "useEffect", "video", "current", "srcObject", "setAttribute", "React", "className", "mx", "v", "displayName", "React", "memo", "useMemo", "useCapability", "React", "mx", "ResponsiveContainer", "children", "React", "div", "role", "className", "mx", "React", "useCallback", "useEffect", "useLayoutEffect", "useMemo", "useState", "useResizeDetector", "invariant", "mx", "ASPECT_RATIO", "MIN_GALLERY_HEIGHT", "DEFAULT_GAP", "maxImageSize", "defaultGetId", "item", "id", "ResponsiveGrid", "classNames", "Cell", "gap", "getId", "items", "pinned", "autoHideGallery", "debug", "onPinnedChange", "width", "containerWidth", "height", "containerHeight", "ref", "containerRef", "useResizeDetector", "refreshRate", "dividerHeight", "setDividerHeight", "useState", "useEffect", "fitAspectRatio", "Math", "min", "pinnedItem", "useMemo", "find", "mainItems", "filter", "hideGallery", "undefined", "time", "columns", "cellWidth", "setLayout", "gridContainerRef", "layout", "calculateLayout", "length", "Date", "now", "bounds", "setBounds", "useLayoutEffect", "current", "t", "setTimeout", "map", "invariant", "el", "querySelector", "getRelativeBounds", "clearTimeout", "handleClick", "useCallback", "React", "div", "className", "mx", "style", "SoloItem", "minHeight", "role", "display", "gridTemplateColumns", "key", "onClick", "ResponsiveContainer", "img", "alt", "container", "containerRect", "getBoundingClientRect", "elementRect", "top", "left", "count", "aspectRatio", "minWastedSpace", "Infinity", "bestColumns", "rows", "cols", "ceil", "itemWidth", "itemHeight", "fitItemsToGrid", "usedWidth", "usedHeight", "wastedSpace", "outerWidth", "outerHeight", "numCols", "numRows", "availableWidth", "availableHeight", "maxCellWidth", "maxCellHeight", "React", "useEffect", "useState", "Icon", "IconButton", "useTranslation", "Waveform", "groupHoverControlItemWithTransition", "mx", "ResponsiveGridItem", "children", "classNames", "item", "style", "name", "self", "pinned", "screenshare", "video", "mute", "wave", "speaking", "onClick", "t", "useTranslation", "meta", "id", "iconProps", "icon", "label", "props", "undefined", "speakingIndicator", "setSpeakingIndicator", "useState", "useEffect", "timeout", "setTimeout", "clearTimeout", "React", "div", "className", "mx", "IconButton", "groupHoverControlItemWithTransition", "iconOnly", "size", "Icon", "Waveform", "active", "SCREENSHARE_SUFFIX", "Participant", "memo", "item", "user", "debug", "props", "call", "useCapability", "ThreadCapabilities", "CallManager", "isSelf", "self", "id", "undefined", "startsWith", "isScreenshare", "endsWith", "pulledVideoStream", "tracks", "screenshareEnabled", "getVideoStream", "screenshare", "videoEnabled", "video", "videoStream", "useMemo", "media", "screenshareVideoStream", "React", "ResponsiveGridItem", "name", "mute", "audioEnabled", "wave", "raisedHand", "speaking", "VideoObject", "flip", "contain", "classNames", "displayName", "React", "useEffect", "useMemo", "useState", "getId", "user", "id", "ParticipantGrid", "classNames", "self", "users", "fullscreen", "debug", "pinned", "setPinned", "useState", "allUsers", "useMemo", "forEach", "joined", "push", "isSelf", "tracks", "screenshareEnabled", "screenshare", "SCREENSHARE_SUFFIX", "video", "videoEnabled", "useEffect", "find", "undefined", "sortedUsers", "sort", "a", "b", "React", "ResponsiveGrid", "Cell", "Participant", "items", "autoHideGallery", "onPinnedChange", "React", "useAppGraph", "useCapability", "useActions", "useNode", "fullyQualifiedId", "Icon", "IconButton", "Toolbar", "NaturalToolbar", "toLocalizedString", "useTranslation", "groupHoverControlItemWithTransition", "mx", "Toolbar", "classNames", "channel", "participants", "autoHideControls", "onJoin", "onLeave", "t", "useTranslation", "meta", "id", "graph", "useAppGraph", "call", "useCapability", "ThreadCapabilities", "CallManager", "node", "useNode", "fullyQualifiedId", "actions", "useActions", "filter", "action", "properties", "disposition", "isScreensharing", "media", "screenshareTrack", "undefined", "canSharescreen", "navigator", "mediaDevices", "getDisplayMedia", "React", "div", "className", "mx", "groupHoverControlItemWithTransition", "NaturalToolbar", "Root", "ToggleButton", "active", "audioEnabled", "state", "on", "icon", "label", "onClick", "turnAudioOff", "off", "turnAudioOn", "joined", "videoEnabled", "turnVideoOff", "turnVideoOn", "Icon", "size", "Separator", "variant", "disabled", "turnScreenshareOff", "turnScreenshareOn", "map", "IconButton", "key", "defaultButtonProps", "toLocalizedString", "data", "raisedHand", "setRaisedHand", "displayName", "iconOnly", "CallRoot", "children", "React", "div", "className", "displayName", "CallAudio", "call", "useCapability", "ThreadCapabilities", "CallManager", "AudioStream", "tracks", "audioTracksToPlay", "CallGrid", "fullscreen", "debug", "useDebugMode", "ParticipantGrid", "self", "users", "CallToolbar", "props", "Toolbar", "isInRoom", "Call", "Root", "Grid", "Audio", "ChannelContainer", "channel", "roomId", "_roomId", "role", "fullscreen", "space", "getSpace", "callManager", "useCapability", "ThreadCapabilities", "CallManager", "fullyQualifiedId", "failUndefined", "identity", "useIdentity", "isNamed", "profile", "displayName", "joinSound", "useSoundEffect", "leaveSound", "extensions", "useCapabilities", "CallExtension", "useEffect", "ctx", "Context", "left", "on", "forEach", "extension", "onLeave", "callStateUpdated", "state", "onCallStateUpdated", "mediaStateUpdated", "onMediaStateUpdated", "dispose", "handleJoin", "useCallback", "joined", "leave", "play", "setRoomId", "join", "Promise", "all", "map", "onJoin", "err", "log", "catch", "handleLeave", "turnAudioOff", "turnVideoOff", "turnScreenshareOff", "isJoined", "React", "StackItem", "Content", "classNames", "toolbar", "DisplayNameMissing", "Call", "Root", "Grid", "Toolbar", "defaultThread", "target", "ChannelToolbar", "attendableId", "onJoinCall", "ChatContainer", "thread", "t", "useTranslation", "meta", "id", "client", "useClient", "setDisplayName", "useState", "handleChange", "event", "value", "handleSave", "halo", "updateProfile", "ControlGroup", "ControlItemInput", "title", "description", "Input", "TextInput", "onChange", "placeholder", "ControlGroupButton", "disabled", "onClick", "useChannelToolbarActions", "creator", "useMemo", "Rx", "make", "nodes", "createMenuItemGroup", "label", "ns", "createMenuAction", "icon", "type", "edges", "source", "useMenuActions", "menuProps", "ElevationProvider", "elevation", "MenuProvider", "ToolbarMenu"]
7
- }
@@ -1,182 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
- import {
3
- createBlackCanvasStreamTrack,
4
- createInaudibleAudioStreamTrack
5
- } from "./chunk-2V3WSLUZ.mjs";
6
-
7
- // src/hooks/analytics.ts
8
- import { useCallback } from "react";
9
- import { createIntent, useIntentDispatcher } from "@dxos/app-framework";
10
- import { ObservabilityAction } from "@dxos/plugin-observability/types";
11
- import { getSpace } from "@dxos/react-client/echo";
12
- import { useOnTransition } from "@dxos/react-ui";
13
- var useOnEditAnalytics = (message, textBlock, editing) => {
14
- const { dispatchPromise: dispatch } = useIntentDispatcher();
15
- const onEdit = useCallback(() => {
16
- const space = getSpace(message);
17
- if (!space || !textBlock) {
18
- return;
19
- }
20
- void dispatch(createIntent(ObservabilityAction.SendEvent, {
21
- name: "threads.message.update",
22
- properties: {
23
- spaceId: space.id,
24
- messageId: message.id,
25
- messageLength: textBlock?.text.length
26
- }
27
- }));
28
- }, [
29
- dispatch,
30
- message,
31
- textBlock
32
- ]);
33
- useOnTransition(editing, true, false, onEdit);
34
- };
35
-
36
- // src/hooks/useDebugMode.ts
37
- import { useEffect, useState } from "react";
38
- var useDebugMode = () => {
39
- const [enabled, setEnabled] = useState(false);
40
- useEffect(() => {
41
- const handler = (ev) => {
42
- if (ev.key.toLowerCase() === "d" && ev.ctrlKey) {
43
- ev.preventDefault();
44
- setEnabled(!enabled);
45
- }
46
- };
47
- document.addEventListener("keypress", handler);
48
- return () => {
49
- document.removeEventListener("keypress", handler);
50
- };
51
- }, [
52
- enabled
53
- ]);
54
- return enabled;
55
- };
56
-
57
- // src/hooks/useStatus.ts
58
- import { useEffect as useEffect2, useState as useState2 } from "react";
59
- var useStatus = (space, channel) => {
60
- const [processing, setProcessing] = useState2(false);
61
- useEffect2(() => {
62
- if (!space || !channel) {
63
- return;
64
- }
65
- const unsubscribe = space.listen(`status/${channel}`, (status) => {
66
- const { event } = status.payload ?? {};
67
- setProcessing(event === "processing");
68
- });
69
- const t = setInterval(() => {
70
- setProcessing((prev) => {
71
- if (typeof prev?.ts === "number" && Date.now() - prev.ts > 3e4) {
72
- return void 0;
73
- } else {
74
- return prev;
75
- }
76
- });
77
- }, 1e3);
78
- return () => {
79
- unsubscribe();
80
- clearInterval(t);
81
- };
82
- }, [
83
- space,
84
- channel
85
- ]);
86
- return processing;
87
- };
88
-
89
- // src/hooks/useVideoStreamTrack.tsx
90
- import { useEffect as useEffect3, useRef, useState as useState3 } from "react";
91
- var useVideoStreamTrack = (videoElement, videoSrc) => {
92
- const [videoStreamTrack, setVideoStreamTrack] = useState3(void 0);
93
- const hadRun = useRef(false);
94
- useEffect3(() => {
95
- if (!videoElement.current || hadRun.current || !videoSrc) {
96
- return;
97
- }
98
- hadRun.current = true;
99
- videoElement.current.addEventListener("playing", () => {
100
- if (videoStreamTrack) {
101
- return;
102
- }
103
- const stream = videoElement.current.captureStream();
104
- const track = stream.getTracks()[0];
105
- if (track && !videoStreamTrack) {
106
- setVideoStreamTrack(track);
107
- }
108
- stream.onaddtrack = (event) => {
109
- if (event.track.kind === "video" && !videoStreamTrack) {
110
- setVideoStreamTrack(event.track);
111
- }
112
- };
113
- });
114
- videoElement.current.src = videoSrc;
115
- }, [
116
- videoElement.current,
117
- videoSrc
118
- ]);
119
- return videoStreamTrack;
120
- };
121
-
122
- // src/hooks/useInaudibleAudioStreamTrack.tsx
123
- import { useEffect as useEffect4, useState as useState4 } from "react";
124
- import { scheduleTask } from "@dxos/async";
125
- import { Context } from "@dxos/context";
126
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/hooks/useInaudibleAudioStreamTrack.tsx";
127
- var useInaudibleAudioStreamTrack = () => {
128
- const [audioStreamTrack, setAudioStreamTrack] = useState4(void 0);
129
- useEffect4(() => {
130
- const ctx = new Context(void 0, {
131
- F: __dxlog_file,
132
- L: 15
133
- });
134
- scheduleTask(ctx, async () => {
135
- const audioStreamTrack2 = await createInaudibleAudioStreamTrack({
136
- ctx
137
- });
138
- setAudioStreamTrack(audioStreamTrack2);
139
- });
140
- return () => {
141
- void ctx.dispose();
142
- };
143
- }, []);
144
- return audioStreamTrack;
145
- };
146
-
147
- // src/hooks/useBlackCanvasStreamTrack.tsx
148
- import { useEffect as useEffect5, useState as useState5 } from "react";
149
- import { scheduleTask as scheduleTask2 } from "@dxos/async";
150
- import { Context as Context2 } from "@dxos/context";
151
- var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/hooks/useBlackCanvasStreamTrack.tsx";
152
- var useBlackCanvasStreamTrack = () => {
153
- const [blackCanvasStreamTrack, setBlackCanvasStreamTrack] = useState5(void 0);
154
- useEffect5(() => {
155
- const ctx = new Context2(void 0, {
156
- F: __dxlog_file2,
157
- L: 15
158
- });
159
- scheduleTask2(ctx, async () => {
160
- const blackCanvasStreamTrack2 = await createBlackCanvasStreamTrack({
161
- ctx,
162
- width: 720,
163
- height: 480
164
- });
165
- setBlackCanvasStreamTrack(blackCanvasStreamTrack2);
166
- });
167
- return () => {
168
- void ctx.dispose();
169
- };
170
- }, []);
171
- return blackCanvasStreamTrack;
172
- };
173
-
174
- export {
175
- useOnEditAnalytics,
176
- useDebugMode,
177
- useStatus,
178
- useVideoStreamTrack,
179
- useInaudibleAudioStreamTrack,
180
- useBlackCanvasStreamTrack
181
- };
182
- //# sourceMappingURL=chunk-2MMJF7DW.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/hooks/analytics.ts", "../../../src/hooks/useDebugMode.ts", "../../../src/hooks/useStatus.ts", "../../../src/hooks/useVideoStreamTrack.tsx", "../../../src/hooks/useInaudibleAudioStreamTrack.tsx", "../../../src/hooks/useBlackCanvasStreamTrack.tsx"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { createIntent, useIntentDispatcher } from '@dxos/app-framework';\nimport { type Live } from '@dxos/live-object';\nimport { ObservabilityAction } from '@dxos/plugin-observability/types';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useOnTransition } from '@dxos/react-ui';\nimport { type DataType } from '@dxos/schema';\n\nexport const useOnEditAnalytics = (\n message: Live<any>,\n textBlock: DataType.MessageBlock.Text | undefined,\n editing: boolean,\n) => {\n const { dispatchPromise: dispatch } = useIntentDispatcher();\n\n const onEdit = useCallback(() => {\n const space = getSpace(message);\n if (!space || !textBlock) {\n return;\n }\n\n void dispatch(\n createIntent(ObservabilityAction.SendEvent, {\n name: 'threads.message.update',\n properties: {\n spaceId: space.id,\n messageId: message.id,\n messageLength: textBlock?.text.length,\n },\n }),\n );\n }, [dispatch, message, textBlock]);\n\n useOnTransition(editing, true, false, onEdit);\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 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", "//\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 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"],
5
- "mappings": "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",
6
- "names": ["useCallback", "createIntent", "useIntentDispatcher", "ObservabilityAction", "getSpace", "useOnTransition", "useOnEditAnalytics", "message", "textBlock", "editing", "dispatchPromise", "dispatch", "useIntentDispatcher", "onEdit", "useCallback", "space", "getSpace", "createIntent", "ObservabilityAction", "SendEvent", "name", "properties", "spaceId", "id", "messageId", "messageLength", "text", "length", "useOnTransition", "useEffect", "useState", "useDebugMode", "enabled", "setEnabled", "useState", "useEffect", "handler", "ev", "key", "toLowerCase", "ctrlKey", "preventDefault", "document", "addEventListener", "removeEventListener", "useEffect", "useState", "useStatus", "space", "channel", "processing", "setProcessing", "useState", "useEffect", "unsubscribe", "listen", "status", "event", "payload", "t", "setInterval", "prev", "ts", "Date", "now", "undefined", "clearInterval", "useEffect", "useRef", "useState", "useVideoStreamTrack", "videoElement", "videoSrc", "videoStreamTrack", "setVideoStreamTrack", "useState", "undefined", "hadRun", "useRef", "useEffect", "current", "addEventListener", "stream", "captureStream", "track", "getTracks", "onaddtrack", "event", "kind", "src", "useEffect", "useState", "scheduleTask", "Context", "useInaudibleAudioStreamTrack", "audioStreamTrack", "setAudioStreamTrack", "useState", "undefined", "useEffect", "ctx", "Context", "scheduleTask", "createInaudibleAudioStreamTrack", "dispose", "useEffect", "useState", "scheduleTask", "Context", "useBlackCanvasStreamTrack", "blackCanvasStreamTrack", "setBlackCanvasStreamTrack", "useState", "undefined", "useEffect", "ctx", "Context", "scheduleTask", "createBlackCanvasStreamTrack", "width", "height", "dispose"]
7
- }
@@ -1,108 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
-
3
- // src/calls/util/stub-media-streams.ts
4
- import { scheduleTaskInterval, waitForCondition } from "@dxos/async";
5
- import { cancelWithContext } from "@dxos/context";
6
- import { invariant } from "@dxos/invariant";
7
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/stub-media-streams.ts";
8
- var createBlackCanvasStreamTrack = async ({ ctx, width, height }) => {
9
- const canvas = document.createElement("canvas");
10
- canvas.width = width;
11
- canvas.height = height;
12
- const canvasCtx = canvas.getContext("2d");
13
- invariant(canvasCtx, void 0, {
14
- F: __dxlog_file,
15
- L: 28,
16
- S: void 0,
17
- A: [
18
- "canvasCtx",
19
- ""
20
- ]
21
- });
22
- const drawFrame = () => {
23
- canvasCtx.fillStyle = "black";
24
- canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
25
- };
26
- scheduleTaskInterval(ctx, async () => drawFrame(), 200);
27
- const track = canvas.captureStream().getVideoTracks()[0];
28
- drawFrame();
29
- await cancelWithContext(ctx, waitForCondition({
30
- condition: () => track.readyState === "live",
31
- timeout: 1e3
32
- }));
33
- return track;
34
- };
35
- var audioContextStartedPreviously = false;
36
- var userGestureEvents = [
37
- "click",
38
- "contextmenu",
39
- "auxclick",
40
- "dblclick",
41
- "mousedown",
42
- "mouseup",
43
- "pointerup",
44
- "touchend",
45
- "keydown",
46
- "keyup"
47
- ];
48
- var createInaudibleAudioStreamTrack = async ({ ctx }) => {
49
- const audioContext = new window.AudioContext();
50
- const oscillator = audioContext.createOscillator();
51
- oscillator.type = "triangle";
52
- oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
53
- const gainNode = audioContext.createGain();
54
- gainNode.gain.setValueAtTime(0, audioContext.currentTime);
55
- oscillator.connect(gainNode);
56
- const destination = audioContext.createMediaStreamDestination();
57
- gainNode.connect(destination);
58
- let oscillatorStarted = false;
59
- const ensureOscillatorStarted = () => {
60
- if (oscillatorStarted) return;
61
- oscillator.start();
62
- oscillatorStarted = true;
63
- };
64
- const stateChangeHandler = () => {
65
- if (audioContext.state === "running") {
66
- audioContextStartedPreviously = true;
67
- ensureOscillatorStarted();
68
- }
69
- if (audioContext.state === "suspended" || audioContext.state === "interrupted") {
70
- resumeAudioContext();
71
- }
72
- };
73
- audioContext.addEventListener("statechange", stateChangeHandler);
74
- const resumeAudioContext = () => {
75
- void audioContext.resume().then(() => {
76
- cleanUpUserGestureListeners();
77
- });
78
- };
79
- const cleanUpUserGestureListeners = () => {
80
- userGestureEvents.forEach((gesture) => {
81
- document.removeEventListener(gesture, resumeAudioContext, {
82
- capture: true
83
- });
84
- });
85
- };
86
- if (audioContextStartedPreviously) {
87
- resumeAudioContext();
88
- } else {
89
- userGestureEvents.forEach((gesture) => {
90
- document.addEventListener(gesture, resumeAudioContext, {
91
- capture: true
92
- });
93
- });
94
- }
95
- ctx.onDispose(async () => {
96
- cleanUpUserGestureListeners();
97
- oscillator.disconnect();
98
- oscillator.stop();
99
- await audioContext.close();
100
- });
101
- return destination.stream.getAudioTracks()[0];
102
- };
103
-
104
- export {
105
- createBlackCanvasStreamTrack,
106
- createInaudibleAudioStreamTrack
107
- };
108
- //# sourceMappingURL=chunk-2V3WSLUZ.mjs.map
@@ -1,7 +0,0 @@
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 const oscillator = audioContext.createOscillator();\n oscillator.type = 'triangle';\n // roughly sounds like a box fan\n oscillator.frequency.setValueAtTime(20, audioContext.currentTime);\n\n const gainNode = audioContext.createGain();\n // even w/ gain at 0 some packets are sent\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) return;\n oscillator.start();\n oscillatorStarted = true;\n };\n\n const stateChangeHandler = () => {\n if (audioContext.state === 'running') {\n audioContextStartedPreviously = true;\n ensureOscillatorStarted();\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;;AAMnB,IAAMC,+BAA+B,OAAO,EACjDC,KACAC,OACAC,OAAM,MAKP;AACC,QAAMC,SAASC,SAASC,cAAc,QAAA;AACtCF,SAAOF,QAAQA;AACfE,SAAOD,SAASA;AAEhB,QAAMI,YAAYH,OAAOI,WAAW,IAAA;AACpCT,YAAUQ,WAAAA,QAAAA;;;;;;;;;AACV,QAAME,YAAY,MAAA;AAChBF,cAAUG,YAAY;AACtBH,cAAUI,SAAS,GAAG,GAAGP,OAAOF,OAAOE,OAAOD,MAAM;EACtD;AACAP,uBAAqBK,KAAK,YAAYQ,UAAAA,GAAa,GAAA;AAEnD,QAAMG,QAAQR,OAAOS,cAAa,EAAGC,eAAc,EAAG,CAAA;AACtDL,YAAAA;AAEA,QAAMX,kBAAkBG,KAAKJ,iBAAiB;IAAEkB,WAAW,MAAMH,MAAMI,eAAe;IAAQC,SAAS;EAAM,CAAA,CAAA;AAE7G,SAAOL;AACT;AAEA,IAAIM,gCAAgC;AACpC,IAAMC,oBAAoB;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOK,IAAMC,kCAAkC,OAAO,EAAEnB,IAAG,MAAoB;AAC7E,QAAMoB,eAAe,IAAIC,OAAOC,aAAY;AAC5C,QAAMC,aAAaH,aAAaI,iBAAgB;AAChDD,aAAWE,OAAO;AAElBF,aAAWG,UAAUC,eAAe,IAAIP,aAAaQ,WAAW;AAEhE,QAAMC,WAAWT,aAAaU,WAAU;AAExCD,WAASE,KAAKJ,eAAe,GAAGP,aAAaQ,WAAW;AACxDL,aAAWS,QAAQH,QAAAA;AAEnB,QAAMI,cAAcb,aAAac,6BAA4B;AAC7DL,WAASG,QAAQC,WAAAA;AAEjB,MAAIE,oBAAoB;AACxB,QAAMC,0BAA0B,MAAA;AAC9B,QAAID,kBAAmB;AACvBZ,eAAWc,MAAK;AAChBF,wBAAoB;EACtB;AAEA,QAAMG,qBAAqB,MAAA;AACzB,QAAIlB,aAAamB,UAAU,WAAW;AACpCtB,sCAAgC;AAChCmB,8BAAAA;IACF;AACA,QAAIhB,aAAamB,UAAU,eAAgBnB,aAAamB,UAAqB,eAAe;AAC1FC,yBAAAA;IACF;EACF;AAEApB,eAAaqB,iBAAiB,eAAeH,kBAAAA;AAE7C,QAAME,qBAAqB,MAAA;AACzB,SAAKpB,aAAasB,OAAM,EAAGC,KAAK,MAAA;AAC9BC,kCAAAA;IACF,CAAA;EACF;AAEA,QAAMA,8BAA8B,MAAA;AAClC1B,sBAAkB2B,QAAQ,CAACC,YAAAA;AACzB1C,eAAS2C,oBAAoBD,SAASN,oBAAoB;QACxDQ,SAAS;MACX,CAAA;IACF,CAAA;EACF;AAEA,MAAI/B,+BAA+B;AACjCuB,uBAAAA;EACF,OAAO;AACLtB,sBAAkB2B,QAAQ,CAACC,YAAAA;AACzB1C,eAASqC,iBAAiBK,SAASN,oBAAoB;QACrDQ,SAAS;MACX,CAAA;IACF,CAAA;EACF;AAEAhD,MAAIiD,UAAU,YAAA;AACZL,gCAAAA;AACArB,eAAW2B,WAAU;AACrB3B,eAAW4B,KAAI;AACf,UAAM/B,aAAagC,MAAK;EAC1B,CAAA;AAEA,SAAOnB,YAAYoB,OAAOC,eAAc,EAAG,CAAA;AAC7C;",
6
- "names": ["scheduleTaskInterval", "waitForCondition", "cancelWithContext", "invariant", "createBlackCanvasStreamTrack", "ctx", "width", "height", "canvas", "document", "createElement", "canvasCtx", "getContext", "drawFrame", "fillStyle", "fillRect", "track", "captureStream", "getVideoTracks", "condition", "readyState", "timeout", "audioContextStartedPreviously", "userGestureEvents", "createInaudibleAudioStreamTrack", "audioContext", "window", "AudioContext", "oscillator", "createOscillator", "type", "frequency", "setValueAtTime", "currentTime", "gainNode", "createGain", "gain", "connect", "destination", "createMediaStreamDestination", "oscillatorStarted", "ensureOscillatorStarted", "start", "stateChangeHandler", "state", "resumeAudioContext", "addEventListener", "resume", "then", "cleanUpUserGestureListeners", "forEach", "gesture", "removeEventListener", "capture", "onDispose", "disconnect", "stop", "close", "stream", "getAudioTracks"]
7
- }
@@ -1,33 +0,0 @@
1
- import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
-
3
- // src/util.ts
4
- import * as Match from "effect/Match";
5
- import { generateName } from "@dxos/display-name";
6
- import { hexToFallback } from "@dxos/util";
7
- var getMessageMetadata = (id, identity) => {
8
- const fallback = hexToFallback(identity?.identityKey.toHex() ?? "0");
9
- return {
10
- id,
11
- authorId: identity?.did,
12
- authorName: identity?.profile?.displayName ?? (identity?.identityKey ? generateName(identity.identityKey.toHex()) : void 0),
13
- authorAvatarProps: {
14
- hue: identity?.profile?.data?.hue ?? fallback.hue,
15
- emoji: identity?.profile?.data?.emoji ?? fallback.emoji
16
- }
17
- };
18
- };
19
- var getAnchor = Match.type().pipe(Match.when({
20
- mode: "single"
21
- }, (s) => s.id), Match.when({
22
- mode: "multi"
23
- }, (s) => s.ids.length > 0 ? s.ids.join(",") : void 0), Match.when({
24
- mode: "range"
25
- }, (s) => s.from && s.to ? `${s.from}:${s.to}` : void 0), Match.when({
26
- mode: "multi-range"
27
- }, (s) => s.ranges[0] && `${s.ranges[0].from}:${s.ranges[0].to}`), Match.when(void 0, () => void 0), Match.exhaustive);
28
-
29
- export {
30
- getMessageMetadata,
31
- getAnchor
32
- };
33
- //# sourceMappingURL=chunk-ABUFOZVX.mjs.map
@@ -1,7 +0,0 @@
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 Selection } from '@dxos/plugin-attention';\nimport { type PublicKey } from '@dxos/react-client';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { type MessageMetadata } from '@dxos/react-ui-thread';\nimport { hexToFallback } from '@dxos/util';\n\nexport type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;\n\nexport const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {\n const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');\n return {\n id,\n authorId: identity?.did,\n authorName:\n identity?.profile?.displayName ??\n (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),\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,qBAAqB;AAIvB,IAAMC,qBAAqB,CAACC,IAAYC,aAAAA;AAC7C,QAAMC,WAAWC,cAAcF,UAAUG,YAAYC,MAAAA,KAAW,GAAA;AAChE,SAAO;IACLL;IACAM,UAAUL,UAAUM;IACpBC,YACEP,UAAUQ,SAASC,gBAClBT,UAAUG,cAAcO,aAAaV,SAASG,YAAYC,MAAK,CAAA,IAAMO;IACxEC,mBAAmB;MACjBC,KAAKb,UAAUQ,SAASM,MAAMD,OAAOZ,SAASY;MAC9CE,OAAOf,UAAUQ,SAASM,MAAMC,SAASd,SAASc;IACpD;EACF;AACF;AAEO,IAAMC,YAAkBC,WAAI,EAA0BC,KACrDC,WAAK;EAAEC,MAAM;AAAS,GAAG,CAACC,MAAMA,EAAEtB,EAAE,GACpCoB,WAAK;EAAEC,MAAM;AAAQ,GAAG,CAACC,MAAOA,EAAEC,IAAIC,SAAS,IAAIF,EAAEC,IAAIE,KAAK,GAAA,IAAOb,MAAAA,GACrEQ,WAAK;EAAEC,MAAM;AAAQ,GAAG,CAACC,MAAOA,EAAEI,QAAQJ,EAAEK,KAAK,GAAGL,EAAEI,IAAI,IAAIJ,EAAEK,EAAE,KAAKf,MAAAA,GACvEQ,WAAK;EAAEC,MAAM;AAAc,GAAG,CAACC,MAAMA,EAAEM,OAAO,CAAA,KAAM,GAAGN,EAAEM,OAAO,CAAA,EAAGF,IAAI,IAAIJ,EAAEM,OAAO,CAAA,EAAGD,EAAE,EAAE,GAC3FP,WAAKR,QAAW,MAAMA,MAAAA,GACtBiB,gBAAU;",
6
- "names": ["Match", "generateName", "hexToFallback", "getMessageMetadata", "id", "identity", "fallback", "hexToFallback", "identityKey", "toHex", "authorId", "did", "authorName", "profile", "displayName", "generateName", "undefined", "authorAvatarProps", "hue", "data", "emoji", "getAnchor", "type", "pipe", "when", "mode", "s", "ids", "length", "join", "from", "to", "ranges", "exhaustive"]
7
- }