@dxos/plugin-thread 0.8.4-main.7ace549 → 0.8.4-main.9735255
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/app-graph-builder-7C2QW32W.mjs +188 -0
- package/dist/lib/browser/app-graph-builder-7C2QW32W.mjs.map +7 -0
- package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs +17 -0
- package/dist/lib/browser/blueprint-definition-UQ63QKQG.mjs.map +7 -0
- package/dist/lib/browser/blueprints/index.mjs +8 -0
- package/dist/lib/browser/call-manager-4P536YNX.mjs +26 -0
- package/dist/lib/browser/call-manager-4P536YNX.mjs.map +7 -0
- package/dist/lib/browser/chunk-2FIHSX35.mjs +293 -0
- package/dist/lib/browser/chunk-2FIHSX35.mjs.map +7 -0
- package/dist/lib/browser/{chunk-KOBXMDCI.mjs → chunk-DLO2G3DM.mjs} +14 -12
- package/dist/lib/browser/chunk-DLO2G3DM.mjs.map +7 -0
- package/dist/lib/browser/{chunk-ZCW3NSDZ.mjs → chunk-ERK254BS.mjs} +68 -51
- package/dist/lib/browser/chunk-ERK254BS.mjs.map +7 -0
- package/dist/lib/browser/chunk-YSHXWAL3.mjs +1815 -0
- package/dist/lib/browser/chunk-YSHXWAL3.mjs.map +7 -0
- package/dist/lib/browser/{blueprint-definition-TQ4JFMZZ.mjs → chunk-ZFLSTQSE.mjs} +39 -34
- package/dist/lib/browser/chunk-ZFLSTQSE.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +100 -90
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/markdown-QMJLRR6R.mjs +210 -0
- package/dist/lib/browser/markdown-QMJLRR6R.mjs.map +7 -0
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/operation-resolver-T63EP5TY.mjs +441 -0
- package/dist/lib/browser/operation-resolver-T63EP5TY.mjs.map +7 -0
- package/dist/lib/browser/react-root-56MJI77R.mjs +25 -0
- package/dist/lib/browser/react-root-56MJI77R.mjs.map +7 -0
- package/dist/lib/browser/{react-surface-AUQQSQQC.mjs → react-surface-DMBHQOXJ.mjs} +32 -33
- package/dist/lib/browser/react-surface-DMBHQOXJ.mjs.map +7 -0
- package/dist/lib/browser/{repair-JFJLEM2O.mjs → repair-6OZ75AUU.mjs} +12 -9
- package/dist/lib/browser/repair-6OZ75AUU.mjs.map +7 -0
- package/dist/lib/browser/settings-WZMJMML3.mjs +32 -0
- package/dist/lib/browser/settings-WZMJMML3.mjs.map +7 -0
- package/dist/lib/browser/state-SJR2GL5G.mjs +24 -0
- package/dist/lib/browser/state-SJR2GL5G.mjs.map +7 -0
- package/dist/lib/browser/types/index.mjs +5 -4
- package/dist/lib/node-esm/app-graph-builder-JCSVFRVY.mjs +189 -0
- package/dist/lib/node-esm/app-graph-builder-JCSVFRVY.mjs.map +7 -0
- package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs +18 -0
- package/dist/lib/node-esm/blueprint-definition-MZZXXL37.mjs.map +7 -0
- package/dist/lib/node-esm/blueprints/index.mjs +9 -0
- package/dist/lib/node-esm/call-manager-FMLRR5S5.mjs +27 -0
- package/dist/lib/node-esm/call-manager-FMLRR5S5.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-7XQLXMX7.mjs +1816 -0
- package/dist/lib/node-esm/chunk-7XQLXMX7.mjs.map +7 -0
- package/dist/lib/node-esm/{blueprint-definition-TSX5HHW7.mjs → chunk-AQHPP6ZX.mjs} +39 -34
- package/dist/lib/node-esm/chunk-AQHPP6ZX.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-PZH2EDU5.mjs → chunk-KRBZBJRI.mjs} +14 -12
- package/dist/lib/node-esm/chunk-KRBZBJRI.mjs.map +7 -0
- package/dist/lib/node-esm/{chunk-7KZWZS2U.mjs → chunk-QP3KQOPQ.mjs} +68 -51
- package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +7 -0
- package/dist/lib/node-esm/chunk-WMWUXWAS.mjs +294 -0
- package/dist/lib/node-esm/chunk-WMWUXWAS.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +100 -90
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/markdown-L6LLQLIN.mjs +211 -0
- package/dist/lib/node-esm/markdown-L6LLQLIN.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/operation-resolver-G6GZPBRP.mjs +442 -0
- package/dist/lib/node-esm/operation-resolver-G6GZPBRP.mjs.map +7 -0
- package/dist/lib/node-esm/react-root-V4W4X5GL.mjs +26 -0
- package/dist/lib/node-esm/react-root-V4W4X5GL.mjs.map +7 -0
- package/dist/lib/node-esm/{react-surface-AMVESEF4.mjs → react-surface-ELDSTUA3.mjs} +32 -33
- package/dist/lib/node-esm/react-surface-ELDSTUA3.mjs.map +7 -0
- package/dist/lib/node-esm/{repair-RMLR24YR.mjs → repair-6777EPOM.mjs} +12 -9
- package/dist/lib/node-esm/repair-6777EPOM.mjs.map +7 -0
- package/dist/lib/node-esm/settings-37CO3SNR.mjs +33 -0
- package/dist/lib/node-esm/settings-37CO3SNR.mjs.map +7 -0
- package/dist/lib/node-esm/state-5R3TZJQE.mjs +25 -0
- package/dist/lib/node-esm/state-5R3TZJQE.mjs.map +7 -0
- package/dist/lib/node-esm/types/index.mjs +5 -4
- package/dist/types/src/ThreadPlugin.d.ts +2 -1
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- package/dist/types/src/blueprints/index.d.ts +2 -0
- package/dist/types/src/blueprints/index.d.ts.map +1 -0
- package/dist/types/src/blueprints/thread-blueprint.d.ts +21 -0
- package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -0
- package/dist/types/src/calls/call-manager.d.ts +40 -30
- package/dist/types/src/calls/call-manager.d.ts.map +1 -1
- package/dist/types/src/calls/call-swarm-synchronizer.d.ts +2 -2
- 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/util/calls-service.d.ts +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
- package/dist/types/src/calls/util/task-scheduling.d.ts +2 -2
- package/dist/types/src/calls/util/task-scheduling.d.ts.map +1 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts +6 -0
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts +3 -0
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +9 -0
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/call-manager/call-manager.d.ts +6 -0
- package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +1 -0
- package/dist/types/src/capabilities/call-manager/index.d.ts +3 -0
- package/dist/types/src/capabilities/call-manager/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +10 -17
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown/index.d.ts +3 -0
- package/dist/types/src/capabilities/markdown/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/markdown/markdown.d.ts +5 -0
- package/dist/types/src/capabilities/markdown/markdown.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-root/index.d.ts +6 -0
- package/dist/types/src/capabilities/react-root/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-root/react-root.d.ts +9 -0
- package/dist/types/src/capabilities/react-root/react-root.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
- package/dist/types/src/capabilities/repair/index.d.ts +3 -0
- package/dist/types/src/capabilities/repair/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/repair/repair.d.ts +6 -0
- package/dist/types/src/capabilities/repair/repair.d.ts.map +1 -0
- package/dist/types/src/capabilities/settings/index.d.ts +3 -0
- package/dist/types/src/capabilities/settings/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/settings/settings.d.ts +5 -0
- package/dist/types/src/capabilities/settings/settings.d.ts.map +1 -0
- package/dist/types/src/capabilities/state/index.d.ts +3 -0
- package/dist/types/src/capabilities/state/index.d.ts.map +1 -0
- package/dist/types/src/capabilities/state/state.d.ts +7 -0
- package/dist/types/src/capabilities/state/state.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.map +1 -1
- package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
- package/dist/types/src/components/ChannelContainer.d.ts +4 -5
- package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
- package/dist/types/src/components/ChannelContainer.stories.d.ts +1 -1
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
- package/dist/types/src/components/ChatContainer.d.ts +1 -1
- package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
- package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
- 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 +1 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
- package/dist/types/src/components/MessageContainer.d.ts +3 -4
- 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/ThreadCompanion.d.ts.map +1 -1
- package/dist/types/src/components/ThreadSettings.d.ts +4 -2
- package/dist/types/src/components/ThreadSettings.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +2 -2
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/extensions/threads.d.ts +7 -2
- package/dist/types/src/extensions/threads.d.ts.map +1 -1
- package/dist/types/src/functions/create-proposals.d.ts.map +1 -1
- package/dist/types/src/hooks/analytics.d.ts +1 -2
- package/dist/types/src/hooks/analytics.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +1 -1
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +2 -2
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/testing/stories.d.ts +2 -1
- package/dist/types/src/testing/stories.d.ts.map +1 -1
- package/dist/types/src/types/Channel.d.ts +691 -12
- package/dist/types/src/types/Channel.d.ts.map +1 -1
- package/dist/types/src/types/capabilities.d.ts +23 -0
- package/dist/types/src/types/capabilities.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +1 -0
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +3182 -295
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +86 -69
- package/src/ThreadPlugin.tsx +50 -80
- package/src/blueprints/index.ts +5 -0
- package/src/blueprints/thread-blueprint.ts +32 -0
- package/src/calls/call-manager.ts +76 -52
- package/src/calls/call-swarm-synchronizer.ts +2 -2
- package/src/calls/media-manager.ts +1 -1
- package/src/calls/util/calls-service.ts +1 -1
- package/src/calls/util/task-scheduling.ts +4 -4
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +201 -0
- package/src/capabilities/app-graph-builder/index.ts +7 -0
- package/src/capabilities/blueprint-definition/blueprint-definition.ts +23 -0
- package/src/capabilities/blueprint-definition/index.ts +7 -0
- package/src/capabilities/call-manager/call-manager.ts +26 -0
- package/src/capabilities/call-manager/index.ts +7 -0
- package/src/capabilities/index.ts +10 -14
- package/src/capabilities/markdown/index.ts +7 -0
- package/src/capabilities/markdown/markdown.ts +83 -0
- package/src/capabilities/operation-resolver/index.ts +7 -0
- package/src/capabilities/operation-resolver/operation-resolver.ts +400 -0
- package/src/capabilities/react-root/index.ts +7 -0
- package/src/capabilities/react-root/react-root.tsx +20 -0
- package/src/capabilities/react-surface/index.ts +7 -0
- package/src/capabilities/react-surface/react-surface.tsx +97 -0
- package/src/capabilities/repair/index.ts +7 -0
- package/src/capabilities/{repair.ts → repair/repair.ts} +21 -10
- package/src/capabilities/settings/index.ts +7 -0
- package/src/capabilities/settings/settings.ts +33 -0
- package/src/capabilities/state/index.ts +7 -0
- package/src/capabilities/state/state.ts +22 -0
- package/src/components/Call/Call.tsx +7 -3
- package/src/components/Call/Toolbar.tsx +28 -20
- package/src/components/CallSidebar.tsx +4 -2
- package/src/components/ChannelContainer.stories.tsx +10 -8
- package/src/components/ChannelContainer.tsx +18 -16
- package/src/components/Chat.stories.tsx +6 -6
- package/src/components/ChatContainer.tsx +19 -17
- package/src/components/Comments.stories.tsx +21 -18
- package/src/components/CommentsThreadContainer.tsx +9 -9
- package/src/components/Lobby/Lobby.tsx +8 -6
- package/src/components/Media/AudioStream.tsx +2 -2
- package/src/components/Media/VideoObject.tsx +1 -1
- package/src/components/MessageContainer.tsx +53 -24
- package/src/components/Participant/Participant.tsx +31 -18
- package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +1 -1
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +1 -1
- package/src/components/ThreadCompanion.tsx +69 -64
- package/src/components/ThreadSettings.tsx +6 -1
- package/src/components/command-extension.ts +2 -2
- package/src/components/index.ts +2 -5
- package/src/extensions/threads.ts +75 -41
- package/src/functions/create-proposals.ts +5 -4
- package/src/hooks/analytics.ts +23 -20
- package/src/index.ts +1 -1
- package/src/meta.ts +2 -2
- package/src/testing/stories.ts +15 -11
- package/src/types/Channel.ts +10 -6
- package/src/types/capabilities.ts +34 -0
- package/src/types/index.ts +1 -0
- package/src/types/types.ts +160 -73
- package/dist/lib/browser/ChannelContainer-L7MKV7DS.mjs +0 -17
- package/dist/lib/browser/ChatContainer-KPY4BAUE.mjs +0 -16
- package/dist/lib/browser/app-graph-builder-TWJ2UCOZ.mjs +0 -171
- package/dist/lib/browser/app-graph-builder-TWJ2UCOZ.mjs.map +0 -7
- package/dist/lib/browser/blueprint-definition-TQ4JFMZZ.mjs.map +0 -7
- package/dist/lib/browser/call-manager-4YFT4XA6.mjs +0 -25
- package/dist/lib/browser/call-manager-4YFT4XA6.mjs.map +0 -7
- package/dist/lib/browser/chunk-ALZKJOZK.mjs +0 -989
- package/dist/lib/browser/chunk-ALZKJOZK.mjs.map +0 -7
- package/dist/lib/browser/chunk-ANTFU4JB.mjs +0 -25
- package/dist/lib/browser/chunk-ANTFU4JB.mjs.map +0 -7
- package/dist/lib/browser/chunk-CFC7LEPD.mjs +0 -18
- package/dist/lib/browser/chunk-CFC7LEPD.mjs.map +0 -7
- package/dist/lib/browser/chunk-JDJPMI7V.mjs +0 -143
- package/dist/lib/browser/chunk-JDJPMI7V.mjs.map +0 -7
- package/dist/lib/browser/chunk-KOBXMDCI.mjs.map +0 -7
- package/dist/lib/browser/chunk-NPT5S6N4.mjs +0 -611
- package/dist/lib/browser/chunk-NPT5S6N4.mjs.map +0 -7
- package/dist/lib/browser/chunk-QM34EZQK.mjs +0 -20
- package/dist/lib/browser/chunk-QM34EZQK.mjs.map +0 -7
- package/dist/lib/browser/chunk-TLOOZTRD.mjs +0 -377
- package/dist/lib/browser/chunk-TLOOZTRD.mjs.map +0 -7
- package/dist/lib/browser/chunk-ZCW3NSDZ.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-G33FT3NO.mjs +0 -355
- package/dist/lib/browser/intent-resolver-G33FT3NO.mjs.map +0 -7
- package/dist/lib/browser/markdown-WFZFYJBQ.mjs +0 -172
- package/dist/lib/browser/markdown-WFZFYJBQ.mjs.map +0 -7
- package/dist/lib/browser/react-root-ED7PHA44.mjs +0 -29
- package/dist/lib/browser/react-root-ED7PHA44.mjs.map +0 -7
- package/dist/lib/browser/react-surface-AUQQSQQC.mjs.map +0 -7
- package/dist/lib/browser/repair-JFJLEM2O.mjs.map +0 -7
- package/dist/lib/browser/settings-E6IOLK46.mjs +0 -23
- package/dist/lib/browser/settings-E6IOLK46.mjs.map +0 -7
- package/dist/lib/browser/state-UYPLBGZJ.mjs +0 -35
- package/dist/lib/browser/state-UYPLBGZJ.mjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-FYONOOZ6.mjs +0 -18
- package/dist/lib/node-esm/ChannelContainer-FYONOOZ6.mjs.map +0 -7
- package/dist/lib/node-esm/ChatContainer-TLQG23K7.mjs +0 -17
- package/dist/lib/node-esm/ChatContainer-TLQG23K7.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-VD6I2V5H.mjs +0 -172
- package/dist/lib/node-esm/app-graph-builder-VD6I2V5H.mjs.map +0 -7
- package/dist/lib/node-esm/blueprint-definition-TSX5HHW7.mjs.map +0 -7
- package/dist/lib/node-esm/call-manager-UMUXEYH5.mjs +0 -26
- package/dist/lib/node-esm/call-manager-UMUXEYH5.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2AEIN5MI.mjs +0 -22
- package/dist/lib/node-esm/chunk-2AEIN5MI.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-7KZWZS2U.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-AB42KYF3.mjs +0 -990
- package/dist/lib/node-esm/chunk-AB42KYF3.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ATNY37UV.mjs +0 -27
- package/dist/lib/node-esm/chunk-ATNY37UV.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-E5HNHFYH.mjs +0 -378
- package/dist/lib/node-esm/chunk-E5HNHFYH.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-FF3QVPY4.mjs +0 -612
- package/dist/lib/node-esm/chunk-FF3QVPY4.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-P2M364TO.mjs +0 -144
- package/dist/lib/node-esm/chunk-P2M364TO.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-PZH2EDU5.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-RT6NRL2I.mjs +0 -19
- package/dist/lib/node-esm/chunk-RT6NRL2I.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-4PX3WXQG.mjs +0 -356
- package/dist/lib/node-esm/intent-resolver-4PX3WXQG.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-CSR5MAPZ.mjs +0 -173
- package/dist/lib/node-esm/markdown-CSR5MAPZ.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-DZN324JA.mjs +0 -30
- package/dist/lib/node-esm/react-root-DZN324JA.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-AMVESEF4.mjs.map +0 -7
- package/dist/lib/node-esm/repair-RMLR24YR.mjs.map +0 -7
- package/dist/lib/node-esm/settings-RGZHWDSO.mjs +0 -24
- package/dist/lib/node-esm/settings-RGZHWDSO.mjs.map +0 -7
- package/dist/lib/node-esm/state-XNWOLBNE.mjs +0 -36
- package/dist/lib/node-esm/state-XNWOLBNE.mjs.map +0 -7
- package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -4
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +0 -5
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +0 -1
- package/dist/types/src/capabilities/call-manager.d.ts +0 -5
- package/dist/types/src/capabilities/call-manager.d.ts.map +0 -1
- package/dist/types/src/capabilities/capabilities.d.ts +0 -27
- package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
- package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
- package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
- package/dist/types/src/capabilities/markdown.d.ts +0 -4
- package/dist/types/src/capabilities/markdown.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-root.d.ts +0 -7
- package/dist/types/src/capabilities/react-root.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface.d.ts +0 -4
- package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
- package/dist/types/src/capabilities/repair.d.ts +0 -4
- package/dist/types/src/capabilities/repair.d.ts.map +0 -1
- package/dist/types/src/capabilities/settings.d.ts +0 -4
- package/dist/types/src/capabilities/settings.d.ts.map +0 -1
- package/dist/types/src/capabilities/state.d.ts +0 -7
- package/dist/types/src/capabilities/state.d.ts.map +0 -1
- package/src/capabilities/app-graph-builder.ts +0 -194
- package/src/capabilities/blueprint-definition.ts +0 -38
- package/src/capabilities/call-manager.ts +0 -20
- package/src/capabilities/capabilities.ts +0 -33
- package/src/capabilities/intent-resolver.ts +0 -311
- package/src/capabilities/markdown.ts +0 -71
- package/src/capabilities/react-root.tsx +0 -17
- package/src/capabilities/react-surface.tsx +0 -91
- package/src/capabilities/settings.ts +0 -19
- package/src/capabilities/state.ts +0 -26
- /package/dist/lib/browser/{ChannelContainer-L7MKV7DS.mjs.map → blueprints/index.mjs.map} +0 -0
- /package/dist/lib/{browser/ChatContainer-KPY4BAUE.mjs.map → node-esm/blueprints/index.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/components/Call/Call.tsx", "../../../src/components/Media/AudioStream.tsx", "../../../src/components/Media/VideoObject.tsx", "../../../src/components/Participant/Participant.tsx", "../../../src/components/ResponsiveGrid/ResponsiveContainer.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGrid.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGridItem.tsx", "../../../src/components/Participant/ParticipantGrid.tsx", "../../../src/components/Call/Toolbar.tsx", "../../../src/components/CallDebugPanel.tsx", "../../../src/components/ChatContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/components/MessageContainer.tsx", "../../../src/components/ChannelContainer.tsx", "../../../src/components/CallSidebar.tsx", "../../../src/components/ThreadCompanion.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/CommentsThreadContainer.tsx", "../../../src/components/ThreadSettings.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { type FC, type PropsWithChildren } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/react';\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { useDebugMode } from '../../hooks';\nimport { ThreadCapabilities } from '../../types';\nimport { AudioStream } from '../Media';\nimport { ParticipantGrid } from '../Participant';\n\nimport { Toolbar, type ToolbarProps } from './Toolbar';\n\n//\n// Root\n//\n\ntype CallRootProps = PropsWithChildren<ThemedClassName>;\n\nconst CallRoot: FC<CallRootProps> = ({ children }) => {\n return <div className='relative flex flex-col grow overflow-hidden'>{children}</div>;\n};\n\nCallRoot.displayName = 'CallRoot';\n\n//\n// Audio\n//\n\ntype CallAudioProps = {};\n\nconst CallAudio: FC<CallAudioProps> = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n const audioTracksToPlay = useAtomValue(call.audioTracksToPlayAtom);\n\n return <AudioStream tracks={audioTracksToPlay} />;\n};\n\nCallAudio.displayName = 'CallAudio';\n\n//\n// Room\n//\n\ntype CallGridProps = {\n fullscreen?: boolean;\n};\n\nconst CallGrid: FC<CallGridProps> = ({ fullscreen }) => {\n const debug = useDebugMode();\n const call = useCapability(ThreadCapabilities.CallManager);\n const self = useAtomValue(call.selfAtom);\n const users = useAtomValue(call.usersAtom);\n\n return (\n <div className='grid grow p-4 dark:bg-neutral-900'>\n <ParticipantGrid self={self} users={users} debug={debug} fullscreen={fullscreen} />\n </div>\n );\n};\n\nCallGrid.displayName = 'CallGrid';\n\n//\n// Toolbar\n//\n\ntype CallToolbarProps = Pick<ToolbarProps, 'channel' | 'onLeave'>;\n\nconst CallToolbar: FC<CallToolbarProps> = (props) => {\n return (\n <div className='absolute bottom-0 left-0 right-0 flex justify-center'>\n <Toolbar isInRoom {...props} />\n </div>\n );\n};\n\nCallToolbar.displayName = 'CallToolbar';\n\n//\n// Export\n//\n\nexport const Call = {\n Root: CallRoot,\n Grid: CallGrid,\n Audio: CallAudio,\n Toolbar: CallToolbar,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC, useEffect, useRef } from 'react';\n\nexport type AudioStreamProps = {\n tracks: MediaStreamTrack[];\n};\n\nexport const AudioStream: FC<AudioStreamProps> = ({ tracks }) => {\n const mediaStreamRef = useRef(new MediaStream());\n const ref = useRef<HTMLAudioElement>(null);\n\n useEffect(() => {\n const audio = ref.current;\n if (!audio) {\n return;\n }\n\n const mediaStream = mediaStreamRef.current;\n audio.srcObject = mediaStream;\n }, []);\n\n const resetSrcObject = () => {\n const audio = ref.current;\n const mediaStream = mediaStreamRef.current;\n if (!audio || !mediaStream) {\n return;\n }\n\n // Need to set srcObject again in Chrome and call play() again for Safari\n // https://www.youtube.com/live/Tkx3OGrwVk8?si=K--P_AzNnAGrjraV&t=2533\n // Calling play() this way to make Chrome happy otherwise it throws an error.\n audio.addEventListener('canplay', () => audio.play(), { once: true });\n audio.srcObject = mediaStream;\n };\n\n return (\n <>\n <audio ref={ref} autoPlay />\n {tracks.map((track) => (\n <AudioTrack key={track.id} track={track} mediaStream={mediaStreamRef.current} resetSrcObject={resetSrcObject} />\n ))}\n </>\n );\n};\n\ntype AudioTrackParams = {\n track: MediaStreamTrack;\n mediaStream: MediaStream;\n resetSrcObject: () => void;\n};\n\nconst AudioTrack = ({ track, mediaStream, resetSrcObject }: AudioTrackParams) => {\n useEffect(() => {\n const currentTrack = track;\n mediaStream.addTrack(currentTrack);\n resetSrcObject();\n return () => {\n mediaStream.removeTrack(currentTrack);\n resetSrcObject();\n };\n }, [track, mediaStream]);\n\n return null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type JSX, forwardRef, memo, useEffect, useRef } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nexport type VideoObjectProps = Omit<JSX.IntrinsicElements['video'], 'className' | 'ref'> &\n ThemedClassName<{\n videoStream?: MediaStream;\n flip?: boolean;\n // TODO(burdon): If screenshare then contain.\n contain?: boolean;\n }>;\n\nexport const VideoObject = memo(\n forwardRef<HTMLVideoElement, VideoObjectProps>(({ videoStream, classNames, flip, contain, ...rest }, ref) => {\n const internalRef = useRef<HTMLVideoElement | null>(null);\n\n useEffect(() => {\n const video = internalRef.current;\n if (video && videoStream) {\n video.srcObject = videoStream;\n video.setAttribute('autoplay', 'true');\n video.setAttribute('playsinline', 'true');\n }\n }, [videoStream, internalRef.current]);\n\n // NOTE: The video element typically has a max size of 1280x720.\n return (\n <video\n className={mx(\n 'is-full aspect-video',\n flip && 'scale-x-[-1]',\n contain ? 'object-contain' : 'object-cover',\n classNames,\n )}\n ref={(v) => {\n internalRef.current = v;\n if (ref === null) {\n return;\n }\n\n if (typeof ref === 'function') {\n ref(v);\n } else {\n ref.current = v;\n }\n }}\n {...rest}\n />\n );\n }),\n);\n\nVideoObject.displayName = 'VideoObject';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { memo, useMemo } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/react';\n\nimport { type EncodedTrackName, type UserState } from '../../calls';\nimport { ThreadCapabilities } from '../../types';\nimport { VideoObject } from '../Media';\nimport { ResponsiveGridItem, type ResponsiveGridItemProps } from '../ResponsiveGrid';\n\nexport const SCREENSHARE_SUFFIX = '_screenshare';\n\nexport const Participant = memo(({ item: user, debug, ...props }: ResponsiveGridItemProps<UserState>) => {\n const call = useCapability(ThreadCapabilities.CallManager);\n const self = useAtomValue(call.selfAtom);\n const media = useAtomValue(call.mediaAtom);\n const isSelf: boolean = self.id !== undefined && user.id !== undefined && user.id.startsWith(self.id);\n const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);\n\n // Get pulled video stream for non-self users.\n const pulledVideoStream = useMemo<MediaStream | undefined>(() => {\n if (isSelf) {\n return undefined;\n }\n const trackName =\n isScreenshare && user.tracks?.screenshareEnabled\n ? (user.tracks?.screenshare as EncodedTrackName)\n : !isScreenshare && user.tracks?.videoEnabled\n ? (user.tracks?.video as EncodedTrackName)\n : undefined;\n return trackName ? media.pulledVideoStreams[trackName]?.stream : undefined;\n }, [\n isSelf,\n isScreenshare,\n media.pulledVideoStreams,\n user.tracks?.screenshare,\n user.tracks?.video,\n user.tracks?.screenshareEnabled,\n user.tracks?.videoEnabled,\n ]);\n\n const videoStream = useMemo<MediaStream | undefined>(() => {\n if (isSelf) {\n return isScreenshare ? media.screenshareVideoStream : media.videoStream;\n }\n return pulledVideoStream;\n }, [isSelf, isScreenshare, media.videoStream, media.screenshareVideoStream, pulledVideoStream]);\n\n return (\n <ResponsiveGridItem\n {...props}\n item={user}\n name={user.name}\n self={isSelf}\n screenshare={!!media.screenshareVideoStream}\n video={media.videoEnabled}\n mute={user ? !user.tracks?.audioEnabled : false}\n wave={user.raisedHand}\n speaking={user.speaking}\n debug={debug}\n >\n <VideoObject\n videoStream={videoStream}\n flip={isSelf && !isScreenshare}\n contain={!!isScreenshare}\n classNames='rounded-md'\n />\n </ResponsiveGridItem>\n );\n});\n\nParticipant.displayName = 'Participant';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren } from 'react';\n\nimport { mx } from '@dxos/ui-theme';\n\n/**\n * A container component that maintains the child's aspect ratio while centering its content.\n * The container will scale to fit within its parent's bounds while preserving the aspect ratio.\n *\n * @example\n * <ResponsiveContainer>\n * <VideoObject />\n * </ResponsiveContainer>\n */\nexport const ResponsiveContainer = ({ children }: PropsWithChildren) => {\n return (\n // Outer container that takes full size of parent.\n <div role='none' className='relative flex is-full bs-full'>\n {/* Absolute positioning layer for centering content. */}\n <div role='none' className='absolute inset-0 flex justify-center items-center'>\n {/* Content container that maintains given aspect ratio and proper scaling. */}\n <div role='none' className={mx('max-bs-full max-is-full is-auto bs-auto aspect-video')}>\n {children}\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ComponentType, type FC, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { invariant } from '@dxos/invariant';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { type Size } from '@dxos/react-ui-dnd';\nimport { mx } from '@dxos/ui-theme';\n\nimport { ResponsiveContainer } from './ResponsiveContainer';\nimport { type ResponsiveGridItemProps } from './ResponsiveGridItem';\n\nconst ASPECT_RATIO = 16 / 9;\nconst MIN_GALLERY_HEIGHT = 250;\n\nconst DEFAULT_GAP = 8;\n\nconst maxImageSize = 'is-[2560px] bs-[1440px]';\n\n/**\n * Props for the ResponsiveGrid component.\n */\nexport type ResponsiveGridProps<T extends object = any> = ThemedClassName<{\n /** Cell component. */\n Cell: ComponentType<ResponsiveGridItemProps<T>>;\n\n /** Space between grid items in pixels. */\n gap?: number;\n\n /** Function to get the ID of an item. */\n getId?: (item: T) => string;\n\n /** Array of items to display in the grid. */\n items: T[];\n\n /** ID of the pinned item. */\n pinned?: string;\n\n /** Whether to hide the gallery (unpinned items) when an item is pinned. */\n autoHideGallery?: boolean;\n\n /** Whether the divider is resizable. */\n resizable?: boolean;\n\n /** Debug mode. */\n debug?: boolean;\n\n /** Callback when the pinned item changes. */\n onPinnedChange?: (pinned: string | undefined) => void;\n}>;\n\nconst defaultGetId: ResponsiveGridProps<any>['getId'] = (item: any) => item.id;\n\n/**\n * A responsive grid component that automatically adjusts its layout to optimize space usage.\n * Maintains aspect ratio of items while ensuring uniform gaps between them.\n */\nexport const ResponsiveGrid = <T extends object = any>({\n classNames,\n Cell,\n gap = DEFAULT_GAP,\n getId = defaultGetId,\n items,\n pinned,\n autoHideGallery = false,\n debug,\n onPinnedChange,\n}: ResponsiveGridProps<T>) => {\n const {\n width: containerWidth = 0,\n height: containerHeight = 0,\n ref: containerRef,\n } = useResizeDetector<HTMLDivElement>({ refreshRate: 100 });\n const [dividerHeight, setDividerHeight] = useState<Size>(0);\n useEffect(() => {\n if (containerWidth && containerHeight) {\n const { height } = fitAspectRatio(containerWidth, containerHeight, ASPECT_RATIO);\n setDividerHeight(Math.min(height, containerHeight - MIN_GALLERY_HEIGHT));\n }\n }, [containerWidth, containerHeight]);\n\n const pinnedItem = useMemo(() => items.find((item) => getId(item) === pinned), [items, pinned]);\n const mainItems = useMemo(() => items.filter((item) => getId(item) !== pinned), [items, pinned]);\n const hideGallery = autoHideGallery && pinnedItem !== undefined;\n\n //\n // Recalculate optimal layout when container size or items change.\n //\n const [{ time, columns, cellWidth }, setLayout] = useState<Layout>({ time: 0, columns: 0, cellWidth: 0 });\n const { width = 0, height = 0, ref: gridContainerRef } = useResizeDetector<HTMLDivElement>({ refreshRate: 200 });\n useEffect(() => {\n if (containerHeight && width && height) {\n const layout = calculateLayout(width, height, mainItems.length, gap);\n setLayout({ time: Date.now(), ...layout });\n }\n }, [containerHeight, width, height, mainItems.length, gap, pinned]);\n\n //\n // We use the browser to layout invisible divs and then calculate the absolute position of these items,\n // which are animated into position.\n //\n const [bounds, setBounds] = useState<[T, DOMRectBounds][]>([]);\n useLayoutEffect(() => {\n if ((!hideGallery && !gridContainerRef.current) || !containerHeight) {\n return;\n }\n\n // TODO(burdon): Consider directly setting bounds on DOM elementsinstead of state update?\n const t = setTimeout(() => {\n setBounds(\n items\n .filter((item) => !hideGallery || item === pinnedItem)\n .map((item) => {\n invariant(containerRef.current);\n const el = containerRef.current.querySelector(`[data-grid-item=\"${getId(item)}\"]`);\n if (!el) {\n return null;\n }\n\n const bounds = getRelativeBounds(containerRef.current, el as HTMLElement);\n return [item, bounds];\n })\n .filter((item): item is [T, DOMRectBounds] => item !== null),\n );\n });\n\n return () => clearTimeout(t);\n }, [containerHeight, items, pinnedItem, hideGallery, time]);\n\n const handleClick = useCallback(\n (item: T) => onPinnedChange?.(getId(item) === pinned ? undefined : getId(item)),\n [pinned, onPinnedChange],\n );\n\n return (\n <div ref={containerRef} className={mx('relative is-full bs-full', classNames)}>\n {/* Placeholder elements to calculate layout. */}\n <div className='absolute inset-0 flex flex-col grow gap-2'>\n {/* Pinned item. */}\n {pinnedItem && (\n <div\n className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && 'bs-full')}\n style={hideGallery ? {} : { height: dividerHeight }}\n >\n <SoloItem id={getId(pinnedItem)} debug={debug} />\n </div>\n )}\n\n {/* Gallery. */}\n {!hideGallery && (\n <div\n ref={gridContainerRef}\n className='flex grow-[1] overflow-hidden justify-center items-center'\n style={hideGallery ? {} : { minHeight: MIN_GALLERY_HEIGHT }}\n >\n {mainItems.length === 1 && (\n <div style={{ width: cellWidth }} className='flex bs-full'>\n <SoloItem id={getId(mainItems[0])} debug={debug} />\n </div>\n )}\n\n {mainItems.length > 1 && columns > 0 && (\n <div\n role='grid'\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, ${cellWidth}px)`,\n gap: `${gap}px`,\n }}\n >\n {mainItems.map((item) => (\n <div\n key={getId(item)}\n {...{ 'data-grid-item': getId(item) }}\n className={mx(\n 'aspect-video max-bs-full max-is-full is-auto bs-auto',\n debug && 'border border-primary-500',\n )}\n />\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Absolutely positioned items. */}\n <div className={mx(debug && 'opacity-10')}>\n {bounds.map(([item, bounds]) => (\n <Cell\n key={getId(item)}\n classNames='absolute transition-all duration-500'\n item={item}\n style={bounds}\n pinned={getId(item) === pinned}\n onClick={items.length > 1 ? handleClick : undefined}\n />\n ))}\n </div>\n </div>\n );\n};\n\nconst SoloItem: FC<Pick<ResponsiveGridProps, 'debug'> & { id: string }> = ({ debug, id }) => {\n return (\n <ResponsiveContainer>\n <div\n {...{ 'data-grid-item': id }}\n className={mx('aspect-video overflow-hidden', debug && 'z-20 border-2 border-primary-500')}\n >\n {/* Maximum size placeholder image forces aspect ratio. */}\n <img alt='placeholder video' className={mx('opacity-0', maxImageSize)} />\n </div>\n </ResponsiveContainer>\n );\n};\n\ntype DOMRectBounds = Pick<DOMRect, 'top' | 'left' | 'width' | 'height'>;\n\n// TODO(burdon): Reconcile with react-ui-gameboard.\nconst getRelativeBounds = (container: HTMLElement, el: HTMLElement): DOMRectBounds => {\n const containerRect = container.getBoundingClientRect();\n const elementRect = el.getBoundingClientRect();\n return {\n top: elementRect.top - containerRect.top,\n left: elementRect.left - containerRect.left,\n width: elementRect.width,\n height: elementRect.height,\n };\n};\n\ntype Layout = {\n time?: number;\n columns: number;\n cellWidth: number;\n};\n\n/**\n * Calculates the optimal number of columns for a grid layout that minimizes wasted space.\n * @param containerWidth - Width of the container in pixels.\n * @param containerHeight - Height of the container in pixels.\n * @param count - Total number of items to display.\n * @param gap - Space between items in pixels.\n * @param aspectRatio - Desired aspect ratio of items (width/height).\n * @returns The optimal number of columns.\n */\nconst calculateLayout = (\n containerWidth: number,\n containerHeight: number,\n count: number,\n gap: number,\n aspectRatio = ASPECT_RATIO,\n): Layout => {\n if (count === 0) {\n return { columns: 1, cellWidth: 1 };\n }\n\n let minWastedSpace = Infinity;\n let bestColumns = 1;\n let cellWidth = 0;\n\n // Try different rows counts to find the optimal layout that minimizes wasted space.\n for (let rows = 1; rows <= count; rows++) {\n const cols = Math.ceil(count / rows);\n\n // Calculate available space accounting for gaps.\n const { width: itemWidth, height: itemHeight } = fitItemsToGrid(\n containerWidth,\n containerHeight,\n cols,\n rows,\n aspectRatio,\n gap,\n );\n\n // Calculate total wasted space for this configuration.\n const usedWidth = itemWidth * cols + gap * cols - 1;\n const usedHeight = itemHeight * rows + gap * rows - 1;\n\n // Determine if optimal.\n const wastedSpace = containerWidth * containerHeight - usedWidth * usedHeight;\n if (wastedSpace < minWastedSpace) {\n minWastedSpace = wastedSpace;\n bestColumns = cols;\n cellWidth = itemWidth;\n }\n }\n\n return { columns: bestColumns, cellWidth };\n};\n\n/**\n * Returns the size of the largest rectangle with the given aspect ration that fits within the grid.\n */\nconst fitItemsToGrid = (\n outerWidth: number,\n outerHeight: number,\n numCols: number,\n numRows: number,\n aspectRatio: number,\n gap: number,\n): { width: number; height: number } => {\n // Calculate available space accounting for gaps.\n const availableWidth = outerWidth - gap * (numCols - 1);\n const availableHeight = outerHeight - gap * (numRows - 1);\n\n // Calculate max dimensions.\n const maxCellWidth = availableWidth / numCols;\n const maxCellHeight = availableHeight / numRows;\n\n // Use fitAspectRatio to get dimensions that fit within max cell size while maintaining the desired aspect ratio\n return fitAspectRatio(maxCellWidth, maxCellHeight, aspectRatio);\n};\n\n/**\n * Returns the size of the largest rectangle the given aspect ratio that fits within the outer rectangle.\n */\nconst fitAspectRatio = (\n outerWidth: number,\n outerHeight: number,\n aspectRatio: number,\n): { width: number; height: number } => {\n if (outerWidth <= 0 || outerHeight <= 0 || aspectRatio <= 0) {\n return { width: 0, height: 0 };\n }\n\n // First try fitting to width.\n let width = outerWidth;\n let height = width / aspectRatio;\n\n // If too tall, fit to height instead.\n if (height > outerHeight) {\n height = outerHeight;\n width = height * aspectRatio;\n }\n\n return { width, height };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type CSSProperties, type PropsWithChildren, useEffect, useState } from 'react';\n\nimport { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { Waveform } from '@dxos/react-ui-sfx';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\n\nexport type ResponsiveGridItemProps<T extends object = any> = PropsWithChildren<\n ThemedClassName<{\n item: T;\n style?: CSSProperties;\n pinned?: boolean;\n name?: string;\n self?: boolean;\n screenshare?: boolean;\n video?: boolean;\n mute?: boolean;\n wave?: boolean;\n speaking?: boolean;\n debug?: boolean;\n onClick?: (item: T) => void;\n }>\n>;\n\n/**\n * Cell container.\n */\nexport const ResponsiveGridItem = <T extends object = any>({\n children,\n classNames,\n item,\n style,\n name,\n self,\n pinned,\n screenshare,\n video,\n mute,\n wave,\n speaking,\n onClick,\n}: ResponsiveGridItemProps<T>) => {\n const { t } = useTranslation(meta.id);\n const iconProps: Record<string, { icon: string; label: string; classNames?: string }> = {\n wave: {\n icon: 'ph--hand-waving--duotone',\n label: t('icon wave'),\n classNames: 'animate-pulse bg-orange-500',\n },\n mute: {\n icon: 'ph--microphone-slash--regular',\n label: t('icon muted'),\n },\n };\n\n const props = wave && !pinned ? iconProps.wave : mute ? iconProps.mute : speaking ? iconProps.speaking : undefined;\n\n // Debounce speaking indicator.\n const [speakingIndicator, setSpeakingIndicator] = useState(speaking);\n useEffect(() => {\n if (speaking) {\n setSpeakingIndicator(true);\n } else {\n const timeout = setTimeout(() => {\n setSpeakingIndicator(false);\n }, 1_000);\n return () => clearTimeout(timeout);\n }\n }, [speaking]);\n\n return (\n <div\n className={mx(\n 'relative is-full bs-full group',\n 'rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500',\n speakingIndicator ? 'outline-green-500' : !video && 'outline-separator',\n classNames,\n )}\n style={style}\n >\n {children}\n\n {/* Action. */}\n {onClick && (\n <div className='z-10 absolute top-1 right-1 flex'>\n <IconButton\n classNames={mx('p-1 min-bs-1 rounded', groupHoverControlItemWithTransition)}\n iconOnly\n icon={pinned ? 'ph--x--regular' : 'ph--arrows-out--regular'}\n size={pinned ? 5 : 4}\n label={pinned ? t('icon unpin') : t('icon pin')}\n onClick={() => onClick?.(item)}\n />\n </div>\n )}\n\n {/* Name. */}\n {name && (\n <div className='z-10 absolute bottom-1 left-8 right-1 flex justify-end gap-1 items-center'>\n {/* TODO(burdon): Replace with avatar for everyone. */}\n {/* {self && <Icon icon='ph--asterisk--regular' size={pinned ? 5 : 4} />} */}\n {screenshare && <Icon icon='ph--broadcast--regular' size={pinned ? 5 : 4} />}\n <div\n className={mx(\n 'bg-neutral-800 text-neutral-100 plb-0.5 truncate rounded',\n pinned ? 'pli-2' : 'pli-1 text-xs',\n )}\n >\n {name}\n </div>\n </div>\n )}\n\n {/* Activity. */}\n <div className='z-10 absolute bottom-1 left-1 flex'>\n {(speaking && <Waveform active size={pinned ? 5 : 4} />) ||\n (props && (\n <IconButton\n classNames={mx('p-1 min-bs-1 rounded', props?.classNames)}\n icon={props?.icon}\n label={props?.label}\n size={pinned ? 5 : 4}\n iconOnly\n />\n ))}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { type UserState } from '../../calls';\nimport { ResponsiveGrid } from '../ResponsiveGrid';\n\nimport { Participant, SCREENSHARE_SUFFIX } from './Participant';\n\nconst getId = (user: UserState): string => user.id!;\n\nexport type ParticipantGridProps = ThemedClassName<{\n self: UserState;\n users: UserState[];\n fullscreen?: boolean;\n debug?: boolean;\n}>;\n\nexport const ParticipantGrid = ({ classNames, self, users, fullscreen, debug }: ParticipantGridProps) => {\n const [pinned, setPinned] = useState<string | undefined>();\n\n const allUsers = useMemo(() => {\n const allUsers: (UserState & { isSelf?: boolean })[] = [];\n users.forEach((user) => {\n if (!user.joined) {\n return;\n }\n\n allUsers.push({ ...user, isSelf: user.id === self.id });\n if (user.tracks?.screenshareEnabled) {\n const screenshare: UserState = {\n ...user,\n id: user.id + SCREENSHARE_SUFFIX,\n tracks: {\n ...user.tracks,\n video: user.tracks.screenshare,\n videoEnabled: user.tracks.screenshareEnabled,\n } as any, // TODO(burdon): Remove cast.\n };\n\n allUsers.push(screenshare);\n }\n });\n\n return allUsers;\n }, [self, users]);\n\n useEffect(() => {\n if (pinned) {\n // Check expanded user is still in call.\n if (!allUsers.find((user) => user.id === pinned)) {\n setPinned(undefined);\n }\n }\n }, [pinned, allUsers]);\n\n // TODO(burdon): Put self last.\n const sortedUsers: UserState[] = allUsers.sort((a, b) => {\n if (a.isSelf) {\n return 1;\n } else if (b.isSelf) {\n return -1;\n } else if (a.tracks?.screenshareEnabled) {\n return -1;\n } else if (b.tracks?.screenshareEnabled) {\n return 1;\n } else {\n return 0;\n }\n });\n\n // TODO(burdon): Show ghost view of user for a second before leaving.\n return (\n <ResponsiveGrid<UserState>\n classNames={classNames}\n Cell={Participant}\n debug={debug}\n getId={getId}\n items={sortedUsers}\n pinned={pinned}\n autoHideGallery={fullscreen}\n onPinnedChange={setPinned}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { useAppGraph, useCapability } from '@dxos/app-framework/react';\nimport { Obj } from '@dxos/echo';\nimport { Node, useActionRunner } from '@dxos/plugin-graph';\nimport { useActions, useNode } from '@dxos/plugin-graph';\nimport {\n Icon,\n IconButton,\n type IconButtonProps,\n Toolbar as NaturalToolbar,\n type ThemedClassName,\n toLocalizedString,\n useTranslation,\n} from '@dxos/react-ui';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { ThreadCapabilities } from '../../types';\nimport { type Channel } from '../../types';\n\nexport type ToolbarProps = ThemedClassName<{\n channel?: Channel.Channel;\n participants?: number;\n autoHideControls?: boolean;\n isInRoom?: boolean;\n onJoin?: () => void;\n onLeave?: () => void;\n}>;\n\n// TODO(wittjosiah): Use ToolbarMenu.\nexport const Toolbar = ({\n classNames,\n channel,\n participants,\n autoHideControls = true,\n onJoin,\n onLeave,\n}: ToolbarProps) => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n const call = useCapability(ThreadCapabilities.CallManager);\n const media = useAtomValue(call.mediaAtom);\n const joined = useAtomValue(call.joinedAtom);\n const raisedHand = useAtomValue(call.raisedHandAtom);\n\n // Channel app graph node.\n const node = useNode(graph, channel && Obj.getDXN(channel).toString());\n const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === 'toolbar');\n\n // Screen sharing.\n const isScreensharing = media.screenshareTrack !== undefined;\n const canSharescreen =\n typeof navigator.mediaDevices !== 'undefined' && navigator.mediaDevices.getDisplayMedia !== undefined;\n\n // TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.\n return (\n <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>\n <NaturalToolbar.Root classNames={['p-2 bg-modalSurface rounded-md shadow-md', classNames]}>\n <ToggleButton\n active={media.audioEnabled}\n state={{\n on: {\n icon: 'ph--microphone--regular',\n label: t('mic off'),\n onClick: () => call.turnAudioOff(),\n classNames: 'bg-callActive',\n },\n off: {\n icon: 'ph--microphone-slash--duotone',\n label: t('mic on'),\n onClick: () => call.turnAudioOn(),\n classNames: [joined && 'bg-callAlert'],\n },\n }}\n />\n <ToggleButton\n active={media.videoEnabled}\n state={{\n on: {\n icon: 'ph--video-camera--regular',\n label: t('camera off'),\n onClick: () => call.turnVideoOff(),\n },\n off: {\n icon: 'ph--video-camera-slash--duotone',\n label: t('camera on'),\n onClick: () => call.turnVideoOn(),\n },\n }}\n />\n\n {(participants !== undefined && (\n <div className='flex justify-center items-center gap-2 is-[5rem] text-xs text-subdued'>\n <Icon icon='ph--users--regular' size={4} />\n <div>{participants}</div>\n </div>\n )) || <NaturalToolbar.Separator variant='gap' />}\n\n {joined && (\n <>\n <ToggleButton\n disabled={!canSharescreen}\n active={isScreensharing}\n state={{\n on: {\n icon: 'ph--monitor--regular',\n label: t('screenshare off'),\n onClick: () => call.turnScreenshareOff(),\n },\n off: {\n icon: 'ph--monitor-arrow-up--duotone',\n label: t('screenshare on'),\n onClick: () => call.turnScreenshareOn(),\n },\n }}\n />\n\n {/* Companion actions. */}\n {actions\n .filter((action): action is Node.Action => Node.isAction(action))\n .map((action) => (\n <IconButton\n key={action.id}\n {...defaultButtonProps}\n icon={action.properties.icon}\n label={toLocalizedString(action.properties.label, t)}\n classNames={action.properties.classNames}\n onClick={() => node && void runAction(action, { parent: node })}\n />\n ))}\n\n <ToggleButton\n active={raisedHand}\n state={{\n on: {\n icon: 'ph--hand-waving--regular',\n label: t('lower hand'),\n onClick: () => call.setRaisedHand(false),\n classNames: [joined && 'bg-callAlert'],\n },\n off: {\n icon: 'ph--hand-palm--duotone',\n label: t('raise hand'),\n onClick: () => call.setRaisedHand(true),\n },\n }}\n />\n </>\n )}\n {joined ? (\n <IconButton variant='destructive' icon='ph--phone-x--regular' label={t('leave call')} onClick={onLeave} />\n ) : (\n <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />\n )}\n </NaturalToolbar.Root>\n </div>\n );\n};\n\nToolbar.displayName = 'MeetingToolbar';\n\ntype ToolbarButtonProps = Pick<IconButtonProps, 'disabled'> & {\n active?: boolean;\n state: {\n on: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n off: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n };\n};\n\nconst defaultButtonProps: Partial<IconButtonProps> = {\n size: 5,\n iconOnly: true,\n};\n\nconst ToggleButton = ({ active, state }: ToolbarButtonProps) => (\n <IconButton\n {...defaultButtonProps}\n classNames={[active ? (state.on.classNames ?? 'bg-callActive') : state.off.classNames]}\n icon={active ? state.on.icon : state.off.icon}\n label={active ? state.on.label : state.off.label}\n onClick={active ? state.on.onClick : state.off.onClick}\n />\n);\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { WebRTCStats, type WebRTCStatsEvent } from '@peermetrics/webrtc-stats';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport { truncateKey } from '@dxos/debug';\nimport { JsonView, Panel } from '@dxos/devtools';\nimport { log } from '@dxos/log';\nimport { IconButton, Input, type ThemedClassName, useTranslation } from '@dxos/react-ui';\n\nimport { type EncodedTrackName, type GlobalState } from '../calls';\nimport { meta } from '../meta';\n\nexport type CallDebugPanelProps = ThemedClassName<{ state?: GlobalState }>;\n\nexport const CallDebugPanel = ({ state }: CallDebugPanelProps) => {\n const { t } = useTranslation(meta.id);\n\n const [open, setOpen] = useState(false);\n const handleToggle = () => setOpen(!open);\n const [showServiceHistory, setShowServiceHistory] = useState(false);\n const handleToggleServiceHistory = () => setShowServiceHistory(!showServiceHistory);\n\n const handleCopyRaw = async () => {\n await navigator.clipboard.writeText(JSON.stringify({ users: state?.call?.users, stats }, null, 2));\n };\n\n const [showDetailedWebRTCStats, setShowDetailedWebRTCStats] = useState(false);\n const handleShowDetailedWebRTCStats = () => setShowDetailedWebRTCStats(!showDetailedWebRTCStats);\n\n const webrtcStats = useMemo(\n () =>\n new WebRTCStats({\n getStatsInterval: 1000,\n }),\n [],\n );\n const [stats, setStats] = useState<WebRTCStatsEvent['data']>();\n\n useEffect(() => {\n const pc = state?.media.peer?.session?.peerConnection;\n const handleStats = (stats: WebRTCStatsEvent) => {\n setStats(stats.data);\n };\n let added = false;\n if (pc && showDetailedWebRTCStats) {\n webrtcStats.addConnection({ pc, peerId: 1, connectionId: '1' });\n webrtcStats.on('stats', handleStats as never);\n added = true;\n }\n return () => {\n try {\n if (pc && added) {\n webrtcStats.removeConnection({ pc });\n webrtcStats.removeListener('stats', handleStats as never);\n }\n } catch (error) {\n log.error('error removing webrtc stats', { error, pc, peerId: 1, connectionId: '1' });\n }\n };\n }, [state?.media.peer?.session?.peerConnection, showDetailedWebRTCStats]);\n\n const rows = useMemo(() => getCallStatusTable(state), [state?.call.users, state?.media.pulledAudioTracks]);\n\n return (\n <Panel\n id='meeting-status'\n icon='ph--video-conference--regular'\n open={open}\n onToggle={handleToggle}\n title={t('meeting status title')}\n info={<div className='flex items-center gap-2'> {state?.call.joined ? 'Active' : 'Inactive'}</div>}\n maxHeight={0}\n >\n <div className='flex flex-col is-full text-xs'>\n <div className='flex items-center gap-2 items-center'>\n <Input.Root>\n <Input.Switch checked={showDetailedWebRTCStats} onCheckedChange={handleShowDetailedWebRTCStats} />\n <Input.Label>{t('show webrtc stats title')}</Input.Label>\n </Input.Root>\n </div>\n <div className='flex items-center gap-2 items-center'>\n <Input.Root>\n <Input.Switch checked={showServiceHistory} onCheckedChange={handleToggleServiceHistory} />\n <Input.Label>{t('show calls history title')}</Input.Label>\n </Input.Root>\n </div>\n <div className='flex items-center gap-2 items-center'>\n <IconButton icon='ph--copy--regular' label={'copy raw'} onClick={handleCopyRaw} />\n </div>\n <Table rows={rows} />\n {showDetailedWebRTCStats && <JsonView data={{ stats }} />}\n {showServiceHistory && <JsonView data={{ history: state?.media.peer?.history.get() }} />}\n </div>\n </Panel>\n );\n};\n\nconst getCallStatusTable = (state?: GlobalState): TableProps['rows'] => {\n if (!state || !state.call?.users) {\n return [];\n }\n\n const self = state.call.self;\n const users = state.call.users\n .filter((user) => user.id !== self!.id)\n .map((user) => {\n const isOk = {\n audio:\n user.tracks?.audio &&\n state.media.pulledAudioTracks[user.tracks?.audio as EncodedTrackName]?.ctx.disposed === false,\n video:\n user.tracks?.video &&\n state.media.pulledVideoStreams[user.tracks?.video as EncodedTrackName]?.ctx.disposed === false,\n screenshare:\n user.tracks?.screenshare &&\n state.media.pulledVideoStreams[user.tracks?.screenshare as EncodedTrackName]?.ctx.disposed === false,\n };\n\n return {\n ...user,\n isOk,\n };\n });\n\n return [\n ['users', state.call.users.length ?? 0],\n [\n '*self* ' + (self?.name ?? truncateKey(self!.id, 8)),\n self?.tracks?.audio && state.media.pushedAudioTrack ? 'AUD ✅' : 'AUD ❌',\n self?.tracks?.video && state.media.pushedVideoTrack ? 'VID ✅' : 'VID ❌',\n self?.tracks?.screenshareEnabled\n ? self.tracks.screenshareEnabled && state.media.pushedScreenshareTrack\n ? 'SCR ✅'\n : 'SCR ❌'\n : undefined,\n ],\n\n ...users.map((user) => [\n user.name ?? truncateKey(user.id, 8),\n user.isOk.audio ? 'AUD ✅' : 'AUD ❌',\n user.isOk.video ? 'VID ✅' : 'VID ❌',\n user.tracks?.screenshareEnabled ? (user.isOk.screenshare ? 'SCR ✅' : 'SCR ❌') : undefined,\n ]),\n ['ICE', state.media.peer?.session?.peerConnection.iceConnectionState ?? 'no connection'],\n ];\n};\n\nexport namespace Unit {\n export const KB = (n?: number) => ((n ?? 0) / 1_000).toFixed(2);\n}\n\nexport type TableProps = {\n rows: (string | number | undefined)[][];\n};\n\nexport const Table = ({ rows }: TableProps) => {\n return (\n <div className='is-full text-xs font-mono'>\n {rows.map(([prefix, label, value, unit], i) => (\n <div key={i} className='grid grid-cols-[3fr_1fr_1fr_1fr]'>\n <div className='p-1'>{prefix}</div>\n <div className='p-1'>{label}</div>\n <div className='p-1'>{value}</div>\n <div className='p-1'>{unit}</div>\n </div>\n ))}\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Ref } from '@dxos/echo';\nimport { type Space, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ScrollArea, type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread as ThreadComponent,\n type ThreadRootProps,\n threadLayout,\n} from '@dxos/react-ui-thread';\nimport { Message, type Thread } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer } from './MessageContainer';\n\nexport const ChatHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(meta.id);\n return (\n <div role='none' className='flex items-center'>\n <StackItem.SigilButton attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </StackItem.SigilButton>\n <StackItem.HeadingLabel attendableId={attendableId}>{t('chat heading')}</StackItem.HeadingLabel>\n </div>\n );\n};\n\nexport type ChatContainerProps = ThemedClassName<\n {\n space: Space;\n thread: Thread.Thread;\n context?: Obj.Unknown;\n autoFocusTextbox?: boolean;\n } & Pick<ThreadRootProps, 'current'>\n>;\n\nexport const ChatContainer = ({\n classNames,\n space,\n thread,\n context,\n current,\n autoFocusTextbox,\n}: ChatContainerProps) => {\n const { t } = useTranslation(meta.id);\n const id = Obj.getDXN(thread).toString();\n const identity = useIdentity()!;\n const members = useMembers(space?.id);\n const activity = useStatus(space, id);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(id, identity);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: ({ text }) => (messageRef.current = text) }),\n command,\n ],\n [themeMode, _count],\n );\n\n // TODO(thure): Factor out.\n // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using\n // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient\n // for the desired effect; this is likely hardware-dependent and should be reevaluated.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n\n // TODO(burdon): Change to model.\n const handleCreate: MessageTextboxProps['onSend'] = () => {\n if (!messageRef.current?.length) {\n return false;\n }\n\n Obj.change(thread, (t) => {\n t.messages.push(\n Ref.make(\n Obj.make(Message.Message, {\n created: new Date().toISOString(),\n sender: { identityDid: identity.did },\n blocks: [{ _tag: 'text', text: messageRef.current }],\n properties: context ? { context: Ref.make(context) } : undefined,\n }),\n ),\n );\n });\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n return (\n <ThreadComponent.Root\n current={current}\n id={id}\n classNames={[\n 'bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden',\n 'transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0',\n classNames,\n ]}\n >\n <ScrollArea.Root classNames='col-span-2'>\n <ScrollArea.Viewport classNames='overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]'>\n <div role='none' className={mx(threadLayout, 'place-self-end')}>\n {thread.messages\n .map((message) => message.target)\n .filter(isNonNullable)\n .map((message) => (\n <MessageContainer key={message.id} message={message} members={members} />\n ))}\n </div>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </ScrollArea.Viewport>\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Root>\n\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n <ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>\n </ThreadComponent.Root>\n );\n};\n\nexport default ChatContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n {\n tag: tags.tagName,\n class: mx('dx-tag dx-tag--indigo text-baseText font-medium'),\n },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/react';\nimport { type Obj, Ref } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { PublicKey } from '@dxos/react-client';\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity, useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, useOnTransition, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { useTextEditor } from '@dxos/react-ui-editor';\nimport { Card } from '@dxos/react-ui-mosaic';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { type ContentBlock, type Message } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions } from '@dxos/ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { useOnEditAnalytics } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\n\nexport const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pie-2';\nexport const buttonClassNames = '!p-1 transition-opacity';\n\nexport type MessageContainerProps = {\n message: Obj.Obj<Message.Message> | Ref.Ref<Obj.Obj<Message.Message>>;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n onAcceptProposal?: (id: string) => void;\n};\n\nexport const MessageContainer = ({\n message: messageOrRef,\n members,\n editable = false,\n onDelete,\n onAcceptProposal,\n}: MessageContainerProps) => {\n const { t } = useTranslation(meta.id);\n const [message, updateMessage] = useObject(messageOrRef);\n const identity = useIdentity();\n const [editing, setEditing] = useState(false);\n\n const textBlockIndex = message?.blocks.findIndex((block) => block._tag === 'text') ?? -1;\n\n const handleEdit = useCallback(() => setEditing((editing) => !editing), []);\n const handleDelete = useCallback(() => message && onDelete?.(message.id), [message, onDelete]);\n const handleAcceptProposal = useCallback(\n () => message && onAcceptProposal?.(message.id),\n [message, onAcceptProposal],\n );\n const handleTextBlockChange = useCallback(\n (newText: string) => {\n updateMessage((m) => {\n const targetBlock = m.blocks[textBlockIndex];\n if (targetBlock && targetBlock._tag === 'text') {\n targetBlock.text = newText;\n }\n });\n },\n [updateMessage, textBlockIndex],\n );\n\n const textBlock =\n message && textBlockIndex !== -1 ? (message.blocks[textBlockIndex] as ContentBlock.Text) : undefined;\n useOnEditAnalytics(message, textBlock, !!editing);\n\n if (!message) {\n return null;\n }\n\n const senderIdentity = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = identity?.did === messageMetadata.authorId;\n const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');\n const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <div role='none' className={buttonGroupClassNames}>\n {userIsAuthor && editable && (\n <IconButton\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n variant='ghost'\n icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}\n iconOnly\n label={t(editing ? 'save message label' : 'edit message label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleEdit}\n />\n )}\n {/* TODO(wittjosiah): Proposal controls should probably be hoisted to thread level. */}\n {proposalBlock && onAcceptProposal && (\n <IconButton\n data-testid='thread.message.accept'\n variant='ghost'\n icon='ph--check--regular'\n iconOnly\n label={t('accept proposal label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleAcceptProposal}\n />\n )}\n {onDelete && (\n <IconButton\n data-testid='thread.message.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete message label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleDelete}\n />\n )}\n </div>\n </MessageHeading>\n {textBlock && (\n <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} onSave={handleTextBlockChange} />\n )}\n {proposalBlock && <ProposalBlock block={proposalBlock} />}\n {Ref.Array.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference as Obj.Unknown} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Obj.Unknown }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n onSave,\n}: {\n block: ContentBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n onSave?: (newText: string) => void;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(block.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n onSave?.(inMemoryContentRef.current);\n }, [onSave]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {\n return (\n <div role='none' className='mie-4 italic'>\n {block.text}\n </div>\n );\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Unknown }>(({ subject }, forwardedRef) => {\n // TODO(burdon): Use annotation to get title.\n let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <Card.Root\n className={mx('grid col-span-3 plb-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface role='card-content' limit={1} data={{ subject }} fallback={title} />\n </Card.Root>\n );\n});\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Atom, useAtomValue } from '@effect-atom/atom-react';\nimport React, { type ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { type SurfaceComponentProps, useCapabilities, useCapability } from '@dxos/app-framework/react';\nimport { Context } from '@dxos/context';\nimport { failUndefined } from '@dxos/debug';\nimport { Obj } from '@dxos/echo';\nimport { log } from '@dxos/log';\nimport { useClient } from '@dxos/react-client';\nimport { getSpace } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { ElevationProvider, Input, useTranslation } from '@dxos/react-ui';\nimport { ControlGroup, ControlGroupButton, ControlItemInput } from '@dxos/react-ui-form';\nimport { MenuProvider, ToolbarMenu, createMenuAction, createMenuItemGroup, useMenuActions } from '@dxos/react-ui-menu';\nimport { useSoundEffect } from '@dxos/react-ui-sfx';\nimport { StackItem } from '@dxos/react-ui-stack';\n\nimport { meta } from '../meta';\nimport { ThreadCapabilities } from '../types';\nimport { type Channel } from '../types';\n\nimport { Call } from './Call';\nimport ChatContainer from './ChatContainer';\n\nexport type ChannelContainerProps = SurfaceComponentProps<\n Channel.Channel | undefined,\n {\n roomId?: string;\n fullscreen?: boolean;\n }\n>;\n\n/**\n * Renders a call when active, otherwise renders the channel chat.\n */\n// TODO(burdon): Create Radix style layout.\nexport const ChannelContainer = ({ role, subject: channel, roomId: roomIdProp, fullscreen }: ChannelContainerProps) => {\n const space = getSpace(channel);\n const callManager = useCapability(ThreadCapabilities.CallManager);\n const joined = useAtomValue(callManager.joinedAtom);\n const currentRoomId = useAtomValue(callManager.roomIdAtom);\n const attendableId = channel ? Obj.getDXN(channel).toString() : undefined;\n const roomId = roomIdProp ?? attendableId ?? failUndefined();\n const identity = useIdentity();\n const isNamed = !!identity?.profile?.displayName;\n const joinSound = useSoundEffect('JoinCall');\n const leaveSound = useSoundEffect('LeaveCall');\n\n const extensions = useCapabilities(ThreadCapabilities.CallExtension);\n useEffect(() => {\n const ctx = new Context();\n callManager.left.on(ctx, (roomId) => {\n extensions.forEach((extension) => {\n void extension.onLeave?.(roomId);\n });\n });\n\n callManager.callStateUpdated.on(ctx, (state) => {\n extensions.forEach((extension) => {\n void extension.onCallStateUpdated?.(state);\n });\n });\n\n callManager.mediaStateUpdated.on(ctx, (state) => {\n extensions.forEach((extension) => {\n void extension.onMediaStateUpdated?.(state);\n });\n });\n\n return () => {\n void ctx.dispose();\n };\n }, [callManager, extensions]);\n\n /**\n * Join the call.\n */\n // TODO(wittjosiah): Show preview before joining?\n const handleJoin = useCallback(async () => {\n if (!roomId || !channel) {\n return;\n }\n\n if (joined) {\n await callManager.leave();\n }\n\n try {\n void joinSound.play();\n callManager.setRoomId(roomId);\n await callManager.join();\n await Promise.all(extensions.map((extension) => extension.onJoin?.({ channel, roomId })));\n } catch (err) {\n // TODO(burdon): Error sound.\n log.catch(err);\n }\n }, [extensions, channel, roomId, joined]);\n\n /**\n * Leave the call.\n */\n const handleLeave = useCallback(async () => {\n try {\n void leaveSound.play();\n } catch (err) {\n // TODO(burdon): Error sound.\n log.catch(err);\n } finally {\n void callManager.turnAudioOff();\n void callManager.turnVideoOff();\n void callManager.turnScreenshareOff();\n void callManager.leave();\n }\n }, [extensions, roomId]);\n\n const isJoined = joined && currentRoomId === roomId;\n\n return (\n <StackItem.Content classNames={isJoined && 'bs-full'} toolbar={!isJoined}>\n {isJoined && !isNamed && <DisplayNameMissing />}\n {isJoined && isNamed && (\n <Call.Root>\n <Call.Grid fullscreen={fullscreen} />\n <Call.Toolbar channel={channel} onLeave={handleLeave} />\n </Call.Root>\n )}\n {!isJoined && channel && channel.defaultThread.target && space && (\n <>\n <ChannelToolbar attendableId={attendableId} role={role} onJoinCall={handleJoin} />\n <ChatContainer space={space} thread={channel.defaultThread.target} classNames='container-max-width' />\n </>\n )}\n </StackItem.Content>\n );\n};\n\nexport default ChannelContainer;\n\nconst DisplayNameMissing = () => {\n const { t } = useTranslation(meta.id);\n const client = useClient();\n const [displayName, setDisplayName] = useState('');\n const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>) => setDisplayName(event.target.value), []);\n const handleSave = useCallback(() => client.halo.updateProfile({ displayName }), [client, displayName]);\n\n return (\n <ControlGroup classNames='p-4 place-content-center'>\n <ControlItemInput title={t('display name label')} description={t('display name description')}>\n <Input.TextInput\n value={displayName}\n onChange={handleChange}\n placeholder={t('display name input placeholder')}\n classNames='md:min-is-64'\n />\n </ControlItemInput>\n <ControlGroupButton disabled={!displayName} onClick={handleSave}>\n {t('set display name label')}\n </ControlGroupButton>\n </ControlGroup>\n );\n};\n\nconst useChannelToolbarActions = (onJoinCall?: () => void) => {\n const creator = useMemo(\n () =>\n Atom.make(() => {\n return {\n nodes: [\n createMenuItemGroup('root', {\n label: ['channel toolbar title', { ns: meta.id }],\n }),\n createMenuAction('video-call', () => onJoinCall?.(), {\n label: ['start video call label', { ns: meta.id }],\n icon: 'ph--video-camera--regular',\n type: 'video-call',\n }),\n ],\n edges: [{ source: 'root', target: 'video-call' }],\n };\n }),\n [],\n );\n\n return useMenuActions(creator);\n};\n\ntype ChannelToolbarProps = {\n attendableId?: string;\n role?: string;\n onJoinCall?: () => void;\n};\n\nconst ChannelToolbar = ({ attendableId, role, onJoinCall }: ChannelToolbarProps) => {\n const menuProps = useChannelToolbarActions(onJoinCall);\n\n return (\n <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>\n <MenuProvider {...menuProps} attendableId={attendableId}>\n <ToolbarMenu textBlockWidth />\n </MenuProvider>\n </ElevationProvider>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { useCapability } from '@dxos/app-framework/react';\n\nimport { ThreadCapabilities } from '../types';\n\nimport { ChannelContainer } from './ChannelContainer';\n\nexport const CallSidebar = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n const roomId = useAtomValue(call.roomIdAtom);\n return <ChannelContainer subject={undefined} roomId={roomId} />;\n};\n\nexport default CallSidebar;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { Common } from '@dxos/app-framework';\nimport { useCapabilities, useCapability, useOperationInvoker } from '@dxos/app-framework/react';\nimport { Filter, Obj, Query, Relation } from '@dxos/echo';\nimport { Ref, useQuery } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { useTranslation } from '@dxos/react-ui';\nimport { useAttended } from '@dxos/react-ui-attention';\nimport { Layout } from '@dxos/react-ui-mosaic';\nimport { Tabs } from '@dxos/react-ui-tabs';\nimport { AnchoredTo, Thread } from '@dxos/types';\nimport { mx } from '@dxos/ui-theme';\n\nimport { CommentsContainer, type CommentsContainerProps } from '../components';\nimport { meta } from '../meta';\nimport { ThreadCapabilities, ThreadOperation, type ViewState } from '../types';\n\nconst initialViewState: ViewState = { showResolvedThreads: false };\n\nexport const ThreadCompanion = ({ subject }: { subject: any }) => {\n const { t } = useTranslation(meta.id);\n const { invokePromise } = useOperationInvoker();\n const identity = useIdentity();\n const subjectId = Obj.getDXN(subject).toString();\n const registry = useCapability(Common.Capability.AtomRegistry);\n\n const stateAtom = useCapability(ThreadCapabilities.State);\n const viewStoreAtom = useCapability(ThreadCapabilities.ViewState);\n const state = useAtomValue(stateAtom);\n const viewStore = useAtomValue(viewStoreAtom);\n const drafts = state.drafts[subjectId];\n\n // Get or initialize view state for this subject.\n const viewState = useMemo(() => {\n if (!viewStore[subjectId]) {\n registry.set(viewStoreAtom, { ...viewStore, [subjectId]: { ...initialViewState } });\n return initialViewState;\n }\n return viewStore[subjectId];\n }, [viewStore, subjectId, registry, viewStoreAtom]);\n const { showResolvedThreads } = viewState;\n\n const onChangeViewState = useCallback(\n (nextValue: string) => {\n registry.set(viewStoreAtom, {\n ...registry.get(viewStoreAtom),\n [subjectId]: { ...registry.get(viewStoreAtom)[subjectId], showResolvedThreads: nextValue === 'all' },\n });\n },\n [registry, viewStoreAtom, subjectId],\n );\n\n const anchorSorts = useCapabilities(Common.Capability.AnchorSort);\n const sort = useMemo(\n () => anchorSorts.find(({ key }) => key === Obj.getTypename(subject))?.sort,\n [anchorSorts, subject],\n );\n\n const db = Obj.getDatabase(subject);\n const objectsAnchoredTo = useQuery(db, Query.select(Filter.id(subject.id)).targetOf(AnchoredTo.AnchoredTo));\n const anchors = objectsAnchoredTo\n .toSorted((a, b) => sort?.(a, b) ?? 0)\n .filter((anchor) => Obj.instanceOf(Thread.Thread, Relation.getSource(anchor)))\n .concat(drafts ?? []);\n\n const attended = useAttended();\n\n const handleAttend = useCallback(\n (anchor: AnchoredTo.AnchoredTo) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const threadId = Obj.getDXN(thread).toString();\n\n if (state.current !== threadId) {\n registry.set(stateAtom, { ...registry.get(stateAtom), current: threadId });\n\n // TODO(wittjosiah): Should this be a thread-specific intent?\n // The layout doesn't know about threads and this working depends on other plugins conditionally handling it.\n // This may be overloading this intent or highjacking its intended purpose.\n void invokePromise(Common.LayoutOperation.ScrollIntoView, {\n subject: Obj.getDXN(subject).toString(),\n cursor: anchor.anchor,\n ref: threadId,\n });\n }\n },\n [state.current, invokePromise, subject, registry, stateAtom],\n );\n\n const handleComment = useCallback(\n async (anchor: AnchoredTo.AnchoredTo, text: string) => {\n await invokePromise(ThreadOperation.AddMessage, {\n anchor,\n subject,\n sender: { identityDid: identity?.did },\n text,\n });\n\n const thread = Relation.getSource(anchor) as Thread.Thread;\n registry.set(stateAtom, { ...registry.get(stateAtom), current: Obj.getDXN(thread).toString() });\n },\n [invokePromise, identity, subject, registry, stateAtom],\n );\n\n const handleResolve = useCallback(\n (anchor: AnchoredTo.AnchoredTo) =>\n invokePromise(ThreadOperation.ToggleResolved, {\n thread: Relation.getSource(anchor) as Thread.Thread,\n }),\n [invokePromise],\n );\n\n const handleThreadDelete = useCallback(\n (anchor: AnchoredTo.AnchoredTo) => invokePromise(ThreadOperation.Delete, { anchor, subject }),\n [invokePromise, subject],\n );\n\n const handleMessageDelete = useCallback(\n (anchor: AnchoredTo.AnchoredTo, messageId: string) =>\n invokePromise(ThreadOperation.DeleteMessage, {\n anchor,\n subject,\n messageId,\n }),\n [invokePromise, subject],\n );\n\n const handleAcceptProposal = useCallback<NonNullable<CommentsContainerProps['onAcceptProposal']>>(\n async (anchor, messageId) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const messageIndex = thread.messages.findIndex(Ref.hasObjectId(messageId));\n const message = thread.messages[messageIndex]?.target;\n const proposal = message?.blocks.find((block) => block._tag === 'proposal');\n if (!proposal || !anchor.anchor) {\n return;\n }\n\n await invokePromise(Common.CollaborationOperation.AcceptProposal, {\n subject,\n anchor: anchor.anchor,\n proposal,\n });\n await invokePromise(ThreadOperation.ToggleResolved, { thread });\n },\n [invokePromise, subject],\n );\n\n const comments = (\n <CommentsContainer\n anchors={anchors}\n currentId={attended.includes(subjectId) ? state.current : undefined}\n showResolvedThreads={showResolvedThreads}\n onAttend={handleAttend}\n onComment={handleComment}\n onResolve={handleResolve}\n onMessageDelete={handleMessageDelete}\n onThreadDelete={handleThreadDelete}\n onAcceptProposal={handleAcceptProposal}\n />\n );\n\n return (\n <Layout.Main toolbar>\n <Tabs.Root\n value={showResolvedThreads ? 'all' : 'unresolved'}\n orientation='horizontal'\n classNames={[\n 'contents [&_[role=\"tabpanel\"]]:min-bs-0 [&_[role=\"tabpanel\"]]:overflow-y-auto [&_[role=\"tabpanel\"]]:scrollbar-thin',\n ]}\n onValueChange={onChangeViewState}\n >\n {/* TODO(burdon): Standardize (like Tollbar). */}\n <Tabs.Tablist classNames={mx('bg-toolbarSurface border-be border-subduedSeparator')}>\n <Tabs.Tab value='unresolved' classNames='text-sm'>\n {t('show unresolved label')}\n </Tabs.Tab>\n <Tabs.Tab value='all' classNames='text-sm'>\n {t('show all label')}\n </Tabs.Tab>\n </Tabs.Tablist>\n <div className='overflow-y-auto'>\n <Tabs.Tabpanel value='all'>{showResolvedThreads && comments}</Tabs.Tabpanel>\n <Tabs.Tabpanel value='unresolved'>{!showResolvedThreads && comments}</Tabs.Tabpanel>\n </div>\n </Tabs.Root>\n </Layout.Main>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect } from 'react';\n\nimport { Obj, Relation } from '@dxos/echo';\nimport { Callout, Icon, Trans, useTranslation } from '@dxos/react-ui';\nimport { type AnchoredTo, type Thread } from '@dxos/types';\n\nimport { meta } from '../meta';\n\nimport { CommentsThreadContainer, type CommentsThreadContainerProps } from './CommentsThreadContainer';\n\nexport type CommentsContainerProps = Omit<CommentsThreadContainerProps, 'anchor' | 'current'> & {\n anchors: AnchoredTo.AnchoredTo[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Root container for collection of comment threads.\n */\nexport const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsContainerProps) => {\n const { t } = useTranslation(meta.id);\n\n // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.\n const filteredAnchors = showResolvedThreads\n ? anchors.filter((anchor) => !!Relation.getSource(anchor))\n : anchors.filter((anchor) => {\n const thread = Relation.getSource(anchor);\n return thread && thread.status !== 'resolved';\n });\n\n useEffect(() => {\n if (currentId) {\n document.getElementById(currentId)?.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }, [currentId]);\n\n if (filteredAnchors.length === 0) {\n return (\n <div role='none' className='plb-cardSpacingBlock pli-cardSpacingInline'>\n <Callout.Root>\n <Callout.Title>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='inline-block' />,\n },\n }}\n />\n </Callout.Title>\n </Callout.Root>\n </div>\n );\n }\n\n return (\n <div>\n {filteredAnchors.map((anchor) => {\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const threadId = Obj.getDXN(thread).toString();\n return <CommentsThreadContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;\n })}\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Relation } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread as ThreadComponent,\n type ThreadRootProps,\n} from '@dxos/react-ui-thread';\nimport { type AnchoredTo, type Thread } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';\n\nexport type CommentsThreadContainerProps = {\n anchor: AnchoredTo.AnchoredTo;\n onAttend?: (anchor: AnchoredTo.AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo.AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo.AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo.AnchoredTo) => void;\n onAcceptProposal?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const CommentsThreadContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n onAcceptProposal,\n}: CommentsThreadContainerProps) => {\n const { themeMode } = useThemeContext();\n const { t } = useTranslation(meta.id);\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.id);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const [messages] = useObject(thread, 'messages');\n const activity = useStatus(space, Obj.getDXN(thread).toString());\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n\n const textboxMetadata = getMessageMetadata(Obj.getDXN(thread).toString(), identity);\n\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [state, setState] = useState({});\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: ({ text }) => (messageRef.current = text) }),\n command,\n ],\n [state],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(anchor), [onAttend, anchor]);\n const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);\n const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n setState({});\n\n return true;\n }, [anchor, identity]);\n\n return (\n <ThreadComponent.Root\n id={Obj.getDXN(thread).toString()}\n classNames='pbs-2 border-be border-subduedSeparator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>\n <ThreadComponent.Header detached>{thread.name}</ThreadComponent.Header>\n </Tooltip.Trigger>\n ) : (\n <ThreadComponent.Header>{thread.name}</ThreadComponent.Header>\n )}\n <div role='none' className={buttonGroupClassNames}>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <IconButton\n data-testid='thread.resolve'\n variant='ghost'\n icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}\n iconOnly\n label={t('resolve thread label')}\n classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}\n onClick={handleResolve}\n />\n )}\n {onThreadDelete && (\n <IconButton\n data-testid='thread.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete thread label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleThreadDelete}\n />\n )}\n </div>\n </div>\n\n {messages?.map((ref) => (\n <MessageContainer\n key={ref.dxn.toString()}\n editable\n message={ref}\n members={members}\n onDelete={handleMessageDelete}\n onAcceptProposal={handleAcceptProposal}\n />\n ))}\n\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n\n <ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>\n\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </ThreadComponent.Root>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React from 'react';\n\nimport { useTranslation } from '@dxos/react-ui';\nimport { ControlPage } from '@dxos/react-ui-form';\n\nimport { meta } from '../meta';\nimport type { ThreadSettingsProps } from '../types';\n\nexport type ThreadSettingsComponentProps = {\n settings: ThreadSettingsProps;\n onSettingsChange: (fn: (current: ThreadSettingsProps) => ThreadSettingsProps) => void;\n};\n\nexport const ThreadSettings = ({ settings: _settings }: ThreadSettingsComponentProps) => {\n const { t: _t } = useTranslation(meta.id);\n return <ControlPage></ControlPage>;\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;AAIA,SAASA,gBAAAA,qBAAoB;AAC7B,OAAOC,YAAgD;AAEvD,SAASC,iBAAAA,sBAAqB;;;ACH9B,OAAOC,SAAkBC,WAAWC,cAAc;AAM3C,IAAMC,cAAoC,CAAC,EAAEC,OAAM,MAAE;AAC1D,QAAMC,iBAAiBC,OAAO,IAAIC,YAAAA,CAAAA;AAClC,QAAMC,MAAMF,OAAyB,IAAA;AAErCG,YAAU,MAAA;AACR,UAAMC,QAAQF,IAAIG;AAClB,QAAI,CAACD,OAAO;AACV;IACF;AAEA,UAAME,cAAcP,eAAeM;AACnCD,UAAMG,YAAYD;EACpB,GAAG,CAAA,CAAE;AAEL,QAAME,iBAAiB,MAAA;AACrB,UAAMJ,QAAQF,IAAIG;AAClB,UAAMC,cAAcP,eAAeM;AACnC,QAAI,CAACD,SAAS,CAACE,aAAa;AAC1B;IACF;AAKAF,UAAMK,iBAAiB,WAAW,MAAML,MAAMM,KAAI,GAAI;MAAEC,MAAM;IAAK,CAAA;AACnEP,UAAMG,YAAYD;EACpB;AAEA,SACE,sBAAA,cAAA,MAAA,UAAA,MACE,sBAAA,cAACF,SAAAA;IAAMF;IAAUU,UAAAA;MAChBd,OAAOe,IAAI,CAACC,UACX,sBAAA,cAACC,YAAAA;IAAWC,KAAKF,MAAMG;IAAIH;IAAcR,aAAaP,eAAeM;IAASG;;AAItF;AAQA,IAAMO,aAAa,CAAC,EAAED,OAAOR,aAAaE,eAAc,MAAoB;AAC1EL,YAAU,MAAA;AACR,UAAMe,eAAeJ;AACrBR,gBAAYa,SAASD,YAAAA;AACrBV,mBAAAA;AACA,WAAO,MAAA;AACLF,kBAAYc,YAAYF,YAAAA;AACxBV,qBAAAA;IACF;EACF,GAAG;IAACM;IAAOR;GAAY;AAEvB,SAAO;AACT;;;AC9DA,OAAOe,UAAmBC,YAAYC,MAAMC,aAAAA,YAAWC,UAAAA,eAAc;AAGrE,SAASC,UAAU;AAUZ,IAAMC,cAAcC,qBACzBC,2BAA+C,CAAC,EAAEC,aAAaC,YAAYC,MAAMC,SAAS,GAAGC,KAAAA,GAAQC,QAAAA;AACnG,QAAMC,cAAcC,QAAgC,IAAA;AAEpDC,EAAAA,WAAU,MAAA;AACR,UAAMC,QAAQH,YAAYI;AAC1B,QAAID,SAAST,aAAa;AACxBS,YAAME,YAAYX;AAClBS,YAAMG,aAAa,YAAY,MAAA;AAC/BH,YAAMG,aAAa,eAAe,MAAA;IACpC;EACF,GAAG;IAACZ;IAAaM,YAAYI;GAAQ;AAGrC,SACE,gBAAAG,OAAA,cAACJ,SAAAA;IACCK,WAAWC,GACT,wBACAb,QAAQ,gBACRC,UAAU,mBAAmB,gBAC7BF,UAAAA;IAEFI,KAAK,CAACW,MAAAA;AACJV,kBAAYI,UAAUM;AACtB,UAAIX,QAAQ,MAAM;AAChB;MACF;AAEA,UAAI,OAAOA,QAAQ,YAAY;AAC7BA,YAAIW,CAAAA;MACN,OAAO;AACLX,YAAIK,UAAUM;MAChB;IACF;IACC,GAAGZ;;AAGV,CAAA,CAAA;AAGFP,YAAYoB,cAAc;;;ACrD1B,SAASC,oBAAoB;AAC7B,OAAOC,UAASC,QAAAA,OAAMC,WAAAA,gBAAe;AAErC,SAASC,qBAAqB;;;ACH9B,OAAOC,YAAuC;AAE9C,SAASC,MAAAA,WAAU;AAWZ,IAAMC,sBAAsB,CAAC,EAAEC,SAAQ,MAAqB;AACjE;;IAEE,gBAAAC,OAAA,cAACC,OAAAA;MAAIC,MAAK;MAAOC,WAAU;OAEzB,gBAAAH,OAAA,cAACC,OAAAA;MAAIC,MAAK;MAAOC,WAAU;OAEzB,gBAAAH,OAAA,cAACC,OAAAA;MAAIC,MAAK;MAAOC,WAAWC,IAAG,sDAAA;OAC5BL,QAAAA,CAAAA,CAAAA;;AAKX;;;AC1BA,OAAOM,UAAsCC,aAAaC,aAAAA,YAAWC,iBAAiBC,SAASC,gBAAgB;AAC/G,SAASC,yBAAyB;AAElC,SAASC,iBAAiB;AAG1B,SAASC,MAAAA,WAAU;;AAKnB,IAAMC,eAAe,KAAK;AAC1B,IAAMC,qBAAqB;AAE3B,IAAMC,cAAc;AAEpB,IAAMC,eAAe;AAkCrB,IAAMC,eAAkD,CAACC,SAAcA,KAAKC;AAMrE,IAAMC,iBAAiB,CAAyB,EACrDC,YACAC,MACAC,MAAMR,aACNS,OAAAA,SAAQP,cACRQ,OACAC,QACAC,kBAAkB,OAClBC,OACAC,eAAc,MACS;AACvB,QAAM,EACJC,OAAOC,iBAAiB,GACxBC,QAAQC,kBAAkB,GAC1BC,KAAKC,aAAY,IACfC,kBAAkC;IAAEC,aAAa;EAAI,CAAA;AACzD,QAAM,CAACC,eAAeC,gBAAAA,IAAoBC,SAAe,CAAA;AACzDC,EAAAA,WAAU,MAAA;AACR,QAAIV,kBAAkBE,iBAAiB;AACrC,YAAM,EAAED,QAAAA,QAAM,IAAKU,eAAeX,gBAAgBE,iBAAiBpB,YAAAA;AACnE0B,uBAAiBI,KAAKC,IAAIZ,SAAQC,kBAAkBnB,kBAAAA,CAAAA;IACtD;EACF,GAAG;IAACiB;IAAgBE;GAAgB;AAEpC,QAAMY,aAAaC,QAAQ,MAAMrB,MAAMsB,KAAK,CAAC7B,SAASM,OAAMN,IAAAA,MAAUQ,MAAAA,GAAS;IAACD;IAAOC;GAAO;AAC9F,QAAMsB,YAAYF,QAAQ,MAAMrB,MAAMwB,OAAO,CAAC/B,SAASM,OAAMN,IAAAA,MAAUQ,MAAAA,GAAS;IAACD;IAAOC;GAAO;AAC/F,QAAMwB,cAAcvB,mBAAmBkB,eAAeM;AAKtD,QAAM,CAAC,EAAEC,MAAMC,SAASC,UAAS,GAAIC,SAAAA,IAAaf,SAAiB;IAAEY,MAAM;IAAGC,SAAS;IAAGC,WAAW;EAAE,CAAA;AACvG,QAAM,EAAExB,QAAQ,GAAGE,SAAS,GAAGE,KAAKsB,iBAAgB,IAAKpB,kBAAkC;IAAEC,aAAa;EAAI,CAAA;AAC9GI,EAAAA,WAAU,MAAA;AACR,QAAIR,mBAAmBH,SAASE,QAAQ;AACtC,YAAMyB,SAASC,gBAAgB5B,OAAOE,QAAQgB,UAAUW,QAAQpC,GAAAA;AAChEgC,gBAAU;QAAEH,MAAMQ,KAAKC,IAAG;QAAI,GAAGJ;MAAO,CAAA;IAC1C;EACF,GAAG;IAACxB;IAAiBH;IAAOE;IAAQgB,UAAUW;IAAQpC;IAAKG;GAAO;AAMlE,QAAM,CAACoC,QAAQC,SAAAA,IAAavB,SAA+B,CAAA,CAAE;AAC7DwB,kBAAgB,MAAA;AACd,QAAK,CAACd,eAAe,CAACM,iBAAiBS,WAAY,CAAChC,iBAAiB;AACnE;IACF;AAGA,UAAMiC,IAAIC,WAAW,MAAA;AACnBJ,gBACEtC,MACGwB,OAAO,CAAC/B,SAAS,CAACgC,eAAehC,SAAS2B,UAAAA,EAC1CuB,IAAI,CAAClD,SAAAA;AACJmD,kBAAUlC,aAAa8B,SAAO,QAAA;;;;;;;;;AAC9B,cAAMK,KAAKnC,aAAa8B,QAAQM,cAAc,oBAAoB/C,OAAMN,IAAAA,CAAAA,IAAS;AACjF,YAAI,CAACoD,IAAI;AACP,iBAAO;QACT;AAEA,cAAMR,UAASU,kBAAkBrC,aAAa8B,SAASK,EAAAA;AACvD,eAAO;UAACpD;UAAM4C;;MAChB,CAAA,EACCb,OAAO,CAAC/B,SAAqCA,SAAS,IAAA,CAAA;IAE7D,CAAA;AAEA,WAAO,MAAMuD,aAAaP,CAAAA;EAC5B,GAAG;IAACjC;IAAiBR;IAAOoB;IAAYK;IAAaE;GAAK;AAE1D,QAAMsB,cAAcC,YAClB,CAACzD,SAAYW,iBAAiBL,OAAMN,IAAAA,MAAUQ,SAASyB,SAAY3B,OAAMN,IAAAA,CAAAA,GACzE;IAACQ;IAAQG;GAAe;AAG1B,SACE,gBAAA+C,OAAA,cAACC,OAAAA;IAAI3C,KAAKC;IAAc2C,WAAWC,IAAG,4BAA4B1D,UAAAA;KAEhE,gBAAAuD,OAAA,cAACC,OAAAA;IAAIC,WAAU;KAEZjC,cACC,gBAAA+B,OAAA,cAACC,OAAAA;IACCC,WAAWC,IAAG,oEAAoE7B,eAAe,SAAA;IACjG8B,OAAO9B,cAAc,CAAC,IAAI;MAAElB,QAAQM;IAAc;KAElD,gBAAAsC,OAAA,cAACK,UAAAA;IAAS9D,IAAIK,OAAMqB,UAAAA;IAAajB;OAKpC,CAACsB,eACA,gBAAA0B,OAAA,cAACC,OAAAA;IACC3C,KAAKsB;IACLsB,WAAU;IACVE,OAAO9B,cAAc,CAAC,IAAI;MAAEgC,WAAWpE;IAAmB;KAEzDkC,UAAUW,WAAW,KACpB,gBAAAiB,OAAA,cAACC,OAAAA;IAAIG,OAAO;MAAElD,OAAOwB;IAAU;IAAGwB,WAAU;KAC1C,gBAAAF,OAAA,cAACK,UAAAA;IAAS9D,IAAIK,OAAMwB,UAAU,CAAA,CAAE;IAAGpB;OAItCoB,UAAUW,SAAS,KAAKN,UAAU,KACjC,gBAAAuB,OAAA,cAACC,OAAAA;IACCM,MAAK;IACLH,OAAO;MACLI,SAAS;MACTC,qBAAqB,UAAUhC,OAAAA,KAAYC,SAAAA;MAC3C/B,KAAK,GAAGA,GAAAA;IACV;KAECyB,UAAUoB,IAAI,CAAClD,SACd,gBAAA0D,OAAA,cAACC,OAAAA;IACCS,KAAK9D,OAAMN,IAAAA;IACL,kBAAkBM,OAAMN,IAAAA;IAC9B4D,WAAWC,IACT,wDACAnD,SAAS,2BAAA;UAWzB,gBAAAgD,OAAA,cAACC,OAAAA;IAAIC,WAAWC,IAAGnD,SAAS,YAAA;KACzBkC,OAAOM,IAAI,CAAC,CAAClD,MAAM4C,OAAAA,MAClB,gBAAAc,OAAA,cAACtD,MAAAA;IACCgE,KAAK9D,OAAMN,IAAAA;IACXG,YAAW;IACXH;IACA8D,OAAOlB;IACPpC,QAAQF,OAAMN,IAAAA,MAAUQ;IACxB6D,SAAS9D,MAAMkC,SAAS,IAAIe,cAAcvB;;AAMtD;AAEA,IAAM8B,WAAoE,CAAC,EAAErD,OAAOT,GAAE,MAAE;AACtF,SACE,gBAAAyD,OAAA,cAACY,qBAAAA,MACC,gBAAAZ,OAAA,cAACC,OAAAA;IACO,kBAAkB1D;IACxB2D,WAAWC,IAAG,gCAAgCnD,SAAS,kCAAA;KAGvD,gBAAAgD,OAAA,cAACa,OAAAA;IAAIC,KAAI;IAAoBZ,WAAWC,IAAG,aAAa/D,YAAAA;;AAIhE;AAKA,IAAMwD,oBAAoB,CAACmB,WAAwBrB,OAAAA;AACjD,QAAMsB,gBAAgBD,UAAUE,sBAAqB;AACrD,QAAMC,cAAcxB,GAAGuB,sBAAqB;AAC5C,SAAO;IACLE,KAAKD,YAAYC,MAAMH,cAAcG;IACrCC,MAAMF,YAAYE,OAAOJ,cAAcI;IACvClE,OAAOgE,YAAYhE;IACnBE,QAAQ8D,YAAY9D;EACtB;AACF;AAiBA,IAAM0B,kBAAkB,CACtB3B,gBACAE,iBACAgE,OACA1E,KACA2E,cAAcrF,iBAAY;AAE1B,MAAIoF,UAAU,GAAG;AACf,WAAO;MAAE5C,SAAS;MAAGC,WAAW;IAAE;EACpC;AAEA,MAAI6C,iBAAiBC;AACrB,MAAIC,cAAc;AAClB,MAAI/C,YAAY;AAGhB,WAASgD,OAAO,GAAGA,QAAQL,OAAOK,QAAQ;AACxC,UAAMC,OAAO5D,KAAK6D,KAAKP,QAAQK,IAAAA;AAG/B,UAAM,EAAExE,OAAO2E,WAAWzE,QAAQ0E,WAAU,IAAKC,eAC/C5E,gBACAE,iBACAsE,MACAD,MACAJ,aACA3E,GAAAA;AAIF,UAAMqF,YAAYH,YAAYF,OAAOhF,MAAMgF,OAAO;AAClD,UAAMM,aAAaH,aAAaJ,OAAO/E,MAAM+E,OAAO;AAGpD,UAAMQ,cAAc/E,iBAAiBE,kBAAkB2E,YAAYC;AACnE,QAAIC,cAAcX,gBAAgB;AAChCA,uBAAiBW;AACjBT,oBAAcE;AACdjD,kBAAYmD;IACd;EACF;AAEA,SAAO;IAAEpD,SAASgD;IAAa/C;EAAU;AAC3C;AAKA,IAAMqD,iBAAiB,CACrBI,YACAC,aACAC,SACAC,SACAhB,aACA3E,QAAAA;AAGA,QAAM4F,iBAAiBJ,aAAaxF,OAAO0F,UAAU;AACrD,QAAMG,kBAAkBJ,cAAczF,OAAO2F,UAAU;AAGvD,QAAMG,eAAeF,iBAAiBF;AACtC,QAAMK,gBAAgBF,kBAAkBF;AAGxC,SAAOxE,eAAe2E,cAAcC,eAAepB,WAAAA;AACrD;AAKA,IAAMxD,iBAAiB,CACrBqE,YACAC,aACAd,gBAAAA;AAEA,MAAIa,cAAc,KAAKC,eAAe,KAAKd,eAAe,GAAG;AAC3D,WAAO;MAAEpE,OAAO;MAAGE,QAAQ;IAAE;EAC/B;AAGA,MAAIF,QAAQiF;AACZ,MAAI/E,SAASF,QAAQoE;AAGrB,MAAIlE,SAASgF,aAAa;AACxBhF,aAASgF;AACTlF,YAAQE,SAASkE;EACnB;AAEA,SAAO;IAAEpE;IAAOE;EAAO;AACzB;;;AChVA,OAAOuF,UAAqDC,aAAAA,YAAWC,YAAAA,iBAAgB;AAEvF,SAASC,MAAMC,YAAkCC,sBAAsB;AACvE,SAASC,gBAAgB;AACzB,SAASC,qCAAqCC,MAAAA,WAAU;AAwBjD,IAAMC,qBAAqB,CAAyB,EACzDC,UACAC,YACAC,MACAC,OACAC,MACAC,MACAC,QACAC,aACAC,OACAC,MACAC,MACAC,UACAC,QAAO,MACoB;AAC3B,QAAM,EAAEC,EAAC,IAAKC,eAAeC,KAAKC,EAAE;AACpC,QAAMC,YAAkF;IACtFP,MAAM;MACJQ,MAAM;MACNC,OAAON,EAAE,WAAA;MACTZ,YAAY;IACd;IACAQ,MAAM;MACJS,MAAM;MACNC,OAAON,EAAE,YAAA;IACX;EACF;AAEA,QAAMO,QAAQV,QAAQ,CAACJ,SAASW,UAAUP,OAAOD,OAAOQ,UAAUR,OAAOE,WAAWM,UAAUN,WAAWU;AAGzG,QAAM,CAACC,mBAAmBC,oBAAAA,IAAwBC,UAASb,QAAAA;AAC3Dc,EAAAA,WAAU,MAAA;AACR,QAAId,UAAU;AACZY,2BAAqB,IAAA;IACvB,OAAO;AACL,YAAMG,UAAUC,WAAW,MAAA;AACzBJ,6BAAqB,KAAA;MACvB,GAAG,GAAA;AACH,aAAO,MAAMK,aAAaF,OAAAA;IAC5B;EACF,GAAG;IAACf;GAAS;AAEb,SACE,gBAAAkB,OAAA,cAACC,OAAAA;IACCC,WAAWC,IACT,kCACA,4FACAV,oBAAoB,sBAAsB,CAACd,SAAS,qBACpDP,UAAAA;IAEFE;KAECH,UAGAY,WACC,gBAAAiB,OAAA,cAACC,OAAAA;IAAIC,WAAU;KACb,gBAAAF,OAAA,cAACI,YAAAA;IACChC,YAAY+B,IAAG,wBAAwBE,mCAAAA;IACvCC,UAAAA;IACAjB,MAAMZ,SAAS,mBAAmB;IAClC8B,MAAM9B,SAAS,IAAI;IACnBa,OAAOb,SAASO,EAAE,YAAA,IAAgBA,EAAE,UAAA;IACpCD,SAAS,MAAMA,UAAUV,IAAAA;OAM9BE,QACC,gBAAAyB,OAAA,cAACC,OAAAA;IAAIC,WAAU;KAGZxB,eAAe,gBAAAsB,OAAA,cAACQ,MAAAA;IAAKnB,MAAK;IAAyBkB,MAAM9B,SAAS,IAAI;MACvE,gBAAAuB,OAAA,cAACC,OAAAA;IACCC,WAAWC,IACT,4DACA1B,SAAS,UAAU,eAAA;KAGpBF,IAAAA,CAAAA,GAMP,gBAAAyB,OAAA,cAACC,OAAAA;IAAIC,WAAU;KACXpB,YAAY,gBAAAkB,OAAA,cAACS,UAAAA;IAASC,QAAAA;IAAOH,MAAM9B,SAAS,IAAI;QAC/Cc,SACC,gBAAAS,OAAA,cAACI,YAAAA;IACChC,YAAY+B,IAAG,wBAAwBZ,OAAOnB,UAAAA;IAC9CiB,MAAME,OAAOF;IACbC,OAAOC,OAAOD;IACdiB,MAAM9B,SAAS,IAAI;IACnB6B,UAAAA;;AAMd;;;AHvHO,IAAMK,qBAAqB;AAE3B,IAAMC,cAAcC,gBAAAA,MAAK,CAAC,EAAEC,MAAMC,MAAMC,OAAO,GAAGC,MAAAA,MAA2C;AAClG,QAAMC,OAAOC,cAAcC,mBAAmBC,WAAW;AACzD,QAAMC,OAAOC,aAAaL,KAAKM,QAAQ;AACvC,QAAMC,QAAQF,aAAaL,KAAKQ,SAAS;AACzC,QAAMC,SAAkBL,KAAKM,OAAOC,UAAad,KAAKa,OAAOC,UAAad,KAAKa,GAAGE,WAAWR,KAAKM,EAAE;AACpG,QAAMG,gBAAgBhB,KAAKa,IAAII,SAASrB,kBAAAA;AAGxC,QAAMsB,oBAAoBC,SAAiC,MAAA;AACzD,QAAIP,QAAQ;AACV,aAAOE;IACT;AACA,UAAMM,YACJJ,iBAAiBhB,KAAKqB,QAAQC,qBACzBtB,KAAKqB,QAAQE,cACd,CAACP,iBAAiBhB,KAAKqB,QAAQG,eAC5BxB,KAAKqB,QAAQI,QACdX;AACR,WAAOM,YAAYV,MAAMgB,mBAAmBN,SAAAA,GAAYO,SAASb;EACnE,GAAG;IACDF;IACAI;IACAN,MAAMgB;IACN1B,KAAKqB,QAAQE;IACbvB,KAAKqB,QAAQI;IACbzB,KAAKqB,QAAQC;IACbtB,KAAKqB,QAAQG;GACd;AAED,QAAMI,cAAcT,SAAiC,MAAA;AACnD,QAAIP,QAAQ;AACV,aAAOI,gBAAgBN,MAAMmB,yBAAyBnB,MAAMkB;IAC9D;AACA,WAAOV;EACT,GAAG;IAACN;IAAQI;IAAeN,MAAMkB;IAAalB,MAAMmB;IAAwBX;GAAkB;AAE9F,SACE,gBAAAY,OAAA,cAACC,oBAAAA;IACE,GAAG7B;IACJH,MAAMC;IACNgC,MAAMhC,KAAKgC;IACXzB,MAAMK;IACNW,aAAa,CAAC,CAACb,MAAMmB;IACrBJ,OAAOf,MAAMc;IACbS,MAAMjC,OAAO,CAACA,KAAKqB,QAAQa,eAAe;IAC1CC,MAAMnC,KAAKoC;IACXC,UAAUrC,KAAKqC;IACfpC;KAEA,gBAAA6B,OAAA,cAACQ,aAAAA;IACCV;IACAW,MAAM3B,UAAU,CAACI;IACjBwB,SAAS,CAAC,CAACxB;IACXyB,YAAW;;AAInB,CAAA;AAEA5C,YAAY6C,cAAc;;;AIvE1B,OAAOC,UAASC,aAAAA,YAAWC,WAAAA,UAASC,YAAAA,iBAAgB;AASpD,IAAMC,QAAQ,CAACC,SAA4BA,KAAKC;AASzC,IAAMC,kBAAkB,CAAC,EAAEC,YAAYC,MAAMC,OAAOC,YAAYC,MAAK,MAAwB;AAClG,QAAM,CAACC,QAAQC,SAAAA,IAAaC,UAAAA;AAE5B,QAAMC,WAAWC,SAAQ,MAAA;AACvB,UAAMD,YAAiD,CAAA;AACvDN,UAAMQ,QAAQ,CAACb,SAAAA;AACb,UAAI,CAACA,KAAKc,QAAQ;AAChB;MACF;AAEAH,MAAAA,UAASI,KAAK;QAAE,GAAGf;QAAMgB,QAAQhB,KAAKC,OAAOG,KAAKH;MAAG,CAAA;AACrD,UAAID,KAAKiB,QAAQC,oBAAoB;AACnC,cAAMC,cAAyB;UAC7B,GAAGnB;UACHC,IAAID,KAAKC,KAAKmB;UACdH,QAAQ;YACN,GAAGjB,KAAKiB;YACRI,OAAOrB,KAAKiB,OAAOE;YACnBG,cAActB,KAAKiB,OAAOC;UAC5B;QACF;AAEAP,QAAAA,UAASI,KAAKI,WAAAA;MAChB;IACF,CAAA;AAEA,WAAOR;EACT,GAAG;IAACP;IAAMC;GAAM;AAEhBkB,EAAAA,WAAU,MAAA;AACR,QAAIf,QAAQ;AAEV,UAAI,CAACG,SAASa,KAAK,CAACxB,SAASA,KAAKC,OAAOO,MAAAA,GAAS;AAChDC,kBAAUgB,MAAAA;MACZ;IACF;EACF,GAAG;IAACjB;IAAQG;GAAS;AAGrB,QAAMe,cAA2Bf,SAASgB,KAAK,CAACC,GAAGC,MAAAA;AACjD,QAAID,EAAEZ,QAAQ;AACZ,aAAO;IACT,WAAWa,EAAEb,QAAQ;AACnB,aAAO;IACT,WAAWY,EAAEX,QAAQC,oBAAoB;AACvC,aAAO;IACT,WAAWW,EAAEZ,QAAQC,oBAAoB;AACvC,aAAO;IACT,OAAO;AACL,aAAO;IACT;EACF,CAAA;AAGA,SACE,gBAAAY,OAAA,cAACC,gBAAAA;IACC5B;IACA6B,MAAMC;IACN1B;IACAR;IACAmC,OAAOR;IACPlB;IACA2B,iBAAiB7B;IACjB8B,gBAAgB3B;;AAGtB;;;ACpFA,SAAS4B,gBAAAA,qBAAoB;AAC7B,OAAOC,YAAW;AAElB,SAASC,aAAaC,iBAAAA,sBAAqB;AAC3C,SAASC,WAAW;AACpB,SAASC,MAAMC,uBAAuB;AACtC,SAASC,YAAYC,eAAe;AACpC,SACEC,QAAAA,OACAC,cAAAA,aAEAC,WAAWC,gBAEXC,mBACAC,kBAAAA,uBACK;AACP,SAASC,uCAAAA,sCAAqCC,MAAAA,WAAU;AAgBjD,IAAMC,UAAU,CAAC,EACtBC,YACAC,SACAC,cACAC,mBAAmB,MACnBC,QACAC,QAAO,MACM;AACb,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,KAAKC,EAAE;AACpC,QAAM,EAAEC,MAAK,IAAKC,YAAAA;AAClB,QAAMC,YAAYC,gBAAAA;AAClB,QAAMC,OAAOC,eAAcC,mBAAmBC,WAAW;AACzD,QAAMC,QAAQC,cAAaL,KAAKM,SAAS;AACzC,QAAMC,SAASF,cAAaL,KAAKQ,UAAU;AAC3C,QAAMC,aAAaJ,cAAaL,KAAKU,cAAc;AAGnD,QAAMC,OAAOC,QAAQhB,OAAOT,WAAW0B,IAAIC,OAAO3B,OAAAA,EAAS4B,SAAQ,CAAA;AACnE,QAAMC,UAAUC,WAAWrB,OAAOe,MAAMhB,EAAAA,EAAIuB,OAAO,CAACC,WAAWA,OAAOC,WAAWC,gBAAgB,SAAA;AAGjG,QAAMC,kBAAkBlB,MAAMmB,qBAAqBC;AACnD,QAAMC,iBACJ,OAAOC,UAAUC,iBAAiB,eAAeD,UAAUC,aAAaC,oBAAoBJ;AAG9F,SACE,gBAAAK,OAAA,cAACC,OAAAA;IAAIC,WAAWC,IAAG,gCAAgC3C,oBAAoB4C,oCAAAA;KACrE,gBAAAJ,OAAA,cAACK,eAAeC,MAAI;IAACjD,YAAY;MAAC;MAA4CA;;KAC5E,gBAAA2C,OAAA,cAACO,cAAAA;IACCC,QAAQjC,MAAMkC;IACdC,OAAO;MACLC,IAAI;QACFC,MAAM;QACNC,OAAOlD,EAAE,SAAA;QACTmD,SAAS,MAAM3C,KAAK4C,aAAY;QAChC1D,YAAY;MACd;MACA2D,KAAK;QACHJ,MAAM;QACNC,OAAOlD,EAAE,QAAA;QACTmD,SAAS,MAAM3C,KAAK8C,YAAW;QAC/B5D,YAAY;UAACqB,UAAU;;MACzB;IACF;MAEF,gBAAAsB,OAAA,cAACO,cAAAA;IACCC,QAAQjC,MAAM2C;IACdR,OAAO;MACLC,IAAI;QACFC,MAAM;QACNC,OAAOlD,EAAE,YAAA;QACTmD,SAAS,MAAM3C,KAAKgD,aAAY;MAClC;MACAH,KAAK;QACHJ,MAAM;QACNC,OAAOlD,EAAE,WAAA;QACTmD,SAAS,MAAM3C,KAAKiD,YAAW;MACjC;IACF;MAGA7D,iBAAiBoC,UACjB,gBAAAK,OAAA,cAACC,OAAAA;IAAIC,WAAU;KACb,gBAAAF,OAAA,cAACqB,OAAAA;IAAKT,MAAK;IAAqBU,MAAM;MACtC,gBAAAtB,OAAA,cAACC,OAAAA,MAAK1C,YAAAA,CAAAA,KAEJ,gBAAAyC,OAAA,cAACK,eAAekB,WAAS;IAACC,SAAQ;MAEvC9C,UACC,gBAAAsB,OAAA,cAAAA,OAAA,UAAA,MACE,gBAAAA,OAAA,cAACO,cAAAA;IACCkB,UAAU,CAAC7B;IACXY,QAAQf;IACRiB,OAAO;MACLC,IAAI;QACFC,MAAM;QACNC,OAAOlD,EAAE,iBAAA;QACTmD,SAAS,MAAM3C,KAAKuD,mBAAkB;MACxC;MACAV,KAAK;QACHJ,MAAM;QACNC,OAAOlD,EAAE,gBAAA;QACTmD,SAAS,MAAM3C,KAAKwD,kBAAiB;MACvC;IACF;MAIDxC,QACEE,OAAO,CAACC,WAAkCsC,KAAKC,SAASvC,MAAAA,CAAAA,EACxDwC,IAAI,CAACxC,WACJ,gBAAAU,OAAA,cAAC+B,aAAAA;IACCC,KAAK1C,OAAOxB;IACX,GAAGmE;IACJrB,MAAMtB,OAAOC,WAAWqB;IACxBC,OAAOqB,kBAAkB5C,OAAOC,WAAWsB,OAAOlD,CAAAA;IAClDN,YAAYiC,OAAOC,WAAWlC;IAC9ByD,SAAS,MAAMhC,QAAQ,KAAKb,UAAUqB,QAAQ;MAAE6C,QAAQrD;IAAK,CAAA;OAInE,gBAAAkB,OAAA,cAACO,cAAAA;IACCC,QAAQ5B;IACR8B,OAAO;MACLC,IAAI;QACFC,MAAM;QACNC,OAAOlD,EAAE,YAAA;QACTmD,SAAS,MAAM3C,KAAKiE,cAAc,KAAA;QAClC/E,YAAY;UAACqB,UAAU;;MACzB;MACAsC,KAAK;QACHJ,MAAM;QACNC,OAAOlD,EAAE,YAAA;QACTmD,SAAS,MAAM3C,KAAKiE,cAAc,IAAA;MACpC;IACF;OAIL1D,SACC,gBAAAsB,OAAA,cAAC+B,aAAAA;IAAWP,SAAQ;IAAcZ,MAAK;IAAuBC,OAAOlD,EAAE,YAAA;IAAemD,SAASpD;OAE/F,gBAAAsC,OAAA,cAAC+B,aAAAA;IAAWP,SAAQ;IAAUZ,MAAK;IAA8BC,OAAOlD,EAAE,WAAA;IAAcmD,SAASrD;;AAK3G;AAEAL,QAAQiF,cAAc;AAUtB,IAAMJ,qBAA+C;EACnDX,MAAM;EACNgB,UAAU;AACZ;AAEA,IAAM/B,eAAe,CAAC,EAAEC,QAAQE,MAAK,MACnC,gBAAAV,OAAA,cAAC+B,aAAAA;EACE,GAAGE;EACJ5E,YAAY;IAACmD,SAAUE,MAAMC,GAAGtD,cAAc,kBAAmBqD,MAAMM,IAAI3D;;EAC3EuD,MAAMJ,SAASE,MAAMC,GAAGC,OAAOF,MAAMM,IAAIJ;EACzCC,OAAOL,SAASE,MAAMC,GAAGE,QAAQH,MAAMM,IAAIH;EAC3CC,SAASN,SAASE,MAAMC,GAAGG,UAAUJ,MAAMM,IAAIF;;;;ARpKnD,IAAMyB,WAA8B,CAAC,EAAEC,SAAQ,MAAE;AAC/C,SAAO,gBAAAC,OAAA,cAACC,OAAAA;IAAIC,WAAU;KAA+CH,QAAAA;AACvE;AAEAD,SAASK,cAAc;AAQvB,IAAMC,YAAgC,MAAA;AACpC,QAAMC,OAAOC,eAAcC,mBAAmBC,WAAW;AACzD,QAAMC,oBAAoBC,cAAaL,KAAKM,qBAAqB;AAEjE,SAAO,gBAAAX,OAAA,cAACY,aAAAA;IAAYC,QAAQJ;;AAC9B;AAEAL,UAAUD,cAAc;AAUxB,IAAMW,WAA8B,CAAC,EAAEC,WAAU,MAAE;AACjD,QAAMC,QAAQC,aAAAA;AACd,QAAMZ,OAAOC,eAAcC,mBAAmBC,WAAW;AACzD,QAAMU,OAAOR,cAAaL,KAAKc,QAAQ;AACvC,QAAMC,QAAQV,cAAaL,KAAKgB,SAAS;AAEzC,SACE,gBAAArB,OAAA,cAACC,OAAAA;IAAIC,WAAU;KACb,gBAAAF,OAAA,cAACsB,iBAAAA;IAAgBJ;IAAYE;IAAcJ;IAAcD;;AAG/D;AAEAD,SAASX,cAAc;AAQvB,IAAMoB,cAAoC,CAACC,UAAAA;AACzC,SACE,gBAAAxB,OAAA,cAACC,OAAAA;IAAIC,WAAU;KACb,gBAAAF,OAAA,cAACyB,SAAAA;IAAQC,UAAAA;IAAU,GAAGF;;AAG5B;AAEAD,YAAYpB,cAAc;AAMnB,IAAMwB,OAAO;EAClBC,MAAM9B;EACN+B,MAAMf;EACNgB,OAAO1B;EACPqB,SAASF;AACX;;;ASxFA,SAASQ,mBAA0C;AACnD,OAAOC,WAASC,aAAAA,YAAWC,WAAAA,UAASC,YAAAA,iBAAgB;AAEpD,SAASC,mBAAmB;AAC5B,SAASC,UAAUC,aAAa;AAChC,SAASC,WAAW;AACpB,SAASC,cAAAA,aAAYC,OAA6BC,kBAAAA,uBAAsB;;AAOjE,IAAMC,iBAAiB,CAAC,EAAEC,MAAK,MAAuB;AAC3D,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,KAAKC,EAAE;AAEpC,QAAM,CAACC,MAAMC,OAAAA,IAAWC,UAAS,KAAA;AACjC,QAAMC,eAAe,MAAMF,QAAQ,CAACD,IAAAA;AACpC,QAAM,CAACI,oBAAoBC,qBAAAA,IAAyBH,UAAS,KAAA;AAC7D,QAAMI,6BAA6B,MAAMD,sBAAsB,CAACD,kBAAAA;AAEhE,QAAMG,gBAAgB,YAAA;AACpB,UAAMC,UAAUC,UAAUC,UAAUC,KAAKC,UAAU;MAAEC,OAAOlB,OAAOmB,MAAMD;MAAOE;IAAM,GAAG,MAAM,CAAA,CAAA;EACjG;AAEA,QAAM,CAACC,yBAAyBC,0BAAAA,IAA8Bf,UAAS,KAAA;AACvE,QAAMgB,gCAAgC,MAAMD,2BAA2B,CAACD,uBAAAA;AAExE,QAAMG,cAAcC,SAClB,MACE,IAAIC,YAAY;IACdC,kBAAkB;EACpB,CAAA,GACF,CAAA,CAAE;AAEJ,QAAM,CAACP,OAAOQ,QAAAA,IAAYrB,UAAAA;AAE1BsB,EAAAA,WAAU,MAAA;AACR,UAAMC,KAAK9B,OAAO+B,MAAMC,MAAMC,SAASC;AACvC,UAAMC,cAAc,CAACf,WAAAA;AACnBQ,eAASR,OAAMgB,IAAI;IACrB;AACA,QAAIC,QAAQ;AACZ,QAAIP,MAAMT,yBAAyB;AACjCG,kBAAYc,cAAc;QAAER;QAAIS,QAAQ;QAAGC,cAAc;MAAI,CAAA;AAC7DhB,kBAAYiB,GAAG,SAASN,WAAAA;AACxBE,cAAQ;IACV;AACA,WAAO,MAAA;AACL,UAAI;AACF,YAAIP,MAAMO,OAAO;AACfb,sBAAYkB,iBAAiB;YAAEZ;UAAG,CAAA;AAClCN,sBAAYmB,eAAe,SAASR,WAAAA;QACtC;MACF,SAASS,OAAO;AACdC,YAAID,MAAM,+BAA+B;UAAEA;UAAOd;UAAIS,QAAQ;UAAGC,cAAc;QAAI,GAAA;;;;;;MACrF;IACF;EACF,GAAG;IAACxC,OAAO+B,MAAMC,MAAMC,SAASC;IAAgBb;GAAwB;AAExE,QAAMyB,OAAOrB,SAAQ,MAAMsB,mBAAmB/C,KAAAA,GAAQ;IAACA,OAAOmB,KAAKD;IAAOlB,OAAO+B,MAAMiB;GAAkB;AAEzG,SACE,gBAAAC,QAAA,cAACC,OAAAA;IACC9C,IAAG;IACH+C,MAAK;IACL9C;IACA+C,UAAU5C;IACV6C,OAAOpD,EAAE,sBAAA;IACTqD,MAAM,gBAAAL,QAAA,cAACM,OAAAA;MAAIC,WAAU;OAA0B,KAAExD,OAAOmB,KAAKsC,SAAS,WAAW,UAAA;IACjFC,WAAW;KAEX,gBAAAT,QAAA,cAACM,OAAAA;IAAIC,WAAU;KACb,gBAAAP,QAAA,cAACM,OAAAA;IAAIC,WAAU;KACb,gBAAAP,QAAA,cAACU,MAAMC,MAAI,MACT,gBAAAX,QAAA,cAACU,MAAME,QAAM;IAACC,SAASzC;IAAyB0C,iBAAiBxC;MACjE,gBAAA0B,QAAA,cAACU,MAAMK,OAAK,MAAE/D,EAAE,yBAAA,CAAA,CAAA,CAAA,GAGpB,gBAAAgD,QAAA,cAACM,OAAAA;IAAIC,WAAU;KACb,gBAAAP,QAAA,cAACU,MAAMC,MAAI,MACT,gBAAAX,QAAA,cAACU,MAAME,QAAM;IAACC,SAASrD;IAAoBsD,iBAAiBpD;MAC5D,gBAAAsC,QAAA,cAACU,MAAMK,OAAK,MAAE/D,EAAE,0BAAA,CAAA,CAAA,CAAA,GAGpB,gBAAAgD,QAAA,cAACM,OAAAA;IAAIC,WAAU;KACb,gBAAAP,QAAA,cAACgB,aAAAA;IAAWd,MAAK;IAAoBe,OAAO;IAAYC,SAASvD;OAEnE,gBAAAqC,QAAA,cAACmB,OAAAA;IAAMtB;MACNzB,2BAA2B,gBAAA4B,QAAA,cAACoB,UAAAA;IAASjC,MAAM;MAAEhB;IAAM;MACnDX,sBAAsB,gBAAAwC,QAAA,cAACoB,UAAAA;IAASjC,MAAM;MAAEkC,SAAStE,OAAO+B,MAAMC,MAAMsC,QAAQC,IAAAA;IAAM;;AAI3F;AAEA,IAAMxB,qBAAqB,CAAC/C,UAAAA;AAC1B,MAAI,CAACA,SAAS,CAACA,MAAMmB,MAAMD,OAAO;AAChC,WAAO,CAAA;EACT;AAEA,QAAMsD,OAAOxE,MAAMmB,KAAKqD;AACxB,QAAMtD,QAAQlB,MAAMmB,KAAKD,MACtBuD,OAAO,CAACC,SAASA,KAAKtE,OAAOoE,KAAMpE,EAAE,EACrCuE,IAAI,CAACD,SAAAA;AACJ,UAAME,OAAO;MACXC,OACEH,KAAKI,QAAQD,SACb7E,MAAM+B,MAAMiB,kBAAkB0B,KAAKI,QAAQD,KAAAA,GAA4BE,IAAIC,aAAa;MAC1FC,OACEP,KAAKI,QAAQG,SACbjF,MAAM+B,MAAMmD,mBAAmBR,KAAKI,QAAQG,KAAAA,GAA4BF,IAAIC,aAAa;MAC3FG,aACET,KAAKI,QAAQK,eACbnF,MAAM+B,MAAMmD,mBAAmBR,KAAKI,QAAQK,WAAAA,GAAkCJ,IAAIC,aAAa;IACnG;AAEA,WAAO;MACL,GAAGN;MACHE;IACF;EACF,CAAA;AAEF,SAAO;IACL;MAAC;MAAS5E,MAAMmB,KAAKD,MAAMkE,UAAU;;IACrC;MACE,aAAaZ,MAAMa,QAAQC,YAAYd,KAAMpE,IAAI,CAAA;MACjDoE,MAAMM,QAAQD,SAAS7E,MAAM+B,MAAMwD,mBAAmB,eAAU;MAChEf,MAAMM,QAAQG,SAASjF,MAAM+B,MAAMyD,mBAAmB,eAAU;MAChEhB,MAAMM,QAAQW,qBACVjB,KAAKM,OAAOW,sBAAsBzF,MAAM+B,MAAM2D,yBAC5C,eACA,eACFC;;OAGHzE,MAAMyD,IAAI,CAACD,SAAS;MACrBA,KAAKW,QAAQC,YAAYZ,KAAKtE,IAAI,CAAA;MAClCsE,KAAKE,KAAKC,QAAQ,eAAU;MAC5BH,KAAKE,KAAKK,QAAQ,eAAU;MAC5BP,KAAKI,QAAQW,qBAAsBf,KAAKE,KAAKO,cAAc,eAAU,eAAWQ;KACjF;IACD;MAAC;MAAO3F,MAAM+B,MAAMC,MAAMC,SAASC,eAAe0D,sBAAsB;;;AAE5E;UAEiBC,OAAAA;QACFC,KAAK,CAACC,QAAiBA,KAAK,KAAK,KAAOC,QAAQ,CAAA;AAC/D,GAFiBH,SAAAA,OAAAA,CAAAA,EAAAA;AAQV,IAAMzB,QAAQ,CAAC,EAAEtB,KAAI,MAAc;AACxC,SACE,gBAAAG,QAAA,cAACM,OAAAA;IAAIC,WAAU;KACZV,KAAK6B,IAAI,CAAC,CAACsB,QAAQ/B,OAAOgC,OAAOC,IAAAA,GAAOC,MACvC,gBAAAnD,QAAA,cAACM,OAAAA;IAAI8C,KAAKD;IAAG5C,WAAU;KACrB,gBAAAP,QAAA,cAACM,OAAAA;IAAIC,WAAU;KAAOyC,MAAAA,GACtB,gBAAAhD,QAAA,cAACM,OAAAA;IAAIC,WAAU;KAAOU,KAAAA,GACtB,gBAAAjB,QAAA,cAACM,OAAAA;IAAIC,WAAU;KAAO0C,KAAAA,GACtB,gBAAAjD,QAAA,cAACM,OAAAA;IAAIC,WAAU;KAAO2C,IAAAA,CAAAA,CAAAA,CAAAA;AAKhC;;;;ACvKA,OAAOG,WAASC,mBAAAA,kBAAiBC,WAAAA,UAASC,UAAAA,SAAQC,YAAAA,iBAAgB;AAElE,SAASC,OAAAA,MAAKC,OAAAA,YAAW;AACzB,SAAqBC,kBAAkB;AACvC,SAASC,eAAAA,oBAAmB;AAC5B,SAASC,QAAAA,OAAMC,YAAkCC,mBAAAA,kBAAiBC,kBAAAA,uBAAsB;AACxF,SAASC,iBAAiB;AAC1B,SACEC,gBAEAC,UAAUC,iBAEVC,oBACK;AACP,SAASC,eAA4B;AACrC,SAASC,yBAAAA,wBAAuBC,yBAAAA,wBAAuBC,gBAAgB;AACvE,SAASC,MAAAA,WAAU;AACnB,SAASC,qBAAqB;;;ACjB9B,SAASC,gBAAgBC,gBAAgBC,0BAA0B;AAGnE,SAASC,YAAY;AACrB,SAASC,MAAAA,WAAU;AAKnB,IAAMC,SAASC,eAAeC,OAA0B;EACtDC,YAAY,OAAO;IAAEC,OAAO;EAAE;EAC9BC,OAAO,CAACC,QAAQC,UAAAA;AACdA,UAAMH;AACN,QAAIE,OAAOE,SAAQ,GAAI;AACrB,aAAO;IACT;AACA,QAAID,MAAMH,UAAU,KAAKE,OAAOG,MAAM,UAAA,GAAa;AACjD,aAAO;IACT;AACAH,WAAOI,KAAI;AACX,WAAO;EACT;AACF,CAAA;AAEA,IAAMC,SAASC,eAAeV,OAAO;EACnC;IACEW,KAAKC,KAAKC;IACVC,OAAOC,IAAG,iDAAA;EACZ;CACD;AAEM,IAAMC,UAAqB;EAAClB;EAAQmB,mBAAmBR,MAAAA;;;;AC/B9D,SAASS,kBAAkB;AAC3B,OAAOC,WAASC,cAAAA,aAAYC,eAAAA,cAAaC,aAAAA,YAAWC,UAAAA,SAAQC,YAAAA,iBAAgB;AAE5E,SAASC,eAAe;AACxB,SAAmBC,WAAW;AAC9B,SAASC,iBAAiB;AAC1B,SAASC,iBAAiB;AAE1B,SAAwBC,mBAAmB;AAC3C,SAASC,cAAAA,aAAYC,iBAAiBC,iBAAiBC,kBAAAA,uBAAsB;AAC7E,SAASC,qBAAqB;AAC9B,SAASC,YAAY;AACrB,SAASC,gBAAgBC,mBAAmB;AAE5C,SAASC,uBAAuBC,6BAA6B;AAC7D,SAASC,sBAAsBC,mBAAmBC,gCAAgCC,MAAAA,WAAU;AAQrF,IAAMC,wBAAwB;AAC9B,IAAMC,mBAAmB;AAUzB,IAAMC,mBAAmB,CAAC,EAC/BC,SAASC,cACTC,SACAC,WAAW,OACXC,UACAC,iBAAgB,MACM;AACtB,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,KAAKC,EAAE;AACpC,QAAM,CAACT,SAASU,aAAAA,IAAiBC,UAAUV,YAAAA;AAC3C,QAAMW,WAAWC,YAAAA;AACjB,QAAM,CAACC,SAASC,UAAAA,IAAcC,UAAS,KAAA;AAEvC,QAAMC,iBAAiBjB,SAASkB,OAAOC,UAAU,CAACC,UAAUA,MAAMC,SAAS,MAAA,KAAW;AAEtF,QAAMC,aAAaC,aAAY,MAAMR,WAAW,CAACD,aAAY,CAACA,QAAAA,GAAU,CAAA,CAAE;AAC1E,QAAMU,eAAeD,aAAY,MAAMvB,WAAWI,WAAWJ,QAAQS,EAAE,GAAG;IAACT;IAASI;GAAS;AAC7F,QAAMqB,uBAAuBF,aAC3B,MAAMvB,WAAWK,mBAAmBL,QAAQS,EAAE,GAC9C;IAACT;IAASK;GAAiB;AAE7B,QAAMqB,wBAAwBH,aAC5B,CAACI,YAAAA;AACCjB,kBAAc,CAACkB,MAAAA;AACb,YAAMC,cAAcD,EAAEV,OAAOD,cAAAA;AAC7B,UAAIY,eAAeA,YAAYR,SAAS,QAAQ;AAC9CQ,oBAAYC,OAAOH;MACrB;IACF,CAAA;EACF,GACA;IAACjB;IAAeO;GAAe;AAGjC,QAAMc,YACJ/B,WAAWiB,mBAAmB,KAAMjB,QAAQkB,OAAOD,cAAAA,IAAwCe;AAC7FC,qBAAmBjC,SAAS+B,WAAW,CAAC,CAACjB,OAAAA;AAEzC,MAAI,CAACd,SAAS;AACZ,WAAO;EACT;AAEA,QAAMkC,iBAAiBhC,QAAQiC,KAC7B,CAACC,WACEpC,QAAQqC,OAAOC,eAAeF,OAAOxB,SAAS2B,QAAQvC,QAAQqC,OAAOC,eACrEtC,QAAQqC,OAAOG,eAAeC,UAAUC,OAAON,OAAOxB,SAAS4B,aAAaxC,QAAQqC,OAAOG,WAAW,CAAA,GACxG5B;AACH,QAAM+B,kBAAkBC,mBAAmB5C,QAAQS,IAAIyB,cAAAA;AACvD,QAAMW,eAAejC,UAAU2B,QAAQI,gBAAgBG;AACvD,QAAMC,gBAAgB/C,QAAQkB,OAAOiB,KAAK,CAACf,UAAUA,MAAMC,SAAS,UAAA;AACpE,QAAM2B,aAAahD,QAAQkB,OAAO+B,OAAO,CAAC7B,UAAUA,MAAMC,SAAS,WAAA,EAAa6B,IAAI,CAAC9B,UAAUA,MAAM+B,SAAS;AAE9G,SACE,gBAAAC,QAAA,cAACC,aAAAA;IAAa,GAAGV;IAAiBW,YAAY;MAACC;MAAmBC;;KAChE,gBAAAJ,QAAA,cAACK,gBAAAA;IAAeC,YAAYf,gBAAgBe;IAAYC,WAAWhB,gBAAgBgB;KACjF,gBAAAP,QAAA,cAACQ,OAAAA;IAAIC,MAAK;IAAOC,WAAWjE;KACzBgD,gBAAgB1C,YACf,gBAAAiD,QAAA,cAACW,aAAAA;IACCC,eAAalD,UAAU,wBAAwB;IAC/CmD,SAAQ;IACRC,MAAMpD,UAAU,uBAAuB;IACvCqD,UAAAA;IACAC,OAAO9D,EAAEQ,UAAU,uBAAuB,oBAAA;IAC1CwC,YAAY;MAACxD;MAAkBuE;;IAC/BC,SAAShD;MAIZyB,iBAAiB1C,oBAChB,gBAAA+C,QAAA,cAACW,aAAAA;IACCC,eAAY;IACZC,SAAQ;IACRC,MAAK;IACLC,UAAAA;IACAC,OAAO9D,EAAE,uBAAA;IACTgD,YAAY;MAACxD;MAAkBuE;;IAC/BC,SAAS7C;MAGZrB,YACC,gBAAAgD,QAAA,cAACW,aAAAA;IACCC,eAAY;IACZC,SAAQ;IACRC,MAAK;IACLC,UAAAA;IACAC,OAAO9D,EAAE,sBAAA;IACTgD,YAAY;MAACxD;MAAkBuE;;IAC/BC,SAAS9C;QAKhBO,aACC,gBAAAqB,QAAA,cAACmB,cAAAA;IAAanD,OAAOW;IAAWyC,UAAU3B;IAAc/B;IAAkB2D,QAAQ/C;MAEnFqB,iBAAiB,gBAAAK,QAAA,cAACsB,eAAAA;IAActD,OAAO2B;MACvC4B,IAAIC,MAAMC,QAAQ7B,UAAAA,EAAYE,IAAI,CAACC,WAAW2B,UAC7C,gBAAA1B,QAAA,cAAC2B,aAAAA;IAAYC,KAAKF;IAAOG,MAAM9B;;AAIvC;AAEA,IAAM4B,cAAc,CAAC,EAAEE,KAAI,MAAyB;AAClD,SAAO,gBAAA7B,QAAA,cAAC8B,wBAAAA;IAAuBC,SAASF;;AAC1C;AAEA,IAAMV,eAAe,CAAC,EACpBnD,OACAoD,UACA1D,SACA2D,OAAM,MAOP;AACC,QAAM,EAAEW,UAAS,IAAKC,gBAAAA;AACtB,QAAMC,qBAAqBC,QAAOnE,MAAMU,IAAI;AAE5C,QAAM0D,uBAAuBjE,aAAY,CAACkE,aAAAA;AACxCH,uBAAmBI,UAAUD;EAC/B,GAAG,CAAA,CAAE;AAEL,QAAME,qBAAqBpE,aAAY,MAAA;AACrCkD,aAASa,mBAAmBI,OAAO;EACrC,GAAG;IAACjB;GAAO;AAEXmB,kBAAgB9E,SAAS,MAAM,OAAO6E,kBAAAA;AAEtC,QAAM,EAAEE,WAAWC,iBAAiBC,KAAI,IAAKC,cAC3C,OAAO;IACLC,cAAc7E,MAAMU;IACpBoE,YAAY;MACVC,sBAAsB;QAAEC,UAAU,CAAC5B,YAAY,CAAC1D;MAAQ,CAAA;MACxDuF,sBAAsB;QAAEjB;MAAU,CAAA;MAClCkB;MACAC,WAAWC,eAAeC,GAAG,CAACC,WAAAA;AAC5B,YAAIA,OAAOC,YAAY;AACrBnB,+BAAqBkB,OAAOE,MAAMC,IAAIC,SAAQ,CAAA;QAChD;MACF,CAAA;;EAEJ,IACA;IAAC1F,MAAMU;IAAMhB;IAAS0D;IAAUY;IAAWI;GAAqB;AAGlEuB,EAAAA,WAAU,MAAA;AACRjG,eAAWiF,MAAMiB,MAAAA;EACnB,GAAG;IAAClG;IAASiF;GAAK;AAElB,SAAO,gBAAA3C,QAAA,cAACQ,OAAAA;IAAIC,MAAK;IAAOoD,KAAKpB;IAAW/B,WAAU;IAAS,GAAGgC;;AAChE;AAEA,IAAMpB,gBAAgB,CAAC,EAAEtD,MAAK,MAAoC;AAChE,SACE,gBAAAgC,QAAA,cAACQ,OAAAA;IAAIC,MAAK;IAAOC,WAAU;KACxB1C,MAAMU,IAAI;AAGjB;AAEA,IAAMoD,yBAAyBgC,gBAAAA,YAAqD,CAAC,EAAE/B,QAAO,GAAIgC,iBAAAA;AAEhG,MAAIC,QAASjC,QAAgBkC,QAASlC,QAAgBiC,SAAUjC,QAAgBmC,QAAQ;AACxF,MAAI,OAAOF,UAAU,UAAU;AAC7BA,YAAQA,OAAOG,WAAW;EAC5B;AAEA,SACE,gBAAAnE,QAAA,cAACoE,KAAKC,MAAI;IACR3D,WAAW4D,IAAG,8BAA8BnE,mBAAmBC,8BAAAA;IAC/DyD,KAAKE;KAEL,gBAAA/D,QAAA,cAACuE,SAAAA;IAAQ9D,MAAK;IAAe+D,OAAO;IAAGC,MAAM;MAAE1C;IAAQ;IAAG2C,UAAUV;;AAG1E,CAAA;;;AFpKO,IAAMW,gBAAgB,CAAC,EAC5BC,YACAC,OACAC,QACAC,SACAC,SACAC,iBAAgB,MACG;AACnB,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,KAAKC,EAAE;AACpC,QAAMA,KAAKC,KAAIC,OAAOT,MAAAA,EAAQU,SAAQ;AACtC,QAAMC,WAAWC,aAAAA;AACjB,QAAMC,UAAUC,WAAWf,OAAOQ,EAAAA;AAClC,QAAMQ,WAAWC,UAAUjB,OAAOQ,EAAAA;AAElC,QAAM,CAACU,QAAQC,SAAAA,IAAaC,UAAS,CAAA;AACrC,QAAMC,iBAAiB,MAAMF,UAAU,CAACG,UAAUA,QAAQ,CAAA;AAC1D,QAAM,CAACC,WAAWC,YAAAA,IAAgBJ,UAAShB,gBAAAA;AAC3C,QAAMqB,kBAAkBC,QAA8B,IAAA;AACtD,QAAM,EAAEC,UAAS,IAAKC,iBAAAA;AAEtB,QAAMC,kBAAkBC,mBAAmBtB,IAAII,QAAAA;AAC/C,QAAMmB,aAAaL,QAAO,EAAA;AAC1B,QAAMM,aAAaC,SACjB,MAAM;IACJC,uBAAsB;MAAEC,aAAa9B,EAAE,qBAAA;IAAuB,CAAA;IAC9D+B,uBAAsB;MAAET;IAAU,CAAA;IAClCU,SAAS;MAAEC,UAAU,CAAC,EAAEC,KAAI,MAAQR,WAAW5B,UAAUoC;IAAM,CAAA;IAC/DC;KAEF;IAACb;IAAWT;GAAO;AAOrB,QAAMuB,cAAc,CAACC,aACnBC,WAAW,MAAMlB,gBAAgBtB,SAASyC,eAAe;IAAEF;IAAUG,OAAO;EAAM,CAAA,GAAI,EAAA;AAExFC,EAAAA,iBAAgB,MAAA;AACdL,gBAAY,SAAA;EACd,GAAG,CAAA,CAAE;AAGL,QAAMM,eAA8C,MAAA;AAClD,QAAI,CAAChB,WAAW5B,SAAS6C,QAAQ;AAC/B,aAAO;IACT;AAEAvC,IAAAA,KAAIwC,OAAOhD,QAAQ,CAACI,OAAAA;AAClBA,MAAAA,GAAE6C,SAASC,KACTC,KAAIC,KACF5C,KAAI4C,KAAKC,QAAQA,SAAS;QACxBC,UAAS,oBAAIC,KAAAA,GAAOC,YAAW;QAC/BC,QAAQ;UAAEC,aAAa/C,SAASgD;QAAI;QACpCC,QAAQ;UAAC;YAAEC,MAAM;YAAQvB,MAAMR,WAAW5B;UAAQ;;QAClD4D,YAAY7D,UAAU;UAAEA,SAASkD,KAAIC,KAAKnD,OAAAA;QAAS,IAAI8D;MACzD,CAAA,CAAA,CAAA;IAGN,CAAA;AAEAjC,eAAW5B,UAAU;AACrBqB,iBAAa,IAAA;AACbiB,gBAAY,QAAA;AACZpB,mBAAAA;AACA,WAAO;EACT;AAEA,SACE,gBAAA4C,QAAA,cAACC,gBAAgBC,MAAI;IACnBhE;IACAK;IACAT,YAAY;MACV;MACA;MACAA;;KAGF,gBAAAkE,QAAA,cAACG,WAAWD,MAAI;IAACpE,YAAW;KAC1B,gBAAAkE,QAAA,cAACG,WAAWC,UAAQ;IAACtE,YAAW;KAC9B,gBAAAkE,QAAA,cAACK,OAAAA;IAAIC,MAAK;IAAOC,WAAWC,IAAGC,cAAc,gBAAA;KAC1CzE,OAAOiD,SACLyB,IAAI,CAACC,YAAYA,QAAQC,MAAM,EAC/BC,OAAOC,aAAAA,EACPJ,IAAI,CAACC,YACJ,gBAAAX,QAAA,cAACe,kBAAAA;IAAiBC,KAAKL,QAAQpE;IAAIoE;IAAkB9D;QAI3D,gBAAAmD,QAAA,cAACK,OAAAA;IAAIC,MAAK;IAAOC,WAAU;IAAgBU,KAAKzD;OAElD,gBAAAwC,QAAA,cAACG,WAAWe,WAAS,MACnB,gBAAAlB,QAAA,cAACG,WAAWgB,OAAK,IAAA,CAAA,CAAA,GAIrB,gBAAAnB,QAAA,cAACoB,gBAAAA;IAAerD;IAAwBT;IAAsB+D,QAAQvC;IAAe,GAAGlB;MACxF,gBAAAoC,QAAA,cAACC,gBAAgBqB,QAAM;IAACvE;KAAqBX,EAAE,kBAAA,CAAA,CAAA;AAGrD;AAEA,IAAA,wBAAeP;;;AGtJf,SAAS0F,MAAMC,gBAAAA,qBAAoB;AACnC,OAAOC,WAA2BC,eAAAA,cAAaC,aAAAA,YAAWC,WAAAA,UAASC,YAAAA,iBAAgB;AAEnF,SAAqCC,iBAAiBC,iBAAAA,sBAAqB;AAC3E,SAASC,eAAe;AACxB,SAASC,qBAAqB;AAC9B,SAASC,OAAAA,YAAW;AACpB,SAASC,OAAAA,YAAW;AACpB,SAASC,iBAAiB;AAC1B,SAASC,gBAAgB;AACzB,SAASC,eAAAA,oBAAmB;AAC5B,SAASC,mBAAmBC,SAAAA,QAAOC,kBAAAA,uBAAsB;AACzD,SAASC,cAAcC,oBAAoBC,wBAAwB;AACnE,SAASC,cAAcC,aAAaC,kBAAkBC,qBAAqBC,sBAAsB;AACjG,SAASC,sBAAsB;AAC/B,SAASC,aAAAA,kBAAiB;;AAqBnB,IAAMC,mBAAmB,CAAC,EAAEC,MAAMC,SAASC,SAASC,QAAQC,YAAYC,WAAU,MAAyB;AAChH,QAAMC,QAAQC,SAASL,OAAAA;AACvB,QAAMM,cAAcC,eAAcC,mBAAmBC,WAAW;AAChE,QAAMC,SAASC,cAAaL,YAAYM,UAAU;AAClD,QAAMC,gBAAgBF,cAAaL,YAAYQ,UAAU;AACzD,QAAMC,eAAef,UAAUgB,KAAIC,OAAOjB,OAAAA,EAASkB,SAAQ,IAAKC;AAChE,QAAMlB,SAASC,cAAca,gBAAgBK,cAAAA;AAC7C,QAAMC,WAAWC,aAAAA;AACjB,QAAMC,UAAU,CAAC,CAACF,UAAUG,SAASC;AACrC,QAAMC,YAAYC,eAAe,UAAA;AACjC,QAAMC,aAAaD,eAAe,WAAA;AAElC,QAAME,aAAaC,gBAAgBtB,mBAAmBuB,aAAa;AACnEC,EAAAA,WAAU,MAAA;AACR,UAAMC,MAAM,IAAIC,QAAAA,QAAAA;;;;AAChB5B,gBAAY6B,KAAKC,GAAGH,KAAK,CAAChC,YAAAA;AACxB4B,iBAAWQ,QAAQ,CAACC,cAAAA;AAClB,aAAKA,UAAUC,UAAUtC,OAAAA;MAC3B,CAAA;IACF,CAAA;AAEAK,gBAAYkC,iBAAiBJ,GAAGH,KAAK,CAACQ,UAAAA;AACpCZ,iBAAWQ,QAAQ,CAACC,cAAAA;AAClB,aAAKA,UAAUI,qBAAqBD,KAAAA;MACtC,CAAA;IACF,CAAA;AAEAnC,gBAAYqC,kBAAkBP,GAAGH,KAAK,CAACQ,UAAAA;AACrCZ,iBAAWQ,QAAQ,CAACC,cAAAA;AAClB,aAAKA,UAAUM,sBAAsBH,KAAAA;MACvC,CAAA;IACF,CAAA;AAEA,WAAO,MAAA;AACL,WAAKR,IAAIY,QAAO;IAClB;EACF,GAAG;IAACvC;IAAauB;GAAW;AAM5B,QAAMiB,aAAaC,aAAY,YAAA;AAC7B,QAAI,CAAC9C,UAAU,CAACD,SAAS;AACvB;IACF;AAEA,QAAIU,QAAQ;AACV,YAAMJ,YAAY0C,MAAK;IACzB;AAEA,QAAI;AACF,WAAKtB,UAAUuB,KAAI;AACnB3C,kBAAY4C,UAAUjD,MAAAA;AACtB,YAAMK,YAAY6C,KAAI;AACtB,YAAMC,QAAQC,IAAIxB,WAAWyB,IAAI,CAAChB,cAAcA,UAAUiB,SAAS;QAAEvD;QAASC;MAAO,CAAA,CAAA,CAAA;IACvF,SAASuD,KAAK;AAEZC,MAAAA,KAAIC,MAAMF,KAAAA,QAAAA;;;;;;IACZ;EACF,GAAG;IAAC3B;IAAY7B;IAASC;IAAQS;GAAO;AAKxC,QAAMiD,cAAcZ,aAAY,YAAA;AAC9B,QAAI;AACF,WAAKnB,WAAWqB,KAAI;IACtB,SAASO,KAAK;AAEZC,MAAAA,KAAIC,MAAMF,KAAAA,QAAAA;;;;;;IACZ,UAAA;AACE,WAAKlD,YAAYsD,aAAY;AAC7B,WAAKtD,YAAYuD,aAAY;AAC7B,WAAKvD,YAAYwD,mBAAkB;AACnC,WAAKxD,YAAY0C,MAAK;IACxB;EACF,GAAG;IAACnB;IAAY5B;GAAO;AAEvB,QAAM8D,WAAWrD,UAAUG,kBAAkBZ;AAE7C,SACE,gBAAA+D,QAAA,cAACC,WAAUC,SAAO;IAACC,YAAYJ,YAAY;IAAWK,SAAS,CAACL;KAC7DA,YAAY,CAACxC,WAAW,gBAAAyC,QAAA,cAACK,oBAAAA,IAAAA,GACzBN,YAAYxC,WACX,gBAAAyC,QAAA,cAACM,KAAKC,MAAI,MACR,gBAAAP,QAAA,cAACM,KAAKE,MAAI;IAACrE;MACX,gBAAA6D,QAAA,cAACM,KAAKG,SAAO;IAACzE;IAAkBuC,SAASoB;OAG5C,CAACI,YAAY/D,WAAWA,QAAQ0E,cAAcC,UAAUvE,SACvD,gBAAA4D,QAAA,cAAAA,QAAA,UAAA,MACE,gBAAAA,QAAA,cAACY,gBAAAA;IAAe7D;IAA4BjB;IAAY+E,YAAY/B;MACpE,gBAAAkB,QAAA,cAACc,uBAAAA;IAAc1E;IAAc2E,QAAQ/E,QAAQ0E,cAAcC;IAAQR,YAAW;;AAKxF;AAIA,IAAMa,qBAAqB,MAAA;AACzB,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,KAAKC,EAAE;AACpC,QAAMC,SAASC,UAAAA;AACf,QAAM,CAACC,aAAaC,cAAAA,IAAkBC,UAAS,EAAA;AAC/C,QAAMC,eAAeC,aAAY,CAACC,UAAyCJ,eAAeI,MAAMC,OAAOC,KAAK,GAAG,CAAA,CAAE;AACjH,QAAMC,aAAaJ,aAAY,MAAMN,OAAOW,KAAKC,cAAc;IAAEV;EAAY,CAAA,GAAI;IAACF;IAAQE;GAAY;AAEtG,SACE,gBAAAW,QAAA,cAACC,cAAAA;IAAaC,YAAW;KACvB,gBAAAF,QAAA,cAACG,kBAAAA;IAAiBC,OAAOrB,EAAE,oBAAA;IAAuBsB,aAAatB,EAAE,0BAAA;KAC/D,gBAAAiB,QAAA,cAACM,OAAMC,WAAS;IACdX,OAAOP;IACPmB,UAAUhB;IACViB,aAAa1B,EAAE,gCAAA;IACfmB,YAAW;OAGf,gBAAAF,QAAA,cAACU,oBAAAA;IAAmBC,UAAU,CAACtB;IAAauB,SAASf;KAClDd,EAAE,wBAAA,CAAA,CAAA;AAIX;AAEA,IAAM8B,2BAA2B,CAACC,eAAAA;AAChC,QAAMC,UAAUC,SACd,MACEC,KAAKC,KAAK,MAAA;AACR,WAAO;MACLC,OAAO;QACLC,oBAAoB,QAAQ;UAC1BC,OAAO;YAAC;YAAyB;cAAEC,IAAIrC,KAAKC;YAAG;;QACjD,CAAA;QACAqC,iBAAiB,cAAc,MAAMT,aAAAA,GAAgB;UACnDO,OAAO;YAAC;YAA0B;cAAEC,IAAIrC,KAAKC;YAAG;;UAChDsC,MAAM;UACNC,MAAM;QACR,CAAA;;MAEFC,OAAO;QAAC;UAAEC,QAAQ;UAAQhC,QAAQ;QAAa;;IACjD;EACF,CAAA,GACF,CAAA,CAAE;AAGJ,SAAOiC,eAAeb,OAAAA;AACxB;AAQA,IAAMc,iBAAiB,CAAC,EAAEC,cAAcC,MAAMjB,WAAU,MAAuB;AAC7E,QAAMkB,YAAYnB,yBAAyBC,UAAAA;AAE3C,SACE,gBAAAd,QAAA,cAACiC,mBAAAA;IAAkBC,WAAWH,SAAS,YAAY,eAAe;KAChE,gBAAA/B,QAAA,cAACmC,cAAAA;IAAc,GAAGH;IAAWF;KAC3B,gBAAA9B,QAAA,cAACoC,aAAAA;IAAYC,gBAAAA;;AAIrB;;;AC1MA,SAASC,gBAAAA,qBAAoB;AAC7B,OAAOC,aAAW;AAElB,SAASC,iBAAAA,sBAAqB;AAMvB,IAAMC,cAAc,MAAA;AACzB,QAAMC,OAAOC,eAAcC,mBAAmBC,WAAW;AACzD,QAAMC,SAASC,cAAaL,KAAKM,UAAU;AAC3C,SAAO,gBAAAC,QAAA,cAACC,kBAAAA;IAAiBC,SAASC;IAAWN;;AAC/C;;;ACbA,SAASO,gBAAAA,qBAAoB;AAC7B,OAAOC,WAASC,eAAAA,cAAaC,WAAAA,gBAAe;AAE5C,SAASC,cAAc;AACvB,SAASC,mBAAAA,kBAAiBC,iBAAAA,gBAAeC,2BAA2B;AACpE,SAASC,QAAQC,OAAAA,MAAKC,OAAOC,YAAAA,iBAAgB;AAC7C,SAASC,OAAAA,MAAKC,gBAAgB;AAC9B,SAASC,eAAAA,oBAAmB;AAC5B,SAASC,kBAAAA,wBAAsB;AAC/B,SAASC,mBAAmB;AAC5B,SAASC,cAAc;AACvB,SAASC,YAAY;AACrB,SAASC,YAAYC,cAAc;AACnC,SAASC,MAAAA,YAAU;;;ACbnB,OAAOC,WAASC,aAAAA,kBAAiB;AAEjC,SAASC,OAAAA,MAAKC,YAAAA,iBAAgB;AAC9B,SAASC,SAASC,QAAAA,OAAMC,OAAOC,kBAAAA,uBAAsB;;;ACHrD,OAAOC,WAASC,eAAAA,cAAaC,WAAAA,UAASC,UAAAA,SAAQC,YAAAA,iBAAgB;AAE9D,SAASC,OAAAA,MAAKC,gBAAgB;AAC9B,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,YAAAA,WAAUC,cAAAA,mBAAkB;AACrC,SAASC,eAAAA,oBAAmB;AAC5B,SAASC,cAAAA,aAAYC,KAAKC,SAASC,mBAAAA,kBAAiBC,kBAAAA,uBAAsB;AAC1E,SACEC,kBAAAA,iBAEAC,UAAUC,wBAEL;AAEP,SAASC,yBAAAA,wBAAuBC,yBAAAA,wBAAuBC,YAAAA,iBAAgB;AACvE,SAASC,wBAAAA,uBAAsBC,qBAAAA,oBAAmBC,kCAAAA,iCAAgCC,MAAAA,WAAU;AAmBrF,IAAMC,0BAA0B,CAAC,EACtCC,QACAC,SACAC,UACAC,WACAC,WACAC,iBACAC,gBACAC,iBAAgB,MACa;AAC7B,QAAM,EAAEC,UAAS,IAAKC,iBAAAA;AACtB,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,KAAKC,EAAE;AACpC,QAAMC,WAAWC,aAAAA;AACjB,QAAMC,QAAQC,UAASjB,MAAAA;AACvB,QAAMkB,UAAUC,YAAWH,OAAOH,EAAAA;AAClC,QAAMO,WAAW,CAACpB,OAAOA;AACzB,QAAMqB,SAASC,SAASC,UAAUvB,MAAAA;AAClC,QAAM,CAACwB,QAAAA,IAAYC,WAAUJ,QAAQ,UAAA;AACrC,QAAMK,WAAWC,UAAUX,OAAOY,KAAIC,OAAOR,MAAAA,EAAQS,SAAQ,CAAA;AAC7D,QAAMC,kBAAkBC,QAA8B,IAAA;AAEtD,QAAMC,kBAAkBC,mBAAmBN,KAAIC,OAAOR,MAAAA,EAAQS,SAAQ,GAAIhB,QAAAA;AAG1E,QAAM,CAACqB,OAAOC,QAAAA,IAAYC,UAAS,CAAC,CAAA;AACpC,QAAMC,aAAaN,QAAO,EAAA;AAC1B,QAAMO,aAAaC,SACjB,MAAM;IACJC,uBAAsB;MAAEC,aAAahC,EAAE,qBAAA;IAAuB,CAAA;IAC9DiC,uBAAsB;MAAEnC;IAAU,CAAA;IAClCoC,UAAS;MAAEC,UAAU,CAAC,EAAEC,KAAI,MAAQR,WAAWrC,UAAU6C;IAAM,CAAA;IAC/DC;KAEF;IAACZ;GAAM;AAIT,QAAMa,cAAc,CAACC,aACnBC,WAAW,MAAMnB,gBAAgB9B,SAASkD,eAAe;IAAEF;IAAUG,OAAO;EAAM,CAAA,GAAI,EAAA;AAExF,QAAMC,eAAeC,aAAY,MAAMpD,WAAWF,MAAAA,GAAS;IAACE;IAAUF;GAAO;AAC7E,QAAMuD,gBAAgBD,aAAY,MAAMlD,YAAYJ,MAAAA,GAAS;IAACI;IAAWJ;GAAO;AAChF,QAAMwD,sBAAsBF,aAAY,CAACzC,OAAeR,kBAAkBL,QAAQa,EAAAA,GAAK;IAACR;IAAiBL;GAAO;AAChH,QAAMyD,qBAAqBH,aAAY,MAAMhD,iBAAiBN,MAAAA,GAAS;IAACM;IAAgBN;GAAO;AAC/F,QAAM0D,uBAAuBJ,aAAY,CAACzC,OAAeN,mBAAmBP,QAAQa,EAAAA,GAAK;IAACN;IAAkBP;GAAO;AAEnH,QAAM2D,gBAA+CL,aAAY,MAAA;AAC/D,QAAI,CAAChB,WAAWrC,SAAS;AACvB,aAAO;IACT;AAEAE,gBAAYH,QAAQsC,WAAWrC,OAAO;AACtCqC,eAAWrC,UAAU;AACrB+C,gBAAY,SAAA;AACZZ,aAAS,CAAC,CAAA;AAEV,WAAO;EACT,GAAG;IAACpC;IAAQc;GAAS;AAErB,SACE,gBAAA8C,QAAA,cAACC,iBAAgBC,MAAI;IACnBjD,IAAIe,KAAIC,OAAOR,MAAAA,EAAQS,SAAQ;IAC/BiC,YAAW;IACX9D;IACA+D,gBAAgBX;IAChBY,gBAAgBZ;KAEhB,gBAAAO,QAAA,cAACM,OAAAA;IACCC,MAAK;IACLC,WAAWC,IACT,gEACAC,oBACAC,+BAAAA;KAGDnD,WACC,gBAAAwC,QAAA,cAACY,QAAQC,SAAO;IAACC,SAAAA;IAAQC,SAASjE,EAAE,uBAAA;IAA0BkE,MAAK;KACjE,gBAAAhB,QAAA,cAACC,iBAAgBgB,QAAM;IAACzD,UAAAA;KAAUC,OAAOyD,IAAI,CAAA,IAG/C,gBAAAlB,QAAA,cAACC,iBAAgBgB,QAAM,MAAExD,OAAOyD,IAAI,GAEtC,gBAAAlB,QAAA,cAACM,OAAAA;IAAIC,MAAK;IAAOC,WAAWW;KACzB1D,OAAO2D,WAAW,YAAY,gBAAApB,QAAA,cAACqB,KAAAA;IAAIC,SAAQ;KAAWxE,EAAE,cAAA,CAAA,GACxDN,aAAa,EAAEiB,QAAQ2D,WAAW,aACjC,gBAAApB,QAAA,cAACuB,aAAAA;IACCC,eAAY;IACZC,SAAQ;IACRC,MAAMjE,QAAQ2D,WAAW,aAAa,oBAAoB;IAC1DO,UAAAA;IACAC,OAAO9E,EAAE,sBAAA;IACTqD,YAAY;MAAC0B;MAAkBpE,QAAQ2D,WAAW,cAAcU;;IAChEC,SAASpC;MAGZjD,kBACC,gBAAAsD,QAAA,cAACuB,aAAAA;IACCC,eAAY;IACZC,SAAQ;IACRC,MAAK;IACLC,UAAAA;IACAC,OAAO9E,EAAE,qBAAA;IACTqD,YAAY;MAAC0B;MAAkBC;;IAC/BC,SAASlC;QAMhBjC,UAAUoE,IAAI,CAACC,QACd,gBAAAjC,QAAA,cAACkC,kBAAAA;IACCC,KAAKF,IAAIG,IAAIlE,SAAQ;IACrBmE,UAAAA;IACAC,SAASL;IACT3E;IACAiF,UAAU3C;IACVjD,kBAAkBmD;OAUtB,gBAAAE,QAAA,cAACwC,iBAAAA;IAAe7D;IAAwB8D,QAAQ1C;IAAgB,GAAG1B;MAEnE,gBAAA2B,QAAA,cAACC,iBAAgByC,QAAM;IAAC5E;KAAqBhB,EAAE,kBAAA,CAAA,GAG/C,gBAAAkD,QAAA,cAACM,OAAAA;IAAIC,MAAK;IAAOC,WAAU;IAAgByB,KAAK9D;;AAGtD;;;ADrJO,IAAMwE,oBAAoB,CAAC,EAAEC,SAASC,WAAWC,qBAAqB,GAAGC,MAAAA,MAA+B;AAC7G,QAAM,EAAEC,EAAC,IAAKC,gBAAeC,KAAKC,EAAE;AAGpC,QAAMC,kBAAkBN,sBACpBF,QAAQS,OAAO,CAACC,WAAW,CAAC,CAACC,UAASC,UAAUF,MAAAA,CAAAA,IAChDV,QAAQS,OAAO,CAACC,WAAAA;AACd,UAAMG,SAASF,UAASC,UAAUF,MAAAA;AAClC,WAAOG,UAAUA,OAAOC,WAAW;EACrC,CAAA;AAEJC,EAAAA,WAAU,MAAA;AACR,QAAId,WAAW;AACbe,eAASC,eAAehB,SAAAA,GAAYiB,eAAe;QAAEC,UAAU;QAAUC,OAAO;MAAM,CAAA;IACxF;EACF,GAAG;IAACnB;GAAU;AAEd,MAAIO,gBAAgBa,WAAW,GAAG;AAChC,WACE,gBAAAC,QAAA,cAACC,OAAAA;MAAIC,MAAK;MAAOC,WAAU;OACzB,gBAAAH,QAAA,cAACI,QAAQC,MAAI,MACX,gBAAAL,QAAA,cAACI,QAAQE,OAAK,MACZ,gBAAAN,QAAA,cAACO,OACK;MACFzB;MACA0B,SAAS;MACTC,YAAY;QACVC,aAAa,gBAAAV,QAAA,cAACW,OAAAA;UAAKC,MAAK;UAAyBC,MAAM;UAAGC,YAAW;;MACvE;IACF,CAAA,CAAA,CAAA,CAAA;EAMZ;AAEA,SACE,gBAAAd,QAAA,cAACC,OAAAA,MACEf,gBAAgB6B,IAAI,CAAC3B,WAAAA;AACpB,UAAMG,SAASF,UAASC,UAAUF,MAAAA;AAClC,UAAM4B,WAAWC,KAAIC,OAAO3B,MAAAA,EAAQ4B,SAAQ;AAC5C,WAAO,gBAAAnB,QAAA,cAACoB,yBAAAA;MAAwBC,KAAKL;MAAU5B;MAAgBkC,SAAS3C,cAAcqC;MAAW,GAAGnC;;EACtG,CAAA,CAAA;AAGN;;;AEjEA,OAAO0C,aAAW;AAElB,SAASC,kBAAAA,uBAAsB;AAC/B,SAASC,mBAAmB;AAUrB,IAAMC,iBAAiB,CAAC,EAAEC,UAAUC,UAAS,MAAgC;AAClF,QAAM,EAAEC,GAAGC,GAAE,IAAKC,gBAAeC,KAAKC,EAAE;AACxC,SAAO,gBAAAC,QAAA,cAACC,aAAAA,IAAAA;AACV;;;AHGA,IAAMC,mBAA8B;EAAEC,qBAAqB;AAAM;AAE1D,IAAMC,kBAAkB,CAAC,EAAEC,QAAO,MAAoB;AAC3D,QAAM,EAAEC,EAAC,IAAKC,iBAAeC,KAAKC,EAAE;AACpC,QAAM,EAAEC,cAAa,IAAKC,oBAAAA;AAC1B,QAAMC,WAAWC,aAAAA;AACjB,QAAMC,YAAYC,KAAIC,OAAOX,OAAAA,EAASY,SAAQ;AAC9C,QAAMC,WAAWC,eAAcC,OAAOC,WAAWC,YAAY;AAE7D,QAAMC,YAAYJ,eAAcK,mBAAmBC,KAAK;AACxD,QAAMC,gBAAgBP,eAAcK,mBAAmBG,SAAS;AAChE,QAAMC,QAAQC,cAAaN,SAAAA;AAC3B,QAAMO,YAAYD,cAAaH,aAAAA;AAC/B,QAAMK,SAASH,MAAMG,OAAOjB,SAAAA;AAG5B,QAAMkB,YAAYC,SAAQ,MAAA;AACxB,QAAI,CAACH,UAAUhB,SAAAA,GAAY;AACzBI,eAASgB,IAAIR,eAAe;QAAE,GAAGI;QAAW,CAAChB,SAAAA,GAAY;UAAE,GAAGZ;QAAiB;MAAE,CAAA;AACjF,aAAOA;IACT;AACA,WAAO4B,UAAUhB,SAAAA;EACnB,GAAG;IAACgB;IAAWhB;IAAWI;IAAUQ;GAAc;AAClD,QAAM,EAAEvB,oBAAmB,IAAK6B;AAEhC,QAAMG,oBAAoBC,aACxB,CAACC,cAAAA;AACCnB,aAASgB,IAAIR,eAAe;MAC1B,GAAGR,SAASoB,IAAIZ,aAAAA;MAChB,CAACZ,SAAAA,GAAY;QAAE,GAAGI,SAASoB,IAAIZ,aAAAA,EAAeZ,SAAAA;QAAYX,qBAAqBkC,cAAc;MAAM;IACrG,CAAA;EACF,GACA;IAACnB;IAAUQ;IAAeZ;GAAU;AAGtC,QAAMyB,cAAcC,iBAAgBpB,OAAOC,WAAWoB,UAAU;AAChE,QAAMC,OAAOT,SACX,MAAMM,YAAYI,KAAK,CAAC,EAAEC,IAAG,MAAOA,QAAQ7B,KAAI8B,YAAYxC,OAAAA,CAAAA,GAAWqC,MACvE;IAACH;IAAalC;GAAQ;AAGxB,QAAMyC,KAAK/B,KAAIgC,YAAY1C,OAAAA;AAC3B,QAAM2C,oBAAoBC,SAASH,IAAII,MAAMC,OAAOC,OAAO3C,GAAGJ,QAAQI,EAAE,CAAA,EAAG4C,SAASC,WAAWA,UAAU,CAAA;AACzG,QAAMC,UAAUP,kBACbQ,SAAS,CAACC,GAAGC,MAAMhB,OAAOe,GAAGC,CAAAA,KAAM,CAAA,EACnCC,OAAO,CAACC,WAAW7C,KAAI8C,WAAWC,OAAOA,QAAQC,UAASC,UAAUJ,MAAAA,CAAAA,CAAAA,EACpEK,OAAOlC,UAAU,CAAA,CAAE;AAEtB,QAAMmC,WAAWC,YAAAA;AAEjB,QAAMC,eAAehC,aACnB,CAACwB,WAAAA;AACC,UAAMS,SAASN,UAASC,UAAUJ,MAAAA;AAClC,UAAMU,WAAWvD,KAAIC,OAAOqD,MAAAA,EAAQpD,SAAQ;AAE5C,QAAIW,MAAM2C,YAAYD,UAAU;AAC9BpD,eAASgB,IAAIX,WAAW;QAAE,GAAGL,SAASoB,IAAIf,SAAAA;QAAYgD,SAASD;MAAS,CAAA;AAKxE,WAAK5D,cAAcU,OAAOoD,gBAAgBC,gBAAgB;QACxDpE,SAASU,KAAIC,OAAOX,OAAAA,EAASY,SAAQ;QACrCyD,QAAQd,OAAOA;QACfe,KAAKL;MACP,CAAA;IACF;EACF,GACA;IAAC1C,MAAM2C;IAAS7D;IAAeL;IAASa;IAAUK;GAAU;AAG9D,QAAMqD,gBAAgBxC,aACpB,OAAOwB,QAA+BiB,SAAAA;AACpC,UAAMnE,cAAcoE,gBAAgBC,YAAY;MAC9CnB;MACAvD;MACA2E,QAAQ;QAAEC,aAAarE,UAAUsE;MAAI;MACrCL;IACF,CAAA;AAEA,UAAMR,SAASN,UAASC,UAAUJ,MAAAA;AAClC1C,aAASgB,IAAIX,WAAW;MAAE,GAAGL,SAASoB,IAAIf,SAAAA;MAAYgD,SAASxD,KAAIC,OAAOqD,MAAAA,EAAQpD,SAAQ;IAAG,CAAA;EAC/F,GACA;IAACP;IAAeE;IAAUP;IAASa;IAAUK;GAAU;AAGzD,QAAM4D,gBAAgB/C,aACpB,CAACwB,WACClD,cAAcoE,gBAAgBM,gBAAgB;IAC5Cf,QAAQN,UAASC,UAAUJ,MAAAA;EAC7B,CAAA,GACF;IAAClD;GAAc;AAGjB,QAAM2E,qBAAqBjD,aACzB,CAACwB,WAAkClD,cAAcoE,gBAAgBQ,QAAQ;IAAE1B;IAAQvD;EAAQ,CAAA,GAC3F;IAACK;IAAeL;GAAQ;AAG1B,QAAMkF,sBAAsBnD,aAC1B,CAACwB,QAA+B4B,cAC9B9E,cAAcoE,gBAAgBW,eAAe;IAC3C7B;IACAvD;IACAmF;EACF,CAAA,GACF;IAAC9E;IAAeL;GAAQ;AAG1B,QAAMqF,uBAAuBtD,aAC3B,OAAOwB,QAAQ4B,cAAAA;AACb,UAAMnB,SAASN,UAASC,UAAUJ,MAAAA;AAClC,UAAM+B,eAAetB,OAAOuB,SAASC,UAAUC,KAAIC,YAAYP,SAAAA,CAAAA;AAC/D,UAAMQ,UAAU3B,OAAOuB,SAASD,YAAAA,GAAeM;AAC/C,UAAMC,WAAWF,SAASG,OAAOxD,KAAK,CAACyD,UAAUA,MAAMC,SAAS,UAAA;AAChE,QAAI,CAACH,YAAY,CAACtC,OAAOA,QAAQ;AAC/B;IACF;AAEA,UAAMlD,cAAcU,OAAOkF,uBAAuBC,gBAAgB;MAChElG;MACAuD,QAAQA,OAAOA;MACfsC;IACF,CAAA;AACA,UAAMxF,cAAcoE,gBAAgBM,gBAAgB;MAAEf;IAAO,CAAA;EAC/D,GACA;IAAC3D;IAAeL;GAAQ;AAG1B,QAAMmG,WACJ,gBAAAC,QAAA,cAACC,mBAAAA;IACCnD;IACAoD,WAAWzC,SAAS0C,SAAS9F,SAAAA,IAAac,MAAM2C,UAAUsC;IAC1D1G;IACA2G,UAAU1C;IACV2C,WAAWnC;IACXoC,WAAW7B;IACX8B,iBAAiB1B;IACjB2B,gBAAgB7B;IAChB8B,kBAAkBzB;;AAItB,SACE,gBAAAe,QAAA,cAACW,OAAOC,MAAI;IAACC,SAAAA;KACX,gBAAAb,QAAA,cAACc,KAAKC,MAAI;IACRC,OAAOtH,sBAAsB,QAAQ;IACrCuH,aAAY;IACZC,YAAY;MACV;;IAEFC,eAAezF;KAGf,gBAAAsE,QAAA,cAACc,KAAKM,SAAO;IAACF,YAAYG,KAAG,qDAAA;KAC3B,gBAAArB,QAAA,cAACc,KAAKQ,KAAG;IAACN,OAAM;IAAaE,YAAW;KACrCrH,EAAE,uBAAA,CAAA,GAEL,gBAAAmG,QAAA,cAACc,KAAKQ,KAAG;IAACN,OAAM;IAAME,YAAW;KAC9BrH,EAAE,gBAAA,CAAA,CAAA,GAGP,gBAAAmG,QAAA,cAACuB,OAAAA;IAAIC,WAAU;KACb,gBAAAxB,QAAA,cAACc,KAAKW,UAAQ;IAACT,OAAM;KAAOtH,uBAAuBqG,QAAAA,GACnD,gBAAAC,QAAA,cAACc,KAAKW,UAAQ;IAACT,OAAM;KAAc,CAACtH,uBAAuBqG,QAAAA,CAAAA,CAAAA,CAAAA;AAKrE;",
|
|
6
|
+
"names": ["useAtomValue", "React", "useCapability", "React", "useEffect", "useRef", "AudioStream", "tracks", "mediaStreamRef", "useRef", "MediaStream", "ref", "useEffect", "audio", "current", "mediaStream", "srcObject", "resetSrcObject", "addEventListener", "play", "once", "autoPlay", "map", "track", "AudioTrack", "key", "id", "currentTrack", "addTrack", "removeTrack", "React", "forwardRef", "memo", "useEffect", "useRef", "mx", "VideoObject", "memo", "forwardRef", "videoStream", "classNames", "flip", "contain", "rest", "ref", "internalRef", "useRef", "useEffect", "video", "current", "srcObject", "setAttribute", "React", "className", "mx", "v", "displayName", "useAtomValue", "React", "memo", "useMemo", "useCapability", "React", "mx", "ResponsiveContainer", "children", "React", "div", "role", "className", "mx", "React", "useCallback", "useEffect", "useLayoutEffect", "useMemo", "useState", "useResizeDetector", "invariant", "mx", "ASPECT_RATIO", "MIN_GALLERY_HEIGHT", "DEFAULT_GAP", "maxImageSize", "defaultGetId", "item", "id", "ResponsiveGrid", "classNames", "Cell", "gap", "getId", "items", "pinned", "autoHideGallery", "debug", "onPinnedChange", "width", "containerWidth", "height", "containerHeight", "ref", "containerRef", "useResizeDetector", "refreshRate", "dividerHeight", "setDividerHeight", "useState", "useEffect", "fitAspectRatio", "Math", "min", "pinnedItem", "useMemo", "find", "mainItems", "filter", "hideGallery", "undefined", "time", "columns", "cellWidth", "setLayout", "gridContainerRef", "layout", "calculateLayout", "length", "Date", "now", "bounds", "setBounds", "useLayoutEffect", "current", "t", "setTimeout", "map", "invariant", "el", "querySelector", "getRelativeBounds", "clearTimeout", "handleClick", "useCallback", "React", "div", "className", "mx", "style", "SoloItem", "minHeight", "role", "display", "gridTemplateColumns", "key", "onClick", "ResponsiveContainer", "img", "alt", "container", "containerRect", "getBoundingClientRect", "elementRect", "top", "left", "count", "aspectRatio", "minWastedSpace", "Infinity", "bestColumns", "rows", "cols", "ceil", "itemWidth", "itemHeight", "fitItemsToGrid", "usedWidth", "usedHeight", "wastedSpace", "outerWidth", "outerHeight", "numCols", "numRows", "availableWidth", "availableHeight", "maxCellWidth", "maxCellHeight", "React", "useEffect", "useState", "Icon", "IconButton", "useTranslation", "Waveform", "groupHoverControlItemWithTransition", "mx", "ResponsiveGridItem", "children", "classNames", "item", "style", "name", "self", "pinned", "screenshare", "video", "mute", "wave", "speaking", "onClick", "t", "useTranslation", "meta", "id", "iconProps", "icon", "label", "props", "undefined", "speakingIndicator", "setSpeakingIndicator", "useState", "useEffect", "timeout", "setTimeout", "clearTimeout", "React", "div", "className", "mx", "IconButton", "groupHoverControlItemWithTransition", "iconOnly", "size", "Icon", "Waveform", "active", "SCREENSHARE_SUFFIX", "Participant", "memo", "item", "user", "debug", "props", "call", "useCapability", "ThreadCapabilities", "CallManager", "self", "useAtomValue", "selfAtom", "media", "mediaAtom", "isSelf", "id", "undefined", "startsWith", "isScreenshare", "endsWith", "pulledVideoStream", "useMemo", "trackName", "tracks", "screenshareEnabled", "screenshare", "videoEnabled", "video", "pulledVideoStreams", "stream", "videoStream", "screenshareVideoStream", "React", "ResponsiveGridItem", "name", "mute", "audioEnabled", "wave", "raisedHand", "speaking", "VideoObject", "flip", "contain", "classNames", "displayName", "React", "useEffect", "useMemo", "useState", "getId", "user", "id", "ParticipantGrid", "classNames", "self", "users", "fullscreen", "debug", "pinned", "setPinned", "useState", "allUsers", "useMemo", "forEach", "joined", "push", "isSelf", "tracks", "screenshareEnabled", "screenshare", "SCREENSHARE_SUFFIX", "video", "videoEnabled", "useEffect", "find", "undefined", "sortedUsers", "sort", "a", "b", "React", "ResponsiveGrid", "Cell", "Participant", "items", "autoHideGallery", "onPinnedChange", "useAtomValue", "React", "useAppGraph", "useCapability", "Obj", "Node", "useActionRunner", "useActions", "useNode", "Icon", "IconButton", "Toolbar", "NaturalToolbar", "toLocalizedString", "useTranslation", "groupHoverControlItemWithTransition", "mx", "Toolbar", "classNames", "channel", "participants", "autoHideControls", "onJoin", "onLeave", "t", "useTranslation", "meta", "id", "graph", "useAppGraph", "runAction", "useActionRunner", "call", "useCapability", "ThreadCapabilities", "CallManager", "media", "useAtomValue", "mediaAtom", "joined", "joinedAtom", "raisedHand", "raisedHandAtom", "node", "useNode", "Obj", "getDXN", "toString", "actions", "useActions", "filter", "action", "properties", "disposition", "isScreensharing", "screenshareTrack", "undefined", "canSharescreen", "navigator", "mediaDevices", "getDisplayMedia", "React", "div", "className", "mx", "groupHoverControlItemWithTransition", "NaturalToolbar", "Root", "ToggleButton", "active", "audioEnabled", "state", "on", "icon", "label", "onClick", "turnAudioOff", "off", "turnAudioOn", "videoEnabled", "turnVideoOff", "turnVideoOn", "Icon", "size", "Separator", "variant", "disabled", "turnScreenshareOff", "turnScreenshareOn", "Node", "isAction", "map", "IconButton", "key", "defaultButtonProps", "toLocalizedString", "parent", "setRaisedHand", "displayName", "iconOnly", "CallRoot", "children", "React", "div", "className", "displayName", "CallAudio", "call", "useCapability", "ThreadCapabilities", "CallManager", "audioTracksToPlay", "useAtomValue", "audioTracksToPlayAtom", "AudioStream", "tracks", "CallGrid", "fullscreen", "debug", "useDebugMode", "self", "selfAtom", "users", "usersAtom", "ParticipantGrid", "CallToolbar", "props", "Toolbar", "isInRoom", "Call", "Root", "Grid", "Audio", "WebRTCStats", "React", "useEffect", "useMemo", "useState", "truncateKey", "JsonView", "Panel", "log", "IconButton", "Input", "useTranslation", "CallDebugPanel", "state", "t", "useTranslation", "meta", "id", "open", "setOpen", "useState", "handleToggle", "showServiceHistory", "setShowServiceHistory", "handleToggleServiceHistory", "handleCopyRaw", "navigator", "clipboard", "writeText", "JSON", "stringify", "users", "call", "stats", "showDetailedWebRTCStats", "setShowDetailedWebRTCStats", "handleShowDetailedWebRTCStats", "webrtcStats", "useMemo", "WebRTCStats", "getStatsInterval", "setStats", "useEffect", "pc", "media", "peer", "session", "peerConnection", "handleStats", "data", "added", "addConnection", "peerId", "connectionId", "on", "removeConnection", "removeListener", "error", "log", "rows", "getCallStatusTable", "pulledAudioTracks", "React", "Panel", "icon", "onToggle", "title", "info", "div", "className", "joined", "maxHeight", "Input", "Root", "Switch", "checked", "onCheckedChange", "Label", "IconButton", "label", "onClick", "Table", "JsonView", "history", "get", "self", "filter", "user", "map", "isOk", "audio", "tracks", "ctx", "disposed", "video", "pulledVideoStreams", "screenshare", "length", "name", "truncateKey", "pushedAudioTrack", "pushedVideoTrack", "screenshareEnabled", "pushedScreenshareTrack", "undefined", "iceConnectionState", "Unit", "KB", "n", "toFixed", "prefix", "value", "unit", "i", "key", "React", "useLayoutEffect", "useMemo", "useRef", "useState", "Obj", "Ref", "useMembers", "useIdentity", "Icon", "ScrollArea", "useThemeContext", "useTranslation", "StackItem", "MessageTextbox", "Thread", "ThreadComponent", "threadLayout", "Message", "createBasicExtensions", "createThemeExtensions", "listener", "mx", "isNonNullable", "HighlightStyle", "StreamLanguage", "syntaxHighlighting", "tags", "mx", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "EditorView", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "Ref", "useObject", "PublicKey", "useIdentity", "IconButton", "useOnTransition", "useThemeContext", "useTranslation", "useTextEditor", "Card", "MessageHeading", "MessageRoot", "createBasicExtensions", "createThemeExtensions", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "buttonGroupClassNames", "buttonClassNames", "MessageContainer", "message", "messageOrRef", "members", "editable", "onDelete", "onAcceptProposal", "t", "useTranslation", "meta", "id", "updateMessage", "useObject", "identity", "useIdentity", "editing", "setEditing", "useState", "textBlockIndex", "blocks", "findIndex", "block", "_tag", "handleEdit", "useCallback", "handleDelete", "handleAcceptProposal", "handleTextBlockChange", "newText", "m", "targetBlock", "text", "textBlock", "undefined", "useOnEditAnalytics", "senderIdentity", "find", "member", "sender", "identityDid", "did", "identityKey", "PublicKey", "equals", "messageMetadata", "getMessageMetadata", "userIsAuthor", "authorId", "proposalBlock", "references", "filter", "map", "reference", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "div", "role", "className", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "hoverableControlItem", "onClick", "TextboxBlock", "isAuthor", "onSave", "ProposalBlock", "Ref", "Array", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readOnly", "createThemeExtensions", "command", "EditorView", "updateListener", "of", "update", "docChanged", "state", "doc", "toString", "useEffect", "focus", "ref", "forwardRef", "forwardedRef", "title", "name", "type", "content", "Card", "Root", "mx", "Surface", "limit", "data", "fallback", "ChatContainer", "classNames", "space", "thread", "context", "current", "autoFocusTextbox", "t", "useTranslation", "meta", "id", "Obj", "getDXN", "toString", "identity", "useIdentity", "members", "useMembers", "activity", "useStatus", "_count", "_setCount", "useState", "rerenderEditor", "count", "autoFocus", "setAutoFocus", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleCreate", "length", "change", "messages", "push", "Ref", "make", "Message", "created", "Date", "toISOString", "sender", "identityDid", "did", "blocks", "_tag", "properties", "undefined", "React", "ThreadComponent", "Root", "ScrollArea", "Viewport", "div", "role", "className", "mx", "threadLayout", "map", "message", "target", "filter", "isNonNullable", "MessageContainer", "key", "ref", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "Status", "Atom", "useAtomValue", "React", "useCallback", "useEffect", "useMemo", "useState", "useCapabilities", "useCapability", "Context", "failUndefined", "Obj", "log", "useClient", "getSpace", "useIdentity", "ElevationProvider", "Input", "useTranslation", "ControlGroup", "ControlGroupButton", "ControlItemInput", "MenuProvider", "ToolbarMenu", "createMenuAction", "createMenuItemGroup", "useMenuActions", "useSoundEffect", "StackItem", "ChannelContainer", "role", "subject", "channel", "roomId", "roomIdProp", "fullscreen", "space", "getSpace", "callManager", "useCapability", "ThreadCapabilities", "CallManager", "joined", "useAtomValue", "joinedAtom", "currentRoomId", "roomIdAtom", "attendableId", "Obj", "getDXN", "toString", "undefined", "failUndefined", "identity", "useIdentity", "isNamed", "profile", "displayName", "joinSound", "useSoundEffect", "leaveSound", "extensions", "useCapabilities", "CallExtension", "useEffect", "ctx", "Context", "left", "on", "forEach", "extension", "onLeave", "callStateUpdated", "state", "onCallStateUpdated", "mediaStateUpdated", "onMediaStateUpdated", "dispose", "handleJoin", "useCallback", "leave", "play", "setRoomId", "join", "Promise", "all", "map", "onJoin", "err", "log", "catch", "handleLeave", "turnAudioOff", "turnVideoOff", "turnScreenshareOff", "isJoined", "React", "StackItem", "Content", "classNames", "toolbar", "DisplayNameMissing", "Call", "Root", "Grid", "Toolbar", "defaultThread", "target", "ChannelToolbar", "onJoinCall", "ChatContainer", "thread", "DisplayNameMissing", "t", "useTranslation", "meta", "id", "client", "useClient", "displayName", "setDisplayName", "useState", "handleChange", "useCallback", "event", "target", "value", "handleSave", "halo", "updateProfile", "React", "ControlGroup", "classNames", "ControlItemInput", "title", "description", "Input", "TextInput", "onChange", "placeholder", "ControlGroupButton", "disabled", "onClick", "useChannelToolbarActions", "onJoinCall", "creator", "useMemo", "Atom", "make", "nodes", "createMenuItemGroup", "label", "ns", "createMenuAction", "icon", "type", "edges", "source", "useMenuActions", "ChannelToolbar", "attendableId", "role", "menuProps", "ElevationProvider", "elevation", "MenuProvider", "ToolbarMenu", "textBlockWidth", "useAtomValue", "React", "useCapability", "CallSidebar", "call", "useCapability", "ThreadCapabilities", "CallManager", "roomId", "useAtomValue", "roomIdAtom", "React", "ChannelContainer", "subject", "undefined", "useAtomValue", "React", "useCallback", "useMemo", "Common", "useCapabilities", "useCapability", "useOperationInvoker", "Filter", "Obj", "Query", "Relation", "Ref", "useQuery", "useIdentity", "useTranslation", "useAttended", "Layout", "Tabs", "AnchoredTo", "Thread", "mx", "React", "useEffect", "Obj", "Relation", "Callout", "Icon", "Trans", "useTranslation", "React", "useCallback", "useMemo", "useRef", "useState", "Obj", "Relation", "useObject", "getSpace", "useMembers", "useIdentity", "IconButton", "Tag", "Tooltip", "useThemeContext", "useTranslation", "MessageTextbox", "Thread", "ThreadComponent", "createBasicExtensions", "createThemeExtensions", "listener", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "CommentsThreadContainer", "anchor", "current", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "onAcceptProposal", "themeMode", "useThemeContext", "t", "useTranslation", "meta", "id", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "detached", "thread", "Relation", "getSource", "messages", "useObject", "activity", "useStatus", "Obj", "getDXN", "toString", "threadScrollRef", "useRef", "textboxMetadata", "getMessageMetadata", "state", "setState", "useState", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "handleThreadDelete", "handleAcceptProposal", "handleComment", "React", "ThreadComponent", "Root", "classNames", "onClickCapture", "onFocusCapture", "div", "role", "className", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Tooltip", "Trigger", "asChild", "content", "side", "Header", "name", "buttonGroupClassNames", "status", "Tag", "palette", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "buttonClassNames", "hoverableControlItem", "onClick", "map", "ref", "MessageContainer", "key", "dxn", "editable", "message", "onDelete", "MessageTextbox", "onSend", "Status", "CommentsContainer", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "meta", "id", "filteredAnchors", "filter", "anchor", "Relation", "getSource", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "React", "div", "role", "className", "Callout", "Root", "Title", "Trans", "i18nKey", "components", "commentIcon", "Icon", "icon", "size", "classNames", "map", "threadId", "Obj", "getDXN", "toString", "CommentsThreadContainer", "key", "current", "React", "useTranslation", "ControlPage", "ThreadSettings", "settings", "_settings", "t", "_t", "useTranslation", "meta", "id", "React", "ControlPage", "initialViewState", "showResolvedThreads", "ThreadCompanion", "subject", "t", "useTranslation", "meta", "id", "invokePromise", "useOperationInvoker", "identity", "useIdentity", "subjectId", "Obj", "getDXN", "toString", "registry", "useCapability", "Common", "Capability", "AtomRegistry", "stateAtom", "ThreadCapabilities", "State", "viewStoreAtom", "ViewState", "state", "useAtomValue", "viewStore", "drafts", "viewState", "useMemo", "set", "onChangeViewState", "useCallback", "nextValue", "get", "anchorSorts", "useCapabilities", "AnchorSort", "sort", "find", "key", "getTypename", "db", "getDatabase", "objectsAnchoredTo", "useQuery", "Query", "select", "Filter", "targetOf", "AnchoredTo", "anchors", "toSorted", "a", "b", "filter", "anchor", "instanceOf", "Thread", "Relation", "getSource", "concat", "attended", "useAttended", "handleAttend", "thread", "threadId", "current", "LayoutOperation", "ScrollIntoView", "cursor", "ref", "handleComment", "text", "ThreadOperation", "AddMessage", "sender", "identityDid", "did", "handleResolve", "ToggleResolved", "handleThreadDelete", "Delete", "handleMessageDelete", "messageId", "DeleteMessage", "handleAcceptProposal", "messageIndex", "messages", "findIndex", "Ref", "hasObjectId", "message", "target", "proposal", "blocks", "block", "_tag", "CollaborationOperation", "AcceptProposal", "comments", "React", "CommentsContainer", "currentId", "includes", "undefined", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "onAcceptProposal", "Layout", "Main", "toolbar", "Tabs", "Root", "value", "orientation", "classNames", "onValueChange", "Tablist", "mx", "Tab", "div", "className", "Tabpanel"]
|
|
7
|
+
}
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
__export
|
|
3
|
+
} from "./chunk-J5LGTIGS.mjs";
|
|
2
4
|
|
|
3
|
-
// src/
|
|
4
|
-
|
|
5
|
+
// src/blueprints/thread-blueprint.ts
|
|
6
|
+
var thread_blueprint_exports = {};
|
|
7
|
+
__export(thread_blueprint_exports, {
|
|
8
|
+
Key: () => Key,
|
|
9
|
+
functions: () => functions,
|
|
10
|
+
make: () => make
|
|
11
|
+
});
|
|
5
12
|
import { Blueprint, Template } from "@dxos/blueprints";
|
|
6
13
|
import { trim } from "@dxos/util";
|
|
7
14
|
|
|
@@ -12,8 +19,9 @@ import * as Function from "effect/Function";
|
|
|
12
19
|
import * as Schema from "effect/Schema";
|
|
13
20
|
import { ArtifactId, computeDiffsWithCursors } from "@dxos/assistant";
|
|
14
21
|
import { Obj, Ref, Relation } from "@dxos/echo";
|
|
22
|
+
import { Database } from "@dxos/echo";
|
|
15
23
|
import { createDocAccessor } from "@dxos/echo-db";
|
|
16
|
-
import {
|
|
24
|
+
import { defineFunction } from "@dxos/functions";
|
|
17
25
|
import { DXN } from "@dxos/keys";
|
|
18
26
|
import { Markdown } from "@dxos/plugin-markdown/types";
|
|
19
27
|
import { AnchoredTo, Message, Thread } from "@dxos/types";
|
|
@@ -29,7 +37,7 @@ var create_proposals_default = defineFunction({
|
|
|
29
37
|
}),
|
|
30
38
|
outputSchema: Schema.Void,
|
|
31
39
|
handler: Effect.fn(function* ({ data: { id, diffs: _diffs } }) {
|
|
32
|
-
const object = yield*
|
|
40
|
+
const object = yield* Database.Service.resolve(DXN.parse(id), Markdown.Document);
|
|
33
41
|
const content = yield* Effect.promise(() => object.content.load());
|
|
34
42
|
const accessor = createDocAccessor(content, [
|
|
35
43
|
"content"
|
|
@@ -59,43 +67,40 @@ var create_proposals_default = defineFunction({
|
|
|
59
67
|
[Relation.Target]: object,
|
|
60
68
|
anchor: cursor
|
|
61
69
|
});
|
|
62
|
-
yield*
|
|
63
|
-
yield*
|
|
70
|
+
yield* Database.Service.add(thread);
|
|
71
|
+
yield* Database.Service.add(relation);
|
|
64
72
|
})), Effect.allWith({
|
|
65
73
|
concurrency: "unbounded"
|
|
66
74
|
}));
|
|
67
75
|
})
|
|
68
76
|
});
|
|
69
77
|
|
|
70
|
-
// src/
|
|
78
|
+
// src/blueprints/thread-blueprint.ts
|
|
71
79
|
var functions = [
|
|
72
80
|
create_proposals_default
|
|
73
81
|
];
|
|
74
|
-
var
|
|
75
|
-
var
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}))
|
|
96
|
-
]);
|
|
82
|
+
var Key = "dxos.org/blueprint/thread";
|
|
83
|
+
var make = () => Blueprint.make({
|
|
84
|
+
key: Key,
|
|
85
|
+
name: "Thread",
|
|
86
|
+
tools: Blueprint.toolDefinitions({
|
|
87
|
+
functions
|
|
88
|
+
}),
|
|
89
|
+
instructions: Template.make({
|
|
90
|
+
// TODO(wittjosiah): Move example to function input schema annotation.
|
|
91
|
+
source: trim`
|
|
92
|
+
You can update markdown documents via proposals.
|
|
93
|
+
For each diff, respond with the smallest possible matching span.
|
|
94
|
+
For example:
|
|
95
|
+
- "There is a tyop in this sentence."
|
|
96
|
+
+ "There is a typo in this sentence."
|
|
97
|
+
- "This id goof."
|
|
98
|
+
+ "This is good."
|
|
99
|
+
`
|
|
100
|
+
})
|
|
101
|
+
});
|
|
102
|
+
|
|
97
103
|
export {
|
|
98
|
-
|
|
99
|
-
blueprint_definition_default as default
|
|
104
|
+
thread_blueprint_exports
|
|
100
105
|
};
|
|
101
|
-
//# sourceMappingURL=
|
|
106
|
+
//# sourceMappingURL=chunk-ZFLSTQSE.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/blueprints/thread-blueprint.ts", "../../../src/functions/create-proposals.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Blueprint, Template } from '@dxos/blueprints';\nimport { type FunctionDefinition } from '@dxos/functions';\nimport { trim } from '@dxos/util';\n\nimport { createProposals } from '../functions';\n\nexport const functions: FunctionDefinition[] = [createProposals];\n\nexport const Key = 'dxos.org/blueprint/thread';\n\nexport const make = () =>\n Blueprint.make({\n key: Key,\n name: 'Thread',\n tools: Blueprint.toolDefinitions({ functions }),\n instructions: Template.make({\n // TODO(wittjosiah): Move example to function input schema annotation.\n source: trim`\n You can update markdown documents via proposals.\n For each diff, respond with the smallest possible matching span.\n For example:\n - \"There is a tyop in this sentence.\"\n + \"There is a typo in this sentence.\"\n - \"This id goof.\"\n + \"This is good.\"\n `,\n }),\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Array from 'effect/Array';\nimport * as Effect from 'effect/Effect';\nimport * as Function from 'effect/Function';\nimport * as Schema from 'effect/Schema';\n\nimport { ArtifactId, computeDiffsWithCursors } from '@dxos/assistant';\nimport { Obj, Ref, Relation } from '@dxos/echo';\nimport { Database } from '@dxos/echo';\nimport { createDocAccessor } from '@dxos/echo-db';\nimport { defineFunction } from '@dxos/functions';\nimport { DXN } from '@dxos/keys';\nimport { Markdown } from '@dxos/plugin-markdown/types';\nimport { AnchoredTo, Message, Thread } from '@dxos/types';\n\nexport default defineFunction({\n key: 'dxos.org/function/thread/create-proposals',\n name: 'Create Proposals',\n description: 'Proposes a set of changes to a document.',\n inputSchema: Schema.Struct({\n id: ArtifactId,\n diffs: Schema.Array(Schema.String).annotations({\n description: 'The diffs to propose for the document.',\n }),\n }),\n outputSchema: Schema.Void,\n handler: Effect.fn(function* ({ data: { id, diffs: _diffs } }) {\n const object = yield* Database.Service.resolve(DXN.parse(id), Markdown.Document);\n const content = yield* Effect.promise(() => object.content.load());\n const accessor = createDocAccessor(content, ['content']);\n\n yield* Function.pipe(\n computeDiffsWithCursors(accessor, _diffs),\n Array.map(\n Effect.fnUntraced(function* ({ cursor, text }) {\n const proposal = Obj.make(Message.Message, {\n created: new Date().toISOString(),\n sender: { role: 'assistant' },\n blocks: [{ _tag: 'proposal', text }],\n });\n const thread = Thread.make({ name: 'Proposal', messages: [Ref.make(proposal)], status: 'active' });\n const relation = Relation.make(AnchoredTo.AnchoredTo, {\n [Relation.Source]: thread,\n [Relation.Target]: object,\n anchor: cursor,\n });\n yield* Database.Service.add(thread);\n yield* Database.Service.add(relation);\n }),\n ),\n Effect.allWith({ concurrency: 'unbounded' }),\n );\n }),\n});\n"],
|
|
5
|
+
"mappings": ";;;;;AAAA;;;;;;AAIA,SAASA,WAAWC,gBAAgB;AAEpC,SAASC,YAAY;;;ACFrB,YAAYC,WAAW;AACvB,YAAYC,YAAY;AACxB,YAAYC,cAAc;AAC1B,YAAYC,YAAY;AAExB,SAASC,YAAYC,+BAA+B;AACpD,SAASC,KAAKC,KAAKC,gBAAgB;AACnC,SAASC,gBAAgB;AACzB,SAASC,yBAAyB;AAClC,SAASC,sBAAsB;AAC/B,SAASC,WAAW;AACpB,SAASC,gBAAgB;AACzB,SAASC,YAAYC,SAASC,cAAc;AAE5C,IAAA,2BAAeC,eAAe;EAC5BC,KAAK;EACLC,MAAM;EACNC,aAAa;EACbC,aAAoBC,cAAO;IACzBC,IAAIC;IACJC,OAAcC,aAAaC,aAAM,EAAEC,YAAY;MAC7CR,aAAa;IACf,CAAA;EACF,CAAA;EACAS,cAAqBC;EACrBC,SAAgBC,UAAG,WAAW,EAAEC,MAAM,EAAEV,IAAIE,OAAOS,OAAM,EAAE,GAAE;AAC3D,UAAMC,SAAS,OAAOC,SAASC,QAAQC,QAAQC,IAAIC,MAAMjB,EAAAA,GAAKkB,SAASC,QAAQ;AAC/E,UAAMC,UAAU,OAAcC,eAAQ,MAAMT,OAAOQ,QAAQE,KAAI,CAAA;AAC/D,UAAMC,WAAWC,kBAAkBJ,SAAS;MAAC;KAAU;AAEvD,WAAgBK,cACdC,wBAAwBH,UAAUZ,MAAAA,GAC5BgB,UACGC,kBAAW,WAAW,EAAEC,QAAQC,KAAI,GAAE;AAC3C,YAAMC,WAAWC,IAAIC,KAAKC,QAAQA,SAAS;QACzCC,UAAS,oBAAIC,KAAAA,GAAOC,YAAW;QAC/BC,QAAQ;UAAEC,MAAM;QAAY;QAC5BC,QAAQ;UAAC;YAAEC,MAAM;YAAYX;UAAK;;MACpC,CAAA;AACA,YAAMY,SAASC,OAAOV,KAAK;QAAErC,MAAM;QAAYgD,UAAU;UAACC,IAAIZ,KAAKF,QAAAA;;QAAYe,QAAQ;MAAS,CAAA;AAChG,YAAMC,WAAWC,SAASf,KAAKgB,WAAWA,YAAY;QACpD,CAACD,SAASE,MAAM,GAAGR;QACnB,CAACM,SAASG,MAAM,GAAGvC;QACnBwC,QAAQvB;MACV,CAAA;AACA,aAAOhB,SAASC,QAAQuC,IAAIX,MAAAA;AAC5B,aAAO7B,SAASC,QAAQuC,IAAIN,QAAAA;IAC9B,CAAA,CAAA,GAEKO,eAAQ;MAAEC,aAAa;IAAY,CAAA,CAAA;EAE9C,CAAA;AACF,CAAA;;;AD9CO,IAAMC,YAAkC;EAACC;;AAEzC,IAAMC,MAAM;AAEZ,IAAMC,OAAO,MAClBC,UAAUD,KAAK;EACbE,KAAKH;EACLI,MAAM;EACNC,OAAOH,UAAUI,gBAAgB;IAAER;EAAU,CAAA;EAC7CS,cAAcC,SAASP,KAAK;;IAE1BQ,QAAQC;;;;;;;;;EASV,CAAA;AACF,CAAA;",
|
|
6
|
+
"names": ["Blueprint", "Template", "trim", "Array", "Effect", "Function", "Schema", "ArtifactId", "computeDiffsWithCursors", "Obj", "Ref", "Relation", "Database", "createDocAccessor", "defineFunction", "DXN", "Markdown", "AnchoredTo", "Message", "Thread", "defineFunction", "key", "name", "description", "inputSchema", "Struct", "id", "ArtifactId", "diffs", "Array", "String", "annotations", "outputSchema", "Void", "handler", "fn", "data", "_diffs", "object", "Database", "Service", "resolve", "DXN", "parse", "Markdown", "Document", "content", "promise", "load", "accessor", "createDocAccessor", "pipe", "computeDiffsWithCursors", "map", "fnUntraced", "cursor", "text", "proposal", "Obj", "make", "Message", "created", "Date", "toISOString", "sender", "role", "blocks", "_tag", "thread", "Thread", "messages", "Ref", "status", "relation", "Relation", "AnchoredTo", "Source", "Target", "anchor", "add", "allWith", "concurrency", "functions", "createProposals", "Key", "make", "Blueprint", "key", "name", "tools", "toolDefinitions", "instructions", "Template", "source", "trim"]
|
|
7
|
+
}
|