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

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 (246) hide show
  1. package/dist/lib/browser/ChannelContainer-GHDNEZT2.mjs +16 -0
  2. package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs → ChatContainer-42ALOWUA.mjs} +4 -4
  3. package/dist/lib/browser/{app-graph-builder-N7BE5TYW.mjs → app-graph-builder-FHAOPO57.mjs} +5 -5
  4. package/dist/lib/browser/app-graph-builder-FHAOPO57.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-NIPDYUVD.mjs → call-manager-EW2QC6Q4.mjs} +4 -4
  6. package/dist/lib/browser/call-manager-EW2QC6Q4.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2I277V52.mjs +23 -0
  8. package/dist/lib/browser/{chunk-FR7KJPNY.mjs.map → chunk-2I277V52.mjs.map} +3 -3
  9. package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-2P3GVRHP.mjs} +38 -6
  10. package/dist/lib/{node-esm/chunk-25ABSYP2.mjs.map → browser/chunk-2P3GVRHP.mjs.map} +4 -4
  11. package/dist/lib/browser/{chunk-LGSDKXPF.mjs → chunk-4APCDRSH.mjs} +1 -1
  12. package/dist/lib/browser/{chunk-LGSDKXPF.mjs.map → chunk-4APCDRSH.mjs.map} +1 -1
  13. package/dist/lib/browser/chunk-H63NDV62.mjs +376 -0
  14. package/dist/lib/browser/chunk-H63NDV62.mjs.map +7 -0
  15. package/dist/lib/browser/chunk-J26C57ZY.mjs +548 -0
  16. package/dist/lib/browser/chunk-J26C57ZY.mjs.map +7 -0
  17. package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-KEXJGF2R.mjs} +4 -4
  18. package/dist/lib/browser/chunk-KEXJGF2R.mjs.map +7 -0
  19. package/dist/lib/browser/{chunk-GCLD5ESP.mjs → chunk-KTWYVC5X.mjs} +22 -12
  20. package/dist/lib/browser/chunk-KTWYVC5X.mjs.map +7 -0
  21. package/dist/lib/browser/{chunk-KWPRNHTK.mjs → chunk-TQJYDFBU.mjs} +232 -230
  22. package/dist/lib/browser/chunk-TQJYDFBU.mjs.map +7 -0
  23. package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-TUSBPMNU.mjs} +398 -174
  24. package/dist/lib/browser/chunk-TUSBPMNU.mjs.map +7 -0
  25. package/dist/lib/browser/index.mjs +18 -8
  26. package/dist/lib/browser/index.mjs.map +3 -3
  27. package/dist/lib/browser/{intent-resolver-JFGLZ6VI.mjs → intent-resolver-IB5GYU2D.mjs} +68 -9
  28. package/dist/lib/browser/intent-resolver-IB5GYU2D.mjs.map +7 -0
  29. package/dist/lib/browser/{markdown-M3FMR7OD.mjs → markdown-Z677YORA.mjs} +4 -4
  30. package/dist/lib/browser/markdown-Z677YORA.mjs.map +7 -0
  31. package/dist/lib/browser/meta.json +1 -1
  32. package/dist/lib/browser/{react-root-JEUSQXI6.mjs → react-root-PTTTW2MO.mjs} +9 -9
  33. package/dist/lib/browser/{react-surface-XWS6GIZY.mjs → react-surface-X2VB6P37.mjs} +9 -9
  34. package/dist/lib/browser/react-surface-X2VB6P37.mjs.map +7 -0
  35. package/dist/lib/browser/{settings-E32MTL7A.mjs → settings-GRKEID73.mjs} +2 -2
  36. package/dist/lib/browser/{state-H6CYONWE.mjs → state-2T4KDWBX.mjs} +2 -2
  37. package/dist/lib/browser/{state-H6CYONWE.mjs.map → state-2T4KDWBX.mjs.map} +2 -2
  38. package/dist/lib/browser/toolkit-KUPIIFC6.mjs +80 -0
  39. package/dist/lib/browser/toolkit-KUPIIFC6.mjs.map +7 -0
  40. package/dist/lib/browser/types/index.mjs +1 -1
  41. package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs → ChannelContainer-D5E2S6AI.mjs} +7 -7
  42. package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs → ChatContainer-4EGHKHIU.mjs} +4 -4
  43. package/dist/lib/node-esm/{app-graph-builder-VCW76Z6V.mjs → app-graph-builder-XEYWX5FC.mjs} +5 -5
  44. package/dist/lib/node-esm/app-graph-builder-XEYWX5FC.mjs.map +7 -0
  45. package/dist/lib/node-esm/{call-manager-D6O5ZJJ4.mjs → call-manager-N3KASRDQ.mjs} +4 -4
  46. package/dist/lib/node-esm/call-manager-N3KASRDQ.mjs.map +7 -0
  47. package/dist/lib/node-esm/{chunk-C3XFMUAY.mjs → chunk-CCE5LHBE.mjs} +232 -230
  48. package/dist/lib/node-esm/chunk-CCE5LHBE.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-CTZ75IFK.mjs} +38 -6
  50. package/dist/lib/node-esm/chunk-CTZ75IFK.mjs.map +7 -0
  51. package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-JR7KESLL.mjs} +398 -174
  52. package/dist/lib/node-esm/chunk-JR7KESLL.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-NNKKNW57.mjs +549 -0
  54. package/dist/lib/node-esm/chunk-NNKKNW57.mjs.map +7 -0
  55. package/dist/lib/node-esm/{chunk-TDFHTCZZ.mjs → chunk-P6E247RF.mjs} +22 -12
  56. package/dist/lib/node-esm/chunk-P6E247RF.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-75RJ5DJI.mjs → chunk-PYTVBN5J.mjs} +1 -1
  58. package/dist/lib/node-esm/{chunk-75RJ5DJI.mjs.map → chunk-PYTVBN5J.mjs.map} +1 -1
  59. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-S3D7DTBF.mjs} +4 -4
  60. package/dist/lib/node-esm/chunk-S3D7DTBF.mjs.map +7 -0
  61. package/dist/lib/node-esm/chunk-UHZQTPXU.mjs +377 -0
  62. package/dist/lib/node-esm/chunk-UHZQTPXU.mjs.map +7 -0
  63. package/dist/lib/node-esm/chunk-UJ2QNRLS.mjs +25 -0
  64. package/dist/lib/node-esm/{chunk-2CXOK2TD.mjs.map → chunk-UJ2QNRLS.mjs.map} +3 -3
  65. package/dist/lib/node-esm/index.mjs +18 -8
  66. package/dist/lib/node-esm/index.mjs.map +3 -3
  67. package/dist/lib/node-esm/{intent-resolver-OXGNQ44Y.mjs → intent-resolver-VIMI5VLH.mjs} +68 -9
  68. package/dist/lib/node-esm/intent-resolver-VIMI5VLH.mjs.map +7 -0
  69. package/dist/lib/node-esm/{markdown-INKTE4MH.mjs → markdown-FL4IXLRP.mjs} +4 -4
  70. package/dist/lib/node-esm/markdown-FL4IXLRP.mjs.map +7 -0
  71. package/dist/lib/node-esm/meta.json +1 -1
  72. package/dist/lib/node-esm/{react-root-XYYY2JXZ.mjs → react-root-2HHRRUME.mjs} +9 -9
  73. package/dist/lib/node-esm/{react-surface-MJ33KPYE.mjs → react-surface-OLN3XNND.mjs} +9 -9
  74. package/dist/lib/node-esm/react-surface-OLN3XNND.mjs.map +7 -0
  75. package/dist/lib/node-esm/{settings-SJ24YG7M.mjs → settings-F2ODVNNW.mjs} +2 -2
  76. package/dist/lib/node-esm/{state-D7WNDT3N.mjs → state-62TQKQVB.mjs} +2 -2
  77. package/dist/lib/node-esm/{state-D7WNDT3N.mjs.map → state-62TQKQVB.mjs.map} +2 -2
  78. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs +81 -0
  79. package/dist/lib/node-esm/toolkit-KZIS7G36.mjs.map +7 -0
  80. package/dist/lib/node-esm/types/index.mjs +1 -1
  81. package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
  82. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  83. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  84. package/dist/types/src/calls/media-manager.d.ts +1 -1
  85. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  86. package/dist/types/src/calls/types.d.ts +1 -1
  87. package/dist/types/src/calls/types.d.ts.map +1 -1
  88. package/dist/types/src/calls/util/calls-service.d.ts +2 -2
  89. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  90. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  91. package/dist/types/src/calls-service.stories.d.ts +10 -8
  92. package/dist/types/src/calls-service.stories.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
  94. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/call-manager.d.ts +1 -1
  96. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  97. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  98. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  99. package/dist/types/src/capabilities/index.d.ts +11 -10
  100. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  101. package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
  102. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  103. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  104. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  105. package/dist/types/src/capabilities/react-root.d.ts +2 -2
  106. package/dist/types/src/capabilities/react-surface.d.ts +1 -1
  107. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  108. package/dist/types/src/capabilities/settings.d.ts +1 -1
  109. package/dist/types/src/capabilities/state.d.ts +2 -2
  110. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  111. package/dist/types/src/capabilities/toolkit.d.ts +5 -0
  112. package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
  113. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  114. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  115. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  116. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  117. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  118. package/dist/types/src/components/ChannelContainer.stories.d.ts +87 -3
  119. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Chat.stories.d.ts +89 -4
  121. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  122. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  123. package/dist/types/src/components/Comments.stories.d.ts +154 -3
  124. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  126. package/dist/types/src/components/CommentsThreadContainer.d.ts +2 -2
  127. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  128. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  129. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  130. package/dist/types/src/components/Media/VideoObject.stories.d.ts +15 -3
  131. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  132. package/dist/types/src/components/MessageContainer.d.ts +4 -1
  133. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  134. package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
  135. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  136. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +152 -2
  137. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +154 -3
  139. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  140. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  141. package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
  142. package/dist/types/src/components/command-extension.d.ts.map +1 -1
  143. package/dist/types/src/components/testing.d.ts +1 -0
  144. package/dist/types/src/components/testing.d.ts.map +1 -1
  145. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  146. package/dist/types/src/hooks/index.d.ts +1 -0
  147. package/dist/types/src/hooks/index.d.ts.map +1 -1
  148. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
  149. package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
  150. package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
  151. package/dist/types/src/translations.d.ts +1 -0
  152. package/dist/types/src/translations.d.ts.map +1 -1
  153. package/dist/types/src/types/schema.d.ts +122 -107
  154. package/dist/types/src/types/schema.d.ts.map +1 -1
  155. package/dist/types/src/types/types.d.ts +253 -168
  156. package/dist/types/src/types/types.d.ts.map +1 -1
  157. package/dist/types/tsconfig.tsbuildinfo +1 -1
  158. package/package.json +53 -51
  159. package/src/ThreadPlugin.tsx +9 -2
  160. package/src/calls/call-manager.ts +1 -1
  161. package/src/calls/call-swarm-synchronizer.ts +1 -1
  162. package/src/calls/media-manager.ts +58 -33
  163. package/src/calls/types.ts +1 -1
  164. package/src/calls/util/calls-service.ts +56 -10
  165. package/src/calls/util/stub-media-streams.ts +4 -5
  166. package/src/calls-service.stories.tsx +76 -60
  167. package/src/capabilities/app-graph-builder.ts +8 -5
  168. package/src/capabilities/call-manager.ts +3 -2
  169. package/src/capabilities/capabilities.ts +2 -2
  170. package/src/capabilities/index.ts +1 -0
  171. package/src/capabilities/intent-resolver.ts +39 -4
  172. package/src/capabilities/markdown.ts +4 -3
  173. package/src/capabilities/react-surface.tsx +5 -4
  174. package/src/capabilities/state.ts +2 -1
  175. package/src/capabilities/toolkit.ts +78 -0
  176. package/src/components/Call/Call.tsx +3 -2
  177. package/src/components/Call/Toolbar.tsx +2 -2
  178. package/src/components/CallDebugPanel.tsx +1 -1
  179. package/src/components/CallSidebar.tsx +2 -1
  180. package/src/components/ChannelContainer.stories.tsx +6 -5
  181. package/src/components/ChannelContainer.tsx +7 -6
  182. package/src/components/Chat.stories.tsx +28 -26
  183. package/src/components/ChatContainer.tsx +8 -4
  184. package/src/components/Comments.stories.tsx +33 -29
  185. package/src/components/CommentsContainer.tsx +2 -1
  186. package/src/components/CommentsThreadContainer.tsx +9 -7
  187. package/src/components/Lobby/Lobby.tsx +1 -1
  188. package/src/components/Media/VideoObject.stories.tsx +30 -27
  189. package/src/components/MessageContainer.tsx +43 -9
  190. package/src/components/Participant/Participant.tsx +13 -7
  191. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  192. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +6 -5
  193. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +42 -39
  194. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
  195. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
  196. package/src/components/ThreadComplementary.tsx +38 -8
  197. package/src/components/ThreadSettings.tsx +2 -2
  198. package/src/components/command-extension.ts +5 -2
  199. package/src/components/testing.ts +22 -0
  200. package/src/extensions/threads.ts +3 -3
  201. package/src/hooks/index.ts +1 -0
  202. package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
  203. package/src/hooks/useDebugMode.ts +1 -1
  204. package/src/hooks/useVideoStreamTrack.tsx +5 -2
  205. package/src/testing/stories.ts +2 -2
  206. package/src/translations.ts +1 -0
  207. package/src/types/types.ts +21 -12
  208. package/src/typings.d.ts +8 -0
  209. package/dist/lib/browser/ChannelContainer-3GIE7ASU.mjs +0 -16
  210. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
  211. package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
  212. package/dist/lib/browser/chunk-3SGRT4NM.mjs +0 -367
  213. package/dist/lib/browser/chunk-3SGRT4NM.mjs.map +0 -7
  214. package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
  215. package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
  216. package/dist/lib/browser/chunk-FR7KJPNY.mjs +0 -21
  217. package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
  218. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
  219. package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
  220. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
  221. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  222. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
  223. package/dist/lib/browser/markdown-M3FMR7OD.mjs.map +0 -7
  224. package/dist/lib/browser/react-surface-XWS6GIZY.mjs.map +0 -7
  225. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
  226. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  227. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs +0 -23
  228. package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
  229. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
  230. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
  231. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs +0 -368
  232. package/dist/lib/node-esm/chunk-FLBFYGBK.mjs.map +0 -7
  233. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  234. package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
  235. package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
  236. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
  237. package/dist/lib/node-esm/markdown-INKTE4MH.mjs.map +0 -7
  238. package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs.map +0 -7
  239. /package/dist/lib/browser/{ChannelContainer-3GIE7ASU.mjs.map → ChannelContainer-GHDNEZT2.mjs.map} +0 -0
  240. /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-42ALOWUA.mjs.map} +0 -0
  241. /package/dist/lib/browser/{react-root-JEUSQXI6.mjs.map → react-root-PTTTW2MO.mjs.map} +0 -0
  242. /package/dist/lib/browser/{settings-E32MTL7A.mjs.map → settings-GRKEID73.mjs.map} +0 -0
  243. /package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs.map → ChannelContainer-D5E2S6AI.mjs.map} +0 -0
  244. /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → ChatContainer-4EGHKHIU.mjs.map} +0 -0
  245. /package/dist/lib/node-esm/{react-root-XYYY2JXZ.mjs.map → react-root-2HHRRUME.mjs.map} +0 -0
  246. /package/dist/lib/node-esm/{settings-SJ24YG7M.mjs.map → settings-F2ODVNNW.mjs.map} +0 -0
@@ -4,15 +4,16 @@
4
4
 
5
5
  import '@dxos-theme';
6
6
 
7
- import { type StoryObj, type Meta } from '@storybook/react-vite';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React, { useEffect, useState } from 'react';
9
9
 
10
10
  import { faker } from '@dxos/random';
11
- import { withTheme, withLayout } from '@dxos/storybook-utils';
11
+ import { withLayout, withTheme } from '@dxos/storybook-utils';
12
+
13
+ import { translations } from '../../translations';
12
14
 
13
15
  import { ResponsiveGrid, type ResponsiveGridProps } from './ResponsiveGrid';
14
16
  import { ResponsiveGridItem, type ResponsiveGridItemProps } from './ResponsiveGridItem';
15
- import { translations } from '../../translations';
16
17
 
17
18
  type TestItem = {
18
19
  id: string;
@@ -56,46 +57,48 @@ const TestCell = ({ item, ...props }: ResponsiveGridItemProps<TestItem>) => {
56
57
 
57
58
  type StoryProps = ResponsiveGridProps<TestItem> & { random?: boolean; autoHideGallery?: boolean };
58
59
 
59
- const meta: Meta<StoryProps> = {
60
+ const DefaultStory = (props: StoryProps) => {
61
+ const [pinned, setPinned] = useState<string | undefined>(
62
+ (props.pinned ?? props.items.length > 1) ? props.items[0]?.id : undefined,
63
+ );
64
+ const [items, setItems] = useState<TestItem[]>(props.items);
65
+ useEffect(() => {
66
+ if (!props.random) {
67
+ return;
68
+ }
69
+
70
+ const interval = setInterval(() => {
71
+ setItems((items) => {
72
+ const p = Math.random();
73
+ if (p < 0.5) {
74
+ return items;
75
+ } else if (p < 0.99 && items.length > 1) {
76
+ return items.slice(0, -1);
77
+ } else {
78
+ return [...items, createItem(items[0]?.type)];
79
+ }
80
+ });
81
+ }, 3_000);
82
+
83
+ return () => clearInterval(interval);
84
+ }, []);
85
+
86
+ return (
87
+ <div className='grid grow p-4'>
88
+ <ResponsiveGrid {...props} Cell={TestCell} items={items} pinned={pinned} onPinnedChange={setPinned} />
89
+ </div>
90
+ );
91
+ };
92
+
93
+ const meta = {
60
94
  title: 'plugins/plugin-thread/ResponsiveGrid',
61
- component: ResponsiveGrid,
62
- render: (args) => {
63
- const [pinned, setPinned] = useState<string | undefined>(
64
- (args.pinned ?? args.items.length > 1) ? args.items[0]?.id : undefined,
65
- );
66
- const [items, setItems] = useState<TestItem[]>(args.items);
67
- useEffect(() => {
68
- if (!args.random) {
69
- return;
70
- }
71
-
72
- const interval = setInterval(() => {
73
- setItems((items) => {
74
- const p = Math.random();
75
- if (p < 0.5) {
76
- return items;
77
- } else if (p < 0.99 && items.length > 1) {
78
- return items.slice(0, -1);
79
- } else {
80
- return [...items, createItem(items[0]?.type)];
81
- }
82
- });
83
- }, 3_000);
84
-
85
- return () => clearInterval(interval);
86
- }, []);
87
-
88
- return (
89
- <div className='grid grow p-4'>
90
- <ResponsiveGrid {...args} Cell={TestCell} items={items} pinned={pinned} onPinnedChange={setPinned} />
91
- </div>
92
- );
93
- },
95
+ component: ResponsiveGrid as any,
96
+ render: DefaultStory,
94
97
  decorators: [withTheme, withLayout({ fullscreen: true, classNames: 'justify-center' })],
95
98
  parameters: {
96
99
  translations,
97
100
  },
98
- };
101
+ } satisfies Meta<typeof DefaultStory>;
99
102
 
100
103
  const videoUrls = [
101
104
  'http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4',
@@ -117,7 +120,7 @@ const createItem = (type?: 'image' | 'video') => {
117
120
 
118
121
  export default meta;
119
122
 
120
- type Story = StoryObj<StoryProps>;
123
+ type Story = StoryObj<typeof meta>;
121
124
 
122
125
  // TODO(burdon): Story to join/leave repeatedly to test stable position.
123
126
 
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { type ComponentType, type FC, useLayoutEffect, useState, useEffect, useMemo, useCallback } from 'react';
5
+ import React, { type ComponentType, type FC, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';
6
6
  import { useResizeDetector } from 'react-resize-detector';
7
7
 
8
8
  import { invariant } from '@dxos/invariant';
@@ -2,9 +2,9 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import React, { useEffect, useState, type CSSProperties, type PropsWithChildren } from 'react';
5
+ import React, { type CSSProperties, type PropsWithChildren, useEffect, useState } from 'react';
6
6
 
7
- import { Icon, IconButton, useTranslation, type ThemedClassName } from '@dxos/react-ui';
7
+ import { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';
8
8
  import { Waveform } from '@dxos/react-ui-sfx';
9
9
  import { groupHoverControlItemWithTransition, mx } from '@dxos/react-ui-theme';
10
10
 
@@ -6,23 +6,25 @@ import React, { useCallback, useMemo } from 'react';
6
6
 
7
7
  import {
8
8
  Capabilities,
9
+ CollaborationActions,
9
10
  LayoutAction,
10
11
  createIntent,
11
- useCapability,
12
12
  useCapabilities,
13
+ useCapability,
13
14
  useIntentDispatcher,
14
15
  } from '@dxos/app-framework';
15
16
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
16
- import { fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';
17
+ import { Ref, fullyQualifiedId, getSpace, useQuery } from '@dxos/react-client/echo';
17
18
  import { useIdentity } from '@dxos/react-client/halo';
18
19
  import { useThemeContext, useTranslation } from '@dxos/react-ui';
19
20
  import { useAttended } from '@dxos/react-ui-attention';
20
21
  import { StackItem } from '@dxos/react-ui-stack';
21
22
  import { Tabs } from '@dxos/react-ui-tabs';
23
+ import { mx } from '@dxos/react-ui-theme';
22
24
  import { AnchoredTo } from '@dxos/schema';
23
25
 
24
26
  import { ThreadCapabilities } from '../capabilities';
25
- import { CommentsContainer } from '../components';
27
+ import { CommentsContainer, type CommentsContainerProps } from '../components';
26
28
  import { meta } from '../meta';
27
29
  import { ThreadAction, ThreadType } from '../types';
28
30
 
@@ -114,6 +116,28 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
114
116
  [dispatch, subject],
115
117
  );
116
118
 
119
+ const handleAcceptProposal = useCallback<NonNullable<CommentsContainerProps['onAcceptProposal']>>(
120
+ async (anchor, messageId) => {
121
+ const thread = Relation.getSource(anchor) as ThreadType;
122
+ const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));
123
+ const message = thread.messages[messageIndex]?.target;
124
+ const proposal = message?.blocks.find((block) => block._tag === 'proposal');
125
+ if (!proposal || !anchor.anchor) {
126
+ return;
127
+ }
128
+
129
+ await dispatch(
130
+ createIntent(CollaborationActions.AcceptProposal, {
131
+ subject,
132
+ anchor: anchor.anchor,
133
+ proposal,
134
+ }),
135
+ );
136
+ await dispatch(createIntent(ThreadAction.ToggleResolved, { thread }));
137
+ },
138
+ [dispatch, subject],
139
+ );
140
+
117
141
  const comments = (
118
142
  <CommentsContainer
119
143
  anchors={anchors}
@@ -124,18 +148,22 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
124
148
  onResolve={handleResolve}
125
149
  onMessageDelete={handleMessageDelete}
126
150
  onThreadDelete={handleThreadDelete}
151
+ onAcceptProposal={handleAcceptProposal}
127
152
  />
128
153
  );
129
154
 
130
155
  return (
131
- <StackItem.Content toolbar>
156
+ <StackItem.Content toolbar classNames='overflow-hidden'>
132
157
  <Tabs.Root
133
158
  value={showResolvedThreads ? 'all' : 'unresolved'}
134
159
  orientation='horizontal'
135
- classNames='contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin'
160
+ classNames={[
161
+ 'contents [&_[role="tabpanel"]]:min-bs-0 [&_[role="tabpanel"]]:overflow-y-auto [&_[role="tabpanel"]]:scrollbar-thin',
162
+ ]}
136
163
  onValueChange={onChangeViewState}
137
164
  >
138
- <Tabs.Tablist classNames={tx('toolbar.root', 'toolbar', {})}>
165
+ {/* TODO(burdon): Standardize (like Tollbar). */}
166
+ <Tabs.Tablist classNames={mx('bg-toolbarSurface border-b border-subduedSeparator')}>
139
167
  <Tabs.Tab value='unresolved' classNames='text-sm'>
140
168
  {t('show unresolved label')}
141
169
  </Tabs.Tab>
@@ -143,8 +171,10 @@ export const ThreadComplementary = ({ subject }: { subject: any }) => {
143
171
  {t('show all label')}
144
172
  </Tabs.Tab>
145
173
  </Tabs.Tablist>
146
- <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>
147
- <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>
174
+ <div className='overflow-y-auto'>
175
+ <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>
176
+ <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>
177
+ </div>
148
178
  </Tabs.Root>
149
179
  </StackItem.Content>
150
180
  );
@@ -5,7 +5,7 @@
5
5
  import React from 'react';
6
6
 
7
7
  // import { useTranslation } from '@dxos/react-ui';
8
- import { DeprecatedFormContainer } from '@dxos/react-ui-form';
8
+ import { ControlPage } from '@dxos/react-ui-form';
9
9
 
10
10
  // import { meta } from '../meta';
11
11
  import type { ThreadSettingsProps } from '../types';
@@ -13,5 +13,5 @@ import type { ThreadSettingsProps } from '../types';
13
13
  export const ThreadSettings = ({ settings }: { settings: ThreadSettingsProps }) => {
14
14
  // const { t } = useTranslation(meta.id);
15
15
 
16
- return <DeprecatedFormContainer></DeprecatedFormContainer>;
16
+ return <ControlPage></ControlPage>;
17
17
  };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language';
5
+ import { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';
6
6
  import { type Extension } from '@codemirror/state';
7
7
 
8
8
  import { tags } from '@dxos/react-ui-editor';
@@ -27,7 +27,10 @@ const parser = StreamLanguage.define<{ count: number }>({
27
27
  });
28
28
 
29
29
  const styles = HighlightStyle.define([
30
- { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },
30
+ {
31
+ tag: tags.tagName,
32
+ class: mx('dx-tag dx-tag--indigo text-baseText font-medium'),
33
+ },
31
34
  ]);
32
35
 
33
36
  export const command: Extension = [parser, syntaxHighlighting(styles)];
@@ -12,6 +12,7 @@ import { ThreadType } from '../types';
12
12
 
13
13
  export const createCommentThread = (identity: Identity): ThreadType => {
14
14
  return Obj.make(ThreadType, {
15
+ name: 'Comment',
15
16
  messages: faker.helpers.multiple(
16
17
  () =>
17
18
  Ref.make(
@@ -25,5 +26,26 @@ export const createCommentThread = (identity: Identity): ThreadType => {
25
26
  ),
26
27
  { count: { min: 2, max: 3 } },
27
28
  ),
29
+ status: 'active',
30
+ });
31
+ };
32
+
33
+ export const createProposalThread = (identity: Identity): ThreadType => {
34
+ return Obj.make(ThreadType, {
35
+ name: 'Proposal',
36
+ messages: faker.helpers.multiple(
37
+ () =>
38
+ Ref.make(
39
+ Obj.make(DataType.Message, {
40
+ created: new Date().toISOString(),
41
+ sender: {
42
+ identityDid: faker.datatype.boolean() ? identity.did : IdentityDid.random(),
43
+ },
44
+ blocks: [{ _tag: 'proposal', text: faker.lorem.sentences(3) }],
45
+ }),
46
+ ),
47
+ { count: { min: 1, max: 1 } },
48
+ ),
49
+ status: 'active',
28
50
  });
29
51
  };
@@ -6,14 +6,14 @@ import { type Extension } from '@codemirror/state';
6
6
  import { EditorView } from '@codemirror/view';
7
7
  import { computed, effect } from '@preact/signals-core';
8
8
 
9
- import { createIntent, type PromiseIntentDispatcher } from '@dxos/app-framework';
9
+ import { type PromiseIntentDispatcher, createIntent } from '@dxos/app-framework';
10
10
  import { Filter, Obj, Query, Relation } from '@dxos/echo';
11
11
  import { type Markdown } from '@dxos/plugin-markdown/types';
12
- import { getSpace, getTextInRange, createDocAccessor, fullyQualifiedId, getSource } from '@dxos/react-client/echo';
12
+ import { createDocAccessor, fullyQualifiedId, getSource, getSpace, getTextInRange } from '@dxos/react-client/echo';
13
13
  import { comments, createExternalCommentSync } from '@dxos/react-ui-editor';
14
14
  import { AnchoredTo } from '@dxos/schema';
15
15
 
16
- import { ThreadAction, ThreadType, type ThreadState } from '../types';
16
+ import { ThreadAction, type ThreadState, ThreadType } from '../types';
17
17
 
18
18
  // TODO(burdon): Factor out.
19
19
  const getName = (doc: Markdown.Document, anchor: string): string | undefined => {
@@ -7,3 +7,4 @@ export * from './useDebugMode';
7
7
  export * from './useStatus';
8
8
  export * from './useVideoStreamTrack';
9
9
  export * from './useInaudibleAudioStreamTrack';
10
+ export * from './useBlackCanvasStreamTrack';
@@ -0,0 +1,27 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useState } from 'react';
6
+
7
+ import { scheduleTask } from '@dxos/async';
8
+ import { Context } from '@dxos/context';
9
+
10
+ import { createBlackCanvasStreamTrack } from '../calls/util/stub-media-streams';
11
+
12
+ export const useBlackCanvasStreamTrack = () => {
13
+ const [blackCanvasStreamTrack, setBlackCanvasStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);
14
+ useEffect(() => {
15
+ const ctx = new Context();
16
+ scheduleTask(ctx, async () => {
17
+ const blackCanvasStreamTrack = await createBlackCanvasStreamTrack({ ctx, width: 720, height: 480 });
18
+ setBlackCanvasStreamTrack(blackCanvasStreamTrack);
19
+ });
20
+
21
+ return () => {
22
+ void ctx.dispose();
23
+ };
24
+ }, []);
25
+
26
+ return blackCanvasStreamTrack;
27
+ };
@@ -2,7 +2,7 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { useState, useEffect } from 'react';
5
+ import { useEffect, useState } from 'react';
6
6
 
7
7
  // TODO(burdon): Standardize across plugins/composer.
8
8
  export const useDebugMode = () => {
@@ -15,13 +15,16 @@ export const useVideoStreamTrack = (videoElement: RefObject<HTMLVideoElement>, v
15
15
  }
16
16
  hadRun.current = true;
17
17
  videoElement.current.addEventListener('playing', () => {
18
+ if (videoStreamTrack) {
19
+ return;
20
+ }
18
21
  const stream = (videoElement.current as any).captureStream();
19
22
  const track = stream.getTracks()[0];
20
- if (track) {
23
+ if (track && !videoStreamTrack) {
21
24
  setVideoStreamTrack(track);
22
25
  }
23
26
  stream.onaddtrack = (event: MediaStreamTrackEvent) => {
24
- if (event.track.kind === 'video') {
27
+ if (event.track.kind === 'video' && !videoStreamTrack) {
25
28
  setVideoStreamTrack(event.track);
26
29
  }
27
30
  };
@@ -18,10 +18,10 @@ import { ChannelType, ThreadType } from '../types';
18
18
  export const createThreadPlugins = async () => [
19
19
  ThemePlugin({ tx: defaultTx }),
20
20
  ClientPlugin({
21
- onClientInitialized: async (_, client) => {
21
+ onClientInitialized: async ({ client }) => {
22
22
  await client.halo.createIdentity({ displayName: 'Test User' });
23
23
  },
24
- onSpacesReady: async (_, client) => {
24
+ onSpacesReady: async ({ client }) => {
25
25
  await client.spaces.default.waitUntilReady();
26
26
  const thread = Obj.make(ThreadType, { messages: [] });
27
27
  client.spaces.default.db.add(Obj.make(ChannelType, { defaultThread: Ref.make(thread), threads: [] }));
@@ -44,6 +44,7 @@ export const translations = [
44
44
  'save message label': 'Save',
45
45
  'edit message label': 'Edit',
46
46
  'delete message label': 'Delete message',
47
+ 'accept proposal label': 'Accept proposal',
47
48
  'open comments panel label': 'Show Comments',
48
49
  'comments label': 'Comments',
49
50
  'show all label': 'All comments',
@@ -8,13 +8,12 @@ import { Type } from '@dxos/echo';
8
8
  import { EchoObjectSchema, SpaceSchema } from '@dxos/react-client/echo';
9
9
  import { AnchoredTo, DataType } from '@dxos/schema';
10
10
 
11
+ import { meta } from '../meta';
12
+
11
13
  import { ChannelType, ThreadType } from './schema';
12
- import { THREAD_PLUGIN } from '../meta';
13
14
 
14
15
  export namespace ThreadAction {
15
- const THREAD_ACTION = `${THREAD_PLUGIN}/action`;
16
-
17
- export class OnSpaceCreated extends Schema.TaggedClass<OnSpaceCreated>()(`${THREAD_ACTION}/on-space-created`, {
16
+ export class OnSpaceCreated extends Schema.TaggedClass<OnSpaceCreated>()(`${meta.id}/action/on-space-created`, {
18
17
  input: Schema.Struct({
19
18
  space: SpaceSchema,
20
19
  rootCollection: DataType.Collection,
@@ -22,7 +21,7 @@ export namespace ThreadAction {
22
21
  output: Schema.Void,
23
22
  }) {}
24
23
 
25
- export class CreateChannel extends Schema.TaggedClass<CreateChannel>()(`${THREAD_ACTION}/create-channel`, {
24
+ export class CreateChannel extends Schema.TaggedClass<CreateChannel>()(`${meta.id}/action/create-channel`, {
26
25
  input: Schema.Struct({
27
26
  spaceId: Type.SpaceId,
28
27
  name: Schema.optional(Schema.String),
@@ -33,7 +32,7 @@ export namespace ThreadAction {
33
32
  }) {}
34
33
 
35
34
  export class CreateChannelThread extends Schema.TaggedClass<CreateChannelThread>()(
36
- `${THREAD_ACTION}/create-channel-thread`,
35
+ `${meta.id}/action/create-channel-thread`,
37
36
  {
38
37
  input: Schema.Struct({
39
38
  channel: ChannelType,
@@ -44,7 +43,7 @@ export namespace ThreadAction {
44
43
  },
45
44
  ) {}
46
45
 
47
- export class Create extends Schema.TaggedClass<Create>()(`${THREAD_ACTION}/create`, {
46
+ export class Create extends Schema.TaggedClass<Create>()(`${meta.id}/action/create`, {
48
47
  input: Schema.Struct({
49
48
  name: Schema.optional(Schema.String),
50
49
  anchor: Schema.optional(Schema.String),
@@ -53,7 +52,7 @@ export namespace ThreadAction {
53
52
  output: Schema.Void,
54
53
  }) {}
55
54
 
56
- export class Delete extends Schema.TaggedClass<Delete>()(`${THREAD_ACTION}/delete`, {
55
+ export class Delete extends Schema.TaggedClass<Delete>()(`${meta.id}/action/delete`, {
57
56
  input: Schema.Struct({
58
57
  anchor: AnchoredTo,
59
58
  subject: EchoObjectSchema,
@@ -62,21 +61,31 @@ export namespace ThreadAction {
62
61
  output: Schema.Void,
63
62
  }) {}
64
63
 
65
- export class Select extends Schema.TaggedClass<Select>()(`${THREAD_ACTION}/select`, {
64
+ export class Select extends Schema.TaggedClass<Select>()(`${meta.id}/action/select`, {
66
65
  input: Schema.Struct({
67
66
  current: Schema.String,
68
67
  }),
69
68
  output: Schema.Void,
70
69
  }) {}
71
70
 
72
- export class ToggleResolved extends Schema.TaggedClass<ToggleResolved>()(`${THREAD_ACTION}/toggle-resolved`, {
71
+ export class ToggleResolved extends Schema.TaggedClass<ToggleResolved>()(`${meta.id}/action/toggle-resolved`, {
73
72
  input: Schema.Struct({
74
73
  thread: ThreadType,
75
74
  }),
76
75
  output: Schema.Void,
77
76
  }) {}
78
77
 
79
- export class AddMessage extends Schema.TaggedClass<AddMessage>()(`${THREAD_ACTION}/add-message`, {
78
+ export class AddProposal extends Schema.TaggedClass<AddProposal>()(`${meta.id}/action/add-proposal`, {
79
+ input: Schema.Struct({
80
+ text: Schema.String,
81
+ anchor: Schema.String,
82
+ sender: DataType.Actor,
83
+ subject: EchoObjectSchema,
84
+ }),
85
+ output: Schema.Void,
86
+ }) {}
87
+
88
+ export class AddMessage extends Schema.TaggedClass<AddMessage>()(`${meta.id}/action/add-message`, {
80
89
  input: Schema.Struct({
81
90
  subject: EchoObjectSchema,
82
91
  anchor: AnchoredTo,
@@ -86,7 +95,7 @@ export namespace ThreadAction {
86
95
  output: Schema.Void,
87
96
  }) {}
88
97
 
89
- export class DeleteMessage extends Schema.TaggedClass<DeleteMessage>()(`${THREAD_ACTION}/delete-message`, {
98
+ export class DeleteMessage extends Schema.TaggedClass<DeleteMessage>()(`${meta.id}/action/delete-message`, {
90
99
  input: Schema.Struct({
91
100
  anchor: AnchoredTo,
92
101
  subject: EchoObjectSchema,
@@ -0,0 +1,8 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ declare module '*.mp4?raw' {
6
+ const content: string;
7
+ export default content;
8
+ }
@@ -1,16 +0,0 @@
1
- import {
2
- ChannelContainer,
3
- ChannelContainer_default
4
- } from "./chunk-KWPRNHTK.mjs";
5
- import "./chunk-FR7KJPNY.mjs";
6
- import "./chunk-LGSDKXPF.mjs";
7
- import "./chunk-VUWC4IJM.mjs";
8
- import "./chunk-ERWASUQK.mjs";
9
- import "./chunk-GERVMFQW.mjs";
10
- import "./chunk-6NSMBO3B.mjs";
11
- import "./chunk-EV4JWI7L.mjs";
12
- export {
13
- ChannelContainer,
14
- ChannelContainer_default as default
15
- };
16
- //# sourceMappingURL=ChannelContainer-3GIE7ASU.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Rx } from '@effect-rx/rx-react';\nimport { Option, pipe } from 'effect';\n\nimport { Capabilities, contributes, createIntent, type PluginContext } from '@dxos/app-framework';\nimport { Obj } from '@dxos/echo';\nimport { AttentionCapabilities } from '@dxos/plugin-attention';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE } from '@dxos/plugin-deck/types';\nimport { createExtension, ROOT_ID, rxFromSignal } from '@dxos/plugin-graph';\nimport { fullyQualifiedId } from '@dxos/react-client/echo';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { meta, THREAD_PLUGIN } from '../meta';\nimport { ChannelType, ThreadAction } from '../types';\nimport { getAnchor } from '../util';\n\nexport default (context: PluginContext) => {\n const resolve = (typename: string) =>\n context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};\n\n return contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${THREAD_PLUGIN}/active-call`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),\n Option.map((node) => {\n const [call] = get(context.capabilities(ThreadCapabilities.CallManager));\n return get(\n rxFromSignal(() =>\n call?.joined\n ? [\n {\n id: `${node.id}${ATTENDABLE_PATH_SEPARATOR}active-call`,\n type: DECK_COMPANION_TYPE,\n data: null,\n properties: {\n label: ['call panel label', { ns: THREAD_PLUGIN }],\n icon: 'ph--video-conference--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ]\n : [],\n ),\n );\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n // TODO(wittjosiah): The channel shouldn't become the companion during a call.\n // Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.\n createExtension({\n id: `${THREAD_PLUGIN}/channel-chat-companion`,\n connector: (node) => {\n return Rx.make((get) => {\n return pipe(\n get(node),\n Option.flatMap((node) => (Obj.instanceOf(ChannelType, node.data) ? Option.some(node.data) : Option.none())),\n Option.map((channel) => {\n const callManager = context.getCapability(ThreadCapabilities.CallManager);\n const joined = get(\n rxFromSignal(() => callManager.joined && callManager.roomId === fullyQualifiedId(channel)),\n );\n if (!joined) {\n return [];\n }\n\n return [\n {\n id: `${fullyQualifiedId(channel)}${ATTENDABLE_PATH_SEPARATOR}chat`,\n type: PLANK_COMPANION_TYPE,\n data: 'chat',\n properties: {\n label: ['channel companion label', { ns: THREAD_PLUGIN }],\n icon: 'ph--hash--regular',\n position: 'hoist',\n disposition: 'hidden',\n },\n },\n ];\n }),\n Option.getOrElse(() => []),\n );\n });\n },\n }),\n createExtension({\n id: `${meta.id}/comments-companion`,\n connector: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => {\n if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {\n return Option.none();\n }\n const metadata = resolve(Obj.getTypename(node.data)!);\n return typeof metadata.comments === 'string' ? Option.some(node) : Option.none();\n }),\n Option.map((node) => [\n {\n id: [node.id, 'comments'].join(ATTENDABLE_PATH_SEPARATOR),\n type: PLANK_COMPANION_TYPE,\n data: 'comments',\n properties: {\n label: ['comments label', { ns: meta.id }],\n icon: 'ph--chat-text--regular',\n disposition: 'hidden',\n position: 'hoist',\n },\n },\n ]),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n createExtension({\n id: `${meta.id}/comment-toolbar`,\n actions: (node) =>\n Rx.make((get) =>\n pipe(\n get(node),\n Option.flatMap((node) => {\n if (!Obj.isObject(node.data) || Obj.instanceOf(ChannelType, node.data)) {\n return Option.none();\n }\n const metadata = resolve(Obj.getTypename(node.data)!);\n return typeof metadata.comments === 'string' ? Option.some(node.data) : Option.none();\n }),\n Option.map((object) => {\n const selectionManager = context.getCapability(AttentionCapabilities.Selection);\n const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};\n const disabled = get(\n rxFromSignal(() => {\n const metadata = resolve(Obj.getTypename(object)!);\n const selection = selectionManager.getSelection(fullyQualifiedId(object), metadata.selectionMode);\n const anchor = getAnchor(selection);\n const invalidSelection = !anchor;\n const overlappingComment = toolbar[fullyQualifiedId(object)];\n return (metadata.comments === 'anchored' && invalidSelection) || overlappingComment;\n }),\n );\n\n return [\n {\n id: `${fullyQualifiedId(object)}/comment`,\n data: () => {\n const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);\n const metadata = resolve(Obj.getTypename(object)!);\n const selection = selectionManager.getSelection(fullyQualifiedId(object));\n // TODO(wittjosiah): Use presence of selection to determine if the comment should be anchored.\n // Requires all components which support selection (e.g. table/kanban) to support anchored comments.\n const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();\n const name = metadata.getAnchorLabel?.(object, anchor);\n void dispatch(createIntent(ThreadAction.Create, { anchor, name, subject: object }));\n },\n properties: {\n label: ['add comment label', { ns: meta.id }],\n icon: 'ph--chat-text--regular',\n disposition: 'toolbar',\n disabled,\n testId: 'thread.comment.add',\n },\n },\n ];\n }),\n Option.getOrElse(() => []),\n ),\n ),\n }),\n ]);\n};\n"],
5
- "mappings": "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",
6
- "names": ["Rx", "Option", "pipe", "Capabilities", "contributes", "createIntent", "Obj", "AttentionCapabilities", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "DECK_COMPANION_TYPE", "createExtension", "ROOT_ID", "rxFromSignal", "fullyQualifiedId", "context", "resolve", "typename", "getCapabilities", "Capabilities", "Metadata", "find", "id", "metadata", "contributes", "AppGraphBuilder", "createExtension", "THREAD_PLUGIN", "connector", "node", "Rx", "make", "get", "pipe", "Option", "flatMap", "ROOT_ID", "some", "none", "map", "call", "capabilities", "ThreadCapabilities", "CallManager", "rxFromSignal", "joined", "ATTENDABLE_PATH_SEPARATOR", "type", "DECK_COMPANION_TYPE", "data", "properties", "label", "ns", "icon", "position", "disposition", "getOrElse", "Obj", "instanceOf", "ChannelType", "channel", "callManager", "getCapability", "roomId", "fullyQualifiedId", "PLANK_COMPANION_TYPE", "meta", "isObject", "getTypename", "comments", "join", "actions", "object", "selectionManager", "AttentionCapabilities", "Selection", "toolbar", "State", "state", "disabled", "selection", "getSelection", "selectionMode", "anchor", "getAnchor", "invalidSelection", "overlappingComment", "dispatchPromise", "dispatch", "IntentDispatcher", "Date", "now", "toString", "name", "getAnchorLabel", "createIntent", "ThreadAction", "Create", "subject", "testId"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/call-manager.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { contributes, type PluginContext } from '@dxos/app-framework';\nimport { ClientCapabilities } from '@dxos/plugin-client';\n\nimport { ThreadCapabilities } from './capabilities';\nimport { CallManager } from '../calls';\n\nexport default async (context: PluginContext) => {\n const client = context.getCapability(ClientCapabilities.Client);\n const callManager = new CallManager(client);\n await callManager.open();\n\n return contributes(ThreadCapabilities.CallManager, callManager, () => {\n void callManager.close();\n });\n};\n"],
5
- "mappings": ";;;;;;;;;;AAIA,SAASA,mBAAuC;AAChD,SAASC,0BAA0B;AAKnC,IAAA,uBAAe,OAAOC,YAAAA;AACpB,QAAMC,SAASD,QAAQE,cAAcC,mBAAmBC,MAAM;AAC9D,QAAMC,cAAc,IAAIC,YAAYL,MAAAA;AACpC,QAAMI,YAAYE,KAAI;AAEtB,SAAOC,YAAYC,mBAAmBH,aAAaD,aAAa,MAAA;AAC9D,SAAKA,YAAYK,MAAK;EACxB,CAAA;AACF;",
6
- "names": ["contributes", "ClientCapabilities", "context", "client", "getCapability", "ClientCapabilities", "Client", "callManager", "CallManager", "open", "contributes", "ThreadCapabilities", "close"]
7
- }