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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (599) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs +28 -0
  4. package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs.map +7 -0
  5. package/dist/lib/neutral/ChannelChat-LZEDFJVD.mjs +10 -0
  6. package/dist/lib/neutral/CommentsCompanion-3H3ZVIBH.mjs +208 -0
  7. package/dist/lib/neutral/CommentsCompanion-3H3ZVIBH.mjs.map +7 -0
  8. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs +61 -0
  9. package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs.map +7 -0
  10. package/dist/lib/neutral/ThreadPlugin.mjs +96 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  12. package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  14. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +24 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  16. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
  17. package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
  18. package/dist/lib/neutral/add-message-DATVSMVU.mjs +122 -0
  19. package/dist/lib/neutral/add-message-DATVSMVU.mjs.map +7 -0
  20. package/dist/lib/neutral/agent-runner-JK2Y4RU3.mjs +244 -0
  21. package/dist/lib/neutral/agent-runner-JK2Y4RU3.mjs.map +7 -0
  22. package/dist/lib/neutral/app-graph-builder-ACCHZXZA.mjs +120 -0
  23. package/dist/lib/neutral/app-graph-builder-ACCHZXZA.mjs.map +7 -0
  24. package/dist/lib/neutral/append-channel-message-4ACLATZY.mjs +40 -0
  25. package/dist/lib/neutral/append-channel-message-4ACLATZY.mjs.map +7 -0
  26. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
  27. package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
  28. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  29. package/dist/lib/neutral/capabilities/index.mjs +27 -0
  30. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-5T5LPLBN.mjs +36 -0
  32. package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-6HC3NAXD.mjs +164 -0
  34. package/dist/lib/neutral/chunk-6HC3NAXD.mjs.map +7 -0
  35. package/dist/lib/neutral/chunk-BHEZLLXG.mjs +55 -0
  36. package/dist/lib/neutral/chunk-BHEZLLXG.mjs.map +7 -0
  37. package/dist/lib/neutral/chunk-D3SCNWLT.mjs +335 -0
  38. package/dist/lib/neutral/chunk-D3SCNWLT.mjs.map +7 -0
  39. package/dist/lib/{browser/chunk-CP7E2HRE.mjs → neutral/chunk-JLY4NVTA.mjs} +12 -5
  40. package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
  41. package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
  42. package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
  43. package/dist/lib/neutral/chunk-TT6PWRR5.mjs +8 -0
  44. package/dist/lib/neutral/chunk-TT6PWRR5.mjs.map +7 -0
  45. package/dist/lib/neutral/chunk-WMP3QCOR.mjs +46 -0
  46. package/dist/lib/neutral/chunk-WMP3QCOR.mjs.map +7 -0
  47. package/dist/lib/neutral/components/index.mjs +541 -0
  48. package/dist/lib/neutral/components/index.mjs.map +7 -0
  49. package/dist/lib/neutral/containers/index.mjs +15 -0
  50. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  51. package/dist/lib/neutral/create-2NJDD73M.mjs +61 -0
  52. package/dist/lib/neutral/create-2NJDD73M.mjs.map +7 -0
  53. package/dist/lib/neutral/create-channel-RYSV44N3.mjs +19 -0
  54. package/dist/lib/neutral/create-channel-RYSV44N3.mjs.map +7 -0
  55. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs +28 -0
  56. package/dist/lib/neutral/create-object-D5XEG7MQ.mjs.map +7 -0
  57. package/dist/lib/neutral/create-proposals-7UZYZ32V.mjs +56 -0
  58. package/dist/lib/neutral/create-proposals-7UZYZ32V.mjs.map +7 -0
  59. package/dist/lib/neutral/delete-JVGAPD46.mjs +57 -0
  60. package/dist/lib/neutral/delete-JVGAPD46.mjs.map +7 -0
  61. package/dist/lib/neutral/delete-message-5EGR3HWH.mjs +54 -0
  62. package/dist/lib/neutral/delete-message-5EGR3HWH.mjs.map +7 -0
  63. package/dist/lib/neutral/hooks/index.mjs +10 -0
  64. package/dist/lib/neutral/index.mjs +32 -0
  65. package/dist/lib/neutral/markdown-B6RNVR2H.mjs +83 -0
  66. package/dist/lib/neutral/markdown-B6RNVR2H.mjs.map +7 -0
  67. package/dist/lib/neutral/meta.json +1 -0
  68. package/dist/lib/neutral/meta.mjs +10 -0
  69. package/dist/lib/neutral/on-create-space-ZQF55KSO.mjs +23 -0
  70. package/dist/lib/neutral/on-create-space-ZQF55KSO.mjs.map +7 -0
  71. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  72. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  73. package/dist/lib/neutral/operations/index.mjs +8 -0
  74. package/dist/lib/neutral/plugin.mjs +16 -0
  75. package/dist/lib/neutral/plugin.mjs.map +7 -0
  76. package/dist/lib/neutral/react-surface-ZSIQHN5P.mjs +76 -0
  77. package/dist/lib/neutral/react-surface-ZSIQHN5P.mjs.map +7 -0
  78. package/dist/lib/neutral/respond-to-thread-LVLDZON3.mjs +32 -0
  79. package/dist/lib/neutral/respond-to-thread-LVLDZON3.mjs.map +7 -0
  80. package/dist/lib/neutral/restore-Z5PYV7I2.mjs +32 -0
  81. package/dist/lib/neutral/restore-Z5PYV7I2.mjs.map +7 -0
  82. package/dist/lib/neutral/restore-message-B263PLUH.mjs +33 -0
  83. package/dist/lib/neutral/restore-message-B263PLUH.mjs.map +7 -0
  84. package/dist/lib/neutral/select-GXDEAH5D.mjs +24 -0
  85. package/dist/lib/neutral/select-GXDEAH5D.mjs.map +7 -0
  86. package/dist/lib/neutral/set-agent-config-7HHS6KZZ.mjs +20 -0
  87. package/dist/lib/neutral/set-agent-config-7HHS6KZZ.mjs.map +7 -0
  88. package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
  89. package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
  90. package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
  91. package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
  92. package/dist/lib/neutral/testing/index.mjs +58 -0
  93. package/dist/lib/neutral/testing/index.mjs.map +7 -0
  94. package/dist/lib/neutral/toggle-resolved-LBVNAVVF.mjs +36 -0
  95. package/dist/lib/neutral/toggle-resolved-LBVNAVVF.mjs.map +7 -0
  96. package/dist/lib/neutral/translations.mjs +91 -0
  97. package/dist/lib/neutral/translations.mjs.map +7 -0
  98. package/dist/lib/neutral/types/index.mjs +16 -0
  99. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
  100. package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
  101. package/dist/types/src/ThreadPlugin.d.ts +3 -1
  102. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  103. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  104. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  105. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  106. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  107. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  108. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  109. package/dist/types/src/blueprints/index.d.ts +2 -0
  110. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  111. package/dist/types/src/blueprints/thread-blueprint.d.ts +4 -0
  112. package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
  113. package/dist/types/src/capabilities/agent-runner.d.ts +22 -0
  114. package/dist/types/src/capabilities/agent-runner.d.ts.map +1 -0
  115. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  116. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  117. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -4
  118. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  119. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  120. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  121. package/dist/types/src/capabilities/index.d.ts +16 -15
  122. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  123. package/dist/types/src/capabilities/markdown.d.ts +3 -2
  124. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  125. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  126. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  127. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  128. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  129. package/dist/types/src/capabilities/settings.d.ts +5 -2
  130. package/dist/types/src/capabilities/settings.d.ts.map +1 -1
  131. package/dist/types/src/capabilities/state.d.ts +5 -5
  132. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  133. package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
  134. package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
  135. package/dist/types/src/components/Chat/Chat.d.ts +51 -0
  136. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  137. package/dist/types/src/components/Chat/index.d.ts +2 -0
  138. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  139. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
  140. package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
  141. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
  142. package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
  143. package/dist/types/src/components/{CommentsThreadContainer.d.ts → CommentsPanel/CommentsThread.d.ts} +3 -3
  144. package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
  145. package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
  146. package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
  147. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
  148. package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
  149. package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
  150. package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
  151. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
  152. package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
  153. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
  154. package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
  155. package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
  156. package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
  157. package/dist/types/src/components/index.d.ts +5 -10
  158. package/dist/types/src/components/index.d.ts.map +1 -1
  159. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
  160. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  161. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
  162. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  163. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  164. package/dist/types/src/containers/ChannelArticle/index.d.ts.map +1 -0
  165. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
  166. package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
  167. package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
  168. package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
  169. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts +11 -0
  170. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts.map +1 -0
  171. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts +198 -0
  172. package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts.map +1 -0
  173. package/dist/types/src/containers/CommentsCompanion/index.d.ts +2 -0
  174. package/dist/types/src/containers/CommentsCompanion/index.d.ts.map +1 -0
  175. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
  176. package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
  177. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
  178. package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
  179. package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
  180. package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
  181. package/dist/types/src/containers/index.d.ts +6 -0
  182. package/dist/types/src/containers/index.d.ts.map +1 -0
  183. package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
  184. package/dist/types/src/extensions/command.d.ts.map +1 -0
  185. package/dist/types/src/extensions/index.d.ts +1 -0
  186. package/dist/types/src/extensions/index.d.ts.map +1 -1
  187. package/dist/types/src/extensions/threads.d.ts +9 -4
  188. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  189. package/dist/types/src/hooks/analytics.d.ts +1 -2
  190. package/dist/types/src/hooks/analytics.d.ts.map +1 -1
  191. package/dist/types/src/hooks/index.d.ts +0 -4
  192. package/dist/types/src/hooks/index.d.ts.map +1 -1
  193. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  194. package/dist/types/src/index.d.ts +2 -3
  195. package/dist/types/src/index.d.ts.map +1 -1
  196. package/dist/types/src/meta.d.ts +2 -2
  197. package/dist/types/src/meta.d.ts.map +1 -1
  198. package/dist/types/src/operations/add-message.d.ts +5 -0
  199. package/dist/types/src/operations/add-message.d.ts.map +1 -0
  200. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  201. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  202. package/dist/types/src/operations/create-channel.d.ts +5 -0
  203. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  204. package/dist/types/src/operations/create-proposals.d.ts +5 -0
  205. package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
  206. package/dist/types/src/operations/create.d.ts +5 -0
  207. package/dist/types/src/operations/create.d.ts.map +1 -0
  208. package/dist/types/src/operations/delete-message.d.ts +5 -0
  209. package/dist/types/src/operations/delete-message.d.ts.map +1 -0
  210. package/dist/types/src/operations/delete.d.ts +5 -0
  211. package/dist/types/src/operations/delete.d.ts.map +1 -0
  212. package/dist/types/src/operations/index.d.ts +3 -0
  213. package/dist/types/src/operations/index.d.ts.map +1 -0
  214. package/dist/types/src/operations/on-create-space.d.ts +5 -0
  215. package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
  216. package/dist/types/src/operations/respond-to-thread.d.ts +5 -0
  217. package/dist/types/src/operations/respond-to-thread.d.ts.map +1 -0
  218. package/dist/types/src/operations/restore-message.d.ts +5 -0
  219. package/dist/types/src/operations/restore-message.d.ts.map +1 -0
  220. package/dist/types/src/operations/restore.d.ts +5 -0
  221. package/dist/types/src/operations/restore.d.ts.map +1 -0
  222. package/dist/types/src/operations/select.d.ts +5 -0
  223. package/dist/types/src/operations/select.d.ts.map +1 -0
  224. package/dist/types/src/operations/set-agent-config.d.ts +5 -0
  225. package/dist/types/src/operations/set-agent-config.d.ts.map +1 -0
  226. package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
  227. package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
  228. package/dist/types/src/plugin.d.ts +4 -0
  229. package/dist/types/src/plugin.d.ts.map +1 -0
  230. package/dist/types/src/should-trigger-agent.d.ts +22 -0
  231. package/dist/types/src/should-trigger-agent.d.ts.map +1 -0
  232. package/dist/types/src/should-trigger-agent.test.d.ts +2 -0
  233. package/dist/types/src/should-trigger-agent.test.d.ts.map +1 -0
  234. package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +1 -1
  235. package/dist/types/src/testing/data.d.ts.map +1 -0
  236. package/dist/types/src/testing/index.d.ts +1 -1
  237. package/dist/types/src/testing/index.d.ts.map +1 -1
  238. package/dist/types/src/translations.d.ts +140 -138
  239. package/dist/types/src/translations.d.ts.map +1 -1
  240. package/dist/types/src/types/AgentIdentity.d.ts +27 -0
  241. package/dist/types/src/types/AgentIdentity.d.ts.map +1 -0
  242. package/dist/types/src/types/Settings.d.ts +5 -0
  243. package/dist/types/src/types/Settings.d.ts.map +1 -0
  244. package/dist/types/src/types/ThreadCapabilities.d.ts +34 -0
  245. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  246. package/dist/types/src/types/ThreadOperation.d.ts +2409 -0
  247. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  248. package/dist/types/src/types/index.d.ts +4 -1
  249. package/dist/types/src/types/index.d.ts.map +1 -1
  250. package/dist/types/src/types/types.d.ts +0 -366
  251. package/dist/types/src/types/types.d.ts.map +1 -1
  252. package/dist/types/src/util.d.ts +6 -3
  253. package/dist/types/src/util.d.ts.map +1 -1
  254. package/dist/types/tsconfig.tsbuildinfo +1 -1
  255. package/package.json +156 -89
  256. package/src/ThreadPlugin.node.ts +39 -0
  257. package/src/ThreadPlugin.test.ts +37 -0
  258. package/src/ThreadPlugin.tsx +57 -131
  259. package/src/ThreadPlugin.workerd.ts +20 -0
  260. package/src/blueprints/index.ts +5 -0
  261. package/src/blueprints/thread-blueprint.ts +36 -0
  262. package/src/capabilities/agent-runner.ts +291 -0
  263. package/src/capabilities/app-graph-builder.ts +123 -174
  264. package/src/capabilities/blueprint-definition.ts +11 -30
  265. package/src/capabilities/create-object.ts +30 -0
  266. package/src/capabilities/index.ts +16 -12
  267. package/src/capabilities/markdown.ts +53 -38
  268. package/src/capabilities/operation-handler.ts +16 -0
  269. package/src/capabilities/react-surface.tsx +64 -80
  270. package/src/capabilities/settings.ts +26 -12
  271. package/src/capabilities/state.ts +14 -18
  272. package/src/capabilities/undo-mappings.ts +46 -0
  273. package/src/components/Chat/Chat.tsx +259 -0
  274. package/src/components/Chat/index.ts +5 -0
  275. package/src/components/CommentsPanel/CommentsPanel.stories.tsx +94 -0
  276. package/src/components/{CommentsContainer.tsx → CommentsPanel/CommentsPanel.tsx} +16 -15
  277. package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +42 -39
  278. package/src/components/CommentsPanel/index.ts +6 -0
  279. package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +81 -45
  280. package/src/components/MessagePanel/index.ts +5 -0
  281. package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
  282. package/src/components/ThreadSettings/ThreadSettings.tsx +19 -0
  283. package/src/components/ThreadSettings/index.ts +5 -0
  284. package/src/components/index.ts +5 -12
  285. package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +105 -0
  286. package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
  287. package/src/containers/ChannelArticle/index.ts +5 -0
  288. package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
  289. package/src/containers/ChannelChat/index.ts +8 -0
  290. package/src/containers/CommentsCompanion/CommentsCompanion.stories.tsx +339 -0
  291. package/src/containers/CommentsCompanion/CommentsCompanion.tsx +216 -0
  292. package/src/containers/CommentsCompanion/index.ts +5 -0
  293. package/src/{components/Chat.stories.tsx → containers/ThreadContainer/ThreadContainer.stories.tsx} +26 -25
  294. package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
  295. package/src/containers/ThreadContainer/index.ts +8 -0
  296. package/src/containers/index.ts +10 -0
  297. package/src/{components/command-extension.ts → extensions/command.ts} +3 -3
  298. package/src/extensions/index.ts +1 -0
  299. package/src/extensions/threads.ts +80 -44
  300. package/src/hooks/analytics.ts +24 -20
  301. package/src/hooks/index.ts +0 -5
  302. package/src/index.ts +4 -4
  303. package/src/meta.ts +33 -8
  304. package/src/operations/add-message.ts +94 -0
  305. package/src/operations/append-channel-message.ts +37 -0
  306. package/src/operations/create-channel.ts +20 -0
  307. package/src/operations/create-proposals.ts +49 -0
  308. package/src/operations/create.ts +63 -0
  309. package/src/operations/delete-message.ts +53 -0
  310. package/src/operations/delete.ts +63 -0
  311. package/src/operations/index.ts +22 -0
  312. package/src/operations/on-create-space.ts +27 -0
  313. package/src/operations/respond-to-thread.ts +32 -0
  314. package/src/operations/restore-message.ts +38 -0
  315. package/src/operations/restore.ts +38 -0
  316. package/src/operations/select.ts +24 -0
  317. package/src/operations/set-agent-config.ts +24 -0
  318. package/src/operations/toggle-resolved.ts +41 -0
  319. package/src/plugin.ts +11 -0
  320. package/src/should-trigger-agent.test.ts +72 -0
  321. package/src/should-trigger-agent.ts +50 -0
  322. package/src/{components/testing.ts → testing/data.ts} +7 -7
  323. package/src/testing/index.ts +1 -1
  324. package/src/translations.ts +73 -74
  325. package/src/types/AgentIdentity.ts +35 -0
  326. package/src/types/Settings.ts +10 -0
  327. package/src/types/ThreadCapabilities.ts +46 -0
  328. package/src/types/ThreadOperation.ts +217 -0
  329. package/src/types/index.ts +5 -1
  330. package/src/types/types.ts +2 -98
  331. package/src/util.ts +37 -5
  332. package/dist/lib/browser/ChannelContainer-NDIH62Q4.mjs +0 -17
  333. package/dist/lib/browser/ChatContainer-6FVFME3R.mjs +0 -16
  334. package/dist/lib/browser/app-graph-builder-URVQHGMR.mjs +0 -171
  335. package/dist/lib/browser/app-graph-builder-URVQHGMR.mjs.map +0 -7
  336. package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs +0 -101
  337. package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs.map +0 -7
  338. package/dist/lib/browser/call-manager-4YFT4XA6.mjs +0 -25
  339. package/dist/lib/browser/call-manager-4YFT4XA6.mjs.map +0 -7
  340. package/dist/lib/browser/chunk-6LWKNZUV.mjs +0 -377
  341. package/dist/lib/browser/chunk-6LWKNZUV.mjs.map +0 -7
  342. package/dist/lib/browser/chunk-CFC7LEPD.mjs +0 -18
  343. package/dist/lib/browser/chunk-CFC7LEPD.mjs.map +0 -7
  344. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
  345. package/dist/lib/browser/chunk-F36NHPJG.mjs +0 -989
  346. package/dist/lib/browser/chunk-F36NHPJG.mjs.map +0 -7
  347. package/dist/lib/browser/chunk-HKI7FUMB.mjs +0 -611
  348. package/dist/lib/browser/chunk-HKI7FUMB.mjs.map +0 -7
  349. package/dist/lib/browser/chunk-ISCHODBV.mjs +0 -106
  350. package/dist/lib/browser/chunk-ISCHODBV.mjs.map +0 -7
  351. package/dist/lib/browser/chunk-JDFDDUTH.mjs +0 -23
  352. package/dist/lib/browser/chunk-JDFDDUTH.mjs.map +0 -7
  353. package/dist/lib/browser/chunk-KOBXMDCI.mjs +0 -182
  354. package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +0 -7
  355. package/dist/lib/browser/chunk-QM34EZQK.mjs +0 -20
  356. package/dist/lib/browser/chunk-QM34EZQK.mjs.map +0 -7
  357. package/dist/lib/browser/chunk-R5UOPOO7.mjs +0 -142
  358. package/dist/lib/browser/chunk-R5UOPOO7.mjs.map +0 -7
  359. package/dist/lib/browser/chunk-ZCW3NSDZ.mjs +0 -1793
  360. package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +0 -7
  361. package/dist/lib/browser/index.mjs +0 -312
  362. package/dist/lib/browser/index.mjs.map +0 -7
  363. package/dist/lib/browser/intent-resolver-S3F7DVFM.mjs +0 -361
  364. package/dist/lib/browser/intent-resolver-S3F7DVFM.mjs.map +0 -7
  365. package/dist/lib/browser/markdown-454GFKEZ.mjs +0 -171
  366. package/dist/lib/browser/markdown-454GFKEZ.mjs.map +0 -7
  367. package/dist/lib/browser/meta.json +0 -1
  368. package/dist/lib/browser/react-root-ZB5ZA4I6.mjs +0 -29
  369. package/dist/lib/browser/react-root-ZB5ZA4I6.mjs.map +0 -7
  370. package/dist/lib/browser/react-surface-MBLTXSOC.mjs +0 -111
  371. package/dist/lib/browser/react-surface-MBLTXSOC.mjs.map +0 -7
  372. package/dist/lib/browser/settings-JN2HHORY.mjs +0 -23
  373. package/dist/lib/browser/settings-JN2HHORY.mjs.map +0 -7
  374. package/dist/lib/browser/state-UYPLBGZJ.mjs +0 -35
  375. package/dist/lib/browser/state-UYPLBGZJ.mjs.map +0 -7
  376. package/dist/lib/browser/types/index.mjs +0 -13
  377. package/dist/lib/node-esm/ChannelContainer-NGSDMNEE.mjs +0 -18
  378. package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs +0 -17
  379. package/dist/lib/node-esm/app-graph-builder-2IH5RPR7.mjs +0 -172
  380. package/dist/lib/node-esm/app-graph-builder-2IH5RPR7.mjs.map +0 -7
  381. package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs +0 -102
  382. package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs.map +0 -7
  383. package/dist/lib/node-esm/call-manager-UMUXEYH5.mjs +0 -26
  384. package/dist/lib/node-esm/call-manager-UMUXEYH5.mjs.map +0 -7
  385. package/dist/lib/node-esm/chunk-2AEIN5MI.mjs +0 -22
  386. package/dist/lib/node-esm/chunk-2AEIN5MI.mjs.map +0 -7
  387. package/dist/lib/node-esm/chunk-3VRYXHKX.mjs +0 -25
  388. package/dist/lib/node-esm/chunk-3VRYXHKX.mjs.map +0 -7
  389. package/dist/lib/node-esm/chunk-7KZWZS2U.mjs +0 -1794
  390. package/dist/lib/node-esm/chunk-7KZWZS2U.mjs.map +0 -7
  391. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs +0 -33
  392. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
  393. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
  394. package/dist/lib/node-esm/chunk-MEIWWPR2.mjs +0 -143
  395. package/dist/lib/node-esm/chunk-MEIWWPR2.mjs.map +0 -7
  396. package/dist/lib/node-esm/chunk-MM6HOX5W.mjs +0 -612
  397. package/dist/lib/node-esm/chunk-MM6HOX5W.mjs.map +0 -7
  398. package/dist/lib/node-esm/chunk-PZH2EDU5.mjs +0 -183
  399. package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +0 -7
  400. package/dist/lib/node-esm/chunk-RT6NRL2I.mjs +0 -19
  401. package/dist/lib/node-esm/chunk-RT6NRL2I.mjs.map +0 -7
  402. package/dist/lib/node-esm/chunk-VBI32FGI.mjs +0 -108
  403. package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +0 -7
  404. package/dist/lib/node-esm/chunk-Y3F2SGNH.mjs +0 -990
  405. package/dist/lib/node-esm/chunk-Y3F2SGNH.mjs.map +0 -7
  406. package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs +0 -378
  407. package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs.map +0 -7
  408. package/dist/lib/node-esm/index.mjs +0 -313
  409. package/dist/lib/node-esm/index.mjs.map +0 -7
  410. package/dist/lib/node-esm/intent-resolver-UES35EMJ.mjs +0 -362
  411. package/dist/lib/node-esm/intent-resolver-UES35EMJ.mjs.map +0 -7
  412. package/dist/lib/node-esm/markdown-7JUG6J7B.mjs +0 -172
  413. package/dist/lib/node-esm/markdown-7JUG6J7B.mjs.map +0 -7
  414. package/dist/lib/node-esm/meta.json +0 -1
  415. package/dist/lib/node-esm/react-root-3XXULWUN.mjs +0 -30
  416. package/dist/lib/node-esm/react-root-3XXULWUN.mjs.map +0 -7
  417. package/dist/lib/node-esm/react-surface-DCF4DD7B.mjs +0 -112
  418. package/dist/lib/node-esm/react-surface-DCF4DD7B.mjs.map +0 -7
  419. package/dist/lib/node-esm/settings-VSPM3BIM.mjs +0 -24
  420. package/dist/lib/node-esm/settings-VSPM3BIM.mjs.map +0 -7
  421. package/dist/lib/node-esm/state-XNWOLBNE.mjs +0 -36
  422. package/dist/lib/node-esm/state-XNWOLBNE.mjs.map +0 -7
  423. package/dist/lib/node-esm/types/index.mjs +0 -14
  424. package/dist/types/src/calls/call-manager.d.ts +0 -77
  425. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  426. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  427. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  428. package/dist/types/src/calls/index.d.ts +0 -7
  429. package/dist/types/src/calls/index.d.ts.map +0 -1
  430. package/dist/types/src/calls/media-manager.d.ts +0 -60
  431. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  432. package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
  433. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  434. package/dist/types/src/calls/types.d.ts +0 -45
  435. package/dist/types/src/calls/types.d.ts.map +0 -1
  436. package/dist/types/src/calls/util/audio.d.ts +0 -6
  437. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  438. package/dist/types/src/calls/util/calls-service.d.ts +0 -77
  439. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  440. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  441. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  442. package/dist/types/src/calls/util/index.d.ts +0 -5
  443. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  444. package/dist/types/src/calls/util/media.d.ts +0 -6
  445. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  446. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  447. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  448. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  449. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  450. package/dist/types/src/calls-service.stories.d.ts +0 -23
  451. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  452. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  453. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  454. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  455. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  456. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  457. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  458. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  459. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  460. package/dist/types/src/components/Call/Call.d.ts +0 -17
  461. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  462. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  463. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  464. package/dist/types/src/components/Call/index.d.ts +0 -3
  465. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  466. package/dist/types/src/components/CallDebugPanel.d.ts +0 -15
  467. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  468. package/dist/types/src/components/CallSidebar.d.ts +0 -4
  469. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  470. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  471. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  472. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -160
  473. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  474. package/dist/types/src/components/Chat.stories.d.ts +0 -160
  475. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  476. package/dist/types/src/components/ChatContainer.d.ts +0 -18
  477. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  478. package/dist/types/src/components/Comments.stories.d.ts +0 -158
  479. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  480. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  481. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  482. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  483. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
  484. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  485. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  486. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  487. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  488. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  489. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  490. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  491. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
  492. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  493. package/dist/types/src/components/Media/index.d.ts +0 -3
  494. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  495. package/dist/types/src/components/MessageContainer.d.ts +0 -14
  496. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  497. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  498. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  499. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  500. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  501. package/dist/types/src/components/Participant/index.d.ts +0 -3
  502. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  503. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +0 -12
  504. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  505. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -162
  506. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  507. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  508. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  509. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -176
  510. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  511. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  512. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  513. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  514. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  515. package/dist/types/src/components/ThreadCompanion.d.ts +0 -5
  516. package/dist/types/src/components/ThreadCompanion.d.ts.map +0 -1
  517. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  518. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  519. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  520. package/dist/types/src/components/testing.d.ts.map +0 -1
  521. package/dist/types/src/functions/create-proposals.d.ts +0 -6
  522. package/dist/types/src/functions/create-proposals.d.ts.map +0 -1
  523. package/dist/types/src/functions/index.d.ts +0 -2
  524. package/dist/types/src/functions/index.d.ts.map +0 -1
  525. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
  526. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
  527. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  528. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  529. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  530. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  531. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  532. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  533. package/dist/types/src/testing/stories.d.ts +0 -2
  534. package/dist/types/src/testing/stories.d.ts.map +0 -1
  535. package/dist/types/src/types/Channel.d.ts +0 -16
  536. package/dist/types/src/types/Channel.d.ts.map +0 -1
  537. package/src/calls/call-manager.ts +0 -246
  538. package/src/calls/call-swarm-synchronizer.ts +0 -350
  539. package/src/calls/index.ts +0 -10
  540. package/src/calls/media-manager.ts +0 -378
  541. package/src/calls/speaking-monitor.ts +0 -85
  542. package/src/calls/types.ts +0 -74
  543. package/src/calls/util/audio.ts +0 -58
  544. package/src/calls/util/calls-service.ts +0 -581
  545. package/src/calls/util/history-cache.ts +0 -27
  546. package/src/calls/util/index.ts +0 -8
  547. package/src/calls/util/media.ts +0 -52
  548. package/src/calls/util/stub-media-streams.ts +0 -127
  549. package/src/calls/util/task-scheduling.ts +0 -92
  550. package/src/calls-service.stories.tsx +0 -229
  551. package/src/capabilities/call-manager.ts +0 -20
  552. package/src/capabilities/capabilities.ts +0 -33
  553. package/src/capabilities/intent-resolver.ts +0 -311
  554. package/src/capabilities/react-root.tsx +0 -17
  555. package/src/components/Call/Call.tsx +0 -89
  556. package/src/components/Call/Toolbar.tsx +0 -182
  557. package/src/components/Call/index.ts +0 -6
  558. package/src/components/CallDebugPanel.tsx +0 -172
  559. package/src/components/CallSidebar.tsx +0 -18
  560. package/src/components/ChannelContainer.stories.tsx +0 -59
  561. package/src/components/ChannelContainer.tsx +0 -205
  562. package/src/components/ChatContainer.tsx +0 -153
  563. package/src/components/Comments.stories.tsx +0 -90
  564. package/src/components/Lobby/Lobby.tsx +0 -119
  565. package/src/components/Lobby/index.ts +0 -5
  566. package/src/components/Media/AudioStream.tsx +0 -67
  567. package/src/components/Media/VideoObject.stories.tsx +0 -60
  568. package/src/components/Media/VideoObject.tsx +0 -58
  569. package/src/components/Media/index.ts +0 -6
  570. package/src/components/Participant/Participant.tsx +0 -63
  571. package/src/components/Participant/ParticipantGrid.tsx +0 -89
  572. package/src/components/Participant/index.ts +0 -6
  573. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +0 -54
  574. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +0 -31
  575. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -158
  576. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  577. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -134
  578. package/src/components/ResponsiveGrid/index.ts +0 -7
  579. package/src/components/ThreadCompanion.tsx +0 -188
  580. package/src/components/ThreadSettings.tsx +0 -16
  581. package/src/functions/create-proposals.ts +0 -56
  582. package/src/functions/index.ts +0 -5
  583. package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
  584. package/src/hooks/useDebugMode.ts +0 -25
  585. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  586. package/src/hooks/useVideoStreamTrack.tsx +0 -36
  587. package/src/testing/stories.ts +0 -51
  588. package/src/types/Channel.ts +0 -26
  589. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
  590. package/src/typings.d.ts +0 -8
  591. /package/dist/lib/{browser/ChannelContainer-NDIH62Q4.mjs.map → neutral/ChannelChat-LZEDFJVD.mjs.map} +0 -0
  592. /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  593. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
  594. /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs.map +0 -0
  595. /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
  596. /package/dist/lib/{browser/ChatContainer-6FVFME3R.mjs.map → neutral/index.mjs.map} +0 -0
  597. /package/dist/lib/{node-esm/ChannelContainer-NGSDMNEE.mjs.map → neutral/meta.mjs.map} +0 -0
  598. /package/dist/lib/{node-esm/ChatContainer-KWNON7EN.mjs.map → neutral/operations/index.mjs.map} +0 -0
  599. /package/dist/lib/{node-esm/chunk-HSLMI22Q.mjs.map → neutral/types/index.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
- };