@markusylisiurunen/tau 0.3.75 → 0.3.77

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 (126) hide show
  1. package/dist/core/cli.js +0 -3
  2. package/dist/core/cli.js.map +1 -1
  3. package/dist/core/config/builtin_themes.js +0 -30
  4. package/dist/core/config/builtin_themes.js.map +1 -1
  5. package/dist/core/config/content_loader.js +10 -115
  6. package/dist/core/config/content_loader.js.map +1 -1
  7. package/dist/core/config/index.js +1 -1
  8. package/dist/core/config/index.js.map +1 -1
  9. package/dist/core/config/paths.js +0 -1
  10. package/dist/core/config/paths.js.map +1 -1
  11. package/dist/core/config/runtime.js +1 -1
  12. package/dist/core/config/runtime.js.map +1 -1
  13. package/dist/core/config/runtime_config_snapshot.js +0 -1
  14. package/dist/core/config/runtime_config_snapshot.js.map +1 -1
  15. package/dist/core/config/schema.js +8 -84
  16. package/dist/core/config/schema.js.map +1 -1
  17. package/dist/core/config/skills_loader.js +0 -8
  18. package/dist/core/config/skills_loader.js.map +1 -1
  19. package/dist/core/config/theme_variants.js.map +1 -1
  20. package/dist/core/config/virtual_bundle.js +1 -4
  21. package/dist/core/config/virtual_bundle.js.map +1 -1
  22. package/dist/core/debug.js +0 -2
  23. package/dist/core/debug.js.map +1 -1
  24. package/dist/core/index.js +0 -1
  25. package/dist/core/index.js.map +1 -1
  26. package/dist/core/models/catalog.js +2 -3
  27. package/dist/core/models/catalog.js.map +1 -1
  28. package/dist/core/personas.js +3 -81
  29. package/dist/core/personas.js.map +1 -1
  30. package/dist/core/static/index.js +0 -3
  31. package/dist/core/static/index.js.map +1 -1
  32. package/dist/core/static/tau_docs/config-reference.md +17 -59
  33. package/dist/core/static/tau_docs/configuration.md +5 -10
  34. package/dist/core/static/tau_docs/credentials.md +9 -28
  35. package/dist/core/static/tau_docs/image-generation.md +1 -1
  36. package/dist/core/static/tau_docs/node-sdk.md +1 -1
  37. package/dist/core/static/tau_docs/ownership-and-scope.md +3 -3
  38. package/dist/core/static/tau_docs/pdf-unpacking.md +1 -1
  39. package/dist/core/static/tau_docs/personas.md +3 -1
  40. package/dist/core/static/tau_docs/prompts-and-project-context.md +0 -10
  41. package/dist/core/static/tau_docs/remote-sessions.md +5 -21
  42. package/dist/core/static/tau_docs/session-protocol-methods.md +1 -7
  43. package/dist/core/static/tau_docs/skills.md +0 -22
  44. package/dist/core/static/tau_docs/speech-generation.md +1 -1
  45. package/dist/core/static/tau_docs/telegram.md +15 -17
  46. package/dist/core/static/tau_docs/troubleshooting.md +15 -15
  47. package/dist/core/static/tau_docs/tui.md +9 -24
  48. package/dist/core/telegram/adapter.js +120 -20
  49. package/dist/core/telegram/adapter.js.map +1 -1
  50. package/dist/core/telegram/cli.js +4 -5
  51. package/dist/core/telegram/cli.js.map +1 -1
  52. package/dist/core/telegram/runtime.js +3 -2
  53. package/dist/core/telegram/runtime.js.map +1 -1
  54. package/dist/core/telegram/session_manager.js +14 -0
  55. package/dist/core/telegram/session_manager.js.map +1 -1
  56. package/dist/core/telegram/tts.js +11 -9
  57. package/dist/core/telegram/tts.js.map +1 -1
  58. package/dist/core/tool/image_generate.js +37 -14
  59. package/dist/core/tool/image_generate.js.map +1 -1
  60. package/dist/core/tool/media.js +84 -4
  61. package/dist/core/tool/media.js.map +1 -1
  62. package/dist/core/tool/pdf_unpack.js +17 -10
  63. package/dist/core/tool/pdf_unpack.js.map +1 -1
  64. package/dist/core/tool/speech_generate.js +30 -13
  65. package/dist/core/tool/speech_generate.js.map +1 -1
  66. package/dist/core/utils/gemini_transcription.js +5 -95
  67. package/dist/core/utils/gemini_transcription.js.map +1 -1
  68. package/dist/core/utils/{gemini_speech.js → speech.js} +167 -428
  69. package/dist/core/utils/speech.js.map +1 -0
  70. package/dist/core/utils/speech_to_text.js +24 -52
  71. package/dist/core/utils/speech_to_text.js.map +1 -1
  72. package/dist/core/utils/speech_to_text_keywords.js +65 -0
  73. package/dist/core/utils/speech_to_text_keywords.js.map +1 -1
  74. package/dist/core/version.js +1 -1
  75. package/dist/execution/fly_sprite_execution_environment.js +4 -2
  76. package/dist/execution/fly_sprite_execution_environment.js.map +1 -1
  77. package/dist/main.js +6 -78
  78. package/dist/main.js.map +1 -1
  79. package/dist/protocol/index.d.ts +1 -1
  80. package/dist/protocol/index.js.map +1 -1
  81. package/dist/protocol/session_protocol.d.ts +2 -15
  82. package/dist/protocol/session_protocol.js +1 -20
  83. package/dist/protocol/session_protocol.js.map +1 -1
  84. package/dist/sdk/local_client.js +0 -6
  85. package/dist/sdk/local_client.js.map +1 -1
  86. package/dist/tui/chat_view.js +1 -3
  87. package/dist/tui/chat_view.js.map +1 -1
  88. package/dist/tui/listen_capture.js +7 -26
  89. package/dist/tui/listen_capture.js.map +1 -1
  90. package/dist/tui/session_chat_app.js +3 -19
  91. package/dist/tui/session_chat_app.js.map +1 -1
  92. package/dist/tui/session_chat_controller.js +58 -29
  93. package/dist/tui/session_chat_controller.js.map +1 -1
  94. package/dist/tui/speech_playback.js +10 -8
  95. package/dist/tui/speech_playback.js.map +1 -1
  96. package/dist/tui/ui/pending_messages.js +2 -1
  97. package/dist/tui/ui/pending_messages.js.map +1 -1
  98. package/package.json +3 -3
  99. package/dist/core/install/cli.js +0 -260
  100. package/dist/core/install/cli.js.map +0 -1
  101. package/dist/core/models/tau_model_overrides.js +0 -4
  102. package/dist/core/models/tau_model_overrides.js.map +0 -1
  103. package/dist/core/utils/gemini_speech.js.map +0 -1
  104. package/dist/core/utils/openai_transcription.js +0 -594
  105. package/dist/core/utils/openai_transcription.js.map +0 -1
  106. package/dist/execution/cloudflare_sandbox_execution_environment.js +0 -563
  107. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +0 -1
  108. package/dist/execution/sandbox_tool_helpers.js +0 -30
  109. package/dist/execution/sandbox_tool_helpers.js.map +0 -1
  110. package/dist/starter/prompts/approval-review-branch.md +0 -7
  111. package/dist/starter/prompts/approval-review-current-changes.md +0 -7
  112. package/dist/starter/prompts/approval-review-last-commit.md +0 -7
  113. package/dist/starter/prompts/commit-all.md +0 -9
  114. package/dist/starter/prompts/commit-staged.md +0 -9
  115. package/dist/starter/prompts/guided-review-branch.md +0 -7
  116. package/dist/starter/prompts/guided-review-current-changes.md +0 -7
  117. package/dist/starter/prompts/guided-review-last-commit.md +0 -7
  118. package/dist/starter/prompts/plan.md +0 -7
  119. package/dist/starter/prompts/review-branch.md +0 -7
  120. package/dist/starter/prompts/review-current-changes.md +0 -7
  121. package/dist/starter/prompts/review-last-commit.md +0 -7
  122. package/dist/starter/prompts/rewrite-prompt.md +0 -89
  123. package/dist/starter/skills/approval-review/SKILL.md +0 -219
  124. package/dist/starter/skills/code-review/SKILL.md +0 -102
  125. package/dist/starter/skills/guided-review/SKILL.md +0 -152
  126. package/dist/starter/skills/plan/SKILL.md +0 -53
@@ -1,594 +0,0 @@
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 { normalizeSpeechToTextKeywords, SPEECH_TO_TEXT_KEYWORD_INSTRUCTIONS, } from "./speech_to_text_keywords.js";
6
- import { truncateForTokens } from "./truncate.js";
7
- const OPENAI_REALTIME_TRANSCRIPTION_URL = "wss://api.openai.com/v1/realtime?intent=transcription";
8
- const OPENAI_FILE_TRANSCRIPTION_URL = "https://api.openai.com/v1/audio/transcriptions";
9
- const OPENAI_RESPONSES_URL = "https://api.openai.com/v1/responses";
10
- const OPENAI_STREAMING_TRANSCRIPTION_MODEL = "gpt-live-transcribe";
11
- const OPENAI_FILE_TRANSCRIPTION_MODEL = "gpt-transcribe";
12
- const OPENAI_TRANSCRIPTION_KEYWORD_MODEL = "gpt-6-luna";
13
- const OPENAI_STREAMING_SAMPLE_RATE = 24_000;
14
- const OPENAI_FILE_SAMPLE_RATE = 16_000;
15
- const OPENAI_TRANSCRIPTION_CONNECT_TIMEOUT_MS = 15_000;
16
- const OPENAI_TRANSCRIPTION_COMPLETION_TIMEOUT_MS = 30_000;
17
- const OPENAI_TRANSCRIPTION_KEYWORD_TIMEOUT_MS = 15_000;
18
- const OPENAI_TRANSCRIPTION_MAX_KEYWORD_CHARACTERS_TOTAL = 1_024;
19
- const OPENAI_TRANSCRIPTION_CONTEXT_TOKENS = 1_024;
20
- const OPENAI_TRANSCRIPTION_DECODER_BASE_TIMEOUT_MS = 60_000;
21
- const OPENAI_TRANSCRIPTION_FFMPEG_OUTPUT_LIMIT_BYTES = 20_000;
22
- const OPENAI_TRANSCRIPTION_MAX_UPLOAD_BYTES = 24_000_000;
23
- const OPENAI_TRANSCRIPTION_MAX_UPLOAD_PCM_BYTES = OPENAI_TRANSCRIPTION_MAX_UPLOAD_BYTES - 44;
24
- const OPENAI_TRANSCRIPTION_MAX_CONCURRENT_UPLOADS = 4;
25
- const OPENAI_REALTIME_TRANSCRIPTION_PROMPT = "The speaker is dictating a message for insertion into an AI coding assistant chat input.";
26
- const OPENAI_TRANSCRIPTION_KEYWORD_TEXT_CONFIG = {
27
- format: {
28
- type: "json_schema",
29
- name: "tau_transcription_keywords",
30
- strict: true,
31
- schema: {
32
- type: "object",
33
- properties: {
34
- keywords: {
35
- type: "array",
36
- items: { type: "string" },
37
- },
38
- },
39
- required: ["keywords"],
40
- additionalProperties: false,
41
- },
42
- },
43
- };
44
- const eventSchema = z.object({ type: z.string() }).passthrough();
45
- const errorEventSchema = z.object({
46
- type: z.literal("error"),
47
- error: z.object({ message: z.string().trim().min(1) }),
48
- });
49
- const transcriptionFailedEventSchema = z.object({
50
- type: z.literal("conversation.item.input_audio_transcription.failed"),
51
- error: z.object({ message: z.string().trim().min(1) }),
52
- });
53
- const transcriptionCompletedEventSchema = z.object({
54
- type: z.literal("conversation.item.input_audio_transcription.completed"),
55
- transcript: z.string().trim().min(1),
56
- });
57
- const responsesOutputSchema = z.object({
58
- output: z.array(z.unknown()),
59
- });
60
- const responsesMessageSchema = z.object({
61
- type: z.literal("message"),
62
- content: z.array(z.unknown()),
63
- });
64
- const responsesOutputTextSchema = z.object({
65
- type: z.literal("output_text"),
66
- text: z.string(),
67
- });
68
- const transcriptionKeywordsSchema = z
69
- .object({
70
- keywords: z.array(z.string()),
71
- })
72
- .strict();
73
- const fileErrorSchema = z.object({
74
- error: z.object({ message: z.string().trim().min(1) }),
75
- });
76
- const fileSuccessSchema = z.object({ text: z.string().trim().min(1) });
77
- class OpenAIStreamingTranscriptionImpl {
78
- socket;
79
- keywordAbortController = new AbortController();
80
- keywordsPromise;
81
- ready = false;
82
- aborted = false;
83
- failure;
84
- completedTranscript;
85
- hasAudio = false;
86
- pendingAudio = [];
87
- readyTimeout;
88
- completionTimeout;
89
- resolveReady;
90
- rejectReady;
91
- resolveCompletion;
92
- rejectCompletion;
93
- readyPromise;
94
- constructor(options) {
95
- const apiKey = options.apiKey.trim();
96
- if (!apiKey) {
97
- throw new Error("missing OpenAI API key");
98
- }
99
- this.keywordsPromise = prepareOpenAITranscriptionKeywords({
100
- apiKey,
101
- context: options.context,
102
- signal: this.keywordAbortController.signal,
103
- fetchImpl: options.fetchImpl,
104
- });
105
- const webSocketFactory = options.webSocketFactory ?? defaultWebSocketFactory;
106
- this.socket = webSocketFactory(OPENAI_REALTIME_TRANSCRIPTION_URL, {
107
- headers: { Authorization: `Bearer ${apiKey}` },
108
- });
109
- this.readyPromise = new Promise((resolve, reject) => {
110
- this.resolveReady = resolve;
111
- this.rejectReady = reject;
112
- });
113
- void this.readyPromise.catch(() => { });
114
- this.readyTimeout = setTimeout(() => {
115
- this.fail(new Error("timed out opening OpenAI transcription session"));
116
- this.socket.terminate();
117
- }, OPENAI_TRANSCRIPTION_CONNECT_TIMEOUT_MS);
118
- this.readyTimeout.unref?.();
119
- this.socket.on("open", () => {
120
- void this.configureSession();
121
- });
122
- this.socket.on("message", (data) => this.handleMessage(data));
123
- this.socket.on("error", (error) => {
124
- this.fail(new Error(`OpenAI transcription connection failed: ${error.message}`));
125
- });
126
- this.socket.on("close", (code, reason) => {
127
- if (this.aborted || this.completedTranscript)
128
- return;
129
- const detail = reason.toString("utf8").trim();
130
- this.fail(new Error(detail
131
- ? `OpenAI transcription connection closed (${code}): ${detail}`
132
- : `OpenAI transcription connection closed (${code})`));
133
- });
134
- }
135
- appendAudio(audio) {
136
- if (audio.length === 0 || this.aborted || this.failure || this.completedTranscript)
137
- return;
138
- this.hasAudio = true;
139
- if (!this.ready) {
140
- this.pendingAudio.push(audio);
141
- return;
142
- }
143
- this.sendAudio(audio);
144
- }
145
- async finish(options = {}) {
146
- const abortListener = () => this.abort();
147
- if (options.signal?.aborted) {
148
- abortListener();
149
- }
150
- else {
151
- options.signal?.addEventListener("abort", abortListener, { once: true });
152
- }
153
- try {
154
- await this.readyPromise;
155
- if (this.failure)
156
- throw this.failure;
157
- if (this.aborted)
158
- throw new Error("OpenAI transcription was aborted");
159
- if (this.completedTranscript)
160
- return this.completedTranscript;
161
- if (!this.hasAudio)
162
- throw new Error("OpenAI transcription received no audio");
163
- const completion = new Promise((resolve, reject) => {
164
- this.resolveCompletion = resolve;
165
- this.rejectCompletion = reject;
166
- });
167
- this.completionTimeout = setTimeout(() => {
168
- this.fail(new Error("timed out waiting for OpenAI transcription"));
169
- this.socket.terminate();
170
- }, OPENAI_TRANSCRIPTION_COMPLETION_TIMEOUT_MS);
171
- this.completionTimeout.unref?.();
172
- this.send({ type: "input_audio_buffer.commit" });
173
- return await completion;
174
- }
175
- finally {
176
- options.signal?.removeEventListener("abort", abortListener);
177
- }
178
- }
179
- abort() {
180
- if (this.aborted || this.completedTranscript)
181
- return;
182
- const error = new Error("OpenAI transcription was aborted");
183
- this.aborted = true;
184
- this.pendingAudio = [];
185
- this.keywordAbortController.abort(error);
186
- this.clearTimers();
187
- this.rejectReady?.(error);
188
- this.rejectCompletion?.(error);
189
- this.clearWaiters();
190
- this.socket.close();
191
- }
192
- async configureSession() {
193
- const keywords = await this.keywordsPromise;
194
- if (this.aborted || this.failure)
195
- return;
196
- this.send({
197
- type: "session.update",
198
- session: {
199
- type: "transcription",
200
- audio: {
201
- input: {
202
- format: {
203
- type: "audio/pcm",
204
- rate: OPENAI_STREAMING_SAMPLE_RATE,
205
- },
206
- transcription: {
207
- model: OPENAI_STREAMING_TRANSCRIPTION_MODEL,
208
- prompt: OPENAI_REALTIME_TRANSCRIPTION_PROMPT,
209
- ...(keywords.length > 0 ? { keywords } : {}),
210
- languages: ["en", "fi"],
211
- delay: "medium",
212
- },
213
- turn_detection: null,
214
- },
215
- },
216
- },
217
- });
218
- }
219
- handleMessage(data) {
220
- let payload;
221
- try {
222
- payload = JSON.parse(formatWebSocketMessage(data));
223
- }
224
- catch {
225
- this.fail(new Error("OpenAI transcription returned malformed JSON"));
226
- return;
227
- }
228
- const event = eventSchema.safeParse(payload);
229
- if (!event.success) {
230
- this.fail(new Error("OpenAI transcription returned a malformed event"));
231
- return;
232
- }
233
- if (event.data.type === "session.updated") {
234
- this.ready = true;
235
- if (this.readyTimeout)
236
- clearTimeout(this.readyTimeout);
237
- this.readyTimeout = undefined;
238
- const pendingAudio = this.pendingAudio;
239
- this.pendingAudio = [];
240
- for (const audio of pendingAudio) {
241
- this.sendAudio(audio);
242
- }
243
- if (this.failure)
244
- return;
245
- this.resolveReady?.();
246
- this.resolveReady = undefined;
247
- this.rejectReady = undefined;
248
- return;
249
- }
250
- if (event.data.type === "error") {
251
- const parsed = errorEventSchema.safeParse(payload);
252
- this.fail(new Error(parsed.success ? parsed.data.error.message : "OpenAI transcription returned an error"));
253
- return;
254
- }
255
- if (event.data.type === "conversation.item.input_audio_transcription.failed") {
256
- const parsed = transcriptionFailedEventSchema.safeParse(payload);
257
- this.fail(new Error(parsed.success
258
- ? parsed.data.error.message
259
- : "OpenAI transcription failed with a malformed error"));
260
- return;
261
- }
262
- if (event.data.type === "conversation.item.input_audio_transcription.completed") {
263
- const parsed = transcriptionCompletedEventSchema.safeParse(payload);
264
- if (!parsed.success) {
265
- this.fail(new Error("transcription result was empty or malformed"));
266
- return;
267
- }
268
- this.completedTranscript = parsed.data.transcript;
269
- this.clearTimers();
270
- this.resolveCompletion?.(this.completedTranscript);
271
- this.clearWaiters();
272
- this.socket.close();
273
- }
274
- }
275
- sendAudio(audio) {
276
- this.send({
277
- type: "input_audio_buffer.append",
278
- audio: audio.toString("base64"),
279
- });
280
- }
281
- send(event) {
282
- if (this.failure || this.aborted)
283
- return;
284
- try {
285
- this.socket.send(JSON.stringify(event), (error) => {
286
- if (error) {
287
- this.fail(new Error(`failed to send OpenAI transcription audio: ${error.message}`));
288
- }
289
- });
290
- }
291
- catch (error) {
292
- this.fail(new Error(`failed to send OpenAI transcription audio: ${error.message}`));
293
- }
294
- }
295
- fail(error) {
296
- if (this.failure || this.aborted || this.completedTranscript)
297
- return;
298
- this.failure = error;
299
- this.pendingAudio = [];
300
- this.keywordAbortController.abort(error);
301
- this.clearTimers();
302
- this.rejectReady?.(error);
303
- this.rejectCompletion?.(error);
304
- this.clearWaiters();
305
- this.socket.terminate();
306
- }
307
- clearTimers() {
308
- if (this.readyTimeout)
309
- clearTimeout(this.readyTimeout);
310
- if (this.completionTimeout)
311
- clearTimeout(this.completionTimeout);
312
- this.readyTimeout = undefined;
313
- this.completionTimeout = undefined;
314
- }
315
- clearWaiters() {
316
- this.resolveReady = undefined;
317
- this.rejectReady = undefined;
318
- this.resolveCompletion = undefined;
319
- this.rejectCompletion = undefined;
320
- }
321
- }
322
- export function startOpenAITranscription(options) {
323
- return new OpenAIStreamingTranscriptionImpl(options);
324
- }
325
- export async function transcribeOpenAIAudio(options) {
326
- const apiKey = options.apiKey.trim();
327
- if (!apiKey) {
328
- throw new Error("missing OpenAI API key");
329
- }
330
- const pcm = await decodeOpenAIAudio({
331
- audio: options.audio,
332
- signal: options.signal,
333
- spawnImpl: options.spawnImpl,
334
- });
335
- const fetchFn = options.fetchImpl ?? fetch;
336
- const prompt = buildOpenAIFileTranscriptionPrompt(options.context);
337
- const chunkCount = Math.ceil(pcm.length / OPENAI_TRANSCRIPTION_MAX_UPLOAD_PCM_BYTES);
338
- const transcripts = new Array(chunkCount);
339
- const chunkAbortController = new AbortController();
340
- const signal = options.signal
341
- ? AbortSignal.any([options.signal, chunkAbortController.signal])
342
- : chunkAbortController.signal;
343
- let nextChunkIndex = 0;
344
- let failed = false;
345
- let failure;
346
- const transcribeNextChunks = async () => {
347
- while (!failed) {
348
- const chunkIndex = nextChunkIndex;
349
- if (chunkIndex >= chunkCount)
350
- return;
351
- nextChunkIndex += 1;
352
- const offset = chunkIndex * OPENAI_TRANSCRIPTION_MAX_UPLOAD_PCM_BYTES;
353
- try {
354
- signal.throwIfAborted();
355
- transcripts[chunkIndex] = await transcribeOpenAIPcmChunk({
356
- apiKey,
357
- pcm: pcm.subarray(offset, offset + OPENAI_TRANSCRIPTION_MAX_UPLOAD_PCM_BYTES),
358
- prompt,
359
- signal,
360
- fetchImpl: fetchFn,
361
- });
362
- }
363
- catch (error) {
364
- if (failed)
365
- return;
366
- failed = true;
367
- failure = error;
368
- chunkAbortController.abort(error);
369
- }
370
- }
371
- };
372
- await Promise.all(Array.from({ length: Math.min(chunkCount, OPENAI_TRANSCRIPTION_MAX_CONCURRENT_UPLOADS) }, transcribeNextChunks));
373
- if (failed)
374
- throw failure;
375
- return transcripts.join(" ");
376
- }
377
- async function transcribeOpenAIPcmChunk(args) {
378
- const wav = createPcmWav(args.pcm);
379
- const formData = new FormData();
380
- formData.append("model", OPENAI_FILE_TRANSCRIPTION_MODEL);
381
- formData.append("file", new Blob([Uint8Array.from(wav)], { type: "audio/wav" }), "speech.wav");
382
- formData.append("prompt", args.prompt);
383
- const response = await args.fetchImpl(OPENAI_FILE_TRANSCRIPTION_URL, {
384
- method: "POST",
385
- headers: { Authorization: `Bearer ${args.apiKey}` },
386
- body: formData,
387
- signal: args.signal,
388
- });
389
- const responseText = await response.text();
390
- let payload;
391
- try {
392
- payload = responseText ? JSON.parse(responseText) : undefined;
393
- }
394
- catch {
395
- payload = undefined;
396
- }
397
- if (!response.ok) {
398
- const parsed = fileErrorSchema.safeParse(payload);
399
- throw new Error(parsed.success ? parsed.data.error.message : responseText.trim() || `HTTP ${response.status}`);
400
- }
401
- const parsed = fileSuccessSchema.safeParse(payload);
402
- if (!parsed.success) {
403
- throw new Error("transcription result was empty or malformed");
404
- }
405
- return parsed.data.text;
406
- }
407
- async function decodeOpenAIAudio(args) {
408
- const spawnImpl = args.spawnImpl ?? spawnWithCapture;
409
- const decoderAbortController = new AbortController();
410
- const signal = args.signal
411
- ? AbortSignal.any([args.signal, decoderAbortController.signal])
412
- : decoderAbortController.signal;
413
- const chunks = [];
414
- const startedAt = Date.now();
415
- let decodedBytes = 0;
416
- let timeout;
417
- const scheduleTimeout = () => {
418
- if (timeout)
419
- clearTimeout(timeout);
420
- const decodedDurationMs = (decodedBytes / (OPENAI_FILE_SAMPLE_RATE * 2)) * 1_000;
421
- const remainingMs = OPENAI_TRANSCRIPTION_DECODER_BASE_TIMEOUT_MS + decodedDurationMs - (Date.now() - startedAt);
422
- timeout = setTimeout(() => {
423
- decoderAbortController.abort(new Error("ffmpeg timed out while decoding audio for OpenAI transcription"));
424
- }, Math.max(remainingMs, 0));
425
- timeout.unref?.();
426
- };
427
- scheduleTimeout();
428
- let result;
429
- try {
430
- result = await spawnImpl("ffmpeg", [
431
- "-nostdin",
432
- "-hide_banner",
433
- "-loglevel",
434
- "error",
435
- "-i",
436
- "pipe:0",
437
- "-vn",
438
- "-ac",
439
- "1",
440
- "-ar",
441
- String(OPENAI_FILE_SAMPLE_RATE),
442
- "-c:a",
443
- "pcm_s16le",
444
- "-f",
445
- "s16le",
446
- "pipe:1",
447
- ], {
448
- input: args.audio,
449
- signal,
450
- maxCaptureBytes: OPENAI_TRANSCRIPTION_FFMPEG_OUTPUT_LIMIT_BYTES,
451
- captureOutput: "stderr",
452
- stdio: ["pipe", "pipe", "pipe"],
453
- onSpawn: (child) => {
454
- child.stdout?.on("data", (chunk) => {
455
- if (signal.aborted)
456
- return;
457
- decodedBytes += chunk.length;
458
- chunks.push(Buffer.from(chunk));
459
- scheduleTimeout();
460
- });
461
- },
462
- });
463
- }
464
- catch (error) {
465
- if (error.code === "ENOENT") {
466
- throw new Error("ffmpeg is required for OpenAI speech transcription");
467
- }
468
- throw error;
469
- }
470
- finally {
471
- if (timeout)
472
- clearTimeout(timeout);
473
- }
474
- if (result.aborted) {
475
- throw signal.reason instanceof Error
476
- ? signal.reason
477
- : new Error("OpenAI transcription was aborted");
478
- }
479
- if (result.exitCode !== 0) {
480
- const detail = result.stderr.trim();
481
- throw new Error(detail
482
- ? `ffmpeg failed to decode audio for OpenAI transcription: ${detail}`
483
- : `ffmpeg exited with code ${result.exitCode ?? "unknown"}`);
484
- }
485
- if (decodedBytes === 0) {
486
- throw new Error("audio contained no decodable speech data");
487
- }
488
- return Buffer.concat(chunks, decodedBytes);
489
- }
490
- function createPcmWav(pcm) {
491
- const header = Buffer.alloc(44);
492
- header.write("RIFF", 0, "ascii");
493
- header.writeUInt32LE(36 + pcm.length, 4);
494
- header.write("WAVE", 8, "ascii");
495
- header.write("fmt ", 12, "ascii");
496
- header.writeUInt32LE(16, 16);
497
- header.writeUInt16LE(1, 20);
498
- header.writeUInt16LE(1, 22);
499
- header.writeUInt32LE(OPENAI_FILE_SAMPLE_RATE, 24);
500
- header.writeUInt32LE(OPENAI_FILE_SAMPLE_RATE * 2, 28);
501
- header.writeUInt16LE(2, 32);
502
- header.writeUInt16LE(16, 34);
503
- header.write("data", 36, "ascii");
504
- header.writeUInt32LE(pcm.length, 40);
505
- return Buffer.concat([header, pcm]);
506
- }
507
- async function prepareOpenAITranscriptionKeywords(args) {
508
- const formattedContext = formatSpeechToTextContext(args.context);
509
- if (!formattedContext)
510
- return [];
511
- try {
512
- const response = await (args.fetchImpl ?? fetch)(OPENAI_RESPONSES_URL, {
513
- method: "POST",
514
- headers: {
515
- Authorization: `Bearer ${args.apiKey}`,
516
- "Content-Type": "application/json",
517
- },
518
- signal: AbortSignal.any([
519
- args.signal,
520
- AbortSignal.timeout(OPENAI_TRANSCRIPTION_KEYWORD_TIMEOUT_MS),
521
- ]),
522
- body: JSON.stringify({
523
- model: OPENAI_TRANSCRIPTION_KEYWORD_MODEL,
524
- instructions: SPEECH_TO_TEXT_KEYWORD_INSTRUCTIONS,
525
- input: formattedContext,
526
- reasoning: { effort: "low" },
527
- max_output_tokens: 2_048,
528
- store: false,
529
- text: OPENAI_TRANSCRIPTION_KEYWORD_TEXT_CONFIG,
530
- }),
531
- });
532
- if (!response.ok) {
533
- await response.body?.cancel().catch(() => { });
534
- return [];
535
- }
536
- const responseText = await response.text();
537
- const payload = responseText ? JSON.parse(responseText) : undefined;
538
- const output = responsesOutputSchema.safeParse(payload);
539
- if (!output.success)
540
- return [];
541
- const outputText = output.data.output
542
- .flatMap((item) => {
543
- const message = responsesMessageSchema.safeParse(item);
544
- return message.success ? message.data.content : [];
545
- })
546
- .flatMap((content) => {
547
- const parsed = responsesOutputTextSchema.safeParse(content);
548
- return parsed.success ? [parsed.data.text] : [];
549
- })
550
- .join("");
551
- const parsedKeywords = transcriptionKeywordsSchema.safeParse(JSON.parse(outputText));
552
- return parsedKeywords.success
553
- ? normalizeSpeechToTextKeywords(parsedKeywords.data.keywords, {
554
- maxTotalCharacters: OPENAI_TRANSCRIPTION_MAX_KEYWORD_CHARACTERS_TOTAL,
555
- })
556
- : [];
557
- }
558
- catch {
559
- return [];
560
- }
561
- }
562
- function buildOpenAIFileTranscriptionPrompt(context) {
563
- const formattedContext = formatSpeechToTextContext(context);
564
- const boundedContext = formattedContext
565
- ? truncateForTokens(formattedContext, {
566
- maxTokens: OPENAI_TRANSCRIPTION_CONTEXT_TOKENS,
567
- strategy: "tail",
568
- }).content.trim()
569
- : "";
570
- return [
571
- OPENAI_REALTIME_TRANSCRIPTION_PROMPT,
572
- boundedContext
573
- ? `Use this recent conversation only to resolve likely names, acronyms, terminology, and references:\n${boundedContext}`
574
- : undefined,
575
- ]
576
- .filter((line) => line !== undefined)
577
- .join("\n\n");
578
- }
579
- function formatWebSocketMessage(data) {
580
- if (typeof data === "string")
581
- return data;
582
- if (Buffer.isBuffer(data))
583
- return data.toString("utf8");
584
- if (data instanceof ArrayBuffer)
585
- return Buffer.from(data).toString("utf8");
586
- if (ArrayBuffer.isView(data)) {
587
- return Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString("utf8");
588
- }
589
- throw new Error("unsupported WebSocket message");
590
- }
591
- function defaultWebSocketFactory(url, options) {
592
- return new WebSocket(url, options);
593
- }
594
- //# sourceMappingURL=openai_transcription.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai_transcription.js","sourceRoot":"","sources":["../../../src/core/utils/openai_transcription.ts"],"names":[],"mappings":"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"}