@dxos/plugin-transcription 0.8.2-staging.7ac8446 → 0.8.2

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 (258) hide show
  1. package/dist/lib/browser/TranscriptContainer-PFKLKRPQ.mjs +11 -0
  2. package/dist/lib/browser/{chunk-YCZISX63.mjs → chunk-4KCUYW2F.mjs} +139 -95
  3. package/dist/lib/browser/chunk-4KCUYW2F.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-6ZR5MDK3.mjs → chunk-GOF7MJNV.mjs} +3 -3
  5. package/dist/lib/browser/{chunk-6ZR5MDK3.mjs.map → chunk-GOF7MJNV.mjs.map} +1 -1
  6. package/dist/lib/browser/{chunk-K7FOYAXO.mjs → chunk-IGEKO7ZU.mjs} +2 -2
  7. package/dist/lib/browser/chunk-NODIXNQP.mjs +54 -0
  8. package/dist/lib/browser/chunk-NODIXNQP.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-TJPJBE45.mjs +764 -0
  10. package/dist/lib/browser/chunk-TJPJBE45.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-YEPT334A.mjs → chunk-W2KNYJD6.mjs} +4 -4
  12. package/dist/lib/browser/chunk-W2KNYJD6.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +30 -216
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/{intent-resolver-4R66ZCKT.mjs → intent-resolver-I2LJSQDR.mjs} +7 -11
  16. package/dist/lib/browser/intent-resolver-I2LJSQDR.mjs.map +7 -0
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{react-surface-FQUHU5G7.mjs → react-surface-ID2MLJHZ.mjs} +11 -9
  19. package/dist/lib/browser/react-surface-ID2MLJHZ.mjs.map +7 -0
  20. package/dist/lib/browser/transcriber-NA7CIFIT.mjs +56 -0
  21. package/dist/lib/browser/transcriber-NA7CIFIT.mjs.map +7 -0
  22. package/dist/lib/browser/types/index.mjs +4 -8
  23. package/dist/lib/node/{TranscriptContainer-QEYTTT2V.cjs → TranscriptContainer-LHMC7553.cjs} +9 -8
  24. package/dist/lib/node/TranscriptContainer-LHMC7553.cjs.map +7 -0
  25. package/dist/lib/node/chunk-3GS5UNO5.cjs +778 -0
  26. package/dist/lib/node/chunk-3GS5UNO5.cjs.map +7 -0
  27. package/dist/lib/node/{chunk-LP4FG423.cjs → chunk-5J3FBCON.cjs} +5 -5
  28. package/dist/lib/node/{chunk-NVZWGFJL.cjs → chunk-AFUZI63A.cjs} +6 -6
  29. package/dist/lib/node/{chunk-NVZWGFJL.cjs.map → chunk-AFUZI63A.cjs.map} +1 -1
  30. package/dist/lib/node/chunk-EIMUQYCZ.cjs +74 -0
  31. package/dist/lib/node/chunk-EIMUQYCZ.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-CZMLKKWT.cjs → chunk-FKDJNJ57.cjs} +8 -8
  33. package/dist/lib/node/chunk-FKDJNJ57.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-FCCJALOT.cjs → chunk-ZFTXJZXH.cjs} +138 -95
  35. package/dist/lib/node/chunk-ZFTXJZXH.cjs.map +7 -0
  36. package/dist/lib/node/index.cjs +59 -251
  37. package/dist/lib/node/index.cjs.map +4 -4
  38. package/dist/lib/node/{intent-resolver-WMMCOUEH.cjs → intent-resolver-LLMGF5I5.cjs} +10 -11
  39. package/dist/lib/node/intent-resolver-LLMGF5I5.cjs.map +7 -0
  40. package/dist/lib/node/meta.json +1 -1
  41. package/dist/lib/node/{react-surface-WI2MGWCC.cjs → react-surface-SEQLEL4K.cjs} +13 -11
  42. package/dist/lib/node/react-surface-SEQLEL4K.cjs.map +7 -0
  43. package/dist/lib/node/transcriber-RKKN7LDU.cjs +68 -0
  44. package/dist/lib/node/transcriber-RKKN7LDU.cjs.map +7 -0
  45. package/dist/lib/node/types/index.cjs +7 -11
  46. package/dist/lib/node/types/index.cjs.map +2 -2
  47. package/dist/lib/node-esm/{TranscriptContainer-ZXUCOWGY.mjs → TranscriptContainer-DLNRFVTA.mjs} +4 -3
  48. package/dist/lib/node-esm/chunk-BRPFVRAD.mjs +55 -0
  49. package/dist/lib/node-esm/chunk-BRPFVRAD.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-YQYBLFNI.mjs → chunk-EFIWBQDF.mjs} +139 -95
  51. package/dist/lib/node-esm/chunk-EFIWBQDF.mjs.map +7 -0
  52. package/dist/lib/node-esm/{chunk-J4D2RBBH.mjs → chunk-KUWWHMOA.mjs} +2 -2
  53. package/dist/lib/node-esm/{chunk-PTZHDZ36.mjs → chunk-MFJPEIVB.mjs} +4 -4
  54. package/dist/lib/node-esm/chunk-MFJPEIVB.mjs.map +7 -0
  55. package/dist/lib/node-esm/chunk-PR7EYODX.mjs +765 -0
  56. package/dist/lib/node-esm/chunk-PR7EYODX.mjs.map +7 -0
  57. package/dist/lib/node-esm/{chunk-X4DDJIVL.mjs → chunk-TXMDLLBR.mjs} +3 -3
  58. package/dist/lib/node-esm/{chunk-X4DDJIVL.mjs.map → chunk-TXMDLLBR.mjs.map} +1 -1
  59. package/dist/lib/node-esm/index.mjs +30 -216
  60. package/dist/lib/node-esm/index.mjs.map +4 -4
  61. package/dist/lib/node-esm/{intent-resolver-QN2LO5TX.mjs → intent-resolver-WOZKOEBW.mjs} +7 -11
  62. package/dist/lib/node-esm/intent-resolver-WOZKOEBW.mjs.map +7 -0
  63. package/dist/lib/node-esm/meta.json +1 -1
  64. package/dist/lib/node-esm/{react-surface-PCH6NTVB.mjs → react-surface-7MXUUTAL.mjs} +11 -9
  65. package/dist/lib/node-esm/react-surface-7MXUUTAL.mjs.map +7 -0
  66. package/dist/lib/node-esm/transcriber-5WSI6DYK.mjs +57 -0
  67. package/dist/lib/node-esm/transcriber-5WSI6DYK.mjs.map +7 -0
  68. package/dist/lib/node-esm/types/index.mjs +4 -8
  69. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  70. package/dist/types/src/capabilities/capabilities.d.ts +8 -10
  71. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  72. package/dist/types/src/capabilities/index.d.ts +2 -183
  73. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
  75. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  76. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  77. package/dist/types/src/capabilities/transcriber.d.ts +2 -1
  78. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  79. package/dist/types/src/components/Transcript/Transcript.d.ts +14 -4
  80. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  81. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +19 -4
  82. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  83. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +27 -0
  84. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -0
  85. package/dist/types/src/components/Transcript/transcript-extension.d.ts +19 -0
  86. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -0
  87. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  88. package/dist/types/src/components/stories/FileTranscription.stories.d.ts +17 -0
  89. package/dist/types/src/components/stories/FileTranscription.stories.d.ts.map +1 -0
  90. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts +10 -0
  91. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts.map +1 -0
  92. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts +19 -0
  93. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts.map +1 -0
  94. package/dist/types/src/components/stories/TranscriptionStory.d.ts +11 -0
  95. package/dist/types/src/components/stories/TranscriptionStory.d.ts.map +1 -0
  96. package/dist/types/src/components/stories/useIsSpeaking.d.ts +3 -0
  97. package/dist/types/src/components/stories/useIsSpeaking.d.ts.map +1 -0
  98. package/dist/types/src/hooks/index.d.ts +1 -0
  99. package/dist/types/src/hooks/index.d.ts.map +1 -1
  100. package/dist/types/src/hooks/useAudioFile.d.ts +1 -1
  101. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
  102. package/dist/types/src/hooks/useAudioTrack.d.ts +1 -1
  103. package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
  104. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +7 -0
  105. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -0
  106. package/dist/types/src/hooks/useTranscriber.d.ts +1 -1
  107. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  108. package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
  109. package/dist/types/src/model/index.d.ts +2 -0
  110. package/dist/types/src/model/index.d.ts.map +1 -0
  111. package/dist/types/src/model/model.d.ts +68 -0
  112. package/dist/types/src/model/model.d.ts.map +1 -0
  113. package/dist/types/src/model/model.test.d.ts +2 -0
  114. package/dist/types/src/model/model.test.d.ts.map +1 -0
  115. package/dist/types/src/segments-normalization/index.d.ts +4 -0
  116. package/dist/types/src/segments-normalization/index.d.ts.map +1 -0
  117. package/dist/types/src/segments-normalization/message-normalizer.d.ts +26 -0
  118. package/dist/types/src/segments-normalization/message-normalizer.d.ts.map +1 -0
  119. package/dist/types/src/segments-normalization/normalization.d.ts +520 -0
  120. package/dist/types/src/segments-normalization/normalization.d.ts.map +1 -0
  121. package/dist/types/src/segments-normalization/normalization.test.d.ts +2 -0
  122. package/dist/types/src/segments-normalization/normalization.test.d.ts.map +1 -0
  123. package/dist/types/src/segments-normalization/utils.d.ts +3 -0
  124. package/dist/types/src/segments-normalization/utils.d.ts.map +1 -0
  125. package/dist/types/src/testing/index.d.ts +2 -0
  126. package/dist/types/src/testing/index.d.ts.map +1 -0
  127. package/dist/types/src/testing/testing.d.ts +40 -0
  128. package/dist/types/src/testing/testing.d.ts.map +1 -0
  129. package/dist/types/src/transcriber/media-stream-recorder.d.ts +8 -5
  130. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  131. package/dist/types/src/transcriber/transcriber.browser.test.d.ts +2 -0
  132. package/dist/types/src/transcriber/transcriber.browser.test.d.ts.map +1 -0
  133. package/dist/types/src/transcriber/transcriber.d.ts +6 -2
  134. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  135. package/dist/types/src/transcriber/transcription-manager.d.ts +19 -15
  136. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  137. package/dist/types/src/translations.d.ts +3 -20
  138. package/dist/types/src/translations.d.ts.map +1 -1
  139. package/dist/types/src/types/schema.d.ts +23 -40
  140. package/dist/types/src/types/schema.d.ts.map +1 -1
  141. package/dist/types/src/types/types.d.ts +15 -8
  142. package/dist/types/src/types/types.d.ts.map +1 -1
  143. package/dist/types/src/util/array.d.ts.map +1 -1
  144. package/dist/types/src/util/get-time-str.d.ts.map +1 -1
  145. package/dist/types/src/util/index.d.ts +0 -1
  146. package/dist/types/src/util/index.d.ts.map +1 -1
  147. package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -1
  148. package/dist/types/tsconfig.tsbuildinfo +1 -1
  149. package/package.json +62 -41
  150. package/src/TranscriptionPlugin.tsx +13 -18
  151. package/src/capabilities/capabilities.ts +15 -8
  152. package/src/capabilities/index.ts +0 -2
  153. package/src/capabilities/intent-resolver.ts +7 -8
  154. package/src/capabilities/react-surface.tsx +5 -4
  155. package/src/capabilities/transcriber.ts +34 -6
  156. package/src/components/Transcript/Transcript.stories.tsx +201 -43
  157. package/src/components/Transcript/Transcript.tsx +83 -208
  158. package/src/components/Transcript/deprecated/OldTranscript.tsx +260 -0
  159. package/src/components/Transcript/transcript-extension.ts +236 -0
  160. package/src/components/TranscriptContainer.tsx +11 -6
  161. package/src/components/stories/FileTranscription.stories.tsx +240 -0
  162. package/src/components/stories/KeyWordRecognition.stories.tsx +128 -0
  163. package/src/components/stories/MicrophoneTranscription.stories.tsx +274 -0
  164. package/src/components/stories/TranscriptionStory.tsx +41 -0
  165. package/src/components/stories/useIsSpeaking.tsx +40 -0
  166. package/src/hooks/index.ts +1 -0
  167. package/src/hooks/useAudioFile.ts +39 -9
  168. package/src/hooks/useAudioTrack.ts +2 -2
  169. package/src/hooks/useQueueModelAdapter.ts +65 -0
  170. package/src/hooks/useTranscriber.ts +4 -2
  171. package/src/meta.ts +2 -2
  172. package/src/model/index.ts +5 -0
  173. package/src/model/model.test.ts +169 -0
  174. package/src/model/model.ts +229 -0
  175. package/src/segments-normalization/index.ts +7 -0
  176. package/src/segments-normalization/message-normalizer.ts +108 -0
  177. package/src/segments-normalization/normalization.test.ts +142 -0
  178. package/src/segments-normalization/normalization.ts +103 -0
  179. package/src/segments-normalization/utils.ts +9 -0
  180. package/src/testing/index.ts +5 -0
  181. package/src/testing/testing.ts +216 -0
  182. package/src/transcriber/media-stream-recorder.ts +14 -7
  183. package/src/transcriber/{transcriber.test.ts → transcriber.browser.test.ts} +7 -7
  184. package/src/transcriber/transcriber.ts +33 -20
  185. package/src/transcriber/transcription-manager.ts +87 -71
  186. package/src/translations.ts +2 -3
  187. package/src/types/schema.ts +11 -33
  188. package/src/types/types.ts +8 -12
  189. package/src/util/index.ts +0 -1
  190. package/dist/lib/browser/TranscriptContainer-JQ3HFHLQ.mjs +0 -10
  191. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs +0 -191
  192. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs.map +0 -7
  193. package/dist/lib/browser/chunk-G4B6CPC2.mjs +0 -253
  194. package/dist/lib/browser/chunk-G4B6CPC2.mjs.map +0 -7
  195. package/dist/lib/browser/chunk-GU2BNYKZ.mjs +0 -35
  196. package/dist/lib/browser/chunk-GU2BNYKZ.mjs.map +0 -7
  197. package/dist/lib/browser/chunk-OGNXNGJB.mjs +0 -73
  198. package/dist/lib/browser/chunk-OGNXNGJB.mjs.map +0 -7
  199. package/dist/lib/browser/chunk-YCZISX63.mjs.map +0 -7
  200. package/dist/lib/browser/chunk-YEPT334A.mjs.map +0 -7
  201. package/dist/lib/browser/intent-resolver-4R66ZCKT.mjs.map +0 -7
  202. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs +0 -18
  203. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs.map +0 -7
  204. package/dist/lib/browser/react-surface-FQUHU5G7.mjs.map +0 -7
  205. package/dist/lib/browser/transcriber-LGMIWDYI.mjs +0 -36
  206. package/dist/lib/browser/transcriber-LGMIWDYI.mjs.map +0 -7
  207. package/dist/lib/node/TranscriptContainer-QEYTTT2V.cjs.map +0 -7
  208. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs +0 -200
  209. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs.map +0 -7
  210. package/dist/lib/node/chunk-3KHUSQNW.cjs +0 -55
  211. package/dist/lib/node/chunk-3KHUSQNW.cjs.map +0 -7
  212. package/dist/lib/node/chunk-CZMLKKWT.cjs.map +0 -7
  213. package/dist/lib/node/chunk-FCCJALOT.cjs.map +0 -7
  214. package/dist/lib/node/chunk-P4VVD6ZO.cjs +0 -95
  215. package/dist/lib/node/chunk-P4VVD6ZO.cjs.map +0 -7
  216. package/dist/lib/node/chunk-UOFHT4GZ.cjs +0 -280
  217. package/dist/lib/node/chunk-UOFHT4GZ.cjs.map +0 -7
  218. package/dist/lib/node/intent-resolver-WMMCOUEH.cjs.map +0 -7
  219. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs +0 -34
  220. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs.map +0 -7
  221. package/dist/lib/node/react-surface-WI2MGWCC.cjs.map +0 -7
  222. package/dist/lib/node/transcriber-QG5WPKX4.cjs +0 -49
  223. package/dist/lib/node/transcriber-QG5WPKX4.cjs.map +0 -7
  224. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs +0 -192
  225. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs.map +0 -7
  226. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs +0 -254
  227. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs.map +0 -7
  228. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs +0 -74
  229. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs.map +0 -7
  230. package/dist/lib/node-esm/chunk-HKATMD34.mjs +0 -37
  231. package/dist/lib/node-esm/chunk-HKATMD34.mjs.map +0 -7
  232. package/dist/lib/node-esm/chunk-PTZHDZ36.mjs.map +0 -7
  233. package/dist/lib/node-esm/chunk-YQYBLFNI.mjs.map +0 -7
  234. package/dist/lib/node-esm/intent-resolver-QN2LO5TX.mjs.map +0 -7
  235. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs +0 -19
  236. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs.map +0 -7
  237. package/dist/lib/node-esm/react-surface-PCH6NTVB.mjs.map +0 -7
  238. package/dist/lib/node-esm/transcriber-TMPYZ5L4.mjs +0 -37
  239. package/dist/lib/node-esm/transcriber-TMPYZ5L4.mjs.map +0 -7
  240. package/dist/types/src/capabilities/app-graph-builder.d.ts +0 -181
  241. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +0 -1
  242. package/dist/types/src/capabilities/meeting-transcription-state.d.ts +0 -6
  243. package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +0 -1
  244. package/dist/types/src/components/transcription.stories.d.ts +0 -15
  245. package/dist/types/src/components/transcription.stories.d.ts.map +0 -1
  246. package/dist/types/src/transcriber/transcriber.test.d.ts +0 -2
  247. package/dist/types/src/transcriber/transcriber.test.d.ts.map +0 -1
  248. package/dist/types/src/util/random-queue-dxn.d.ts +0 -3
  249. package/dist/types/src/util/random-queue-dxn.d.ts.map +0 -1
  250. package/src/capabilities/app-graph-builder.ts +0 -152
  251. package/src/capabilities/meeting-transcription-state.ts +0 -16
  252. package/src/components/transcription.stories.tsx +0 -196
  253. package/src/util/random-queue-dxn.ts +0 -9
  254. /package/dist/lib/browser/{TranscriptContainer-JQ3HFHLQ.mjs.map → TranscriptContainer-PFKLKRPQ.mjs.map} +0 -0
  255. /package/dist/lib/browser/{chunk-K7FOYAXO.mjs.map → chunk-IGEKO7ZU.mjs.map} +0 -0
  256. /package/dist/lib/node/{chunk-LP4FG423.cjs.map → chunk-5J3FBCON.cjs.map} +0 -0
  257. /package/dist/lib/node-esm/{TranscriptContainer-ZXUCOWGY.mjs.map → TranscriptContainer-DLNRFVTA.mjs.map} +0 -0
  258. /package/dist/lib/node-esm/{chunk-J4D2RBBH.mjs.map → chunk-KUWWHMOA.mjs.map} +0 -0
@@ -2,18 +2,19 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { signal } from '@preact/signals-core';
6
+
5
7
  import { synchronized } from '@dxos/async';
6
8
  import { Resource } from '@dxos/context';
7
9
  import { QueueImpl, type Queue } from '@dxos/echo-db';
8
- import { createStatic } from '@dxos/echo-schema';
9
- import { invariant } from '@dxos/invariant';
10
- import { DXN } from '@dxos/keys';
10
+ import { create } from '@dxos/echo-schema';
11
+ import { type DXN } from '@dxos/keys';
12
+ import { log } from '@dxos/log';
11
13
  import { type EdgeHttpClient } from '@dxos/react-edge-client';
12
- import { type HuePalette } from '@dxos/react-ui-theme';
14
+ import { DataType } from '@dxos/schema';
13
15
 
14
16
  import { MediaStreamRecorder } from './media-stream-recorder';
15
17
  import { Transcriber } from './transcriber';
16
- import { TranscriptBlock, type TranscriptSegment } from '../types';
17
18
 
18
19
  /**
19
20
  * Length of the chunk in ms.
@@ -31,37 +32,67 @@ const PREFIXED_CHUNKS_AMOUNT = 10;
31
32
  */
32
33
  const TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;
33
34
 
35
+ export type TranscriptMessageEnricher = (message: DataType.Message) => Promise<DataType.Message>;
36
+
37
+ export type TranscriptionManagerOptions = {
38
+ edgeClient: EdgeHttpClient;
39
+
40
+ /**
41
+ * Enrich the message before it is written to the transcription queue.
42
+ */
43
+ messageEnricher?: TranscriptMessageEnricher;
44
+ };
45
+
34
46
  /**
35
47
  * Manages transcription state for a meeting.
36
48
  */
37
- // TODO(mykola): Reconcile with transcriber capability.
38
49
  export class TranscriptionManager extends Resource {
39
50
  private readonly _edgeClient: EdgeHttpClient;
51
+ private readonly _messageEnricher?: TranscriptMessageEnricher;
40
52
  private _audioStreamTrack?: MediaStreamTrack = undefined;
41
- private _name?: string = undefined;
42
- private _hue?: HuePalette = undefined;
53
+ private _identityDid?: string = undefined;
43
54
  private _mediaRecorder?: MediaStreamRecorder = undefined;
44
55
  private _transcriber?: Transcriber = undefined;
45
- private _enabled = false;
46
- private _queue?: Queue<TranscriptBlock> = undefined;
56
+ private _queue?: Queue<DataType.Message> = undefined;
57
+ private _enabled = signal(false);
47
58
 
48
- constructor(edgeClient: EdgeHttpClient) {
59
+ constructor(options: TranscriptionManagerOptions) {
49
60
  super();
50
- this._edgeClient = edgeClient;
61
+ this._edgeClient = options.edgeClient;
62
+ this._messageEnricher = options.messageEnricher;
51
63
  }
52
64
 
53
- protected override async _open() {
65
+ protected override async _open(): Promise<void> {
54
66
  await this._toggleTranscriber();
55
67
  }
56
68
 
57
- protected override async _close() {
69
+ protected override async _close(): Promise<void> {
58
70
  void this._transcriber?.close();
59
71
  }
60
72
 
61
- @synchronized
62
- setRecording(recording?: boolean) {
63
- if (!this.isOpen || !this._enabled) {
64
- return;
73
+ /** @reactive */
74
+ get enabled() {
75
+ return this._enabled.value;
76
+ }
77
+
78
+ setQueue(queueDxn: DXN): TranscriptionManager {
79
+ if (this._queue?.dxn.toString() !== queueDxn.toString()) {
80
+ log.info('setQueue', { queueDxn: queueDxn.toString() });
81
+ this._queue = new QueueImpl<DataType.Message>(this._edgeClient, queueDxn);
82
+ }
83
+ return this;
84
+ }
85
+
86
+ setIdentityDid(did: string): TranscriptionManager {
87
+ if (this._identityDid !== did) {
88
+ this._identityDid = did;
89
+ }
90
+ return this;
91
+ }
92
+
93
+ setRecording(recording?: boolean): TranscriptionManager {
94
+ if (!this.isOpen || !this._enabled.value) {
95
+ return this;
65
96
  }
66
97
 
67
98
  if (recording) {
@@ -69,6 +100,7 @@ export class TranscriptionManager extends Resource {
69
100
  } else {
70
101
  this._transcriber?.stopChunksRecording();
71
102
  }
103
+ return this;
72
104
  }
73
105
 
74
106
  /**
@@ -76,78 +108,53 @@ export class TranscriptionManager extends Resource {
76
108
  * @param enabled - Whether to enable transcription.
77
109
  */
78
110
  @synchronized
79
- async setEnabled(enabled?: boolean) {
80
- if (this._enabled === enabled) {
111
+ async setEnabled(enabled?: boolean): Promise<void> {
112
+ if (this._enabled.value === enabled) {
81
113
  return;
82
114
  }
83
- this._enabled = enabled ?? false;
115
+
116
+ this._enabled.value = enabled ?? false;
117
+ // TODO(burdon): Why is toggle called here?
84
118
  this.isOpen && (await this._toggleTranscriber());
85
119
  }
86
120
 
87
121
  @synchronized
88
- async setAudioTrack(track?: MediaStreamTrack) {
122
+ async setAudioTrack(track?: MediaStreamTrack): Promise<void> {
89
123
  if (this._audioStreamTrack === track) {
90
124
  return;
91
125
  }
126
+
92
127
  this._audioStreamTrack = track;
93
128
  this.isOpen && (await this._toggleTranscriber());
94
129
  }
95
130
 
96
- /**
97
- * Set the queue to save the transcription to.
98
- * @param queue - The queue to save the transcription to or the DXN of the queue.
99
- */
100
- @synchronized
101
- setQueue(queue?: Queue<TranscriptBlock> | string) {
102
- switch (typeof queue) {
103
- case 'string':
104
- if (this._queue?.dxn.toString() === queue) {
105
- return;
106
- }
107
- this._queue = new QueueImpl<TranscriptBlock>(this._edgeClient, DXN.parse(queue));
108
- break;
109
- case 'object':
110
- if (this._queue === queue) {
111
- return;
112
- }
113
- invariant(queue instanceof QueueImpl);
114
- this._queue = queue;
115
- break;
116
- case 'undefined':
117
- this._queue = undefined;
118
- break;
119
- }
120
- }
121
-
122
- @synchronized
123
- setName(name: string) {
124
- if (this._name === name) {
125
- return;
126
- }
127
- this._name = name;
128
- }
129
-
130
- @synchronized
131
- setHue(hue: HuePalette) {
132
- if (this._hue === hue) {
133
- return;
134
- }
135
- this._hue = hue;
136
- }
137
-
138
- private async _toggleTranscriber() {
131
+ // TODO(burdon): Change this to setEnables (explicit), not toggle.
132
+ private async _toggleTranscriber(): Promise<void> {
139
133
  await this._maybeReinitTranscriber();
140
134
 
141
135
  // Open or close transcriber if transcription is enabled or disabled.
142
- if (this._enabled) {
136
+ if (this._enabled.value) {
143
137
  await this._transcriber?.open();
138
+ // TODO(burdon): Started and stopped blocks appear twice.
139
+ const block = create(DataType.Message, {
140
+ created: new Date().toISOString(),
141
+ blocks: [{ type: 'transcription', text: 'Started', started: new Date().toISOString() }],
142
+ sender: { role: 'assistant' },
143
+ });
144
+ this._queue?.append([block]);
144
145
  } else {
145
146
  await this._transcriber?.close();
147
+ const block = create(DataType.Message, {
148
+ created: new Date().toISOString(),
149
+ blocks: [{ type: 'transcription', text: 'Stopped', started: new Date().toISOString() }],
150
+ sender: { role: 'assistant' },
151
+ });
152
+ this._queue?.append([block]);
146
153
  }
147
154
  }
148
155
 
149
- private async _maybeReinitTranscriber() {
150
- if (!this._audioStreamTrack || !this._enabled) {
156
+ private async _maybeReinitTranscriber(): Promise<void> {
157
+ if (!this._audioStreamTrack || !this._enabled.value) {
151
158
  return;
152
159
  }
153
160
 
@@ -156,7 +163,7 @@ export class TranscriptionManager extends Resource {
156
163
  if (this._audioStreamTrack !== this._mediaRecorder?.mediaStreamTrack) {
157
164
  this._mediaRecorder = new MediaStreamRecorder({
158
165
  mediaStreamTrack: this._audioStreamTrack,
159
- interval: RECORD_INTERVAL,
166
+ config: { interval: RECORD_INTERVAL },
160
167
  });
161
168
  needReinit = true;
162
169
  }
@@ -173,12 +180,21 @@ export class TranscriptionManager extends Resource {
173
180
  }
174
181
  }
175
182
 
176
- private async _onSegments(segments: TranscriptSegment[]) {
183
+ private async _onSegments(segments: DataType.MessageBlock.Transcription[]): Promise<void> {
177
184
  if (!this.isOpen || !this._queue) {
178
185
  return;
179
186
  }
180
187
 
181
- const block = createStatic(TranscriptBlock, { authorName: this._name, authorHue: this._hue, segments });
188
+ let block = create(DataType.Message, {
189
+ created: new Date().toISOString(),
190
+ blocks: segments,
191
+ sender: { identityDid: this._identityDid },
192
+ });
193
+
194
+ if (this._messageEnricher) {
195
+ block = await this._messageEnricher(block);
196
+ }
197
+
182
198
  this._queue.append([block]);
183
199
  }
184
200
  }
@@ -16,12 +16,11 @@ export default [
16
16
  'plugin name': 'Transcription',
17
17
  'transcript companion label': 'Transcript',
18
18
 
19
- 'start transcription label': 'Start transcription',
20
- 'stop transcription label': 'Stop transcription',
21
-
22
19
  'delete button': 'Delete',
23
20
  'bookmark button': 'Bookmark',
24
21
  'scroll to end label': 'Scroll to latest',
22
+
23
+ 'settings entity extraction label': 'Entity extraction',
25
24
  },
26
25
  },
27
26
  },
@@ -2,17 +2,18 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { EchoObject, Expando, Ref, S, TypedObject } from '@dxos/echo-schema';
5
+ import { Schema } from 'effect';
6
+
7
+ import { Expando, Ref, TypedObject } from '@dxos/echo-schema';
6
8
 
7
9
  /**
8
10
  * Root transcript object created when the user starts a transcription.
9
11
  */
10
- export const TranscriptSchema = S.Struct({
11
- name: S.String,
12
-
13
- // TODO(burdon): Use string for dates?
14
- started: S.optional(S.Date),
15
- ended: S.optional(S.Date),
12
+ export const TranscriptSchema = Schema.Struct({
13
+ // TODO(wittjosiah): Remove?
14
+ // TODO(burdon): Use Date or string?
15
+ started: Schema.optional(Schema.String),
16
+ ended: Schema.optional(Schema.String),
16
17
 
17
18
  /**
18
19
  * Queue containing TranscriptBlock objects.
@@ -32,31 +33,8 @@ export class TranscriptType extends TypedObject({
32
33
  * First message in queue.
33
34
  * Contains metadata for the recording and transcript.
34
35
  */
35
- const TranscriptHeader = S.Struct({
36
- started: S.optional(S.Date),
37
- });
38
-
39
- export type TranscriptHeader = S.Schema.Type<typeof TranscriptHeader>;
40
-
41
- /**
42
- * Transcription fragment.
43
- */
44
- const TranscriptSegment = S.Struct({
45
- // TODO(burdon): TS from service is not Unix TS (x1000).
46
- started: S.Date,
47
- text: S.String,
36
+ const TranscriptHeader = Schema.Struct({
37
+ started: Schema.optional(Schema.String),
48
38
  });
49
39
 
50
- export type TranscriptSegment = S.Schema.Type<typeof TranscriptSegment>;
51
-
52
- /**
53
- * Transcription block (from single speaker).
54
- */
55
- export const TranscriptBlock = S.Struct({
56
- id: S.String,
57
- authorName: S.optional(S.String), // TODO(burdon): IdentityDid.
58
- authorHue: S.optional(S.String),
59
- segments: S.Array(TranscriptSegment),
60
- }).pipe(EchoObject({ typename: 'dxos.org/type/TranscriptBlock', version: '0.1.0' }));
61
-
62
- export type TranscriptBlock = S.Schema.Type<typeof TranscriptBlock>;
40
+ export type TranscriptHeader = Schema.Schema.Type<typeof TranscriptHeader>;
@@ -2,8 +2,9 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { S, isInstanceOf } from '@dxos/echo-schema';
6
- import { isReactiveObject } from '@dxos/react-client/echo';
5
+ import { Schema } from 'effect';
6
+
7
+ import { SpaceId } from '@dxos/react-client/echo';
7
8
 
8
9
  import { TranscriptType } from './schema';
9
10
  import { TRANSCRIPTION_PLUGIN } from '../meta';
@@ -19,18 +20,13 @@ export const TRANSCRIPTION_URL = 'https://calls-service.dxos.workers.dev';
19
20
  export namespace TranscriptionAction {
20
21
  const TRANSCRIPTION_ACTION = `${TRANSCRIPTION_PLUGIN}/action`;
21
22
 
22
- export class Create extends S.TaggedClass<Create>()(`${TRANSCRIPTION_ACTION}/create`, {
23
- input: S.Struct({
24
- name: S.optional(S.String),
25
- // TODO(wittjosiah): SpaceId.
26
- spaceId: S.String,
23
+ export class Create extends Schema.TaggedClass<Create>()(`${TRANSCRIPTION_ACTION}/create`, {
24
+ input: Schema.Struct({
25
+ name: Schema.optional(Schema.String),
26
+ spaceId: SpaceId,
27
27
  }),
28
- output: S.Struct({
28
+ output: Schema.Struct({
29
29
  object: TranscriptType,
30
30
  }),
31
31
  }) {}
32
32
  }
33
-
34
- export const isTranscript = (object: unknown): object is typeof TranscriptType => {
35
- return isReactiveObject(object) && isInstanceOf(TranscriptType, object);
36
- };
package/src/util/index.ts CHANGED
@@ -5,4 +5,3 @@
5
5
  export * from './array';
6
6
  export * from './get-time-str';
7
7
  export * from './monitor-audio-level';
8
- export * from './random-queue-dxn';
@@ -1,10 +0,0 @@
1
- import {
2
- TranscriptContainer_default,
3
- TranscriptionContainer
4
- } from "./chunk-G4B6CPC2.mjs";
5
- import "./chunk-6ZR5MDK3.mjs";
6
- export {
7
- TranscriptionContainer,
8
- TranscriptContainer_default as default
9
- };
10
- //# sourceMappingURL=TranscriptContainer-JQ3HFHLQ.mjs.map
@@ -1,191 +0,0 @@
1
- import {
2
- TranscriptionManager
3
- } from "./chunk-YCZISX63.mjs";
4
- import "./chunk-GU2BNYKZ.mjs";
5
- import {
6
- TranscriptionCapabilities
7
- } from "./chunk-YEPT334A.mjs";
8
- import {
9
- TranscriptType,
10
- TranscriptionAction
11
- } from "./chunk-OGNXNGJB.mjs";
12
- import {
13
- TRANSCRIPTION_PLUGIN
14
- } from "./chunk-6ZR5MDK3.mjs";
15
-
16
- // packages/plugins/plugin-transcription/src/capabilities/app-graph-builder.ts
17
- import { Capabilities, contributes, createIntent } from "@dxos/app-framework";
18
- import { fullyQualifiedId, getSpace, makeRef } from "@dxos/client/echo";
19
- import { generateName } from "@dxos/display-name";
20
- import { getSchemaTypename, isInstanceOf } from "@dxos/echo-schema";
21
- import { invariant } from "@dxos/invariant";
22
- import { ClientCapabilities } from "@dxos/plugin-client";
23
- import { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from "@dxos/plugin-deck/types";
24
- import { createExtension } from "@dxos/plugin-graph";
25
- import { MeetingCapabilities } from "@dxos/plugin-meeting";
26
- import { MeetingType } from "@dxos/plugin-meeting/types";
27
- import { buf } from "@dxos/protocols/buf";
28
- import { TranscriptionPayloadSchema } from "@dxos/protocols/buf/dxos/edge/calls_pb";
29
- import { keyToFallback } from "@dxos/util";
30
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/capabilities/app-graph-builder.ts";
31
- var codec = {
32
- encode: (message) => {
33
- return buf.toBinary(TranscriptionPayloadSchema, buf.create(TranscriptionPayloadSchema, message));
34
- },
35
- decode: (message) => {
36
- return buf.fromBinary(TranscriptionPayloadSchema, message);
37
- }
38
- };
39
- var getMeetingTranscript = async (context, meeting) => {
40
- const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);
41
- const typename = getSchemaTypename(TranscriptType);
42
- const existing = await meeting.artifacts[typename]?.load();
43
- if (existing instanceof TranscriptType) {
44
- return existing;
45
- }
46
- const space = getSpace(meeting);
47
- invariant(space, void 0, {
48
- F: __dxlog_file,
49
- L: 52,
50
- S: void 0,
51
- A: [
52
- "space",
53
- ""
54
- ]
55
- });
56
- const { data } = await dispatch(createIntent(TranscriptionAction.Create, {
57
- spaceId: space.id
58
- }));
59
- meeting.artifacts[typename] = makeRef(data.object);
60
- return data?.object;
61
- };
62
- var app_graph_builder_default = (context) => contributes(Capabilities.AppGraphBuilder, [
63
- createExtension({
64
- id: `${TRANSCRIPTION_PLUGIN}/meeting-transcript`,
65
- filter: (node) => isInstanceOf(MeetingType, node.data) && node.type !== PLANK_COMPANION_TYPE,
66
- actions: ({ node }) => {
67
- const meeting = node.data;
68
- const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);
69
- return [
70
- {
71
- id: `${fullyQualifiedId(meeting)}/action/start-stop-transcription`,
72
- data: async () => {
73
- const call = context.requestCapability(MeetingCapabilities.CallManager);
74
- invariant(state.transcriptionManager, void 0, {
75
- F: __dxlog_file,
76
- L: 73,
77
- S: void 0,
78
- A: [
79
- "state.transcriptionManager",
80
- ""
81
- ]
82
- });
83
- state.enabled = !state.enabled;
84
- void state.transcriptionManager.setEnabled(state.enabled);
85
- const transcript = await getMeetingTranscript(context, meeting);
86
- invariant(transcript, "Failed to create transcript", {
87
- F: __dxlog_file,
88
- L: 77,
89
- S: void 0,
90
- A: [
91
- "transcript",
92
- "'Failed to create transcript'"
93
- ]
94
- });
95
- call.setActivity(getSchemaTypename(TranscriptType), {
96
- value: codec.encode({
97
- enabled: state.enabled,
98
- queueDxn: transcript.queue.dxn.toString()
99
- })
100
- });
101
- },
102
- properties: {
103
- label: state.enabled ? [
104
- "stop transcription label",
105
- {
106
- ns: TRANSCRIPTION_PLUGIN
107
- }
108
- ] : [
109
- "start transcription label",
110
- {
111
- ns: TRANSCRIPTION_PLUGIN
112
- }
113
- ],
114
- icon: "ph--record--regular",
115
- disposition: "toolbar",
116
- classNames: state.enabled ? "text-activeInCall" : ""
117
- }
118
- }
119
- ];
120
- },
121
- connector: ({ node }) => {
122
- const meeting = node.data;
123
- const client = context.requestCapability(ClientCapabilities.Client);
124
- const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);
125
- return [
126
- {
127
- id: `${fullyQualifiedId(meeting)}${ATTENDABLE_PATH_SEPARATOR}${getSchemaTypename(TranscriptType)}`,
128
- type: PLANK_COMPANION_TYPE,
129
- data: meeting.artifacts[getSchemaTypename(TranscriptType)]?.target,
130
- properties: {
131
- label: [
132
- "transcript companion label",
133
- {
134
- ns: TRANSCRIPTION_PLUGIN
135
- }
136
- ],
137
- icon: "ph--subtitles--regular",
138
- disposition: "hidden",
139
- schema: TranscriptType,
140
- getIntent: ({ space }) => createIntent(TranscriptionAction.Create, {
141
- spaceId: space.id
142
- }),
143
- onJoin: () => {
144
- const transcriptionManager = new TranscriptionManager(client.edge);
145
- const identity = client.halo.identity.get();
146
- invariant(identity, void 0, {
147
- F: __dxlog_file,
148
- L: 116,
149
- S: void 0,
150
- A: [
151
- "identity",
152
- ""
153
- ]
154
- });
155
- transcriptionManager.setName(identity.profile?.displayName ?? generateName(identity.identityKey.toHex()));
156
- const fallbackValue = keyToFallback(identity.identityKey);
157
- const userHue = identity.profile?.data?.hue || fallbackValue.hue;
158
- transcriptionManager.setHue(userHue);
159
- void transcriptionManager.open();
160
- state.transcriptionManager = transcriptionManager;
161
- },
162
- onLeave: () => {
163
- void state.transcriptionManager?.close();
164
- state.transcriptionManager = void 0;
165
- state.enabled = false;
166
- },
167
- onCallStateUpdated: (callState) => {
168
- const typename = getSchemaTypename(TranscriptType);
169
- const transcription = typename ? callState.activities?.[typename] : void 0;
170
- if (!transcription?.payload?.value) {
171
- return;
172
- }
173
- const payload = codec.decode(transcription.payload.value);
174
- state.enabled = payload.enabled;
175
- void state.transcriptionManager?.setEnabled(payload.enabled);
176
- void state.transcriptionManager?.setQueue(payload.queueDxn);
177
- },
178
- onMediaStateUpdated: ([mediaState, isSpeaking]) => {
179
- void state.transcriptionManager?.setAudioTrack(mediaState.audioTrack);
180
- void state.transcriptionManager?.setRecording(isSpeaking);
181
- }
182
- }
183
- }
184
- ];
185
- }
186
- })
187
- ]);
188
- export {
189
- app_graph_builder_default as default
190
- };
191
- //# sourceMappingURL=app-graph-builder-VDQOVX7P.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/capabilities/app-graph-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport { Capabilities, contributes, createIntent, type PluginsContext } from '@dxos/app-framework';\nimport { fullyQualifiedId, getSpace, makeRef, type Space } from '@dxos/client/echo';\nimport { generateName } from '@dxos/display-name';\nimport { getSchemaTypename, isInstanceOf } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { ClientCapabilities } from '@dxos/plugin-client';\nimport { PLANK_COMPANION_TYPE, ATTENDABLE_PATH_SEPARATOR } from '@dxos/plugin-deck/types';\nimport { createExtension, type Node } from '@dxos/plugin-graph';\nimport { MeetingCapabilities, type CallState, type MediaState } from '@dxos/plugin-meeting';\nimport { MeetingType } from '@dxos/plugin-meeting/types';\nimport { buf } from '@dxos/protocols/buf';\nimport {\n TranscriptionPayloadSchema,\n type TranscriptionPayload as TranscriptionPayloadProto,\n} from '@dxos/protocols/buf/dxos/edge/calls_pb';\nimport { keyToFallback } from '@dxos/util';\n\nimport { TranscriptionCapabilities } from './capabilities';\nimport { TRANSCRIPTION_PLUGIN } from '../meta';\nimport { TranscriptionManager } from '../transcriber';\nimport { TranscriptionAction, TranscriptType } from '../types';\n\n// TODO(wittjosiah): Factor out.\n// TODO(wittjosiah): Can we stop using protobuf for this?\ntype TranscriptionPayload = buf.MessageInitShape<typeof TranscriptionPayloadSchema>;\nconst codec = {\n encode: (message: TranscriptionPayload): Uint8Array => {\n return buf.toBinary(TranscriptionPayloadSchema, buf.create(TranscriptionPayloadSchema, message));\n },\n decode: (message: Uint8Array): TranscriptionPayloadProto => {\n return buf.fromBinary(TranscriptionPayloadSchema, message);\n },\n};\n\nconst getMeetingTranscript = async (\n context: PluginsContext,\n meeting: MeetingType,\n): Promise<TranscriptType | undefined> => {\n const { dispatchPromise: dispatch } = context.requestCapability(Capabilities.IntentDispatcher);\n\n const typename = getSchemaTypename(TranscriptType)!;\n const existing = await meeting.artifacts[typename]?.load();\n if (existing instanceof TranscriptType) {\n return existing;\n }\n\n const space = getSpace(meeting);\n invariant(space);\n const { data } = await dispatch(createIntent(TranscriptionAction.Create, { spaceId: space.id }));\n meeting.artifacts[typename] = makeRef(data!.object);\n return data?.object;\n};\n\n// TODO(wittjosiah): Introduce a sound that plays when transcription is activated/deactivated.\nexport default (context: PluginsContext) =>\n contributes(Capabilities.AppGraphBuilder, [\n createExtension({\n id: `${TRANSCRIPTION_PLUGIN}/meeting-transcript`,\n filter: (node): node is Node<MeetingType> =>\n isInstanceOf(MeetingType, node.data) && node.type !== PLANK_COMPANION_TYPE,\n actions: ({ node }) => {\n const meeting = node.data;\n const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);\n return [\n {\n id: `${fullyQualifiedId(meeting)}/action/start-stop-transcription`,\n data: async () => {\n const call = context.requestCapability(MeetingCapabilities.CallManager);\n invariant(state.transcriptionManager);\n state.enabled = !state.enabled;\n void state.transcriptionManager.setEnabled(state.enabled);\n const transcript = await getMeetingTranscript(context, meeting);\n invariant(transcript, 'Failed to create transcript');\n call.setActivity(getSchemaTypename(TranscriptType)!, {\n value: codec.encode({\n enabled: state.enabled,\n queueDxn: transcript.queue.dxn.toString(),\n }),\n });\n },\n properties: {\n label: state.enabled\n ? ['stop transcription label', { ns: TRANSCRIPTION_PLUGIN }]\n : ['start transcription label', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--record--regular',\n disposition: 'toolbar',\n classNames: state.enabled ? 'text-activeInCall' : '',\n },\n },\n ];\n },\n connector: ({ node }) => {\n const meeting = node.data;\n const client = context.requestCapability(ClientCapabilities.Client);\n const state = context.requestCapability(TranscriptionCapabilities.MeetingTranscriptionState);\n\n return [\n {\n id: `${fullyQualifiedId(meeting)}${ATTENDABLE_PATH_SEPARATOR}${getSchemaTypename(TranscriptType)}`,\n type: PLANK_COMPANION_TYPE,\n data: meeting.artifacts[getSchemaTypename(TranscriptType)!]?.target,\n properties: {\n label: ['transcript companion label', { ns: TRANSCRIPTION_PLUGIN }],\n icon: 'ph--subtitles--regular',\n disposition: 'hidden',\n schema: TranscriptType,\n getIntent: ({ space }: { space: Space }) =>\n createIntent(TranscriptionAction.Create, { spaceId: space.id }),\n onJoin: () => {\n const transcriptionManager = new TranscriptionManager(client.edge);\n const identity = client.halo.identity.get();\n invariant(identity);\n transcriptionManager.setName(\n identity.profile?.displayName ?? generateName(identity.identityKey.toHex()),\n );\n const fallbackValue = keyToFallback(identity!.identityKey);\n const userHue = identity!.profile?.data?.hue || fallbackValue.hue;\n transcriptionManager.setHue(userHue);\n void transcriptionManager.open();\n state.transcriptionManager = transcriptionManager;\n },\n onLeave: () => {\n void state.transcriptionManager?.close();\n state.transcriptionManager = undefined;\n state.enabled = false;\n },\n onCallStateUpdated: (callState: CallState) => {\n const typename = getSchemaTypename(TranscriptType);\n const transcription = typename ? callState.activities?.[typename] : undefined;\n if (!transcription?.payload?.value) {\n return;\n }\n\n const payload = codec.decode(transcription.payload.value);\n state.enabled = payload.enabled;\n void state.transcriptionManager?.setEnabled(payload.enabled);\n void state.transcriptionManager?.setQueue(payload.queueDxn);\n },\n onMediaStateUpdated: ([mediaState, isSpeaking]: [MediaState, boolean]) => {\n void state.transcriptionManager?.setAudioTrack(mediaState.audioTrack);\n void state.transcriptionManager?.setRecording(isSpeaking);\n },\n },\n },\n ];\n },\n }),\n ]);\n"],
5
- "mappings": "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",
6
- "names": ["Capabilities", "contributes", "createIntent", "fullyQualifiedId", "getSpace", "makeRef", "generateName", "getSchemaTypename", "isInstanceOf", "invariant", "ClientCapabilities", "PLANK_COMPANION_TYPE", "ATTENDABLE_PATH_SEPARATOR", "createExtension", "MeetingCapabilities", "MeetingType", "buf", "TranscriptionPayloadSchema", "keyToFallback", "codec", "encode", "message", "buf", "toBinary", "TranscriptionPayloadSchema", "create", "decode", "fromBinary", "getMeetingTranscript", "context", "meeting", "dispatchPromise", "dispatch", "requestCapability", "Capabilities", "IntentDispatcher", "typename", "getSchemaTypename", "TranscriptType", "existing", "artifacts", "load", "space", "getSpace", "invariant", "data", "createIntent", "TranscriptionAction", "Create", "spaceId", "id", "makeRef", "object", "contributes", "AppGraphBuilder", "createExtension", "TRANSCRIPTION_PLUGIN", "filter", "node", "isInstanceOf", "MeetingType", "type", "PLANK_COMPANION_TYPE", "actions", "state", "TranscriptionCapabilities", "MeetingTranscriptionState", "fullyQualifiedId", "call", "MeetingCapabilities", "CallManager", "transcriptionManager", "enabled", "setEnabled", "transcript", "setActivity", "value", "queueDxn", "queue", "dxn", "toString", "properties", "label", "ns", "icon", "disposition", "classNames", "connector", "client", "ClientCapabilities", "Client", "ATTENDABLE_PATH_SEPARATOR", "target", "schema", "getIntent", "onJoin", "TranscriptionManager", "edge", "identity", "halo", "get", "setName", "profile", "displayName", "generateName", "identityKey", "toHex", "fallbackValue", "keyToFallback", "userHue", "hue", "setHue", "open", "onLeave", "close", "undefined", "onCallStateUpdated", "callState", "transcription", "activities", "payload", "setQueue", "onMediaStateUpdated", "mediaState", "isSpeaking", "setAudioTrack", "audioTrack", "setRecording"]
7
- }