@markusylisiurunen/tau 0.3.52 → 0.3.54

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 (39) hide show
  1. package/dist/core/commands/registry.js +10 -5
  2. package/dist/core/commands/registry.js.map +1 -1
  3. package/dist/core/config/index.js +1 -1
  4. package/dist/core/config/index.js.map +1 -1
  5. package/dist/core/config/schema.js +10 -2
  6. package/dist/core/config/schema.js.map +1 -1
  7. package/dist/core/diff_review/bridge.js +2 -1
  8. package/dist/core/diff_review/bridge.js.map +1 -1
  9. package/dist/core/diff_review/tool.js +1 -1
  10. package/dist/core/diff_review/tool.js.map +1 -1
  11. package/dist/core/static/tau_docs/config-reference.md +6 -6
  12. package/dist/core/static/tau_docs/credentials.md +3 -2
  13. package/dist/core/static/tau_docs/telegram.md +4 -3
  14. package/dist/core/static/tau_docs/troubleshooting.md +1 -1
  15. package/dist/core/static/tau_docs/tui.md +5 -3
  16. package/dist/core/telegram/adapter.js +40 -20
  17. package/dist/core/telegram/adapter.js.map +1 -1
  18. package/dist/core/telegram/cli.js +4 -2
  19. package/dist/core/telegram/cli.js.map +1 -1
  20. package/dist/core/telegram/runtime.js +1 -0
  21. package/dist/core/telegram/runtime.js.map +1 -1
  22. package/dist/core/utils/gemini_speech.js +1 -1
  23. package/dist/core/utils/gemini_speech.js.map +1 -1
  24. package/dist/core/utils/gemini_transcription.js +14 -15
  25. package/dist/core/utils/gemini_transcription.js.map +1 -1
  26. package/dist/core/utils/mistral_transcription.js +6 -2
  27. package/dist/core/utils/mistral_transcription.js.map +1 -1
  28. package/dist/core/utils/openai_transcription.js +431 -0
  29. package/dist/core/utils/openai_transcription.js.map +1 -0
  30. package/dist/core/utils/speech_to_text.js +66 -14
  31. package/dist/core/utils/speech_to_text.js.map +1 -1
  32. package/dist/core/version.js +1 -1
  33. package/dist/tui/listen_capture.js +84 -20
  34. package/dist/tui/listen_capture.js.map +1 -1
  35. package/dist/tui/session_chat_controller.js +213 -29
  36. package/dist/tui/session_chat_controller.js.map +1 -1
  37. package/dist/tui/speech_playback.js +3 -1
  38. package/dist/tui/speech_playback.js.map +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1,431 @@
1
+ import WebSocket from "ws";
2
+ import { z } from "zod";
3
+ import { spawnWithCapture } from "./spawn_capture.js";
4
+ import { formatSpeechToTextContext } from "./speech_to_text_context.js";
5
+ import { truncateForTokens } from "./truncate.js";
6
+ const OPENAI_REALTIME_TRANSCRIPTION_URL = "wss://api.openai.com/v1/realtime?intent=transcription";
7
+ const OPENAI_FILE_TRANSCRIPTION_URL = "https://api.openai.com/v1/audio/transcriptions";
8
+ const OPENAI_STREAMING_TRANSCRIPTION_MODEL = "gpt-live-transcribe";
9
+ const OPENAI_FILE_TRANSCRIPTION_MODEL = "gpt-transcribe";
10
+ const OPENAI_STREAMING_SAMPLE_RATE = 24_000;
11
+ const OPENAI_FILE_SAMPLE_RATE = 16_000;
12
+ const OPENAI_TRANSCRIPTION_CONNECT_TIMEOUT_MS = 15_000;
13
+ const OPENAI_TRANSCRIPTION_COMPLETION_TIMEOUT_MS = 30_000;
14
+ const OPENAI_TRANSCRIPTION_CONTEXT_TOKENS = 1_024;
15
+ const OPENAI_TRANSCRIPTION_FFMPEG_TIMEOUT_MS = 5 * 60 * 1_000;
16
+ const OPENAI_TRANSCRIPTION_FFMPEG_OUTPUT_LIMIT_BYTES = 20_000;
17
+ const OPENAI_TRANSCRIPTION_MAX_PCM_BYTES = OPENAI_FILE_SAMPLE_RATE * 2 * (OPENAI_TRANSCRIPTION_FFMPEG_TIMEOUT_MS / 1_000);
18
+ const eventSchema = z.object({ type: z.string() }).passthrough();
19
+ const errorEventSchema = z.object({
20
+ type: z.literal("error"),
21
+ error: z.object({ message: z.string().trim().min(1) }),
22
+ });
23
+ const transcriptionFailedEventSchema = z.object({
24
+ type: z.literal("conversation.item.input_audio_transcription.failed"),
25
+ error: z.object({ message: z.string().trim().min(1) }),
26
+ });
27
+ const transcriptionCompletedEventSchema = z.object({
28
+ type: z.literal("conversation.item.input_audio_transcription.completed"),
29
+ transcript: z.string().trim().min(1),
30
+ });
31
+ const fileErrorSchema = z.object({
32
+ error: z.object({ message: z.string().trim().min(1) }),
33
+ });
34
+ const fileSuccessSchema = z.object({ text: z.string().trim().min(1) });
35
+ class OpenAIStreamingTranscriptionImpl {
36
+ socket;
37
+ ready = false;
38
+ aborted = false;
39
+ failure;
40
+ completedTranscript;
41
+ hasAudio = false;
42
+ pendingAudio = [];
43
+ readyTimeout;
44
+ completionTimeout;
45
+ resolveReady;
46
+ rejectReady;
47
+ resolveCompletion;
48
+ rejectCompletion;
49
+ readyPromise;
50
+ constructor(options) {
51
+ const apiKey = options.apiKey.trim();
52
+ if (!apiKey) {
53
+ throw new Error("missing OpenAI API key");
54
+ }
55
+ const webSocketFactory = options.webSocketFactory ?? defaultWebSocketFactory;
56
+ this.socket = webSocketFactory(OPENAI_REALTIME_TRANSCRIPTION_URL, {
57
+ headers: { Authorization: `Bearer ${apiKey}` },
58
+ });
59
+ this.readyPromise = new Promise((resolve, reject) => {
60
+ this.resolveReady = resolve;
61
+ this.rejectReady = reject;
62
+ });
63
+ void this.readyPromise.catch(() => { });
64
+ this.readyTimeout = setTimeout(() => {
65
+ this.fail(new Error("timed out opening OpenAI transcription session"));
66
+ this.socket.terminate();
67
+ }, OPENAI_TRANSCRIPTION_CONNECT_TIMEOUT_MS);
68
+ this.readyTimeout.unref?.();
69
+ this.socket.on("open", () => {
70
+ this.send({
71
+ type: "session.update",
72
+ session: {
73
+ type: "transcription",
74
+ audio: {
75
+ input: {
76
+ format: {
77
+ type: "audio/pcm",
78
+ rate: OPENAI_STREAMING_SAMPLE_RATE,
79
+ },
80
+ transcription: {
81
+ model: OPENAI_STREAMING_TRANSCRIPTION_MODEL,
82
+ prompt: buildOpenAITranscriptionPrompt(options.context),
83
+ delay: "medium",
84
+ },
85
+ turn_detection: null,
86
+ },
87
+ },
88
+ },
89
+ });
90
+ });
91
+ this.socket.on("message", (data) => this.handleMessage(data));
92
+ this.socket.on("error", (error) => {
93
+ this.fail(new Error(`OpenAI transcription connection failed: ${error.message}`));
94
+ });
95
+ this.socket.on("close", (code, reason) => {
96
+ if (this.aborted || this.completedTranscript)
97
+ return;
98
+ const detail = reason.toString("utf8").trim();
99
+ this.fail(new Error(detail
100
+ ? `OpenAI transcription connection closed (${code}): ${detail}`
101
+ : `OpenAI transcription connection closed (${code})`));
102
+ });
103
+ }
104
+ appendAudio(audio) {
105
+ if (audio.length === 0 || this.aborted || this.failure || this.completedTranscript)
106
+ return;
107
+ this.hasAudio = true;
108
+ if (!this.ready) {
109
+ this.pendingAudio.push(audio);
110
+ return;
111
+ }
112
+ this.sendAudio(audio);
113
+ }
114
+ async finish(options = {}) {
115
+ const abortListener = () => this.abort();
116
+ if (options.signal?.aborted) {
117
+ abortListener();
118
+ }
119
+ else {
120
+ options.signal?.addEventListener("abort", abortListener, { once: true });
121
+ }
122
+ try {
123
+ await this.readyPromise;
124
+ if (this.failure)
125
+ throw this.failure;
126
+ if (this.aborted)
127
+ throw new Error("OpenAI transcription was aborted");
128
+ if (this.completedTranscript)
129
+ return this.completedTranscript;
130
+ if (!this.hasAudio)
131
+ throw new Error("OpenAI transcription received no audio");
132
+ const completion = new Promise((resolve, reject) => {
133
+ this.resolveCompletion = resolve;
134
+ this.rejectCompletion = reject;
135
+ });
136
+ this.completionTimeout = setTimeout(() => {
137
+ this.fail(new Error("timed out waiting for OpenAI transcription"));
138
+ this.socket.terminate();
139
+ }, OPENAI_TRANSCRIPTION_COMPLETION_TIMEOUT_MS);
140
+ this.completionTimeout.unref?.();
141
+ this.send({ type: "input_audio_buffer.commit" });
142
+ return await completion;
143
+ }
144
+ finally {
145
+ options.signal?.removeEventListener("abort", abortListener);
146
+ }
147
+ }
148
+ abort() {
149
+ if (this.aborted || this.completedTranscript)
150
+ return;
151
+ const error = new Error("OpenAI transcription was aborted");
152
+ this.aborted = true;
153
+ this.pendingAudio = [];
154
+ this.clearTimers();
155
+ this.rejectReady?.(error);
156
+ this.rejectCompletion?.(error);
157
+ this.clearWaiters();
158
+ this.socket.close();
159
+ }
160
+ handleMessage(data) {
161
+ let payload;
162
+ try {
163
+ payload = JSON.parse(formatWebSocketMessage(data));
164
+ }
165
+ catch {
166
+ this.fail(new Error("OpenAI transcription returned malformed JSON"));
167
+ return;
168
+ }
169
+ const event = eventSchema.safeParse(payload);
170
+ if (!event.success) {
171
+ this.fail(new Error("OpenAI transcription returned a malformed event"));
172
+ return;
173
+ }
174
+ if (event.data.type === "session.updated") {
175
+ this.ready = true;
176
+ if (this.readyTimeout)
177
+ clearTimeout(this.readyTimeout);
178
+ this.readyTimeout = undefined;
179
+ const pendingAudio = this.pendingAudio;
180
+ this.pendingAudio = [];
181
+ for (const audio of pendingAudio) {
182
+ this.sendAudio(audio);
183
+ }
184
+ if (this.failure)
185
+ return;
186
+ this.resolveReady?.();
187
+ this.resolveReady = undefined;
188
+ this.rejectReady = undefined;
189
+ return;
190
+ }
191
+ if (event.data.type === "error") {
192
+ const parsed = errorEventSchema.safeParse(payload);
193
+ this.fail(new Error(parsed.success ? parsed.data.error.message : "OpenAI transcription returned an error"));
194
+ return;
195
+ }
196
+ if (event.data.type === "conversation.item.input_audio_transcription.failed") {
197
+ const parsed = transcriptionFailedEventSchema.safeParse(payload);
198
+ this.fail(new Error(parsed.success
199
+ ? parsed.data.error.message
200
+ : "OpenAI transcription failed with a malformed error"));
201
+ return;
202
+ }
203
+ if (event.data.type === "conversation.item.input_audio_transcription.completed") {
204
+ const parsed = transcriptionCompletedEventSchema.safeParse(payload);
205
+ if (!parsed.success) {
206
+ this.fail(new Error("transcription result was empty or malformed"));
207
+ return;
208
+ }
209
+ this.completedTranscript = parsed.data.transcript;
210
+ this.clearTimers();
211
+ this.resolveCompletion?.(this.completedTranscript);
212
+ this.clearWaiters();
213
+ this.socket.close();
214
+ }
215
+ }
216
+ sendAudio(audio) {
217
+ this.send({
218
+ type: "input_audio_buffer.append",
219
+ audio: audio.toString("base64"),
220
+ });
221
+ }
222
+ send(event) {
223
+ if (this.failure || this.aborted)
224
+ return;
225
+ try {
226
+ this.socket.send(JSON.stringify(event), (error) => {
227
+ if (error) {
228
+ this.fail(new Error(`failed to send OpenAI transcription audio: ${error.message}`));
229
+ }
230
+ });
231
+ }
232
+ catch (error) {
233
+ this.fail(new Error(`failed to send OpenAI transcription audio: ${error.message}`));
234
+ }
235
+ }
236
+ fail(error) {
237
+ if (this.failure || this.aborted || this.completedTranscript)
238
+ return;
239
+ this.failure = error;
240
+ this.pendingAudio = [];
241
+ this.clearTimers();
242
+ this.rejectReady?.(error);
243
+ this.rejectCompletion?.(error);
244
+ this.clearWaiters();
245
+ this.socket.terminate();
246
+ }
247
+ clearTimers() {
248
+ if (this.readyTimeout)
249
+ clearTimeout(this.readyTimeout);
250
+ if (this.completionTimeout)
251
+ clearTimeout(this.completionTimeout);
252
+ this.readyTimeout = undefined;
253
+ this.completionTimeout = undefined;
254
+ }
255
+ clearWaiters() {
256
+ this.resolveReady = undefined;
257
+ this.rejectReady = undefined;
258
+ this.resolveCompletion = undefined;
259
+ this.rejectCompletion = undefined;
260
+ }
261
+ }
262
+ export function startOpenAITranscription(options) {
263
+ return new OpenAIStreamingTranscriptionImpl(options);
264
+ }
265
+ export async function transcribeOpenAIAudio(options) {
266
+ const apiKey = options.apiKey.trim();
267
+ if (!apiKey) {
268
+ throw new Error("missing OpenAI API key");
269
+ }
270
+ const wav = await decodeOpenAIAudio({
271
+ audio: options.audio,
272
+ signal: options.signal,
273
+ spawnImpl: options.spawnImpl,
274
+ });
275
+ const formData = new FormData();
276
+ formData.append("model", OPENAI_FILE_TRANSCRIPTION_MODEL);
277
+ formData.append("file", new Blob([Uint8Array.from(wav)], { type: "audio/wav" }), "speech.wav");
278
+ formData.append("prompt", buildOpenAITranscriptionPrompt(options.context));
279
+ const fetchFn = options.fetchImpl ?? fetch;
280
+ const response = await fetchFn(OPENAI_FILE_TRANSCRIPTION_URL, {
281
+ method: "POST",
282
+ headers: { Authorization: `Bearer ${apiKey}` },
283
+ body: formData,
284
+ signal: options.signal,
285
+ });
286
+ const responseText = await response.text();
287
+ let payload;
288
+ try {
289
+ payload = responseText ? JSON.parse(responseText) : undefined;
290
+ }
291
+ catch {
292
+ payload = undefined;
293
+ }
294
+ if (!response.ok) {
295
+ const parsed = fileErrorSchema.safeParse(payload);
296
+ throw new Error(parsed.success ? parsed.data.error.message : responseText.trim() || `HTTP ${response.status}`);
297
+ }
298
+ const parsed = fileSuccessSchema.safeParse(payload);
299
+ if (!parsed.success) {
300
+ throw new Error("transcription result was empty or malformed");
301
+ }
302
+ return parsed.data.text;
303
+ }
304
+ async function decodeOpenAIAudio(args) {
305
+ const spawnImpl = args.spawnImpl ?? spawnWithCapture;
306
+ const decoderAbortController = new AbortController();
307
+ const signal = args.signal
308
+ ? AbortSignal.any([args.signal, decoderAbortController.signal])
309
+ : decoderAbortController.signal;
310
+ const chunks = [];
311
+ let decodedBytes = 0;
312
+ let decodeFailure;
313
+ let result;
314
+ try {
315
+ result = await spawnImpl("ffmpeg", [
316
+ "-nostdin",
317
+ "-hide_banner",
318
+ "-loglevel",
319
+ "error",
320
+ "-i",
321
+ "pipe:0",
322
+ "-vn",
323
+ "-ac",
324
+ "1",
325
+ "-ar",
326
+ String(OPENAI_FILE_SAMPLE_RATE),
327
+ "-c:a",
328
+ "pcm_s16le",
329
+ "-f",
330
+ "s16le",
331
+ "pipe:1",
332
+ ], {
333
+ input: args.audio,
334
+ signal,
335
+ timeoutMs: OPENAI_TRANSCRIPTION_FFMPEG_TIMEOUT_MS,
336
+ maxCaptureBytes: OPENAI_TRANSCRIPTION_FFMPEG_OUTPUT_LIMIT_BYTES,
337
+ captureOutput: "stderr",
338
+ stdio: ["pipe", "pipe", "pipe"],
339
+ onSpawn: (child) => {
340
+ child.stdout?.on("data", (chunk) => {
341
+ if (decodeFailure || signal.aborted)
342
+ return;
343
+ decodedBytes += chunk.length;
344
+ if (decodedBytes > OPENAI_TRANSCRIPTION_MAX_PCM_BYTES) {
345
+ decodeFailure = new Error("audio exceeds the five-minute OpenAI transcription limit");
346
+ decoderAbortController.abort(decodeFailure);
347
+ return;
348
+ }
349
+ chunks.push(Buffer.from(chunk));
350
+ });
351
+ },
352
+ });
353
+ }
354
+ catch (error) {
355
+ if (error.code === "ENOENT") {
356
+ throw new Error("ffmpeg is required for OpenAI speech transcription");
357
+ }
358
+ throw error;
359
+ }
360
+ if (decodeFailure) {
361
+ throw decodeFailure;
362
+ }
363
+ if (result.aborted) {
364
+ throw signal.reason instanceof Error
365
+ ? signal.reason
366
+ : new Error("OpenAI transcription was aborted");
367
+ }
368
+ if (result.timedOut) {
369
+ throw new Error("ffmpeg timed out while decoding audio for OpenAI transcription");
370
+ }
371
+ if (result.exitCode !== 0) {
372
+ const detail = result.stderr.trim();
373
+ throw new Error(detail
374
+ ? `ffmpeg failed to decode audio for OpenAI transcription: ${detail}`
375
+ : `ffmpeg exited with code ${result.exitCode ?? "unknown"}`);
376
+ }
377
+ if (decodedBytes === 0) {
378
+ throw new Error("audio contained no decodable speech data");
379
+ }
380
+ return createPcmWav(Buffer.concat(chunks, decodedBytes));
381
+ }
382
+ function createPcmWav(pcm) {
383
+ const header = Buffer.alloc(44);
384
+ header.write("RIFF", 0, "ascii");
385
+ header.writeUInt32LE(36 + pcm.length, 4);
386
+ header.write("WAVE", 8, "ascii");
387
+ header.write("fmt ", 12, "ascii");
388
+ header.writeUInt32LE(16, 16);
389
+ header.writeUInt16LE(1, 20);
390
+ header.writeUInt16LE(1, 22);
391
+ header.writeUInt32LE(OPENAI_FILE_SAMPLE_RATE, 24);
392
+ header.writeUInt32LE(OPENAI_FILE_SAMPLE_RATE * 2, 28);
393
+ header.writeUInt16LE(2, 32);
394
+ header.writeUInt16LE(16, 34);
395
+ header.write("data", 36, "ascii");
396
+ header.writeUInt32LE(pcm.length, 40);
397
+ return Buffer.concat([header, pcm]);
398
+ }
399
+ function buildOpenAITranscriptionPrompt(context) {
400
+ const formattedContext = formatSpeechToTextContext(context);
401
+ const boundedContext = formattedContext
402
+ ? truncateForTokens(formattedContext, {
403
+ maxTokens: OPENAI_TRANSCRIPTION_CONTEXT_TOKENS,
404
+ strategy: "tail",
405
+ }).content.trim()
406
+ : "";
407
+ return [
408
+ "The speaker is dictating a message for insertion into an AI coding assistant chat input.",
409
+ boundedContext
410
+ ? `Use this recent conversation only to resolve likely names, acronyms, terminology, and references:\n${boundedContext}`
411
+ : undefined,
412
+ ]
413
+ .filter((line) => line !== undefined)
414
+ .join("\n\n");
415
+ }
416
+ function formatWebSocketMessage(data) {
417
+ if (typeof data === "string")
418
+ return data;
419
+ if (Buffer.isBuffer(data))
420
+ return data.toString("utf8");
421
+ if (data instanceof ArrayBuffer)
422
+ return Buffer.from(data).toString("utf8");
423
+ if (ArrayBuffer.isView(data)) {
424
+ return Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString("utf8");
425
+ }
426
+ throw new Error("unsupported WebSocket message");
427
+ }
428
+ function defaultWebSocketFactory(url, options) {
429
+ return new WebSocket(url, options);
430
+ }
431
+ //# sourceMappingURL=openai_transcription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai_transcription.js","sourceRoot":"","sources":["../../../src/core/utils/openai_transcription.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,76 @@
1
1
  import { transcribeGeminiAudio } from "./gemini_transcription.js";
2
2
  import { transcribeMistralAudio } from "./mistral_transcription.js";
3
- export async function transcribeAudio(options) {
3
+ import { startOpenAITranscription, transcribeOpenAIAudio, } from "./openai_transcription.js";
4
+ export function createSpeechToTextTranscription(options) {
4
5
  switch (options.provider) {
5
6
  case "gemini":
6
- return await transcribeGeminiAudio({
7
- apiKey: options.apiKey,
8
- audio: options.audio,
9
- mimeType: options.mimeType,
10
- context: options.context,
11
- fetchImpl: options.fetchImpl,
7
+ return createBatchTranscription(async (recording, signal) => {
8
+ return await transcribeGeminiAudio({
9
+ apiKey: options.apiKey,
10
+ audio: recording.audio,
11
+ mimeType: recording.mimeType,
12
+ context: options.context,
13
+ signal,
14
+ fetchImpl: options.deps?.fetchImpl,
15
+ });
12
16
  });
13
17
  case "mistral":
14
- return await transcribeMistralAudio({
15
- apiKey: options.apiKey,
16
- audio: options.audio,
17
- mimeType: options.mimeType,
18
- fileName: options.fileName,
19
- language: options.language,
20
- fetchImpl: options.fetchImpl,
18
+ return createBatchTranscription(async (recording, signal) => {
19
+ return await transcribeMistralAudio({
20
+ apiKey: options.apiKey,
21
+ audio: recording.audio,
22
+ mimeType: recording.mimeType,
23
+ fileName: recording.fileName,
24
+ language: recording.language,
25
+ signal,
26
+ fetchImpl: options.deps?.fetchImpl,
27
+ });
21
28
  });
29
+ case "openai": {
30
+ if (options.mode === "streaming") {
31
+ const transcription = startOpenAITranscription({
32
+ apiKey: options.apiKey,
33
+ context: options.context,
34
+ webSocketFactory: options.deps?.webSocketFactory,
35
+ });
36
+ return {
37
+ appendAudio: (audio) => transcription.appendAudio(audio),
38
+ finish: async (_recording, finishOptions) => await transcription.finish({ signal: finishOptions?.signal }),
39
+ abort: () => transcription.abort(),
40
+ };
41
+ }
42
+ const abortController = new AbortController();
43
+ return {
44
+ appendAudio: () => { },
45
+ finish: async (recording, finishOptions) => await transcribeOpenAIAudio({
46
+ apiKey: options.apiKey,
47
+ audio: recording.audio,
48
+ context: options.context,
49
+ signal: finishOptions?.signal
50
+ ? AbortSignal.any([abortController.signal, finishOptions.signal])
51
+ : abortController.signal,
52
+ fetchImpl: options.deps?.fetchImpl,
53
+ spawnImpl: options.deps?.spawnImpl,
54
+ }),
55
+ abort: () => abortController.abort(new Error("OpenAI transcription was aborted")),
56
+ };
57
+ }
22
58
  }
23
59
  }
60
+ function createBatchTranscription(transcribe) {
61
+ const abortController = new AbortController();
62
+ return {
63
+ appendAudio: () => { },
64
+ finish: async (recording, finishOptions) => {
65
+ const signal = finishOptions?.signal
66
+ ? AbortSignal.any([abortController.signal, finishOptions.signal])
67
+ : abortController.signal;
68
+ signal.throwIfAborted();
69
+ const result = await transcribe(recording, signal);
70
+ signal.throwIfAborted();
71
+ return result;
72
+ },
73
+ abort: () => abortController.abort(new Error("speech transcription was aborted")),
74
+ };
75
+ }
24
76
  //# sourceMappingURL=speech_to_text.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"speech_to_text.js","sourceRoot":"","sources":["../../../src/core/utils/speech_to_text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAcpE,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAA4B;IAChE,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,QAAQ;YACX,OAAO,MAAM,qBAAqB,CAAC;gBACjC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;QACL,KAAK,SAAS;YACZ,OAAO,MAAM,sBAAsB,CAAC;gBAClC,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,SAAS,EAAE,OAAO,CAAC,SAAS;aAC7B,CAAC,CAAC;IACP,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"speech_to_text.js","sourceRoot":"","sources":["../../../src/core/utils/speech_to_text.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export const APP_VERSION = "0.3.52";
1
+ export const APP_VERSION = "0.3.54";
2
2
  //# sourceMappingURL=version.js.map