@dxos/plugin-thread 0.8.4-main.fd6878d → 0.9.0

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 (464) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +75 -0
  3. package/README.md +1 -1
  4. package/dist/lib/neutral/ChannelArticle-H633OM3U.mjs +57 -0
  5. package/dist/lib/neutral/ChannelArticle-H633OM3U.mjs.map +7 -0
  6. package/dist/lib/neutral/ChannelCreatePanel-NUXXKHZQ.mjs +38 -0
  7. package/dist/lib/neutral/ChannelCreatePanel-NUXXKHZQ.mjs.map +7 -0
  8. package/dist/lib/neutral/ThreadArticle-ROQXQLEZ.mjs +57 -0
  9. package/dist/lib/neutral/ThreadArticle-ROQXQLEZ.mjs.map +7 -0
  10. package/dist/lib/neutral/ThreadPlugin.mjs +67 -0
  11. package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
  12. package/dist/lib/neutral/ThreadPlugin.node.mjs +29 -0
  13. package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
  14. package/dist/lib/neutral/ThreadPlugin.workerd.mjs +27 -0
  15. package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
  16. package/dist/lib/neutral/app-graph-builder-OLKN3VTB.mjs +50 -0
  17. package/dist/lib/neutral/app-graph-builder-OLKN3VTB.mjs.map +7 -0
  18. package/dist/lib/neutral/append-channel-message-J6DXDPBH.mjs +34 -0
  19. package/dist/lib/neutral/append-channel-message-J6DXDPBH.mjs.map +7 -0
  20. package/dist/lib/neutral/capabilities/index.mjs +19 -0
  21. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  22. package/dist/lib/neutral/channel-backend-feed-FCXGAIEC.mjs +58 -0
  23. package/dist/lib/neutral/channel-backend-feed-FCXGAIEC.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-AWAQTEU6.mjs +10 -0
  25. package/dist/lib/neutral/chunk-AWAQTEU6.mjs.map +7 -0
  26. package/dist/lib/neutral/chunk-HJHK5O6F.mjs +109 -0
  27. package/dist/lib/neutral/chunk-HJHK5O6F.mjs.map +7 -0
  28. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  29. package/dist/lib/neutral/chunk-OOC6EQ7X.mjs +36 -0
  30. package/dist/lib/neutral/chunk-OOC6EQ7X.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-P4RSGFS4.mjs +69 -0
  32. package/dist/lib/neutral/chunk-P4RSGFS4.mjs.map +7 -0
  33. package/dist/lib/neutral/chunk-SZXFLBZL.mjs +8 -0
  34. package/dist/lib/neutral/chunk-SZXFLBZL.mjs.map +7 -0
  35. package/dist/lib/neutral/components/index.mjs +93 -0
  36. package/dist/lib/neutral/components/index.mjs.map +7 -0
  37. package/dist/lib/neutral/containers/index.mjs +13 -0
  38. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  39. package/dist/lib/neutral/create-channel-UW2LSL4G.mjs +41 -0
  40. package/dist/lib/neutral/create-channel-UW2LSL4G.mjs.map +7 -0
  41. package/dist/lib/neutral/create-object-RLCOUVAW.mjs +46 -0
  42. package/dist/lib/neutral/create-object-RLCOUVAW.mjs.map +7 -0
  43. package/dist/lib/neutral/hooks/index.mjs +11 -0
  44. package/dist/lib/neutral/index.mjs +34 -0
  45. package/dist/lib/neutral/meta.json +1 -0
  46. package/dist/lib/neutral/meta.mjs +10 -0
  47. package/dist/lib/neutral/navigation-resolver-4X4HCQYX.mjs +14 -0
  48. package/dist/lib/neutral/navigation-resolver-4X4HCQYX.mjs.map +7 -0
  49. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
  50. package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
  51. package/dist/lib/neutral/operations/index.mjs +8 -0
  52. package/dist/lib/neutral/plugin.mjs +16 -0
  53. package/dist/lib/neutral/plugin.mjs.map +7 -0
  54. package/dist/lib/neutral/react-surface-G6KT7TSU.mjs +48 -0
  55. package/dist/lib/neutral/react-surface-G6KT7TSU.mjs.map +7 -0
  56. package/dist/lib/neutral/translations.mjs +91 -0
  57. package/dist/lib/neutral/translations.mjs.map +7 -0
  58. package/dist/lib/neutral/types/index.mjs +16 -0
  59. package/dist/types/src/ThreadPlugin.d.ts +3 -1
  60. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  61. package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
  62. package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
  63. package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
  64. package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
  65. package/dist/types/src/ThreadPlugin.workerd.d.ts +4 -0
  66. package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
  68. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/channel-backend-feed.d.ts +13 -0
  70. package/dist/types/src/capabilities/channel-backend-feed.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/create-object.d.ts +11 -0
  72. package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/index.d.ts +12 -14
  74. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  75. package/dist/types/src/capabilities/navigation-resolver.d.ts +6 -0
  76. package/dist/types/src/capabilities/navigation-resolver.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  78. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  80. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  81. package/dist/types/src/components/Chat/Chat.d.ts +43 -0
  82. package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
  83. package/dist/types/src/components/Chat/index.d.ts +2 -0
  84. package/dist/types/src/components/Chat/index.d.ts.map +1 -0
  85. package/dist/types/src/components/index.d.ts +1 -10
  86. package/dist/types/src/components/index.d.ts.map +1 -1
  87. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +19 -0
  88. package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
  89. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
  90. package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
  91. package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
  92. package/dist/types/src/containers/ChannelArticle/index.d.ts.map +1 -0
  93. package/dist/types/src/containers/ChannelCreatePanel/ChannelCreatePanel.d.ts +11 -0
  94. package/dist/types/src/containers/ChannelCreatePanel/ChannelCreatePanel.d.ts.map +1 -0
  95. package/dist/types/src/containers/ChannelCreatePanel/index.d.ts +2 -0
  96. package/dist/types/src/containers/ChannelCreatePanel/index.d.ts.map +1 -0
  97. package/dist/types/src/containers/ThreadArticle/ThreadArticle.d.ts +20 -0
  98. package/dist/types/src/containers/ThreadArticle/ThreadArticle.d.ts.map +1 -0
  99. package/dist/types/src/containers/ThreadArticle/ThreadArticle.stories.d.ts +162 -0
  100. package/dist/types/src/containers/ThreadArticle/ThreadArticle.stories.d.ts.map +1 -0
  101. package/dist/types/src/containers/ThreadArticle/index.d.ts +2 -0
  102. package/dist/types/src/containers/ThreadArticle/index.d.ts.map +1 -0
  103. package/dist/types/src/containers/index.d.ts +5 -0
  104. package/dist/types/src/containers/index.d.ts.map +1 -0
  105. package/dist/types/src/hooks/index.d.ts +1 -4
  106. package/dist/types/src/hooks/index.d.ts.map +1 -1
  107. package/dist/types/src/hooks/useMessages.d.ts +4 -0
  108. package/dist/types/src/hooks/useMessages.d.ts.map +1 -0
  109. package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
  110. package/dist/types/src/index.d.ts +2 -3
  111. package/dist/types/src/index.d.ts.map +1 -1
  112. package/dist/types/src/meta.d.ts +3 -4
  113. package/dist/types/src/meta.d.ts.map +1 -1
  114. package/dist/types/src/operations/append-channel-message.d.ts +5 -0
  115. package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
  116. package/dist/types/src/operations/create-channel.d.ts +5 -0
  117. package/dist/types/src/operations/create-channel.d.ts.map +1 -0
  118. package/dist/types/src/operations/index.d.ts +3 -0
  119. package/dist/types/src/operations/index.d.ts.map +1 -0
  120. package/dist/types/src/paths.d.ts +3 -0
  121. package/dist/types/src/paths.d.ts.map +1 -0
  122. package/dist/types/src/plugin.d.ts +4 -0
  123. package/dist/types/src/plugin.d.ts.map +1 -0
  124. package/dist/types/src/translations.d.ts +142 -72
  125. package/dist/types/src/translations.d.ts.map +1 -1
  126. package/dist/types/src/types/ThreadCapabilities.d.ts +37 -0
  127. package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
  128. package/dist/types/src/types/ThreadOperation.d.ts +91 -0
  129. package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
  130. package/dist/types/src/types/channel-backend.d.ts +16 -0
  131. package/dist/types/src/types/channel-backend.d.ts.map +1 -0
  132. package/dist/types/src/types/channel-backend.test.d.ts +2 -0
  133. package/dist/types/src/types/channel-backend.test.d.ts.map +1 -0
  134. package/dist/types/src/types/index.d.ts +3 -2
  135. package/dist/types/src/types/index.d.ts.map +1 -1
  136. package/dist/types/src/util.d.ts +4 -20
  137. package/dist/types/src/util.d.ts.map +1 -1
  138. package/dist/types/tsconfig.tsbuildinfo +1 -1
  139. package/package.json +108 -81
  140. package/src/ThreadPlugin.node.ts +26 -0
  141. package/src/ThreadPlugin.test.ts +27 -0
  142. package/src/ThreadPlugin.tsx +38 -144
  143. package/src/ThreadPlugin.workerd.ts +25 -0
  144. package/src/capabilities/app-graph-builder.ts +44 -174
  145. package/src/capabilities/channel-backend-feed.ts +60 -0
  146. package/src/capabilities/create-object.ts +46 -0
  147. package/src/capabilities/index.ts +11 -11
  148. package/src/capabilities/navigation-resolver.ts +18 -0
  149. package/src/capabilities/operation-handler.ts +16 -0
  150. package/src/capabilities/react-surface.tsx +39 -79
  151. package/src/components/Chat/Chat.tsx +119 -0
  152. package/src/components/Chat/index.ts +5 -0
  153. package/src/components/index.ts +1 -14
  154. package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +108 -0
  155. package/src/containers/ChannelArticle/ChannelArticle.tsx +83 -0
  156. package/src/containers/ChannelArticle/index.ts +5 -0
  157. package/src/containers/ChannelCreatePanel/ChannelCreatePanel.tsx +52 -0
  158. package/src/containers/ChannelCreatePanel/index.ts +5 -0
  159. package/src/containers/ThreadArticle/ThreadArticle.stories.tsx +86 -0
  160. package/src/containers/ThreadArticle/ThreadArticle.tsx +75 -0
  161. package/src/containers/ThreadArticle/index.ts +5 -0
  162. package/src/containers/index.ts +9 -0
  163. package/src/hooks/index.ts +1 -4
  164. package/src/hooks/useMessages.ts +37 -0
  165. package/src/index.ts +4 -4
  166. package/src/meta.ts +27 -9
  167. package/src/operations/append-channel-message.ts +31 -0
  168. package/src/operations/create-channel.ts +30 -0
  169. package/src/operations/index.ts +10 -0
  170. package/src/paths.ts +10 -0
  171. package/src/plugin.ts +11 -0
  172. package/src/translations.ts +75 -73
  173. package/src/types/ThreadCapabilities.ts +47 -0
  174. package/src/types/ThreadOperation.ts +49 -0
  175. package/src/types/channel-backend.test.ts +48 -0
  176. package/src/types/channel-backend.ts +54 -0
  177. package/src/types/index.ts +3 -2
  178. package/src/util.ts +35 -18
  179. package/src/vite-env.d.ts +10 -0
  180. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
  181. package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
  182. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs +0 -171
  183. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
  184. package/dist/lib/browser/call-manager-XRRCAVLI.mjs +0 -24
  185. package/dist/lib/browser/call-manager-XRRCAVLI.mjs.map +0 -7
  186. package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
  187. package/dist/lib/browser/chunk-2CWJBXBH.mjs.map +0 -7
  188. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  189. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  190. package/dist/lib/browser/chunk-DW7JD64V.mjs +0 -137
  191. package/dist/lib/browser/chunk-DW7JD64V.mjs.map +0 -7
  192. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  193. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  194. package/dist/lib/browser/chunk-FY4ZRD5X.mjs +0 -367
  195. package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
  196. package/dist/lib/browser/chunk-GERVMFQW.mjs +0 -31
  197. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  198. package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
  199. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
  200. package/dist/lib/browser/chunk-JGKMMI65.mjs +0 -56
  201. package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
  202. package/dist/lib/browser/chunk-TUFWPOVS.mjs +0 -1698
  203. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
  204. package/dist/lib/browser/chunk-X5PIP5YR.mjs +0 -149
  205. package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs +0 -984
  207. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
  208. package/dist/lib/browser/index.mjs +0 -302
  209. package/dist/lib/browser/index.mjs.map +0 -7
  210. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs +0 -369
  211. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
  212. package/dist/lib/browser/markdown-WZSXCEZJ.mjs +0 -169
  213. package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +0 -7
  214. package/dist/lib/browser/meta.json +0 -1
  215. package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
  216. package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
  217. package/dist/lib/browser/react-surface-PYAMIADB.mjs +0 -109
  218. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
  219. package/dist/lib/browser/settings-AC6YSASL.mjs +0 -22
  220. package/dist/lib/browser/settings-AC6YSASL.mjs.map +0 -7
  221. package/dist/lib/browser/state-2T4KDWBX.mjs +0 -34
  222. package/dist/lib/browser/state-2T4KDWBX.mjs.map +0 -7
  223. package/dist/lib/browser/types/index.mjs +0 -16
  224. package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
  225. package/dist/lib/node-esm/ChatContainer-2CT4PJ7I.mjs +0 -16
  226. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs +0 -172
  227. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
  228. package/dist/lib/node-esm/call-manager-EI7FXRAU.mjs +0 -25
  229. package/dist/lib/node-esm/call-manager-EI7FXRAU.mjs.map +0 -7
  230. package/dist/lib/node-esm/chunk-4TME3BR4.mjs +0 -1699
  231. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-57XR3LEF.mjs +0 -33
  233. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
  235. package/dist/lib/node-esm/chunk-6CRHHOST.mjs.map +0 -7
  236. package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
  237. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +0 -7
  238. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  239. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  240. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  241. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  242. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs +0 -58
  243. package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
  244. package/dist/lib/node-esm/chunk-SED3O2XO.mjs +0 -150
  245. package/dist/lib/node-esm/chunk-SED3O2XO.mjs.map +0 -7
  246. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
  247. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
  248. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs +0 -138
  249. package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
  250. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs +0 -985
  251. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
  252. package/dist/lib/node-esm/index.mjs +0 -303
  253. package/dist/lib/node-esm/index.mjs.map +0 -7
  254. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs +0 -370
  255. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
  256. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs +0 -170
  257. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +0 -7
  258. package/dist/lib/node-esm/meta.json +0 -1
  259. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
  260. package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
  261. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs +0 -110
  262. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
  263. package/dist/lib/node-esm/settings-N52O7MLS.mjs +0 -23
  264. package/dist/lib/node-esm/settings-N52O7MLS.mjs.map +0 -7
  265. package/dist/lib/node-esm/state-62TQKQVB.mjs +0 -35
  266. package/dist/lib/node-esm/state-62TQKQVB.mjs.map +0 -7
  267. package/dist/lib/node-esm/types/index.mjs +0 -17
  268. package/dist/types/src/calls/call-manager.d.ts +0 -77
  269. package/dist/types/src/calls/call-manager.d.ts.map +0 -1
  270. package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
  271. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
  272. package/dist/types/src/calls/index.d.ts +0 -7
  273. package/dist/types/src/calls/index.d.ts.map +0 -1
  274. package/dist/types/src/calls/media-manager.d.ts +0 -60
  275. package/dist/types/src/calls/media-manager.d.ts.map +0 -1
  276. package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
  277. package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
  278. package/dist/types/src/calls/types.d.ts +0 -45
  279. package/dist/types/src/calls/types.d.ts.map +0 -1
  280. package/dist/types/src/calls/util/audio.d.ts +0 -6
  281. package/dist/types/src/calls/util/audio.d.ts.map +0 -1
  282. package/dist/types/src/calls/util/calls-service.d.ts +0 -75
  283. package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
  284. package/dist/types/src/calls/util/history-cache.d.ts +0 -11
  285. package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
  286. package/dist/types/src/calls/util/index.d.ts +0 -5
  287. package/dist/types/src/calls/util/index.d.ts.map +0 -1
  288. package/dist/types/src/calls/util/media.d.ts +0 -6
  289. package/dist/types/src/calls/util/media.d.ts.map +0 -1
  290. package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
  291. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
  292. package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
  293. package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
  294. package/dist/types/src/calls-service.stories.d.ts +0 -22
  295. package/dist/types/src/calls-service.stories.d.ts.map +0 -1
  296. package/dist/types/src/capabilities/call-manager.d.ts +0 -5
  297. package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
  298. package/dist/types/src/capabilities/capabilities.d.ts +0 -27
  299. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  300. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  301. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  302. package/dist/types/src/capabilities/markdown.d.ts +0 -4
  303. package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
  304. package/dist/types/src/capabilities/react-root.d.ts +0 -7
  305. package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
  306. package/dist/types/src/capabilities/settings.d.ts +0 -4
  307. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  308. package/dist/types/src/capabilities/state.d.ts +0 -7
  309. package/dist/types/src/capabilities/state.d.ts.map +0 -1
  310. package/dist/types/src/components/Call/Call.d.ts +0 -17
  311. package/dist/types/src/components/Call/Call.d.ts.map +0 -1
  312. package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
  313. package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
  314. package/dist/types/src/components/Call/index.d.ts +0 -3
  315. package/dist/types/src/components/Call/index.d.ts.map +0 -1
  316. package/dist/types/src/components/CallDebugPanel.d.ts +0 -8
  317. package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
  318. package/dist/types/src/components/CallSidebar.d.ts +0 -4
  319. package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
  320. package/dist/types/src/components/ChannelContainer.d.ts +0 -14
  321. package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
  322. package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -10
  323. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
  324. package/dist/types/src/components/Chat.stories.d.ts +0 -7
  325. package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
  326. package/dist/types/src/components/ChatContainer.d.ts +0 -17
  327. package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
  328. package/dist/types/src/components/Comments.stories.d.ts +0 -6
  329. package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
  330. package/dist/types/src/components/CommentsContainer.d.ts +0 -13
  331. package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
  332. package/dist/types/src/components/CommentsThreadContainer.d.ts +0 -14
  333. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +0 -1
  334. package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
  335. package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
  336. package/dist/types/src/components/Lobby/index.d.ts +0 -2
  337. package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
  338. package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
  339. package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
  340. package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
  341. package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
  342. package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -8
  343. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
  344. package/dist/types/src/components/Media/index.d.ts +0 -3
  345. package/dist/types/src/components/Media/index.d.ts.map +0 -1
  346. package/dist/types/src/components/MessageContainer.d.ts +0 -11
  347. package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
  348. package/dist/types/src/components/Participant/Participant.d.ts +0 -6
  349. package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
  350. package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
  351. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
  352. package/dist/types/src/components/Participant/index.d.ts +0 -3
  353. package/dist/types/src/components/Participant/index.d.ts.map +0 -1
  354. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +0 -12
  355. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
  356. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -10
  357. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
  358. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
  359. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
  360. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -23
  361. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
  362. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
  363. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
  364. package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
  365. package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +0 -1
  366. package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
  367. package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
  368. package/dist/types/src/components/ThreadSettings.d.ts +0 -6
  369. package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
  370. package/dist/types/src/components/command-extension.d.ts +0 -3
  371. package/dist/types/src/components/command-extension.d.ts.map +0 -1
  372. package/dist/types/src/components/testing.d.ts +0 -4
  373. package/dist/types/src/components/testing.d.ts.map +0 -1
  374. package/dist/types/src/extensions/index.d.ts +0 -2
  375. package/dist/types/src/extensions/index.d.ts.map +0 -1
  376. package/dist/types/src/extensions/threads.d.ts +0 -9
  377. package/dist/types/src/extensions/threads.d.ts.map +0 -1
  378. package/dist/types/src/hooks/analytics.d.ts +0 -4
  379. package/dist/types/src/hooks/analytics.d.ts.map +0 -1
  380. package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
  381. package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
  382. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
  383. package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
  384. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
  385. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
  386. package/dist/types/src/testing/index.d.ts +0 -2
  387. package/dist/types/src/testing/index.d.ts.map +0 -1
  388. package/dist/types/src/testing/stories.d.ts +0 -2
  389. package/dist/types/src/testing/stories.d.ts.map +0 -1
  390. package/dist/types/src/types/schema.d.ts +0 -164
  391. package/dist/types/src/types/schema.d.ts.map +0 -1
  392. package/dist/types/src/types/types.d.ts +0 -388
  393. package/dist/types/src/types/types.d.ts.map +0 -1
  394. package/src/calls/call-manager.ts +0 -246
  395. package/src/calls/call-swarm-synchronizer.ts +0 -350
  396. package/src/calls/index.ts +0 -10
  397. package/src/calls/media-manager.ts +0 -349
  398. package/src/calls/speaking-monitor.ts +0 -85
  399. package/src/calls/types.ts +0 -70
  400. package/src/calls/util/audio.ts +0 -58
  401. package/src/calls/util/calls-service.ts +0 -531
  402. package/src/calls/util/history-cache.ts +0 -27
  403. package/src/calls/util/index.ts +0 -8
  404. package/src/calls/util/media.ts +0 -52
  405. package/src/calls/util/stub-media-streams.ts +0 -70
  406. package/src/calls/util/task-scheduling.ts +0 -92
  407. package/src/calls-service.stories.tsx +0 -216
  408. package/src/capabilities/call-manager.ts +0 -20
  409. package/src/capabilities/capabilities.ts +0 -33
  410. package/src/capabilities/intent-resolver.ts +0 -315
  411. package/src/capabilities/markdown.ts +0 -69
  412. package/src/capabilities/react-root.tsx +0 -17
  413. package/src/capabilities/settings.ts +0 -19
  414. package/src/capabilities/state.ts +0 -26
  415. package/src/components/Call/Call.tsx +0 -89
  416. package/src/components/Call/Toolbar.tsx +0 -182
  417. package/src/components/Call/index.ts +0 -6
  418. package/src/components/CallDebugPanel.tsx +0 -115
  419. package/src/components/CallSidebar.tsx +0 -18
  420. package/src/components/ChannelContainer.stories.tsx +0 -59
  421. package/src/components/ChannelContainer.tsx +0 -201
  422. package/src/components/Chat.stories.tsx +0 -89
  423. package/src/components/ChatContainer.tsx +0 -142
  424. package/src/components/Comments.stories.tsx +0 -93
  425. package/src/components/CommentsContainer.tsx +0 -72
  426. package/src/components/CommentsThreadContainer.tsx +0 -168
  427. package/src/components/Lobby/Lobby.tsx +0 -119
  428. package/src/components/Lobby/index.ts +0 -5
  429. package/src/components/Media/AudioStream.tsx +0 -67
  430. package/src/components/Media/VideoObject.stories.tsx +0 -53
  431. package/src/components/Media/VideoObject.tsx +0 -58
  432. package/src/components/Media/index.ts +0 -6
  433. package/src/components/MessageContainer.tsx +0 -152
  434. package/src/components/Participant/Participant.tsx +0 -57
  435. package/src/components/Participant/ParticipantGrid.tsx +0 -89
  436. package/src/components/Participant/index.ts +0 -6
  437. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +0 -55
  438. package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +0 -31
  439. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -157
  440. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
  441. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -131
  442. package/src/components/ResponsiveGrid/index.ts +0 -7
  443. package/src/components/ThreadComplementary.tsx +0 -151
  444. package/src/components/ThreadSettings.tsx +0 -17
  445. package/src/components/command-extension.ts +0 -33
  446. package/src/components/testing.ts +0 -29
  447. package/src/extensions/index.ts +0 -5
  448. package/src/extensions/threads.ts +0 -126
  449. package/src/hooks/analytics.ts +0 -40
  450. package/src/hooks/useDebugMode.ts +0 -25
  451. package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
  452. package/src/hooks/useVideoStreamTrack.tsx +0 -33
  453. package/src/testing/index.ts +0 -5
  454. package/src/testing/stories.ts +0 -54
  455. package/src/types/schema.ts +0 -33
  456. package/src/types/types.ts +0 -119
  457. package/src/typings/peermetrics-webrtc-stats.d.ts +0 -30
  458. package/src/typings.d.ts +0 -8
  459. /package/dist/lib/{browser/ChannelContainer-O2SFQJU7.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  460. /package/dist/lib/{browser/types → neutral/hooks}/index.mjs.map +0 -0
  461. /package/dist/lib/{node-esm/types → neutral}/index.mjs.map +0 -0
  462. /package/dist/lib/{browser/ChatContainer-PVT3DUZJ.mjs.map → neutral/meta.mjs.map} +0 -0
  463. /package/dist/lib/{node-esm/ChannelContainer-B2ZGAE4P.mjs.map → neutral/operations/index.mjs.map} +0 -0
  464. /package/dist/lib/{node-esm/ChatContainer-2CT4PJ7I.mjs.map → neutral/types/index.mjs.map} +0 -0
@@ -2,94 +2,96 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import { Type } from '@dxos/echo';
5
6
  import { type Resource } from '@dxos/react-ui';
7
+ import { Channel } from '@dxos/types';
6
8
 
7
- import { meta } from './meta';
8
- import { ChannelType } from './types';
9
+ import { meta } from '#meta';
9
10
 
10
11
  export const translations = [
11
12
  {
12
13
  'en-US': {
13
- [ChannelType.typename]: {
14
- 'typename label': 'Channel',
15
- 'typename label_zero': 'Channels',
16
- 'typename label_one': 'Channel',
17
- 'typename label_other': 'Channels',
18
- 'object name placeholder': 'New channel',
19
- 'rename object label': 'Rename channel',
20
- 'delete object label': 'Delete channel',
14
+ // TODO(burdon): Thread.
15
+ [Type.getTypename(Channel.Channel)]: {
16
+ 'typename.label': 'Channel',
17
+ 'typename.label_zero': 'Channels',
18
+ 'typename.label_one': 'Channel',
19
+ 'typename.label_other': 'Channels',
20
+ 'object-name.placeholder': 'New channel',
21
+ 'add-object.label': 'Add channel',
22
+ 'rename-object.label': 'Rename channel',
23
+ 'delete-object.label': 'Delete channel',
24
+ 'object-deleted.label': 'Channel deleted',
21
25
  },
22
26
  [meta.id]: {
23
- 'plugin name': 'Chat',
24
- 'channel title label': 'Title',
25
- 'message placeholder': 'Reply…',
26
- 'activity message': 'Processing…',
27
- 'anonymous label': 'Anonymous',
28
- 'delete message block label': 'Delete message block',
29
- 'detached thread label': 'Referenced content was removed',
30
- 'delete thread label': 'Delete thread',
31
- 'resolve thread label': 'Resolve thread',
32
- 'thread deleted label': 'Thread deleted',
33
- 'message deleted label': 'Message deleted',
34
- 'comments heading': 'Comments',
35
- 'chat heading': 'Chat',
36
- 'draft button': 'DRAFT',
37
- 'no comments title': 'Comments',
38
- 'no comments message':
27
+ 'plugin.name': 'Chat',
28
+ 'channel-title.label': 'Title',
29
+ 'message.placeholder': 'Reply…',
30
+ 'activity.message': 'Processing…',
31
+ 'anonymous.label': 'Anonymous',
32
+ 'delete-message-block.label': 'Delete message block',
33
+ 'detached-thread.label': 'Referenced content was removed',
34
+ 'delete-thread.label': 'Delete thread',
35
+ 'resolve-thread.label': 'Resolve thread',
36
+ 'thread-deleted.label': 'Thread deleted',
37
+ 'message-deleted.label': 'Message deleted',
38
+ 'comments.heading': 'Comments',
39
+ 'chat.heading': 'Chat',
40
+ 'draft.button': 'DRAFT',
41
+ 'no-comments.title': 'Comments',
42
+ 'no-comments.message':
39
43
  'Click on the <commentIcon></commentIcon> button in the document toolbar to create a comment thread on the selected text.',
40
- 'toggle show resolved': 'Show resolved',
41
- 'unnamed object threads label': 'Threads',
42
- 'mark as resolved label': 'Mark as resolved',
43
- 'mark as unresolved label': 'Mark as unresolved',
44
- 'save message label': 'Save',
45
- 'edit message label': 'Edit',
46
- 'delete message label': 'Delete message',
47
- 'open comments panel label': 'Show Comments',
48
- 'comments label': 'Comments',
49
- 'show all label': 'All comments',
50
- 'show unresolved label': 'Unresolved comments',
44
+ 'toggle-show-resolved.label': 'Show resolved',
45
+ 'unnamed-object-threads.label': 'Threads',
46
+ 'mark-as-resolved.label': 'Mark as resolved',
47
+ 'mark-as-unresolved.label': 'Mark as unresolved',
48
+ 'save-message.label': 'Save',
49
+ 'edit-message.label': 'Edit',
50
+ 'delete-message.label': 'Delete message',
51
+ 'accept-proposal.label': 'Accept proposal',
52
+ 'open-comments-panel.label': 'Show Comments',
53
+ 'comments.label': 'Comments',
54
+ 'show-all.label': 'All comments',
55
+ 'show-unresolved.label': 'Unresolved comments',
56
+ 'add-comment.label': 'Add comment',
51
57
 
52
- 'channel companion label': 'Channel',
53
- 'call panel label': 'Active Call',
58
+ 'channel-companion.label': 'Channel',
59
+ 'call-panel.label': 'Active Call',
54
60
 
55
- 'display name label': 'Display name',
56
- 'display name description': 'Set your display name before joining a meeting.',
57
- 'display name input placeholder': 'Enter your name',
58
- 'set display name label': 'Continue',
61
+ 'display-name.label': 'Display name',
62
+ 'display-name.description': 'Set your display name before joining a meeting.',
63
+ 'display-name-input.placeholder': 'Enter your name',
64
+ 'set-display-name.label': 'Continue',
59
65
 
60
- 'call tab label': 'Call',
61
- 'meeting status title': 'Meeting',
62
- 'share meeting link label': 'Share meeting',
63
- 'show webrtc stats title': 'Detailed WebRTC Stats',
66
+ 'call-tab.label': 'Call',
67
+ 'meeting-status.title': 'Calls',
68
+ 'share-meeting-link.label': 'Share meeting',
69
+ 'show-webrtc-stats.title': 'WebRTC Stats',
70
+ 'show-calls-history.title': 'Service History',
64
71
 
65
- 'meeting summary label': 'Summary',
66
- 'summarize label': 'Summarize',
67
- 'summarizing label': 'Creating summary...',
68
- 'create summary message': 'A summary doesn’t exist for this meeting yet. Create one now?',
72
+ 'meeting-summary.label': 'Summary',
73
+ 'summarize.label': 'Summarize',
74
+ 'summarizing.label': 'Creating summary...',
75
+ 'create-summary.message': 'A summary doesn’t exist for this meeting yet. Create one now?',
69
76
 
70
- 'join call': 'Join',
71
- 'leave call': 'Leave',
77
+ 'icon-pin.label': 'Pin video',
78
+ 'icon-unpin.label': 'Unpin video',
79
+ 'icon-wave.label': 'Waving',
80
+ 'icon-muted.label': 'Muted',
81
+ 'join-call.button': 'Join',
82
+ 'leave-call.button': 'Leave',
83
+ 'mic-on.button': 'Unmute',
84
+ 'mic-off.button': 'Mute',
85
+ 'camera-on.button': 'Turn camera on',
86
+ 'camera-off.button': 'Turn camera off',
87
+ 'camera-off.label': 'Camera off',
88
+ 'raise-hand.button': 'Raise hand',
89
+ 'lower-hand.button': 'Lower hand',
90
+ 'screenshare-on.button': 'Share screen',
91
+ 'screenshare-off.button': 'Stop streaming',
72
92
 
73
- 'lobby participants_zero': 'No participants',
74
- 'lobby participants_one': '1 participant',
75
- 'lobby participants_other': '{{count}} participants',
76
-
77
- 'icon pin': 'Pin video',
78
- 'icon unpin': 'Unpin video',
79
- 'icon wave': 'Waving',
80
- 'icon muted': 'Muted',
81
- 'icon speaking': 'Speaking',
82
-
83
- 'mic on': 'Unmute',
84
- 'mic off': 'Mute',
85
- 'camera on': 'Turn camera on',
86
- 'camera off': 'Turn camera off',
87
- 'camera off label': 'Camera off',
88
-
89
- 'raise hand': 'Raise hand',
90
- 'lower hand': 'Lower hand',
91
- 'screenshare on': 'Share screen',
92
- 'screenshare off': 'Stop streaming',
93
+ 'channel-toolbar.title': 'Channel actions',
94
+ 'start-video-call.menu': 'Start video call',
93
95
  },
94
96
  },
95
97
  },
@@ -0,0 +1,47 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // @import-as-namespace
6
+
7
+ import * as Effect from 'effect/Effect';
8
+ import type * as Schema from 'effect/Schema';
9
+
10
+ import { Capability } from '@dxos/app-framework';
11
+ import { type Obj } from '@dxos/echo';
12
+ import { type Channel, type Message } from '@dxos/types';
13
+
14
+ import { meta } from '#meta';
15
+
16
+ /**
17
+ * A pluggable message backend for a `Channel`. Providers are contributed by
18
+ * plugins and resolved by `Channel.backend.kind`.
19
+ */
20
+ export interface ChannelBackendProvider {
21
+ /** Stable backend id; matches `Channel.backend.kind`. */
22
+ kind: string;
23
+ /** Human-readable label shown in the create-channel form. */
24
+ label: string;
25
+ /** Icon name (phosphor) for the create-channel form. */
26
+ icon?: string;
27
+ /**
28
+ * Per-backend create-form inputs (a struct; excludes the `kind` discriminant
29
+ * and the channel `name`, which the panel adds). Empty struct when the backend
30
+ * needs no extra input (e.g. the local feed).
31
+ */
32
+ createFields: Schema.Schema.AnyNoContext;
33
+ /** Builds the provider's config object from the collected create-form inputs. */
34
+ makeConfig: (options: Record<string, unknown>) => Obj.Any;
35
+ /**
36
+ * Subscribes to the channel's messages. Invokes `onMessages` with the current
37
+ * list immediately and on every change. Returns an unsubscribe function.
38
+ */
39
+ subscribe: (channel: Channel.Channel, onMessages: (messages: readonly Message.Message[]) => void) => () => void;
40
+ /** Sends a message through the backend. */
41
+ send: (channel: Channel.Channel, message: Message.Message) => Effect.Effect<void, Error, Capability.Service>;
42
+ /** Whether the channel is read-only. Defaults to "channel has foreign-key Obj.Meta". */
43
+ readOnly?: (channel: Channel.Channel) => boolean;
44
+ }
45
+
46
+ /** Registry of channel-message backends. Collect with `Capability.getAll`. */
47
+ export const ChannelBackend = Capability.make<ChannelBackendProvider>(`${meta.id}.capability.channel-backend`);
@@ -0,0 +1,49 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ // @import-as-namespace
6
+
7
+ import * as Schema from 'effect/Schema';
8
+
9
+ import { Capability } from '@dxos/app-framework';
10
+ import { Operation } from '@dxos/compute';
11
+ import { Key, Type, DXN } from '@dxos/echo';
12
+ import { Actor, Channel } from '@dxos/types';
13
+
14
+ import { meta } from '#meta';
15
+
16
+ const makeKey = (name: string) => DXN.make(`${meta.id}.operation.${name}`);
17
+
18
+ export const CreateChannel = Operation.make({
19
+ meta: { key: makeKey('createChannel'), name: 'Create Channel', icon: 'ph--hash--regular' },
20
+ services: [Capability.Service],
21
+ input: Schema.Struct({
22
+ spaceId: Key.SpaceId,
23
+ name: Schema.optional(Schema.String),
24
+ /** Backend provider id; defaults to the local feed backend. */
25
+ kind: Schema.optional(Schema.String),
26
+ /** Per-backend create options passed to the provider's makeConfig. */
27
+ options: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),
28
+ }),
29
+ output: Schema.Struct({
30
+ object: Type.getSchema(Channel.Channel),
31
+ }),
32
+ });
33
+
34
+ export const AppendChannelMessage = Operation.make({
35
+ meta: {
36
+ key: makeKey('appendChannelMessage'),
37
+ name: 'Append Channel Message',
38
+ icon: 'ph--chat-text--regular',
39
+ },
40
+ // Note: Feed.FeedService is provided inside the handler from space.queues, not at the
41
+ // operation level — the runtime can't fulfill it without a space context.
42
+ services: [Capability.Service],
43
+ input: Schema.Struct({
44
+ channel: Type.getSchema(Channel.Channel),
45
+ sender: Actor.Actor,
46
+ text: Schema.String,
47
+ }),
48
+ output: Schema.Void,
49
+ });
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as Schema from 'effect/Schema';
7
+ import { describe, test } from 'vitest';
8
+
9
+ import { Feed } from '@dxos/echo';
10
+
11
+ import { buildChannelFormSchema, resolveProvider } from './channel-backend';
12
+ import * as ThreadCapabilities from './ThreadCapabilities';
13
+
14
+ describe('channel-backend helpers', () => {
15
+ test('resolveProvider finds by kind', ({ expect }) => {
16
+ const providers = [fakeProvider('a', Schema.Struct({})), fakeProvider('b', Schema.Struct({}))];
17
+ expect(resolveProvider(providers, 'b')?.kind).to.eq('b');
18
+ expect(resolveProvider(providers, 'missing')).to.be.undefined;
19
+ });
20
+
21
+ test('buildChannelFormSchema with a single empty-field provider is just a name field', ({ expect }) => {
22
+ const schema = buildChannelFormSchema([fakeProvider('feed', Schema.Struct({}))]);
23
+ const value = Schema.decodeUnknownSync(schema)({ name: 'general' });
24
+ expect(value.name).to.eq('general');
25
+ expect(value.backend).to.be.undefined;
26
+ });
27
+
28
+ test('buildChannelFormSchema with multiple providers builds a discriminated backend union', ({ expect }) => {
29
+ const schema = buildChannelFormSchema([
30
+ fakeProvider('feed', Schema.Struct({})),
31
+ fakeProvider('atproto', Schema.Struct({ channelId: Schema.String })),
32
+ ]);
33
+ const feedValue = Schema.decodeUnknownSync(schema)({ name: 'x', backend: { kind: 'feed' } });
34
+ expect(feedValue.backend.kind).to.eq('feed');
35
+ const atValue = Schema.decodeUnknownSync(schema)({ name: 'y', backend: { kind: 'atproto', channelId: 'c' } });
36
+ expect(atValue.backend.kind).to.eq('atproto');
37
+ expect(atValue.backend.channelId).to.eq('c');
38
+ });
39
+ });
40
+
41
+ const fakeProvider = (kind: string, fields: Schema.Schema.AnyNoContext): ThreadCapabilities.ChannelBackendProvider => ({
42
+ kind,
43
+ label: kind,
44
+ createFields: fields,
45
+ makeConfig: () => Feed.make(),
46
+ subscribe: () => () => {},
47
+ send: () => Effect.void,
48
+ });
@@ -0,0 +1,54 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Schema from 'effect/Schema';
6
+ import * as SchemaAST from 'effect/SchemaAST';
7
+
8
+ import * as ThreadCapabilities from './ThreadCapabilities';
9
+
10
+ /** Finds the provider matching a `Channel.backend.kind`. */
11
+ export const resolveProvider = (
12
+ providers: readonly ThreadCapabilities.ChannelBackendProvider[],
13
+ kind: string,
14
+ ): ThreadCapabilities.ChannelBackendProvider | undefined => providers.find((provider) => provider.kind === kind);
15
+
16
+ /** Throws if two providers share a `kind` (which would make resolution order-dependent). */
17
+ export const assertUniqueKinds = (providers: readonly ThreadCapabilities.ChannelBackendProvider[]): void => {
18
+ const seen = new Set<string>();
19
+ for (const provider of providers) {
20
+ if (seen.has(provider.kind)) {
21
+ throw new Error(`Duplicate channel backend kind: ${provider.kind}`);
22
+ }
23
+ seen.add(provider.kind);
24
+ }
25
+ };
26
+
27
+ /**
28
+ * Builds the create-channel form schema from the registered providers.
29
+ *
30
+ * With a single provider whose create-fields are empty the form is just a
31
+ * `name` field (today's behaviour). With multiple providers (or extra fields)
32
+ * it becomes `{ name?, backend: Union(<{ kind: Literal(p.kind) } & p.createFields>) }`,
33
+ * which react-ui-form renders as a `kind` Select plus the selected branch's fields.
34
+ */
35
+ export const buildChannelFormSchema = (
36
+ providers: readonly ThreadCapabilities.ChannelBackendProvider[],
37
+ ): Schema.Schema.AnyNoContext => {
38
+ assertUniqueKinds(providers);
39
+ const needsSelector = providers.length > 1 || providers.some((provider) => fieldCount(provider.createFields) > 0);
40
+ if (!needsSelector) {
41
+ return Schema.Struct({ name: Schema.optional(Schema.String) });
42
+ }
43
+
44
+ const branches = providers.map((provider) =>
45
+ Schema.extend(Schema.Struct({ kind: Schema.Literal(provider.kind) }), provider.createFields),
46
+ );
47
+ const backend = branches.length === 1 ? branches[0] : Schema.Union(...branches);
48
+ return Schema.Struct({
49
+ name: Schema.optional(Schema.String),
50
+ backend,
51
+ });
52
+ };
53
+
54
+ const fieldCount = (schema: Schema.Schema.AnyNoContext): number => SchemaAST.getPropertySignatures(schema.ast).length;
@@ -2,5 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './schema';
6
- export * from './types';
5
+ export * from './channel-backend';
6
+ export * as ThreadCapabilities from './ThreadCapabilities';
7
+ export * as ThreadOperation from './ThreadOperation';
package/src/util.ts CHANGED
@@ -2,37 +2,54 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Match } from 'effect';
6
-
7
5
  import { generateName } from '@dxos/display-name';
8
- import { type Selection } from '@dxos/plugin-attention';
9
- import { type PublicKey } from '@dxos/react-client';
10
6
  import { type Identity } from '@dxos/react-client/halo';
11
7
  import { type MessageMetadata } from '@dxos/react-ui-thread';
12
- import { hexToFallback } from '@dxos/util';
8
+ import { hexToFallback, toFallback } from '@dxos/util';
13
9
 
14
- export type MessagePropertiesProvider = (identityKey: PublicKey | undefined) => MessageMetadata;
10
+ /**
11
+ * Stable hash for an arbitrary string — used as the avatar-fallback seed for
12
+ * external senders who have no DXOS identity (e.g. Slack/Discord-synced
13
+ * messages). djb2-ish, only stability matters.
14
+ *
15
+ * Coerced to unsigned 32-bit via `>>> 0` because `toFallback` does a plain
16
+ * modulo against `idEmoji.length * idHue.length` and JavaScript's `%`
17
+ * preserves the sign of the dividend — a negative hash would index
18
+ * `idEmoji[-x]` and `idHue[-x]` to `undefined`, causing the avatar to fall
19
+ * through to `Avatar.Content`'s default red/ghost.
20
+ */
21
+ const hashString = (s: string): number => {
22
+ let h = 0;
23
+ for (let i = 0; i < s.length; i++) {
24
+ h = (h * 31 + s.charCodeAt(i)) | 0;
25
+ }
26
+ return h >>> 0;
27
+ };
15
28
 
16
- export const getMessageMetadata = (id: string, identity?: Identity): MessageMetadata => {
17
- const fallback = hexToFallback(identity?.identityKey.toHex() ?? '0');
29
+ export const getMessageMetadata = (
30
+ id: string,
31
+ identity?: Identity,
32
+ /**
33
+ * Externally-sourced sender info (Slack/Discord/etc). Used only when no
34
+ * matching DXOS `identity` is available — provides `name`/`email` for the
35
+ * author label and a stable seed for the avatar fallback.
36
+ */
37
+ fallbackSender?: { name?: string; email?: string },
38
+ ): MessageMetadata => {
39
+ const fallback = identity?.identityKey
40
+ ? hexToFallback(identity.identityKey.toHex())
41
+ : toFallback(hashString(fallbackSender?.name ?? fallbackSender?.email ?? '0'));
18
42
  return {
19
43
  id,
20
44
  authorId: identity?.did,
21
45
  authorName:
22
46
  identity?.profile?.displayName ??
23
- (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined),
47
+ (identity?.identityKey ? generateName(identity.identityKey.toHex()) : undefined) ??
48
+ fallbackSender?.name ??
49
+ fallbackSender?.email,
24
50
  authorAvatarProps: {
25
51
  hue: identity?.profile?.data?.hue ?? fallback.hue,
26
52
  emoji: identity?.profile?.data?.emoji ?? fallback.emoji,
27
53
  },
28
54
  };
29
55
  };
30
-
31
- export const getAnchor = Match.type<Selection | undefined>().pipe(
32
- Match.when({ mode: 'single' }, (s) => s.id),
33
- Match.when({ mode: 'multi' }, (s) => (s.ids.length > 0 ? s.ids.join(',') : undefined)),
34
- Match.when({ mode: 'range' }, (s) => (s.from && s.to ? `${s.from}:${s.to}` : undefined)),
35
- Match.when({ mode: 'multi-range' }, (s) => s.ranges[0] && `${s.ranges[0].from}:${s.ranges[0].to}`),
36
- Match.when(undefined, () => undefined),
37
- Match.exhaustive,
38
- );
@@ -0,0 +1,10 @@
1
+ /// <reference types="vite/client" />
2
+
3
+ //
4
+ // Copyright 2026 DXOS.org
5
+ //
6
+
7
+ declare module '*.mdl?raw' {
8
+ const content: string;
9
+ export default content;
10
+ }
@@ -1,16 +0,0 @@
1
- import {
2
- ChannelContainer,
3
- ChannelContainer_default
4
- } from "./chunk-ZJ7QBXK6.mjs";
5
- import "./chunk-2CWJBXBH.mjs";
6
- import "./chunk-4APCDRSH.mjs";
7
- import "./chunk-J3JO5NWO.mjs";
8
- import "./chunk-X5PIP5YR.mjs";
9
- import "./chunk-GERVMFQW.mjs";
10
- import "./chunk-JGKMMI65.mjs";
11
- import "./chunk-EV4JWI7L.mjs";
12
- export {
13
- ChannelContainer,
14
- ChannelContainer_default as default
15
- };
16
- //# sourceMappingURL=ChannelContainer-O2SFQJU7.mjs.map
@@ -1,15 +0,0 @@
1
- import {
2
- ChatContainer,
3
- ChatContainer_default,
4
- ChatHeading
5
- } from "./chunk-J3JO5NWO.mjs";
6
- import "./chunk-X5PIP5YR.mjs";
7
- import "./chunk-GERVMFQW.mjs";
8
- import "./chunk-JGKMMI65.mjs";
9
- import "./chunk-EV4JWI7L.mjs";
10
- export {
11
- ChatContainer,
12
- ChatHeading,
13
- ChatContainer_default as default
14
- };
15
- //# sourceMappingURL=ChatContainer-PVT3DUZJ.mjs.map