@solarisdk/runloop-compat 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/COMPAT.md +110 -0
  2. package/LICENSE +17 -0
  3. package/LICENSE-RUNLOOP +7 -0
  4. package/NOTICE +14 -0
  5. package/README.md +46 -2
  6. package/dist/blueprint-types.d.ts +522 -0
  7. package/dist/blueprint-types.d.ts.map +1 -0
  8. package/dist/blueprint-types.js +4 -0
  9. package/dist/blueprint-types.js.map +1 -0
  10. package/dist/blueprints.d.ts +71 -0
  11. package/dist/blueprints.d.ts.map +1 -0
  12. package/dist/blueprints.js +233 -0
  13. package/dist/blueprints.js.map +1 -0
  14. package/dist/client.d.ts +290 -0
  15. package/dist/client.d.ts.map +1 -0
  16. package/dist/client.js +924 -0
  17. package/dist/client.js.map +1 -0
  18. package/dist/context.d.ts +42 -0
  19. package/dist/context.d.ts.map +1 -0
  20. package/dist/context.js +198 -0
  21. package/dist/context.js.map +1 -0
  22. package/dist/dockerfile.d.ts +36 -0
  23. package/dist/dockerfile.d.ts.map +1 -0
  24. package/dist/dockerfile.js +338 -0
  25. package/dist/dockerfile.js.map +1 -0
  26. package/dist/errors.d.ts +67 -0
  27. package/dist/errors.d.ts.map +1 -0
  28. package/dist/errors.js +171 -0
  29. package/dist/errors.js.map +1 -0
  30. package/dist/image-ref.d.ts +35 -0
  31. package/dist/image-ref.d.ts.map +1 -0
  32. package/dist/image-ref.js +97 -0
  33. package/dist/image-ref.js.map +1 -0
  34. package/dist/index.d.ts +16 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +20 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mapping.d.ts +49 -0
  39. package/dist/mapping.d.ts.map +1 -0
  40. package/dist/mapping.js +204 -0
  41. package/dist/mapping.js.map +1 -0
  42. package/dist/sdk.d.ts +182 -0
  43. package/dist/sdk.d.ts.map +1 -0
  44. package/dist/sdk.js +356 -0
  45. package/dist/sdk.js.map +1 -0
  46. package/dist/secrets.d.ts +41 -0
  47. package/dist/secrets.d.ts.map +1 -0
  48. package/dist/secrets.js +58 -0
  49. package/dist/secrets.js.map +1 -0
  50. package/dist/shared-types.d.ts +440 -0
  51. package/dist/shared-types.d.ts.map +1 -0
  52. package/dist/shared-types.js +4 -0
  53. package/dist/shared-types.js.map +1 -0
  54. package/dist/types.d.ts +920 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +4 -0
  57. package/dist/types.js.map +1 -0
  58. package/package.json +48 -4
@@ -0,0 +1,338 @@
1
+ // Dockerfile (a practical subset) -> Solari's `CompiledImage` build recipe. Mirrors
2
+ // sdk/python-runloop-compat/solari_runloop/_dockerfile.py, with one deliberate difference: a `FROM <image>` other than
3
+ // ubuntu/debian becomes the gateway's native `compiled.fromImage` (blueprint level 3b) instead of the chroot shim
4
+ // (level 3a): the guest agent chroots exec / fs into the unpacked image, RUN steps run inside it.
5
+ //
6
+ // Supported: FROM (one stage), RUN, ENV, ARG (+ build_args), WORKDIR, ENTRYPOINT, CMD, COPY / ADD (from a build
7
+ // context), LABEL / EXPOSE / MAINTAINER / STOPSIGNAL (ignored), SHELL (sh/bash). Not: multi-stage, USER, VOLUME,
8
+ // HEALTHCHECK, ONBUILD, COPY --from, URL sources.
9
+ import { SolariCompatUnsupported } from "./errors.js";
10
+ import { parseImageRef } from "./image-ref.js";
11
+ const DEBIAN_FAMILY = new Set(["ubuntu", "debian"]);
12
+ const SOLARI_BASES = new Set(["base", "workstation"]);
13
+ /** `build_args` switch that forces native image import even for ubuntu/debian images. */
14
+ export const IMPORT_ARG = "SOLARI_IMPORT";
15
+ export const CONTEXT_DIR = "/tmp/solari-context";
16
+ /** Base64 characters per context chunk: one exec argument must stay far below the kernel's 128 KiB limit. */
17
+ const CHUNK = 60_000;
18
+ /** Join `\` continuations, drop comments and blank lines, split into [INSTRUCTION, rest]. */
19
+ export function logicalLines(text) {
20
+ const out = [];
21
+ let buf = "";
22
+ const flush = (s) => {
23
+ const t = s.trim();
24
+ if (!t)
25
+ return;
26
+ const sp = t.search(/\s/);
27
+ out.push(sp < 0 ? [t.toUpperCase(), ""] : [t.slice(0, sp).toUpperCase(), t.slice(sp).trim()]);
28
+ };
29
+ for (const raw of text.split(/\r?\n/)) {
30
+ const line = raw.replace(/\s+$/, "");
31
+ if (!buf && (!line.trim() || line.trimStart().startsWith("#")))
32
+ continue;
33
+ if (buf && line.trimStart().startsWith("#"))
34
+ continue;
35
+ if (line.endsWith("\\")) {
36
+ buf += line.slice(0, -1) + " ";
37
+ continue;
38
+ }
39
+ buf += line;
40
+ flush(buf);
41
+ buf = "";
42
+ }
43
+ if (buf.trim())
44
+ flush(buf);
45
+ return out;
46
+ }
47
+ /** Docker's default PATH, so `ENV PATH=/opt/x/bin:$PATH` expands to a usable value (an unknown $VAR is ""). */
48
+ export const DEFAULT_PATH = "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
49
+ function subst(s, args) {
50
+ return s.replace(/\$(?:\{([A-Za-z_][A-Za-z0-9_]*)\}|([A-Za-z_][A-Za-z0-9_]*))/g, (_m, a, b) => args[(a ?? b)] ?? "");
51
+ }
52
+ /** POSIX-ish word splitting with single quotes, double quotes and backslashes (enough for ENV / COPY lines). */
53
+ export function shellSplit(s) {
54
+ const out = [];
55
+ let cur = "";
56
+ let has = false;
57
+ let q = null;
58
+ for (let i = 0; i < s.length; i++) {
59
+ const c = s[i];
60
+ if (q) {
61
+ if (c === q)
62
+ q = null;
63
+ else if (c === "\\" && q === '"' && i + 1 < s.length && '"\\$`'.includes(s[i + 1]))
64
+ cur += s[++i];
65
+ else
66
+ cur += c;
67
+ }
68
+ else if (c === "'" || c === '"') {
69
+ q = c;
70
+ has = true;
71
+ }
72
+ else if (c === "\\" && i + 1 < s.length) {
73
+ cur += s[++i];
74
+ has = true;
75
+ }
76
+ else if (/\s/.test(c)) {
77
+ if (has || cur)
78
+ out.push(cur);
79
+ cur = "";
80
+ has = false;
81
+ }
82
+ else {
83
+ cur += c;
84
+ has = true;
85
+ }
86
+ }
87
+ if (q)
88
+ throw new SolariCompatUnsupported("unterminated quote in Dockerfile line");
89
+ if (has || cur)
90
+ out.push(cur);
91
+ return out;
92
+ }
93
+ export function shq(s) {
94
+ return `'${s.replace(/'/g, `'\\''`)}'`;
95
+ }
96
+ function jsonOrShell(rest) {
97
+ const r = rest.trim();
98
+ if (r.startsWith("[")) {
99
+ try {
100
+ const v = JSON.parse(r);
101
+ if (Array.isArray(v) && v.every((x) => typeof x === "string"))
102
+ return v;
103
+ }
104
+ catch {
105
+ /* fall through to shell form */
106
+ }
107
+ }
108
+ return ["/bin/sh", "-c", r];
109
+ }
110
+ function parseEnv(rest) {
111
+ const first = rest.split(/\s+/, 1)[0] ?? "";
112
+ if (!first.includes("=")) {
113
+ const i = rest.search(/\s/);
114
+ return [[rest.slice(0, i < 0 ? undefined : i), i < 0 ? "" : rest.slice(i).trim().replace(/^"(.*)"$/, "$1")]];
115
+ }
116
+ return shellSplit(rest).map((t) => {
117
+ const i = t.indexOf("=");
118
+ return [t.slice(0, i), t.slice(i + 1)];
119
+ });
120
+ }
121
+ function resolveFrom(rest, args) {
122
+ const tokens = rest.split(/\s+/).filter((t) => t && !t.startsWith("--"));
123
+ if (tokens.slice(1).some((t) => t.toUpperCase() === "AS"))
124
+ throw new SolariCompatUnsupported("Multi-stage Dockerfile (FROM ... AS)", "Single-stage builds only.");
125
+ const image = subst(tokens[0] ?? "", args);
126
+ if (!image)
127
+ throw new SolariCompatUnsupported("FROM without an image");
128
+ if (image === "scratch")
129
+ throw new SolariCompatUnsupported("FROM scratch");
130
+ let repo = image.split("@", 1)[0];
131
+ const last = repo.split("/").at(-1);
132
+ if (last.includes(":"))
133
+ repo = repo.slice(0, repo.lastIndexOf(":"));
134
+ let parts = repo.split("/");
135
+ if (parts.length > 1 && (parts[0].includes(".") || parts[0].includes(":") || parts[0] === "localhost"))
136
+ parts = parts.slice(1);
137
+ if (parts[0] === "library")
138
+ parts = parts.slice(1);
139
+ const name = parts.join("/");
140
+ const force = !["", "0", "false", undefined].includes(args[IMPORT_ARG]);
141
+ if (SOLARI_BASES.has(name))
142
+ return { base: name };
143
+ if (DEBIAN_FAMILY.has(name) && !force)
144
+ return { base: "base" };
145
+ const ref = parseImageRef(image);
146
+ if (!ref.ok)
147
+ throw new SolariCompatUnsupported(`FROM ${image}`, ref.error);
148
+ return { fromImage: image };
149
+ }
150
+ const run = (command) => ({ op: "run", command });
151
+ const GLOB_SAFE = /^[A-Za-z0-9_./*?[\]+@%-]+$/;
152
+ /** Steps that unpack the tar.gz build context into CONTEXT_DIR (chunked so no exec argument is huge). */
153
+ export function contextSteps(ctx) {
154
+ const b64 = Buffer.from(ctx).toString("base64");
155
+ const steps = [run(`rm -rf ${CONTEXT_DIR} ${CONTEXT_DIR}.b64 && mkdir -p ${CONTEXT_DIR} && : > ${CONTEXT_DIR}.b64`)];
156
+ for (let i = 0; i < b64.length; i += CHUNK)
157
+ steps.push(run(`printf %s ${shq(b64.slice(i, i + CHUNK))} >> ${CONTEXT_DIR}.b64`));
158
+ steps.push(run(`base64 -d < ${CONTEXT_DIR}.b64 | tar -xz -C ${CONTEXT_DIR} && rm -f ${CONTEXT_DIR}.b64`));
159
+ return steps;
160
+ }
161
+ function posixNormalize(p) {
162
+ const out = [];
163
+ for (const c of p.split("/")) {
164
+ if (!c || c === ".")
165
+ continue;
166
+ if (c === "..")
167
+ out.pop();
168
+ else
169
+ out.push(c);
170
+ }
171
+ return "/" + out.join("/");
172
+ }
173
+ function copyStep(instr, rest, workdir) {
174
+ let parts;
175
+ if (rest.trim().startsWith("[")) {
176
+ try {
177
+ parts = JSON.parse(rest);
178
+ }
179
+ catch {
180
+ throw new SolariCompatUnsupported(`${instr} with malformed JSON form`);
181
+ }
182
+ }
183
+ else
184
+ parts = shellSplit(rest);
185
+ const flags = parts.filter((p) => p.startsWith("--"));
186
+ parts = parts.filter((p) => !p.startsWith("--"));
187
+ for (const f of flags) {
188
+ if (f.startsWith("--from"))
189
+ throw new SolariCompatUnsupported(`${instr} --from (multi-stage)`);
190
+ if (!f.startsWith("--chown=") && !f.startsWith("--chmod="))
191
+ throw new SolariCompatUnsupported(`${instr} ${f.split("=")[0]}`);
192
+ }
193
+ if (parts.length < 2)
194
+ throw new SolariCompatUnsupported(`${instr} needs at least a source and a destination`);
195
+ const dest = parts.at(-1);
196
+ const srcs = parts.slice(0, -1);
197
+ for (const src of srcs) {
198
+ if (src.includes("://"))
199
+ throw new SolariCompatUnsupported(`${instr} from a URL`, "Download with RUN curl instead.");
200
+ if (src.startsWith("/") || src.split("/").includes("..")) {
201
+ throw new SolariCompatUnsupported(`${instr} source ${JSON.stringify(src)}`, "Sources must be relative paths inside the build context.");
202
+ }
203
+ }
204
+ let absDest = dest.startsWith("/") ? posixNormalize(dest) : posixNormalize(`${workdir}/${dest}`);
205
+ const dirDest = dest.endsWith("/") || dest === "." || dest === "./";
206
+ if (dirDest)
207
+ absDest = absDest.replace(/\/+$/, "") + "/";
208
+ const quoted = srcs.map((s) => (GLOB_SAFE.test(s) ? s : shq(s))).join(" ");
209
+ const qDest = shq(absDest);
210
+ const unpack = instr === "ADD" && srcs.length === 1 && /\.(tar|tar\.gz|tgz)$/.test(srcs[0]);
211
+ let body;
212
+ if (unpack)
213
+ body = `mkdir -p ${qDest} && tar -xf ${quoted} -C ${qDest}`;
214
+ // Docker copies a directory source's CONTENTS into the destination (never nests it), and a file source into a
215
+ // directory destination or onto the destination path. `cp -a src/ dest/` would nest, so directories go through `src/.`.
216
+ else if (dirDest || srcs.length > 1 || srcs.some((x) => /[*?[]/.test(x))) {
217
+ body = `mkdir -p ${qDest} && for s in ${quoted}; do if [ -d "$s" ]; then cp -a -- "$s"/. ${qDest}; else cp -a -- "$s" ${qDest}; fi; done`;
218
+ }
219
+ else {
220
+ body = `s=${quoted}; if [ -d "$s" ]; then mkdir -p ${qDest} && cp -a -- "$s"/. ${qDest}; else mkdir -p "$(dirname ${qDest})" && cp -a -- "$s" ${qDest}; fi`;
221
+ }
222
+ let post = "";
223
+ for (const f of flags) {
224
+ if (f.startsWith("--chown="))
225
+ post += ` && (chown -R ${shq(f.slice(8))} ${qDest} 2>/dev/null || true)`;
226
+ else if (f.startsWith("--chmod="))
227
+ post += ` && chmod -R ${shq(f.slice(8))} ${qDest}`;
228
+ }
229
+ return run(`cd ${CONTEXT_DIR} && ${body}${post}`);
230
+ }
231
+ export function compileDockerfile(input) {
232
+ const warn = input.warn ?? ((m) => console.warn(`@solarisdk/runloop-compat: ${m}`));
233
+ const steps = [];
234
+ let base;
235
+ let fromTemplate = input.base_template ?? input.base_blueprint_name ?? undefined;
236
+ let fromImage;
237
+ const args = { PATH: DEFAULT_PATH, ...(input.build_args ?? {}) };
238
+ const argOnly = { ...(input.build_args ?? {}) };
239
+ let seenFrom = false;
240
+ let workdir = "/";
241
+ let contextLoaded = false;
242
+ for (const [instr, rest] of logicalLines(input.dockerfile ?? "")) {
243
+ switch (instr) {
244
+ case "FROM": {
245
+ if (seenFrom)
246
+ throw new SolariCompatUnsupported("Multi-stage Dockerfile (second FROM)", "Single-stage builds only.");
247
+ seenFrom = true;
248
+ const f = resolveFrom(rest, args);
249
+ if (fromTemplate) {
250
+ warn(`base blueprint ${JSON.stringify(fromTemplate)} overrides the Dockerfile FROM`);
251
+ }
252
+ else {
253
+ base = f.base;
254
+ fromImage = f.fromImage;
255
+ }
256
+ break;
257
+ }
258
+ case "ARG": {
259
+ const i = rest.indexOf("=");
260
+ const k = (i < 0 ? rest : rest.slice(0, i)).trim();
261
+ if (!(k in args))
262
+ args[k] = i < 0 ? "" : rest.slice(i + 1).trim().replace(/^"(.*)"$/, "$1");
263
+ argOnly[k] = args[k];
264
+ break;
265
+ }
266
+ case "ENV":
267
+ for (const [k, v] of parseEnv(subst(rest, args))) {
268
+ args[k] = v;
269
+ steps.push({ op: "env", key: k, value: v });
270
+ }
271
+ break;
272
+ case "RUN": {
273
+ const cmd = rest.startsWith("[") ? JSON.parse(rest).map(shq).join(" ") : withArgs(rest, argOnly);
274
+ steps.push(run(cmd));
275
+ break;
276
+ }
277
+ case "WORKDIR": {
278
+ const wd = subst(rest, args);
279
+ workdir = wd.startsWith("/") ? posixNormalize(wd) : posixNormalize(`${workdir}/${wd}`);
280
+ steps.push({ op: "workdir", dir: workdir });
281
+ break;
282
+ }
283
+ case "ENTRYPOINT":
284
+ steps.push({ op: "entrypoint", command: jsonOrShell(subst(rest, args)) });
285
+ break;
286
+ case "CMD":
287
+ steps.push({ op: "cmd", command: jsonOrShell(subst(rest, args)) });
288
+ break;
289
+ case "LABEL":
290
+ case "EXPOSE":
291
+ case "MAINTAINER":
292
+ case "STOPSIGNAL":
293
+ break;
294
+ case "SHELL":
295
+ if (!rest.includes("bash") && !rest.includes("sh"))
296
+ throw new SolariCompatUnsupported(`SHELL ${rest}`);
297
+ break;
298
+ case "COPY":
299
+ case "ADD":
300
+ if (!input.context) {
301
+ throw new SolariCompatUnsupported(instr, "No build_context was given. Upload one with sdk.storageObject.uploadFromDir(...) and pass build_context: obj.asBuildContext().");
302
+ }
303
+ if (!contextLoaded) {
304
+ steps.push(...contextSteps(input.context));
305
+ contextLoaded = true;
306
+ }
307
+ steps.push(copyStep(instr, subst(rest, args), workdir));
308
+ break;
309
+ default:
310
+ throw new SolariCompatUnsupported(instr);
311
+ }
312
+ }
313
+ for (const cmd of input.system_setup_commands ?? [])
314
+ steps.push(run(cmd));
315
+ for (const [path, contents] of Object.entries(input.file_mounts ?? {})) {
316
+ const dest = path.startsWith("/") ? path : posixNormalize(`${workdir}/${path}`);
317
+ steps.push(run(`mkdir -p "$(dirname ${shq(dest)})" && echo ${Buffer.from(contents).toString("base64")} | base64 -d > ${shq(dest)}`));
318
+ }
319
+ if (contextLoaded)
320
+ steps.push(run(`rm -rf ${CONTEXT_DIR}`));
321
+ const out = { kind: "sandbox", packages: [], steps, fragment: "", localFiles: [] };
322
+ if (fromTemplate)
323
+ out.fromTemplate = fromTemplate;
324
+ else if (fromImage)
325
+ out.fromImage = fromImage;
326
+ else
327
+ out.base = base ?? "base";
328
+ return out;
329
+ }
330
+ /** Docker expands ARG in RUN through the shell; ENV became real env steps, so only ARGs need injecting. */
331
+ function withArgs(cmd, args) {
332
+ const exports = Object.entries(args)
333
+ .filter(([k]) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(k))
334
+ .map(([k, v]) => `${k}=${shq(v)}`)
335
+ .join(" ");
336
+ return exports ? `export ${exports}; ${cmd}` : cmd;
337
+ }
338
+ //# sourceMappingURL=dockerfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dockerfile.js","sourceRoot":"","sources":["../src/dockerfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ export type Headers = Record<string, string | null | undefined>;
2
+ export declare class RunloopError extends Error {
3
+ constructor(message?: string);
4
+ }
5
+ export declare class APIError<TStatus extends number | undefined = number | undefined, THeaders extends Headers | undefined = Headers | undefined, TError extends object | undefined = object | undefined> extends RunloopError {
6
+ /** HTTP status for the response that caused the error */
7
+ readonly status: TStatus;
8
+ /** HTTP headers for the response that caused the error */
9
+ readonly headers: THeaders;
10
+ /** JSON body of the response that caused the error */
11
+ readonly error: TError;
12
+ constructor(status: TStatus, error: TError, message: string | undefined, headers: THeaders);
13
+ private static makeMessage;
14
+ static generate(status: number | undefined, errorResponse: object | undefined, message: string | undefined, headers: Headers | undefined): APIError;
15
+ }
16
+ export declare class APIUserAbortError extends APIError<undefined, undefined, undefined> {
17
+ constructor({ message }?: {
18
+ message?: string;
19
+ });
20
+ }
21
+ export declare class APIConnectionError extends APIError<undefined, undefined, undefined> {
22
+ constructor({ message, cause }?: {
23
+ message?: string | undefined;
24
+ cause?: Error | undefined;
25
+ });
26
+ }
27
+ export declare class APIConnectionTimeoutError extends APIConnectionError {
28
+ constructor({ message }?: {
29
+ message?: string;
30
+ });
31
+ }
32
+ /** Alias: the Python SDK (and the compat docs) call this `APITimeoutError`. */
33
+ export { APIConnectionTimeoutError as APITimeoutError };
34
+ export declare class BadRequestError extends APIError<400, Headers> {
35
+ }
36
+ export declare class AuthenticationError extends APIError<401, Headers> {
37
+ }
38
+ export declare class PermissionDeniedError extends APIError<403, Headers> {
39
+ }
40
+ export declare class NotFoundError extends APIError<404, Headers> {
41
+ }
42
+ export declare class ConflictError extends APIError<409, Headers> {
43
+ }
44
+ export declare class UnprocessableEntityError extends APIError<422, Headers> {
45
+ }
46
+ export declare class RateLimitError extends APIError<429, Headers> {
47
+ }
48
+ export declare class InternalServerError extends APIError<number, Headers> {
49
+ }
50
+ /**
51
+ * Raised for Runloop features Solari does not offer (or not yet). Always names the
52
+ * feature; the compat layer never silently ignores a parameter it cannot honour.
53
+ */
54
+ export declare class SolariCompatUnsupported extends APIError<undefined, undefined, undefined> {
55
+ readonly feature: string;
56
+ constructor(feature: string, detail?: string);
57
+ }
58
+ /**
59
+ * Translate anything thrown by the Solari SDK into the Runloop hierarchy.
60
+ * Already-translated errors pass through untouched.
61
+ */
62
+ export declare function translateError(err: unknown): unknown;
63
+ /** Run `fn`, translating any thrown Solari error. */
64
+ export declare function translating<T>(fn: () => Promise<T>): Promise<T>;
65
+ /** A namespace whose every method throws {@link SolariCompatUnsupported}. */
66
+ export declare function unsupportedNamespace<T extends object = Record<string, (...a: unknown[]) => never>>(feature: string): T;
67
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
package/dist/errors.js ADDED
@@ -0,0 +1,171 @@
1
+ // Runloop-shaped error hierarchy (names and fields follow @runloop/api-client
2
+ // 2.0.0 `error.d.ts`), plus translation from Solari SDK errors. Solari's own
3
+ // `{code,error,message,retryable}` body is kept verbatim on `.error`.
4
+ import { ActionError, ConnectionError, GatewayError, SolariError, TimeoutError, } from "@solarisdk/core";
5
+ export class RunloopError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = new.target.name;
9
+ }
10
+ }
11
+ export class APIError extends RunloopError {
12
+ /** HTTP status for the response that caused the error */
13
+ status;
14
+ /** HTTP headers for the response that caused the error */
15
+ headers;
16
+ /** JSON body of the response that caused the error */
17
+ error;
18
+ constructor(status, error, message, headers) {
19
+ super(APIError.makeMessage(status, error, message));
20
+ this.status = status;
21
+ this.headers = headers;
22
+ this.error = error;
23
+ }
24
+ static makeMessage(status, error, message) {
25
+ const msg = error?.message !== undefined
26
+ ? typeof error.message === "string"
27
+ ? error.message
28
+ : JSON.stringify(error.message)
29
+ : error
30
+ ? JSON.stringify(error)
31
+ : message;
32
+ if (status && msg)
33
+ return `${status} ${msg}`;
34
+ if (status)
35
+ return `${status} status code (no body)`;
36
+ if (msg)
37
+ return msg;
38
+ return "(no status code or body)";
39
+ }
40
+ static generate(status, errorResponse, message, headers) {
41
+ if (!status)
42
+ return new APIConnectionError({ message });
43
+ const error = errorResponse;
44
+ if (status === 400)
45
+ return new BadRequestError(status, error, message, headers);
46
+ if (status === 401)
47
+ return new AuthenticationError(status, error, message, headers);
48
+ if (status === 403)
49
+ return new PermissionDeniedError(status, error, message, headers);
50
+ if (status === 404)
51
+ return new NotFoundError(status, error, message, headers);
52
+ if (status === 409)
53
+ return new ConflictError(status, error, message, headers);
54
+ if (status === 422)
55
+ return new UnprocessableEntityError(status, error, message, headers);
56
+ if (status === 429)
57
+ return new RateLimitError(status, error, message, headers);
58
+ if (status >= 500)
59
+ return new InternalServerError(status, error, message, headers);
60
+ return new APIError(status, error, message, headers);
61
+ }
62
+ }
63
+ export class APIUserAbortError extends APIError {
64
+ constructor({ message } = {}) {
65
+ super(undefined, undefined, message || "Request was aborted.", undefined);
66
+ }
67
+ }
68
+ export class APIConnectionError extends APIError {
69
+ constructor({ message, cause } = {}) {
70
+ super(undefined, undefined, message || "Connection error.", undefined);
71
+ if (cause)
72
+ this.cause = cause;
73
+ }
74
+ }
75
+ export class APIConnectionTimeoutError extends APIConnectionError {
76
+ constructor({ message } = {}) {
77
+ super({ message: message ?? "Request timed out." });
78
+ }
79
+ }
80
+ /** Alias: the Python SDK (and the compat docs) call this `APITimeoutError`. */
81
+ export { APIConnectionTimeoutError as APITimeoutError };
82
+ export class BadRequestError extends APIError {
83
+ }
84
+ export class AuthenticationError extends APIError {
85
+ }
86
+ export class PermissionDeniedError extends APIError {
87
+ }
88
+ export class NotFoundError extends APIError {
89
+ }
90
+ export class ConflictError extends APIError {
91
+ }
92
+ export class UnprocessableEntityError extends APIError {
93
+ }
94
+ export class RateLimitError extends APIError {
95
+ }
96
+ export class InternalServerError extends APIError {
97
+ }
98
+ /**
99
+ * Raised for Runloop features Solari does not offer (or not yet). Always names the
100
+ * feature; the compat layer never silently ignores a parameter it cannot honour.
101
+ */
102
+ export class SolariCompatUnsupported extends APIError {
103
+ feature;
104
+ constructor(feature, detail) {
105
+ super(undefined, undefined, `Solari does not support ${feature} through the Runloop compatibility layer${detail ? `: ${detail}` : "."}`, undefined);
106
+ this.feature = feature;
107
+ }
108
+ }
109
+ /** Solari HTTP status → Runloop class (402 plan errors surface as PermissionDenied). */
110
+ function statusToStatus(status) {
111
+ return status === 402 ? 403 : status;
112
+ }
113
+ /**
114
+ * Translate anything thrown by the Solari SDK into the Runloop hierarchy.
115
+ * Already-translated errors pass through untouched.
116
+ */
117
+ export function translateError(err) {
118
+ if (err instanceof RunloopError)
119
+ return err;
120
+ if (err instanceof GatewayError) {
121
+ const body = (err.body ?? { message: err.message });
122
+ const e = APIError.generate(statusToStatus(err.status), body, err.message, {});
123
+ // 402 (plan) surfaces as PermissionDeniedError but keeps its real status.
124
+ if (err.status === 402)
125
+ e.status = 402;
126
+ e.cause = err;
127
+ return e;
128
+ }
129
+ if (err instanceof TimeoutError) {
130
+ const e = new APIConnectionTimeoutError({ message: err.message });
131
+ e.cause = err;
132
+ return e;
133
+ }
134
+ if (err instanceof ConnectionError) {
135
+ return new APIConnectionError({ message: err.message, cause: err });
136
+ }
137
+ if (err instanceof ActionError) {
138
+ const e = new APIError(undefined, { code: err.code, message: err.message }, err.message, undefined);
139
+ e.cause = err;
140
+ return e;
141
+ }
142
+ if (err instanceof SolariError) {
143
+ return new APIConnectionError({ message: err.message, cause: err });
144
+ }
145
+ if (err instanceof TypeError || err?.name === "AbortError") {
146
+ return new APIConnectionError({ message: err.message, cause: err });
147
+ }
148
+ return err;
149
+ }
150
+ /** Run `fn`, translating any thrown Solari error. */
151
+ export async function translating(fn) {
152
+ try {
153
+ return await fn();
154
+ }
155
+ catch (e) {
156
+ throw translateError(e);
157
+ }
158
+ }
159
+ /** A namespace whose every method throws {@link SolariCompatUnsupported}. */
160
+ export function unsupportedNamespace(feature) {
161
+ return new Proxy({}, {
162
+ get: (_t, prop) => {
163
+ if (prop === "then" || typeof prop === "symbol")
164
+ return undefined;
165
+ return () => {
166
+ throw new SolariCompatUnsupported(`${feature}.${String(prop)}`);
167
+ };
168
+ },
169
+ });
170
+ }
171
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * OCI image reference validation for `fromImage` templates (blueprint level 3b).
3
+ *
4
+ * The reference comes from a tenant and ends up on a command line inside the builder VM, so it is
5
+ * parsed strictly into registry / repository / tag / digest and re-rendered from the parts. Nothing
6
+ * the caller typed is passed through verbatim. Rules:
7
+ * - the registry must be on the allowlist (public registries only);
8
+ * - no scheme, no userinfo / credentials, no port, no whitespace or control characters;
9
+ * - repository, tag and digest must match the OCI grammar;
10
+ * - a short docker.io name gets `library/` and the tag defaults to `latest`.
11
+ */
12
+ /** Registries a template may pull from. Public, anonymous pulls only: no credentials are ever sent. */
13
+ export declare const IMAGE_REGISTRY_ALLOWLIST: readonly string[];
14
+ export interface ParsedImageRef {
15
+ /** Allowlisted registry host, e.g. "docker.io". */
16
+ registry: string;
17
+ /** Repository path, e.g. "library/python". */
18
+ repository: string;
19
+ tag?: string;
20
+ digest?: string;
21
+ /** `registry/repository` with no tag or digest. */
22
+ name: string;
23
+ /** Canonical re-rendering: `name[:tag][@digest]`. */
24
+ canonical: string;
25
+ }
26
+ export type ImageRefResult = {
27
+ ok: true;
28
+ ref: ParsedImageRef;
29
+ } | {
30
+ ok: false;
31
+ code: "InvalidImage" | "ImageRegistryNotAllowed";
32
+ error: string;
33
+ };
34
+ export declare function parseImageRef(input: unknown): ImageRefResult;
35
+ //# sourceMappingURL=image-ref.d.ts.map