@dxos/plugin-thread 0.8.4-main.5ea62a8 → 0.8.4-main.ae835ea

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 (244) hide show
  1. package/dist/lib/browser/ChannelContainer-SVV4ZX5T.mjs +16 -0
  2. package/dist/lib/browser/ChatContainer-ALFWQ65B.mjs +15 -0
  3. package/dist/lib/browser/{app-graph-builder-FHAOPO57.mjs → app-graph-builder-ACBXRBOS.mjs} +20 -20
  4. package/dist/lib/browser/app-graph-builder-ACBXRBOS.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-EW2QC6Q4.mjs → call-manager-P3MYR2JS.mjs} +7 -7
  6. package/dist/lib/browser/{call-manager-EW2QC6Q4.mjs.map → call-manager-P3MYR2JS.mjs.map} +1 -1
  7. package/dist/lib/browser/{chunk-H63NDV62.mjs → chunk-6CUDBEYP.mjs} +12 -11
  8. package/dist/lib/browser/chunk-6CUDBEYP.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-BBTXGRIR.mjs +18 -0
  10. package/dist/lib/browser/chunk-BBTXGRIR.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
  12. package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
  13. package/dist/lib/browser/{chunk-TQJYDFBU.mjs → chunk-DJOUMWEL.mjs} +20 -18
  14. package/dist/lib/browser/chunk-DJOUMWEL.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-2P3GVRHP.mjs → chunk-HDEQRBOC.mjs} +2 -2
  16. package/dist/lib/browser/{chunk-2P3GVRHP.mjs.map → chunk-HDEQRBOC.mjs.map} +2 -2
  17. package/dist/lib/browser/{chunk-J26C57ZY.mjs → chunk-IQSXEHOW.mjs} +139 -69
  18. package/dist/lib/browser/chunk-IQSXEHOW.mjs.map +7 -0
  19. package/dist/lib/browser/chunk-K2DUJRFJ.mjs +27 -0
  20. package/dist/lib/browser/chunk-K2DUJRFJ.mjs.map +7 -0
  21. package/dist/lib/browser/chunk-L6F2AG6W.mjs +23 -0
  22. package/dist/lib/browser/{chunk-TUSBPMNU.mjs → chunk-US5ZQYC3.mjs} +267 -367
  23. package/dist/lib/browser/chunk-US5ZQYC3.mjs.map +7 -0
  24. package/dist/lib/browser/chunk-UTSLSZED.mjs +178 -0
  25. package/dist/lib/browser/chunk-UTSLSZED.mjs.map +7 -0
  26. package/dist/lib/browser/{chunk-KEXJGF2R.mjs → chunk-XYUJXHYV.mjs} +53 -3
  27. package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
  28. package/dist/lib/browser/index.mjs +23 -22
  29. package/dist/lib/browser/index.mjs.map +3 -3
  30. package/dist/lib/browser/{intent-resolver-IB5GYU2D.mjs → intent-resolver-5POQTZ24.mjs} +25 -34
  31. package/dist/lib/browser/intent-resolver-5POQTZ24.mjs.map +7 -0
  32. package/dist/lib/browser/{markdown-Z677YORA.mjs → markdown-L7LDNF56.mjs} +9 -9
  33. package/dist/lib/browser/markdown-L7LDNF56.mjs.map +7 -0
  34. package/dist/lib/browser/meta.json +1 -1
  35. package/dist/lib/browser/react-root-RCJLK4EP.mjs +28 -0
  36. package/dist/lib/browser/react-root-RCJLK4EP.mjs.map +7 -0
  37. package/dist/lib/browser/{react-surface-X2VB6P37.mjs → react-surface-IC576W2W.mjs} +27 -27
  38. package/dist/lib/browser/react-surface-IC576W2W.mjs.map +7 -0
  39. package/dist/lib/browser/{settings-GRKEID73.mjs → settings-5FYGBOGI.mjs} +5 -5
  40. package/dist/lib/browser/{settings-GRKEID73.mjs.map → settings-5FYGBOGI.mjs.map} +1 -1
  41. package/dist/lib/browser/{state-2T4KDWBX.mjs → state-36REWXO5.mjs} +5 -5
  42. package/dist/lib/browser/{state-2T4KDWBX.mjs.map → state-36REWXO5.mjs.map} +1 -1
  43. package/dist/lib/browser/toolkit-PXASLYEQ.mjs +74 -0
  44. package/dist/lib/browser/toolkit-PXASLYEQ.mjs.map +7 -0
  45. package/dist/lib/browser/types/index.mjs +7 -9
  46. package/dist/lib/node-esm/ChannelContainer-63GMQ753.mjs +17 -0
  47. package/dist/lib/node-esm/{ChatContainer-4EGHKHIU.mjs → ChatContainer-MFKPXMIK.mjs} +6 -6
  48. package/dist/lib/node-esm/{app-graph-builder-XEYWX5FC.mjs → app-graph-builder-JXD7KY3G.mjs} +20 -20
  49. package/dist/lib/node-esm/app-graph-builder-JXD7KY3G.mjs.map +7 -0
  50. package/dist/lib/node-esm/{call-manager-N3KASRDQ.mjs → call-manager-FCEFP7EJ.mjs} +7 -7
  51. package/dist/lib/node-esm/{call-manager-N3KASRDQ.mjs.map → call-manager-FCEFP7EJ.mjs.map} +1 -1
  52. package/dist/lib/node-esm/{chunk-CTZ75IFK.mjs → chunk-2MMJF7DW.mjs} +2 -2
  53. package/dist/lib/node-esm/{chunk-CTZ75IFK.mjs.map → chunk-2MMJF7DW.mjs.map} +2 -2
  54. package/dist/lib/node-esm/{chunk-S3D7DTBF.mjs → chunk-2V3WSLUZ.mjs} +53 -3
  55. package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
  56. package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
  57. package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
  58. package/dist/lib/node-esm/chunk-AFDO2SUZ.mjs +25 -0
  59. package/dist/lib/node-esm/{chunk-JR7KESLL.mjs → chunk-KGYDYYKJ.mjs} +267 -367
  60. package/dist/lib/node-esm/chunk-KGYDYYKJ.mjs.map +7 -0
  61. package/dist/lib/node-esm/{chunk-UHZQTPXU.mjs → chunk-NWUUMKVQ.mjs} +12 -11
  62. package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs.map +7 -0
  63. package/dist/lib/node-esm/{chunk-NNKKNW57.mjs → chunk-Q7AKKZNY.mjs} +139 -69
  64. package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs.map +7 -0
  65. package/dist/lib/node-esm/{chunk-CCE5LHBE.mjs → chunk-QCQAAU6J.mjs} +20 -18
  66. package/dist/lib/node-esm/chunk-QCQAAU6J.mjs.map +7 -0
  67. package/dist/lib/node-esm/chunk-TYLLHI46.mjs +179 -0
  68. package/dist/lib/node-esm/chunk-TYLLHI46.mjs.map +7 -0
  69. package/dist/lib/node-esm/chunk-XI45H4IV.mjs +28 -0
  70. package/dist/lib/node-esm/chunk-XI45H4IV.mjs.map +7 -0
  71. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs +19 -0
  72. package/dist/lib/node-esm/chunk-ZQAGII7M.mjs.map +7 -0
  73. package/dist/lib/node-esm/index.mjs +23 -22
  74. package/dist/lib/node-esm/index.mjs.map +3 -3
  75. package/dist/lib/node-esm/{intent-resolver-VIMI5VLH.mjs → intent-resolver-63NV3XD2.mjs} +25 -34
  76. package/dist/lib/node-esm/intent-resolver-63NV3XD2.mjs.map +7 -0
  77. package/dist/lib/node-esm/{markdown-FL4IXLRP.mjs → markdown-ZQW7MI5U.mjs} +9 -9
  78. package/dist/lib/node-esm/markdown-ZQW7MI5U.mjs.map +7 -0
  79. package/dist/lib/node-esm/meta.json +1 -1
  80. package/dist/lib/node-esm/react-root-4IDB2SN2.mjs +29 -0
  81. package/dist/lib/node-esm/react-root-4IDB2SN2.mjs.map +7 -0
  82. package/dist/lib/node-esm/{react-surface-OLN3XNND.mjs → react-surface-O4LGTAZ3.mjs} +27 -27
  83. package/dist/lib/node-esm/react-surface-O4LGTAZ3.mjs.map +7 -0
  84. package/dist/lib/node-esm/{settings-F2ODVNNW.mjs → settings-EOBQUZSW.mjs} +5 -5
  85. package/dist/lib/node-esm/{settings-F2ODVNNW.mjs.map → settings-EOBQUZSW.mjs.map} +1 -1
  86. package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-X3W67GTL.mjs} +5 -5
  87. package/dist/lib/node-esm/{state-62TQKQVB.mjs.map → state-X3W67GTL.mjs.map} +1 -1
  88. package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs +75 -0
  89. package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs.map +7 -0
  90. package/dist/lib/node-esm/types/index.mjs +7 -9
  91. package/dist/types/src/ThreadPlugin.d.ts +1 -1
  92. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  93. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  94. package/dist/types/src/calls/types.d.ts.map +1 -1
  95. package/dist/types/src/calls/util/calls-service.d.ts +2 -0
  96. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  97. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  98. package/dist/types/src/calls-service.stories.d.ts +0 -1
  99. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  100. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  102. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  104. package/dist/types/src/capabilities/toolkit.d.ts +21 -2
  105. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -1
  106. package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
  107. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  108. package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
  109. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  110. package/dist/types/src/components/ChannelContainer.d.ts +2 -2
  111. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  112. package/dist/types/src/components/ChannelContainer.stories.d.ts +74 -8
  113. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/Chat.stories.d.ts +74 -6
  115. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/ChatContainer.d.ts +6 -5
  117. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  118. package/dist/types/src/components/Comments.stories.d.ts +3 -2
  119. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  121. package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
  122. package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
  123. package/dist/types/src/components/Media/VideoObject.stories.d.ts +5 -3
  124. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +4 -2
  126. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +4 -2
  128. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/ThreadSettings.d.ts +1 -1
  130. package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
  131. package/dist/types/src/components/index.d.ts +1 -1
  132. package/dist/types/src/components/index.d.ts.map +1 -1
  133. package/dist/types/src/components/testing.d.ts +3 -3
  134. package/dist/types/src/components/testing.d.ts.map +1 -1
  135. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  136. package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
  137. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  138. package/dist/types/src/meta.d.ts +1 -2
  139. package/dist/types/src/meta.d.ts.map +1 -1
  140. package/dist/types/src/testing/stories.d.ts.map +1 -1
  141. package/dist/types/src/translations.d.ts +73 -6
  142. package/dist/types/src/translations.d.ts.map +1 -1
  143. package/dist/types/src/types/Channel.d.ts +16 -0
  144. package/dist/types/src/types/Channel.d.ts.map +1 -0
  145. package/dist/types/src/types/{schema.d.ts → Thread.d.ts} +18 -28
  146. package/dist/types/src/types/Thread.d.ts.map +1 -0
  147. package/dist/types/src/types/index.d.ts +2 -1
  148. package/dist/types/src/types/index.d.ts.map +1 -1
  149. package/dist/types/src/types/types.d.ts +37 -50
  150. package/dist/types/src/types/types.d.ts.map +1 -1
  151. package/dist/types/tsconfig.tsbuildinfo +1 -1
  152. package/package.json +59 -59
  153. package/src/ThreadPlugin.tsx +133 -130
  154. package/src/calls/call-manager.ts +1 -1
  155. package/src/calls/media-manager.ts +2 -1
  156. package/src/calls/types.ts +7 -3
  157. package/src/calls/util/calls-service.ts +12 -7
  158. package/src/calls/util/stub-media-streams.ts +60 -2
  159. package/src/calls-service.stories.tsx +2 -5
  160. package/src/capabilities/app-graph-builder.ts +17 -14
  161. package/src/capabilities/capabilities.ts +7 -7
  162. package/src/capabilities/intent-resolver.ts +14 -19
  163. package/src/capabilities/react-root.tsx +2 -2
  164. package/src/capabilities/react-surface.tsx +15 -15
  165. package/src/capabilities/toolkit.ts +18 -11
  166. package/src/components/Call/Toolbar.tsx +6 -6
  167. package/src/components/CallDebugPanel.tsx +108 -49
  168. package/src/components/ChannelContainer.stories.tsx +9 -9
  169. package/src/components/ChannelContainer.tsx +14 -11
  170. package/src/components/Chat.stories.tsx +13 -18
  171. package/src/components/ChatContainer.tsx +26 -17
  172. package/src/components/Comments.stories.tsx +8 -13
  173. package/src/components/CommentsContainer.tsx +2 -2
  174. package/src/components/CommentsThreadContainer.tsx +19 -14
  175. package/src/components/Media/VideoObject.stories.tsx +12 -7
  176. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +3 -4
  177. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +3 -4
  178. package/src/components/ThreadComplementary.tsx +7 -7
  179. package/src/components/ThreadSettings.tsx +4 -5
  180. package/src/components/testing.ts +5 -5
  181. package/src/extensions/threads.ts +5 -5
  182. package/src/hooks/useVideoStreamTrack.tsx +1 -1
  183. package/src/meta.ts +9 -5
  184. package/src/testing/stories.ts +3 -6
  185. package/src/translations.ts +5 -3
  186. package/src/types/Channel.ts +27 -0
  187. package/src/types/Thread.ts +26 -0
  188. package/src/types/index.ts +2 -1
  189. package/src/types/types.ts +10 -9
  190. package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
  191. package/src/util.ts +1 -1
  192. package/dist/lib/browser/ChannelContainer-GHDNEZT2.mjs +0 -16
  193. package/dist/lib/browser/ChatContainer-42ALOWUA.mjs +0 -15
  194. package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-2I277V52.mjs +0 -23
  196. package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
  197. package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
  198. package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
  199. package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
  200. package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
  201. package/dist/lib/browser/chunk-H63NDV62.mjs.map +0 -7
  202. package/dist/lib/browser/chunk-J26C57ZY.mjs.map +0 -7
  203. package/dist/lib/browser/chunk-KEXJGF2R.mjs.map +0 -7
  204. package/dist/lib/browser/chunk-KTWYVC5X.mjs +0 -147
  205. package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +0 -7
  206. package/dist/lib/browser/chunk-TQJYDFBU.mjs.map +0 -7
  207. package/dist/lib/browser/chunk-TUSBPMNU.mjs.map +0 -7
  208. package/dist/lib/browser/intent-resolver-IB5GYU2D.mjs.map +0 -7
  209. package/dist/lib/browser/markdown-Z677YORA.mjs.map +0 -7
  210. package/dist/lib/browser/react-root-PTTTW2MO.mjs +0 -28
  211. package/dist/lib/browser/react-root-PTTTW2MO.mjs.map +0 -7
  212. package/dist/lib/browser/react-surface-X2VB6P37.mjs.map +0 -7
  213. package/dist/lib/browser/toolkit-KUPIIFC6.mjs +0 -80
  214. package/dist/lib/browser/toolkit-KUPIIFC6.mjs.map +0 -7
  215. package/dist/lib/node-esm/ChannelContainer-D5E2S6AI.mjs +0 -17
  216. package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs.map +0 -7
  217. package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
  218. package/dist/lib/node-esm/chunk-CCE5LHBE.mjs.map +0 -7
  219. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
  220. package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
  221. package/dist/lib/node-esm/chunk-JR7KESLL.mjs.map +0 -7
  222. package/dist/lib/node-esm/chunk-NNKKNW57.mjs.map +0 -7
  223. package/dist/lib/node-esm/chunk-P6E247RF.mjs +0 -148
  224. package/dist/lib/node-esm/chunk-P6E247RF.mjs.map +0 -7
  225. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs +0 -19
  226. package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
  227. package/dist/lib/node-esm/chunk-S3D7DTBF.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-UHZQTPXU.mjs.map +0 -7
  229. package/dist/lib/node-esm/chunk-UJ2QNRLS.mjs +0 -25
  230. package/dist/lib/node-esm/intent-resolver-VIMI5VLH.mjs.map +0 -7
  231. package/dist/lib/node-esm/markdown-FL4IXLRP.mjs.map +0 -7
  232. package/dist/lib/node-esm/react-root-2HHRRUME.mjs +0 -29
  233. package/dist/lib/node-esm/react-root-2HHRRUME.mjs.map +0 -7
  234. package/dist/lib/node-esm/react-surface-OLN3XNND.mjs.map +0 -7
  235. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs +0 -81
  236. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs.map +0 -7
  237. package/dist/types/src/types/schema.d.ts.map +0 -1
  238. package/src/types/schema.ts +0 -33
  239. /package/dist/lib/browser/{ChannelContainer-GHDNEZT2.mjs.map → ChannelContainer-SVV4ZX5T.mjs.map} +0 -0
  240. /package/dist/lib/browser/{ChatContainer-42ALOWUA.mjs.map → ChatContainer-ALFWQ65B.mjs.map} +0 -0
  241. /package/dist/lib/browser/{chunk-2I277V52.mjs.map → chunk-L6F2AG6W.mjs.map} +0 -0
  242. /package/dist/lib/node-esm/{ChannelContainer-D5E2S6AI.mjs.map → ChannelContainer-63GMQ753.mjs.map} +0 -0
  243. /package/dist/lib/node-esm/{ChatContainer-4EGHKHIU.mjs.map → ChatContainer-MFKPXMIK.mjs.map} +0 -0
  244. /package/dist/lib/node-esm/{chunk-UJ2QNRLS.mjs.map → chunk-AFDO2SUZ.mjs.map} +0 -0
@@ -2,8 +2,6 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
8
6
  import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
9
7
 
@@ -14,8 +12,8 @@ import { log } from '@dxos/log';
14
12
  import { Config, useConfig } from '@dxos/react-client';
15
13
  import { withClientProvider } from '@dxos/react-client/testing';
16
14
  import { Button } from '@dxos/react-ui';
15
+ import { withTheme } from '@dxos/react-ui/testing';
17
16
  import { Json } from '@dxos/react-ui-syntax-highlighter';
18
- import { withLayout, withTheme } from '@dxos/storybook-utils';
19
17
 
20
18
  const testVideo = new URL('../testing/video.mp4', import.meta.url).href;
21
19
 
@@ -177,6 +175,7 @@ const meta = {
177
175
  title: 'plugins/plugin-thread/calls-service',
178
176
  render: DefaultStory,
179
177
  decorators: [
178
+ withTheme,
180
179
  withClientProvider({
181
180
  config: new Config({
182
181
  runtime: {
@@ -186,8 +185,6 @@ const meta = {
186
185
  },
187
186
  }),
188
187
  }),
189
- withTheme,
190
- withLayout(),
191
188
  ],
192
189
  parameters: {
193
190
  layout: 'centered',
@@ -3,7 +3,8 @@
3
3
  //
4
4
 
5
5
  import { Rx } from '@effect-rx/rx-react';
6
- import { Option, pipe } from 'effect';
6
+ import * as Function from 'effect/Function';
7
+ import * as Option from 'effect/Option';
7
8
 
8
9
  import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
9
10
  import { Obj } from '@dxos/echo';
@@ -12,8 +13,8 @@ import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE, PLANK_COMPANION_TYPE }
12
13
  import { ROOT_ID, createExtension, rxFromSignal } from '@dxos/plugin-graph';
13
14
  import { fullyQualifiedId } from '@dxos/react-client/echo';
14
15
 
15
- import { THREAD_PLUGIN, meta } from '../meta';
16
- import { ChannelType, ThreadAction } from '../types';
16
+ import { meta } from '../meta';
17
+ import { Channel, ThreadAction } from '../types';
17
18
  import { getAnchor } from '../util';
18
19
 
19
20
  import { ThreadCapabilities } from './capabilities';
@@ -26,10 +27,10 @@ export default (context: PluginContext) => {
26
27
 
27
28
  return contributes(Capabilities.AppGraphBuilder, [
28
29
  createExtension({
29
- id: `${THREAD_PLUGIN}/active-call`,
30
+ id: `${meta.id}/active-call`,
30
31
  connector: (node) =>
31
32
  Rx.make((get) =>
32
- pipe(
33
+ Function.pipe(
33
34
  get(node),
34
35
  Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
35
36
  Option.map((node) => {
@@ -43,7 +44,7 @@ export default (context: PluginContext) => {
43
44
  type: DECK_COMPANION_TYPE,
44
45
  data: null,
45
46
  properties: {
46
- label: ['call panel label', { ns: THREAD_PLUGIN }],
47
+ label: ['call panel label', { ns: meta.id }],
47
48
  icon: 'ph--video-conference--regular',
48
49
  position: 'hoist',
49
50
  disposition: 'hidden',
@@ -61,12 +62,14 @@ export default (context: PluginContext) => {
61
62
  // TODO(wittjosiah): The channel shouldn't become the companion during a call.
62
63
  // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.
63
64
  createExtension({
64
- id: `${THREAD_PLUGIN}/channel-chat-companion`,
65
+ id: `${meta.id}/channel-chat-companion`,
65
66
  connector: (node) => {
66
67
  return Rx.make((get) => {
67
- return pipe(
68
+ return Function.pipe(
68
69
  get(node),
69
- Option.flatMap((node) => (Obj.instanceOf(ChannelType, node.data) ? Option.some(node.data) : Option.none())),
70
+ Option.flatMap((node) =>
71
+ Obj.instanceOf(Channel.Channel, node.data) ? Option.some(node.data) : Option.none(),
72
+ ),
70
73
  Option.map((channel) => {
71
74
  const callManager = context.getCapability(ThreadCapabilities.CallManager);
72
75
  const joined = get(
@@ -82,7 +85,7 @@ export default (context: PluginContext) => {
82
85
  type: PLANK_COMPANION_TYPE,
83
86
  data: 'chat',
84
87
  properties: {
85
- label: ['channel companion label', { ns: THREAD_PLUGIN }],
88
+ label: ['channel companion label', { ns: meta.id }],
86
89
  icon: 'ph--hash--regular',
87
90
  position: 'hoist',
88
91
  disposition: 'hidden',
@@ -99,10 +102,10 @@ export default (context: PluginContext) => {
99
102
  id: `${meta.id}/comments-companion`,
100
103
  connector: (node) =>
101
104
  Rx.make((get) =>
102
- pipe(
105
+ Function.pipe(
103
106
  get(node),
104
107
  Option.flatMap((node) => {
105
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
108
+ if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
106
109
  return Option.none();
107
110
  }
108
111
  const metadata = resolve(Obj.getTypename(node.data)!);
@@ -129,10 +132,10 @@ export default (context: PluginContext) => {
129
132
  id: `${meta.id}/comment-toolbar`,
130
133
  actions: (node) =>
131
134
  Rx.make((get) =>
132
- pipe(
135
+ Function.pipe(
133
136
  get(node),
134
137
  Option.flatMap((node) => {
135
- if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {
138
+ if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
136
139
  return Option.none();
137
140
  }
138
141
  const metadata = resolve(Obj.getTypename(node.data)!);
@@ -6,28 +6,28 @@ import { defineCapability } from '@dxos/app-framework';
6
6
  import { type DeepReadonly } from '@dxos/util';
7
7
 
8
8
  import { type CallManager, type CallState, type MediaState } from '../calls';
9
- import { THREAD_PLUGIN } from '../meta';
10
- import { type ChannelType, type ThreadState, type ViewState } from '../types';
9
+ import { meta } from '../meta';
10
+ import { type Channel, type ThreadState, type ViewState } from '../types';
11
11
 
12
12
  export namespace ThreadCapabilities {
13
- export const CallManager = defineCapability<CallManager>(`${THREAD_PLUGIN}/capability/call-manager`);
13
+ export const CallManager = defineCapability<CallManager>(`${meta.id}/capability/call-manager`);
14
14
 
15
15
  // TODO(burdon): Better way to define specific extensions for meeting companions.
16
16
  // TODO(burdon): This brings in deps from ../calls; how should we manage/minimize explicit type exposure to other plugins?
17
17
  // TODO(wittjosiah): These callbacks could be intents once we support broadcast.
18
18
  export type CallProperties = {
19
- onJoin: (state: { channel?: ChannelType; roomId?: string }) => Promise<void>;
19
+ onJoin: (state: { channel?: Channel.Channel; roomId?: string }) => Promise<void>;
20
20
  onLeave: (roomId?: string) => Promise<void>;
21
21
  onCallStateUpdated: (callState: CallState) => Promise<void>;
22
22
  onMediaStateUpdated: ([mediaState, isSpeaking]: [MediaState, boolean]) => Promise<void>;
23
23
  };
24
- export const CallExtension = defineCapability<CallProperties>(`${THREAD_PLUGIN}/capability/call-extension`);
24
+ export const CallExtension = defineCapability<CallProperties>(`${meta.id}/capability/call-extension`);
25
25
 
26
26
  type GetViewState = (subjectId: string) => ViewState;
27
27
  export const State = defineCapability<{ state: DeepReadonly<ThreadState>; getViewState: GetViewState }>(
28
- `${THREAD_PLUGIN}/capability/state`,
28
+ `${meta.id}/capability/state`,
29
29
  );
30
30
  export const MutableState = defineCapability<{ state: ThreadState; getViewState: GetViewState }>(
31
- `${THREAD_PLUGIN}/capability/state`,
31
+ `${meta.id}/capability/state`,
32
32
  );
33
33
  }
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { Effect } from 'effect';
5
+ import * as Effect from 'effect/Effect';
6
6
 
7
7
  import { Capabilities, type PluginContext, contributes, createIntent, createResolver } from '@dxos/app-framework';
8
8
  import { sleep } from '@dxos/async';
@@ -14,20 +14,20 @@ import { CollectionAction, SpaceAction } from '@dxos/plugin-space/types';
14
14
  import { Ref, fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
15
15
  import { AnchoredTo, DataType } from '@dxos/schema';
16
16
 
17
- import { THREAD_PLUGIN } from '../meta';
18
- import { ChannelType, ThreadAction, ThreadType } from '../types';
17
+ import { meta } from '../meta';
18
+ import { Channel, Thread, ThreadAction } from '../types';
19
19
 
20
20
  import { ThreadCapabilities } from './capabilities';
21
21
 
22
22
  export default (context: PluginContext) =>
23
23
  contributes(Capabilities.IntentResolver, [
24
24
  createResolver({
25
- intent: ThreadAction.OnSpaceCreated,
25
+ intent: ThreadAction.onCreateSpace,
26
26
  resolve: ({ space, rootCollection }) =>
27
27
  Effect.gen(function* () {
28
28
  const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
29
29
  const { object: collection } = yield* dispatch(
30
- createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(ChannelType) }),
30
+ createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(Channel.Channel) }),
31
31
  );
32
32
  rootCollection.objects.push(Ref.make(collection));
33
33
 
@@ -41,18 +41,14 @@ export default (context: PluginContext) =>
41
41
  intent: ThreadAction.CreateChannel,
42
42
  resolve: ({ name }) => ({
43
43
  data: {
44
- object: Obj.make(ChannelType, {
45
- name,
46
- defaultThread: Ref.make(Obj.make(ThreadType, { messages: [], status: 'active' })),
47
- threads: [],
48
- }),
44
+ object: Channel.make({ name }),
49
45
  },
50
46
  }),
51
47
  }),
52
48
  createResolver({
53
49
  intent: ThreadAction.CreateChannelThread,
54
50
  resolve: ({ channel }) => {
55
- const thread = Obj.make(ThreadType, { messages: [], status: 'active' });
51
+ const thread = Thread.make({ status: 'active' });
56
52
  channel.threads.push(Ref.make(thread));
57
53
  return {
58
54
  data: {
@@ -70,7 +66,7 @@ export default (context: PluginContext) =>
70
66
 
71
67
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
72
68
  const subjectId = fullyQualifiedId(subject);
73
- const thread = Obj.make(ThreadType, { name, messages: [], status: 'staged' });
69
+ const thread = Thread.make({ name });
74
70
  const anchor = Relation.make(AnchoredTo, {
75
71
  [Relation.Source]: thread,
76
72
  [Relation.Target]: subject,
@@ -98,7 +94,6 @@ export default (context: PluginContext) =>
98
94
  createResolver({
99
95
  intent: ThreadAction.AddProposal,
100
96
  resolve: ({ text, anchor, sender, subject }) => {
101
- console.log('add-proposal', text, anchor, sender, subject);
102
97
  const space = getSpace(subject);
103
98
  invariant(space, 'Space not found');
104
99
 
@@ -108,7 +103,7 @@ export default (context: PluginContext) =>
108
103
  sender,
109
104
  blocks: [{ _tag: 'proposal', text }],
110
105
  });
111
- const thread = Obj.make(ThreadType, { name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });
106
+ const thread = Thread.make({ name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });
112
107
 
113
108
  return {
114
109
  intents: [
@@ -165,7 +160,7 @@ export default (context: PluginContext) =>
165
160
  createResolver({
166
161
  intent: ThreadAction.Delete,
167
162
  resolve: async ({ subject, anchor, thread: _thread }, undo) => {
168
- const thread = _thread ?? (Relation.getSource(anchor) as ThreadType);
163
+ const thread = _thread ?? (Relation.getSource(anchor) as Thread.Thread);
169
164
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
170
165
  const subjectId = fullyQualifiedId(subject);
171
166
  const draft = state.drafts[subjectId];
@@ -191,7 +186,7 @@ export default (context: PluginContext) =>
191
186
 
192
187
  return {
193
188
  undoable: {
194
- message: ['thread deleted label', { ns: THREAD_PLUGIN }],
189
+ message: ['thread deleted label', { ns: meta.id }],
195
190
  data: { thread, anchor },
196
191
  },
197
192
  intents: [
@@ -227,7 +222,7 @@ export default (context: PluginContext) =>
227
222
  createResolver({
228
223
  intent: ThreadAction.AddMessage,
229
224
  resolve: ({ anchor, subject, sender, text }) => {
230
- const thread = Relation.getSource(anchor) as ThreadType;
225
+ const thread = Relation.getSource(anchor) as Thread.Thread;
231
226
  const { state } = context.getCapability(ThreadCapabilities.MutableState);
232
227
  const subjectId = fullyQualifiedId(subject);
233
228
  const space = getSpace(subject);
@@ -289,7 +284,7 @@ export default (context: PluginContext) =>
289
284
  createResolver({
290
285
  intent: ThreadAction.DeleteMessage,
291
286
  resolve: ({ subject, anchor, messageId, message, messageIndex }, undo) => {
292
- const thread = Relation.getSource(anchor) as ThreadType;
287
+ const thread = Relation.getSource(anchor) as Thread.Thread;
293
288
  const space = getSpace(subject);
294
289
  invariant(space, 'Space not found');
295
290
 
@@ -311,7 +306,7 @@ export default (context: PluginContext) =>
311
306
 
312
307
  return {
313
308
  undoable: {
314
- message: ['message deleted label', { ns: THREAD_PLUGIN }],
309
+ message: ['message deleted label', { ns: meta.id }],
315
310
  data: { message, messageIndex },
316
311
  },
317
312
  intents: [
@@ -7,11 +7,11 @@ import React from 'react';
7
7
  import { Capabilities, contributes } from '@dxos/app-framework';
8
8
 
9
9
  import { Call } from '../components';
10
- import { THREAD_PLUGIN } from '../meta';
10
+ import { meta } from '../meta';
11
11
 
12
12
  export default () => {
13
13
  return contributes(Capabilities.ReactRoot, {
14
- id: THREAD_PLUGIN,
14
+ id: meta.id,
15
15
  root: () => <Call.Audio />,
16
16
  });
17
17
  };
@@ -17,24 +17,24 @@ import {
17
17
  ThreadComplementary,
18
18
  ThreadSettings,
19
19
  } from '../components';
20
- import { THREAD_PLUGIN } from '../meta';
21
- import { ChannelType, type ThreadSettingsProps, ThreadType } from '../types';
20
+ import { meta } from '../meta';
21
+ import { Channel, Thread, type ThreadSettingsProps } from '../types';
22
22
 
23
23
  import { ThreadCapabilities } from './capabilities';
24
24
 
25
25
  export default () =>
26
26
  contributes(Capabilities.ReactSurface, [
27
27
  createSurface({
28
- id: `${THREAD_PLUGIN}/channel`,
28
+ id: `${meta.id}/channel`,
29
29
  role: 'article',
30
- filter: (data): data is { subject: ChannelType } => Obj.instanceOf(ChannelType, data.subject),
30
+ filter: (data): data is { subject: Channel.Channel } => Obj.instanceOf(Channel.Channel, data.subject),
31
31
  component: ({ data: { subject: channel }, role }) => <ChannelContainer channel={channel} role={role} />,
32
32
  }),
33
33
  createSurface({
34
- id: `${THREAD_PLUGIN}/chat-companion`,
34
+ id: `${meta.id}/chat-companion`,
35
35
  role: 'article',
36
- filter: (data): data is { companionTo: ChannelType; subject: 'chat' } =>
37
- Obj.instanceOf(ChannelType, data.companionTo) && data.subject === 'chat',
36
+ filter: (data): data is { companionTo: Channel.Channel; subject: 'chat' } =>
37
+ Obj.instanceOf(Channel.Channel, data.companionTo) && data.subject === 'chat',
38
38
  component: ({ data: { companionTo: channel } }) => {
39
39
  const space = getSpace(channel);
40
40
  const thread = channel.defaultThread.target;
@@ -46,9 +46,9 @@ export default () =>
46
46
  },
47
47
  }),
48
48
  createSurface({
49
- id: `${THREAD_PLUGIN}/thread`,
49
+ id: `${meta.id}/thread`,
50
50
  role: 'article',
51
- filter: (data): data is { subject: ThreadType } => Obj.instanceOf(ThreadType, data.subject),
51
+ filter: (data): data is { subject: Thread.Thread } => Obj.instanceOf(Thread.Thread, data.subject),
52
52
  component: ({ data: { subject: thread } }) => {
53
53
  const space = getSpace(thread);
54
54
  if (!space || !thread) {
@@ -59,27 +59,27 @@ export default () =>
59
59
  },
60
60
  }),
61
61
  createSurface({
62
- id: `${THREAD_PLUGIN}/comments`,
62
+ id: `${meta.id}/comments`,
63
63
  role: 'article',
64
- filter: (data): data is { companionTo: { threads: Ref.Ref<ThreadType>[] } } =>
64
+ filter: (data): data is { companionTo: { threads: Ref.Ref<Thread.Thread>[] } } =>
65
65
  data.subject === 'comments' && Obj.isObject(data.companionTo),
66
66
  // TODO(wittjosiah): This isn't scrolling properly in a plank.
67
67
  component: ({ data }) => <ThreadComplementary subject={data.companionTo} />,
68
68
  }),
69
69
  createSurface({
70
- id: `${THREAD_PLUGIN}/plugin-settings`,
70
+ id: `${meta.id}/plugin-settings`,
71
71
  role: 'article',
72
72
  filter: (data): data is { subject: SettingsStore<ThreadSettingsProps> } =>
73
- data.subject instanceof SettingsStore && data.subject.prefix === THREAD_PLUGIN,
73
+ data.subject instanceof SettingsStore && data.subject.prefix === meta.id,
74
74
  component: ({ data: { subject } }) => <ThreadSettings settings={subject.value} />,
75
75
  }),
76
76
  createSurface({
77
- id: `${THREAD_PLUGIN}/assistant`,
77
+ id: `${meta.id}/assistant`,
78
78
  role: 'deck-companion--active-call',
79
79
  component: () => <CallSidebar />,
80
80
  }),
81
81
  createSurface({
82
- id: `${THREAD_PLUGIN}/devtools-overview`,
82
+ id: `${meta.id}/devtools-overview`,
83
83
  role: 'devtools-overview',
84
84
  component: () => {
85
85
  const call = useCapability(ThreadCapabilities.CallManager);
@@ -2,8 +2,12 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { AiTool, AiToolkit } from '@effect/ai';
6
- import { Array, Effect, Schema, pipe } from 'effect';
5
+ import * as Tool from '@effect/ai/Tool';
6
+ import * as Toolkit from '@effect/ai/Toolkit';
7
+ import * as Array from 'effect/Array';
8
+ import * as Effect from 'effect/Effect';
9
+ import * as Function from 'effect/Function';
10
+ import * as Schema from 'effect/Schema';
7
11
 
8
12
  import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
9
13
  import { ArtifactId, computeDiffsWithCursors } from '@dxos/assistant';
@@ -16,8 +20,8 @@ import { trim } from '@dxos/util';
16
20
  import { ThreadAction } from '../types';
17
21
 
18
22
  // TODO(wittjosiah): How to make this work for more than Documents?
19
- class Toolkit extends AiToolkit.make(
20
- AiTool.make('add-proposals', {
23
+ const Toolkit$ = Toolkit.make(
24
+ Tool.make('add-proposals', {
21
25
  description: trim`
22
26
  Proposes a set of changes to a document.
23
27
  `,
@@ -30,9 +34,13 @@ class Toolkit extends AiToolkit.make(
30
34
  success: Schema.Any,
31
35
  failure: Schema.Never,
32
36
  }),
33
- ) {
34
- static layer = (context: PluginContext) =>
35
- Toolkit.toLayer({
37
+ );
38
+
39
+ export namespace ThreadToolkit {
40
+ export const Toolkit = Toolkit$;
41
+
42
+ export const createLayer = (context: PluginContext) =>
43
+ Toolkit$.toLayer({
36
44
  'add-proposals': ({ id, diffs: _diffs }) =>
37
45
  Effect.gen(function* () {
38
46
  // TODO(wittjosiah): Get capabilities via layers.
@@ -41,7 +49,6 @@ class Toolkit extends AiToolkit.make(
41
49
  const state = context.getCapability(Capabilities.Layout);
42
50
 
43
51
  const dxn = ArtifactId.toDXN(id, state.workspace as SpaceId);
44
-
45
52
  const echoDxn = dxn.asEchoDXN();
46
53
  if (!echoDxn) {
47
54
  throw new Error(`Invalid object ID: ${id}`);
@@ -55,7 +62,7 @@ class Toolkit extends AiToolkit.make(
55
62
 
56
63
  const content = yield* Effect.promise(() => object.content.load());
57
64
  const accessor = createDocAccessor(content, ['content']);
58
- yield* pipe(
65
+ yield* Function.pipe(
59
66
  computeDiffsWithCursors(accessor, _diffs),
60
67
  Array.map(({ cursor, text }) =>
61
68
  createIntent(ThreadAction.AddProposal, {
@@ -73,6 +80,6 @@ class Toolkit extends AiToolkit.make(
73
80
  }
74
81
 
75
82
  export default (context: PluginContext) => [
76
- contributes(Capabilities.Toolkit, Toolkit),
77
- contributes(Capabilities.ToolkitHandler, Toolkit.layer(context)),
83
+ contributes(Capabilities.Toolkit, ThreadToolkit.Toolkit),
84
+ contributes(Capabilities.ToolkitHandler, ThreadToolkit.createLayer(context)),
78
85
  ];
@@ -11,7 +11,7 @@ import {
11
11
  Icon,
12
12
  IconButton,
13
13
  type IconButtonProps,
14
- Toolbar as NativeToolbar,
14
+ Toolbar as NaturalToolbar,
15
15
  type ThemedClassName,
16
16
  toLocalizedString,
17
17
  useTranslation,
@@ -20,10 +20,10 @@ import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
20
20
 
21
21
  import { ThreadCapabilities } from '../../capabilities';
22
22
  import { meta } from '../../meta';
23
- import { type ChannelType } from '../../types';
23
+ import { type Channel } from '../../types';
24
24
 
25
25
  export type ToolbarProps = ThemedClassName<{
26
- channel?: ChannelType;
26
+ channel?: Channel.Channel;
27
27
  participants?: number;
28
28
  autoHideControls?: boolean;
29
29
  isInRoom?: boolean;
@@ -56,7 +56,7 @@ export const Toolbar = ({
56
56
  // TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.
57
57
  return (
58
58
  <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>
59
- <NativeToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>
59
+ <NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>
60
60
  <ToggleButton
61
61
  active={call.media.audioEnabled}
62
62
  state={{
@@ -95,7 +95,7 @@ export const Toolbar = ({
95
95
  <Icon icon='ph--users--regular' size={4} />
96
96
  <div>{participants}</div>
97
97
  </div>
98
- )) || <NativeToolbar.Separator variant='gap' />}
98
+ )) || <NaturalToolbar.Separator variant='gap' />}
99
99
 
100
100
  {call.joined && (
101
101
  <>
@@ -151,7 +151,7 @@ export const Toolbar = ({
151
151
  ) : (
152
152
  <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />
153
153
  )}
154
- </NativeToolbar.Root>
154
+ </NaturalToolbar.Root>
155
155
  </div>
156
156
  );
157
157
  };