@dxos/plugin-transcription 0.8.3 → 0.8.4-main.03d5cd7b56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/dist/lib/neutral/TranscriptionContainer-XNGXNGPX.mjs +35 -0
  2. package/dist/lib/neutral/TranscriptionContainer-XNGXNGPX.mjs.map +7 -0
  3. package/dist/lib/neutral/TranscriptionPlugin.mjs +34 -0
  4. package/dist/lib/neutral/TranscriptionPlugin.mjs.map +7 -0
  5. package/dist/lib/neutral/TranscriptionPlugin.node.mjs +25 -0
  6. package/dist/lib/neutral/TranscriptionPlugin.node.mjs.map +7 -0
  7. package/dist/lib/neutral/blueprint-definition-HOXDG5QP.mjs +15 -0
  8. package/dist/lib/neutral/blueprint-definition-HOXDG5QP.mjs.map +7 -0
  9. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  10. package/dist/lib/neutral/capabilities/index.mjs +17 -0
  11. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  12. package/dist/lib/neutral/chunk-GL4RS533.mjs +22 -0
  13. package/dist/lib/neutral/chunk-GL4RS533.mjs.map +7 -0
  14. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  15. package/dist/lib/neutral/chunk-KAEXRX3Y.mjs +35 -0
  16. package/dist/lib/neutral/chunk-KAEXRX3Y.mjs.map +7 -0
  17. package/dist/lib/{browser/chunk-IQ5ZRMHZ.mjs → neutral/chunk-LS3R7EQI.mjs} +130 -195
  18. package/dist/lib/neutral/chunk-LS3R7EQI.mjs.map +7 -0
  19. package/dist/lib/neutral/chunk-MLRJWAQH.mjs +179 -0
  20. package/dist/lib/neutral/chunk-MLRJWAQH.mjs.map +7 -0
  21. package/dist/lib/neutral/chunk-NNR3EYR2.mjs +124 -0
  22. package/dist/lib/neutral/chunk-NNR3EYR2.mjs.map +7 -0
  23. package/dist/lib/neutral/chunk-NQQK7UZQ.mjs +244 -0
  24. package/dist/lib/neutral/chunk-NQQK7UZQ.mjs.map +7 -0
  25. package/dist/lib/neutral/chunk-WVEZMGBT.mjs +8 -0
  26. package/dist/lib/neutral/chunk-WVEZMGBT.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-ZR4BH4QQ.mjs +30 -0
  28. package/dist/lib/neutral/chunk-ZR4BH4QQ.mjs.map +7 -0
  29. package/dist/lib/neutral/components/index.mjs +207 -0
  30. package/dist/lib/neutral/components/index.mjs.map +7 -0
  31. package/dist/lib/neutral/containers/index.mjs +9 -0
  32. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  33. package/dist/lib/neutral/create-2D6S4IMQ.mjs +21 -0
  34. package/dist/lib/neutral/create-2D6S4IMQ.mjs.map +7 -0
  35. package/dist/lib/neutral/hooks/index.mjs +17 -0
  36. package/dist/lib/neutral/index.mjs +44 -0
  37. package/dist/lib/neutral/meta.json +1 -0
  38. package/dist/lib/neutral/meta.mjs +8 -0
  39. package/dist/lib/neutral/meta.mjs.map +7 -0
  40. package/dist/lib/neutral/open-2QB6IIET.mjs +27 -0
  41. package/dist/lib/neutral/open-2QB6IIET.mjs.map +7 -0
  42. package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs +13 -0
  43. package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs.map +7 -0
  44. package/dist/lib/neutral/operations/index.mjs +8 -0
  45. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  46. package/dist/lib/neutral/plugin.mjs +16 -0
  47. package/dist/lib/neutral/plugin.mjs.map +7 -0
  48. package/dist/lib/neutral/react-surface-QF4MUMWG.mjs +26 -0
  49. package/dist/lib/neutral/react-surface-QF4MUMWG.mjs.map +7 -0
  50. package/dist/lib/neutral/summarize-CJPVKWYZ.mjs +78 -0
  51. package/dist/lib/neutral/summarize-CJPVKWYZ.mjs.map +7 -0
  52. package/dist/lib/neutral/text-content-LHSUG2D2.mjs +30 -0
  53. package/dist/lib/neutral/text-content-LHSUG2D2.mjs.map +7 -0
  54. package/dist/lib/{browser/transcriber-OYPLZFG5.mjs → neutral/transcriber-M3R6HPTZ.mjs} +21 -18
  55. package/dist/lib/neutral/transcriber-M3R6HPTZ.mjs.map +7 -0
  56. package/dist/lib/neutral/translations.mjs +22 -0
  57. package/dist/lib/neutral/translations.mjs.map +7 -0
  58. package/dist/lib/neutral/types/index.mjs +12 -0
  59. package/dist/lib/neutral/types/index.mjs.map +7 -0
  60. package/dist/types/src/TranscriptionPlugin.d.ts +3 -1
  61. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  62. package/dist/types/src/TranscriptionPlugin.node.d.ts +4 -0
  63. package/dist/types/src/TranscriptionPlugin.node.d.ts.map +1 -0
  64. package/dist/types/src/TranscriptionPlugin.test.d.ts +2 -0
  65. package/dist/types/src/TranscriptionPlugin.test.d.ts.map +1 -0
  66. package/dist/types/src/blueprints/index.d.ts +2 -0
  67. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  68. package/dist/types/src/blueprints/transcription-blueprint.d.ts +4 -0
  69. package/dist/types/src/blueprints/transcription-blueprint.d.ts.map +1 -0
  70. package/dist/types/src/capabilities/blueprint-definition.d.ts +6 -0
  71. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -0
  72. package/dist/types/src/capabilities/index.d.ts +10 -4
  73. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  74. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  75. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  76. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  77. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/text-content.d.ts +8 -0
  79. package/dist/types/src/capabilities/text-content.d.ts.map +1 -0
  80. package/dist/types/src/capabilities/transcriber.d.ts +4 -3
  81. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  82. package/dist/types/src/components/Transcription/Transcription.d.ts +18 -0
  83. package/dist/types/src/components/Transcription/Transcription.d.ts.map +1 -0
  84. package/dist/types/src/components/Transcription/Transcription.stories.d.ts +40 -0
  85. package/dist/types/src/components/Transcription/Transcription.stories.d.ts.map +1 -0
  86. package/dist/types/src/components/Transcription/index.d.ts +2 -0
  87. package/dist/types/src/components/Transcription/index.d.ts.map +1 -0
  88. package/dist/types/src/components/Transcription/transcription-extension.d.ts +15 -0
  89. package/dist/types/src/components/Transcription/transcription-extension.d.ts.map +1 -0
  90. package/dist/types/src/components/index.d.ts +1 -6
  91. package/dist/types/src/components/index.d.ts.map +1 -1
  92. package/dist/types/src/containers/TranscriptionContainer/TranscriptionContainer.d.ts +6 -0
  93. package/dist/types/src/containers/TranscriptionContainer/TranscriptionContainer.d.ts.map +1 -0
  94. package/dist/types/src/containers/TranscriptionContainer/index.d.ts +2 -0
  95. package/dist/types/src/containers/TranscriptionContainer/index.d.ts.map +1 -0
  96. package/dist/types/src/containers/index.d.ts +3 -0
  97. package/dist/types/src/containers/index.d.ts.map +1 -0
  98. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
  99. package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
  100. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +1 -1
  101. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +1 -1
  102. package/dist/types/src/hooks/useTranscriber.d.ts +2 -2
  103. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  104. package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
  105. package/dist/types/src/index.d.ts +2 -3
  106. package/dist/types/src/index.d.ts.map +1 -1
  107. package/dist/types/src/meta.d.ts +2 -3
  108. package/dist/types/src/meta.d.ts.map +1 -1
  109. package/dist/types/src/model/model.d.ts +2 -2
  110. package/dist/types/src/model/model.d.ts.map +1 -1
  111. package/dist/types/src/{segments-normalization → normalization}/index.d.ts +1 -1
  112. package/dist/types/src/normalization/index.d.ts.map +1 -0
  113. package/dist/types/src/{segments-normalization → normalization}/message-normalizer.d.ts +5 -5
  114. package/dist/types/src/normalization/message-normalizer.d.ts.map +1 -0
  115. package/dist/types/src/normalization/normalization.d.ts +543 -0
  116. package/dist/types/src/normalization/normalization.d.ts.map +1 -0
  117. package/dist/types/src/normalization/normalization.test.d.ts.map +1 -0
  118. package/dist/types/src/normalization/utils.d.ts +3 -0
  119. package/dist/types/src/normalization/utils.d.ts.map +1 -0
  120. package/dist/types/src/operations/create.d.ts +5 -0
  121. package/dist/types/src/operations/create.d.ts.map +1 -0
  122. package/dist/types/src/operations/index.d.ts +3 -0
  123. package/dist/types/src/operations/index.d.ts.map +1 -0
  124. package/dist/types/src/operations/open.d.ts +5 -0
  125. package/dist/types/src/operations/open.d.ts.map +1 -0
  126. package/dist/types/src/operations/summarize.d.ts +8 -0
  127. package/dist/types/src/operations/summarize.d.ts.map +1 -0
  128. package/dist/types/src/plugin.d.ts +4 -0
  129. package/dist/types/src/plugin.d.ts.map +1 -0
  130. package/dist/types/src/stories/FileTranscription.stories.d.ts +18 -0
  131. package/dist/types/src/stories/FileTranscription.stories.d.ts.map +1 -0
  132. package/dist/types/src/stories/KeyWordRecognition.stories.d.ts +14 -0
  133. package/dist/types/src/stories/KeyWordRecognition.stories.d.ts.map +1 -0
  134. package/dist/types/src/stories/MicrophoneTranscription.stories.d.ts +20 -0
  135. package/dist/types/src/stories/MicrophoneTranscription.stories.d.ts.map +1 -0
  136. package/dist/types/src/stories/TranscriptionStory.d.ts +23 -0
  137. package/dist/types/src/stories/TranscriptionStory.d.ts.map +1 -0
  138. package/dist/types/src/stories/useIsSpeaking.d.ts.map +1 -0
  139. package/dist/types/src/testing/testing.d.ts +10 -10
  140. package/dist/types/src/testing/testing.d.ts.map +1 -1
  141. package/dist/types/src/transcriber/media-stream-recorder.d.ts +3 -3
  142. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  143. package/dist/types/src/transcriber/transcriber.d.ts +60 -5
  144. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  145. package/dist/types/src/transcriber/transcriber.test.d.ts +2 -0
  146. package/dist/types/src/transcriber/transcriber.test.d.ts.map +1 -0
  147. package/dist/types/src/transcriber/transcription-manager.d.ts +12 -13
  148. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  149. package/dist/types/src/translations.d.ts +10 -11
  150. package/dist/types/src/translations.d.ts.map +1 -1
  151. package/dist/types/src/types/TranscriptOperation.d.ts +917 -0
  152. package/dist/types/src/types/TranscriptOperation.d.ts.map +1 -0
  153. package/dist/types/src/types/TranscriptionCapabilities.d.ts +17 -0
  154. package/dist/types/src/types/TranscriptionCapabilities.d.ts.map +1 -0
  155. package/dist/types/src/types/defs.d.ts +5 -0
  156. package/dist/types/src/types/defs.d.ts.map +1 -0
  157. package/dist/types/src/types/index.d.ts +3 -2
  158. package/dist/types/src/types/index.d.ts.map +1 -1
  159. package/dist/types/src/util/array.d.ts.map +1 -1
  160. package/dist/types/src/util/get-time-str.d.ts.map +1 -1
  161. package/dist/types/src/util/index.d.ts +1 -0
  162. package/dist/types/src/util/index.d.ts.map +1 -1
  163. package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -1
  164. package/dist/types/src/util/render-byline.d.ts +4 -0
  165. package/dist/types/src/util/render-byline.d.ts.map +1 -0
  166. package/dist/types/tsconfig.tsbuildinfo +1 -1
  167. package/package.json +152 -84
  168. package/src/TranscriptionPlugin.node.ts +20 -0
  169. package/src/TranscriptionPlugin.test.ts +31 -0
  170. package/src/TranscriptionPlugin.tsx +22 -61
  171. package/src/blueprints/index.ts +5 -0
  172. package/src/blueprints/transcription-blueprint.ts +29 -0
  173. package/src/capabilities/blueprint-definition.ts +19 -0
  174. package/src/capabilities/index.ts +11 -6
  175. package/src/capabilities/operation-handler.ts +16 -0
  176. package/src/capabilities/react-surface.tsx +23 -14
  177. package/src/capabilities/text-content.ts +33 -0
  178. package/src/capabilities/transcriber.ts +53 -41
  179. package/src/components/{Transcript/Transcript.stories.tsx → Transcription/Transcription.stories.tsx} +80 -75
  180. package/src/components/Transcription/Transcription.tsx +64 -0
  181. package/src/components/{Transcript → Transcription}/index.ts +1 -1
  182. package/src/components/{Transcript/transcript-extension.ts → Transcription/transcription-extension.ts} +15 -48
  183. package/src/components/index.ts +1 -6
  184. package/src/containers/TranscriptionContainer/TranscriptionContainer.tsx +35 -0
  185. package/src/containers/TranscriptionContainer/index.ts +5 -0
  186. package/src/containers/index.ts +7 -0
  187. package/src/hooks/useAudioFile.ts +49 -53
  188. package/src/hooks/useQueueModelAdapter.ts +1 -1
  189. package/src/hooks/useTranscriber.ts +15 -7
  190. package/src/hooks/useVoiceInput.ts +3 -3
  191. package/src/index.ts +4 -5
  192. package/src/meta.ts +9 -6
  193. package/src/model/model.test.ts +27 -21
  194. package/src/model/model.ts +3 -3
  195. package/src/{segments-normalization → normalization}/message-normalizer.ts +20 -19
  196. package/src/{segments-normalization → normalization}/normalization.test.ts +26 -33
  197. package/src/normalization/normalization.ts +76 -0
  198. package/src/{segments-normalization → normalization}/utils.ts +2 -2
  199. package/src/operations/create.ts +24 -0
  200. package/src/operations/index.ts +11 -0
  201. package/src/operations/open.ts +28 -0
  202. package/src/operations/summarize.ts +101 -0
  203. package/src/plugin.ts +11 -0
  204. package/src/stories/FileTranscription.stories.tsx +269 -0
  205. package/src/{components/stories → stories}/KeyWordRecognition.stories.tsx +46 -40
  206. package/src/stories/MicrophoneTranscription.stories.tsx +264 -0
  207. package/src/stories/TranscriptionStory.tsx +93 -0
  208. package/src/testing/testing.ts +41 -41
  209. package/src/transcriber/media-stream-recorder.ts +4 -4
  210. package/src/transcriber/transcriber.browser.test.ts +5 -5
  211. package/src/transcriber/transcriber.test.ts +104 -0
  212. package/src/transcriber/transcriber.ts +101 -62
  213. package/src/transcriber/transcription-manager.ts +37 -52
  214. package/src/translations.ts +12 -10
  215. package/src/types/TranscriptOperation.ts +103 -0
  216. package/src/types/TranscriptionCapabilities.ts +39 -0
  217. package/src/types/defs.ts +9 -0
  218. package/src/types/index.ts +4 -2
  219. package/src/util/index.ts +1 -0
  220. package/src/util/render-byline.ts +33 -0
  221. package/dist/lib/browser/TranscriptContainer-H3AZQ4CQ.mjs +0 -11
  222. package/dist/lib/browser/chunk-53AXUEIQ.mjs +0 -764
  223. package/dist/lib/browser/chunk-53AXUEIQ.mjs.map +0 -7
  224. package/dist/lib/browser/chunk-GOF7MJNV.mjs +0 -19
  225. package/dist/lib/browser/chunk-GOF7MJNV.mjs.map +0 -7
  226. package/dist/lib/browser/chunk-IQ5ZRMHZ.mjs.map +0 -7
  227. package/dist/lib/browser/chunk-OSISJM2F.mjs +0 -55
  228. package/dist/lib/browser/chunk-OSISJM2F.mjs.map +0 -7
  229. package/dist/lib/browser/chunk-UDCCT32F.mjs +0 -8
  230. package/dist/lib/browser/chunk-UDCCT32F.mjs.map +0 -7
  231. package/dist/lib/browser/chunk-W2KNYJD6.mjs +0 -16
  232. package/dist/lib/browser/chunk-W2KNYJD6.mjs.map +0 -7
  233. package/dist/lib/browser/index.mjs +0 -125
  234. package/dist/lib/browser/index.mjs.map +0 -7
  235. package/dist/lib/browser/intent-resolver-BGADCHVM.mjs +0 -30
  236. package/dist/lib/browser/intent-resolver-BGADCHVM.mjs.map +0 -7
  237. package/dist/lib/browser/meta.json +0 -1
  238. package/dist/lib/browser/react-surface-HMJS5FSS.mjs +0 -34
  239. package/dist/lib/browser/react-surface-HMJS5FSS.mjs.map +0 -7
  240. package/dist/lib/browser/transcriber-OYPLZFG5.mjs.map +0 -7
  241. package/dist/lib/browser/types/index.mjs +0 -14
  242. package/dist/lib/node/TranscriptContainer-KIG3GMAB.cjs +0 -32
  243. package/dist/lib/node/TranscriptContainer-KIG3GMAB.cjs.map +0 -7
  244. package/dist/lib/node/chunk-3PYT3BDM.cjs +0 -40
  245. package/dist/lib/node/chunk-3PYT3BDM.cjs.map +0 -7
  246. package/dist/lib/node/chunk-6LW5RA3K.cjs +0 -75
  247. package/dist/lib/node/chunk-6LW5RA3K.cjs.map +0 -7
  248. package/dist/lib/node/chunk-AFUZI63A.cjs +0 -42
  249. package/dist/lib/node/chunk-AFUZI63A.cjs.map +0 -7
  250. package/dist/lib/node/chunk-CVUN3UO7.cjs +0 -778
  251. package/dist/lib/node/chunk-CVUN3UO7.cjs.map +0 -7
  252. package/dist/lib/node/chunk-FKDJNJ57.cjs +0 -35
  253. package/dist/lib/node/chunk-FKDJNJ57.cjs.map +0 -7
  254. package/dist/lib/node/chunk-ZFAUMZXE.cjs +0 -518
  255. package/dist/lib/node/chunk-ZFAUMZXE.cjs.map +0 -7
  256. package/dist/lib/node/index.cjs +0 -133
  257. package/dist/lib/node/index.cjs.map +0 -7
  258. package/dist/lib/node/intent-resolver-LL3TTI4H.cjs +0 -45
  259. package/dist/lib/node/intent-resolver-LL3TTI4H.cjs.map +0 -7
  260. package/dist/lib/node/meta.json +0 -1
  261. package/dist/lib/node/react-surface-N25TBBG4.cjs +0 -56
  262. package/dist/lib/node/react-surface-N25TBBG4.cjs.map +0 -7
  263. package/dist/lib/node/transcriber-6J4FVFSZ.cjs +0 -68
  264. package/dist/lib/node/transcriber-6J4FVFSZ.cjs.map +0 -7
  265. package/dist/lib/node/types/index.cjs +0 -36
  266. package/dist/lib/node/types/index.cjs.map +0 -7
  267. package/dist/lib/node-esm/TranscriptContainer-G75LDEO5.mjs +0 -12
  268. package/dist/lib/node-esm/chunk-56QHOX4A.mjs +0 -765
  269. package/dist/lib/node-esm/chunk-56QHOX4A.mjs.map +0 -7
  270. package/dist/lib/node-esm/chunk-FH75X4JC.mjs +0 -56
  271. package/dist/lib/node-esm/chunk-FH75X4JC.mjs.map +0 -7
  272. package/dist/lib/node-esm/chunk-MFJO7EKD.mjs +0 -10
  273. package/dist/lib/node-esm/chunk-MFJO7EKD.mjs.map +0 -7
  274. package/dist/lib/node-esm/chunk-MFJPEIVB.mjs +0 -17
  275. package/dist/lib/node-esm/chunk-MFJPEIVB.mjs.map +0 -7
  276. package/dist/lib/node-esm/chunk-PRL64SRU.mjs +0 -496
  277. package/dist/lib/node-esm/chunk-PRL64SRU.mjs.map +0 -7
  278. package/dist/lib/node-esm/chunk-TXMDLLBR.mjs +0 -21
  279. package/dist/lib/node-esm/chunk-TXMDLLBR.mjs.map +0 -7
  280. package/dist/lib/node-esm/index.mjs +0 -126
  281. package/dist/lib/node-esm/index.mjs.map +0 -7
  282. package/dist/lib/node-esm/intent-resolver-5LVCYSJS.mjs +0 -31
  283. package/dist/lib/node-esm/intent-resolver-5LVCYSJS.mjs.map +0 -7
  284. package/dist/lib/node-esm/meta.json +0 -1
  285. package/dist/lib/node-esm/react-surface-JGQSYGRR.mjs +0 -35
  286. package/dist/lib/node-esm/react-surface-JGQSYGRR.mjs.map +0 -7
  287. package/dist/lib/node-esm/transcriber-TVG2MBBN.mjs +0 -57
  288. package/dist/lib/node-esm/transcriber-TVG2MBBN.mjs.map +0 -7
  289. package/dist/lib/node-esm/types/index.mjs +0 -15
  290. package/dist/types/src/capabilities/capabilities.d.ts +0 -17
  291. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  292. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  293. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  294. package/dist/types/src/components/Transcript/Transcript.d.ts +0 -20
  295. package/dist/types/src/components/Transcript/Transcript.d.ts.map +0 -1
  296. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +0 -24
  297. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +0 -1
  298. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +0 -28
  299. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +0 -1
  300. package/dist/types/src/components/Transcript/index.d.ts +0 -2
  301. package/dist/types/src/components/Transcript/index.d.ts.map +0 -1
  302. package/dist/types/src/components/Transcript/transcript-extension.d.ts +0 -19
  303. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +0 -1
  304. package/dist/types/src/components/TranscriptContainer.d.ts +0 -8
  305. package/dist/types/src/components/TranscriptContainer.d.ts.map +0 -1
  306. package/dist/types/src/components/stories/FileTranscription.stories.d.ts +0 -17
  307. package/dist/types/src/components/stories/FileTranscription.stories.d.ts.map +0 -1
  308. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts +0 -10
  309. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts.map +0 -1
  310. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts +0 -19
  311. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts.map +0 -1
  312. package/dist/types/src/components/stories/TranscriptionStory.d.ts +0 -11
  313. package/dist/types/src/components/stories/TranscriptionStory.d.ts.map +0 -1
  314. package/dist/types/src/components/stories/useIsSpeaking.d.ts.map +0 -1
  315. package/dist/types/src/segments-normalization/index.d.ts.map +0 -1
  316. package/dist/types/src/segments-normalization/message-normalizer.d.ts.map +0 -1
  317. package/dist/types/src/segments-normalization/normalization.d.ts +0 -329
  318. package/dist/types/src/segments-normalization/normalization.d.ts.map +0 -1
  319. package/dist/types/src/segments-normalization/normalization.test.d.ts.map +0 -1
  320. package/dist/types/src/segments-normalization/utils.d.ts +0 -3
  321. package/dist/types/src/segments-normalization/utils.d.ts.map +0 -1
  322. package/dist/types/src/types/schema.d.ts +0 -41
  323. package/dist/types/src/types/schema.d.ts.map +0 -1
  324. package/dist/types/src/types/types.d.ts +0 -31
  325. package/dist/types/src/types/types.d.ts.map +0 -1
  326. package/src/capabilities/capabilities.ts +0 -33
  327. package/src/capabilities/intent-resolver.ts +0 -24
  328. package/src/components/Transcript/Transcript.tsx +0 -100
  329. package/src/components/Transcript/deprecated/OldTranscript.tsx +0 -260
  330. package/src/components/TranscriptContainer.tsx +0 -30
  331. package/src/components/stories/FileTranscription.stories.tsx +0 -242
  332. package/src/components/stories/MicrophoneTranscription.stories.tsx +0 -280
  333. package/src/components/stories/TranscriptionStory.tsx +0 -41
  334. package/src/segments-normalization/normalization.ts +0 -105
  335. package/src/types/schema.ts +0 -41
  336. package/src/types/types.ts +0 -32
  337. package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  338. package/dist/lib/{browser/TranscriptContainer-H3AZQ4CQ.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  339. package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
  340. package/dist/lib/{node-esm/TranscriptContainer-G75LDEO5.mjs.map → neutral/index.mjs.map} +0 -0
  341. package/dist/types/src/{segments-normalization → normalization}/normalization.test.d.ts +0 -0
  342. package/dist/types/src/{components/stories → stories}/useIsSpeaking.d.ts +0 -0
  343. package/src/{segments-normalization → normalization}/index.ts +1 -1
  344. /package/src/{components/stories → stories}/useIsSpeaking.tsx +0 -0
@@ -2,10 +2,13 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { contributes, type PluginContext } from '@dxos/app-framework';
5
+ import * as Effect from 'effect/Effect';
6
+
7
+ import { Capabilities, Capability } from '@dxos/app-framework';
6
8
  import { ClientCapabilities } from '@dxos/plugin-client';
7
9
 
8
- import { TranscriptionCapabilities } from './capabilities';
10
+ import { TranscriptionCapabilities } from '#types';
11
+
9
12
  import { MediaStreamRecorder, Transcriber, TranscriptionManager } from '../transcriber';
10
13
 
11
14
  // TODO(burdon): Move to config?
@@ -29,48 +32,57 @@ const TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;
29
32
  /**
30
33
  * Records audio while user is speaking and transcribes it after user is done speaking.
31
34
  */
32
- export default (context: PluginContext) => {
33
- const getTranscriber: TranscriptionCapabilities.GetTranscriber = ({
34
- audioStreamTrack,
35
- onSegments,
36
- transcriberConfig,
37
- recorderConfig,
38
- }) => {
39
- // Initialize audio transcription.
40
- return new Transcriber({
41
- config: {
42
- transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,
43
- prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,
44
- ...transcriberConfig,
45
- },
46
- recorder: new MediaStreamRecorder({
47
- mediaStreamTrack: audioStreamTrack,
35
+ export default Capability.makeModule(
36
+ Effect.fnUntraced(function* () {
37
+ // Get context for lazy capability access in callbacks.
38
+ const capabilities = yield* Capability.Service;
39
+ const registry = yield* Capability.get(Capabilities.AtomRegistry);
40
+
41
+ const getTranscriber: TranscriptionCapabilities.GetTranscriber = ({
42
+ audioStreamTrack,
43
+ onSegments,
44
+ transcriberConfig,
45
+ recorderConfig,
46
+ transcribe,
47
+ }) => {
48
+ // Initialize audio transcription.
49
+ return new Transcriber({
48
50
  config: {
49
- interval: RECORD_INTERVAL,
50
- ...recorderConfig,
51
+ transcribeAfterChunksAmount: TRANSCRIBE_AFTER_CHUNKS_AMOUNT,
52
+ prefixBufferChunksAmount: PREFIXED_CHUNKS_AMOUNT,
53
+ ...transcriberConfig,
51
54
  },
52
- }),
53
- onSegments,
54
- });
55
- };
55
+ recorder: new MediaStreamRecorder({
56
+ mediaStreamTrack: audioStreamTrack,
57
+ config: {
58
+ interval: RECORD_INTERVAL,
59
+ ...recorderConfig,
60
+ },
61
+ }),
62
+ onSegments,
63
+ transcribe,
64
+ });
65
+ };
56
66
 
57
- const getTranscriptionManager: TranscriptionCapabilities.GetTranscriptionManager = ({ messageEnricher }) => {
58
- const client = context.getCapability(ClientCapabilities.Client);
59
- const transcriptionManager = new TranscriptionManager({
60
- edgeClient: client.edge,
61
- messageEnricher,
62
- });
67
+ const getTranscriptionManager: TranscriptionCapabilities.GetTranscriptionManager = ({ messageEnricher }) => {
68
+ const client = capabilities.get(ClientCapabilities.Client);
69
+ const transcriptionManager = new TranscriptionManager({
70
+ edgeClient: client.edge.http,
71
+ messageEnricher,
72
+ registry,
73
+ });
63
74
 
64
- const identity = client.halo.identity.get();
65
- if (identity) {
66
- transcriptionManager.setIdentityDid(identity.did);
67
- }
75
+ const identity = client.halo.identity.get();
76
+ if (identity) {
77
+ transcriptionManager.setIdentityDid(identity.did);
78
+ }
68
79
 
69
- return transcriptionManager;
70
- };
80
+ return transcriptionManager;
81
+ };
71
82
 
72
- return [
73
- contributes(TranscriptionCapabilities.Transcriber, getTranscriber),
74
- contributes(TranscriptionCapabilities.TranscriptionManager, getTranscriptionManager),
75
- ];
76
- };
83
+ return [
84
+ Capability.contributes(TranscriptionCapabilities.Transcriber, getTranscriber),
85
+ Capability.contributes(TranscriptionCapabilities.TranscriptionManager, getTranscriptionManager),
86
+ ];
87
+ }),
88
+ );
@@ -2,59 +2,56 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type Meta, type StoryObj } from '@storybook/react';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import * as Effect from 'effect/Effect';
7
+ import type * as Types from 'effect/Types';
8
8
  import React, { type FC, useEffect, useMemo, useState } from 'react';
9
9
 
10
- import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
11
10
  import { withPluginManager } from '@dxos/app-framework/testing';
12
11
  import { Key } from '@dxos/echo';
13
- import { ClientPlugin } from '@dxos/plugin-client';
14
- import { PreviewPlugin } from '@dxos/plugin-preview';
15
- import { SpacePlugin } from '@dxos/plugin-space';
16
- import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
17
- import { ThemePlugin } from '@dxos/plugin-theme';
18
- import { faker } from '@dxos/random';
19
- import { useMembers, useSpace } from '@dxos/react-client/echo';
12
+ import { ClientPlugin } from '@dxos/plugin-client/plugin';
13
+ import { initializeIdentity } from '@dxos/plugin-client/testing';
14
+ import { PreviewPlugin } from '@dxos/plugin-preview/testing';
15
+ import { StorybookPlugin, corePlugins } from '@dxos/plugin-testing';
16
+ import { random } from '@dxos/random';
17
+ import { useMembers, useSpaces } from '@dxos/react-client/echo';
20
18
  import { IconButton, Toolbar } from '@dxos/react-ui';
21
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
22
- import { defaultTx } from '@dxos/react-ui-theme';
23
- import { DataType } from '@dxos/schema';
24
- import { Testing } from '@dxos/schema/testing';
25
- import { withLayout } from '@dxos/storybook-utils';
26
-
27
- import { renderMarkdown, Transcript, type TranscriptProps } from './Transcript';
28
- import { useQueueModelAdapter } from '../../hooks';
29
- import { SerializationModel } from '../../model';
19
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
20
+ import { withLayout } from '@dxos/react-ui/testing';
21
+ import { TestSchema } from '@dxos/schema/testing';
22
+ import { type ContentBlock, type Message, Organization, Person } from '@dxos/types';
23
+
24
+ import { useQueueModelAdapter } from '#hooks';
30
25
  import {
31
26
  MessageBuilder,
32
27
  TestItem,
33
28
  useTestTranscriptionQueue,
34
29
  useTestTranscriptionQueueWithEntityExtraction,
35
- } from '../../testing';
36
- import translations from '../../translations';
30
+ } from '#testing';
31
+ import { translations } from '#translations';
37
32
 
38
- faker.seed(1);
33
+ import { SerializationModel } from '../../model';
34
+ import { renderByline } from '../../util';
35
+ import { Transcription, type TranscriptionProps } from './Transcription';
36
+
37
+ random.seed(1);
39
38
 
40
39
  /**
41
40
  * Story wrapper with test controls.
42
41
  */
43
42
  const TranscriptContainer: FC<
44
- TranscriptProps & {
43
+ TranscriptionProps & {
45
44
  running: boolean;
46
45
  onRunningChange: (running: boolean) => void;
47
46
  onReset?: () => void;
48
47
  }
49
- > = ({ space, model, running, onRunningChange, onReset }) => {
48
+ > = ({ model, running, onRunningChange, onReset }) => {
50
49
  return (
51
50
  <div className='grid grid-rows-[1fr_40px] grow divide-y divide-separator'>
52
- <Transcript space={space} model={model} />
51
+ <Transcription model={model} />
53
52
  <div className='grid grid-cols-[1fr_16rem] overflow-hidden'>
54
53
  <div className='flex items-center'>
55
- <SyntaxHighlighter language='json' className='text-sm'>
56
- {JSON.stringify(model.toJSON())}
57
- </SyntaxHighlighter>
54
+ <JsonHighlighter data={model.toJSON()} indent={0} classNames='text-sm' />
58
55
  </div>
59
56
  <Toolbar.Root classNames='justify-end'>
60
57
  <IconButton
@@ -69,20 +66,24 @@ const TranscriptContainer: FC<
69
66
  );
70
67
  };
71
68
 
72
- type StoryProps = { messages?: DataType.Message[] } & Pick<TranscriptProps, 'ignoreAttention' | 'attendableId'>;
69
+ type DefaultStoryProps = { messages?: Message.Message[] } & Pick<
70
+ TranscriptionProps,
71
+ 'ignoreAttention' | 'attendableId'
72
+ >;
73
73
 
74
74
  /**
75
75
  * Basic story mutates array of messages.
76
76
  */
77
- const BasicStory = ({ messages: initialMessages = [], ...props }: StoryProps) => {
77
+ const BasicStory = ({ messages: initialMessages = [], ...props }: DefaultStoryProps) => {
78
78
  const [reset, setReset] = useState({});
79
79
  const builder = useMemo(() => new MessageBuilder(), []);
80
80
  const model = useMemo(
81
- () => new SerializationModel<DataType.Message>(renderMarkdown([]), initialMessages),
81
+ () => new SerializationModel<Message.Message>(renderByline([]), initialMessages),
82
82
  [initialMessages, reset],
83
83
  );
84
84
  const [running, setRunning] = useState(true);
85
- const [currentMessage, setCurrentMessage] = useState<DataType.Message | null>(null);
85
+ // Use mutable type for local message building (not ECHO-managed).
86
+ const [currentMessage, setCurrentMessage] = useState<Types.Mutable<Message.Message> | null>(null);
86
87
  useEffect(() => {
87
88
  if (!running) {
88
89
  return;
@@ -103,7 +104,7 @@ const BasicStory = ({ messages: initialMessages = [], ...props }: StoryProps) =>
103
104
  return;
104
105
  }
105
106
 
106
- currentMessage.blocks.push(builder.createBlock());
107
+ (currentMessage.blocks as ContentBlock.Any[]).push(builder.createBlock());
107
108
  model.updateChunk(currentMessage);
108
109
  }, 3_000);
109
110
 
@@ -135,34 +136,27 @@ const QueueStory = ({
135
136
  queueId,
136
137
  onReset,
137
138
  ...props
138
- }: StoryProps & { queueId: Key.ObjectId; onReset: () => void }) => {
139
+ }: DefaultStoryProps & { queueId: Key.ObjectId; onReset: () => void }) => {
139
140
  const [running, setRunning] = useState(true);
140
- const space = useSpace();
141
- const members = useMembers(space?.key).map((member) => member.identity);
141
+ const [space] = useSpaces();
142
+ const members = useMembers(space?.id).map((member) => member.identity);
142
143
  const queue = useTestTranscriptionQueue(space, queueId, running, 2_000);
143
- const model = useQueueModelAdapter(renderMarkdown(members), queue, initialMessages);
144
+ const model = useQueueModelAdapter(renderByline(members), queue, initialMessages);
144
145
 
145
146
  return (
146
- <TranscriptContainer
147
- space={space}
148
- model={model}
149
- running={running}
150
- onRunningChange={setRunning}
151
- onReset={onReset}
152
- {...props}
153
- />
147
+ <TranscriptContainer model={model} running={running} onRunningChange={setRunning} onReset={onReset} {...props} />
154
148
  );
155
149
  };
156
150
 
157
151
  // TODO(burdon): Reconcile with QueueStory.
158
152
  const EntityExtractionQueueStory = () => {
159
153
  const [running, setRunning] = useState(true);
160
- const space = useSpace();
154
+ const [space] = useSpaces();
161
155
  const members = useMembers(space?.key).map((member) => member.identity);
162
156
  const queue = useTestTranscriptionQueueWithEntityExtraction(space, undefined, running, 2_000);
163
- const model = useQueueModelAdapter(renderMarkdown(members), queue, []);
157
+ const model = useQueueModelAdapter(renderByline(members), queue, []);
164
158
 
165
- return <TranscriptContainer space={space} model={model} running={running} onRunningChange={setRunning} />;
159
+ return <TranscriptContainer model={model} running={running} onRunningChange={setRunning} />;
166
160
  };
167
161
 
168
162
  /**
@@ -178,46 +172,54 @@ const QueueStoryWrapper = () => {
178
172
  return <QueueStory key={key} queueId={queueId} onReset={handleReset} />;
179
173
  };
180
174
 
181
- const meta: Meta<typeof QueueStory> = {
182
- title: 'plugins/plugin-transcription/Transcript',
175
+ const meta = {
176
+ title: 'plugins/plugin-transcription/components/Transcription',
183
177
  decorators: [
178
+ withLayout({ layout: 'fullscreen' }),
184
179
  withPluginManager({
185
180
  plugins: [
186
- ThemePlugin({ tx: defaultTx }),
187
- StorybookLayoutPlugin(),
181
+ ...corePlugins(),
182
+ StorybookPlugin({}),
188
183
  ClientPlugin({
189
- types: [TestItem, Testing.DocumentType, DataType.Person, DataType.Organization],
190
- onClientInitialized: async (_, client) => {
191
- await client.halo.createIdentity();
192
- },
184
+ types: [TestItem, TestSchema.DocumentType, Person.Person, Organization.Organization],
185
+ onClientInitialized: ({ client }) =>
186
+ Effect.gen(function* () {
187
+ yield* initializeIdentity(client);
188
+ }),
193
189
  }),
190
+
194
191
  PreviewPlugin(),
195
- SpacePlugin(),
196
- SettingsPlugin(),
197
- IntentPlugin(),
198
192
  ],
199
193
  }),
200
- withLayout({ fullscreen: true }),
201
194
  ],
202
195
  parameters: {
196
+ layout: 'fullscreen',
203
197
  translations,
204
198
  },
205
- };
199
+ } satisfies Meta;
206
200
 
207
201
  export default meta;
208
202
 
209
- type Story = StoryObj<typeof QueueStory>;
203
+ const DefaultStory = (props: DefaultStoryProps) => {
204
+ const [messages, setMessages] = useState<Message.Message[]>([]);
205
+ useEffect(() => {
206
+ void Promise.all(Array.from({ length: 10 }, () => MessageBuilder.singleton.createMessage())).then(setMessages);
207
+ }, []);
208
+ if (messages.length === 0) {
209
+ return <div>Loading messages...</div>;
210
+ }
211
+ return <BasicStory {...props} messages={messages} />;
212
+ };
210
213
 
211
- export const Default: Story = {
212
- render: BasicStory,
214
+ export const Default: StoryObj<typeof DefaultStory> = {
215
+ render: DefaultStory,
213
216
  args: {
214
217
  ignoreAttention: true,
215
218
  attendableId: 'story',
216
- messages: await Promise.all(Array.from({ length: 10 }, () => MessageBuilder.singleton.createMessage())),
217
219
  },
218
220
  };
219
221
 
220
- export const Empty: Story = {
222
+ export const Empty: StoryObj<typeof BasicStory> = {
221
223
  render: BasicStory,
222
224
  args: {
223
225
  ignoreAttention: true,
@@ -225,7 +227,7 @@ export const Empty: Story = {
225
227
  },
226
228
  };
227
229
 
228
- export const WithQueue: Story = {
230
+ export const WithQueue: StoryObj<typeof QueueStoryWrapper> = {
229
231
  render: QueueStoryWrapper,
230
232
  args: {
231
233
  ignoreAttention: true,
@@ -233,10 +235,13 @@ export const WithQueue: Story = {
233
235
  },
234
236
  };
235
237
 
236
- export const WithEntityExtractionQueue: Story = {
237
- render: EntityExtractionQueueStory,
238
- args: {
239
- ignoreAttention: true,
240
- attendableId: 'story',
241
- },
242
- };
238
+ // NOTE: We are running out of free quota on hugging face entity extraction.
239
+ // TODO(mykola): Fix AI service in entity extraction function.
240
+ // TODO(mykola): Fix hugging face quota issues.
241
+ // export const WithEntityExtractionQueue: StoryObj<typeof EntityExtractionQueueStory> = {
242
+ // render: EntityExtractionQueueStory,
243
+ // args: {
244
+ // ignoreAttention: true,
245
+ // attendableId: 'story',
246
+ // },
247
+ // };
@@ -0,0 +1,64 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { useThemeContext } from '@dxos/react-ui';
8
+ import { useTextEditor } from '@dxos/react-ui-editor';
9
+ import { type Message, type Transcript } from '@dxos/types';
10
+ import {
11
+ autoScroll,
12
+ createBasicExtensions,
13
+ createMarkdownExtensions,
14
+ createThemeExtensions,
15
+ decorateMarkdown,
16
+ documentSlots,
17
+ preview,
18
+ } from '@dxos/ui-editor';
19
+ import { composable, composableProps } from '@dxos/ui-theme';
20
+ import { isTruthy } from '@dxos/util';
21
+
22
+ import { type SerializationModel } from '../../model';
23
+ import { renderByline } from '../../util';
24
+ import { transcription } from './transcription-extension';
25
+
26
+ export { renderByline };
27
+
28
+ export type TranscriptionProps = {
29
+ transcript?: Transcript.Transcript;
30
+ model: SerializationModel<Message.Message>;
31
+ // TODO(burdon): Are these still in use?
32
+ attendableId?: string;
33
+ ignoreAttention?: boolean;
34
+ };
35
+
36
+ /**
37
+ * Transcript component implemented using the editor.
38
+ */
39
+ export const Transcription = composable<HTMLDivElement, TranscriptionProps>(
40
+ ({ transcript: object, model, children, ...props }, forwardedRef) => {
41
+ const { themeMode } = useThemeContext();
42
+ const { parentRef } = useTextEditor(() => {
43
+ return {
44
+ extensions: [
45
+ createBasicExtensions({ readOnly: true, lineWrapping: true, search: true }),
46
+ createMarkdownExtensions(),
47
+ createThemeExtensions({ themeMode, slots: documentSlots }),
48
+ decorateMarkdown(),
49
+ preview(),
50
+ transcription({ model, started: object?.started ? new Date(object.started) : undefined }),
51
+ autoScroll(),
52
+ ].filter(isTruthy),
53
+ };
54
+ }, [model]);
55
+
56
+ return (
57
+ <div
58
+ {...composableProps(props, { classNames: 'dx-container' })}
59
+ ref={parentRef}
60
+ data-popover-collision-boundary={true /* TODO(thure): Make this a constant and document it. */}
61
+ />
62
+ );
63
+ },
64
+ );
@@ -2,4 +2,4 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- export * from './Transcript';
5
+ export * from './Transcription';
@@ -8,24 +8,22 @@ import { format } from 'date-fns/format';
8
8
  import { intervalToDuration } from 'date-fns/intervalToDuration';
9
9
 
10
10
  import { type CleanupFn, addEventListener, combine } from '@dxos/async';
11
- import { type RenderCallback } from '@dxos/react-ui-editor';
12
- import { type DataType } from '@dxos/schema';
11
+ import { type Message } from '@dxos/types';
13
12
 
14
13
  import { DocumentAdapter, type SerializationModel } from '../../model';
15
14
 
16
15
  /**
17
16
  * Data structure that maps Chunks queue to lines with transcript state.
18
17
  */
19
- export type TranscriptOptions = {
20
- model: SerializationModel<DataType.Message>;
18
+ export type TranscriptionOptions = {
19
+ model: SerializationModel<Message.Message>;
21
20
  started?: Date;
22
- renderButton?: RenderCallback<{ onClick: () => void }>;
23
21
  };
24
22
 
25
23
  /**
26
24
  * Scrolling transcript with timestamps.
27
25
  */
28
- export const transcript = ({ model, started, renderButton }: TranscriptOptions): Extension => {
26
+ export const transcription = ({ model, started }: TranscriptionOptions): Extension => {
29
27
  return [
30
28
  // Show timestamps in the gutter.
31
29
  gutter({
@@ -38,7 +36,7 @@ export const transcript = ({ model, started, renderButton }: TranscriptOptions):
38
36
  let line = view.state.doc.lineAt(from);
39
37
  while (line.from <= to) {
40
38
  const block = model.getChunkAtLine(line.number)?.blocks[0];
41
- const timestamp = block?.type === 'transcription' && block.started;
39
+ const timestamp = block?._tag === 'transcript' && block.started;
42
40
  if (timestamp) {
43
41
  builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));
44
42
  }
@@ -90,22 +88,6 @@ export const transcript = ({ model, started, renderButton }: TranscriptOptions):
90
88
  });
91
89
  };
92
90
 
93
- // Scroll button.
94
- if (renderButton) {
95
- this._controls = document.createElement('div');
96
- this._controls.classList.add('cm-controls', 'transition-opacity', 'duration-300', 'opacity-0');
97
- view.dom.appendChild(this._controls);
98
- renderButton(
99
- this._controls,
100
- {
101
- onClick: () => {
102
- scrollToBottom(false);
103
- },
104
- },
105
- view,
106
- );
107
- }
108
-
109
91
  // Event listeners.
110
92
  this._cleanup = combine(
111
93
  addEventListener(view.scrollDOM, 'scroll', () => {
@@ -131,7 +113,7 @@ export const transcript = ({ model, started, renderButton }: TranscriptOptions):
131
113
  );
132
114
  }
133
115
 
134
- update(update: ViewUpdate) {
116
+ update(_update: ViewUpdate) {
135
117
  // Initial sync.
136
118
  if (!this._initialized) {
137
119
  this._initialized = true;
@@ -149,27 +131,12 @@ export const transcript = ({ model, started, renderButton }: TranscriptOptions):
149
131
  ),
150
132
 
151
133
  EditorView.theme({
152
- '.cm-scroller': {
153
- overflowY: 'scroll',
154
- },
155
- '.cm-hide-scrollbar': {
156
- scrollbarWidth: 'none',
157
- '-ms-overflow-style': 'none',
158
- },
159
- '.cm-hide-scrollbar::-webkit-scrollbar': {
160
- display: 'none',
161
- },
162
- '.cm-controls': {
163
- position: 'absolute',
164
- bottom: '0.5rem',
165
- right: '0.5rem',
166
- zIndex: 1000,
167
- },
168
- '.cm-line': {
169
- paddingRight: '1rem',
134
+ '.cm-gutters': {
135
+ backgroundColor: 'var(--color-base-surface)',
170
136
  },
171
137
  '.cm-timestamp-gutter': {
172
138
  width: '6rem',
139
+ paddingLeft: '0.5rem',
173
140
  paddingRight: '1rem',
174
141
  },
175
142
  '.cm-timestamp-gutter > .cm-gutterElement > div': {
@@ -193,13 +160,13 @@ class TimestampMarker extends GutterMarker {
193
160
  super();
194
161
  }
195
162
 
196
- override eq(other: this): boolean {
197
- return other._timestamp === this._timestamp;
163
+ override eq(other: this) {
164
+ return this._timestamp === other._timestamp;
198
165
  }
199
166
 
200
- override toDOM(view: EditorView): HTMLDivElement {
167
+ override toDOM(view: EditorView) {
201
168
  const el = document.createElement('div');
202
- el.className = 'text-sm text-subdued hover:bg-hoverSurface cursor-pointer';
169
+ el.className = 'text-sm text-subdued hover:bg-hover-surface cursor-pointer';
203
170
  el.textContent = formatTimestamp(this._timestamp, this._started);
204
171
  // TODO(burdon): Click to bookmark or copy hyperlink.
205
172
  el.onclick = () => {
@@ -213,12 +180,12 @@ class TimestampMarker extends GutterMarker {
213
180
  }
214
181
  }
215
182
 
216
- const getStartTime = (started?: Date, message?: DataType.Message): Date | undefined => {
183
+ const getStartTime = (started?: Date, message?: Message.Message): Date | undefined => {
217
184
  if (started) {
218
185
  return started;
219
186
  }
220
187
 
221
- if (message?.blocks[0]?.type === 'transcription' && message.blocks[0].started) {
188
+ if (message?.blocks[0]?._tag === 'transcript' && message.blocks[0].started) {
222
189
  return new Date(message.blocks[0].started);
223
190
  }
224
191
 
@@ -2,9 +2,4 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { lazy } from 'react';
6
-
7
- export * from './Transcript';
8
- export * from './TranscriptContainer';
9
-
10
- export const TranscriptContainer = lazy(() => import('./TranscriptContainer'));
5
+ export * from './Transcription';
@@ -0,0 +1,35 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import React from 'react';
6
+
7
+ import { type AppSurface } from '@dxos/app-toolkit/ui';
8
+ import { Feed, Obj } from '@dxos/echo';
9
+ import { useMembers, useQueue } from '@dxos/react-client/echo';
10
+ import { Panel } from '@dxos/react-ui';
11
+ import { type Message, type Transcript } from '@dxos/types';
12
+
13
+ import { Transcription } from '#components';
14
+ import { useQueueModelAdapter } from '#hooks';
15
+
16
+ import { renderByline } from '../../util';
17
+
18
+ export type TranscriptionContainerProps = AppSurface.ObjectArticleProps<Transcript.Transcript>;
19
+
20
+ export const TranscriptionContainer = ({ role, subject: transcript, attendableId }: TranscriptionContainerProps) => {
21
+ const db = Obj.getDatabase(transcript);
22
+ const members = useMembers(db?.spaceId).map((member) => member.identity);
23
+ const feed = transcript.feed.target;
24
+ const queueDxn = feed ? Feed.getQueueDxn(feed) : undefined;
25
+ const queue = useQueue<Message.Message>(queueDxn, { pollInterval: 1_000 });
26
+ const model = useQueueModelAdapter(renderByline(members), queue);
27
+
28
+ return (
29
+ <Panel.Root role={role}>
30
+ <Panel.Content asChild>
31
+ <Transcription attendableId={attendableId} model={model} transcript={transcript} />
32
+ </Panel.Content>
33
+ </Panel.Root>
34
+ );
35
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export { TranscriptionContainer as default } from './TranscriptionContainer';
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { type ComponentType, lazy } from 'react';
6
+
7
+ export const TranscriptionContainer: ComponentType<any> = lazy(() => import('./TranscriptionContainer'));