@dxos/plugin-thread 0.8.4-main.67995b8 → 0.8.4-main.f5c0578

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.
Files changed (194) hide show
  1. package/dist/lib/browser/ChannelContainer-O2SFQJU7.mjs +16 -0
  2. package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs → ChatContainer-PVT3DUZJ.mjs} +4 -4
  3. package/dist/lib/browser/{app-graph-builder-N7BE5TYW.mjs → app-graph-builder-AF3M7UWN.mjs} +5 -5
  4. package/dist/lib/browser/app-graph-builder-AF3M7UWN.mjs.map +7 -0
  5. package/dist/lib/browser/{call-manager-NIPDYUVD.mjs → call-manager-XRRCAVLI.mjs} +4 -4
  6. package/dist/lib/browser/call-manager-XRRCAVLI.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-2CWJBXBH.mjs +21 -0
  8. package/dist/lib/browser/{chunk-LGSDKXPF.mjs → chunk-4APCDRSH.mjs} +1 -1
  9. package/dist/lib/browser/{chunk-LGSDKXPF.mjs.map → chunk-4APCDRSH.mjs.map} +1 -1
  10. package/dist/lib/browser/{chunk-GCLD5ESP.mjs → chunk-DW7JD64V.mjs} +1 -1
  11. package/dist/lib/browser/{chunk-GCLD5ESP.mjs.map → chunk-DW7JD64V.mjs.map} +2 -2
  12. package/dist/lib/browser/{chunk-3SGRT4NM.mjs → chunk-FY4ZRD5X.mjs} +8 -8
  13. package/dist/lib/{node-esm/chunk-FLBFYGBK.mjs.map → browser/chunk-FY4ZRD5X.mjs.map} +3 -3
  14. package/dist/lib/browser/{chunk-VUWC4IJM.mjs → chunk-J3JO5NWO.mjs} +26 -28
  15. package/dist/lib/browser/chunk-J3JO5NWO.mjs.map +7 -0
  16. package/dist/lib/browser/{chunk-6NSMBO3B.mjs → chunk-JGKMMI65.mjs} +2 -2
  17. package/dist/lib/browser/{chunk-6NSMBO3B.mjs.map → chunk-JGKMMI65.mjs.map} +3 -3
  18. package/dist/lib/browser/{chunk-ZE7KWN36.mjs → chunk-TUFWPOVS.mjs} +92 -63
  19. package/dist/lib/browser/chunk-TUFWPOVS.mjs.map +7 -0
  20. package/dist/lib/browser/{chunk-ERWASUQK.mjs → chunk-X5PIP5YR.mjs} +3 -3
  21. package/dist/lib/browser/{chunk-ERWASUQK.mjs.map → chunk-X5PIP5YR.mjs.map} +3 -3
  22. package/dist/lib/browser/{chunk-KWPRNHTK.mjs → chunk-ZJ7QBXK6.mjs} +225 -225
  23. package/dist/lib/browser/chunk-ZJ7QBXK6.mjs.map +7 -0
  24. package/dist/lib/browser/index.mjs +7 -7
  25. package/dist/lib/browser/index.mjs.map +3 -3
  26. package/dist/lib/browser/{intent-resolver-JFGLZ6VI.mjs → intent-resolver-DCY4P4OX.mjs} +8 -8
  27. package/dist/lib/browser/intent-resolver-DCY4P4OX.mjs.map +7 -0
  28. package/dist/lib/browser/{markdown-M3FMR7OD.mjs → markdown-WZSXCEZJ.mjs} +4 -4
  29. package/dist/lib/browser/markdown-WZSXCEZJ.mjs.map +7 -0
  30. package/dist/lib/browser/meta.json +1 -1
  31. package/dist/lib/browser/{react-root-JEUSQXI6.mjs → react-root-QXPALOUQ.mjs} +9 -9
  32. package/dist/lib/browser/{react-surface-XWS6GIZY.mjs → react-surface-PYAMIADB.mjs} +9 -9
  33. package/dist/lib/browser/react-surface-PYAMIADB.mjs.map +7 -0
  34. package/dist/lib/browser/{settings-E32MTL7A.mjs → settings-AC6YSASL.mjs} +2 -2
  35. package/dist/lib/browser/{state-H6CYONWE.mjs → state-2T4KDWBX.mjs} +2 -2
  36. package/dist/lib/browser/{state-H6CYONWE.mjs.map → state-2T4KDWBX.mjs.map} +2 -2
  37. package/dist/lib/browser/types/index.mjs +1 -1
  38. package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs → ChannelContainer-B2ZGAE4P.mjs} +7 -7
  39. package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs → ChatContainer-2CT4PJ7I.mjs} +4 -4
  40. package/dist/lib/node-esm/{app-graph-builder-VCW76Z6V.mjs → app-graph-builder-OLSJVCWY.mjs} +5 -5
  41. package/dist/lib/node-esm/app-graph-builder-OLSJVCWY.mjs.map +7 -0
  42. package/dist/lib/node-esm/{call-manager-D6O5ZJJ4.mjs → call-manager-EI7FXRAU.mjs} +4 -4
  43. package/dist/lib/node-esm/call-manager-EI7FXRAU.mjs.map +7 -0
  44. package/dist/lib/node-esm/{chunk-IHDNQLLR.mjs → chunk-4TME3BR4.mjs} +92 -63
  45. package/dist/lib/node-esm/chunk-4TME3BR4.mjs.map +7 -0
  46. package/dist/lib/node-esm/chunk-6CRHHOST.mjs +23 -0
  47. package/dist/lib/node-esm/{chunk-FLBFYGBK.mjs → chunk-BF4UKS55.mjs} +8 -8
  48. package/dist/lib/node-esm/chunk-BF4UKS55.mjs.map +7 -0
  49. package/dist/lib/node-esm/{chunk-75RJ5DJI.mjs → chunk-PYTVBN5J.mjs} +1 -1
  50. package/dist/lib/node-esm/{chunk-75RJ5DJI.mjs.map → chunk-PYTVBN5J.mjs.map} +1 -1
  51. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs → chunk-QBHKLWGR.mjs} +2 -2
  52. package/dist/lib/node-esm/{chunk-OU5BYIDO.mjs.map → chunk-QBHKLWGR.mjs.map} +3 -3
  53. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs → chunk-SED3O2XO.mjs} +3 -3
  54. package/dist/lib/node-esm/{chunk-25ABSYP2.mjs.map → chunk-SED3O2XO.mjs.map} +3 -3
  55. package/dist/lib/node-esm/{chunk-2MFNK53T.mjs → chunk-VNG6M2IY.mjs} +26 -28
  56. package/dist/lib/node-esm/chunk-VNG6M2IY.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-TDFHTCZZ.mjs → chunk-XVKWHTH4.mjs} +1 -1
  58. package/dist/lib/node-esm/{chunk-TDFHTCZZ.mjs.map → chunk-XVKWHTH4.mjs.map} +2 -2
  59. package/dist/lib/node-esm/{chunk-C3XFMUAY.mjs → chunk-YIDU3DXK.mjs} +225 -225
  60. package/dist/lib/node-esm/chunk-YIDU3DXK.mjs.map +7 -0
  61. package/dist/lib/node-esm/index.mjs +7 -7
  62. package/dist/lib/node-esm/index.mjs.map +3 -3
  63. package/dist/lib/node-esm/{intent-resolver-OXGNQ44Y.mjs → intent-resolver-QGTPU6QB.mjs} +8 -8
  64. package/dist/lib/node-esm/intent-resolver-QGTPU6QB.mjs.map +7 -0
  65. package/dist/lib/node-esm/{markdown-INKTE4MH.mjs → markdown-3MZXUGUA.mjs} +4 -4
  66. package/dist/lib/node-esm/markdown-3MZXUGUA.mjs.map +7 -0
  67. package/dist/lib/node-esm/meta.json +1 -1
  68. package/dist/lib/node-esm/{react-root-XYYY2JXZ.mjs → react-root-7ZFJYVUZ.mjs} +9 -9
  69. package/dist/lib/node-esm/{react-surface-MJ33KPYE.mjs → react-surface-UJFCSFNO.mjs} +9 -9
  70. package/dist/lib/node-esm/react-surface-UJFCSFNO.mjs.map +7 -0
  71. package/dist/lib/node-esm/{settings-SJ24YG7M.mjs → settings-N52O7MLS.mjs} +2 -2
  72. package/dist/lib/node-esm/{state-D7WNDT3N.mjs → state-62TQKQVB.mjs} +2 -2
  73. package/dist/lib/node-esm/{state-D7WNDT3N.mjs.map → state-62TQKQVB.mjs.map} +2 -2
  74. package/dist/lib/node-esm/types/index.mjs +1 -1
  75. package/dist/types/src/calls/call-manager.d.ts.map +1 -1
  76. package/dist/types/src/calls/call-swarm-synchronizer.d.ts.map +1 -1
  77. package/dist/types/src/calls/media-manager.d.ts.map +1 -1
  78. package/dist/types/src/calls/types.d.ts +1 -1
  79. package/dist/types/src/calls/types.d.ts.map +1 -1
  80. package/dist/types/src/calls/util/calls-service.d.ts +1 -1
  81. package/dist/types/src/calls/util/calls-service.d.ts.map +1 -1
  82. package/dist/types/src/calls/util/stub-media-streams.d.ts.map +1 -1
  83. package/dist/types/src/calls-service.stories.d.ts +1 -1
  84. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/call-manager.d.ts.map +1 -1
  86. package/dist/types/src/capabilities/capabilities.d.ts +2 -2
  87. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  88. package/dist/types/src/capabilities/index.d.ts +1 -1
  89. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  90. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/markdown.d.ts +1 -1
  92. package/dist/types/src/capabilities/markdown.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  94. package/dist/types/src/capabilities/state.d.ts.map +1 -1
  95. package/dist/types/src/components/Call/Call.d.ts.map +1 -1
  96. package/dist/types/src/components/Call/Toolbar.d.ts.map +1 -1
  97. package/dist/types/src/components/CallDebugPanel.d.ts.map +1 -1
  98. package/dist/types/src/components/CallSidebar.d.ts.map +1 -1
  99. package/dist/types/src/components/ChannelContainer.d.ts.map +1 -1
  100. package/dist/types/src/components/ChannelContainer.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/Chat.stories.d.ts.map +1 -1
  102. package/dist/types/src/components/ChatContainer.d.ts.map +1 -1
  103. package/dist/types/src/components/Comments.stories.d.ts.map +1 -1
  104. package/dist/types/src/components/CommentsContainer.d.ts.map +1 -1
  105. package/dist/types/src/components/CommentsThreadContainer.d.ts.map +1 -1
  106. package/dist/types/src/components/Lobby/Lobby.d.ts.map +1 -1
  107. package/dist/types/src/components/Media/VideoObject.d.ts +1 -1
  108. package/dist/types/src/components/Media/VideoObject.stories.d.ts +1 -1
  109. package/dist/types/src/components/Media/VideoObject.stories.d.ts.map +1 -1
  110. package/dist/types/src/components/MessageContainer.d.ts.map +1 -1
  111. package/dist/types/src/components/Participant/ParticipantGrid.d.ts.map +1 -1
  112. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts +1 -1
  113. package/dist/types/src/components/ResponsiveGrid/ResponsiveContainer.stories.d.ts.map +1 -1
  114. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts +1 -1
  115. package/dist/types/src/components/ResponsiveGrid/ResponsiveGrid.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/ResponsiveGrid/ResponsiveGridItem.d.ts.map +1 -1
  117. package/dist/types/src/extensions/threads.d.ts.map +1 -1
  118. package/dist/types/src/types/schema.d.ts +7 -5
  119. package/dist/types/src/types/schema.d.ts.map +1 -1
  120. package/dist/types/src/types/types.d.ts +8 -6
  121. package/dist/types/src/types/types.d.ts.map +1 -1
  122. package/dist/types/tsconfig.tsbuildinfo +1 -1
  123. package/package.json +49 -49
  124. package/src/ThreadPlugin.tsx +2 -2
  125. package/src/calls/call-manager.ts +1 -1
  126. package/src/calls/call-swarm-synchronizer.ts +1 -1
  127. package/src/calls/media-manager.ts +2 -2
  128. package/src/calls/types.ts +1 -1
  129. package/src/calls/util/calls-service.ts +4 -3
  130. package/src/calls/util/stub-media-streams.ts +2 -2
  131. package/src/calls-service.stories.tsx +3 -3
  132. package/src/capabilities/app-graph-builder.ts +6 -5
  133. package/src/capabilities/call-manager.ts +3 -2
  134. package/src/capabilities/capabilities.ts +2 -2
  135. package/src/capabilities/intent-resolver.ts +4 -3
  136. package/src/capabilities/markdown.ts +4 -3
  137. package/src/capabilities/react-surface.tsx +5 -4
  138. package/src/capabilities/state.ts +2 -1
  139. package/src/components/Call/Call.tsx +3 -2
  140. package/src/components/Call/Toolbar.tsx +2 -2
  141. package/src/components/CallDebugPanel.tsx +1 -1
  142. package/src/components/CallSidebar.tsx +2 -1
  143. package/src/components/ChannelContainer.stories.tsx +3 -2
  144. package/src/components/ChannelContainer.tsx +7 -6
  145. package/src/components/Chat.stories.tsx +3 -2
  146. package/src/components/ChatContainer.tsx +4 -3
  147. package/src/components/Comments.stories.tsx +4 -3
  148. package/src/components/CommentsContainer.tsx +2 -1
  149. package/src/components/CommentsThreadContainer.tsx +3 -2
  150. package/src/components/Lobby/Lobby.tsx +1 -1
  151. package/src/components/Media/VideoObject.stories.tsx +4 -3
  152. package/src/components/MessageContainer.tsx +4 -3
  153. package/src/components/Participant/ParticipantGrid.tsx +2 -1
  154. package/src/components/ResponsiveGrid/ResponsiveContainer.stories.tsx +4 -3
  155. package/src/components/ResponsiveGrid/ResponsiveGrid.stories.tsx +4 -3
  156. package/src/components/ResponsiveGrid/ResponsiveGrid.tsx +1 -1
  157. package/src/components/ResponsiveGrid/ResponsiveGridItem.tsx +2 -2
  158. package/src/components/ThreadComplementary.tsx +1 -1
  159. package/src/components/command-extension.ts +1 -1
  160. package/src/extensions/threads.ts +3 -3
  161. package/src/hooks/useDebugMode.ts +1 -1
  162. package/src/testing/stories.ts +2 -2
  163. package/src/types/types.ts +2 -1
  164. package/src/typings.d.ts +8 -0
  165. package/dist/lib/browser/ChannelContainer-3GIE7ASU.mjs +0 -16
  166. package/dist/lib/browser/app-graph-builder-N7BE5TYW.mjs.map +0 -7
  167. package/dist/lib/browser/call-manager-NIPDYUVD.mjs.map +0 -7
  168. package/dist/lib/browser/chunk-3SGRT4NM.mjs.map +0 -7
  169. package/dist/lib/browser/chunk-FR7KJPNY.mjs +0 -21
  170. package/dist/lib/browser/chunk-KWPRNHTK.mjs.map +0 -7
  171. package/dist/lib/browser/chunk-VUWC4IJM.mjs.map +0 -7
  172. package/dist/lib/browser/chunk-ZE7KWN36.mjs.map +0 -7
  173. package/dist/lib/browser/intent-resolver-JFGLZ6VI.mjs.map +0 -7
  174. package/dist/lib/browser/markdown-M3FMR7OD.mjs.map +0 -7
  175. package/dist/lib/browser/react-surface-XWS6GIZY.mjs.map +0 -7
  176. package/dist/lib/node-esm/app-graph-builder-VCW76Z6V.mjs.map +0 -7
  177. package/dist/lib/node-esm/call-manager-D6O5ZJJ4.mjs.map +0 -7
  178. package/dist/lib/node-esm/chunk-2CXOK2TD.mjs +0 -23
  179. package/dist/lib/node-esm/chunk-2MFNK53T.mjs.map +0 -7
  180. package/dist/lib/node-esm/chunk-C3XFMUAY.mjs.map +0 -7
  181. package/dist/lib/node-esm/chunk-IHDNQLLR.mjs.map +0 -7
  182. package/dist/lib/node-esm/intent-resolver-OXGNQ44Y.mjs.map +0 -7
  183. package/dist/lib/node-esm/markdown-INKTE4MH.mjs.map +0 -7
  184. package/dist/lib/node-esm/react-surface-MJ33KPYE.mjs.map +0 -7
  185. /package/dist/lib/browser/{ChannelContainer-3GIE7ASU.mjs.map → ChannelContainer-O2SFQJU7.mjs.map} +0 -0
  186. /package/dist/lib/browser/{ChatContainer-AIGIWAUG.mjs.map → ChatContainer-PVT3DUZJ.mjs.map} +0 -0
  187. /package/dist/lib/browser/{chunk-FR7KJPNY.mjs.map → chunk-2CWJBXBH.mjs.map} +0 -0
  188. /package/dist/lib/browser/{react-root-JEUSQXI6.mjs.map → react-root-QXPALOUQ.mjs.map} +0 -0
  189. /package/dist/lib/browser/{settings-E32MTL7A.mjs.map → settings-AC6YSASL.mjs.map} +0 -0
  190. /package/dist/lib/node-esm/{ChannelContainer-7FXCKO7X.mjs.map → ChannelContainer-B2ZGAE4P.mjs.map} +0 -0
  191. /package/dist/lib/node-esm/{ChatContainer-IQUWU426.mjs.map → ChatContainer-2CT4PJ7I.mjs.map} +0 -0
  192. /package/dist/lib/node-esm/{chunk-2CXOK2TD.mjs.map → chunk-6CRHHOST.mjs.map} +0 -0
  193. /package/dist/lib/node-esm/{react-root-XYYY2JXZ.mjs.map → react-root-7ZFJYVUZ.mjs.map} +0 -0
  194. /package/dist/lib/node-esm/{settings-SJ24YG7M.mjs.map → settings-N52O7MLS.mjs.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/components/ChatContainer.tsx", "../../../src/components/command-extension.ts", "../../../src/components/MessageContainer.tsx", "../../../src/components/CommentsThreadContainer.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport { Obj, Ref } from '@dxos/echo';\nimport { type Space, fullyQualifiedId, useMembers } from '@dxos/react-client/echo';\nimport { useIdentity } from '@dxos/react-client/halo';\nimport { Icon, ScrollArea, useThemeContext, useTranslation } from '@dxos/react-ui';\nimport { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { StackItem } from '@dxos/react-ui-stack';\nimport { mx } from '@dxos/react-ui-theme';\nimport {\n MessageTextbox,\n type MessageTextboxProps,\n Thread,\n type ThreadRootProps,\n threadLayout,\n} from '@dxos/react-ui-thread';\nimport { DataType } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { type ThreadType } from '../types';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer } from './MessageContainer';\n\nexport const ChatHeading = ({ attendableId }: { attendableId?: string }) => {\n const { t } = useTranslation(meta.id);\n return (\n <div role='none' className='flex items-center'>\n <StackItem.SigilButton attendableId={attendableId}>\n <Icon icon='ph--chat--regular' size={5} />\n </StackItem.SigilButton>\n <StackItem.HeadingLabel attendableId={attendableId}>{t('chat heading')}</StackItem.HeadingLabel>\n </div>\n );\n};\n\nexport type ChatContainerProps = {\n space: Space;\n thread: ThreadType;\n context?: Obj.Any;\n autoFocusTextbox?: boolean;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const ChatContainer = ({ space, thread, context, current, autoFocusTextbox }: ChatContainerProps) => {\n const { t } = useTranslation(meta.id);\n const id = fullyQualifiedId(thread);\n const identity = useIdentity()!;\n const members = useMembers(space?.key);\n const activity = useStatus(space, id);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const [autoFocus, setAutoFocus] = useState(autoFocusTextbox);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(id, identity);\n const messageRef = useRef('');\n const extensions = useMemo(\n () => [\n createBasicExtensions({ placeholder: t('message placeholder') }),\n createThemeExtensions({ themeMode }),\n listener({ onChange: (text) => (messageRef.current = text) }),\n command,\n ],\n [themeMode, _count],\n );\n\n // TODO(thure): Factor out.\n // TODO(thure): `flex-col-reverse` does not work to start the container scrolled to the end while also using\n // `ScrollArea`. This is the least-bad way I found to scroll to the end on mount. Note that 0ms was insufficient\n // for the desired effect; this is likely hardware-dependent and should be reevaluated.\n const scrollToEnd = (behavior: ScrollBehavior) =>\n setTimeout(() => threadScrollRef.current?.scrollIntoView({ behavior, block: 'end' }), 10);\n\n useLayoutEffect(() => {\n scrollToEnd('instant');\n }, []);\n\n // TODO(burdon): Change to model.\n const handleCreate: MessageTextboxProps['onSend'] = () => {\n if (!messageRef.current?.length) {\n return false;\n }\n\n thread.messages.push(\n Ref.make(\n Obj.make(DataType.Message, {\n created: new Date().toISOString(),\n sender: { identityDid: identity.did },\n blocks: [{ _tag: 'text', text: messageRef.current }],\n properties: context ? { context: Ref.make(context) } : undefined,\n }),\n ),\n );\n\n messageRef.current = '';\n setAutoFocus(true);\n scrollToEnd('smooth');\n rerenderEditor();\n return true;\n };\n\n return (\n <Thread.Root\n current={current}\n id={id}\n classNames='bs-full grid-rows-[1fr_min-content_min-content] overflow-hidden transition-[padding-block-end] [[data-sidebar-inline-start-state=open]_&]:lg:pbe-0'\n >\n <ScrollArea.Root classNames='col-span-2'>\n <ScrollArea.Viewport classNames='overflow-anchored after:overflow-anchor after:block after:bs-px after:-mbs-px [&>div]:min-bs-full [&>div]:!grid [&>div]:grid-rows-[1fr_0]'>\n <div role='none' className={mx(threadLayout, 'place-self-end')}>\n {thread.messages\n .map((message) => message.target)\n .filter(isNonNullable)\n .map((message) => (\n <MessageContainer key={message.id} message={message} members={members} />\n ))}\n </div>\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n <ScrollArea.Scrollbar>\n <ScrollArea.Thumb />\n </ScrollArea.Scrollbar>\n </ScrollArea.Viewport>\n </ScrollArea.Root>\n\n <MessageTextbox extensions={extensions} autoFocus={autoFocus} onSend={handleCreate} {...textboxMetadata} />\n\n <Thread.Status activity={activity}>{t('activity message')}</Thread.Status>\n </Thread.Root>\n );\n};\n\nexport default ChatContainer;\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { HighlightStyle, StreamLanguage, syntaxHighlighting } from '@codemirror/language';\nimport { type Extension } from '@codemirror/state';\n\nimport { tags } from '@dxos/react-ui-editor';\nimport { mx } from '@dxos/react-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 { tag: tags.tagName, class: mx('dx-tag dx-tag--indigo text-baseText font-medium') },\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';\nimport { type Obj, Ref, type Type } from '@dxos/echo';\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 { createBasicExtensions, createThemeExtensions, useTextEditor } from '@dxos/react-ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';\nimport { MessageHeading, MessageRoot } from '@dxos/react-ui-thread';\nimport { type DataType } from '@dxos/schema';\n\nimport { useOnEditAnalytics } from '../hooks';\nimport { meta } from '../meta';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { commentControlClassNames } from './CommentsThreadContainer';\n\nexport type MessageContainerProps = {\n message: DataType.Message;\n members: SpaceMember[];\n editable?: boolean;\n onDelete?: (id: string) => void;\n};\n\nexport const MessageContainer = ({ message, members, editable = false, onDelete }: MessageContainerProps) => {\n const { t } = useTranslation(meta.id);\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 = useIdentity()?.did === messageMetadata.authorId;\n const [editing, setEditing] = useState(false);\n const handleDelete = useCallback(() => onDelete?.(message.id), [message, onDelete]);\n const textBlock = message.blocks.find((block) => block._tag === 'text');\n const references = message.blocks.filter((block) => block._tag === 'reference').map((block) => block.reference);\n\n useOnEditAnalytics(message, textBlock, !!editing);\n\n return (\n <MessageRoot {...messageMetadata} classNames={[hoverableControls, hoverableFocusedWithinControls]}>\n <MessageHeading authorName={messageMetadata.authorName} timestamp={messageMetadata.timestamp}>\n <div className='flex flex-row items-center gap-0.5'>\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={[commentControlClassNames, hoverableControlItem]}\n onClick={() => setEditing((editing) => !editing)}\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={[commentControlClassNames, hoverableControlItem]}\n onClick={() => handleDelete()}\n />\n )}\n </div>\n </MessageHeading>\n {textBlock && <TextboxBlock block={textBlock} isAuthor={userIsAuthor} editing={editing} />}\n {Ref.Array.targets(references).map((reference, index) => (\n <MessagePart key={index} part={reference} />\n ))}\n </MessageRoot>\n );\n};\n\nconst MessagePart = ({ part }: { part: Type.Expando }) => {\n return <MessageBlockObjectTile subject={part} />;\n};\n\nconst TextboxBlock = ({\n block,\n isAuthor,\n editing,\n}: {\n block: DataType.MessageBlock.Text;\n editing?: boolean;\n isAuthor?: boolean;\n identity?: Identity;\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 block.text = inMemoryContentRef.current;\n }, [block]);\n\n useOnTransition(editing, true, false, saveDocumentChange);\n\n const { parentRef, focusAttributes, view } = useTextEditor(\n () => ({\n initialValue: block.text,\n extensions: [\n createBasicExtensions({ readOnly: !isAuthor || !editing }),\n createThemeExtensions({ themeMode }),\n command,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n handleDocumentChange(update.state.doc.toString());\n }\n }),\n ],\n }),\n [block.text, editing, isAuthor, themeMode, handleDocumentChange],\n );\n\n useEffect(() => {\n editing && view?.focus();\n }, [editing, view]);\n\n return <div role='none' ref={parentRef} className='mie-4' {...focusAttributes} />;\n};\n\nconst MessageBlockObjectTile = forwardRef<HTMLDivElement, { subject: Obj.Any }>(({ 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 <div\n role='group'\n className={mx('grid col-span-3 py-1 pr-4', hoverableControls, hoverableFocusedWithinControls)}\n ref={forwardedRef}\n >\n <Surface role='card' limit={1} data={{ subject }} fallback={title} />\n </div>\n );\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport { Ref, Relation } from '@dxos/echo';\nimport { fullyQualifiedId, 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 { createBasicExtensions, createThemeExtensions, listener } from '@dxos/react-ui-editor';\nimport { hoverableControlItem, hoverableControls, hoverableFocusedWithinControls, mx } from '@dxos/react-ui-theme';\nimport { MessageTextbox, type MessageTextboxProps, Thread, type ThreadRootProps } from '@dxos/react-ui-thread';\nimport { type AnchoredTo } from '@dxos/schema';\nimport { isNonNullable } from '@dxos/util';\n\nimport { useStatus } from '../hooks';\nimport { meta } from '../meta';\nimport { type ThreadType } from '../types';\nimport { getMessageMetadata } from '../util';\n\nimport { command } from './command-extension';\nimport { MessageContainer } from './MessageContainer';\n\n// TODO(burdon): Remove need for p-1.\nexport const commentControlClassNames = '!p-1 transition-opacity';\n\nexport type CommentsThreadContainerProps = {\n anchor: AnchoredTo;\n onAttend?: (anchor: AnchoredTo) => void;\n onComment?: (anchor: AnchoredTo, message: string) => void;\n onResolve?: (anchor: AnchoredTo) => void;\n onMessageDelete?: (anchor: AnchoredTo, messageId: string) => void;\n onThreadDelete?: (anchor: AnchoredTo) => void;\n} & Pick<ThreadRootProps, 'current'>;\n\nexport const CommentsThreadContainer = ({\n anchor,\n current,\n onAttend,\n onComment,\n onResolve,\n onMessageDelete,\n onThreadDelete,\n}: CommentsThreadContainerProps) => {\n const { t } = useTranslation(meta.id);\n const identity = useIdentity()!;\n const space = getSpace(anchor);\n const members = useMembers(space?.key);\n const detached = !anchor.anchor;\n const thread = Relation.getSource(anchor) as ThreadType;\n const activity = useStatus(space, fullyQualifiedId(thread));\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const { themeMode } = useThemeContext();\n\n const textboxMetadata = getMessageMetadata(fullyQualifiedId(thread), identity);\n // TODO(wittjosiah): This is a hack to reset the editor after a message is sent.\n const [_count, _setCount] = useState(0);\n const rerenderEditor = () => _setCount((count) => count + 1);\n const 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 [_count],\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\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 rerenderEditor();\n\n return true;\n }, [anchor, identity]);\n\n return (\n <Thread.Root\n id={fullyQualifiedId(thread)}\n classNames='pbs-2 border-be border-subduedSeparator last:border-none'\n current={current}\n onClickCapture={handleAttend}\n onFocusCapture={handleAttend}\n >\n <div\n role='none'\n className={mx(\n 'col-span-2 grid grid-cols-[var(--rail-size)_1fr_min-content]',\n hoverableControls,\n hoverableFocusedWithinControls,\n )}\n >\n {detached ? (\n <Tooltip.Trigger asChild content={t('detached thread label')} side='top'>\n <Thread.Header detached>{thread.name}</Thread.Header>\n </Tooltip.Trigger>\n ) : (\n <Thread.Header>{thread.name}</Thread.Header>\n )}\n <div className='flex flex-row items-center gap-0.5'>\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={[commentControlClassNames, 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={[commentControlClassNames, hoverableControlItem]}\n onClick={handleThreadDelete}\n />\n )}\n </div>\n </div>\n\n {/** TODO(dmaretskyi): How's `thread.messages` undefined? */}\n {Ref.Array.targets(thread.messages?.filter(isNonNullable) ?? []).map((message) => (\n <MessageContainer\n key={message.id}\n editable\n message={message}\n members={members}\n onDelete={handleMessageDelete}\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 <Thread.Status activity={activity}>{t('activity message')}</Thread.Status>\n\n {/* NOTE(thure): This can’t also be the `overflow-anchor` because `ScrollArea` injects an interceding node that contains this necessary ref’d element. */}\n <div role='none' className='bs-px -mbs-px' ref={threadScrollRef} />\n </Thread.Root>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["React", "useLayoutEffect", "useMemo", "useRef", "useState", "Obj", "Ref", "fullyQualifiedId", "useMembers", "useIdentity", "Icon", "ScrollArea", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "StackItem", "mx", "MessageTextbox", "Thread", "threadLayout", "DataType", "isNonNullable", "HighlightStyle", "StreamLanguage", "syntaxHighlighting", "tags", "mx", "parser", "StreamLanguage", "define", "startState", "count", "token", "stream", "state", "eatSpace", "match", "next", "styles", "HighlightStyle", "tag", "tags", "tagName", "class", "mx", "command", "syntaxHighlighting", "EditorView", "React", "forwardRef", "useCallback", "useEffect", "useRef", "useState", "Surface", "Ref", "PublicKey", "useIdentity", "IconButton", "useOnTransition", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "useTextEditor", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageHeading", "MessageRoot", "React", "useCallback", "useMemo", "useRef", "useState", "Ref", "Relation", "fullyQualifiedId", "getSpace", "useMembers", "useIdentity", "IconButton", "Tag", "Tooltip", "useThemeContext", "useTranslation", "createBasicExtensions", "createThemeExtensions", "listener", "hoverableControlItem", "hoverableControls", "hoverableFocusedWithinControls", "mx", "MessageTextbox", "Thread", "isNonNullable", "commentControlClassNames", "CommentsThreadContainer", "anchor", "current", "onAttend", "onComment", "onResolve", "onMessageDelete", "onThreadDelete", "t", "useTranslation", "meta", "id", "identity", "useIdentity", "space", "getSpace", "members", "useMembers", "key", "detached", "thread", "Relation", "getSource", "activity", "useStatus", "fullyQualifiedId", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "_count", "_setCount", "useState", "rerenderEditor", "count", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "handleAttend", "useCallback", "handleResolve", "handleMessageDelete", "handleThreadDelete", "handleComment", "Thread", "Root", "classNames", "onClickCapture", "onFocusCapture", "div", "role", "className", "mx", "hoverableControls", "hoverableFocusedWithinControls", "Tooltip", "Trigger", "asChild", "content", "side", "Header", "name", "status", "Tag", "palette", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "hoverableControlItem", "onClick", "Ref", "Array", "targets", "messages", "filter", "isNonNullable", "map", "message", "MessageContainer", "editable", "onDelete", "MessageTextbox", "onSend", "Status", "ref", "MessageContainer", "message", "members", "editable", "onDelete", "t", "useTranslation", "meta", "id", "senderIdentity", "find", "member", "sender", "identityDid", "identity", "did", "identityKey", "PublicKey", "equals", "messageMetadata", "getMessageMetadata", "userIsAuthor", "useIdentity", "authorId", "editing", "setEditing", "useState", "handleDelete", "useCallback", "textBlock", "blocks", "block", "_tag", "references", "filter", "map", "reference", "useOnEditAnalytics", "React", "MessageRoot", "classNames", "hoverableControls", "hoverableFocusedWithinControls", "MessageHeading", "authorName", "timestamp", "div", "className", "IconButton", "data-testid", "variant", "icon", "iconOnly", "label", "commentControlClassNames", "hoverableControlItem", "onClick", "TextboxBlock", "isAuthor", "Ref", "Array", "targets", "index", "MessagePart", "key", "part", "MessageBlockObjectTile", "subject", "themeMode", "useThemeContext", "inMemoryContentRef", "useRef", "text", "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", "role", "ref", "forwardRef", "forwardedRef", "title", "name", "type", "content", "mx", "Surface", "limit", "data", "fallback", "ChatHeading", "attendableId", "t", "useTranslation", "meta", "id", "React", "div", "role", "className", "StackItem", "SigilButton", "Icon", "icon", "size", "HeadingLabel", "ChatContainer", "space", "thread", "context", "current", "autoFocusTextbox", "fullyQualifiedId", "identity", "useIdentity", "members", "useMembers", "key", "activity", "useStatus", "_count", "_setCount", "useState", "rerenderEditor", "count", "autoFocus", "setAutoFocus", "threadScrollRef", "useRef", "themeMode", "useThemeContext", "textboxMetadata", "getMessageMetadata", "messageRef", "extensions", "useMemo", "createBasicExtensions", "placeholder", "createThemeExtensions", "listener", "onChange", "text", "command", "scrollToEnd", "behavior", "setTimeout", "scrollIntoView", "block", "useLayoutEffect", "handleCreate", "length", "messages", "push", "Ref", "make", "Obj", "DataType", "Message", "created", "Date", "toISOString", "sender", "identityDid", "did", "blocks", "_tag", "properties", "undefined", "Thread", "Root", "classNames", "ScrollArea", "Viewport", "mx", "threadLayout", "map", "message", "target", "filter", "isNonNullable", "MessageContainer", "ref", "Scrollbar", "Thumb", "MessageTextbox", "onSend", "Status"]
7
+ }
@@ -1,5 +1,5 @@
1
1
  // src/calls/util/stub-media-streams.ts
2
- import { waitForCondition, scheduleTaskInterval } from "@dxos/async";
2
+ import { scheduleTaskInterval, waitForCondition } from "@dxos/async";
3
3
  import { cancelWithContext } from "@dxos/context";
4
4
  import { invariant } from "@dxos/invariant";
5
5
  var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/stub-media-streams.ts";
@@ -53,4 +53,4 @@ export {
53
53
  createBlackCanvasStreamTrack,
54
54
  createInaudibleAudioStreamTrack
55
55
  };
56
- //# sourceMappingURL=chunk-6NSMBO3B.mjs.map
56
+ //# sourceMappingURL=chunk-JGKMMI65.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/calls/util/stub-media-streams.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n//\n\nimport { waitForCondition, scheduleTaskInterval } from '@dxos/async';\nimport { cancelWithContext, type Context } 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(), 1_000);\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\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 const oscillator = audioContext.createOscillator();\n oscillator.type = 'triangle';\n // roughly sounds like a box fan\n oscillator.frequency.setValueAtTime(20, audioContext.currentTime);\n\n const gainNode = audioContext.createGain();\n // even w/ gain at 0 some packets are sent\n gainNode.gain.setValueAtTime(0.02, audioContext.currentTime);\n oscillator.connect(gainNode);\n\n const destination = audioContext.createMediaStreamDestination();\n gainNode.connect(destination);\n oscillator.start();\n\n ctx.onDispose(async () => {\n oscillator.disconnect();\n oscillator.stop();\n await audioContext.close();\n });\n\n return destination.stream.getAudioTracks()[0];\n};\n"],
5
- "mappings": ";AAKA,SAASA,kBAAkBC,4BAA4B;AACvD,SAASC,yBAAuC;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;AACAN,uBAAqBI,KAAK,YAAYQ,UAAAA,GAAa,GAAA;AAEnD,QAAMG,QAAQR,OAAOS,cAAa,EAAGC,eAAc,EAAG,CAAA;AACtDL,YAAAA;AAEA,QAAMX,kBAAkBG,KAAKL,iBAAiB;IAAEmB,WAAW,MAAMH,MAAMI,eAAe;IAAQC,SAAS;EAAM,CAAA,CAAA;AAE7G,SAAOL;AACT;AAMO,IAAMM,kCAAkC,OAAO,EAAEjB,IAAG,MAAoB;AAC7E,QAAMkB,eAAe,IAAIC,OAAOC,aAAY;AAC5C,QAAMC,aAAaH,aAAaI,iBAAgB;AAChDD,aAAWE,OAAO;AAElBF,aAAWG,UAAUC,eAAe,IAAIP,aAAaQ,WAAW;AAEhE,QAAMC,WAAWT,aAAaU,WAAU;AAExCD,WAASE,KAAKJ,eAAe,MAAMP,aAAaQ,WAAW;AAC3DL,aAAWS,QAAQH,QAAAA;AAEnB,QAAMI,cAAcb,aAAac,6BAA4B;AAC7DL,WAASG,QAAQC,WAAAA;AACjBV,aAAWY,MAAK;AAEhBjC,MAAIkC,UAAU,YAAA;AACZb,eAAWc,WAAU;AACrBd,eAAWe,KAAI;AACf,UAAMlB,aAAamB,MAAK;EAC1B,CAAA;AAEA,SAAON,YAAYO,OAAOC,eAAc,EAAG,CAAA;AAC7C;",
6
- "names": ["waitForCondition", "scheduleTaskInterval", "cancelWithContext", "invariant", "createBlackCanvasStreamTrack", "ctx", "width", "height", "canvas", "document", "createElement", "canvasCtx", "getContext", "drawFrame", "fillStyle", "fillRect", "track", "captureStream", "getVideoTracks", "condition", "readyState", "timeout", "createInaudibleAudioStreamTrack", "audioContext", "window", "AudioContext", "oscillator", "createOscillator", "type", "frequency", "setValueAtTime", "currentTime", "gainNode", "createGain", "gain", "connect", "destination", "createMediaStreamDestination", "start", "onDispose", "disconnect", "stop", "close", "stream", "getAudioTracks"]
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(), 1_000);\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\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 const oscillator = audioContext.createOscillator();\n oscillator.type = 'triangle';\n // roughly sounds like a box fan\n oscillator.frequency.setValueAtTime(20, audioContext.currentTime);\n\n const gainNode = audioContext.createGain();\n // even w/ gain at 0 some packets are sent\n gainNode.gain.setValueAtTime(0.02, audioContext.currentTime);\n oscillator.connect(gainNode);\n\n const destination = audioContext.createMediaStreamDestination();\n gainNode.connect(destination);\n oscillator.start();\n\n ctx.onDispose(async () => {\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;AAMO,IAAMM,kCAAkC,OAAO,EAAEjB,IAAG,MAAoB;AAC7E,QAAMkB,eAAe,IAAIC,OAAOC,aAAY;AAC5C,QAAMC,aAAaH,aAAaI,iBAAgB;AAChDD,aAAWE,OAAO;AAElBF,aAAWG,UAAUC,eAAe,IAAIP,aAAaQ,WAAW;AAEhE,QAAMC,WAAWT,aAAaU,WAAU;AAExCD,WAASE,KAAKJ,eAAe,MAAMP,aAAaQ,WAAW;AAC3DL,aAAWS,QAAQH,QAAAA;AAEnB,QAAMI,cAAcb,aAAac,6BAA4B;AAC7DL,WAASG,QAAQC,WAAAA;AACjBV,aAAWY,MAAK;AAEhBjC,MAAIkC,UAAU,YAAA;AACZb,eAAWc,WAAU;AACrBd,eAAWe,KAAI;AACf,UAAMlB,aAAamB,MAAK;EAC1B,CAAA;AAEA,SAAON,YAAYO,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", "createInaudibleAudioStreamTrack", "audioContext", "window", "AudioContext", "oscillator", "createOscillator", "type", "frequency", "setValueAtTime", "currentTime", "gainNode", "createGain", "gain", "connect", "destination", "createMediaStreamDestination", "start", "onDispose", "disconnect", "stop", "close", "stream", "getAudioTracks"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  createBlackCanvasStreamTrack,
3
3
  createInaudibleAudioStreamTrack
4
- } from "./chunk-6NSMBO3B.mjs";
4
+ } from "./chunk-JGKMMI65.mjs";
5
5
 
6
6
  // src/calls/types.ts
7
7
  import { buf } from "@dxos/protocols/buf";
@@ -50,19 +50,20 @@ function _ts_decorate(decorators, target, key, desc) {
50
50
  var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/call-swarm-synchronizer.ts";
51
51
  var DISCONNECTED_ABRUPT_TIMEOUT = 1e4;
52
52
  var CallSwarmSynchronizer = class extends Resource {
53
+ stateUpdated = new Event();
54
+ _state = {
55
+ activities: {}
56
+ };
57
+ _networkService;
58
+ _lastSwarmEvent = void 0;
59
+ _reconcileSwarmStateTask = void 0;
60
+ _identityKey = void 0;
61
+ _deviceKey = void 0;
62
+ _displayName = void 0;
63
+ _swarmCtx = void 0;
64
+ _sendStateTask = void 0;
53
65
  constructor({ networkService }) {
54
66
  super();
55
- this.stateUpdated = new Event();
56
- this._state = {
57
- activities: {}
58
- };
59
- this._lastSwarmEvent = void 0;
60
- this._reconcileSwarmStateTask = void 0;
61
- this._identityKey = void 0;
62
- this._deviceKey = void 0;
63
- this._displayName = void 0;
64
- this._swarmCtx = void 0;
65
- this._sendStateTask = void 0;
66
67
  this._networkService = networkService;
67
68
  }
68
69
  /**
@@ -410,6 +411,8 @@ import { log as log2 } from "@dxos/log";
410
411
 
411
412
  // src/calls/util/history-cache.ts
412
413
  var HistoryCache = class {
414
+ _limit;
415
+ _messages;
413
416
  constructor(limit = 100) {
414
417
  this._limit = limit;
415
418
  this._messages = [];
@@ -486,17 +489,18 @@ var BulkRequestDispatcher = class {
486
489
  var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/util/calls-service.ts";
487
490
  var NETWORK_TIMEOUT = 5e3;
488
491
  var CallsServicePeer = class extends Resource2 {
492
+ history = new HistoryCache(100);
493
+ _persistentLifecycle = new PersistentLifecycle({
494
+ start: () => this._startSession(),
495
+ stop: (session) => this._stopSession(session)
496
+ });
497
+ _config;
498
+ taskScheduler = new FIFOScheduler();
499
+ pushTrackDispatcher = new BulkRequestDispatcher(32);
500
+ pullTrackDispatcher = new BulkRequestDispatcher(32);
501
+ closeTrackDispatcher = new BulkRequestDispatcher(32);
489
502
  constructor(config) {
490
503
  super();
491
- this.history = new HistoryCache(100);
492
- this._persistentLifecycle = new PersistentLifecycle({
493
- start: () => this._startSession(),
494
- stop: (session) => this._stopSession(session)
495
- });
496
- this.taskScheduler = new FIFOScheduler();
497
- this.pushTrackDispatcher = new BulkRequestDispatcher(32);
498
- this.pullTrackDispatcher = new BulkRequestDispatcher(32);
499
- this.closeTrackDispatcher = new BulkRequestDispatcher(32);
500
504
  this._config = config;
501
505
  }
502
506
  async _open(ctx) {
@@ -530,7 +534,7 @@ var CallsServicePeer = class extends Resource2 {
530
534
  state: peerConnection.connectionState
531
535
  }, {
532
536
  F: __dxlog_file2,
533
- L: 118,
537
+ L: 119,
534
538
  S: this,
535
539
  C: (f, a) => f(...a)
536
540
  });
@@ -545,7 +549,7 @@ var CallsServicePeer = class extends Resource2 {
545
549
  state: peerConnection.iceConnectionState
546
550
  }, {
547
551
  F: __dxlog_file2,
548
- L: 127,
552
+ L: 128,
549
553
  S: this,
550
554
  C: (f, a) => f(...a)
551
555
  });
@@ -556,7 +560,7 @@ var CallsServicePeer = class extends Resource2 {
556
560
  if (peerConnection.iceConnectionState === "connected") {
557
561
  log2.info("calls iceConnectionState is connected", void 0, {
558
562
  F: __dxlog_file2,
559
- L: 136,
563
+ L: 137,
560
564
  S: this,
561
565
  C: (f, a) => f(...a)
562
566
  });
@@ -567,7 +571,7 @@ var CallsServicePeer = class extends Resource2 {
567
571
  timeoutSeconds
568
572
  }, {
569
573
  F: __dxlog_file2,
570
- L: 140,
574
+ L: 141,
571
575
  S: this,
572
576
  C: (f, a) => f(...a)
573
577
  });
@@ -580,7 +584,7 @@ var CallsServicePeer = class extends Resource2 {
580
584
  async _initiateCallSession() {
581
585
  log2("creating new session", void 0, {
582
586
  F: __dxlog_file2,
583
- L: 150,
587
+ L: 151,
584
588
  S: this,
585
589
  C: (f, a) => f(...a)
586
590
  });
@@ -606,7 +610,7 @@ var CallsServicePeer = class extends Resource2 {
606
610
  text: await response.text()
607
611
  }, {
608
612
  F: __dxlog_file2,
609
- L: 165,
613
+ L: 166,
610
614
  S: this,
611
615
  C: (f, a) => f(...a)
612
616
  });
@@ -638,7 +642,7 @@ var CallsServicePeer = class extends Resource2 {
638
642
  status: response.status
639
643
  }, {
640
644
  F: __dxlog_file2,
641
- L: 190,
645
+ L: 191,
642
646
  S: this,
643
647
  C: (f, a) => f(...a)
644
648
  });
@@ -648,7 +652,7 @@ var CallsServicePeer = class extends Resource2 {
648
652
  async _pushTrackInBulk({ ctx, peerConnection, transceiver, sessionId, trackName }) {
649
653
  log2.verbose("pushing track ", trackName, {
650
654
  F: __dxlog_file2,
651
- L: 212,
655
+ L: 213,
652
656
  S: this,
653
657
  C: (f, a) => f(...a)
654
658
  });
@@ -675,7 +679,7 @@ var CallsServicePeer = class extends Resource2 {
675
679
  });
676
680
  invariant2(response.tracks !== void 0, void 0, {
677
681
  F: __dxlog_file2,
678
- L: 237,
682
+ L: 238,
679
683
  S: this,
680
684
  A: [
681
685
  "response.tracks !== undefined",
@@ -700,7 +704,7 @@ var CallsServicePeer = class extends Resource2 {
700
704
  } else {
701
705
  log2.error("missing track data", void 0, {
702
706
  F: __dxlog_file2,
703
- L: 257,
707
+ L: 258,
704
708
  S: this,
705
709
  C: (f, a) => f(...a)
706
710
  });
@@ -708,7 +712,7 @@ var CallsServicePeer = class extends Resource2 {
708
712
  }).catch((err) => {
709
713
  log2.catch(err, void 0, {
710
714
  F: __dxlog_file2,
711
- L: 261,
715
+ L: 262,
712
716
  S: this,
713
717
  C: (f, a) => f(...a)
714
718
  });
@@ -726,7 +730,7 @@ var CallsServicePeer = class extends Resource2 {
726
730
  await this.waitUntilOpen();
727
731
  invariant2(this.session, void 0, {
728
732
  F: __dxlog_file2,
729
- L: 288,
733
+ L: 289,
730
734
  S: this,
731
735
  A: [
732
736
  "this.session",
@@ -739,7 +743,7 @@ var CallsServicePeer = class extends Resource2 {
739
743
  encodings
740
744
  }, {
741
745
  F: __dxlog_file2,
742
- L: 289,
746
+ L: 290,
743
747
  S: this,
744
748
  C: (f, a) => f(...a)
745
749
  });
@@ -752,7 +756,7 @@ var CallsServicePeer = class extends Resource2 {
752
756
  transceiver: transceiver2
753
757
  }, {
754
758
  F: __dxlog_file2,
755
- L: 293,
759
+ L: 294,
756
760
  S: this,
757
761
  C: (f, a) => f(...a)
758
762
  });
@@ -764,13 +768,13 @@ var CallsServicePeer = class extends Resource2 {
764
768
  transceiver: transceiver2
765
769
  }, {
766
770
  F: __dxlog_file2,
767
- L: 296,
771
+ L: 297,
768
772
  S: this,
769
773
  C: (f, a) => f(...a)
770
774
  });
771
775
  transceiver2.sender.replaceTrack(track).catch((err) => log2.catch(err, void 0, {
772
776
  F: __dxlog_file2,
773
- L: 297,
777
+ L: 298,
774
778
  S: this,
775
779
  C: (f, a) => f(...a)
776
780
  }));
@@ -779,7 +783,7 @@ var CallsServicePeer = class extends Resource2 {
779
783
  }
780
784
  invariant2(track, void 0, {
781
785
  F: __dxlog_file2,
782
- L: 301,
786
+ L: 302,
783
787
  S: this,
784
788
  A: [
785
789
  "track",
@@ -792,7 +796,7 @@ var CallsServicePeer = class extends Resource2 {
792
796
  });
793
797
  log2.verbose("creating transceiver", void 0, {
794
798
  F: __dxlog_file2,
795
- L: 306,
799
+ L: 307,
796
800
  S: this,
797
801
  C: (f, a) => f(...a)
798
802
  });
@@ -805,7 +809,7 @@ var CallsServicePeer = class extends Resource2 {
805
809
  });
806
810
  invariant2(pushedTrackData, void 0, {
807
811
  F: __dxlog_file2,
808
- L: 315,
812
+ L: 316,
809
813
  S: this,
810
814
  A: [
811
815
  "pushedTrackData",
@@ -822,7 +826,7 @@ var CallsServicePeer = class extends Resource2 {
822
826
  });
823
827
  transceiver.sender.setParameters(parameters).catch((err) => log2.catch(err, void 0, {
824
828
  F: __dxlog_file2,
825
- L: 322,
829
+ L: 323,
826
830
  S: this,
827
831
  C: (f, a) => f(...a)
828
832
  }));
@@ -835,7 +839,7 @@ var CallsServicePeer = class extends Resource2 {
835
839
  trackName: trackData.trackName
836
840
  }, {
837
841
  F: __dxlog_file2,
838
- L: 340,
842
+ L: 341,
839
843
  S: this,
840
844
  C: (f, a) => f(...a)
841
845
  });
@@ -851,7 +855,7 @@ var CallsServicePeer = class extends Resource2 {
851
855
  }
852
856
  invariant2(newTrackResponse.tracks, void 0, {
853
857
  F: __dxlog_file2,
854
- L: 353,
858
+ L: 354,
855
859
  S: this,
856
860
  A: [
857
861
  "newTrackResponse.tracks",
@@ -898,7 +902,7 @@ var CallsServicePeer = class extends Resource2 {
898
902
  return track;
899
903
  }).catch((err) => log2.catch(err, void 0, {
900
904
  F: __dxlog_file2,
901
- L: 405,
905
+ L: 406,
902
906
  S: this,
903
907
  C: (f, a) => f(...a)
904
908
  }));
@@ -908,7 +912,7 @@ var CallsServicePeer = class extends Resource2 {
908
912
  availableTracks: Array.from(trackMap.keys())
909
913
  }, {
910
914
  F: __dxlog_file2,
911
- L: 407,
915
+ L: 408,
912
916
  S: this,
913
917
  C: (f, a) => f(...a)
914
918
  });
@@ -918,7 +922,7 @@ var CallsServicePeer = class extends Resource2 {
918
922
  if (mid) {
919
923
  log2("closing pulled track ", trackData.trackName, {
920
924
  F: __dxlog_file2,
921
- L: 413,
925
+ L: 414,
922
926
  S: this,
923
927
  C: (f, a) => f(...a)
924
928
  });
@@ -934,7 +938,7 @@ var CallsServicePeer = class extends Resource2 {
934
938
  await this.waitUntilOpen();
935
939
  invariant2(this.session, void 0, {
936
940
  F: __dxlog_file2,
937
- L: 434,
941
+ L: 435,
938
942
  S: this,
939
943
  A: [
940
944
  "this.session",
@@ -1082,6 +1086,18 @@ var START_SPEAKING_THRESHOLD = 0.05;
1082
1086
  var CONTINUE_SPEAKING_THRESHOLD = 0.02;
1083
1087
  var MIN_EVENT_INTERVAL = 100;
1084
1088
  var SpeakingMonitor = class extends Resource3 {
1089
+ _mediaStreamTrack;
1090
+ /**
1091
+ * Event that is emitted when the user starts or stops speaking.
1092
+ * It is debounced to prevent rapid state changes.
1093
+ */
1094
+ speakingChanged;
1095
+ /**
1096
+ * Real state of the user speaking.
1097
+ */
1098
+ _isSpeaking;
1099
+ _lastEventTime;
1100
+ _deferredUpdate;
1085
1101
  constructor(_mediaStreamTrack) {
1086
1102
  super(), this._mediaStreamTrack = _mediaStreamTrack, this.speakingChanged = new Event2(), this._isSpeaking = false, this._lastEventTime = 0;
1087
1103
  }
@@ -1132,7 +1148,7 @@ var SpeakingMonitor = class extends Resource3 {
1132
1148
 
1133
1149
  // src/calls/media-manager.ts
1134
1150
  import { DeferredTask as DeferredTask3, Event as Event3, sleep as sleep2, synchronized as synchronized2 } from "@dxos/async";
1135
- import { cancelWithContext, Resource as Resource4 } from "@dxos/context";
1151
+ import { Resource as Resource4, cancelWithContext } from "@dxos/context";
1136
1152
  import { log as log4 } from "@dxos/log";
1137
1153
  function _ts_decorate2(decorators, target, key, desc) {
1138
1154
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -1148,20 +1164,17 @@ var MAX_WEB_CAM_BITRATE = 12e5;
1148
1164
  var RETRY_INTERVAL = 500;
1149
1165
  var USE_INAUDIBLE_AUDIO = false;
1150
1166
  var MediaManager = class extends Resource4 {
1151
- constructor() {
1152
- super(...arguments);
1153
- this.stateUpdated = new Event3();
1154
- this._state = {
1155
- pulledVideoStreams: {},
1156
- pulledAudioTracks: {}
1157
- };
1158
- this._speakingMonitor = void 0;
1159
- this._trackToReconcile = [];
1160
- this._blackCanvasStreamTrack = void 0;
1161
- this._inaudibleAudioStreamTrack = void 0;
1162
- this._pushTracksTask = void 0;
1163
- this._pullTracksTask = void 0;
1164
- }
1167
+ stateUpdated = new Event3();
1168
+ _state = {
1169
+ pulledVideoStreams: {},
1170
+ pulledAudioTracks: {}
1171
+ };
1172
+ _speakingMonitor = void 0;
1173
+ _trackToReconcile = [];
1174
+ _blackCanvasStreamTrack = void 0;
1175
+ _inaudibleAudioStreamTrack = void 0;
1176
+ _pushTracksTask = void 0;
1177
+ _pullTracksTask = void 0;
1165
1178
  get isSpeaking() {
1166
1179
  return this._speakingMonitor?.isSpeaking;
1167
1180
  }
@@ -1468,6 +1481,22 @@ function _ts_decorate3(decorators, target, key, desc) {
1468
1481
  }
1469
1482
  var __dxlog_file5 = "/__w/dxos/dxos/packages/plugins/plugin-thread/src/calls/call-manager.ts";
1470
1483
  var CallManager = class extends Resource5 {
1484
+ _client;
1485
+ callStateUpdated;
1486
+ // TODO(wittjosiah): Consolidate isSpeaking into the MediaState type.
1487
+ mediaStateUpdated;
1488
+ left;
1489
+ /**
1490
+ * Live object state. Is changed on internal events.
1491
+ * CAUTION: Do not change directly.
1492
+ */
1493
+ _state;
1494
+ // TODO(wittjosiah): This shouldn't be necessary, live-object's signals should be granular.
1495
+ _raisedHandSignal;
1496
+ _speakingSignal;
1497
+ _joinedSignal;
1498
+ _swarmSynchronizer;
1499
+ _mediaManager;
1471
1500
  /** @reactive */
1472
1501
  get roomId() {
1473
1502
  return this._state.call.roomId;
@@ -1666,4 +1695,4 @@ export {
1666
1695
  MediaManager,
1667
1696
  CallManager
1668
1697
  };
1669
- //# sourceMappingURL=chunk-ZE7KWN36.mjs.map
1698
+ //# sourceMappingURL=chunk-TUFWPOVS.mjs.map