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

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 (251) hide show
  1. package/dist/lib/browser/{TranscriptContainer-CXA4ZBHW.mjs → TranscriptContainer-JQ3HFHLQ.mjs} +2 -3
  2. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs +191 -0
  3. package/dist/lib/browser/app-graph-builder-VDQOVX7P.mjs.map +7 -0
  4. package/dist/lib/browser/chunk-G4B6CPC2.mjs +253 -0
  5. package/dist/lib/browser/chunk-G4B6CPC2.mjs.map +7 -0
  6. package/dist/lib/browser/{chunk-KLD7O5GJ.mjs → chunk-GU2BNYKZ.mjs} +12 -2
  7. package/dist/lib/browser/chunk-GU2BNYKZ.mjs.map +7 -0
  8. package/dist/lib/browser/chunk-K7FOYAXO.mjs +8 -0
  9. package/dist/lib/browser/chunk-K7FOYAXO.mjs.map +7 -0
  10. package/dist/lib/browser/chunk-OGNXNGJB.mjs +73 -0
  11. package/dist/lib/browser/chunk-OGNXNGJB.mjs.map +7 -0
  12. package/dist/lib/browser/{chunk-3TKXI6TQ.mjs → chunk-YCZISX63.mjs} +81 -108
  13. package/dist/lib/browser/chunk-YCZISX63.mjs.map +7 -0
  14. package/dist/lib/browser/{chunk-LTIQFX4W.mjs → chunk-YEPT334A.mjs} +1 -1
  15. package/dist/lib/browser/chunk-YEPT334A.mjs.map +7 -0
  16. package/dist/lib/browser/index.mjs +210 -47
  17. package/dist/lib/browser/index.mjs.map +4 -4
  18. package/dist/lib/browser/{intent-resolver-DZ62CJPC.mjs → intent-resolver-4R66ZCKT.mjs} +8 -8
  19. package/dist/lib/browser/intent-resolver-4R66ZCKT.mjs.map +7 -0
  20. package/dist/lib/browser/{meeting-transcription-state-MNA2XROE.mjs → meeting-transcription-state-DLFHQK72.mjs} +4 -4
  21. package/dist/lib/browser/meeting-transcription-state-DLFHQK72.mjs.map +7 -0
  22. package/dist/lib/browser/meta.json +1 -1
  23. package/dist/lib/browser/{react-surface-PUXZNAZL.mjs → react-surface-FQUHU5G7.mjs} +6 -18
  24. package/dist/lib/browser/react-surface-FQUHU5G7.mjs.map +7 -0
  25. package/dist/lib/browser/{transcriber-YWWIV6KP.mjs → transcriber-LGMIWDYI.mjs} +7 -8
  26. package/dist/lib/browser/{transcriber-YWWIV6KP.mjs.map → transcriber-LGMIWDYI.mjs.map} +3 -3
  27. package/dist/lib/browser/types/index.mjs +3 -3
  28. package/dist/lib/node/{TranscriptContainer-SSJVLRM6.cjs → TranscriptContainer-QEYTTT2V.cjs} +7 -8
  29. package/dist/lib/node/TranscriptContainer-QEYTTT2V.cjs.map +7 -0
  30. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs +200 -0
  31. package/dist/lib/node/app-graph-builder-IFSIVNUR.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-J72PUQ3C.cjs → chunk-3KHUSQNW.cjs} +15 -6
  33. package/dist/lib/node/chunk-3KHUSQNW.cjs.map +7 -0
  34. package/dist/lib/node/{chunk-JUGOXWES.cjs → chunk-CZMLKKWT.cjs} +4 -4
  35. package/dist/lib/node/chunk-CZMLKKWT.cjs.map +7 -0
  36. package/dist/lib/node/{chunk-WKZLGVEJ.cjs → chunk-FCCJALOT.cjs} +83 -111
  37. package/dist/lib/node/chunk-FCCJALOT.cjs.map +7 -0
  38. package/dist/lib/node/{chunk-L27AK6FQ.cjs → chunk-LP4FG423.cjs} +8 -23
  39. package/dist/lib/node/chunk-LP4FG423.cjs.map +7 -0
  40. package/dist/lib/node/{chunk-EJWB53WK.cjs → chunk-P4VVD6ZO.cjs} +34 -24
  41. package/dist/lib/node/chunk-P4VVD6ZO.cjs.map +7 -0
  42. package/dist/lib/node/chunk-UOFHT4GZ.cjs +280 -0
  43. package/dist/lib/node/chunk-UOFHT4GZ.cjs.map +7 -0
  44. package/dist/lib/node/index.cjs +238 -66
  45. package/dist/lib/node/index.cjs.map +4 -4
  46. package/dist/lib/node/{intent-resolver-TRBKI24D.cjs → intent-resolver-WMMCOUEH.cjs} +10 -11
  47. package/dist/lib/node/intent-resolver-WMMCOUEH.cjs.map +7 -0
  48. package/dist/lib/node/{meeting-transcription-state-5XLTMWPA.cjs → meeting-transcription-state-URIYILEQ.cjs} +7 -7
  49. package/dist/lib/node/meeting-transcription-state-URIYILEQ.cjs.map +7 -0
  50. package/dist/lib/node/meta.json +1 -1
  51. package/dist/lib/node/{react-surface-SZAMHCX7.cjs → react-surface-WI2MGWCC.cjs} +10 -20
  52. package/dist/lib/node/react-surface-WI2MGWCC.cjs.map +7 -0
  53. package/dist/lib/node/{transcriber-AFUXFHCR.cjs → transcriber-QG5WPKX4.cjs} +13 -14
  54. package/dist/lib/node/{transcriber-AFUXFHCR.cjs.map → transcriber-QG5WPKX4.cjs.map} +3 -3
  55. package/dist/lib/node/types/index.cjs +8 -8
  56. package/dist/lib/node/types/index.cjs.map +1 -1
  57. package/dist/lib/node-esm/{TranscriptContainer-M53LI2TX.mjs → TranscriptContainer-ZXUCOWGY.mjs} +2 -3
  58. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs +192 -0
  59. package/dist/lib/node-esm/app-graph-builder-UL6XLIZY.mjs.map +7 -0
  60. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs +254 -0
  61. package/dist/lib/node-esm/chunk-6X7X2UZF.mjs.map +7 -0
  62. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs +74 -0
  63. package/dist/lib/node-esm/chunk-GIO6J6FE.mjs.map +7 -0
  64. package/dist/lib/node-esm/{chunk-QMHMEKB3.mjs → chunk-HKATMD34.mjs} +12 -2
  65. package/dist/lib/node-esm/chunk-HKATMD34.mjs.map +7 -0
  66. package/dist/lib/node-esm/chunk-J4D2RBBH.mjs +10 -0
  67. package/dist/lib/node-esm/chunk-J4D2RBBH.mjs.map +7 -0
  68. package/dist/lib/node-esm/{chunk-5E2MR5XK.mjs → chunk-PTZHDZ36.mjs} +1 -1
  69. package/dist/lib/node-esm/chunk-PTZHDZ36.mjs.map +7 -0
  70. package/dist/lib/node-esm/{chunk-V5IWBPYO.mjs → chunk-YQYBLFNI.mjs} +81 -108
  71. package/dist/lib/node-esm/chunk-YQYBLFNI.mjs.map +7 -0
  72. package/dist/lib/node-esm/index.mjs +210 -47
  73. package/dist/lib/node-esm/index.mjs.map +4 -4
  74. package/dist/lib/node-esm/{intent-resolver-HFVAL274.mjs → intent-resolver-QN2LO5TX.mjs} +8 -8
  75. package/dist/lib/node-esm/intent-resolver-QN2LO5TX.mjs.map +7 -0
  76. package/dist/lib/node-esm/{meeting-transcription-state-3WOZ52BQ.mjs → meeting-transcription-state-ZYVRAW6Y.mjs} +4 -4
  77. package/dist/lib/node-esm/meeting-transcription-state-ZYVRAW6Y.mjs.map +7 -0
  78. package/dist/lib/node-esm/meta.json +1 -1
  79. package/dist/lib/node-esm/{react-surface-UEJELL7I.mjs → react-surface-PCH6NTVB.mjs} +6 -18
  80. package/dist/lib/node-esm/react-surface-PCH6NTVB.mjs.map +7 -0
  81. package/dist/lib/node-esm/{transcriber-7RJEFPDI.mjs → transcriber-TMPYZ5L4.mjs} +7 -8
  82. package/dist/lib/node-esm/{transcriber-7RJEFPDI.mjs.map → transcriber-TMPYZ5L4.mjs.map} +3 -3
  83. package/dist/lib/node-esm/types/index.mjs +3 -3
  84. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  85. package/dist/types/src/capabilities/app-graph-builder.d.ts +179 -2
  86. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  87. package/dist/types/src/capabilities/capabilities.d.ts +7 -5
  88. package/dist/types/src/capabilities/capabilities.d.ts.map +1 -1
  89. package/dist/types/src/capabilities/index.d.ts +182 -4
  90. package/dist/types/src/capabilities/index.d.ts.map +1 -1
  91. package/dist/types/src/capabilities/intent-resolver.d.ts +2 -2
  92. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  93. package/dist/types/src/capabilities/meeting-transcription-state.d.ts +4 -2
  94. package/dist/types/src/capabilities/meeting-transcription-state.d.ts.map +1 -1
  95. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -1
  96. package/dist/types/src/capabilities/transcriber.d.ts.map +1 -1
  97. package/dist/types/src/components/Transcript/Transcript.d.ts +4 -14
  98. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  99. package/dist/types/src/components/Transcript/Transcript.stories.d.ts +4 -19
  100. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  101. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  102. package/dist/types/src/components/index.d.ts +0 -1
  103. package/dist/types/src/components/index.d.ts.map +1 -1
  104. package/dist/types/src/components/transcription.stories.d.ts +3 -6
  105. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  106. package/dist/types/src/hooks/index.d.ts +0 -1
  107. package/dist/types/src/hooks/index.d.ts.map +1 -1
  108. package/dist/types/src/hooks/useAudioFile.d.ts.map +1 -1
  109. package/dist/types/src/hooks/useAudioTrack.d.ts.map +1 -1
  110. package/dist/types/src/hooks/useTranscriber.d.ts +1 -1
  111. package/dist/types/src/hooks/useTranscriber.d.ts.map +1 -1
  112. package/dist/types/src/hooks/useVoiceInput.d.ts.map +1 -1
  113. package/dist/types/src/transcriber/transcriber.d.ts +2 -2
  114. package/dist/types/src/transcriber/transcriber.d.ts.map +1 -1
  115. package/dist/types/src/transcriber/transcriber.test.d.ts +2 -0
  116. package/dist/types/src/transcriber/transcriber.test.d.ts.map +1 -0
  117. package/dist/types/src/transcriber/transcription-manager.d.ts +15 -17
  118. package/dist/types/src/transcriber/transcription-manager.d.ts.map +1 -1
  119. package/dist/types/src/translations.d.ts +18 -3
  120. package/dist/types/src/translations.d.ts.map +1 -1
  121. package/dist/types/src/types/schema.d.ts +40 -26
  122. package/dist/types/src/types/schema.d.ts.map +1 -1
  123. package/dist/types/src/types/types.d.ts +7 -18
  124. package/dist/types/src/types/types.d.ts.map +1 -1
  125. package/dist/types/src/util/array.d.ts.map +1 -1
  126. package/dist/types/src/util/get-time-str.d.ts.map +1 -1
  127. package/dist/types/src/util/index.d.ts +1 -0
  128. package/dist/types/src/util/index.d.ts.map +1 -1
  129. package/dist/types/src/util/monitor-audio-level.d.ts.map +1 -1
  130. package/dist/types/src/util/random-queue-dxn.d.ts +3 -0
  131. package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -0
  132. package/dist/types/tsconfig.tsbuildinfo +1 -1
  133. package/package.json +40 -57
  134. package/src/TranscriptionPlugin.tsx +13 -30
  135. package/src/capabilities/app-graph-builder.ts +111 -192
  136. package/src/capabilities/capabilities.ts +3 -4
  137. package/src/capabilities/index.ts +0 -1
  138. package/src/capabilities/intent-resolver.ts +7 -8
  139. package/src/capabilities/meeting-transcription-state.ts +2 -2
  140. package/src/capabilities/react-surface.tsx +4 -12
  141. package/src/capabilities/transcriber.ts +1 -2
  142. package/src/components/Transcript/Transcript.stories.tsx +43 -201
  143. package/src/components/Transcript/Transcript.tsx +208 -83
  144. package/src/components/TranscriptContainer.tsx +6 -11
  145. package/src/components/index.ts +0 -1
  146. package/src/components/transcription.stories.tsx +65 -164
  147. package/src/hooks/index.ts +0 -1
  148. package/src/hooks/useTranscriber.ts +2 -3
  149. package/src/transcriber/{transcriber.browser.test.ts → transcriber.test.ts} +3 -3
  150. package/src/transcriber/transcriber.ts +11 -20
  151. package/src/transcriber/transcription-manager.ts +58 -67
  152. package/src/translations.ts +0 -2
  153. package/src/types/schema.ts +32 -11
  154. package/src/types/types.ts +9 -19
  155. package/src/util/index.ts +1 -0
  156. package/src/util/random-queue-dxn.ts +9 -0
  157. package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs +0 -351
  158. package/dist/lib/browser/app-graph-builder-REQZ5SC5.mjs.map +0 -7
  159. package/dist/lib/browser/chunk-3TKXI6TQ.mjs.map +0 -7
  160. package/dist/lib/browser/chunk-JHWEZRWC.mjs +0 -63
  161. package/dist/lib/browser/chunk-JHWEZRWC.mjs.map +0 -7
  162. package/dist/lib/browser/chunk-K2LS2QOM.mjs +0 -720
  163. package/dist/lib/browser/chunk-K2LS2QOM.mjs.map +0 -7
  164. package/dist/lib/browser/chunk-KLD7O5GJ.mjs.map +0 -7
  165. package/dist/lib/browser/chunk-LCTMCTYY.mjs +0 -27
  166. package/dist/lib/browser/chunk-LCTMCTYY.mjs.map +0 -7
  167. package/dist/lib/browser/chunk-LTIQFX4W.mjs.map +0 -7
  168. package/dist/lib/browser/intent-resolver-DZ62CJPC.mjs.map +0 -7
  169. package/dist/lib/browser/meeting-transcription-state-MNA2XROE.mjs.map +0 -7
  170. package/dist/lib/browser/react-surface-PUXZNAZL.mjs.map +0 -7
  171. package/dist/lib/browser/settings-JWDS4J3F.mjs +0 -24
  172. package/dist/lib/browser/settings-JWDS4J3F.mjs.map +0 -7
  173. package/dist/lib/node/TranscriptContainer-SSJVLRM6.cjs.map +0 -7
  174. package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs +0 -352
  175. package/dist/lib/node/app-graph-builder-OAPU4GDH.cjs.map +0 -7
  176. package/dist/lib/node/chunk-EJWB53WK.cjs.map +0 -7
  177. package/dist/lib/node/chunk-EVE3H46F.cjs +0 -737
  178. package/dist/lib/node/chunk-EVE3H46F.cjs.map +0 -7
  179. package/dist/lib/node/chunk-J72PUQ3C.cjs.map +0 -7
  180. package/dist/lib/node/chunk-JUGOXWES.cjs.map +0 -7
  181. package/dist/lib/node/chunk-L27AK6FQ.cjs.map +0 -7
  182. package/dist/lib/node/chunk-WKZLGVEJ.cjs.map +0 -7
  183. package/dist/lib/node/intent-resolver-TRBKI24D.cjs.map +0 -7
  184. package/dist/lib/node/meeting-transcription-state-5XLTMWPA.cjs.map +0 -7
  185. package/dist/lib/node/react-surface-SZAMHCX7.cjs.map +0 -7
  186. package/dist/lib/node/settings-AWWMOSCV.cjs +0 -38
  187. package/dist/lib/node/settings-AWWMOSCV.cjs.map +0 -7
  188. package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs +0 -352
  189. package/dist/lib/node-esm/app-graph-builder-UBP6EOBR.mjs.map +0 -7
  190. package/dist/lib/node-esm/chunk-4KC3E5T4.mjs +0 -721
  191. package/dist/lib/node-esm/chunk-4KC3E5T4.mjs.map +0 -7
  192. package/dist/lib/node-esm/chunk-5E2MR5XK.mjs.map +0 -7
  193. package/dist/lib/node-esm/chunk-MHQP2PAF.mjs +0 -28
  194. package/dist/lib/node-esm/chunk-MHQP2PAF.mjs.map +0 -7
  195. package/dist/lib/node-esm/chunk-QMHMEKB3.mjs.map +0 -7
  196. package/dist/lib/node-esm/chunk-QYG2FOXA.mjs +0 -64
  197. package/dist/lib/node-esm/chunk-QYG2FOXA.mjs.map +0 -7
  198. package/dist/lib/node-esm/chunk-V5IWBPYO.mjs.map +0 -7
  199. package/dist/lib/node-esm/intent-resolver-HFVAL274.mjs.map +0 -7
  200. package/dist/lib/node-esm/meeting-transcription-state-3WOZ52BQ.mjs.map +0 -7
  201. package/dist/lib/node-esm/react-surface-UEJELL7I.mjs.map +0 -7
  202. package/dist/lib/node-esm/settings-QFNFGFJ5.mjs +0 -25
  203. package/dist/lib/node-esm/settings-QFNFGFJ5.mjs.map +0 -7
  204. package/dist/types/src/capabilities/settings.d.ts +0 -4
  205. package/dist/types/src/capabilities/settings.d.ts.map +0 -1
  206. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts +0 -27
  207. package/dist/types/src/components/Transcript/deprecated/OldTranscript.d.ts.map +0 -1
  208. package/dist/types/src/components/Transcript/transcript-extension.d.ts +0 -19
  209. package/dist/types/src/components/Transcript/transcript-extension.d.ts.map +0 -1
  210. package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts +0 -6
  211. package/dist/types/src/components/TranscriptionSettings/TranscriptionSettings.d.ts.map +0 -1
  212. package/dist/types/src/components/TranscriptionSettings/index.d.ts +0 -2
  213. package/dist/types/src/components/TranscriptionSettings/index.d.ts.map +0 -1
  214. package/dist/types/src/entity-extraction/entity-extraction.d.ts +0 -42
  215. package/dist/types/src/entity-extraction/entity-extraction.d.ts.map +0 -1
  216. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts +0 -2
  217. package/dist/types/src/entity-extraction/entity-extraction.test.d.ts.map +0 -1
  218. package/dist/types/src/entity-extraction/index.d.ts +0 -2
  219. package/dist/types/src/entity-extraction/index.d.ts.map +0 -1
  220. package/dist/types/src/hooks/useQueueModelAdapter.d.ts +0 -7
  221. package/dist/types/src/hooks/useQueueModelAdapter.d.ts.map +0 -1
  222. package/dist/types/src/model/index.d.ts +0 -2
  223. package/dist/types/src/model/index.d.ts.map +0 -1
  224. package/dist/types/src/model/model.d.ts +0 -68
  225. package/dist/types/src/model/model.d.ts.map +0 -1
  226. package/dist/types/src/model/model.test.d.ts +0 -2
  227. package/dist/types/src/model/model.test.d.ts.map +0 -1
  228. package/dist/types/src/testing/index.d.ts +0 -2
  229. package/dist/types/src/testing/index.d.ts.map +0 -1
  230. package/dist/types/src/testing/testing.d.ts +0 -40
  231. package/dist/types/src/testing/testing.d.ts.map +0 -1
  232. package/dist/types/src/transcriber/transcriber.browser.test.d.ts +0 -2
  233. package/dist/types/src/transcriber/transcriber.browser.test.d.ts.map +0 -1
  234. package/src/capabilities/settings.ts +0 -20
  235. package/src/components/Transcript/deprecated/OldTranscript.tsx +0 -260
  236. package/src/components/Transcript/transcript-extension.ts +0 -236
  237. package/src/components/TranscriptionSettings/TranscriptionSettings.tsx +0 -26
  238. package/src/components/TranscriptionSettings/index.ts +0 -5
  239. package/src/entity-extraction/entity-extraction.test.ts +0 -97
  240. package/src/entity-extraction/entity-extraction.ts +0 -149
  241. package/src/entity-extraction/index.ts +0 -5
  242. package/src/entity-extraction/system-prompt.tpl +0 -38
  243. package/src/entity-extraction/types.d.ts +0 -8
  244. package/src/hooks/useQueueModelAdapter.ts +0 -63
  245. package/src/model/index.ts +0 -5
  246. package/src/model/model.test.ts +0 -169
  247. package/src/model/model.ts +0 -229
  248. package/src/testing/index.ts +0 -5
  249. package/src/testing/testing.ts +0 -216
  250. /package/dist/lib/browser/{TranscriptContainer-CXA4ZBHW.mjs.map → TranscriptContainer-JQ3HFHLQ.mjs.map} +0 -0
  251. /package/dist/lib/node-esm/{TranscriptContainer-M53LI2TX.mjs.map → TranscriptContainer-ZXUCOWGY.mjs.map} +0 -0
@@ -16,148 +16,84 @@ import React, {
16
16
  useState,
17
17
  } from 'react';
18
18
 
19
- import { Events, IntentPlugin, SettingsPlugin } from '@dxos/app-framework';
20
- import { withPluginManager } from '@dxos/app-framework/testing';
21
- import { AIServiceEdgeClient } from '@dxos/assistant';
22
- import { AI_SERVICE_ENDPOINT } from '@dxos/assistant/testing';
23
- import { Filter, MemoryQueue } from '@dxos/echo-db';
24
- import { create, createQueueDxn } from '@dxos/echo-schema';
19
+ import { createStatic } from '@dxos/echo-schema';
25
20
  import { type DXN } from '@dxos/keys';
26
21
  import { log } from '@dxos/log';
27
- import { ClientPlugin } from '@dxos/plugin-client';
28
- import { PreviewPlugin } from '@dxos/plugin-preview';
29
- import { SpacePlugin } from '@dxos/plugin-space';
30
- import { StorybookLayoutPlugin } from '@dxos/plugin-storybook-layout';
31
- import { ThemePlugin } from '@dxos/plugin-theme';
32
- import { useQueue, useSpace } from '@dxos/react-client/echo';
22
+ import { Config } from '@dxos/react-client';
23
+ import { useQueue } from '@dxos/react-client/echo';
24
+ import { withClientProvider } from '@dxos/react-client/testing';
33
25
  import { IconButton, Toolbar } from '@dxos/react-ui';
34
26
  import { ScrollContainer } from '@dxos/react-ui-components';
35
- import { defaultTx } from '@dxos/react-ui-theme';
36
- import { DataType } from '@dxos/schema';
37
- import { seedTestData, Testing } from '@dxos/schema/testing';
38
27
  import { withLayout, withTheme } from '@dxos/storybook-utils';
39
28
 
40
- import { renderMarkdown, Transcript } from './Transcript';
41
- import { TranscriptionPlugin } from '../TranscriptionPlugin';
42
- import { processTranscriptMessage } from '../entity-extraction';
43
- import { useAudioFile, useAudioTrack, useQueueModelAdapter, useTranscriber } from '../hooks';
44
- import { type SerializationModel } from '../model';
45
- import { TestItem } from '../testing';
29
+ import { Transcript } from './Transcript';
30
+ import { useAudioFile, useAudioTrack, useTranscriber } from '../hooks';
46
31
  import { type TranscriberParams } from '../transcriber';
32
+ import { TranscriptBlock } from '../types';
33
+ import { randomQueueDxn } from '../util';
47
34
 
48
35
  const TranscriptionStory: FC<{
49
- model: SerializationModel<DataType.Message>;
50
- running: boolean;
51
- onRunningChange: Dispatch<SetStateAction<boolean>>;
52
- }> = ({ model, running, onRunningChange }) => {
53
- const space = useSpace();
54
-
36
+ playing: boolean;
37
+ setPlaying: Dispatch<SetStateAction<boolean>>;
38
+ blocks?: TranscriptBlock[];
39
+ }> = ({ playing, setPlaying, blocks }) => {
55
40
  return (
56
41
  <div className='flex flex-col w-[30rem]'>
57
42
  <Toolbar.Root>
58
43
  <IconButton
59
44
  iconOnly
60
- icon={running ? 'ph--pause--regular' : 'ph--play--regular'}
61
- label={running ? 'Pause' : 'Play'}
62
- onClick={() => onRunningChange((running) => !running)}
45
+ icon={playing ? 'ph--pause--regular' : 'ph--play--regular'}
46
+ label={playing ? 'Pause' : 'Play'}
47
+ onClick={() => setPlaying((playing) => !playing)}
63
48
  />
64
49
  </Toolbar.Root>
65
50
  <ScrollContainer>
66
- <Transcript space={space} model={model} attendableId='story' />
51
+ <Transcript blocks={blocks} attendableId='story' />
67
52
  </ScrollContainer>
68
53
  </div>
69
54
  );
70
55
  };
71
56
 
72
- const aiService = new AIServiceEdgeClient({
73
- endpoint: AI_SERVICE_ENDPOINT.REMOTE,
74
- });
75
-
76
- const Microphone = ({ entityExtraction }: { entityExtraction?: boolean }) => {
77
- const [running, setRunning] = useState(false);
57
+ const Microphone = () => {
58
+ const [playing, setPlaying] = useState(false);
78
59
 
79
60
  // Audio.
80
- const track = useAudioTrack(running);
61
+ const track = useAudioTrack(playing);
81
62
 
82
63
  // Queue.
83
- const queueDxn = useMemo(() => createQueueDxn(), []);
84
- const queue = useMemo(() => new MemoryQueue<DataType.Message>(queueDxn), [queueDxn]);
85
- const model = useQueueModelAdapter(renderMarkdown([]), queue);
86
- const space = useSpace();
64
+ const queueDxn = useMemo(() => randomQueueDxn(), []);
65
+ const queue = useQueue<TranscriptBlock>(queueDxn, { pollInterval: 500 });
87
66
 
88
67
  // Transcriber.
89
68
  const handleSegments = useCallback<TranscriberParams['onSegments']>(
90
- async (blocks) => {
91
- const message = create(DataType.Message, { sender: { name: 'You' }, created: new Date().toISOString(), blocks });
92
-
93
- if (entityExtraction) {
94
- if (!space) {
95
- log.warn('no space');
96
- return;
97
- }
98
- // TODO(dmaretskyi): Move to vector search index.
99
- const { objects } = await space.db
100
- .query(
101
- Filter.or(
102
- Filter.type(DataType.Person),
103
- Filter.type(DataType.Organization),
104
- Filter.type(Testing.DocumentType),
105
- ),
106
- )
107
- .run();
108
-
109
- log.info('context', { objects });
110
-
111
- const result = await processTranscriptMessage({
112
- message,
113
- aiService,
114
- context: {
115
- objects,
116
- },
117
- options: {
118
- fallbackToRaw: true,
119
- },
120
- });
121
- void queue.append([result.message]);
122
- } else {
123
- void queue.append([message]);
124
- }
69
+ async (segments) => {
70
+ const block = createStatic(TranscriptBlock, { segments });
71
+ queue?.append([block]);
125
72
  },
126
- [queue, space],
73
+ [queue],
127
74
  );
128
-
129
- const config = useRef<TranscriberParams['config']>({
130
- transcribeAfterChunksAmount: 20,
131
- prefixBufferChunksAmount: 5,
132
- });
133
-
134
- const transcriber = useTranscriber({
135
- audioStreamTrack: track,
136
- onSegments: handleSegments,
137
- config: config.current,
138
- });
139
- const [isOpen, setIsOpen] = useState(false);
75
+ const transcriber = useTranscriber({ audioStreamTrack: track, onSegments: handleSegments });
140
76
  useEffect(() => {
141
- void transcriber?.open().then(() => setIsOpen(true));
77
+ void transcriber?.open();
142
78
  return () => {
143
- void transcriber?.close().then(() => setIsOpen(false));
79
+ void transcriber?.close();
144
80
  };
145
81
  }, [transcriber]);
146
82
 
147
83
  // Manage transcription state.
148
84
  useEffect(() => {
149
- if (running && transcriber?.isOpen) {
150
- transcriber?.startChunksRecording();
151
- } else if (!running) {
152
- transcriber?.stopChunksRecording();
85
+ if (playing && transcriber?.isOpen) {
86
+ void transcriber?.startChunksRecording();
87
+ } else if (!playing) {
88
+ void transcriber?.stopChunksRecording();
153
89
  }
154
- }, [transcriber, running, isOpen]);
90
+ }, [transcriber, playing, transcriber?.isOpen]);
155
91
 
156
- return <TranscriptionStory model={model} running={running} onRunningChange={setRunning} />;
92
+ return <TranscriptionStory playing={playing} setPlaying={setPlaying} blocks={queue?.items} />;
157
93
  };
158
94
 
159
95
  const AudioFile = ({ queueDxn, audioUrl }: { queueDxn: DXN; audioUrl: string; transcriptUrl: string }) => {
160
- const [running, setRunning] = useState(false);
96
+ const [playing, setPlaying] = useState(false);
161
97
 
162
98
  // Audio.
163
99
  const audioElement = useRef<HTMLAudioElement>(null);
@@ -174,20 +110,19 @@ const AudioFile = ({ queueDxn, audioUrl }: { queueDxn: DXN; audioUrl: string; tr
174
110
  return;
175
111
  }
176
112
 
177
- if (running) {
113
+ if (playing) {
178
114
  void audio.play();
179
115
  } else {
180
116
  void audio.pause();
181
117
  }
182
- }, [audio, running]);
118
+ }, [audio, playing]);
183
119
 
184
120
  // Transcriber.
185
- const queue = useQueue<DataType.Message>(queueDxn, { pollInterval: 500 });
186
- const model = useQueueModelAdapter(renderMarkdown([]), queue);
121
+ const queue = useQueue<TranscriptBlock>(queueDxn, { pollInterval: 500 });
187
122
  const handleSegments = useCallback<TranscriberParams['onSegments']>(
188
- async (blocks) => {
189
- const message = create(DataType.Message, { sender: { name: 'You' }, created: new Date().toISOString(), blocks });
190
- void queue?.append([message]);
123
+ async (segments) => {
124
+ const block = createStatic(TranscriptBlock, { authorName: 'test', authorHue: 'cyan', segments });
125
+ queue?.append([block]);
191
126
  },
192
127
  [queue],
193
128
  );
@@ -198,15 +133,15 @@ const AudioFile = ({ queueDxn, audioUrl }: { queueDxn: DXN; audioUrl: string; tr
198
133
  });
199
134
 
200
135
  useEffect(() => {
201
- if (transcriber && running) {
202
- void transcriber.open().then(manageChunkRecording);
203
- } else if (!running) {
136
+ if (transcriber && playing) {
137
+ void transcriber.open();
138
+ } else if (!playing) {
204
139
  transcriber?.stopChunksRecording();
205
140
  void transcriber?.close();
206
141
  }
207
- }, [transcriber, running]);
142
+ }, [transcriber, playing]);
208
143
 
209
- const manageChunkRecording = () => {
144
+ useEffect(() => {
210
145
  if (track?.readyState === 'live' && transcriber?.isOpen) {
211
146
  log.info('starting transcription');
212
147
  transcriber.startChunksRecording();
@@ -214,80 +149,46 @@ const AudioFile = ({ queueDxn, audioUrl }: { queueDxn: DXN; audioUrl: string; tr
214
149
  log.info('stopping transcription');
215
150
  transcriber.stopChunksRecording();
216
151
  }
217
- };
218
- useEffect(() => {
219
- manageChunkRecording();
220
152
  }, [transcriber, track?.readyState, transcriber?.isOpen]);
221
153
 
222
- return <TranscriptionStory model={model} running={running} onRunningChange={setRunning} />;
154
+ return <TranscriptionStory playing={playing} setPlaying={setPlaying} blocks={queue?.items} />;
223
155
  };
224
156
 
225
157
  const meta: Meta<typeof AudioFile> = {
226
158
  title: 'plugins/plugin-transcription/transcription',
227
159
  decorators: [
228
- withPluginManager({
229
- plugins: [
230
- ThemePlugin({ tx: defaultTx }),
231
- StorybookLayoutPlugin(),
232
- ClientPlugin({
233
- types: [TestItem, DataType.Person, DataType.Organization, Testing.DocumentType],
234
- onClientInitialized: async (_, client) => {
235
- await client.halo.createIdentity();
236
- await client.spaces.waitUntilReady();
237
- await client.spaces.default.waitUntilReady();
238
- await seedTestData(client.spaces.default);
160
+ withClientProvider({
161
+ config: new Config({
162
+ runtime: {
163
+ client: { edgeFeatures: { signaling: true } },
164
+ services: {
165
+ edge: { url: 'https://edge.dxos.workers.dev/' },
166
+ iceProviders: [{ urls: 'https://edge.dxos.workers.dev/ice' }],
239
167
  },
240
- }),
241
- SpacePlugin(),
242
- SettingsPlugin(),
243
- PreviewPlugin(),
244
- IntentPlugin(),
245
- TranscriptionPlugin(),
246
- ],
247
- fireEvents: [Events.SetupAppGraph],
248
- // capabilities: [
249
- // contributes(
250
- // Capabilities.ReactSurface,
251
- // createSurface({
252
- // id: 'preview-test',
253
- // role: 'preview',
254
- // component: ({ data }) => {
255
- // const schema = getSchema(data);
256
- // if (!schema) {
257
- // return null;
258
- // }
259
-
260
- // return <Form schema={schema} values={data} />;
261
- // },
262
- // }),
263
- // ),
264
- // ],
168
+ },
169
+ }),
265
170
  }),
266
171
  withTheme,
267
- withLayout({ fullscreen: true, classNames: 'justify-center' }),
172
+ withLayout({
173
+ tooltips: true,
174
+ fullscreen: true,
175
+ classNames: 'justify-center',
176
+ }),
268
177
  ],
269
178
  };
270
179
 
271
180
  export default meta;
272
181
 
273
- export const Default: StoryObj<typeof Microphone> = {
274
- render: Microphone,
275
- args: {
276
- entityExtraction: false,
277
- },
278
- };
182
+ type Story = StoryObj<typeof AudioFile>;
279
183
 
280
- export const EntityExtraction: StoryObj<typeof Microphone> = {
184
+ export const Default: Story = {
281
185
  render: Microphone,
282
- args: {
283
- entityExtraction: true,
284
- },
285
186
  };
286
187
 
287
- export const File: StoryObj<typeof AudioFile> = {
188
+ export const File: Story = {
288
189
  render: AudioFile,
289
190
  args: {
290
- queueDxn: createQueueDxn(),
191
+ queueDxn: randomQueueDxn(),
291
192
  // https://learnenglish.britishcouncil.org/general-english/audio-zone/living-london
292
193
  transcriptUrl: 'https://dxos.network/audio-london.txt',
293
194
  audioUrl: 'https://dxos.network/audio-london.m4a',
@@ -4,6 +4,5 @@
4
4
 
5
5
  export * from './useAudioFile';
6
6
  export * from './useAudioTrack';
7
- export * from './useQueueModelAdapter';
8
7
  export * from './useTranscriber';
9
8
  export * from './useVoiceInput';
@@ -15,7 +15,6 @@ import { type Transcriber } from '../transcriber';
15
15
  export const useTranscriber = ({
16
16
  audioStreamTrack,
17
17
  onSegments,
18
- config,
19
18
  }: Partial<TranscriptionCapabilities.GetTranscriberProps>) => {
20
19
  const [getTranscriber] = useCapabilities(TranscriptionCapabilities.Transcriber);
21
20
 
@@ -25,8 +24,8 @@ export const useTranscriber = ({
25
24
  return undefined;
26
25
  }
27
26
 
28
- return getTranscriber({ audioStreamTrack, onSegments, config });
29
- }, [audioStreamTrack, onSegments, getTranscriber, config]);
27
+ return getTranscriber({ audioStreamTrack, onSegments });
28
+ }, [audioStreamTrack, onSegments, getTranscriber]);
30
29
 
31
30
  useEffect(() => {
32
31
  return () => {
@@ -9,11 +9,11 @@ import { WaveFile } from 'wavefile';
9
9
 
10
10
  import { Trigger } from '@dxos/async';
11
11
  import { log } from '@dxos/log';
12
- import { type DataType } from '@dxos/schema';
13
12
  import { openAndClose } from '@dxos/test-utils';
14
13
  import { trace, TRACE_PROCESSOR } from '@dxos/tracing';
15
14
 
16
15
  import { type AudioChunk, type AudioRecorder, Transcriber } from '../transcriber';
16
+ import { type TranscriptSegment } from '../types';
17
17
  import { mergeFloat64Arrays } from '../util';
18
18
 
19
19
  // TODO(burdon): ReferenceError: Worker is not defined (Can only run with web workers).
@@ -93,7 +93,7 @@ describe.skip('Transcriber', () => {
93
93
  });
94
94
 
95
95
  test.skip('transcription of audio recording', { timeout: 10_000 }, async () => {
96
- const trigger = new Trigger<DataType.MessageBlock.Transcription[]>({ autoReset: true });
96
+ const trigger = new Trigger<TranscriptSegment[]>({ autoReset: true });
97
97
  const recorder = new MockAudioRecorder({
98
98
  buffer: await readFile('test.wav'),
99
99
  chunkDuration: 3_000,
@@ -127,7 +127,7 @@ describe.skip('Transcriber', () => {
127
127
  });
128
128
 
129
129
  test.skip('transcription of audio recording with overlapping chunks', { timeout: 20_000 }, async () => {
130
- const trigger = new Trigger<DataType.MessageBlock.Transcription[]>({ autoReset: true });
130
+ const trigger = new Trigger<TranscriptSegment[]>({ autoReset: true });
131
131
  const recorder = new MockAudioRecorder({
132
132
  buffer: await readFile('test.wav'),
133
133
  chunkDuration: 3_000,
@@ -7,11 +7,10 @@ import { WaveFile } from 'wavefile';
7
7
  import { DeferredTask, Trigger } from '@dxos/async';
8
8
  import { type Context, LifecycleState, Resource } from '@dxos/context';
9
9
  import { log } from '@dxos/log';
10
- import { type DataType } from '@dxos/schema';
11
10
  import { trace } from '@dxos/tracing';
12
11
 
13
12
  import { type AudioRecorder, type AudioChunk } from './audio-recorder';
14
- import { TRANSCRIPTION_URL } from '../types';
13
+ import { TRANSCRIPTION_URL, type TranscriptSegment } from '../types';
15
14
  import { mergeFloat64Arrays } from '../util';
16
15
 
17
16
  type WhisperWord = {
@@ -65,7 +64,7 @@ export type TranscribeConfig = {
65
64
  export type TranscriberParams = {
66
65
  config: TranscribeConfig;
67
66
  recorder: AudioRecorder;
68
- onSegments: (segments: DataType.MessageBlock.Transcription[]) => Promise<void>;
67
+ onSegments: (segments: TranscriptSegment[]) => Promise<void>;
69
68
  };
70
69
 
71
70
  /**
@@ -94,7 +93,6 @@ export class Transcriber extends Resource {
94
93
  }
95
94
 
96
95
  protected override async _open(ctx: Context) {
97
- log.info('opening');
98
96
  this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
99
97
  await this._recorder.start();
100
98
  this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());
@@ -102,18 +100,15 @@ export class Transcriber extends Resource {
102
100
  }
103
101
 
104
102
  protected override async _close() {
105
- log.info('closing');
106
103
  this._recording = false;
107
104
  this._transcribeTask = undefined;
108
105
  await this._recorder.stop();
109
106
  }
110
107
 
111
108
  startChunksRecording() {
112
- log.info('starting');
113
109
  if (this._lifecycleState !== LifecycleState.OPEN) {
114
110
  return;
115
111
  }
116
-
117
112
  this._recording = true;
118
113
  }
119
114
 
@@ -121,10 +116,8 @@ export class Transcriber extends Resource {
121
116
  if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {
122
117
  return;
123
118
  }
124
-
125
119
  this._recording = false;
126
120
  this._transcribeTask?.schedule();
127
- log.info('stopped');
128
121
  }
129
122
 
130
123
  private _saveAudioChunk(chunk: AudioChunk) {
@@ -201,25 +194,24 @@ export class Transcriber extends Resource {
201
194
 
202
195
  if (!response.ok) {
203
196
  this._audioChunks = [];
204
- throw new Error(`Transcription failed: ${response.statusText}`);
197
+ throw new Error('Failed to transcribe');
205
198
  }
206
199
 
207
- const { segments } = (await response.json()) as {
200
+ const {
201
+ segments,
202
+ }: {
208
203
  segments: WhisperSegment[];
209
- };
204
+ } = await response.json();
210
205
 
211
206
  log.info('transcription response', {
212
- segments: segments.length,
207
+ segments,
213
208
  string: segments.map((segments) => segments.text).join(' '),
214
209
  });
215
210
 
216
211
  return segments;
217
212
  }
218
213
 
219
- private _alignSegments(
220
- segments: WhisperSegment[],
221
- originalChunks: AudioChunk[],
222
- ): DataType.MessageBlock.Transcription[] {
214
+ private _alignSegments(segments: WhisperSegment[], originalChunks: AudioChunk[]): TranscriptSegment[] {
223
215
  // Absolute zero for all relative timestamps in the segments.
224
216
  const zeroTimestamp = originalChunks.at(0)!.timestamp;
225
217
 
@@ -248,9 +240,8 @@ export class Transcriber extends Resource {
248
240
 
249
241
  // Add absolute timestamp to each segment.
250
242
  return filteredSegments.map((segment) => ({
251
- type: 'transcription',
252
- started: new Date(zeroTimestamp + segment.start * 1_000).toISOString(),
253
- text: segment.text.trim(),
243
+ started: new Date(zeroTimestamp + segment.start * 1_000),
244
+ text: segment.text,
254
245
  }));
255
246
  }
256
247
  }