poe-code 15.0.21 → 15.0.22
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/metafile.json +1 -1
- package/package.json +1 -1
- package/packages/safe-bash/dist/chunks/{chunk-UO33SQJU.js → chunk-2PQ3XOCQ.js} +239 -2
- package/packages/safe-bash/dist/chunks/chunk-2PQ3XOCQ.js.map +7 -0
- package/packages/safe-bash/dist/chunks/{chunk-WISNTI7E.js → chunk-3Y5PKSHX.js} +7 -11
- package/packages/safe-bash/dist/chunks/{chunk-WISNTI7E.js.map → chunk-3Y5PKSHX.js.map} +1 -1
- package/packages/safe-bash/dist/chunks/{chunk-VY5N6O6I.js → chunk-BXVGCJXW.js} +108 -21
- package/packages/safe-bash/dist/chunks/chunk-BXVGCJXW.js.map +7 -0
- package/packages/safe-bash/dist/chunks/chunk-C7QNJ3D4.js +13 -0
- package/packages/safe-bash/dist/chunks/chunk-C7QNJ3D4.js.map +7 -0
- package/packages/safe-bash/dist/chunks/{chunk-AWP6Z3RR.js → chunk-E3NZKSTA.js} +8 -12
- package/packages/safe-bash/dist/chunks/{chunk-AWP6Z3RR.js.map → chunk-E3NZKSTA.js.map} +1 -1
- package/packages/safe-bash/dist/chunks/{chunk-WXUZXY35.js → chunk-FMTBJ7SG.js} +3 -3
- package/packages/safe-bash/dist/chunks/{chunk-QX2X5EC5.js → chunk-H6E6F5KJ.js} +7 -11
- package/packages/safe-bash/dist/chunks/{chunk-QX2X5EC5.js.map → chunk-H6E6F5KJ.js.map} +1 -1
- package/packages/safe-bash/dist/chunks/{chunk-IDJQT32M.js → chunk-HQCBEAFK.js} +7 -11
- package/packages/safe-bash/dist/chunks/{chunk-IDJQT32M.js.map → chunk-HQCBEAFK.js.map} +1 -1
- package/packages/safe-bash/dist/chunks/{chunk-4V3NGZAG.js → chunk-IYFB6VED.js} +6 -10
- package/packages/safe-bash/dist/chunks/{chunk-4V3NGZAG.js.map → chunk-IYFB6VED.js.map} +1 -1
- package/packages/safe-bash/dist/chunks/chunk-KJYVSFGF.js +284 -0
- package/packages/safe-bash/dist/chunks/chunk-KJYVSFGF.js.map +7 -0
- package/packages/safe-bash/dist/chunks/{chunk-O7BRWSKX.js → chunk-LHKAA57T.js} +60 -17
- package/packages/safe-bash/dist/chunks/chunk-LHKAA57T.js.map +7 -0
- package/packages/safe-bash/dist/chunks/chunk-LR32SJ3D.js +915 -0
- package/packages/safe-bash/dist/chunks/chunk-LR32SJ3D.js.map +7 -0
- package/packages/safe-bash/dist/chunks/{chunk-EUNOVYVT.js → chunk-OECKXHVJ.js} +2 -2
- package/packages/safe-bash/dist/chunks/{chunk-DKT746UJ.js → chunk-PE5NZIA2.js} +5 -9
- package/packages/safe-bash/dist/chunks/{chunk-DKT746UJ.js.map → chunk-PE5NZIA2.js.map} +1 -1
- package/packages/safe-bash/dist/chunks/{chunk-4JW32W4B.js → chunk-PMBBUNNN.js} +7 -11
- package/packages/safe-bash/dist/chunks/{chunk-4JW32W4B.js.map → chunk-PMBBUNNN.js.map} +1 -1
- package/packages/safe-bash/dist/chunks/{chunk-YFFFBLBC.js → chunk-TJVKGNKA.js} +6 -10
- package/packages/safe-bash/dist/chunks/{chunk-YFFFBLBC.js.map → chunk-TJVKGNKA.js.map} +1 -1
- package/packages/safe-bash/dist/chunks/{chunk-FIY2BMTU.js → chunk-W3TLNFDB.js} +8 -12
- package/packages/safe-bash/dist/chunks/{chunk-FIY2BMTU.js.map → chunk-W3TLNFDB.js.map} +1 -1
- package/packages/safe-bash/dist/chunks/{chunk-PPFWG34Y.js → chunk-XBLVOMEJ.js} +2 -2
- package/packages/safe-bash/dist/chunks/{chunk-WJWYJDQE.js → chunk-XYVCXUGM.js} +7 -11
- package/packages/safe-bash/dist/chunks/{chunk-WJWYJDQE.js.map → chunk-XYVCXUGM.js.map} +1 -1
- package/packages/safe-bash/dist/commands/csplit/index.browser.js +4 -6
- package/packages/safe-bash/dist/commands/factor/index.browser.js +3 -5
- package/packages/safe-bash/dist/commands/getopt/index.browser.js +3 -5
- package/packages/safe-bash/dist/commands/hexdump/index.browser.js +3 -5
- package/packages/safe-bash/dist/commands/iconv/index.browser.js +3 -5
- package/packages/safe-bash/dist/commands/line-endings/index.browser.js +4 -6
- package/packages/safe-bash/dist/commands/llm/command.d.ts +3 -2
- package/packages/safe-bash/dist/commands/llm/command.d.ts.map +1 -1
- package/packages/safe-bash/dist/commands/llm/command.js +260 -181
- package/packages/safe-bash/dist/commands/llm/command.js.map +1 -1
- package/packages/safe-bash/dist/commands/llm/elevenlabs-stream.d.ts +3 -0
- package/packages/safe-bash/dist/commands/llm/elevenlabs-stream.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/llm/elevenlabs-stream.js +118 -0
- package/packages/safe-bash/dist/commands/llm/elevenlabs-stream.js.map +1 -0
- package/packages/safe-bash/dist/commands/llm/elevenlabs.d.ts +16 -0
- package/packages/safe-bash/dist/commands/llm/elevenlabs.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/llm/elevenlabs.js +120 -0
- package/packages/safe-bash/dist/commands/llm/elevenlabs.js.map +1 -0
- package/packages/safe-bash/dist/commands/llm/index.browser.js +10 -4
- package/packages/safe-bash/dist/commands/llm/index.d.ts +5 -5
- package/packages/safe-bash/dist/commands/llm/index.d.ts.map +1 -1
- package/packages/safe-bash/dist/commands/llm/index.js +3 -11
- package/packages/safe-bash/dist/commands/llm/index.js.map +1 -1
- package/packages/safe-bash/dist/commands/llm/mime.d.ts +2 -1
- package/packages/safe-bash/dist/commands/llm/mime.d.ts.map +1 -1
- package/packages/safe-bash/dist/commands/llm/mime.js +125 -21
- package/packages/safe-bash/dist/commands/llm/mime.js.map +1 -1
- package/packages/safe-bash/dist/commands/llm/openai-http.d.ts +9 -0
- package/packages/safe-bash/dist/commands/llm/openai-http.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/llm/openai-http.js +144 -0
- package/packages/safe-bash/dist/commands/llm/openai-http.js.map +1 -0
- package/packages/safe-bash/dist/commands/llm/openai-sse.d.ts +3 -0
- package/packages/safe-bash/dist/commands/llm/openai-sse.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/llm/openai-sse.js +67 -0
- package/packages/safe-bash/dist/commands/llm/openai-sse.js.map +1 -0
- package/packages/safe-bash/dist/commands/llm/openai.d.ts +15 -0
- package/packages/safe-bash/dist/commands/llm/openai.d.ts.map +1 -0
- package/packages/safe-bash/dist/commands/llm/openai.js +203 -0
- package/packages/safe-bash/dist/commands/llm/openai.js.map +1 -0
- package/packages/safe-bash/dist/commands/llm/providers/elevenlabs.d.ts +1 -15
- package/packages/safe-bash/dist/commands/llm/providers/elevenlabs.d.ts.map +1 -1
- package/packages/safe-bash/dist/commands/llm/providers/elevenlabs.js +1 -50
- package/packages/safe-bash/dist/commands/llm/providers/elevenlabs.js.map +1 -1
- package/packages/safe-bash/dist/commands/llm/providers/index.browser.js +2 -4
- package/packages/safe-bash/dist/commands/llm/providers/openai.d.ts +1 -14
- package/packages/safe-bash/dist/commands/llm/providers/openai.d.ts.map +1 -1
- package/packages/safe-bash/dist/commands/llm/providers/openai.js +1 -77
- package/packages/safe-bash/dist/commands/llm/providers/openai.js.map +1 -1
- package/packages/safe-bash/dist/commands/llm/providers/shared.d.ts +4 -14
- package/packages/safe-bash/dist/commands/llm/providers/shared.d.ts.map +1 -1
- package/packages/safe-bash/dist/commands/llm/providers/shared.js +3 -156
- package/packages/safe-bash/dist/commands/llm/providers/shared.js.map +1 -1
- package/packages/safe-bash/dist/commands/network/index.browser.js +8 -13
- package/packages/safe-bash/dist/commands/pr/index.browser.js +3 -5
- package/packages/safe-bash/dist/commands/tsort/index.browser.js +3 -5
- package/packages/safe-bash/dist/commands/xml/index.browser.js +4 -7
- package/packages/safe-bash/dist/commands/yq/index.browser.js +5 -8
- package/packages/safe-bash/dist/core.browser.js +36 -43
- package/packages/safe-bash/dist/core.browser.js.map +1 -1
- package/packages/safe-bash/dist/chunks/chunk-BZUQJTOZ.js +0 -322
- package/packages/safe-bash/dist/chunks/chunk-BZUQJTOZ.js.map +0 -7
- package/packages/safe-bash/dist/chunks/chunk-EUTSYRNM.js +0 -111
- package/packages/safe-bash/dist/chunks/chunk-EUTSYRNM.js.map +0 -7
- package/packages/safe-bash/dist/chunks/chunk-F5AOPLRZ.js +0 -355
- package/packages/safe-bash/dist/chunks/chunk-F5AOPLRZ.js.map +0 -7
- package/packages/safe-bash/dist/chunks/chunk-FDGESHPB.js +0 -224
- package/packages/safe-bash/dist/chunks/chunk-FDGESHPB.js.map +0 -7
- package/packages/safe-bash/dist/chunks/chunk-KYU6MXVK.js +0 -58
- package/packages/safe-bash/dist/chunks/chunk-KYU6MXVK.js.map +0 -7
- package/packages/safe-bash/dist/chunks/chunk-O7BRWSKX.js.map +0 -7
- package/packages/safe-bash/dist/chunks/chunk-TTTOMUAY.js +0 -33
- package/packages/safe-bash/dist/chunks/chunk-TTTOMUAY.js.map +0 -7
- package/packages/safe-bash/dist/chunks/chunk-UO33SQJU.js.map +0 -7
- package/packages/safe-bash/dist/chunks/chunk-VY5N6O6I.js.map +0 -7
- /package/packages/safe-bash/dist/chunks/{chunk-WXUZXY35.js.map → chunk-FMTBJ7SG.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-EUNOVYVT.js.map → chunk-OECKXHVJ.js.map} +0 -0
- /package/packages/safe-bash/dist/chunks/{chunk-PPFWG34Y.js.map → chunk-XBLVOMEJ.js.map} +0 -0
|
@@ -1,322 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
delay,
|
|
3
|
-
withSignal
|
|
4
|
-
} from "./chunk-EUTSYRNM.js";
|
|
5
|
-
import {
|
|
6
|
-
collectBytes,
|
|
7
|
-
readBytes
|
|
8
|
-
} from "./chunk-FDGESHPB.js";
|
|
9
|
-
import {
|
|
10
|
-
init_platform
|
|
11
|
-
} from "./chunk-2KL6W6NB.js";
|
|
12
|
-
|
|
13
|
-
// packages/safe-bash/src/commands/llm/providers/index.ts
|
|
14
|
-
init_platform();
|
|
15
|
-
|
|
16
|
-
// packages/safe-bash/src/commands/llm/providers/openai.ts
|
|
17
|
-
init_platform();
|
|
18
|
-
|
|
19
|
-
// packages/safe-bash/src/commands/llm/providers/shared.ts
|
|
20
|
-
init_platform();
|
|
21
|
-
function providerLimits(input = {}) {
|
|
22
|
-
const limits = { maxRequestBytes: 64 * 1024 * 1024, maxResponseBytes: 64 * 1024 * 1024, maxEventBytes: 1024 * 1024, maxPolls: 120, pollIntervalMs: 1e3, ...input };
|
|
23
|
-
for (const [name, value] of Object.entries(limits)) {
|
|
24
|
-
if (!Number.isSafeInteger(value) || value < (name === "maxPolls" || name === "pollIntervalMs" ? 0 : 1)) throw new RangeError(`Invalid provider limit: ${name}`);
|
|
25
|
-
}
|
|
26
|
-
return Object.freeze(limits);
|
|
27
|
-
}
|
|
28
|
-
function baseUrl(value) {
|
|
29
|
-
const url = new URL(value);
|
|
30
|
-
if (!["https:", "http:"].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new TypeError("Invalid provider baseUrl");
|
|
31
|
-
return url.href.endsWith("/") ? url.href.slice(0, -1) : url.href;
|
|
32
|
-
}
|
|
33
|
-
function credential(value) {
|
|
34
|
-
if (typeof value !== "string" || value.length === 0 || [...value].some((char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127)) throw new TypeError("Invalid provider apiKey");
|
|
35
|
-
return value;
|
|
36
|
-
}
|
|
37
|
-
function fields(options, numbers, booleans) {
|
|
38
|
-
const result = /* @__PURE__ */ Object.create(null);
|
|
39
|
-
for (const [key, value] of Object.entries(options)) {
|
|
40
|
-
if (numbers.includes(key)) {
|
|
41
|
-
let numeric;
|
|
42
|
-
try {
|
|
43
|
-
numeric = JSON.parse(value);
|
|
44
|
-
} catch {
|
|
45
|
-
throw new TypeError(`Invalid numeric option: ${key}`);
|
|
46
|
-
}
|
|
47
|
-
if (typeof numeric !== "number" || !Number.isFinite(numeric)) throw new TypeError(`Invalid numeric option: ${key}`);
|
|
48
|
-
result[key] = numeric;
|
|
49
|
-
} else if (booleans.includes(key)) {
|
|
50
|
-
if (value !== "true" && value !== "false") throw new TypeError(`Invalid boolean option: ${key}`);
|
|
51
|
-
result[key] = value === "true";
|
|
52
|
-
} else result[key] = value;
|
|
53
|
-
}
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
function jsonBody(value, limit) {
|
|
57
|
-
const text = JSON.stringify(value);
|
|
58
|
-
if (text.length > limit) throw new RangeError("Provider request byte limit exceeded");
|
|
59
|
-
const bytes = new TextEncoder().encode(text);
|
|
60
|
-
if (bytes.length > limit) throw new RangeError("Provider request byte limit exceeded");
|
|
61
|
-
return { body: (async function* () {
|
|
62
|
-
yield bytes;
|
|
63
|
-
})(), contentType: "application/json" };
|
|
64
|
-
}
|
|
65
|
-
function toBase64(bytes, limit) {
|
|
66
|
-
if (Math.ceil(bytes.length / 3) * 4 > limit) throw new RangeError("Provider request byte limit exceeded");
|
|
67
|
-
let text = "";
|
|
68
|
-
for (let index = 0; index < bytes.length; index += 8192) text += String.fromCharCode(...bytes.subarray(index, index + 8192));
|
|
69
|
-
return btoa(text);
|
|
70
|
-
}
|
|
71
|
-
function fromBase64(value, limit) {
|
|
72
|
-
if (typeof value !== "string" || value.length % 4 !== 0 || value.length > Math.ceil(limit / 3) * 4) throw new TypeError("Invalid bounded image base64 response");
|
|
73
|
-
const text = atob(value);
|
|
74
|
-
if (btoa(text) !== value || text.length > limit) throw new TypeError("Invalid bounded image base64 response");
|
|
75
|
-
return Uint8Array.from(text, (char) => char.charCodeAt(0));
|
|
76
|
-
}
|
|
77
|
-
function multipart(options, files, limit) {
|
|
78
|
-
const encoder = new TextEncoder();
|
|
79
|
-
const parts = [];
|
|
80
|
-
const entries = Object.entries(options).map(([name, value]) => {
|
|
81
|
-
if (![...name].every((char) => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-".includes(char))) throw new TypeError("Invalid multipart option name");
|
|
82
|
-
return [name, String(value)];
|
|
83
|
-
});
|
|
84
|
-
let size = files.reduce((sum, file) => sum + file.bytes.length, 0);
|
|
85
|
-
for (const [, value] of entries) {
|
|
86
|
-
if (value.length > limit) throw new RangeError("Provider request byte limit exceeded");
|
|
87
|
-
size += encoder.encode(value).length;
|
|
88
|
-
}
|
|
89
|
-
if (size > limit) throw new RangeError("Provider request byte limit exceeded");
|
|
90
|
-
let boundary = "safe-bash-llm-boundary";
|
|
91
|
-
const contains = (bytes, needle) => {
|
|
92
|
-
outer: for (let start = 0; start <= bytes.length - needle.length; start++) {
|
|
93
|
-
for (let index = 0; index < needle.length; index++) if (bytes[start + index] !== needle[index]) continue outer;
|
|
94
|
-
return true;
|
|
95
|
-
}
|
|
96
|
-
return false;
|
|
97
|
-
};
|
|
98
|
-
let attempts = 0;
|
|
99
|
-
while (entries.some(([, value]) => value.includes(boundary)) || files.some((file) => contains(file.bytes, encoder.encode(boundary)))) {
|
|
100
|
-
if (attempts++ === 32) throw new RangeError("Provider multipart boundary collision limit exceeded");
|
|
101
|
-
boundary += "x";
|
|
102
|
-
}
|
|
103
|
-
for (const [name, value] of entries) parts.push(encoder.encode(`--${boundary}\r
|
|
104
|
-
Content-Disposition: form-data; name="${name}"\r
|
|
105
|
-
\r
|
|
106
|
-
${value}\r
|
|
107
|
-
`));
|
|
108
|
-
for (const [index, file] of files.entries()) {
|
|
109
|
-
if ([...file.mimeType].some((char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) > 126)) throw new TypeError("Invalid attachment MIME type");
|
|
110
|
-
parts.push(encoder.encode(`--${boundary}\r
|
|
111
|
-
Content-Disposition: form-data; name="${file.field}"; filename="attachment-${index}"\r
|
|
112
|
-
Content-Type: ${file.mimeType}\r
|
|
113
|
-
\r
|
|
114
|
-
`), file.bytes, encoder.encode("\r\n"));
|
|
115
|
-
}
|
|
116
|
-
parts.push(encoder.encode(`--${boundary}--\r
|
|
117
|
-
`));
|
|
118
|
-
if (parts.reduce((sum, part) => sum + part.length, 0) > limit) throw new RangeError("Provider request byte limit exceeded");
|
|
119
|
-
return { body: (async function* () {
|
|
120
|
-
yield* parts;
|
|
121
|
-
})(), contentType: `multipart/form-data; boundary=${boundary}` };
|
|
122
|
-
}
|
|
123
|
-
async function* responseBytes(transport, url, headers, signal, limit, payload) {
|
|
124
|
-
signal.throwIfAborted();
|
|
125
|
-
let response;
|
|
126
|
-
let abandoned = false;
|
|
127
|
-
let disposal;
|
|
128
|
-
const dispose = () => {
|
|
129
|
-
disposal ??= Promise.resolve().then(() => response.dispose());
|
|
130
|
-
void disposal.catch(() => {
|
|
131
|
-
});
|
|
132
|
-
return disposal;
|
|
133
|
-
};
|
|
134
|
-
const acquiring = Promise.resolve().then(() => {
|
|
135
|
-
signal.throwIfAborted();
|
|
136
|
-
return transport({ url, method: payload ? "POST" : "GET", headers: payload ? [...headers, ["Content-Type", payload.contentType]] : headers, signal, ...payload ? { body: payload.body } : {} });
|
|
137
|
-
}).then((value) => {
|
|
138
|
-
response = value;
|
|
139
|
-
if (abandoned) {
|
|
140
|
-
void dispose();
|
|
141
|
-
throw signal.reason;
|
|
142
|
-
}
|
|
143
|
-
return value;
|
|
144
|
-
});
|
|
145
|
-
try {
|
|
146
|
-
response = await withSignal(() => acquiring, signal);
|
|
147
|
-
if (response.status < 200 || response.status >= 300) throw new Error(`Provider HTTP ${response.status}`);
|
|
148
|
-
let size = 0;
|
|
149
|
-
for await (const chunk of readBytes(response.body, signal)) {
|
|
150
|
-
size += chunk.length;
|
|
151
|
-
if (size > limit) throw new RangeError("Provider response byte limit exceeded");
|
|
152
|
-
yield chunk;
|
|
153
|
-
}
|
|
154
|
-
} finally {
|
|
155
|
-
abandoned = true;
|
|
156
|
-
if (response) {
|
|
157
|
-
const disposing = dispose();
|
|
158
|
-
if (!signal.aborted) await withSignal(() => disposing, signal);
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
async function responseJson(source, limit, signal) {
|
|
163
|
-
const bytes = await collectBytes(source, { maxBytes: limit, signal });
|
|
164
|
-
const value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
165
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) throw new TypeError("Invalid provider JSON response");
|
|
166
|
-
return value;
|
|
167
|
-
}
|
|
168
|
-
async function* chatEvents(source, limit, signal) {
|
|
169
|
-
const decoder = new TextDecoder("utf-8", { fatal: true });
|
|
170
|
-
let line = "", data = [], size = 0, afterCR = false, done = false;
|
|
171
|
-
const processLine = () => {
|
|
172
|
-
const value = line;
|
|
173
|
-
line = "";
|
|
174
|
-
if (value === "") {
|
|
175
|
-
const event = data.join("\n");
|
|
176
|
-
data = [];
|
|
177
|
-
size = 0;
|
|
178
|
-
if (!event) return;
|
|
179
|
-
if (event === "[DONE]") {
|
|
180
|
-
done = true;
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
const parsed = JSON.parse(event);
|
|
184
|
-
if (parsed.error) throw new Error("Provider chat error");
|
|
185
|
-
if (!Array.isArray(parsed.choices)) throw new TypeError("Invalid chat event");
|
|
186
|
-
const content = parsed.choices[0]?.delta?.content;
|
|
187
|
-
if (content !== void 0 && content !== null && typeof content !== "string") throw new TypeError("Invalid chat content");
|
|
188
|
-
return typeof content === "string" ? content : void 0;
|
|
189
|
-
}
|
|
190
|
-
if (value.startsWith("data:")) data.push(value.slice(value[5] === " " ? 6 : 5));
|
|
191
|
-
};
|
|
192
|
-
for await (const chunk of readBytes(source, signal)) {
|
|
193
|
-
const text = decoder.decode(chunk, { stream: true });
|
|
194
|
-
for (const char of text) {
|
|
195
|
-
if (afterCR && char === "\n") {
|
|
196
|
-
afterCR = false;
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
afterCR = char === "\r";
|
|
200
|
-
const codePoint = char.codePointAt(0);
|
|
201
|
-
size += codePoint < 128 ? 1 : codePoint < 2048 ? 2 : codePoint < 65536 ? 3 : 4;
|
|
202
|
-
if (size > limit) throw new RangeError("Provider SSE event byte limit exceeded");
|
|
203
|
-
if (char === "\r" || char === "\n") {
|
|
204
|
-
const output = processLine();
|
|
205
|
-
if (output !== void 0) yield output;
|
|
206
|
-
if (done) return;
|
|
207
|
-
} else line += char;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
decoder.decode();
|
|
211
|
-
throw new Error("Truncated provider chat stream");
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// packages/safe-bash/src/commands/llm/providers/openai.ts
|
|
215
|
-
function createOpenAiProvider(options) {
|
|
216
|
-
const origin = baseUrl(options.baseUrl ?? "https://api.openai.com/v1");
|
|
217
|
-
const headers = [["Authorization", `Bearer ${credential(options.apiKey)}`]];
|
|
218
|
-
const transport = options.transport;
|
|
219
|
-
const limits = providerLimits(options.limits);
|
|
220
|
-
const models = options.models.map((model) => Object.freeze({ ...model, ...model.aliases ? { aliases: Object.freeze([...model.aliases]) } : {}, ...model.attachmentTypes ? { attachmentTypes: Object.freeze([...model.attachmentTypes]) } : {} }));
|
|
221
|
-
if (typeof transport !== "function") throw new TypeError("Provider transport is required");
|
|
222
|
-
for (const model of models) {
|
|
223
|
-
if (!["chat", "images", "videos"].includes(model.endpoint)) throw new TypeError("Invalid OpenAI endpoint");
|
|
224
|
-
if (model.endpoint === "images" && !["image/png", "image/jpeg", "image/webp"].includes(model.outputType ?? "")) throw new TypeError("Image models require outputType image/png, image/jpeg or image/webp");
|
|
225
|
-
if (model.endpoint === "videos" && model.outputType !== "video/mp4") throw new TypeError("Video models require outputType video/mp4");
|
|
226
|
-
if (model.endpoint === "chat" && model.outputType !== void 0 && !model.outputType.startsWith("text/")) throw new TypeError("Chat models require a text outputType");
|
|
227
|
-
}
|
|
228
|
-
return {
|
|
229
|
-
name: "openai",
|
|
230
|
-
models: Object.freeze(models),
|
|
231
|
-
async *complete(request) {
|
|
232
|
-
request.signal.throwIfAborted();
|
|
233
|
-
const model = models.find((candidate) => candidate.id === request.model);
|
|
234
|
-
if (!model) throw new Error(`Unknown model: ${request.model}`);
|
|
235
|
-
if (request.attachments.some((attachment) => !attachment.mimeType.startsWith("image/"))) throw new TypeError("OpenAI reference endpoints accept only image attachments");
|
|
236
|
-
if (request.attachments.reduce((size, file) => size + file.bytes.length, 0) > limits.maxRequestBytes) throw new RangeError("Provider request byte limit exceeded");
|
|
237
|
-
const send = (path2, payload2) => responseBytes(transport, `${origin}${path2}`, headers, request.signal, limits.maxResponseBytes, payload2);
|
|
238
|
-
if (model.endpoint === "chat") {
|
|
239
|
-
const content = request.attachments.length ? [{ type: "text", text: request.prompt }, ...request.attachments.map((attachment) => ({ type: "image_url", image_url: { url: `data:${attachment.mimeType};base64,${toBase64(attachment.bytes, limits.maxRequestBytes)}` } }))] : request.prompt;
|
|
240
|
-
const messages = [...request.system === void 0 ? [] : [{ role: "system", content: request.system }], { role: "user", content }];
|
|
241
|
-
const body = jsonBody({ ...fields(request.options, ["temperature", "top_p", "max_tokens", "max_completion_tokens", "frequency_penalty", "presence_penalty", "seed", "n", "top_logprobs"], ["store", "parallel_tool_calls", "logprobs"]), model: model.id, messages, stream: true }, limits.maxRequestBytes);
|
|
242
|
-
yield* chatEvents(send("/chat/completions", body), limits.maxEventBytes, request.signal);
|
|
243
|
-
return;
|
|
244
|
-
}
|
|
245
|
-
if (request.system !== void 0) throw new TypeError("System prompts are supported only by chat models");
|
|
246
|
-
if (model.endpoint === "images") {
|
|
247
|
-
const outputFormat = model.outputType === "image/jpeg" ? "jpeg" : model.outputType === "image/webp" ? "webp" : "png";
|
|
248
|
-
if (request.options.output_format !== void 0 && request.options.output_format !== outputFormat) throw new TypeError("output_format conflicts with model outputType");
|
|
249
|
-
const values = { ...fields(request.options, ["n", "output_compression", "partial_images"], ["stream"]), output_format: outputFormat, model: model.id, prompt: request.prompt };
|
|
250
|
-
if (values.stream === true) throw new TypeError("Image event streaming is not supported by this reference provider");
|
|
251
|
-
const payload2 = request.attachments.length ? multipart(values, request.attachments.map((file) => ({ ...file, field: "image[]" })), limits.maxRequestBytes) : jsonBody(values, limits.maxRequestBytes);
|
|
252
|
-
const result = await responseJson(send(request.attachments.length ? "/images/edits" : "/images/generations", payload2), limits.maxResponseBytes, request.signal);
|
|
253
|
-
if (!Array.isArray(result.data) || result.data.length !== 1) throw new TypeError("Expected one generated image");
|
|
254
|
-
yield fromBase64(result.data[0]?.b64_json, limits.maxResponseBytes);
|
|
255
|
-
return;
|
|
256
|
-
}
|
|
257
|
-
if (request.attachments.length > 1) throw new TypeError("Videos accept one input_reference attachment");
|
|
258
|
-
const payload = multipart({ ...request.options, model: model.id, prompt: request.prompt }, request.attachments.map((file) => ({ ...file, field: "input_reference" })), limits.maxRequestBytes);
|
|
259
|
-
let job = await responseJson(send("/videos", payload), limits.maxResponseBytes, request.signal);
|
|
260
|
-
if (typeof job.id !== "string" || !job.id) throw new TypeError("Invalid video job id");
|
|
261
|
-
const path = `/videos/${encodeURIComponent(job.id)}`;
|
|
262
|
-
let polls = 0;
|
|
263
|
-
while (job.status !== "completed") {
|
|
264
|
-
if (job.status === "failed") throw new Error("Provider video generation failed");
|
|
265
|
-
if (job.status !== "queued" && job.status !== "in_progress") throw new TypeError("Invalid video job status");
|
|
266
|
-
if (polls++ >= limits.maxPolls) throw new RangeError("Provider video polling limit exceeded");
|
|
267
|
-
await delay(limits.pollIntervalMs, request.signal);
|
|
268
|
-
job = await responseJson(send(path), limits.maxResponseBytes, request.signal);
|
|
269
|
-
}
|
|
270
|
-
yield* send(`${path}/content`);
|
|
271
|
-
}
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// packages/safe-bash/src/commands/llm/providers/elevenlabs.ts
|
|
276
|
-
init_platform();
|
|
277
|
-
var audioFormats = { "audio/mpeg": "mp3_44100_128", "audio/wav": "wav_44100", "audio/pcm": "pcm_44100", "audio/ogg": "opus_48000_128", "audio/basic": "ulaw_8000" };
|
|
278
|
-
function createElevenLabsProvider(options) {
|
|
279
|
-
const origin = baseUrl(options.baseUrl ?? "https://api.elevenlabs.io");
|
|
280
|
-
const headers = [["xi-api-key", credential(options.apiKey)]];
|
|
281
|
-
const transport = options.transport;
|
|
282
|
-
const limits = providerLimits(options.limits);
|
|
283
|
-
const models = options.models.map((model) => Object.freeze({ ...model, ...model.aliases ? { aliases: Object.freeze([...model.aliases]) } : {}, ...model.attachmentTypes ? { attachmentTypes: Object.freeze([...model.attachmentTypes]) } : {} }));
|
|
284
|
-
if (typeof transport !== "function") throw new TypeError("Provider transport is required");
|
|
285
|
-
for (const model of models) {
|
|
286
|
-
if (!["tts", "music"].includes(model.endpoint)) throw new TypeError("Invalid ElevenLabs endpoint");
|
|
287
|
-
if (!Object.hasOwn(audioFormats, model.outputType ?? "") || model.endpoint === "music" && model.outputType === "audio/wav") throw new TypeError("Unsupported ElevenLabs model outputType");
|
|
288
|
-
}
|
|
289
|
-
return {
|
|
290
|
-
name: "elevenlabs",
|
|
291
|
-
models: Object.freeze(models),
|
|
292
|
-
async *complete(request) {
|
|
293
|
-
request.signal.throwIfAborted();
|
|
294
|
-
const model = models.find((candidate) => candidate.id === request.model);
|
|
295
|
-
if (!model) throw new Error(`Unknown model: ${request.model}`);
|
|
296
|
-
if (request.attachments.length) throw new TypeError("ElevenLabs reference endpoints do not accept attachments");
|
|
297
|
-
if (request.system !== void 0) throw new TypeError("ElevenLabs reference endpoints do not accept system prompts");
|
|
298
|
-
const format = audioFormats[model.outputType];
|
|
299
|
-
const { output_format: requestedFormat, ...requestOptions } = request.options;
|
|
300
|
-
if (requestedFormat !== void 0 && requestedFormat !== format) throw new TypeError("output_format conflicts with model outputType");
|
|
301
|
-
let path, body;
|
|
302
|
-
if (model.endpoint === "tts") {
|
|
303
|
-
const { voice_id: selectedVoice, ...settings } = requestOptions;
|
|
304
|
-
const voice = selectedVoice ?? model.defaultVoiceId;
|
|
305
|
-
if (!voice) throw new TypeError("ElevenLabs TTS requires voice_id or defaultVoiceId");
|
|
306
|
-
path = `/v1/text-to-speech/${encodeURIComponent(voice)}`;
|
|
307
|
-
body = { text: request.prompt, model_id: model.id, voice_settings: fields(settings, ["stability", "similarity_boost", "style", "speed"], ["use_speaker_boost"]) };
|
|
308
|
-
} else {
|
|
309
|
-
path = "/v1/music";
|
|
310
|
-
body = { ...fields(requestOptions, ["music_length_ms", "seed"], ["force_instrumental", "respect_sections_durations"]), prompt: request.prompt, model_id: model.id };
|
|
311
|
-
if (body.music_length_ms !== void 0 && !Number.isInteger(body.music_length_ms)) throw new TypeError("Invalid music_length_ms: expected integer");
|
|
312
|
-
}
|
|
313
|
-
yield* responseBytes(transport, `${origin}${path}?output_format=${format}`, headers, request.signal, limits.maxResponseBytes, jsonBody(body, limits.maxRequestBytes));
|
|
314
|
-
}
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
export {
|
|
319
|
-
createOpenAiProvider,
|
|
320
|
-
createElevenLabsProvider
|
|
321
|
-
};
|
|
322
|
-
//# sourceMappingURL=chunk-BZUQJTOZ.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/commands/llm/providers/index.ts", "../../src/commands/llm/providers/openai.ts", "../../src/commands/llm/providers/shared.ts", "../../src/commands/llm/providers/elevenlabs.ts"],
|
|
4
|
-
"sourcesContent": ["export { createOpenAiProvider, type OpenAiProviderOptions, type OpenAiModel } from \"./openai.js\";\nexport { createElevenLabsProvider, type ElevenLabsProviderOptions, type ElevenLabsModel } from \"./elevenlabs.js\";\nexport type { LlmProviderLimits } from \"./shared.js\";\n", "import type { LlmModel, LlmProvider, LlmRequest } from \"../types.js\";\nimport type { HttpTransport } from \"../../network/types.js\";\nimport { delay } from \"../../network/shared.js\";\nimport { baseUrl, credential, providerLimits, fields, jsonBody, multipart, toBase64, fromBase64, responseBytes, responseJson, chatEvents, type LlmProviderLimits } from \"./shared.js\";\n\nexport interface OpenAiModel extends LlmModel {\n readonly endpoint: \"chat\" | \"images\" | \"videos\";\n}\n\nexport interface OpenAiProviderOptions {\n readonly transport: HttpTransport;\n readonly apiKey: string;\n readonly baseUrl?: string;\n readonly models: readonly OpenAiModel[];\n readonly limits?: Partial<LlmProviderLimits>;\n}\n\nexport function createOpenAiProvider(options: OpenAiProviderOptions): LlmProvider {\n const origin = baseUrl(options.baseUrl ?? \"https://api.openai.com/v1\");\n const headers = [[\"Authorization\", `Bearer ${credential(options.apiKey)}`]] as const;\n const transport = options.transport;\n const limits = providerLimits(options.limits);\n const models = options.models.map(model => Object.freeze({ ...model, ...(model.aliases ? { aliases: Object.freeze([...model.aliases]) } : {}), ...(model.attachmentTypes ? { attachmentTypes: Object.freeze([...model.attachmentTypes]) } : {}) }));\n if (typeof transport !== \"function\") throw new TypeError(\"Provider transport is required\");\n for (const model of models) {\n if (![\"chat\", \"images\", \"videos\"].includes(model.endpoint)) throw new TypeError(\"Invalid OpenAI endpoint\");\n if (model.endpoint === \"images\" && ![\"image/png\", \"image/jpeg\", \"image/webp\"].includes(model.outputType ?? \"\")) throw new TypeError(\"Image models require outputType image/png, image/jpeg or image/webp\");\n if (model.endpoint === \"videos\" && model.outputType !== \"video/mp4\") throw new TypeError(\"Video models require outputType video/mp4\");\n if (model.endpoint === \"chat\" && model.outputType !== undefined && !model.outputType.startsWith(\"text/\")) throw new TypeError(\"Chat models require a text outputType\");\n }\n return {\n name: \"openai\", models: Object.freeze(models),\n async *complete(request: LlmRequest) {\n request.signal.throwIfAborted();\n const model = models.find(candidate => candidate.id === request.model);\n if (!model) throw new Error(`Unknown model: ${request.model}`);\n if (request.attachments.some(attachment => !attachment.mimeType.startsWith(\"image/\"))) throw new TypeError(\"OpenAI reference endpoints accept only image attachments\");\n if (request.attachments.reduce((size, file) => size + file.bytes.length, 0) > limits.maxRequestBytes) throw new RangeError(\"Provider request byte limit exceeded\");\n const send = (path: string, payload?: { body: import(\"../../../contracts/io.js\").ByteSource; contentType: string }) => responseBytes(transport, `${origin}${path}`, headers, request.signal, limits.maxResponseBytes, payload);\n if (model.endpoint === \"chat\") {\n const content = request.attachments.length ? [{ type: \"text\", text: request.prompt }, ...request.attachments.map(attachment => ({ type: \"image_url\", image_url: { url: `data:${attachment.mimeType};base64,${toBase64(attachment.bytes, limits.maxRequestBytes)}` } }))] : request.prompt;\n const messages = [...(request.system === undefined ? [] : [{ role: \"system\", content: request.system }]), { role: \"user\", content }];\n const body = jsonBody({ ...fields(request.options, [\"temperature\", \"top_p\", \"max_tokens\", \"max_completion_tokens\", \"frequency_penalty\", \"presence_penalty\", \"seed\", \"n\", \"top_logprobs\"], [\"store\", \"parallel_tool_calls\", \"logprobs\"]), model: model.id, messages, stream: true }, limits.maxRequestBytes);\n yield* chatEvents(send(\"/chat/completions\", body), limits.maxEventBytes, request.signal);\n return;\n }\n if (request.system !== undefined) throw new TypeError(\"System prompts are supported only by chat models\");\n if (model.endpoint === \"images\") {\n const outputFormat = model.outputType === \"image/jpeg\" ? \"jpeg\" : model.outputType === \"image/webp\" ? \"webp\" : \"png\";\n if (request.options.output_format !== undefined && request.options.output_format !== outputFormat) throw new TypeError(\"output_format conflicts with model outputType\");\n const values: Record<string, unknown> = { ...fields(request.options, [\"n\", \"output_compression\", \"partial_images\"], [\"stream\"]), output_format: outputFormat, model: model.id, prompt: request.prompt };\n if (values.stream === true) throw new TypeError(\"Image event streaming is not supported by this reference provider\");\n const payload = request.attachments.length ? multipart(values, request.attachments.map(file => ({ ...file, field: \"image[]\" })), limits.maxRequestBytes) : jsonBody(values, limits.maxRequestBytes);\n const result = await responseJson(send(request.attachments.length ? \"/images/edits\" : \"/images/generations\", payload), limits.maxResponseBytes, request.signal);\n if (!Array.isArray(result.data) || result.data.length !== 1) throw new TypeError(\"Expected one generated image\");\n yield fromBase64((result.data[0] as { b64_json?: unknown })?.b64_json, limits.maxResponseBytes);\n return;\n }\n if (request.attachments.length > 1) throw new TypeError(\"Videos accept one input_reference attachment\");\n const payload = multipart({ ...request.options, model: model.id, prompt: request.prompt }, request.attachments.map(file => ({ ...file, field: \"input_reference\" })), limits.maxRequestBytes);\n let job = await responseJson(send(\"/videos\", payload), limits.maxResponseBytes, request.signal);\n if (typeof job.id !== \"string\" || !job.id) throw new TypeError(\"Invalid video job id\");\n const path = `/videos/${encodeURIComponent(job.id)}`;\n let polls = 0;\n while (job.status !== \"completed\") {\n if (job.status === \"failed\") throw new Error(\"Provider video generation failed\");\n if (job.status !== \"queued\" && job.status !== \"in_progress\") throw new TypeError(\"Invalid video job status\");\n if (polls++ >= limits.maxPolls) throw new RangeError(\"Provider video polling limit exceeded\");\n await delay(limits.pollIntervalMs, request.signal);\n job = await responseJson(send(path), limits.maxResponseBytes, request.signal);\n }\n yield* send(`${path}/content`);\n },\n };\n}\n", "import { collectBytes, readBytes, type ByteSource } from \"../../../contracts/io.js\";\nimport type { HttpHeaders, HttpResponse, HttpTransport } from \"../../network/types.js\";\nimport { withSignal } from \"../../network/shared.js\";\n\nexport interface LlmProviderLimits {\n readonly maxRequestBytes: number;\n readonly maxResponseBytes: number;\n readonly maxEventBytes: number;\n readonly maxPolls: number;\n readonly pollIntervalMs: number;\n}\n\nexport function providerLimits(input: Partial<LlmProviderLimits> = {}): LlmProviderLimits {\n const limits = { maxRequestBytes: 64 * 1024 * 1024, maxResponseBytes: 64 * 1024 * 1024, maxEventBytes: 1024 * 1024, maxPolls: 120, pollIntervalMs: 1000, ...input };\n for (const [name, value] of Object.entries(limits)) {\n if (!Number.isSafeInteger(value) || value < (name === \"maxPolls\" || name === \"pollIntervalMs\" ? 0 : 1)) throw new RangeError(`Invalid provider limit: ${name}`);\n }\n return Object.freeze(limits);\n}\n\nexport function baseUrl(value: string): string {\n const url = new URL(value);\n if (![\"https:\", \"http:\"].includes(url.protocol) || url.username || url.password || url.search || url.hash) throw new TypeError(\"Invalid provider baseUrl\");\n return url.href.endsWith(\"/\") ? url.href.slice(0, -1) : url.href;\n}\n\nexport function credential(value: string): string {\n if (typeof value !== \"string\" || value.length === 0 || [...value].some(char => char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127)) throw new TypeError(\"Invalid provider apiKey\");\n return value;\n}\n\nexport function fields(options: Readonly<Record<string, string>>, numbers: readonly string[], booleans: readonly string[]): Record<string, unknown> {\n const result: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n for (const [key, value] of Object.entries(options)) {\n if (numbers.includes(key)) {\n let numeric: unknown;\n try { numeric = JSON.parse(value); } catch { throw new TypeError(`Invalid numeric option: ${key}`); }\n if (typeof numeric !== \"number\" || !Number.isFinite(numeric)) throw new TypeError(`Invalid numeric option: ${key}`);\n result[key] = numeric;\n } else if (booleans.includes(key)) {\n if (value !== \"true\" && value !== \"false\") throw new TypeError(`Invalid boolean option: ${key}`);\n result[key] = value === \"true\";\n } else result[key] = value;\n }\n return result;\n}\n\nexport function jsonBody(value: unknown, limit: number): { body: ByteSource; contentType: string } {\n const text = JSON.stringify(value);\n if (text.length > limit) throw new RangeError(\"Provider request byte limit exceeded\");\n const bytes = new TextEncoder().encode(text);\n if (bytes.length > limit) throw new RangeError(\"Provider request byte limit exceeded\");\n return { body: (async function* () { yield bytes; })(), contentType: \"application/json\" };\n}\n\nexport function toBase64(bytes: Uint8Array, limit: number): string {\n if (Math.ceil(bytes.length / 3) * 4 > limit) throw new RangeError(\"Provider request byte limit exceeded\");\n let text = \"\";\n for (let index = 0; index < bytes.length; index += 8192) text += String.fromCharCode(...bytes.subarray(index, index + 8192));\n return btoa(text);\n}\n\nexport function fromBase64(value: unknown, limit: number): Uint8Array {\n if (typeof value !== \"string\" || value.length % 4 !== 0 || value.length > Math.ceil(limit / 3) * 4) throw new TypeError(\"Invalid bounded image base64 response\");\n const text = atob(value);\n if (btoa(text) !== value || text.length > limit) throw new TypeError(\"Invalid bounded image base64 response\");\n return Uint8Array.from(text, char => char.charCodeAt(0));\n}\n\nexport function multipart(options: Record<string, unknown>, files: readonly { field: string; mimeType: string; bytes: Uint8Array }[], limit: number): { body: ByteSource; contentType: string } {\n const encoder = new TextEncoder();\n const parts: Uint8Array[] = [];\n const entries = Object.entries(options).map(([name, value]) => {\n if (![...name].every(char => \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-\".includes(char))) throw new TypeError(\"Invalid multipart option name\");\n return [name, String(value)] as const;\n });\n let size = files.reduce((sum, file) => sum + file.bytes.length, 0);\n for (const [, value] of entries) {\n if (value.length > limit) throw new RangeError(\"Provider request byte limit exceeded\");\n size += encoder.encode(value).length;\n }\n if (size > limit) throw new RangeError(\"Provider request byte limit exceeded\");\n let boundary = \"safe-bash-llm-boundary\";\n const contains = (bytes: Uint8Array, needle: Uint8Array): boolean => {\n outer: for (let start = 0; start <= bytes.length - needle.length; start++) {\n for (let index = 0; index < needle.length; index++) if (bytes[start + index] !== needle[index]) continue outer;\n return true;\n }\n return false;\n };\n let attempts = 0;\n while (entries.some(([, value]) => value.includes(boundary)) || files.some(file => contains(file.bytes, encoder.encode(boundary)))) {\n if (attempts++ === 32) throw new RangeError(\"Provider multipart boundary collision limit exceeded\");\n boundary += \"x\";\n }\n for (const [name, value] of entries) parts.push(encoder.encode(`--${boundary}\\r\\nContent-Disposition: form-data; name=\"${name}\"\\r\\n\\r\\n${value}\\r\\n`));\n for (const [index, file] of files.entries()) {\n if ([...file.mimeType].some(char => char.charCodeAt(0) < 32 || char.charCodeAt(0) > 126)) throw new TypeError(\"Invalid attachment MIME type\");\n parts.push(encoder.encode(`--${boundary}\\r\\nContent-Disposition: form-data; name=\"${file.field}\"; filename=\"attachment-${index}\"\\r\\nContent-Type: ${file.mimeType}\\r\\n\\r\\n`), file.bytes, encoder.encode(\"\\r\\n\"));\n }\n parts.push(encoder.encode(`--${boundary}--\\r\\n`));\n if (parts.reduce((sum, part) => sum + part.length, 0) > limit) throw new RangeError(\"Provider request byte limit exceeded\");\n return { body: (async function* () { yield* parts; })(), contentType: `multipart/form-data; boundary=${boundary}` };\n}\n\nexport async function* responseBytes(transport: HttpTransport, url: string, headers: HttpHeaders, signal: AbortSignal, limit: number, payload?: { body: ByteSource; contentType: string }): AsyncGenerator<Uint8Array> {\n signal.throwIfAborted();\n let response: HttpResponse | undefined;\n let abandoned = false;\n let disposal: Promise<void> | undefined;\n const dispose = (): Promise<void> => {\n disposal ??= Promise.resolve().then(() => response!.dispose());\n void disposal.catch(() => {});\n return disposal;\n };\n const acquiring = Promise.resolve().then(() => {\n signal.throwIfAborted();\n return transport({ url, method: payload ? \"POST\" : \"GET\", headers: payload ? [...headers, [\"Content-Type\", payload.contentType]] : headers, signal, ...(payload ? { body: payload.body } : {}) });\n }).then(value => {\n response = value;\n if (abandoned) { void dispose(); throw signal.reason; }\n return value;\n });\n try {\n response = await withSignal(() => acquiring, signal);\n if (response.status < 200 || response.status >= 300) throw new Error(`Provider HTTP ${response.status}`);\n let size = 0;\n for await (const chunk of readBytes(response.body, signal)) {\n size += chunk.length;\n if (size > limit) throw new RangeError(\"Provider response byte limit exceeded\");\n yield chunk;\n }\n } finally {\n abandoned = true;\n if (response) {\n const disposing = dispose();\n if (!signal.aborted) await withSignal(() => disposing, signal);\n }\n }\n}\n\nexport async function responseJson(source: ByteSource, limit: number, signal: AbortSignal): Promise<Record<string, unknown>> {\n const bytes = await collectBytes(source, { maxBytes: limit, signal });\n const value: unknown = JSON.parse(new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes));\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new TypeError(\"Invalid provider JSON response\");\n return value as Record<string, unknown>;\n}\n\nexport async function* chatEvents(source: ByteSource, limit: number, signal: AbortSignal): AsyncGenerator<string> {\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n let line = \"\", data: string[] = [], size = 0, afterCR = false, done = false;\n const processLine = (): string | undefined => {\n const value = line; line = \"\";\n if (value === \"\") {\n const event = data.join(\"\\n\"); data = []; size = 0;\n if (!event) return;\n if (event === \"[DONE]\") { done = true; return; }\n const parsed = JSON.parse(event) as { error?: unknown; choices?: { delta?: { content?: unknown } }[] };\n if (parsed.error) throw new Error(\"Provider chat error\");\n if (!Array.isArray(parsed.choices)) throw new TypeError(\"Invalid chat event\");\n const content = parsed.choices[0]?.delta?.content;\n if (content !== undefined && content !== null && typeof content !== \"string\") throw new TypeError(\"Invalid chat content\");\n return typeof content === \"string\" ? content : undefined;\n }\n if (value.startsWith(\"data:\")) data.push(value.slice(value[5] === \" \" ? 6 : 5));\n };\n for await (const chunk of readBytes(source, signal)) {\n const text = decoder.decode(chunk, { stream: true });\n for (const char of text) {\n if (afterCR && char === \"\\n\") { afterCR = false; continue; }\n afterCR = char === \"\\r\";\n const codePoint = char.codePointAt(0)!;\n size += codePoint < 0x80 ? 1 : codePoint < 0x800 ? 2 : codePoint < 0x10000 ? 3 : 4;\n if (size > limit) throw new RangeError(\"Provider SSE event byte limit exceeded\");\n if (char === \"\\r\" || char === \"\\n\") {\n const output = processLine();\n if (output !== undefined) yield output;\n if (done) return;\n } else line += char;\n }\n }\n decoder.decode();\n throw new Error(\"Truncated provider chat stream\");\n}\n", "import type { LlmModel, LlmProvider, LlmRequest } from \"../types.js\";\nimport type { HttpTransport } from \"../../network/types.js\";\nimport { baseUrl, credential, providerLimits, fields, jsonBody, responseBytes, type LlmProviderLimits } from \"./shared.js\";\n\nconst audioFormats: Readonly<Record<string, string>> = { \"audio/mpeg\": \"mp3_44100_128\", \"audio/wav\": \"wav_44100\", \"audio/pcm\": \"pcm_44100\", \"audio/ogg\": \"opus_48000_128\", \"audio/basic\": \"ulaw_8000\" };\n\nexport interface ElevenLabsModel extends LlmModel {\n readonly endpoint: \"tts\" | \"music\";\n readonly defaultVoiceId?: string;\n}\n\nexport interface ElevenLabsProviderOptions {\n readonly transport: HttpTransport;\n readonly apiKey: string;\n readonly baseUrl?: string;\n readonly models: readonly ElevenLabsModel[];\n readonly limits?: Partial<LlmProviderLimits>;\n}\n\nexport function createElevenLabsProvider(options: ElevenLabsProviderOptions): LlmProvider {\n const origin = baseUrl(options.baseUrl ?? \"https://api.elevenlabs.io\");\n const headers = [[\"xi-api-key\", credential(options.apiKey)]] as const;\n const transport = options.transport;\n const limits = providerLimits(options.limits);\n const models = options.models.map(model => Object.freeze({ ...model, ...(model.aliases ? { aliases: Object.freeze([...model.aliases]) } : {}), ...(model.attachmentTypes ? { attachmentTypes: Object.freeze([...model.attachmentTypes]) } : {}) }));\n if (typeof transport !== \"function\") throw new TypeError(\"Provider transport is required\");\n for (const model of models) {\n if (![\"tts\", \"music\"].includes(model.endpoint)) throw new TypeError(\"Invalid ElevenLabs endpoint\");\n if (!Object.hasOwn(audioFormats, model.outputType ?? \"\") || (model.endpoint === \"music\" && model.outputType === \"audio/wav\")) throw new TypeError(\"Unsupported ElevenLabs model outputType\");\n }\n return {\n name: \"elevenlabs\", models: Object.freeze(models),\n async *complete(request: LlmRequest) {\n request.signal.throwIfAborted();\n const model = models.find(candidate => candidate.id === request.model);\n if (!model) throw new Error(`Unknown model: ${request.model}`);\n if (request.attachments.length) throw new TypeError(\"ElevenLabs reference endpoints do not accept attachments\");\n if (request.system !== undefined) throw new TypeError(\"ElevenLabs reference endpoints do not accept system prompts\");\n const format = audioFormats[model.outputType!]!;\n const { output_format: requestedFormat, ...requestOptions } = request.options;\n if (requestedFormat !== undefined && requestedFormat !== format) throw new TypeError(\"output_format conflicts with model outputType\");\n let path: string, body: Record<string, unknown>;\n if (model.endpoint === \"tts\") {\n const { voice_id: selectedVoice, ...settings } = requestOptions;\n const voice = selectedVoice ?? model.defaultVoiceId;\n if (!voice) throw new TypeError(\"ElevenLabs TTS requires voice_id or defaultVoiceId\");\n path = `/v1/text-to-speech/${encodeURIComponent(voice)}`;\n body = { text: request.prompt, model_id: model.id, voice_settings: fields(settings, [\"stability\", \"similarity_boost\", \"style\", \"speed\"], [\"use_speaker_boost\"]) };\n } else {\n path = \"/v1/music\";\n body = { ...fields(requestOptions, [\"music_length_ms\", \"seed\"], [\"force_instrumental\", \"respect_sections_durations\"]), prompt: request.prompt, model_id: model.id };\n if (body.music_length_ms !== undefined && !Number.isInteger(body.music_length_ms)) throw new TypeError(\"Invalid music_length_ms: expected integer\");\n }\n yield* responseBytes(transport, `${origin}${path}?output_format=${format}`, headers, request.signal, limits.maxResponseBytes, jsonBody(body, limits.maxRequestBytes));\n },\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["path", "payload"]
|
|
7
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
writeDiagnostic
|
|
3
|
-
} from "./chunk-KYU6MXVK.js";
|
|
4
|
-
import {
|
|
5
|
-
init_platform
|
|
6
|
-
} from "./chunk-2KL6W6NB.js";
|
|
7
|
-
|
|
8
|
-
// packages/safe-bash/src/commands/network/types.ts
|
|
9
|
-
init_platform();
|
|
10
|
-
var defaultNetworkLimits = Object.freeze({
|
|
11
|
-
maxUploadBytes: 64 * 1024 * 1024,
|
|
12
|
-
maxDownloadBytes: 64 * 1024 * 1024,
|
|
13
|
-
maxBufferBytes: 8 * 1024 * 1024,
|
|
14
|
-
maxHeaderBytes: 64 * 1024,
|
|
15
|
-
maxRedirects: 10,
|
|
16
|
-
maxRetries: 5,
|
|
17
|
-
maxUrls: 32,
|
|
18
|
-
maxTimeMs: 12e4,
|
|
19
|
-
maxTotalTimeMs: 12e4
|
|
20
|
-
});
|
|
21
|
-
var cloudflareWorkerNetworkLimits = Object.freeze({
|
|
22
|
-
maxUploadBytes: 4 * 1024 * 1024,
|
|
23
|
-
maxDownloadBytes: 4 * 1024 * 1024,
|
|
24
|
-
maxBufferBytes: 1024 * 1024,
|
|
25
|
-
maxHeaderBytes: 32 * 1024,
|
|
26
|
-
maxRedirects: 2,
|
|
27
|
-
maxRetries: 1,
|
|
28
|
-
maxUrls: 8,
|
|
29
|
-
maxTimeMs: 1e4,
|
|
30
|
-
maxTotalTimeMs: 1e4
|
|
31
|
-
});
|
|
32
|
-
var CurlError = class extends Error {
|
|
33
|
-
constructor(exitCode, message) {
|
|
34
|
-
super(message);
|
|
35
|
-
this.exitCode = exitCode;
|
|
36
|
-
this.name = "CurlError";
|
|
37
|
-
}
|
|
38
|
-
exitCode;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
// packages/safe-bash/src/commands/network/shared.ts
|
|
42
|
-
init_platform();
|
|
43
|
-
var encode = (text) => new TextEncoder().encode(text);
|
|
44
|
-
function limitsFor(overrides = {}) {
|
|
45
|
-
const result = { ...defaultNetworkLimits, ...overrides };
|
|
46
|
-
for (const [name, value] of Object.entries(result)) {
|
|
47
|
-
const minimum = name === "maxRedirects" || name === "maxRetries" ? 0 : 1;
|
|
48
|
-
if (!Number.isSafeInteger(value) || value < minimum || name === "maxTimeMs" && value > 2147483647) {
|
|
49
|
-
throw new RangeError(`Invalid network limit: ${name}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return Object.freeze(result);
|
|
53
|
-
}
|
|
54
|
-
async function withSignal(operation, signal) {
|
|
55
|
-
signal.throwIfAborted();
|
|
56
|
-
return new Promise((resolve, reject) => {
|
|
57
|
-
const onAbort = () => {
|
|
58
|
-
cleanup();
|
|
59
|
-
reject(signal.reason);
|
|
60
|
-
};
|
|
61
|
-
const cleanup = () => signal.removeEventListener("abort", onAbort);
|
|
62
|
-
signal.addEventListener("abort", onAbort, { once: true });
|
|
63
|
-
Promise.resolve().then(operation).then((value) => {
|
|
64
|
-
cleanup();
|
|
65
|
-
resolve(value);
|
|
66
|
-
}, (error) => {
|
|
67
|
-
cleanup();
|
|
68
|
-
reject(error);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
async function delay(milliseconds, signal) {
|
|
73
|
-
let timer;
|
|
74
|
-
try {
|
|
75
|
-
await withSignal(() => new Promise((resolve) => {
|
|
76
|
-
timer = setTimeout(resolve, milliseconds);
|
|
77
|
-
}), signal);
|
|
78
|
-
} finally {
|
|
79
|
-
clearTimeout(timer);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
function header(headers, name) {
|
|
83
|
-
return headers.find(([key]) => key.toLowerCase() === name.toLowerCase())?.[1];
|
|
84
|
-
}
|
|
85
|
-
function networkError(error) {
|
|
86
|
-
if (error instanceof CurlError) return error;
|
|
87
|
-
const code = error && typeof error === "object" && "code" in error ? String(error.code) : "";
|
|
88
|
-
if (["ENOTFOUND", "EAI_AGAIN"].includes(code)) return new CurlError(6, "Could not resolve host");
|
|
89
|
-
if (["ECONNREFUSED", "ENETUNREACH", "EHOSTUNREACH"].includes(code)) return new CurlError(7, "Failed to connect");
|
|
90
|
-
if (/CERT|SELF_SIGNED|UNABLE_TO_VERIFY/.test(code)) return new CurlError(60, "TLS certificate verification failed");
|
|
91
|
-
if (/TLS|SSL/.test(code)) return new CurlError(35, "TLS handshake failed");
|
|
92
|
-
return new CurlError(56, "Network transfer failed");
|
|
93
|
-
}
|
|
94
|
-
async function diagnostic(context, error) {
|
|
95
|
-
await writeDiagnostic(context.stderr, `${context.command}: (${error.exitCode}) ${error.message}
|
|
96
|
-
`, context.signal);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export {
|
|
100
|
-
defaultNetworkLimits,
|
|
101
|
-
cloudflareWorkerNetworkLimits,
|
|
102
|
-
CurlError,
|
|
103
|
-
encode,
|
|
104
|
-
limitsFor,
|
|
105
|
-
withSignal,
|
|
106
|
-
delay,
|
|
107
|
-
header,
|
|
108
|
-
networkError,
|
|
109
|
-
diagnostic
|
|
110
|
-
};
|
|
111
|
-
//# sourceMappingURL=chunk-EUTSYRNM.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/commands/network/types.ts", "../../src/commands/network/shared.ts"],
|
|
4
|
-
"sourcesContent": ["import type { ByteSource, InvocationCleanup } from \"../../contracts/index.js\";\n\nexport type HttpHeaders = readonly (readonly [string, string])[];\n\nexport interface HttpRequest {\n readonly url: string;\n readonly method: string;\n readonly headers: HttpHeaders;\n readonly body?: ByteSource;\n /** Consumer body intent, independent of method. Omitted means \"read\".\n * \"omit\" permits an empty body; \"omit-on-http-error\" permits it only for\n * status >= 400. Neither changes the HTTP request or response status/headers. */\n readonly responseBodyMode?: \"omit\" | \"omit-on-http-error\" | \"read\";\n readonly signal: AbortSignal;\n readonly registerCleanup?: (cleanup: InvocationCleanup) => void;\n readonly denyPrivateNetworks?: true;\n}\n\nexport interface HttpResponse {\n readonly status: number;\n readonly statusText: string;\n readonly headers: HttpHeaders;\n readonly httpVersion?: string;\n readonly body: ByteSource;\n dispose(): Promise<void>;\n}\n\nexport type HttpTransport = ((request: HttpRequest) => Promise<HttpResponse>) & {\n readonly supportsPrivateNetworkDeny?: true;\n};\n\nexport interface NetworkAuthorization {\n readonly url: string;\n readonly method: string;\n readonly redirectFrom?: string;\n readonly attempt: number;\n readonly signal: AbortSignal;\n readonly requirePrivateNetworkDeny?: () => void;\n}\n\nexport type NetworkAuthorizer = (request: NetworkAuthorization) => boolean | Promise<boolean>;\n\nexport interface NetworkLimits {\n readonly maxUploadBytes: number;\n readonly maxDownloadBytes: number;\n readonly maxBufferBytes: number;\n readonly maxHeaderBytes: number;\n readonly maxRedirects: number;\n readonly maxRetries: number;\n readonly maxUrls: number;\n readonly maxTimeMs: number;\n readonly maxTotalTimeMs: number;\n}\n\nexport interface NetworkCommandsOptions {\n readonly authorize: NetworkAuthorizer;\n readonly transport?: HttpTransport;\n readonly limits?: Partial<NetworkLimits>;\n readonly replace?: boolean;\n}\n\nexport const defaultNetworkLimits: Readonly<NetworkLimits> = Object.freeze({\n maxUploadBytes: 64 * 1024 * 1024,\n maxDownloadBytes: 64 * 1024 * 1024,\n maxBufferBytes: 8 * 1024 * 1024,\n maxHeaderBytes: 64 * 1024,\n maxRedirects: 10,\n maxRetries: 5,\n maxUrls: 32,\n maxTimeMs: 120_000,\n maxTotalTimeMs: 120_000,\n});\n\nexport const cloudflareWorkerNetworkLimits: Readonly<NetworkLimits> = Object.freeze({\n maxUploadBytes: 4 * 1024 * 1024,\n maxDownloadBytes: 4 * 1024 * 1024,\n maxBufferBytes: 1024 * 1024,\n maxHeaderBytes: 32 * 1024,\n maxRedirects: 2,\n maxRetries: 1,\n maxUrls: 8,\n maxTimeMs: 10_000,\n maxTotalTimeMs: 10_000,\n});\n\nexport class CurlError extends Error {\n constructor(readonly exitCode: number, message: string) {\n super(message);\n this.name = \"CurlError\";\n }\n}\n", "import type { CommandContext } from \"../../contracts/index.js\";\nimport { writeDiagnostic } from \"../../escaping.js\";\nimport { CurlError, defaultNetworkLimits, type HttpHeaders, type NetworkLimits } from \"./types.js\";\n\nexport const encode = (text: string): Uint8Array => new TextEncoder().encode(text);\n\nexport function limitsFor(overrides: Partial<NetworkLimits> = {}): NetworkLimits {\n const result = { ...defaultNetworkLimits, ...overrides };\n for (const [name, value] of Object.entries(result)) {\n const minimum = name === \"maxRedirects\" || name === \"maxRetries\" ? 0 : 1;\n if (!Number.isSafeInteger(value) || value < minimum || (name === \"maxTimeMs\" && value > 2_147_483_647)) {\n throw new RangeError(`Invalid network limit: ${name}`);\n }\n }\n return Object.freeze(result);\n}\n\nexport async function withSignal<Value>(operation: () => PromiseLike<Value> | Value, signal: AbortSignal): Promise<Value> {\n signal.throwIfAborted();\n return new Promise<Value>((resolve, reject) => {\n const onAbort = (): void => { cleanup(); reject(signal.reason); };\n const cleanup = (): void => signal.removeEventListener(\"abort\", onAbort);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n Promise.resolve().then(operation).then(value => { cleanup(); resolve(value); }, error => { cleanup(); reject(error); });\n });\n}\n\nexport async function delay(milliseconds: number, signal: AbortSignal): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try { await withSignal(() => new Promise<void>(resolve => { timer = setTimeout(resolve, milliseconds); }), signal); }\n finally { clearTimeout(timer); }\n}\n\nexport function header(headers: HttpHeaders, name: string): string | undefined {\n return headers.find(([key]) => key.toLowerCase() === name.toLowerCase())?.[1];\n}\n\nexport function networkError(error: unknown): CurlError {\n if (error instanceof CurlError) return error;\n const code = error && typeof error === \"object\" && \"code\" in error ? String(error.code) : \"\";\n if ([\"ENOTFOUND\", \"EAI_AGAIN\"].includes(code)) return new CurlError(6, \"Could not resolve host\");\n if ([\"ECONNREFUSED\", \"ENETUNREACH\", \"EHOSTUNREACH\"].includes(code)) return new CurlError(7, \"Failed to connect\");\n if (/CERT|SELF_SIGNED|UNABLE_TO_VERIFY/.test(code)) return new CurlError(60, \"TLS certificate verification failed\");\n if (/TLS|SSL/.test(code)) return new CurlError(35, \"TLS handshake failed\");\n return new CurlError(56, \"Network transfer failed\");\n}\n\nexport async function diagnostic(context: CommandContext, error: CurlError): Promise<void> {\n await writeDiagnostic(context.stderr, `${context.command}: (${error.exitCode}) ${error.message}\\n`, context.signal);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|