@livekit/agents 0.3.4 → 0.4.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +40 -0
- package/dist/audio.js +17 -30
- package/dist/audio.js.map +1 -1
- package/dist/cli.js +3 -14
- package/dist/cli.js.map +1 -1
- package/dist/http_server.d.ts +1 -1
- package/dist/http_server.js +5 -9
- package/dist/http_server.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/ipc/job_executor.js +3 -5
- package/dist/ipc/job_executor.js.map +1 -1
- package/dist/ipc/job_main.d.ts +1 -1
- package/dist/ipc/proc_job_executor.js +66 -80
- package/dist/ipc/proc_job_executor.js.map +1 -1
- package/dist/ipc/proc_pool.d.ts +3 -3
- package/dist/ipc/proc_pool.d.ts.map +1 -1
- package/dist/ipc/proc_pool.js +16 -11
- package/dist/ipc/proc_pool.js.map +1 -1
- package/dist/job.js +56 -73
- package/dist/job.js.map +1 -1
- package/dist/llm/chat_context.d.ts +66 -0
- package/dist/llm/chat_context.d.ts.map +1 -0
- package/dist/llm/chat_context.js +93 -0
- package/dist/llm/chat_context.js.map +1 -0
- package/dist/llm/function_context.d.ts +19 -1
- package/dist/llm/function_context.d.ts.map +1 -1
- package/dist/llm/function_context.js +54 -18
- package/dist/llm/function_context.js.map +1 -1
- package/dist/llm/function_context.test.d.ts +2 -0
- package/dist/llm/function_context.test.d.ts.map +1 -0
- package/dist/llm/function_context.test.js +218 -0
- package/dist/llm/function_context.test.js.map +1 -0
- package/dist/llm/index.d.ts +3 -2
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +3 -2
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm.d.ts +53 -0
- package/dist/llm/llm.d.ts.map +1 -0
- package/dist/llm/llm.js +45 -0
- package/dist/llm/llm.js.map +1 -0
- package/dist/multimodal/agent_playout.d.ts +1 -1
- package/dist/multimodal/agent_playout.js +116 -153
- package/dist/multimodal/agent_playout.js.map +1 -1
- package/dist/multimodal/multimodal_agent.d.ts +4 -3
- package/dist/multimodal/multimodal_agent.d.ts.map +1 -1
- package/dist/multimodal/multimodal_agent.js +214 -237
- package/dist/multimodal/multimodal_agent.js.map +1 -1
- package/dist/pipeline/agent_output.d.ts +30 -0
- package/dist/pipeline/agent_output.d.ts.map +1 -0
- package/dist/pipeline/agent_output.js +155 -0
- package/dist/pipeline/agent_output.js.map +1 -0
- package/dist/pipeline/agent_playout.d.ts +38 -0
- package/dist/pipeline/agent_playout.d.ts.map +1 -0
- package/dist/pipeline/agent_playout.js +142 -0
- package/dist/pipeline/agent_playout.js.map +1 -0
- package/dist/pipeline/human_input.d.ts +28 -0
- package/dist/pipeline/human_input.d.ts.map +1 -0
- package/dist/pipeline/human_input.js +134 -0
- package/dist/pipeline/human_input.js.map +1 -0
- package/dist/pipeline/index.d.ts +2 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +5 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/pipeline_agent.d.ts +134 -0
- package/dist/pipeline/pipeline_agent.d.ts.map +1 -0
- package/dist/pipeline/pipeline_agent.js +661 -0
- package/dist/pipeline/pipeline_agent.js.map +1 -0
- package/dist/pipeline/speech_handle.d.ts +27 -0
- package/dist/pipeline/speech_handle.d.ts.map +1 -0
- package/dist/pipeline/speech_handle.js +102 -0
- package/dist/pipeline/speech_handle.js.map +1 -0
- package/dist/plugin.js +7 -20
- package/dist/plugin.js.map +1 -1
- package/dist/stt/index.d.ts +1 -2
- package/dist/stt/index.d.ts.map +1 -1
- package/dist/stt/index.js +1 -2
- package/dist/stt/index.js.map +1 -1
- package/dist/stt/stt.d.ts +62 -24
- package/dist/stt/stt.d.ts.map +1 -1
- package/dist/stt/stt.js +77 -27
- package/dist/stt/stt.js.map +1 -1
- package/dist/tokenize/basic/basic.d.ts +16 -0
- package/dist/tokenize/basic/basic.d.ts.map +1 -0
- package/dist/tokenize/basic/basic.js +50 -0
- package/dist/tokenize/basic/basic.js.map +1 -0
- package/dist/tokenize/basic/hyphenator.d.ts +17 -0
- package/dist/tokenize/basic/hyphenator.d.ts.map +1 -0
- package/dist/tokenize/basic/hyphenator.js +420 -0
- package/dist/tokenize/basic/hyphenator.js.map +1 -0
- package/dist/tokenize/basic/index.d.ts +2 -0
- package/dist/tokenize/basic/index.d.ts.map +1 -0
- package/dist/tokenize/basic/index.js +5 -0
- package/dist/tokenize/basic/index.js.map +1 -0
- package/dist/tokenize/basic/paragraph.d.ts +5 -0
- package/dist/tokenize/basic/paragraph.d.ts.map +1 -0
- package/dist/tokenize/basic/paragraph.js +38 -0
- package/dist/tokenize/basic/paragraph.js.map +1 -0
- package/dist/tokenize/basic/sentence.d.ts +5 -0
- package/dist/tokenize/basic/sentence.d.ts.map +1 -0
- package/dist/tokenize/basic/sentence.js +60 -0
- package/dist/tokenize/basic/sentence.js.map +1 -0
- package/dist/tokenize/basic/word.d.ts +5 -0
- package/dist/tokenize/basic/word.d.ts.map +1 -0
- package/dist/tokenize/basic/word.js +23 -0
- package/dist/tokenize/basic/word.js.map +1 -0
- package/dist/tokenize/index.d.ts +5 -0
- package/dist/tokenize/index.d.ts.map +1 -0
- package/dist/tokenize/index.js +8 -0
- package/dist/tokenize/index.js.map +1 -0
- package/dist/tokenize/token_stream.d.ts +36 -0
- package/dist/tokenize/token_stream.d.ts.map +1 -0
- package/dist/tokenize/token_stream.js +136 -0
- package/dist/tokenize/token_stream.js.map +1 -0
- package/dist/tokenize/tokenizer.d.ts +55 -0
- package/dist/tokenize/tokenizer.d.ts.map +1 -0
- package/dist/tokenize/tokenizer.js +117 -0
- package/dist/tokenize/tokenizer.js.map +1 -0
- package/dist/transcription.js +78 -89
- package/dist/transcription.js.map +1 -1
- package/dist/tts/index.d.ts +1 -3
- package/dist/tts/index.d.ts.map +1 -1
- package/dist/tts/index.js +1 -3
- package/dist/tts/index.js.map +1 -1
- package/dist/tts/tts.d.ts +66 -37
- package/dist/tts/tts.d.ts.map +1 -1
- package/dist/tts/tts.js +79 -74
- package/dist/tts/tts.js.map +1 -1
- package/dist/utils.d.ts +21 -6
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +120 -76
- package/dist/utils.js.map +1 -1
- package/dist/vad.d.ts +43 -39
- package/dist/vad.d.ts.map +1 -1
- package/dist/vad.js +51 -4
- package/dist/vad.js.map +1 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.js +257 -247
- package/dist/worker.js.map +1 -1
- package/package.json +4 -3
- package/src/index.ts +16 -2
- package/src/ipc/proc_pool.ts +4 -4
- package/src/llm/chat_context.ts +147 -0
- package/src/llm/function_context.test.ts +248 -0
- package/src/llm/function_context.ts +77 -18
- package/src/llm/index.ts +21 -2
- package/src/llm/llm.ts +102 -0
- package/src/multimodal/multimodal_agent.ts +19 -6
- package/src/pipeline/agent_output.ts +185 -0
- package/src/pipeline/agent_playout.ts +187 -0
- package/src/pipeline/human_input.ts +166 -0
- package/src/pipeline/index.ts +15 -0
- package/src/pipeline/pipeline_agent.ts +917 -0
- package/src/pipeline/speech_handle.ts +136 -0
- package/src/stt/index.ts +8 -2
- package/src/stt/stt.ts +98 -31
- package/src/tokenize/basic/basic.ts +73 -0
- package/src/tokenize/basic/hyphenator.ts +436 -0
- package/src/tokenize/basic/index.ts +5 -0
- package/src/tokenize/basic/paragraph.ts +43 -0
- package/src/tokenize/basic/sentence.ts +69 -0
- package/src/tokenize/basic/word.ts +27 -0
- package/src/tokenize/index.ts +16 -0
- package/src/tokenize/token_stream.ts +163 -0
- package/src/tokenize/tokenizer.ts +152 -0
- package/src/tts/index.ts +1 -20
- package/src/tts/tts.ts +110 -57
- package/src/utils.ts +95 -25
- package/src/vad.ts +86 -45
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/stt/stream_adapter.d.ts +0 -19
- package/dist/stt/stream_adapter.d.ts.map +0 -1
- package/dist/stt/stream_adapter.js +0 -96
- package/dist/stt/stream_adapter.js.map +0 -1
- package/dist/tokenize.d.ts +0 -15
- package/dist/tokenize.d.ts.map +0 -1
- package/dist/tokenize.js +0 -12
- package/dist/tokenize.js.map +0 -1
- package/dist/tts/stream_adapter.d.ts +0 -19
- package/dist/tts/stream_adapter.d.ts.map +0 -1
- package/dist/tts/stream_adapter.js +0 -111
- package/dist/tts/stream_adapter.js.map +0 -1
- package/src/stt/stream_adapter.ts +0 -104
- package/src/tokenize.ts +0 -22
- package/src/tts/stream_adapter.ts +0 -93
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AudioFrame } from '@livekit/rtc-node';
|
|
2
|
+
import { type TTS } from '../tts/index.js';
|
|
3
|
+
import { AsyncIterableQueue, Future } from '../utils.js';
|
|
4
|
+
import type { AgentPlayout, PlayoutHandle } from './agent_playout.js';
|
|
5
|
+
export type SpeechSource = AsyncIterable<string> | string | Promise<string>;
|
|
6
|
+
export declare class SynthesisHandle {
|
|
7
|
+
#private;
|
|
8
|
+
static readonly FLUSH_SENTINEL: unique symbol;
|
|
9
|
+
ttsSource: SpeechSource;
|
|
10
|
+
tts: TTS;
|
|
11
|
+
queue: AsyncIterableQueue<AudioFrame | typeof SynthesisHandle.FLUSH_SENTINEL>;
|
|
12
|
+
intFut: Future;
|
|
13
|
+
constructor(speechId: string, ttsSource: SpeechSource, agentPlayout: AgentPlayout, tts: TTS);
|
|
14
|
+
get speechId(): string;
|
|
15
|
+
get validated(): boolean;
|
|
16
|
+
get interrupted(): boolean;
|
|
17
|
+
get playHandle(): PlayoutHandle | undefined;
|
|
18
|
+
/** Validate the speech for playout. */
|
|
19
|
+
play(): PlayoutHandle;
|
|
20
|
+
/** Interrupt the speech. */
|
|
21
|
+
interrupt(): void;
|
|
22
|
+
}
|
|
23
|
+
export declare class AgentOutput {
|
|
24
|
+
#private;
|
|
25
|
+
constructor(agentPlayout: AgentPlayout, tts: TTS);
|
|
26
|
+
get playout(): AgentPlayout;
|
|
27
|
+
close(): Promise<void>;
|
|
28
|
+
synthesize(speechId: string, ttsSource: SpeechSource): SynthesisHandle;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=agent_output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent_output.d.ts","sourceRoot":"","sources":["../../src/pipeline/agent_output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAoB,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAsB,MAAM,EAAoB,MAAM,aAAa,CAAC;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE5E,qBAAa,eAAe;;IAC1B,MAAM,CAAC,QAAQ,CAAC,cAAc,gBAA4B;IAG1D,SAAS,EAAE,YAAY,CAAC;IAExB,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,yEAAgF;IAErF,MAAM,SAAgB;gBAGV,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG;IAO3F,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,UAAU,IAAI,aAAa,GAAG,SAAS,CAE1C;IAED,uCAAuC;IACvC,IAAI,IAAI,aAAa;IASrB,4BAA4B;IAC5B,SAAS;CASV;AAED,qBAAa,WAAW;;gBAKV,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG;IAKhD,IAAI,OAAO,IAAI,YAAY,CAE1B;IAEK,KAAK;IAKX,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,eAAe;CAkCvE"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { log } from '../log.js';
|
|
2
|
+
import { SynthesizeStream } from '../tts/index.js';
|
|
3
|
+
import { AsyncIterableQueue, CancellablePromise, Future, gracefullyCancel } from '../utils.js';
|
|
4
|
+
export class SynthesisHandle {
|
|
5
|
+
static FLUSH_SENTINEL = Symbol('FLUSH_SENTINEL');
|
|
6
|
+
#speechId;
|
|
7
|
+
ttsSource;
|
|
8
|
+
#agentPlayout;
|
|
9
|
+
tts;
|
|
10
|
+
queue = new AsyncIterableQueue();
|
|
11
|
+
#playHandle;
|
|
12
|
+
intFut = new Future();
|
|
13
|
+
#logger = log();
|
|
14
|
+
constructor(speechId, ttsSource, agentPlayout, tts) {
|
|
15
|
+
this.#speechId = speechId;
|
|
16
|
+
this.ttsSource = ttsSource;
|
|
17
|
+
this.#agentPlayout = agentPlayout;
|
|
18
|
+
this.tts = tts;
|
|
19
|
+
}
|
|
20
|
+
get speechId() {
|
|
21
|
+
return this.#speechId;
|
|
22
|
+
}
|
|
23
|
+
get validated() {
|
|
24
|
+
return !!this.#playHandle;
|
|
25
|
+
}
|
|
26
|
+
get interrupted() {
|
|
27
|
+
return this.intFut.done;
|
|
28
|
+
}
|
|
29
|
+
get playHandle() {
|
|
30
|
+
return this.#playHandle;
|
|
31
|
+
}
|
|
32
|
+
/** Validate the speech for playout. */
|
|
33
|
+
play() {
|
|
34
|
+
if (this.interrupted) {
|
|
35
|
+
throw new Error('synthesis was interrupted');
|
|
36
|
+
}
|
|
37
|
+
this.#playHandle = this.#agentPlayout.play(this.#speechId, this.queue);
|
|
38
|
+
return this.#playHandle;
|
|
39
|
+
}
|
|
40
|
+
/** Interrupt the speech. */
|
|
41
|
+
interrupt() {
|
|
42
|
+
if (this.interrupted) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.#logger.child({ speechId: this.#speechId }).debug('interrupting synthesis/playout');
|
|
46
|
+
this.#playHandle?.interrupt();
|
|
47
|
+
this.intFut.resolve();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export class AgentOutput {
|
|
51
|
+
#agentPlayout;
|
|
52
|
+
#tts;
|
|
53
|
+
#tasks = [];
|
|
54
|
+
constructor(agentPlayout, tts) {
|
|
55
|
+
this.#agentPlayout = agentPlayout;
|
|
56
|
+
this.#tts = tts;
|
|
57
|
+
}
|
|
58
|
+
get playout() {
|
|
59
|
+
return this.#agentPlayout;
|
|
60
|
+
}
|
|
61
|
+
async close() {
|
|
62
|
+
this.#tasks.forEach((task) => task.cancel());
|
|
63
|
+
await Promise.all(this.#tasks);
|
|
64
|
+
}
|
|
65
|
+
synthesize(speechId, ttsSource) {
|
|
66
|
+
const handle = new SynthesisHandle(speechId, ttsSource, this.#agentPlayout, this.#tts);
|
|
67
|
+
const task = this.#synthesize(handle);
|
|
68
|
+
this.#tasks.push(task);
|
|
69
|
+
task.finally(() => this.#tasks.splice(this.#tasks.indexOf(task)));
|
|
70
|
+
return handle;
|
|
71
|
+
}
|
|
72
|
+
#synthesize(handle) {
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
74
|
+
return new CancellablePromise(async (resolve, _, onCancel) => {
|
|
75
|
+
const ttsSource = await handle.ttsSource;
|
|
76
|
+
let task;
|
|
77
|
+
if (typeof ttsSource === 'string') {
|
|
78
|
+
task = stringSynthesisTask(ttsSource, handle);
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
task = streamSynthesisTask(ttsSource, handle);
|
|
82
|
+
}
|
|
83
|
+
onCancel(() => {
|
|
84
|
+
gracefullyCancel(task);
|
|
85
|
+
});
|
|
86
|
+
try {
|
|
87
|
+
await Promise.any([task, handle.intFut.await]);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
if (handle.intFut.done) {
|
|
91
|
+
gracefullyCancel(task);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
resolve();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const stringSynthesisTask = (text, handle) => {
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
100
|
+
return new CancellablePromise(async (resolve, _, onCancel) => {
|
|
101
|
+
let cancelled = false;
|
|
102
|
+
onCancel(() => {
|
|
103
|
+
cancelled = true;
|
|
104
|
+
});
|
|
105
|
+
const ttsStream = handle.tts.stream();
|
|
106
|
+
ttsStream.pushText(text);
|
|
107
|
+
ttsStream.flush();
|
|
108
|
+
ttsStream.endInput();
|
|
109
|
+
for await (const audio of ttsStream) {
|
|
110
|
+
if (cancelled || audio === SynthesizeStream.END_OF_STREAM)
|
|
111
|
+
break;
|
|
112
|
+
handle.queue.put(audio.frame);
|
|
113
|
+
}
|
|
114
|
+
handle.queue.put(SynthesisHandle.FLUSH_SENTINEL);
|
|
115
|
+
resolve();
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
const streamSynthesisTask = (stream, handle) => {
|
|
119
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
120
|
+
return new CancellablePromise(async (resolve, _, onCancel) => {
|
|
121
|
+
let cancelled = false;
|
|
122
|
+
onCancel(() => {
|
|
123
|
+
cancelled = true;
|
|
124
|
+
});
|
|
125
|
+
const ttsStream = handle.tts.stream();
|
|
126
|
+
const readGeneratedAudio = async () => {
|
|
127
|
+
let started = false;
|
|
128
|
+
for await (const audio of ttsStream) {
|
|
129
|
+
if (cancelled)
|
|
130
|
+
break;
|
|
131
|
+
if (audio === SynthesizeStream.END_OF_STREAM) {
|
|
132
|
+
if (started) {
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
handle.queue.put(audio.frame);
|
|
140
|
+
started = true;
|
|
141
|
+
}
|
|
142
|
+
handle.queue.put(SynthesisHandle.FLUSH_SENTINEL);
|
|
143
|
+
};
|
|
144
|
+
readGeneratedAudio();
|
|
145
|
+
for await (const text of stream) {
|
|
146
|
+
if (cancelled)
|
|
147
|
+
break;
|
|
148
|
+
ttsStream.pushText(text);
|
|
149
|
+
}
|
|
150
|
+
ttsStream.flush();
|
|
151
|
+
ttsStream.endInput();
|
|
152
|
+
resolve();
|
|
153
|
+
});
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=agent_output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent_output.js","sourceRoot":"","sources":["../../src/pipeline/agent_output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AudioFrame, AudioSource } from '@livekit/rtc-node';
|
|
2
|
+
import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
|
|
3
|
+
import { Future } from '../utils.js';
|
|
4
|
+
import { SynthesisHandle } from './agent_output.js';
|
|
5
|
+
export declare enum AgentPlayoutEvent {
|
|
6
|
+
PLAYOUT_STARTED = 0,
|
|
7
|
+
PLAYOUT_STOPPED = 1
|
|
8
|
+
}
|
|
9
|
+
export type AgentPlayoutCallbacks = {
|
|
10
|
+
[AgentPlayoutEvent.PLAYOUT_STARTED]: () => void;
|
|
11
|
+
[AgentPlayoutEvent.PLAYOUT_STOPPED]: (interrupt: boolean) => void;
|
|
12
|
+
};
|
|
13
|
+
export declare class PlayoutHandle {
|
|
14
|
+
#private;
|
|
15
|
+
playoutSource: AsyncIterable<AudioFrame | typeof SynthesisHandle.FLUSH_SENTINEL>;
|
|
16
|
+
totalPlayedTime?: number;
|
|
17
|
+
pushedDuration: number;
|
|
18
|
+
intFut: Future;
|
|
19
|
+
doneFut: Future;
|
|
20
|
+
constructor(speechId: string, audioSource: AudioSource, playoutSource: AsyncIterable<AudioFrame | typeof SynthesisHandle.FLUSH_SENTINEL>);
|
|
21
|
+
get speechId(): string;
|
|
22
|
+
get interrupted(): boolean;
|
|
23
|
+
get timePlayed(): number;
|
|
24
|
+
get done(): boolean;
|
|
25
|
+
interrupt(): void;
|
|
26
|
+
join(): Future;
|
|
27
|
+
}
|
|
28
|
+
declare const AgentPlayout_base: new () => TypedEmitter<AgentPlayoutCallbacks>;
|
|
29
|
+
export declare class AgentPlayout extends AgentPlayout_base {
|
|
30
|
+
#private;
|
|
31
|
+
constructor(audioSource: AudioSource);
|
|
32
|
+
get targetVolume(): number;
|
|
33
|
+
set targetVolume(vol: number);
|
|
34
|
+
play(speechId: string, playoutSource: AsyncIterable<AudioFrame | typeof SynthesisHandle.FLUSH_SENTINEL>): PlayoutHandle;
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=agent_playout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent_playout.d.ts","sourceRoot":"","sources":["../../src/pipeline/agent_playout.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGhF,OAAO,EAAsB,MAAM,EAAoB,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,oBAAY,iBAAiB;IAC3B,eAAe,IAAA;IACf,eAAe,IAAA;CAChB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAChD,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACnE,CAAC;AAEF,qBAAa,aAAa;;IAGxB,aAAa,EAAE,aAAa,CAAC,UAAU,GAAG,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,cAAc,SAAK;IACnB,MAAM,SAAgB;IACtB,OAAO,SAAgB;gBAGrB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,CAAC,UAAU,GAAG,OAAO,eAAe,CAAC,cAAc,CAAC;IAOlF,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,SAAS;IAST,IAAI,IAAI,MAAM;CAGf;2CAE4D,aAAa,qBAAqB,CAAC;AAAhG,qBAAa,YAAa,SAAQ,iBAA+D;;gBAOnF,WAAW,EAAE,WAAW;IAKpC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,EAE3B;IAED,IAAI,CACF,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,aAAa,CAAC,UAAU,GAAG,OAAO,eAAe,CAAC,cAAc,CAAC,GAC/E,aAAa;IAyFV,KAAK;CAIZ"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
import { log } from '../log.js';
|
|
3
|
+
import { CancellablePromise, Future, gracefullyCancel } from '../utils.js';
|
|
4
|
+
import { SynthesisHandle } from './agent_output.js';
|
|
5
|
+
export var AgentPlayoutEvent;
|
|
6
|
+
(function (AgentPlayoutEvent) {
|
|
7
|
+
AgentPlayoutEvent[AgentPlayoutEvent["PLAYOUT_STARTED"] = 0] = "PLAYOUT_STARTED";
|
|
8
|
+
AgentPlayoutEvent[AgentPlayoutEvent["PLAYOUT_STOPPED"] = 1] = "PLAYOUT_STOPPED";
|
|
9
|
+
})(AgentPlayoutEvent || (AgentPlayoutEvent = {}));
|
|
10
|
+
export class PlayoutHandle {
|
|
11
|
+
#speechId;
|
|
12
|
+
#audioSource;
|
|
13
|
+
playoutSource;
|
|
14
|
+
totalPlayedTime;
|
|
15
|
+
#interrupted = false;
|
|
16
|
+
pushedDuration = 0;
|
|
17
|
+
intFut = new Future();
|
|
18
|
+
doneFut = new Future();
|
|
19
|
+
constructor(speechId, audioSource, playoutSource) {
|
|
20
|
+
this.#speechId = speechId;
|
|
21
|
+
this.#audioSource = audioSource;
|
|
22
|
+
this.playoutSource = playoutSource;
|
|
23
|
+
}
|
|
24
|
+
get speechId() {
|
|
25
|
+
return this.#speechId;
|
|
26
|
+
}
|
|
27
|
+
get interrupted() {
|
|
28
|
+
return this.#interrupted;
|
|
29
|
+
}
|
|
30
|
+
get timePlayed() {
|
|
31
|
+
return this.totalPlayedTime || this.pushedDuration - this.#audioSource.queuedDuration;
|
|
32
|
+
}
|
|
33
|
+
get done() {
|
|
34
|
+
return this.doneFut.done || this.#interrupted;
|
|
35
|
+
}
|
|
36
|
+
interrupt() {
|
|
37
|
+
if (this.done) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
this.intFut.resolve();
|
|
41
|
+
this.#interrupted = true;
|
|
42
|
+
}
|
|
43
|
+
join() {
|
|
44
|
+
return this.doneFut;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class AgentPlayout extends EventEmitter {
|
|
48
|
+
#closed = false;
|
|
49
|
+
#audioSource;
|
|
50
|
+
#targetVolume = 1;
|
|
51
|
+
#playoutTask;
|
|
52
|
+
#logger = log();
|
|
53
|
+
constructor(audioSource) {
|
|
54
|
+
super();
|
|
55
|
+
this.#audioSource = audioSource;
|
|
56
|
+
}
|
|
57
|
+
get targetVolume() {
|
|
58
|
+
return this.#targetVolume;
|
|
59
|
+
}
|
|
60
|
+
set targetVolume(vol) {
|
|
61
|
+
this.#targetVolume = vol;
|
|
62
|
+
}
|
|
63
|
+
play(speechId, playoutSource) {
|
|
64
|
+
if (this.#closed) {
|
|
65
|
+
throw new Error('source closed');
|
|
66
|
+
}
|
|
67
|
+
const handle = new PlayoutHandle(speechId, this.#audioSource, playoutSource);
|
|
68
|
+
this.#playoutTask = this.#playout(handle, this.#playoutTask);
|
|
69
|
+
return handle;
|
|
70
|
+
}
|
|
71
|
+
#playout(handle, oldTask) {
|
|
72
|
+
return new CancellablePromise(async (resolve, _, onCancel) => {
|
|
73
|
+
const cancel = () => {
|
|
74
|
+
captureTask.cancel();
|
|
75
|
+
handle.totalPlayedTime = handle.pushedDuration - this.#audioSource.queuedDuration;
|
|
76
|
+
if (handle.interrupted || captureTask.error) {
|
|
77
|
+
this.#audioSource.clearQueue(); // make sure to remove any queued frames
|
|
78
|
+
}
|
|
79
|
+
if (!firstFrame) {
|
|
80
|
+
this.emit(AgentPlayoutEvent.PLAYOUT_STOPPED, handle.interrupted);
|
|
81
|
+
}
|
|
82
|
+
handle.doneFut.resolve();
|
|
83
|
+
this.#logger
|
|
84
|
+
.child({ speechId: handle.speechId, interrupted: handle.interrupted })
|
|
85
|
+
.debug('playout finished');
|
|
86
|
+
};
|
|
87
|
+
onCancel(() => {
|
|
88
|
+
cancel();
|
|
89
|
+
});
|
|
90
|
+
if (oldTask) {
|
|
91
|
+
await gracefullyCancel(oldTask);
|
|
92
|
+
}
|
|
93
|
+
if (this.#audioSource.queuedDuration > 0) {
|
|
94
|
+
// this should not happen, but log it just in case
|
|
95
|
+
this.#logger
|
|
96
|
+
.child({ speechId: handle.speechId, queuedDuration: this.#audioSource.queuedDuration })
|
|
97
|
+
.warn('new playout while the source is still playing');
|
|
98
|
+
}
|
|
99
|
+
let firstFrame = true;
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
101
|
+
const captureTask = new CancellablePromise(async (resolve, _, onCancel) => {
|
|
102
|
+
let cancelled = false;
|
|
103
|
+
onCancel(() => {
|
|
104
|
+
cancelled = true;
|
|
105
|
+
});
|
|
106
|
+
for await (const frame of handle.playoutSource) {
|
|
107
|
+
if (cancelled || frame === SynthesisHandle.FLUSH_SENTINEL)
|
|
108
|
+
break;
|
|
109
|
+
if (firstFrame) {
|
|
110
|
+
this.#logger
|
|
111
|
+
.child({ speechId: handle.speechId })
|
|
112
|
+
.debug('started playing the first time');
|
|
113
|
+
this.emit(AgentPlayoutEvent.PLAYOUT_STARTED);
|
|
114
|
+
firstFrame = false;
|
|
115
|
+
}
|
|
116
|
+
handle.pushedDuration += (frame.samplesPerChannel / frame.sampleRate) * 1000;
|
|
117
|
+
await this.#audioSource.captureFrame(frame);
|
|
118
|
+
await this.#audioSource.waitForPlayout();
|
|
119
|
+
}
|
|
120
|
+
// XXX(nbsp): line 161 waits instead of this. this is not the case on python agents,
|
|
121
|
+
// but for some reason too many TTS frames can gunk up the buffer and lead to
|
|
122
|
+
// FFI errors. this works 🤷♀️
|
|
123
|
+
// if (this.#audioSource.queuedDuration > 0) {
|
|
124
|
+
// await this.#audioSource.waitForPlayout();
|
|
125
|
+
// }
|
|
126
|
+
resolve();
|
|
127
|
+
});
|
|
128
|
+
try {
|
|
129
|
+
await Promise.any([captureTask, handle.intFut.await]);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
cancel();
|
|
133
|
+
resolve();
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async close() {
|
|
138
|
+
this.#closed = true;
|
|
139
|
+
await this.#playoutTask;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=agent_playout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent_playout.js","sourceRoot":"","sources":["../../src/pipeline/agent_playout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RemoteParticipant, Room } from '@livekit/rtc-node';
|
|
2
|
+
import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
|
|
3
|
+
import type { STT, SpeechEvent } from '../stt/stt.js';
|
|
4
|
+
import type { VAD, VADEvent } from '../vad.js';
|
|
5
|
+
export declare enum HumanInputEvent {
|
|
6
|
+
START_OF_SPEECH = 0,
|
|
7
|
+
VAD_INFERENCE_DONE = 1,
|
|
8
|
+
END_OF_SPEECH = 2,
|
|
9
|
+
FINAL_TRANSCRIPT = 3,
|
|
10
|
+
INTERIM_TRANSCRIPT = 4
|
|
11
|
+
}
|
|
12
|
+
export type HumanInputCallbacks = {
|
|
13
|
+
[HumanInputEvent.START_OF_SPEECH]: (event: VADEvent) => void;
|
|
14
|
+
[HumanInputEvent.VAD_INFERENCE_DONE]: (event: VADEvent) => void;
|
|
15
|
+
[HumanInputEvent.END_OF_SPEECH]: (event: VADEvent) => void;
|
|
16
|
+
[HumanInputEvent.FINAL_TRANSCRIPT]: (event: SpeechEvent) => void;
|
|
17
|
+
[HumanInputEvent.INTERIM_TRANSCRIPT]: (event: SpeechEvent) => void;
|
|
18
|
+
};
|
|
19
|
+
declare const HumanInput_base: new () => TypedEmitter<HumanInputCallbacks>;
|
|
20
|
+
export declare class HumanInput extends HumanInput_base {
|
|
21
|
+
#private;
|
|
22
|
+
constructor(room: Room, vad: VAD, stt: STT, participant: RemoteParticipant);
|
|
23
|
+
get speaking(): boolean;
|
|
24
|
+
get speakingProbability(): number;
|
|
25
|
+
close(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=human_input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human_input.d.ts","sourceRoot":"","sources":["../../src/pipeline/human_input.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,iBAAiB,EAEjB,IAAI,EACL,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGhF,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG/C,oBAAY,eAAe;IACzB,eAAe,IAAA;IACf,kBAAkB,IAAA;IAClB,aAAa,IAAA;IACb,gBAAgB,IAAA;IAChB,kBAAkB,IAAA;CACnB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC7D,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAChE,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC3D,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACjE,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACpE,CAAC;yCAEyD,aAAa,mBAAmB,CAAC;AAA5F,qBAAa,UAAW,SAAQ,eAA6D;;gBAY/E,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB;IAmG1E,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAEK,KAAK;CAWZ"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { AudioStream, RoomEvent, TrackSource } from '@livekit/rtc-node';
|
|
2
|
+
import { EventEmitter } from 'node:events';
|
|
3
|
+
import { log } from '../log.js';
|
|
4
|
+
import { SpeechEventType } from '../stt/stt.js';
|
|
5
|
+
import { CancellablePromise, gracefullyCancel } from '../utils.js';
|
|
6
|
+
import { VADEventType } from '../vad.js';
|
|
7
|
+
export var HumanInputEvent;
|
|
8
|
+
(function (HumanInputEvent) {
|
|
9
|
+
HumanInputEvent[HumanInputEvent["START_OF_SPEECH"] = 0] = "START_OF_SPEECH";
|
|
10
|
+
HumanInputEvent[HumanInputEvent["VAD_INFERENCE_DONE"] = 1] = "VAD_INFERENCE_DONE";
|
|
11
|
+
HumanInputEvent[HumanInputEvent["END_OF_SPEECH"] = 2] = "END_OF_SPEECH";
|
|
12
|
+
HumanInputEvent[HumanInputEvent["FINAL_TRANSCRIPT"] = 3] = "FINAL_TRANSCRIPT";
|
|
13
|
+
HumanInputEvent[HumanInputEvent["INTERIM_TRANSCRIPT"] = 4] = "INTERIM_TRANSCRIPT";
|
|
14
|
+
})(HumanInputEvent || (HumanInputEvent = {}));
|
|
15
|
+
export class HumanInput extends EventEmitter {
|
|
16
|
+
#closed = false;
|
|
17
|
+
#room;
|
|
18
|
+
#vad;
|
|
19
|
+
#stt;
|
|
20
|
+
#participant;
|
|
21
|
+
#subscribedTrack;
|
|
22
|
+
#recognizeTask;
|
|
23
|
+
#speaking = false;
|
|
24
|
+
#speechProbability = 0;
|
|
25
|
+
#logger = log();
|
|
26
|
+
constructor(room, vad, stt, participant) {
|
|
27
|
+
super();
|
|
28
|
+
this.#room = room;
|
|
29
|
+
this.#vad = vad;
|
|
30
|
+
this.#stt = stt;
|
|
31
|
+
this.#participant = participant;
|
|
32
|
+
this.#room.on(RoomEvent.TrackPublished, this.#subscribeToMicrophone.bind(this));
|
|
33
|
+
this.#room.on(RoomEvent.TrackSubscribed, this.#subscribeToMicrophone.bind(this));
|
|
34
|
+
this.#subscribeToMicrophone();
|
|
35
|
+
}
|
|
36
|
+
#subscribeToMicrophone() {
|
|
37
|
+
if (!this.#participant) {
|
|
38
|
+
this.#logger.error('Participant is not set');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let microphonePublication = undefined;
|
|
42
|
+
for (const publication of this.#participant.trackPublications.values()) {
|
|
43
|
+
if (publication.source === TrackSource.SOURCE_MICROPHONE) {
|
|
44
|
+
microphonePublication = publication;
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!microphonePublication) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!microphonePublication.subscribed) {
|
|
52
|
+
microphonePublication.setSubscribed(true);
|
|
53
|
+
}
|
|
54
|
+
const track = microphonePublication.track;
|
|
55
|
+
if (track && track !== this.#subscribedTrack) {
|
|
56
|
+
this.#subscribedTrack = track;
|
|
57
|
+
if (this.#recognizeTask) {
|
|
58
|
+
this.#recognizeTask.cancel();
|
|
59
|
+
}
|
|
60
|
+
const audioStream = new AudioStream(track, 16000);
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
62
|
+
this.#recognizeTask = new CancellablePromise(async (resolve, _, onCancel) => {
|
|
63
|
+
let cancelled = false;
|
|
64
|
+
onCancel(() => {
|
|
65
|
+
cancelled = true;
|
|
66
|
+
});
|
|
67
|
+
const sttStream = this.#stt.stream();
|
|
68
|
+
const vadStream = this.#vad.stream();
|
|
69
|
+
const audioStreamCo = async () => {
|
|
70
|
+
for await (const ev of audioStream) {
|
|
71
|
+
if (cancelled)
|
|
72
|
+
return;
|
|
73
|
+
sttStream.pushFrame(ev);
|
|
74
|
+
vadStream.pushFrame(ev);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const vadStreamCo = async () => {
|
|
78
|
+
for await (const ev of vadStream) {
|
|
79
|
+
if (cancelled)
|
|
80
|
+
return;
|
|
81
|
+
switch (ev.type) {
|
|
82
|
+
case VADEventType.START_OF_SPEECH:
|
|
83
|
+
this.#speaking = true;
|
|
84
|
+
this.emit(HumanInputEvent.START_OF_SPEECH, ev);
|
|
85
|
+
break;
|
|
86
|
+
case VADEventType.INFERENCE_DONE:
|
|
87
|
+
this.#speechProbability = ev.probability;
|
|
88
|
+
this.emit(HumanInputEvent.VAD_INFERENCE_DONE, ev);
|
|
89
|
+
break;
|
|
90
|
+
case VADEventType.END_OF_SPEECH:
|
|
91
|
+
this.#speaking = false;
|
|
92
|
+
this.emit(HumanInputEvent.END_OF_SPEECH, ev);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const sttStreamCo = async () => {
|
|
98
|
+
for await (const ev of sttStream) {
|
|
99
|
+
if (cancelled)
|
|
100
|
+
return;
|
|
101
|
+
if (ev.type === SpeechEventType.FINAL_TRANSCRIPT) {
|
|
102
|
+
this.emit(HumanInputEvent.FINAL_TRANSCRIPT, ev);
|
|
103
|
+
}
|
|
104
|
+
else if (ev.type == SpeechEventType.INTERIM_TRANSCRIPT) {
|
|
105
|
+
this.emit(HumanInputEvent.INTERIM_TRANSCRIPT, ev);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
await Promise.all([audioStreamCo(), vadStreamCo(), sttStreamCo()]);
|
|
110
|
+
sttStream.close();
|
|
111
|
+
vadStream.close();
|
|
112
|
+
resolve();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
get speaking() {
|
|
117
|
+
return this.#speaking;
|
|
118
|
+
}
|
|
119
|
+
get speakingProbability() {
|
|
120
|
+
return this.#speechProbability;
|
|
121
|
+
}
|
|
122
|
+
async close() {
|
|
123
|
+
if (this.#closed) {
|
|
124
|
+
throw new Error('HumanInput already closed');
|
|
125
|
+
}
|
|
126
|
+
this.#closed = true;
|
|
127
|
+
this.#room.removeAllListeners();
|
|
128
|
+
this.#speaking = false;
|
|
129
|
+
if (this.#recognizeTask) {
|
|
130
|
+
await gracefullyCancel(this.#recognizeTask);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=human_input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human_input.js","sourceRoot":"","sources":["../../src/pipeline/human_input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,UAAU,EACf,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,sCAAsC;AAEtC,OAAO,EASL,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
|