@dxos/plugin-thread 0.8.3 → 0.8.4-main.03d5cd7b56
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/neutral/CallDebugPanel-CXWTCS7A.mjs +172 -0
- package/dist/lib/neutral/CallDebugPanel-CXWTCS7A.mjs.map +7 -0
- package/dist/lib/neutral/CallSidebar-YVXU6BOQ.mjs +25 -0
- package/dist/lib/neutral/CallSidebar-YVXU6BOQ.mjs.map +7 -0
- package/dist/lib/neutral/ChannelChat-EKQYQQXZ.mjs +10 -0
- package/dist/lib/neutral/ChannelContainer-XXMX5X43.mjs +9 -0
- package/dist/lib/neutral/ThreadCompanion-YGA2ORTJ.mjs +208 -0
- package/dist/lib/neutral/ThreadCompanion-YGA2ORTJ.mjs.map +7 -0
- package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs +61 -0
- package/dist/lib/neutral/ThreadContainer-XYEPEOSD.mjs.map +7 -0
- package/dist/lib/neutral/ThreadPlugin.mjs +89 -0
- package/dist/lib/neutral/ThreadPlugin.mjs.map +7 -0
- package/dist/lib/neutral/ThreadPlugin.node.mjs +40 -0
- package/dist/lib/neutral/ThreadPlugin.node.mjs.map +7 -0
- package/dist/lib/neutral/ThreadSettings-5Z5XIHG3.mjs +15 -0
- package/dist/lib/neutral/ThreadSettings-5Z5XIHG3.mjs.map +7 -0
- package/dist/lib/neutral/add-message-WX3LCGZC.mjs +87 -0
- package/dist/lib/neutral/add-message-WX3LCGZC.mjs.map +7 -0
- package/dist/lib/neutral/app-graph-builder-BBHAUCMZ.mjs +173 -0
- package/dist/lib/neutral/app-graph-builder-BBHAUCMZ.mjs.map +7 -0
- package/dist/lib/neutral/append-channel-message-J7N6UEBL.mjs +40 -0
- package/dist/lib/neutral/append-channel-message-J7N6UEBL.mjs.map +7 -0
- package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs +15 -0
- package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
- package/dist/lib/neutral/blueprints/index.mjs +8 -0
- package/dist/lib/neutral/call-manager-JFA4DLWR.mjs +24 -0
- package/dist/lib/neutral/call-manager-JFA4DLWR.mjs.map +7 -0
- package/dist/lib/neutral/capabilities/index.mjs +29 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/neutral/chunk-44D7D4ZX.mjs +20 -0
- package/dist/lib/neutral/chunk-44D7D4ZX.mjs.map +7 -0
- package/dist/lib/neutral/chunk-4SVMVL4L.mjs +164 -0
- package/dist/lib/neutral/chunk-4SVMVL4L.mjs.map +7 -0
- package/dist/lib/neutral/chunk-5T5LPLBN.mjs +36 -0
- package/dist/lib/neutral/chunk-5T5LPLBN.mjs.map +7 -0
- package/dist/lib/neutral/chunk-BFHJWC3L.mjs +276 -0
- package/dist/lib/neutral/chunk-BFHJWC3L.mjs.map +7 -0
- package/dist/lib/neutral/chunk-CROE4U4O.mjs +100 -0
- package/dist/lib/neutral/chunk-CROE4U4O.mjs.map +7 -0
- package/dist/lib/neutral/chunk-EACFR36K.mjs +55 -0
- package/dist/lib/neutral/chunk-EACFR36K.mjs.map +7 -0
- package/dist/lib/neutral/chunk-FWSMZWBO.mjs +178 -0
- package/dist/lib/neutral/chunk-FWSMZWBO.mjs.map +7 -0
- package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
- package/dist/lib/{node-esm/chunk-PGRP3O4O.mjs → neutral/chunk-JLY4NVTA.mjs} +14 -9
- package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
- package/dist/lib/neutral/chunk-NGZVEPJV.mjs +8 -0
- package/dist/lib/neutral/chunk-NGZVEPJV.mjs.map +7 -0
- package/dist/lib/{node-esm/chunk-WXNPD542.mjs → neutral/chunk-PZ7WTAA2.mjs} +317 -505
- package/dist/lib/neutral/chunk-PZ7WTAA2.mjs.map +7 -0
- package/dist/lib/neutral/chunk-UQFTL6TV.mjs +202 -0
- package/dist/lib/neutral/chunk-UQFTL6TV.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +1230 -0
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +19 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/neutral/create-DGJZRLG7.mjs +52 -0
- package/dist/lib/neutral/create-DGJZRLG7.mjs.map +7 -0
- package/dist/lib/neutral/create-channel-RP646IAE.mjs +19 -0
- package/dist/lib/neutral/create-channel-RP646IAE.mjs.map +7 -0
- package/dist/lib/neutral/create-object-HIEWSBZB.mjs +27 -0
- package/dist/lib/neutral/create-object-HIEWSBZB.mjs.map +7 -0
- package/dist/lib/neutral/create-proposals-CPLU4YC6.mjs +56 -0
- package/dist/lib/neutral/create-proposals-CPLU4YC6.mjs.map +7 -0
- package/dist/lib/neutral/delete-MKKME2FE.mjs +57 -0
- package/dist/lib/neutral/delete-MKKME2FE.mjs.map +7 -0
- package/dist/lib/neutral/delete-message-UBZH3SZA.mjs +54 -0
- package/dist/lib/neutral/delete-message-UBZH3SZA.mjs.map +7 -0
- package/dist/lib/neutral/hooks/index.mjs +19 -0
- package/dist/lib/neutral/index.mjs +68 -0
- package/dist/lib/neutral/markdown-XQLZYS2O.mjs +83 -0
- package/dist/lib/neutral/markdown-XQLZYS2O.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +10 -0
- package/dist/lib/neutral/meta.mjs.map +7 -0
- package/dist/lib/neutral/on-create-space-MRLZYOJR.mjs +23 -0
- package/dist/lib/neutral/on-create-space-MRLZYOJR.mjs.map +7 -0
- package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs +13 -0
- package/dist/lib/neutral/operation-handler-RU6K2S4L.mjs.map +7 -0
- package/dist/lib/neutral/operations/index.mjs +8 -0
- package/dist/lib/neutral/operations/index.mjs.map +7 -0
- package/dist/lib/neutral/plugin.mjs +16 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/neutral/react-root-VMMNUSSL.mjs +18 -0
- package/dist/lib/neutral/react-root-VMMNUSSL.mjs.map +7 -0
- package/dist/lib/neutral/react-surface-WPSVOTVG.mjs +94 -0
- package/dist/lib/neutral/react-surface-WPSVOTVG.mjs.map +7 -0
- package/dist/lib/neutral/restore-SUXNC6GE.mjs +32 -0
- package/dist/lib/neutral/restore-SUXNC6GE.mjs.map +7 -0
- package/dist/lib/neutral/restore-message-2TPJB32Y.mjs +33 -0
- package/dist/lib/neutral/restore-message-2TPJB32Y.mjs.map +7 -0
- package/dist/lib/neutral/select-H5RMZH43.mjs +24 -0
- package/dist/lib/neutral/select-H5RMZH43.mjs.map +7 -0
- package/dist/lib/neutral/settings-HK4EB6TF.mjs +30 -0
- package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
- package/dist/lib/neutral/state-UU7VEAKV.mjs +22 -0
- package/dist/lib/neutral/state-UU7VEAKV.mjs.map +7 -0
- package/dist/lib/neutral/testing/index.mjs +58 -0
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/lib/neutral/toggle-resolved-HKZ4IRHG.mjs +36 -0
- package/dist/lib/neutral/toggle-resolved-HKZ4IRHG.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +90 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/neutral/types/index.mjs +12 -0
- package/dist/lib/neutral/types/index.mjs.map +7 -0
- package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs +54 -0
- package/dist/lib/neutral/undo-mappings-HOKL2L3M.mjs.map +7 -0
- package/dist/types/src/ThreadPlugin.d.ts +3 -1
- package/dist/types/src/ThreadPlugin.d.ts.map +1 -1
- package/dist/types/src/ThreadPlugin.node.d.ts +4 -0
- package/dist/types/src/ThreadPlugin.node.d.ts.map +1 -0
- package/dist/types/src/ThreadPlugin.test.d.ts +2 -0
- package/dist/types/src/ThreadPlugin.test.d.ts.map +1 -0
- 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 +4 -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 +2 -2
- package/dist/types/src/calls/media-manager.d.ts.map +1 -1
- package/dist/types/src/calls/speaking-monitor.d.ts +0 -3
- package/dist/types/src/calls/speaking-monitor.d.ts.map +1 -1
- package/dist/types/src/calls/types.d.ts +1 -1
- package/dist/types/src/calls/types.d.ts.map +1 -1
- package/dist/types/src/calls/util/audio.d.ts.map +1 -1
- package/dist/types/src/calls/util/calls-service.d.ts +11 -6
- package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
- package/dist/types/src/calls/util/history-cache.d.ts.map +1 -1
- package/dist/types/src/calls/util/media.d.ts.map +1 -1
- package/dist/types/src/calls/util/stub-media-streams.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/calls-service.stories.d.ts +23 -0
- package/dist/types/src/calls-service.stories.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts +4 -2
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
- package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
- package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
- package/dist/types/src/capabilities/call-manager.d.ts +3 -2
- package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
- package/dist/types/src/capabilities/create-object.d.ts +11 -0
- package/dist/types/src/capabilities/create-object.d.ts.map +1 -0
- package/dist/types/src/capabilities/index.d.ts +19 -13
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts +3 -2
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
- package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
- package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
- package/dist/types/src/capabilities/react-root.d.ts +4 -2
- package/dist/types/src/capabilities/react-root.d.ts.map +1 -1
- package/dist/types/src/capabilities/react-surface.d.ts +3 -2
- package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
- package/dist/types/src/capabilities/settings.d.ts +5 -2
- package/dist/types/src/capabilities/settings.d.ts.map +1 -1
- package/dist/types/src/capabilities/state.d.ts +5 -5
- package/dist/types/src/capabilities/state.d.ts.map +1 -1
- package/dist/types/src/capabilities/undo-mappings.d.ts +5 -0
- package/dist/types/src/capabilities/undo-mappings.d.ts.map +1 -0
- package/dist/types/src/components/Call/Call.d.ts +32 -4
- package/dist/types/src/components/Call/Call.d.ts.map +1 -1
- package/dist/types/src/components/Call/Toolbar.d.ts +6 -6
- package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
- package/dist/types/src/components/Chat/Chat.d.ts +51 -0
- package/dist/types/src/components/Chat/Chat.d.ts.map +1 -0
- package/dist/types/src/components/Chat/index.d.ts +2 -0
- package/dist/types/src/components/Chat/index.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts +13 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts +160 -0
- package/dist/types/src/components/CommentsPanel/CommentsPanel.stories.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts +14 -0
- package/dist/types/src/components/CommentsPanel/CommentsThread.d.ts.map +1 -0
- package/dist/types/src/components/CommentsPanel/index.d.ts +3 -0
- package/dist/types/src/components/CommentsPanel/index.d.ts.map +1 -0
- package/dist/types/src/components/Lobby/Lobby.d.ts +24 -3
- package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.d.ts +3 -3
- package/dist/types/src/components/Media/VideoObject.d.ts.map +1 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts +18 -4
- package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
- package/dist/types/src/components/MessagePanel/MessagePanel.d.ts +15 -0
- package/dist/types/src/components/MessagePanel/MessagePanel.d.ts.map +1 -0
- package/dist/types/src/components/MessagePanel/index.d.ts +2 -0
- package/dist/types/src/components/MessagePanel/index.d.ts.map +1 -0
- package/dist/types/src/components/Participant/Participant.d.ts.map +1 -1
- package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +160 -5
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
- package/dist/types/src/components/ResponsiveGrid/{ResponsiveContainer.d.ts → ResponsivePanel.d.ts} +4 -4
- package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.d.ts.map +1 -0
- package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts +164 -0
- package/dist/types/src/components/ResponsiveGrid/ResponsivePanel.stories.d.ts.map +1 -0
- package/dist/types/src/components/ResponsiveGrid/index.d.ts +1 -1
- package/dist/types/src/components/ResponsiveGrid/index.d.ts.map +1 -1
- package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts +6 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.d.ts.map +1 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts +161 -0
- package/dist/types/src/components/ThreadSettings/ThreadSettings.stories.d.ts.map +1 -0
- package/dist/types/src/components/ThreadSettings/index.d.ts +2 -0
- package/dist/types/src/components/ThreadSettings/index.d.ts.map +1 -0
- package/dist/types/src/components/index.d.ts +5 -9
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +15 -0
- package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +1 -0
- package/dist/types/src/containers/CallDebugPanel/index.d.ts +2 -0
- package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +1 -0
- package/dist/types/src/{components → containers/CallSidebar}/CallSidebar.d.ts +0 -1
- package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +1 -0
- package/dist/types/src/containers/CallSidebar/index.d.ts +2 -0
- package/dist/types/src/containers/CallSidebar/index.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts +20 -0
- package/dist/types/src/containers/ChannelChat/ChannelChat.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelChat/index.d.ts +4 -0
- package/dist/types/src/containers/ChannelChat/index.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +12 -0
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +162 -0
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelContainer/index.d.ts +2 -0
- package/dist/types/src/containers/ChannelContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +8 -0
- package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadCompanion/index.d.ts +2 -0
- package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts +20 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts +162 -0
- package/dist/types/src/containers/ThreadContainer/ThreadContainer.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ThreadContainer/index.d.ts +4 -0
- package/dist/types/src/containers/ThreadContainer/index.d.ts.map +1 -0
- package/dist/types/src/containers/index.d.ts +8 -0
- package/dist/types/src/containers/index.d.ts.map +1 -0
- package/dist/types/src/{components/command-extension.d.ts → extensions/command.d.ts} +1 -1
- package/dist/types/src/extensions/command.d.ts.map +1 -0
- package/dist/types/src/extensions/index.d.ts +1 -0
- package/dist/types/src/extensions/index.d.ts.map +1 -1
- package/dist/types/src/extensions/threads.d.ts +9 -4
- package/dist/types/src/extensions/threads.d.ts.map +1 -1
- package/dist/types/src/hooks/analytics.d.ts +2 -3
- package/dist/types/src/hooks/analytics.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +3 -0
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +2 -0
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +1 -0
- package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +2 -0
- package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +1 -0
- package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts +3 -0
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +2 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +3 -4
- package/dist/types/src/meta.d.ts.map +1 -1
- package/dist/types/src/operations/add-message.d.ts +5 -0
- package/dist/types/src/operations/add-message.d.ts.map +1 -0
- package/dist/types/src/operations/append-channel-message.d.ts +5 -0
- package/dist/types/src/operations/append-channel-message.d.ts.map +1 -0
- package/dist/types/src/operations/create-channel.d.ts +5 -0
- package/dist/types/src/operations/create-channel.d.ts.map +1 -0
- package/dist/types/src/operations/create-proposals.d.ts +5 -0
- package/dist/types/src/operations/create-proposals.d.ts.map +1 -0
- package/dist/types/src/operations/create.d.ts +5 -0
- package/dist/types/src/operations/create.d.ts.map +1 -0
- package/dist/types/src/operations/delete-message.d.ts +5 -0
- package/dist/types/src/operations/delete-message.d.ts.map +1 -0
- package/dist/types/src/operations/delete.d.ts +5 -0
- package/dist/types/src/operations/delete.d.ts.map +1 -0
- package/dist/types/src/operations/index.d.ts +3 -0
- package/dist/types/src/operations/index.d.ts.map +1 -0
- package/dist/types/src/operations/on-create-space.d.ts +5 -0
- package/dist/types/src/operations/on-create-space.d.ts.map +1 -0
- package/dist/types/src/operations/restore-message.d.ts +5 -0
- package/dist/types/src/operations/restore-message.d.ts.map +1 -0
- package/dist/types/src/operations/restore.d.ts +5 -0
- package/dist/types/src/operations/restore.d.ts.map +1 -0
- package/dist/types/src/operations/select.d.ts +5 -0
- package/dist/types/src/operations/select.d.ts.map +1 -0
- package/dist/types/src/operations/toggle-resolved.d.ts +5 -0
- package/dist/types/src/operations/toggle-resolved.d.ts.map +1 -0
- package/dist/types/src/plugin.d.ts +4 -0
- package/dist/types/src/plugin.d.ts.map +1 -0
- package/dist/types/src/testing/data.d.ts +5 -0
- package/dist/types/src/testing/data.d.ts.map +1 -0
- package/dist/types/src/testing/index.d.ts +1 -1
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +144 -194
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/Settings.d.ts +5 -0
- package/dist/types/src/types/Settings.d.ts.map +1 -0
- package/dist/types/src/types/ThreadCapabilities.d.ts +26 -0
- package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
- package/dist/types/src/types/ThreadOperation.d.ts +1995 -0
- package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +3 -1
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +3 -325
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +21 -3
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +150 -80
- package/src/ThreadPlugin.node.ts +39 -0
- package/src/ThreadPlugin.test.ts +37 -0
- package/src/ThreadPlugin.tsx +64 -147
- package/src/blueprints/index.ts +5 -0
- package/src/blueprints/thread-blueprint.ts +36 -0
- package/src/calls/call-manager.ts +78 -50
- package/src/calls/call-swarm-synchronizer.ts +3 -3
- package/src/calls/media-manager.ts +77 -41
- package/src/calls/types.ts +8 -4
- package/src/calls/util/calls-service.ts +74 -19
- package/src/calls/util/stub-media-streams.ts +65 -9
- package/src/calls/util/task-scheduling.ts +4 -4
- package/src/calls-service.stories.tsx +230 -0
- package/src/capabilities/app-graph-builder.ts +176 -161
- package/src/capabilities/blueprint-definition.ts +19 -0
- package/src/capabilities/call-manager.ts +18 -10
- package/src/capabilities/create-object.ts +29 -0
- package/src/capabilities/index.ts +17 -11
- package/src/capabilities/markdown.ts +54 -36
- package/src/capabilities/operation-handler.ts +16 -0
- package/src/capabilities/react-root.tsx +12 -9
- package/src/capabilities/react-surface.tsx +83 -74
- package/src/capabilities/settings.ts +26 -12
- package/src/capabilities/state.ts +14 -17
- package/src/capabilities/undo-mappings.ts +46 -0
- package/src/components/Call/Call.tsx +17 -12
- package/src/components/Call/Toolbar.tsx +63 -46
- package/src/components/Chat/Chat.tsx +258 -0
- package/src/components/Chat/index.ts +5 -0
- package/src/components/CommentsPanel/CommentsPanel.stories.tsx +95 -0
- package/src/components/CommentsPanel/CommentsPanel.tsx +71 -0
- package/src/components/CommentsPanel/CommentsThread.tsx +171 -0
- package/src/components/CommentsPanel/index.ts +6 -0
- package/src/components/Lobby/Lobby.tsx +21 -17
- package/src/components/Media/AudioStream.tsx +2 -2
- package/src/components/Media/VideoObject.stories.tsx +37 -30
- package/src/components/Media/VideoObject.tsx +1 -1
- package/src/components/MessagePanel/MessagePanel.tsx +221 -0
- package/src/components/MessagePanel/index.ts +5 -0
- package/src/components/Participant/Participant.tsx +35 -15
- package/src/components/Participant/ParticipantGrid.tsx +1 -1
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +51 -49
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +6 -6
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +15 -12
- package/src/components/ResponsiveGrid/{ResponsiveContainer.stories.tsx → ResponsivePanel.stories.tsx} +12 -12
- package/src/components/ResponsiveGrid/{ResponsiveContainer.tsx → ResponsivePanel.tsx} +7 -9
- package/src/components/ResponsiveGrid/index.ts +1 -1
- package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
- package/src/components/ThreadSettings/ThreadSettings.tsx +20 -0
- package/src/components/ThreadSettings/index.ts +5 -0
- package/src/components/index.ts +6 -12
- package/src/containers/CallDebugPanel/CallDebugPanel.tsx +173 -0
- package/src/containers/CallDebugPanel/index.ts +5 -0
- package/src/containers/CallSidebar/CallSidebar.tsx +18 -0
- package/src/containers/CallSidebar/index.ts +5 -0
- package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
- package/src/containers/ChannelChat/index.ts +8 -0
- package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +105 -0
- package/src/containers/ChannelContainer/ChannelContainer.tsx +223 -0
- package/src/containers/ChannelContainer/index.ts +5 -0
- package/src/containers/ThreadCompanion/ThreadCompanion.tsx +215 -0
- package/src/containers/ThreadCompanion/index.ts +5 -0
- package/src/containers/ThreadContainer/ThreadContainer.stories.tsx +86 -0
- package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
- package/src/containers/ThreadContainer/index.ts +8 -0
- package/src/containers/index.ts +12 -0
- package/src/{components/command-extension.ts → extensions/command.ts} +7 -4
- package/src/extensions/index.ts +1 -0
- package/src/extensions/threads.ts +89 -44
- package/src/hooks/analytics.ts +22 -21
- package/src/hooks/index.ts +4 -0
- package/src/hooks/useBlackCanvasStreamTrack.tsx +27 -0
- package/src/hooks/useDebugMode.ts +1 -1
- package/src/hooks/useInaudibleAudioStreamTrack.tsx +27 -0
- package/src/hooks/useVideoStreamTrack.tsx +36 -0
- package/src/index.ts +4 -3
- package/src/meta.ts +11 -7
- package/src/operations/add-message.ts +81 -0
- package/src/operations/append-channel-message.ts +37 -0
- package/src/operations/create-channel.ts +20 -0
- package/src/operations/create-proposals.ts +49 -0
- package/src/operations/create.ts +48 -0
- package/src/operations/delete-message.ts +53 -0
- package/src/operations/delete.ts +63 -0
- package/src/operations/index.ts +20 -0
- package/src/operations/on-create-space.ts +27 -0
- package/src/operations/restore-message.ts +38 -0
- package/src/operations/restore.ts +38 -0
- package/src/operations/select.ts +24 -0
- package/src/operations/toggle-resolved.ts +41 -0
- package/src/plugin.ts +11 -0
- package/src/testing/data.ts +49 -0
- package/src/testing/index.ts +1 -1
- package/src/translations.ts +77 -73
- package/src/types/Settings.ts +10 -0
- package/src/types/ThreadCapabilities.ts +41 -0
- package/src/types/ThreadOperation.ts +179 -0
- package/src/types/index.ts +4 -1
- package/src/types/types.ts +4 -92
- package/src/typings/peermetrics-webrtc-stats.d.ts +17 -1
- package/src/typings.d.ts +8 -0
- package/src/util.ts +38 -6
- package/dist/lib/browser/ChannelContainer-PKFBVENP.mjs +0 -15
- package/dist/lib/browser/ChatContainer-RSOKYAMK.mjs +0 -14
- package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs +0 -171
- package/dist/lib/browser/app-graph-builder-OY7R7EJP.mjs.map +0 -7
- package/dist/lib/browser/call-manager-APQAZWHT.mjs +0 -23
- package/dist/lib/browser/call-manager-APQAZWHT.mjs.map +0 -7
- package/dist/lib/browser/chunk-4H4A264L.mjs +0 -1708
- package/dist/lib/browser/chunk-4H4A264L.mjs.map +0 -7
- package/dist/lib/browser/chunk-5P5BH5GE.mjs +0 -88
- package/dist/lib/browser/chunk-5P5BH5GE.mjs.map +0 -7
- package/dist/lib/browser/chunk-6NBVNXTM.mjs +0 -21
- package/dist/lib/browser/chunk-6NBVNXTM.mjs.map +0 -7
- package/dist/lib/browser/chunk-AEXWNS6Z.mjs +0 -128
- package/dist/lib/browser/chunk-AEXWNS6Z.mjs.map +0 -7
- package/dist/lib/browser/chunk-IIUTBDVB.mjs +0 -17
- package/dist/lib/browser/chunk-IIUTBDVB.mjs.map +0 -7
- package/dist/lib/browser/chunk-JKQUJOTX.mjs +0 -31
- package/dist/lib/browser/chunk-JKQUJOTX.mjs.map +0 -7
- package/dist/lib/browser/chunk-PG5CTFKK.mjs +0 -550
- package/dist/lib/browser/chunk-PG5CTFKK.mjs.map +0 -7
- package/dist/lib/browser/chunk-R5MDLUPC.mjs +0 -18
- package/dist/lib/browser/chunk-R5MDLUPC.mjs.map +0 -7
- package/dist/lib/browser/chunk-TAFSCSUR.mjs +0 -351
- package/dist/lib/browser/chunk-TAFSCSUR.mjs.map +0 -7
- package/dist/lib/browser/chunk-XZKBN3NS.mjs +0 -983
- package/dist/lib/browser/chunk-XZKBN3NS.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -308
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs +0 -353
- package/dist/lib/browser/intent-resolver-FK2MDVDT.mjs.map +0 -7
- package/dist/lib/browser/markdown-TE5SWWNJ.mjs +0 -169
- package/dist/lib/browser/markdown-TE5SWWNJ.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/react-root-NK3A4VG7.mjs +0 -27
- package/dist/lib/browser/react-root-NK3A4VG7.mjs.map +0 -7
- package/dist/lib/browser/react-surface-VXUJKSOG.mjs +0 -108
- package/dist/lib/browser/react-surface-VXUJKSOG.mjs.map +0 -7
- package/dist/lib/browser/settings-RB2RSLXV.mjs +0 -22
- package/dist/lib/browser/settings-RB2RSLXV.mjs.map +0 -7
- package/dist/lib/browser/state-RKL5MSDP.mjs +0 -34
- package/dist/lib/browser/state-RKL5MSDP.mjs.map +0 -7
- package/dist/lib/browser/types/index.mjs +0 -16
- package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs +0 -36
- package/dist/lib/node/ChannelContainer-YS5YT2ML.cjs.map +0 -7
- package/dist/lib/node/ChatContainer-GCOM3M56.cjs +0 -35
- package/dist/lib/node/ChatContainer-GCOM3M56.cjs.map +0 -7
- package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs +0 -179
- package/dist/lib/node/app-graph-builder-PBHJNDQY.cjs.map +0 -7
- package/dist/lib/node/call-manager-HV2XJW5O.cjs +0 -37
- package/dist/lib/node/call-manager-HV2XJW5O.cjs.map +0 -7
- package/dist/lib/node/chunk-44I33JDT.cjs +0 -1731
- package/dist/lib/node/chunk-44I33JDT.cjs.map +0 -7
- package/dist/lib/node/chunk-4YSNVPWU.cjs +0 -37
- package/dist/lib/node/chunk-4YSNVPWU.cjs.map +0 -7
- package/dist/lib/node/chunk-E3WBZTTI.cjs +0 -371
- package/dist/lib/node/chunk-E3WBZTTI.cjs.map +0 -7
- package/dist/lib/node/chunk-ERG7G6FF.cjs +0 -59
- package/dist/lib/node/chunk-ERG7G6FF.cjs.map +0 -7
- package/dist/lib/node/chunk-FUXJAVFZ.cjs +0 -108
- package/dist/lib/node/chunk-FUXJAVFZ.cjs.map +0 -7
- package/dist/lib/node/chunk-HLMCEE5K.cjs +0 -41
- package/dist/lib/node/chunk-HLMCEE5K.cjs.map +0 -7
- package/dist/lib/node/chunk-IP533AMV.cjs +0 -554
- package/dist/lib/node/chunk-IP533AMV.cjs.map +0 -7
- package/dist/lib/node/chunk-LR5NENBE.cjs +0 -54
- package/dist/lib/node/chunk-LR5NENBE.cjs.map +0 -7
- package/dist/lib/node/chunk-UM36TPCT.cjs +0 -984
- package/dist/lib/node/chunk-UM36TPCT.cjs.map +0 -7
- package/dist/lib/node/chunk-ZGDN3XBR.cjs +0 -149
- package/dist/lib/node/chunk-ZGDN3XBR.cjs.map +0 -7
- package/dist/lib/node/index.cjs +0 -310
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs +0 -363
- package/dist/lib/node/intent-resolver-SYSJ5SJG.cjs.map +0 -7
- package/dist/lib/node/markdown-GQIPJS2F.cjs +0 -178
- package/dist/lib/node/markdown-GQIPJS2F.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
- package/dist/lib/node/react-root-6HHDMULJ.cjs +0 -51
- package/dist/lib/node/react-root-6HHDMULJ.cjs.map +0 -7
- package/dist/lib/node/react-surface-NBH42NN2.cjs +0 -122
- package/dist/lib/node/react-surface-NBH42NN2.cjs.map +0 -7
- package/dist/lib/node/settings-4LQSFEDK.cjs +0 -36
- package/dist/lib/node/settings-4LQSFEDK.cjs.map +0 -7
- package/dist/lib/node/state-IY5XX3H2.cjs +0 -50
- package/dist/lib/node/state-IY5XX3H2.cjs.map +0 -7
- package/dist/lib/node/types/index.cjs +0 -38
- package/dist/lib/node/types/index.cjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-O4QJII2P.mjs +0 -16
- package/dist/lib/node-esm/ChatContainer-F6CSADV7.mjs +0 -15
- package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs +0 -172
- package/dist/lib/node-esm/app-graph-builder-BAHBHYWI.mjs.map +0 -7
- package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs +0 -24
- package/dist/lib/node-esm/call-manager-UUYXLF4T.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2RNIPFDA.mjs +0 -984
- package/dist/lib/node-esm/chunk-2RNIPFDA.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ESQC6SYE.mjs +0 -19
- package/dist/lib/node-esm/chunk-ESQC6SYE.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-K4KAUOKT.mjs +0 -19
- package/dist/lib/node-esm/chunk-K4KAUOKT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-O3V45YJP.mjs +0 -90
- package/dist/lib/node-esm/chunk-O3V45YJP.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-O63QJPQX.mjs +0 -23
- package/dist/lib/node-esm/chunk-O63QJPQX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-P6RLFCNT.mjs +0 -352
- package/dist/lib/node-esm/chunk-P6RLFCNT.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-PGRP3O4O.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UJMPYKT3.mjs +0 -129
- package/dist/lib/node-esm/chunk-UJMPYKT3.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-UZWVVFT3.mjs +0 -551
- package/dist/lib/node-esm/chunk-UZWVVFT3.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-WXNPD542.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -309
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs +0 -354
- package/dist/lib/node-esm/intent-resolver-BU73VYW3.mjs.map +0 -7
- package/dist/lib/node-esm/markdown-HJUWNBLS.mjs +0 -170
- package/dist/lib/node-esm/markdown-HJUWNBLS.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/react-root-RUXOAQNW.mjs +0 -28
- package/dist/lib/node-esm/react-root-RUXOAQNW.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs +0 -109
- package/dist/lib/node-esm/react-surface-ELXFYKP6.mjs.map +0 -7
- package/dist/lib/node-esm/settings-EA7DFSM6.mjs +0 -23
- package/dist/lib/node-esm/settings-EA7DFSM6.mjs.map +0 -7
- package/dist/lib/node-esm/state-6AUTNROZ.mjs +0 -35
- package/dist/lib/node-esm/state-6AUTNROZ.mjs.map +0 -7
- package/dist/lib/node-esm/types/index.mjs +0 -17
- 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/components/CallDebugPanel.d.ts +0 -8
- package/dist/types/src/components/CallDebugPanel.d.ts.map +0 -1
- package/dist/types/src/components/CallSidebar.d.ts.map +0 -1
- package/dist/types/src/components/ChannelContainer.d.ts +0 -14
- package/dist/types/src/components/ChannelContainer.d.ts.map +0 -1
- package/dist/types/src/components/ChannelContainer.stories.d.ts +0 -10
- package/dist/types/src/components/ChannelContainer.stories.d.ts.map +0 -1
- package/dist/types/src/components/Chat.stories.d.ts +0 -6
- package/dist/types/src/components/Chat.stories.d.ts.map +0 -1
- package/dist/types/src/components/ChatContainer.d.ts +0 -17
- package/dist/types/src/components/ChatContainer.d.ts.map +0 -1
- package/dist/types/src/components/CommentContainer.d.ts +0 -13
- package/dist/types/src/components/CommentContainer.d.ts.map +0 -1
- package/dist/types/src/components/Comments.stories.d.ts +0 -6
- package/dist/types/src/components/Comments.stories.d.ts.map +0 -1
- package/dist/types/src/components/CommentsContainer.d.ts +0 -13
- package/dist/types/src/components/CommentsContainer.d.ts.map +0 -1
- package/dist/types/src/components/MessageContainer.d.ts +0 -11
- package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -10
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
- package/dist/types/src/components/ThreadComplementary.d.ts +0 -5
- package/dist/types/src/components/ThreadComplementary.d.ts.map +0 -1
- package/dist/types/src/components/ThreadSettings.d.ts +0 -6
- package/dist/types/src/components/ThreadSettings.d.ts.map +0 -1
- package/dist/types/src/components/command-extension.d.ts.map +0 -1
- package/dist/types/src/components/testing.d.ts +0 -4
- package/dist/types/src/components/testing.d.ts.map +0 -1
- package/dist/types/src/peers.stories.d.ts +0 -11
- package/dist/types/src/peers.stories.d.ts.map +0 -1
- package/dist/types/src/testing/stories.d.ts +0 -2
- package/dist/types/src/testing/stories.d.ts.map +0 -1
- package/dist/types/src/types/schema.d.ts +0 -133
- package/dist/types/src/types/schema.d.ts.map +0 -1
- package/src/capabilities/capabilities.ts +0 -33
- package/src/capabilities/intent-resolver.ts +0 -296
- package/src/components/CallDebugPanel.tsx +0 -115
- package/src/components/CallSidebar.tsx +0 -17
- package/src/components/ChannelContainer.stories.tsx +0 -58
- package/src/components/ChannelContainer.tsx +0 -199
- package/src/components/Chat.stories.tsx +0 -88
- package/src/components/ChatContainer.tsx +0 -140
- package/src/components/CommentContainer.tsx +0 -198
- package/src/components/Comments.stories.tsx +0 -85
- package/src/components/CommentsContainer.tsx +0 -66
- package/src/components/MessageContainer.tsx +0 -167
- package/src/components/ThreadComplementary.tsx +0 -151
- package/src/components/ThreadSettings.tsx +0 -17
- package/src/components/testing.ts +0 -29
- package/src/peers.stories.tsx +0 -189
- package/src/testing/stories.ts +0 -50
- package/src/types/schema.ts +0 -33
- /package/dist/lib/{browser/ChannelContainer-PKFBVENP.mjs.map → neutral/ChannelChat-EKQYQQXZ.mjs.map} +0 -0
- /package/dist/lib/{browser/ChatContainer-RSOKYAMK.mjs.map → neutral/ChannelContainer-XXMX5X43.mjs.map} +0 -0
- /package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/ChannelContainer-O4QJII2P.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
- /package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/ChatContainer-F6CSADV7.mjs.map → neutral/index.mjs.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/index.ts", "../../../../src/components/Call/Call.tsx", "../../../../src/components/Media/AudioStream.tsx", "../../../../src/components/Media/VideoObject.tsx", "../../../../src/components/Participant/Participant.tsx", "../../../../src/components/ResponsiveGrid/ResponsivePanel.tsx", "../../../../src/components/ResponsiveGrid/ResponsiveGrid.tsx", "../../../../src/components/ResponsiveGrid/ResponsiveGridItem.tsx", "../../../../src/components/Participant/ParticipantGrid.tsx", "../../../../src/components/Call/Toolbar.tsx", "../../../../src/components/Chat/Chat.tsx", "../../../../src/components/MessagePanel/MessagePanel.tsx", "../../../../src/components/CommentsPanel/CommentsPanel.tsx", "../../../../src/components/CommentsPanel/CommentsThread.tsx"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport * from './Call';\nexport * from './Chat';\nexport * from './CommentsPanel';\nexport * from './MessagePanel';\n\nexport const ThreadSettings: ComponentType<any> = lazy(() => import('./ThreadSettings'));\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { type PropsWithChildren } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { useDebugMode } from '#hooks';\nimport { ThreadCapabilities } from '#types';\n\nimport { AudioStream } from '../Media';\nimport { ParticipantGrid } from '../Participant';\nimport { Toolbar, type ToolbarProps } from './Toolbar';\n\n//\n// Root\n//\n\ntype CallRootProps = PropsWithChildren<ThemedClassName>;\n\nconst CallRoot = ({ children }: CallRootProps) => {\n return <div className='relative dx-container flex flex-col'>{children}</div>;\n};\n\nCallRoot.displayName = 'CallRoot';\n\n//\n// Audio\n//\n\ntype CallAudioProps = {};\n\nconst CallAudio = (_props: 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 = ({ fullscreen }: CallGridProps) => {\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 = (props: CallToolbarProps) => {\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 'w-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/ui';\n\nimport { ThreadCapabilities } from '#types';\n\nimport { type EncodedTrackName, type UserState } from '../../calls';\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 * <ResponsivePanel>\n * <VideoObject />\n * </ResponsivePanel>\n */\nexport const ResponsivePanel = ({ children }: PropsWithChildren) => {\n return (\n // Outer container that takes full size of parent.\n <div className='dx-expander relative flex'>\n {/* Absolute positioning layer for centering content. */}\n <div className='absolute inset-0 flex justify-center items-center'>\n {/* Content container that maintains given aspect ratio and proper scaling. */}\n <div className={mx('max-h-full max-w-full w-auto h-auto aspect-video')}>{children}</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 { type ResponsiveGridItemProps } from './ResponsiveGridItem';\nimport { ResponsivePanel } from './ResponsivePanel';\n\nconst ASPECT_RATIO = 16 / 9;\nconst MIN_GALLERY_HEIGHT = 250;\n\nconst DEFAULT_GAP = 8;\n\nconst maxImageSize = 'w-[2560px] h-[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('dx-expander relative', 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 && 'h-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 h-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-h-full max-w-full w-auto h-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 <ResponsivePanel>\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 </ResponsivePanel>\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.label'),\n classNames: 'animate-pulse bg-orange-500',\n },\n mute: {\n icon: 'ph--microphone-slash--regular',\n label: t('icon-muted.label'),\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 'dx-expander relative 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-h-1 rounded-sm', groupHoverControlItemWithTransition)}\n iconOnly\n icon={pinned ? 'ph--x--regular' : 'ph--arrows-out--regular'}\n size={pinned ? 5 : 4}\n label={pinned ? t('icon-unpin.label') : t('icon-pin.label')}\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 py-0.5 truncate rounded-sm',\n pinned ? 'px-2' : 'px-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-h-1 rounded-sm', 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';\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 { useCapability } from '@dxos/app-framework/ui';\nimport { useAppGraph } from '@dxos/app-toolkit/ui';\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 { type Channel } from '@dxos/types';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';\n\nimport { meta } from '#meta';\nimport { ThreadCapabilities } 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-modal-surface 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.button'),\n onClick: () => call.turnAudioOff(),\n classNames: 'bg-call-active',\n },\n off: {\n icon: 'ph--microphone-slash--duotone',\n label: t('mic-on.button'),\n onClick: () => call.turnAudioOn(),\n },\n }}\n />\n <ToggleButton\n active={media.videoEnabled}\n state={{\n on: {\n icon: 'ph--video-camera--regular',\n label: t('camera-off.button'),\n onClick: () => call.turnVideoOff(),\n },\n off: {\n icon: 'ph--video-camera-slash--duotone',\n label: t('camera-on.button'),\n onClick: () => call.turnVideoOn(),\n },\n }}\n />\n\n {(participants !== undefined && (\n <div className='flex justify-center items-center gap-2 w-[5rem] text-xs text-subdued'>\n <Icon icon='ph--users--regular' />\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.button'),\n onClick: () => call.turnScreenshareOff(),\n },\n off: {\n icon: 'ph--monitor-arrow-up--duotone',\n label: t('screenshare-on.button'),\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.button'),\n onClick: () => call.setRaisedHand(false),\n },\n off: {\n icon: 'ph--hand-palm--duotone',\n label: t('raise-hand.button'),\n onClick: () => call.setRaisedHand(true),\n },\n }}\n />\n </>\n )}\n {joined ? (\n <IconButton\n variant='destructive'\n icon='ph--phone-x--regular'\n label={t('leave-call.button')}\n onClick={onLeave}\n />\n ) : (\n <IconButton\n variant='primary'\n icon='ph--phone-incoming--regular'\n label={t('join-call.button')}\n onClick={onJoin}\n />\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-call-active') : 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 2026 DXOS.org\n//\n\nimport React, { type RefObject, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { type SpaceMember } from '@dxos/react-client/echo';\nimport { type Identity } from '@dxos/react-client/halo';\nimport { ScrollArea, type ThemedClassName, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n type MessageMetadata,\n MessageTextbox,\n Thread as ThreadComponent,\n type ThreadRootProps,\n threadLayout,\n} from '@dxos/react-ui-thread';\nimport { type Message } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions, listener, type Extension } from '@dxos/ui-editor';\nimport { composable, composableProps, mx } from '@dxos/ui-theme';\nimport { isNonNullable } from '@dxos/util';\n\nimport { meta } from '#meta';\n\nimport { command } from '../../extensions';\nimport { getMessageMetadata } from '../../util';\nimport { MessagePanel } from '../MessagePanel';\n\nexport type ChatProps = ThemedClassName<\n {\n /** Stable id used for the underlying thread root and message metadata. */\n id: string;\n /** Identity used to attribute outgoing messages in the textbox metadata. */\n identity?: Identity;\n /** Space members for rendering sender names/avatars on incoming messages. */\n members: SpaceMember[];\n /** Messages to render in order. */\n messages: readonly Message.Message[];\n /** Activity indicator (e.g. processing) shown beneath the textbox. */\n activity?: boolean;\n /**\n * Called with the user's textbox content when they press send.\n * Returning `true` signals the message was accepted; the textbox is then cleared.\n */\n onSend: (text: string) => boolean;\n autoFocusTextbox?: boolean;\n /**\n * Where the composer sits relative to the messages.\n * - `'top'` (default) — composer follows the messages at intrinsic height,\n * suitable for inline comment threads.\n * - `'bottom'` — composer pinned to the bottom of the panel, messages\n * scrolling above it. Suitable for full-panel multi-party chat.\n */\n orientation?: ChatOrientation;\n /**\n * When true, hide the composer textbox and activity indicator. Used for\n * channels whose source-of-truth lives elsewhere (e.g. externally-synced\n * Slack/Discord channels keyed by a foreign id) — sending isn't meaningful\n * because there is no local-write path back to the source.\n */\n readOnly?: boolean;\n } & Pick<ThreadRootProps, 'current'>\n>;\n\nexport type ChatOrientation = 'top' | 'bottom';\n\n/**\n * Pure chat UI: scrollable message list + composer textbox + activity indicator.\n * Owns its own UI state (textbox content, scroll position, editor extensions) but\n * does not load data or invoke operations — the caller passes messages and an\n * `onSend` callback. Used by both `ThreadContainer` (AutoMerge `Thread`) and\n * `ChannelContainer`'s feed-backed channel chat.\n */\nexport const Chat = composable<HTMLDivElement, ChatProps>(\n (\n {\n id,\n identity,\n members,\n messages,\n activity,\n onSend,\n autoFocusTextbox,\n current,\n orientation = 'top',\n readOnly,\n ...props\n },\n forwardedRef,\n ) => {\n const { t } = useTranslation(meta.id);\n const { themeMode } = useThemeContext();\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n\n // Force the editor to remount after a successful send so its content resets.\n const [_count, _setCount] = useState(0);\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 const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => sentinelRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n // NOTE: Auto-scroll on new messages is intentionally not implemented here. Smooth-scroll\n // animations were causing ResizeObserver feedback loops with CodeMirror/ScrollArea. The\n // proper fix is \"scroll only if user is already at the bottom\" — deferred to a follow-up.\n\n const handleSend = () => {\n const text = messageRef.current;\n if (!text?.length) {\n return false;\n }\n\n const accepted = onSend(text);\n if (!accepted) {\n return false;\n }\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n _setCount((count) => count + 1);\n return true;\n };\n\n const filteredMessages = messages.filter(isNonNullable);\n const renderState: ChatRenderState = {\n messages: filteredMessages,\n members,\n activity,\n extensions,\n autoFocus,\n handleSend,\n textboxMetadata,\n scrollRef,\n sentinelRef,\n readOnly,\n };\n\n return orientation === 'bottom' ? (\n <ChannelLayout\n {...composableProps(props, { classNames: 'flex flex-col bs-full min-h-0' })}\n id={id}\n ref={forwardedRef}\n state={renderState}\n />\n ) : (\n <ThreadLayout\n {...composableProps(props, { classNames: 'dx-container grid-rows-[1fr_min-content_min-content]' })}\n id={id}\n current={current}\n ref={forwardedRef}\n state={renderState}\n />\n );\n },\n);\n\n//\n// Internal layout helpers — share state via the ChatRenderState bag.\n//\n\ntype ChatRenderState = {\n messages: Message.Message[];\n members: SpaceMember[];\n activity?: boolean;\n extensions: Extension[];\n autoFocus?: boolean;\n handleSend: () => boolean;\n textboxMetadata: MessageMetadata;\n scrollRef: RefObject<HTMLDivElement | null>;\n sentinelRef: RefObject<HTMLDivElement | null>;\n readOnly?: boolean;\n};\n\ntype LayoutProps = React.HTMLAttributes<HTMLDivElement> & {\n id: string;\n state: ChatRenderState;\n};\n\n/** Thread layout — composer follows messages at intrinsic height. */\nconst ThreadLayout = React.forwardRef<HTMLDivElement, LayoutProps & Pick<ThreadRootProps, 'current'>>(\n ({ id, current, state, ...props }, ref) => {\n const { t } = useTranslation(meta.id);\n const { messages, members, activity, extensions, autoFocus, handleSend, textboxMetadata, sentinelRef, readOnly } =\n state;\n return (\n <ThreadComponent.Root {...props} id={id} current={current} ref={ref}>\n <ScrollArea.Root classNames='col-span-2' orientation='vertical'>\n <ScrollArea.Viewport ref={sentinelRef}>\n <div className={mx(threadLayout, 'place-self-end')}>\n {messages.map((message) => (\n <MessagePanel key={message.id} message={message} members={members} />\n ))}\n </div>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n {!readOnly && (\n <>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />\n <ThreadComponent.Status activity={activity}>{t('activity.message')}</ThreadComponent.Status>\n </>\n )}\n </ThreadComponent.Root>\n );\n },\n);\n\n/** Channel layout — composer pinned to the bottom, messages scroll above it. */\nconst ChannelLayout = React.forwardRef<HTMLDivElement, LayoutProps>(({ id, state, ...props }, ref) => {\n const { t } = useTranslation(meta.id);\n const {\n messages,\n members,\n activity,\n extensions,\n autoFocus,\n handleSend,\n textboxMetadata,\n scrollRef,\n sentinelRef,\n readOnly,\n } = state;\n return (\n <div {...props} id={id} ref={ref}>\n <div ref={scrollRef} className='flex-1 min-h-0 overflow-y-auto'>\n {messages.map((message) => (\n <div key={message.id} className='grid grid-cols-[var(--dx-rail-size)_1fr] w-full'>\n <MessagePanel message={message} members={members} />\n </div>\n ))}\n <div ref={sentinelRef} />\n </div>\n {!readOnly && (\n <>\n <div className='shrink-0 grid grid-cols-[var(--dx-rail-size)_1fr]'>\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleSend} {...textboxMetadata} />\n </div>\n <div className='shrink-0 px-2 pb-1 text-xs text-description'>{activity ? t('activity.message') : null}</div>\n </>\n )}\n </div>\n );\n});\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/ui';\nimport { AppSurface } from '@dxos/app-toolkit/ui';\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 { Card } from '@dxos/react-ui';\nimport { useTextEditor } from '@dxos/react-ui-editor';\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';\n\nimport { command } from '../../extensions/command';\nimport { getMessageMetadata } from '../../util';\n\nexport const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pe-2';\nexport const buttonClassNames = 'p-1! transition-opacity';\n\nexport type MessagePanelProps = {\n message: Obj.OfShape<Message.Message> | Ref.Ref<Obj.OfShape<Message.Message>>;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n onAcceptProposal?: (id: string) => void;\n};\n\nexport const MessagePanel = ({\n message: messageOrRef,\n members,\n editable = false,\n onDelete,\n onAcceptProposal,\n}: MessagePanelProps) => {\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 // Pass `message.sender` as the fallback so externally-synced messages\n // (Slack, etc.) display the source-side sender name instead of \"Anonymous\"\n // when no DXOS identity matches.\n const messageMetadata = getMessageMetadata(message.id, senderIdentity, message.sender);\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 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 ref={parentRef} className='me-4' {...focusAttributes} />;\n};\n\nconst ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {\n return <div className='me-4 italic'>{block.text}</div>;\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 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface.Surface\n type={AppSurface.Card}\n limit={1}\n data={{ subject } satisfies AppSurface.ObjectCardData}\n fallback={title}\n />\n </Card.Root>\n );\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useEffect } from 'react';\n\nimport { Obj, Relation } from '@dxos/echo';\nimport { Icon, Message, Trans, useTranslation } from '@dxos/react-ui';\nimport { type AnchoredTo, type Thread } from '@dxos/types';\n\nimport { meta } from '#meta';\n\nimport { CommentsThread, type CommentsThreadProps } from './CommentsThread';\n\nexport type CommentsPanelProps = Omit<CommentsThreadProps, '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 CommentsPanel = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsPanelProps) => {\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 // TODO(dmaretskyi): Do Obj.instanceOf check instead.\n return thread && (thread as any).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 className='p-form-padding'>\n <Message.Root>\n <Message.Content>\n <Trans\n {...{\n t,\n i18nKey: 'no-comments.message',\n components: {\n commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='dx-icon-inline' />,\n },\n }}\n />\n </Message.Content>\n </Message.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 <CommentsThread 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';\n\nimport { command } from '../../extensions/command';\nimport { getMessageMetadata } from '../../util';\nimport { MessagePanel, buttonClassNames, buttonGroupClassNames } from '../MessagePanel';\n\nexport type CommentsThreadProps = {\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 CommentsThread = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n onAcceptProposal,\n}: CommentsThreadProps) => {\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 = useCallback<NonNullable<MessageTextboxProps['onSend']>>(() => {\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='pt-2 border-b border-subdued-separator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\n <div\n className={mx(\n 'col-span-2 grid grid-cols-[var(--dx-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 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 <MessagePanel\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 <div className='h-px -mt-px' ref={threadScrollRef} />\n </ThreadComponent.Root>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["lazy", "useAtomValue", "React", "useCapability", "useDebugMode", "ThreadCapabilities", "React", "useEffect", "useRef", "AudioStream", "tracks", "mediaStreamRef", "MediaStream", "ref", "audio", "current", "mediaStream", "srcObject", "resetSrcObject", "addEventListener", "play", "once", "autoPlay", "map", "track", "AudioTrack", "key", "id", "currentTrack", "addTrack", "removeTrack", "React", "forwardRef", "memo", "useEffect", "useRef", "mx", "VideoObject", "videoStream", "classNames", "flip", "contain", "rest", "ref", "internalRef", "video", "current", "srcObject", "setAttribute", "className", "v", "displayName", "useAtomValue", "React", "memo", "useMemo", "useCapability", "ThreadCapabilities", "React", "mx", "ResponsivePanel", "children", "div", "className", "React", "useCallback", "useEffect", "useLayoutEffect", "useMemo", "useState", "useResizeDetector", "invariant", "mx", "ASPECT_RATIO", "DEFAULT_GAP", "maxImageSize", "defaultGetId", "refreshRate", "getId", "dividerHeight", "useEffect", "containerWidth", "containerHeight", "setDividerHeight", "Math", "height", "pinned", "columns", "cellWidth", "width", "layout", "setLayout", "time", "now", "mainItems", "gap", "hideGallery", "gridContainerRef", "invariant", "containerRef", "el", "current", "querySelector", "item", "bounds", "filter", "clearTimeout", "t", "pinnedItem", "onPinnedChange", "React", "classNames", "className", "mx", "id", "debug", "ref", "style", "minHeight", "role", "display", "gridTemplateColumns", "map", "onClick", "SoloItem", "alt", "getBoundingClientRect", "top", "elementRect", "left", "minWastedSpace", "itemWidth", "itemHeight", "usedWidth", "cols", "wastedSpace", "bestColumns", "availableWidth", "outerWidth", "numCols", "maxCellWidth", "maxCellHeight", "outerHeight", "aspectRatio", "React", "useEffect", "useState", "Icon", "IconButton", "useTranslation", "Waveform", "groupHoverControlItemWithTransition", "mx", "meta", "ResponsiveGridItem", "children", "classNames", "item", "style", "name", "self", "pinned", "screenshare", "video", "mute", "wave", "speaking", "onClick", "t", "id", "iconProps", "icon", "label", "props", "undefined", "speakingIndicator", "setSpeakingIndicator", "timeout", "setTimeout", "clearTimeout", "div", "className", "iconOnly", "size", "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", "useCapability", "useAppGraph", "Obj", "Node", "useActionRunner", "useActions", "useNode", "Icon", "IconButton", "Toolbar", "NaturalToolbar", "toLocalizedString", "useTranslation", "groupHoverControlItemWithTransition", "mx", "meta", "ThreadCapabilities", "classNames", "channel", "participants", "autoHideControls", "onJoin", "onLeave", "t", "id", "graph", "runAction", "call", "CallManager", "media", "mediaAtom", "joined", "joinedAtom", "raisedHand", "raisedHandAtom", "node", "getDXN", "toString", "actions", "filter", "action", "properties", "disposition", "isScreensharing", "screenshareTrack", "undefined", "canSharescreen", "navigator", "mediaDevices", "getDisplayMedia", "div", "className", "Root", "ToggleButton", "active", "audioEnabled", "state", "on", "icon", "label", "onClick", "turnAudioOff", "off", "turnAudioOn", "videoEnabled", "turnVideoOff", "turnVideoOn", "Separator", "variant", "disabled", "turnScreenshareOff", "turnScreenshareOn", "isAction", "map", "key", "defaultButtonProps", "parent", "setRaisedHand", "displayName", "size", "iconOnly", "CallRoot", "children", "React", "div", "className", "displayName", "CallAudio", "_props", "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", "React", "useLayoutEffect", "useMemo", "useRef", "useState", "ScrollArea", "useThemeContext", "useTranslation", "MessageTextbox", "Thread", "ThreadComponent", "threadLayout", "createBasicExtensions", "createThemeExtensions", "listener", "composable", "composableProps", "mx", "isNonNullable", "meta", "EditorView", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "AppSurface", "Ref", "useObject", "PublicKey", "useIdentity", "IconButton", "useOnTransition", "useThemeContext", "useTranslation", "Card", "useTextEditor", "MessageHeading", "MessageRoot", "createBasicExtensions", "createThemeExtensions", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "useOnEditAnalytics", "meta", "buttonGroupClassNames", "buttonClassNames", "MessagePanel", "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", "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", "AppSurface", "limit", "data", "fallback", "Chat", "composable", "id", "identity", "members", "messages", "activity", "onSend", "autoFocusTextbox", "current", "orientation", "readOnly", "props", "forwardedRef", "t", "useTranslation", "meta", "themeMode", "useThemeContext", "scrollRef", "useRef", "sentinelRef", "autoFocus", "setAutoFocus", "useState", "_count", "_setCount", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleSend", "length", "accepted", "count", "filteredMessages", "filter", "isNonNullable", "renderState", "React", "ChannelLayout", "composableProps", "classNames", "ref", "state", "ThreadLayout", "forwardRef", "ThreadComponent", "Root", "ScrollArea", "Viewport", "div", "className", "mx", "threadLayout", "map", "message", "MessagePanel", "key", "MessageTextbox", "Status", "React", "useEffect", "Obj", "Relation", "Icon", "Message", "Trans", "useTranslation", "meta", "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", "useStatus", "meta", "CommentsThread", "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", "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", "MessagePanel", "key", "dxn", "editable", "message", "onDelete", "MessageTextbox", "onSend", "Status", "CommentsPanel", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "meta", "id", "filteredAnchors", "filter", "anchor", "Relation", "getSource", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "React", "div", "className", "Message", "Root", "Content", "Trans", "i18nKey", "components", "commentIcon", "Icon", "icon", "size", "classNames", "map", "threadId", "Obj", "getDXN", "toString", "CommentsThread", "key", "current", "ThreadSettings", "lazy"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import "../chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/containers/index.ts
|
|
4
|
+
import { lazy } from "react";
|
|
5
|
+
var CallDebugPanel = lazy(() => import("../CallDebugPanel-CXWTCS7A.mjs"));
|
|
6
|
+
var CallSidebar = lazy(() => import("../CallSidebar-YVXU6BOQ.mjs"));
|
|
7
|
+
var ChannelChat = lazy(() => import("../ChannelChat-EKQYQQXZ.mjs"));
|
|
8
|
+
var ChannelContainer = lazy(() => import("../ChannelContainer-XXMX5X43.mjs"));
|
|
9
|
+
var ThreadContainer = lazy(() => import("../ThreadContainer-XYEPEOSD.mjs"));
|
|
10
|
+
var ThreadCompanion = lazy(() => import("../ThreadCompanion-YGA2ORTJ.mjs"));
|
|
11
|
+
export {
|
|
12
|
+
CallDebugPanel,
|
|
13
|
+
CallSidebar,
|
|
14
|
+
ChannelChat,
|
|
15
|
+
ChannelContainer,
|
|
16
|
+
ThreadCompanion,
|
|
17
|
+
ThreadContainer
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/containers/index.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { type ComponentType, lazy } from 'react';\n\nexport const CallDebugPanel: ComponentType<any> = lazy(() => import('./CallDebugPanel'));\nexport const CallSidebar: ComponentType<any> = lazy(() => import('./CallSidebar'));\nexport const ChannelChat: ComponentType<any> = lazy(() => import('./ChannelChat'));\nexport const ChannelContainer: ComponentType<any> = lazy(() => import('./ChannelContainer'));\nexport const ThreadContainer: ComponentType<any> = lazy(() => import('./ThreadContainer'));\nexport const ThreadCompanion: ComponentType<any> = lazy(() => import('./ThreadCompanion'));\n"],
|
|
5
|
+
"mappings": ";;;AAIA,SAA6BA,YAAY;AAElC,IAAMC,iBAAqCD,KAAK,MAAM,OAAO,gCAAA,CAAA;AAC7D,IAAME,cAAkCF,KAAK,MAAM,OAAO,6BAAA,CAAA;AAC1D,IAAMG,cAAkCH,KAAK,MAAM,OAAO,6BAAA,CAAA;AAC1D,IAAMI,mBAAuCJ,KAAK,MAAM,OAAO,kCAAA,CAAA;AAC/D,IAAMK,kBAAsCL,KAAK,MAAM,OAAO,iCAAA,CAAA;AAC9D,IAAMM,kBAAsCN,KAAK,MAAM,OAAO,iCAAA,CAAA;",
|
|
6
|
+
"names": ["lazy", "CallDebugPanel", "CallSidebar", "ChannelChat", "ChannelContainer", "ThreadContainer", "ThreadCompanion"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ThreadCapabilities_exports,
|
|
3
|
+
ThreadOperation_exports
|
|
4
|
+
} from "./chunk-BFHJWC3L.mjs";
|
|
5
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
6
|
+
|
|
7
|
+
// src/operations/create.ts
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
10
|
+
import { LayoutOperation } from "@dxos/app-toolkit";
|
|
11
|
+
import { Operation } from "@dxos/compute";
|
|
12
|
+
import { Obj, Relation } from "@dxos/echo";
|
|
13
|
+
import { linkedSegment } from "@dxos/react-ui-attention";
|
|
14
|
+
import { AnchoredTo, Thread } from "@dxos/types";
|
|
15
|
+
var handler = ThreadOperation_exports.Create.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ name, anchor: _anchor, subject }) {
|
|
16
|
+
const registry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
17
|
+
const stateAtom = yield* Capability.get(ThreadCapabilities_exports.State);
|
|
18
|
+
const subjectId = Obj.getDXN(subject).toString();
|
|
19
|
+
const thread = Thread.make({
|
|
20
|
+
name
|
|
21
|
+
});
|
|
22
|
+
const anchor = Relation.make(AnchoredTo.AnchoredTo, {
|
|
23
|
+
[Relation.Source]: thread,
|
|
24
|
+
[Relation.Target]: subject,
|
|
25
|
+
anchor: _anchor
|
|
26
|
+
});
|
|
27
|
+
const state = registry.get(stateAtom);
|
|
28
|
+
const existingDrafts = state.drafts[subjectId];
|
|
29
|
+
registry.set(stateAtom, {
|
|
30
|
+
...state,
|
|
31
|
+
drafts: {
|
|
32
|
+
...state.drafts,
|
|
33
|
+
[subjectId]: existingDrafts ? [
|
|
34
|
+
...existingDrafts,
|
|
35
|
+
anchor
|
|
36
|
+
] : [
|
|
37
|
+
anchor
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
yield* Operation.invoke(ThreadOperation_exports.Select, {
|
|
42
|
+
current: Obj.getDXN(thread).toString()
|
|
43
|
+
});
|
|
44
|
+
yield* Operation.invoke(LayoutOperation.UpdateCompanion, {
|
|
45
|
+
subject: linkedSegment("comments")
|
|
46
|
+
});
|
|
47
|
+
})));
|
|
48
|
+
var create_default = handler;
|
|
49
|
+
export {
|
|
50
|
+
create_default as default
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=create-DGJZRLG7.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/create.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { LayoutOperation } from '@dxos/app-toolkit';\nimport { Operation } from '@dxos/compute';\nimport { Obj, Relation } from '@dxos/echo';\nimport { linkedSegment } from '@dxos/react-ui-attention';\nimport { AnchoredTo, Thread } from '@dxos/types';\n\nimport { ThreadCapabilities } from '../types';\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.Create> = ThreadOperation.Create.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ name, anchor: _anchor, subject }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const stateAtom = yield* Capability.get(ThreadCapabilities.State);\n const subjectId = Obj.getDXN(subject).toString();\n const thread = Thread.make({ name });\n const anchor = Relation.make(AnchoredTo.AnchoredTo, {\n [Relation.Source]: thread,\n [Relation.Target]: subject,\n anchor: _anchor,\n });\n\n const state = registry.get(stateAtom);\n const existingDrafts = state.drafts[subjectId];\n registry.set(stateAtom, {\n ...state,\n drafts: {\n ...state.drafts,\n [subjectId]: existingDrafts ? [...existingDrafts, anchor] : [anchor],\n },\n });\n\n yield* Operation.invoke(ThreadOperation.Select, { current: Obj.getDXN(thread).toString() });\n yield* Operation.invoke(LayoutOperation.UpdateCompanion, {\n subject: linkedSegment('comments'),\n });\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
+
"mappings": ";;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,uBAAuB;AAChC,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,gBAAgB;AAC9B,SAASC,qBAAqB;AAC9B,SAASC,YAAYC,cAAc;AAKnC,IAAMC,UAAgEC,wBAAgBC,OAAOC,KAC3FC,UAAUC,YACDC,kBAAW,WAAW,EAAEC,MAAMC,QAAQC,SAASC,QAAO,GAAE;AAC7D,QAAMC,WAAW,OAAOC,WAAWC,IAAIC,aAAaC,YAAY;AAChE,QAAMC,YAAY,OAAOJ,WAAWC,IAAII,2BAAmBC,KAAK;AAChE,QAAMC,YAAYC,IAAIC,OAAOX,OAAAA,EAASY,SAAQ;AAC9C,QAAMC,SAASC,OAAOC,KAAK;IAAElB;EAAK,CAAA;AAClC,QAAMC,SAASkB,SAASD,KAAKE,WAAWA,YAAY;IAClD,CAACD,SAASE,MAAM,GAAGL;IACnB,CAACG,SAASG,MAAM,GAAGnB;IACnBF,QAAQC;EACV,CAAA;AAEA,QAAMqB,QAAQnB,SAASE,IAAIG,SAAAA;AAC3B,QAAMe,iBAAiBD,MAAME,OAAOb,SAAAA;AACpCR,WAASsB,IAAIjB,WAAW;IACtB,GAAGc;IACHE,QAAQ;MACN,GAAGF,MAAME;MACT,CAACb,SAAAA,GAAYY,iBAAiB;WAAIA;QAAgBvB;UAAU;QAACA;;IAC/D;EACF,CAAA;AAEA,SAAOJ,UAAU8B,OAAOjC,wBAAgBkC,QAAQ;IAAEC,SAAShB,IAAIC,OAAOE,MAAAA,EAAQD,SAAQ;EAAG,CAAA;AACzF,SAAOlB,UAAU8B,OAAOG,gBAAgBC,iBAAiB;IACvD5B,SAAS6B,cAAc,UAAA;EACzB,CAAA;AACF,CAAA,CAAA,CAAA;AAIJ,IAAA,iBAAevC;",
|
|
6
|
+
"names": ["Effect", "Capabilities", "Capability", "LayoutOperation", "Operation", "Obj", "Relation", "linkedSegment", "AnchoredTo", "Thread", "handler", "ThreadOperation", "Create", "pipe", "Operation", "withHandler", "fnUntraced", "name", "anchor", "_anchor", "subject", "registry", "Capability", "get", "Capabilities", "AtomRegistry", "stateAtom", "ThreadCapabilities", "State", "subjectId", "Obj", "getDXN", "toString", "thread", "Thread", "make", "Relation", "AnchoredTo", "Source", "Target", "state", "existingDrafts", "drafts", "set", "invoke", "Select", "current", "LayoutOperation", "UpdateCompanion", "linkedSegment"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ThreadOperation_exports
|
|
3
|
+
} from "./chunk-BFHJWC3L.mjs";
|
|
4
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
5
|
+
|
|
6
|
+
// src/operations/create-channel.ts
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import { Operation } from "@dxos/compute";
|
|
9
|
+
import { Channel } from "@dxos/types";
|
|
10
|
+
var handler = ThreadOperation_exports.CreateChannel.pipe(Operation.withHandler((input) => Effect.sync(() => ({
|
|
11
|
+
object: Channel.make({
|
|
12
|
+
name: input.name
|
|
13
|
+
})
|
|
14
|
+
}))));
|
|
15
|
+
var create_channel_default = handler;
|
|
16
|
+
export {
|
|
17
|
+
create_channel_default as default
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=create-channel-RP646IAE.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/create-channel.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Operation } from '@dxos/compute';\nimport { Channel } from '@dxos/types';\n\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.CreateChannel> = ThreadOperation.CreateChannel.pipe(\n Operation.withHandler((input) =>\n Effect.sync(() => ({\n object: Channel.make({ name: input.name }),\n })),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,iBAAiB;AAC1B,SAASC,eAAe;AAIxB,IAAMC,UAAuEC,wBAAgBC,cAAcC,KACzGC,UAAUC,YAAY,CAACC,UACdC,YAAK,OAAO;EACjBC,QAAQC,QAAQC,KAAK;IAAEC,MAAML,MAAMK;EAAK,CAAA;AAC1C,EAAA,CAAA,CAAA;AAIJ,IAAA,yBAAeX;",
|
|
6
|
+
"names": ["Effect", "Operation", "Channel", "handler", "ThreadOperation", "CreateChannel", "pipe", "Operation", "withHandler", "input", "sync", "object", "Channel", "make", "name"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
2
|
+
|
|
3
|
+
// src/capabilities/create-object.ts
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { Capability } from "@dxos/app-framework";
|
|
6
|
+
import { Operation } from "@dxos/compute";
|
|
7
|
+
import { SpaceOperation } from "@dxos/plugin-space";
|
|
8
|
+
import { SpaceCapabilities } from "@dxos/plugin-space";
|
|
9
|
+
import { Channel } from "@dxos/types";
|
|
10
|
+
var create_object_default = Capability.makeModule(Effect.fnUntraced(function* () {
|
|
11
|
+
return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {
|
|
12
|
+
id: Channel.Channel.typename,
|
|
13
|
+
createObject: (props, options) => Effect.gen(function* () {
|
|
14
|
+
const object = Channel.make(props);
|
|
15
|
+
return yield* Operation.invoke(SpaceOperation.AddObject, {
|
|
16
|
+
object,
|
|
17
|
+
target: options.target,
|
|
18
|
+
hidden: true,
|
|
19
|
+
targetNodeId: options.targetNodeId
|
|
20
|
+
});
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
}));
|
|
24
|
+
export {
|
|
25
|
+
create_object_default as default
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=create-object-HIEWSBZB.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/capabilities/create-object.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capability } from '@dxos/app-framework';\nimport { Operation } from '@dxos/compute';\nimport { SpaceOperation } from '@dxos/plugin-space';\nimport { SpaceCapabilities } from '@dxos/plugin-space';\nimport { Channel } from '@dxos/types';\n\nexport default Capability.makeModule(\n Effect.fnUntraced(function* () {\n return Capability.contributes(SpaceCapabilities.CreateObjectEntry, {\n id: Channel.Channel.typename,\n createObject: (props, options) =>\n Effect.gen(function* () {\n const object = Channel.make(props);\n return yield* Operation.invoke(SpaceOperation.AddObject, {\n object,\n target: options.target,\n hidden: true,\n targetNodeId: options.targetNodeId,\n });\n }),\n });\n }),\n);\n"],
|
|
5
|
+
"mappings": ";;;AAIA,YAAYA,YAAY;AAExB,SAASC,kBAAkB;AAC3B,SAASC,iBAAiB;AAC1B,SAASC,sBAAsB;AAC/B,SAASC,yBAAyB;AAClC,SAASC,eAAe;AAExB,IAAA,wBAAeJ,WAAWK,WACjBC,kBAAW,aAAA;AAChB,SAAON,WAAWO,YAAYJ,kBAAkBK,mBAAmB;IACjEC,IAAIL,QAAQA,QAAQM;IACpBC,cAAc,CAACC,OAAOC,YACbC,WAAI,aAAA;AACT,YAAMC,SAASX,QAAQY,KAAKJ,KAAAA;AAC5B,aAAO,OAAOX,UAAUgB,OAAOf,eAAegB,WAAW;QACvDH;QACAI,QAAQN,QAAQM;QAChBC,QAAQ;QACRC,cAAcR,QAAQQ;MACxB,CAAA;IACF,CAAA;EACJ,CAAA;AACF,CAAA,CAAA;",
|
|
6
|
+
"names": ["Effect", "Capability", "Operation", "SpaceOperation", "SpaceCapabilities", "Channel", "makeModule", "fnUntraced", "contributes", "CreateObjectEntry", "id", "typename", "createObject", "props", "options", "gen", "object", "make", "invoke", "AddObject", "target", "hidden", "targetNodeId"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ThreadOperation_exports
|
|
3
|
+
} from "./chunk-BFHJWC3L.mjs";
|
|
4
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
5
|
+
|
|
6
|
+
// src/operations/create-proposals.ts
|
|
7
|
+
import * as Array from "effect/Array";
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import * as Function from "effect/Function";
|
|
10
|
+
import { computeDiffsWithCursors } from "@dxos/assistant";
|
|
11
|
+
import { Operation } from "@dxos/compute";
|
|
12
|
+
import { Database, Obj, Ref, Relation } from "@dxos/echo";
|
|
13
|
+
import { createDocAccessor } from "@dxos/echo-db";
|
|
14
|
+
import { AnchoredTo, Message, Thread } from "@dxos/types";
|
|
15
|
+
var handler = ThreadOperation_exports.CreateProposals.pipe(Operation.withHandler(Effect.fn(function* ({ doc, diffs }) {
|
|
16
|
+
const object = yield* Database.load(doc);
|
|
17
|
+
const content = yield* Effect.promise(() => object.content.load());
|
|
18
|
+
const accessor = createDocAccessor(content, [
|
|
19
|
+
"content"
|
|
20
|
+
]);
|
|
21
|
+
yield* Function.pipe(computeDiffsWithCursors(accessor, diffs), Array.map(Effect.fnUntraced(function* ({ cursor, text }) {
|
|
22
|
+
const proposal = Obj.make(Message.Message, {
|
|
23
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
24
|
+
sender: {
|
|
25
|
+
role: "assistant"
|
|
26
|
+
},
|
|
27
|
+
blocks: [
|
|
28
|
+
{
|
|
29
|
+
_tag: "proposal",
|
|
30
|
+
text
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
});
|
|
34
|
+
const thread = Thread.make({
|
|
35
|
+
name: "Proposal",
|
|
36
|
+
messages: [
|
|
37
|
+
Ref.make(proposal)
|
|
38
|
+
],
|
|
39
|
+
status: "active"
|
|
40
|
+
});
|
|
41
|
+
const relation = Relation.make(AnchoredTo.AnchoredTo, {
|
|
42
|
+
[Relation.Source]: thread,
|
|
43
|
+
[Relation.Target]: object,
|
|
44
|
+
anchor: cursor
|
|
45
|
+
});
|
|
46
|
+
yield* Database.add(thread);
|
|
47
|
+
yield* Database.add(relation);
|
|
48
|
+
})), Effect.allWith({
|
|
49
|
+
concurrency: "unbounded"
|
|
50
|
+
}));
|
|
51
|
+
})));
|
|
52
|
+
var create_proposals_default = handler;
|
|
53
|
+
export {
|
|
54
|
+
create_proposals_default as default
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=create-proposals-CPLU4YC6.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/create-proposals.ts"],
|
|
4
|
+
"sourcesContent": ["//\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';\n\nimport { computeDiffsWithCursors } from '@dxos/assistant';\nimport { Operation } from '@dxos/compute';\nimport { Database, Obj, Ref, Relation } from '@dxos/echo';\nimport { createDocAccessor } from '@dxos/echo-db';\nimport { AnchoredTo, Message, Thread } from '@dxos/types';\n\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.CreateProposals> = ThreadOperation.CreateProposals.pipe(\n Operation.withHandler(\n Effect.fn(function* ({ doc, diffs }) {\n const object = yield* Database.load(doc);\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.add(thread);\n yield* Database.add(relation);\n }),\n ),\n Effect.allWith({ concurrency: 'unbounded' }),\n );\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
+
"mappings": ";;;;;;AAIA,YAAYA,WAAW;AACvB,YAAYC,YAAY;AACxB,YAAYC,cAAc;AAE1B,SAASC,+BAA+B;AACxC,SAASC,iBAAiB;AAC1B,SAASC,UAAUC,KAAKC,KAAKC,gBAAgB;AAC7C,SAASC,yBAAyB;AAClC,SAASC,YAAYC,SAASC,cAAc;AAI5C,IAAMC,UAAyEC,wBAAgBC,gBAAgBC,KAC7GC,UAAUC,YACDC,UAAG,WAAW,EAAEC,KAAKC,MAAK,GAAE;AACjC,QAAMC,SAAS,OAAOC,SAASC,KAAKJ,GAAAA;AACpC,QAAMK,UAAU,OAAcC,eAAQ,MAAMJ,OAAOG,QAAQD,KAAI,CAAA;AAC/D,QAAMG,WAAWC,kBAAkBH,SAAS;IAAC;GAAU;AAEvD,SAAgBT,cACda,wBAAwBF,UAAUN,KAAAA,GAC5BS,UACGC,kBAAW,WAAW,EAAEC,QAAQC,KAAI,GAAE;AAC3C,UAAMC,WAAWC,IAAIC,KAAKC,QAAQA,SAAS;MACzCC,UAAS,oBAAIC,KAAAA,GAAOC,YAAW;MAC/BC,QAAQ;QAAEC,MAAM;MAAY;MAC5BC,QAAQ;QAAC;UAAEC,MAAM;UAAYX;QAAK;;IACpC,CAAA;AACA,UAAMY,SAASC,OAAOV,KAAK;MAAEW,MAAM;MAAYC,UAAU;QAACC,IAAIb,KAAKF,QAAAA;;MAAYgB,QAAQ;IAAS,CAAA;AAChG,UAAMC,WAAWC,SAAShB,KAAKiB,WAAWA,YAAY;MACpD,CAACD,SAASE,MAAM,GAAGT;MACnB,CAACO,SAASG,MAAM,GAAGjC;MACnBkC,QAAQxB;IACV,CAAA;AACA,WAAOT,SAASkC,IAAIZ,MAAAA;AACpB,WAAOtB,SAASkC,IAAIN,QAAAA;EACtB,CAAA,CAAA,GAEKO,eAAQ;IAAEC,aAAa;EAAY,CAAA,CAAA;AAE9C,CAAA,CAAA,CAAA;AAIJ,IAAA,2BAAe9C;",
|
|
6
|
+
"names": ["Array", "Effect", "Function", "computeDiffsWithCursors", "Operation", "Database", "Obj", "Ref", "Relation", "createDocAccessor", "AnchoredTo", "Message", "Thread", "handler", "ThreadOperation", "CreateProposals", "pipe", "Operation", "withHandler", "fn", "doc", "diffs", "object", "Database", "load", "content", "promise", "accessor", "createDocAccessor", "computeDiffsWithCursors", "map", "fnUntraced", "cursor", "text", "proposal", "Obj", "make", "Message", "created", "Date", "toISOString", "sender", "role", "blocks", "_tag", "thread", "Thread", "name", "messages", "Ref", "status", "relation", "Relation", "AnchoredTo", "Source", "Target", "anchor", "add", "allWith", "concurrency"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ThreadCapabilities_exports,
|
|
3
|
+
ThreadOperation_exports
|
|
4
|
+
} from "./chunk-BFHJWC3L.mjs";
|
|
5
|
+
import "./chunk-J5LGTIGS.mjs";
|
|
6
|
+
|
|
7
|
+
// src/operations/delete.ts
|
|
8
|
+
import * as Effect from "effect/Effect";
|
|
9
|
+
import { Capabilities, Capability } from "@dxos/app-framework";
|
|
10
|
+
import { sleep } from "@dxos/async";
|
|
11
|
+
import { Operation } from "@dxos/compute";
|
|
12
|
+
import { Obj, Relation } from "@dxos/echo";
|
|
13
|
+
import { ObservabilityOperation } from "@dxos/plugin-observability";
|
|
14
|
+
var handler = ThreadOperation_exports.Delete.pipe(Operation.withHandler(Effect.fnUntraced(function* ({ subject, anchor, thread: _thread }) {
|
|
15
|
+
const registry = yield* Capability.get(Capabilities.AtomRegistry);
|
|
16
|
+
const stateAtom = yield* Capability.get(ThreadCapabilities_exports.State);
|
|
17
|
+
const thread = _thread ?? Relation.getSource(anchor);
|
|
18
|
+
const subjectId = Obj.getDXN(subject).toString();
|
|
19
|
+
const state = registry.get(stateAtom);
|
|
20
|
+
const draft = state.drafts[subjectId];
|
|
21
|
+
if (draft) {
|
|
22
|
+
const index = draft.findIndex((a) => a.id === anchor.id);
|
|
23
|
+
if (index !== -1) {
|
|
24
|
+
registry.set(stateAtom, {
|
|
25
|
+
...state,
|
|
26
|
+
drafts: {
|
|
27
|
+
...state.drafts,
|
|
28
|
+
[subjectId]: state.drafts[subjectId]?.filter((_, i) => i !== index)
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const db = Obj.getDatabase(thread);
|
|
35
|
+
if (!db) {
|
|
36
|
+
return {};
|
|
37
|
+
}
|
|
38
|
+
db.remove(anchor);
|
|
39
|
+
yield* Effect.promise(() => sleep(100));
|
|
40
|
+
db.remove(thread);
|
|
41
|
+
yield* Operation.schedule(ObservabilityOperation.SendEvent, {
|
|
42
|
+
name: "threads.delete",
|
|
43
|
+
properties: {
|
|
44
|
+
spaceId: db.spaceId,
|
|
45
|
+
threadId: thread.id
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
thread,
|
|
50
|
+
anchor
|
|
51
|
+
};
|
|
52
|
+
})));
|
|
53
|
+
var delete_default = handler;
|
|
54
|
+
export {
|
|
55
|
+
delete_default as default
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=delete-MKKME2FE.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/operations/delete.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport * as Effect from 'effect/Effect';\n\nimport { Capabilities, Capability } from '@dxos/app-framework';\nimport { sleep } from '@dxos/async';\nimport { Operation } from '@dxos/compute';\nimport { Obj, Relation } from '@dxos/echo';\nimport { ObservabilityOperation } from '@dxos/plugin-observability';\nimport { Thread } from '@dxos/types';\n\nimport { ThreadCapabilities } from '../types';\nimport { ThreadOperation } from '../types';\n\nconst handler: Operation.WithHandler<typeof ThreadOperation.Delete> = ThreadOperation.Delete.pipe(\n Operation.withHandler(\n Effect.fnUntraced(function* ({ subject, anchor, thread: _thread }) {\n const registry = yield* Capability.get(Capabilities.AtomRegistry);\n const stateAtom = yield* Capability.get(ThreadCapabilities.State);\n const thread = _thread ?? (Relation.getSource(anchor) as Thread.Thread);\n const subjectId = Obj.getDXN(subject).toString();\n const state = registry.get(stateAtom);\n const draft = state.drafts[subjectId];\n if (draft) {\n const index = draft.findIndex((a: { id: string }) => a.id === anchor.id);\n if (index !== -1) {\n registry.set(stateAtom, {\n ...state,\n drafts: {\n ...state.drafts,\n [subjectId]: state.drafts[subjectId]?.filter((_, i) => i !== index),\n },\n });\n return {};\n }\n }\n\n const db = Obj.getDatabase(thread);\n if (!db) {\n return {};\n }\n\n // TODO(wittjosiah): Without sleep, rendering crashes at `Relation.setSource(anchor)`.\n db.remove(anchor);\n yield* Effect.promise(() => sleep(100));\n db.remove(thread);\n\n yield* Operation.schedule(ObservabilityOperation.SendEvent, {\n name: 'threads.delete',\n properties: {\n spaceId: db.spaceId,\n threadId: thread.id,\n },\n });\n\n return { thread, anchor };\n }),\n ),\n);\n\nexport default handler;\n"],
|
|
5
|
+
"mappings": ";;;;;;;AAIA,YAAYA,YAAY;AAExB,SAASC,cAAcC,kBAAkB;AACzC,SAASC,aAAa;AACtB,SAASC,iBAAiB;AAC1B,SAASC,KAAKC,gBAAgB;AAC9B,SAASC,8BAA8B;AAMvC,IAAMC,UAAgEC,wBAAgBC,OAAOC,KAC3FC,UAAUC,YACDC,kBAAW,WAAW,EAAEC,SAASC,QAAQC,QAAQC,QAAO,GAAE;AAC/D,QAAMC,WAAW,OAAOC,WAAWC,IAAIC,aAAaC,YAAY;AAChE,QAAMC,YAAY,OAAOJ,WAAWC,IAAII,2BAAmBC,KAAK;AAChE,QAAMT,SAASC,WAAYS,SAASC,UAAUZ,MAAAA;AAC9C,QAAMa,YAAYC,IAAIC,OAAOhB,OAAAA,EAASiB,SAAQ;AAC9C,QAAMC,QAAQd,SAASE,IAAIG,SAAAA;AAC3B,QAAMU,QAAQD,MAAME,OAAON,SAAAA;AAC3B,MAAIK,OAAO;AACT,UAAME,QAAQF,MAAMG,UAAU,CAACC,MAAsBA,EAAEC,OAAOvB,OAAOuB,EAAE;AACvE,QAAIH,UAAU,IAAI;AAChBjB,eAASqB,IAAIhB,WAAW;QACtB,GAAGS;QACHE,QAAQ;UACN,GAAGF,MAAME;UACT,CAACN,SAAAA,GAAYI,MAAME,OAAON,SAAAA,GAAYY,OAAO,CAACC,GAAGC,MAAMA,MAAMP,KAAAA;QAC/D;MACF,CAAA;AACA,aAAO,CAAC;IACV;EACF;AAEA,QAAMQ,KAAKd,IAAIe,YAAY5B,MAAAA;AAC3B,MAAI,CAAC2B,IAAI;AACP,WAAO,CAAC;EACV;AAGAA,KAAGE,OAAO9B,MAAAA;AACV,SAAc+B,eAAQ,MAAMC,MAAM,GAAA,CAAA;AAClCJ,KAAGE,OAAO7B,MAAAA;AAEV,SAAOL,UAAUqC,SAASC,uBAAuBC,WAAW;IAC1DC,MAAM;IACNC,YAAY;MACVC,SAASV,GAAGU;MACZC,UAAUtC,OAAOsB;IACnB;EACF,CAAA;AAEA,SAAO;IAAEtB;IAAQD;EAAO;AAC1B,CAAA,CAAA,CAAA;AAIJ,IAAA,iBAAeR;",
|
|
6
|
+
"names": ["Effect", "Capabilities", "Capability", "sleep", "Operation", "Obj", "Relation", "ObservabilityOperation", "handler", "ThreadOperation", "Delete", "pipe", "Operation", "withHandler", "fnUntraced", "subject", "anchor", "thread", "_thread", "registry", "Capability", "get", "Capabilities", "AtomRegistry", "stateAtom", "ThreadCapabilities", "State", "Relation", "getSource", "subjectId", "Obj", "getDXN", "toString", "state", "draft", "drafts", "index", "findIndex", "a", "id", "set", "filter", "_", "i", "db", "getDatabase", "remove", "promise", "sleep", "schedule", "ObservabilityOperation", "SendEvent", "name", "properties", "spaceId", "threadId"]
|
|
7
|
+
}
|