diffusr 0.0.0-stage → 0.2.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 (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +169 -2
  3. package/dist/cli/account.d.ts +19 -0
  4. package/dist/cli/account.js +250 -0
  5. package/dist/cli/account.js.map +1 -0
  6. package/dist/cli/args.d.ts +28 -0
  7. package/dist/cli/args.js +204 -0
  8. package/dist/cli/args.js.map +1 -0
  9. package/dist/cli/format.d.ts +10 -0
  10. package/dist/cli/format.js +80 -0
  11. package/dist/cli/format.js.map +1 -0
  12. package/dist/cli/io.d.ts +32 -0
  13. package/dist/cli/io.js +56 -0
  14. package/dist/cli/io.js.map +1 -0
  15. package/dist/cli/main.d.ts +3 -0
  16. package/dist/cli/main.js +176 -0
  17. package/dist/cli/main.js.map +1 -0
  18. package/dist/cli/ops.d.ts +22 -0
  19. package/dist/cli/ops.js +367 -0
  20. package/dist/cli/ops.js.map +1 -0
  21. package/dist/cli/spec.d.ts +37 -0
  22. package/dist/cli/spec.js +117 -0
  23. package/dist/cli/spec.js.map +1 -0
  24. package/dist/cli/spec.json +4207 -0
  25. package/dist/cli/test-helpers.d.ts +32 -0
  26. package/dist/cli/test-helpers.js +70 -0
  27. package/dist/cli/test-helpers.js.map +1 -0
  28. package/dist/cli.d.ts +2 -0
  29. package/dist/cli.js +9 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/client.d.ts +116 -0
  32. package/dist/client.js +281 -0
  33. package/dist/client.js.map +1 -0
  34. package/dist/config.d.ts +30 -0
  35. package/dist/config.js +71 -0
  36. package/dist/config.js.map +1 -0
  37. package/dist/errors.d.ts +21 -0
  38. package/dist/errors.js +23 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/index.d.ts +8 -0
  41. package/dist/index.js +6 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types.d.ts +208 -0
  44. package/dist/types.js +5 -0
  45. package/dist/types.js.map +1 -0
  46. package/dist/verify.d.ts +11 -0
  47. package/dist/verify.js +43 -0
  48. package/dist/verify.js.map +1 -0
  49. package/package.json +56 -3
@@ -0,0 +1,367 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { statSync } from "node:fs";
3
+ import { basename } from "node:path";
4
+ import { DiffusrError } from "../errors.js";
5
+ import { coerceFlag, describeType, flagName, flagStr, readAt, schemaType } from "./args.js";
6
+ import { chargedCredits, credits, formatMe, formatResult, outputUrls, priceCredits, wrap } from "./format.js";
7
+ import { CliError } from "./io.js";
8
+ import { GROUPS, kebab } from "./spec.js";
9
+ export const GLOBAL_FLAGS = [
10
+ ["json", "Print only the JSON answer on stdout (for scripts and agents)."],
11
+ ["yes", "Go ahead and spend credits without asking. Short: -y."],
12
+ ["base-url", "The API address. Or set DIFFUSR_BASE_URL."],
13
+ ["key", "The API key to use. Or set DIFFUSR_KEY."],
14
+ ["help", "Show help. Short: -h."],
15
+ ["version", "Show the version."],
16
+ ];
17
+ export function opFlagDefs(op) {
18
+ const m = new Map();
19
+ const def = (name, boolean) => m.set(name, { name, boolean });
20
+ for (const g of ["json", "yes", "help", "version"])
21
+ def(g, true);
22
+ def("base_url", false);
23
+ def("key", false);
24
+ if (op.hasBody)
25
+ def("body", false);
26
+ if (op.paid)
27
+ def("no_wait", true);
28
+ for (const [name, s] of Object.entries(op.bodyProps))
29
+ def(name, schemaType(s) === "boolean");
30
+ for (const p of op.queryParams)
31
+ def(p.name, schemaType(p.schema) === "boolean");
32
+ return m;
33
+ }
34
+ /** The body field a bare word fills: `prompt`, else `script`, `template`, else the first required string. */
35
+ export function primaryField(op) {
36
+ const strings = (names) => names.filter((n) => op.bodyProps[n] && schemaType(op.bodyProps[n]) === "string");
37
+ const req = strings(op.bodyRequired);
38
+ for (const pref of ["prompt", "script", "template"])
39
+ if (req.includes(pref))
40
+ return pref;
41
+ if (req[0])
42
+ return req[0];
43
+ return strings(Object.keys(op.bodyProps).filter((n) => n !== "idempotency_key"))[0];
44
+ }
45
+ // ——— help ———
46
+ export function opUsage(op) {
47
+ const pos = op.pathParams.map((p) => `<${p.name}>`);
48
+ const prim = op.hasBody ? primaryField(op) : undefined;
49
+ if (prim)
50
+ pos.push(op.bodyRequired.includes(prim) ? `<${prim}>` : `[${prim}]`);
51
+ return `diffusr ${op.id}${pos.length ? " " + pos.join(" ") : ""} [flags]`;
52
+ }
53
+ export function opHelp(op) {
54
+ const lines = [`diffusr ${op.id} — ${op.summary}`, ""];
55
+ const desc = op.description
56
+ .split("\n\n")
57
+ .filter((p) => !/^Needs the|^Price list/.test(p))
58
+ .join("\n");
59
+ if (desc)
60
+ lines.push(wrap(desc, 88, ""), "");
61
+ lines.push(`Usage: ${opUsage(op)}`, `Also works as: diffusr ${kebab(op.id)}`, "");
62
+ if (op.paid) {
63
+ lines.push("This costs credits. It prints the price first and asks before it makes anything.", "Add --yes to skip the question, --dry-run to only see the price.", "");
64
+ }
65
+ const rows = [];
66
+ const add = (name, s, required, desc, where) => {
67
+ const label = `${flagName(name)} <${describeType(s)}>`;
68
+ rows.push([label, `${required ? "(required) " : ""}${where}${desc}`.trim()]);
69
+ };
70
+ for (const p of op.pathParams)
71
+ rows.push([`<${p.name}>`, `(required, positional) ${p.description}`.trim()]);
72
+ for (const [name, s] of Object.entries(op.bodyProps)) {
73
+ if (name === "dry_run") {
74
+ rows.push(["--dry-run", "Only check and show the price. Nothing is made, nothing is spent."]);
75
+ continue;
76
+ }
77
+ add(name, s, op.bodyRequired.includes(name), String(s.description ?? ""), "");
78
+ }
79
+ for (const p of op.queryParams)
80
+ add(p.name, p.schema, p.required, p.description || String(p.schema.description ?? ""), "");
81
+ if (op.hasBody)
82
+ rows.push(["--body <json|@file>", "A whole JSON body. Flags and the first word win over it."]);
83
+ if (op.paid)
84
+ rows.push(["--no-wait", "Start it, print the id, and do not wait."]);
85
+ if (rows.length) {
86
+ lines.push("Arguments and flags:");
87
+ const w = Math.min(34, Math.max(...rows.map(([a]) => a.length)) + 2);
88
+ for (const [a, b] of rows)
89
+ lines.push(` ${a.padEnd(w)}${wrap(b, 88 - w, " ".repeat(w + 2))}`);
90
+ lines.push("");
91
+ }
92
+ lines.push("Global flags: --json --yes --base-url <url> --key <key> --help");
93
+ if (op.bodyProps.pictures || Object.keys(op.bodyProps).some((n) => /_urls?$/.test(n))) {
94
+ lines.push("A local file path works for any link field: it is uploaded first.");
95
+ }
96
+ return lines;
97
+ }
98
+ export function mainHelp(ops, version) {
99
+ const lines = [`diffusr ${version}: make videos, images and music from the command line.`, "", "Usage: diffusr <command> [arguments] [flags]", ""];
100
+ const byGroup = new Map();
101
+ const put = (g, name, text) => byGroup.set(g, [...(byGroup.get(g) ?? []), [name, text]]);
102
+ for (const op of ops)
103
+ put(op.group, op.id, op.summary + (op.paid ? " (costs credits)" : ""));
104
+ put("Make", "price", "Show the price of a make command (free)");
105
+ put("Account", "login", "Connect this computer to your diffusr account");
106
+ put("Account", "whoami", "Show who you are signed in as, and your balance");
107
+ put("Account", "logout", "Sign out and revoke the saved key");
108
+ const order = [...GROUPS, ...[...byGroup.keys()].filter((g) => !GROUPS.includes(g))];
109
+ const all = [...byGroup.values()].flat();
110
+ const w = Math.max(...all.map(([n]) => n.length)) + 2;
111
+ for (const g of order) {
112
+ const rows = byGroup.get(g);
113
+ if (!rows)
114
+ continue;
115
+ lines.push(g);
116
+ for (const [n, t] of rows)
117
+ lines.push(` ${n.padEnd(w)}${t}`);
118
+ lines.push("");
119
+ }
120
+ lines.push("Flags for every command:");
121
+ for (const [f, t] of GLOBAL_FLAGS)
122
+ lines.push(` --${f.padEnd(10)}${t}`);
123
+ lines.push("", "Run diffusr <command> --help for a command's flags. Dashes work too: diffusr make-image.", 'Example: diffusr make_image "a mug on a sunlit table"', "For scripts and agents: add --json (and --yes to allow spending).");
124
+ return lines;
125
+ }
126
+ // ——— building the request ———
127
+ const isUrlKey = (k) => /_urls?$/.test(k) || k === "pictures";
128
+ const isFile = (p) => {
129
+ try {
130
+ return statSync(p).isFile();
131
+ }
132
+ catch {
133
+ return false;
134
+ }
135
+ };
136
+ /** Local files in link fields are uploaded first and swapped for their file_url. */
137
+ async function swapLocalFiles(node, urlish, ctx, cache) {
138
+ if (typeof node === "string") {
139
+ if (!urlish || /^https?:\/\//i.test(node))
140
+ return node;
141
+ if (isFile(node)) {
142
+ let url = cache.get(node);
143
+ if (!url) {
144
+ ctx.io.err(`Uploading ${basename(node)}…`);
145
+ url = (await ctx.client.uploadFile(node)).file_url;
146
+ cache.set(node, url);
147
+ }
148
+ return url;
149
+ }
150
+ if (!/^[a-z][a-z0-9+.-]*:/i.test(node))
151
+ throw new CliError(`"${node}" is not a web link and not a file on this computer.`);
152
+ return node;
153
+ }
154
+ if (Array.isArray(node))
155
+ return Promise.all(node.map((n) => swapLocalFiles(n, urlish, ctx, cache)));
156
+ if (node && typeof node === "object") {
157
+ const out = {};
158
+ for (const [k, v] of Object.entries(node))
159
+ out[k] = await swapLocalFiles(v, urlish || isUrlKey(k), ctx, cache);
160
+ return out;
161
+ }
162
+ return node;
163
+ }
164
+ function buildRequest(op, args) {
165
+ const pos = [...args.positionals];
166
+ let path = op.path;
167
+ for (const p of op.pathParams) {
168
+ const v = pos.shift();
169
+ if (v === undefined)
170
+ throw new CliError(`Missing <${p.name}>. Usage: ${opUsage(op)}`);
171
+ path = path.replace(`{${p.name}}`, encodeURIComponent(v));
172
+ }
173
+ let body;
174
+ if (op.hasBody) {
175
+ body = {};
176
+ const raw = flagStr(args, "body");
177
+ if (raw !== undefined) {
178
+ const text = raw.startsWith("@") ? readAt(raw.slice(1), "--body") : raw;
179
+ let parsed;
180
+ try {
181
+ parsed = JSON.parse(text);
182
+ }
183
+ catch {
184
+ throw new CliError("--body needs a JSON object (or @file.json).");
185
+ }
186
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
187
+ throw new CliError("--body needs a JSON object.");
188
+ Object.assign(body, parsed);
189
+ }
190
+ const prim = primaryField(op);
191
+ const word = pos.shift();
192
+ if (word !== undefined) {
193
+ if (!prim)
194
+ throw new CliError(`Unexpected "${word}". Usage: ${opUsage(op)}`);
195
+ body[prim] = word;
196
+ }
197
+ for (const [name, s] of Object.entries(op.bodyProps)) {
198
+ const raws = args.flags.get(name);
199
+ if (raws)
200
+ body[name] = coerceFlag(s, raws, flagName(name));
201
+ }
202
+ }
203
+ const query = {};
204
+ for (const p of op.queryParams) {
205
+ const raws = args.flags.get(p.name);
206
+ if (raws)
207
+ query[p.name] = coerceFlag(p.schema, raws, flagName(p.name));
208
+ else if (p.required)
209
+ throw new CliError(`Missing ${flagName(p.name)}. Usage: ${opUsage(op)}`);
210
+ }
211
+ if (pos.length)
212
+ throw new CliError(`Unexpected "${pos[0]}". Usage: ${opUsage(op)}`);
213
+ if (body) {
214
+ const missing = op.bodyRequired.filter((n) => body[n] === undefined);
215
+ if (missing.length) {
216
+ throw new CliError(`Missing ${missing.map(flagName).join(", ")}. Usage: ${opUsage(op)}\nRun diffusr ${op.id} --help for every flag.`);
217
+ }
218
+ }
219
+ return { path, query, body };
220
+ }
221
+ // ——— running ———
222
+ const printJson = (ctx, v) => ctx.io.out(JSON.stringify(v, null, 2));
223
+ export async function runOp(op, args, ctx) {
224
+ const built = buildRequest(op, args);
225
+ const { io, client } = ctx;
226
+ // upload_asset <file>: the SDK's two-step upload.
227
+ if (op.id === "upload_asset" && built.body && Object.keys(built.body).length === 1 && typeof built.body.source_url === "string" && isFile(built.body.source_url)) {
228
+ const file = built.body.source_url;
229
+ io.err(`Uploading ${basename(file)}…`);
230
+ const up = await client.uploadFile(file);
231
+ if (ctx.json)
232
+ printJson(ctx, up);
233
+ else
234
+ io.out(up.file_url);
235
+ return 0;
236
+ }
237
+ if (built.body)
238
+ built.body = (await swapLocalFiles(built.body, false, ctx, new Map()));
239
+ if (op.paid)
240
+ return runPaid(op, built, ctx);
241
+ const answer = await client.call(op.method, built.path, { query: built.query, ...(built.body ? { body: built.body } : op.method === "POST" ? { body: {} } : {}) });
242
+ printAnswer(op, answer, ctx);
243
+ return 0;
244
+ }
245
+ function printAnswer(op, answer, ctx) {
246
+ if (ctx.json)
247
+ return printJson(ctx, answer);
248
+ const a = (answer ?? {});
249
+ if (op.id === "get_result" || op.id === "cancel_result")
250
+ return void formatResult(answer).forEach((l) => ctx.io.out(l));
251
+ if (op.id === "get_me")
252
+ return void formatMe(answer).forEach((l) => ctx.io.out(l));
253
+ if (op.id === "upload_asset" && typeof a.file_url === "string")
254
+ return ctx.io.out(a.file_url);
255
+ if (op.id === "list_results" && Array.isArray(a.results)) {
256
+ for (const r of a.results) {
257
+ ctx.io.out([r.id, r.status, r.model, outputUrls(r)[0]].filter(Boolean).join(" "));
258
+ }
259
+ if (!a.results.length)
260
+ ctx.io.out("No results yet.");
261
+ return;
262
+ }
263
+ printJson(ctx, answer);
264
+ }
265
+ async function runPaid(op, built, ctx) {
266
+ const { io, client } = ctx;
267
+ const body = { ...(built.body ?? {}) };
268
+ const idemFromBody = typeof body.idempotency_key === "string" ? body.idempotency_key : undefined;
269
+ delete body.idempotency_key;
270
+ const dryFlag = body.dry_run === true;
271
+ delete body.dry_run;
272
+ const priceOnly = ctx.priceOnly || dryFlag;
273
+ // 1. The price: free.
274
+ const quote = await client.call("POST", built.path, { body: { ...body, dry_run: true }, headers: { "Idempotency-Key": randomUUID() } });
275
+ const price = priceCredits(quote);
276
+ const priceText = price === undefined ? undefined : credits(price);
277
+ if (priceOnly) {
278
+ if (ctx.json)
279
+ printJson(ctx, quote);
280
+ else {
281
+ io.out(priceText ? `Price: ${priceText}` : "Price: unknown");
282
+ for (const w of quote.warnings ?? [])
283
+ io.err(`warning: ${w}`);
284
+ }
285
+ return 0;
286
+ }
287
+ if (!ctx.json)
288
+ io.err(priceText ? `Price: ${priceText}` : "Price: unknown");
289
+ for (const w of quote.warnings ?? [])
290
+ io.err(`warning: ${w}`);
291
+ // 2. Never spend without a yes.
292
+ if (!ctx.yes) {
293
+ if (io.stdinIsTTY && io.stdoutIsTTY) {
294
+ const a = (await io.ask("Make it? [y/N] ")).trim();
295
+ if (!/^y(es)?$/i.test(a)) {
296
+ io.err("Not made.");
297
+ return 2;
298
+ }
299
+ }
300
+ else {
301
+ if (ctx.json)
302
+ printJson(ctx, quote);
303
+ io.err(`Not made. This costs ${priceText ?? "credits"}. Run it again with --yes to make it.`);
304
+ return 2;
305
+ }
306
+ }
307
+ // 3. Make it, with one Idempotency-Key.
308
+ const started = await client.call("POST", built.path, { body, headers: { "Idempotency-Key": idemFromBody ?? randomUUID() } });
309
+ const id = started.id;
310
+ if (typeof id !== "string") {
311
+ printJson(ctx, started);
312
+ return 0;
313
+ }
314
+ if (ctx.noWait) {
315
+ if (ctx.json)
316
+ printJson(ctx, started);
317
+ else {
318
+ io.out(id);
319
+ io.err(`Started. Check it with: diffusr get_result ${id}`);
320
+ }
321
+ return 0;
322
+ }
323
+ const t0 = io.now();
324
+ let timer;
325
+ const show = () => io.errRaw(`\rMaking… ${Math.round((io.now() - t0) / 1000)} s`);
326
+ if (io.stderrIsTTY && !ctx.json) {
327
+ show();
328
+ timer = setInterval(show, 1000);
329
+ }
330
+ let result;
331
+ try {
332
+ result = await client.waitFor(id, { ...(io.pollIntervalMs !== undefined ? { intervalMs: io.pollIntervalMs } : {}) });
333
+ }
334
+ catch (e) {
335
+ if (e instanceof DiffusrError && e.code === "WAIT_TIMEOUT")
336
+ io.err(`Still running. Check it later with: diffusr get_result ${id}`);
337
+ throw e;
338
+ }
339
+ finally {
340
+ if (timer)
341
+ clearInterval(timer);
342
+ if (io.stderrIsTTY && !ctx.json)
343
+ io.errRaw("\r\x1b[K");
344
+ }
345
+ // 4. The answer.
346
+ const charged = chargedCredits(result);
347
+ if (ctx.json)
348
+ printJson(ctx, result);
349
+ if (result.status === "SUCCEEDED") {
350
+ if (!ctx.json) {
351
+ const urls = outputUrls(result);
352
+ if (urls.length)
353
+ for (const u of urls)
354
+ io.out(u);
355
+ else
356
+ io.out(id);
357
+ if (charged !== undefined)
358
+ io.err(`Charged ${credits(charged)}`);
359
+ }
360
+ return 0;
361
+ }
362
+ const msg = result.error?.message ?? `The job ${result.status.toLowerCase()}.`;
363
+ io.err(`error: ${msg}${result.error?.code ? ` (${result.error.code})` : ""}`);
364
+ io.err(charged ? `Charged ${credits(charged)} before it stopped.` : "Nothing was charged.");
365
+ return 1;
366
+ }
367
+ //# sourceMappingURL=ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ops.js","sourceRoot":"","sources":["../../src/cli/ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { Io } from "./io.js";
2
+ export type Json = Record<string, unknown>;
3
+ export interface Param {
4
+ name: string;
5
+ in: "path" | "query";
6
+ required: boolean;
7
+ description: string;
8
+ schema: Json;
9
+ }
10
+ export interface Op {
11
+ id: string;
12
+ method: "GET" | "POST";
13
+ path: string;
14
+ summary: string;
15
+ description: string;
16
+ tag: string;
17
+ group: string;
18
+ pathParams: Param[];
19
+ queryParams: Param[];
20
+ bodyProps: Record<string, Json>;
21
+ bodyRequired: string[];
22
+ hasBody: boolean;
23
+ /** A POST whose body takes `dry_run`: it spends credits. */
24
+ paid: boolean;
25
+ }
26
+ export declare const GROUPS: readonly ["Make", "Files", "Results", "Catalog", "Callbacks", "Ads", "Account"];
27
+ export declare const kebab: (id: string) => string;
28
+ export declare const normalizeName: (s: string) => string;
29
+ /** The snapshot shipped in the package (src/cli/spec.json, copied to dist/cli by the build). */
30
+ export declare function loadSnapshot(): Json;
31
+ /**
32
+ * The API description to build commands from: the live one (2 s timeout,
33
+ * cached for 24 h per base URL), else the snapshot. Never throws.
34
+ */
35
+ export declare function loadSpec(io: Io, baseUrl: string): Promise<Json>;
36
+ export declare function deref(spec: Json, schema: Json | undefined): Json;
37
+ export declare function opsFromSpec(spec: Json): Op[];
@@ -0,0 +1,117 @@
1
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { cacheDir } from "../config.js";
4
+ export const GROUPS = ["Make", "Files", "Results", "Catalog", "Callbacks", "Ads", "Account"];
5
+ const TAG_GROUP = {
6
+ Make: "Make",
7
+ Uploads: "Files",
8
+ Results: "Results",
9
+ Models: "Catalog",
10
+ Creators: "Catalog",
11
+ Templates: "Catalog",
12
+ Callbacks: "Callbacks",
13
+ Ads: "Ads",
14
+ Account: "Account",
15
+ };
16
+ /** The login routes have hand-written commands (`login`, `logout`). */
17
+ const SKIP_TAGS = new Set(["Login"]);
18
+ export const kebab = (id) => id.replace(/_/g, "-");
19
+ export const normalizeName = (s) => s.trim().toLowerCase().replace(/-/g, "_");
20
+ /** The snapshot shipped in the package (src/cli/spec.json, copied to dist/cli by the build). */
21
+ export function loadSnapshot() {
22
+ return JSON.parse(readFileSync(new URL("./spec.json", import.meta.url), "utf8"));
23
+ }
24
+ function isSpec(x) {
25
+ return Boolean(x) && typeof x === "object" && typeof x.openapi === "string" && typeof x.paths === "object" && x.paths !== null;
26
+ }
27
+ const DAY_MS = 24 * 60 * 60 * 1000;
28
+ /**
29
+ * The API description to build commands from: the live one (2 s timeout,
30
+ * cached for 24 h per base URL), else the snapshot. Never throws.
31
+ */
32
+ export async function loadSpec(io, baseUrl) {
33
+ if (!io.liveSpec)
34
+ return loadSnapshot();
35
+ const file = join(cacheDir(io.env, io.platform), "openapi.json");
36
+ try {
37
+ const cached = JSON.parse(readFileSync(file, "utf8"));
38
+ if (cached.base_url === baseUrl && typeof cached.fetched_at === "number" && io.now() - cached.fetched_at < DAY_MS && isSpec(cached.spec))
39
+ return cached.spec;
40
+ }
41
+ catch {
42
+ /* no cache */
43
+ }
44
+ try {
45
+ const res = await io.fetch(`${baseUrl}/openapi.json`, { headers: { Accept: "application/json" }, signal: AbortSignal.timeout(2000) });
46
+ if (res.ok) {
47
+ const spec = await res.json();
48
+ if (isSpec(spec)) {
49
+ try {
50
+ mkdirSync(dirname(file), { recursive: true });
51
+ writeFileSync(file, JSON.stringify({ base_url: baseUrl, fetched_at: io.now(), spec }));
52
+ }
53
+ catch {
54
+ /* cache is optional */
55
+ }
56
+ return spec;
57
+ }
58
+ }
59
+ }
60
+ catch {
61
+ /* fall back */
62
+ }
63
+ return loadSnapshot();
64
+ }
65
+ export function deref(spec, schema) {
66
+ let s = schema ?? {};
67
+ for (let i = 0; i < 5 && typeof s.$ref === "string"; i++) {
68
+ const parts = s.$ref.replace(/^#\//, "").split("/");
69
+ let cur = spec;
70
+ for (const p of parts)
71
+ cur = cur?.[p];
72
+ s = cur ?? {};
73
+ }
74
+ return s;
75
+ }
76
+ export function opsFromSpec(spec) {
77
+ const ops = [];
78
+ const paths = (spec.paths ?? {});
79
+ for (const [path, item] of Object.entries(paths)) {
80
+ for (const method of ["get", "post"]) {
81
+ const o = item[method];
82
+ if (!o || typeof o.operationId !== "string")
83
+ continue;
84
+ const tag = String(o.tags?.[0] ?? "");
85
+ if (SKIP_TAGS.has(tag))
86
+ continue;
87
+ const params = (o.parameters ?? []).map((p) => ({
88
+ name: p.name,
89
+ in: p.in,
90
+ required: p.required === true,
91
+ description: typeof p.description === "string" ? p.description : "",
92
+ schema: deref(spec, p.schema),
93
+ }));
94
+ const body = deref(spec, o.requestBody?.content?.["application/json"]?.schema);
95
+ const props = {};
96
+ for (const [k, v] of Object.entries((body.properties ?? {})))
97
+ props[k] = deref(spec, v);
98
+ ops.push({
99
+ id: o.operationId,
100
+ method: method === "get" ? "GET" : "POST",
101
+ path,
102
+ summary: typeof o.summary === "string" ? o.summary : o.operationId,
103
+ description: typeof o.description === "string" ? o.description : "",
104
+ tag,
105
+ group: TAG_GROUP[tag] ?? "Other",
106
+ pathParams: params.filter((p) => p.in === "path"),
107
+ queryParams: params.filter((p) => p.in === "query"),
108
+ bodyProps: props,
109
+ bodyRequired: Array.isArray(body.required) ? body.required : [],
110
+ hasBody: o.requestBody !== undefined,
111
+ paid: method === "post" && "dry_run" in props,
112
+ });
113
+ }
114
+ }
115
+ return ops;
116
+ }
117
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/cli/spec.ts"],"names":[],"mappings":"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"}