@dxos/plugin-transcription 0.8.1-main.ba2dec9 → 0.8.1-staging.5be625a

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 (139) hide show
  1. package/dist/lib/browser/{TranscriptContainer-N4KQHMY4.mjs → TranscriptContainer-TJXP6ICP.mjs} +3 -3
  2. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs +39 -0
  3. package/dist/lib/browser/app-graph-builder-ZIIDYMHP.mjs.map +7 -0
  4. package/dist/lib/browser/{chunk-BDVUIRBP.mjs → chunk-3NWYXRZS.mjs} +2 -2
  5. package/dist/lib/browser/chunk-MD4NQO6W.mjs +252 -0
  6. package/dist/lib/browser/chunk-MD4NQO6W.mjs.map +7 -0
  7. package/dist/lib/browser/chunk-N3VKF2J3.mjs +415 -0
  8. package/dist/lib/browser/chunk-N3VKF2J3.mjs.map +7 -0
  9. package/dist/lib/browser/chunk-YEVVZZTC.mjs +19 -0
  10. package/dist/lib/browser/chunk-YEVVZZTC.mjs.map +7 -0
  11. package/dist/lib/browser/{chunk-QIHUPVQD.mjs → chunk-YRW4MNRE.mjs} +23 -24
  12. package/dist/lib/browser/chunk-YRW4MNRE.mjs.map +7 -0
  13. package/dist/lib/browser/index.mjs +56 -327
  14. package/dist/lib/browser/index.mjs.map +4 -4
  15. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs +73 -0
  16. package/dist/lib/browser/intent-resolver-AC6LFBE4.mjs.map +7 -0
  17. package/dist/lib/browser/meta.json +1 -1
  18. package/dist/lib/browser/{react-surface-UPTZBHVB.mjs → react-surface-OM2EECBI.mjs} +15 -8
  19. package/dist/lib/{node-esm/react-surface-2WJQ67LB.mjs.map → browser/react-surface-OM2EECBI.mjs.map} +2 -2
  20. package/dist/lib/browser/types/index.mjs +2 -1
  21. package/dist/lib/node/{TranscriptContainer-4BWXOVML.cjs → TranscriptContainer-KNTN76RZ.cjs} +8 -8
  22. package/dist/lib/node/{TranscriptContainer-4BWXOVML.cjs.map → TranscriptContainer-KNTN76RZ.cjs.map} +2 -2
  23. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs +52 -0
  24. package/dist/lib/node/app-graph-builder-CJSNQYJZ.cjs.map +7 -0
  25. package/dist/lib/node/chunk-EKSRBQX7.cjs +437 -0
  26. package/dist/lib/node/chunk-EKSRBQX7.cjs.map +7 -0
  27. package/dist/lib/node/{chunk-I35KHI2G.cjs → chunk-I6CUIAQH.cjs} +5 -5
  28. package/dist/lib/node/{app-graph-builder-YFBX3OTP.cjs → chunk-LEHTJHKP.cjs} +23 -7
  29. package/dist/lib/node/chunk-LEHTJHKP.cjs.map +7 -0
  30. package/dist/lib/node/chunk-T4W4AKGM.cjs +279 -0
  31. package/dist/lib/node/chunk-T4W4AKGM.cjs.map +7 -0
  32. package/dist/lib/node/{chunk-UIHEGU6Q.cjs → chunk-ZAE2IOZC.cjs} +25 -27
  33. package/dist/lib/node/chunk-ZAE2IOZC.cjs.map +7 -0
  34. package/dist/lib/node/index.cjs +78 -344
  35. package/dist/lib/node/index.cjs.map +4 -4
  36. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs +84 -0
  37. package/dist/lib/node/intent-resolver-ZSQ2MHJJ.cjs.map +7 -0
  38. package/dist/lib/node/meta.json +1 -1
  39. package/dist/lib/node/{react-surface-NCKXB7EQ.cjs → react-surface-ZENSCF6S.cjs} +18 -12
  40. package/dist/lib/node/{react-surface-NCKXB7EQ.cjs.map → react-surface-ZENSCF6S.cjs.map} +2 -2
  41. package/dist/lib/node/types/index.cjs +8 -7
  42. package/dist/lib/node/types/index.cjs.map +2 -2
  43. package/dist/lib/node-esm/{TranscriptContainer-6IKRASR6.mjs → TranscriptContainer-MOWZQSEO.mjs} +3 -3
  44. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs +40 -0
  45. package/dist/lib/node-esm/app-graph-builder-ARTLU4U5.mjs.map +7 -0
  46. package/dist/lib/node-esm/chunk-4A6BWPRB.mjs +253 -0
  47. package/dist/lib/node-esm/chunk-4A6BWPRB.mjs.map +7 -0
  48. package/dist/lib/node-esm/{chunk-KEG3ME4O.mjs → chunk-DLXORY7Y.mjs} +22 -24
  49. package/dist/lib/node-esm/chunk-DLXORY7Y.mjs.map +7 -0
  50. package/dist/lib/node-esm/{chunk-2CPKXRN6.mjs → chunk-NFPDIQYG.mjs} +2 -2
  51. package/dist/lib/node-esm/chunk-SB5TLXBU.mjs +21 -0
  52. package/dist/lib/node-esm/chunk-SB5TLXBU.mjs.map +7 -0
  53. package/dist/lib/node-esm/chunk-SWV74BYU.mjs +416 -0
  54. package/dist/lib/node-esm/chunk-SWV74BYU.mjs.map +7 -0
  55. package/dist/lib/node-esm/index.mjs +56 -327
  56. package/dist/lib/node-esm/index.mjs.map +4 -4
  57. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs +74 -0
  58. package/dist/lib/node-esm/intent-resolver-XU4BLUSF.mjs.map +7 -0
  59. package/dist/lib/node-esm/meta.json +1 -1
  60. package/dist/lib/node-esm/{react-surface-2WJQ67LB.mjs → react-surface-5CBEXLXJ.mjs} +15 -8
  61. package/dist/lib/{browser/react-surface-UPTZBHVB.mjs.map → node-esm/react-surface-5CBEXLXJ.mjs.map} +2 -2
  62. package/dist/lib/node-esm/types/index.mjs +2 -1
  63. package/dist/types/src/TranscriptionPlugin.d.ts.map +1 -1
  64. package/dist/types/src/capabilities/app-graph-builder.d.ts +1 -0
  65. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -1
  66. package/dist/types/src/capabilities/intent-resolver.d.ts.map +1 -1
  67. package/dist/types/src/components/Transcript/Transcript.d.ts +2 -0
  68. package/dist/types/src/components/Transcript/Transcript.d.ts.map +1 -1
  69. package/dist/types/src/components/Transcript/Transcript.stories.d.ts.map +1 -1
  70. package/dist/types/src/components/TranscriptContainer.d.ts +1 -0
  71. package/dist/types/src/components/TranscriptContainer.d.ts.map +1 -1
  72. package/dist/types/src/components/index.d.ts +1 -0
  73. package/dist/types/src/components/index.d.ts.map +1 -1
  74. package/dist/types/src/components/transcription.stories.d.ts +1 -1
  75. package/dist/types/src/components/transcription.stories.d.ts.map +1 -1
  76. package/dist/types/src/meta.d.ts +2 -9
  77. package/dist/types/src/meta.d.ts.map +1 -1
  78. package/dist/types/src/transcriber/index.d.ts +1 -0
  79. package/dist/types/src/transcriber/index.d.ts.map +1 -1
  80. package/dist/types/src/transcriber/summarize.d.ts +5 -0
  81. package/dist/types/src/transcriber/summarize.d.ts.map +1 -0
  82. package/dist/types/src/transcription-manager.d.ts +3 -0
  83. package/dist/types/src/transcription-manager.d.ts.map +1 -1
  84. package/dist/types/src/translations.d.ts +5 -6
  85. package/dist/types/src/translations.d.ts.map +1 -1
  86. package/dist/types/src/types/schema.d.ts +9 -15
  87. package/dist/types/src/types/schema.d.ts.map +1 -1
  88. package/dist/types/src/types/types.d.ts +13 -6
  89. package/dist/types/src/types/types.d.ts.map +1 -1
  90. package/dist/types/src/util/random-queue-dxn.d.ts +2 -2
  91. package/dist/types/src/util/random-queue-dxn.d.ts.map +1 -1
  92. package/package.json +39 -36
  93. package/src/TranscriptionPlugin.tsx +1 -2
  94. package/src/capabilities/app-graph-builder.ts +25 -2
  95. package/src/capabilities/intent-resolver.ts +24 -2
  96. package/src/capabilities/react-surface.tsx +2 -2
  97. package/src/components/Transcript/Transcript.stories.tsx +46 -27
  98. package/src/components/Transcript/Transcript.tsx +205 -49
  99. package/src/components/TranscriptContainer.tsx +12 -143
  100. package/src/components/transcription.stories.tsx +11 -13
  101. package/src/meta.ts +2 -2
  102. package/src/transcriber/index.ts +1 -0
  103. package/src/transcriber/summarize.ts +77 -0
  104. package/src/transcription-manager.ts +11 -1
  105. package/src/translations.ts +2 -2
  106. package/src/types/schema.ts +5 -3
  107. package/src/types/types.ts +12 -2
  108. package/src/util/random-queue-dxn.ts +2 -2
  109. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs +0 -7
  110. package/dist/lib/browser/app-graph-builder-ZSSJIFY7.mjs.map +0 -7
  111. package/dist/lib/browser/chunk-GHTRJTEB.mjs +0 -35
  112. package/dist/lib/browser/chunk-GHTRJTEB.mjs.map +0 -7
  113. package/dist/lib/browser/chunk-QIHUPVQD.mjs.map +0 -7
  114. package/dist/lib/browser/chunk-YX447BJ4.mjs +0 -241
  115. package/dist/lib/browser/chunk-YX447BJ4.mjs.map +0 -7
  116. package/dist/lib/browser/intent-resolver-RW6DEJC2.mjs +0 -32
  117. package/dist/lib/browser/intent-resolver-RW6DEJC2.mjs.map +0 -7
  118. package/dist/lib/node/app-graph-builder-YFBX3OTP.cjs.map +0 -7
  119. package/dist/lib/node/chunk-ANSWGFMS.cjs +0 -267
  120. package/dist/lib/node/chunk-ANSWGFMS.cjs.map +0 -7
  121. package/dist/lib/node/chunk-HDRXDMK2.cjs +0 -55
  122. package/dist/lib/node/chunk-HDRXDMK2.cjs.map +0 -7
  123. package/dist/lib/node/chunk-UIHEGU6Q.cjs.map +0 -7
  124. package/dist/lib/node/intent-resolver-KLBZ25XJ.cjs +0 -44
  125. package/dist/lib/node/intent-resolver-KLBZ25XJ.cjs.map +0 -7
  126. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs +0 -9
  127. package/dist/lib/node-esm/app-graph-builder-77GQG6UF.mjs.map +0 -7
  128. package/dist/lib/node-esm/chunk-KEG3ME4O.mjs.map +0 -7
  129. package/dist/lib/node-esm/chunk-LORUIVS4.mjs +0 -37
  130. package/dist/lib/node-esm/chunk-LORUIVS4.mjs.map +0 -7
  131. package/dist/lib/node-esm/chunk-ZMK2QLW2.mjs +0 -242
  132. package/dist/lib/node-esm/chunk-ZMK2QLW2.mjs.map +0 -7
  133. package/dist/lib/node-esm/intent-resolver-4FMISUPW.mjs +0 -33
  134. package/dist/lib/node-esm/intent-resolver-4FMISUPW.mjs.map +0 -7
  135. /package/dist/lib/browser/{TranscriptContainer-N4KQHMY4.mjs.map → TranscriptContainer-TJXP6ICP.mjs.map} +0 -0
  136. /package/dist/lib/browser/{chunk-BDVUIRBP.mjs.map → chunk-3NWYXRZS.mjs.map} +0 -0
  137. /package/dist/lib/node/{chunk-I35KHI2G.cjs.map → chunk-I6CUIAQH.cjs.map} +0 -0
  138. /package/dist/lib/node-esm/{TranscriptContainer-6IKRASR6.mjs.map → TranscriptContainer-MOWZQSEO.mjs.map} +0 -0
  139. /package/dist/lib/node-esm/{chunk-2CPKXRN6.mjs.map → chunk-NFPDIQYG.mjs.map} +0 -0
@@ -1,20 +1,23 @@
1
1
  import {
2
- mergeFloat64Arrays
3
- } from "./chunk-GHTRJTEB.mjs";
2
+ MediaStreamRecorder,
3
+ Transcriber,
4
+ summarizeTranscript
5
+ } from "./chunk-N3VKF2J3.mjs";
4
6
  import {
5
7
  TranscriptContainer
6
- } from "./chunk-BDVUIRBP.mjs";
8
+ } from "./chunk-3NWYXRZS.mjs";
9
+ import {
10
+ TranscriptBlock,
11
+ TranscriptType
12
+ } from "./chunk-YRW4MNRE.mjs";
7
13
  import {
8
14
  Transcript,
9
15
  TranscriptionContainer
10
- } from "./chunk-YX447BJ4.mjs";
16
+ } from "./chunk-MD4NQO6W.mjs";
11
17
  import {
12
18
  TRANSCRIPTION_PLUGIN,
13
- TRANSCRIPTION_URL,
14
- TranscriptBlock,
15
- TranscriptType,
16
19
  meta
17
- } from "./chunk-QIHUPVQD.mjs";
20
+ } from "./chunk-YEVVZZTC.mjs";
18
21
 
19
22
  // packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts
20
23
  import { lazy } from "@dxos/app-framework";
@@ -27,9 +30,9 @@ var TranscriptionCapabilities;
27
30
  })(TranscriptionCapabilities || (TranscriptionCapabilities = {}));
28
31
 
29
32
  // packages/plugins/experimental/plugin-transcription/src/capabilities/index.ts
30
- var AppGraphBuilder = lazy(() => import("./app-graph-builder-ZSSJIFY7.mjs"));
31
- var IntentResolver = lazy(() => import("./intent-resolver-RW6DEJC2.mjs"));
32
- var ReactSurface = lazy(() => import("./react-surface-UPTZBHVB.mjs"));
33
+ var AppGraphBuilder = lazy(() => import("./app-graph-builder-ZIIDYMHP.mjs"));
34
+ var IntentResolver = lazy(() => import("./intent-resolver-AC6LFBE4.mjs"));
35
+ var ReactSurface = lazy(() => import("./react-surface-OM2EECBI.mjs"));
33
36
 
34
37
  // packages/plugins/experimental/plugin-transcription/src/hooks/useAudioFile.ts
35
38
  import { useEffect, useState } from "react";
@@ -123,286 +126,6 @@ var useAudioTrack = (active) => {
123
126
 
124
127
  // packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts
125
128
  import { useEffect as useEffect3, useMemo } from "react";
126
-
127
- // packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts
128
- import { MediaRecorder, register } from "extendable-media-recorder";
129
- import { WaveFile } from "wavefile";
130
- import { synchronized } from "@dxos/async";
131
- import { invariant } from "@dxos/invariant";
132
- import { log as log2 } from "@dxos/log";
133
- import { trace } from "@dxos/tracing";
134
- function _ts_decorate(decorators, target, key, desc) {
135
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
136
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
137
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
138
- return c > 3 && r && Object.defineProperty(target, key, r), r;
139
- }
140
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcriber/media-stream-recorder.ts";
141
- var initializingPromise;
142
- var initializeExtendableMediaRecorder = async () => {
143
- const { connect } = await import("extendable-media-recorder-wav-encoder");
144
- await register(await connect());
145
- };
146
- var MediaStreamRecorder = class {
147
- constructor({ mediaStreamTrack, interval }) {
148
- this._mediaRecorder = void 0;
149
- this._header = void 0;
150
- this._mediaStreamTrack = mediaStreamTrack;
151
- this._interval = interval;
152
- }
153
- get wavConfig() {
154
- const settings = this._mediaStreamTrack.getSettings();
155
- return {
156
- channels: settings.channelCount ?? 1,
157
- sampleRate: settings.sampleRate ?? 16e3,
158
- bitDepthCode: settings.sampleSize ? String(settings.sampleSize) : "16"
159
- };
160
- }
161
- get mediaStreamTrack() {
162
- return this._mediaStreamTrack;
163
- }
164
- setOnChunk(onChunk) {
165
- this._onChunk = onChunk;
166
- }
167
- async start() {
168
- await (initializingPromise ??= initializeExtendableMediaRecorder()).catch((err) => log2.info("initializeExtendableMediaRecorder", {
169
- err
170
- }, {
171
- F: __dxlog_file2,
172
- L: 62,
173
- S: this,
174
- C: (f, a) => f(...a)
175
- }));
176
- if (!this._mediaRecorder) {
177
- const stream = new MediaStream([
178
- this._mediaStreamTrack
179
- ]);
180
- this._mediaRecorder = new MediaRecorder(stream, {
181
- mimeType: "audio/wav"
182
- });
183
- }
184
- if (this._mediaRecorder.state === "recording") {
185
- return;
186
- }
187
- invariant(this._onChunk, "MediaStreamRecorder: onChunk is not set", {
188
- F: __dxlog_file2,
189
- L: 73,
190
- S: this,
191
- A: [
192
- "this._onChunk",
193
- "'MediaStreamRecorder: onChunk is not set'"
194
- ]
195
- });
196
- this._mediaRecorder.ondataavailable = (event) => this._ondataavailable(event);
197
- this._mediaRecorder.start(this._interval);
198
- }
199
- async stop() {
200
- if (this._mediaRecorder?.state !== "recording") {
201
- return;
202
- }
203
- this._mediaRecorder.stop();
204
- }
205
- async _ondataavailable(event) {
206
- const blob = event.data;
207
- const uint8Array = new Uint8Array(await blob.arrayBuffer());
208
- const isHeader = uint8Array[0] === 82 && // R
209
- uint8Array[1] === 73 && // I
210
- uint8Array[2] === 70 && // F
211
- uint8Array[3] === 70;
212
- let wav;
213
- if (isHeader) {
214
- wav = new WaveFile(uint8Array);
215
- this._header = uint8Array.slice(0, 44);
216
- } else if (this._header) {
217
- wav = new WaveFile(new Uint8Array([
218
- ...this._header,
219
- ...uint8Array
220
- ]));
221
- } else {
222
- log2.warn("MediaStreamRecorder: no header", void 0, {
223
- F: __dxlog_file2,
224
- L: 104,
225
- S: this,
226
- C: (f, a) => f(...a)
227
- });
228
- return;
229
- }
230
- this._onChunk({
231
- timestamp: Date.now(),
232
- data: wav.getSamples()
233
- });
234
- }
235
- };
236
- _ts_decorate([
237
- synchronized
238
- ], MediaStreamRecorder.prototype, "_ondataavailable", null);
239
- MediaStreamRecorder = _ts_decorate([
240
- trace.resource()
241
- ], MediaStreamRecorder);
242
-
243
- // packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts
244
- import { WaveFile as WaveFile2 } from "wavefile";
245
- import { DeferredTask, Trigger } from "@dxos/async";
246
- import { LifecycleState, Resource } from "@dxos/context";
247
- import { log as log3 } from "@dxos/log";
248
- import { trace as trace2 } from "@dxos/tracing";
249
- function _ts_decorate2(decorators, target, key, desc) {
250
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
251
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
252
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
253
- return c > 3 && r && Object.defineProperty(target, key, r), r;
254
- }
255
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcriber/transcriber.ts";
256
- var Transcriber = class extends Resource {
257
- constructor({ config, recorder, onSegments }) {
258
- super();
259
- this._audioChunks = [];
260
- this._lastUsedTimestamp = 0;
261
- this._openTrigger = new Trigger({
262
- autoReset: true
263
- });
264
- this._recording = false;
265
- this._transcribeTask = void 0;
266
- this._config = config;
267
- this._recorder = recorder;
268
- this._onSegments = onSegments;
269
- }
270
- async _open(ctx) {
271
- this._recorder.setOnChunk((chunk) => this._saveAudioChunk(chunk));
272
- await this._recorder.start();
273
- this._transcribeTask = new DeferredTask(ctx, async () => this._transcribe());
274
- this._openTrigger.wake();
275
- }
276
- async _close() {
277
- this._recording = false;
278
- this._transcribeTask = void 0;
279
- await this._recorder.stop();
280
- }
281
- startChunksRecording() {
282
- if (this._lifecycleState !== LifecycleState.OPEN) {
283
- return;
284
- }
285
- this._recording = true;
286
- }
287
- stopChunksRecording() {
288
- if (this._lifecycleState !== LifecycleState.OPEN || !this._recording) {
289
- return;
290
- }
291
- this._recording = false;
292
- this._transcribeTask?.schedule();
293
- }
294
- _saveAudioChunk(chunk) {
295
- log3("saving audio chunk", {
296
- chunk
297
- }, {
298
- F: __dxlog_file3,
299
- L: 124,
300
- S: this,
301
- C: (f, a) => f(...a)
302
- });
303
- this._audioChunks.push(chunk);
304
- if (!this._recording && (!this._transcribeTask || !this._transcribeTask.scheduled) && this._audioChunks.length >= this._config.prefixBufferChunksAmount) {
305
- this._audioChunks = this._dropOldChunks();
306
- } else if (this._audioChunks.length >= this._config.transcribeAfterChunksAmount && this._recording) {
307
- this._transcribeTask?.schedule();
308
- }
309
- }
310
- async _transcribe() {
311
- log3("transcribing", {
312
- chunks: this._audioChunks.length
313
- }, {
314
- F: __dxlog_file3,
315
- L: 140,
316
- S: this,
317
- C: (f, a) => f(...a)
318
- });
319
- const chunks = this._audioChunks;
320
- this._audioChunks = this._dropOldChunks();
321
- if (chunks.length === 0) {
322
- return;
323
- }
324
- const audio = await this._mergeAudioChunks(chunks);
325
- const segments = await this._fetchTranscription(audio);
326
- if (!Array.isArray(segments) || segments.length === 0) {
327
- return;
328
- }
329
- const alignedSegments = this._alignSegments(segments, chunks);
330
- if (alignedSegments.length > 0) {
331
- await this._onSegments(alignedSegments);
332
- }
333
- }
334
- _dropOldChunks() {
335
- return this._config.prefixBufferChunksAmount > 0 ? this._audioChunks.slice(-this._config.prefixBufferChunksAmount) : [];
336
- }
337
- async _mergeAudioChunks(chunks) {
338
- const file = new WaveFile2();
339
- const wavConfig = this._recorder.wavConfig;
340
- file.fromScratch(wavConfig.channels, wavConfig.sampleRate, wavConfig.bitDepthCode, mergeFloat64Arrays(chunks.map(({ data }) => data)));
341
- return file.toBase64();
342
- }
343
- async _fetchTranscription(audio) {
344
- if (audio.length === 0) {
345
- this._audioChunks = [];
346
- throw new Error("No audio to send for transcribing");
347
- }
348
- const response = await fetch(`${TRANSCRIPTION_URL}/transcribe`, {
349
- method: "POST",
350
- body: JSON.stringify({
351
- audio
352
- }),
353
- headers: {
354
- "Content-Type": "application/json"
355
- }
356
- });
357
- if (!response.ok) {
358
- this._audioChunks = [];
359
- throw new Error("Failed to transcribe");
360
- }
361
- const { segments } = await response.json();
362
- log3.info("transcription response", {
363
- segments,
364
- string: segments.map((segments2) => segments2.text).join(" ")
365
- }, {
366
- F: __dxlog_file3,
367
- L: 206,
368
- S: this,
369
- C: (f, a) => f(...a)
370
- });
371
- return segments;
372
- }
373
- _alignSegments(segments, originalChunks) {
374
- const zeroTimestamp = originalChunks.at(0).timestamp;
375
- const filteredSegments = segments.filter((segment) => zeroTimestamp + segment.end * 1e3 >= this._lastUsedTimestamp).map((segment) => {
376
- const words = segment.words.filter((word) => zeroTimestamp + word.start * 1e3 >= this._lastUsedTimestamp);
377
- return {
378
- ...segment,
379
- words,
380
- text: words.map((word) => word.word).join(""),
381
- start: words.at(0)?.start ?? segment.end
382
- };
383
- }).filter((segment) => segment.words.length > 0);
384
- if (filteredSegments.length === 0) {
385
- return [];
386
- }
387
- this._lastUsedTimestamp = zeroTimestamp + filteredSegments.at(-1).end * 1e3;
388
- return filteredSegments.map((segment) => ({
389
- started: new Date(zeroTimestamp + segment.start * 1e3),
390
- text: segment.text
391
- }));
392
- }
393
- };
394
- _ts_decorate2([
395
- trace2.span({
396
- showInBrowserTimeline: true
397
- })
398
- ], Transcriber.prototype, "_mergeAudioChunks", null);
399
- _ts_decorate2([
400
- trace2.span({
401
- showInBrowserTimeline: true
402
- })
403
- ], Transcriber.prototype, "_fetchTranscription", null);
404
-
405
- // packages/plugins/experimental/plugin-transcription/src/hooks/useTranscriber.ts
406
129
  var RECORD_INTERVAL = 200;
407
130
  var PREFIXED_CHUNKS_AMOUNT = 10;
408
131
  var TRANSCRIBE_AFTER_CHUNKS_AMOUNT = 50;
@@ -440,9 +163,9 @@ var useTranscriber = ({ audioStreamTrack, onSegments }) => {
440
163
  import { useState as useState3, useEffect as useEffect4, useCallback } from "react";
441
164
  import { scheduleMicroTask } from "@dxos/async";
442
165
  import { Context } from "@dxos/context";
443
- import { log as log4 } from "@dxos/log";
166
+ import { log as log2 } from "@dxos/log";
444
167
  import { useSoundEffect } from "@dxos/react-ui-sfx";
445
- var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts";
168
+ var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/hooks/useVoiceInput.ts";
446
169
  var useVoiceInput = ({ active, onUpdate }) => {
447
170
  const soundStart = useSoundEffect("StartRecording");
448
171
  const soundStop = useSoundEffect("StopRecording");
@@ -458,14 +181,14 @@ var useVoiceInput = ({ active, onUpdate }) => {
458
181
  });
459
182
  useEffect4(() => {
460
183
  const ctx = new Context(void 0, {
461
- F: __dxlog_file4,
184
+ F: __dxlog_file2,
462
185
  L: 43
463
186
  });
464
187
  scheduleMicroTask(ctx, async () => {
465
188
  if (active && transcriber) {
466
189
  await transcriber.open();
467
- log4.info("starting...", void 0, {
468
- F: __dxlog_file4,
190
+ log2.info("starting...", void 0, {
191
+ F: __dxlog_file2,
469
192
  L: 47,
470
193
  S: void 0,
471
194
  C: (f, a) => f(...a)
@@ -476,8 +199,8 @@ var useVoiceInput = ({ active, onUpdate }) => {
476
199
  } else if (!active && transcriber?.isOpen) {
477
200
  transcriber?.stopChunksRecording();
478
201
  await transcriber?.close();
479
- log4.info("stopped", void 0, {
480
- F: __dxlog_file4,
202
+ log2.info("stopped", void 0, {
203
+ F: __dxlog_file2,
481
204
  L: 54,
482
205
  S: void 0,
483
206
  C: (f, a) => f(...a)
@@ -499,27 +222,28 @@ var useVoiceInput = ({ active, onUpdate }) => {
499
222
  };
500
223
 
501
224
  // packages/plugins/experimental/plugin-transcription/src/transcription-manager.ts
502
- import { synchronized as synchronized2 } from "@dxos/async";
503
- import { Resource as Resource2 } from "@dxos/context";
225
+ import { synchronized } from "@dxos/async";
226
+ import { Resource } from "@dxos/context";
504
227
  import { QueueImpl } from "@dxos/echo-db";
505
228
  import { createStatic } from "@dxos/echo-schema";
506
- import { invariant as invariant2 } from "@dxos/invariant";
229
+ import { invariant } from "@dxos/invariant";
507
230
  import { DXN } from "@dxos/keys";
508
- function _ts_decorate3(decorators, target, key, desc) {
231
+ function _ts_decorate(decorators, target, key, desc) {
509
232
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
510
233
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
511
234
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
512
235
  return c > 3 && r && Object.defineProperty(target, key, r), r;
513
236
  }
514
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcription-manager.ts";
237
+ var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/plugins/experimental/plugin-transcription/src/transcription-manager.ts";
515
238
  var RECORD_INTERVAL2 = 200;
516
239
  var PREFIXED_CHUNKS_AMOUNT2 = 10;
517
240
  var TRANSCRIBE_AFTER_CHUNKS_AMOUNT2 = 50;
518
- var TranscriptionManager = class extends Resource2 {
241
+ var TranscriptionManager = class extends Resource {
519
242
  constructor(edgeClient) {
520
243
  super();
521
244
  this._audioStreamTrack = void 0;
522
245
  this._name = void 0;
246
+ this._hue = void 0;
523
247
  this._mediaRecorder = void 0;
524
248
  this._transcriber = void 0;
525
249
  this._enabled = false;
@@ -576,9 +300,9 @@ var TranscriptionManager = class extends Resource2 {
576
300
  if (this._queue === queue) {
577
301
  return;
578
302
  }
579
- invariant2(queue instanceof QueueImpl, void 0, {
580
- F: __dxlog_file5,
581
- L: 110,
303
+ invariant(queue instanceof QueueImpl, void 0, {
304
+ F: __dxlog_file3,
305
+ L: 112,
582
306
  S: this,
583
307
  A: [
584
308
  "queue instanceof QueueImpl",
@@ -598,6 +322,12 @@ var TranscriptionManager = class extends Resource2 {
598
322
  }
599
323
  this._name = name;
600
324
  }
325
+ setHue(hue) {
326
+ if (this._hue === hue) {
327
+ return;
328
+ }
329
+ this._hue = hue;
330
+ }
601
331
  async _toggleTranscriber() {
602
332
  await this._maybeReinitTranscriber();
603
333
  if (this._enabled) {
@@ -635,7 +365,8 @@ var TranscriptionManager = class extends Resource2 {
635
365
  return;
636
366
  }
637
367
  const block = createStatic(TranscriptBlock, {
638
- author: this._name,
368
+ authorName: this._name,
369
+ authorHue: this._hue,
639
370
  segments
640
371
  });
641
372
  this._queue.append([
@@ -643,21 +374,24 @@ var TranscriptionManager = class extends Resource2 {
643
374
  ]);
644
375
  }
645
376
  };
646
- _ts_decorate3([
647
- synchronized2
377
+ _ts_decorate([
378
+ synchronized
648
379
  ], TranscriptionManager.prototype, "setRecording", null);
649
- _ts_decorate3([
650
- synchronized2
380
+ _ts_decorate([
381
+ synchronized
651
382
  ], TranscriptionManager.prototype, "setEnabled", null);
652
- _ts_decorate3([
653
- synchronized2
383
+ _ts_decorate([
384
+ synchronized
654
385
  ], TranscriptionManager.prototype, "setAudioTrack", null);
655
- _ts_decorate3([
656
- synchronized2
386
+ _ts_decorate([
387
+ synchronized
657
388
  ], TranscriptionManager.prototype, "setQueue", null);
658
- _ts_decorate3([
659
- synchronized2
389
+ _ts_decorate([
390
+ synchronized
660
391
  ], TranscriptionManager.prototype, "setName", null);
392
+ _ts_decorate([
393
+ synchronized
394
+ ], TranscriptionManager.prototype, "setHue", null);
661
395
 
662
396
  // packages/plugins/experimental/plugin-transcription/src/TranscriptionPlugin.tsx
663
397
  import { Capabilities, Events, contributes, defineModule, definePlugin } from "@dxos/app-framework";
@@ -668,7 +402,8 @@ var translations_default = [
668
402
  {
669
403
  "en-US": {
670
404
  [TranscriptType.typename]: {
671
- "typename label": "Transcript"
405
+ "typename label": "Transcript",
406
+ "object name placeholder": "New transcript"
672
407
  },
673
408
  [TRANSCRIPTION_PLUGIN]: {
674
409
  "plugin name": "Transcription",
@@ -678,8 +413,7 @@ var translations_default = [
678
413
  "delete calls label": "Delete",
679
414
  "delete button": "Delete",
680
415
  "bookmark button": "Bookmark",
681
- "summary button": "Create summary",
682
- "summarizing label": "Summarizing..."
416
+ "scroll to end label": "Scroll to latest"
683
417
  }
684
418
  }
685
419
  }
@@ -703,12 +437,6 @@ var TranscriptionPlugin = () => definePlugin(meta, [
703
437
  activate: () => contributes(Capabilities.Metadata, {
704
438
  id: TranscriptType.typename,
705
439
  metadata: {
706
- placeholder: [
707
- "transcript title placeholder",
708
- {
709
- ns: TRANSCRIPTION_PLUGIN
710
- }
711
- ],
712
440
  icon: "ph--subtitles--regular"
713
441
  }
714
442
  })
@@ -752,6 +480,7 @@ export {
752
480
  TranscriptionManager,
753
481
  TranscriptionPlugin,
754
482
  meta,
483
+ summarizeTranscript,
755
484
  useAudioFile,
756
485
  useAudioTrack,
757
486
  useTranscriber,