@nodetool-ai/runtime 0.8.7 → 0.8.9-beta.1
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/.nodetool-build-stamp +1 -1
- package/dist/context.d.ts +6 -2
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +13 -24
- package/dist/context.js.map +1 -1
- package/dist/host-binaries.d.ts +5 -5
- package/dist/host-binaries.js +5 -5
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/invocation-account.d.ts +1 -42
- package/dist/invocation-account.d.ts.map +1 -1
- package/dist/invocation-account.js +1 -59
- package/dist/invocation-account.js.map +1 -1
- package/dist/media/abort.d.ts +8 -0
- package/dist/media/abort.d.ts.map +1 -0
- package/dist/media/abort.js +18 -0
- package/dist/media/abort.js.map +1 -0
- package/dist/media/audio-encoder.d.ts +37 -0
- package/dist/media/audio-encoder.d.ts.map +1 -0
- package/dist/media/audio-encoder.js +118 -0
- package/dist/media/audio-encoder.js.map +1 -0
- package/dist/media/audio.d.ts +36 -0
- package/dist/media/audio.d.ts.map +1 -0
- package/dist/media/audio.js +84 -0
- package/dist/media/audio.js.map +1 -0
- package/dist/media/av.d.ts +51 -0
- package/dist/media/av.d.ts.map +1 -0
- package/dist/media/av.js +146 -0
- package/dist/media/av.js.map +1 -0
- package/dist/media/codecs.d.ts +9 -0
- package/dist/media/codecs.d.ts.map +1 -0
- package/dist/media/codecs.js +17 -0
- package/dist/media/codecs.js.map +1 -0
- package/dist/media/concat.d.ts +56 -0
- package/dist/media/concat.d.ts.map +1 -0
- package/dist/media/concat.js +319 -0
- package/dist/media/concat.js.map +1 -0
- package/dist/media/convert.d.ts +31 -0
- package/dist/media/convert.d.ts.map +1 -0
- package/dist/media/convert.js +114 -0
- package/dist/media/convert.js.map +1 -0
- package/dist/media/decode.d.ts +31 -0
- package/dist/media/decode.d.ts.map +1 -0
- package/dist/media/decode.js +85 -0
- package/dist/media/decode.js.map +1 -0
- package/dist/media/filter-graph.d.ts +53 -0
- package/dist/media/filter-graph.d.ts.map +1 -0
- package/dist/media/filter-graph.js +260 -0
- package/dist/media/filter-graph.js.map +1 -0
- package/dist/media/frames.d.ts +31 -0
- package/dist/media/frames.d.ts.map +1 -0
- package/dist/media/frames.js +112 -0
- package/dist/media/frames.js.map +1 -0
- package/dist/media/index.d.ts +26 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +26 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/mux.d.ts +58 -0
- package/dist/media/mux.d.ts.map +1 -0
- package/dist/media/mux.js +234 -0
- package/dist/media/mux.js.map +1 -0
- package/dist/media/probe.d.ts +84 -0
- package/dist/media/probe.d.ts.map +1 -0
- package/dist/media/probe.js +133 -0
- package/dist/media/probe.js.map +1 -0
- package/dist/media/rgba.d.ts +78 -0
- package/dist/media/rgba.d.ts.map +1 -0
- package/dist/media/rgba.js +285 -0
- package/dist/media/rgba.js.map +1 -0
- package/dist/media/testing.d.ts +119 -0
- package/dist/media/testing.d.ts.map +1 -0
- package/dist/media/testing.js +343 -0
- package/dist/media/testing.js.map +1 -0
- package/dist/media/transcode.d.ts +17 -0
- package/dist/media/transcode.d.ts.map +1 -0
- package/dist/media/transcode.js +19 -0
- package/dist/media/transcode.js.map +1 -0
- package/dist/media/transform.d.ts +61 -0
- package/dist/media/transform.d.ts.map +1 -0
- package/dist/media/transform.js +371 -0
- package/dist/media/transform.js.map +1 -0
- package/dist/media/verify.d.ts +17 -0
- package/dist/media/verify.d.ts.map +1 -0
- package/dist/media/verify.js +65 -0
- package/dist/media/verify.js.map +1 -0
- package/dist/media-loader.d.ts +8 -0
- package/dist/media-loader.d.ts.map +1 -0
- package/dist/media-loader.js +10 -0
- package/dist/media-loader.js.map +1 -0
- package/dist/prefixed-storage-adapter.d.ts.map +1 -1
- package/dist/prefixed-storage-adapter.js +1 -1
- package/dist/prefixed-storage-adapter.js.map +1 -1
- package/dist/providers/anthropic-provider.d.ts +21 -0
- package/dist/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/providers/anthropic-provider.js +82 -17
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/claude-agent-provider.js +14 -2
- package/dist/providers/claude-agent-provider.js.map +1 -1
- package/dist/providers/codex-provider.d.ts +10 -0
- package/dist/providers/codex-provider.d.ts.map +1 -1
- package/dist/providers/codex-provider.js +29 -3
- package/dist/providers/codex-provider.js.map +1 -1
- package/dist/providers/data-uri.d.ts +6 -0
- package/dist/providers/data-uri.d.ts.map +1 -0
- package/dist/providers/data-uri.js +19 -0
- package/dist/providers/data-uri.js.map +1 -0
- package/dist/providers/dreamina-provider.d.ts +1 -1
- package/dist/providers/dreamina-provider.d.ts.map +1 -1
- package/dist/providers/dreamina-provider.js +54 -72
- package/dist/providers/dreamina-provider.js.map +1 -1
- package/dist/providers/fake-provider.js +1 -1
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +23 -0
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/meta-transcription.d.ts +1 -5
- package/dist/providers/meta-transcription.d.ts.map +1 -1
- package/dist/providers/meta-transcription.js +9 -55
- package/dist/providers/meta-transcription.js.map +1 -1
- package/dist/providers/node-llama-cpp-trending.generated.js +121 -121
- package/dist/providers/node-llama-cpp-trending.generated.js.map +1 -1
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +1 -17
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/providers/openai-provider.d.ts +12 -0
- package/dist/providers/openai-provider.d.ts.map +1 -1
- package/dist/providers/openai-provider.js +27 -2
- package/dist/providers/openai-provider.js.map +1 -1
- package/dist/providers/openrouter-provider.js +1 -1
- package/dist/providers/openrouter-provider.js.map +1 -1
- package/dist/providers/requesty-provider.js +1 -1
- package/dist/providers/requesty-provider.js.map +1 -1
- package/dist/providers/safe-url.d.ts +1 -69
- package/dist/providers/safe-url.d.ts.map +1 -1
- package/dist/providers/safe-url.js +1 -284
- package/dist/providers/safe-url.js.map +1 -1
- package/dist/providers/topaz-provider.d.ts +1 -1
- package/dist/providers/topaz-provider.js +1 -1
- package/dist/providers/video-frame-fallback.d.ts +1 -1
- package/dist/providers/video-frame-fallback.js +4 -4
- package/dist/providers/video-frame-fallback.js.map +1 -1
- package/dist/providers/video-frames.d.ts +6 -16
- package/dist/providers/video-frames.d.ts.map +1 -1
- package/dist/providers/video-frames.js +48 -116
- package/dist/providers/video-frames.js.map +1 -1
- package/dist/python-bridge-base.d.ts +2 -0
- package/dist/python-bridge-base.d.ts.map +1 -1
- package/dist/python-bridge-base.js +9 -26
- package/dist/python-bridge-base.js.map +1 -1
- package/dist/storage-workspace.d.ts +1 -61
- package/dist/storage-workspace.d.ts.map +1 -1
- package/dist/storage-workspace.js +2 -430
- package/dist/storage-workspace.js.map +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +57 -1
- package/dist/testing.js.map +1 -1
- package/dist/trim-video-window.d.ts.map +1 -1
- package/dist/trim-video-window.js +2 -32
- package/dist/trim-video-window.js.map +1 -1
- package/dist/workspace.d.ts +1 -118
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +1 -111
- package/dist/workspace.js.map +1 -1
- package/dist/yt-dlp-format.d.ts +22 -0
- package/dist/yt-dlp-format.d.ts.map +1 -0
- package/dist/yt-dlp-format.js +90 -0
- package/dist/yt-dlp-format.js.map +1 -0
- package/package.json +23 -6
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One output file from filtered or copied input streams: the in-process form
|
|
3
|
+
* of the ffmpeg CLI invocations the video nodes ran, `-vf`, `-af`,
|
|
4
|
+
* `-filter_complex` with `-map`, `-c copy` and `-shortest`. The graph strings
|
|
5
|
+
* are the CLI's, unchanged.
|
|
6
|
+
*/
|
|
7
|
+
import { AV_NOPTS_VALUE, AVSEEK_FLAG_BACKWARD, Demuxer, Encoder, Rational } from "node-av";
|
|
8
|
+
import { AudioEncoder } from "./audio-encoder.js";
|
|
9
|
+
import { abortError, findEncoder, openFileMuxer, quietLibav, startTimeSeconds, throwIfAborted } from "./av.js";
|
|
10
|
+
import { openFilterComplex, openFilterGraph } from "./filter-graph.js";
|
|
11
|
+
/** The CLI's defaults for an `.mp4` output: H.264 in yuv420p. */
|
|
12
|
+
export const DEFAULT_VIDEO_ENCODER = {
|
|
13
|
+
codec: "libx264",
|
|
14
|
+
pixelFormat: "yuv420p"
|
|
15
|
+
};
|
|
16
|
+
function seconds(ts, timeBase) {
|
|
17
|
+
return (Number(ts) * timeBase.num) / timeBase.den;
|
|
18
|
+
}
|
|
19
|
+
function packetSeconds(packet) {
|
|
20
|
+
const ts = packet.dts !== AV_NOPTS_VALUE ? packet.dts : packet.pts;
|
|
21
|
+
if (ts === AV_NOPTS_VALUE || !(packet.timeBase.den > 0))
|
|
22
|
+
return Number.NEGATIVE_INFINITY;
|
|
23
|
+
return seconds(ts, packet.timeBase);
|
|
24
|
+
}
|
|
25
|
+
function packetEndSeconds(packet) {
|
|
26
|
+
if (packet.pts === AV_NOPTS_VALUE || !(packet.timeBase.den > 0))
|
|
27
|
+
return Number.NEGATIVE_INFINITY;
|
|
28
|
+
return seconds(packet.pts + packet.duration, packet.timeBase);
|
|
29
|
+
}
|
|
30
|
+
/** The `[N:v]` and `[N:a]` labels a graph reads, in order of appearance. */
|
|
31
|
+
function graphInputs(graph, inputs) {
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const found = [];
|
|
34
|
+
for (const match of graph.matchAll(/\[(\d+):([va])\]/g)) {
|
|
35
|
+
const label = `${match[1]}:${match[2]}`;
|
|
36
|
+
if (seen.has(label))
|
|
37
|
+
continue;
|
|
38
|
+
seen.add(label);
|
|
39
|
+
const input = inputs[Number(match[1])];
|
|
40
|
+
if (!input)
|
|
41
|
+
throw new Error(`The graph reads [${label}] but there is no input ${match[1]}`);
|
|
42
|
+
if (input.seekSec || input.toSec !== undefined) {
|
|
43
|
+
throw new Error(`Input ${match[1]} is seeked; a filter_complex input cannot be`);
|
|
44
|
+
}
|
|
45
|
+
found.push({ filePath: input.filePath, kind: match[2] === "v" ? "video" : "audio", label });
|
|
46
|
+
}
|
|
47
|
+
return found;
|
|
48
|
+
}
|
|
49
|
+
/** Open the filtered frames a plan names, or `null` for a missing optional stream. */
|
|
50
|
+
async function openPlanFrames(plan, kind, inputs, tail, signal) {
|
|
51
|
+
if ("graph" in plan) {
|
|
52
|
+
const output = tail ? "__transform_out" : plan.output;
|
|
53
|
+
return openFilterComplex({
|
|
54
|
+
inputs: graphInputs(plan.graph, inputs),
|
|
55
|
+
graph: tail ? `${plan.graph};[${plan.output}]${tail}[${output}]` : plan.graph,
|
|
56
|
+
output,
|
|
57
|
+
outputKind: kind,
|
|
58
|
+
signal
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const index = plan.input ?? 0;
|
|
62
|
+
const input = inputs[index];
|
|
63
|
+
if (!input)
|
|
64
|
+
throw new Error(`There is no input ${index}`);
|
|
65
|
+
const seekSec = input.seekSec && input.seekSec > 0 ? input.seekSec : 0;
|
|
66
|
+
const prefix = kind === "audio" ? "a" : "";
|
|
67
|
+
// Frames decoded from the keyframe before the seek point sit before zero; the
|
|
68
|
+
// CLI dropped them, and `-to` ends the read at a source time.
|
|
69
|
+
const trims = [
|
|
70
|
+
seekSec > 0 ? `${prefix}trim=start=0` : null,
|
|
71
|
+
input.toSec !== undefined && input.toSec > seekSec ? `${prefix}trim=end=${input.toSec - seekSec}` : null
|
|
72
|
+
];
|
|
73
|
+
const run = await openFilterGraph({
|
|
74
|
+
filePath: input.filePath,
|
|
75
|
+
kind,
|
|
76
|
+
filter: [...trims, plan.filter, tail].filter((step) => step).join(",") || (kind === "audio" ? "anull" : "null"),
|
|
77
|
+
seekSec,
|
|
78
|
+
signal
|
|
79
|
+
});
|
|
80
|
+
if (!run && !plan.optional)
|
|
81
|
+
throw new Error(`${input.filePath} has no ${kind} stream`);
|
|
82
|
+
return run;
|
|
83
|
+
}
|
|
84
|
+
/** Packets of an input stream, copied, rebased to start near zero. */
|
|
85
|
+
async function openCopySource(output, input, kind, optional, startSec, signal) {
|
|
86
|
+
const demuxer = await Demuxer.open(input.filePath, { signal });
|
|
87
|
+
try {
|
|
88
|
+
const stream = kind === "video" ? demuxer.video() : demuxer.audio();
|
|
89
|
+
if (!stream) {
|
|
90
|
+
await demuxer.close();
|
|
91
|
+
if (optional)
|
|
92
|
+
return null;
|
|
93
|
+
throw new Error(`${input.filePath} has no ${kind} stream`);
|
|
94
|
+
}
|
|
95
|
+
const formatStart = startTimeSeconds(demuxer.getFormatContext().startTime, { num: 1, den: 1_000_000 });
|
|
96
|
+
const seekSec = input.seekSec && input.seekSec > 0 ? input.seekSec : 0;
|
|
97
|
+
if (seekSec > 0)
|
|
98
|
+
await demuxer.seek(formatStart + seekSec, -1, AVSEEK_FLAG_BACKWARD);
|
|
99
|
+
const index = output.muxer.addStream(stream);
|
|
100
|
+
// Matroska and WebM name a codec by its id. A tag copied from MP4
|
|
101
|
+
// (`mp4a`) fails their header, so drop it, as the CLI drops a tag the
|
|
102
|
+
// output format does not take.
|
|
103
|
+
if (/^(matroska|webm)/.test(output.muxer.getFormatContext().oformat?.name ?? "")) {
|
|
104
|
+
const copied = output.muxer.getStream(index);
|
|
105
|
+
if (copied)
|
|
106
|
+
copied.codecpar.codecTag = 0;
|
|
107
|
+
}
|
|
108
|
+
const timeBase = stream.timeBase;
|
|
109
|
+
const packets = demuxer.packets(stream.index);
|
|
110
|
+
const endSec = input.toSec;
|
|
111
|
+
let offsetTicks = null;
|
|
112
|
+
let closed = false;
|
|
113
|
+
return {
|
|
114
|
+
index,
|
|
115
|
+
async next() {
|
|
116
|
+
for (;;) {
|
|
117
|
+
if (closed)
|
|
118
|
+
return null;
|
|
119
|
+
const { value, done } = await packets.next();
|
|
120
|
+
if (done)
|
|
121
|
+
return null;
|
|
122
|
+
if (!value)
|
|
123
|
+
continue;
|
|
124
|
+
if (signal?.aborted) {
|
|
125
|
+
value.free();
|
|
126
|
+
throw abortError(signal);
|
|
127
|
+
}
|
|
128
|
+
const ts = value.pts !== AV_NOPTS_VALUE ? value.pts : value.dts;
|
|
129
|
+
const sourceSec = ts === AV_NOPTS_VALUE ? 0 : seconds(ts, timeBase) - formatStart;
|
|
130
|
+
if (endSec !== undefined && sourceSec >= endSec) {
|
|
131
|
+
value.free();
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
if (offsetTicks === null) {
|
|
135
|
+
// A copy cannot cut between keyframes: the output starts at the
|
|
136
|
+
// keyframe the seek landed on, which the first copied stream
|
|
137
|
+
// fixes for every stream of the file.
|
|
138
|
+
startSec.value ??= seekSec > 0 ? sourceSec : 0;
|
|
139
|
+
offsetTicks = BigInt(Math.round(((formatStart + startSec.value) * timeBase.den) / timeBase.num));
|
|
140
|
+
}
|
|
141
|
+
if (seekSec > 0 && sourceSec < startSec.value) {
|
|
142
|
+
value.free();
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (value.pts !== AV_NOPTS_VALUE)
|
|
146
|
+
value.pts -= offsetTicks;
|
|
147
|
+
if (value.dts !== AV_NOPTS_VALUE)
|
|
148
|
+
value.dts -= offsetTicks;
|
|
149
|
+
return value;
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
async close() {
|
|
153
|
+
if (closed)
|
|
154
|
+
return;
|
|
155
|
+
closed = true;
|
|
156
|
+
await packets.return(undefined);
|
|
157
|
+
await demuxer.close();
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
catch (error) {
|
|
162
|
+
await demuxer.close();
|
|
163
|
+
throw error;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/** Packets of filtered video frames, encoded at the graph's output rate. */
|
|
167
|
+
async function openVideoEncodeSource(output, run, spec, signal) {
|
|
168
|
+
const codec = findEncoder(spec.codec);
|
|
169
|
+
if (!codec)
|
|
170
|
+
throw new Error(`This libav build has no ${spec.codec} encoder`);
|
|
171
|
+
const frames = run.frames();
|
|
172
|
+
const first = await frames.next();
|
|
173
|
+
if (first.done) {
|
|
174
|
+
await run.close();
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
const head = first.value;
|
|
178
|
+
// x264 sizes its rate control by the frame rate; without one it reads the
|
|
179
|
+
// time base as the rate, and a flat picture drifts several levels.
|
|
180
|
+
const rate = run.frameRate();
|
|
181
|
+
let encoder;
|
|
182
|
+
try {
|
|
183
|
+
encoder = await Encoder.create(codec, {
|
|
184
|
+
options: spec.options,
|
|
185
|
+
context: rate ? { framerate: new Rational(rate.num, rate.den) } : undefined,
|
|
186
|
+
signal
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
head.free();
|
|
191
|
+
await run.close();
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
const index = output.muxer.addStream(encoder);
|
|
195
|
+
return packetSourceFrom(index, replayRun(run, head, frames), (frame) => encoder.encodeAll(frame), () => encoder.encodeAll(null), () => encoder.close(), signal);
|
|
196
|
+
}
|
|
197
|
+
/** `run` with `head`, already pulled from `frames`, put back in front. */
|
|
198
|
+
function replayRun(run, head, frames) {
|
|
199
|
+
async function* replay() {
|
|
200
|
+
yield head;
|
|
201
|
+
yield* frames;
|
|
202
|
+
}
|
|
203
|
+
return { frames: replay, frameRate: () => run.frameRate(), close: () => run.close() };
|
|
204
|
+
}
|
|
205
|
+
/** Packets of filtered audio frames, encoded at the first frame's rate and channel count. */
|
|
206
|
+
async function openAudioEncodeSource(output, run, codecName, signal) {
|
|
207
|
+
const frames = run.frames();
|
|
208
|
+
const first = await frames.next();
|
|
209
|
+
if (first.done) {
|
|
210
|
+
await run.close();
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
const head = first.value;
|
|
214
|
+
let encoder;
|
|
215
|
+
try {
|
|
216
|
+
encoder = await AudioEncoder.create(codecName, {
|
|
217
|
+
sampleRate: head.sampleRate,
|
|
218
|
+
channels: head.channels,
|
|
219
|
+
signal
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
head.free();
|
|
224
|
+
await run.close();
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
const index = output.muxer.addStream(encoder.encoder);
|
|
228
|
+
return packetSourceFrom(index, replayRun(run, head, frames), (frame) => encoder.encode(frame), () => encoder.flush(), () => encoder.close(), signal);
|
|
229
|
+
}
|
|
230
|
+
function packetSourceFrom(index, run, encode, flush, release, signal) {
|
|
231
|
+
const frames = run.frames();
|
|
232
|
+
const queue = [];
|
|
233
|
+
let ended = false;
|
|
234
|
+
let closed = false;
|
|
235
|
+
return {
|
|
236
|
+
index,
|
|
237
|
+
async next() {
|
|
238
|
+
while (queue.length === 0 && !ended) {
|
|
239
|
+
const { value, done } = await frames.next();
|
|
240
|
+
if (done) {
|
|
241
|
+
ended = true;
|
|
242
|
+
queue.push(...(await flush()));
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
if (signal?.aborted)
|
|
247
|
+
throw abortError(signal);
|
|
248
|
+
queue.push(...(await encode(value)));
|
|
249
|
+
}
|
|
250
|
+
finally {
|
|
251
|
+
value.free();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return queue.shift() ?? null;
|
|
255
|
+
},
|
|
256
|
+
async close() {
|
|
257
|
+
if (closed)
|
|
258
|
+
return;
|
|
259
|
+
closed = true;
|
|
260
|
+
for (const packet of queue.splice(0))
|
|
261
|
+
packet.free();
|
|
262
|
+
await run.close();
|
|
263
|
+
release();
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Write `outPath` from `inputs`. `video` and `audio` name where each output
|
|
269
|
+
* stream comes from, or `null` for none. Filtered streams are encoded with
|
|
270
|
+
* `videoEncoder` (H.264 yuv420p by default) and `audioCodec` (AAC by default,
|
|
271
|
+
* at the filtered rate and channel count). `shortest` ends the file when its
|
|
272
|
+
* first stream ends, as `-shortest` did.
|
|
273
|
+
*/
|
|
274
|
+
export async function transformMedia(opts) {
|
|
275
|
+
const { signal, inputs } = opts;
|
|
276
|
+
quietLibav();
|
|
277
|
+
throwIfAborted(signal);
|
|
278
|
+
if (!opts.video && !opts.audio)
|
|
279
|
+
throw new Error("The output has no stream");
|
|
280
|
+
const videoSpec = opts.videoEncoder ?? DEFAULT_VIDEO_ENCODER;
|
|
281
|
+
const output = await openFileMuxer(opts.outPath, {
|
|
282
|
+
format: opts.format,
|
|
283
|
+
muxerOptions: opts.muxerOptions,
|
|
284
|
+
signal
|
|
285
|
+
});
|
|
286
|
+
const sources = [];
|
|
287
|
+
const copyStart = { value: null };
|
|
288
|
+
try {
|
|
289
|
+
for (const [kind, plan] of [
|
|
290
|
+
["video", opts.video],
|
|
291
|
+
["audio", opts.audio]
|
|
292
|
+
]) {
|
|
293
|
+
if (!plan)
|
|
294
|
+
continue;
|
|
295
|
+
if ("copy" in plan) {
|
|
296
|
+
const input = inputs[plan.copy];
|
|
297
|
+
if (!input)
|
|
298
|
+
throw new Error(`There is no input ${plan.copy}`);
|
|
299
|
+
const source = await openCopySource(output, input, kind, plan.optional ?? false, copyStart, signal);
|
|
300
|
+
if (source)
|
|
301
|
+
sources.push(source);
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
const tail = kind === "video"
|
|
305
|
+
? [videoSpec.filter, `format=${videoSpec.pixelFormat}`].filter(Boolean).join(",")
|
|
306
|
+
: "";
|
|
307
|
+
const run = await openPlanFrames(plan, kind, inputs, tail, signal);
|
|
308
|
+
if (!run)
|
|
309
|
+
continue;
|
|
310
|
+
const source = kind === "video"
|
|
311
|
+
? await openVideoEncodeSource(output, run, videoSpec, signal)
|
|
312
|
+
: await openAudioEncodeSource(output, run, opts.audioCodec ?? "aac", signal);
|
|
313
|
+
if (source)
|
|
314
|
+
sources.push(source);
|
|
315
|
+
}
|
|
316
|
+
if (sources.length === 0)
|
|
317
|
+
throw new Error("No input stream reached the output");
|
|
318
|
+
await interleave(output, sources, opts.shortest ?? false, signal);
|
|
319
|
+
await output.close();
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
for (const source of sources)
|
|
323
|
+
await source.close();
|
|
324
|
+
await output.close();
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Write every source's packets in time order. With `shortest`, the first
|
|
329
|
+
* source to end sets the end of the file: later packets of the others are
|
|
330
|
+
* dropped, which also stops an endless one (an `apad`).
|
|
331
|
+
*/
|
|
332
|
+
async function interleave(output, sources, shortest, signal) {
|
|
333
|
+
// One at a time: the first copied stream fixes where every copy starts.
|
|
334
|
+
const heads = [];
|
|
335
|
+
for (const source of sources) {
|
|
336
|
+
heads.push({ source, packet: await source.next(), end: Number.NEGATIVE_INFINITY });
|
|
337
|
+
}
|
|
338
|
+
let endSec = Number.POSITIVE_INFINITY;
|
|
339
|
+
let written = 0;
|
|
340
|
+
for (;;) {
|
|
341
|
+
if (signal?.aborted)
|
|
342
|
+
throw abortError(signal);
|
|
343
|
+
let earliest = null;
|
|
344
|
+
for (const head of heads) {
|
|
345
|
+
if (!head.packet)
|
|
346
|
+
continue;
|
|
347
|
+
if (!earliest || packetSeconds(head.packet) < packetSeconds(earliest.packet))
|
|
348
|
+
earliest = head;
|
|
349
|
+
}
|
|
350
|
+
if (!earliest)
|
|
351
|
+
break;
|
|
352
|
+
const packet = earliest.packet;
|
|
353
|
+
if (packetSeconds(packet) >= endSec) {
|
|
354
|
+
// Past the end the shortest stream set: this source is done.
|
|
355
|
+
packet.free();
|
|
356
|
+
earliest.packet = null;
|
|
357
|
+
await earliest.source.close();
|
|
358
|
+
continue;
|
|
359
|
+
}
|
|
360
|
+
earliest.end = Math.max(earliest.end, packetEndSeconds(packet));
|
|
361
|
+
await output.muxer.writePacket(packet, earliest.source.index);
|
|
362
|
+
packet.free();
|
|
363
|
+
written += 1;
|
|
364
|
+
earliest.packet = await earliest.source.next();
|
|
365
|
+
if (!earliest.packet && shortest)
|
|
366
|
+
endSec = Math.min(endSec, earliest.end);
|
|
367
|
+
}
|
|
368
|
+
if (written === 0)
|
|
369
|
+
throw new Error("The inputs produced no packets");
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../src/media/transform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decode a whole stream with libav's strict error detection and keep nothing:
|
|
3
|
+
* the in-process form of `ffmpeg -xerror -err_detect explode -i in -f null -`.
|
|
4
|
+
*/
|
|
5
|
+
import type { MediaKind } from "./decode.js";
|
|
6
|
+
/**
|
|
7
|
+
* Decode every frame of `bytes`' first `kind` stream. `format` names the
|
|
8
|
+
* demuxer (`wav`, `ogg`, `mp3`, `png_pipe`, `jpeg_pipe`, `webp_pipe`) instead
|
|
9
|
+
* of probing for it. Throws when the stream is missing, any packet fails to
|
|
10
|
+
* decode, or the stream decodes to nothing.
|
|
11
|
+
*/
|
|
12
|
+
export declare function verifyDecodes(bytes: Uint8Array, opts: {
|
|
13
|
+
kind: MediaKind;
|
|
14
|
+
format?: string;
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/media/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,GAC/D,OAAO,CAAC,IAAI,CAAC,CA6Cf"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decode a whole stream with libav's strict error detection and keep nothing:
|
|
3
|
+
* the in-process form of `ffmpeg -xerror -err_detect explode -i in -f null -`.
|
|
4
|
+
*/
|
|
5
|
+
import { AV_PKT_FLAG_CORRUPT, Decoder, Demuxer } from "node-av";
|
|
6
|
+
import { abortError, quietLibav, throwIfAborted } from "./av.js";
|
|
7
|
+
/**
|
|
8
|
+
* Decode every frame of `bytes`' first `kind` stream. `format` names the
|
|
9
|
+
* demuxer (`wav`, `ogg`, `mp3`, `png_pipe`, `jpeg_pipe`, `webp_pipe`) instead
|
|
10
|
+
* of probing for it. Throws when the stream is missing, any packet fails to
|
|
11
|
+
* decode, or the stream decodes to nothing.
|
|
12
|
+
*/
|
|
13
|
+
export async function verifyDecodes(bytes, opts) {
|
|
14
|
+
const { signal } = opts;
|
|
15
|
+
quietLibav();
|
|
16
|
+
throwIfAborted(signal);
|
|
17
|
+
const demuxer = await Demuxer.open(Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength), {
|
|
18
|
+
format: opts.format,
|
|
19
|
+
// SAFETY: `err_detect` is a generic AVFormatContext option, which every
|
|
20
|
+
// demuxer takes; the per-format option types list only private ones.
|
|
21
|
+
options: { err_detect: "explode" },
|
|
22
|
+
signal
|
|
23
|
+
});
|
|
24
|
+
let decoder = null;
|
|
25
|
+
try {
|
|
26
|
+
const stream = opts.kind === "audio" ? demuxer.audio() : demuxer.video();
|
|
27
|
+
if (!stream)
|
|
28
|
+
throw new Error(`The file has no ${opts.kind} stream`);
|
|
29
|
+
// SAFETY: `err_detect` is a generic AVCodecContext option, which every
|
|
30
|
+
// decoder takes; the per-codec option types list only private ones.
|
|
31
|
+
const options = { err_detect: "explode" };
|
|
32
|
+
decoder = await Decoder.create(stream, { exitOnError: true, options, signal });
|
|
33
|
+
let decoded = 0;
|
|
34
|
+
const index = stream.index;
|
|
35
|
+
// A short read marks the packet corrupt; the CLI's `-xerror` failed on it.
|
|
36
|
+
async function* checked() {
|
|
37
|
+
for await (const packet of demuxer.packets(index)) {
|
|
38
|
+
if (packet && (packet.flags & AV_PKT_FLAG_CORRUPT) !== 0) {
|
|
39
|
+
packet.free();
|
|
40
|
+
throw new Error("A packet is corrupt or cut short");
|
|
41
|
+
}
|
|
42
|
+
yield packet;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
for await (const frame of decoder.frames(checked())) {
|
|
46
|
+
if (!frame)
|
|
47
|
+
continue;
|
|
48
|
+
try {
|
|
49
|
+
if (signal?.aborted)
|
|
50
|
+
throw abortError(signal);
|
|
51
|
+
decoded += opts.kind === "audio" ? frame.nbSamples : frame.width * frame.height;
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
frame.free();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (decoded === 0)
|
|
58
|
+
throw new Error(`The ${opts.kind} stream decoded to nothing`);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
decoder?.close();
|
|
62
|
+
await demuxer.close();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/media/verify.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,EAAe,MAAM,SAAS,CAAC;AAE7E,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGjE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAiB,EACjB,IAAgE;IAEhE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,CAAC;IACb,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE;QAChG,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,wEAAwE;QACxE,qEAAqE;QACrE,OAAO,EAAE,EAAE,UAAU,EAAE,SAAS,EAA4B;QAC5D,MAAM;KACP,CAAC,CAAC;IACH,IAAI,OAAO,GAAmB,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACzE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,SAAS,CAAC,CAAC;QACpE,uEAAuE;QACvE,oEAAoE;QACpE,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,SAAS,EAA4B,CAAC;QACpE,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/E,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,2EAA2E;QAC3E,KAAK,SAAS,CAAC,CAAC,OAAO;YACrB,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzD,MAAM,CAAC,IAAI,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBACtD,CAAC;gBACD,MAAM,MAAM,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,IAAI,CAAC;gBACH,IAAI,MAAM,EAAE,OAAO;oBAAE,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;gBAC9C,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;YAClF,CAAC;oBAAS,CAAC;gBACT,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,OAAO,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,IAAI,4BAA4B,CAAC,CAAC;IACnF,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,KAAK,EAAE,CAAC;QACjB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The media module, loaded on demand. It loads node-av's native addon, which
|
|
3
|
+
* no browser, edge or Turbopack bundle can place, so those bundlers are told
|
|
4
|
+
* to leave the import alone. esbuild ignores the hint and inlines it, which is
|
|
5
|
+
* what the packaged backend needs.
|
|
6
|
+
*/
|
|
7
|
+
export declare function loadMediaModule(): Promise<typeof import("./media/index.js")>;
|
|
8
|
+
//# sourceMappingURL=media-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-loader.d.ts","sourceRoot":"","sources":["../src/media-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAAC,cAAc,kBAAkB,CAAC,CAAC,CAE5E"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The media module, loaded on demand. It loads node-av's native addon, which
|
|
3
|
+
* no browser, edge or Turbopack bundle can place, so those bundlers are told
|
|
4
|
+
* to leave the import alone. esbuild ignores the hint and inlines it, which is
|
|
5
|
+
* what the packaged backend needs.
|
|
6
|
+
*/
|
|
7
|
+
export function loadMediaModule() {
|
|
8
|
+
return import(/* webpackIgnore: true */ /* turbopackIgnore: true */ "./media/index.js");
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=media-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-loader.js","sourceRoot":"","sources":["../src/media-loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,MAAM,CAAC,yBAAyB,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,CAAC;AAC1F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefixed-storage-adapter.d.ts","sourceRoot":"","sources":["../src/prefixed-storage-adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prefixed-storage-adapter.d.ts","sourceRoot":"","sources":["../src/prefixed-storage-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAEtB;;;;;;;;;;;GAWG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAKzD,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,YACmB,KAAK,EAAE,cAAc,EACtC,MAAM,EAAE,MAAM,EAGf;IAED,OAAO,CAAC,KAAK;IAIb,8DAA8D;IAC9D,OAAO,CAAC,OAAO;IAKf,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1E;IAED,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAEhD;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpC;IAED,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7B;IAEK,IAAI,CACR,MAAM,EAAE,MAAM,EACd,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAChC,OAAO,CAAC,iBAAiB,CAAC,CAe5B;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEpC;IAEK,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAKnD;IAED,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7C;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefixed-storage-adapter.js","sourceRoot":"","sources":["../src/prefixed-storage-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"prefixed-storage-adapter.js","sourceRoot":"","sources":["../src/prefixed-storage-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,21 @@ interface AnthropicProviderOptions {
|
|
|
6
6
|
clientFactory?: (apiKey: string) => Anthropic;
|
|
7
7
|
fetchFn?: typeof fetch;
|
|
8
8
|
clientOptions?: Pick<ClientOptions, "authToken" | "credentials" | "config" | "profile" | "baseURL">;
|
|
9
|
+
/**
|
|
10
|
+
* Top-level automatic caching marker. When set it caches the conversation
|
|
11
|
+
* tail in place of the explicit tail breakpoint, and its TTL is reused for
|
|
12
|
+
* the system breakpoint.
|
|
13
|
+
*/
|
|
9
14
|
cacheControl?: {
|
|
10
15
|
type: "ephemeral";
|
|
11
16
|
ttl?: "5m" | "1h";
|
|
12
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Place prompt-cache breakpoints on the system prompt and the conversation
|
|
20
|
+
* tail. On by default; pass `false` for a gateway that rejects
|
|
21
|
+
* `cache_control`.
|
|
22
|
+
*/
|
|
23
|
+
promptCaching?: boolean;
|
|
13
24
|
betas?: string[];
|
|
14
25
|
/**
|
|
15
26
|
* Provider id reported by this instance. Defaults to `"anthropic"`.
|
|
@@ -36,6 +47,7 @@ export declare class AnthropicProvider extends BaseProvider {
|
|
|
36
47
|
private _fetch;
|
|
37
48
|
private _clientOptions;
|
|
38
49
|
private _cacheControl;
|
|
50
|
+
private _promptCaching;
|
|
39
51
|
private _betas;
|
|
40
52
|
constructor(secrets: {
|
|
41
53
|
ANTHROPIC_API_KEY?: string;
|
|
@@ -65,6 +77,15 @@ export declare class AnthropicProvider extends BaseProvider {
|
|
|
65
77
|
formatTools(tools: ProviderTool[]): Array<Record<string, unknown>>;
|
|
66
78
|
private extractSystemMessage;
|
|
67
79
|
private buildRequest;
|
|
80
|
+
/**
|
|
81
|
+
* Mark the request so consecutive calls reuse the provider's KV cache. The
|
|
82
|
+
* prefix renders as tools, then system, then messages, so one breakpoint at
|
|
83
|
+
* the end of the system prompt caches the tool catalog and the prompt, and
|
|
84
|
+
* one on the last message block caches the conversation so far. A tool loop
|
|
85
|
+
* resends that whole prefix every round, which then bills as cache reads.
|
|
86
|
+
* Breakpoints the caller set on tools count against the four allowed.
|
|
87
|
+
*/
|
|
88
|
+
private applyCacheBreakpoints;
|
|
68
89
|
generateMessages(args: {
|
|
69
90
|
messages: Message[];
|
|
70
91
|
model: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-provider.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAE,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AASlE,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWlD,OAAO,KAAK,EACV,aAAa,EAEb,OAAO,
|
|
1
|
+
{"version":3,"file":"anthropic-provider.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic-provider.ts"],"names":[],"mappings":"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"}
|