@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
@@ -1,68 +0,0 @@
1
- import { Text } from '@codemirror/state';
2
- import { type EditorView } from '@codemirror/view';
3
- import { Event } from '@dxos/async';
4
- export type Chunk = {
5
- id: string;
6
- };
7
- /**
8
- * Covert block to a set of markdown lines.
9
- */
10
- export type ChunkRenderer<T extends Chunk> = (chunk: T, index: number, debug?: boolean) => string[];
11
- /**
12
- * Abstract representation of the document model.
13
- */
14
- export interface ChunkDocument {
15
- lineCount(): number;
16
- replaceLines(from: number, remove: number, insert: string[]): void;
17
- }
18
- /**
19
- * Codemirror document adapter.
20
- */
21
- export declare class DocumentAdapter implements ChunkDocument {
22
- private readonly _view;
23
- constructor(_view: EditorView);
24
- /** The document must always have at least one line. */
25
- lineCount(): number;
26
- replaceLines(from: number, remove: number, insert: string[]): void;
27
- }
28
- /**
29
- * Each Chunk can be converted into a set of lines.
30
- * Chunks can be added, updated or deleted from the Queue.
31
- * A Document is an immutable projection that represents a flat list of lines corresponding to the Queue.
32
- *
33
- * Ideally we would implement a custom virtual Text model for the View, but this currently isn't possible in Codemirror.
34
- * Instead this model tracks changes and syncs them with the ChunkDocument.
35
- */
36
- export declare class SerializationModel<T extends Chunk> {
37
- private readonly _renderer;
38
- /** Ordered set of chunks. */
39
- private readonly _chunks;
40
- /** Map of chunk IDs to their current line counts. */
41
- private readonly _chunkLineCounts;
42
- /** Map of line numbers to chunk IDs. */
43
- private readonly _lineToChunk;
44
- /** Track chunk changes since last sync. */
45
- private readonly _changes;
46
- /** Emits when the document is updated. */
47
- readonly update: Event<void>;
48
- constructor(_renderer: ChunkRenderer<T>, initialChunks?: T[]);
49
- toJSON(): {
50
- chunks: number;
51
- changes: number;
52
- };
53
- get doc(): Text;
54
- get chunks(): T[];
55
- /**
56
- * Get the block ID at the given line number.
57
- */
58
- getChunkAtLine(line: number): T | undefined;
59
- reset(): this;
60
- appendChunk(chunk: T): this;
61
- updateChunk(chunk: T): this;
62
- deleteBlock(id: string): this;
63
- /**
64
- * Syncs the tracked changes with the ChunkDocument.
65
- */
66
- sync(document: ChunkDocument): this;
67
- }
68
- //# sourceMappingURL=model.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/model/model.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAIpC,MAAM,MAAM,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnC;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC;AAEpG;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,IAAI,MAAM,CAAC;IACpB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACpE;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,aAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,UAAU;IAE9C,uDAAuD;IACvD,SAAS,IAAI,MAAM;IAInB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;CAiBnE;AAmBD;;;;;;;GAOG;AACH,qBAAa,kBAAkB,CAAC,CAAC,SAAS,KAAK;IAiB3C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAhB5B,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IAEnC,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAE9D,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IAErD,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,0CAA0C;IAC1C,SAAgB,MAAM,cAAqB;gBAGxB,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,EAC5C,aAAa,GAAE,CAAC,EAAO;IAOzB,MAAM;;;;IAON,IAAI,GAAG,SAEN;IAED,IAAI,MAAM,QAET;IAED;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI3C,KAAK,IAAI,IAAI;IAQb,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAQ3B,WAAW,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;IAS3B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAS7B;;OAEG;IACH,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;CA+DpC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=model.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.test.d.ts","sourceRoot":"","sources":["../../../../src/model/model.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export * from './testing';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,WAAW,CAAC"}
@@ -1,40 +0,0 @@
1
- import { Schema } from 'effect';
2
- import { type Queue } from '@dxos/client/echo';
3
- import { ObjectId } from '@dxos/echo-schema';
4
- import { type Space } from '@dxos/react-client/echo';
5
- import { DataType } from '@dxos/schema';
6
- export declare const TestItem: import("@dxos/echo-schema").EchoTypeSchema<Schema.Struct<{
7
- title: Schema.SchemaClass<string, string, never>;
8
- description: Schema.SchemaClass<string, string, never>;
9
- }>, {}>;
10
- declare abstract class AbstractMessageBuilder {
11
- abstract createMessage(numSegments?: number): Promise<DataType.Message>;
12
- }
13
- /**
14
- * Generator of transcript messages.
15
- */
16
- export declare class MessageBuilder extends AbstractMessageBuilder {
17
- private readonly _space?;
18
- static readonly singleton: MessageBuilder;
19
- users: {
20
- identityDid: string;
21
- name: string;
22
- email: string;
23
- }[];
24
- start: Date;
25
- constructor(_space?: Space | undefined);
26
- createMessage(numSegments?: number): Promise<DataType.Message>;
27
- createBlock(): DataType.MessageBlock.Transcription;
28
- next(): Date;
29
- }
30
- type UseTestTranscriptionQueue = (space: Space | undefined, queueId?: ObjectId, running?: boolean, interval?: number) => Queue<DataType.Message> | undefined;
31
- /**
32
- * Test transcriptionqueue.
33
- */
34
- export declare const useTestTranscriptionQueue: UseTestTranscriptionQueue;
35
- /**
36
- * Test transcription queue.
37
- */
38
- export declare const useTestTranscriptionQueueWithEntityExtraction: UseTestTranscriptionQueue;
39
- export {};
40
- //# sourceMappingURL=testing.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../../src/testing/testing.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAa,MAAM,QAAQ,CAAC;AAM3C,OAAO,EAAU,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAGvD,OAAO,EAA0B,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIrE,OAAO,EAA2B,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAMxC,eAAO,MAAM,QAAQ;;;OAcpB,CAAC;AAGF,uBAAe,sBAAsB;IACnC,QAAQ,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;CACxE;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,sBAAsB;IAW5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAVpC,MAAM,CAAC,QAAQ,CAAC,SAAS,iBAAwB;IAEjD,KAAK;;;;QAID;IAEJ,KAAK,OAAgD;gBAExB,MAAM,CAAC,EAAE,KAAK,YAAA;IAI5B,aAAa,CAAC,WAAW,SAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IASxE,WAAW,IAAI,QAAQ,CAAC,YAAY,CAAC,aAAa;IAkBlD,IAAI;CAIL;AA8CD,KAAK,yBAAyB,GAAG,CAC/B,KAAK,EAAE,KAAK,GAAG,SAAS,EACxB,OAAO,CAAC,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE,OAAO,EACjB,QAAQ,CAAC,EAAE,MAAM,KACd,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;AAEzC;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,yBAwBvC,CAAC;AAEF;;GAEG;AAEH,eAAO,MAAM,6CAA6C,EAAE,yBAmC3D,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=transcriber.browser.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcriber.browser.test.d.ts","sourceRoot":"","sources":["../../../../src/transcriber/transcriber.browser.test.ts"],"names":[],"mappings":""}
@@ -1,20 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Capabilities, contributes } from '@dxos/app-framework';
6
- import { live } from '@dxos/live-object';
7
-
8
- import { TRANSCRIPTION_PLUGIN } from '../meta';
9
- import { TranscriptionSettingsSchema } from '../types';
10
-
11
- export default () => {
12
- // TODO(wittjosiah): `live` currently doesn't handle schema default values.
13
- const settings = live(TranscriptionSettingsSchema, { entityExtraction: true });
14
-
15
- return contributes(Capabilities.Settings, {
16
- schema: TranscriptionSettingsSchema,
17
- prefix: TRANSCRIPTION_PLUGIN,
18
- value: settings,
19
- });
20
- };
@@ -1,260 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import { intervalToDuration } from 'date-fns/intervalToDuration';
6
- import { Schema } from 'effect';
7
- import { yieldOrContinue } from 'main-thread-scheduling';
8
- import React, { type FC, useCallback, useEffect, useMemo, useRef, useState, type WheelEvent } 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 DxGridCellValue,
16
- type DxGridElement,
17
- type DxGridAxisMeta,
18
- type DxGridPlaneCells,
19
- Grid,
20
- toPlaneCellIndex,
21
- } from '@dxos/react-ui-grid';
22
- import { mx } from '@dxos/react-ui-theme';
23
-
24
- import { TRANSCRIPTION_PLUGIN } 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.def({
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 TranscriptProps = ThemedClassName<{
119
- blocks?: TranscriptBlock[];
120
- attendableId?: string;
121
- ignoreAttention?: boolean;
122
- }>;
123
-
124
- /**
125
- * @@deprecated
126
- */
127
- export const Transcript: FC<TranscriptProps> = ({ classNames, blocks, attendableId, ignoreAttention }) => {
128
- const { t } = useTranslation(TRANSCRIPTION_PLUGIN);
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>();
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: '' }} 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,236 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { type Extension, RangeSetBuilder } from '@codemirror/state';
6
- import { EditorView, GutterMarker, ViewPlugin, type ViewUpdate, gutter } from '@codemirror/view';
7
- import { format } from 'date-fns/format';
8
- import { intervalToDuration } from 'date-fns/intervalToDuration';
9
-
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';
13
-
14
- import { DocumentAdapter, type SerializationModel } from '../../model';
15
-
16
- /**
17
- * Data structure that maps Chunks queue to lines with transcript state.
18
- */
19
- export type TranscriptOptions = {
20
- model: SerializationModel<DataType.Message>;
21
- started?: Date;
22
- renderButton?: RenderCallback<{ onClick: () => void }>;
23
- };
24
-
25
- /**
26
- * Scrolling transcript with timestamps.
27
- */
28
- export const transcript = ({ model, started, renderButton }: TranscriptOptions): Extension => {
29
- return [
30
- // Show timestamps in the gutter.
31
- gutter({
32
- class: 'cm-timestamp-gutter',
33
- lineMarkerChange: (update) => update.docChanged || update.viewportChanged,
34
- markers: (view) => {
35
- const start = getStartTime(started, model.chunks[0]);
36
- const builder = new RangeSetBuilder<GutterMarker>();
37
- for (const { from, to } of view.visibleRanges) {
38
- let line = view.state.doc.lineAt(from);
39
- while (line.from <= to) {
40
- const block = model.getChunkAtLine(line.number)?.blocks[0];
41
- const timestamp = block?.type === 'transcription' && block.started;
42
- if (timestamp) {
43
- builder.add(line.from, line.from, new TimestampMarker(line.number, new Date(timestamp), start));
44
- }
45
-
46
- if (line.to + 1 > view.state.doc.length) {
47
- break;
48
- }
49
-
50
- line = view.state.doc.lineAt(line.to + 1);
51
- }
52
- }
53
-
54
- return builder.finish();
55
- },
56
- }),
57
-
58
- // Listen for model updates.
59
- ViewPlugin.fromClass(
60
- class {
61
- private readonly _controls?: HTMLDivElement;
62
- private readonly _cleanup: CleanupFn;
63
- private readonly _adapter: DocumentAdapter;
64
- private _initialized = false;
65
-
66
- constructor(view: EditorView) {
67
- this._adapter = new DocumentAdapter(view);
68
-
69
- const scroller = view.scrollDOM;
70
- let isAutoScrolling = false;
71
- let hasScrolled = false;
72
-
73
- let timeout: NodeJS.Timeout | undefined;
74
- const scrollToBottom = (smooth = false) => {
75
- scroller.style.scrollBehavior = smooth ? 'smooth' : '';
76
-
77
- // Temporarily hide scrollbar to prevent flicker.
78
- scroller.classList.add('cm-hide-scrollbar');
79
- isAutoScrolling = true;
80
- clearTimeout(timeout);
81
- timeout = setTimeout(() => {
82
- this._controls?.classList.add('opacity-0');
83
- scroller.classList.remove('cm-hide-scrollbar');
84
- isAutoScrolling = false;
85
- }, 500);
86
-
87
- // Scroll to bottom.
88
- view.dispatch({
89
- effects: EditorView.scrollIntoView(view.state.doc.length, { y: 'end' }),
90
- });
91
- };
92
-
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
- // Event listeners.
110
- this._cleanup = combine(
111
- addEventListener(view.scrollDOM, 'scroll', () => {
112
- if (!isAutoScrolling) {
113
- hasScrolled = true;
114
- this._controls?.classList.remove('opacity-0');
115
- }
116
- }),
117
-
118
- model.update.on(() => {
119
- // Check if clamped to bottom.
120
- const autoScroll =
121
- scroller.scrollHeight - scroller.scrollTop - scroller.clientHeight === 0 || !hasScrolled;
122
-
123
- // Sync.
124
- model.sync(this._adapter);
125
-
126
- // Scroll.
127
- if (autoScroll) {
128
- scrollToBottom(true);
129
- }
130
- }),
131
- );
132
- }
133
-
134
- update(update: ViewUpdate) {
135
- // Initial sync.
136
- if (!this._initialized) {
137
- this._initialized = true;
138
- setTimeout(() => {
139
- model.sync(this._adapter);
140
- });
141
- }
142
- }
143
-
144
- destroy() {
145
- this._controls?.remove();
146
- this._cleanup();
147
- }
148
- },
149
- ),
150
-
151
- 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',
170
- },
171
- '.cm-timestamp-gutter': {
172
- width: '6rem',
173
- paddingRight: '1rem',
174
- },
175
- '.cm-timestamp-gutter > .cm-gutterElement > div': {
176
- display: 'inline-flex',
177
- textAlign: 'right',
178
- padding: '3px',
179
- },
180
- }),
181
- ];
182
- };
183
-
184
- /**
185
- * Gutter marker that displays a timestamp.
186
- */
187
- class TimestampMarker extends GutterMarker {
188
- constructor(
189
- readonly _line: number,
190
- readonly _timestamp: Date,
191
- readonly _started?: Date,
192
- ) {
193
- super();
194
- }
195
-
196
- override eq(other: this) {
197
- return other._timestamp === this._timestamp;
198
- }
199
-
200
- override toDOM(view: EditorView) {
201
- const el = document.createElement('div');
202
- el.className = 'text-sm text-subdued hover:bg-hoverSurface cursor-pointer';
203
- el.textContent = formatTimestamp(this._timestamp, this._started);
204
- // TODO(burdon): Click to bookmark or copy hyperlink.
205
- el.onclick = () => {
206
- const pos = view.state.doc.line(this._line).from;
207
- view.dispatch({
208
- effects: EditorView.scrollIntoView(pos, { y: 'start' }),
209
- });
210
- };
211
-
212
- return el;
213
- }
214
- }
215
-
216
- const getStartTime = (started?: Date, message?: DataType.Message): Date | undefined => {
217
- if (started) {
218
- return started;
219
- }
220
-
221
- if (message?.blocks[0]?.type === 'transcription' && message.blocks[0].started) {
222
- return new Date(message.blocks[0].started);
223
- }
224
-
225
- return undefined;
226
- };
227
-
228
- const formatTimestamp = (timestamp: Date, relative?: Date) => {
229
- if (relative) {
230
- const pad = (n = 0) => String(n).padStart(2, '0');
231
- const { hours, minutes, seconds } = intervalToDuration({ start: relative, end: timestamp });
232
- return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;
233
- } else {
234
- return format(timestamp, 'HH:mm:ss');
235
- }
236
- };
@@ -1,26 +0,0 @@
1
- //
2
- // Copyright 2023 DXOS.org
3
- //
4
-
5
- import React from 'react';
6
-
7
- import { Input, useTranslation } from '@dxos/react-ui';
8
- import { DeprecatedFormContainer, DeprecatedFormInput } from '@dxos/react-ui-form';
9
-
10
- import { TRANSCRIPTION_PLUGIN } from '../../meta';
11
- import { type TranscriptionSettingsProps } from '../../types';
12
-
13
- export const TranscriptionSettings = ({ settings }: { settings: TranscriptionSettingsProps }) => {
14
- const { t } = useTranslation(TRANSCRIPTION_PLUGIN);
15
-
16
- return (
17
- <DeprecatedFormContainer>
18
- <DeprecatedFormInput label={t('settings entity extraction label')}>
19
- <Input.Switch
20
- checked={!!settings.entityExtraction}
21
- onCheckedChange={(checked) => (settings.entityExtraction = checked)}
22
- />
23
- </DeprecatedFormInput>
24
- </DeprecatedFormContainer>
25
- );
26
- };