@dxos/plugin-thread 0.8.4-main.c85a9c8dae → 0.8.4-main.d9fc60f731
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/LICENSE +102 -5
- package/PLUGIN.mdl +271 -0
- package/README.md +1 -1
- package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs +28 -0
- package/dist/lib/neutral/ChannelArticle-UJHPOUWA.mjs.map +7 -0
- package/dist/lib/neutral/ChannelChat-LZEDFJVD.mjs +10 -0
- package/dist/lib/{browser/ThreadCompanion-2CMLJH76.mjs → neutral/CommentsCompanion-FOUIGCEK.mjs} +59 -55
- package/dist/lib/neutral/CommentsCompanion-FOUIGCEK.mjs.map +7 -0
- package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs +61 -0
- package/dist/lib/neutral/ThreadContainer-QWB6WRMI.mjs.map +7 -0
- package/dist/lib/neutral/ThreadPlugin.mjs +109 -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/ThreadPlugin.workerd.mjs +24 -0
- package/dist/lib/neutral/ThreadPlugin.workerd.mjs.map +7 -0
- package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs +15 -0
- package/dist/lib/neutral/ThreadSettings-5MKTDK3A.mjs.map +7 -0
- package/dist/lib/neutral/add-message-RDIABSIX.mjs +122 -0
- package/dist/lib/neutral/add-message-RDIABSIX.mjs.map +7 -0
- package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs +244 -0
- package/dist/lib/neutral/agent-runner-RB7N5HLD.mjs.map +7 -0
- package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs +120 -0
- package/dist/lib/neutral/app-graph-builder-PDLRFYSI.mjs.map +7 -0
- package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs +40 -0
- package/dist/lib/neutral/append-channel-message-TBBQUVMH.mjs.map +7 -0
- package/dist/lib/{browser/blueprint-definition-42M2EJ2Y.mjs → neutral/blueprint-definition-S3EBOH4R.mjs} +4 -6
- package/dist/lib/neutral/blueprint-definition-S3EBOH4R.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/blueprints/index.mjs +1 -1
- package/dist/lib/neutral/capabilities/index.mjs +27 -0
- package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
- package/dist/lib/neutral/chunk-35GUWXBB.mjs +48 -0
- package/dist/lib/neutral/chunk-35GUWXBB.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-BHEZLLXG.mjs +55 -0
- package/dist/lib/neutral/chunk-BHEZLLXG.mjs.map +7 -0
- package/dist/lib/{browser/markdown-GRRPCZHJ.mjs → neutral/chunk-HQZWTDJC.mjs} +48 -94
- package/dist/lib/neutral/chunk-HQZWTDJC.mjs.map +7 -0
- package/dist/lib/neutral/chunk-IQBZZAMX.mjs +335 -0
- package/dist/lib/neutral/chunk-IQBZZAMX.mjs.map +7 -0
- package/dist/lib/neutral/chunk-JJETHBAZ.mjs +8 -0
- package/dist/lib/neutral/chunk-JJETHBAZ.mjs.map +7 -0
- package/dist/lib/{node-esm/chunk-ABUFOZVX.mjs → neutral/chunk-JLY4NVTA.mjs} +12 -7
- package/dist/lib/neutral/chunk-JLY4NVTA.mjs.map +7 -0
- package/dist/lib/neutral/chunk-QFDT33VT.mjs +69 -0
- package/dist/lib/neutral/chunk-QFDT33VT.mjs.map +7 -0
- package/dist/lib/neutral/components/index.mjs +541 -0
- package/dist/lib/neutral/components/index.mjs.map +7 -0
- package/dist/lib/neutral/containers/index.mjs +15 -0
- package/dist/lib/neutral/containers/index.mjs.map +7 -0
- package/dist/lib/neutral/create-VXM6HJMN.mjs +61 -0
- package/dist/lib/neutral/create-VXM6HJMN.mjs.map +7 -0
- package/dist/lib/neutral/create-channel-FSJOMRHF.mjs +19 -0
- package/dist/lib/neutral/create-channel-FSJOMRHF.mjs.map +7 -0
- package/dist/lib/neutral/create-object-D5XEG7MQ.mjs +28 -0
- package/dist/lib/neutral/create-object-D5XEG7MQ.mjs.map +7 -0
- package/dist/lib/neutral/create-proposals-ILYIYJEN.mjs +56 -0
- package/dist/lib/neutral/create-proposals-ILYIYJEN.mjs.map +7 -0
- package/dist/lib/neutral/delete-6KZERY6K.mjs +57 -0
- package/dist/lib/neutral/delete-6KZERY6K.mjs.map +7 -0
- package/dist/lib/neutral/delete-message-PATSHW36.mjs +54 -0
- package/dist/lib/neutral/delete-message-PATSHW36.mjs.map +7 -0
- package/dist/lib/neutral/hooks/index.mjs +10 -0
- package/dist/lib/neutral/index.mjs +32 -0
- package/dist/lib/neutral/markdown-5UHAAC5Z.mjs +83 -0
- package/dist/lib/neutral/markdown-5UHAAC5Z.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/neutral/meta.mjs +10 -0
- package/dist/lib/neutral/on-create-space-6NLTBGGD.mjs +23 -0
- package/dist/lib/neutral/on-create-space-6NLTBGGD.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/plugin.mjs +16 -0
- package/dist/lib/neutral/plugin.mjs.map +7 -0
- package/dist/lib/neutral/react-surface-TUMXARMI.mjs +76 -0
- package/dist/lib/neutral/react-surface-TUMXARMI.mjs.map +7 -0
- package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs +32 -0
- package/dist/lib/neutral/respond-to-thread-ROQA3B6U.mjs.map +7 -0
- package/dist/lib/neutral/restore-SP4HADCE.mjs +32 -0
- package/dist/lib/neutral/restore-SP4HADCE.mjs.map +7 -0
- package/dist/lib/neutral/restore-message-TVIC66VL.mjs +33 -0
- package/dist/lib/neutral/restore-message-TVIC66VL.mjs.map +7 -0
- package/dist/lib/neutral/select-DLHPEKEA.mjs +24 -0
- package/dist/lib/neutral/select-DLHPEKEA.mjs.map +7 -0
- package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs +20 -0
- package/dist/lib/neutral/set-agent-config-7GEYCG7Y.mjs.map +7 -0
- package/dist/lib/{browser/settings-Y75FG6XR.mjs → neutral/settings-HK4EB6TF.mjs} +6 -11
- package/dist/lib/neutral/settings-HK4EB6TF.mjs.map +7 -0
- package/dist/lib/{browser/state-OBTMMEUZ.mjs → neutral/state-UU7VEAKV.mjs} +3 -6
- 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-GMAD3SZ2.mjs +36 -0
- package/dist/lib/neutral/toggle-resolved-GMAD3SZ2.mjs.map +7 -0
- package/dist/lib/neutral/translations.mjs +91 -0
- package/dist/lib/neutral/translations.mjs.map +7 -0
- package/dist/lib/neutral/types/index.mjs +16 -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 +1 -0
- 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/ThreadPlugin.workerd.d.ts +4 -0
- package/dist/types/src/ThreadPlugin.workerd.d.ts.map +1 -0
- package/dist/types/src/blueprints/thread-blueprint.d.ts +2 -2
- package/dist/types/src/blueprints/thread-blueprint.d.ts.map +1 -1
- package/dist/types/src/capabilities/agent-runner.d.ts +22 -0
- package/dist/types/src/capabilities/agent-runner.d.ts.map +1 -0
- package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
- 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/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 +17 -10
- package/dist/types/src/capabilities/index.d.ts.map +1 -1
- package/dist/types/src/capabilities/markdown.d.ts.map +1 -0
- 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-surface.d.ts.map +1 -0
- package/dist/types/src/capabilities/{settings/settings.d.ts → settings.d.ts} +2 -1
- package/dist/types/src/capabilities/settings.d.ts.map +1 -0
- package/dist/types/src/capabilities/{state/state.d.ts → state.d.ts} +1 -1
- package/dist/types/src/capabilities/state.d.ts.map +1 -0
- 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/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/{CommentsThreadContainer.d.ts → CommentsPanel/CommentsThread.d.ts} +3 -3
- 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/{MessageContainer.d.ts → MessagePanel/MessagePanel.d.ts} +3 -3
- 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/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 -4
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts +13 -0
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts +162 -0
- package/dist/types/src/containers/ChannelArticle/ChannelArticle.stories.d.ts.map +1 -0
- package/dist/types/src/containers/ChannelArticle/index.d.ts +2 -0
- package/dist/types/src/containers/ChannelArticle/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/CommentsCompanion/CommentsCompanion.d.ts +11 -0
- package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.d.ts.map +1 -0
- package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts +198 -0
- package/dist/types/src/containers/CommentsCompanion/CommentsCompanion.stories.d.ts.map +1 -0
- package/dist/types/src/containers/CommentsCompanion/index.d.ts +2 -0
- package/dist/types/src/containers/CommentsCompanion/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 +4 -6
- package/dist/types/src/containers/index.d.ts.map +1 -1
- 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 +4 -4
- package/dist/types/src/extensions/threads.d.ts.map +1 -1
- package/dist/types/src/hooks/analytics.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +0 -4
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useStatus.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +2 -3
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/meta.d.ts +1 -1
- 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/respond-to-thread.d.ts +5 -0
- package/dist/types/src/operations/respond-to-thread.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/set-agent-config.d.ts +5 -0
- package/dist/types/src/operations/set-agent-config.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/should-trigger-agent.d.ts +22 -0
- package/dist/types/src/should-trigger-agent.d.ts.map +1 -0
- package/dist/types/src/should-trigger-agent.test.d.ts +2 -0
- package/dist/types/src/should-trigger-agent.test.d.ts.map +1 -0
- package/dist/types/src/{components/testing.d.ts → testing/data.d.ts} +1 -1
- 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 +140 -142
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/types/AgentIdentity.d.ts +27 -0
- package/dist/types/src/types/AgentIdentity.d.ts.map +1 -0
- 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 +34 -0
- package/dist/types/src/types/ThreadCapabilities.d.ts.map +1 -0
- package/dist/types/src/types/ThreadOperation.d.ts +2745 -0
- package/dist/types/src/types/ThreadOperation.d.ts.map +1 -0
- package/dist/types/src/types/index.d.ts +4 -2
- package/dist/types/src/types/index.d.ts.map +1 -1
- package/dist/types/src/types/types.d.ts +0 -3303
- package/dist/types/src/types/types.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +6 -3
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +136 -92
- package/src/ThreadPlugin.node.ts +39 -0
- package/src/ThreadPlugin.test.ts +37 -0
- package/src/ThreadPlugin.tsx +40 -61
- package/src/ThreadPlugin.workerd.ts +20 -0
- package/src/blueprints/thread-blueprint.ts +5 -9
- package/src/capabilities/agent-runner.ts +291 -0
- package/src/capabilities/app-graph-builder.ts +143 -0
- package/src/capabilities/{blueprint-definition/blueprint-definition.ts → blueprint-definition.ts} +3 -1
- package/src/capabilities/create-object.ts +30 -0
- package/src/capabilities/index.ts +17 -10
- package/src/capabilities/{markdown/markdown.ts → markdown.ts} +16 -12
- package/src/capabilities/operation-handler.ts +16 -0
- package/src/capabilities/react-surface.tsx +75 -0
- package/src/capabilities/{settings/settings.ts → settings.ts} +4 -5
- package/src/capabilities/{state/state.ts → state.ts} +1 -1
- package/src/capabilities/undo-mappings.ts +46 -0
- package/src/components/Chat/Chat.tsx +259 -0
- package/src/components/Chat/index.ts +5 -0
- package/src/components/{Comments.stories.tsx → CommentsPanel/CommentsPanel.stories.tsx} +17 -17
- package/src/components/{CommentsContainer.tsx → CommentsPanel/CommentsPanel.tsx} +11 -11
- package/src/components/{CommentsThreadContainer.tsx → CommentsPanel/CommentsThread.tsx} +32 -28
- package/src/components/CommentsPanel/index.ts +6 -0
- package/src/components/{MessageContainer.tsx → MessagePanel/MessagePanel.tsx} +24 -19
- package/src/components/MessagePanel/index.ts +5 -0
- package/src/components/ThreadSettings/ThreadSettings.stories.tsx +32 -0
- package/src/components/ThreadSettings/ThreadSettings.tsx +19 -0
- package/src/components/ThreadSettings/index.ts +5 -0
- package/src/components/index.ts +7 -4
- package/src/containers/ChannelArticle/ChannelArticle.stories.tsx +105 -0
- package/src/containers/ChannelArticle/ChannelArticle.tsx +42 -0
- package/src/containers/ChannelArticle/index.ts +5 -0
- package/src/containers/ChannelChat/ChannelChat.tsx +75 -0
- package/src/containers/ChannelChat/index.ts +8 -0
- package/src/containers/CommentsCompanion/CommentsCompanion.stories.tsx +355 -0
- package/src/containers/{ThreadCompanion/ThreadCompanion.tsx → CommentsCompanion/CommentsCompanion.tsx} +63 -44
- package/src/containers/CommentsCompanion/index.ts +5 -0
- package/src/containers/{ChatContainer/ChatContainer.stories.tsx → ThreadContainer/ThreadContainer.stories.tsx} +17 -19
- package/src/containers/ThreadContainer/ThreadContainer.tsx +75 -0
- package/src/containers/ThreadContainer/index.ts +8 -0
- package/src/containers/index.ts +4 -6
- package/src/{components/command-extension.ts → extensions/command.ts} +1 -1
- package/src/extensions/index.ts +1 -0
- package/src/extensions/threads.ts +20 -19
- package/src/hooks/analytics.ts +1 -1
- package/src/hooks/index.ts +0 -5
- package/src/index.ts +4 -4
- package/src/meta.ts +35 -9
- package/src/operations/add-message.ts +94 -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 +63 -0
- package/src/operations/delete-message.ts +53 -0
- package/src/operations/delete.ts +63 -0
- package/src/operations/index.ts +22 -0
- package/src/operations/on-create-space.ts +27 -0
- package/src/operations/respond-to-thread.ts +32 -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/set-agent-config.ts +24 -0
- package/src/operations/toggle-resolved.ts +41 -0
- package/src/plugin.ts +11 -0
- package/src/should-trigger-agent.test.ts +72 -0
- package/src/should-trigger-agent.ts +50 -0
- package/src/{components/testing.ts → testing/data.ts} +7 -7
- package/src/testing/index.ts +1 -1
- package/src/translations.ts +73 -76
- package/src/types/AgentIdentity.ts +35 -0
- package/src/types/Settings.ts +10 -0
- package/src/types/ThreadCapabilities.ts +46 -0
- package/src/types/ThreadOperation.ts +225 -0
- package/src/types/index.ts +5 -2
- package/src/types/types.ts +1 -185
- package/src/util.ts +37 -5
- package/src/vite-env.d.ts +10 -0
- package/dist/lib/browser/CallDebugPanel-FGCTY7Q4.mjs +0 -182
- package/dist/lib/browser/CallDebugPanel-FGCTY7Q4.mjs.map +0 -7
- package/dist/lib/browser/CallSidebar-PJCMNDIF.mjs +0 -33
- package/dist/lib/browser/CallSidebar-PJCMNDIF.mjs.map +0 -7
- package/dist/lib/browser/ChannelContainer-EPYG4QAC.mjs +0 -15
- package/dist/lib/browser/ChatContainer-2243UD2M.mjs +0 -14
- package/dist/lib/browser/ThreadCompanion-2CMLJH76.mjs.map +0 -7
- package/dist/lib/browser/ThreadSettings-S55YVOGA.mjs +0 -20
- package/dist/lib/browser/ThreadSettings-S55YVOGA.mjs.map +0 -7
- package/dist/lib/browser/app-graph-builder-5LCAM746.mjs +0 -191
- package/dist/lib/browser/app-graph-builder-5LCAM746.mjs.map +0 -7
- package/dist/lib/browser/blueprint-definition-42M2EJ2Y.mjs.map +0 -7
- package/dist/lib/browser/call-manager-2PRP4QVZ.mjs +0 -27
- package/dist/lib/browser/call-manager-2PRP4QVZ.mjs.map +0 -7
- package/dist/lib/browser/chunk-CP7E2HRE.mjs +0 -31
- package/dist/lib/browser/chunk-CP7E2HRE.mjs.map +0 -7
- package/dist/lib/browser/chunk-ERK254BS.mjs +0 -1810
- package/dist/lib/browser/chunk-ERK254BS.mjs.map +0 -7
- package/dist/lib/browser/chunk-G6FJBSXX.mjs +0 -1123
- package/dist/lib/browser/chunk-G6FJBSXX.mjs.map +0 -7
- package/dist/lib/browser/chunk-HDLDMR54.mjs +0 -184
- package/dist/lib/browser/chunk-HDLDMR54.mjs.map +0 -7
- package/dist/lib/browser/chunk-ISCHODBV.mjs +0 -106
- package/dist/lib/browser/chunk-ISCHODBV.mjs.map +0 -7
- package/dist/lib/browser/chunk-LUK4UNFA.mjs +0 -20
- package/dist/lib/browser/chunk-LUK4UNFA.mjs.map +0 -7
- package/dist/lib/browser/chunk-PDHCY236.mjs +0 -223
- package/dist/lib/browser/chunk-PDHCY236.mjs.map +0 -7
- package/dist/lib/browser/chunk-PL5LIVP4.mjs +0 -105
- package/dist/lib/browser/chunk-PL5LIVP4.mjs.map +0 -7
- package/dist/lib/browser/chunk-U32R23JO.mjs +0 -277
- package/dist/lib/browser/chunk-U32R23JO.mjs.map +0 -7
- package/dist/lib/browser/chunk-UVUCB7QO.mjs +0 -125
- package/dist/lib/browser/chunk-UVUCB7QO.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/markdown-GRRPCZHJ.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/operation-resolver-EP7FAYEB.mjs +0 -442
- package/dist/lib/browser/operation-resolver-EP7FAYEB.mjs.map +0 -7
- package/dist/lib/browser/react-root-7UFFPPRD.mjs +0 -26
- package/dist/lib/browser/react-root-7UFFPPRD.mjs.map +0 -7
- package/dist/lib/browser/react-surface-TIHBSZPD.mjs +0 -113
- package/dist/lib/browser/react-surface-TIHBSZPD.mjs.map +0 -7
- package/dist/lib/browser/repair-TBU45SBG.mjs +0 -40
- package/dist/lib/browser/repair-TBU45SBG.mjs.map +0 -7
- package/dist/lib/browser/settings-Y75FG6XR.mjs.map +0 -7
- package/dist/lib/browser/state-OBTMMEUZ.mjs.map +0 -7
- package/dist/lib/browser/types/index.mjs +0 -15
- package/dist/lib/node-esm/CallDebugPanel-CYACANSP.mjs +0 -183
- package/dist/lib/node-esm/CallDebugPanel-CYACANSP.mjs.map +0 -7
- package/dist/lib/node-esm/CallSidebar-XD7J7EQ6.mjs +0 -34
- package/dist/lib/node-esm/CallSidebar-XD7J7EQ6.mjs.map +0 -7
- package/dist/lib/node-esm/ChannelContainer-NU4LSLB4.mjs +0 -16
- package/dist/lib/node-esm/ChatContainer-FPNIG33R.mjs +0 -15
- package/dist/lib/node-esm/ChatContainer-FPNIG33R.mjs.map +0 -7
- package/dist/lib/node-esm/ThreadCompanion-TLWTONG6.mjs +0 -205
- package/dist/lib/node-esm/ThreadCompanion-TLWTONG6.mjs.map +0 -7
- package/dist/lib/node-esm/ThreadSettings-EUH4AGYV.mjs +0 -21
- package/dist/lib/node-esm/ThreadSettings-EUH4AGYV.mjs.map +0 -7
- package/dist/lib/node-esm/app-graph-builder-VBLHLX75.mjs +0 -192
- package/dist/lib/node-esm/app-graph-builder-VBLHLX75.mjs.map +0 -7
- package/dist/lib/node-esm/blueprint-definition-PEXTS56K.mjs +0 -18
- package/dist/lib/node-esm/blueprint-definition-PEXTS56K.mjs.map +0 -7
- package/dist/lib/node-esm/blueprints/index.mjs +0 -9
- package/dist/lib/node-esm/call-manager-BLQCEM2F.mjs +0 -28
- package/dist/lib/node-esm/call-manager-BLQCEM2F.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-6K5ACCGB.mjs +0 -107
- package/dist/lib/node-esm/chunk-6K5ACCGB.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-7SZBKQUU.mjs +0 -224
- package/dist/lib/node-esm/chunk-7SZBKQUU.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-ABUFOZVX.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-GPPP2MZ3.mjs +0 -22
- package/dist/lib/node-esm/chunk-GPPP2MZ3.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-IQUV7DR6.mjs +0 -1124
- package/dist/lib/node-esm/chunk-IQUV7DR6.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs +0 -1811
- package/dist/lib/node-esm/chunk-QP3KQOPQ.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-QYAVWNVM.mjs +0 -278
- package/dist/lib/node-esm/chunk-QYAVWNVM.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-V2GXQ2UB.mjs +0 -126
- package/dist/lib/node-esm/chunk-V2GXQ2UB.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-VBI32FGI.mjs +0 -108
- package/dist/lib/node-esm/chunk-VBI32FGI.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-YN2Y7GPW.mjs +0 -185
- package/dist/lib/node-esm/chunk-YN2Y7GPW.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/markdown-WHWUESF7.mjs +0 -211
- package/dist/lib/node-esm/markdown-WHWUESF7.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/operation-resolver-R7QJW3TW.mjs +0 -443
- package/dist/lib/node-esm/operation-resolver-R7QJW3TW.mjs.map +0 -7
- package/dist/lib/node-esm/react-root-D7CWS5XP.mjs +0 -27
- package/dist/lib/node-esm/react-root-D7CWS5XP.mjs.map +0 -7
- package/dist/lib/node-esm/react-surface-WWZFSK5Y.mjs +0 -114
- package/dist/lib/node-esm/react-surface-WWZFSK5Y.mjs.map +0 -7
- package/dist/lib/node-esm/repair-7JEKRNR3.mjs +0 -41
- package/dist/lib/node-esm/repair-7JEKRNR3.mjs.map +0 -7
- package/dist/lib/node-esm/settings-W4JN2YKJ.mjs +0 -36
- package/dist/lib/node-esm/settings-W4JN2YKJ.mjs.map +0 -7
- package/dist/lib/node-esm/state-7UWCSIWQ.mjs +0 -26
- package/dist/lib/node-esm/state-7UWCSIWQ.mjs.map +0 -7
- package/dist/lib/node-esm/types/index.mjs +0 -16
- package/dist/types/src/calls/call-manager.d.ts +0 -87
- package/dist/types/src/calls/call-manager.d.ts.map +0 -1
- package/dist/types/src/calls/call-swarm-synchronizer.d.ts +0 -66
- package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +0 -1
- package/dist/types/src/calls/index.d.ts +0 -7
- package/dist/types/src/calls/index.d.ts.map +0 -1
- package/dist/types/src/calls/media-manager.d.ts +0 -60
- package/dist/types/src/calls/media-manager.d.ts.map +0 -1
- package/dist/types/src/calls/speaking-monitor.d.ts +0 -24
- package/dist/types/src/calls/speaking-monitor.d.ts.map +0 -1
- package/dist/types/src/calls/types.d.ts +0 -45
- package/dist/types/src/calls/types.d.ts.map +0 -1
- package/dist/types/src/calls/util/audio.d.ts +0 -6
- package/dist/types/src/calls/util/audio.d.ts.map +0 -1
- package/dist/types/src/calls/util/calls-service.d.ts +0 -77
- package/dist/types/src/calls/util/calls-service.d.ts.map +0 -1
- package/dist/types/src/calls/util/history-cache.d.ts +0 -11
- package/dist/types/src/calls/util/history-cache.d.ts.map +0 -1
- package/dist/types/src/calls/util/index.d.ts +0 -5
- package/dist/types/src/calls/util/index.d.ts.map +0 -1
- package/dist/types/src/calls/util/media.d.ts +0 -6
- package/dist/types/src/calls/util/media.d.ts.map +0 -1
- package/dist/types/src/calls/util/stub-media-streams.d.ts +0 -18
- package/dist/types/src/calls/util/stub-media-streams.d.ts.map +0 -1
- package/dist/types/src/calls/util/task-scheduling.d.ts +0 -17
- package/dist/types/src/calls/util/task-scheduling.d.ts.map +0 -1
- package/dist/types/src/calls-service.stories.d.ts +0 -23
- package/dist/types/src/calls-service.stories.d.ts.map +0 -1
- package/dist/types/src/capabilities/app-graph-builder/app-graph-builder.d.ts.map +0 -1
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts +0 -3
- package/dist/types/src/capabilities/app-graph-builder/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +0 -6
- package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +0 -1
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts +0 -3
- package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/call-manager/call-manager.d.ts +0 -6
- package/dist/types/src/capabilities/call-manager/call-manager.d.ts.map +0 -1
- package/dist/types/src/capabilities/call-manager/index.d.ts +0 -3
- package/dist/types/src/capabilities/call-manager/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/markdown/index.d.ts +0 -3
- package/dist/types/src/capabilities/markdown/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/markdown/markdown.d.ts.map +0 -1
- package/dist/types/src/capabilities/operation-resolver/index.d.ts +0 -3
- package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +0 -5
- package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-root/index.d.ts +0 -6
- package/dist/types/src/capabilities/react-root/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-root/react-root.d.ts +0 -9
- package/dist/types/src/capabilities/react-root/react-root.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface/index.d.ts +0 -3
- package/dist/types/src/capabilities/react-surface/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +0 -1
- package/dist/types/src/capabilities/repair/index.d.ts +0 -3
- package/dist/types/src/capabilities/repair/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/repair/repair.d.ts +0 -6
- package/dist/types/src/capabilities/repair/repair.d.ts.map +0 -1
- package/dist/types/src/capabilities/settings/index.d.ts +0 -3
- package/dist/types/src/capabilities/settings/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/settings/settings.d.ts.map +0 -1
- package/dist/types/src/capabilities/state/index.d.ts +0 -3
- package/dist/types/src/capabilities/state/index.d.ts.map +0 -1
- package/dist/types/src/capabilities/state/state.d.ts.map +0 -1
- package/dist/types/src/components/Call/Call.d.ts +0 -17
- package/dist/types/src/components/Call/Call.d.ts.map +0 -1
- package/dist/types/src/components/Call/Toolbar.d.ts +0 -16
- package/dist/types/src/components/Call/Toolbar.d.ts.map +0 -1
- package/dist/types/src/components/Call/index.d.ts +0 -3
- package/dist/types/src/components/Call/index.d.ts.map +0 -1
- package/dist/types/src/components/Comments.stories.d.ts +0 -162
- 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/CommentsThreadContainer.d.ts.map +0 -1
- package/dist/types/src/components/Lobby/Lobby.d.ts +0 -15
- package/dist/types/src/components/Lobby/Lobby.d.ts.map +0 -1
- package/dist/types/src/components/Lobby/index.d.ts +0 -2
- package/dist/types/src/components/Lobby/index.d.ts.map +0 -1
- package/dist/types/src/components/Media/AudioStream.d.ts +0 -6
- package/dist/types/src/components/Media/AudioStream.d.ts.map +0 -1
- package/dist/types/src/components/Media/VideoObject.d.ts +0 -15
- package/dist/types/src/components/Media/VideoObject.d.ts.map +0 -1
- package/dist/types/src/components/Media/VideoObject.stories.d.ts +0 -22
- package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +0 -1
- package/dist/types/src/components/Media/index.d.ts +0 -3
- package/dist/types/src/components/Media/index.d.ts.map +0 -1
- package/dist/types/src/components/MessageContainer.d.ts.map +0 -1
- package/dist/types/src/components/Participant/Participant.d.ts +0 -6
- package/dist/types/src/components/Participant/Participant.d.ts.map +0 -1
- package/dist/types/src/components/Participant/ParticipantGrid.d.ts +0 -11
- package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +0 -1
- package/dist/types/src/components/Participant/index.d.ts +0 -3
- package/dist/types/src/components/Participant/index.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts +0 -12
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +0 -166
- package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts +0 -32
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +0 -180
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts +0 -21
- package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +0 -1
- package/dist/types/src/components/ResponsiveGrid/index.d.ts +0 -4
- package/dist/types/src/components/ResponsiveGrid/index.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.map +0 -1
- package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts +0 -15
- package/dist/types/src/containers/CallDebugPanel/CallDebugPanel.d.ts.map +0 -1
- package/dist/types/src/containers/CallDebugPanel/index.d.ts +0 -3
- package/dist/types/src/containers/CallDebugPanel/index.d.ts.map +0 -1
- package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts +0 -3
- package/dist/types/src/containers/CallSidebar/CallSidebar.d.ts.map +0 -1
- package/dist/types/src/containers/CallSidebar/index.d.ts +0 -3
- package/dist/types/src/containers/CallSidebar/index.d.ts.map +0 -1
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts +0 -12
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.d.ts.map +0 -1
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts +0 -164
- package/dist/types/src/containers/ChannelContainer/ChannelContainer.stories.d.ts.map +0 -1
- package/dist/types/src/containers/ChannelContainer/index.d.ts +0 -3
- package/dist/types/src/containers/ChannelContainer/index.d.ts.map +0 -1
- package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts +0 -17
- package/dist/types/src/containers/ChatContainer/ChatContainer.d.ts.map +0 -1
- package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts +0 -164
- package/dist/types/src/containers/ChatContainer/ChatContainer.stories.d.ts.map +0 -1
- package/dist/types/src/containers/ChatContainer/index.d.ts +0 -3
- package/dist/types/src/containers/ChatContainer/index.d.ts.map +0 -1
- package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts +0 -5
- package/dist/types/src/containers/ThreadCompanion/ThreadCompanion.d.ts.map +0 -1
- package/dist/types/src/containers/ThreadCompanion/index.d.ts +0 -3
- package/dist/types/src/containers/ThreadCompanion/index.d.ts.map +0 -1
- package/dist/types/src/containers/ThreadSettings/ThreadSettings.d.ts +0 -8
- package/dist/types/src/containers/ThreadSettings/ThreadSettings.d.ts.map +0 -1
- package/dist/types/src/containers/ThreadSettings/index.d.ts +0 -3
- package/dist/types/src/containers/ThreadSettings/index.d.ts.map +0 -1
- package/dist/types/src/functions/create-proposals.d.ts +0 -13
- package/dist/types/src/functions/create-proposals.d.ts.map +0 -1
- package/dist/types/src/functions/index.d.ts +0 -14
- package/dist/types/src/functions/index.d.ts.map +0 -1
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts +0 -2
- package/dist/types/src/hooks/useBlackCanvasStreamTrack.d.ts.map +0 -1
- package/dist/types/src/hooks/useDebugMode.d.ts +0 -2
- package/dist/types/src/hooks/useDebugMode.d.ts.map +0 -1
- package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts +0 -2
- package/dist/types/src/hooks/useInaudibleAudioStreamTrack.d.ts.map +0 -1
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts +0 -3
- package/dist/types/src/hooks/useVideoStreamTrack.d.ts.map +0 -1
- package/dist/types/src/testing/stories.d.ts +0 -3
- package/dist/types/src/testing/stories.d.ts.map +0 -1
- package/dist/types/src/types/Channel.d.ts +0 -711
- package/dist/types/src/types/Channel.d.ts.map +0 -1
- package/dist/types/src/types/capabilities.d.ts +0 -23
- package/dist/types/src/types/capabilities.d.ts.map +0 -1
- package/src/calls/call-manager.ts +0 -270
- package/src/calls/call-swarm-synchronizer.ts +0 -350
- package/src/calls/index.ts +0 -10
- package/src/calls/media-manager.ts +0 -378
- package/src/calls/speaking-monitor.ts +0 -85
- package/src/calls/types.ts +0 -74
- package/src/calls/util/audio.ts +0 -58
- package/src/calls/util/calls-service.ts +0 -581
- package/src/calls/util/history-cache.ts +0 -27
- package/src/calls/util/index.ts +0 -8
- package/src/calls/util/media.ts +0 -52
- package/src/calls/util/stub-media-streams.ts +0 -127
- package/src/calls/util/task-scheduling.ts +0 -92
- package/src/calls-service.stories.tsx +0 -229
- package/src/capabilities/app-graph-builder/app-graph-builder.ts +0 -202
- package/src/capabilities/app-graph-builder/index.ts +0 -7
- package/src/capabilities/blueprint-definition/index.ts +0 -7
- package/src/capabilities/call-manager/call-manager.ts +0 -26
- package/src/capabilities/call-manager/index.ts +0 -7
- package/src/capabilities/markdown/index.ts +0 -7
- package/src/capabilities/operation-resolver/index.ts +0 -7
- package/src/capabilities/operation-resolver/operation-resolver.ts +0 -399
- package/src/capabilities/react-root/index.ts +0 -7
- package/src/capabilities/react-root/react-root.tsx +0 -20
- package/src/capabilities/react-surface/index.ts +0 -7
- package/src/capabilities/react-surface/react-surface.tsx +0 -98
- package/src/capabilities/repair/index.ts +0 -7
- package/src/capabilities/repair/repair.ts +0 -55
- package/src/capabilities/settings/index.ts +0 -7
- package/src/capabilities/state/index.ts +0 -7
- package/src/components/Call/Call.tsx +0 -93
- package/src/components/Call/Toolbar.tsx +0 -189
- package/src/components/Call/index.ts +0 -6
- package/src/components/Lobby/Lobby.tsx +0 -121
- package/src/components/Lobby/index.ts +0 -5
- package/src/components/Media/AudioStream.tsx +0 -67
- package/src/components/Media/VideoObject.stories.tsx +0 -60
- package/src/components/Media/VideoObject.tsx +0 -58
- package/src/components/Media/index.ts +0 -6
- package/src/components/Participant/Participant.tsx +0 -76
- package/src/components/Participant/ParticipantGrid.tsx +0 -89
- package/src/components/Participant/index.ts +0 -6
- package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +0 -54
- package/src/components/ResponsiveGrid/ResponsiveContainer.tsx +0 -31
- package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +0 -158
- package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +0 -341
- package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +0 -134
- package/src/components/ResponsiveGrid/index.ts +0 -7
- package/src/containers/CallDebugPanel/CallDebugPanel.tsx +0 -172
- package/src/containers/CallDebugPanel/index.ts +0 -7
- package/src/containers/CallSidebar/CallSidebar.tsx +0 -17
- package/src/containers/CallSidebar/index.ts +0 -7
- package/src/containers/ChannelContainer/ChannelContainer.stories.tsx +0 -60
- package/src/containers/ChannelContainer/ChannelContainer.tsx +0 -217
- package/src/containers/ChannelContainer/index.ts +0 -7
- package/src/containers/ChatContainer/ChatContainer.tsx +0 -149
- package/src/containers/ChatContainer/index.ts +0 -7
- package/src/containers/ThreadCompanion/index.ts +0 -7
- package/src/containers/ThreadSettings/ThreadSettings.tsx +0 -22
- package/src/containers/ThreadSettings/index.ts +0 -7
- package/src/functions/create-proposals.ts +0 -57
- package/src/functions/index.ts +0 -9
- package/src/hooks/useBlackCanvasStreamTrack.tsx +0 -27
- package/src/hooks/useDebugMode.ts +0 -25
- package/src/hooks/useInaudibleAudioStreamTrack.tsx +0 -27
- package/src/hooks/useVideoStreamTrack.tsx +0 -36
- package/src/testing/stories.ts +0 -56
- package/src/types/Channel.ts +0 -30
- package/src/types/capabilities.ts +0 -34
- package/src/typings/peermetrics-webrtc-stats.d.ts +0 -46
- package/src/typings.d.ts +0 -8
- /package/dist/lib/{browser/ChannelContainer-EPYG4QAC.mjs.map → neutral/ChannelChat-LZEDFJVD.mjs.map} +0 -0
- /package/dist/lib/{browser → neutral}/blueprints/index.mjs.map +0 -0
- /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs +0 -0
- /package/dist/lib/{browser → neutral}/chunk-J5LGTIGS.mjs.map +0 -0
- /package/dist/lib/{browser/types → neutral/hooks}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/blueprints → neutral}/index.mjs.map +0 -0
- /package/dist/lib/{browser/ChatContainer-2243UD2M.mjs.map → neutral/meta.mjs.map} +0 -0
- /package/dist/lib/{node-esm/types → neutral/operations}/index.mjs.map +0 -0
- /package/dist/lib/{node-esm/ChannelContainer-NU4LSLB4.mjs.map → neutral/types/index.mjs.map} +0 -0
- /package/dist/types/src/capabilities/{app-graph-builder/app-graph-builder.d.ts → app-graph-builder.d.ts} +0 -0
- /package/dist/types/src/capabilities/{markdown/markdown.d.ts → markdown.d.ts} +0 -0
- /package/dist/types/src/capabilities/{react-surface/react-surface.d.ts → react-surface.d.ts} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/components/Call/Call.tsx", "../../../src/components/Media/AudioStream.tsx", "../../../src/components/Media/VideoObject.tsx", "../../../src/components/Participant/Participant.tsx", "../../../src/components/ResponsiveGrid/ResponsiveContainer.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGrid.tsx", "../../../src/components/ResponsiveGrid/ResponsiveGridItem.tsx", "../../../src/components/Participant/ParticipantGrid.tsx", "../../../src/components/Call/Toolbar.tsx", "../../../src/components/CommentsContainer.tsx", "../../../src/components/CommentsThreadContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/components/MessageContainer.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React, { type FC, type PropsWithChildren } from 'react';\n\nimport { useCapability } from '@dxos/app-framework/ui';\nimport { type ThemedClassName } from '@dxos/react-ui';\n\nimport { useDebugMode } from '../../hooks';\nimport { ThreadCapabilities } from '../../types';\nimport { AudioStream } from '../Media';\nimport { ParticipantGrid } from '../Participant';\n\nimport { Toolbar, type ToolbarProps } from './Toolbar';\n\n//\n// Root\n//\n\ntype CallRootProps = PropsWithChildren<ThemedClassName>;\n\nconst CallRoot: FC<CallRootProps> = ({ children }) => {\n return <div className='relative flex flex-col grow overflow-hidden'>{children}</div>;\n};\n\nCallRoot.displayName = 'CallRoot';\n\n//\n// Audio\n//\n\ntype CallAudioProps = {};\n\nconst CallAudio: FC<CallAudioProps> = () => {\n const call = useCapability(ThreadCapabilities.CallManager);\n const audioTracksToPlay = useAtomValue(call.audioTracksToPlayAtom);\n\n return <AudioStream tracks={audioTracksToPlay} />;\n};\n\nCallAudio.displayName = 'CallAudio';\n\n//\n// Room\n//\n\ntype CallGridProps = {\n fullscreen?: boolean;\n};\n\nconst CallGrid: FC<CallGridProps> = ({ fullscreen }) => {\n const debug = useDebugMode();\n const call = useCapability(ThreadCapabilities.CallManager);\n const self = useAtomValue(call.selfAtom);\n const users = useAtomValue(call.usersAtom);\n\n return (\n <div className='grid grow p-4 dark:bg-neutral-900'>\n <ParticipantGrid self={self} users={users} debug={debug} fullscreen={fullscreen} />\n </div>\n );\n};\n\nCallGrid.displayName = 'CallGrid';\n\n//\n// Toolbar\n//\n\ntype CallToolbarProps = Pick<ToolbarProps, 'channel' | 'onLeave'>;\n\nconst CallToolbar: FC<CallToolbarProps> = (props) => {\n return (\n <div className='absolute bottom-0 left-0 right-0 flex justify-center'>\n <Toolbar isInRoom {...props} />\n </div>\n );\n};\n\nCallToolbar.displayName = 'CallToolbar';\n\n//\n// Export\n//\n\nexport const Call = {\n Root: CallRoot,\n Grid: CallGrid,\n Audio: CallAudio,\n Toolbar: CallToolbar,\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC, useEffect, useRef } from 'react';\n\nexport type AudioStreamProps = {\n tracks: MediaStreamTrack[];\n};\n\nexport const AudioStream: FC<AudioStreamProps> = ({ tracks }) => {\n const mediaStreamRef = useRef(new MediaStream());\n const ref = useRef<HTMLAudioElement>(null);\n\n useEffect(() => {\n const audio = ref.current;\n if (!audio) {\n return;\n }\n\n const mediaStream = mediaStreamRef.current;\n audio.srcObject = mediaStream;\n }, []);\n\n const resetSrcObject = () => {\n const audio = ref.current;\n const mediaStream = mediaStreamRef.current;\n if (!audio || !mediaStream) {\n return;\n }\n\n // Need to set srcObject again in Chrome and call play() again for Safari\n // https://www.youtube.com/live/Tkx3OGrwVk8?si=K--P_AzNnAGrjraV&t=2533\n // Calling play() this way to make Chrome happy otherwise it throws an error.\n audio.addEventListener('canplay', () => audio.play(), { once: true });\n audio.srcObject = mediaStream;\n };\n\n return (\n <>\n <audio ref={ref} autoPlay />\n {tracks.map((track) => (\n <AudioTrack key={track.id} track={track} mediaStream={mediaStreamRef.current} resetSrcObject={resetSrcObject} />\n ))}\n </>\n );\n};\n\ntype AudioTrackParams = {\n track: MediaStreamTrack;\n mediaStream: MediaStream;\n resetSrcObject: () => void;\n};\n\nconst AudioTrack = ({ track, mediaStream, resetSrcObject }: AudioTrackParams) => {\n useEffect(() => {\n const currentTrack = track;\n mediaStream.addTrack(currentTrack);\n resetSrcObject();\n return () => {\n mediaStream.removeTrack(currentTrack);\n resetSrcObject();\n };\n }, [track, mediaStream]);\n\n return null;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type JSX, forwardRef, memo, useEffect, useRef } from 'react';\n\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/ui-theme';\n\nexport type VideoObjectProps = Omit<JSX.IntrinsicElements['video'], 'className' | 'ref'> &\n ThemedClassName<{\n videoStream?: MediaStream;\n flip?: boolean;\n // TODO(burdon): If screenshare then contain.\n contain?: boolean;\n }>;\n\nexport const VideoObject = memo(\n forwardRef<HTMLVideoElement, VideoObjectProps>(({ videoStream, classNames, flip, contain, ...rest }, ref) => {\n const internalRef = useRef<HTMLVideoElement | null>(null);\n\n useEffect(() => {\n const video = internalRef.current;\n if (video && videoStream) {\n video.srcObject = videoStream;\n video.setAttribute('autoplay', 'true');\n video.setAttribute('playsinline', 'true');\n }\n }, [videoStream, internalRef.current]);\n\n // NOTE: The video element typically has a max size of 1280x720.\n return (\n <video\n className={mx(\n '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 { type EncodedTrackName, type UserState } from '../../calls';\nimport { ThreadCapabilities } from '../../types';\nimport { VideoObject } from '../Media';\nimport { ResponsiveGridItem, type ResponsiveGridItemProps } from '../ResponsiveGrid';\n\nexport const SCREENSHARE_SUFFIX = '_screenshare';\n\nexport const Participant = memo(({ item: user, debug, ...props }: ResponsiveGridItemProps<UserState>) => {\n const call = useCapability(ThreadCapabilities.CallManager);\n const self = useAtomValue(call.selfAtom);\n const media = useAtomValue(call.mediaAtom);\n const isSelf: boolean = self.id !== undefined && user.id !== undefined && user.id.startsWith(self.id);\n const isScreenshare = user.id?.endsWith(SCREENSHARE_SUFFIX);\n\n // Get pulled video stream for non-self users.\n const pulledVideoStream = useMemo<MediaStream | undefined>(() => {\n if (isSelf) {\n return undefined;\n }\n const trackName =\n isScreenshare && user.tracks?.screenshareEnabled\n ? (user.tracks?.screenshare as EncodedTrackName)\n : !isScreenshare && user.tracks?.videoEnabled\n ? (user.tracks?.video as EncodedTrackName)\n : undefined;\n return trackName ? media.pulledVideoStreams[trackName]?.stream : undefined;\n }, [\n isSelf,\n isScreenshare,\n media.pulledVideoStreams,\n user.tracks?.screenshare,\n user.tracks?.video,\n user.tracks?.screenshareEnabled,\n user.tracks?.videoEnabled,\n ]);\n\n const videoStream = useMemo<MediaStream | undefined>(() => {\n if (isSelf) {\n return isScreenshare ? media.screenshareVideoStream : media.videoStream;\n }\n return pulledVideoStream;\n }, [isSelf, isScreenshare, media.videoStream, media.screenshareVideoStream, pulledVideoStream]);\n\n return (\n <ResponsiveGridItem\n {...props}\n item={user}\n name={user.name}\n self={isSelf}\n screenshare={!!media.screenshareVideoStream}\n video={media.videoEnabled}\n mute={user ? !user.tracks?.audioEnabled : false}\n wave={user.raisedHand}\n speaking={user.speaking}\n debug={debug}\n >\n <VideoObject\n videoStream={videoStream}\n flip={isSelf && !isScreenshare}\n contain={!!isScreenshare}\n classNames='rounded-md'\n />\n </ResponsiveGridItem>\n );\n});\n\nParticipant.displayName = 'Participant';\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type PropsWithChildren } from 'react';\n\nimport { mx } from '@dxos/ui-theme';\n\n/**\n * A container component that maintains the child's aspect ratio while centering its content.\n * The container will scale to fit within its parent's bounds while preserving the aspect ratio.\n *\n * @example\n * <ResponsiveContainer>\n * <VideoObject />\n * </ResponsiveContainer>\n */\nexport const ResponsiveContainer = ({ children }: PropsWithChildren) => {\n return (\n // Outer container that takes full size of parent.\n <div role='none' className='relative flex w-full h-full'>\n {/* Absolute positioning layer for centering content. */}\n <div role='none' className='absolute inset-0 flex justify-center items-center'>\n {/* Content container that maintains given aspect ratio and proper scaling. */}\n <div role='none' className={mx('max-h-full max-w-full w-auto h-auto aspect-video')}>\n {children}\n </div>\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ComponentType, type FC, useCallback, useEffect, useLayoutEffect, useMemo, useState } from 'react';\nimport { useResizeDetector } from 'react-resize-detector';\n\nimport { invariant } from '@dxos/invariant';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { type Size } from '@dxos/react-ui-dnd';\nimport { mx } from '@dxos/ui-theme';\n\nimport { ResponsiveContainer } from './ResponsiveContainer';\nimport { type ResponsiveGridItemProps } from './ResponsiveGridItem';\n\nconst ASPECT_RATIO = 16 / 9;\nconst MIN_GALLERY_HEIGHT = 250;\n\nconst DEFAULT_GAP = 8;\n\nconst maxImageSize = '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('relative w-full h-full', classNames)}>\n {/* Placeholder elements to calculate layout. */}\n <div className='absolute inset-0 flex flex-col grow gap-2'>\n {/* Pinned item. */}\n {pinnedItem && (\n <div\n className={mx('flex grow-[2] shrink overflow-hidden justify-center items-center', hideGallery && '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 <ResponsiveContainer>\n <div\n {...{ 'data-grid-item': id }}\n className={mx('aspect-video overflow-hidden', debug && 'z-20 border-2 border-primary-500')}\n >\n {/* Maximum size placeholder image forces aspect ratio. */}\n <img alt='placeholder video' className={mx('opacity-0', maxImageSize)} />\n </div>\n </ResponsiveContainer>\n );\n};\n\ntype DOMRectBounds = Pick<DOMRect, 'top' | 'left' | 'width' | 'height'>;\n\n// TODO(burdon): Reconcile with react-ui-gameboard.\nconst getRelativeBounds = (container: HTMLElement, el: HTMLElement): DOMRectBounds => {\n const containerRect = container.getBoundingClientRect();\n const elementRect = el.getBoundingClientRect();\n return {\n top: elementRect.top - containerRect.top,\n left: elementRect.left - containerRect.left,\n width: elementRect.width,\n height: elementRect.height,\n };\n};\n\ntype Layout = {\n time?: number;\n columns: number;\n cellWidth: number;\n};\n\n/**\n * Calculates the optimal number of columns for a grid layout that minimizes wasted space.\n * @param containerWidth - Width of the container in pixels.\n * @param containerHeight - Height of the container in pixels.\n * @param count - Total number of items to display.\n * @param gap - Space between items in pixels.\n * @param aspectRatio - Desired aspect ratio of items (width/height).\n * @returns The optimal number of columns.\n */\nconst calculateLayout = (\n containerWidth: number,\n containerHeight: number,\n count: number,\n gap: number,\n aspectRatio = ASPECT_RATIO,\n): Layout => {\n if (count === 0) {\n return { columns: 1, cellWidth: 1 };\n }\n\n let minWastedSpace = Infinity;\n let bestColumns = 1;\n let cellWidth = 0;\n\n // Try different rows counts to find the optimal layout that minimizes wasted space.\n for (let rows = 1; rows <= count; rows++) {\n const cols = Math.ceil(count / rows);\n\n // Calculate available space accounting for gaps.\n const { width: itemWidth, height: itemHeight } = fitItemsToGrid(\n containerWidth,\n containerHeight,\n cols,\n rows,\n aspectRatio,\n gap,\n );\n\n // Calculate total wasted space for this configuration.\n const usedWidth = itemWidth * cols + gap * cols - 1;\n const usedHeight = itemHeight * rows + gap * rows - 1;\n\n // Determine if optimal.\n const wastedSpace = containerWidth * containerHeight - usedWidth * usedHeight;\n if (wastedSpace < minWastedSpace) {\n minWastedSpace = wastedSpace;\n bestColumns = cols;\n cellWidth = itemWidth;\n }\n }\n\n return { columns: bestColumns, cellWidth };\n};\n\n/**\n * Returns the size of the largest rectangle with the given aspect ration that fits within the grid.\n */\nconst fitItemsToGrid = (\n outerWidth: number,\n outerHeight: number,\n numCols: number,\n numRows: number,\n aspectRatio: number,\n gap: number,\n): { width: number; height: number } => {\n // Calculate available space accounting for gaps.\n const availableWidth = outerWidth - gap * (numCols - 1);\n const availableHeight = outerHeight - gap * (numRows - 1);\n\n // Calculate max dimensions.\n const maxCellWidth = availableWidth / numCols;\n const maxCellHeight = availableHeight / numRows;\n\n // Use fitAspectRatio to get dimensions that fit within max cell size while maintaining the desired aspect ratio\n return fitAspectRatio(maxCellWidth, maxCellHeight, aspectRatio);\n};\n\n/**\n * Returns the size of the largest rectangle the given aspect ratio that fits within the outer rectangle.\n */\nconst fitAspectRatio = (\n outerWidth: number,\n outerHeight: number,\n aspectRatio: number,\n): { width: number; height: number } => {\n if (outerWidth <= 0 || outerHeight <= 0 || aspectRatio <= 0) {\n return { width: 0, height: 0 };\n }\n\n // First try fitting to width.\n let width = outerWidth;\n let height = width / aspectRatio;\n\n // If too tall, fit to height instead.\n if (height > outerHeight) {\n height = outerHeight;\n width = height * aspectRatio;\n }\n\n return { width, height };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type CSSProperties, type PropsWithChildren, useEffect, useState } from 'react';\n\nimport { Icon, IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { Waveform } from '@dxos/react-ui-sfx';\nimport { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\n\nexport type ResponsiveGridItemProps<T extends object = any> = PropsWithChildren<\n ThemedClassName<{\n item: T;\n style?: CSSProperties;\n pinned?: boolean;\n name?: string;\n self?: boolean;\n screenshare?: boolean;\n video?: boolean;\n mute?: boolean;\n wave?: boolean;\n speaking?: boolean;\n debug?: boolean;\n onClick?: (item: T) => void;\n }>\n>;\n\n/**\n * Cell container.\n */\nexport const ResponsiveGridItem = <T extends object = any>({\n children,\n classNames,\n item,\n style,\n name,\n self,\n pinned,\n screenshare,\n video,\n mute,\n wave,\n speaking,\n onClick,\n}: ResponsiveGridItemProps<T>) => {\n const { t } = useTranslation(meta.id);\n const iconProps: Record<string, { icon: string; label: string; classNames?: string }> = {\n wave: {\n icon: 'ph--hand-waving--duotone',\n label: t('icon wave'),\n classNames: 'animate-pulse bg-orange-500',\n },\n mute: {\n icon: 'ph--microphone-slash--regular',\n label: t('icon muted'),\n },\n };\n\n const props = wave && !pinned ? iconProps.wave : mute ? iconProps.mute : speaking ? iconProps.speaking : undefined;\n\n // Debounce speaking indicator.\n const [speakingIndicator, setSpeakingIndicator] = useState(speaking);\n useEffect(() => {\n if (speaking) {\n setSpeakingIndicator(true);\n } else {\n const timeout = setTimeout(() => {\n setSpeakingIndicator(false);\n }, 1_000);\n return () => clearTimeout(timeout);\n }\n }, [speaking]);\n\n return (\n <div\n className={mx(\n 'relative w-full h-full group',\n 'rounded-md outline outline-2 outline-neutral-900 transition-[outline-color] duration-500',\n speakingIndicator ? 'outline-green-500' : !video && 'outline-separator',\n classNames,\n )}\n style={style}\n >\n {children}\n\n {/* Action. */}\n {onClick && (\n <div className='z-10 absolute top-1 right-1 flex'>\n <IconButton\n classNames={mx('p-1 min-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') : t('icon pin')}\n onClick={() => onClick?.(item)}\n />\n </div>\n )}\n\n {/* Name. */}\n {name && (\n <div className='z-10 absolute bottom-1 left-8 right-1 flex justify-end gap-1 items-center'>\n {/* TODO(burdon): Replace with avatar for everyone. */}\n {/* {self && <Icon icon='ph--asterisk--regular' size={pinned ? 5 : 4} />} */}\n {screenshare && <Icon icon='ph--broadcast--regular' size={pinned ? 5 : 4} />}\n <div\n className={mx(\n 'bg-neutral-800 text-neutral-100 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';\n\nimport { Participant, SCREENSHARE_SUFFIX } from './Participant';\n\nconst getId = (user: UserState): string => user.id!;\n\nexport type ParticipantGridProps = ThemedClassName<{\n self: UserState;\n users: UserState[];\n fullscreen?: boolean;\n debug?: boolean;\n}>;\n\nexport const ParticipantGrid = ({ classNames, self, users, fullscreen, debug }: ParticipantGridProps) => {\n const [pinned, setPinned] = useState<string | undefined>();\n\n const allUsers = useMemo(() => {\n const allUsers: (UserState & { isSelf?: boolean })[] = [];\n users.forEach((user) => {\n if (!user.joined) {\n return;\n }\n\n allUsers.push({ ...user, isSelf: user.id === self.id });\n if (user.tracks?.screenshareEnabled) {\n const screenshare: UserState = {\n ...user,\n id: user.id + SCREENSHARE_SUFFIX,\n tracks: {\n ...user.tracks,\n video: user.tracks.screenshare,\n videoEnabled: user.tracks.screenshareEnabled,\n } as any, // TODO(burdon): Remove cast.\n };\n\n allUsers.push(screenshare);\n }\n });\n\n return allUsers;\n }, [self, users]);\n\n useEffect(() => {\n if (pinned) {\n // Check expanded user is still in call.\n if (!allUsers.find((user) => user.id === pinned)) {\n setPinned(undefined);\n }\n }\n }, [pinned, allUsers]);\n\n // TODO(burdon): Put self last.\n const sortedUsers: UserState[] = allUsers.sort((a, b) => {\n if (a.isSelf) {\n return 1;\n } else if (b.isSelf) {\n return -1;\n } else if (a.tracks?.screenshareEnabled) {\n return -1;\n } else if (b.tracks?.screenshareEnabled) {\n return 1;\n } else {\n return 0;\n }\n });\n\n // TODO(burdon): Show ghost view of user for a second before leaving.\n return (\n <ResponsiveGrid<UserState>\n classNames={classNames}\n Cell={Participant}\n debug={debug}\n getId={getId}\n items={sortedUsers}\n pinned={pinned}\n autoHideGallery={fullscreen}\n onPinnedChange={setPinned}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useAtomValue } from '@effect-atom/atom-react';\nimport React from 'react';\n\nimport { 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 { groupHoverControlItemWithTransition, mx } from '@dxos/ui-theme';\n\nimport { meta } from '../../meta';\nimport { ThreadCapabilities } from '../../types';\nimport { type Channel } from '../../types';\n\nexport type ToolbarProps = ThemedClassName<{\n channel?: Channel.Channel;\n participants?: number;\n autoHideControls?: boolean;\n isInRoom?: boolean;\n onJoin?: () => void;\n onLeave?: () => void;\n}>;\n\n// TODO(wittjosiah): Use ToolbarMenu.\nexport const Toolbar = ({\n classNames,\n channel,\n participants,\n autoHideControls = true,\n onJoin,\n onLeave,\n}: ToolbarProps) => {\n const { t } = useTranslation(meta.id);\n const { graph } = useAppGraph();\n const runAction = useActionRunner();\n const call = useCapability(ThreadCapabilities.CallManager);\n const media = useAtomValue(call.mediaAtom);\n const joined = useAtomValue(call.joinedAtom);\n const raisedHand = useAtomValue(call.raisedHandAtom);\n\n // Channel app graph node.\n const node = useNode(graph, channel && Obj.getDXN(channel).toString());\n const actions = useActions(graph, node?.id).filter((action) => action.properties.disposition === 'toolbar');\n\n // Screen sharing.\n const isScreensharing = media.screenshareTrack !== undefined;\n const canSharescreen =\n typeof navigator.mediaDevices !== 'undefined' && navigator.mediaDevices.getDisplayMedia !== undefined;\n\n // TODO(wittjosiah): In order to use toolbar, need to update to actually use the graph action callbacks directly.\n return (\n <div className={mx('z-20 flex justify-center m-8', autoHideControls && groupHoverControlItemWithTransition)}>\n <NaturalToolbar.Root classNames={['p-2 bg-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'),\n onClick: () => call.turnAudioOff(),\n classNames: 'bg-call-active',\n },\n off: {\n icon: 'ph--microphone-slash--duotone',\n label: t('mic on'),\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'),\n onClick: () => call.turnVideoOff(),\n },\n off: {\n icon: 'ph--video-camera-slash--duotone',\n label: t('camera on'),\n onClick: () => call.turnVideoOn(),\n },\n }}\n />\n\n {(participants !== undefined && (\n <div className='flex justify-center items-center gap-2 w-[5rem] text-xs text-subdued'>\n <Icon icon='ph--users--regular' size={4} />\n <div>{participants}</div>\n </div>\n )) || <NaturalToolbar.Separator variant='gap' />}\n\n {joined && (\n <>\n <ToggleButton\n disabled={!canSharescreen}\n active={isScreensharing}\n state={{\n on: {\n icon: 'ph--monitor--regular',\n label: t('screenshare off'),\n onClick: () => call.turnScreenshareOff(),\n },\n off: {\n icon: 'ph--monitor-arrow-up--duotone',\n label: t('screenshare on'),\n onClick: () => call.turnScreenshareOn(),\n },\n }}\n />\n\n {/* Companion actions. */}\n {actions\n .filter((action): action is Node.Action => Node.isAction(action))\n .map((action) => (\n <IconButton\n key={action.id}\n {...defaultButtonProps}\n icon={action.properties.icon}\n label={toLocalizedString(action.properties.label, t)}\n classNames={action.properties.classNames}\n onClick={() => node && void runAction(action, { parent: node })}\n />\n ))}\n\n <ToggleButton\n active={raisedHand}\n state={{\n on: {\n icon: 'ph--hand-waving--regular',\n label: t('lower hand'),\n onClick: () => call.setRaisedHand(false),\n },\n off: {\n icon: 'ph--hand-palm--duotone',\n label: t('raise hand'),\n onClick: () => call.setRaisedHand(true),\n },\n }}\n />\n </>\n )}\n {joined ? (\n <IconButton variant='destructive' icon='ph--phone-x--regular' label={t('leave call')} onClick={onLeave} />\n ) : (\n <IconButton variant='primary' icon='ph--phone-incoming--regular' label={t('join call')} onClick={onJoin} />\n )}\n </NaturalToolbar.Root>\n </div>\n );\n};\n\nToolbar.displayName = 'MeetingToolbar';\n\ntype ToolbarButtonProps = Pick<IconButtonProps, 'disabled'> & {\n active?: boolean;\n state: {\n on: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n off: Pick<IconButtonProps, 'icon' | 'label' | 'onClick' | 'classNames'>;\n };\n};\n\nconst defaultButtonProps: Partial<IconButtonProps> = {\n size: 5,\n iconOnly: true,\n};\n\nconst ToggleButton = ({ active, state }: ToolbarButtonProps) => (\n <IconButton\n {...defaultButtonProps}\n classNames={[active ? (state.on.classNames ?? 'bg-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 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 { CommentsThreadContainer, type CommentsThreadContainerProps } from './CommentsThreadContainer';\n\nexport type CommentsContainerProps = Omit<CommentsThreadContainerProps, 'anchor' | 'current'> & {\n anchors: AnchoredTo.AnchoredTo[];\n currentId?: string;\n showResolvedThreads?: boolean;\n};\n\n/**\n * Root container for collection of comment threads.\n */\nexport const CommentsContainer = ({ anchors, currentId, showResolvedThreads, ...props }: CommentsContainerProps) => {\n const { t } = useTranslation(meta.id);\n\n // TODO(wittjosiah): There seems to be a race between thread and anchor being deleted.\n const filteredAnchors = showResolvedThreads\n ? anchors.filter((anchor) => !!Relation.getSource(anchor))\n : anchors.filter((anchor) => {\n const thread = Relation.getSource(anchor);\n // 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 role='none' className='p-form-padding'>\n <Message.Root>\n <Message.Title>\n <Trans\n {...{\n t,\n i18nKey: 'no comments message',\n components: {\n commentIcon: <Icon icon='ph--chat-text--regular' size={4} classNames='w-block' />,\n },\n }}\n />\n </Message.Title>\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 <CommentsThreadContainer key={threadId} anchor={anchor} current={currentId === threadId} {...props} />;\n })}\n </div>\n );\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Relation } from '@dxos/echo';\nimport { useObject } from '@dxos/echo-react';\nimport { getSpace, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { IconButton, Tag, Tooltip, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread as ThreadComponent,\n type ThreadRootProps,\n} from '@dxos/react-ui-thread';\nimport { type AnchoredTo, type Thread } from '@dxos/types';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/ui-theme';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer, buttonClassNames, buttonGroupClassNames } from './MessageContainer';\n\nexport type CommentsThreadContainerProps = {\n anchor: AnchoredTo.AnchoredTo;\n onAttend?: (anchor: AnchoredTo.AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo.AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo.AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo.AnchoredTo) => void;\n onAcceptProposal?: (anchor: AnchoredTo.AnchoredTo, messageId: string) => void;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const CommentsThreadContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n onAcceptProposal,\n}: CommentsThreadContainerProps) => {\n const { themeMode } = useThemeContext();\n const { t } = useTranslation(meta.id);\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.id);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as Thread.Thread;\n const [messages] = useObject(thread, 'messages');\n const activity = useStatus(space, Obj.getDXN(thread).toString());\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n\n const textboxMetadata = getMessageMetadata(Obj.getDXN(thread).toString(), identity);\n\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [state, setState] = useState({});\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: ({ text }) => (messageRef.current = text) }),\n command,\n ],\n [state],\n );\n\n // TODO(thure): Factor out.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n const handleAttend = useCallback(() => onAttend?.(anchor), [onAttend, anchor]);\n const handleResolve = useCallback(() => onResolve?.(anchor), [onResolve, anchor]);\n const handleMessageDelete = useCallback((id: string) => onMessageDelete?.(anchor, id), [onMessageDelete, anchor]);\n const handleThreadDelete = useCallback(() => onThreadDelete?.(anchor), [onThreadDelete, anchor]);\n const handleAcceptProposal = useCallback((id: string) => onAcceptProposal?.(anchor, id), [onAcceptProposal, anchor]);\n\n const handleComment: MessageTextboxProps['onSend'] = useCallback(() => {\n if (!messageRef.current) {\n return false;\n }\n\n onComment?.(anchor, messageRef.current);\n messageRef.current = '';\n scrollToEnd('instant');\n setState({});\n\n return true;\n }, [anchor, identity]);\n\n return (\n <ThreadComponent.Root\n id={Obj.getDXN(thread).toString()}\n classNames='pt-2 border-b border-subdued-separator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--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 role='none' className={buttonGroupClassNames}>\n {thread.status === 'staged' && <Tag palette='neutral'>{t('draft button')}</Tag>}\n {onResolve && !(thread?.status === 'staged') && (\n <IconButton\n data-testid='thread.resolve'\n variant='ghost'\n icon={thread?.status === 'resolved' ? 'ph--check--fill' : 'ph--check--regular'}\n iconOnly\n label={t('resolve thread label')}\n classNames={[buttonClassNames, thread?.status !== 'resolved' && hoverableControlItem]}\n onClick={handleResolve}\n />\n )}\n {onThreadDelete && (\n <IconButton\n data-testid='thread.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete thread label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleThreadDelete}\n />\n )}\n </div>\n </div>\n\n {messages?.map((ref) => (\n <MessageContainer\n key={ref.dxn.toString()}\n editable\n message={ref}\n members={members}\n onDelete={handleMessageDelete}\n onAcceptProposal={handleAcceptProposal}\n />\n ))}\n\n {/*\n TODO(wittjosiah): Can't autofocus this generally.\n There can be multiple threads with inputs and they can't all be focused.\n Also, it steals focus from documents when first rendered.\n Need to find a way to autofocus in one scenario only: when a new thread is created.\n */}\n <MessageTextbox extensions={extensions} onSend={handleComment} {...textboxMetadata} />\n\n <ThreadComponent.Status activity={activity}>{t('activity message')}</ThreadComponent.Status>\n\n <div role='none' className='h-px -mt-px' ref={threadScrollRef} />\n </ThreadComponent.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/ui-editor';\nimport { mx } from '@dxos/ui-theme';\n\n/**\n * https://github.com/codemirror/stream-parser/blob/main/test/test-stream-parser.ts\n */\nconst parser = StreamLanguage.define<{ count: number }>({\n startState: () => ({ count: 0 }),\n token: (stream, state) => {\n state.count++;\n if (stream.eatSpace()) {\n return null;\n }\n if (state.count === 1 && stream.match(/^(\\/\\w+)/)) {\n return 'tagName';\n }\n stream.next();\n return null;\n },\n});\n\nconst styles = HighlightStyle.define([\n {\n tag: tags.tagName,\n class: mx('dx-tag dx-tag--indigo text-base-surface-text font-medium'),\n },\n]);\n\nexport const command: Extension = [parser, syntaxHighlighting(styles)];\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { EditorView } from '@codemirror/view';\nimport React, { forwardRef, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { Surface } from '@dxos/app-framework/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';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\n\nexport const buttonGroupClassNames = 'flex flex-row items-center gap-0.5 pe-2';\nexport const buttonClassNames = 'p-1! transition-opacity';\n\nexport type MessageContainerProps = {\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 MessageContainer = ({\n message: messageOrRef,\n members,\n editable = false,\n onDelete,\n onAcceptProposal,\n}: MessageContainerProps) => {\n const { t } = useTranslation(meta.id);\n const [message, updateMessage] = useObject(messageOrRef);\n const identity = useIdentity();\n const [editing, setEditing] = useState(false);\n\n const textBlockIndex = message?.blocks.findIndex((block) => block._tag === 'text') ?? -1;\n\n const handleEdit = useCallback(() => setEditing((editing) => !editing), []);\n const handleDelete = useCallback(() => message && onDelete?.(message.id), [message, onDelete]);\n const handleAcceptProposal = useCallback(\n () => message && onAcceptProposal?.(message.id),\n [message, onAcceptProposal],\n );\n const handleTextBlockChange = useCallback(\n (newText: string) => {\n updateMessage((m) => {\n const targetBlock = m.blocks[textBlockIndex];\n if (targetBlock && targetBlock._tag === 'text') {\n targetBlock.text = newText;\n }\n });\n },\n [updateMessage, textBlockIndex],\n );\n\n const textBlock =\n message && textBlockIndex !== -1 ? (message.blocks[textBlockIndex] as ContentBlock.Text) : undefined;\n useOnEditAnalytics(message, textBlock, !!editing);\n\n if (!message) {\n return null;\n }\n\n const senderIdentity = members.find(\n (member) =>\n (message.sender.identityDid && member.identity.did === message.sender.identityDid) ||\n (message.sender.identityKey && PublicKey.equals(member.identity.identityKey, message.sender.identityKey)),\n )?.identity;\n const messageMetadata = getMessageMetadata(message.id, senderIdentity);\n const userIsAuthor = identity?.did === messageMetadata.authorId;\n const proposalBlock = message.blocks.find((block) => block._tag === 'proposal');\n const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <div role='none' className={buttonGroupClassNames}>\n {userIsAuthor && editable && (\n <IconButton\n data-testid={editing ? 'thread.message.save' : 'thread.message.edit'}\n variant='ghost'\n icon={editing ? 'ph--check--regular' : 'ph--pencil-simple--regular'}\n iconOnly\n label={t(editing ? 'save message label' : 'edit message label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleEdit}\n />\n )}\n {/* TODO(wittjosiah): Proposal controls should probably be hoisted to thread level. */}\n {proposalBlock && onAcceptProposal && (\n <IconButton\n data-testid='thread.message.accept'\n variant='ghost'\n icon='ph--check--regular'\n iconOnly\n label={t('accept proposal label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleAcceptProposal}\n />\n )}\n {onDelete && (\n <IconButton\n data-testid='thread.message.delete'\n variant='ghost'\n icon='ph--x--regular'\n iconOnly\n label={t('delete message label')}\n classNames={[buttonClassNames, hoverableControlItem]}\n onClick={handleDelete}\n />\n )}\n </div>\n </MessageHeading>\n {textBlock && (\n <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} onSave={handleTextBlockChange} />\n )}\n {proposalBlock && <ProposalBlock block={proposalBlock} />}\n {Ref.Array.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference as Obj.Unknown} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Obj.Unknown }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n onSave,\n}: {\n block: ContentBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\n onSave?: (newText: string) => void;\n}) => {\n const { themeMode } = useThemeContext();\n const inMemoryContentRef = useRef(block.text);\n\n const handleDocumentChange = useCallback((newState: string) => {\n inMemoryContentRef.current = newState;\n }, []);\n\n const saveDocumentChange = useCallback(() => {\n onSave?.(inMemoryContentRef.current);\n }, [onSave]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div role='none' ref={parentRef} className='me-4' {...focusAttributes} />;\n};\n\nconst ProposalBlock = ({ block }: { block: ContentBlock.Proposal }) => {\n return (\n <div role='none' className='me-4 italic'>\n {block.text}\n </div>\n );\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Unknown }>(({ subject }, forwardedRef) => {\n // TODO(burdon): Use annotation to get title.\n let title = (subject as any).name ?? (subject as any).title ?? (subject as any).type ?? 'Object';\n if (typeof title !== 'string') {\n title = title?.content ?? '';\n }\n\n return (\n <Card.Root\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface.Surface role='card--content' limit={1} data={{ subject }} fallback={title} />\n </Card.Root>\n );\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useAtomValue", "React", "useCapability", "React", "useEffect", "useRef", "AudioStream", "tracks", "mediaStreamRef", "useRef", "MediaStream", "ref", "useEffect", "audio", "current", "mediaStream", "srcObject", "resetSrcObject", "addEventListener", "play", "once", "autoPlay", "map", "track", "AudioTrack", "key", "id", "currentTrack", "addTrack", "removeTrack", "React", "forwardRef", "memo", "useEffect", "useRef", "mx", "VideoObject", "memo", "forwardRef", "videoStream", "classNames", "flip", "contain", "rest", "ref", "internalRef", "useRef", "useEffect", "video", "current", "srcObject", "setAttribute", "React", "className", "mx", "v", "displayName", "useAtomValue", "React", "memo", "useMemo", "useCapability", "React", "mx", "ResponsiveContainer", "children", "React", "div", "role", "className", "mx", "React", "useCallback", "useEffect", "useLayoutEffect", "useMemo", "useState", "useResizeDetector", "invariant", "mx", "ASPECT_RATIO", "MIN_GALLERY_HEIGHT", "DEFAULT_GAP", "maxImageSize", "defaultGetId", "item", "id", "ResponsiveGrid", "classNames", "Cell", "gap", "getId", "items", "pinned", "autoHideGallery", "debug", "onPinnedChange", "width", "containerWidth", "height", "containerHeight", "ref", "containerRef", "useResizeDetector", "refreshRate", "dividerHeight", "setDividerHeight", "useState", "useEffect", "fitAspectRatio", "Math", "min", "pinnedItem", "useMemo", "find", "mainItems", "filter", "hideGallery", "undefined", "time", "columns", "cellWidth", "setLayout", "gridContainerRef", "layout", "calculateLayout", "length", "Date", "now", "bounds", "setBounds", "useLayoutEffect", "current", "t", "setTimeout", "map", "invariant", "el", "querySelector", "getRelativeBounds", "clearTimeout", "handleClick", "useCallback", "React", "div", "className", "mx", "style", "SoloItem", "minHeight", "role", "display", "gridTemplateColumns", "key", "onClick", "ResponsiveContainer", "img", "alt", "container", "containerRect", "getBoundingClientRect", "elementRect", "top", "left", "count", "aspectRatio", "minWastedSpace", "Infinity", "bestColumns", "rows", "cols", "ceil", "itemWidth", "itemHeight", "fitItemsToGrid", "usedWidth", "usedHeight", "wastedSpace", "outerWidth", "outerHeight", "numCols", "numRows", "availableWidth", "availableHeight", "maxCellWidth", "maxCellHeight", "React", "useEffect", "useState", "Icon", "IconButton", "useTranslation", "Waveform", "groupHoverControlItemWithTransition", "mx", "ResponsiveGridItem", "children", "classNames", "item", "style", "name", "self", "pinned", "screenshare", "video", "mute", "wave", "speaking", "onClick", "t", "useTranslation", "meta", "id", "iconProps", "icon", "label", "props", "undefined", "speakingIndicator", "setSpeakingIndicator", "useState", "useEffect", "timeout", "setTimeout", "clearTimeout", "React", "div", "className", "mx", "IconButton", "groupHoverControlItemWithTransition", "iconOnly", "size", "Icon", "Waveform", "active", "SCREENSHARE_SUFFIX", "Participant", "memo", "item", "user", "debug", "props", "call", "useCapability", "ThreadCapabilities", "CallManager", "self", "useAtomValue", "selfAtom", "media", "mediaAtom", "isSelf", "id", "undefined", "startsWith", "isScreenshare", "endsWith", "pulledVideoStream", "useMemo", "trackName", "tracks", "screenshareEnabled", "screenshare", "videoEnabled", "video", "pulledVideoStreams", "stream", "videoStream", "screenshareVideoStream", "React", "ResponsiveGridItem", "name", "mute", "audioEnabled", "wave", "raisedHand", "speaking", "VideoObject", "flip", "contain", "classNames", "displayName", "React", "useEffect", "useMemo", "useState", "getId", "user", "id", "ParticipantGrid", "classNames", "self", "users", "fullscreen", "debug", "pinned", "setPinned", "useState", "allUsers", "useMemo", "forEach", "joined", "push", "isSelf", "tracks", "screenshareEnabled", "screenshare", "SCREENSHARE_SUFFIX", "video", "videoEnabled", "useEffect", "find", "undefined", "sortedUsers", "sort", "a", "b", "React", "ResponsiveGrid", "Cell", "Participant", "items", "autoHideGallery", "onPinnedChange", "useAtomValue", "React", "useCapability", "useAppGraph", "Obj", "Node", "useActionRunner", "useActions", "useNode", "Icon", "IconButton", "Toolbar", "NaturalToolbar", "toLocalizedString", "useTranslation", "groupHoverControlItemWithTransition", "mx", "Toolbar", "classNames", "channel", "participants", "autoHideControls", "onJoin", "onLeave", "t", "useTranslation", "meta", "id", "graph", "useAppGraph", "runAction", "useActionRunner", "call", "useCapability", "ThreadCapabilities", "CallManager", "media", "useAtomValue", "mediaAtom", "joined", "joinedAtom", "raisedHand", "raisedHandAtom", "node", "useNode", "Obj", "getDXN", "toString", "actions", "useActions", "filter", "action", "properties", "disposition", "isScreensharing", "screenshareTrack", "undefined", "canSharescreen", "navigator", "mediaDevices", "getDisplayMedia", "React", "div", "className", "mx", "groupHoverControlItemWithTransition", "NaturalToolbar", "Root", "ToggleButton", "active", "audioEnabled", "state", "on", "icon", "label", "onClick", "turnAudioOff", "off", "turnAudioOn", "videoEnabled", "turnVideoOff", "turnVideoOn", "Icon", "size", "Separator", "variant", "disabled", "turnScreenshareOff", "turnScreenshareOn", "Node", "isAction", "map", "IconButton", "key", "defaultButtonProps", "toLocalizedString", "parent", "setRaisedHand", "displayName", "iconOnly", "CallRoot", "children", "React", "div", "className", "displayName", "CallAudio", "call", "useCapability", "ThreadCapabilities", "CallManager", "audioTracksToPlay", "useAtomValue", "audioTracksToPlayAtom", "AudioStream", "tracks", "CallGrid", "fullscreen", "debug", "useDebugMode", "self", "selfAtom", "users", "usersAtom", "ParticipantGrid", "CallToolbar", "props", "Toolbar", "isInRoom", "Call", "Root", "Grid", "Audio", "React", "useEffect", "Obj", "Relation", "Icon", "Message", "Trans", "useTranslation", "React", "useCallback", "useMemo", "useRef", "useState", "Obj", "Relation", "useObject", "getSpace", "useMembers", "useIdentity", "IconButton", "Tag", "Tooltip", "useThemeContext", "useTranslation", "MessageTextbox", "Thread", "ThreadComponent", "createBasicExtensions", "createThemeExtensions", "listener", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "HighlightStyle", "StreamLanguage", "syntaxHighlighting", "tags", "mx", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "EditorView", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "Ref", "useObject", "PublicKey", "useIdentity", "IconButton", "useOnTransition", "useThemeContext", "useTranslation", "Card", "useTextEditor", "MessageHeading", "MessageRoot", "createBasicExtensions", "createThemeExtensions", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "buttonGroupClassNames", "buttonClassNames", "MessageContainer", "message", "messageOrRef", "members", "editable", "onDelete", "onAcceptProposal", "t", "useTranslation", "meta", "id", "updateMessage", "useObject", "identity", "useIdentity", "editing", "setEditing", "useState", "textBlockIndex", "blocks", "findIndex", "block", "_tag", "handleEdit", "useCallback", "handleDelete", "handleAcceptProposal", "handleTextBlockChange", "newText", "m", "targetBlock", "text", "textBlock", "undefined", "useOnEditAnalytics", "senderIdentity", "find", "member", "sender", "identityDid", "did", "identityKey", "PublicKey", "equals", "messageMetadata", "getMessageMetadata", "userIsAuthor", "authorId", "proposalBlock", "references", "filter", "map", "reference", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "div", "role", "className", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "hoverableControlItem", "onClick", "TextboxBlock", "isAuthor", "onSave", "ProposalBlock", "Ref", "Array", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "handleDocumentChange", "newState", "current", "saveDocumentChange", "useOnTransition", "parentRef", "focusAttributes", "view", "useTextEditor", "initialValue", "extensions", "createBasicExtensions", "readOnly", "createThemeExtensions", "command", "EditorView", "updateListener", "of", "update", "docChanged", "state", "doc", "toString", "useEffect", "focus", "ref", "forwardRef", "forwardedRef", "title", "name", "type", "content", "Card", "Root", "mx", "Surface", "limit", "data", "fallback", "CommentsThreadContainer", "anchor", "current", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "onAcceptProposal", "themeMode", "useThemeContext", "t", "useTranslation", "meta", "id", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "detached", "thread", "Relation", "getSource", "messages", "useObject", "activity", "useStatus", "Obj", "getDXN", "toString", "threadScrollRef", "useRef", "textboxMetadata", "getMessageMetadata", "state", "setState", "useState", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "handleThreadDelete", "handleAcceptProposal", "handleComment", "React", "ThreadComponent", "Root", "classNames", "onClickCapture", "onFocusCapture", "div", "role", "className", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Tooltip", "Trigger", "asChild", "content", "side", "Header", "name", "buttonGroupClassNames", "status", "Tag", "palette", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "buttonClassNames", "hoverableControlItem", "onClick", "map", "ref", "MessageContainer", "key", "dxn", "editable", "message", "onDelete", "MessageTextbox", "onSend", "Status", "CommentsContainer", "anchors", "currentId", "showResolvedThreads", "props", "t", "useTranslation", "meta", "id", "filteredAnchors", "filter", "anchor", "Relation", "getSource", "thread", "status", "useEffect", "document", "getElementById", "scrollIntoView", "behavior", "block", "length", "React", "div", "role", "className", "Message", "Root", "Title", "Trans", "i18nKey", "components", "commentIcon", "Icon", "icon", "size", "classNames", "map", "threadId", "Obj", "getDXN", "toString", "CommentsThreadContainer", "key", "current"]
|
|
7
|
-
}
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createBlackCanvasStreamTrack,
|
|
3
|
-
createInaudibleAudioStreamTrack
|
|
4
|
-
} from "./chunk-ISCHODBV.mjs";
|
|
5
|
-
|
|
6
|
-
// src/hooks/analytics.ts
|
|
7
|
-
import { useCallback } from "react";
|
|
8
|
-
import { useOperationInvoker } from "@dxos/app-framework/ui";
|
|
9
|
-
import { Obj } from "@dxos/echo";
|
|
10
|
-
import { ObservabilityOperation } from "@dxos/plugin-observability/types";
|
|
11
|
-
import { useOnTransition } from "@dxos/react-ui";
|
|
12
|
-
var useOnEditAnalytics = (message, textBlock, editing) => {
|
|
13
|
-
const { invokePromise } = useOperationInvoker();
|
|
14
|
-
const onEdit = useCallback(() => {
|
|
15
|
-
if (!message || !textBlock) {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
const db = Obj.getDatabase(message);
|
|
19
|
-
if (!db) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
void invokePromise(ObservabilityOperation.SendEvent, {
|
|
23
|
-
name: "threads.message.update",
|
|
24
|
-
properties: {
|
|
25
|
-
spaceId: db.spaceId,
|
|
26
|
-
messageId: message.id,
|
|
27
|
-
messageLength: textBlock?.text.length
|
|
28
|
-
}
|
|
29
|
-
});
|
|
30
|
-
}, [
|
|
31
|
-
invokePromise,
|
|
32
|
-
message,
|
|
33
|
-
textBlock
|
|
34
|
-
]);
|
|
35
|
-
useOnTransition(editing, true, false, onEdit);
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
// src/hooks/useBlackCanvasStreamTrack.tsx
|
|
39
|
-
import { useEffect, useState } from "react";
|
|
40
|
-
import { scheduleTask } from "@dxos/async";
|
|
41
|
-
import { Context } from "@dxos/context";
|
|
42
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/hooks/useBlackCanvasStreamTrack.tsx";
|
|
43
|
-
var useBlackCanvasStreamTrack = () => {
|
|
44
|
-
const [blackCanvasStreamTrack, setBlackCanvasStreamTrack] = useState(void 0);
|
|
45
|
-
useEffect(() => {
|
|
46
|
-
const ctx = new Context(void 0, {
|
|
47
|
-
F: __dxlog_file,
|
|
48
|
-
L: 15
|
|
49
|
-
});
|
|
50
|
-
scheduleTask(ctx, async () => {
|
|
51
|
-
const blackCanvasStreamTrack2 = await createBlackCanvasStreamTrack({
|
|
52
|
-
ctx,
|
|
53
|
-
width: 720,
|
|
54
|
-
height: 480
|
|
55
|
-
});
|
|
56
|
-
setBlackCanvasStreamTrack(blackCanvasStreamTrack2);
|
|
57
|
-
});
|
|
58
|
-
return () => {
|
|
59
|
-
void ctx.dispose();
|
|
60
|
-
};
|
|
61
|
-
}, []);
|
|
62
|
-
return blackCanvasStreamTrack;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
// src/hooks/useDebugMode.ts
|
|
66
|
-
import { useEffect as useEffect2, useState as useState2 } from "react";
|
|
67
|
-
var useDebugMode = () => {
|
|
68
|
-
const [enabled, setEnabled] = useState2(false);
|
|
69
|
-
useEffect2(() => {
|
|
70
|
-
const handler = (ev) => {
|
|
71
|
-
if (ev.key.toLowerCase() === "d" && ev.ctrlKey) {
|
|
72
|
-
ev.preventDefault();
|
|
73
|
-
setEnabled(!enabled);
|
|
74
|
-
}
|
|
75
|
-
};
|
|
76
|
-
document.addEventListener("keypress", handler);
|
|
77
|
-
return () => {
|
|
78
|
-
document.removeEventListener("keypress", handler);
|
|
79
|
-
};
|
|
80
|
-
}, [
|
|
81
|
-
enabled
|
|
82
|
-
]);
|
|
83
|
-
return enabled;
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
// src/hooks/useInaudibleAudioStreamTrack.tsx
|
|
87
|
-
import { useEffect as useEffect3, useState as useState3 } from "react";
|
|
88
|
-
import { scheduleTask as scheduleTask2 } from "@dxos/async";
|
|
89
|
-
import { Context as Context2 } from "@dxos/context";
|
|
90
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/hooks/useInaudibleAudioStreamTrack.tsx";
|
|
91
|
-
var useInaudibleAudioStreamTrack = () => {
|
|
92
|
-
const [audioStreamTrack, setAudioStreamTrack] = useState3(void 0);
|
|
93
|
-
useEffect3(() => {
|
|
94
|
-
const ctx = new Context2(void 0, {
|
|
95
|
-
F: __dxlog_file2,
|
|
96
|
-
L: 15
|
|
97
|
-
});
|
|
98
|
-
scheduleTask2(ctx, async () => {
|
|
99
|
-
const audioStreamTrack2 = await createInaudibleAudioStreamTrack({
|
|
100
|
-
ctx
|
|
101
|
-
});
|
|
102
|
-
setAudioStreamTrack(audioStreamTrack2);
|
|
103
|
-
});
|
|
104
|
-
return () => {
|
|
105
|
-
void ctx.dispose();
|
|
106
|
-
};
|
|
107
|
-
}, []);
|
|
108
|
-
return audioStreamTrack;
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
// src/hooks/useStatus.ts
|
|
112
|
-
import { useEffect as useEffect4, useState as useState4 } from "react";
|
|
113
|
-
var useStatus = (space, channel) => {
|
|
114
|
-
const [processing, setProcessing] = useState4(false);
|
|
115
|
-
useEffect4(() => {
|
|
116
|
-
if (!space || !channel) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
const unsubscribe = space.listen(`status/${channel}`, (status) => {
|
|
120
|
-
const { event } = status.payload ?? {};
|
|
121
|
-
setProcessing(event === "processing");
|
|
122
|
-
});
|
|
123
|
-
const t = setInterval(() => {
|
|
124
|
-
setProcessing((prev) => {
|
|
125
|
-
if (typeof prev?.ts === "number" && Date.now() - prev.ts > 3e4) {
|
|
126
|
-
return void 0;
|
|
127
|
-
} else {
|
|
128
|
-
return prev;
|
|
129
|
-
}
|
|
130
|
-
});
|
|
131
|
-
}, 1e3);
|
|
132
|
-
return () => {
|
|
133
|
-
unsubscribe();
|
|
134
|
-
clearInterval(t);
|
|
135
|
-
};
|
|
136
|
-
}, [
|
|
137
|
-
space,
|
|
138
|
-
channel
|
|
139
|
-
]);
|
|
140
|
-
return processing;
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
// src/hooks/useVideoStreamTrack.tsx
|
|
144
|
-
import { useEffect as useEffect5, useRef, useState as useState5 } from "react";
|
|
145
|
-
var useVideoStreamTrack = (videoElement, videoSrc) => {
|
|
146
|
-
const [videoStreamTrack, setVideoStreamTrack] = useState5(void 0);
|
|
147
|
-
const hadRun = useRef(false);
|
|
148
|
-
useEffect5(() => {
|
|
149
|
-
if (!videoElement.current || hadRun.current || !videoSrc) {
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
hadRun.current = true;
|
|
153
|
-
videoElement.current.addEventListener("playing", () => {
|
|
154
|
-
if (videoStreamTrack) {
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
const stream = videoElement.current.captureStream();
|
|
158
|
-
const track = stream.getTracks()[0];
|
|
159
|
-
if (track && !videoStreamTrack) {
|
|
160
|
-
setVideoStreamTrack(track);
|
|
161
|
-
}
|
|
162
|
-
stream.onaddtrack = (event) => {
|
|
163
|
-
if (event.track.kind === "video" && !videoStreamTrack) {
|
|
164
|
-
setVideoStreamTrack(event.track);
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
});
|
|
168
|
-
videoElement.current.src = videoSrc;
|
|
169
|
-
}, [
|
|
170
|
-
videoElement.current,
|
|
171
|
-
videoSrc
|
|
172
|
-
]);
|
|
173
|
-
return videoStreamTrack;
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
export {
|
|
177
|
-
useOnEditAnalytics,
|
|
178
|
-
useBlackCanvasStreamTrack,
|
|
179
|
-
useDebugMode,
|
|
180
|
-
useInaudibleAudioStreamTrack,
|
|
181
|
-
useStatus,
|
|
182
|
-
useVideoStreamTrack
|
|
183
|
-
};
|
|
184
|
-
//# sourceMappingURL=chunk-HDLDMR54.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/hooks/analytics.ts", "../../../src/hooks/useBlackCanvasStreamTrack.tsx", "../../../src/hooks/useDebugMode.ts", "../../../src/hooks/useInaudibleAudioStreamTrack.tsx", "../../../src/hooks/useStatus.ts", "../../../src/hooks/useVideoStreamTrack.tsx"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { useOperationInvoker } from '@dxos/app-framework/ui';\nimport { Obj } from '@dxos/echo';\nimport { ObservabilityOperation } from '@dxos/plugin-observability/types';\nimport { useOnTransition } from '@dxos/react-ui';\nimport { type ContentBlock } from '@dxos/types';\n\nexport const useOnEditAnalytics = (\n message: any | undefined,\n textBlock: ContentBlock.Text | undefined,\n editing: boolean,\n) => {\n const { invokePromise } = useOperationInvoker();\n\n const onEdit = useCallback(() => {\n if (!message || !textBlock) {\n return;\n }\n\n const db = Obj.getDatabase(message);\n if (!db) {\n return;\n }\n\n void invokePromise(ObservabilityOperation.SendEvent, {\n name: 'threads.message.update',\n properties: {\n spaceId: db.spaceId,\n messageId: message.id,\n messageLength: textBlock?.text.length,\n },\n });\n }, [invokePromise, message, textBlock]);\n\n useOnTransition(editing, true, false, onEdit);\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { scheduleTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\n\nimport { createBlackCanvasStreamTrack } from '../calls/util/stub-media-streams';\n\nexport const useBlackCanvasStreamTrack = () => {\n const [blackCanvasStreamTrack, setBlackCanvasStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);\n useEffect(() => {\n const ctx = new Context();\n scheduleTask(ctx, async () => {\n const blackCanvasStreamTrack = await createBlackCanvasStreamTrack({ ctx, width: 720, height: 480 });\n setBlackCanvasStreamTrack(blackCanvasStreamTrack);\n });\n\n return () => {\n void ctx.dispose();\n };\n }, []);\n\n return blackCanvasStreamTrack;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\n// TODO(burdon): Standardize across plugins/composer.\nexport const useDebugMode = () => {\n const [enabled, setEnabled] = useState(false);\n useEffect(() => {\n const handler = (ev: KeyboardEvent) => {\n if (ev.key.toLowerCase() === 'd' && ev.ctrlKey) {\n ev.preventDefault();\n setEnabled(!enabled);\n }\n };\n\n document.addEventListener('keypress', handler);\n return () => {\n document.removeEventListener('keypress', handler);\n };\n }, [enabled]);\n\n return enabled;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { scheduleTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\n\nimport { createInaudibleAudioStreamTrack } from '../calls/util/stub-media-streams';\n\nexport const useInaudibleAudioStreamTrack = () => {\n const [audioStreamTrack, setAudioStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);\n useEffect(() => {\n const ctx = new Context();\n scheduleTask(ctx, async () => {\n const audioStreamTrack = await createInaudibleAudioStreamTrack({ ctx });\n setAudioStreamTrack(audioStreamTrack);\n });\n\n return () => {\n void ctx.dispose();\n };\n }, []);\n\n return audioStreamTrack;\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type Space } from '@dxos/react-client/echo';\n\n// TODO(burdon): Generalize and factor out.\nexport const useStatus = (space?: Space, channel?: string) => {\n const [processing, setProcessing] = useState(false);\n useEffect(() => {\n if (!space || !channel) {\n return;\n }\n\n const unsubscribe = space.listen(`status/${channel}`, (status) => {\n const { event } = status.payload ?? {};\n setProcessing(event === 'processing');\n });\n\n const t = setInterval(() => {\n setProcessing((prev: any) => {\n if (typeof prev?.ts === 'number' && Date.now() - prev.ts > 30_000) {\n return undefined;\n } else {\n return prev;\n }\n });\n }, 1_000);\n\n return () => {\n unsubscribe();\n clearInterval(t);\n };\n }, [space, channel]);\n\n return processing;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type RefObject, useEffect, useRef, useState } from 'react';\n\nexport const useVideoStreamTrack = (videoElement: RefObject<HTMLVideoElement | null>, videoSrc: string) => {\n // Get video stream track.\n const [videoStreamTrack, setVideoStreamTrack] = useState<MediaStreamTrack | undefined>(undefined);\n const hadRun = useRef(false);\n useEffect(() => {\n // This is done to capture only one video stream.\n if (!videoElement.current || hadRun.current || !videoSrc) {\n return;\n }\n hadRun.current = true;\n videoElement.current.addEventListener('playing', () => {\n if (videoStreamTrack) {\n return;\n }\n const stream = (videoElement.current as any).captureStream();\n const track = stream.getTracks()[0];\n if (track && !videoStreamTrack) {\n setVideoStreamTrack(track);\n }\n stream.onaddtrack = (event: MediaStreamTrackEvent) => {\n if (event.track.kind === 'video' && !videoStreamTrack) {\n setVideoStreamTrack(event.track);\n }\n };\n });\n videoElement.current.src = videoSrc;\n }, [videoElement.current, videoSrc]);\n\n return videoStreamTrack;\n};\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["useCallback", "useOperationInvoker", "Obj", "ObservabilityOperation", "useOnTransition", "useOnEditAnalytics", "message", "textBlock", "editing", "invokePromise", "useOperationInvoker", "onEdit", "useCallback", "db", "Obj", "getDatabase", "ObservabilityOperation", "SendEvent", "name", "properties", "spaceId", "messageId", "id", "messageLength", "text", "length", "useOnTransition", "useEffect", "useState", "scheduleTask", "Context", "useBlackCanvasStreamTrack", "blackCanvasStreamTrack", "setBlackCanvasStreamTrack", "useState", "undefined", "useEffect", "ctx", "Context", "scheduleTask", "createBlackCanvasStreamTrack", "width", "height", "dispose", "useEffect", "useState", "useDebugMode", "enabled", "setEnabled", "useState", "useEffect", "handler", "ev", "key", "toLowerCase", "ctrlKey", "preventDefault", "document", "addEventListener", "removeEventListener", "useEffect", "useState", "scheduleTask", "Context", "useInaudibleAudioStreamTrack", "audioStreamTrack", "setAudioStreamTrack", "useState", "undefined", "useEffect", "ctx", "Context", "scheduleTask", "createInaudibleAudioStreamTrack", "dispose", "useEffect", "useState", "useStatus", "space", "channel", "processing", "setProcessing", "useState", "useEffect", "unsubscribe", "listen", "status", "event", "payload", "t", "setInterval", "prev", "ts", "Date", "now", "undefined", "clearInterval", "useEffect", "useRef", "useState", "useVideoStreamTrack", "videoElement", "videoSrc", "videoStreamTrack", "setVideoStreamTrack", "useState", "undefined", "hadRun", "useRef", "useEffect", "current", "addEventListener", "stream", "captureStream", "track", "getTracks", "onaddtrack", "event", "kind", "src"]
|
|
7
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
// src/calls/util/stub-media-streams.ts
|
|
2
|
-
import { scheduleTaskInterval, waitForCondition } from "@dxos/async";
|
|
3
|
-
import { cancelWithContext } from "@dxos/context";
|
|
4
|
-
import { invariant } from "@dxos/invariant";
|
|
5
|
-
var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/stub-media-streams.ts";
|
|
6
|
-
var createBlackCanvasStreamTrack = async ({ ctx, width, height }) => {
|
|
7
|
-
const canvas = document.createElement("canvas");
|
|
8
|
-
canvas.width = width;
|
|
9
|
-
canvas.height = height;
|
|
10
|
-
const canvasCtx = canvas.getContext("2d");
|
|
11
|
-
invariant(canvasCtx, void 0, {
|
|
12
|
-
F: __dxlog_file,
|
|
13
|
-
L: 28,
|
|
14
|
-
S: void 0,
|
|
15
|
-
A: [
|
|
16
|
-
"canvasCtx",
|
|
17
|
-
""
|
|
18
|
-
]
|
|
19
|
-
});
|
|
20
|
-
const drawFrame = () => {
|
|
21
|
-
canvasCtx.fillStyle = "black";
|
|
22
|
-
canvasCtx.fillRect(0, 0, canvas.width, canvas.height);
|
|
23
|
-
};
|
|
24
|
-
scheduleTaskInterval(ctx, async () => drawFrame(), 200);
|
|
25
|
-
const track = canvas.captureStream().getVideoTracks()[0];
|
|
26
|
-
drawFrame();
|
|
27
|
-
await cancelWithContext(ctx, waitForCondition({
|
|
28
|
-
condition: () => track.readyState === "live",
|
|
29
|
-
timeout: 1e3
|
|
30
|
-
}));
|
|
31
|
-
return track;
|
|
32
|
-
};
|
|
33
|
-
var audioContextStartedPreviously = false;
|
|
34
|
-
var userGestureEvents = [
|
|
35
|
-
"click",
|
|
36
|
-
"contextmenu",
|
|
37
|
-
"auxclick",
|
|
38
|
-
"dblclick",
|
|
39
|
-
"mousedown",
|
|
40
|
-
"mouseup",
|
|
41
|
-
"pointerup",
|
|
42
|
-
"touchend",
|
|
43
|
-
"keydown",
|
|
44
|
-
"keyup"
|
|
45
|
-
];
|
|
46
|
-
var createInaudibleAudioStreamTrack = async ({ ctx }) => {
|
|
47
|
-
const audioContext = new window.AudioContext();
|
|
48
|
-
const oscillator = audioContext.createOscillator();
|
|
49
|
-
oscillator.type = "triangle";
|
|
50
|
-
oscillator.frequency.setValueAtTime(20, audioContext.currentTime);
|
|
51
|
-
const gainNode = audioContext.createGain();
|
|
52
|
-
gainNode.gain.setValueAtTime(0, audioContext.currentTime);
|
|
53
|
-
oscillator.connect(gainNode);
|
|
54
|
-
const destination = audioContext.createMediaStreamDestination();
|
|
55
|
-
gainNode.connect(destination);
|
|
56
|
-
let oscillatorStarted = false;
|
|
57
|
-
const ensureOscillatorStarted = () => {
|
|
58
|
-
if (oscillatorStarted) return;
|
|
59
|
-
oscillator.start();
|
|
60
|
-
oscillatorStarted = true;
|
|
61
|
-
};
|
|
62
|
-
const stateChangeHandler = () => {
|
|
63
|
-
if (audioContext.state === "running") {
|
|
64
|
-
audioContextStartedPreviously = true;
|
|
65
|
-
ensureOscillatorStarted();
|
|
66
|
-
}
|
|
67
|
-
if (audioContext.state === "suspended" || audioContext.state === "interrupted") {
|
|
68
|
-
resumeAudioContext();
|
|
69
|
-
}
|
|
70
|
-
};
|
|
71
|
-
audioContext.addEventListener("statechange", stateChangeHandler);
|
|
72
|
-
const resumeAudioContext = () => {
|
|
73
|
-
void audioContext.resume().then(() => {
|
|
74
|
-
cleanUpUserGestureListeners();
|
|
75
|
-
});
|
|
76
|
-
};
|
|
77
|
-
const cleanUpUserGestureListeners = () => {
|
|
78
|
-
userGestureEvents.forEach((gesture) => {
|
|
79
|
-
document.removeEventListener(gesture, resumeAudioContext, {
|
|
80
|
-
capture: true
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
};
|
|
84
|
-
if (audioContextStartedPreviously) {
|
|
85
|
-
resumeAudioContext();
|
|
86
|
-
} else {
|
|
87
|
-
userGestureEvents.forEach((gesture) => {
|
|
88
|
-
document.addEventListener(gesture, resumeAudioContext, {
|
|
89
|
-
capture: true
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
ctx.onDispose(async () => {
|
|
94
|
-
cleanUpUserGestureListeners();
|
|
95
|
-
oscillator.disconnect();
|
|
96
|
-
oscillator.stop();
|
|
97
|
-
await audioContext.close();
|
|
98
|
-
});
|
|
99
|
-
return destination.stream.getAudioTracks()[0];
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
export {
|
|
103
|
-
createBlackCanvasStreamTrack,
|
|
104
|
-
createInaudibleAudioStreamTrack
|
|
105
|
-
};
|
|
106
|
-
//# sourceMappingURL=chunk-ISCHODBV.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/calls/util/stub-media-streams.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n//\n\nimport { scheduleTaskInterval, waitForCondition } from '@dxos/async';\nimport { type Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\n\n/**\n * Creates a black canvas stream track.\n * We need this to to have black rectangle video that is live (have frames) when video feed is disabled.\n */\nexport const createBlackCanvasStreamTrack = async ({\n ctx,\n width,\n height,\n}: {\n ctx: Context;\n width: number;\n height: number;\n}): Promise<MediaStreamTrack> => {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n\n const canvasCtx = canvas.getContext('2d');\n invariant(canvasCtx);\n const drawFrame = () => {\n canvasCtx.fillStyle = 'black';\n canvasCtx.fillRect(0, 0, canvas.width, canvas.height);\n };\n scheduleTaskInterval(ctx, async () => drawFrame(), 200);\n\n const track = canvas.captureStream().getVideoTracks()[0];\n drawFrame();\n\n await cancelWithContext(ctx, waitForCondition({ condition: () => track.readyState === 'live', timeout: 1_000 }));\n\n return track;\n};\n\nlet audioContextStartedPreviously = false;\nconst userGestureEvents = [\n 'click',\n 'contextmenu',\n 'auxclick',\n 'dblclick',\n 'mousedown',\n 'mouseup',\n 'pointerup',\n 'touchend',\n 'keydown',\n 'keyup',\n];\n\n/**\n * Creates an inaudible audio stream track.\n * We need this to have audio track available when audio is disabled.\n */\nexport const createInaudibleAudioStreamTrack = async ({ ctx }: { ctx: Context }): Promise<MediaStreamTrack> => {\n const audioContext = new window.AudioContext();\n\n const oscillator = audioContext.createOscillator();\n oscillator.type = 'triangle';\n oscillator.frequency.setValueAtTime(20, audioContext.currentTime);\n\n const gainNode = audioContext.createGain();\n gainNode.gain.setValueAtTime(0, audioContext.currentTime);\n oscillator.connect(gainNode);\n\n const destination = audioContext.createMediaStreamDestination();\n gainNode.connect(destination);\n\n let oscillatorStarted = false;\n const ensureOscillatorStarted = () => {\n if (oscillatorStarted) return;\n oscillator.start();\n oscillatorStarted = true;\n };\n\n const stateChangeHandler = () => {\n if (audioContext.state === 'running') {\n audioContextStartedPreviously = true;\n ensureOscillatorStarted();\n }\n\n if (audioContext.state === 'suspended' || (audioContext.state as string) === 'interrupted') {\n resumeAudioContext();\n }\n };\n\n audioContext.addEventListener('statechange', stateChangeHandler);\n\n const resumeAudioContext = () => {\n void audioContext.resume().then(() => {\n cleanUpUserGestureListeners();\n });\n };\n\n const cleanUpUserGestureListeners = () => {\n userGestureEvents.forEach((gesture) => {\n document.removeEventListener(gesture, resumeAudioContext, {\n capture: true,\n });\n });\n };\n\n if (audioContextStartedPreviously) {\n resumeAudioContext();\n } else {\n userGestureEvents.forEach((gesture) => {\n document.addEventListener(gesture, resumeAudioContext, {\n capture: true,\n });\n });\n }\n\n ctx.onDispose(async () => {\n cleanUpUserGestureListeners();\n oscillator.disconnect();\n oscillator.stop();\n await audioContext.close();\n });\n\n return destination.stream.getAudioTracks()[0];\n};\n"],
|
|
5
|
-
"mappings": ";AAKA,SAASA,sBAAsBC,wBAAwB;AACvD,SAAuBC,yBAAyB;AAChD,SAASC,iBAAiB;;AAMnB,IAAMC,+BAA+B,OAAO,EACjDC,KACAC,OACAC,OAAM,MAKP;AACC,QAAMC,SAASC,SAASC,cAAc,QAAA;AACtCF,SAAOF,QAAQA;AACfE,SAAOD,SAASA;AAEhB,QAAMI,YAAYH,OAAOI,WAAW,IAAA;AACpCT,YAAUQ,WAAAA,QAAAA;;;;;;;;;AACV,QAAME,YAAY,MAAA;AAChBF,cAAUG,YAAY;AACtBH,cAAUI,SAAS,GAAG,GAAGP,OAAOF,OAAOE,OAAOD,MAAM;EACtD;AACAP,uBAAqBK,KAAK,YAAYQ,UAAAA,GAAa,GAAA;AAEnD,QAAMG,QAAQR,OAAOS,cAAa,EAAGC,eAAc,EAAG,CAAA;AACtDL,YAAAA;AAEA,QAAMX,kBAAkBG,KAAKJ,iBAAiB;IAAEkB,WAAW,MAAMH,MAAMI,eAAe;IAAQC,SAAS;EAAM,CAAA,CAAA;AAE7G,SAAOL;AACT;AAEA,IAAIM,gCAAgC;AACpC,IAAMC,oBAAoB;EACxB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOK,IAAMC,kCAAkC,OAAO,EAAEnB,IAAG,MAAoB;AAC7E,QAAMoB,eAAe,IAAIC,OAAOC,aAAY;AAE5C,QAAMC,aAAaH,aAAaI,iBAAgB;AAChDD,aAAWE,OAAO;AAClBF,aAAWG,UAAUC,eAAe,IAAIP,aAAaQ,WAAW;AAEhE,QAAMC,WAAWT,aAAaU,WAAU;AACxCD,WAASE,KAAKJ,eAAe,GAAGP,aAAaQ,WAAW;AACxDL,aAAWS,QAAQH,QAAAA;AAEnB,QAAMI,cAAcb,aAAac,6BAA4B;AAC7DL,WAASG,QAAQC,WAAAA;AAEjB,MAAIE,oBAAoB;AACxB,QAAMC,0BAA0B,MAAA;AAC9B,QAAID,kBAAmB;AACvBZ,eAAWc,MAAK;AAChBF,wBAAoB;EACtB;AAEA,QAAMG,qBAAqB,MAAA;AACzB,QAAIlB,aAAamB,UAAU,WAAW;AACpCtB,sCAAgC;AAChCmB,8BAAAA;IACF;AAEA,QAAIhB,aAAamB,UAAU,eAAgBnB,aAAamB,UAAqB,eAAe;AAC1FC,yBAAAA;IACF;EACF;AAEApB,eAAaqB,iBAAiB,eAAeH,kBAAAA;AAE7C,QAAME,qBAAqB,MAAA;AACzB,SAAKpB,aAAasB,OAAM,EAAGC,KAAK,MAAA;AAC9BC,kCAAAA;IACF,CAAA;EACF;AAEA,QAAMA,8BAA8B,MAAA;AAClC1B,sBAAkB2B,QAAQ,CAACC,YAAAA;AACzB1C,eAAS2C,oBAAoBD,SAASN,oBAAoB;QACxDQ,SAAS;MACX,CAAA;IACF,CAAA;EACF;AAEA,MAAI/B,+BAA+B;AACjCuB,uBAAAA;EACF,OAAO;AACLtB,sBAAkB2B,QAAQ,CAACC,YAAAA;AACzB1C,eAASqC,iBAAiBK,SAASN,oBAAoB;QACrDQ,SAAS;MACX,CAAA;IACF,CAAA;EACF;AAEAhD,MAAIiD,UAAU,YAAA;AACZL,gCAAAA;AACArB,eAAW2B,WAAU;AACrB3B,eAAW4B,KAAI;AACf,UAAM/B,aAAagC,MAAK;EAC1B,CAAA;AAEA,SAAOnB,YAAYoB,OAAOC,eAAc,EAAG,CAAA;AAC7C;",
|
|
6
|
-
"names": ["scheduleTaskInterval", "waitForCondition", "cancelWithContext", "invariant", "createBlackCanvasStreamTrack", "ctx", "width", "height", "canvas", "document", "createElement", "canvasCtx", "getContext", "drawFrame", "fillStyle", "fillRect", "track", "captureStream", "getVideoTracks", "condition", "readyState", "timeout", "audioContextStartedPreviously", "userGestureEvents", "createInaudibleAudioStreamTrack", "audioContext", "window", "AudioContext", "oscillator", "createOscillator", "type", "frequency", "setValueAtTime", "currentTime", "gainNode", "createGain", "gain", "connect", "destination", "createMediaStreamDestination", "oscillatorStarted", "ensureOscillatorStarted", "start", "stateChangeHandler", "state", "resumeAudioContext", "addEventListener", "resume", "then", "cleanUpUserGestureListeners", "forEach", "gesture", "removeEventListener", "capture", "onDispose", "disconnect", "stop", "close", "stream", "getAudioTracks"]
|
|
7
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
// src/meta.ts
|
|
2
|
-
import { trim } from "@dxos/util";
|
|
3
|
-
var meta = {
|
|
4
|
-
id: "dxos.org/plugin/thread",
|
|
5
|
-
name: "Chat",
|
|
6
|
-
description: trim`
|
|
7
|
-
Multi-modal communication platform supporting text chat, voice, and video conferencing.
|
|
8
|
-
Create threaded conversations and add contextual comments directly on any workspace object.
|
|
9
|
-
`,
|
|
10
|
-
icon: "ph--video-conference--regular",
|
|
11
|
-
iconHue: "rose",
|
|
12
|
-
source: "https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-thread"
|
|
13
|
-
};
|
|
14
|
-
var THREAD_ITEM = `${meta.id}/item`;
|
|
15
|
-
|
|
16
|
-
export {
|
|
17
|
-
meta,
|
|
18
|
-
THREAD_ITEM
|
|
19
|
-
};
|
|
20
|
-
//# sourceMappingURL=chunk-LUK4UNFA.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/meta.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Plugin } from '@dxos/app-framework';\nimport { trim } from '@dxos/util';\n\n// TODO(wittjosiah): Needs screenshots.\nexport const meta: Plugin.Meta = {\n id: 'dxos.org/plugin/thread',\n name: 'Chat',\n description: trim`\n Multi-modal communication platform supporting text chat, voice, and video conferencing.\n Create threaded conversations and add contextual comments directly on any workspace object.\n `,\n icon: 'ph--video-conference--regular',\n iconHue: 'rose',\n source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/plugin-thread',\n};\n\nexport const THREAD_ITEM = `${meta.id}/item`;\n"],
|
|
5
|
-
"mappings": ";AAKA,SAASA,YAAY;AAGd,IAAMC,OAAoB;EAC/BC,IAAI;EACJC,MAAM;EACNC,aAAaC;;;;EAIbC,MAAM;EACNC,SAAS;EACTC,QAAQ;AACV;AAEO,IAAMC,cAAc,GAAGR,KAAKC,EAAE;",
|
|
6
|
-
"names": ["trim", "meta", "id", "name", "description", "trim", "icon", "iconHue", "source", "THREAD_ITEM"]
|
|
7
|
-
}
|