@dxos/plugin-thread 0.8.4-main.c4373fc → 0.8.4-main.d9fc60f731

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 (602) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +271 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs +28 -0
  5. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs.map +7 -0
  6. package/dist/lib/neutral/ChannelChat-LZEDFJVD.mjs +10 -0
  7. package/dist/lib/neutral/CommentsCompanion-FOUIGCEK.mjs +208 -0
  8. package/dist/lib/neutral/CommentsCompanion-FOUIGCEK.mjs.map +7 -0
  9. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs +61 -0
  10. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs.map +7 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs +109 -0
  12. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  14. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +24 -0
  16. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  17. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
  18. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
  19. package/dist/lib/neutral/add-message-RDIABSIX.mjs +122 -0
  20. package/dist/lib/neutral/add-message-RDIABSIX.mjs.map +7 -0
  21. package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs +244 -0
  22. package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs.map +7 -0
  23. package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs +120 -0
  24. package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs.map +7 -0
  25. package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs +40 -0
  26. package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs.map +7 -0
  27. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  28. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  29. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  30. package/dist/lib/neutral/capabilities/index.mjs +27 -0
  31. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  32. package/dist/lib/neutral/chunk-35GUWXBB.mjs +48 -0
  33. package/dist/lib/neutral/chunk-35GUWXBB.mjs.map +7 -0
  34. package/dist/lib/neutral/chunk-5T5LPLBN.mjs +36 -0
  35. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  36. package/dist/lib/neutral/chunk-BHEZLLXG.mjs +55 -0
  37. package/dist/lib/neutral/chunk-BHEZLLXG.mjs.map +7 -0
  38. package/dist/lib/neutral/chunk-HQZWTDJC.mjs +164 -0
  39. package/dist/lib/neutral/chunk-HQZWTDJC.mjs.map +7 -0
  40. package/dist/lib/neutral/chunk-IQBZZAMX.mjs +335 -0
  41. package/dist/lib/neutral/chunk-IQBZZAMX.mjs.map +7 -0
  42. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  43. package/dist/lib/neutral/chunk-JJETHBAZ.mjs +8 -0
  44. package/dist/lib/neutral/chunk-JJETHBAZ.mjs.map +7 -0
  45. package/dist/lib/{browser/chunk-CP7E2HRE.mjs → neutral/chunk-JLY4NVTA.mjs} +12 -5
  46. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  47. package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
  48. package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
  49. package/dist/lib/neutral/components/index.mjs +541 -0
  50. package/dist/lib/neutral/components/index.mjs.map +7 -0
  51. package/dist/lib/neutral/containers/index.mjs +15 -0
  52. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  53. package/dist/lib/neutral/create-VXM6HJMN.mjs +61 -0
  54. package/dist/lib/neutral/create-VXM6HJMN.mjs.map +7 -0
  55. package/dist/lib/neutral/create-channel-FSJOMRHF.mjs +19 -0
  56. package/dist/lib/neutral/create-channel-FSJOMRHF.mjs.map +7 -0
  57. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs +28 -0
  58. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs.map +7 -0
  59. package/dist/lib/neutral/create-proposals-ILYIYJEN.mjs +56 -0
  60. package/dist/lib/neutral/create-proposals-ILYIYJEN.mjs.map +7 -0
  61. package/dist/lib/neutral/delete-6KZERY6K.mjs +57 -0
  62. package/dist/lib/neutral/delete-6KZERY6K.mjs.map +7 -0
  63. package/dist/lib/neutral/delete-message-PATSHW36.mjs +54 -0
  64. package/dist/lib/neutral/delete-message-PATSHW36.mjs.map +7 -0
  65. package/dist/lib/neutral/hooks/index.mjs +10 -0
  66. package/dist/lib/neutral/index.mjs +32 -0
  67. package/dist/lib/neutral/markdown-5UHAAC5Z.mjs +83 -0
  68. package/dist/lib/neutral/markdown-5UHAAC5Z.mjs.map +7 -0
  69. package/dist/lib/neutral/meta.json +1 -0
  70. package/dist/lib/neutral/meta.mjs +10 -0
  71. package/dist/lib/neutral/on-create-space-6NLTBGGD.mjs +23 -0
  72. package/dist/lib/neutral/on-create-space-6NLTBGGD.mjs.map +7 -0
  73. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  74. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  75. package/dist/lib/neutral/operations/index.mjs +8 -0
  76. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  77. package/dist/lib/neutral/plugin.mjs +16 -0
  78. package/dist/lib/neutral/plugin.mjs.map +7 -0
  79. package/dist/lib/neutral/react-surface-TUMXARMI.mjs +76 -0
  80. package/dist/lib/neutral/react-surface-TUMXARMI.mjs.map +7 -0
  81. package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs +32 -0
  82. package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs.map +7 -0
  83. package/dist/lib/neutral/restore-SP4HADCE.mjs +32 -0
  84. package/dist/lib/neutral/restore-SP4HADCE.mjs.map +7 -0
  85. package/dist/lib/neutral/restore-message-TVIC66VL.mjs +33 -0
  86. package/dist/lib/neutral/restore-message-TVIC66VL.mjs.map +7 -0
  87. package/dist/lib/neutral/select-DLHPEKEA.mjs +24 -0
  88. package/dist/lib/neutral/select-DLHPEKEA.mjs.map +7 -0
  89. package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs +20 -0
  90. package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs.map +7 -0
  91. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  92. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  93. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  94. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  95. package/dist/lib/neutral/testing/index.mjs +58 -0
  96. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  97. package/dist/lib/neutral/toggle-resolved-GMAD3SZ2.mjs +36 -0
  98. package/dist/lib/neutral/toggle-resolved-GMAD3SZ2.mjs.map +7 -0
  99. package/dist/lib/neutral/translations.mjs +91 -0
  100. package/dist/lib/neutral/translations.mjs.map +7 -0
  101. package/dist/lib/neutral/types/index.mjs +16 -0
  102. package/dist/lib/neutral/types/index.mjs.map +7 -0
  103. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  104. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  105. package/dist/types/src/ThreadPlugin.d.ts +3 -1
  106. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  107. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  108. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  109. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  110. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  111. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  112. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  113. package/dist/types/src/blueprints/index.d.ts +2 -0
  114. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  115. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  116. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  117. package/dist/types/src/capabilities/agent-runner.d.ts +22 -0
  118. package/dist/types/src/capabilities/agent-runner.d.ts.map +1 -0
  119. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  120. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  121. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  122. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  123. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  124. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  125. package/dist/types/src/capabilities/index.d.ts +16 -15
  126. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  127. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  128. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  129. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  130. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  131. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  132. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  133. package/dist/types/src/capabilities/settings.d.ts +5 -2
  134. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  135. package/dist/types/src/capabilities/state.d.ts +5 -5
  136. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  137. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  138. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  139. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  140. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  141. package/dist/types/src/components/Chat/index.d.ts +2 -0
  142. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  143. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  144. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  145. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  146. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  147. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
  148. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  149. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  150. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  151. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  152. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  153. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  154. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  155. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  156. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  157. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  158. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  159. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  160. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  161. package/dist/types/src/components/index.d.ts +5 -10
  162. package/dist/types/src/components/index.d.ts.map +1 -1
  163. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
  164. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  165. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
  166. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  167. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  168. package/dist/types/src/containers/ChannelArticle/index.d.ts.map +1 -0
  169. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  170. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  171. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  172. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  173. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts +11 -0
  174. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts.map +1 -0
  175. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts +198 -0
  176. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts.map +1 -0
  177. package/dist/types/src/containers/CommentsCompanion/index.d.ts +2 -0
  178. package/dist/types/src/containers/CommentsCompanion/index.d.ts.map +1 -0
  179. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  180. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  181. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
  182. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  183. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  184. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  185. package/dist/types/src/containers/index.d.ts +6 -0
  186. package/dist/types/src/containers/index.d.ts.map +1 -0
  187. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  188. package/dist/types/src/extensions/command.d.ts.map +1 -0
  189. package/dist/types/src/extensions/index.d.ts +1 -0
  190. package/dist/types/src/extensions/index.d.ts.map +1 -1
  191. package/dist/types/src/extensions/threads.d.ts +9 -4
  192. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  193. package/dist/types/src/hooks/analytics.d.ts +2 -3
  194. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  195. package/dist/types/src/hooks/index.d.ts +0 -4
  196. package/dist/types/src/hooks/index.d.ts.map +1 -1
  197. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  198. package/dist/types/src/index.d.ts +2 -3
  199. package/dist/types/src/index.d.ts.map +1 -1
  200. package/dist/types/src/meta.d.ts +2 -2
  201. package/dist/types/src/meta.d.ts.map +1 -1
  202. package/dist/types/src/operations/add-message.d.ts +5 -0
  203. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  204. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  205. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  206. package/dist/types/src/operations/create-channel.d.ts +5 -0
  207. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  208. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  209. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  210. package/dist/types/src/operations/create.d.ts +5 -0
  211. package/dist/types/src/operations/create.d.ts.map +1 -0
  212. package/dist/types/src/operations/delete-message.d.ts +5 -0
  213. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  214. package/dist/types/src/operations/delete.d.ts +5 -0
  215. package/dist/types/src/operations/delete.d.ts.map +1 -0
  216. package/dist/types/src/operations/index.d.ts +3 -0
  217. package/dist/types/src/operations/index.d.ts.map +1 -0
  218. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  219. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  220. package/dist/types/src/operations/respond-to-thread.d.ts +5 -0
  221. package/dist/types/src/operations/respond-to-thread.d.ts.map +1 -0
  222. package/dist/types/src/operations/restore-message.d.ts +5 -0
  223. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  224. package/dist/types/src/operations/restore.d.ts +5 -0
  225. package/dist/types/src/operations/restore.d.ts.map +1 -0
  226. package/dist/types/src/operations/select.d.ts +5 -0
  227. package/dist/types/src/operations/select.d.ts.map +1 -0
  228. package/dist/types/src/operations/set-agent-config.d.ts +5 -0
  229. package/dist/types/src/operations/set-agent-config.d.ts.map +1 -0
  230. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  231. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  232. package/dist/types/src/plugin.d.ts +4 -0
  233. package/dist/types/src/plugin.d.ts.map +1 -0
  234. package/dist/types/src/should-trigger-agent.d.ts +22 -0
  235. package/dist/types/src/should-trigger-agent.d.ts.map +1 -0
  236. package/dist/types/src/should-trigger-agent.test.d.ts +2 -0
  237. package/dist/types/src/should-trigger-agent.test.d.ts.map +1 -0
  238. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +4 -4
  239. package/dist/types/src/testing/data.d.ts.map +1 -0
  240. package/dist/types/src/testing/index.d.ts +1 -1
  241. package/dist/types/src/testing/index.d.ts.map +1 -1
  242. package/dist/types/src/translations.d.ts +142 -74
  243. package/dist/types/src/translations.d.ts.map +1 -1
  244. package/dist/types/src/types/AgentIdentity.d.ts +27 -0
  245. package/dist/types/src/types/AgentIdentity.d.ts.map +1 -0
  246. package/dist/types/src/types/Settings.d.ts +5 -0
  247. package/dist/types/src/types/Settings.d.ts.map +1 -0
  248. package/dist/types/src/types/ThreadCapabilities.d.ts +34 -0
  249. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  250. package/dist/types/src/types/ThreadOperation.d.ts +2745 -0
  251. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  252. package/dist/types/src/types/index.d.ts +4 -1
  253. package/dist/types/src/types/index.d.ts.map +1 -1
  254. package/dist/types/src/types/types.d.ts +3 -458
  255. package/dist/types/src/types/types.d.ts.map +1 -1
  256. package/dist/types/src/util.d.ts +6 -3
  257. package/dist/types/src/util.d.ts.map +1 -1
  258. package/dist/types/tsconfig.tsbuildinfo +1 -1
  259. package/package.json +150 -83
  260. package/src/ThreadPlugin.node.ts +39 -0
  261. package/src/ThreadPlugin.test.ts +37 -0
  262. package/src/ThreadPlugin.tsx +63 -123
  263. package/src/ThreadPlugin.workerd.ts +20 -0
  264. package/src/blueprints/index.ts +5 -0
  265. package/src/blueprints/thread-blueprint.ts +36 -0
  266. package/src/capabilities/agent-runner.ts +291 -0
  267. package/src/capabilities/app-graph-builder.ts +124 -165
  268. package/src/capabilities/blueprint-definition.ts +19 -0
  269. package/src/capabilities/create-object.ts +30 -0
  270. package/src/capabilities/index.ts +16 -12
  271. package/src/capabilities/markdown.ts +53 -36
  272. package/src/capabilities/operation-handler.ts +16 -0
  273. package/src/capabilities/react-surface.tsx +64 -78
  274. package/src/capabilities/settings.ts +26 -12
  275. package/src/capabilities/state.ts +14 -18
  276. package/src/capabilities/undo-mappings.ts +46 -0
  277. package/src/components/Chat/Chat.tsx +259 -0
  278. package/src/components/Chat/index.ts +5 -0
  279. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +94 -0
  280. package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
  281. package/src/components/CommentsPanel/CommentsThread.tsx +176 -0
  282. package/src/components/CommentsPanel/index.ts +6 -0
  283. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +83 -47
  284. package/src/components/MessagePanel/index.ts +5 -0
  285. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  286. package/src/components/ThreadSettings/ThreadSettings.tsx +19 -0
  287. package/src/components/ThreadSettings/index.ts +5 -0
  288. package/src/components/index.ts +5 -12
  289. package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +105 -0
  290. package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
  291. package/src/containers/ChannelArticle/index.ts +5 -0
  292. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  293. package/src/containers/ChannelChat/index.ts +8 -0
  294. package/src/containers/CommentsCompanion/CommentsCompanion.stories.tsx +355 -0
  295. package/src/containers/CommentsCompanion/CommentsCompanion.tsx +216 -0
  296. package/src/containers/CommentsCompanion/index.ts +5 -0
  297. package/src/containers/ThreadContainer/ThreadContainer.stories.tsx +86 -0
  298. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  299. package/src/containers/ThreadContainer/index.ts +8 -0
  300. package/src/containers/index.ts +10 -0
  301. package/src/{components/command-extension.ts → extensions/command.ts} +3 -3
  302. package/src/extensions/index.ts +1 -0
  303. package/src/extensions/threads.ts +88 -43
  304. package/src/hooks/analytics.ts +22 -21
  305. package/src/hooks/index.ts +0 -4
  306. package/src/index.ts +4 -4
  307. package/src/meta.ts +39 -8
  308. package/src/operations/add-message.ts +94 -0
  309. package/src/operations/append-channel-message.ts +37 -0
  310. package/src/operations/create-channel.ts +20 -0
  311. package/src/operations/create-proposals.ts +49 -0
  312. package/src/operations/create.ts +63 -0
  313. package/src/operations/delete-message.ts +53 -0
  314. package/src/operations/delete.ts +63 -0
  315. package/src/operations/index.ts +22 -0
  316. package/src/operations/on-create-space.ts +27 -0
  317. package/src/operations/respond-to-thread.ts +32 -0
  318. package/src/operations/restore-message.ts +38 -0
  319. package/src/operations/restore.ts +38 -0
  320. package/src/operations/select.ts +24 -0
  321. package/src/operations/set-agent-config.ts +24 -0
  322. package/src/operations/toggle-resolved.ts +41 -0
  323. package/src/plugin.ts +11 -0
  324. package/src/should-trigger-agent.test.ts +72 -0
  325. package/src/should-trigger-agent.ts +50 -0
  326. package/src/testing/data.ts +49 -0
  327. package/src/testing/index.ts +1 -1
  328. package/src/translations.ts +75 -75
  329. package/src/types/AgentIdentity.ts +35 -0
  330. package/src/types/Settings.ts +10 -0
  331. package/src/types/ThreadCapabilities.ts +46 -0
  332. package/src/types/ThreadOperation.ts +225 -0
  333. package/src/types/index.ts +5 -1
  334. package/src/types/types.ts +4 -109
  335. package/src/util.ts +37 -5
  336. package/src/vite-env.d.ts +10 -0
  337. package/dist/lib/browser/ChannelContainer-BGDGZHV4.mjs +0 -16
  338. package/dist/lib/browser/ChatContainer-75KJZ4XR.mjs +0 -15
  339. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs +0 -171
  340. package/dist/lib/browser/app-graph-builder-ODKIAXR7.mjs.map +0 -7
  341. package/dist/lib/browser/call-manager-BCKLI4QD.mjs +0 -24
  342. package/dist/lib/browser/call-manager-BCKLI4QD.mjs.map +0 -7
  343. package/dist/lib/browser/chunk-2MUYQOQE.mjs +0 -23
  344. package/dist/lib/browser/chunk-2MUYQOQE.mjs.map +0 -7
  345. package/dist/lib/browser/chunk-B7YQ7QR2.mjs +0 -376
  346. package/dist/lib/browser/chunk-B7YQ7QR2.mjs.map +0 -7
  347. package/dist/lib/browser/chunk-CMCVHULC.mjs +0 -986
  348. package/dist/lib/browser/chunk-CMCVHULC.mjs.map +0 -7
  349. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  350. package/dist/lib/browser/chunk-HDEQRBOC.mjs +0 -181
  351. package/dist/lib/browser/chunk-HDEQRBOC.mjs.map +0 -7
  352. package/dist/lib/browser/chunk-L326LSNS.mjs +0 -18
  353. package/dist/lib/browser/chunk-L326LSNS.mjs.map +0 -7
  354. package/dist/lib/browser/chunk-T4KJ5JR4.mjs +0 -15
  355. package/dist/lib/browser/chunk-T4KJ5JR4.mjs.map +0 -7
  356. package/dist/lib/browser/chunk-VJMKS4CZ.mjs +0 -619
  357. package/dist/lib/browser/chunk-VJMKS4CZ.mjs.map +0 -7
  358. package/dist/lib/browser/chunk-VTYX3SIM.mjs +0 -147
  359. package/dist/lib/browser/chunk-VTYX3SIM.mjs.map +0 -7
  360. package/dist/lib/browser/chunk-XYUJXHYV.mjs +0 -106
  361. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +0 -7
  362. package/dist/lib/browser/chunk-ZCEU5K23.mjs +0 -1890
  363. package/dist/lib/browser/chunk-ZCEU5K23.mjs.map +0 -7
  364. package/dist/lib/browser/index.mjs +0 -311
  365. package/dist/lib/browser/index.mjs.map +0 -7
  366. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs +0 -427
  367. package/dist/lib/browser/intent-resolver-VOQD3TQ2.mjs.map +0 -7
  368. package/dist/lib/browser/markdown-R6MGRIA6.mjs +0 -169
  369. package/dist/lib/browser/markdown-R6MGRIA6.mjs.map +0 -7
  370. package/dist/lib/browser/meta.json +0 -1
  371. package/dist/lib/browser/react-root-UMSBTN6H.mjs +0 -28
  372. package/dist/lib/browser/react-root-UMSBTN6H.mjs.map +0 -7
  373. package/dist/lib/browser/react-surface-SXMQEWKE.mjs +0 -109
  374. package/dist/lib/browser/react-surface-SXMQEWKE.mjs.map +0 -7
  375. package/dist/lib/browser/settings-TCNF54PN.mjs +0 -22
  376. package/dist/lib/browser/settings-TCNF54PN.mjs.map +0 -7
  377. package/dist/lib/browser/state-ZQ4IPOJT.mjs +0 -34
  378. package/dist/lib/browser/state-ZQ4IPOJT.mjs.map +0 -7
  379. package/dist/lib/browser/toolkit-JF4B4QIO.mjs +0 -84
  380. package/dist/lib/browser/toolkit-JF4B4QIO.mjs.map +0 -7
  381. package/dist/lib/browser/types/index.mjs +0 -16
  382. package/dist/lib/node-esm/ChannelContainer-OXC6BTU7.mjs +0 -17
  383. package/dist/lib/node-esm/ChatContainer-SH6LTFQL.mjs +0 -16
  384. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs +0 -172
  385. package/dist/lib/node-esm/app-graph-builder-DMPT3MY6.mjs.map +0 -7
  386. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs +0 -25
  387. package/dist/lib/node-esm/call-manager-Q7RY2YP4.mjs.map +0 -7
  388. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs +0 -987
  389. package/dist/lib/node-esm/chunk-2KZ4ODHU.mjs.map +0 -7
  390. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs +0 -182
  391. package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +0 -7
  392. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs +0 -108
  393. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +0 -7
  394. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  395. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs +0 -148
  397. package/dist/lib/node-esm/chunk-BAMZXJS4.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs +0 -377
  399. package/dist/lib/node-esm/chunk-BTGKI5IK.mjs.map +0 -7
  400. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs +0 -25
  401. package/dist/lib/node-esm/chunk-GZ4WL2IS.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs +0 -19
  403. package/dist/lib/node-esm/chunk-LCHTNRK7.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs +0 -620
  405. package/dist/lib/node-esm/chunk-NHSIAEDW.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-OBVAURUU.mjs +0 -17
  407. package/dist/lib/node-esm/chunk-OBVAURUU.mjs.map +0 -7
  408. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs +0 -1891
  409. package/dist/lib/node-esm/chunk-TIPIOH2J.mjs.map +0 -7
  410. package/dist/lib/node-esm/index.mjs +0 -312
  411. package/dist/lib/node-esm/index.mjs.map +0 -7
  412. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs +0 -428
  413. package/dist/lib/node-esm/intent-resolver-AKVH66PH.mjs.map +0 -7
  414. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs +0 -170
  415. package/dist/lib/node-esm/markdown-MYGTDXT6.mjs.map +0 -7
  416. package/dist/lib/node-esm/meta.json +0 -1
  417. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs +0 -29
  418. package/dist/lib/node-esm/react-root-W6AVTL5M.mjs.map +0 -7
  419. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs +0 -110
  420. package/dist/lib/node-esm/react-surface-NLSZJGMO.mjs.map +0 -7
  421. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs +0 -23
  422. package/dist/lib/node-esm/settings-ZQHGVFBY.mjs.map +0 -7
  423. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs +0 -35
  424. package/dist/lib/node-esm/state-FSLLJ5TZ.mjs.map +0 -7
  425. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs +0 -85
  426. package/dist/lib/node-esm/toolkit-DHPKJITO.mjs.map +0 -7
  427. package/dist/lib/node-esm/types/index.mjs +0 -17
  428. package/dist/types/src/calls/call-manager.d.ts +0 -77
  429. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  430. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  431. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  432. package/dist/types/src/calls/index.d.ts +0 -7
  433. package/dist/types/src/calls/index.d.ts.map +0 -1
  434. package/dist/types/src/calls/media-manager.d.ts +0 -60
  435. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  436. package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
  437. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  438. package/dist/types/src/calls/types.d.ts +0 -45
  439. package/dist/types/src/calls/types.d.ts.map +0 -1
  440. package/dist/types/src/calls/util/audio.d.ts +0 -6
  441. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  442. package/dist/types/src/calls/util/calls-service.d.ts +0 -77
  443. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  444. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  445. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  446. package/dist/types/src/calls/util/index.d.ts +0 -5
  447. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  448. package/dist/types/src/calls/util/media.d.ts +0 -6
  449. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  450. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  451. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  452. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  453. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  454. package/dist/types/src/calls-service.stories.d.ts +0 -23
  455. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  456. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  457. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  458. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  459. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  460. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  461. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  462. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  463. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  464. package/dist/types/src/capabilities/toolkit.d.ts +0 -6
  465. package/dist/types/src/capabilities/toolkit.d.ts.map +0 -1
  466. package/dist/types/src/components/Call/Call.d.ts +0 -17
  467. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  468. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  469. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  470. package/dist/types/src/components/Call/index.d.ts +0 -3
  471. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  472. package/dist/types/src/components/CallDebugPanel.d.ts +0 -15
  473. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  474. package/dist/types/src/components/CallSidebar.d.ts +0 -4
  475. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  476. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  477. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  478. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -94
  479. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  480. package/dist/types/src/components/Chat.stories.d.ts +0 -93
  481. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  482. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  483. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  484. package/dist/types/src/components/Comments.stories.d.ts +0 -162
  485. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  486. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  487. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  488. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  489. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  490. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
  491. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  492. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  493. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  494. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  495. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  496. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  497. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  498. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
  499. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  500. package/dist/types/src/components/Media/index.d.ts +0 -3
  501. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  502. package/dist/types/src/components/MessageContainer.d.ts +0 -14
  503. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  504. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  505. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  506. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  507. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  508. package/dist/types/src/components/Participant/index.d.ts +0 -3
  509. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  510. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +0 -12
  511. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  512. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -162
  513. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  514. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  515. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  516. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -176
  517. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  518. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  519. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  520. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  521. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  522. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  523. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  524. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  525. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  526. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  527. package/dist/types/src/components/testing.d.ts.map +0 -1
  528. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
  529. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
  530. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  531. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  532. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  533. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  534. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  535. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  536. package/dist/types/src/testing/stories.d.ts +0 -2
  537. package/dist/types/src/testing/stories.d.ts.map +0 -1
  538. package/dist/types/src/types/schema.d.ts +0 -179
  539. package/dist/types/src/types/schema.d.ts.map +0 -1
  540. package/src/calls/call-manager.ts +0 -246
  541. package/src/calls/call-swarm-synchronizer.ts +0 -350
  542. package/src/calls/index.ts +0 -10
  543. package/src/calls/media-manager.ts +0 -375
  544. package/src/calls/speaking-monitor.ts +0 -85
  545. package/src/calls/types.ts +0 -74
  546. package/src/calls/util/audio.ts +0 -58
  547. package/src/calls/util/calls-service.ts +0 -581
  548. package/src/calls/util/history-cache.ts +0 -27
  549. package/src/calls/util/index.ts +0 -8
  550. package/src/calls/util/media.ts +0 -52
  551. package/src/calls/util/stub-media-streams.ts +0 -127
  552. package/src/calls/util/task-scheduling.ts +0 -92
  553. package/src/calls-service.stories.tsx +0 -229
  554. package/src/capabilities/call-manager.ts +0 -20
  555. package/src/capabilities/capabilities.ts +0 -33
  556. package/src/capabilities/intent-resolver.ts +0 -348
  557. package/src/capabilities/react-root.tsx +0 -17
  558. package/src/capabilities/toolkit.ts +0 -82
  559. package/src/components/Call/Call.tsx +0 -89
  560. package/src/components/Call/Toolbar.tsx +0 -182
  561. package/src/components/Call/index.ts +0 -6
  562. package/src/components/CallDebugPanel.tsx +0 -174
  563. package/src/components/CallSidebar.tsx +0 -18
  564. package/src/components/ChannelContainer.stories.tsx +0 -59
  565. package/src/components/ChannelContainer.tsx +0 -201
  566. package/src/components/Chat.stories.tsx +0 -91
  567. package/src/components/ChatContainer.tsx +0 -145
  568. package/src/components/Comments.stories.tsx +0 -93
  569. package/src/components/CommentsContainer.tsx +0 -72
  570. package/src/components/CommentsThreadContainer.tsx +0 -169
  571. package/src/components/Lobby/Lobby.tsx +0 -119
  572. package/src/components/Lobby/index.ts +0 -5
  573. package/src/components/Media/AudioStream.tsx +0 -67
  574. package/src/components/Media/VideoObject.stories.tsx +0 -60
  575. package/src/components/Media/VideoObject.tsx +0 -58
  576. package/src/components/Media/index.ts +0 -6
  577. package/src/components/Participant/Participant.tsx +0 -63
  578. package/src/components/Participant/ParticipantGrid.tsx +0 -89
  579. package/src/components/Participant/index.ts +0 -6
  580. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +0 -54
  581. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +0 -31
  582. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -158
  583. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  584. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -131
  585. package/src/components/ResponsiveGrid/index.ts +0 -7
  586. package/src/components/ThreadComplementary.tsx +0 -181
  587. package/src/components/ThreadSettings.tsx +0 -16
  588. package/src/components/testing.ts +0 -51
  589. package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
  590. package/src/hooks/useDebugMode.ts +0 -25
  591. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  592. package/src/hooks/useVideoStreamTrack.tsx +0 -36
  593. package/src/testing/stories.ts +0 -54
  594. package/src/types/schema.ts +0 -33
  595. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
  596. package/src/typings.d.ts +0 -8
  597. /package/dist/lib/{browser/ChannelContainer-BGDGZHV4.mjs.map → neutral/ChannelChat-LZEDFJVD.mjs.map} +0 -0
  598. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  599. /package/dist/lib/{browser/ChatContainer-75KJZ4XR.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  600. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
  601. /package/dist/lib/{node-esm/ChannelContainer-OXC6BTU7.mjs.map → neutral/index.mjs.map} +0 -0
  602. /package/dist/lib/{node-esm/ChatContainer-SH6LTFQL.mjs.map → neutral/meta.mjs.map} +0 -0
@@ -1,1890 +0,0 @@
1
- import {
2
- createBlackCanvasStreamTrack,
3
- createInaudibleAudioStreamTrack
4
- } from "./chunk-XYUJXHYV.mjs";
5
-
6
- // src/calls/types.ts
7
- import { invariant } from "@dxos/invariant";
8
- import { buf } from "@dxos/protocols/buf";
9
- import { UserStateSchema } from "@dxos/protocols/buf/dxos/edge/calls_pb";
10
- var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/types.ts";
11
- var CALLS_URL = "https://calls-service.dxos.workers.dev";
12
- var codec = {
13
- encode: (message) => {
14
- return buf.toBinary(UserStateSchema, buf.create(UserStateSchema, message));
15
- },
16
- decode: (message) => {
17
- return buf.fromBinary(UserStateSchema, message);
18
- }
19
- };
20
- var TrackNameCodec = {
21
- encode: (trackData) => {
22
- invariant(trackData.sessionId, void 0, {
23
- F: __dxlog_file,
24
- L: 65,
25
- S: void 0,
26
- A: [
27
- "trackData.sessionId",
28
- ""
29
- ]
30
- });
31
- invariant(trackData.trackName, void 0, {
32
- F: __dxlog_file,
33
- L: 66,
34
- S: void 0,
35
- A: [
36
- "trackData.trackName",
37
- ""
38
- ]
39
- });
40
- invariant(trackData.mid, void 0, {
41
- F: __dxlog_file,
42
- L: 67,
43
- S: void 0,
44
- A: [
45
- "trackData.mid",
46
- ""
47
- ]
48
- });
49
- return trackData.sessionId + "/" + trackData.trackName + "/" + trackData.mid;
50
- },
51
- decode: (name) => {
52
- const [sessionId, trackName, mid] = name.split("/");
53
- return {
54
- sessionId,
55
- trackName,
56
- location: "remote",
57
- mid
58
- };
59
- }
60
- };
61
-
62
- // src/calls/call-swarm-synchronizer.ts
63
- import md5Hex from "md5-hex";
64
- import { DeferredTask, Event, scheduleTaskInterval, synchronized } from "@dxos/async";
65
- import { Context, Resource } from "@dxos/context";
66
- import { generateName } from "@dxos/display-name";
67
- import { invariant as invariant2 } from "@dxos/invariant";
68
- import { PublicKey } from "@dxos/keys";
69
- import { log } from "@dxos/log";
70
- import { buf as buf2 } from "@dxos/protocols/buf";
71
- import { ActivitySchema } from "@dxos/protocols/buf/dxos/edge/calls_pb";
72
- import { ConnectionState } from "@dxos/protocols/proto/dxos/edge/messenger";
73
- import { isNonNullable } from "@dxos/util";
74
- function _define_property(obj, key, value) {
75
- if (key in obj) {
76
- Object.defineProperty(obj, key, {
77
- value,
78
- enumerable: true,
79
- configurable: true,
80
- writable: true
81
- });
82
- } else {
83
- obj[key] = value;
84
- }
85
- return obj;
86
- }
87
- function _ts_decorate(decorators, target, key, desc) {
88
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
89
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
90
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
91
- return c > 3 && r && Object.defineProperty(target, key, r), r;
92
- }
93
- var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/call-swarm-synchronizer.ts";
94
- var DISCONNECTED_ABRUPT_TIMEOUT = 1e4;
95
- var CallSwarmSynchronizer = class extends Resource {
96
- /**
97
- * @internal
98
- */
99
- _getState() {
100
- return this._state;
101
- }
102
- setRaisedHand(raisedHand) {
103
- if (this._state.raisedHand === raisedHand) {
104
- return;
105
- }
106
- this._state.raisedHand = raisedHand;
107
- this._notifyAndSchedule();
108
- }
109
- setSpeaking(speaking) {
110
- if (this._state.speaking === speaking) {
111
- return;
112
- }
113
- this._state.speaking = speaking;
114
- this._notifyAndSchedule();
115
- }
116
- setJoined(joined) {
117
- if (this._state.joined === joined) {
118
- return;
119
- }
120
- this._state.joined = joined;
121
- this._notifyAndSchedule();
122
- }
123
- setTracks(tracks) {
124
- this._state.tracks = {
125
- ...this._state.tracks,
126
- ...tracks
127
- };
128
- this._notifyAndSchedule();
129
- }
130
- setActivity(key, payload) {
131
- const lamportTimestamp = LamportTimestampCrdt.increment(this._state.activities?.[key]?.lamportTimestamp ?? {
132
- id: this._deviceKey
133
- });
134
- this._state.activities[key] = {
135
- lamportTimestamp,
136
- payload
137
- };
138
- this._notifyAndSchedule();
139
- }
140
- /**
141
- * @internal
142
- */
143
- _setIdentity(identity) {
144
- this._identityKey = identity.identityKey.toHex();
145
- this._displayName = identity.profile?.displayName ?? generateName(identity.identityKey.toHex());
146
- }
147
- /**
148
- * @internal
149
- */
150
- _setDevice(device) {
151
- this._deviceKey = device.deviceKey.toHex();
152
- }
153
- /**
154
- * @internal
155
- */
156
- _setRoomId(roomId) {
157
- if (this._swarmCtx) {
158
- log.verbose("joined to a different room", {
159
- roomId
160
- }, {
161
- F: __dxlog_file2,
162
- L: 152,
163
- S: this,
164
- C: (f, a) => f(...a)
165
- });
166
- return;
167
- }
168
- this._state.roomId = roomId;
169
- }
170
- async _open() {
171
- this._sendStateTask = new DeferredTask(this._ctx, async () => {
172
- await this._sendState();
173
- });
174
- this._reconcileSwarmStateTask = new DeferredTask(this._ctx, async () => {
175
- await this._reconcileSwarmState();
176
- });
177
- }
178
- async _close() {
179
- this._sendStateTask = void 0;
180
- this._reconcileSwarmStateTask = void 0;
181
- }
182
- async join() {
183
- invariant2(this._state.roomId, void 0, {
184
- F: __dxlog_file2,
185
- L: 176,
186
- S: this,
187
- A: [
188
- "this._state.roomId",
189
- ""
190
- ]
191
- });
192
- invariant2(!this._swarmCtx, "Already joined", {
193
- F: __dxlog_file2,
194
- L: 177,
195
- S: this,
196
- A: [
197
- "!this._swarmCtx",
198
- "'Already joined'"
199
- ]
200
- });
201
- this._swarmCtx = new Context(void 0, {
202
- F: __dxlog_file2,
203
- L: 179
204
- });
205
- const topic = getTopic(this._state.roomId);
206
- log("joining swarm", {
207
- topic,
208
- peer: {
209
- identityKey: this._identityKey,
210
- peerKey: this._deviceKey
211
- }
212
- }, {
213
- F: __dxlog_file2,
214
- L: 181,
215
- S: this,
216
- C: (f, a) => f(...a)
217
- });
218
- const stream = this._networkService.subscribeSwarmState({
219
- topic
220
- });
221
- stream.subscribe((event) => this._processSwarmEvent(event));
222
- const cleanup = () => {
223
- void stream.close();
224
- if (topic && this._identityKey && this._deviceKey) {
225
- log("leaving swarm", {
226
- topic,
227
- peer: {
228
- identityKey: this._identityKey,
229
- peerKey: this._deviceKey
230
- }
231
- }, {
232
- F: __dxlog_file2,
233
- L: 188,
234
- S: this,
235
- C: (f, a) => f(...a)
236
- });
237
- void this._networkService.leaveSwarm({
238
- topic,
239
- peer: {
240
- identityKey: this._identityKey,
241
- peerKey: this._deviceKey
242
- }
243
- }).catch((err) => log.catch(err, void 0, {
244
- F: __dxlog_file2,
245
- L: 194,
246
- S: this,
247
- C: (f, a) => f(...a)
248
- }));
249
- }
250
- window.removeEventListener("beforeunload", cleanup);
251
- };
252
- window.addEventListener("beforeunload", cleanup);
253
- this._swarmCtx.onDispose(cleanup);
254
- this._notifyAndSchedule();
255
- }
256
- async leave() {
257
- if (!this._swarmCtx) {
258
- return;
259
- }
260
- await this._swarmCtx.dispose();
261
- this._swarmCtx = void 0;
262
- this._state.users = void 0;
263
- this._state.self = void 0;
264
- }
265
- async querySwarm(roomId) {
266
- const topic = getTopic(roomId);
267
- const swarm = await this._networkService.querySwarm({
268
- topic
269
- });
270
- return swarm.peers ?? [];
271
- }
272
- /**
273
- * Notify and schedule send state task.
274
- */
275
- _notifyAndSchedule() {
276
- this.stateUpdated.emit(this._state);
277
- if (this._state.joined) {
278
- this._sendStateTask?.schedule();
279
- }
280
- }
281
- async _sendState() {
282
- if (!this._state.roomId || !this._identityKey || !this._deviceKey || !this._state.joined) {
283
- return;
284
- }
285
- const state = {
286
- ...this._state,
287
- id: this._deviceKey,
288
- name: this._displayName,
289
- activities: this._state.activities ? Object.fromEntries(Object.entries(this._state.activities).map(([key, activity]) => [
290
- key,
291
- buf2.create(ActivitySchema, activity)
292
- ])) : {}
293
- };
294
- await this._networkService.joinSwarm({
295
- topic: getTopic(this._state.roomId),
296
- peer: {
297
- identityKey: this._identityKey,
298
- peerKey: this._deviceKey,
299
- state: codec.encode(state)
300
- }
301
- });
302
- }
303
- _processSwarmEvent(swarmEvent) {
304
- if (!this._state.joined) {
305
- return;
306
- }
307
- this._lastSwarmEvent = swarmEvent;
308
- this._reconcileSwarmStateTask.schedule();
309
- }
310
- async _reconcileSwarmState() {
311
- const swarmEvent = this._lastSwarmEvent;
312
- invariant2(swarmEvent, void 0, {
313
- F: __dxlog_file2,
314
- L: 273,
315
- S: this,
316
- A: [
317
- "swarmEvent",
318
- ""
319
- ]
320
- });
321
- const peers = [
322
- ...swarmEvent.peers ?? [],
323
- ...(swarmEvent.inactivePeers ?? []).filter(({ disconnected, connectionState }) => connectionState === ConnectionState.DISCONNECTED_ABRUPT && disconnected && disconnected > Date.now() - DISCONNECTED_ABRUPT_TIMEOUT)
324
- ].sort((peer1, peer2) => peer1.peerKey.localeCompare(peer2.peerKey));
325
- const users = peers.map((peer) => {
326
- try {
327
- return codec.decode(peer.state);
328
- } catch (error) {
329
- log.error("error decoding peer state", {
330
- error,
331
- peer
332
- }, {
333
- F: __dxlog_file2,
334
- L: 290,
335
- S: this,
336
- C: (f, a) => f(...a)
337
- });
338
- return void 0;
339
- }
340
- }).filter(isNonNullable);
341
- this._state.users = users;
342
- this._state.self = users.find((user) => user.id === this._deviceKey);
343
- log("reconciling swarm state", {
344
- users
345
- }, {
346
- F: __dxlog_file2,
347
- L: 297,
348
- S: this,
349
- C: (f, a) => f(...a)
350
- });
351
- if (users.length === 0) {
352
- return;
353
- }
354
- const activityKeys = new Set(users.flatMap((user) => Object.keys(user.activities)));
355
- [
356
- ...activityKeys
357
- ].forEach((key) => {
358
- const activities = users.map((user) => user.activities?.[key]).filter(isNonNullable);
359
- const lastActivity = LamportTimestampCrdt.getLastState(activities);
360
- if (lastActivity && lastActivity.lamportTimestamp.version > (this._state.activities[key]?.lamportTimestamp?.version ?? 0)) {
361
- this._state.activities[key] = lastActivity;
362
- }
363
- });
364
- this.stateUpdated.emit(this._state);
365
- if (peers.some((peer) => peer.connectionState !== ConnectionState.CONNECTED)) {
366
- scheduleTaskInterval(this._ctx, async () => this._reconcileSwarmStateTask.schedule(), Math.min(DISCONNECTED_ABRUPT_TIMEOUT / 2, 1e3));
367
- }
368
- }
369
- constructor({ networkService }) {
370
- super(), _define_property(this, "stateUpdated", new Event()), _define_property(this, "_state", {
371
- activities: {}
372
- }), _define_property(this, "_networkService", void 0), _define_property(this, "_lastSwarmEvent", void 0), _define_property(this, "_reconcileSwarmStateTask", void 0), _define_property(this, "_identityKey", void 0), _define_property(this, "_deviceKey", void 0), _define_property(this, "_displayName", void 0), _define_property(this, "_swarmCtx", void 0), _define_property(this, "_sendStateTask", void 0);
373
- this._networkService = networkService;
374
- }
375
- };
376
- _ts_decorate([
377
- synchronized
378
- ], CallSwarmSynchronizer.prototype, "join", null);
379
- _ts_decorate([
380
- synchronized
381
- ], CallSwarmSynchronizer.prototype, "leave", null);
382
- var LamportTimestampCrdt = class {
383
- static getLastState(states) {
384
- const maxTimestamp = Math.max(...states.map((state) => state.lamportTimestamp?.version ?? 0));
385
- const sortedStates = states.filter((state) => state.lamportTimestamp && state.lamportTimestamp.version === maxTimestamp && state.lamportTimestamp.id).sort((a, b) => a.lamportTimestamp.id.localeCompare(b.lamportTimestamp.id));
386
- return sortedStates[0];
387
- }
388
- static increment(timestamp) {
389
- return {
390
- ...timestamp ?? {},
391
- version: (timestamp?.version ?? 0) + 1
392
- };
393
- }
394
- };
395
- var getTopic = (roomId) => PublicKey.fromHex(md5Hex(roomId));
396
-
397
- // src/calls/util/audio.ts
398
- var monitorAudioLevel = ({ mediaStreamTrack, intervalMs = 1e3 / 10, onMeasure }) => {
399
- let timeout = -1;
400
- let interval = -1;
401
- const audioContext = new AudioContext();
402
- const stream = new MediaStream();
403
- stream.addTrack(mediaStreamTrack);
404
- const mediaStreamAudioSourceNode = audioContext.createMediaStreamSource(stream);
405
- const analyserNode = audioContext.createAnalyser();
406
- mediaStreamAudioSourceNode.connect(analyserNode);
407
- analyserNode.fftSize = 32;
408
- const pcmData = new Float32Array(analyserNode.fftSize);
409
- let peak = 0;
410
- interval = window.setInterval(() => {
411
- onMeasure(peak);
412
- peak = 0;
413
- }, intervalMs);
414
- const tick = () => {
415
- timeout = window.setTimeout(() => {
416
- analyserNode.getFloatTimeDomainData(pcmData);
417
- let sumSquares = 0;
418
- for (const amplitude of pcmData) {
419
- sumSquares += amplitude * amplitude;
420
- }
421
- const current = Math.sqrt(sumSquares / pcmData.length);
422
- if (current > peak) {
423
- peak = current;
424
- }
425
- tick();
426
- }, intervalMs);
427
- };
428
- tick();
429
- return () => {
430
- mediaStreamAudioSourceNode.disconnect();
431
- analyserNode.disconnect();
432
- void audioContext.close();
433
- clearInterval(interval);
434
- clearTimeout(timeout);
435
- stream.removeTrack(mediaStreamTrack);
436
- };
437
- };
438
-
439
- // src/calls/util/calls-service.ts
440
- import { PersistentLifecycle, Trigger, scheduleTask } from "@dxos/async";
441
- import { Resource as Resource2 } from "@dxos/context";
442
- import { invariant as invariant3 } from "@dxos/invariant";
443
- import { log as log2 } from "@dxos/log";
444
-
445
- // src/calls/util/history-cache.ts
446
- function _define_property2(obj, key, value) {
447
- if (key in obj) {
448
- Object.defineProperty(obj, key, {
449
- value,
450
- enumerable: true,
451
- configurable: true,
452
- writable: true
453
- });
454
- } else {
455
- obj[key] = value;
456
- }
457
- return obj;
458
- }
459
- var HistoryCache = class {
460
- push(...messages) {
461
- if (this._messages.length >= this._limit) {
462
- this._messages.shift();
463
- }
464
- this._messages.push(...messages);
465
- }
466
- get() {
467
- return this._messages;
468
- }
469
- constructor(limit = 100) {
470
- _define_property2(this, "_limit", void 0);
471
- _define_property2(this, "_messages", void 0);
472
- this._limit = limit;
473
- this._messages = [];
474
- }
475
- };
476
-
477
- // src/calls/util/task-scheduling.ts
478
- function _check_private_redeclaration(obj, privateCollection) {
479
- if (privateCollection.has(obj)) {
480
- throw new TypeError("Cannot initialize the same private elements twice on an object");
481
- }
482
- }
483
- function _class_apply_descriptor_get(receiver, descriptor) {
484
- if (descriptor.get) {
485
- return descriptor.get.call(receiver);
486
- }
487
- return descriptor.value;
488
- }
489
- function _class_apply_descriptor_set(receiver, descriptor, value) {
490
- if (descriptor.set) {
491
- descriptor.set.call(receiver, value);
492
- } else {
493
- if (!descriptor.writable) {
494
- throw new TypeError("attempted to set read only private field");
495
- }
496
- descriptor.value = value;
497
- }
498
- }
499
- function _class_extract_field_descriptor(receiver, privateMap, action) {
500
- if (!privateMap.has(receiver)) {
501
- throw new TypeError("attempted to " + action + " private field on non-instance");
502
- }
503
- return privateMap.get(receiver);
504
- }
505
- function _class_private_field_get(receiver, privateMap) {
506
- var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
507
- return _class_apply_descriptor_get(receiver, descriptor);
508
- }
509
- function _class_private_field_init(obj, privateMap, value) {
510
- _check_private_redeclaration(obj, privateMap);
511
- privateMap.set(obj, value);
512
- }
513
- function _class_private_field_set(receiver, privateMap, value) {
514
- var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
515
- _class_apply_descriptor_set(receiver, descriptor, value);
516
- return value;
517
- }
518
- var DefaultBatchSizeLimit = 64;
519
- var _schedulerChain = /* @__PURE__ */ new WeakMap();
520
- var FIFOScheduler = class {
521
- schedule(task) {
522
- return new Promise((resolve, reject) => {
523
- _class_private_field_set(this, _schedulerChain, _class_private_field_get(this, _schedulerChain).then(async () => {
524
- try {
525
- resolve(await task());
526
- } catch (error) {
527
- reject(error);
528
- }
529
- }));
530
- });
531
- }
532
- constructor() {
533
- _class_private_field_init(this, _schedulerChain, {
534
- writable: true,
535
- value: void 0
536
- });
537
- _class_private_field_set(this, _schedulerChain, Promise.resolve());
538
- }
539
- };
540
- var _currentBatch = /* @__PURE__ */ new WeakMap();
541
- var _currentBulkResponse = /* @__PURE__ */ new WeakMap();
542
- var _batchSizeLimit = /* @__PURE__ */ new WeakMap();
543
- var BulkRequestDispatcher = class {
544
- /**
545
- * Returns a bulk response promise.
546
- * At the event loop iteration end, the accumulated entries will be dispatched as a bulk request.
547
- */
548
- doBulkRequest(params, bulkRequestFunc) {
549
- if (_class_private_field_get(this, _currentBatch).length >= _class_private_field_get(this, _batchSizeLimit)) {
550
- _class_private_field_set(this, _currentBatch, []);
551
- _class_private_field_set(this, _currentBulkResponse, null);
552
- }
553
- _class_private_field_get(this, _currentBatch).push(params);
554
- if (_class_private_field_get(this, _currentBulkResponse) != null) {
555
- return _class_private_field_get(this, _currentBulkResponse);
556
- }
557
- const batch = _class_private_field_get(this, _currentBatch);
558
- _class_private_field_set(this, _currentBulkResponse, new Promise((resolve, reject) => {
559
- setTimeout(() => {
560
- _class_private_field_set(this, _currentBulkResponse, null);
561
- const batchCopy = batch.splice(0, batch.length);
562
- bulkRequestFunc(batchCopy).then((result) => {
563
- resolve(result);
564
- }).catch((err) => {
565
- reject(err);
566
- });
567
- }, 0);
568
- }));
569
- return _class_private_field_get(this, _currentBulkResponse);
570
- }
571
- constructor(batchSizeLimit = DefaultBatchSizeLimit) {
572
- _class_private_field_init(this, _currentBatch, {
573
- writable: true,
574
- value: void 0
575
- });
576
- _class_private_field_init(this, _currentBulkResponse, {
577
- writable: true,
578
- value: void 0
579
- });
580
- _class_private_field_init(this, _batchSizeLimit, {
581
- writable: true,
582
- value: void 0
583
- });
584
- _class_private_field_set(this, _currentBatch, []);
585
- _class_private_field_set(this, _currentBulkResponse, null);
586
- _class_private_field_set(this, _batchSizeLimit, batchSizeLimit);
587
- }
588
- };
589
-
590
- // src/calls/util/calls-service.ts
591
- function _define_property3(obj, key, value) {
592
- if (key in obj) {
593
- Object.defineProperty(obj, key, {
594
- value,
595
- enumerable: true,
596
- configurable: true,
597
- writable: true
598
- });
599
- } else {
600
- obj[key] = value;
601
- }
602
- return obj;
603
- }
604
- var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/calls-service.ts";
605
- var NETWORK_TIMEOUT = 5e3;
606
- var CallsServicePeer = class extends Resource2 {
607
- async _open(ctx) {
608
- await this._persistentLifecycle.open(ctx);
609
- }
610
- async _close() {
611
- await this._persistentLifecycle.close();
612
- }
613
- get session() {
614
- return this._persistentLifecycle.state;
615
- }
616
- async _startSession() {
617
- const peerConnection = await this._createRtcConnection();
618
- const sessionId = await this._initiateCallSession();
619
- return {
620
- sessionId,
621
- peerConnection
622
- };
623
- }
624
- async _stopSession(session) {
625
- session.peerConnection.close();
626
- }
627
- async _createRtcConnection() {
628
- const peerConnection = new RTCPeerConnection({
629
- iceServers: this._config.iceServers,
630
- bundlePolicy: "max-bundle"
631
- });
632
- peerConnection.addEventListener("connectionstatechange", () => {
633
- if (peerConnection.connectionState === "failed" || peerConnection.connectionState === "closed") {
634
- log2.info("calls connection failed", {
635
- state: peerConnection.connectionState
636
- }, {
637
- F: __dxlog_file3,
638
- L: 121,
639
- S: this,
640
- C: (f, a) => f(...a)
641
- });
642
- void this._persistentLifecycle.scheduleRestart();
643
- }
644
- });
645
- let iceTimeout = -1;
646
- peerConnection.addEventListener("iceconnectionstatechange", () => {
647
- clearTimeout(iceTimeout);
648
- if (peerConnection.iceConnectionState === "failed" || peerConnection.iceConnectionState === "closed") {
649
- log2.info("calls connection to ICEs failed", {
650
- state: peerConnection.iceConnectionState
651
- }, {
652
- F: __dxlog_file3,
653
- L: 130,
654
- S: this,
655
- C: (f, a) => f(...a)
656
- });
657
- void this._persistentLifecycle.scheduleRestart();
658
- } else if (peerConnection.iceConnectionState === "disconnected") {
659
- const timeoutSeconds = 7;
660
- iceTimeout = window.setTimeout(() => {
661
- if (peerConnection.iceConnectionState === "connected") {
662
- log2.info("calls iceConnectionState is connected", void 0, {
663
- F: __dxlog_file3,
664
- L: 139,
665
- S: this,
666
- C: (f, a) => f(...a)
667
- });
668
- return;
669
- }
670
- log2.info("calls iceConnectionState timed out", {
671
- state: peerConnection.iceConnectionState,
672
- timeoutSeconds
673
- }, {
674
- F: __dxlog_file3,
675
- L: 143,
676
- S: this,
677
- C: (f, a) => f(...a)
678
- });
679
- void this._persistentLifecycle.scheduleRestart();
680
- }, timeoutSeconds * 1e3);
681
- }
682
- });
683
- return peerConnection;
684
- }
685
- async _initiateCallSession() {
686
- log2("creating new session", void 0, {
687
- F: __dxlog_file3,
688
- L: 153,
689
- S: this,
690
- C: (f, a) => f(...a)
691
- });
692
- const { sessionId } = await this._fetch("/sessions/new?SESSION", {
693
- method: "POST"
694
- });
695
- return sessionId;
696
- }
697
- async _fetch(relativePath, requestInit) {
698
- this.history.push({
699
- endpoint: relativePath,
700
- type: "request",
701
- time: (/* @__PURE__ */ new Date()).toISOString(),
702
- method: requestInit?.method ?? "GET",
703
- body: requestInit?.body
704
- });
705
- const response = await fetch(`${this._config.apiBase}${relativePath}`, {
706
- ...requestInit,
707
- redirect: "manual"
708
- });
709
- if (response.status >= 400) {
710
- log2.error("error while fetching from Calls service", {
711
- status: response.status,
712
- text: await response.text()
713
- }, {
714
- F: __dxlog_file3,
715
- L: 169,
716
- S: this,
717
- C: (f, a) => f(...a)
718
- });
719
- throw new Error("Error while fetching from Calls service");
720
- }
721
- try {
722
- const data = await response.clone().json();
723
- this.history.push({
724
- endpoint: relativePath,
725
- type: "response",
726
- time: (/* @__PURE__ */ new Date()).toISOString(),
727
- status: response.status,
728
- json: data
729
- });
730
- if (data.errorCode) {
731
- throw new Error(data.errorDescription);
732
- }
733
- return data;
734
- } catch (error) {
735
- const text = await response.text();
736
- this.history.push({
737
- endpoint: relativePath,
738
- type: "response",
739
- time: (/* @__PURE__ */ new Date()).toISOString(),
740
- status: response.status,
741
- text
742
- });
743
- log2.error("Error parsing response from Calls service", {
744
- error,
745
- text,
746
- status: response.status
747
- }, {
748
- F: __dxlog_file3,
749
- L: 196,
750
- S: this,
751
- C: (f, a) => f(...a)
752
- });
753
- throw error;
754
- }
755
- }
756
- async _pushTrackInBulk({ ctx, peerConnection, transceiver, sessionId, trackName }) {
757
- log2.verbose("pushing track ", trackName, {
758
- F: __dxlog_file3,
759
- L: 218,
760
- S: this,
761
- C: (f, a) => f(...a)
762
- });
763
- const pushedTrackPromise = this.pushTrackDispatcher.doBulkRequest({
764
- trackName,
765
- transceiver
766
- }, (tracks) => this.taskScheduler.schedule(async () => {
767
- const offer = await peerConnection.createOffer();
768
- offer.sdp = offer.sdp?.replace("useinbandfec=1", "usedtx=1;useinbandfec=1");
769
- await peerConnection.setLocalDescription(offer);
770
- const response = await this._fetch(`/sessions/${sessionId}/tracks/new?PUSHING`, {
771
- method: "POST",
772
- body: JSON.stringify({
773
- sessionDescription: {
774
- sdp: offer.sdp,
775
- type: "offer"
776
- },
777
- tracks: tracks.map(({ trackName: trackName2, transceiver: transceiver2 }) => ({
778
- trackName: trackName2,
779
- mid: transceiver2.mid,
780
- location: "local"
781
- }))
782
- })
783
- });
784
- invariant3(response.tracks !== void 0, void 0, {
785
- F: __dxlog_file3,
786
- L: 243,
787
- S: this,
788
- A: [
789
- "response.tracks !== undefined",
790
- ""
791
- ]
792
- });
793
- if (!response.errorCode) {
794
- await peerConnection.setRemoteDescription(new RTCSessionDescription(response.sessionDescription));
795
- await peerConnectionIsConnected(peerConnection);
796
- }
797
- return {
798
- tracks: response.tracks
799
- };
800
- })).then(async ({ tracks }) => {
801
- const trackData = tracks.find((t) => t.mid === transceiver.mid);
802
- if (trackData) {
803
- return {
804
- ...trackData,
805
- sessionId,
806
- location: "remote"
807
- };
808
- } else {
809
- log2.error("missing track data", void 0, {
810
- F: __dxlog_file3,
811
- L: 267,
812
- S: this,
813
- C: (f, a) => f(...a)
814
- });
815
- }
816
- });
817
- const onDispose = async () => {
818
- if (transceiver.mid) {
819
- await this._closeTrackInBulk(peerConnection, transceiver.mid, sessionId);
820
- }
821
- };
822
- ctx?.onDispose(async () => await onDispose());
823
- this._ctx.onDispose(() => onDispose());
824
- return pushedTrackPromise;
825
- }
826
- async pushTrack({ track, encodings = [], ctx, previousTrack }) {
827
- await this.waitUntilOpen();
828
- invariant3(this.session, void 0, {
829
- F: __dxlog_file3,
830
- L: 295,
831
- S: this,
832
- A: [
833
- "this.session",
834
- ""
835
- ]
836
- });
837
- log2("trying to push track", {
838
- track,
839
- previousTrack,
840
- encodings
841
- }, {
842
- F: __dxlog_file3,
843
- L: 296,
844
- S: this,
845
- C: (f, a) => f(...a)
846
- });
847
- if (previousTrack) {
848
- const transceiver2 = this.session.peerConnection.getTransceivers().find((t) => t.mid === previousTrack.mid);
849
- if (transceiver2?.sender.track === track) {
850
- log2.verbose("track already pushed", {
851
- track,
852
- previousTrack,
853
- transceiver: transceiver2
854
- }, {
855
- F: __dxlog_file3,
856
- L: 300,
857
- S: this,
858
- C: (f, a) => f(...a)
859
- });
860
- return previousTrack;
861
- } else if (transceiver2) {
862
- log2.verbose("replacing track", {
863
- track,
864
- previousTrack,
865
- transceiver: transceiver2
866
- }, {
867
- F: __dxlog_file3,
868
- L: 303,
869
- S: this,
870
- C: (f, a) => f(...a)
871
- });
872
- transceiver2.sender.replaceTrack(track).catch((err) => log2.catch(err, void 0, {
873
- F: __dxlog_file3,
874
- L: 304,
875
- S: this,
876
- C: (f, a) => f(...a)
877
- }));
878
- return previousTrack;
879
- }
880
- }
881
- invariant3(track, void 0, {
882
- F: __dxlog_file3,
883
- L: 308,
884
- S: this,
885
- A: [
886
- "track",
887
- ""
888
- ]
889
- });
890
- const stableId = crypto.randomUUID();
891
- const transceiver = this.session.peerConnection.addTransceiver(track, {
892
- direction: "sendonly"
893
- });
894
- log2.verbose("creating transceiver", void 0, {
895
- F: __dxlog_file3,
896
- L: 313,
897
- S: this,
898
- C: (f, a) => f(...a)
899
- });
900
- const pushedTrackData = await this._pushTrackInBulk({
901
- ctx,
902
- peerConnection: this.session.peerConnection,
903
- transceiver,
904
- sessionId: this.session.sessionId,
905
- trackName: stableId
906
- });
907
- invariant3(pushedTrackData, void 0, {
908
- F: __dxlog_file3,
909
- L: 322,
910
- S: this,
911
- A: [
912
- "pushedTrackData",
913
- ""
914
- ]
915
- });
916
- const parameters = transceiver.sender.getParameters();
917
- encodings.forEach((encoding, i) => {
918
- const existing = parameters.encodings[i];
919
- parameters.encodings[i] = {
920
- ...existing,
921
- ...encoding
922
- };
923
- });
924
- transceiver.sender.setParameters(parameters).catch((err) => log2.catch(err, void 0, {
925
- F: __dxlog_file3,
926
- L: 329,
927
- S: this,
928
- C: (f, a) => f(...a)
929
- }));
930
- return pushedTrackData;
931
- }
932
- // TODO(mykola): Add retry logic if the tracks fails to pull.
933
- async _pullTrackInBulk({ peerConnection, sessionId, trackData, ctx }) {
934
- let mid = "";
935
- log2("pulling track", {
936
- trackName: trackData.trackName
937
- }, {
938
- F: __dxlog_file3,
939
- L: 347,
940
- S: this,
941
- C: (f, a) => f(...a)
942
- });
943
- const pulledTrackPromise = this.pullTrackDispatcher.doBulkRequest(trackData, (tracks) => this.taskScheduler.schedule(async () => {
944
- const newTrackResponse = await this._fetch(`/sessions/${sessionId}/tracks/new?PULLING`, {
945
- method: "POST",
946
- body: JSON.stringify({
947
- tracks
948
- })
949
- });
950
- if (newTrackResponse.errorCode) {
951
- throw new Error(newTrackResponse.errorDescription);
952
- }
953
- invariant3(newTrackResponse.tracks, void 0, {
954
- F: __dxlog_file3,
955
- L: 360,
956
- S: this,
957
- A: [
958
- "newTrackResponse.tracks",
959
- ""
960
- ]
961
- });
962
- const trackMap = tracks.reduce((acc, track) => {
963
- const pulledTrackData = newTrackResponse.tracks?.find((t) => t.trackName === track.trackName && t.sessionId === track.sessionId);
964
- if (pulledTrackData && pulledTrackData.mid) {
965
- acc.set(track.trackName, {
966
- mid: pulledTrackData.mid,
967
- resolvedTrack: resolveTrack(peerConnection, (t) => t.mid === pulledTrackData.mid)
968
- });
969
- }
970
- return acc;
971
- }, /* @__PURE__ */ new Map());
972
- if (newTrackResponse.requiresImmediateRenegotiation) {
973
- await peerConnection.setRemoteDescription(new RTCSessionDescription(newTrackResponse.sessionDescription));
974
- const answer = await peerConnection.createAnswer();
975
- await peerConnection.setLocalDescription(answer);
976
- const renegotiationResponse = await this._fetch(`/sessions/${sessionId}/renegotiate`, {
977
- method: "PUT",
978
- body: JSON.stringify({
979
- sessionDescription: {
980
- type: "answer",
981
- sdp: peerConnection.currentLocalDescription?.sdp
982
- }
983
- })
984
- });
985
- if (renegotiationResponse.errorCode) {
986
- throw new Error(renegotiationResponse.errorDescription);
987
- } else {
988
- await peerConnectionIsConnected(peerConnection);
989
- }
990
- }
991
- return {
992
- trackMap
993
- };
994
- })).then(({ trackMap }) => {
995
- const trackInfo = trackMap.get(trackData.trackName);
996
- if (trackInfo) {
997
- return trackInfo.resolvedTrack.then((track) => {
998
- mid = trackInfo.mid;
999
- return track;
1000
- }).catch((err) => log2.catch(err, void 0, {
1001
- F: __dxlog_file3,
1002
- L: 412,
1003
- S: this,
1004
- C: (f, a) => f(...a)
1005
- }));
1006
- } else {
1007
- log2.info("missing track info", {
1008
- trackData,
1009
- availableTracks: Array.from(trackMap.keys())
1010
- }, {
1011
- F: __dxlog_file3,
1012
- L: 414,
1013
- S: this,
1014
- C: (f, a) => f(...a)
1015
- });
1016
- }
1017
- });
1018
- const onDispose = async () => {
1019
- if (mid) {
1020
- log2("closing pulled track ", trackData.trackName, {
1021
- F: __dxlog_file3,
1022
- L: 420,
1023
- S: this,
1024
- C: (f, a) => f(...a)
1025
- });
1026
- await this._closeTrackInBulk(peerConnection, mid, sessionId);
1027
- mid = "";
1028
- }
1029
- };
1030
- this._ctx.onDispose(() => onDispose());
1031
- ctx?.onDispose(() => onDispose());
1032
- return pulledTrackPromise;
1033
- }
1034
- async pullTrack({ ctx, trackData }) {
1035
- await this.waitUntilOpen();
1036
- invariant3(this.session, void 0, {
1037
- F: __dxlog_file3,
1038
- L: 441,
1039
- S: this,
1040
- A: [
1041
- "this.session",
1042
- ""
1043
- ]
1044
- });
1045
- const session = this.session;
1046
- return this._pullTrackInBulk({
1047
- peerConnection: session.peerConnection,
1048
- sessionId: session.sessionId,
1049
- trackData,
1050
- ctx
1051
- });
1052
- }
1053
- async _closeTrackInBulk(peerConnection, mid, sessionId) {
1054
- const transceiver = peerConnection.getTransceivers().find((t) => t.mid === mid);
1055
- if (peerConnection.connectionState !== "connected" || transceiver === void 0) {
1056
- return;
1057
- }
1058
- await this.closeTrackDispatcher.doBulkRequest({
1059
- mid
1060
- }, (mids) => this.taskScheduler.schedule(async () => {
1061
- transceiver.stop();
1062
- const activeTransceivers = peerConnection.getTransceivers().filter((t) => t.mid !== mid && t.direction !== "stopped");
1063
- let requestBody;
1064
- if (activeTransceivers.length > 0) {
1065
- const offer = await peerConnection.createOffer();
1066
- await peerConnection.setLocalDescription(offer);
1067
- requestBody = {
1068
- tracks: mids,
1069
- sessionDescription: {
1070
- sdp: peerConnection.localDescription?.sdp,
1071
- type: "offer"
1072
- },
1073
- force: false
1074
- };
1075
- } else {
1076
- requestBody = {
1077
- tracks: mids,
1078
- force: true
1079
- };
1080
- }
1081
- const response = await this._fetch(`/sessions/${sessionId}/tracks/close`, {
1082
- method: "PUT",
1083
- body: JSON.stringify(requestBody)
1084
- });
1085
- if (requestBody.sessionDescription) {
1086
- await peerConnection.setRemoteDescription(new RTCSessionDescription(response.sessionDescription));
1087
- }
1088
- }));
1089
- }
1090
- constructor(config) {
1091
- super(), _define_property3(this, "history", new HistoryCache(100)), _define_property3(this, "_persistentLifecycle", new PersistentLifecycle({
1092
- start: () => this._startSession(),
1093
- stop: (session) => this._stopSession(session)
1094
- })), _define_property3(this, "_config", void 0), _define_property3(this, "taskScheduler", new FIFOScheduler()), _define_property3(this, "pushTrackDispatcher", new BulkRequestDispatcher(32)), _define_property3(this, "pullTrackDispatcher", new BulkRequestDispatcher(32)), _define_property3(this, "closeTrackDispatcher", new BulkRequestDispatcher(32));
1095
- this._config = config;
1096
- }
1097
- };
1098
- var resolveTrack = async (peerConnection, compare, timeout = NETWORK_TIMEOUT) => new Promise((resolve, reject) => {
1099
- setTimeout(reject, timeout);
1100
- const handler = () => {
1101
- const transceiver = peerConnection.getTransceivers().find(compare);
1102
- if (transceiver) {
1103
- resolve(transceiver.receiver.track);
1104
- peerConnection.removeEventListener("track", handler);
1105
- }
1106
- };
1107
- peerConnection.addEventListener("track", handler);
1108
- });
1109
- var peerConnectionIsConnected = async (peerConnection) => {
1110
- if (peerConnection.connectionState !== "connected") {
1111
- const connected = new Promise((resolve, reject) => {
1112
- const timeout = setTimeout(() => {
1113
- peerConnection.removeEventListener("connectionstatechange", connectionStateChangeHandler);
1114
- reject(new Error("Connection timeout"));
1115
- }, NETWORK_TIMEOUT);
1116
- const connectionStateChangeHandler = () => {
1117
- if (peerConnection.connectionState === "connected") {
1118
- peerConnection.removeEventListener("connectionstatechange", connectionStateChangeHandler);
1119
- clearTimeout(timeout);
1120
- resolve(void 0);
1121
- }
1122
- };
1123
- peerConnection.addEventListener("connectionstatechange", connectionStateChangeHandler);
1124
- });
1125
- await connected;
1126
- }
1127
- };
1128
-
1129
- // src/calls/util/media.ts
1130
- import { log as log3 } from "@dxos/log";
1131
- var __dxlog_file4 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/media.ts";
1132
- var getUserMediaTrack = async (kind, constraints = {}, deviceList) => {
1133
- deviceList ?? (deviceList = (await getDeviceList()).filter((device) => device.kind === kind));
1134
- const firstDevice = deviceList[0];
1135
- if (!firstDevice) {
1136
- throw new Error("No devices found");
1137
- }
1138
- return acquireTrack(firstDevice, constraints);
1139
- };
1140
- var acquireTrack = async (device, constraints) => {
1141
- const { deviceId, label } = device;
1142
- log3.info(`requesting ${label}`, void 0, {
1143
- F: __dxlog_file4,
1144
- L: 23,
1145
- S: void 0,
1146
- C: (f, a) => f(...a)
1147
- });
1148
- const mediaStream = await navigator.mediaDevices.getUserMedia(device.kind === "videoinput" ? {
1149
- video: {
1150
- ...constraints,
1151
- deviceId
1152
- }
1153
- } : {
1154
- audio: {
1155
- ...constraints,
1156
- deviceId
1157
- }
1158
- });
1159
- return device.kind === "videoinput" ? mediaStream.getVideoTracks()[0] : mediaStream.getAudioTracks()[0];
1160
- };
1161
- var getDeviceList = () => navigator.mediaDevices.enumerateDevices();
1162
- var SCREENSHARE_CONSTRAINTS = {
1163
- video: {
1164
- width: {
1165
- max: 1920
1166
- },
1167
- height: {
1168
- max: 1080
1169
- },
1170
- frameRate: {
1171
- max: 10
1172
- }
1173
- }
1174
- };
1175
- var getScreenshare = async ({ contentHint }) => {
1176
- const ms = await navigator.mediaDevices.getDisplayMedia(SCREENSHARE_CONSTRAINTS);
1177
- ms.getVideoTracks().forEach((track) => {
1178
- if (contentHint && "contentHint" in track) {
1179
- track.contentHint = contentHint;
1180
- }
1181
- });
1182
- return ms;
1183
- };
1184
-
1185
- // src/calls/speaking-monitor.ts
1186
- import { DeferredTask as DeferredTask2, Event as Event2, sleep } from "@dxos/async";
1187
- import { Resource as Resource3 } from "@dxos/context";
1188
- function _define_property4(obj, key, value) {
1189
- if (key in obj) {
1190
- Object.defineProperty(obj, key, {
1191
- value,
1192
- enumerable: true,
1193
- configurable: true,
1194
- writable: true
1195
- });
1196
- } else {
1197
- obj[key] = value;
1198
- }
1199
- return obj;
1200
- }
1201
- var NOT_SPEAKING_AFTER = 500;
1202
- var START_SPEAKING_THRESHOLD = 0.05;
1203
- var CONTINUE_SPEAKING_THRESHOLD = 0.02;
1204
- var MIN_EVENT_INTERVAL = 100;
1205
- var SpeakingMonitor = class extends Resource3 {
1206
- get isSpeaking() {
1207
- return this._isSpeaking;
1208
- }
1209
- async _open() {
1210
- this._deferredUpdate = new DeferredTask2(this._ctx, async () => this._emitSpeakingChanged());
1211
- let timeout;
1212
- const cleanup = monitorAudioLevel({
1213
- mediaStreamTrack: this._mediaStreamTrack,
1214
- onMeasure: (vol) => {
1215
- const audioLevelAboveThreshold = vol > (this._isSpeaking ? CONTINUE_SPEAKING_THRESHOLD : START_SPEAKING_THRESHOLD);
1216
- if (audioLevelAboveThreshold) {
1217
- clearTimeout(timeout);
1218
- timeout = void 0;
1219
- if (!this._isSpeaking) {
1220
- this._isSpeaking = true;
1221
- this._deferredUpdate?.schedule();
1222
- }
1223
- } else if (timeout === void 0) {
1224
- timeout = setTimeout(() => {
1225
- this._isSpeaking = false;
1226
- timeout = void 0;
1227
- this._deferredUpdate?.schedule();
1228
- }, NOT_SPEAKING_AFTER);
1229
- }
1230
- }
1231
- });
1232
- this._ctx.onDispose(() => {
1233
- cleanup();
1234
- clearTimeout(timeout);
1235
- });
1236
- }
1237
- /**
1238
- * Emits the speaking changed event with debouncing based on timing.
1239
- */
1240
- async _emitSpeakingChanged() {
1241
- const timeSinceLastEvent = Date.now() - this._lastEventTime;
1242
- const timeToNextEvent = MIN_EVENT_INTERVAL - timeSinceLastEvent;
1243
- if (timeToNextEvent > 0) {
1244
- await sleep(timeToNextEvent);
1245
- }
1246
- this._lastEventTime = Date.now();
1247
- this.speakingChanged.emit(this._isSpeaking);
1248
- }
1249
- constructor(_mediaStreamTrack) {
1250
- super(), _define_property4(this, "_mediaStreamTrack", void 0), /**
1251
- * Event that is emitted when the user starts or stops speaking.
1252
- * It is debounced to prevent rapid state changes.
1253
- */
1254
- _define_property4(this, "speakingChanged", void 0), /**
1255
- * Real state of the user speaking.
1256
- */
1257
- _define_property4(this, "_isSpeaking", void 0), _define_property4(this, "_lastEventTime", void 0), _define_property4(this, "_deferredUpdate", void 0), this._mediaStreamTrack = _mediaStreamTrack, this.speakingChanged = new Event2(), this._isSpeaking = false, this._lastEventTime = 0;
1258
- }
1259
- };
1260
-
1261
- // src/calls/media-manager.ts
1262
- import { DeferredTask as DeferredTask3, Event as Event3, sleep as sleep2, synchronized as synchronized2 } from "@dxos/async";
1263
- import { Resource as Resource4, cancelWithContext } from "@dxos/context";
1264
- import { invariant as invariant4 } from "@dxos/invariant";
1265
- import { log as log4 } from "@dxos/log";
1266
- function _define_property5(obj, key, value) {
1267
- if (key in obj) {
1268
- Object.defineProperty(obj, key, {
1269
- value,
1270
- enumerable: true,
1271
- configurable: true,
1272
- writable: true
1273
- });
1274
- } else {
1275
- obj[key] = value;
1276
- }
1277
- return obj;
1278
- }
1279
- function _ts_decorate2(decorators, target, key, desc) {
1280
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1281
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1282
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1283
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1284
- }
1285
- var __dxlog_file5 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/media-manager.ts";
1286
- var VIDEO_WIDTH = 1280;
1287
- var VIDEO_HEIGHT = 720;
1288
- var MAX_WEB_CAM_FRAMERATE = 24;
1289
- var MAX_WEB_CAM_BITRATE = 12e5;
1290
- var RETRY_INTERVAL = 100;
1291
- var USE_INAUDIBLE_AUDIO = true;
1292
- var MediaManager = class extends Resource4 {
1293
- get isSpeaking() {
1294
- return this._speakingMonitor?.isSpeaking;
1295
- }
1296
- /**
1297
- * @internal
1298
- */
1299
- _getState() {
1300
- return this._state;
1301
- }
1302
- async _open() {
1303
- this._blackCanvasStreamTrack = await createBlackCanvasStreamTrack({
1304
- ctx: this._ctx,
1305
- width: VIDEO_WIDTH,
1306
- height: VIDEO_HEIGHT
1307
- });
1308
- this._state.videoTrack = this._blackCanvasStreamTrack;
1309
- this._state.videoStream = new MediaStream();
1310
- this._state.videoStream.addTrack(this._state.videoTrack);
1311
- if (USE_INAUDIBLE_AUDIO) {
1312
- this._inaudibleAudioStreamTrack = await createInaudibleAudioStreamTrack({
1313
- ctx: this._ctx
1314
- });
1315
- this._state.audioTrack = this._inaudibleAudioStreamTrack;
1316
- }
1317
- this._pushTracksTask = new DeferredTask3(this._ctx, async () => {
1318
- await this._pushTracks();
1319
- });
1320
- this._pullTracksTask = new DeferredTask3(this._ctx, async () => {
1321
- await this._reconcilePulledMedia();
1322
- });
1323
- }
1324
- async _close() {
1325
- void this._speakingMonitor?.close();
1326
- this._state.videoTrack && this._state.videoStream?.removeTrack(this._state.videoTrack);
1327
- this._state.audioTrack?.stop();
1328
- this._state.videoTrack?.stop();
1329
- this._state.screenshareTrack?.stop();
1330
- this._pushTracksTask = void 0;
1331
- this._pullTracksTask = void 0;
1332
- }
1333
- async join(serviceConfig) {
1334
- this._state.peer = new CallsServicePeer(serviceConfig);
1335
- await this._state.peer.open();
1336
- this._pushTracksTask.schedule();
1337
- }
1338
- async leave() {
1339
- await Promise.all(Object.values(this._state.pulledAudioTracks).map(({ ctx }) => ctx.dispose()));
1340
- await Promise.all(Object.values(this._state.pulledVideoStreams).map(({ ctx }) => ctx.dispose()));
1341
- this._trackToReconcile = [];
1342
- await this._state.peer?.close();
1343
- this._state.peer = void 0;
1344
- this._state.pushedVideoTrack = void 0;
1345
- this._state.pushedAudioTrack = void 0;
1346
- this._state.pushedScreenshareTrack = void 0;
1347
- this._state.pulledAudioTracks = {};
1348
- this._state.pulledVideoStreams = {};
1349
- }
1350
- async turnVideoOn() {
1351
- this._state.videoStream.removeTrack(this._state.videoTrack);
1352
- this._state.videoTrack = await getUserMediaTrack("videoinput", {
1353
- width: VIDEO_WIDTH,
1354
- height: VIDEO_HEIGHT
1355
- });
1356
- this._state.videoStream.addTrack(this._state.videoTrack);
1357
- this._state.videoEnabled = true;
1358
- this.stateUpdated.emit(this._state);
1359
- this._pushTracksTask.schedule();
1360
- }
1361
- async turnVideoOff() {
1362
- if (this._state.videoTrack !== this._blackCanvasStreamTrack) {
1363
- this._state.videoStream.removeTrack(this._state.videoTrack);
1364
- this._state.videoTrack?.stop();
1365
- this._state.videoTrack = this._blackCanvasStreamTrack;
1366
- this._state.videoStream.addTrack(this._state.videoTrack);
1367
- }
1368
- this._state.videoEnabled = false;
1369
- this.stateUpdated.emit(this._state);
1370
- this._pushTracksTask.schedule();
1371
- }
1372
- // TODO(mykola): Change to `setAudioEnabled(enabled: boolean)`.
1373
- async turnAudioOn() {
1374
- void this._speakingMonitor?.close();
1375
- this._state.audioEnabled = true;
1376
- this._state.audioTrack = await getUserMediaTrack("audioinput", {
1377
- echoCancellation: true,
1378
- noiseSuppression: true,
1379
- autoGainControl: true,
1380
- sampleRate: 16e3
1381
- });
1382
- this.stateUpdated.emit(this._state);
1383
- this._pushTracksTask.schedule();
1384
- this._speakingMonitor = new SpeakingMonitor(this._state.audioTrack);
1385
- this._speakingMonitor.speakingChanged.on(this._ctx, () => this.stateUpdated.emit(this._state));
1386
- void this._speakingMonitor.open();
1387
- }
1388
- async turnAudioOff() {
1389
- void this._speakingMonitor?.close();
1390
- this._speakingMonitor = void 0;
1391
- this._state.audioEnabled = false;
1392
- if (USE_INAUDIBLE_AUDIO && this._state.audioTrack !== this._inaudibleAudioStreamTrack) {
1393
- this._state.audioTrack?.stop();
1394
- this._state.audioTrack = this._inaudibleAudioStreamTrack;
1395
- } else {
1396
- this._state.audioTrack?.stop();
1397
- this._state.audioTrack = void 0;
1398
- }
1399
- this.stateUpdated.emit(this._state);
1400
- this._pushTracksTask.schedule();
1401
- }
1402
- async turnScreenshareOn() {
1403
- const ms = await getScreenshare({
1404
- contentHint: "text"
1405
- });
1406
- this._state.screenshareVideoStream = ms;
1407
- this._state.screenshareTrack = ms.getVideoTracks()[0];
1408
- this._state.screenshareEnabled = true;
1409
- this.stateUpdated.emit(this._state);
1410
- this._pushTracksTask.schedule();
1411
- }
1412
- async turnScreenshareOff() {
1413
- this._state.screenshareEnabled = false;
1414
- this._state.screenshareTrack?.stop();
1415
- this._state.screenshareTrack = void 0;
1416
- this.stateUpdated.emit(this._state);
1417
- this._pushTracksTask.schedule();
1418
- }
1419
- /**
1420
- * @internal
1421
- */
1422
- _schedulePullTracks(tracks) {
1423
- if (!tracks || this._trackToReconcile.every((name) => tracks.includes(name)) && this._trackToReconcile.length === tracks.length) {
1424
- return;
1425
- }
1426
- this._trackToReconcile = tracks;
1427
- this._pullTracksTask.schedule();
1428
- }
1429
- async _reconcilePulledMedia() {
1430
- log4("reconciling tracks", void 0, {
1431
- F: __dxlog_file5,
1432
- L: 223,
1433
- S: this,
1434
- C: (f, a) => f(...a)
1435
- });
1436
- await cancelWithContext(this._ctx, sleep2(800));
1437
- const trackNames = this._trackToReconcile;
1438
- const tracksToPull = trackNames.filter((name) => !this._state.pulledAudioTracks[name] && !this._state.pulledVideoStreams[name]);
1439
- const audioTracksToClose = Object.entries(this._state.pulledAudioTracks).filter(([key]) => !trackNames.some((name) => name === key));
1440
- const videoStreamsToClose = Object.entries(this._state.pulledVideoStreams).filter(([key]) => !trackNames.some((name) => name === key));
1441
- log4("reconciling tracks", {
1442
- trackNames,
1443
- tracksToPull,
1444
- videoStreamsToClose,
1445
- audioTracksToClose,
1446
- currentAudioTracks: Object.keys(this._state.pulledAudioTracks),
1447
- currentVideoStreams: Object.keys(this._state.pulledVideoStreams)
1448
- }, {
1449
- F: __dxlog_file5,
1450
- L: 242,
1451
- S: this,
1452
- C: (f, a) => f(...a)
1453
- });
1454
- const pullResults = await Promise.all(tracksToPull.map((name) => this._pullTrack(name)));
1455
- await Promise.all([
1456
- ...audioTracksToClose,
1457
- ...videoStreamsToClose
1458
- ].map(([_, { ctx }]) => ctx.dispose()));
1459
- log4("reconciled tracks", {
1460
- currentAudioTracks: Object.keys(this._state.pulledAudioTracks),
1461
- currentVideoStreams: Object.keys(this._state.pulledVideoStreams)
1462
- }, {
1463
- F: __dxlog_file5,
1464
- L: 257,
1465
- S: this,
1466
- C: (f, a) => f(...a)
1467
- });
1468
- this.stateUpdated.emit(this._state);
1469
- if (pullResults.some(({ shouldRetry }) => shouldRetry)) {
1470
- await cancelWithContext(this._ctx, sleep2(RETRY_INTERVAL));
1471
- log4.info("retrying pull tracks", {
1472
- tracksToPull
1473
- }, {
1474
- F: __dxlog_file5,
1475
- L: 265,
1476
- S: this,
1477
- C: (f, a) => f(...a)
1478
- });
1479
- invariant4(this._pullTracksTask, void 0, {
1480
- F: __dxlog_file5,
1481
- L: 266,
1482
- S: this,
1483
- A: [
1484
- "this._pullTracksTask",
1485
- ""
1486
- ]
1487
- });
1488
- this._pullTracksTask.schedule();
1489
- }
1490
- }
1491
- async _pushTracks() {
1492
- if (!this._state.peer?.isOpen) {
1493
- return;
1494
- }
1495
- let updated = false;
1496
- const [pushVideoResult, pushAudioResult, pushScreenshareResult] = await Promise.all([
1497
- this._maybePushTrack(this._state.videoTrack, this._state.pushedVideoTrack, [
1498
- {
1499
- maxFramerate: MAX_WEB_CAM_FRAMERATE,
1500
- maxBitrate: MAX_WEB_CAM_BITRATE
1501
- }
1502
- ]),
1503
- this._maybePushTrack(this._state.audioTrack, this._state.pushedAudioTrack, [
1504
- {
1505
- networkPriority: "high"
1506
- }
1507
- ]),
1508
- this._maybePushTrack(this._state.screenshareTrack, this._state.pushedScreenshareTrack)
1509
- ]);
1510
- if (pushVideoResult.track !== this._state.pushedVideoTrack) {
1511
- this._state.pushedVideoTrack = pushVideoResult.track;
1512
- updated = true;
1513
- }
1514
- if (pushAudioResult.track !== this._state.pushedAudioTrack) {
1515
- this._state.pushedAudioTrack = pushAudioResult.track;
1516
- updated = true;
1517
- }
1518
- if (pushScreenshareResult.track !== this._state.pushedScreenshareTrack) {
1519
- this._state.pushedScreenshareTrack = pushScreenshareResult.track;
1520
- updated = true;
1521
- }
1522
- const shouldRetry = pushVideoResult.shouldRetry || pushAudioResult.shouldRetry || pushScreenshareResult.shouldRetry;
1523
- if (updated) {
1524
- this.stateUpdated.emit(this._state);
1525
- }
1526
- if (shouldRetry) {
1527
- await cancelWithContext(this._ctx, sleep2(RETRY_INTERVAL));
1528
- log4.info("retrying push tracks", {
1529
- pushVideoResult,
1530
- pushAudioResult,
1531
- pushScreenshareResult
1532
- }, {
1533
- F: __dxlog_file5,
1534
- L: 306,
1535
- S: this,
1536
- C: (f, a) => f(...a)
1537
- });
1538
- invariant4(this._pushTracksTask, void 0, {
1539
- F: __dxlog_file5,
1540
- L: 307,
1541
- S: this,
1542
- A: [
1543
- "this._pushTracksTask",
1544
- ""
1545
- ]
1546
- });
1547
- this._pushTracksTask.schedule();
1548
- }
1549
- }
1550
- async _pullTrack(name) {
1551
- const ctx = this._ctx.derive();
1552
- try {
1553
- const trackData = TrackNameCodec.decode(name);
1554
- const track = await this._state.peer.pullTrack({
1555
- trackData: {
1556
- ...trackData,
1557
- mid: void 0
1558
- },
1559
- ctx
1560
- });
1561
- if (track?.readyState === "ended") {
1562
- throw new Error("Pulled track ended immediately");
1563
- }
1564
- switch (track?.kind) {
1565
- case "audio": {
1566
- this._state.pulledAudioTracks[name] = {
1567
- track,
1568
- ctx
1569
- };
1570
- ctx.onDispose(() => delete this._state.pulledAudioTracks[name]);
1571
- return {
1572
- shouldRetry: false
1573
- };
1574
- }
1575
- case "video": {
1576
- const mediaStream = new MediaStream();
1577
- mediaStream.addTrack(track);
1578
- this._state.pulledVideoStreams[name] = {
1579
- stream: mediaStream,
1580
- ctx
1581
- };
1582
- ctx.onDispose(() => {
1583
- mediaStream.removeTrack(track);
1584
- track.stop();
1585
- delete this._state.pulledVideoStreams[name];
1586
- });
1587
- return {
1588
- shouldRetry: false
1589
- };
1590
- }
1591
- default:
1592
- throw new Error(`Invalid track kind: ${track?.kind}`);
1593
- }
1594
- } catch (err) {
1595
- log4.info("failed to pull track", {
1596
- err,
1597
- name
1598
- }, {
1599
- F: __dxlog_file5,
1600
- L: 343,
1601
- S: this,
1602
- C: (f, a) => f(...a)
1603
- });
1604
- void ctx.dispose();
1605
- return {
1606
- shouldRetry: true
1607
- };
1608
- }
1609
- }
1610
- async _maybePushTrack(track, previousTrack, encodings) {
1611
- if (!track && !previousTrack) {
1612
- return {
1613
- track: void 0
1614
- };
1615
- }
1616
- const ctx = this._ctx.derive();
1617
- try {
1618
- return {
1619
- track: await this._state.peer.pushTrack({
1620
- ctx,
1621
- track: track ?? null,
1622
- previousTrack,
1623
- encodings
1624
- })
1625
- };
1626
- } catch (err) {
1627
- log4.info("failed to push track", {
1628
- err,
1629
- track,
1630
- previousTrack,
1631
- encodings
1632
- }, {
1633
- F: __dxlog_file5,
1634
- L: 370,
1635
- S: this,
1636
- C: (f, a) => f(...a)
1637
- });
1638
- void ctx.dispose();
1639
- return {
1640
- shouldRetry: true
1641
- };
1642
- }
1643
- }
1644
- constructor(...args) {
1645
- super(...args), _define_property5(this, "stateUpdated", new Event3()), _define_property5(this, "_state", {
1646
- pulledVideoStreams: {},
1647
- pulledAudioTracks: {}
1648
- }), _define_property5(this, "_speakingMonitor", void 0), _define_property5(this, "_trackToReconcile", []), _define_property5(this, "_blackCanvasStreamTrack", void 0), _define_property5(this, "_inaudibleAudioStreamTrack", void 0), _define_property5(this, "_pushTracksTask", void 0), _define_property5(this, "_pullTracksTask", void 0);
1649
- }
1650
- };
1651
- _ts_decorate2([
1652
- synchronized2
1653
- ], MediaManager.prototype, "join", null);
1654
- _ts_decorate2([
1655
- synchronized2
1656
- ], MediaManager.prototype, "leave", null);
1657
-
1658
- // src/calls/call-manager.ts
1659
- import { computed } from "@preact/signals-core";
1660
- import { Event as Event4, synchronized as synchronized3 } from "@dxos/async";
1661
- import { Resource as Resource5 } from "@dxos/context";
1662
- import { invariant as invariant5 } from "@dxos/invariant";
1663
- import { live } from "@dxos/live-object";
1664
- import { isNonNullable as isNonNullable2 } from "@dxos/util";
1665
- function _define_property6(obj, key, value) {
1666
- if (key in obj) {
1667
- Object.defineProperty(obj, key, {
1668
- value,
1669
- enumerable: true,
1670
- configurable: true,
1671
- writable: true
1672
- });
1673
- } else {
1674
- obj[key] = value;
1675
- }
1676
- return obj;
1677
- }
1678
- function _ts_decorate3(decorators, target, key, desc) {
1679
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
1680
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
1681
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
1682
- return c > 3 && r && Object.defineProperty(target, key, r), r;
1683
- }
1684
- var __dxlog_file6 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/call-manager.ts";
1685
- var CallManager = class extends Resource5 {
1686
- /** @reactive */
1687
- get roomId() {
1688
- return this._state.call.roomId;
1689
- }
1690
- /** @reactive */
1691
- get raisedHand() {
1692
- return this._raisedHandSignal.value;
1693
- }
1694
- /** @reactive */
1695
- get speaking() {
1696
- return this._speakingSignal.value;
1697
- }
1698
- /** @reactive */
1699
- get joined() {
1700
- return this._joinedSignal.value;
1701
- }
1702
- /** @reactive */
1703
- get self() {
1704
- return this._state.call.self ?? {};
1705
- }
1706
- /** @reactive */
1707
- get tracks() {
1708
- return this._state.call.tracks ?? {};
1709
- }
1710
- /** @reactive */
1711
- get users() {
1712
- return this._state.call.users ?? [];
1713
- }
1714
- /** @reactive */
1715
- get media() {
1716
- return this._state.media;
1717
- }
1718
- /** @reactive */
1719
- get audioTracksToPlay() {
1720
- return (this._state.call.users ?? []).map((user) => user.tracks?.audioEnabled ? user.tracks?.audio : void 0).filter(isNonNullable2).map((track) => this._state.media.pulledAudioTracks[track]?.track).filter(isNonNullable2);
1721
- }
1722
- /** @reactive */
1723
- get state() {
1724
- return this._state;
1725
- }
1726
- /** @reactive */
1727
- getVideoStream(name) {
1728
- return name ? this._state.media.pulledVideoStreams[name]?.stream : void 0;
1729
- }
1730
- /** @reactive */
1731
- getActivity(key) {
1732
- return this._state.call.activities?.[key];
1733
- }
1734
- setRoomId(roomId) {
1735
- this._swarmSynchronizer._setRoomId(roomId);
1736
- }
1737
- setSpeaking(speaking) {
1738
- this._swarmSynchronizer.setSpeaking(speaking);
1739
- }
1740
- setRaisedHand(raisedHand) {
1741
- this._swarmSynchronizer.setRaisedHand(raisedHand);
1742
- }
1743
- setActivity(key, payload) {
1744
- this._swarmSynchronizer.setActivity(key, payload);
1745
- }
1746
- turnAudioOn() {
1747
- return this._mediaManager.turnAudioOn();
1748
- }
1749
- turnAudioOff() {
1750
- return this._mediaManager.turnAudioOff();
1751
- }
1752
- turnVideoOn() {
1753
- return this._mediaManager.turnVideoOn();
1754
- }
1755
- turnVideoOff() {
1756
- return this._mediaManager.turnVideoOff();
1757
- }
1758
- turnScreenshareOn() {
1759
- return this._mediaManager.turnScreenshareOn();
1760
- }
1761
- turnScreenshareOff() {
1762
- return this._mediaManager.turnScreenshareOff();
1763
- }
1764
- async _open() {
1765
- await this._mediaManager.open();
1766
- await this._swarmSynchronizer.open();
1767
- const subscription = this._client.halo.identity.subscribe((identity) => {
1768
- if (identity) {
1769
- this._swarmSynchronizer._setIdentity(identity);
1770
- }
1771
- if (this._client.halo.device) {
1772
- this._swarmSynchronizer._setDevice(this._client.halo.device);
1773
- }
1774
- });
1775
- this._ctx.onDispose(() => subscription.unsubscribe());
1776
- this._swarmSynchronizer.stateUpdated.on(this._ctx, (state) => this._onCallStateUpdated(state));
1777
- this._mediaManager.stateUpdated.on(this._ctx, (state) => this._onMediaStateUpdated(state));
1778
- }
1779
- async _close() {
1780
- await this._swarmSynchronizer.leave();
1781
- await this._swarmSynchronizer.close();
1782
- await this._mediaManager.close();
1783
- }
1784
- async peek(roomId) {
1785
- const peers = await this._swarmSynchronizer.querySwarm(roomId);
1786
- return peers.length;
1787
- }
1788
- // TODO(mykola): Reconcile with _swarmSynchronizer.state.joined.
1789
- async join() {
1790
- this._swarmSynchronizer.setJoined(true);
1791
- await this._swarmSynchronizer.join();
1792
- await this._mediaManager.join({
1793
- iceServers: this._client.config.get("runtime.services.ice"),
1794
- apiBase: `${CALLS_URL}/api/calls`
1795
- });
1796
- }
1797
- async leave() {
1798
- this._swarmSynchronizer.setJoined(false);
1799
- await this._swarmSynchronizer.leave();
1800
- await this._mediaManager.leave();
1801
- this.roomId && this.left.emit(this.roomId);
1802
- }
1803
- _onCallStateUpdated(state) {
1804
- const tracksToPull = state.users?.filter((user) => user.joined && user.id !== state.self.id)?.flatMap((user) => [
1805
- user.tracks?.video,
1806
- user.tracks?.audio,
1807
- user.tracks?.screenshare
1808
- ]).filter(isNonNullable2);
1809
- this._mediaManager._schedulePullTracks(tracksToPull);
1810
- this.callStateUpdated.emit(state);
1811
- this._updateState();
1812
- }
1813
- _onMediaStateUpdated(state) {
1814
- this._swarmSynchronizer.setTracks({
1815
- video: state.pushedVideoTrack ? TrackNameCodec.encode(state.pushedVideoTrack) : void 0,
1816
- audio: state.pushedAudioTrack ? TrackNameCodec.encode(state.pushedAudioTrack) : void 0,
1817
- screenshare: state.pushedScreenshareTrack ? TrackNameCodec.encode(state.pushedScreenshareTrack) : void 0,
1818
- videoEnabled: state.videoEnabled,
1819
- audioEnabled: state.audioEnabled,
1820
- screenshareEnabled: state.screenshareEnabled
1821
- });
1822
- const isSpeaking = this._mediaManager.isSpeaking ?? false;
1823
- this._swarmSynchronizer.setSpeaking(isSpeaking);
1824
- this.mediaStateUpdated.emit([
1825
- state,
1826
- isSpeaking
1827
- ]);
1828
- this._updateState();
1829
- }
1830
- /**
1831
- * Only this method is allowed to change state.
1832
- */
1833
- _updateState() {
1834
- this._state.call = this._swarmSynchronizer._getState();
1835
- this._state.media = this._mediaManager._getState();
1836
- }
1837
- // TODO(burdon): Can this be mocked?
1838
- constructor(_client) {
1839
- super(), _define_property6(this, "_client", void 0), _define_property6(this, "callStateUpdated", void 0), // TODO(wittjosiah): Consolidate isSpeaking into the MediaState type.
1840
- _define_property6(this, "mediaStateUpdated", void 0), _define_property6(this, "left", void 0), /**
1841
- * Live object state. Is changed on internal events.
1842
- * CAUTION: Do not change directly.
1843
- */
1844
- _define_property6(this, "_state", void 0), // TODO(wittjosiah): This shouldn't be necessary, live-object's signals should be granular.
1845
- _define_property6(this, "_raisedHandSignal", void 0), _define_property6(this, "_speakingSignal", void 0), _define_property6(this, "_joinedSignal", void 0), _define_property6(this, "_swarmSynchronizer", void 0), _define_property6(this, "_mediaManager", void 0), this._client = _client, this.callStateUpdated = new Event4(), this.mediaStateUpdated = new Event4(), this.left = new Event4(), this._state = live({
1846
- call: {},
1847
- media: {
1848
- pulledAudioTracks: {},
1849
- pulledVideoStreams: {}
1850
- }
1851
- }), this._raisedHandSignal = computed(() => this._state.call.raisedHand ?? false), this._speakingSignal = computed(() => this._state.call.speaking ?? false), this._joinedSignal = computed(() => this._state.call.joined ?? false);
1852
- this._client.config.getOrThrow("runtime.services.edge.url");
1853
- const networkService = this._client.services.services.NetworkService;
1854
- invariant5(networkService, "network service not found", {
1855
- F: __dxlog_file6,
1856
- L: 159,
1857
- S: this,
1858
- A: [
1859
- "networkService",
1860
- "'network service not found'"
1861
- ]
1862
- });
1863
- this._swarmSynchronizer = new CallSwarmSynchronizer({
1864
- networkService
1865
- });
1866
- this._mediaManager = new MediaManager();
1867
- }
1868
- };
1869
- _ts_decorate3([
1870
- synchronized3
1871
- ], CallManager.prototype, "join", null);
1872
- _ts_decorate3([
1873
- synchronized3
1874
- ], CallManager.prototype, "leave", null);
1875
-
1876
- export {
1877
- CALLS_URL,
1878
- codec,
1879
- TrackNameCodec,
1880
- CallSwarmSynchronizer,
1881
- monitorAudioLevel,
1882
- CallsServicePeer,
1883
- getUserMediaTrack,
1884
- getDeviceList,
1885
- getScreenshare,
1886
- SpeakingMonitor,
1887
- MediaManager,
1888
- CallManager
1889
- };
1890
- //# sourceMappingURL=chunk-ZCEU5K23.mjs.map