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.
- package/LICENSE +21 -0
- package/README.md +169 -2
- package/dist/cli/account.d.ts +19 -0
- package/dist/cli/account.js +250 -0
- package/dist/cli/account.js.map +1 -0
- package/dist/cli/args.d.ts +28 -0
- package/dist/cli/args.js +204 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/format.d.ts +10 -0
- package/dist/cli/format.js +80 -0
- package/dist/cli/format.js.map +1 -0
- package/dist/cli/io.d.ts +32 -0
- package/dist/cli/io.js +56 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.js +176 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/ops.d.ts +22 -0
- package/dist/cli/ops.js +367 -0
- package/dist/cli/ops.js.map +1 -0
- package/dist/cli/spec.d.ts +37 -0
- package/dist/cli/spec.js +117 -0
- package/dist/cli/spec.js.map +1 -0
- package/dist/cli/spec.json +4207 -0
- package/dist/cli/test-helpers.d.ts +32 -0
- package/dist/cli/test-helpers.js +70 -0
- package/dist/cli/test-helpers.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +9 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +116 -0
- package/dist/client.js +281 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +30 -0
- package/dist/config.js +71 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.js +23 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +208 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +11 -0
- package/dist/verify.js +43 -0
- package/dist/verify.js.map +1 -0
- package/package.json +56 -3
package/dist/cli/args.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { CliError } from "./io.js";
|
|
3
|
+
export function schemaType(s) {
|
|
4
|
+
if (typeof s.type === "string")
|
|
5
|
+
return s.type;
|
|
6
|
+
if (Array.isArray(s.type))
|
|
7
|
+
return s.type.find((t) => t !== "null");
|
|
8
|
+
for (const k of ["anyOf", "oneOf"]) {
|
|
9
|
+
const list = s[k];
|
|
10
|
+
if (Array.isArray(list)) {
|
|
11
|
+
for (const sub of list) {
|
|
12
|
+
const t = schemaType(sub);
|
|
13
|
+
if (t && t !== "null")
|
|
14
|
+
return t;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (Array.isArray(s.enum))
|
|
19
|
+
return "string";
|
|
20
|
+
if ("const" in s)
|
|
21
|
+
return typeof s.const;
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
export const flagName = (prop) => "--" + prop.replace(/_/g, "-");
|
|
25
|
+
/** "string", "integer", "a|b", "string[]", "json". */
|
|
26
|
+
export function describeType(s) {
|
|
27
|
+
if (Array.isArray(s.enum))
|
|
28
|
+
return s.enum.join("|");
|
|
29
|
+
const t = schemaType(s);
|
|
30
|
+
if (t === "array") {
|
|
31
|
+
const items = (s.items ?? {});
|
|
32
|
+
return schemaType(items) === "object" ? "json[]" : `${describeType(items)}[]`;
|
|
33
|
+
}
|
|
34
|
+
if (t === "object")
|
|
35
|
+
return "json";
|
|
36
|
+
return t ?? "value";
|
|
37
|
+
}
|
|
38
|
+
function fromJsonArg(raw, flag) {
|
|
39
|
+
const text = raw.startsWith("@") ? readAt(raw.slice(1), flag) : raw;
|
|
40
|
+
try {
|
|
41
|
+
return JSON.parse(text);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
throw new CliError(`${flag} needs JSON${raw.startsWith("@") ? ` (the file ${raw.slice(1)} is not valid JSON)` : ""}.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function readAt(path, flag) {
|
|
48
|
+
try {
|
|
49
|
+
return readFileSync(path, "utf8");
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new CliError(`${flag}: cannot read the file ${path}.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function scalar(s, raw, flag) {
|
|
56
|
+
const t = schemaType(s);
|
|
57
|
+
let v = raw;
|
|
58
|
+
if (t === "integer") {
|
|
59
|
+
if (!/^-?\d+$/.test(raw.trim()))
|
|
60
|
+
throw new CliError(`${flag} needs a whole number, not "${raw}".`);
|
|
61
|
+
v = Number(raw);
|
|
62
|
+
}
|
|
63
|
+
else if (t === "number") {
|
|
64
|
+
if (raw.trim() === "" || !Number.isFinite(Number(raw)))
|
|
65
|
+
throw new CliError(`${flag} needs a number, not "${raw}".`);
|
|
66
|
+
v = Number(raw);
|
|
67
|
+
}
|
|
68
|
+
else if (t === "boolean") {
|
|
69
|
+
if (/^(true|yes|1)$/i.test(raw))
|
|
70
|
+
v = true;
|
|
71
|
+
else if (/^(false|no|0)$/i.test(raw))
|
|
72
|
+
v = false;
|
|
73
|
+
else
|
|
74
|
+
throw new CliError(`${flag} needs true or false, not "${raw}".`);
|
|
75
|
+
}
|
|
76
|
+
if (Array.isArray(s.enum) && !s.enum.includes(v)) {
|
|
77
|
+
throw new CliError(`${flag} must be one of: ${s.enum.join(", ")} (not "${raw}").`);
|
|
78
|
+
}
|
|
79
|
+
return v;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Turn the raw values of one flag into the JSON value its schema wants.
|
|
83
|
+
* `raws` has one entry per time the flag was given.
|
|
84
|
+
*/
|
|
85
|
+
export function coerceFlag(s, raws, flag) {
|
|
86
|
+
const t = schemaType(s);
|
|
87
|
+
if (t === "array") {
|
|
88
|
+
const items = (s.items ?? {});
|
|
89
|
+
const out = [];
|
|
90
|
+
for (const raw of raws) {
|
|
91
|
+
const trimmed = raw.trim();
|
|
92
|
+
if (trimmed.startsWith("[") || trimmed.startsWith("@")) {
|
|
93
|
+
const v = fromJsonArg(trimmed, flag);
|
|
94
|
+
if (!Array.isArray(v))
|
|
95
|
+
throw new CliError(`${flag} needs a JSON list.`);
|
|
96
|
+
out.push(...v);
|
|
97
|
+
}
|
|
98
|
+
else if (schemaType(items) === "object") {
|
|
99
|
+
out.push(fromJsonArg(trimmed, flag));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
for (const part of trimmed.split(","))
|
|
103
|
+
if (part.trim() !== "")
|
|
104
|
+
out.push(scalar(items, part.trim(), flag));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return out;
|
|
108
|
+
}
|
|
109
|
+
const raw = raws[raws.length - 1] ?? "";
|
|
110
|
+
if (t === "object") {
|
|
111
|
+
const trimmed = raw.trim();
|
|
112
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("@"))
|
|
113
|
+
return fromJsonArg(trimmed, flag);
|
|
114
|
+
// name=value pairs for a map of strings, e.g. --pictures him=./a.jpg
|
|
115
|
+
const obj = {};
|
|
116
|
+
for (const r of raws) {
|
|
117
|
+
const i = r.indexOf("=");
|
|
118
|
+
if (i <= 0)
|
|
119
|
+
throw new CliError(`${flag} needs JSON, or name=value pairs.`);
|
|
120
|
+
obj[r.slice(0, i)] = r.slice(i + 1);
|
|
121
|
+
}
|
|
122
|
+
return obj;
|
|
123
|
+
}
|
|
124
|
+
if (t === undefined) {
|
|
125
|
+
try {
|
|
126
|
+
return JSON.parse(raw);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return raw;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return scalar(s, raw, flag);
|
|
133
|
+
}
|
|
134
|
+
const SHORT = { y: "yes", h: "help", v: "version" };
|
|
135
|
+
/**
|
|
136
|
+
* Split argv into positionals and flags. `known` says which flags exist and
|
|
137
|
+
* whether they take a value; anything else is an error.
|
|
138
|
+
*/
|
|
139
|
+
export function parseArgs(argv, known, helpHint) {
|
|
140
|
+
const positionals = [];
|
|
141
|
+
const flags = new Map();
|
|
142
|
+
const add = (k, v) => flags.set(k, [...(flags.get(k) ?? []), v]);
|
|
143
|
+
for (let i = 0; i < argv.length; i++) {
|
|
144
|
+
const tok = argv[i];
|
|
145
|
+
if (tok === "--") {
|
|
146
|
+
positionals.push(...argv.slice(i + 1));
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
let name;
|
|
150
|
+
let inline;
|
|
151
|
+
if (tok.startsWith("--")) {
|
|
152
|
+
const eq = tok.indexOf("=");
|
|
153
|
+
name = (eq === -1 ? tok.slice(2) : tok.slice(2, eq)).replace(/-/g, "_");
|
|
154
|
+
if (eq !== -1)
|
|
155
|
+
inline = tok.slice(eq + 1);
|
|
156
|
+
}
|
|
157
|
+
else if (/^-[a-z]$/i.test(tok) && SHORT[tok[1].toLowerCase()]) {
|
|
158
|
+
name = SHORT[tok[1].toLowerCase()];
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
positionals.push(tok);
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
let def = known.get(name);
|
|
165
|
+
let negated = false;
|
|
166
|
+
if (!def && name.startsWith("no_")) {
|
|
167
|
+
const base = known.get(name.slice(3));
|
|
168
|
+
if (base?.boolean) {
|
|
169
|
+
def = base;
|
|
170
|
+
negated = true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (!def)
|
|
174
|
+
throw new CliError(`Unknown flag --${name.replace(/_/g, "-")}. ${helpHint}`);
|
|
175
|
+
if (def.boolean) {
|
|
176
|
+
let v = negated ? "false" : "true";
|
|
177
|
+
if (inline !== undefined)
|
|
178
|
+
v = inline;
|
|
179
|
+
else if (!negated && argv[i + 1] !== undefined && /^(true|false)$/i.test(argv[i + 1]))
|
|
180
|
+
v = argv[++i];
|
|
181
|
+
add(def.name, v);
|
|
182
|
+
}
|
|
183
|
+
else if (inline !== undefined) {
|
|
184
|
+
add(def.name, inline);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const next = argv[i + 1];
|
|
188
|
+
if (next === undefined)
|
|
189
|
+
throw new CliError(`${flagName(def.name)} needs a value.`);
|
|
190
|
+
add(def.name, next);
|
|
191
|
+
i++;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return { positionals, flags };
|
|
195
|
+
}
|
|
196
|
+
export function flagBool(p, name) {
|
|
197
|
+
const v = p.flags.get(name);
|
|
198
|
+
return v !== undefined && /^(true|1|yes)$/i.test(v[v.length - 1]);
|
|
199
|
+
}
|
|
200
|
+
export function flagStr(p, name) {
|
|
201
|
+
const v = p.flags.get(name);
|
|
202
|
+
return v?.[v.length - 1];
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../src/cli/args.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** "✦ 1,240.00": always two decimals, like the app. */
|
|
2
|
+
export declare function credits(n: number | string): string;
|
|
3
|
+
export declare function errorLine(e: unknown): string;
|
|
4
|
+
export declare function wrap(text: string, width: number, indent: string): string;
|
|
5
|
+
/** Quote in credits from a make or dry-run answer. */
|
|
6
|
+
export declare function priceCredits(answer: unknown): number | undefined;
|
|
7
|
+
export declare function outputUrls(result: unknown): string[];
|
|
8
|
+
export declare function chargedCredits(result: unknown): number | undefined;
|
|
9
|
+
export declare function formatMe(me: unknown): string[];
|
|
10
|
+
export declare function formatResult(r: unknown): string[];
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { DiffusrError } from "../errors.js";
|
|
2
|
+
/** "✦ 1,240.00": always two decimals, like the app. */
|
|
3
|
+
export function credits(n) {
|
|
4
|
+
const v = typeof n === "string" ? Number(n) : n;
|
|
5
|
+
if (!Number.isFinite(v))
|
|
6
|
+
return `✦ ${String(n)}`;
|
|
7
|
+
return `✦ ${v.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;
|
|
8
|
+
}
|
|
9
|
+
export function errorLine(e) {
|
|
10
|
+
if (e instanceof DiffusrError) {
|
|
11
|
+
const bits = [e.code, e.requestId ? `request ${e.requestId}` : undefined].filter(Boolean).join(", ");
|
|
12
|
+
return `error: ${e.message} (${bits})`;
|
|
13
|
+
}
|
|
14
|
+
return `error: ${e instanceof Error ? e.message : String(e)}`;
|
|
15
|
+
}
|
|
16
|
+
export function wrap(text, width, indent) {
|
|
17
|
+
const lines = [];
|
|
18
|
+
for (const para of text.split(/\n+/)) {
|
|
19
|
+
let line = "";
|
|
20
|
+
for (const word of para.split(/\s+/).filter(Boolean)) {
|
|
21
|
+
if (line && (line + " " + word).length > width) {
|
|
22
|
+
lines.push(line);
|
|
23
|
+
line = word;
|
|
24
|
+
}
|
|
25
|
+
else
|
|
26
|
+
line = line ? line + " " + word : word;
|
|
27
|
+
}
|
|
28
|
+
if (line)
|
|
29
|
+
lines.push(line);
|
|
30
|
+
}
|
|
31
|
+
return lines.map((l, i) => (i === 0 ? l : indent + l)).join("\n");
|
|
32
|
+
}
|
|
33
|
+
const obj = (x) => (x && typeof x === "object" ? x : {});
|
|
34
|
+
/** Quote in credits from a make or dry-run answer. */
|
|
35
|
+
export function priceCredits(answer) {
|
|
36
|
+
const a = obj(answer);
|
|
37
|
+
const p = obj(a.price).credits;
|
|
38
|
+
if (typeof p === "number")
|
|
39
|
+
return p;
|
|
40
|
+
return typeof a.credits_estimated === "number" ? a.credits_estimated : undefined;
|
|
41
|
+
}
|
|
42
|
+
export function outputUrls(result) {
|
|
43
|
+
const r = obj(result);
|
|
44
|
+
const urls = [];
|
|
45
|
+
const one = obj(r.output).url;
|
|
46
|
+
if (typeof one === "string")
|
|
47
|
+
urls.push(one);
|
|
48
|
+
if (Array.isArray(r.outputs))
|
|
49
|
+
for (const o of r.outputs)
|
|
50
|
+
if (typeof obj(o).url === "string")
|
|
51
|
+
urls.push(obj(o).url);
|
|
52
|
+
return urls;
|
|
53
|
+
}
|
|
54
|
+
export function chargedCredits(result) {
|
|
55
|
+
const c = obj(obj(result).charge).charged_credits;
|
|
56
|
+
return typeof c === "number" ? c : undefined;
|
|
57
|
+
}
|
|
58
|
+
export function formatMe(me) {
|
|
59
|
+
const m = obj(me);
|
|
60
|
+
const key = obj(m.key);
|
|
61
|
+
const who = [String(m.email ?? "?"), `${key.mode ?? "?"} key "${key.name ?? "?"}"`].join(" · ");
|
|
62
|
+
const lines = [who];
|
|
63
|
+
if (m.balance_credits !== undefined)
|
|
64
|
+
lines.push(`Balance ${credits(m.balance_credits)}${m.wallet === "team" ? " (team wallet)" : ""}`);
|
|
65
|
+
return lines;
|
|
66
|
+
}
|
|
67
|
+
export function formatResult(r) {
|
|
68
|
+
const x = obj(r);
|
|
69
|
+
const lines = [`${x.id ?? "?"} ${x.status ?? "?"}${x.model ? ` ${x.model}` : ""}`];
|
|
70
|
+
for (const u of outputUrls(r))
|
|
71
|
+
lines.push(u);
|
|
72
|
+
const err = obj(x.error);
|
|
73
|
+
if (typeof err.message === "string")
|
|
74
|
+
lines.push(`error: ${err.message}`);
|
|
75
|
+
const ch = chargedCredits(r);
|
|
76
|
+
if (ch !== undefined)
|
|
77
|
+
lines.push(`Charged ${credits(ch)}`);
|
|
78
|
+
return lines;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/cli/format.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/io.d.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Everything the CLI touches in the outside world, so tests can swap it. */
|
|
2
|
+
export interface Io {
|
|
3
|
+
/** One line on stdout (a newline is added). */
|
|
4
|
+
out(line: string): void;
|
|
5
|
+
/** One line on stderr (a newline is added). */
|
|
6
|
+
err(line: string): void;
|
|
7
|
+
/** Raw text on stderr (progress). */
|
|
8
|
+
errRaw(text: string): void;
|
|
9
|
+
stdinIsTTY: boolean;
|
|
10
|
+
stdoutIsTTY: boolean;
|
|
11
|
+
stderrIsTTY: boolean;
|
|
12
|
+
ask(question: string): Promise<string>;
|
|
13
|
+
env: Record<string, string | undefined>;
|
|
14
|
+
platform: string;
|
|
15
|
+
hostname: string;
|
|
16
|
+
fetch: typeof fetch;
|
|
17
|
+
sleep(ms: number): Promise<void>;
|
|
18
|
+
now(): number;
|
|
19
|
+
openUrl(url: string): void;
|
|
20
|
+
/** Try the live openapi.json first. Default true. */
|
|
21
|
+
liveSpec: boolean;
|
|
22
|
+
/** First pause between result checks (ms). Default: the SDK's. */
|
|
23
|
+
pollIntervalMs?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class CliError extends Error {
|
|
26
|
+
readonly exitCode: number;
|
|
27
|
+
constructor(message: string, exitCode?: number);
|
|
28
|
+
}
|
|
29
|
+
export declare function openUrlDefault(url: string, platform?: string): void;
|
|
30
|
+
/** Skip the browser over SSH, or on Linux with no screen. */
|
|
31
|
+
export declare function shouldOpenBrowser(env: Record<string, string | undefined>, platform: string): boolean;
|
|
32
|
+
export declare function defaultIo(): Io;
|
package/dist/cli/io.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { hostname } from "node:os";
|
|
3
|
+
import { createInterface } from "node:readline";
|
|
4
|
+
export class CliError extends Error {
|
|
5
|
+
exitCode;
|
|
6
|
+
constructor(message, exitCode = 1) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.exitCode = exitCode;
|
|
9
|
+
this.name = "CliError";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export function openUrlDefault(url, platform = process.platform) {
|
|
13
|
+
try {
|
|
14
|
+
const [cmd, args] = platform === "darwin" ? ["open", [url]] : platform === "win32" ? ["cmd", ["/c", "start", "", url]] : ["xdg-open", [url]];
|
|
15
|
+
const child = spawn(cmd, args, { stdio: "ignore", detached: true });
|
|
16
|
+
child.on("error", () => { });
|
|
17
|
+
child.unref();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
/* ignore */
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Skip the browser over SSH, or on Linux with no screen. */
|
|
24
|
+
export function shouldOpenBrowser(env, platform) {
|
|
25
|
+
if (env.SSH_CONNECTION)
|
|
26
|
+
return false;
|
|
27
|
+
if (platform === "linux" && !env.DISPLAY && !env.WAYLAND_DISPLAY)
|
|
28
|
+
return false;
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
export function defaultIo() {
|
|
32
|
+
return {
|
|
33
|
+
out: (l) => void process.stdout.write(l + "\n"),
|
|
34
|
+
err: (l) => void process.stderr.write(l + "\n"),
|
|
35
|
+
errRaw: (t) => void process.stderr.write(t),
|
|
36
|
+
stdinIsTTY: Boolean(process.stdin.isTTY),
|
|
37
|
+
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
38
|
+
stderrIsTTY: Boolean(process.stderr.isTTY),
|
|
39
|
+
ask: (q) => new Promise((resolve) => {
|
|
40
|
+
const rl = createInterface({ input: process.stdin, output: process.stderr });
|
|
41
|
+
rl.question(q, (a) => {
|
|
42
|
+
rl.close();
|
|
43
|
+
resolve(a);
|
|
44
|
+
});
|
|
45
|
+
}),
|
|
46
|
+
env: process.env,
|
|
47
|
+
platform: process.platform,
|
|
48
|
+
hostname: hostname(),
|
|
49
|
+
fetch: (...a) => fetch(...a),
|
|
50
|
+
sleep: (ms) => new Promise((r) => setTimeout(r, ms)),
|
|
51
|
+
now: () => Date.now(),
|
|
52
|
+
openUrl: (u) => openUrlDefault(u),
|
|
53
|
+
liveSpec: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/cli/io.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AA2BhD,MAAM,OAAO,QAAS,SAAQ,KAAK;IAGtB;IAFX,YACE,OAAe,EACN,WAAW,CAAC;QAErB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFN,aAAQ,GAAR,QAAQ,CAAI;QAGrB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,WAAmB,OAAO,CAAC,QAAQ;IAC7E,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GACf,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3H,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACpE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,GAAuC,EAAE,QAAgB;IACzF,IAAI,GAAG,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,QAAQ,KAAK,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,eAAe;QAAE,OAAO,KAAK,CAAC;IAC/E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;QAC/C,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;QAC/C,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QACxC,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1C,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1C,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CACT,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACtB,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7E,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;gBACnB,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,CAAC,CAAC,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACJ,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,QAAQ,EAAE;QACpB,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5B,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACrB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;QACjC,QAAQ,EAAE,IAAI;KACf,CAAC;AACJ,CAAC"}
|
package/dist/cli/main.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { SDK_VERSION } from "../client.js";
|
|
2
|
+
import { DiffusrError } from "../errors.js";
|
|
3
|
+
import { flagBool, parseArgs } from "./args.js";
|
|
4
|
+
import { LOGIN_FLAGS, LOGOUT_FLAGS, WHOAMI_FLAGS, login, logout, makeClient, resolveAuth, whoami } from "./account.js";
|
|
5
|
+
import { errorLine } from "./format.js";
|
|
6
|
+
import { CliError, defaultIo } from "./io.js";
|
|
7
|
+
import { mainHelp, opFlagDefs, opHelp, runOp } from "./ops.js";
|
|
8
|
+
import { loadSpec, normalizeName, opsFromSpec } from "./spec.js";
|
|
9
|
+
const VALUE_FLAGS = new Set(["--base-url", "--key"]);
|
|
10
|
+
/** The index of the command word: the first token that is not a flag or a flag's value. */
|
|
11
|
+
function commandIndex(argv) {
|
|
12
|
+
for (let i = 0; i < argv.length; i++) {
|
|
13
|
+
const t = argv[i];
|
|
14
|
+
if (VALUE_FLAGS.has(t))
|
|
15
|
+
i++;
|
|
16
|
+
else if (!t.startsWith("-"))
|
|
17
|
+
return i;
|
|
18
|
+
}
|
|
19
|
+
return -1;
|
|
20
|
+
}
|
|
21
|
+
function scan(argv, flag) {
|
|
22
|
+
for (let i = 0; i < argv.length; i++) {
|
|
23
|
+
if (argv[i] === flag)
|
|
24
|
+
return argv[i + 1];
|
|
25
|
+
if (argv[i].startsWith(flag + "="))
|
|
26
|
+
return argv[i].slice(flag.length + 1);
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
const has = (argv, ...names) => argv.some((a) => names.includes(a));
|
|
31
|
+
/** Run the CLI. Returns the exit code. */
|
|
32
|
+
export async function runCli(argv, io = defaultIo()) {
|
|
33
|
+
try {
|
|
34
|
+
return await dispatch(argv, io);
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
if (e instanceof CliError) {
|
|
38
|
+
io.err(`error: ${e.message}`);
|
|
39
|
+
return e.exitCode;
|
|
40
|
+
}
|
|
41
|
+
io.err(errorLine(e));
|
|
42
|
+
if (e instanceof DiffusrError && e.status === 401)
|
|
43
|
+
io.err("Run `diffusr login` to connect, or check the key you passed.");
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async function dispatch(argv, io) {
|
|
48
|
+
let idx = commandIndex(argv);
|
|
49
|
+
if (idx === -1) {
|
|
50
|
+
if (has(argv, "--version", "-v")) {
|
|
51
|
+
io.out(`diffusr ${SDK_VERSION}`);
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
return help(io, argv, undefined);
|
|
55
|
+
}
|
|
56
|
+
const cmdWord = normalizeName(argv[idx]);
|
|
57
|
+
let rest = [...argv.slice(0, idx), ...argv.slice(idx + 1)];
|
|
58
|
+
let priceOnly = false;
|
|
59
|
+
if (cmdWord === "version") {
|
|
60
|
+
io.out(`diffusr ${SDK_VERSION}`);
|
|
61
|
+
return 0;
|
|
62
|
+
}
|
|
63
|
+
if (cmdWord === "help") {
|
|
64
|
+
const j = commandIndex(rest);
|
|
65
|
+
return help(io, rest, j === -1 ? undefined : normalizeName(rest[j]));
|
|
66
|
+
}
|
|
67
|
+
if (cmdWord === "login" || cmdWord === "logout" || cmdWord === "whoami") {
|
|
68
|
+
if (has(rest, "--version") && !has(rest, "--help", "-h")) {
|
|
69
|
+
io.out(`diffusr ${SDK_VERSION}`);
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
if (has(rest, "--help", "-h")) {
|
|
73
|
+
for (const l of accountHelp(cmdWord))
|
|
74
|
+
io.out(l);
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
const defs = cmdWord === "login" ? LOGIN_FLAGS : cmdWord === "logout" ? LOGOUT_FLAGS : WHOAMI_FLAGS;
|
|
78
|
+
const args = parseArgs(rest, defs, `Run diffusr ${cmdWord} --help.`);
|
|
79
|
+
if (args.positionals.length)
|
|
80
|
+
throw new CliError(`Unexpected "${args.positionals[0]}". Run diffusr ${cmdWord} --help.`);
|
|
81
|
+
return cmdWord === "login" ? login(io, args) : cmdWord === "logout" ? logout(io, args) : whoami(io, args);
|
|
82
|
+
}
|
|
83
|
+
let opWord = cmdWord;
|
|
84
|
+
if (cmdWord === "price") {
|
|
85
|
+
priceOnly = true;
|
|
86
|
+
idx = commandIndex(rest);
|
|
87
|
+
if (idx === -1) {
|
|
88
|
+
if (has(rest, "--help", "-h"))
|
|
89
|
+
return help(io, rest, undefined);
|
|
90
|
+
throw new CliError("Which command? Example: diffusr price make_video \"a can of sparkling water\"");
|
|
91
|
+
}
|
|
92
|
+
opWord = normalizeName(rest[idx]);
|
|
93
|
+
rest = [...rest.slice(0, idx), ...rest.slice(idx + 1)];
|
|
94
|
+
}
|
|
95
|
+
const keyFlag = scan(rest, "--key");
|
|
96
|
+
const baseFlag = scan(rest, "--base-url");
|
|
97
|
+
const early = resolveAuth(io, { positionals: [], flags: stubFlags(keyFlag, baseFlag) });
|
|
98
|
+
const ops = opsFromSpec(await loadSpec(io, early.baseUrl));
|
|
99
|
+
const op = ops.find((o) => normalizeName(o.id) === opWord);
|
|
100
|
+
if (!op) {
|
|
101
|
+
throw new CliError(`Unknown command "${argv[idx]}". Run diffusr help to see them.`);
|
|
102
|
+
}
|
|
103
|
+
if (priceOnly && !op.paid)
|
|
104
|
+
throw new CliError(`${op.id} is free: there is no price to check.`);
|
|
105
|
+
const args = parseArgs(rest, opFlagDefs(op), `Run diffusr ${op.id} --help.`);
|
|
106
|
+
if (flagBool(args, "help")) {
|
|
107
|
+
for (const l of opHelp(op))
|
|
108
|
+
io.out(l);
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
if (flagBool(args, "version")) {
|
|
112
|
+
io.out(`diffusr ${SDK_VERSION}`);
|
|
113
|
+
return 0;
|
|
114
|
+
}
|
|
115
|
+
const auth = resolveAuth(io, args);
|
|
116
|
+
const client = makeClient(io, auth);
|
|
117
|
+
return runOp(op, args, { io, client, json: flagBool(args, "json"), yes: flagBool(args, "yes"), noWait: flagBool(args, "no_wait"), priceOnly });
|
|
118
|
+
}
|
|
119
|
+
function stubFlags(key, base) {
|
|
120
|
+
const m = new Map();
|
|
121
|
+
if (key)
|
|
122
|
+
m.set("key", [key]);
|
|
123
|
+
if (base)
|
|
124
|
+
m.set("base_url", [base]);
|
|
125
|
+
return m;
|
|
126
|
+
}
|
|
127
|
+
async function help(io, rest, opWord) {
|
|
128
|
+
const early = resolveAuth(io, { positionals: [], flags: stubFlags(scan(rest, "--key"), scan(rest, "--base-url")) });
|
|
129
|
+
if (opWord && ["login", "logout", "whoami"].includes(opWord)) {
|
|
130
|
+
for (const l of accountHelp(opWord))
|
|
131
|
+
io.out(l);
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
const ops = opsFromSpec(await loadSpec(io, early.baseUrl));
|
|
135
|
+
if (opWord) {
|
|
136
|
+
const op = ops.find((o) => normalizeName(o.id) === (opWord === "price" ? "" : opWord));
|
|
137
|
+
if (op) {
|
|
138
|
+
for (const l of opHelp(op))
|
|
139
|
+
io.out(l);
|
|
140
|
+
return 0;
|
|
141
|
+
}
|
|
142
|
+
if (opWord !== "price")
|
|
143
|
+
throw new CliError(`Unknown command "${opWord}". Run diffusr help to see them.`);
|
|
144
|
+
}
|
|
145
|
+
for (const l of mainHelp(ops, SDK_VERSION))
|
|
146
|
+
io.out(l);
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
function accountHelp(cmd) {
|
|
150
|
+
if (cmd === "login") {
|
|
151
|
+
return [
|
|
152
|
+
"diffusr login — Connect this computer to your diffusr account",
|
|
153
|
+
"",
|
|
154
|
+
"Usage: diffusr login [--test] [--name <device name>] [--force]",
|
|
155
|
+
"",
|
|
156
|
+
"Shows a code and opens diffusr.ai in your browser. Press Yes, connect there.",
|
|
157
|
+
"The key is saved in a file only you can read (see the README for the path).",
|
|
158
|
+
"",
|
|
159
|
+
" --test Make a free test key instead of a live one.",
|
|
160
|
+
" --name <text> What to call this computer. Default: its host name.",
|
|
161
|
+
" --force Sign in again even though a key is saved.",
|
|
162
|
+
];
|
|
163
|
+
}
|
|
164
|
+
if (cmd === "logout") {
|
|
165
|
+
return [
|
|
166
|
+
"diffusr logout — Sign out and revoke the saved key",
|
|
167
|
+
"",
|
|
168
|
+
"Usage: diffusr logout [--revoke-env-key]",
|
|
169
|
+
"",
|
|
170
|
+
"Revokes the saved key and deletes the saved file. A key that only came from",
|
|
171
|
+
"DIFFUSR_KEY or --key is left alone unless you add --revoke-env-key.",
|
|
172
|
+
];
|
|
173
|
+
}
|
|
174
|
+
return ["diffusr whoami — Show who you are signed in as, and your balance", "", "Usage: diffusr whoami [--json]"];
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Diffusr } from "../client.js";
|
|
2
|
+
import type { FlagDef, ParsedArgs } from "./args.js";
|
|
3
|
+
import type { Io } from "./io.js";
|
|
4
|
+
import type { Op } from "./spec.js";
|
|
5
|
+
export declare const GLOBAL_FLAGS: readonly [readonly ["json", "Print only the JSON answer on stdout (for scripts and agents)."], readonly ["yes", "Go ahead and spend credits without asking. Short: -y."], readonly ["base-url", "The API address. Or set DIFFUSR_BASE_URL."], readonly ["key", "The API key to use. Or set DIFFUSR_KEY."], readonly ["help", "Show help. Short: -h."], readonly ["version", "Show the version."]];
|
|
6
|
+
/** What a command needs to run. */
|
|
7
|
+
export interface Ctx {
|
|
8
|
+
io: Io;
|
|
9
|
+
client: Diffusr;
|
|
10
|
+
json: boolean;
|
|
11
|
+
yes: boolean;
|
|
12
|
+
noWait: boolean;
|
|
13
|
+
/** Price check only: nothing is made. */
|
|
14
|
+
priceOnly: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function opFlagDefs(op: Op): Map<string, FlagDef>;
|
|
17
|
+
/** The body field a bare word fills: `prompt`, else `script`, `template`, else the first required string. */
|
|
18
|
+
export declare function primaryField(op: Op): string | undefined;
|
|
19
|
+
export declare function opUsage(op: Op): string;
|
|
20
|
+
export declare function opHelp(op: Op): string[];
|
|
21
|
+
export declare function mainHelp(ops: Op[], version: string): string[];
|
|
22
|
+
export declare function runOp(op: Op, args: ParsedArgs, ctx: Ctx): Promise<number>;
|