@dxos/plugin-thread 0.8.4-main.28f8d3d → 0.8.4-main.2c6827d
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-JI3ZRZ5S.mjs +17 -0
- package/dist/lib/browser/ChatContainer-6FVFME3R.mjs +16 -0
- package/dist/lib/browser/{app-graph-builder-AF3M7UWN.mjs → app-graph-builder-URVQHGMR.mjs} +32 -32
- package/dist/lib/browser/app-graph-builder-URVQHGMR.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs +101 -0
- package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs.map +7 -0
- package/dist/lib/browser/{call-manager-XRRCAVLI.mjs → call-manager-4YFT4XA6.mjs} +8 -7
- package/dist/lib/{node-esm/call-manager-EI7FXRAU.mjs.map → browser/call-manager-4YFT4XA6.mjs.map} +1 -1
- package/dist/lib/browser/chunk-6LWKNZUV.mjs +377 -0
- package/dist/lib/browser/chunk-6LWKNZUV.mjs.map +7 -0
- package/dist/lib/browser/chunk-CBUNHCOE.mjs +23 -0
- package/dist/lib/browser/chunk-CBUNHCOE.mjs.map +7 -0
- package/dist/lib/browser/chunk-CFC7LEPD.mjs +18 -0
- package/dist/lib/browser/chunk-CFC7LEPD.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-ZJ7QBXK6.mjs → chunk-F36NHPJG.mjs} +47 -42
- package/dist/lib/browser/chunk-F36NHPJG.mjs.map +7 -0
- package/dist/lib/browser/{chunk-JGKMMI65.mjs → chunk-ISCHODBV.mjs} +54 -4
- package/dist/lib/browser/chunk-ISCHODBV.mjs.map +7 -0
- package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/browser/{chunk-X5PIP5YR.mjs → chunk-KOBXMDCI.mjs} +74 -41
- package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +7 -0
- package/dist/lib/browser/chunk-QM34EZQK.mjs +20 -0
- package/dist/lib/browser/chunk-QM34EZQK.mjs.map +7 -0
- package/dist/lib/browser/chunk-R5UOPOO7.mjs +142 -0
- package/dist/lib/browser/chunk-R5UOPOO7.mjs.map +7 -0
- package/dist/lib/browser/chunk-VIRD2QSK.mjs +611 -0
- package/dist/lib/browser/chunk-VIRD2QSK.mjs.map +7 -0
- package/dist/lib/browser/{chunk-TUFWPOVS.mjs → chunk-ZCW3NSDZ.mjs} +256 -161
- package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +48 -38
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/{intent-resolver-DCY4P4OX.mjs → intent-resolver-YR6W4CRP.mjs} +33 -51
- package/dist/lib/browser/intent-resolver-YR6W4CRP.mjs.map +7 -0
- package/dist/lib/browser/{markdown-WZSXCEZJ.mjs → markdown-GSOBOXA7.mjs} +26 -24
- package/dist/lib/browser/markdown-GSOBOXA7.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/react-root-RAWRPF7Z.mjs +29 -0
- package/dist/lib/browser/react-root-RAWRPF7Z.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-PYAMIADB.mjs → react-surface-GOEFSXQ6.mjs} +38 -36
- package/dist/lib/browser/react-surface-GOEFSXQ6.mjs.map +7 -0
- package/dist/lib/browser/{settings-AC6YSASL.mjs → settings-JN2HHORY.mjs} +6 -5
- package/dist/lib/{node-esm/settings-N52O7MLS.mjs.map → browser/settings-JN2HHORY.mjs.map} +1 -1
- package/dist/lib/browser/{state-2T4KDWBX.mjs → state-UYPLBGZJ.mjs} +6 -5
- package/dist/lib/{node-esm/state-62TQKQVB.mjs.map → browser/state-UYPLBGZJ.mjs.map} +1 -1
- package/dist/lib/browser/types/index.mjs +7 -10
- package/dist/lib/node-esm/ChannelContainer-RQY4PR4F.mjs +18 -0
- package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs +17 -0
- package/dist/lib/node-esm/ChatContainer-KWNON7EN.mjs.map +7 -0
- package/dist/lib/node-esm/{app-graph-builder-OLSJVCWY.mjs → app-graph-builder-2IH5RPR7.mjs} +32 -32
- package/dist/lib/node-esm/app-graph-builder-2IH5RPR7.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs +102 -0
- package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs.map +7 -0
- package/dist/lib/node-esm/{call-manager-EI7FXRAU.mjs → call-manager-UMUXEYH5.mjs} +8 -7
- package/dist/lib/{browser/call-manager-XRRCAVLI.mjs.map → node-esm/call-manager-UMUXEYH5.mjs.map} +1 -1
- package/dist/lib/node-esm/chunk-2AEIN5MI.mjs +22 -0
- package/dist/lib/node-esm/chunk-2AEIN5MI.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-4TME3BR4.mjs → chunk-7KZWZS2U.mjs} +256 -161
- package/dist/lib/node-esm/chunk-7KZWZS2U.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-HSLMI22Q.mjs +11 -0
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-I3O6NXMN.mjs +25 -0
- package/dist/lib/node-esm/chunk-I3O6NXMN.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-MEIWWPR2.mjs +143 -0
- package/dist/lib/node-esm/chunk-MEIWWPR2.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-SED3O2XO.mjs → chunk-PZH2EDU5.mjs} +74 -41
- package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-QFCIKJOD.mjs +612 -0
- package/dist/lib/node-esm/chunk-QFCIKJOD.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-RT6NRL2I.mjs +19 -0
- package/dist/lib/node-esm/chunk-RT6NRL2I.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-QBHKLWGR.mjs → chunk-VBI32FGI.mjs} +54 -4
- package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-YIDU3DXK.mjs → chunk-Y3F2SGNH.mjs} +47 -42
- package/dist/lib/node-esm/chunk-Y3F2SGNH.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs +378 -0
- package/dist/lib/node-esm/chunk-Z4GUSLWL.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +48 -38
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/{intent-resolver-QGTPU6QB.mjs → intent-resolver-SJFABEE7.mjs} +33 -51
- package/dist/lib/node-esm/intent-resolver-SJFABEE7.mjs.map +7 -0
- package/dist/lib/node-esm/{markdown-3MZXUGUA.mjs → markdown-GG5566TL.mjs} +26 -24
- package/dist/lib/node-esm/markdown-GG5566TL.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/react-root-K5OGECUS.mjs +30 -0
- package/dist/lib/node-esm/react-root-K5OGECUS.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-UJFCSFNO.mjs → react-surface-5QDQD7MN.mjs} +38 -36
- package/dist/lib/node-esm/react-surface-5QDQD7MN.mjs.map +7 -0
- package/dist/lib/node-esm/{settings-N52O7MLS.mjs → settings-VSPM3BIM.mjs} +6 -5
- package/dist/lib/{browser/settings-AC6YSASL.mjs.map → node-esm/settings-VSPM3BIM.mjs.map} +1 -1
- package/dist/lib/node-esm/{state-62TQKQVB.mjs → state-XNWOLBNE.mjs} +6 -5
- package/dist/lib/{browser/state-2T4KDWBX.mjs.map → node-esm/state-XNWOLBNE.mjs.map} +1 -1
- package/dist/lib/node-esm/types/index.mjs +7 -10
- package/dist/types/src/ThreadPlugin.d.ts +1 -1
- package/dist/types/src/ThreadPlugin.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.map +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts +3 -1
- 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/blueprint-definition.d.ts +5 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/call-manager.d.ts +1 -1
- package/dist/types/src/capabilities/capabilities.d.ts +2 -2
- 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/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/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 +2 -2
- package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
- package/dist/types/src/components/CommentsThreadContainer.d.ts +9 -9
- package/dist/types/src/components/CommentsThreadContainer.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 +6 -3
- 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/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/ThreadCompanion.d.ts +5 -0
- package/dist/types/src/components/ThreadCompanion.d.ts.map +1 -0
- 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 +3 -3
- 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/functions/create-proposals.d.ts +6 -0
- package/dist/types/src/functions/create-proposals.d.ts.map +1 -0
- package/dist/types/src/functions/index.d.ts +2 -0
- package/dist/types/src/functions/index.d.ts.map +1 -0
- package/dist/types/src/hooks/analytics.d.ts +2 -2
- package/dist/types/src/hooks/analytics.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -1
- 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 +75 -7
- 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/index.d.ts +1 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +206 -210
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +65 -59
- package/src/ThreadPlugin.tsx +139 -125
- package/src/calls/call-manager.ts +1 -1
- package/src/calls/media-manager.ts +64 -35
- package/src/calls/types.ts +7 -3
- package/src/calls/util/calls-service.ts +61 -11
- package/src/calls/util/stub-media-streams.ts +62 -5
- package/src/calls-service.stories.tsx +76 -63
- package/src/capabilities/app-graph-builder.ts +43 -30
- package/src/capabilities/blueprint-definition.ts +38 -0
- package/src/capabilities/capabilities.ts +7 -7
- package/src/capabilities/index.ts +1 -0
- package/src/capabilities/intent-resolver.ts +23 -30
- package/src/capabilities/markdown.ts +5 -3
- package/src/capabilities/react-root.tsx +2 -2
- package/src/capabilities/react-surface.tsx +25 -23
- package/src/components/Call/Call.tsx +1 -1
- package/src/components/Call/Toolbar.tsx +9 -9
- package/src/components/CallDebugPanel.tsx +112 -55
- package/src/components/CallSidebar.tsx +1 -1
- package/src/components/ChannelContainer.stories.tsx +13 -13
- package/src/components/ChannelContainer.tsx +19 -15
- package/src/components/Chat.stories.tsx +30 -34
- package/src/components/ChatContainer.tsx +32 -21
- package/src/components/Comments.stories.tsx +36 -39
- package/src/components/CommentsContainer.tsx +5 -7
- package/src/components/CommentsThreadContainer.tsx +38 -33
- package/src/components/Lobby/Lobby.tsx +1 -1
- package/src/components/Media/VideoObject.stories.tsx +35 -28
- package/src/components/Media/VideoObject.tsx +1 -1
- package/src/components/MessageContainer.tsx +45 -12
- package/src/components/Participant/Participant.tsx +14 -8
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +5 -6
- package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +2 -2
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +42 -41
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +5 -5
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +5 -2
- package/src/components/{ThreadComplementary.tsx → ThreadCompanion.tsx} +72 -35
- package/src/components/ThreadSettings.tsx +6 -7
- package/src/components/command-extension.ts +4 -1
- package/src/components/index.ts +4 -4
- package/src/components/testing.ts +26 -6
- package/src/extensions/threads.ts +26 -17
- package/src/functions/create-proposals.ts +56 -0
- package/src/functions/index.ts +5 -0
- package/src/hooks/analytics.ts +4 -7
- package/src/hooks/index.ts +3 -1
- package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
- package/src/hooks/useVideoStreamTrack.tsx +6 -3
- package/src/meta.ts +9 -5
- package/src/testing/stories.ts +3 -6
- package/src/translations.ts +7 -4
- package/src/types/Channel.ts +26 -0
- package/src/types/index.ts +1 -1
- package/src/types/types.ts +27 -28
- package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
- package/src/util.ts +1 -1
- package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +0 -16
- package/dist/lib/browser/ChatContainer-PVT3DUZJ.mjs +0 -15
- package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +0 -7
- package/dist/lib/browser/chunk-2CWJBXBH.mjs +0 -21
- package/dist/lib/browser/chunk-2CWJBXBH.mjs.map +0 -7
- package/dist/lib/browser/chunk-4APCDRSH.mjs +0 -18
- package/dist/lib/browser/chunk-4APCDRSH.mjs.map +0 -7
- package/dist/lib/browser/chunk-DW7JD64V.mjs +0 -137
- package/dist/lib/browser/chunk-DW7JD64V.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-FY4ZRD5X.mjs +0 -367
- package/dist/lib/browser/chunk-FY4ZRD5X.mjs.map +0 -7
- package/dist/lib/browser/chunk-GERVMFQW.mjs.map +0 -7
- package/dist/lib/browser/chunk-J3JO5NWO.mjs +0 -477
- package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +0 -7
- package/dist/lib/browser/chunk-JGKMMI65.mjs.map +0 -7
- package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +0 -7
- package/dist/lib/browser/chunk-X5PIP5YR.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +0 -7
- package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +0 -7
- package/dist/lib/browser/react-root-QXPALOUQ.mjs +0 -28
- package/dist/lib/browser/react-root-QXPALOUQ.mjs.map +0 -7
- package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-B2ZGAE4P.mjs +0 -17
- package/dist/lib/node-esm/ChatContainer-2CT4PJ7I.mjs +0 -16
- package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-57XR3LEF.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6CRHHOST.mjs +0 -23
- package/dist/lib/node-esm/chunk-6CRHHOST.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-BF4UKS55.mjs +0 -368
- package/dist/lib/node-esm/chunk-BF4UKS55.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-PYTVBN5J.mjs +0 -19
- package/dist/lib/node-esm/chunk-PYTVBN5J.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QBHKLWGR.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-SED3O2XO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-VNG6M2IY.mjs +0 -478
- package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-XVKWHTH4.mjs +0 -138
- package/dist/lib/node-esm/chunk-XVKWHTH4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs +0 -29
- package/dist/lib/node-esm/react-root-7ZFJYVUZ.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +0 -7
- package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
- package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
- package/dist/types/src/types/schema.d.ts +0 -164
- package/dist/types/src/types/schema.d.ts.map +0 -1
- package/src/types/schema.ts +0 -33
- /package/dist/lib/browser/{ChannelContainer-O2SFQJU7.mjs.map → ChannelContainer-JI3ZRZ5S.mjs.map} +0 -0
- /package/dist/lib/browser/{ChatContainer-PVT3DUZJ.mjs.map → ChatContainer-6FVFME3R.mjs.map} +0 -0
- /package/dist/lib/{node-esm/ChannelContainer-B2ZGAE4P.mjs.map → browser/chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/node-esm/{ChatContainer-2CT4PJ7I.mjs.map → ChannelContainer-RQY4PR4F.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
|
-
|
|
18
|
+
const testVideo = new URL('../testing/video.mp4', import.meta.url).href;
|
|
20
19
|
|
|
21
20
|
import { CALLS_URL, CallsServicePeer, type TrackObject } from './calls';
|
|
22
|
-
import { useInaudibleAudioStreamTrack, useVideoStreamTrack } from './hooks';
|
|
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
|
+
};
|
|
@@ -2,38 +2,40 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
5
|
+
import { Atom } from '@effect-atom/atom-react';
|
|
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';
|
|
10
11
|
import { AttentionCapabilities } from '@dxos/plugin-attention';
|
|
11
12
|
import { ATTENDABLE_PATH_SEPARATOR, DECK_COMPANION_TYPE, PLANK_COMPANION_TYPE } from '@dxos/plugin-deck/types';
|
|
12
|
-
import { ROOT_ID,
|
|
13
|
-
import { fullyQualifiedId } from '@dxos/react-client/echo';
|
|
13
|
+
import { ROOT_ID, atomFromSignal, createExtension } from '@dxos/plugin-graph';
|
|
14
14
|
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
15
|
+
import { meta } from '../meta';
|
|
16
|
+
import { Channel, ThreadAction } from '../types';
|
|
17
17
|
import { getAnchor } from '../util';
|
|
18
18
|
|
|
19
19
|
import { ThreadCapabilities } from './capabilities';
|
|
20
20
|
|
|
21
|
+
// TODO(wittjosiah): Highlight active calls in L1.
|
|
22
|
+
// Track active meetings by subscribing to meetings query and polling the swarms of recent meetings in the space.
|
|
21
23
|
export default (context: PluginContext) => {
|
|
22
24
|
const resolve = (typename: string) =>
|
|
23
25
|
context.getCapabilities(Capabilities.Metadata).find(({ id }) => id === typename)?.metadata ?? {};
|
|
24
26
|
|
|
25
27
|
return contributes(Capabilities.AppGraphBuilder, [
|
|
26
28
|
createExtension({
|
|
27
|
-
id: `${
|
|
29
|
+
id: `${meta.id}/active-call`,
|
|
28
30
|
connector: (node) =>
|
|
29
|
-
|
|
30
|
-
pipe(
|
|
31
|
+
Atom.make((get) =>
|
|
32
|
+
Function.pipe(
|
|
31
33
|
get(node),
|
|
32
34
|
Option.flatMap((node) => (node.id === ROOT_ID ? Option.some(node) : Option.none())),
|
|
33
35
|
Option.map((node) => {
|
|
34
36
|
const [call] = get(context.capabilities(ThreadCapabilities.CallManager));
|
|
35
37
|
return get(
|
|
36
|
-
|
|
38
|
+
atomFromSignal(() =>
|
|
37
39
|
call?.joined
|
|
38
40
|
? [
|
|
39
41
|
{
|
|
@@ -41,7 +43,7 @@ export default (context: PluginContext) => {
|
|
|
41
43
|
type: DECK_COMPANION_TYPE,
|
|
42
44
|
data: null,
|
|
43
45
|
properties: {
|
|
44
|
-
label: ['call panel label', { ns:
|
|
46
|
+
label: ['call panel label', { ns: meta.id }],
|
|
45
47
|
icon: 'ph--video-conference--regular',
|
|
46
48
|
position: 'hoist',
|
|
47
49
|
disposition: 'hidden',
|
|
@@ -59,16 +61,18 @@ export default (context: PluginContext) => {
|
|
|
59
61
|
// TODO(wittjosiah): The channel shouldn't become the companion during a call.
|
|
60
62
|
// Alternative: the call/meeting/thread should be a child node of the channel and that should be opened.
|
|
61
63
|
createExtension({
|
|
62
|
-
id: `${
|
|
64
|
+
id: `${meta.id}/channel-chat-companion`,
|
|
63
65
|
connector: (node) => {
|
|
64
|
-
return
|
|
65
|
-
return pipe(
|
|
66
|
+
return Atom.make((get) => {
|
|
67
|
+
return Function.pipe(
|
|
66
68
|
get(node),
|
|
67
|
-
Option.flatMap((node) =>
|
|
69
|
+
Option.flatMap((node) =>
|
|
70
|
+
Obj.instanceOf(Channel.Channel, node.data) ? Option.some(node.data) : Option.none(),
|
|
71
|
+
),
|
|
68
72
|
Option.map((channel) => {
|
|
69
73
|
const callManager = context.getCapability(ThreadCapabilities.CallManager);
|
|
70
74
|
const joined = get(
|
|
71
|
-
|
|
75
|
+
atomFromSignal(() => callManager.joined && callManager.roomId === Obj.getDXN(channel).toString()),
|
|
72
76
|
);
|
|
73
77
|
if (!joined) {
|
|
74
78
|
return [];
|
|
@@ -76,11 +80,11 @@ export default (context: PluginContext) => {
|
|
|
76
80
|
|
|
77
81
|
return [
|
|
78
82
|
{
|
|
79
|
-
id: `${
|
|
83
|
+
id: `${Obj.getDXN(channel).toString()}${ATTENDABLE_PATH_SEPARATOR}chat`,
|
|
80
84
|
type: PLANK_COMPANION_TYPE,
|
|
81
85
|
data: 'chat',
|
|
82
86
|
properties: {
|
|
83
|
-
label: ['channel companion label', { ns:
|
|
87
|
+
label: ['channel companion label', { ns: meta.id }],
|
|
84
88
|
icon: 'ph--hash--regular',
|
|
85
89
|
position: 'hoist',
|
|
86
90
|
disposition: 'hidden',
|
|
@@ -96,11 +100,11 @@ export default (context: PluginContext) => {
|
|
|
96
100
|
createExtension({
|
|
97
101
|
id: `${meta.id}/comments-companion`,
|
|
98
102
|
connector: (node) =>
|
|
99
|
-
|
|
100
|
-
pipe(
|
|
103
|
+
Atom.make((get) =>
|
|
104
|
+
Function.pipe(
|
|
101
105
|
get(node),
|
|
102
106
|
Option.flatMap((node) => {
|
|
103
|
-
if (!Obj.isObject(node.data) || Obj.instanceOf(
|
|
107
|
+
if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
|
|
104
108
|
return Option.none();
|
|
105
109
|
}
|
|
106
110
|
const metadata = resolve(Obj.getTypename(node.data)!);
|
|
@@ -126,11 +130,11 @@ export default (context: PluginContext) => {
|
|
|
126
130
|
createExtension({
|
|
127
131
|
id: `${meta.id}/comment-toolbar`,
|
|
128
132
|
actions: (node) =>
|
|
129
|
-
|
|
130
|
-
pipe(
|
|
133
|
+
Atom.make((get) =>
|
|
134
|
+
Function.pipe(
|
|
131
135
|
get(node),
|
|
132
136
|
Option.flatMap((node) => {
|
|
133
|
-
if (!Obj.isObject(node.data) || Obj.instanceOf(
|
|
137
|
+
if (!Obj.isObject(node.data) || Obj.instanceOf(Channel.Channel, node.data)) {
|
|
134
138
|
return Option.none();
|
|
135
139
|
}
|
|
136
140
|
const metadata = resolve(Obj.getTypename(node.data)!);
|
|
@@ -140,28 +144,37 @@ export default (context: PluginContext) => {
|
|
|
140
144
|
const selectionManager = context.getCapability(AttentionCapabilities.Selection);
|
|
141
145
|
const toolbar = get(context.capabilities(ThreadCapabilities.State))[0]?.state.toolbar ?? {};
|
|
142
146
|
const disabled = get(
|
|
143
|
-
|
|
147
|
+
atomFromSignal(() => {
|
|
144
148
|
const metadata = resolve(Obj.getTypename(object)!);
|
|
145
|
-
const selection = selectionManager.getSelection(
|
|
149
|
+
const selection = selectionManager.getSelection(
|
|
150
|
+
Obj.getDXN(object).toString(),
|
|
151
|
+
metadata.selectionMode,
|
|
152
|
+
);
|
|
146
153
|
const anchor = getAnchor(selection);
|
|
147
154
|
const invalidSelection = !anchor;
|
|
148
|
-
const overlappingComment = toolbar[
|
|
155
|
+
const overlappingComment = toolbar[Obj.getDXN(object).toString()];
|
|
149
156
|
return (metadata.comments === 'anchored' && invalidSelection) || overlappingComment;
|
|
150
157
|
}),
|
|
151
158
|
);
|
|
152
159
|
|
|
153
160
|
return [
|
|
154
161
|
{
|
|
155
|
-
id: `${
|
|
162
|
+
id: `${Obj.getDXN(object).toString()}/comment`,
|
|
156
163
|
data: () => {
|
|
157
164
|
const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
|
|
158
165
|
const metadata = resolve(Obj.getTypename(object)!);
|
|
159
|
-
const selection = selectionManager.getSelection(
|
|
166
|
+
const selection = selectionManager.getSelection(Obj.getDXN(object).toString());
|
|
160
167
|
// TODO(wittjosiah): Use presence of selection to determine if the comment should be anchored.
|
|
161
168
|
// Requires all components which support selection (e.g. table/kanban) to support anchored comments.
|
|
162
169
|
const anchor = metadata.comments === 'anchored' ? getAnchor(selection) : Date.now().toString();
|
|
163
170
|
const name = metadata.getAnchorLabel?.(object, anchor);
|
|
164
|
-
void dispatch(
|
|
171
|
+
void dispatch(
|
|
172
|
+
createIntent(ThreadAction.Create, {
|
|
173
|
+
anchor,
|
|
174
|
+
name,
|
|
175
|
+
subject: object,
|
|
176
|
+
}),
|
|
177
|
+
);
|
|
165
178
|
},
|
|
166
179
|
properties: {
|
|
167
180
|
label: ['add comment label', { ns: meta.id }],
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2025 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { Capabilities, type Capability, contributes } from '@dxos/app-framework';
|
|
6
|
+
import { Blueprint, Template } from '@dxos/blueprints';
|
|
7
|
+
import { type FunctionDefinition } from '@dxos/functions';
|
|
8
|
+
import { trim } from '@dxos/util';
|
|
9
|
+
|
|
10
|
+
import { createProposals } from '../functions';
|
|
11
|
+
|
|
12
|
+
const functions: FunctionDefinition[] = [createProposals];
|
|
13
|
+
|
|
14
|
+
export const ASSISTANT_BLUEPRINT_KEY = 'dxos.org/blueprint/thread';
|
|
15
|
+
|
|
16
|
+
export default (): Capability<any>[] => [
|
|
17
|
+
contributes(Capabilities.Functions, functions),
|
|
18
|
+
contributes(
|
|
19
|
+
Capabilities.BlueprintDefinition,
|
|
20
|
+
Blueprint.make({
|
|
21
|
+
key: ASSISTANT_BLUEPRINT_KEY,
|
|
22
|
+
name: 'Thread',
|
|
23
|
+
tools: Blueprint.toolDefinitions({ functions }),
|
|
24
|
+
instructions: Template.make({
|
|
25
|
+
// TODO(wittjosiah): Move example to function input schema annotation.
|
|
26
|
+
source: trim`
|
|
27
|
+
You can update markdown documents via proposals.
|
|
28
|
+
For each diff, respond with the smallest possible matching span.
|
|
29
|
+
For example:
|
|
30
|
+
- "There is a tyop in this sentence."
|
|
31
|
+
+ "There is a typo in this sentence."
|
|
32
|
+
- "This id goof."
|
|
33
|
+
+ "This is good."
|
|
34
|
+
`,
|
|
35
|
+
}),
|
|
36
|
+
}),
|
|
37
|
+
),
|
|
38
|
+
];
|
|
@@ -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 {
|
|
10
|
-
import { type
|
|
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
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { lazy } from '@dxos/app-framework';
|
|
6
6
|
|
|
7
7
|
export const AppGraphBuilder = lazy(() => import('./app-graph-builder'));
|
|
8
|
+
export const BlueprintDefinition = lazy(() => import('./blueprint-definition'));
|
|
8
9
|
export const CallManager = lazy(() => import('./call-manager'));
|
|
9
10
|
export const IntentResolver = lazy(() => import('./intent-resolver'));
|
|
10
11
|
export const Markdown = lazy(() => import('./markdown'));
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright 2025 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import
|
|
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';
|
|
@@ -11,23 +11,23 @@ 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 { Ref,
|
|
15
|
-
import { AnchoredTo,
|
|
14
|
+
import { Ref, getSpace } from '@dxos/react-client/echo';
|
|
15
|
+
import { AnchoredTo, Message, Thread } from '@dxos/types';
|
|
16
16
|
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
17
|
+
import { meta } from '../meta';
|
|
18
|
+
import { Channel, 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.
|
|
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(
|
|
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:
|
|
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 =
|
|
51
|
+
const thread = Thread.make({ status: 'active' });
|
|
56
52
|
channel.threads.push(Ref.make(thread));
|
|
57
53
|
return {
|
|
58
54
|
data: {
|
|
@@ -65,13 +61,10 @@ export default (context: PluginContext) =>
|
|
|
65
61
|
createResolver({
|
|
66
62
|
intent: ThreadAction.Create,
|
|
67
63
|
resolve: ({ name, anchor: _anchor, subject }) => {
|
|
68
|
-
const space = getSpace(subject);
|
|
69
|
-
invariant(space, 'Space not found');
|
|
70
|
-
|
|
71
64
|
const { state } = context.getCapability(ThreadCapabilities.MutableState);
|
|
72
|
-
const subjectId =
|
|
73
|
-
const thread =
|
|
74
|
-
const anchor = Relation.make(AnchoredTo, {
|
|
65
|
+
const subjectId = Obj.getDXN(subject).toString();
|
|
66
|
+
const thread = Thread.make({ name });
|
|
67
|
+
const anchor = Relation.make(AnchoredTo.AnchoredTo, {
|
|
75
68
|
[Relation.Source]: thread,
|
|
76
69
|
[Relation.Target]: subject,
|
|
77
70
|
anchor: _anchor,
|
|
@@ -86,7 +79,7 @@ export default (context: PluginContext) =>
|
|
|
86
79
|
|
|
87
80
|
return {
|
|
88
81
|
intents: [
|
|
89
|
-
createIntent(ThreadAction.Select, { current:
|
|
82
|
+
createIntent(ThreadAction.Select, { current: Obj.getDXN(thread).toString() }),
|
|
90
83
|
createIntent(DeckAction.ChangeCompanion, {
|
|
91
84
|
primary: subjectId,
|
|
92
85
|
companion: `${subjectId}${ATTENDABLE_PATH_SEPARATOR}comments`,
|
|
@@ -131,9 +124,9 @@ export default (context: PluginContext) =>
|
|
|
131
124
|
createResolver({
|
|
132
125
|
intent: ThreadAction.Delete,
|
|
133
126
|
resolve: async ({ subject, anchor, thread: _thread }, undo) => {
|
|
134
|
-
const thread = _thread ?? (Relation.getSource(anchor) as
|
|
127
|
+
const thread = _thread ?? (Relation.getSource(anchor) as Thread.Thread);
|
|
135
128
|
const { state } = context.getCapability(ThreadCapabilities.MutableState);
|
|
136
|
-
const subjectId =
|
|
129
|
+
const subjectId = Obj.getDXN(subject).toString();
|
|
137
130
|
const draft = state.drafts[subjectId];
|
|
138
131
|
if (draft) {
|
|
139
132
|
// Check if we're deleting a draft; if so, remo ve it.
|
|
@@ -157,7 +150,7 @@ export default (context: PluginContext) =>
|
|
|
157
150
|
|
|
158
151
|
return {
|
|
159
152
|
undoable: {
|
|
160
|
-
message: ['thread deleted label', { ns:
|
|
153
|
+
message: ['thread deleted label', { ns: meta.id }],
|
|
161
154
|
data: { thread, anchor },
|
|
162
155
|
},
|
|
163
156
|
intents: [
|
|
@@ -193,14 +186,13 @@ export default (context: PluginContext) =>
|
|
|
193
186
|
createResolver({
|
|
194
187
|
intent: ThreadAction.AddMessage,
|
|
195
188
|
resolve: ({ anchor, subject, sender, text }) => {
|
|
196
|
-
const thread = Relation.getSource(anchor) as
|
|
189
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
197
190
|
const { state } = context.getCapability(ThreadCapabilities.MutableState);
|
|
198
|
-
const subjectId =
|
|
191
|
+
const subjectId = Obj.getDXN(subject).toString();
|
|
199
192
|
const space = getSpace(subject);
|
|
200
193
|
invariant(space, 'Space not found');
|
|
201
|
-
const intents = [];
|
|
202
194
|
|
|
203
|
-
const message = Obj.make(
|
|
195
|
+
const message = Obj.make(Message.Message, {
|
|
204
196
|
created: new Date().toISOString(),
|
|
205
197
|
sender,
|
|
206
198
|
blocks: [{ _tag: 'text', text }],
|
|
@@ -209,6 +201,7 @@ export default (context: PluginContext) =>
|
|
|
209
201
|
});
|
|
210
202
|
thread.messages.push(Ref.make(message));
|
|
211
203
|
|
|
204
|
+
const intents = [];
|
|
212
205
|
const draft = state.drafts[subjectId]?.find((a) => a.id === anchor.id);
|
|
213
206
|
if (draft) {
|
|
214
207
|
// Move draft to document.
|
|
@@ -219,7 +212,7 @@ export default (context: PluginContext) =>
|
|
|
219
212
|
intents.push(
|
|
220
213
|
createIntent(SpaceAction.AddRelation, {
|
|
221
214
|
space,
|
|
222
|
-
schema: AnchoredTo,
|
|
215
|
+
schema: AnchoredTo.AnchoredTo,
|
|
223
216
|
source: thread,
|
|
224
217
|
target: subject,
|
|
225
218
|
fields: { anchor: draft.anchor },
|
|
@@ -255,7 +248,7 @@ export default (context: PluginContext) =>
|
|
|
255
248
|
createResolver({
|
|
256
249
|
intent: ThreadAction.DeleteMessage,
|
|
257
250
|
resolve: ({ subject, anchor, messageId, message, messageIndex }, undo) => {
|
|
258
|
-
const thread = Relation.getSource(anchor) as
|
|
251
|
+
const thread = Relation.getSource(anchor) as Thread.Thread;
|
|
259
252
|
const space = getSpace(subject);
|
|
260
253
|
invariant(space, 'Space not found');
|
|
261
254
|
|
|
@@ -277,7 +270,7 @@ export default (context: PluginContext) =>
|
|
|
277
270
|
|
|
278
271
|
return {
|
|
279
272
|
undoable: {
|
|
280
|
-
message: ['message deleted label', { ns:
|
|
273
|
+
message: ['message deleted label', { ns: meta.id }],
|
|
281
274
|
data: { message, messageIndex },
|
|
282
275
|
},
|
|
283
276
|
intents: [
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
import { EditorView } from '@codemirror/view';
|
|
6
6
|
|
|
7
7
|
import { Capabilities, type PluginContext, contributes, createIntent } from '@dxos/app-framework';
|
|
8
|
+
import { Obj } from '@dxos/echo';
|
|
8
9
|
import { ATTENDABLE_PATH_SEPARATOR, DeckAction } from '@dxos/plugin-deck/types';
|
|
9
10
|
import { MarkdownCapabilities } from '@dxos/plugin-markdown';
|
|
10
|
-
import { fullyQualifiedId } from '@dxos/react-client/echo';
|
|
11
11
|
import { type EditorState, commentClickedEffect, commentsState, overlap } from '@dxos/react-ui-editor';
|
|
12
12
|
|
|
13
13
|
import { threads } from '../extensions';
|
|
@@ -22,17 +22,19 @@ export default (context: PluginContext) =>
|
|
|
22
22
|
return threads(state, doc, dispatch);
|
|
23
23
|
},
|
|
24
24
|
({ document: doc }) => {
|
|
25
|
+
if (!doc) return [];
|
|
25
26
|
const { state } = context.getCapability(ThreadCapabilities.MutableState);
|
|
26
27
|
|
|
27
28
|
return EditorView.updateListener.of((update) => {
|
|
28
29
|
if (update.docChanged || update.selectionSet) {
|
|
29
|
-
state.toolbar[
|
|
30
|
+
state.toolbar[Obj.getDXN(doc).toString()] = selectionOverlapsComment(update.state);
|
|
30
31
|
}
|
|
31
32
|
});
|
|
32
33
|
},
|
|
33
34
|
({ document: doc }) => {
|
|
35
|
+
if (!doc) return [];
|
|
34
36
|
const { dispatchPromise: dispatch } = context.getCapability(Capabilities.IntentDispatcher);
|
|
35
|
-
const id =
|
|
37
|
+
const id = Obj.getDXN(doc).toString();
|
|
36
38
|
|
|
37
39
|
return EditorView.updateListener.of((update) => {
|
|
38
40
|
update.transactions.forEach((transaction) => {
|