@dxos/plugin-transcription 0.8.3 → 0.8.4-main.1068cf700f

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 (273) hide show
  1. package/dist/lib/browser/TranscriptContainer-MV3JBKLS.mjs +12 -0
  2. package/dist/lib/browser/blueprint-definition-K3E72ZBC.mjs +19 -0
  3. package/dist/lib/browser/blueprint-definition-K3E72ZBC.mjs.map +7 -0
  4. package/dist/lib/browser/blueprints/index.mjs +9 -0
  5. package/dist/lib/browser/chunk-AV44VISC.mjs +148 -0
  6. package/dist/lib/browser/chunk-AV44VISC.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-HOOPZ7EM.mjs +35 -0
  8. package/dist/lib/browser/chunk-HOOPZ7EM.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-J5LGTIGS.mjs +10 -0
  10. package/dist/lib/browser/chunk-J5LGTIGS.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-53AXUEIQ.mjs → chunk-K3JJ46VV.mjs} +367 -433
  12. package/dist/lib/browser/chunk-K3JJ46VV.mjs.map +7 -0
  13. package/dist/lib/browser/chunk-Q5OC3WVG.mjs +72 -0
  14. package/dist/lib/browser/chunk-Q5OC3WVG.mjs.map +7 -0
  15. package/dist/lib/browser/{chunk-UDCCT32F.mjs → chunk-RUKY36XW.mjs} +3 -3
  16. package/dist/lib/browser/{chunk-IQ5ZRMHZ.mjs → chunk-TKFU53OZ.mjs} +70 -105
  17. package/dist/lib/browser/chunk-TKFU53OZ.mjs.map +7 -0
  18. package/dist/lib/browser/index.mjs +68 -75
  19. package/dist/lib/browser/index.mjs.map +4 -4
  20. package/dist/lib/browser/meta.json +1 -1
  21. package/dist/lib/browser/operation-resolver-GLEBGPKH.mjs +22 -0
  22. package/dist/lib/browser/operation-resolver-GLEBGPKH.mjs.map +7 -0
  23. package/dist/lib/browser/react-surface-AWZ2A5WZ.mjs +35 -0
  24. package/dist/lib/browser/react-surface-AWZ2A5WZ.mjs.map +7 -0
  25. package/dist/lib/browser/{transcriber-OYPLZFG5.mjs → transcriber-SLVQP76E.mjs} +17 -13
  26. package/dist/lib/browser/transcriber-SLVQP76E.mjs.map +7 -0
  27. package/dist/lib/browser/types/index.mjs +8 -8
  28. package/dist/lib/node-esm/{TranscriptContainer-G75LDEO5.mjs → TranscriptContainer-7M43UAZ2.mjs} +5 -4
  29. package/dist/lib/node-esm/TranscriptContainer-7M43UAZ2.mjs.map +7 -0
  30. package/dist/lib/node-esm/blueprint-definition-2WIDDA3Y.mjs +20 -0
  31. package/dist/lib/node-esm/blueprint-definition-2WIDDA3Y.mjs.map +7 -0
  32. package/dist/lib/node-esm/blueprints/index.mjs +10 -0
  33. package/dist/lib/node-esm/blueprints/index.mjs.map +7 -0
  34. package/dist/lib/node-esm/chunk-4BFY6P2D.mjs +73 -0
  35. package/dist/lib/node-esm/chunk-4BFY6P2D.mjs.map +7 -0
  36. package/dist/lib/node-esm/{chunk-PRL64SRU.mjs → chunk-EPC27WWV.mjs} +70 -105
  37. package/dist/lib/node-esm/chunk-EPC27WWV.mjs.map +7 -0
  38. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +11 -0
  39. package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +7 -0
  40. package/dist/lib/node-esm/chunk-NVM2QUMX.mjs +37 -0
  41. package/dist/lib/node-esm/chunk-NVM2QUMX.mjs.map +7 -0
  42. package/dist/lib/node-esm/{chunk-MFJO7EKD.mjs → chunk-SNZAN34I.mjs} +3 -3
  43. package/dist/lib/node-esm/{chunk-56QHOX4A.mjs → chunk-TIUYXGQN.mjs} +367 -433
  44. package/dist/lib/node-esm/chunk-TIUYXGQN.mjs.map +7 -0
  45. package/dist/lib/node-esm/chunk-TTJBW7CY.mjs +149 -0
  46. package/dist/lib/node-esm/chunk-TTJBW7CY.mjs.map +7 -0
  47. package/dist/lib/node-esm/index.mjs +68 -75
  48. package/dist/lib/node-esm/index.mjs.map +4 -4
  49. package/dist/lib/node-esm/meta.json +1 -1
  50. package/dist/lib/node-esm/operation-resolver-SMCFTUFM.mjs +23 -0
  51. package/dist/lib/node-esm/operation-resolver-SMCFTUFM.mjs.map +7 -0
  52. package/dist/lib/node-esm/react-surface-YBBXC4W5.mjs +36 -0
  53. package/dist/lib/node-esm/react-surface-YBBXC4W5.mjs.map +7 -0
  54. package/dist/lib/node-esm/{transcriber-TVG2MBBN.mjs → transcriber-BO2N3UQ4.mjs} +17 -13
  55. package/dist/lib/node-esm/transcriber-BO2N3UQ4.mjs.map +7 -0
  56. package/dist/lib/node-esm/types/index.mjs +8 -8
  57. package/dist/types/src/TranscriptionPlugin.d.ts +2 -1
  58. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  59. package/dist/types/src/blueprints/index.d.ts +2 -0
  60. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  61. package/dist/types/src/blueprints/transcription-blueprint.d.ts +21 -0
  62. package/dist/types/src/blueprints/transcription-blueprint.d.ts.map +1 -0
  63. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts +10 -0
  64. package/dist/types/src/capabilities/blueprint-definition/blueprint-definition.d.ts.map +1 -0
  65. package/dist/types/src/capabilities/blueprint-definition/index.d.ts +3 -0
  66. package/dist/types/src/capabilities/blueprint-definition/index.d.ts.map +1 -0
  67. package/dist/types/src/capabilities/index.d.ts +4 -4
  68. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  69. package/dist/types/src/capabilities/operation-handler/index.d.ts +3 -0
  70. package/dist/types/src/capabilities/operation-handler/index.d.ts.map +1 -0
  71. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts +5 -0
  72. package/dist/types/src/capabilities/operation-handler/operation-handler.d.ts.map +1 -0
  73. package/dist/types/src/capabilities/operation-resolver/index.d.ts +3 -0
  74. package/dist/types/src/capabilities/operation-resolver/index.d.ts.map +1 -0
  75. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts +5 -0
  76. package/dist/types/src/capabilities/operation-resolver/operation-resolver.d.ts.map +1 -0
  77. package/dist/types/src/capabilities/react-surface/index.d.ts +3 -0
  78. package/dist/types/src/capabilities/react-surface/index.d.ts.map +1 -0
  79. package/dist/types/src/capabilities/react-surface/react-surface.d.ts +5 -0
  80. package/dist/types/src/capabilities/react-surface/react-surface.d.ts.map +1 -0
  81. package/dist/types/src/capabilities/transcriber/index.d.ts +3 -0
  82. package/dist/types/src/capabilities/transcriber/index.d.ts.map +1 -0
  83. package/dist/types/src/capabilities/transcriber/transcriber.d.ts +9 -0
  84. package/dist/types/src/capabilities/transcriber/transcriber.d.ts.map +1 -0
  85. package/dist/types/src/components/Transcript/Transcript.d.ts +7 -10
  86. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  87. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +34 -18
  88. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +12 -12
  90. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +1 -1
  91. package/dist/types/src/components/Transcript/transcript-extension.d.ts +3 -7
  92. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +1 -1
  93. package/dist/types/src/components/TranscriptContainer.d.ts +5 -6
  94. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  95. package/dist/types/src/components/index.d.ts +1 -4
  96. package/dist/types/src/components/index.d.ts.map +1 -1
  97. package/dist/types/src/components/stories/FileTranscription.stories.d.ts +8 -7
  98. package/dist/types/src/components/stories/FileTranscription.stories.d.ts.map +1 -1
  99. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts +10 -6
  100. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts +10 -9
  102. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/stories/TranscriptionStory.d.ts +4 -3
  104. package/dist/types/src/components/stories/TranscriptionStory.d.ts.map +1 -1
  105. package/dist/types/src/functions/index.d.ts +3 -0
  106. package/dist/types/src/functions/index.d.ts.map +1 -0
  107. package/dist/types/src/functions/open.d.ts +11 -0
  108. package/dist/types/src/functions/open.d.ts.map +1 -0
  109. package/dist/types/src/functions/summarize.d.ts +11 -0
  110. package/dist/types/src/functions/summarize.d.ts.map +1 -0
  111. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
  112. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +1 -1
  113. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -1
  114. package/dist/types/src/hooks/useTranscriber.d.ts +2 -2
  115. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  116. package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
  117. package/dist/types/src/index.d.ts +1 -1
  118. package/dist/types/src/index.d.ts.map +1 -1
  119. package/dist/types/src/meta.d.ts +2 -3
  120. package/dist/types/src/meta.d.ts.map +1 -1
  121. package/dist/types/src/segments-normalization/message-normalizer.d.ts +5 -5
  122. package/dist/types/src/segments-normalization/message-normalizer.d.ts.map +1 -1
  123. package/dist/types/src/segments-normalization/normalization.d.ts +503 -311
  124. package/dist/types/src/segments-normalization/normalization.d.ts.map +1 -1
  125. package/dist/types/src/segments-normalization/utils.d.ts +2 -2
  126. package/dist/types/src/segments-normalization/utils.d.ts.map +1 -1
  127. package/dist/types/src/testing/testing.d.ts +10 -10
  128. package/dist/types/src/testing/testing.d.ts.map +1 -1
  129. package/dist/types/src/transcriber/index.d.ts +1 -1
  130. package/dist/types/src/transcriber/index.d.ts.map +1 -1
  131. package/dist/types/src/transcriber/media-stream-recorder.d.ts +3 -3
  132. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  133. package/dist/types/src/transcriber/transcriber.d.ts +4 -4
  134. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  135. package/dist/types/src/transcriber/transcription-manager.d.ts +12 -13
  136. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  137. package/dist/types/src/translations.d.ts +11 -11
  138. package/dist/types/src/translations.d.ts.map +1 -1
  139. package/dist/types/src/types/TranscriptAction.d.ts +25 -0
  140. package/dist/types/src/types/TranscriptAction.d.ts.map +1 -0
  141. package/dist/types/src/types/capabilities.d.ts +18 -0
  142. package/dist/types/src/types/capabilities.d.ts.map +1 -0
  143. package/dist/types/src/types/index.d.ts +3 -1
  144. package/dist/types/src/types/index.d.ts.map +1 -1
  145. package/dist/types/src/types/types.d.ts +0 -26
  146. package/dist/types/src/types/types.d.ts.map +1 -1
  147. package/dist/types/src/util/index.d.ts +1 -0
  148. package/dist/types/src/util/index.d.ts.map +1 -1
  149. package/dist/types/src/util/render-byline.d.ts +4 -0
  150. package/dist/types/src/util/render-byline.d.ts.map +1 -0
  151. package/dist/types/tsconfig.tsbuildinfo +1 -1
  152. package/package.json +88 -72
  153. package/src/TranscriptionPlugin.tsx +40 -58
  154. package/src/blueprints/index.ts +5 -0
  155. package/src/blueprints/transcription-blueprint.ts +25 -0
  156. package/src/capabilities/blueprint-definition/blueprint-definition.ts +24 -0
  157. package/src/capabilities/blueprint-definition/index.ts +7 -0
  158. package/src/capabilities/index.ts +4 -7
  159. package/src/capabilities/operation-handler/index.ts +7 -0
  160. package/src/capabilities/operation-handler/operation-handler.ts +25 -0
  161. package/src/capabilities/operation-resolver/index.ts +7 -0
  162. package/src/capabilities/operation-resolver/operation-resolver.ts +25 -0
  163. package/src/capabilities/react-surface/index.ts +7 -0
  164. package/src/capabilities/react-surface/react-surface.tsx +28 -0
  165. package/src/capabilities/transcriber/index.ts +7 -0
  166. package/src/capabilities/transcriber/transcriber.ts +85 -0
  167. package/src/components/Transcript/Transcript.stories.tsx +61 -57
  168. package/src/components/Transcript/Transcript.tsx +25 -59
  169. package/src/components/Transcript/deprecated/OldTranscript.tsx +11 -11
  170. package/src/components/Transcript/transcript-extension.ts +13 -46
  171. package/src/components/TranscriptContainer.tsx +19 -15
  172. package/src/components/stories/FileTranscription.stories.tsx +80 -70
  173. package/src/components/stories/KeyWordRecognition.stories.tsx +17 -13
  174. package/src/components/stories/MicrophoneTranscription.stories.tsx +89 -87
  175. package/src/components/stories/TranscriptionStory.tsx +14 -14
  176. package/src/functions/index.ts +6 -0
  177. package/src/functions/open.ts +37 -0
  178. package/src/functions/summarize.ts +103 -0
  179. package/src/hooks/useAudioFile.ts +49 -53
  180. package/src/hooks/useQueueModelAdapter.ts +1 -1
  181. package/src/hooks/useTranscriber.ts +12 -7
  182. package/src/hooks/useVoiceInput.ts +4 -3
  183. package/src/index.ts +1 -1
  184. package/src/meta.ts +9 -6
  185. package/src/model/model.test.ts +27 -21
  186. package/src/segments-normalization/message-normalizer.ts +19 -14
  187. package/src/segments-normalization/normalization.test.ts +25 -32
  188. package/src/segments-normalization/normalization.ts +59 -49
  189. package/src/segments-normalization/utils.ts +2 -2
  190. package/src/testing/testing.ts +42 -32
  191. package/src/transcriber/index.ts +1 -1
  192. package/src/transcriber/media-stream-recorder.ts +4 -4
  193. package/src/transcriber/transcriber.browser.test.ts +6 -5
  194. package/src/transcriber/transcriber.ts +9 -11
  195. package/src/transcriber/transcription-manager.ts +37 -52
  196. package/src/translations.ts +6 -4
  197. package/src/types/TranscriptAction.ts +32 -0
  198. package/src/types/capabilities.ts +33 -0
  199. package/src/types/index.ts +3 -1
  200. package/src/types/types.ts +0 -23
  201. package/src/util/index.ts +1 -0
  202. package/src/util/render-byline.ts +33 -0
  203. package/dist/lib/browser/TranscriptContainer-H3AZQ4CQ.mjs +0 -11
  204. package/dist/lib/browser/chunk-53AXUEIQ.mjs.map +0 -7
  205. package/dist/lib/browser/chunk-GOF7MJNV.mjs +0 -19
  206. package/dist/lib/browser/chunk-GOF7MJNV.mjs.map +0 -7
  207. package/dist/lib/browser/chunk-IQ5ZRMHZ.mjs.map +0 -7
  208. package/dist/lib/browser/chunk-OSISJM2F.mjs +0 -55
  209. package/dist/lib/browser/chunk-OSISJM2F.mjs.map +0 -7
  210. package/dist/lib/browser/chunk-W2KNYJD6.mjs +0 -16
  211. package/dist/lib/browser/chunk-W2KNYJD6.mjs.map +0 -7
  212. package/dist/lib/browser/intent-resolver-BGADCHVM.mjs +0 -30
  213. package/dist/lib/browser/intent-resolver-BGADCHVM.mjs.map +0 -7
  214. package/dist/lib/browser/react-surface-HMJS5FSS.mjs +0 -34
  215. package/dist/lib/browser/react-surface-HMJS5FSS.mjs.map +0 -7
  216. package/dist/lib/browser/transcriber-OYPLZFG5.mjs.map +0 -7
  217. package/dist/lib/node/TranscriptContainer-KIG3GMAB.cjs +0 -32
  218. package/dist/lib/node/TranscriptContainer-KIG3GMAB.cjs.map +0 -7
  219. package/dist/lib/node/chunk-3PYT3BDM.cjs +0 -40
  220. package/dist/lib/node/chunk-3PYT3BDM.cjs.map +0 -7
  221. package/dist/lib/node/chunk-6LW5RA3K.cjs +0 -75
  222. package/dist/lib/node/chunk-6LW5RA3K.cjs.map +0 -7
  223. package/dist/lib/node/chunk-AFUZI63A.cjs +0 -42
  224. package/dist/lib/node/chunk-AFUZI63A.cjs.map +0 -7
  225. package/dist/lib/node/chunk-CVUN3UO7.cjs +0 -778
  226. package/dist/lib/node/chunk-CVUN3UO7.cjs.map +0 -7
  227. package/dist/lib/node/chunk-FKDJNJ57.cjs +0 -35
  228. package/dist/lib/node/chunk-FKDJNJ57.cjs.map +0 -7
  229. package/dist/lib/node/chunk-ZFAUMZXE.cjs +0 -518
  230. package/dist/lib/node/chunk-ZFAUMZXE.cjs.map +0 -7
  231. package/dist/lib/node/index.cjs +0 -133
  232. package/dist/lib/node/index.cjs.map +0 -7
  233. package/dist/lib/node/intent-resolver-LL3TTI4H.cjs +0 -45
  234. package/dist/lib/node/intent-resolver-LL3TTI4H.cjs.map +0 -7
  235. package/dist/lib/node/meta.json +0 -1
  236. package/dist/lib/node/react-surface-N25TBBG4.cjs +0 -56
  237. package/dist/lib/node/react-surface-N25TBBG4.cjs.map +0 -7
  238. package/dist/lib/node/transcriber-6J4FVFSZ.cjs +0 -68
  239. package/dist/lib/node/transcriber-6J4FVFSZ.cjs.map +0 -7
  240. package/dist/lib/node/types/index.cjs +0 -36
  241. package/dist/lib/node/types/index.cjs.map +0 -7
  242. package/dist/lib/node-esm/chunk-56QHOX4A.mjs.map +0 -7
  243. package/dist/lib/node-esm/chunk-FH75X4JC.mjs +0 -56
  244. package/dist/lib/node-esm/chunk-FH75X4JC.mjs.map +0 -7
  245. package/dist/lib/node-esm/chunk-MFJPEIVB.mjs +0 -17
  246. package/dist/lib/node-esm/chunk-MFJPEIVB.mjs.map +0 -7
  247. package/dist/lib/node-esm/chunk-PRL64SRU.mjs.map +0 -7
  248. package/dist/lib/node-esm/chunk-TXMDLLBR.mjs +0 -21
  249. package/dist/lib/node-esm/chunk-TXMDLLBR.mjs.map +0 -7
  250. package/dist/lib/node-esm/intent-resolver-5LVCYSJS.mjs +0 -31
  251. package/dist/lib/node-esm/intent-resolver-5LVCYSJS.mjs.map +0 -7
  252. package/dist/lib/node-esm/react-surface-JGQSYGRR.mjs +0 -35
  253. package/dist/lib/node-esm/react-surface-JGQSYGRR.mjs.map +0 -7
  254. package/dist/lib/node-esm/transcriber-TVG2MBBN.mjs.map +0 -7
  255. package/dist/types/src/capabilities/capabilities.d.ts +0 -17
  256. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  257. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  258. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  259. package/dist/types/src/capabilities/react-surface.d.ts +0 -4
  260. package/dist/types/src/capabilities/react-surface.d.ts.map +0 -1
  261. package/dist/types/src/capabilities/transcriber.d.ts +0 -8
  262. package/dist/types/src/capabilities/transcriber.d.ts.map +0 -1
  263. package/dist/types/src/types/schema.d.ts +0 -41
  264. package/dist/types/src/types/schema.d.ts.map +0 -1
  265. package/src/capabilities/capabilities.ts +0 -33
  266. package/src/capabilities/intent-resolver.ts +0 -24
  267. package/src/capabilities/react-surface.tsx +0 -22
  268. package/src/capabilities/transcriber.ts +0 -76
  269. package/src/types/schema.ts +0 -41
  270. /package/dist/lib/browser/{TranscriptContainer-H3AZQ4CQ.mjs.map → TranscriptContainer-MV3JBKLS.mjs.map} +0 -0
  271. /package/dist/lib/{node-esm/TranscriptContainer-G75LDEO5.mjs.map → browser/blueprints/index.mjs.map} +0 -0
  272. /package/dist/lib/browser/{chunk-UDCCT32F.mjs.map → chunk-RUKY36XW.mjs.map} +0 -0
  273. /package/dist/lib/node-esm/{chunk-MFJO7EKD.mjs.map → chunk-SNZAN34I.mjs.map} +0 -0
@@ -1,36 +1,144 @@
1
+ import {
2
+ renderByline
3
+ } from "./chunk-HOOPZ7EM.mjs";
1
4
  import {
2
5
  TranscriptionCapabilities
3
- } from "./chunk-W2KNYJD6.mjs";
6
+ } from "./chunk-Q5OC3WVG.mjs";
4
7
 
5
- // packages/plugins/plugin-transcription/src/components/TranscriptContainer.tsx
6
- import { useSignals as _useSignals2 } from "@preact-signals/safe-react/tracking";
8
+ // src/components/TranscriptContainer.tsx
7
9
  import React2 from "react";
8
- import { fullyQualifiedId, getSpace } from "@dxos/client/echo";
10
+ import { Obj } from "@dxos/echo";
9
11
  import { useMembers, useQueue } from "@dxos/react-client/echo";
10
- import { StackItem } from "@dxos/react-ui-stack";
12
+ import { Layout } from "@dxos/react-ui";
11
13
 
12
- // packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx
13
- import { useSignals as _useSignals } from "@preact-signals/safe-react/tracking";
14
- import React from "react";
15
- import { IconButton, useThemeContext } from "@dxos/react-ui";
16
- import { createBasicExtensions, createMarkdownExtensions, createRenderer, createThemeExtensions, decorateMarkdown, editorWidth, preview, useTextEditor } from "@dxos/react-ui-editor";
17
- import { mx } from "@dxos/react-ui-theme";
18
- import { isNotFalsy } from "@dxos/util";
14
+ // src/hooks/useAudioFile.ts
15
+ import { useEffect, useState } from "react";
16
+ import { scheduleTask } from "@dxos/async";
17
+ import { Context } from "@dxos/context";
18
+ import { log } from "@dxos/log";
19
+ var __dxlog_file = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts";
20
+ var useAudioFile = (audioUrl, constraints) => {
21
+ const [{ audio, stream, track }, setStream] = useState({});
22
+ useEffect(() => {
23
+ const ctx = new Context(void 0, {
24
+ F: __dxlog_file,
25
+ L: 20
26
+ });
27
+ scheduleTask(ctx, async () => {
28
+ try {
29
+ const response = await fetch(audioUrl);
30
+ const blob = await response.blob();
31
+ const objectUrl = URL.createObjectURL(blob);
32
+ ctx.onDispose(() => {
33
+ URL.revokeObjectURL(objectUrl);
34
+ });
35
+ const audio2 = new Audio();
36
+ audio2.src = objectUrl;
37
+ await new Promise((resolve, reject) => {
38
+ audio2.addEventListener("error", (err) => {
39
+ log.error("error", {
40
+ err
41
+ }, {
42
+ F: __dxlog_file,
43
+ L: 39,
44
+ S: void 0,
45
+ C: (f, a) => f(...a)
46
+ });
47
+ reject(err);
48
+ }, {
49
+ once: true
50
+ });
51
+ audio2.addEventListener("canplay", async () => {
52
+ resolve();
53
+ }, {
54
+ once: true
55
+ });
56
+ audio2.load();
57
+ });
58
+ const audioCtx = new AudioContext();
59
+ if (audioCtx.state === "suspended") {
60
+ await audioCtx.resume();
61
+ }
62
+ const destination = audioCtx.createMediaStreamDestination();
63
+ destination.channelCount = 1;
64
+ const source = audioCtx.createMediaElementSource(audio2);
65
+ source.connect(destination);
66
+ const track2 = destination.stream.getAudioTracks()[0];
67
+ if (constraints) {
68
+ await track2.applyConstraints(constraints).catch((err) => log.catch(err, void 0, {
69
+ F: __dxlog_file,
70
+ L: 68,
71
+ S: void 0,
72
+ C: (f, a) => f(...a)
73
+ }));
74
+ }
75
+ setStream({
76
+ audio: audio2,
77
+ stream: destination.stream,
78
+ track: destination.stream.getAudioTracks()[0]
79
+ });
80
+ } catch (err) {
81
+ log.catch(err, void 0, {
82
+ F: __dxlog_file,
83
+ L: 78,
84
+ S: void 0,
85
+ C: (f, a) => f(...a)
86
+ });
87
+ }
88
+ });
89
+ return () => {
90
+ void ctx.dispose();
91
+ };
92
+ }, [
93
+ audioUrl
94
+ ]);
95
+ return {
96
+ audio,
97
+ stream,
98
+ track
99
+ };
100
+ };
19
101
 
20
- // packages/plugins/plugin-transcription/src/components/Transcript/transcript-extension.ts
21
- import { RangeSetBuilder } from "@codemirror/state";
22
- import { EditorView, GutterMarker, ViewPlugin, gutter } from "@codemirror/view";
23
- import { format } from "date-fns/format";
24
- import { intervalToDuration } from "date-fns/intervalToDuration";
25
- import { addEventListener, combine } from "@dxos/async";
102
+ // src/hooks/useAudioTrack.ts
103
+ import { useEffect as useEffect2, useState as useState2 } from "react";
104
+ var useAudioTrack = (active, constraints) => {
105
+ const [track, setTrack] = useState2();
106
+ useEffect2(() => {
107
+ if (!active) {
108
+ track?.stop();
109
+ setTrack(void 0);
110
+ return;
111
+ }
112
+ const initAudio = async () => {
113
+ const audio = new Audio();
114
+ audio.srcObject = await navigator.mediaDevices.getUserMedia({
115
+ audio: constraints ?? true
116
+ });
117
+ const [track2] = audio.srcObject.getAudioTracks();
118
+ if (track2) {
119
+ setTrack(track2);
120
+ }
121
+ };
122
+ if (active) {
123
+ void initAudio();
124
+ }
125
+ }, [
126
+ active
127
+ ]);
128
+ return track;
129
+ };
130
+
131
+ // src/hooks/useQueueModelAdapter.ts
132
+ import { useEffect as useEffect3, useMemo, useState as useState3 } from "react";
26
133
 
27
- // packages/plugins/plugin-transcription/src/model/model.ts
134
+ // src/model/model.ts
28
135
  import { Text } from "@codemirror/state";
29
136
  import { Event } from "@dxos/async";
30
137
  import { invariant } from "@dxos/invariant";
31
- import { log } from "@dxos/log";
32
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/model/model.ts";
138
+ import { log as log2 } from "@dxos/log";
139
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/model/model.ts";
33
140
  var DocumentAdapter = class {
141
+ _view;
34
142
  constructor(_view) {
35
143
  this._view = _view;
36
144
  }
@@ -39,13 +147,13 @@ var DocumentAdapter = class {
39
147
  return this._view.state.doc.lines - 1;
40
148
  }
41
149
  replaceLines(from, remove, insert) {
42
- log("replaceLines", {
150
+ log2("replaceLines", {
43
151
  count: this._view.state.doc.lines,
44
152
  from,
45
153
  remove,
46
154
  insert
47
155
  }, {
48
- F: __dxlog_file,
156
+ F: __dxlog_file2,
49
157
  L: 39,
50
158
  S: this,
51
159
  C: (f, a) => f(...a)
@@ -67,13 +175,19 @@ var DocumentAdapter = class {
67
175
  }
68
176
  };
69
177
  var SerializationModel = class {
178
+ _renderer;
179
+ /** Ordered set of chunks. */
180
+ _chunks = [];
181
+ /** Map of chunk IDs to their current line counts. */
182
+ _chunkLineCounts = /* @__PURE__ */ new Map();
183
+ /** Map of line numbers to chunk IDs. */
184
+ _lineToChunk = /* @__PURE__ */ new Map();
185
+ /** Track chunk changes since last sync. */
186
+ _changes = [];
187
+ /** Emits when the document is updated. */
188
+ update = new Event();
70
189
  constructor(_renderer, initialChunks = []) {
71
190
  this._renderer = _renderer;
72
- this._chunks = [];
73
- this._chunkLineCounts = /* @__PURE__ */ new Map();
74
- this._lineToChunk = /* @__PURE__ */ new Map();
75
- this._changes = [];
76
- this.update = new Event();
77
191
  initialChunks.forEach((chunk) => {
78
192
  this.appendChunk(chunk);
79
193
  });
@@ -120,7 +234,7 @@ var SerializationModel = class {
120
234
  updateChunk(chunk) {
121
235
  const index = this._chunks.findIndex((c) => c.id === chunk.id);
122
236
  invariant(index !== -1, void 0, {
123
- F: __dxlog_file,
237
+ F: __dxlog_file2,
124
238
  L: 147,
125
239
  S: this,
126
240
  A: [
@@ -140,7 +254,7 @@ var SerializationModel = class {
140
254
  deleteBlock(id) {
141
255
  const index = this._chunks.findIndex((c) => c.id === id);
142
256
  invariant(index !== -1, void 0, {
143
- F: __dxlog_file,
257
+ F: __dxlog_file2,
144
258
  L: 156,
145
259
  S: this,
146
260
  A: [
@@ -161,10 +275,10 @@ var SerializationModel = class {
161
275
  * Syncs the tracked changes with the ChunkDocument.
162
276
  */
163
277
  sync(document2) {
164
- log("sync", {
278
+ log2("sync", {
165
279
  changes: this._changes
166
280
  }, {
167
- F: __dxlog_file,
281
+ F: __dxlog_file2,
168
282
  L: 167,
169
283
  S: this,
170
284
  C: (f, a) => f(...a)
@@ -217,8 +331,163 @@ var SerializationModel = class {
217
331
  }
218
332
  };
219
333
 
220
- // packages/plugins/plugin-transcription/src/components/Transcript/transcript-extension.ts
221
- var transcript = ({ model, started, renderButton }) => {
334
+ // src/hooks/useQueueModelAdapter.ts
335
+ var useQueueModelAdapter = (renderer, queue, initialChunks = []) => {
336
+ const model = useMemo(() => new SerializationModel(renderer, initialChunks), [
337
+ queue
338
+ ]);
339
+ const [loaded, setLoaded] = useState3(false);
340
+ useEffect3(() => {
341
+ if (!queue) {
342
+ return;
343
+ }
344
+ const update = () => {
345
+ for (const block of queue?.objects ?? []) {
346
+ model.appendChunk(block);
347
+ }
348
+ setLoaded(true);
349
+ };
350
+ let i;
351
+ if (queue.isLoading) {
352
+ i = setInterval(() => {
353
+ if (!queue?.isLoading) {
354
+ clearInterval(i);
355
+ update();
356
+ }
357
+ }, 1e3);
358
+ } else {
359
+ update();
360
+ }
361
+ return () => clearTimeout(i);
362
+ }, [
363
+ model,
364
+ queue
365
+ ]);
366
+ useEffect3(() => {
367
+ if (!loaded || !queue || model.chunks.length === queue.objects.length) {
368
+ return;
369
+ }
370
+ const chunk = queue.objects.at(-1);
371
+ if (chunk) {
372
+ model.appendChunk(chunk);
373
+ }
374
+ }, [
375
+ model,
376
+ loaded,
377
+ queue?.objects.length
378
+ ]);
379
+ return model;
380
+ };
381
+
382
+ // src/hooks/useTranscriber.ts
383
+ import { useEffect as useEffect4, useMemo as useMemo2 } from "react";
384
+ import { useCapabilities } from "@dxos/app-framework/ui";
385
+ var useTranscriber = ({ audioStreamTrack, recorderConfig, transcriberConfig, onSegments }) => {
386
+ const [getTranscriber] = useCapabilities(TranscriptionCapabilities.Transcriber);
387
+ const transcriber = useMemo2(() => {
388
+ if (!getTranscriber || !audioStreamTrack || !onSegments) {
389
+ return void 0;
390
+ }
391
+ return getTranscriber({
392
+ audioStreamTrack,
393
+ recorderConfig,
394
+ transcriberConfig,
395
+ onSegments
396
+ });
397
+ }, [
398
+ getTranscriber,
399
+ audioStreamTrack,
400
+ recorderConfig,
401
+ transcriberConfig,
402
+ onSegments
403
+ ]);
404
+ useEffect4(() => {
405
+ return () => {
406
+ void transcriber?.close();
407
+ };
408
+ }, [
409
+ transcriber
410
+ ]);
411
+ return transcriber;
412
+ };
413
+
414
+ // src/hooks/useVoiceInput.ts
415
+ import { useCallback, useEffect as useEffect5, useState as useState4 } from "react";
416
+ import { scheduleMicroTask } from "@dxos/async";
417
+ import { Context as Context2 } from "@dxos/context";
418
+ import { log as log3 } from "@dxos/log";
419
+ import { useSoundEffect } from "@dxos/react-ui-sfx";
420
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useVoiceInput.ts";
421
+ var useVoiceInput = ({ active, onUpdate }) => {
422
+ const soundStart = useSoundEffect("StartRecording");
423
+ const soundStop = useSoundEffect("StopRecording");
424
+ const handleSegments = useCallback(async (segments) => {
425
+ const text = segments.map((str) => str.text.trim().replace(/[^\w\s]/g, "")).join(" ");
426
+ onUpdate(text);
427
+ }, []);
428
+ const [recording, setRecording] = useState4(false);
429
+ const track = useAudioTrack(active);
430
+ const transcriber = useTranscriber({
431
+ audioStreamTrack: track,
432
+ onSegments: handleSegments
433
+ });
434
+ useEffect5(() => {
435
+ const ctx = new Context2(void 0, {
436
+ F: __dxlog_file3,
437
+ L: 44
438
+ });
439
+ scheduleMicroTask(ctx, async () => {
440
+ if (active && transcriber) {
441
+ await transcriber.open();
442
+ log3.info("starting...", void 0, {
443
+ F: __dxlog_file3,
444
+ L: 48,
445
+ S: void 0,
446
+ C: (f, a) => f(...a)
447
+ });
448
+ setRecording(true);
449
+ void soundStart.play();
450
+ transcriber.startChunksRecording();
451
+ } else if (!active && transcriber?.isOpen) {
452
+ transcriber?.stopChunksRecording();
453
+ await transcriber?.close();
454
+ log3.info("stopped", void 0, {
455
+ F: __dxlog_file3,
456
+ L: 55,
457
+ S: void 0,
458
+ C: (f, a) => f(...a)
459
+ });
460
+ setRecording(false);
461
+ void soundStop.play();
462
+ }
463
+ });
464
+ return () => {
465
+ void ctx.dispose();
466
+ };
467
+ }, [
468
+ active,
469
+ transcriber
470
+ ]);
471
+ return {
472
+ recording
473
+ };
474
+ };
475
+
476
+ // src/components/Transcript/Transcript.tsx
477
+ import React from "react";
478
+ import { useThemeContext } from "@dxos/react-ui";
479
+ import { useTextEditor } from "@dxos/react-ui-editor";
480
+ import { autoScroll, createBasicExtensions, createMarkdownExtensions, createThemeExtensions, decorateMarkdown, editorSlots, preview } from "@dxos/ui-editor";
481
+ import { mx } from "@dxos/ui-theme";
482
+ import { isTruthy } from "@dxos/util";
483
+
484
+ // src/components/Transcript/transcript-extension.ts
485
+ import { RangeSetBuilder } from "@codemirror/state";
486
+ import { EditorView, GutterMarker, ViewPlugin, gutter } from "@codemirror/view";
487
+ import { format } from "date-fns/format";
488
+ import { intervalToDuration } from "date-fns/intervalToDuration";
489
+ import { addEventListener, combine } from "@dxos/async";
490
+ var transcript = ({ model, started }) => {
222
491
  return [
223
492
  // Show timestamps in the gutter.
224
493
  gutter({
@@ -231,7 +500,7 @@ var transcript = ({ model, started, renderButton }) => {
231
500
  let line = view.state.doc.lineAt(from);
232
501
  while (line.from <= to) {
233
502
  const block = model.getChunkAtLine(line.number)?.blocks[0];
234
- const timestamp = block?.type === "transcription" && block.started;
503
+ const timestamp = block?._tag === "transcript" && block.started;
235
504
  if (timestamp) {
236
505
  builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));
237
506
  }
@@ -246,8 +515,11 @@ var transcript = ({ model, started, renderButton }) => {
246
515
  }),
247
516
  // Listen for model updates.
248
517
  ViewPlugin.fromClass(class {
518
+ _controls;
519
+ _cleanup;
520
+ _adapter;
521
+ _initialized = false;
249
522
  constructor(view) {
250
- this._initialized = false;
251
523
  this._adapter = new DocumentAdapter(view);
252
524
  const scroller = view.scrollDOM;
253
525
  let isAutoScrolling = false;
@@ -269,30 +541,20 @@ var transcript = ({ model, started, renderButton }) => {
269
541
  })
270
542
  });
271
543
  };
272
- if (renderButton) {
273
- this._controls = document.createElement("div");
274
- this._controls.classList.add("cm-controls", "transition-opacity", "duration-300", "opacity-0");
275
- view.dom.appendChild(this._controls);
276
- renderButton(this._controls, {
277
- onClick: () => {
278
- scrollToBottom(false);
279
- }
280
- }, view);
281
- }
282
544
  this._cleanup = combine(addEventListener(view.scrollDOM, "scroll", () => {
283
545
  if (!isAutoScrolling) {
284
546
  hasScrolled = true;
285
547
  this._controls?.classList.remove("opacity-0");
286
548
  }
287
549
  }), model.update.on(() => {
288
- const autoScroll = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;
550
+ const autoScroll2 = scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;
289
551
  model.sync(this._adapter);
290
- if (autoScroll) {
552
+ if (autoScroll2) {
291
553
  scrollToBottom(true);
292
554
  }
293
555
  }));
294
556
  }
295
- update(update) {
557
+ update(_update) {
296
558
  if (!this._initialized) {
297
559
  this._initialized = true;
298
560
  setTimeout(() => {
@@ -306,27 +568,12 @@ var transcript = ({ model, started, renderButton }) => {
306
568
  }
307
569
  }),
308
570
  EditorView.theme({
309
- ".cm-scroller": {
310
- overflowY: "scroll"
311
- },
312
- ".cm-hide-scrollbar": {
313
- scrollbarWidth: "none",
314
- "-ms-overflow-style": "none"
315
- },
316
- ".cm-hide-scrollbar::-webkit-scrollbar": {
317
- display: "none"
318
- },
319
- ".cm-controls": {
320
- position: "absolute",
321
- bottom: "0.5rem",
322
- right: "0.5rem",
323
- zIndex: 1e3
324
- },
325
- ".cm-line": {
326
- paddingRight: "1rem"
571
+ ".cm-gutters": {
572
+ backgroundColor: "var(--dx-baseSurface)"
327
573
  },
328
574
  ".cm-timestamp-gutter": {
329
575
  width: "6rem",
576
+ paddingLeft: "0.5rem",
330
577
  paddingRight: "1rem"
331
578
  },
332
579
  ".cm-timestamp-gutter > .cm-gutterElement > div": {
@@ -338,11 +585,14 @@ var transcript = ({ model, started, renderButton }) => {
338
585
  ];
339
586
  };
340
587
  var TimestampMarker = class extends GutterMarker {
588
+ _line;
589
+ _timestamp;
590
+ _started;
341
591
  constructor(_line, _timestamp, _started) {
342
592
  super(), this._line = _line, this._timestamp = _timestamp, this._started = _started;
343
593
  }
344
594
  eq(other) {
345
- return other._timestamp === this._timestamp;
595
+ return this._timestamp === other._timestamp;
346
596
  }
347
597
  toDOM(view) {
348
598
  const el = document.createElement("div");
@@ -363,7 +613,7 @@ var getStartTime = (started, message) => {
363
613
  if (started) {
364
614
  return started;
365
615
  }
366
- if (message?.blocks[0]?.type === "transcription" && message.blocks[0].started) {
616
+ if (message?.blocks[0]?._tag === "transcript" && message.blocks[0].started) {
367
617
  return new Date(message.blocks[0].started);
368
618
  }
369
619
  return void 0;
@@ -381,384 +631,68 @@ var formatTimestamp = (timestamp, relative) => {
381
631
  }
382
632
  };
383
633
 
384
- // packages/plugins/plugin-transcription/src/components/Transcript/Transcript.tsx
385
- var renderMarkdown = (identities) => (message, index, debug = false) => {
386
- if (message.sender.role === "assistant") {
387
- return [
388
- message.blocks.find((block) => block.type === "transcription")?.text ?? "",
389
- ""
390
- ];
391
- }
392
- const identity = identities.find((identity2) => identity2.did === message.sender.identityDid);
393
- const name = identity?.profile?.displayName ?? message.sender.contact?.target?.fullName ?? message.sender.name ?? message.sender.email ?? message.sender.identityDid;
394
- const blocks = message.blocks.filter((block) => block.type === "transcription");
395
- return [
396
- `###### ${name}` + (debug ? ` [${index}]:${message.id}` : ""),
397
- blocks.map((block) => block.text.trim()).join(" "),
398
- ""
399
- ];
400
- };
401
- var Transcript = ({ classNames, transcript: object, space, model, attendableId, ignoreAttention }) => {
402
- var _effect = _useSignals();
403
- try {
404
- const { themeMode } = useThemeContext();
405
- const { parentRef } = useTextEditor(() => {
406
- return {
407
- extensions: [
408
- createBasicExtensions({
409
- readOnly: true,
410
- lineWrapping: true
411
- }),
412
- createMarkdownExtensions({
413
- themeMode
414
- }),
415
- createThemeExtensions({
416
- themeMode
417
- }),
418
- decorateMarkdown(),
419
- space && preview(),
420
- transcript({
421
- model,
422
- started: object?.started ? new Date(object.started) : void 0,
423
- renderButton: createRenderer(({ onClick }) => /* @__PURE__ */ React.createElement(IconButton, {
424
- icon: "ph--arrow-line-down--regular",
425
- iconOnly: true,
426
- label: "Scroll to bottom",
427
- onClick
428
- }))
429
- })
430
- ].filter(isNotFalsy)
431
- };
432
- }, [
433
- space,
434
- model
435
- ]);
436
- return /* @__PURE__ */ React.createElement("div", {
437
- ref: parentRef,
438
- className: mx("flex grow overflow-hidden", editorWidth, classNames),
439
- "data-popover-collision-boundary": true
440
- });
441
- } finally {
442
- _effect.f();
443
- }
444
- };
445
-
446
- // packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts
447
- import { useEffect, useState } from "react";
448
- import { scheduleTask } from "@dxos/async";
449
- import { Context } from "@dxos/context";
450
- import { log as log2 } from "@dxos/log";
451
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useAudioFile.ts";
452
- var useAudioFile = (audioUrl, constraints) => {
453
- const [{ audio, stream, track }, setStream] = useState({});
454
- useEffect(() => {
455
- const ctx = new Context(void 0, {
456
- F: __dxlog_file2,
457
- L: 20
458
- });
459
- scheduleTask(ctx, async () => {
460
- const response = await fetch(audioUrl);
461
- const blob = await response.blob();
462
- const objectUrl = URL.createObjectURL(blob);
463
- ctx.onDispose(() => {
464
- URL.revokeObjectURL(objectUrl);
465
- });
466
- const audio2 = new Audio();
467
- audio2.src = objectUrl;
468
- await new Promise((resolve, reject) => {
469
- audio2.addEventListener("error", (err) => {
470
- log2.error("error", {
471
- err
472
- }, {
473
- F: __dxlog_file2,
474
- L: 37,
475
- S: void 0,
476
- C: (f, a) => f(...a)
477
- });
478
- reject(err);
479
- }, {
480
- once: true
481
- });
482
- audio2.addEventListener("canplay", async () => {
483
- log2.info("starting...", void 0, {
484
- F: __dxlog_file2,
485
- L: 45,
486
- S: void 0,
487
- C: (f, a) => f(...a)
488
- });
489
- try {
490
- await audio2.play();
491
- resolve();
492
- } catch (playError) {
493
- log2.error("Play failed", {
494
- playError
495
- }, {
496
- F: __dxlog_file2,
497
- L: 51,
498
- S: void 0,
499
- C: (f, a) => f(...a)
500
- });
501
- resolve();
502
- }
503
- }, {
504
- once: true
505
- });
506
- audio2.load();
507
- });
508
- const audioCtx = new AudioContext();
509
- if (audioCtx.state === "suspended") {
510
- await audioCtx.resume();
511
- }
512
- const destination = audioCtx.createMediaStreamDestination();
513
- destination.channelCount = 1;
514
- const source = audioCtx.createMediaElementSource(audio2);
515
- source.connect(destination);
516
- const track2 = destination.stream.getAudioTracks()[0];
517
- if (constraints) {
518
- await track2.applyConstraints(constraints).catch((err) => log2.catch(err, void 0, {
519
- F: __dxlog_file2,
520
- L: 75,
521
- S: void 0,
522
- C: (f, a) => f(...a)
523
- }));
524
- }
525
- setStream({
526
- audio: audio2,
527
- stream: destination.stream,
528
- track: destination.stream.getAudioTracks()[0]
529
- });
530
- });
531
- return () => {
532
- void ctx.dispose();
533
- };
534
- }, [
535
- audioUrl
536
- ]);
537
- return {
538
- audio,
539
- stream,
540
- track
541
- };
542
- };
543
-
544
- // packages/plugins/plugin-transcription/src/hooks/useAudioTrack.ts
545
- import { useEffect as useEffect2, useState as useState2 } from "react";
546
- var useAudioTrack = (active, constraints) => {
547
- const [track, setTrack] = useState2();
548
- useEffect2(() => {
549
- if (!active) {
550
- track?.stop();
551
- setTrack(void 0);
552
- return;
553
- }
554
- const initAudio = async () => {
555
- const audio = new Audio();
556
- audio.srcObject = await navigator.mediaDevices.getUserMedia({
557
- audio: constraints ?? true
558
- });
559
- const [track2] = audio.srcObject.getAudioTracks();
560
- if (track2) {
561
- setTrack(track2);
562
- }
563
- };
564
- if (active) {
565
- void initAudio();
566
- }
567
- }, [
568
- active
569
- ]);
570
- return track;
571
- };
572
-
573
- // packages/plugins/plugin-transcription/src/hooks/useQueueModelAdapter.ts
574
- import { useEffect as useEffect3, useMemo, useState as useState3 } from "react";
575
- var useQueueModelAdapter = (renderer, queue, initialChunks = []) => {
576
- const model = useMemo(() => new SerializationModel(renderer, initialChunks), [
577
- queue
578
- ]);
579
- const [loaded, setLoaded] = useState3(false);
580
- useEffect3(() => {
581
- if (!queue) {
582
- return;
583
- }
584
- const update = () => {
585
- for (const block of queue?.objects ?? []) {
586
- model.appendChunk(block);
587
- }
588
- setLoaded(true);
589
- };
590
- let i;
591
- if (queue.isLoading) {
592
- i = setInterval(() => {
593
- if (!queue?.isLoading) {
594
- clearInterval(i);
595
- update();
596
- }
597
- }, 1e3);
598
- } else {
599
- update();
600
- }
601
- return () => clearTimeout(i);
602
- }, [
603
- model,
604
- queue
605
- ]);
606
- useEffect3(() => {
607
- if (!loaded || !queue || model.chunks.length === queue.objects.length) {
608
- return;
609
- }
610
- const chunk = queue.objects.at(-1);
611
- if (chunk) {
612
- model.appendChunk(chunk);
613
- }
614
- }, [
615
- model,
616
- loaded,
617
- queue?.objects.length
618
- ]);
619
- return model;
620
- };
621
-
622
- // packages/plugins/plugin-transcription/src/hooks/useTranscriber.ts
623
- import { useEffect as useEffect4, useMemo as useMemo2 } from "react";
624
- import { useCapabilities } from "@dxos/app-framework";
625
-
626
- // packages/plugins/plugin-transcription/src/capabilities/index.ts
627
- import { lazy } from "@dxos/app-framework";
628
- var IntentResolver = lazy(() => import("./intent-resolver-BGADCHVM.mjs"));
629
- var ReactSurface = lazy(() => import("./react-surface-HMJS5FSS.mjs"));
630
- var Transcriber = lazy(() => import("./transcriber-OYPLZFG5.mjs"));
631
-
632
- // packages/plugins/plugin-transcription/src/hooks/useTranscriber.ts
633
- var useTranscriber = ({ audioStreamTrack, onSegments, transcriberConfig, recorderConfig }) => {
634
- const [getTranscriber] = useCapabilities(TranscriptionCapabilities.Transcriber);
635
- const transcriber = useMemo2(() => {
636
- if (!onSegments || !audioStreamTrack || !getTranscriber) {
637
- return void 0;
638
- }
639
- return getTranscriber({
640
- audioStreamTrack,
641
- onSegments,
642
- transcriberConfig,
643
- recorderConfig
644
- });
645
- }, [
646
- audioStreamTrack,
647
- onSegments,
648
- getTranscriber,
649
- transcriberConfig,
650
- recorderConfig
651
- ]);
652
- useEffect4(() => {
653
- return () => {
654
- void transcriber?.close();
634
+ // src/components/Transcript/Transcript.tsx
635
+ var TranscriptView = ({ classNames, transcript: object, model }) => {
636
+ const { themeMode } = useThemeContext();
637
+ const { parentRef } = useTextEditor(() => {
638
+ return {
639
+ extensions: [
640
+ createBasicExtensions({
641
+ readOnly: true,
642
+ lineWrapping: true,
643
+ search: true
644
+ }),
645
+ createMarkdownExtensions(),
646
+ createThemeExtensions({
647
+ themeMode,
648
+ slots: editorSlots
649
+ }),
650
+ decorateMarkdown(),
651
+ preview(),
652
+ transcript({
653
+ model,
654
+ started: object?.started ? new Date(object.started) : void 0
655
+ }),
656
+ autoScroll()
657
+ ].filter(isTruthy)
655
658
  };
656
659
  }, [
657
- transcriber
660
+ model
658
661
  ]);
659
- return transcriber;
660
- };
661
-
662
- // packages/plugins/plugin-transcription/src/hooks/useVoiceInput.ts
663
- import { useState as useState4, useEffect as useEffect5, useCallback } from "react";
664
- import { scheduleMicroTask } from "@dxos/async";
665
- import { Context as Context2 } from "@dxos/context";
666
- import { log as log3 } from "@dxos/log";
667
- import { useSoundEffect } from "@dxos/react-ui-sfx";
668
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/plugin-transcription/src/hooks/useVoiceInput.ts";
669
- var useVoiceInput = ({ active, onUpdate }) => {
670
- const soundStart = useSoundEffect("StartRecording");
671
- const soundStop = useSoundEffect("StopRecording");
672
- const handleSegments = useCallback(async (segments) => {
673
- const text = segments.map((str) => str.text.trim().replace(/[^\w\s]/g, "")).join(" ");
674
- onUpdate(text);
675
- }, []);
676
- const [recording, setRecording] = useState4(false);
677
- const track = useAudioTrack(active);
678
- const transcriber = useTranscriber({
679
- audioStreamTrack: track,
680
- onSegments: handleSegments
662
+ return /* @__PURE__ */ React.createElement("div", {
663
+ ref: parentRef,
664
+ className: mx("flex grow overflow-hidden container-max-width", classNames),
665
+ "data-popover-collision-boundary": true
681
666
  });
682
- useEffect5(() => {
683
- const ctx = new Context2(void 0, {
684
- F: __dxlog_file3,
685
- L: 43
686
- });
687
- scheduleMicroTask(ctx, async () => {
688
- if (active && transcriber) {
689
- await transcriber.open();
690
- log3.info("starting...", void 0, {
691
- F: __dxlog_file3,
692
- L: 47,
693
- S: void 0,
694
- C: (f, a) => f(...a)
695
- });
696
- setRecording(true);
697
- void soundStart.play();
698
- transcriber.startChunksRecording();
699
- } else if (!active && transcriber?.isOpen) {
700
- transcriber?.stopChunksRecording();
701
- await transcriber?.close();
702
- log3.info("stopped", void 0, {
703
- F: __dxlog_file3,
704
- L: 54,
705
- S: void 0,
706
- C: (f, a) => f(...a)
707
- });
708
- setRecording(false);
709
- void soundStop.play();
710
- }
711
- });
712
- return () => {
713
- void ctx.dispose();
714
- };
715
- }, [
716
- active,
717
- transcriber
718
- ]);
719
- return {
720
- recording
721
- };
722
667
  };
723
668
 
724
- // packages/plugins/plugin-transcription/src/components/TranscriptContainer.tsx
725
- var TranscriptionContainer = ({ role, transcript: transcript2 }) => {
726
- var _effect = _useSignals2();
727
- try {
728
- const attendableId = fullyQualifiedId(transcript2);
729
- const space = getSpace(transcript2);
730
- const members = useMembers(space?.key).map((member) => member.identity);
731
- const queue = useQueue(transcript2.queue.dxn, {
732
- pollInterval: 1e3
733
- });
734
- const model = useQueueModelAdapter(renderMarkdown(members), queue);
735
- return /* @__PURE__ */ React2.createElement(StackItem.Content, {
736
- role,
737
- classNames: "container-max-width pli-2"
738
- }, /* @__PURE__ */ React2.createElement(Transcript, {
739
- attendableId,
740
- space,
741
- model,
742
- transcript: transcript2
743
- }));
744
- } finally {
745
- _effect.f();
746
- }
669
+ // src/components/TranscriptContainer.tsx
670
+ var TranscriptionContainer = ({ role, subject: transcript2 }) => {
671
+ const attendableId = Obj.getDXN(transcript2).toString();
672
+ const db = Obj.getDatabase(transcript2);
673
+ const members = useMembers(db?.spaceId).map((member) => member.identity);
674
+ const queue = useQueue(transcript2.queue.dxn, {
675
+ pollInterval: 1e3
676
+ });
677
+ const model = useQueueModelAdapter(renderByline(members), queue);
678
+ return /* @__PURE__ */ React2.createElement(Layout.Main, {
679
+ role
680
+ }, /* @__PURE__ */ React2.createElement(TranscriptView, {
681
+ attendableId,
682
+ model,
683
+ transcript: transcript2
684
+ }));
747
685
  };
748
686
  var TranscriptContainer_default = TranscriptionContainer;
749
687
 
750
688
  export {
751
- renderMarkdown,
752
- Transcript,
689
+ TranscriptView,
753
690
  useAudioFile,
754
691
  useAudioTrack,
755
692
  useQueueModelAdapter,
756
693
  useTranscriber,
757
694
  useVoiceInput,
758
695
  TranscriptionContainer,
759
- TranscriptContainer_default,
760
- IntentResolver,
761
- ReactSurface,
762
- Transcriber
696
+ TranscriptContainer_default
763
697
  };
764
- //# sourceMappingURL=chunk-53AXUEIQ.mjs.map
698
+ //# sourceMappingURL=chunk-K3JJ46VV.mjs.map