@hyperdreamer/pi-webui 1.12.3 → 1.13.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.
@@ -0,0 +1,160 @@
1
+ import { truncateHostSpeechText } from "../../shared/hostSpeech.js";
2
+ import { HostSpeechUnavailableError, } from "./hostSpeech.js";
3
+ const DEFAULT_CANCELED_RUN_LIMIT = 64;
4
+ const CLOSED_REASON = "Host speech is closed.";
5
+ export class HostSpeechService {
6
+ constructor(provider, options = {}) {
7
+ this.provider = provider;
8
+ this.canceledRuns = new Set();
9
+ this.control = Promise.resolve();
10
+ this.closed = false;
11
+ const canceledRunLimit = options.canceledRunLimit ?? DEFAULT_CANCELED_RUN_LIMIT;
12
+ if (!Number.isSafeInteger(canceledRunLimit) || canceledRunLimit < 0) {
13
+ throw new RangeError("canceledRunLimit must be a non-negative safe integer");
14
+ }
15
+ this.canceledRunLimit = canceledRunLimit;
16
+ }
17
+ status() {
18
+ if (this.closed)
19
+ return Promise.resolve(unavailableStatus());
20
+ return this.provider.status();
21
+ }
22
+ speak(input) {
23
+ if (this.closed)
24
+ return Promise.reject(unavailableError());
25
+ const result = deferred();
26
+ void this.serializeControl(async () => {
27
+ if (this.closed) {
28
+ result.reject(unavailableError());
29
+ return;
30
+ }
31
+ if (this.canceledRuns.has(input.runId)) {
32
+ result.resolve(canceledResult(input.runId));
33
+ return;
34
+ }
35
+ const previous = this.active;
36
+ if (previous !== undefined)
37
+ await this.provider.cancelSelf();
38
+ if (this.isClosed()) {
39
+ result.reject(unavailableError());
40
+ return;
41
+ }
42
+ const active = { request: input, result };
43
+ this.active = active;
44
+ this.enqueue(active);
45
+ }).catch((error) => {
46
+ result.reject(error);
47
+ });
48
+ return result.promise;
49
+ }
50
+ stop(runId) {
51
+ return this.serializeControl(async () => {
52
+ this.rememberCanceledRun(runId);
53
+ const active = this.active;
54
+ if (active?.request.runId !== runId)
55
+ return undefined;
56
+ await this.provider.cancelSelf();
57
+ return canceledResult(runId);
58
+ });
59
+ }
60
+ close() {
61
+ if (this.closePromise !== undefined)
62
+ return this.closePromise;
63
+ this.closed = true;
64
+ this.closePromise = this.serializeControl(async () => {
65
+ const active = this.active;
66
+ try {
67
+ if (active !== undefined) {
68
+ try {
69
+ const cancellation = this.provider.cancelSelf();
70
+ this.settleCanceled(active);
71
+ await cancellation;
72
+ }
73
+ finally {
74
+ this.settleCanceled(active);
75
+ }
76
+ }
77
+ }
78
+ finally {
79
+ await this.provider.close();
80
+ }
81
+ });
82
+ return this.closePromise;
83
+ }
84
+ serializeControl(operation) {
85
+ const next = this.control.then(operation, operation);
86
+ this.control = next.then(() => undefined, () => undefined);
87
+ return next;
88
+ }
89
+ isClosed() {
90
+ return this.closed;
91
+ }
92
+ enqueue(active) {
93
+ let pending;
94
+ try {
95
+ pending = this.provider.enqueue({
96
+ text: truncateHostSpeechText(active.request.text),
97
+ ...(active.request.voice === undefined ? {} : { voice: active.request.voice }),
98
+ rate: active.request.rate,
99
+ });
100
+ }
101
+ catch (error) {
102
+ this.handleFailure(active, error);
103
+ return;
104
+ }
105
+ void pending.then((utterance) => {
106
+ active.messageId = utterance.messageId;
107
+ void utterance.terminal.then((outcome) => {
108
+ this.handleTerminal(active, outcome);
109
+ }, (error) => {
110
+ this.handleFailure(active, error);
111
+ });
112
+ }, (error) => {
113
+ this.handleFailure(active, error);
114
+ });
115
+ }
116
+ rememberCanceledRun(runId) {
117
+ if (this.canceledRunLimit === 0 || this.canceledRuns.has(runId))
118
+ return;
119
+ this.canceledRuns.add(runId);
120
+ if (this.canceledRuns.size <= this.canceledRunLimit)
121
+ return;
122
+ const oldest = this.canceledRuns.values().next().value;
123
+ if (oldest !== undefined)
124
+ this.canceledRuns.delete(oldest);
125
+ }
126
+ handleTerminal(active, outcome) {
127
+ if (this.active === active)
128
+ this.active = undefined;
129
+ active.result.resolve({ runId: active.request.runId, outcome });
130
+ }
131
+ handleFailure(active, error) {
132
+ if (this.active === active)
133
+ this.active = undefined;
134
+ active.result.reject(error);
135
+ }
136
+ settleCanceled(active) {
137
+ if (this.active === active)
138
+ this.active = undefined;
139
+ active.result.resolve(canceledResult(active.request.runId));
140
+ }
141
+ }
142
+ function deferred() {
143
+ let resolve;
144
+ let reject;
145
+ const promise = new Promise((resolvePromise, rejectPromise) => {
146
+ resolve = resolvePromise;
147
+ reject = rejectPromise;
148
+ });
149
+ return { promise, resolve, reject };
150
+ }
151
+ function canceledResult(runId) {
152
+ return { runId, outcome: "canceled" };
153
+ }
154
+ function unavailableStatus() {
155
+ return { available: false, reason: CLOSED_REASON, voices: [] };
156
+ }
157
+ function unavailableError() {
158
+ return new HostSpeechUnavailableError(CLOSED_REASON);
159
+ }
160
+ //# sourceMappingURL=hostSpeechService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hostSpeechService.js","sourceRoot":"","sources":["../../../src/server/tts/hostSpeechService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,446 @@
1
+ import { createConnection } from "node:net";
2
+ import { homedir } from "node:os";
3
+ import { StringDecoder } from "node:string_decoder";
4
+ import { HostSpeechUnavailableError, } from "./hostSpeech.js";
5
+ import { SsipFrameParser, ssipDataPayload, ssipMessageId, ssipTerminalEvent } from "./ssipProtocol.js";
6
+ const UNAVAILABLE_MESSAGE = "Speech Dispatcher is unavailable on the local gateway.";
7
+ const CONNECT_TIMEOUT_MS = 2_000;
8
+ const COMMAND_TIMEOUT_MS = 3_000;
9
+ const CANCEL_TIMEOUT_MS = 3_000;
10
+ const MAX_TERMINAL_TIMEOUT_MS = 300_000;
11
+ const TERMINAL_TIMEOUT_BASE_MS = 30_000;
12
+ const TERMINAL_TIMEOUT_PER_CHAR_MS = 75;
13
+ const EARLY_TERMINAL_LIMIT = 64;
14
+ function noop() {
15
+ // Intentionally empty until a deadline is installed.
16
+ }
17
+ export class SpeechDispatcherAdapter {
18
+ constructor(options = {}) {
19
+ this.commandChain = Promise.resolve();
20
+ this.parser = new SsipFrameParser();
21
+ this.pendingUtterances = new Map();
22
+ this.earlyTerminals = new Map();
23
+ this.hasNamedVoice = false;
24
+ this.hasRefreshedNamedVoiceCache = false;
25
+ this.isClosed = false;
26
+ this.platform = options.platform ?? process.platform;
27
+ this.env = options.env ?? process.env;
28
+ this.homeDir = options.homeDir ?? this.env["HOME"] ?? homedir();
29
+ this.createTransport = options.createTransport ?? createNodeSsipTransport;
30
+ this.scheduleDeadline = options.scheduleDeadline ?? scheduleTimeout;
31
+ }
32
+ async status() {
33
+ if (!this.supported())
34
+ return unavailableStatus();
35
+ try {
36
+ const voices = await this.runSerialized(async () => this.listVoices());
37
+ return { available: true, voices: voices.map(copyVoice) };
38
+ }
39
+ catch {
40
+ return unavailableStatus();
41
+ }
42
+ }
43
+ async enqueue(input) {
44
+ validateRate(input.rate);
45
+ if (!this.supported())
46
+ throw unavailableError();
47
+ try {
48
+ return await this.runSerialized(async () => this.enqueueSerialized(input));
49
+ }
50
+ catch (error) {
51
+ if (error instanceof HostSpeechUnavailableError || isInputError(error))
52
+ throw error;
53
+ throw unavailableError();
54
+ }
55
+ }
56
+ async cancelSelf() {
57
+ if (!this.supported())
58
+ throw unavailableError();
59
+ try {
60
+ await this.runSerialized(async () => {
61
+ await this.ensureInitialized();
62
+ await this.sendCommand("CANCEL self", 213, CANCEL_TIMEOUT_MS);
63
+ });
64
+ }
65
+ catch (error) {
66
+ if (error instanceof HostSpeechUnavailableError)
67
+ throw error;
68
+ throw normalizeError(error);
69
+ }
70
+ }
71
+ close() {
72
+ if (this.isClosed)
73
+ return Promise.resolve();
74
+ this.isClosed = true;
75
+ this.resetConnection(new Error("Speech Dispatcher connection was closed."));
76
+ return Promise.resolve();
77
+ }
78
+ async enqueueSerialized(input) {
79
+ if (input.voice === undefined && this.hasNamedVoice)
80
+ this.resetConnection(new Error("Reset named speech voice."));
81
+ await this.ensureInitialized();
82
+ if (input.voice !== undefined) {
83
+ const voices = this.hasRefreshedNamedVoiceCache && this.voices !== undefined
84
+ ? this.voices
85
+ : await this.listVoices();
86
+ this.hasRefreshedNamedVoiceCache = true;
87
+ if (!voices.some((voice) => voice.name === input.voice)) {
88
+ throw new InputError(`Unknown Speech Dispatcher voice: ${input.voice}`);
89
+ }
90
+ }
91
+ await this.sendCommand("SET SELF PRIORITY text", 202, COMMAND_TIMEOUT_MS);
92
+ await this.sendCommand(`SET SELF RATE ${String(input.rate)}`, 203, COMMAND_TIMEOUT_MS);
93
+ if (input.voice !== undefined) {
94
+ await this.sendCommand(`SET SELF SYNTHESIS_VOICE ${input.voice}`, 209, COMMAND_TIMEOUT_MS);
95
+ this.hasNamedVoice = true;
96
+ }
97
+ await this.sendCommand("SPEAK", 230, COMMAND_TIMEOUT_MS);
98
+ const reply = await this.sendData(ssipDataPayload(input.text), 225, COMMAND_TIMEOUT_MS);
99
+ let messageId;
100
+ try {
101
+ messageId = ssipMessageId(reply);
102
+ }
103
+ catch (error) {
104
+ this.resetConnection(normalizeError(error));
105
+ throw error;
106
+ }
107
+ return this.registerUtterance(messageId, input.text.length);
108
+ }
109
+ async listVoices() {
110
+ await this.ensureInitialized();
111
+ const reply = await this.sendCommand("LIST SYNTHESIS_VOICES", 249, COMMAND_TIMEOUT_MS);
112
+ const voices = normalizeVoices(reply.data);
113
+ this.voices = voices;
114
+ return voices;
115
+ }
116
+ async ensureInitialized() {
117
+ if (this.isClosed)
118
+ throw new Error("Speech Dispatcher adapter is closed.");
119
+ if (this.initializing !== undefined)
120
+ return this.initializing;
121
+ this.initializing = this.initialize();
122
+ try {
123
+ await this.initializing;
124
+ }
125
+ catch (error) {
126
+ this.resetConnection(normalizeError(error));
127
+ throw error;
128
+ }
129
+ finally {
130
+ if (this.transport === undefined)
131
+ this.initializing = undefined;
132
+ }
133
+ }
134
+ async initialize() {
135
+ await this.ensureTransport();
136
+ await this.sendCommand("SET SELF CLIENT_NAME pi-webui:tts:main", 208, COMMAND_TIMEOUT_MS);
137
+ const clientIdReply = await this.sendCommand("HISTORY GET CLIENT_ID", 245, COMMAND_TIMEOUT_MS);
138
+ if (parseClientId(clientIdReply.data[0]) === undefined) {
139
+ throw new Error("Malformed Speech Dispatcher client id reply.");
140
+ }
141
+ await this.sendCommand("SET SELF NOTIFICATION BEGIN on", 220, COMMAND_TIMEOUT_MS);
142
+ await this.sendCommand("SET SELF NOTIFICATION END on", 220, COMMAND_TIMEOUT_MS);
143
+ await this.sendCommand("SET SELF NOTIFICATION CANCEL on", 220, COMMAND_TIMEOUT_MS);
144
+ }
145
+ async ensureTransport() {
146
+ if (this.transport !== undefined)
147
+ return this.transport;
148
+ if (this.connecting !== undefined)
149
+ return this.connecting;
150
+ const socketPath = resolveSocketPath(this.env, this.homeDir);
151
+ if (socketPath === undefined)
152
+ throw unavailableError();
153
+ this.connecting = withDeadline(this.createTransport(socketPath), CONNECT_TIMEOUT_MS, this.scheduleDeadline, () => {
154
+ this.transport?.close();
155
+ this.resetConnection(new Error("Speech Dispatcher connection timed out."));
156
+ }, "Speech Dispatcher connection timed out.");
157
+ try {
158
+ const transport = await this.connecting;
159
+ if (this.isClosed) {
160
+ transport.close();
161
+ throw new Error("Speech Dispatcher adapter is closed.");
162
+ }
163
+ this.transport = transport;
164
+ this.unsubscribeData = transport.onData((chunk) => { this.receiveData(chunk); });
165
+ this.unsubscribeClose = transport.onClose((error) => { this.resetConnection(error ?? new Error("Speech Dispatcher connection closed.")); });
166
+ return transport;
167
+ }
168
+ finally {
169
+ this.connecting = undefined;
170
+ }
171
+ }
172
+ sendCommand(command, expectedCode, timeoutMs) {
173
+ return this.send(command + "\r\n", expectedCode, timeoutMs);
174
+ }
175
+ sendData(data, expectedCode, timeoutMs) {
176
+ return this.send(data, expectedCode, timeoutMs);
177
+ }
178
+ send(data, expectedCode, timeoutMs) {
179
+ const transport = this.transport;
180
+ if (transport === undefined)
181
+ return Promise.reject(new Error("Speech Dispatcher is not connected."));
182
+ if (this.pendingReply !== undefined)
183
+ return Promise.reject(new Error("Speech Dispatcher command queue invariant failed."));
184
+ return new Promise((resolve, reject) => {
185
+ const pending = {
186
+ expectedCode,
187
+ resolve,
188
+ reject,
189
+ cancelDeadline: noop,
190
+ };
191
+ pending.cancelDeadline = this.scheduleDeadline(() => {
192
+ if (this.pendingReply !== pending)
193
+ return;
194
+ this.resetConnection(new Error("Speech Dispatcher command timed out."));
195
+ }, timeoutMs);
196
+ this.pendingReply = pending;
197
+ try {
198
+ transport.write(data);
199
+ }
200
+ catch (error) {
201
+ this.resetConnection(normalizeError(error));
202
+ }
203
+ });
204
+ }
205
+ receiveData(chunk) {
206
+ let frames;
207
+ try {
208
+ frames = this.parser.push(chunk);
209
+ }
210
+ catch (error) {
211
+ this.resetConnection(normalizeError(error));
212
+ return;
213
+ }
214
+ for (const frame of frames)
215
+ this.routeFrame(frame);
216
+ }
217
+ routeFrame(frame) {
218
+ const terminal = ssipTerminalEvent(frame);
219
+ if (terminal !== undefined) {
220
+ this.routeTerminal(terminal.messageId, terminal.outcome);
221
+ return;
222
+ }
223
+ if (frame.code >= 700 && frame.code < 800)
224
+ return;
225
+ const pending = this.pendingReply;
226
+ if (pending === undefined) {
227
+ this.resetConnection(new Error("Unexpected Speech Dispatcher reply."));
228
+ return;
229
+ }
230
+ this.pendingReply = undefined;
231
+ pending.cancelDeadline();
232
+ if (frame.code !== pending.expectedCode) {
233
+ const error = new Error(`Unexpected Speech Dispatcher reply code ${String(frame.code)}.`);
234
+ pending.reject(error);
235
+ this.resetConnection(error);
236
+ return;
237
+ }
238
+ pending.resolve(frame);
239
+ }
240
+ registerUtterance(messageId, textLength) {
241
+ let resolveTerminal;
242
+ let rejectTerminal;
243
+ const terminal = new Promise((resolve, reject) => {
244
+ resolveTerminal = resolve;
245
+ rejectTerminal = reject;
246
+ });
247
+ const pending = {
248
+ resolve: resolveTerminal,
249
+ reject: rejectTerminal,
250
+ cancelDeadline: noop,
251
+ };
252
+ const timeoutMs = Math.min(MAX_TERMINAL_TIMEOUT_MS, TERMINAL_TIMEOUT_BASE_MS + textLength * TERMINAL_TIMEOUT_PER_CHAR_MS);
253
+ pending.cancelDeadline = this.scheduleDeadline(() => {
254
+ if (this.pendingUtterances.get(messageId) !== pending)
255
+ return;
256
+ this.resetConnection(new Error("Speech Dispatcher terminal event timed out."));
257
+ }, timeoutMs);
258
+ this.pendingUtterances.set(messageId, pending);
259
+ const earlyTerminal = this.earlyTerminals.get(messageId);
260
+ if (earlyTerminal !== undefined) {
261
+ this.earlyTerminals.delete(messageId);
262
+ this.resolveTerminal(messageId, earlyTerminal);
263
+ }
264
+ return { messageId, terminal };
265
+ }
266
+ routeTerminal(messageId, outcome) {
267
+ if (this.pendingUtterances.has(messageId)) {
268
+ this.resolveTerminal(messageId, outcome);
269
+ return;
270
+ }
271
+ this.earlyTerminals.set(messageId, outcome);
272
+ if (this.earlyTerminals.size > EARLY_TERMINAL_LIMIT) {
273
+ const oldest = this.earlyTerminals.keys().next().value;
274
+ if (oldest !== undefined)
275
+ this.earlyTerminals.delete(oldest);
276
+ }
277
+ }
278
+ resolveTerminal(messageId, outcome) {
279
+ const pending = this.pendingUtterances.get(messageId);
280
+ if (pending === undefined)
281
+ return;
282
+ this.pendingUtterances.delete(messageId);
283
+ pending.cancelDeadline();
284
+ queueMicrotask(() => { pending.resolve(outcome); });
285
+ }
286
+ resetConnection(error) {
287
+ const transport = this.transport;
288
+ this.transport = undefined;
289
+ this.connecting = undefined;
290
+ this.initializing = undefined;
291
+ this.voices = undefined;
292
+ this.hasNamedVoice = false;
293
+ this.hasRefreshedNamedVoiceCache = false;
294
+ this.parser.reset();
295
+ this.unsubscribeData?.();
296
+ this.unsubscribeClose?.();
297
+ this.unsubscribeData = undefined;
298
+ this.unsubscribeClose = undefined;
299
+ if (transport !== undefined)
300
+ transport.close();
301
+ const pendingReply = this.pendingReply;
302
+ this.pendingReply = undefined;
303
+ if (pendingReply !== undefined) {
304
+ pendingReply.cancelDeadline();
305
+ pendingReply.reject(error);
306
+ }
307
+ for (const pending of this.pendingUtterances.values()) {
308
+ pending.cancelDeadline();
309
+ pending.reject(error);
310
+ }
311
+ this.pendingUtterances.clear();
312
+ this.earlyTerminals.clear();
313
+ }
314
+ runSerialized(operation) {
315
+ const result = this.commandChain.then(operation, operation);
316
+ this.commandChain = result.then(() => undefined, () => undefined);
317
+ return result;
318
+ }
319
+ supported() {
320
+ return this.platform === "linux" && resolveSocketPath(this.env, this.homeDir) !== undefined;
321
+ }
322
+ }
323
+ function unavailableStatus() {
324
+ return { available: false, reason: UNAVAILABLE_MESSAGE, voices: [] };
325
+ }
326
+ function unavailableError() {
327
+ return new HostSpeechUnavailableError(UNAVAILABLE_MESSAGE);
328
+ }
329
+ function validateRate(rate) {
330
+ if (!Number.isInteger(rate) || rate < -100 || rate > 100) {
331
+ throw new InputError("Speech Dispatcher rate must be an integer from -100 to 100.");
332
+ }
333
+ }
334
+ function normalizeVoices(data) {
335
+ const voices = [];
336
+ for (const line of data) {
337
+ const parts = line.split("\t");
338
+ const name = parts[0];
339
+ const language = parts[1];
340
+ const variant = parts[2];
341
+ if (name === undefined || language === undefined || variant === undefined || name === "" || language === "")
342
+ continue;
343
+ voices.push(Object.freeze({ name, language, ...(variant === "" || variant === "none" ? {} : { variant }) }));
344
+ }
345
+ return Object.freeze(voices);
346
+ }
347
+ function copyVoice(voice) {
348
+ return { ...voice };
349
+ }
350
+ function parseClientId(value) {
351
+ if (value === undefined || !/^\d+$/u.test(value))
352
+ return undefined;
353
+ const clientId = Number(value);
354
+ return Number.isSafeInteger(clientId) ? clientId : undefined;
355
+ }
356
+ function resolveSocketPath(env, homeDir) {
357
+ const address = env["SPEECHD_ADDRESS"];
358
+ if (address !== undefined) {
359
+ const match = /^(?:unix|unix_socket):(\/.*)$/u.exec(address);
360
+ return match?.[1];
361
+ }
362
+ const base = env["XDG_RUNTIME_DIR"] ?? env["XDG_CACHE_HOME"] ?? `${homeDir}/.cache`;
363
+ return `${base}/speech-dispatcher/speechd.sock`;
364
+ }
365
+ function scheduleTimeout(callback, delayMs) {
366
+ const handle = setTimeout(callback, delayMs);
367
+ return () => { clearTimeout(handle); };
368
+ }
369
+ function withDeadline(promise, delayMs, schedule, onTimeout, message) {
370
+ let timedOut = false;
371
+ return new Promise((resolve, reject) => {
372
+ const cancel = schedule(() => {
373
+ timedOut = true;
374
+ onTimeout();
375
+ reject(new Error(message));
376
+ }, delayMs);
377
+ promise.then((value) => {
378
+ cancel();
379
+ if (timedOut) {
380
+ value.close();
381
+ return;
382
+ }
383
+ resolve(value);
384
+ }, (error) => {
385
+ cancel();
386
+ reject(normalizeError(error));
387
+ });
388
+ });
389
+ }
390
+ function createNodeSsipTransport(socketPath) {
391
+ return new Promise((resolve, reject) => {
392
+ const socket = createConnection(socketPath);
393
+ const decoder = new StringDecoder("utf8");
394
+ let connected = false;
395
+ const dataListeners = new Set();
396
+ const closeListeners = new Set();
397
+ let closeError;
398
+ const transport = {
399
+ write(data) { socket.write(data, "utf8"); },
400
+ close() { socket.destroy(); },
401
+ onData(listener) {
402
+ dataListeners.add(listener);
403
+ return () => { dataListeners.delete(listener); };
404
+ },
405
+ onClose(listener) {
406
+ closeListeners.add(listener);
407
+ return () => { closeListeners.delete(listener); };
408
+ },
409
+ };
410
+ socket.once("connect", () => {
411
+ connected = true;
412
+ resolve(transport);
413
+ });
414
+ socket.on("error", (error) => {
415
+ if (!connected)
416
+ reject(error);
417
+ else
418
+ closeError = error;
419
+ });
420
+ socket.on("data", (chunk) => {
421
+ const data = decoder.write(chunk);
422
+ for (const listener of dataListeners)
423
+ listener(data);
424
+ });
425
+ socket.on("close", () => {
426
+ const tail = decoder.end();
427
+ if (tail !== "") {
428
+ for (const listener of dataListeners)
429
+ listener(tail);
430
+ }
431
+ if (connected) {
432
+ for (const listener of closeListeners)
433
+ listener(closeError);
434
+ }
435
+ });
436
+ });
437
+ }
438
+ function normalizeError(error) {
439
+ return error instanceof Error ? error : new Error(String(error));
440
+ }
441
+ class InputError extends Error {
442
+ }
443
+ function isInputError(error) {
444
+ return error instanceof InputError;
445
+ }
446
+ //# sourceMappingURL=speechDispatcherAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speechDispatcherAdapter.js","sourceRoot":"","sources":["../../../src/server/tts/speechDispatcherAdapter.ts"],"names":[],"mappings":"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"}