@hyperdreamer/pi-webui 1.13.0 → 1.14.0
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.
- package/dist/cli.js +19 -4
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/CodeViewer-BEbclxBf.js +4 -0
- package/dist/client/assets/{UnifiedDiffViewer--UWVARrK.js → UnifiedDiffViewer-DXWhrIST.js} +1 -1
- package/dist/client/assets/{index-DXa2f-o6.js → index-2EIg2vwJ.js} +574 -487
- package/dist/client/assets/{vendor-editor-core-vUi74DnD.js → vendor-editor-core-vyMPzMNA.js} +1 -1
- package/dist/client/assets/vendor-editor-languages-DlEQaRIv.js +46 -0
- package/dist/client/index.html +3 -3
- package/dist/config.js +288 -4
- package/dist/config.js.map +1 -1
- package/dist/configMutationCoordinator.js +357 -0
- package/dist/configMutationCoordinator.js.map +1 -0
- package/dist/server/app.js +64 -1
- package/dist/server/app.js.map +1 -1
- package/dist/server/configRoutes.js +84 -18
- package/dist/server/configRoutes.js.map +1 -1
- package/dist/server/index.js +15 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/machines/machineProxyRoutes.js +6 -9
- package/dist/server/machines/machineProxyRoutes.js.map +1 -1
- package/dist/server/sessiond/configMutationWriters.js +18 -0
- package/dist/server/sessiond/configMutationWriters.js.map +1 -0
- package/dist/server/sessiond.js +7 -7
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/modelTierSettingsRoutes.js +5 -1
- package/dist/server/sessions/modelTierSettingsRoutes.js.map +1 -1
- package/dist/server/sessions/utilityModelSettingsRoutes.js +5 -1
- package/dist/server/sessions/utilityModelSettingsRoutes.js.map +1 -1
- package/dist/server/speechInput/openAiCompatibleTranscriptionProvider.js +357 -0
- package/dist/server/speechInput/openAiCompatibleTranscriptionProvider.js.map +1 -0
- package/dist/server/speechInput/piCompatibleCredentialResolver.js +348 -0
- package/dist/server/speechInput/piCompatibleCredentialResolver.js.map +1 -0
- package/dist/server/speechInput/speechInputSettingsRoutes.js +39 -0
- package/dist/server/speechInput/speechInputSettingsRoutes.js.map +1 -0
- package/dist/server/speechInput/speechInputSettingsService.js +247 -0
- package/dist/server/speechInput/speechInputSettingsService.js.map +1 -0
- package/dist/server/speechInput/speechInputTranscriptionRoutes.js +226 -0
- package/dist/server/speechInput/speechInputTranscriptionRoutes.js.map +1 -0
- package/dist/server/speechInput/speechTranscriptionService.js +116 -0
- package/dist/server/speechInput/speechTranscriptionService.js.map +1 -0
- package/dist/shared/apiTypes.d.ts +54 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/speechInput.js +75 -0
- package/dist/shared/speechInput.js.map +1 -0
- package/dist/shared/speechInputAudio.js +42 -0
- package/dist/shared/speechInputAudio.js.map +1 -0
- package/docs/config.md +86 -1
- package/package.json +1 -1
- package/dist/client/assets/CodeViewer-B1Rl2AYu.js +0 -4
- package/dist/client/assets/vendor-editor-languages-DoaXUodB.js +0 -46
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import { SPEECH_INPUT_MAX_TRANSCRIPT_BYTES, SPEECH_INPUT_PROVIDER_TIMEOUT_MS, speechInputAudioFilename, } from "../../shared/speechInputAudio.js";
|
|
2
|
+
import { speechInputTranscriptionEndpoint } from "../../shared/speechInput.js";
|
|
3
|
+
/** Stable provider failure; its message intentionally never includes upstream data. */
|
|
4
|
+
export class SpeechInputProviderError extends Error {
|
|
5
|
+
constructor() {
|
|
6
|
+
super("Speech transcription provider request failed.");
|
|
7
|
+
this.code = "SPEECH_INPUT_PROVIDER";
|
|
8
|
+
this.name = "SpeechInputProviderError";
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** The provider's one shared headers-and-body deadline expired. */
|
|
12
|
+
export class SpeechInputProviderTimeoutError extends Error {
|
|
13
|
+
constructor() {
|
|
14
|
+
super("Speech transcription provider timed out.");
|
|
15
|
+
this.code = "SPEECH_INPUT_PROVIDER_TIMEOUT";
|
|
16
|
+
this.name = "SpeechInputProviderTimeoutError";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Request ownership ended before transcription could produce a result. */
|
|
20
|
+
export class SpeechInputTranscriptionAbortedError extends Error {
|
|
21
|
+
constructor() {
|
|
22
|
+
super("Speech transcription was cancelled.");
|
|
23
|
+
this.code = "SPEECH_INPUT_TRANSCRIPTION_ABORTED";
|
|
24
|
+
this.name = "SpeechInputTranscriptionAbortedError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const providerFailure = () => new SpeechInputProviderError();
|
|
28
|
+
/**
|
|
29
|
+
* OpenAI-compatible multipart transcription adapter. The explicit terminal
|
|
30
|
+
* race keeps callers responsive even when a Fetch or stream implementation
|
|
31
|
+
* observes its AbortSignal late (or not at all).
|
|
32
|
+
*/
|
|
33
|
+
export class OpenAiCompatibleTranscriptionProvider {
|
|
34
|
+
constructor(dependencies = {}) {
|
|
35
|
+
this.fetch = dependencies.fetch ?? globalThis.fetch.bind(globalThis);
|
|
36
|
+
this.now = dependencies.now ?? (() => performance.now());
|
|
37
|
+
this.scheduleDeadline = dependencies.scheduleDeadline ?? defaultScheduleDeadline;
|
|
38
|
+
}
|
|
39
|
+
async transcribe(request) {
|
|
40
|
+
if (isAborted(request.signal))
|
|
41
|
+
throw new SpeechInputTranscriptionAbortedError();
|
|
42
|
+
const controller = new AbortController();
|
|
43
|
+
const terminal = createTerminalState();
|
|
44
|
+
const cancelledResponseBodies = new WeakSet();
|
|
45
|
+
let reader;
|
|
46
|
+
let cancelDeadline;
|
|
47
|
+
let callerAbortListener;
|
|
48
|
+
const abortActiveReader = () => {
|
|
49
|
+
if (reader === undefined)
|
|
50
|
+
return;
|
|
51
|
+
cancelReader(reader);
|
|
52
|
+
releaseReader(reader);
|
|
53
|
+
};
|
|
54
|
+
const cancelResponse = (response) => {
|
|
55
|
+
cancelResponseBody(response, cancelledResponseBodies);
|
|
56
|
+
};
|
|
57
|
+
const terminate = (error) => {
|
|
58
|
+
if (!terminal.terminate(error))
|
|
59
|
+
return;
|
|
60
|
+
try {
|
|
61
|
+
controller.abort();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Aborting only accelerates collaborator cleanup; terminal ownership is
|
|
65
|
+
// already decided by the explicit rejection race below.
|
|
66
|
+
}
|
|
67
|
+
abortActiveReader();
|
|
68
|
+
};
|
|
69
|
+
try {
|
|
70
|
+
const startedAt = this.now();
|
|
71
|
+
const deadlineAt = startedAt + SPEECH_INPUT_PROVIDER_TIMEOUT_MS;
|
|
72
|
+
cancelDeadline = this.scheduleDeadline(() => {
|
|
73
|
+
terminate(new SpeechInputProviderTimeoutError());
|
|
74
|
+
}, Math.max(0, deadlineAt - this.now()));
|
|
75
|
+
callerAbortListener = () => {
|
|
76
|
+
terminate(new SpeechInputTranscriptionAbortedError());
|
|
77
|
+
};
|
|
78
|
+
request.signal.addEventListener("abort", callerAbortListener, { once: true });
|
|
79
|
+
if (isAborted(request.signal)) {
|
|
80
|
+
terminate(new SpeechInputTranscriptionAbortedError());
|
|
81
|
+
throw new SpeechInputTranscriptionAbortedError();
|
|
82
|
+
}
|
|
83
|
+
let endpoint;
|
|
84
|
+
try {
|
|
85
|
+
endpoint = speechInputTranscriptionEndpoint(request.baseUrl);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
throw providerFailure();
|
|
89
|
+
}
|
|
90
|
+
const form = new FormData();
|
|
91
|
+
const audio = new Blob([copyBytesToArrayBuffer(request.audio)], { type: request.mimeType });
|
|
92
|
+
form.append("file", audio, speechInputAudioFilename(request.mimeType));
|
|
93
|
+
form.append("model", request.model);
|
|
94
|
+
if (request.language !== undefined)
|
|
95
|
+
form.append("language", request.language);
|
|
96
|
+
// This continuation is intentionally attached before awaiting the fetch:
|
|
97
|
+
// a late abort-ignoring response must not retain its body indefinitely.
|
|
98
|
+
const fetchPromise = Promise.resolve().then(async () => {
|
|
99
|
+
const terminalError = terminal.currentError();
|
|
100
|
+
if (terminalError !== undefined)
|
|
101
|
+
throw terminalError;
|
|
102
|
+
if (isAborted(request.signal))
|
|
103
|
+
throw new SpeechInputTranscriptionAbortedError();
|
|
104
|
+
return await this.fetch(endpoint, {
|
|
105
|
+
method: "POST",
|
|
106
|
+
headers: { authorization: `Bearer ${request.apiKey}` },
|
|
107
|
+
body: form,
|
|
108
|
+
redirect: "manual",
|
|
109
|
+
signal: controller.signal,
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
void fetchPromise.then((response) => {
|
|
113
|
+
if (terminal.currentError() !== undefined)
|
|
114
|
+
cancelResponse(response);
|
|
115
|
+
}, () => undefined);
|
|
116
|
+
let response;
|
|
117
|
+
try {
|
|
118
|
+
response = await raceWithTerminal(fetchPromise, terminal);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
throw normalizeTerminalOrProviderError(error, terminal, request.signal);
|
|
122
|
+
}
|
|
123
|
+
const afterFetchTerminalError = terminal.currentError();
|
|
124
|
+
if (afterFetchTerminalError !== undefined) {
|
|
125
|
+
cancelResponse(response);
|
|
126
|
+
throw afterFetchTerminalError;
|
|
127
|
+
}
|
|
128
|
+
if (isAborted(request.signal)) {
|
|
129
|
+
cancelResponse(response);
|
|
130
|
+
throw new SpeechInputTranscriptionAbortedError();
|
|
131
|
+
}
|
|
132
|
+
if (response.status < 200 || response.status >= 300) {
|
|
133
|
+
cancelResponse(response);
|
|
134
|
+
throw providerFailure();
|
|
135
|
+
}
|
|
136
|
+
const body = response.body;
|
|
137
|
+
if (body === null)
|
|
138
|
+
throw providerFailure();
|
|
139
|
+
let streamReader;
|
|
140
|
+
try {
|
|
141
|
+
streamReader = body.getReader();
|
|
142
|
+
}
|
|
143
|
+
catch {
|
|
144
|
+
cancelResponse(response);
|
|
145
|
+
throw providerFailure();
|
|
146
|
+
}
|
|
147
|
+
const activeReader = { reader: streamReader, cancelled: false, released: false };
|
|
148
|
+
reader = activeReader;
|
|
149
|
+
const chunks = [];
|
|
150
|
+
let byteLength = 0;
|
|
151
|
+
try {
|
|
152
|
+
for (;;) {
|
|
153
|
+
const beforeReadTerminalError = terminal.currentError();
|
|
154
|
+
if (beforeReadTerminalError !== undefined)
|
|
155
|
+
throw beforeReadTerminalError;
|
|
156
|
+
if (isAborted(request.signal))
|
|
157
|
+
throw new SpeechInputTranscriptionAbortedError();
|
|
158
|
+
let pendingRead;
|
|
159
|
+
try {
|
|
160
|
+
pendingRead = streamReader.read();
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
throw providerFailure();
|
|
164
|
+
}
|
|
165
|
+
// When terminal ownership wins the race, this continuation handles a
|
|
166
|
+
// later ignored-abort read without letting it retain a reader lock.
|
|
167
|
+
void pendingRead.then(() => {
|
|
168
|
+
if (terminal.currentError() !== undefined || isAborted(request.signal)) {
|
|
169
|
+
abortActiveReader();
|
|
170
|
+
}
|
|
171
|
+
}, () => {
|
|
172
|
+
if (terminal.currentError() !== undefined || isAborted(request.signal)) {
|
|
173
|
+
abortActiveReader();
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
let result;
|
|
177
|
+
try {
|
|
178
|
+
result = await raceWithTerminal(pendingRead, terminal);
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
throw normalizeTerminalOrProviderError(error, terminal, request.signal);
|
|
182
|
+
}
|
|
183
|
+
const afterReadTerminalError = terminal.currentError();
|
|
184
|
+
if (afterReadTerminalError !== undefined)
|
|
185
|
+
throw afterReadTerminalError;
|
|
186
|
+
if (isAborted(request.signal))
|
|
187
|
+
throw new SpeechInputTranscriptionAbortedError();
|
|
188
|
+
if (result.done)
|
|
189
|
+
break;
|
|
190
|
+
const chunk = result.value;
|
|
191
|
+
byteLength += chunk.byteLength;
|
|
192
|
+
if (byteLength > SPEECH_INPUT_MAX_TRANSCRIPT_BYTES) {
|
|
193
|
+
cancelReader(activeReader);
|
|
194
|
+
throw providerFailure();
|
|
195
|
+
}
|
|
196
|
+
chunks.push(chunk);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
releaseReader(activeReader);
|
|
201
|
+
}
|
|
202
|
+
const beforeResultTerminalError = terminal.currentError();
|
|
203
|
+
if (beforeResultTerminalError !== undefined)
|
|
204
|
+
throw beforeResultTerminalError;
|
|
205
|
+
if (isAborted(request.signal))
|
|
206
|
+
throw new SpeechInputTranscriptionAbortedError();
|
|
207
|
+
return parseTranscript(Buffer.concat(chunks, byteLength));
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
if (error instanceof SpeechInputProviderError
|
|
211
|
+
|| error instanceof SpeechInputProviderTimeoutError
|
|
212
|
+
|| error instanceof SpeechInputTranscriptionAbortedError) {
|
|
213
|
+
throw error;
|
|
214
|
+
}
|
|
215
|
+
const terminalError = terminal.currentError();
|
|
216
|
+
if (terminalError !== undefined)
|
|
217
|
+
throw terminalError;
|
|
218
|
+
if (isAborted(request.signal))
|
|
219
|
+
throw new SpeechInputTranscriptionAbortedError();
|
|
220
|
+
throw providerFailure();
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
if (reader !== undefined && (terminal.currentError() !== undefined || isAborted(request.signal))) {
|
|
224
|
+
cancelReader(reader);
|
|
225
|
+
}
|
|
226
|
+
if (reader !== undefined)
|
|
227
|
+
releaseReader(reader);
|
|
228
|
+
try {
|
|
229
|
+
cancelDeadline?.();
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// Timer cleanup cannot change a settled transcription outcome.
|
|
233
|
+
}
|
|
234
|
+
if (callerAbortListener !== undefined)
|
|
235
|
+
request.signal.removeEventListener("abort", callerAbortListener);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function createTerminalState() {
|
|
240
|
+
let error;
|
|
241
|
+
let rejectPromise;
|
|
242
|
+
const promise = new Promise((_resolve, reject) => {
|
|
243
|
+
rejectPromise = reject;
|
|
244
|
+
});
|
|
245
|
+
// A stale injected scheduler may invoke its callback after the operation has
|
|
246
|
+
// already completed. Keep that terminal signal observed in that case while
|
|
247
|
+
// preserving its rejection for the active Promise.race.
|
|
248
|
+
void promise.catch(() => undefined);
|
|
249
|
+
return {
|
|
250
|
+
promise,
|
|
251
|
+
currentError: () => error,
|
|
252
|
+
terminate: (nextError) => {
|
|
253
|
+
if (error !== undefined)
|
|
254
|
+
return false;
|
|
255
|
+
error = nextError;
|
|
256
|
+
rejectPromise(nextError);
|
|
257
|
+
return true;
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
async function raceWithTerminal(promise, terminal) {
|
|
262
|
+
try {
|
|
263
|
+
return await Promise.race([promise, terminal.promise]);
|
|
264
|
+
}
|
|
265
|
+
catch (error) {
|
|
266
|
+
const terminalError = terminal.currentError();
|
|
267
|
+
if (terminalError !== undefined)
|
|
268
|
+
throw terminalError;
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function normalizeTerminalOrProviderError(error, terminal, signal) {
|
|
273
|
+
const terminalError = terminal.currentError();
|
|
274
|
+
if (terminalError !== undefined)
|
|
275
|
+
return terminalError;
|
|
276
|
+
if (isAborted(signal))
|
|
277
|
+
return new SpeechInputTranscriptionAbortedError();
|
|
278
|
+
if (error instanceof SpeechInputProviderError
|
|
279
|
+
|| error instanceof SpeechInputProviderTimeoutError
|
|
280
|
+
|| error instanceof SpeechInputTranscriptionAbortedError) {
|
|
281
|
+
return error;
|
|
282
|
+
}
|
|
283
|
+
return providerFailure();
|
|
284
|
+
}
|
|
285
|
+
function parseTranscript(bytes) {
|
|
286
|
+
let value;
|
|
287
|
+
try {
|
|
288
|
+
value = JSON.parse(bytes.toString("utf8"));
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
throw providerFailure();
|
|
292
|
+
}
|
|
293
|
+
if (!isRecord(value))
|
|
294
|
+
throw providerFailure();
|
|
295
|
+
const text = value["text"];
|
|
296
|
+
if (typeof text !== "string")
|
|
297
|
+
throw providerFailure();
|
|
298
|
+
const normalized = text.trim();
|
|
299
|
+
if (normalized === "" || Buffer.byteLength(normalized, "utf8") > SPEECH_INPUT_MAX_TRANSCRIPT_BYTES) {
|
|
300
|
+
throw providerFailure();
|
|
301
|
+
}
|
|
302
|
+
return normalized;
|
|
303
|
+
}
|
|
304
|
+
function cancelResponseBody(response, cancelledResponseBodies) {
|
|
305
|
+
const body = response.body;
|
|
306
|
+
if (body === null)
|
|
307
|
+
return;
|
|
308
|
+
if (cancelledResponseBodies.has(body))
|
|
309
|
+
return;
|
|
310
|
+
cancelledResponseBodies.add(body);
|
|
311
|
+
try {
|
|
312
|
+
void body.cancel().catch(() => undefined);
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
// A response body can already be locked or canceled; terminal cleanup is
|
|
316
|
+
// still complete from this operation's perspective.
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
function cancelReader(active) {
|
|
320
|
+
if (active.cancelled)
|
|
321
|
+
return;
|
|
322
|
+
active.cancelled = true;
|
|
323
|
+
try {
|
|
324
|
+
void active.reader.cancel().catch(() => undefined);
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
// Reader cancellation is best effort after terminal ownership is chosen.
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
function releaseReader(active) {
|
|
331
|
+
if (active.released)
|
|
332
|
+
return;
|
|
333
|
+
try {
|
|
334
|
+
active.reader.releaseLock();
|
|
335
|
+
active.released = true;
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
// A pending read can temporarily retain the lock. Its late continuation
|
|
339
|
+
// retries this function once the read settles.
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
function copyBytesToArrayBuffer(bytes) {
|
|
343
|
+
const copy = new Uint8Array(bytes.byteLength);
|
|
344
|
+
copy.set(bytes);
|
|
345
|
+
return copy.buffer;
|
|
346
|
+
}
|
|
347
|
+
function isRecord(value) {
|
|
348
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
349
|
+
}
|
|
350
|
+
function isAborted(signal) {
|
|
351
|
+
return signal.aborted;
|
|
352
|
+
}
|
|
353
|
+
function defaultScheduleDeadline(callback, delayMs) {
|
|
354
|
+
const timer = setTimeout(callback, delayMs);
|
|
355
|
+
return () => { clearTimeout(timer); };
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=openAiCompatibleTranscriptionProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openAiCompatibleTranscriptionProvider.js","sourceRoot":"","sources":["../../../src/server/speechInput/openAiCompatibleTranscriptionProvider.ts"],"names":[],"mappings":"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"}
|