@dxos/plugin-thread 0.8.4-main.67995b8 → 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.
- package/dist/lib/browser/ChannelContainer-SVV4ZX5T.mjs +16 -0
- package/dist/lib/browser/ChatContainer-ALFWQ65B.mjs +15 -0
- package/dist/lib/browser/{app-graph-builder-N7BE5TYW.mjs → app-graph-builder-ACBXRBOS.mjs} +22 -22
- package/dist/lib/browser/app-graph-builder-ACBXRBOS.mjs.map +7 -0
- package/dist/lib/browser/{call-manager-NIPDYUVD.mjs → call-manager-P3MYR2JS.mjs} +7 -7
- package/dist/lib/browser/call-manager-P3MYR2JS.mjs.map +7 -0
- package/dist/lib/browser/chunk-6CUDBEYP.mjs +377 -0
- package/dist/lib/browser/chunk-6CUDBEYP.mjs.map +7 -0
- package/dist/lib/browser/chunk-BBTXGRIR.mjs +18 -0
- package/dist/lib/browser/chunk-BBTXGRIR.mjs.map +7 -0
- package/dist/lib/browser/{chunk-GERVMFQW.mjs → chunk-CP7E2HRE.mjs} +2 -2
- package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KWPRNHTK.mjs → chunk-DJOUMWEL.mjs} +242 -238
- package/dist/lib/browser/chunk-DJOUMWEL.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-HDEQRBOC.mjs} +38 -6
- package/dist/lib/{node-esm/chunk-25ABSYP2.mjs.map → browser/chunk-HDEQRBOC.mjs.map} +4 -4
- package/dist/lib/browser/chunk-IQSXEHOW.mjs +618 -0
- package/dist/lib/browser/chunk-IQSXEHOW.mjs.map +7 -0
- package/dist/lib/browser/chunk-K2DUJRFJ.mjs +27 -0
- package/dist/lib/browser/chunk-K2DUJRFJ.mjs.map +7 -0
- package/dist/lib/browser/chunk-L6F2AG6W.mjs +23 -0
- package/dist/lib/browser/{chunk-FR7KJPNY.mjs.map → chunk-L6F2AG6W.mjs.map} +3 -3
- package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-US5ZQYC3.mjs} +310 -186
- package/dist/lib/browser/chunk-US5ZQYC3.mjs.map +7 -0
- package/dist/lib/browser/chunk-UTSLSZED.mjs +178 -0
- package/dist/lib/browser/chunk-UTSLSZED.mjs.map +7 -0
- package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-XYUJXHYV.mjs} +55 -5
- package/dist/lib/browser/chunk-XYUJXHYV.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +35 -24
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-JFGLZ6VI.mjs → intent-resolver-5POQTZ24.mjs} +83 -33
- package/dist/lib/browser/intent-resolver-5POQTZ24.mjs.map +7 -0
- package/dist/lib/browser/{markdown-M3FMR7OD.mjs → markdown-L7LDNF56.mjs} +10 -10
- package/dist/lib/browser/markdown-L7LDNF56.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-root-RCJLK4EP.mjs +28 -0
- package/dist/lib/browser/react-root-RCJLK4EP.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-XWS6GIZY.mjs → react-surface-IC576W2W.mjs} +27 -27
- package/dist/lib/browser/react-surface-IC576W2W.mjs.map +7 -0
- package/dist/lib/browser/{settings-E32MTL7A.mjs → settings-5FYGBOGI.mjs} +5 -5
- package/dist/lib/browser/{settings-E32MTL7A.mjs.map → settings-5FYGBOGI.mjs.map} +1 -1
- package/dist/lib/browser/{state-H6CYONWE.mjs → state-36REWXO5.mjs} +5 -5
- package/dist/lib/browser/state-36REWXO5.mjs.map +7 -0
- package/dist/lib/browser/toolkit-PXASLYEQ.mjs +74 -0
- package/dist/lib/browser/toolkit-PXASLYEQ.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +7 -9
- package/dist/lib/node-esm/ChannelContainer-63GMQ753.mjs +17 -0
- package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs → ChatContainer-MFKPXMIK.mjs} +6 -6
- package/dist/lib/node-esm/{app-graph-builder-VCW76Z6V.mjs → app-graph-builder-JXD7KY3G.mjs} +22 -22
- package/dist/lib/node-esm/app-graph-builder-JXD7KY3G.mjs.map +7 -0
- package/dist/lib/node-esm/{call-manager-D6O5ZJJ4.mjs → call-manager-FCEFP7EJ.mjs} +7 -7
- package/dist/lib/node-esm/call-manager-FCEFP7EJ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-2MMJF7DW.mjs} +38 -6
- package/dist/lib/node-esm/chunk-2MMJF7DW.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-2V3WSLUZ.mjs} +55 -5
- package/dist/lib/node-esm/chunk-2V3WSLUZ.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-57XR3LEF.mjs → chunk-ABUFOZVX.mjs} +2 -2
- package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-AFDO2SUZ.mjs +25 -0
- package/dist/lib/node-esm/{chunk-2CXOK2TD.mjs.map → chunk-AFDO2SUZ.mjs.map} +3 -3
- package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-KGYDYYKJ.mjs} +310 -186
- package/dist/lib/node-esm/chunk-KGYDYYKJ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs +378 -0
- package/dist/lib/node-esm/chunk-NWUUMKVQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs +619 -0
- package/dist/lib/node-esm/chunk-Q7AKKZNY.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-C3XFMUAY.mjs → chunk-QCQAAU6J.mjs} +242 -238
- package/dist/lib/node-esm/chunk-QCQAAU6J.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-TYLLHI46.mjs +179 -0
- package/dist/lib/node-esm/chunk-TYLLHI46.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-XI45H4IV.mjs +28 -0
- package/dist/lib/node-esm/chunk-XI45H4IV.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-ZQAGII7M.mjs +19 -0
- package/dist/lib/node-esm/chunk-ZQAGII7M.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +35 -24
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-OXGNQ44Y.mjs → intent-resolver-63NV3XD2.mjs} +83 -33
- package/dist/lib/node-esm/intent-resolver-63NV3XD2.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-INKTE4MH.mjs → markdown-ZQW7MI5U.mjs} +10 -10
- package/dist/lib/node-esm/markdown-ZQW7MI5U.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-root-4IDB2SN2.mjs +29 -0
- package/dist/lib/node-esm/react-root-4IDB2SN2.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-MJ33KPYE.mjs → react-surface-O4LGTAZ3.mjs} +27 -27
- package/dist/lib/node-esm/react-surface-O4LGTAZ3.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-SJ24YG7M.mjs → settings-EOBQUZSW.mjs} +5 -5
- package/dist/lib/node-esm/{settings-SJ24YG7M.mjs.map → settings-EOBQUZSW.mjs.map} +1 -1
- package/dist/lib/node-esm/{state-D7WNDT3N.mjs → state-X3W67GTL.mjs} +5 -5
- package/dist/lib/node-esm/state-X3W67GTL.mjs.map +7 -0
- package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs +75 -0
- package/dist/lib/node-esm/toolkit-X2KA4FNC.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +7 -9
- package/dist/types/src/ThreadPlugin.d.ts +1 -1
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- package/dist/types/src/calls/call-manager.d.ts.map +1 -1
- package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
- package/dist/types/src/calls/media-manager.d.ts +1 -1
- package/dist/types/src/calls/media-manager.d.ts.map +1 -1
- package/dist/types/src/calls/types.d.ts +1 -1
- package/dist/types/src/calls/types.d.ts.map +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts +4 -2
- package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
- package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
- package/dist/types/src/calls-service.stories.d.ts +10 -9
- package/dist/types/src/calls-service.stories.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -1
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/call-manager.d.ts +1 -1
- package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +3 -3
- package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
- package/dist/types/src/capabilities/index.d.ts +11 -10
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +1 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts +1 -1
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-root.d.ts +2 -2
- package/dist/types/src/capabilities/react-surface.d.ts +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +1 -1
- package/dist/types/src/capabilities/state.d.ts +2 -2
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/toolkit.d.ts +24 -0
- package/dist/types/src/capabilities/toolkit.d.ts.map +1 -0
- package/dist/types/src/components/Call/Call.d.ts.map +1 -1
- package/dist/types/src/components/Call/Toolbar.d.ts +2 -2
- package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/CallDebugPanel.d.ts +7 -0
- package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
- package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
- package/dist/types/src/components/ChannelContainer.d.ts +2 -2
- package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
- package/dist/types/src/components/ChannelContainer.stories.d.ts +155 -5
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/Chat.stories.d.ts +158 -5
- package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts +6 -5
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
- package/dist/types/src/components/Comments.stories.d.ts +156 -4
- package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
- package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentsThreadContainer.d.ts +2 -2
- package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
- package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.d.ts +2 -2
- package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
- package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
- package/dist/types/src/components/MessageContainer.d.ts +4 -1
- package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
- package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
- package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +155 -3
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +157 -4
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
- package/dist/types/src/components/ThreadComplementary.d.ts.map +1 -1
- package/dist/types/src/components/ThreadSettings.d.ts +1 -1
- package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
- package/dist/types/src/components/command-extension.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +1 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +3 -2
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/extensions/threads.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +1 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts +1 -1
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/testing/stories.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +74 -6
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Channel.d.ts +16 -0
- package/dist/types/src/types/Channel.d.ts.map +1 -0
- package/dist/types/src/types/Thread.d.ts +167 -0
- package/dist/types/src/types/Thread.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +2 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +278 -206
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +64 -62
- package/src/ThreadPlugin.tsx +136 -126
- package/src/calls/call-manager.ts +2 -2
- package/src/calls/call-swarm-synchronizer.ts +1 -1
- package/src/calls/media-manager.ts +60 -34
- package/src/calls/types.ts +8 -4
- package/src/calls/util/calls-service.ts +65 -14
- package/src/calls/util/stub-media-streams.ts +62 -5
- package/src/calls-service.stories.tsx +78 -65
- package/src/capabilities/app-graph-builder.ts +24 -18
- package/src/capabilities/call-manager.ts +3 -2
- package/src/capabilities/capabilities.ts +8 -8
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/intent-resolver.ts +50 -20
- package/src/capabilities/markdown.ts +4 -3
- package/src/capabilities/react-root.tsx +2 -2
- package/src/capabilities/react-surface.tsx +19 -18
- package/src/capabilities/state.ts +2 -1
- package/src/capabilities/toolkit.ts +85 -0
- package/src/components/Call/Call.tsx +3 -2
- package/src/components/Call/Toolbar.tsx +7 -7
- package/src/components/CallDebugPanel.tsx +108 -49
- package/src/components/CallSidebar.tsx +2 -1
- package/src/components/ChannelContainer.stories.tsx +14 -13
- package/src/components/ChannelContainer.tsx +20 -16
- package/src/components/Chat.stories.tsx +32 -35
- package/src/components/ChatContainer.tsx +33 -20
- package/src/components/Comments.stories.tsx +38 -39
- package/src/components/CommentsContainer.tsx +4 -3
- package/src/components/CommentsThreadContainer.tsx +28 -21
- package/src/components/Lobby/Lobby.tsx +1 -1
- package/src/components/Media/VideoObject.stories.tsx +36 -28
- package/src/components/MessageContainer.tsx +43 -9
- package/src/components/Participant/Participant.tsx +13 -7
- package/src/components/Participant/ParticipantGrid.tsx +2 -1
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +8 -8
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +44 -42
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
- package/src/components/ThreadComplementary.tsx +42 -12
- package/src/components/ThreadSettings.tsx +6 -7
- package/src/components/command-extension.ts +5 -2
- package/src/components/testing.ts +25 -3
- package/src/extensions/threads.ts +7 -7
- package/src/hooks/index.ts +1 -0
- package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
- package/src/hooks/useDebugMode.ts +1 -1
- package/src/hooks/useVideoStreamTrack.tsx +6 -3
- package/src/meta.ts +9 -5
- package/src/testing/stories.ts +5 -8
- package/src/translations.ts +6 -3
- package/src/types/Channel.ts +27 -0
- package/src/types/Thread.ts +26 -0
- package/src/types/index.ts +2 -1
- package/src/types/types.ts +30 -20
- package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
- package/src/typings.d.ts +8 -0
- package/src/util.ts +1 -1
- package/dist/lib/browser/ChannelContainer-3GIE7ASU.mjs +0 -16
- package/dist/lib/browser/ChatContainer-AIGIWAUG.mjs +0 -15
- package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
- package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
- package/dist/lib/browser/chunk-3SGRT4NM.mjs +0 -367
- package/dist/lib/browser/chunk-3SGRT4NM.mjs.map +0 -7
- package/dist/lib/browser/chunk-6NSMBO3B.mjs.map +0 -7
- package/dist/lib/browser/chunk-ERWASUQK.mjs.map +0 -7
- package/dist/lib/browser/chunk-EV4JWI7L.mjs +0 -17
- package/dist/lib/browser/chunk-EV4JWI7L.mjs.map +0 -7
- package/dist/lib/browser/chunk-FR7KJPNY.mjs +0 -21
- package/dist/lib/browser/chunk-GCLD5ESP.mjs +0 -137
- package/dist/lib/browser/chunk-GCLD5ESP.mjs.map +0 -7
- package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
- package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
- package/dist/lib/browser/chunk-LGSDKXPF.mjs +0 -18
- package/dist/lib/browser/chunk-LGSDKXPF.mjs.map +0 -7
- package/dist/lib/browser/chunk-VUWC4IJM.mjs +0 -479
- package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
- package/dist/lib/browser/markdown-M3FMR7OD.mjs.map +0 -7
- package/dist/lib/browser/react-root-JEUSQXI6.mjs +0 -28
- package/dist/lib/browser/react-root-JEUSQXI6.mjs.map +0 -7
- package/dist/lib/browser/react-surface-XWS6GIZY.mjs.map +0 -7
- package/dist/lib/browser/state-H6CYONWE.mjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-7FXCKO7X.mjs +0 -17
- package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
- package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2CXOK2TD.mjs +0 -23
- package/dist/lib/node-esm/chunk-2MFNK53T.mjs +0 -480
- package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-75RJ5DJI.mjs +0 -19
- package/dist/lib/node-esm/chunk-75RJ5DJI.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FLBFYGBK.mjs +0 -368
- package/dist/lib/node-esm/chunk-FLBFYGBK.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GRLRWTRU.mjs +0 -19
- package/dist/lib/node-esm/chunk-GRLRWTRU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-OU5BYIDO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs +0 -138
- package/dist/lib/node-esm/chunk-TDFHTCZZ.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-INKTE4MH.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs +0 -29
- package/dist/lib/node-esm/react-root-XYYY2JXZ.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs.map +0 -7
- package/dist/lib/node-esm/state-D7WNDT3N.mjs.map +0 -7
- package/dist/types/src/types/schema.d.ts +0 -162
- package/dist/types/src/types/schema.d.ts.map +0 -1
- package/src/types/schema.ts +0 -33
- /package/dist/lib/browser/{ChannelContainer-3GIE7ASU.mjs.map → ChannelContainer-SVV4ZX5T.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-ALFWQ65B.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs.map → ChannelContainer-63GMQ753.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → ChatContainer-MFKPXMIK.mjs.map} +0 -0
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import '@
|
|
6
|
-
|
|
5
|
+
import { type Meta, type StoryObj } from '@storybook/react-vite';
|
|
7
6
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
8
7
|
|
|
9
8
|
import { scheduleTask, sleep } from '@dxos/async';
|
|
@@ -13,14 +12,15 @@ import { log } from '@dxos/log';
|
|
|
13
12
|
import { Config, useConfig } from '@dxos/react-client';
|
|
14
13
|
import { withClientProvider } from '@dxos/react-client/testing';
|
|
15
14
|
import { Button } from '@dxos/react-ui';
|
|
15
|
+
import { withTheme } from '@dxos/react-ui/testing';
|
|
16
16
|
import { Json } from '@dxos/react-ui-syntax-highlighter';
|
|
17
|
-
import { withLayout, withTheme } from '@dxos/storybook-utils';
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
import
|
|
18
|
+
const testVideo = new URL('../testing/video.mp4', import.meta.url).href;
|
|
19
|
+
|
|
20
|
+
import { CALLS_URL, CallsServicePeer, type TrackObject } from './calls';
|
|
21
|
+
import { useBlackCanvasStreamTrack, useInaudibleAudioStreamTrack, useVideoStreamTrack } from './hooks';
|
|
23
22
|
|
|
23
|
+
// TODO(burdon): THIS IS TOO COMPLEX FOR A TEST SETUP.
|
|
24
24
|
const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
25
25
|
const config = useConfig();
|
|
26
26
|
const callsConfig = {
|
|
@@ -35,16 +35,18 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
|
35
35
|
const [pulledTrack, setPulledTrack] = useState<MediaStreamTrack | undefined>(undefined);
|
|
36
36
|
const hadRun = useRef(false);
|
|
37
37
|
|
|
38
|
+
const deps: any[] = [];
|
|
38
39
|
// Push/pull video stream track to cloudflare.
|
|
39
40
|
useEffect(() => {
|
|
40
41
|
if (hadRun.current || !mediaStreamTrack || !peerPush || !peerPull) {
|
|
41
|
-
log.info('not running', { hadRun: hadRun.current, mediaStreamTrack, peerPush, peerPull });
|
|
42
42
|
return;
|
|
43
43
|
}
|
|
44
44
|
hadRun.current = true;
|
|
45
45
|
const ctx = Context.default();
|
|
46
|
+
log.info('setting up ctx', { ctx, mediaStreamTrack, peerPush, peerPull });
|
|
47
|
+
deps.push([ctx, mediaStreamTrack, peerPush, peerPull]);
|
|
46
48
|
ctx.onDispose(() => {
|
|
47
|
-
log.info('disposing ctx', {
|
|
49
|
+
log.info('disposing ctx', {});
|
|
48
50
|
});
|
|
49
51
|
scheduleTask(
|
|
50
52
|
ctx,
|
|
@@ -60,15 +62,12 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
|
60
62
|
// Push track to cloudflare.
|
|
61
63
|
performance.mark('push:begin');
|
|
62
64
|
log.info('pushing track', { track: mediaStreamTrack });
|
|
63
|
-
trackInfo.current = await peerPush.pushTrack({ track: mediaStreamTrack });
|
|
65
|
+
trackInfo.current = await peerPush.pushTrack({ track: mediaStreamTrack, ctx: Context.default() });
|
|
64
66
|
performance.mark('push:end');
|
|
65
67
|
const pushTime = performance.measure('push', 'push:begin', 'push:end').duration;
|
|
66
68
|
log.info('successfully pushed track', { pushTime, trackInfo: trackInfo.current });
|
|
67
69
|
setMetrics((prev) => ({ ...prev, 'time to push track [ms]': Math.round(pushTime) }));
|
|
68
70
|
|
|
69
|
-
// Wait for cloudflare to process the track.
|
|
70
|
-
await sleep(1000);
|
|
71
|
-
|
|
72
71
|
// Pull track from cloudflare.
|
|
73
72
|
performance.mark('pullTrack:begin');
|
|
74
73
|
pullCtx.current = Context.default();
|
|
@@ -104,7 +103,10 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
|
104
103
|
|
|
105
104
|
const rePullTrack = useCallback(async () => {
|
|
106
105
|
performance.mark('rePullVideo:begin');
|
|
107
|
-
|
|
106
|
+
if (!pulledTrack) {
|
|
107
|
+
log.info('no pulled track, skipping re-pull', { pulledTrack });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
108
110
|
pulledTrack.stop();
|
|
109
111
|
await pullCtx.current!.dispose();
|
|
110
112
|
pullCtx.current = Context.default();
|
|
@@ -123,12 +125,57 @@ const pushAndPullTrack = (mediaStreamTrack?: MediaStreamTrack) => {
|
|
|
123
125
|
pulledTrack,
|
|
124
126
|
rePullTrack,
|
|
125
127
|
metrics,
|
|
128
|
+
pushService: peerPush,
|
|
129
|
+
pullService: peerPull,
|
|
126
130
|
};
|
|
127
131
|
};
|
|
128
132
|
|
|
133
|
+
type StoryProps = { source: string };
|
|
134
|
+
|
|
135
|
+
const DefaultStory = ({ source }: StoryProps) => {
|
|
136
|
+
const pushVideoElement = useRef<HTMLVideoElement>(null);
|
|
137
|
+
const pullVideoElement = useRef<HTMLVideoElement>(null);
|
|
138
|
+
// Get video stream track.
|
|
139
|
+
const videoStreamTrack = useVideoStreamTrack(pushVideoElement, source);
|
|
140
|
+
const { pulledTrack, rePullTrack, metrics } = pushAndPullTrack(videoStreamTrack);
|
|
141
|
+
const hadRun = useRef(false);
|
|
142
|
+
|
|
143
|
+
// Push/pull video stream track to cloudflare.
|
|
144
|
+
useEffect(() => {
|
|
145
|
+
if (!pulledTrack || hadRun.current) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
hadRun.current = true;
|
|
149
|
+
const ctx = Context.default();
|
|
150
|
+
scheduleTask(ctx, async () => {
|
|
151
|
+
pullVideoElement.current!.srcObject = new MediaStream([pulledTrack]);
|
|
152
|
+
await pullVideoElement.current!.play();
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
return () => {
|
|
156
|
+
void ctx.dispose();
|
|
157
|
+
};
|
|
158
|
+
}, [pulledTrack]);
|
|
159
|
+
|
|
160
|
+
return (
|
|
161
|
+
<div className='grid grid-rows-3 gap-4 items-center'>
|
|
162
|
+
<video ref={pushVideoElement} muted autoPlay loop />
|
|
163
|
+
<div className='flex flex-col gap-4'>
|
|
164
|
+
<video ref={pullVideoElement} muted />
|
|
165
|
+
<Button disabled={!pulledTrack} onClick={rePullTrack}>
|
|
166
|
+
Re-pull video
|
|
167
|
+
</Button>
|
|
168
|
+
</div>
|
|
169
|
+
<Json data={metrics} />
|
|
170
|
+
</div>
|
|
171
|
+
);
|
|
172
|
+
};
|
|
173
|
+
|
|
129
174
|
const meta = {
|
|
130
175
|
title: 'plugins/plugin-thread/calls-service',
|
|
176
|
+
render: DefaultStory,
|
|
131
177
|
decorators: [
|
|
178
|
+
withTheme,
|
|
132
179
|
withClientProvider({
|
|
133
180
|
config: new Config({
|
|
134
181
|
runtime: {
|
|
@@ -138,72 +185,25 @@ const meta = {
|
|
|
138
185
|
},
|
|
139
186
|
}),
|
|
140
187
|
}),
|
|
141
|
-
withTheme,
|
|
142
|
-
withLayout(),
|
|
143
188
|
],
|
|
144
189
|
parameters: {
|
|
145
190
|
layout: 'centered',
|
|
146
191
|
},
|
|
147
|
-
}
|
|
192
|
+
} satisfies Meta<typeof DefaultStory>;
|
|
148
193
|
|
|
149
194
|
export default meta;
|
|
150
195
|
|
|
151
|
-
|
|
152
|
-
render: ({ videoSrc }: { videoSrc: string }) => {
|
|
153
|
-
const pushVideoElement = useRef<HTMLVideoElement>(null);
|
|
154
|
-
const pullVideoElement = useRef<HTMLVideoElement>(null);
|
|
155
|
-
// Get video stream track.
|
|
156
|
-
const videoStreamTrack = useVideoStreamTrack(pushVideoElement, videoSrc);
|
|
157
|
-
const { pulledTrack, rePullTrack, metrics } = pushAndPullTrack(videoStreamTrack);
|
|
158
|
-
const hadRun = useRef(false);
|
|
159
|
-
|
|
160
|
-
// Push/pull video stream track to cloudflare.
|
|
161
|
-
useEffect(() => {
|
|
162
|
-
if (!pulledTrack || hadRun.current) {
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
hadRun.current = true;
|
|
166
|
-
const ctx = Context.default();
|
|
167
|
-
scheduleTask(ctx, async () => {
|
|
168
|
-
pullVideoElement.current!.srcObject = new MediaStream([pulledTrack]);
|
|
169
|
-
await pullVideoElement.current!.play();
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
return () => {
|
|
173
|
-
void ctx.dispose();
|
|
174
|
-
};
|
|
175
|
-
}, [pulledTrack]);
|
|
196
|
+
type Story = StoryObj<typeof meta>;
|
|
176
197
|
|
|
177
|
-
|
|
178
|
-
<div className='grid grid-rows-3 gap-4 items-center'>
|
|
179
|
-
<video ref={pushVideoElement} muted autoPlay loop />
|
|
180
|
-
<div className='flex flex-col gap-4'>
|
|
181
|
-
<video ref={pullVideoElement} muted />
|
|
182
|
-
<Button
|
|
183
|
-
disabled={
|
|
184
|
-
!(
|
|
185
|
-
pullVideoElement?.current?.srcObject instanceof MediaStream &&
|
|
186
|
-
pullVideoElement.current.srcObject.getTracks()[0]
|
|
187
|
-
)
|
|
188
|
-
}
|
|
189
|
-
onClick={rePullTrack}
|
|
190
|
-
>
|
|
191
|
-
Re-pull video
|
|
192
|
-
</Button>
|
|
193
|
-
</div>
|
|
194
|
-
<Json data={metrics} />
|
|
195
|
-
</div>
|
|
196
|
-
);
|
|
197
|
-
},
|
|
198
|
+
export const Default: Story = {
|
|
198
199
|
args: {
|
|
199
|
-
|
|
200
|
+
source: testVideo,
|
|
200
201
|
},
|
|
201
202
|
};
|
|
202
203
|
|
|
203
204
|
export const InaudibleAudioStreamTrack = {
|
|
204
205
|
render: () => {
|
|
205
206
|
const audioStreamTrack = useInaudibleAudioStreamTrack();
|
|
206
|
-
|
|
207
207
|
const { rePullTrack, metrics } = pushAndPullTrack(audioStreamTrack);
|
|
208
208
|
|
|
209
209
|
return (
|
|
@@ -214,3 +214,16 @@ export const InaudibleAudioStreamTrack = {
|
|
|
214
214
|
);
|
|
215
215
|
},
|
|
216
216
|
};
|
|
217
|
+
|
|
218
|
+
export const BlackVideoStreamTrack = {
|
|
219
|
+
render: () => {
|
|
220
|
+
const videoStreamTrack = useBlackCanvasStreamTrack();
|
|
221
|
+
const { rePullTrack, metrics } = pushAndPullTrack(videoStreamTrack);
|
|
222
|
+
return (
|
|
223
|
+
<div className='flex flex-col gap-4 items-center'>
|
|
224
|
+
<Json data={metrics} />
|
|
225
|
+
<Button onClick={rePullTrack}>Re-pull audio</Button>
|
|
226
|
+
</div>
|
|
227
|
+
);
|
|
228
|
+
},
|
|
229
|
+
};
|
|
@@ -3,30 +3,34 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { Rx } from '@effect-rx/rx-react';
|
|
6
|
-
import
|
|
6
|
+
import * as Function from 'effect/Function';
|
|
7
|
+
import * as Option from 'effect/Option';
|
|
7
8
|
|
|
8
|
-
import { Capabilities, contributes, createIntent
|
|
9
|
+
import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
|
|
9
10
|
import { Obj } from '@dxos/echo';
|
|
10
11
|
import { AttentionCapabilities } from '@dxos/plugin-attention';
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
12
|
+
import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
|
|
13
|
+
import { ROOT_ID, createExtension, rxFromSignal } from '@dxos/plugin-graph';
|
|
13
14
|
import { fullyQualifiedId } from '@dxos/react-client/echo';
|
|
14
15
|
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import { ChannelType, ThreadAction } from '../types';
|
|
16
|
+
import { meta } from '../meta';
|
|
17
|
+
import { Channel, ThreadAction } from '../types';
|
|
18
18
|
import { getAnchor } from '../util';
|
|
19
19
|
|
|
20
|
+
import { ThreadCapabilities } from './capabilities';
|
|
21
|
+
|
|
22
|
+
// TODO(wittjosiah): Highlight active calls in L1.
|
|
23
|
+
// Track active meetings by subscribing to meetings query and polling the swarms of recent meetings in the space.
|
|
20
24
|
export default (context: PluginContext) => {
|
|
21
25
|
const resolve = (typename: string) =>
|
|
22
26
|
context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
|
|
23
27
|
|
|
24
28
|
return contributes(Capabilities.AppGraphBuilder, [
|
|
25
29
|
createExtension({
|
|
26
|
-
id: `${
|
|
30
|
+
id: `${meta.id}/active-call`,
|
|
27
31
|
connector: (node) =>
|
|
28
32
|
Rx.make((get) =>
|
|
29
|
-
pipe(
|
|
33
|
+
Function.pipe(
|
|
30
34
|
get(node),
|
|
31
35
|
Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
|
|
32
36
|
Option.map((node) => {
|
|
@@ -40,7 +44,7 @@ export default (context: PluginContext) => {
|
|
|
40
44
|
type: DECK_COMPANION_TYPE,
|
|
41
45
|
data: null,
|
|
42
46
|
properties: {
|
|
43
|
-
label: ['call panel label', { ns:
|
|
47
|
+
label: ['call panel label', { ns: meta.id }],
|
|
44
48
|
icon: 'ph--video-conference--regular',
|
|
45
49
|
position: 'hoist',
|
|
46
50
|
disposition: 'hidden',
|
|
@@ -58,12 +62,14 @@ export default (context: PluginContext) => {
|
|
|
58
62
|
// TODO(wittjosiah): The channel shouldn't become the companion during a call.
|
|
59
63
|
// Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.
|
|
60
64
|
createExtension({
|
|
61
|
-
id: `${
|
|
65
|
+
id: `${meta.id}/channel-chat-companion`,
|
|
62
66
|
connector: (node) => {
|
|
63
67
|
return Rx.make((get) => {
|
|
64
|
-
return pipe(
|
|
68
|
+
return Function.pipe(
|
|
65
69
|
get(node),
|
|
66
|
-
Option.flatMap((node) =>
|
|
70
|
+
Option.flatMap((node) =>
|
|
71
|
+
Obj.instanceOf(Channel.Channel, node.data) ? Option.some(node.data) : Option.none(),
|
|
72
|
+
),
|
|
67
73
|
Option.map((channel) => {
|
|
68
74
|
const callManager = context.getCapability(ThreadCapabilities.CallManager);
|
|
69
75
|
const joined = get(
|
|
@@ -79,7 +85,7 @@ export default (context: PluginContext) => {
|
|
|
79
85
|
type: PLANK_COMPANION_TYPE,
|
|
80
86
|
data: 'chat',
|
|
81
87
|
properties: {
|
|
82
|
-
label: ['channel companion label', { ns:
|
|
88
|
+
label: ['channel companion label', { ns: meta.id }],
|
|
83
89
|
icon: 'ph--hash--regular',
|
|
84
90
|
position: 'hoist',
|
|
85
91
|
disposition: 'hidden',
|
|
@@ -96,10 +102,10 @@ export default (context: PluginContext) => {
|
|
|
96
102
|
id: `${meta.id}/comments-companion`,
|
|
97
103
|
connector: (node) =>
|
|
98
104
|
Rx.make((get) =>
|
|
99
|
-
pipe(
|
|
105
|
+
Function.pipe(
|
|
100
106
|
get(node),
|
|
101
107
|
Option.flatMap((node) => {
|
|
102
|
-
if (!Obj.isObject(node.data) || Obj.instanceOf(
|
|
108
|
+
if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
|
|
103
109
|
return Option.none();
|
|
104
110
|
}
|
|
105
111
|
const metadata = resolve(Obj.getTypename(node.data)!);
|
|
@@ -126,10 +132,10 @@ export default (context: PluginContext) => {
|
|
|
126
132
|
id: `${meta.id}/comment-toolbar`,
|
|
127
133
|
actions: (node) =>
|
|
128
134
|
Rx.make((get) =>
|
|
129
|
-
pipe(
|
|
135
|
+
Function.pipe(
|
|
130
136
|
get(node),
|
|
131
137
|
Option.flatMap((node) => {
|
|
132
|
-
if (!Obj.isObject(node.data) || Obj.instanceOf(
|
|
138
|
+
if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
|
|
133
139
|
return Option.none();
|
|
134
140
|
}
|
|
135
141
|
const metadata = resolve(Obj.getTypename(node.data)!);
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
5
|
+
import { type PluginContext, contributes } from '@dxos/app-framework';
|
|
6
6
|
import { ClientCapabilities } from '@dxos/plugin-client';
|
|
7
7
|
|
|
8
|
-
import { ThreadCapabilities } from './capabilities';
|
|
9
8
|
import { CallManager } from '../calls';
|
|
10
9
|
|
|
10
|
+
import { ThreadCapabilities } from './capabilities';
|
|
11
|
+
|
|
11
12
|
export default async (context: PluginContext) => {
|
|
12
13
|
const client = context.getCapability(ClientCapabilities.Client);
|
|
13
14
|
const callManager = new CallManager(client);
|
|
@@ -5,29 +5,29 @@
|
|
|
5
5
|
import { defineCapability } from '@dxos/app-framework';
|
|
6
6
|
import { type DeepReadonly } from '@dxos/util';
|
|
7
7
|
|
|
8
|
-
import { type
|
|
9
|
-
import {
|
|
10
|
-
import { type
|
|
8
|
+
import { type CallManager, type CallState, type MediaState } from '../calls';
|
|
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>(`${
|
|
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?:
|
|
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>(`${
|
|
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
|
-
`${
|
|
28
|
+
`${meta.id}/capability/state`,
|
|
29
29
|
);
|
|
30
30
|
export const MutableState = defineCapability<{ state: ThreadState; getViewState: GetViewState }>(
|
|
31
|
-
`${
|
|
31
|
+
`${meta.id}/capability/state`,
|
|
32
32
|
);
|
|
33
33
|
}
|
|
@@ -12,5 +12,6 @@ export const ReactRoot = lazy(() => import('./react-root'));
|
|
|
12
12
|
export const ReactSurface = lazy(() => import('./react-surface'));
|
|
13
13
|
export const ThreadSettings = lazy(() => import('./settings'));
|
|
14
14
|
export const ThreadState = lazy(() => import('./state'));
|
|
15
|
+
export const Toolkit = lazy(() => import('./toolkit'));
|
|
15
16
|
|
|
16
17
|
export * from './capabilities';
|
|
@@ -2,31 +2,32 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
5
|
+
import * as Effect from 'effect/Effect';
|
|
6
6
|
|
|
7
|
-
import { Capabilities, contributes, createIntent, createResolver
|
|
7
|
+
import { Capabilities, type PluginContext, contributes, createIntent, createResolver } from '@dxos/app-framework';
|
|
8
8
|
import { sleep } from '@dxos/async';
|
|
9
9
|
import { Obj, Relation, Type } from '@dxos/echo';
|
|
10
10
|
import { invariant } from '@dxos/invariant';
|
|
11
11
|
import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';
|
|
12
12
|
import { ObservabilityAction } from '@dxos/plugin-observability/types';
|
|
13
13
|
import { CollectionAction, SpaceAction } from '@dxos/plugin-space/types';
|
|
14
|
-
import { fullyQualifiedId, getSpace
|
|
14
|
+
import { Ref, fullyQualifiedId, getSpace } from '@dxos/react-client/echo';
|
|
15
15
|
import { AnchoredTo, DataType } from '@dxos/schema';
|
|
16
16
|
|
|
17
|
+
import { meta } from '../meta';
|
|
18
|
+
import { Channel, Thread, ThreadAction } from '../types';
|
|
19
|
+
|
|
17
20
|
import { ThreadCapabilities } from './capabilities';
|
|
18
|
-
import { THREAD_PLUGIN } from '../meta';
|
|
19
|
-
import { ChannelType, ThreadAction, ThreadType } from '../types';
|
|
20
21
|
|
|
21
22
|
export default (context: PluginContext) =>
|
|
22
23
|
contributes(Capabilities.IntentResolver, [
|
|
23
24
|
createResolver({
|
|
24
|
-
intent: ThreadAction.
|
|
25
|
+
intent: ThreadAction.onCreateSpace,
|
|
25
26
|
resolve: ({ space, rootCollection }) =>
|
|
26
27
|
Effect.gen(function* () {
|
|
27
28
|
const { dispatch } = context.getCapability(Capabilities.IntentDispatcher);
|
|
28
29
|
const { object: collection } = yield* dispatch(
|
|
29
|
-
createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(
|
|
30
|
+
createIntent(CollectionAction.CreateQueryCollection, { typename: Type.getTypename(Channel.Channel) }),
|
|
30
31
|
);
|
|
31
32
|
rootCollection.objects.push(Ref.make(collection));
|
|
32
33
|
|
|
@@ -40,18 +41,14 @@ export default (context: PluginContext) =>
|
|
|
40
41
|
intent: ThreadAction.CreateChannel,
|
|
41
42
|
resolve: ({ name }) => ({
|
|
42
43
|
data: {
|
|
43
|
-
object:
|
|
44
|
-
name,
|
|
45
|
-
defaultThread: Ref.make(Obj.make(ThreadType, { messages: [], status: 'active' })),
|
|
46
|
-
threads: [],
|
|
47
|
-
}),
|
|
44
|
+
object: Channel.make({ name }),
|
|
48
45
|
},
|
|
49
46
|
}),
|
|
50
47
|
}),
|
|
51
48
|
createResolver({
|
|
52
49
|
intent: ThreadAction.CreateChannelThread,
|
|
53
50
|
resolve: ({ channel }) => {
|
|
54
|
-
const thread =
|
|
51
|
+
const thread = Thread.make({ status: 'active' });
|
|
55
52
|
channel.threads.push(Ref.make(thread));
|
|
56
53
|
return {
|
|
57
54
|
data: {
|
|
@@ -69,7 +66,7 @@ export default (context: PluginContext) =>
|
|
|
69
66
|
|
|
70
67
|
const { state } = context.getCapability(ThreadCapabilities.MutableState);
|
|
71
68
|
const subjectId = fullyQualifiedId(subject);
|
|
72
|
-
const thread =
|
|
69
|
+
const thread = Thread.make({ name });
|
|
73
70
|
const anchor = Relation.make(AnchoredTo, {
|
|
74
71
|
[Relation.Source]: thread,
|
|
75
72
|
[Relation.Target]: subject,
|
|
@@ -94,6 +91,39 @@ export default (context: PluginContext) =>
|
|
|
94
91
|
};
|
|
95
92
|
},
|
|
96
93
|
}),
|
|
94
|
+
createResolver({
|
|
95
|
+
intent: ThreadAction.AddProposal,
|
|
96
|
+
resolve: ({ text, anchor, sender, subject }) => {
|
|
97
|
+
const space = getSpace(subject);
|
|
98
|
+
invariant(space, 'Space not found');
|
|
99
|
+
|
|
100
|
+
const subjectId = fullyQualifiedId(subject);
|
|
101
|
+
const proposal = Obj.make(DataType.Message, {
|
|
102
|
+
created: new Date().toISOString(),
|
|
103
|
+
sender,
|
|
104
|
+
blocks: [{ _tag: 'proposal', text }],
|
|
105
|
+
});
|
|
106
|
+
const thread = Thread.make({ name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
intents: [
|
|
110
|
+
createIntent(SpaceAction.AddObject, { object: thread, target: space, hidden: true }),
|
|
111
|
+
createIntent(SpaceAction.AddRelation, {
|
|
112
|
+
space,
|
|
113
|
+
schema: AnchoredTo,
|
|
114
|
+
source: thread,
|
|
115
|
+
target: subject,
|
|
116
|
+
fields: { anchor },
|
|
117
|
+
}),
|
|
118
|
+
createIntent(ThreadAction.Select, { current: fullyQualifiedId(thread) }),
|
|
119
|
+
createIntent(DeckAction.ChangeCompanion, {
|
|
120
|
+
primary: subjectId,
|
|
121
|
+
companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,
|
|
122
|
+
}),
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
},
|
|
126
|
+
}),
|
|
97
127
|
createResolver({
|
|
98
128
|
intent: ThreadAction.Select,
|
|
99
129
|
resolve: ({ current }) => {
|
|
@@ -130,7 +160,7 @@ export default (context: PluginContext) =>
|
|
|
130
160
|
createResolver({
|
|
131
161
|
intent: ThreadAction.Delete,
|
|
132
162
|
resolve: async ({ subject, anchor, thread: _thread }, undo) => {
|
|
133
|
-
const thread = _thread ?? (Relation.getSource(anchor) as
|
|
163
|
+
const thread = _thread ?? (Relation.getSource(anchor) as Thread.Thread);
|
|
134
164
|
const { state } = context.getCapability(ThreadCapabilities.MutableState);
|
|
135
165
|
const subjectId = fullyQualifiedId(subject);
|
|
136
166
|
const draft = state.drafts[subjectId];
|
|
@@ -156,7 +186,7 @@ export default (context: PluginContext) =>
|
|
|
156
186
|
|
|
157
187
|
return {
|
|
158
188
|
undoable: {
|
|
159
|
-
message: ['thread deleted label', { ns:
|
|
189
|
+
message: ['thread deleted label', { ns: meta.id }],
|
|
160
190
|
data: { thread, anchor },
|
|
161
191
|
},
|
|
162
192
|
intents: [
|
|
@@ -192,12 +222,11 @@ export default (context: PluginContext) =>
|
|
|
192
222
|
createResolver({
|
|
193
223
|
intent: ThreadAction.AddMessage,
|
|
194
224
|
resolve: ({ anchor, subject, sender, text }) => {
|
|
195
|
-
const thread = Relation.getSource(anchor) as
|
|
225
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
196
226
|
const { state } = context.getCapability(ThreadCapabilities.MutableState);
|
|
197
227
|
const subjectId = fullyQualifiedId(subject);
|
|
198
228
|
const space = getSpace(subject);
|
|
199
229
|
invariant(space, 'Space not found');
|
|
200
|
-
const intents = [];
|
|
201
230
|
|
|
202
231
|
const message = Obj.make(DataType.Message, {
|
|
203
232
|
created: new Date().toISOString(),
|
|
@@ -208,6 +237,7 @@ export default (context: PluginContext) =>
|
|
|
208
237
|
});
|
|
209
238
|
thread.messages.push(Ref.make(message));
|
|
210
239
|
|
|
240
|
+
const intents = [];
|
|
211
241
|
const draft = state.drafts[subjectId]?.find((a) => a.id === anchor.id);
|
|
212
242
|
if (draft) {
|
|
213
243
|
// Move draft to document.
|
|
@@ -254,7 +284,7 @@ export default (context: PluginContext) =>
|
|
|
254
284
|
createResolver({
|
|
255
285
|
intent: ThreadAction.DeleteMessage,
|
|
256
286
|
resolve: ({ subject, anchor, messageId, message, messageIndex }, undo) => {
|
|
257
|
-
const thread = Relation.getSource(anchor) as
|
|
287
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
258
288
|
const space = getSpace(subject);
|
|
259
289
|
invariant(space, 'Space not found');
|
|
260
290
|
|
|
@@ -276,7 +306,7 @@ export default (context: PluginContext) =>
|
|
|
276
306
|
|
|
277
307
|
return {
|
|
278
308
|
undoable: {
|
|
279
|
-
message: ['message deleted label', { ns:
|
|
309
|
+
message: ['message deleted label', { ns: meta.id }],
|
|
280
310
|
data: { message, messageIndex },
|
|
281
311
|
},
|
|
282
312
|
intents: [
|
|
@@ -4,15 +4,16 @@
|
|
|
4
4
|
|
|
5
5
|
import { EditorView } from '@codemirror/view';
|
|
6
6
|
|
|
7
|
-
import { Capabilities, contributes, createIntent
|
|
7
|
+
import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
|
|
8
8
|
import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';
|
|
9
9
|
import { MarkdownCapabilities } from '@dxos/plugin-markdown';
|
|
10
10
|
import { fullyQualifiedId } from '@dxos/react-client/echo';
|
|
11
|
-
import { commentClickedEffect, commentsState,
|
|
11
|
+
import { type EditorState, commentClickedEffect, commentsState, overlap } from '@dxos/react-ui-editor';
|
|
12
12
|
|
|
13
|
-
import { ThreadCapabilities } from './capabilities';
|
|
14
13
|
import { threads } from '../extensions';
|
|
15
14
|
|
|
15
|
+
import { ThreadCapabilities } from './capabilities';
|
|
16
|
+
|
|
16
17
|
export default (context: PluginContext) =>
|
|
17
18
|
contributes(MarkdownCapabilities.Extensions, [
|
|
18
19
|
({ document: doc }) => {
|
|
@@ -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 {
|
|
10
|
+
import { meta } from '../meta';
|
|
11
11
|
|
|
12
12
|
export default () => {
|
|
13
13
|
return contributes(Capabilities.ReactRoot, {
|
|
14
|
-
id:
|
|
14
|
+
id: meta.id,
|
|
15
15
|
root: () => <Call.Audio />,
|
|
16
16
|
});
|
|
17
17
|
};
|