@dxos/plugin-transcription 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc

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 (375) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/neutral/TranscriptionArticle-L6XANBH5.mjs +54 -0
  4. package/dist/lib/neutral/TranscriptionArticle-L6XANBH5.mjs.map +7 -0
  5. package/dist/lib/neutral/TranscriptionPlugin.mjs +34 -0
  6. package/dist/lib/neutral/TranscriptionPlugin.mjs.map +7 -0
  7. package/dist/lib/neutral/TranscriptionPlugin.node.mjs +25 -0
  8. package/dist/lib/neutral/TranscriptionPlugin.node.mjs.map +7 -0
  9. package/dist/lib/neutral/TranscriptionPlugin.workerd.mjs +21 -0
  10. package/dist/lib/neutral/TranscriptionPlugin.workerd.mjs.map +7 -0
  11. package/dist/lib/neutral/blueprint-definition-HOXDG5QP.mjs +15 -0
  12. package/dist/lib/neutral/blueprint-definition-HOXDG5QP.mjs.map +7 -0
  13. package/dist/lib/neutral/blueprints/index.mjs +8 -0
  14. package/dist/lib/neutral/capabilities/index.mjs +17 -0
  15. package/dist/lib/neutral/capabilities/index.mjs.map +7 -0
  16. package/dist/lib/neutral/chunk-2O3ONPRZ.mjs +298 -0
  17. package/dist/lib/neutral/chunk-2O3ONPRZ.mjs.map +7 -0
  18. package/dist/lib/neutral/chunk-5FXU36PN.mjs +120 -0
  19. package/dist/lib/neutral/chunk-5FXU36PN.mjs.map +7 -0
  20. package/dist/lib/{browser/chunk-VBUIO677.mjs → neutral/chunk-GL4RS533.mjs} +2 -9
  21. package/dist/lib/neutral/chunk-GL4RS533.mjs.map +7 -0
  22. package/dist/lib/{browser/chunk-WH36ENNE.mjs → neutral/chunk-ILSA3DU7.mjs} +102 -133
  23. package/dist/lib/neutral/chunk-ILSA3DU7.mjs.map +7 -0
  24. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +10 -0
  25. package/dist/lib/neutral/chunk-KAEXRX3Y.mjs +35 -0
  26. package/dist/lib/neutral/chunk-KAEXRX3Y.mjs.map +7 -0
  27. package/dist/lib/neutral/chunk-MLRJWAQH.mjs +179 -0
  28. package/dist/lib/neutral/chunk-MLRJWAQH.mjs.map +7 -0
  29. package/dist/lib/neutral/chunk-Y5EQAFFR.mjs +8 -0
  30. package/dist/lib/neutral/chunk-Y5EQAFFR.mjs.map +7 -0
  31. package/dist/lib/neutral/chunk-ZR4BH4QQ.mjs +30 -0
  32. package/dist/lib/neutral/chunk-ZR4BH4QQ.mjs.map +7 -0
  33. package/dist/lib/neutral/components/index.mjs +272 -0
  34. package/dist/lib/neutral/components/index.mjs.map +7 -0
  35. package/dist/lib/neutral/containers/index.mjs +9 -0
  36. package/dist/lib/neutral/containers/index.mjs.map +7 -0
  37. package/dist/lib/neutral/create-RRWRIUSR.mjs +21 -0
  38. package/dist/lib/neutral/create-RRWRIUSR.mjs.map +7 -0
  39. package/dist/lib/neutral/hooks/index.mjs +19 -0
  40. package/dist/lib/neutral/index.mjs +44 -0
  41. package/dist/lib/neutral/meta.json +1 -0
  42. package/dist/lib/neutral/meta.mjs +8 -0
  43. package/dist/lib/neutral/meta.mjs.map +7 -0
  44. package/dist/lib/neutral/open-CVMX5KXZ.mjs +27 -0
  45. package/dist/lib/neutral/open-CVMX5KXZ.mjs.map +7 -0
  46. package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs +13 -0
  47. package/dist/lib/neutral/operation-handler-NXMOAXFP.mjs.map +7 -0
  48. package/dist/lib/neutral/operations/index.mjs +8 -0
  49. package/dist/lib/neutral/operations/index.mjs.map +7 -0
  50. package/dist/lib/neutral/plugin.mjs +16 -0
  51. package/dist/lib/neutral/plugin.mjs.map +7 -0
  52. package/dist/lib/neutral/react-surface-YMZRO242.mjs +26 -0
  53. package/dist/lib/neutral/react-surface-YMZRO242.mjs.map +7 -0
  54. package/dist/lib/neutral/summarize-LA7TRW7A.mjs +78 -0
  55. package/dist/lib/neutral/summarize-LA7TRW7A.mjs.map +7 -0
  56. package/dist/lib/neutral/text-content-F4ASMITB.mjs +30 -0
  57. package/dist/lib/neutral/text-content-F4ASMITB.mjs.map +7 -0
  58. package/dist/lib/{node-esm/transcriber-UGB7ECX6.mjs → neutral/transcriber-ABHATBVH.mjs} +20 -18
  59. package/dist/lib/neutral/transcriber-ABHATBVH.mjs.map +7 -0
  60. package/dist/lib/neutral/translations.mjs +24 -0
  61. package/dist/lib/neutral/translations.mjs.map +7 -0
  62. package/dist/lib/neutral/types/index.mjs +10 -0
  63. package/dist/lib/neutral/types/index.mjs.map +7 -0
  64. package/dist/types/src/TranscriptionPlugin.d.ts +3 -1
  65. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  66. package/dist/types/src/TranscriptionPlugin.node.d.ts +4 -0
  67. package/dist/types/src/TranscriptionPlugin.node.d.ts.map +1 -0
  68. package/dist/types/src/TranscriptionPlugin.test.d.ts +2 -0
  69. package/dist/types/src/TranscriptionPlugin.test.d.ts.map +1 -0
  70. package/dist/types/src/TranscriptionPlugin.workerd.d.ts +4 -0
  71. package/dist/types/src/TranscriptionPlugin.workerd.d.ts.map +1 -0
  72. package/dist/types/src/blueprints/index.d.ts +2 -0
  73. package/dist/types/src/blueprints/index.d.ts.map +1 -0
  74. package/dist/types/src/blueprints/transcription-blueprint.d.ts +4 -0
  75. package/dist/types/src/blueprints/transcription-blueprint.d.ts.map +1 -0
  76. package/dist/types/src/capabilities/blueprint-definition.d.ts +5 -4
  77. package/dist/types/src/capabilities/blueprint-definition.d.ts.map +1 -1
  78. package/dist/types/src/capabilities/index.d.ts +10 -5
  79. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  80. package/dist/types/src/capabilities/operation-handler.d.ts +6 -0
  81. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  82. package/dist/types/src/capabilities/react-surface.d.ts +3 -2
  83. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  84. package/dist/types/src/capabilities/text-content.d.ts +8 -0
  85. package/dist/types/src/capabilities/text-content.d.ts.map +1 -0
  86. package/dist/types/src/capabilities/transcriber.d.ts +4 -3
  87. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  88. package/dist/types/src/components/Oracle/Oracle.d.ts +24 -0
  89. package/dist/types/src/components/Oracle/Oracle.d.ts.map +1 -0
  90. package/dist/types/src/components/Oracle/Oracle.stories.d.ts +32 -0
  91. package/dist/types/src/components/Oracle/Oracle.stories.d.ts.map +1 -0
  92. package/dist/types/src/components/Oracle/index.d.ts +2 -0
  93. package/dist/types/src/components/Oracle/index.d.ts.map +1 -0
  94. package/dist/types/src/components/Transcription/Transcription.d.ts +13 -0
  95. package/dist/types/src/components/Transcription/Transcription.d.ts.map +1 -0
  96. package/dist/types/src/components/Transcription/Transcription.stories.d.ts +37 -0
  97. package/dist/types/src/components/Transcription/Transcription.stories.d.ts.map +1 -0
  98. package/dist/types/src/components/Transcription/index.d.ts +2 -0
  99. package/dist/types/src/components/Transcription/index.d.ts.map +1 -0
  100. package/dist/types/src/components/Transcription/transcription-extension.d.ts +15 -0
  101. package/dist/types/src/components/Transcription/transcription-extension.d.ts.map +1 -0
  102. package/dist/types/src/components/index.d.ts +2 -3
  103. package/dist/types/src/components/index.d.ts.map +1 -1
  104. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.d.ts +6 -0
  105. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.d.ts.map +1 -0
  106. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.stories.d.ts +28 -0
  107. package/dist/types/src/containers/TranscriptionArticle/TranscriptionArticle.stories.d.ts.map +1 -0
  108. package/dist/types/src/containers/TranscriptionArticle/index.d.ts +2 -0
  109. package/dist/types/src/containers/TranscriptionArticle/index.d.ts.map +1 -0
  110. package/dist/types/src/containers/index.d.ts +3 -0
  111. package/dist/types/src/containers/index.d.ts.map +1 -0
  112. package/dist/types/src/enrichment/conversation.test.d.ts +2 -0
  113. package/dist/types/src/enrichment/conversation.test.d.ts.map +1 -0
  114. package/dist/types/src/enrichment/operations.d.ts +200 -0
  115. package/dist/types/src/enrichment/operations.d.ts.map +1 -0
  116. package/dist/types/src/enrichment/parser.d.ts +26 -0
  117. package/dist/types/src/enrichment/parser.d.ts.map +1 -0
  118. package/dist/types/src/enrichment/stream-simulator.d.ts +38 -0
  119. package/dist/types/src/enrichment/stream-simulator.d.ts.map +1 -0
  120. package/dist/types/src/hooks/index.d.ts +2 -1
  121. package/dist/types/src/hooks/index.d.ts.map +1 -1
  122. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
  123. package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
  124. package/dist/types/src/hooks/useFeedModelAdapter.d.ts +12 -0
  125. package/dist/types/src/hooks/useFeedModelAdapter.d.ts.map +1 -0
  126. package/dist/types/src/hooks/useTranscriber.d.ts +2 -2
  127. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  128. package/dist/types/src/hooks/useTranscriptionRecording.d.ts +12 -0
  129. package/dist/types/src/hooks/useTranscriptionRecording.d.ts.map +1 -0
  130. package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
  131. package/dist/types/src/index.d.ts +2 -3
  132. package/dist/types/src/index.d.ts.map +1 -1
  133. package/dist/types/src/meta.d.ts +2 -2
  134. package/dist/types/src/meta.d.ts.map +1 -1
  135. package/dist/types/src/model/model.d.ts +2 -2
  136. package/dist/types/src/model/model.d.ts.map +1 -1
  137. package/dist/types/src/{segments-normalization → normalization}/index.d.ts +1 -1
  138. package/dist/types/src/normalization/index.d.ts.map +1 -0
  139. package/dist/types/src/{segments-normalization → normalization}/message-normalizer.d.ts +9 -7
  140. package/dist/types/src/normalization/message-normalizer.d.ts.map +1 -0
  141. package/dist/types/src/normalization/normalization.d.ts +543 -0
  142. package/dist/types/src/normalization/normalization.d.ts.map +1 -0
  143. package/dist/types/src/normalization/normalization.test.d.ts.map +1 -0
  144. package/dist/types/src/normalization/utils.d.ts +3 -0
  145. package/dist/types/src/normalization/utils.d.ts.map +1 -0
  146. package/dist/types/src/operations/create.d.ts +5 -0
  147. package/dist/types/src/operations/create.d.ts.map +1 -0
  148. package/dist/types/src/operations/index.d.ts +3 -0
  149. package/dist/types/src/operations/index.d.ts.map +1 -0
  150. package/dist/types/src/operations/open.d.ts +5 -0
  151. package/dist/types/src/operations/open.d.ts.map +1 -0
  152. package/dist/types/src/operations/summarize.d.ts +8 -0
  153. package/dist/types/src/operations/summarize.d.ts.map +1 -0
  154. package/dist/types/src/plugin.d.ts +4 -0
  155. package/dist/types/src/plugin.d.ts.map +1 -0
  156. package/dist/types/src/stories/FileTranscription.stories.d.ts +20 -0
  157. package/dist/types/src/stories/FileTranscription.stories.d.ts.map +1 -0
  158. package/dist/types/src/{components/stories → stories}/KeyWordRecognition.stories.d.ts +2 -2
  159. package/dist/types/src/stories/KeyWordRecognition.stories.d.ts.map +1 -0
  160. package/dist/types/src/{components/stories/MicrophoneTranscription.stories.d.ts → stories/LiveTranscription.stories.d.ts} +7 -7
  161. package/dist/types/src/stories/LiveTranscription.stories.d.ts.map +1 -0
  162. package/dist/types/src/stories/TranscriptionStory.d.ts +21 -0
  163. package/dist/types/src/stories/TranscriptionStory.d.ts.map +1 -0
  164. package/dist/types/src/stories/common.d.ts +46 -0
  165. package/dist/types/src/stories/common.d.ts.map +1 -0
  166. package/dist/types/src/testing/testing.d.ts +13 -14
  167. package/dist/types/src/testing/testing.d.ts.map +1 -1
  168. package/dist/types/src/transcriber/index.d.ts +1 -1
  169. package/dist/types/src/transcriber/index.d.ts.map +1 -1
  170. package/dist/types/src/transcriber/media-stream-recorder.d.ts +2 -2
  171. package/dist/types/src/transcriber/media-stream-recorder.d.ts.map +1 -1
  172. package/dist/types/src/transcriber/transcriber.d.ts +61 -6
  173. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  174. package/dist/types/src/transcriber/transcriber.test.d.ts +2 -0
  175. package/dist/types/src/transcriber/transcriber.test.d.ts.map +1 -0
  176. package/dist/types/src/transcriber/transcription-manager.d.ts +14 -9
  177. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  178. package/dist/types/src/translations.d.ts +9 -8
  179. package/dist/types/src/translations.d.ts.map +1 -1
  180. package/dist/types/src/types/TranscriptOperation.d.ts +917 -0
  181. package/dist/types/src/types/TranscriptOperation.d.ts.map +1 -0
  182. package/dist/types/src/types/TranscriptionCapabilities.d.ts +17 -0
  183. package/dist/types/src/types/TranscriptionCapabilities.d.ts.map +1 -0
  184. package/dist/types/src/types/index.d.ts +2 -3
  185. package/dist/types/src/types/index.d.ts.map +1 -1
  186. package/dist/types/src/util/array.d.ts.map +1 -1
  187. package/dist/types/src/util/get-time-str.d.ts.map +1 -1
  188. package/dist/types/src/util/index.d.ts +1 -0
  189. package/dist/types/src/util/index.d.ts.map +1 -1
  190. package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -1
  191. package/dist/types/src/util/render-byline.d.ts +4 -0
  192. package/dist/types/src/util/render-byline.d.ts.map +1 -0
  193. package/dist/types/tsconfig.tsbuildinfo +1 -1
  194. package/package.json +157 -82
  195. package/src/TranscriptionPlugin.node.ts +20 -0
  196. package/src/TranscriptionPlugin.test.ts +31 -0
  197. package/src/TranscriptionPlugin.tsx +20 -64
  198. package/src/TranscriptionPlugin.workerd.ts +18 -0
  199. package/src/blueprints/index.ts +5 -0
  200. package/src/blueprints/transcription-blueprint.ts +29 -0
  201. package/src/capabilities/blueprint-definition.ts +12 -24
  202. package/src/capabilities/index.ts +11 -7
  203. package/src/capabilities/operation-handler.ts +16 -0
  204. package/src/capabilities/react-surface.tsx +23 -14
  205. package/src/capabilities/text-content.ts +33 -0
  206. package/src/capabilities/transcriber.ts +53 -42
  207. package/src/components/Oracle/Oracle.stories.tsx +147 -0
  208. package/src/components/Oracle/Oracle.tsx +141 -0
  209. package/src/components/Oracle/index.ts +5 -0
  210. package/src/components/Transcription/Transcription.stories.tsx +213 -0
  211. package/src/components/Transcription/Transcription.tsx +58 -0
  212. package/src/components/{Transcript → Transcription}/index.ts +1 -1
  213. package/src/components/{Transcript/transcript-extension.ts → Transcription/transcription-extension.ts} +13 -9
  214. package/src/components/index.ts +2 -6
  215. package/src/containers/TranscriptionArticle/TranscriptionArticle.stories.tsx +61 -0
  216. package/src/containers/TranscriptionArticle/TranscriptionArticle.tsx +62 -0
  217. package/src/containers/TranscriptionArticle/index.ts +5 -0
  218. package/src/containers/index.ts +7 -0
  219. package/src/enrichment/conversation.test.ts +162 -0
  220. package/src/enrichment/conversation.txt +23 -0
  221. package/src/enrichment/operations.ts +268 -0
  222. package/src/enrichment/parser.ts +101 -0
  223. package/src/enrichment/stream-simulator.ts +125 -0
  224. package/src/hooks/index.ts +2 -1
  225. package/src/hooks/useFeedModelAdapter.ts +46 -0
  226. package/src/hooks/useTranscriber.ts +12 -4
  227. package/src/hooks/useTranscriptionRecording.ts +87 -0
  228. package/src/hooks/useVoiceInput.ts +2 -3
  229. package/src/index.ts +4 -5
  230. package/src/meta.ts +3 -3
  231. package/src/model/model.test.ts +20 -14
  232. package/src/model/model.ts +3 -3
  233. package/src/{segments-normalization → normalization}/message-normalizer.ts +37 -24
  234. package/src/{segments-normalization → normalization}/normalization.test.ts +8 -47
  235. package/src/normalization/normalization.ts +76 -0
  236. package/src/{segments-normalization → normalization}/utils.ts +2 -2
  237. package/src/operations/create.ts +24 -0
  238. package/src/operations/index.ts +11 -0
  239. package/src/operations/open.ts +28 -0
  240. package/src/operations/summarize.ts +101 -0
  241. package/src/plugin.ts +11 -0
  242. package/src/stories/FileTranscription.stories.tsx +143 -0
  243. package/src/{components/stories → stories}/KeyWordRecognition.stories.tsx +40 -40
  244. package/src/stories/LiveTranscription.stories.tsx +153 -0
  245. package/src/stories/TranscriptionStory.tsx +101 -0
  246. package/src/stories/common.ts +233 -0
  247. package/src/testing/testing.ts +49 -56
  248. package/src/transcriber/index.ts +1 -1
  249. package/src/transcriber/media-stream-recorder.ts +3 -3
  250. package/src/transcriber/transcriber.browser.test.ts +4 -5
  251. package/src/transcriber/transcriber.test.ts +104 -0
  252. package/src/transcriber/transcriber.ts +105 -60
  253. package/src/transcriber/transcription-manager.ts +33 -22
  254. package/src/translations.ts +10 -7
  255. package/src/types/TranscriptOperation.ts +103 -0
  256. package/src/types/TranscriptionCapabilities.ts +39 -0
  257. package/src/types/index.ts +2 -3
  258. package/src/util/index.ts +1 -0
  259. package/src/util/render-byline.ts +33 -0
  260. package/dist/lib/browser/TranscriptContainer-2GSL2XB5.mjs +0 -11
  261. package/dist/lib/browser/blueprint-definition-UAAJYVLZ.mjs +0 -150
  262. package/dist/lib/browser/blueprint-definition-UAAJYVLZ.mjs.map +0 -7
  263. package/dist/lib/browser/chunk-3MKZ2MNQ.mjs +0 -16
  264. package/dist/lib/browser/chunk-3MKZ2MNQ.mjs.map +0 -7
  265. package/dist/lib/browser/chunk-535OJKFO.mjs +0 -8
  266. package/dist/lib/browser/chunk-535OJKFO.mjs.map +0 -7
  267. package/dist/lib/browser/chunk-7DR6HZEF.mjs +0 -732
  268. package/dist/lib/browser/chunk-7DR6HZEF.mjs.map +0 -7
  269. package/dist/lib/browser/chunk-VBUIO677.mjs.map +0 -7
  270. package/dist/lib/browser/chunk-W7WKZTM4.mjs +0 -63
  271. package/dist/lib/browser/chunk-W7WKZTM4.mjs.map +0 -7
  272. package/dist/lib/browser/chunk-WH36ENNE.mjs.map +0 -7
  273. package/dist/lib/browser/index.mjs +0 -130
  274. package/dist/lib/browser/index.mjs.map +0 -7
  275. package/dist/lib/browser/intent-resolver-ZTKTEAQX.mjs +0 -25
  276. package/dist/lib/browser/intent-resolver-ZTKTEAQX.mjs.map +0 -7
  277. package/dist/lib/browser/meta.json +0 -1
  278. package/dist/lib/browser/react-surface-KA32A72I.mjs +0 -34
  279. package/dist/lib/browser/react-surface-KA32A72I.mjs.map +0 -7
  280. package/dist/lib/browser/transcriber-LWOLYQHC.mjs +0 -56
  281. package/dist/lib/browser/transcriber-LWOLYQHC.mjs.map +0 -7
  282. package/dist/lib/browser/types/index.mjs +0 -12
  283. package/dist/lib/node-esm/TranscriptContainer-GRLDCESB.mjs +0 -12
  284. package/dist/lib/node-esm/blueprint-definition-Z3LTZ3ID.mjs +0 -151
  285. package/dist/lib/node-esm/blueprint-definition-Z3LTZ3ID.mjs.map +0 -7
  286. package/dist/lib/node-esm/chunk-K4AZOB5Y.mjs +0 -733
  287. package/dist/lib/node-esm/chunk-K4AZOB5Y.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-OLMSTF3M.mjs +0 -64
  289. package/dist/lib/node-esm/chunk-OLMSTF3M.mjs.map +0 -7
  290. package/dist/lib/node-esm/chunk-Q6WD7L2J.mjs +0 -10
  291. package/dist/lib/node-esm/chunk-Q6WD7L2J.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-SWUVPFKR.mjs +0 -17
  293. package/dist/lib/node-esm/chunk-SWUVPFKR.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-YFN4FJFK.mjs +0 -467
  295. package/dist/lib/node-esm/chunk-YFN4FJFK.mjs.map +0 -7
  296. package/dist/lib/node-esm/chunk-YVNQN2J6.mjs +0 -30
  297. package/dist/lib/node-esm/chunk-YVNQN2J6.mjs.map +0 -7
  298. package/dist/lib/node-esm/index.mjs +0 -131
  299. package/dist/lib/node-esm/index.mjs.map +0 -7
  300. package/dist/lib/node-esm/intent-resolver-55WH2GY6.mjs +0 -26
  301. package/dist/lib/node-esm/intent-resolver-55WH2GY6.mjs.map +0 -7
  302. package/dist/lib/node-esm/meta.json +0 -1
  303. package/dist/lib/node-esm/react-surface-GU7LW2JO.mjs +0 -35
  304. package/dist/lib/node-esm/react-surface-GU7LW2JO.mjs.map +0 -7
  305. package/dist/lib/node-esm/transcriber-UGB7ECX6.mjs.map +0 -7
  306. package/dist/lib/node-esm/types/index.mjs +0 -13
  307. package/dist/types/src/capabilities/capabilities.d.ts +0 -17
  308. package/dist/types/src/capabilities/capabilities.d.ts.map +0 -1
  309. package/dist/types/src/capabilities/intent-resolver.d.ts +0 -4
  310. package/dist/types/src/capabilities/intent-resolver.d.ts.map +0 -1
  311. package/dist/types/src/components/Transcript/Transcript.d.ts +0 -20
  312. package/dist/types/src/components/Transcript/Transcript.d.ts.map +0 -1
  313. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +0 -39
  314. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +0 -1
  315. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +0 -28
  316. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +0 -1
  317. package/dist/types/src/components/Transcript/index.d.ts +0 -2
  318. package/dist/types/src/components/Transcript/index.d.ts.map +0 -1
  319. package/dist/types/src/components/Transcript/transcript-extension.d.ts +0 -15
  320. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +0 -1
  321. package/dist/types/src/components/TranscriptContainer.d.ts +0 -9
  322. package/dist/types/src/components/TranscriptContainer.d.ts.map +0 -1
  323. package/dist/types/src/components/stories/FileTranscription.stories.d.ts +0 -18
  324. package/dist/types/src/components/stories/FileTranscription.stories.d.ts.map +0 -1
  325. package/dist/types/src/components/stories/KeyWordRecognition.stories.d.ts.map +0 -1
  326. package/dist/types/src/components/stories/MicrophoneTranscription.stories.d.ts.map +0 -1
  327. package/dist/types/src/components/stories/TranscriptionStory.d.ts +0 -12
  328. package/dist/types/src/components/stories/TranscriptionStory.d.ts.map +0 -1
  329. package/dist/types/src/components/stories/useIsSpeaking.d.ts +0 -3
  330. package/dist/types/src/components/stories/useIsSpeaking.d.ts.map +0 -1
  331. package/dist/types/src/functions/index.d.ts +0 -3
  332. package/dist/types/src/functions/index.d.ts.map +0 -1
  333. package/dist/types/src/functions/open.d.ts +0 -7
  334. package/dist/types/src/functions/open.d.ts.map +0 -1
  335. package/dist/types/src/functions/summarize.d.ts +0 -11
  336. package/dist/types/src/functions/summarize.d.ts.map +0 -1
  337. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +0 -8
  338. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +0 -1
  339. package/dist/types/src/segments-normalization/index.d.ts.map +0 -1
  340. package/dist/types/src/segments-normalization/message-normalizer.d.ts.map +0 -1
  341. package/dist/types/src/segments-normalization/normalization.d.ts +0 -476
  342. package/dist/types/src/segments-normalization/normalization.d.ts.map +0 -1
  343. package/dist/types/src/segments-normalization/normalization.test.d.ts.map +0 -1
  344. package/dist/types/src/segments-normalization/utils.d.ts +0 -3
  345. package/dist/types/src/segments-normalization/utils.d.ts.map +0 -1
  346. package/dist/types/src/types/Transcript.d.ts +0 -30
  347. package/dist/types/src/types/Transcript.d.ts.map +0 -1
  348. package/dist/types/src/types/TranscriptAction.d.ts +0 -23
  349. package/dist/types/src/types/TranscriptAction.d.ts.map +0 -1
  350. package/dist/types/src/types/types.d.ts +0 -5
  351. package/dist/types/src/types/types.d.ts.map +0 -1
  352. package/src/capabilities/capabilities.ts +0 -33
  353. package/src/capabilities/intent-resolver.ts +0 -18
  354. package/src/components/Transcript/Transcript.stories.tsx +0 -245
  355. package/src/components/Transcript/Transcript.tsx +0 -93
  356. package/src/components/Transcript/deprecated/OldTranscript.tsx +0 -260
  357. package/src/components/TranscriptContainer.tsx +0 -36
  358. package/src/components/stories/FileTranscription.stories.tsx +0 -256
  359. package/src/components/stories/MicrophoneTranscription.stories.tsx +0 -285
  360. package/src/components/stories/TranscriptionStory.tsx +0 -45
  361. package/src/components/stories/useIsSpeaking.tsx +0 -40
  362. package/src/functions/index.ts +0 -6
  363. package/src/functions/open.ts +0 -39
  364. package/src/functions/summarize.ts +0 -103
  365. package/src/hooks/useQueueModelAdapter.ts +0 -66
  366. package/src/segments-normalization/normalization.ts +0 -115
  367. package/src/types/Transcript.ts +0 -44
  368. package/src/types/TranscriptAction.ts +0 -24
  369. package/src/types/types.ts +0 -9
  370. package/dist/lib/{browser/types → neutral/blueprints}/index.mjs.map +0 -0
  371. package/dist/lib/{browser/TranscriptContainer-2GSL2XB5.mjs.map → neutral/chunk-J5LGTIGS.mjs.map} +0 -0
  372. package/dist/lib/{node-esm/types → neutral/hooks}/index.mjs.map +0 -0
  373. package/dist/lib/{node-esm/TranscriptContainer-GRLDCESB.mjs.map → neutral/index.mjs.map} +0 -0
  374. package/dist/types/src/{segments-normalization → normalization}/normalization.test.d.ts +0 -0
  375. package/src/{segments-normalization → normalization}/index.ts +1 -1
@@ -1,33 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { defineCapability } from '@dxos/app-framework';
6
-
7
- import { meta } from '../meta';
8
- import {
9
- type MediaStreamRecorderParams,
10
- type Transcriber,
11
- type TranscriberParams,
12
- type TranscriptMessageEnricher,
13
- type TranscriptionManager,
14
- } from '../transcriber';
15
-
16
- export namespace TranscriptionCapabilities {
17
- export type GetTranscriberProps = {
18
- audioStreamTrack: MediaStreamTrack;
19
- recorderConfig?: Partial<MediaStreamRecorderParams['config']>;
20
- transcriberConfig?: Partial<TranscriberParams['config']>;
21
- onSegments: TranscriberParams['onSegments'];
22
- };
23
- export type GetTranscriber = (props: GetTranscriberProps) => Transcriber;
24
- export const Transcriber = defineCapability<GetTranscriber>(`${meta.id}/capability/transcriber`);
25
-
26
- export type GetTranscriptionManagerProps = {
27
- messageEnricher?: TranscriptMessageEnricher;
28
- };
29
- export type GetTranscriptionManager = (props: GetTranscriptionManagerProps) => TranscriptionManager;
30
- export const TranscriptionManager = defineCapability<GetTranscriptionManager>(
31
- `${meta.id}/capability/transcription-manager`,
32
- );
33
- }
@@ -1,18 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capabilities, type PluginContext, contributes, createResolver } from '@dxos/app-framework';
6
-
7
- import { Transcript, TranscriptAction } from '../types';
8
-
9
- export default (context: PluginContext) =>
10
- contributes(Capabilities.IntentResolver, [
11
- createResolver({
12
- intent: TranscriptAction.Create,
13
- resolve: ({ name, space }) => {
14
- const transcript = Transcript.makeTranscript(space.queues.create().dxn);
15
- return { data: { object: transcript } };
16
- },
17
- }),
18
- ]);
@@ -1,245 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { type FC, useEffect, useMemo, useState } from 'react';
7
-
8
- import { IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
9
- import { withPluginManager } from '@dxos/app-framework/testing';
10
- import { Key } from '@dxos/echo';
11
- import { ClientPlugin } from '@dxos/plugin-client';
12
- import { PreviewPlugin } from '@dxos/plugin-preview';
13
- import { SpacePlugin } from '@dxos/plugin-space';
14
- import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
15
- import { ThemePlugin } from '@dxos/plugin-theme';
16
- import { faker } from '@dxos/random';
17
- import { useMembers, useSpace } from '@dxos/react-client/echo';
18
- import { IconButton, Toolbar } from '@dxos/react-ui';
19
- import { withTheme } from '@dxos/react-ui/testing';
20
- import { SyntaxHighlighter } from '@dxos/react-ui-syntax-highlighter';
21
- import { defaultTx } from '@dxos/react-ui-theme';
22
- import { DataType } from '@dxos/schema';
23
- import { Testing } from '@dxos/schema/testing';
24
-
25
- import { useQueueModelAdapter } from '../../hooks';
26
- import { SerializationModel } from '../../model';
27
- import {
28
- MessageBuilder,
29
- TestItem,
30
- useTestTranscriptionQueue,
31
- useTestTranscriptionQueueWithEntityExtraction,
32
- } from '../../testing';
33
- import { translations } from '../../translations';
34
-
35
- import { TranscriptView, type TranscriptViewProps, renderByline } from './Transcript';
36
-
37
- faker.seed(1);
38
-
39
- /**
40
- * Story wrapper with test controls.
41
- */
42
- const TranscriptContainer: FC<
43
- TranscriptViewProps & {
44
- running: boolean;
45
- onRunningChange: (running: boolean) => void;
46
- onReset?: () => void;
47
- }
48
- > = ({ space, model, running, onRunningChange, onReset }) => {
49
- return (
50
- <div className='grid grid-rows-[1fr_40px] grow divide-y divide-separator'>
51
- <TranscriptView space={space} model={model} />
52
- <div className='grid grid-cols-[1fr_16rem] overflow-hidden'>
53
- <div className='flex items-center'>
54
- <SyntaxHighlighter language='json' className='text-sm'>
55
- {JSON.stringify(model.toJSON())}
56
- </SyntaxHighlighter>
57
- </div>
58
- <Toolbar.Root classNames='justify-end'>
59
- <IconButton
60
- icon={running ? 'ph--pause--regular' : 'ph--play--regular'}
61
- label={running ? 'Pause' : 'Start'}
62
- onClick={() => onRunningChange(!running)}
63
- />
64
- {onReset && <IconButton icon='ph--x--regular' label='Reset' onClick={onReset} />}
65
- </Toolbar.Root>
66
- </div>
67
- </div>
68
- );
69
- };
70
-
71
- type StoryProps = { messages?: DataType.Message[] } & Pick<TranscriptViewProps, 'ignoreAttention' | 'attendableId'>;
72
-
73
- /**
74
- * Basic story mutates array of messages.
75
- */
76
- const BasicStory = ({ messages: initialMessages = [], ...props }: StoryProps) => {
77
- const [reset, setReset] = useState({});
78
- const builder = useMemo(() => new MessageBuilder(), []);
79
- const model = useMemo(
80
- () => new SerializationModel<DataType.Message>(renderByline([]), initialMessages),
81
- [initialMessages, reset],
82
- );
83
- const [running, setRunning] = useState(true);
84
- const [currentMessage, setCurrentMessage] = useState<DataType.Message | null>(null);
85
- useEffect(() => {
86
- if (!running) {
87
- return;
88
- }
89
-
90
- if (!currentMessage) {
91
- void builder.createMessage().then((message) => {
92
- model.appendChunk(message);
93
- setCurrentMessage(message);
94
- });
95
- return;
96
- }
97
-
98
- const i = setInterval(() => {
99
- if (currentMessage?.blocks.length && currentMessage.blocks.length >= 3) {
100
- setCurrentMessage(null);
101
- clearInterval(i);
102
- return;
103
- }
104
-
105
- currentMessage.blocks.push(builder.createBlock());
106
- model.updateChunk(currentMessage);
107
- }, 3_000);
108
-
109
- return () => clearInterval(i);
110
- }, [model, currentMessage, running]);
111
-
112
- const handleReset = () => {
113
- setCurrentMessage(null);
114
- setRunning(false);
115
- setReset({});
116
- };
117
-
118
- return (
119
- <TranscriptContainer
120
- model={model}
121
- running={running}
122
- onRunningChange={setRunning}
123
- onReset={handleReset}
124
- {...props}
125
- />
126
- );
127
- };
128
-
129
- /**
130
- * Queue story mutates queue with model adapter.
131
- */
132
- const QueueStory = ({
133
- messages: initialMessages = [],
134
- queueId,
135
- onReset,
136
- ...props
137
- }: StoryProps & { queueId: Key.ObjectId; onReset: () => void }) => {
138
- const [running, setRunning] = useState(true);
139
- const space = useSpace();
140
- const members = useMembers(space?.key).map((member) => member.identity);
141
- const queue = useTestTranscriptionQueue(space, queueId, running, 2_000);
142
- const model = useQueueModelAdapter(renderByline(members), queue, initialMessages);
143
-
144
- return (
145
- <TranscriptContainer
146
- space={space}
147
- model={model}
148
- running={running}
149
- onRunningChange={setRunning}
150
- onReset={onReset}
151
- {...props}
152
- />
153
- );
154
- };
155
-
156
- // TODO(burdon): Reconcile with QueueStory.
157
- const EntityExtractionQueueStory = () => {
158
- const [running, setRunning] = useState(true);
159
- const space = useSpace();
160
- const members = useMembers(space?.key).map((member) => member.identity);
161
- const queue = useTestTranscriptionQueueWithEntityExtraction(space, undefined, running, 2_000);
162
- const model = useQueueModelAdapter(renderByline(members), queue, []);
163
-
164
- return <TranscriptContainer space={space} model={model} running={running} onRunningChange={setRunning} />;
165
- };
166
-
167
- /**
168
- * Wrapper remounts on refresh to reload queue.
169
- */
170
- const QueueStoryWrapper = () => {
171
- const [queueId] = useState(Key.ObjectId.random());
172
- const [key, setKey] = useState(Key.ObjectId.random().toString());
173
- const handleReset = () => {
174
- setKey(Key.ObjectId.random().toString());
175
- };
176
-
177
- return <QueueStory key={key} queueId={queueId} onReset={handleReset} />;
178
- };
179
-
180
- const meta = {
181
- title: 'plugins/plugin-transcription/Transcript',
182
- decorators: [
183
- withTheme,
184
- withPluginManager({
185
- plugins: [
186
- ClientPlugin({
187
- types: [TestItem, Testing.DocumentType, DataType.Person, DataType.Organization],
188
- onClientInitialized: async ({ client }) => {
189
- await client.halo.createIdentity();
190
- },
191
- }),
192
- SpacePlugin({}),
193
- IntentPlugin(),
194
- SettingsPlugin(),
195
-
196
- // UI
197
- PreviewPlugin(),
198
- ThemePlugin({ tx: defaultTx }),
199
- StorybookLayoutPlugin({}),
200
- ],
201
- }),
202
- ],
203
- parameters: {
204
- layout: 'fullscreen',
205
- translations,
206
- },
207
- } satisfies Meta;
208
-
209
- export default meta;
210
-
211
- export const Default: StoryObj<typeof BasicStory> = {
212
- render: BasicStory,
213
- args: {
214
- ignoreAttention: true,
215
- attendableId: 'story',
216
- messages: await Promise.all(Array.from({ length: 10 }, () => MessageBuilder.singleton.createMessage())),
217
- },
218
- };
219
-
220
- export const Empty: StoryObj<typeof BasicStory> = {
221
- render: BasicStory,
222
- args: {
223
- ignoreAttention: true,
224
- attendableId: 'story',
225
- },
226
- };
227
-
228
- export const WithQueue: StoryObj<typeof QueueStoryWrapper> = {
229
- render: QueueStoryWrapper,
230
- args: {
231
- ignoreAttention: true,
232
- attendableId: 'story',
233
- },
234
- };
235
-
236
- // NOTE: We are running out of free quota on hugging face entity extraction.
237
- // TODO(mykola): Fix AI service in entity extraction function.
238
- // TODO(mykola): Fix hugging face quota issues.
239
- // export const WithEntityExtractionQueue: StoryObj<typeof EntityExtractionQueueStory> = {
240
- // render: EntityExtractionQueueStory,
241
- // args: {
242
- // ignoreAttention: true,
243
- // attendableId: 'story',
244
- // },
245
- // };
@@ -1,93 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import React from 'react';
6
-
7
- import { type Space } from '@dxos/react-client/echo';
8
- import { type Identity } from '@dxos/react-client/halo';
9
- import { type ThemedClassName, useThemeContext } from '@dxos/react-ui';
10
- import {
11
- autoScroll,
12
- createBasicExtensions,
13
- createMarkdownExtensions,
14
- createThemeExtensions,
15
- decorateMarkdown,
16
- preview,
17
- useTextEditor,
18
- } from '@dxos/react-ui-editor';
19
- import { mx } from '@dxos/react-ui-theme';
20
- import { type DataType } from '@dxos/schema';
21
- import { isTruthy } from '@dxos/util';
22
-
23
- import { type SerializationModel } from '../../model';
24
- import { type Transcript } from '../../types';
25
-
26
- import { transcript } from './transcript-extension';
27
-
28
- // TODO(thure): Move this?
29
- export const renderByline =
30
- (identities: Identity[]) =>
31
- (message: DataType.Message, index: number, debug = false): string[] => {
32
- if (message.sender.role === 'assistant') {
33
- // Start/stop block.
34
- return [message.blocks.find((block) => block._tag === 'transcript')?.text ?? '', ''];
35
- }
36
-
37
- // TODO(burdon): Use link/reference markup for users (with popover).
38
- // TODO(burdon): Color and avatar.
39
- const identity = identities.find((identity) => identity.did === message.sender.identityDid);
40
- const name =
41
- identity?.profile?.displayName ??
42
- message.sender.contact?.target?.fullName ??
43
- message.sender.name ??
44
- message.sender.email ??
45
- message.sender.identityDid;
46
- const blocks = message.blocks.filter((block) => block._tag === 'transcript');
47
- return [
48
- // TODO(thure): Use an XML tag with the bits needed here.
49
- `###### ${name}` + (debug ? ` [${index}]:${message.id}` : ''),
50
- blocks.map((block) => block.text.trim()).join(' '),
51
- '',
52
- ];
53
- };
54
-
55
- export type TranscriptViewProps = ThemedClassName<{
56
- space?: Space;
57
- transcript?: Transcript.Transcript;
58
- model: SerializationModel<DataType.Message>;
59
- // TODO(burdon): Are these still in use?
60
- attendableId?: string;
61
- ignoreAttention?: boolean;
62
- }>;
63
-
64
- /**
65
- * Transcript component implemented using the editor.
66
- */
67
- export const TranscriptView = ({ classNames, space, transcript: object, model }: TranscriptViewProps) => {
68
- const { themeMode } = useThemeContext();
69
- const { parentRef } = useTextEditor(() => {
70
- return {
71
- extensions: [
72
- createBasicExtensions({ readOnly: true, lineWrapping: true, search: true }),
73
- createMarkdownExtensions(),
74
- createThemeExtensions({ themeMode }),
75
- decorateMarkdown(),
76
- preview(),
77
- transcript({
78
- model,
79
- started: object?.started ? new Date(object.started) : undefined,
80
- }),
81
- autoScroll(),
82
- ].filter(isTruthy),
83
- };
84
- }, [space, model]);
85
-
86
- return (
87
- <div
88
- ref={parentRef}
89
- className={mx('flex grow overflow-hidden container-max-width', classNames)}
90
- data-popover-collision-boundary={true /* TODO(thure): Make this a constant and document it. */}
91
- />
92
- );
93
- };
@@ -1,260 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { intervalToDuration } from 'date-fns/intervalToDuration';
6
- import * as Schema from 'effect/Schema';
7
- import { yieldOrContinue } from 'main-thread-scheduling';
8
- import React, { type FC, type WheelEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';
9
- import { type OnResizeCallback, useResizeDetector } from 'react-resize-detector';
10
-
11
- import { Type } from '@dxos/echo';
12
- import { IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';
13
- import { useAttention } from '@dxos/react-ui-attention';
14
- import {
15
- type DxGridAxisMeta,
16
- type DxGridCellValue,
17
- type DxGridElement,
18
- type DxGridPlaneCells,
19
- Grid,
20
- toPlaneCellIndex,
21
- } from '@dxos/react-ui-grid';
22
- import { mx } from '@dxos/react-ui-theme';
23
-
24
- import { meta } from '../../../meta';
25
-
26
- /**
27
- * Transcription fragment.
28
- */
29
- const TranscriptSegment = Schema.Struct({
30
- // TODO(burdon): TS from service is not Unix TS (x1000).
31
- started: Schema.String,
32
- text: Schema.String,
33
- });
34
-
35
- type TranscriptSegment = Schema.Schema.Type<typeof TranscriptSegment>;
36
-
37
- /**
38
- * Transcription block (from single speaker).
39
- */
40
- const TranscriptBlock = Schema.Struct({
41
- id: Schema.String,
42
- authorName: Schema.optional(Schema.String), // TODO(burdon): Replace with identityDid.
43
- authorHue: Schema.optional(Schema.String), // TOOD(burdon): Remove.
44
- segments: Schema.Array(TranscriptSegment),
45
- }).pipe(
46
- Type.Obj({
47
- typename: 'dxos.org/type/TranscriptBlock',
48
- version: '0.1.0',
49
- }),
50
- );
51
-
52
- type TranscriptBlock = Schema.Schema.Type<typeof TranscriptBlock>;
53
-
54
- // TODO(burdon): Actions (e.g., mark, summarize, translate, label, delete).
55
-
56
- const lineHeight = 20;
57
- const cellSpacing = 8 + 2;
58
- const timestampColumnWidth = 68;
59
-
60
- const authorClasses = 'font-medium text-base leading-[20px]';
61
- const timestampClasses = 'text-xs leading-[20px] text-description pie-0 tabular-nums';
62
- const segmentTextClasses = 'text-sm whitespace-normal hyphens-auto';
63
- const measureClasses = mx(
64
- // NOTE(thure): The `inline-start` value must equal `timestampColumnWidth` plus grid’s gap (1px)
65
- 'absolute inline-start-[69px] inline-end-0 invisible z-[-1] border',
66
- 'pli-[--dx-grid-cell-padding-inline] plb-[--dx-grid-cell-padding-block] leading-[20px]',
67
- segmentTextClasses,
68
- );
69
-
70
- const rowDefault = {
71
- grid: { size: lineHeight + cellSpacing },
72
- };
73
-
74
- type QueueRows = [number, number][];
75
-
76
- const mapTranscriptQueue = (blocks?: TranscriptBlock[]): QueueRows => {
77
- if (!blocks || !Array.isArray(blocks) || blocks.length === 0) {
78
- return [];
79
- } else {
80
- return blocks.flatMap((block, blockIndex) => {
81
- return [
82
- [blockIndex, -1],
83
- ...block.segments.map((segment, segmentIndex) => {
84
- return [blockIndex, segmentIndex] as [number, number];
85
- }),
86
- ];
87
- });
88
- }
89
- };
90
-
91
- const pad = (n = 0) => String(n).padStart(2, '0');
92
-
93
- const formatTimestamp = (start: Date, end: Date) => {
94
- const { hours, minutes, seconds } = intervalToDuration({ start, end });
95
- return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
96
- };
97
-
98
- const measureRows = async (
99
- host: HTMLDivElement,
100
- blocks: TranscriptBlock[],
101
- queueMap: QueueRows,
102
- signal: AbortSignal,
103
- ) => {
104
- const result: DxGridAxisMeta = { grid: {} };
105
- for (let row = 0; row < queueMap.length; row++) {
106
- await yieldOrContinue('smooth', signal);
107
- const [blockIndex, segmentIndex] = queueMap[row];
108
- if (segmentIndex < 0) {
109
- result.grid[row] = { size: lineHeight + cellSpacing };
110
- } else {
111
- host.textContent = blocks[blockIndex]!.segments[segmentIndex]!.text;
112
- result.grid[row] = { size: host.offsetHeight };
113
- }
114
- }
115
- return result;
116
- };
117
-
118
- export type TranscriptViewProps = ThemedClassName<{
119
- blocks?: TranscriptBlock[];
120
- attendableId?: string;
121
- ignoreAttention?: boolean;
122
- }>;
123
-
124
- /**
125
- * @@deprecated
126
- */
127
- export const Transcript: FC<TranscriptViewProps> = ({ classNames, blocks, attendableId, ignoreAttention }) => {
128
- const { t } = useTranslation(meta.id);
129
- const [dxGrid, setDxGrid] = useState<DxGridElement | null>(null);
130
- const [rows, setRows] = useState<DxGridAxisMeta | undefined>(undefined);
131
- const [columns, setColumns] = useState<DxGridAxisMeta | undefined>(undefined);
132
-
133
- const queueMap = useMemo(() => mapTranscriptQueue(blocks), [blocks]);
134
-
135
- const { hasAttention } = useAttention(attendableId);
136
- const [autoScroll, setAutoScroll] = useState(true);
137
- const handleWheel = useCallback(
138
- (event: WheelEvent) => {
139
- setAutoScroll(false);
140
- if (!ignoreAttention && !hasAttention) {
141
- event.stopPropagation();
142
- }
143
- },
144
- [hasAttention, ignoreAttention],
145
- );
146
-
147
- const abortControllerRef = useRef<AbortController>(null);
148
-
149
- const handleResize = useCallback(
150
- async ({ entry }: { entry: { target: HTMLDivElement } | null }) => {
151
- if (entry?.target && Array.isArray(blocks) && blocks[0] && queueMap) {
152
- abortControllerRef.current?.abort();
153
- abortControllerRef.current = new AbortController();
154
- setColumns({ grid: { 0: { size: timestampColumnWidth }, 1: { size: entry.target.offsetWidth } } });
155
- return measureRows(entry.target, blocks, queueMap, abortControllerRef.current.signal)
156
- .then(setRows)
157
- .catch(() => {
158
- // Aborted mid-measurement by new size.
159
- });
160
- }
161
- },
162
- [blocks, queueMap],
163
- );
164
-
165
- const { width, ref: measureRef } = useResizeDetector({
166
- onResize: handleResize as OnResizeCallback,
167
- refreshOptions: { leading: true },
168
- });
169
-
170
- useEffect(() => {
171
- if (queueMap.length !== Object.keys(rows?.grid ?? {}).length) {
172
- void handleResize({ entry: { target: measureRef.current } }).then(() => {
173
- if (autoScroll) {
174
- // TODO(thure): Implement a deterministic way to do this when `rows` has fully settled and grid has a new `maxPosBlock`.
175
- setTimeout(() => dxGrid?.scrollToEndRow(), 50);
176
- }
177
- });
178
- }
179
- }, [blocks, queueMap, width, autoScroll]);
180
-
181
- useEffect(() => {
182
- if (dxGrid && Array.isArray(blocks) && blocks[0]) {
183
- const transcriptStart = blocks[0]!.segments[0]!.started;
184
- dxGrid.getCells = (range, plane) => {
185
- switch (plane) {
186
- case 'grid': {
187
- const cells: DxGridPlaneCells = {};
188
- for (let row = range.start.row; row <= range.end.row && row < queueMap.length; row++) {
189
- const [blockIndex, segmentIndex] = queueMap[row];
190
-
191
- cells[toPlaneCellIndex({ col: 0, row })] = {
192
- readonly: true,
193
- value:
194
- segmentIndex < 0
195
- ? formatTimestamp(
196
- new Date(transcriptStart),
197
- new Date(blocks[blockIndex]!.segments[Math.max(0, segmentIndex)]!.started),
198
- )
199
- : '',
200
- className: timestampClasses,
201
- } satisfies DxGridCellValue;
202
-
203
- cells[toPlaneCellIndex({ col: 1, row })] = (
204
- segmentIndex < 0
205
- ? {
206
- readonly: true,
207
- accessoryHtml: `<span data-hue="${blocks[blockIndex]!.authorHue}" class="dx-text-hue">${blocks[blockIndex]!.authorName}</span>`,
208
- className: authorClasses,
209
- }
210
- : {
211
- readonly: true,
212
- value: blocks[blockIndex]!.segments[segmentIndex]!.text,
213
- className: segmentTextClasses,
214
- }
215
- ) satisfies DxGridCellValue;
216
- }
217
- return cells;
218
- }
219
- default:
220
- return {};
221
- }
222
- };
223
- }
224
- }, [dxGrid, blocks]);
225
-
226
- const handleScrollToEnd = useCallback(() => {
227
- setAutoScroll(true);
228
- dxGrid?.scrollToEndRow();
229
- }, [dxGrid, autoScroll]);
230
-
231
- return (
232
- <div role='none' className={mx('relative min-bs-0', classNames)}>
233
- <Grid.Root id={`${attendableId}--transcript`}>
234
- <Grid.Content
235
- limitColumns={2}
236
- limitRows={queueMap.length}
237
- columns={columns}
238
- rows={rows}
239
- rowDefault={rowDefault}
240
- onWheel={handleWheel}
241
- className='[--dx-grid-base:var(--dx-baseSurface)] [--dx-grid-lines:var(--dx-baseSurface)] [&_.dx-grid]:min-bs-0 [&_.dx-grid]:min-is-0 [&_.dx-grid]:select-auto'
242
- ref={setDxGrid}
243
- />
244
- </Grid.Root>
245
- <div role='none' {...{ inert: true }} aria-hidden className={measureClasses} ref={measureRef} />
246
- <IconButton
247
- icon='ph--arrow-line-down--regular'
248
- iconOnly
249
- label={t('scroll to end label')}
250
- tooltipSide='left'
251
- data-state={autoScroll ? 'invisible' : 'visible'}
252
- classNames={[
253
- 'absolute inline-end-2 block-end-2 opacity-0 pointer-events-none',
254
- 'data-[state="visible"]:pointer-events-auto data-[state="visible"]:opacity-100 transition-opacity',
255
- ]}
256
- onClick={handleScrollToEnd}
257
- />
258
- </div>
259
- );
260
- };
@@ -1,36 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import React from 'react';
6
-
7
- import { fullyQualifiedId, getSpace } from '@dxos/client/echo';
8
- import { useMembers, useQueue } from '@dxos/react-client/echo';
9
- import { StackItem } from '@dxos/react-ui-stack';
10
- import { type DataType } from '@dxos/schema';
11
-
12
- import { useQueueModelAdapter } from '../hooks';
13
- import { type Transcript } from '../types';
14
-
15
- import { TranscriptView, renderByline } from './Transcript';
16
-
17
- export type TranscriptionContainerProps = {
18
- role: string;
19
- transcript: Transcript.Transcript;
20
- };
21
-
22
- export const TranscriptionContainer = ({ transcript }: TranscriptionContainerProps) => {
23
- const attendableId = fullyQualifiedId(transcript);
24
- const space = getSpace(transcript);
25
- const members = useMembers(space?.key).map((member) => member.identity);
26
- const queue = useQueue<DataType.Message>(transcript.queue.dxn, { pollInterval: 1_000 });
27
- const model = useQueueModelAdapter(renderByline(members), queue);
28
-
29
- return (
30
- <StackItem.Content>
31
- <TranscriptView attendableId={attendableId} space={space} model={model} transcript={transcript} />
32
- </StackItem.Content>
33
- );
34
- };
35
-
36
- export default TranscriptionContainer;