@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,581 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { PersistentLifecycle, Trigger, scheduleTask } from '@dxos/async';
6
- import { type Context, Resource } from '@dxos/context';
7
- import { invariant } from '@dxos/invariant';
8
- import { log } from '@dxos/log';
9
-
10
- import {
11
- type ErrorResponse,
12
- type RenegotiationResponse,
13
- type SessionResponse,
14
- type TrackObject,
15
- type TracksResponse,
16
- } from '../types';
17
-
18
- import { HistoryCache } from './history-cache';
19
- import { BulkRequestDispatcher, FIFOScheduler } from './task-scheduling';
20
-
21
- const NETWORK_TIMEOUT = 5_000;
22
-
23
- export type Session = {
24
- sessionId: string;
25
- peerConnection: RTCPeerConnection;
26
- };
27
-
28
- export type CallsServiceConfig = {
29
- apiBase: string;
30
- apiExtraParams?: string;
31
- iceServers?: RTCIceServer[];
32
- };
33
-
34
- export type HistoryRecord =
35
- | {
36
- endpoint: string;
37
- type: 'request';
38
- time: string;
39
- method: string;
40
- body: any;
41
- }
42
- | {
43
- endpoint: string;
44
- type: 'response';
45
- time: string;
46
- status: number;
47
- text?: string;
48
- json?: any;
49
- };
50
-
51
- /**
52
- * Client for Cloudflare Calls service.
53
- * API: https://developers.cloudflare.com/calls/https-api/
54
- * Inspired by client from https://github.com/threepointone/partyserver/tree/main/packages/partytracks
55
- */
56
- // TODO(mykola): Expose session errors.
57
- export class CallsServicePeer extends Resource {
58
- public readonly history = new HistoryCache<HistoryRecord>(100);
59
-
60
- private readonly _persistentLifecycle = new PersistentLifecycle<Session>({
61
- start: () => this._startSession(),
62
- stop: (session) => this._stopSession(session),
63
- });
64
-
65
- private readonly _config: CallsServiceConfig;
66
-
67
- taskScheduler = new FIFOScheduler();
68
- pushTrackDispatcher = new BulkRequestDispatcher<
69
- {
70
- trackName: string;
71
- transceiver: RTCRtpTransceiver;
72
- },
73
- { tracks: TrackObject[] }
74
- >(32);
75
-
76
- pullTrackDispatcher = new BulkRequestDispatcher<
77
- TrackObject,
78
- {
79
- /**
80
- * trackName -> { resolvedTrack, mid }
81
- */
82
- trackMap: Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>;
83
- }
84
- >(32);
85
-
86
- closeTrackDispatcher = new BulkRequestDispatcher(32);
87
- constructor(config: CallsServiceConfig) {
88
- super();
89
- this._config = config;
90
- }
91
-
92
- protected override async _open(ctx: Context): Promise<void> {
93
- await this._persistentLifecycle.open(ctx);
94
- }
95
-
96
- protected override async _close(): Promise<void> {
97
- await this._persistentLifecycle.close();
98
- }
99
-
100
- get session() {
101
- return this._persistentLifecycle.state;
102
- }
103
-
104
- private async _startSession() {
105
- const peerConnection = await this._createRtcConnection();
106
- const sessionId = await this._initiateCallSession();
107
- return { sessionId, peerConnection };
108
- }
109
-
110
- private async _stopSession(session: Session): Promise<void> {
111
- session.peerConnection.close();
112
- }
113
-
114
- private async _createRtcConnection(): Promise<RTCPeerConnection> {
115
- const peerConnection = new RTCPeerConnection({
116
- iceServers: this._config.iceServers,
117
- bundlePolicy: 'max-bundle',
118
- });
119
- peerConnection.addEventListener('connectionstatechange', () => {
120
- if (peerConnection.connectionState === 'failed' || peerConnection.connectionState === 'closed') {
121
- log.info('calls connection failed', { state: peerConnection.connectionState });
122
- void this._persistentLifecycle.scheduleRestart();
123
- }
124
- });
125
-
126
- let iceTimeout = -1;
127
- peerConnection.addEventListener('iceconnectionstatechange', () => {
128
- clearTimeout(iceTimeout);
129
- if (peerConnection.iceConnectionState === 'failed' || peerConnection.iceConnectionState === 'closed') {
130
- log.info('calls connection to ICEs failed', { state: peerConnection.iceConnectionState });
131
- void this._persistentLifecycle.scheduleRestart();
132
- } else if (peerConnection.iceConnectionState === 'disconnected') {
133
- // TODO(mykola): we should start to inspect the connection stats from here on for
134
- // any other signs of trouble to guide what to do next (instead of just hoping
135
- // for the best like we do here for now)
136
- const timeoutSeconds = 7;
137
- iceTimeout = window.setTimeout(() => {
138
- if (peerConnection.iceConnectionState === 'connected') {
139
- log.info('calls iceConnectionState is connected');
140
- return;
141
- }
142
-
143
- log.info('calls iceConnectionState timed out', { state: peerConnection.iceConnectionState, timeoutSeconds });
144
- void this._persistentLifecycle.scheduleRestart();
145
- }, timeoutSeconds * 1_000);
146
- }
147
- });
148
-
149
- return peerConnection;
150
- }
151
-
152
- private async _initiateCallSession(): Promise<string> {
153
- log('creating new session');
154
- const { sessionId } = await this._fetch<SessionResponse>('/sessions/new?SESSION', { method: 'POST' });
155
- return sessionId;
156
- }
157
-
158
- private async _fetch<T extends ErrorResponse>(relativePath: string, requestInit?: RequestInit): Promise<T> {
159
- this.history.push({
160
- endpoint: relativePath,
161
- type: 'request',
162
- time: new Date().toISOString(),
163
- method: requestInit?.method ?? 'GET',
164
- body: requestInit?.body,
165
- });
166
- // TODO(mykola): Handle access control. Use EdgeClient.
167
- const response = await fetch(`${this._config.apiBase}${relativePath}`, { ...requestInit, redirect: 'manual' });
168
- if (response.status >= 400) {
169
- log.error('error while fetching from Calls service', { status: response.status, text: await response.text() });
170
- throw new Error('Error while fetching from Calls service');
171
- }
172
-
173
- try {
174
- const data = (await response.clone().json()) as T;
175
- this.history.push({
176
- endpoint: relativePath,
177
- type: 'response',
178
- time: new Date().toISOString(),
179
- status: response.status,
180
- json: data,
181
- });
182
- if (data.errorCode) {
183
- throw new Error(data.errorDescription);
184
- }
185
-
186
- return data;
187
- } catch (error) {
188
- const text = await response.text();
189
- this.history.push({
190
- endpoint: relativePath,
191
- type: 'response',
192
- time: new Date().toISOString(),
193
- status: response.status,
194
- text,
195
- });
196
- log.error('Error parsing response from Calls service', {
197
- error,
198
- text,
199
- status: response.status,
200
- });
201
- throw error;
202
- }
203
- }
204
-
205
- private async _pushTrackInBulk({
206
- ctx,
207
- peerConnection,
208
- transceiver,
209
- sessionId,
210
- trackName,
211
- }: {
212
- ctx: Context;
213
- peerConnection: RTCPeerConnection;
214
- transceiver: RTCRtpTransceiver;
215
- sessionId: string;
216
- trackName: string;
217
- }): Promise<TrackObject | void> {
218
- log.verbose('pushing track ', trackName);
219
- const pushedTrackPromise = this.pushTrackDispatcher
220
- .doBulkRequest({ trackName, transceiver }, (tracks) =>
221
- this.taskScheduler.schedule(async () => {
222
- // Create offer.
223
- // Turn on Opus DTX to save bandwidth and set the offer as the local description.
224
- const offer = await peerConnection.createOffer();
225
- offer.sdp = offer.sdp?.replace('useinbandfec=1', 'usedtx=1;useinbandfec=1');
226
- await peerConnection.setLocalDescription(offer);
227
-
228
- const response = await this._fetch<TracksResponse>(`/sessions/${sessionId}/tracks/new?PUSHING`, {
229
- method: 'POST',
230
- body: JSON.stringify({
231
- sessionDescription: {
232
- sdp: offer.sdp,
233
- type: 'offer',
234
- },
235
- tracks: tracks.map(({ trackName, transceiver }) => ({
236
- trackName,
237
- mid: transceiver.mid,
238
- location: 'local',
239
- })),
240
- }),
241
- });
242
-
243
- invariant(response.tracks !== undefined);
244
- if (!response.errorCode) {
245
- await peerConnection.setRemoteDescription(new RTCSessionDescription(response.sessionDescription));
246
- await peerConnectionIsConnected(peerConnection);
247
- }
248
-
249
- return {
250
- tracks: response.tracks,
251
- };
252
- }),
253
- )
254
- .then(async ({ tracks }) => {
255
- const trackData = tracks.find((t) => t.mid === transceiver.mid);
256
- if (trackData) {
257
- // we wait for the transceiver to start sending data before we emit
258
- // the track metadata to ensure that the track will be able to be
259
- // pulled before making the metadata available to anyone else.
260
- // await waitForTransceiverToSendData(ctx, transceiver);
261
- return {
262
- ...trackData,
263
- sessionId,
264
- location: 'remote',
265
- } satisfies TrackObject;
266
- } else {
267
- log.error('missing track data');
268
- }
269
- });
270
-
271
- const onDispose = async () => {
272
- if (transceiver.mid) {
273
- await this._closeTrackInBulk(peerConnection, transceiver.mid, sessionId);
274
- }
275
- };
276
-
277
- ctx?.onDispose(async () => await onDispose());
278
- this._ctx.onDispose(() => onDispose());
279
-
280
- return pushedTrackPromise;
281
- }
282
-
283
- async pushTrack({
284
- track,
285
- encodings = [],
286
- ctx,
287
- previousTrack,
288
- }: {
289
- track: MediaStreamTrack | null;
290
- ctx: Context;
291
- encodings?: RTCRtpEncodingParameters[];
292
- previousTrack?: TrackObject;
293
- }): Promise<TrackObject | undefined> {
294
- await this.waitUntilOpen();
295
- invariant(this.session);
296
- log('trying to push track', { track, previousTrack, encodings });
297
- if (previousTrack) {
298
- const transceiver = this.session.peerConnection.getTransceivers().find((t) => t.mid === previousTrack.mid);
299
- if (transceiver?.sender.track === track) {
300
- log.verbose('track already pushed', { track, previousTrack, transceiver });
301
- return previousTrack;
302
- } else if (transceiver) {
303
- log.verbose('replacing track', { track, previousTrack, transceiver });
304
- transceiver.sender.replaceTrack(track).catch((err) => log.catch(err));
305
- return previousTrack;
306
- }
307
- }
308
- invariant(track);
309
-
310
- // We want a single id for this connection.
311
- const stableId = crypto.randomUUID();
312
- const transceiver = this.session.peerConnection!.addTransceiver(track, { direction: 'sendonly' });
313
- log.verbose('creating transceiver');
314
-
315
- const pushedTrackData = await this._pushTrackInBulk({
316
- ctx,
317
- peerConnection: this.session.peerConnection!,
318
- transceiver,
319
- sessionId: this.session.sessionId!,
320
- trackName: stableId,
321
- });
322
- invariant(pushedTrackData);
323
-
324
- const parameters = transceiver.sender.getParameters();
325
- encodings.forEach((encoding, i) => {
326
- const existing = parameters.encodings[i];
327
- parameters.encodings[i] = { ...existing, ...encoding };
328
- });
329
- transceiver.sender.setParameters(parameters).catch((err) => log.catch(err));
330
-
331
- return pushedTrackData;
332
- }
333
-
334
- // TODO(mykola): Add retry logic if the tracks fails to pull.
335
- private async _pullTrackInBulk({
336
- peerConnection,
337
- sessionId,
338
- trackData,
339
- ctx,
340
- }: {
341
- peerConnection: RTCPeerConnection;
342
- sessionId: string;
343
- trackData: TrackObject;
344
- ctx?: Context;
345
- }): Promise<MediaStreamTrack | undefined> {
346
- let mid = '';
347
- log('pulling track', { trackName: trackData.trackName });
348
- const pulledTrackPromise = this.pullTrackDispatcher
349
- .doBulkRequest(trackData, (tracks) =>
350
- this.taskScheduler.schedule(async () => {
351
- const newTrackResponse = await this._fetch<TracksResponse>(`/sessions/${sessionId}/tracks/new?PULLING`, {
352
- method: 'POST',
353
- body: JSON.stringify({ tracks }),
354
- });
355
-
356
- if (newTrackResponse.errorCode) {
357
- throw new Error(newTrackResponse.errorDescription);
358
- }
359
-
360
- invariant(newTrackResponse.tracks);
361
- const trackMap = tracks.reduce((acc, track) => {
362
- const pulledTrackData = newTrackResponse.tracks?.find(
363
- (t) => t.trackName === track.trackName && t.sessionId === track.sessionId,
364
- );
365
-
366
- if (pulledTrackData && pulledTrackData.mid) {
367
- acc.set(track.trackName!, {
368
- mid: pulledTrackData.mid,
369
- resolvedTrack: resolveTrack(peerConnection, (t) => t.mid === pulledTrackData.mid),
370
- });
371
- }
372
-
373
- return acc;
374
- }, new Map<string, { resolvedTrack: Promise<MediaStreamTrack>; mid: string }>());
375
-
376
- if (newTrackResponse.requiresImmediateRenegotiation) {
377
- await peerConnection.setRemoteDescription(new RTCSessionDescription(newTrackResponse.sessionDescription));
378
- const answer = await peerConnection.createAnswer();
379
- await peerConnection.setLocalDescription(answer);
380
-
381
- const renegotiationResponse = await this._fetch<RenegotiationResponse>(
382
- `/sessions/${sessionId}/renegotiate`,
383
- {
384
- method: 'PUT',
385
- body: JSON.stringify({
386
- sessionDescription: {
387
- type: 'answer',
388
- sdp: peerConnection.currentLocalDescription?.sdp,
389
- },
390
- }),
391
- },
392
- );
393
-
394
- if (renegotiationResponse.errorCode) {
395
- throw new Error(renegotiationResponse.errorDescription);
396
- } else {
397
- await peerConnectionIsConnected(peerConnection);
398
- }
399
- }
400
-
401
- return { trackMap };
402
- }),
403
- )
404
- .then(({ trackMap }) => {
405
- const trackInfo = trackMap.get(trackData.trackName!);
406
- if (trackInfo) {
407
- return trackInfo.resolvedTrack
408
- .then((track) => {
409
- mid = trackInfo.mid;
410
- return track;
411
- })
412
- .catch((err) => log.catch(err));
413
- } else {
414
- log.info('missing track info', { trackData, availableTracks: Array.from(trackMap.keys()) });
415
- }
416
- });
417
-
418
- const onDispose = async () => {
419
- if (mid) {
420
- log('closing pulled track ', trackData.trackName);
421
- await this._closeTrackInBulk(peerConnection, mid, sessionId);
422
- mid = '';
423
- }
424
- };
425
-
426
- this._ctx.onDispose(() => onDispose());
427
- ctx?.onDispose(() => onDispose());
428
-
429
- return pulledTrackPromise as Promise<MediaStreamTrack | undefined>;
430
- }
431
-
432
- async pullTrack({
433
- ctx,
434
- trackData,
435
- }: {
436
- trackData: TrackObject;
437
- ctx?: Context;
438
- }): Promise<MediaStreamTrack | undefined> {
439
- await this.waitUntilOpen();
440
-
441
- invariant(this.session);
442
- const session = this.session;
443
- return this._pullTrackInBulk({
444
- peerConnection: session.peerConnection,
445
- sessionId: session.sessionId,
446
- trackData,
447
- ctx,
448
- });
449
- }
450
-
451
- async _closeTrackInBulk(peerConnection: RTCPeerConnection, mid: string, sessionId: string): Promise<void> {
452
- const transceiver = peerConnection.getTransceivers().find((t) => t.mid === mid);
453
-
454
- if (peerConnection.connectionState !== 'connected' || transceiver === undefined) {
455
- return;
456
- }
457
- await this.closeTrackDispatcher.doBulkRequest({ mid }, (mids) =>
458
- this.taskScheduler.schedule(async () => {
459
- transceiver.stop();
460
- const activeTransceivers = peerConnection
461
- .getTransceivers()
462
- .filter((t) => t.mid !== mid && t.direction !== 'stopped');
463
-
464
- let requestBody;
465
- if (activeTransceivers.length > 0) {
466
- // create an offer
467
- const offer = await peerConnection.createOffer();
468
- // And set the offer as the local description
469
- await peerConnection.setLocalDescription(offer);
470
- requestBody = {
471
- tracks: mids,
472
- sessionDescription: {
473
- sdp: peerConnection.localDescription?.sdp,
474
- type: 'offer',
475
- },
476
- force: false,
477
- };
478
- } else {
479
- requestBody = {
480
- tracks: mids,
481
- force: true,
482
- };
483
- }
484
-
485
- const response = await this._fetch<TracksResponse>(`/sessions/${sessionId}/tracks/close`, {
486
- method: 'PUT',
487
- body: JSON.stringify(requestBody),
488
- });
489
-
490
- if (requestBody.sessionDescription) {
491
- await peerConnection.setRemoteDescription(new RTCSessionDescription(response.sessionDescription));
492
- }
493
- }),
494
- );
495
- }
496
- }
497
-
498
- const resolveTrack = async (
499
- peerConnection: RTCPeerConnection,
500
- compare: (t: RTCRtpTransceiver) => boolean,
501
- timeout = NETWORK_TIMEOUT,
502
- ) =>
503
- new Promise<MediaStreamTrack>((resolve, reject) => {
504
- setTimeout(reject, timeout);
505
- const handler = () => {
506
- const transceiver = peerConnection.getTransceivers().find(compare);
507
- if (transceiver) {
508
- resolve(transceiver.receiver.track);
509
- peerConnection.removeEventListener('track', handler);
510
- }
511
- };
512
-
513
- peerConnection.addEventListener('track', handler);
514
- });
515
-
516
- const peerConnectionIsConnected = async (peerConnection: RTCPeerConnection) => {
517
- if (peerConnection.connectionState !== 'connected') {
518
- const connected = new Promise((resolve, reject) => {
519
- // Timeout after 5s.
520
- const timeout = setTimeout(() => {
521
- peerConnection.removeEventListener('connectionstatechange', connectionStateChangeHandler);
522
- reject(new Error('Connection timeout'));
523
- }, NETWORK_TIMEOUT);
524
-
525
- const connectionStateChangeHandler = () => {
526
- if (peerConnection.connectionState === 'connected') {
527
- peerConnection.removeEventListener('connectionstatechange', connectionStateChangeHandler);
528
- clearTimeout(timeout);
529
- resolve(undefined);
530
- }
531
- };
532
- peerConnection.addEventListener('connectionstatechange', connectionStateChangeHandler);
533
- });
534
-
535
- await connected;
536
- }
537
- };
538
-
539
- const INITIAL_DELAY = 50;
540
- const MAX_DELAY = 500;
541
- const MAX_RETRIES = 20;
542
- const WAIT_FOR_DATA_TIMEOUT = 10_000;
543
-
544
- const waitForTransceiverToSendData = async (ctx: Context, transceiver: RTCRtpTransceiver): Promise<void> => {
545
- let delay = INITIAL_DELAY;
546
- let checks = 0;
547
- const waitForData = new Trigger();
548
- ctx.onDispose(() => waitForData.throw(new Error('Transceiver was closed')));
549
-
550
- const checkStats = async () => {
551
- if (ctx.disposed) return;
552
-
553
- try {
554
- const stats = await transceiver.sender.getStats();
555
- let dataFound = false;
556
- stats.forEach((stat) => {
557
- if (stat.type === 'outbound-rtp' && stat.bytesSent > 0) {
558
- dataFound = true;
559
- }
560
- });
561
-
562
- if (dataFound) {
563
- waitForData.wake();
564
- return;
565
- }
566
- } catch {
567
- // Stats might not be available yet, continue checking
568
- }
569
- checks++;
570
- if (checks > MAX_RETRIES) {
571
- waitForData.throw(new Error('Transceiver did not send data'));
572
- return;
573
- }
574
-
575
- delay = Math.min(delay * 2, MAX_DELAY); // Exponential backoff with max cap
576
- scheduleTask(ctx, checkStats, delay);
577
- };
578
-
579
- void checkStats();
580
- return waitForData.wait({ timeout: WAIT_FOR_DATA_TIMEOUT });
581
- };
@@ -1,27 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- /**
6
- * Array that holds the last N items.
7
- */
8
- export class HistoryCache<T> {
9
- private readonly _limit: number;
10
- private readonly _messages: T[];
11
-
12
- constructor(limit = 100) {
13
- this._limit = limit;
14
- this._messages = [];
15
- }
16
-
17
- push(...messages: T[]): void {
18
- if (this._messages.length >= this._limit) {
19
- this._messages.shift(); // Remove the oldest message
20
- }
21
- this._messages.push(...messages); // Add new message
22
- }
23
-
24
- get(): T[] {
25
- return this._messages;
26
- }
27
- }
@@ -1,8 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- export * from './audio';
6
- export * from './calls-service';
7
- export * from './media';
8
- export * from './stub-media-streams';
@@ -1,52 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { log } from '@dxos/log';
6
-
7
- export const getUserMediaTrack = async (
8
- kind: MediaDeviceKind,
9
- constraints: MediaTrackConstraints = {},
10
- deviceList?: MediaDeviceInfo[],
11
- ): Promise<MediaStreamTrack> => {
12
- deviceList ??= (await getDeviceList()).filter((device) => device.kind === kind);
13
- const firstDevice = deviceList[0];
14
- if (!firstDevice) {
15
- throw new Error('No devices found');
16
- }
17
-
18
- return acquireTrack(firstDevice, constraints);
19
- };
20
-
21
- const acquireTrack = async (device: MediaDeviceInfo, constraints: MediaTrackConstraints): Promise<MediaStreamTrack> => {
22
- const { deviceId, label } = device;
23
- log.info(`requesting ${label}`);
24
-
25
- const mediaStream = await navigator.mediaDevices.getUserMedia(
26
- device.kind === 'videoinput' ? { video: { ...constraints, deviceId } } : { audio: { ...constraints, deviceId } },
27
- );
28
- return device.kind === 'videoinput' ? mediaStream.getVideoTracks()[0] : mediaStream.getAudioTracks()[0];
29
- };
30
-
31
- // TODO(mykola): Handle devicechange event.
32
- export const getDeviceList = () => navigator.mediaDevices.enumerateDevices();
33
-
34
- const SCREENSHARE_CONSTRAINTS = {
35
- video: {
36
- width: { max: 1920 },
37
- height: { max: 1080 },
38
- frameRate: { max: 10 },
39
- },
40
- };
41
-
42
- export const getScreenshare = async ({ contentHint }: { contentHint: string }) => {
43
- // Get 1080p equivalent screenshare with 10fps, but save natural sharing content aspect ratio.
44
- const ms = await navigator.mediaDevices.getDisplayMedia(SCREENSHARE_CONSTRAINTS);
45
- ms.getVideoTracks().forEach((track) => {
46
- if (contentHint && 'contentHint' in track) {
47
- track.contentHint = contentHint;
48
- }
49
- });
50
-
51
- return ms;
52
- };