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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Every non-2xx answer (and a few client-side failures) throws this. */
|
|
2
|
+
export declare class DiffusrError extends Error {
|
|
3
|
+
/** HTTP status; 0 when no answer came (network error, wait timeout). */
|
|
4
|
+
readonly status: number;
|
|
5
|
+
/** The API's machine code, e.g. `RATE_LIMITED`. Unknown codes are passed through. */
|
|
6
|
+
readonly code: string;
|
|
7
|
+
/** The `request_id` of the call: quote it to support. */
|
|
8
|
+
readonly requestId: string | undefined;
|
|
9
|
+
/** Seconds to wait before trying again, when the API said so. */
|
|
10
|
+
readonly retryAfter: number | undefined;
|
|
11
|
+
/** The whole JSON error body (extra fields such as `field`, `issues`, `budget`). */
|
|
12
|
+
readonly body: Record<string, unknown> | undefined;
|
|
13
|
+
constructor(init: {
|
|
14
|
+
status: number;
|
|
15
|
+
code: string;
|
|
16
|
+
message: string;
|
|
17
|
+
requestId?: string | undefined;
|
|
18
|
+
retryAfter?: number | undefined;
|
|
19
|
+
body?: Record<string, unknown> | undefined;
|
|
20
|
+
});
|
|
21
|
+
}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Every non-2xx answer (and a few client-side failures) throws this. */
|
|
2
|
+
export class DiffusrError extends Error {
|
|
3
|
+
/** HTTP status; 0 when no answer came (network error, wait timeout). */
|
|
4
|
+
status;
|
|
5
|
+
/** The API's machine code, e.g. `RATE_LIMITED`. Unknown codes are passed through. */
|
|
6
|
+
code;
|
|
7
|
+
/** The `request_id` of the call: quote it to support. */
|
|
8
|
+
requestId;
|
|
9
|
+
/** Seconds to wait before trying again, when the API said so. */
|
|
10
|
+
retryAfter;
|
|
11
|
+
/** The whole JSON error body (extra fields such as `field`, `issues`, `budget`). */
|
|
12
|
+
body;
|
|
13
|
+
constructor(init) {
|
|
14
|
+
super(init.message);
|
|
15
|
+
this.name = "DiffusrError";
|
|
16
|
+
this.status = init.status;
|
|
17
|
+
this.code = init.code;
|
|
18
|
+
this.requestId = init.requestId;
|
|
19
|
+
this.retryAfter = init.retryAfter;
|
|
20
|
+
this.body = init.body;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,wEAAwE;IAC/D,MAAM,CAAS;IACxB,qFAAqF;IAC5E,IAAI,CAAS;IACtB,yDAAyD;IAChD,SAAS,CAAqB;IACvC,iEAAiE;IACxD,UAAU,CAAqB;IACxC,oFAAoF;IAC3E,IAAI,CAAsC;IAEnD,YAAY,IAOX;QACC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { Diffusr, DEFAULT_BASE_URL } from "./client.js";
|
|
2
|
+
export type { DiffusrOptions, WaitOptions } from "./client.js";
|
|
3
|
+
export { DiffusrError } from "./errors.js";
|
|
4
|
+
export { verifyCallback, SIGNATURE_TOLERANCE_SEC } from "./verify.js";
|
|
5
|
+
export { TERMINAL_STATUSES } from "./types.js";
|
|
6
|
+
export type * from "./types.js";
|
|
7
|
+
export { configPath, readConfig, writeConfig, deleteConfig, resolveKey } from "./config.js";
|
|
8
|
+
export type { SavedConfig, KeySource } from "./config.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Diffusr, DEFAULT_BASE_URL } from "./client.js";
|
|
2
|
+
export { DiffusrError } from "./errors.js";
|
|
3
|
+
export { verifyCallback, SIGNATURE_TOLERANCE_SEC } from "./verify.js";
|
|
4
|
+
export { TERMINAL_STATUSES } from "./types.js";
|
|
5
|
+
export { configPath, readConfig, writeConfig, deleteConfig, resolveKey } from "./config.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
export type ResultStatus = "PENDING" | "RUNNING" | "SUCCEEDED" | "FAILED" | "CANCELED";
|
|
2
|
+
export declare const TERMINAL_STATUSES: readonly ResultStatus[];
|
|
3
|
+
export interface Price {
|
|
4
|
+
credits: number;
|
|
5
|
+
usd: string;
|
|
6
|
+
tariff: "direct" | "outcome";
|
|
7
|
+
tariff_version: string;
|
|
8
|
+
expires_at: string;
|
|
9
|
+
}
|
|
10
|
+
export interface Started {
|
|
11
|
+
id: string;
|
|
12
|
+
status: string;
|
|
13
|
+
credits_estimated: number;
|
|
14
|
+
idempotent_replay?: true;
|
|
15
|
+
test?: true;
|
|
16
|
+
price?: Price;
|
|
17
|
+
duration_sec?: number;
|
|
18
|
+
warnings?: string[];
|
|
19
|
+
next: string;
|
|
20
|
+
}
|
|
21
|
+
export interface DryRun {
|
|
22
|
+
dry_run: true;
|
|
23
|
+
test?: true;
|
|
24
|
+
credits_estimated: number;
|
|
25
|
+
price?: Price;
|
|
26
|
+
duration_sec?: number;
|
|
27
|
+
warnings?: string[];
|
|
28
|
+
note: string;
|
|
29
|
+
}
|
|
30
|
+
export interface Charge {
|
|
31
|
+
quoted_credits: number | null;
|
|
32
|
+
charged_credits: number;
|
|
33
|
+
final: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface ResultOutput {
|
|
36
|
+
kind: "IMAGE" | "VIDEO" | "AUDIO";
|
|
37
|
+
url: string;
|
|
38
|
+
thumbnail_url?: string;
|
|
39
|
+
width?: number;
|
|
40
|
+
height?: number;
|
|
41
|
+
duration_sec?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface Result {
|
|
44
|
+
id: string;
|
|
45
|
+
status: ResultStatus;
|
|
46
|
+
model: string;
|
|
47
|
+
credits_estimated?: number;
|
|
48
|
+
created_at: string;
|
|
49
|
+
finished_at?: string;
|
|
50
|
+
output?: ResultOutput;
|
|
51
|
+
error?: {
|
|
52
|
+
code: string;
|
|
53
|
+
message: string;
|
|
54
|
+
};
|
|
55
|
+
request_id?: string;
|
|
56
|
+
test?: true;
|
|
57
|
+
charge: Charge;
|
|
58
|
+
price?: Price;
|
|
59
|
+
next?: string;
|
|
60
|
+
}
|
|
61
|
+
export interface ResultList {
|
|
62
|
+
results: Result[];
|
|
63
|
+
}
|
|
64
|
+
export interface UploadTicket {
|
|
65
|
+
upload_url: string;
|
|
66
|
+
method: "PUT";
|
|
67
|
+
headers: {
|
|
68
|
+
"Content-Type": string;
|
|
69
|
+
};
|
|
70
|
+
file_url: string;
|
|
71
|
+
kind: string;
|
|
72
|
+
expires_in_sec: number;
|
|
73
|
+
curl: string;
|
|
74
|
+
next: string;
|
|
75
|
+
}
|
|
76
|
+
export interface UploadedFile {
|
|
77
|
+
file_url: string;
|
|
78
|
+
kind: string;
|
|
79
|
+
next: string;
|
|
80
|
+
}
|
|
81
|
+
export interface CallbackDelivery {
|
|
82
|
+
event_id: string;
|
|
83
|
+
type: string;
|
|
84
|
+
result_id: string;
|
|
85
|
+
url: string;
|
|
86
|
+
/** PENDING = will be tried (again), DELIVERED, FAILED. */
|
|
87
|
+
status: "PENDING" | "DELIVERED" | "FAILED";
|
|
88
|
+
attempts: number;
|
|
89
|
+
last_status_code?: number;
|
|
90
|
+
last_error?: string;
|
|
91
|
+
last_attempt_at?: string;
|
|
92
|
+
next_attempt_at?: string;
|
|
93
|
+
delivered_at?: string;
|
|
94
|
+
created_at: string;
|
|
95
|
+
test?: true;
|
|
96
|
+
}
|
|
97
|
+
export interface CallbackDeliveryList {
|
|
98
|
+
deliveries: CallbackDelivery[];
|
|
99
|
+
next_cursor?: string;
|
|
100
|
+
}
|
|
101
|
+
export interface CallbackSecret {
|
|
102
|
+
/** Starts with "whsec_". */
|
|
103
|
+
secret: string;
|
|
104
|
+
previous_valid_until?: string;
|
|
105
|
+
}
|
|
106
|
+
export interface ModelList {
|
|
107
|
+
models: Array<{
|
|
108
|
+
id: string;
|
|
109
|
+
[key: string]: unknown;
|
|
110
|
+
}>;
|
|
111
|
+
[key: string]: unknown;
|
|
112
|
+
}
|
|
113
|
+
export interface TemplateList {
|
|
114
|
+
templates: Array<{
|
|
115
|
+
id: string;
|
|
116
|
+
name: string;
|
|
117
|
+
kind: string;
|
|
118
|
+
about: string;
|
|
119
|
+
inputs: unknown[];
|
|
120
|
+
[key: string]: unknown;
|
|
121
|
+
}>;
|
|
122
|
+
[key: string]: unknown;
|
|
123
|
+
}
|
|
124
|
+
/** Fields every make call takes. Anything else the API documents passes through. */
|
|
125
|
+
export interface MakeBase {
|
|
126
|
+
dry_run?: boolean;
|
|
127
|
+
/** Also sent as the `Idempotency-Key` header. Leave out and the SDK makes one. */
|
|
128
|
+
idempotency_key?: string;
|
|
129
|
+
callback_url?: string;
|
|
130
|
+
[key: string]: unknown;
|
|
131
|
+
}
|
|
132
|
+
export interface MakeVideoBody extends MakeBase {
|
|
133
|
+
prompt: string;
|
|
134
|
+
image_urls?: string[];
|
|
135
|
+
audio_urls?: string[];
|
|
136
|
+
duration_sec?: number;
|
|
137
|
+
aspect_ratio?: string;
|
|
138
|
+
resolution?: string;
|
|
139
|
+
model?: string;
|
|
140
|
+
}
|
|
141
|
+
export interface MakeImageBody extends MakeBase {
|
|
142
|
+
prompt: string;
|
|
143
|
+
image_urls?: string[];
|
|
144
|
+
aspect_ratio?: string;
|
|
145
|
+
resolution?: string;
|
|
146
|
+
model?: string;
|
|
147
|
+
}
|
|
148
|
+
export interface EditImageBody extends MakeBase {
|
|
149
|
+
prompt: string;
|
|
150
|
+
image_urls: string[];
|
|
151
|
+
aspect_ratio?: string;
|
|
152
|
+
resolution?: string;
|
|
153
|
+
model?: string;
|
|
154
|
+
}
|
|
155
|
+
export interface RecastBody extends MakeBase {
|
|
156
|
+
video_url: string;
|
|
157
|
+
image_urls?: string[];
|
|
158
|
+
mode?: "world" | "swap";
|
|
159
|
+
prompt?: string;
|
|
160
|
+
aspect_ratio?: string;
|
|
161
|
+
resolution?: string;
|
|
162
|
+
model?: string;
|
|
163
|
+
}
|
|
164
|
+
export interface MakeMusicBody extends MakeBase {
|
|
165
|
+
prompt: string;
|
|
166
|
+
}
|
|
167
|
+
export interface CreatorVideoBody extends MakeBase {
|
|
168
|
+
creator_id: string;
|
|
169
|
+
script: string;
|
|
170
|
+
resolution?: string;
|
|
171
|
+
}
|
|
172
|
+
/** One flat body for every template kind; `listTemplates()` says which fields
|
|
173
|
+
each template takes. A field a template doesn't take is refused. */
|
|
174
|
+
export interface RunTemplateBody extends MakeBase {
|
|
175
|
+
/** The template's id, from `listTemplates()`. */
|
|
176
|
+
template: string;
|
|
177
|
+
/** Video templates: "remix" (default) or "recast". */
|
|
178
|
+
mode?: "remix" | "recast";
|
|
179
|
+
prompt?: string;
|
|
180
|
+
/** Video template remix: one picture per slot name. */
|
|
181
|
+
pictures?: Record<string, string>;
|
|
182
|
+
/** Video template recast: photos of who should appear. */
|
|
183
|
+
image_urls?: string[];
|
|
184
|
+
product_image_url?: string;
|
|
185
|
+
script?: string;
|
|
186
|
+
place?: string;
|
|
187
|
+
people?: Array<{
|
|
188
|
+
name: string;
|
|
189
|
+
image_url: string;
|
|
190
|
+
look?: string;
|
|
191
|
+
}>;
|
|
192
|
+
setup?: "selfie" | "propped" | "friend";
|
|
193
|
+
resolution?: "480p" | "720p";
|
|
194
|
+
}
|
|
195
|
+
/** A body with `dry_run: true` answers with the price; any other starts a job. */
|
|
196
|
+
export type MakeAnswer<B> = B extends {
|
|
197
|
+
dry_run: true;
|
|
198
|
+
} ? DryRun : Started;
|
|
199
|
+
export interface RequestOptions {
|
|
200
|
+
/** Abort the call (not retried). Combined with the timeout. */
|
|
201
|
+
signal?: AbortSignal;
|
|
202
|
+
/** Per-request timeout in ms for this call. Default: the client's (60 000). */
|
|
203
|
+
timeoutMs?: number;
|
|
204
|
+
}
|
|
205
|
+
export interface CallOptions extends RequestOptions {
|
|
206
|
+
/** Retry the same call with this key. Default: a fresh random one. */
|
|
207
|
+
idempotencyKey?: string;
|
|
208
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Response shapes of the diffusr REST API (v2). Hand-written so the package
|
|
2
|
+
// ships with no dependencies; the contract is packages/schema/src/api-v2*.ts.
|
|
3
|
+
// Bodies and answers are the API's own snake_case JSON.
|
|
4
|
+
export const TERMINAL_STATUSES = ["SUCCEEDED", "FAILED", "CANCELED"];
|
|
5
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8EAA8E;AAC9E,wDAAwD;AAGxD,MAAM,CAAC,MAAM,iBAAiB,GAA4B,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC"}
|
package/dist/verify.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const SIGNATURE_TOLERANCE_SEC = 300;
|
|
2
|
+
export type HeaderBag = Headers | Record<string, string | string[] | undefined>;
|
|
3
|
+
/**
|
|
4
|
+
* Check a diffusr callback (Standard Webhooks). `rawBody` must be the text
|
|
5
|
+
* exactly as received, before any JSON parsing. Returns false for a missing
|
|
6
|
+
* header, a bad or stale signature; never throws.
|
|
7
|
+
*/
|
|
8
|
+
export declare function verifyCallback(rawBody: string, headers: HeaderBag, secret: string, opts?: {
|
|
9
|
+
toleranceSec?: number;
|
|
10
|
+
nowSec?: number;
|
|
11
|
+
}): boolean;
|
package/dist/verify.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
+
export const SIGNATURE_TOLERANCE_SEC = 300;
|
|
3
|
+
function headerOf(headers, name) {
|
|
4
|
+
if (typeof Headers !== "undefined" && headers instanceof Headers)
|
|
5
|
+
return headers.get(name) ?? undefined;
|
|
6
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
7
|
+
if (k.toLowerCase() === name)
|
|
8
|
+
return Array.isArray(v) ? v.join(" ") : v;
|
|
9
|
+
}
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Check a diffusr callback (Standard Webhooks). `rawBody` must be the text
|
|
14
|
+
* exactly as received, before any JSON parsing. Returns false for a missing
|
|
15
|
+
* header, a bad or stale signature; never throws.
|
|
16
|
+
*/
|
|
17
|
+
export function verifyCallback(rawBody, headers, secret, opts = {}) {
|
|
18
|
+
try {
|
|
19
|
+
const id = headerOf(headers, "webhook-id");
|
|
20
|
+
const timestamp = headerOf(headers, "webhook-timestamp");
|
|
21
|
+
const signature = headerOf(headers, "webhook-signature");
|
|
22
|
+
if (!id || !timestamp || !signature || !/^\d+$/.test(timestamp))
|
|
23
|
+
return false;
|
|
24
|
+
const nowSec = opts.nowSec ?? Math.floor(Date.now() / 1000);
|
|
25
|
+
if (Math.abs(nowSec - Number(timestamp)) > (opts.toleranceSec ?? SIGNATURE_TOLERANCE_SEC))
|
|
26
|
+
return false;
|
|
27
|
+
const key = Buffer.from(secret.startsWith("whsec_") ? secret.slice(6) : secret, "base64");
|
|
28
|
+
const expected = createHmac("sha256", key).update(`${id}.${timestamp}.${rawBody}`).digest();
|
|
29
|
+
let ok = false;
|
|
30
|
+
for (const part of signature.split(" ")) {
|
|
31
|
+
if (!part.startsWith("v1,"))
|
|
32
|
+
continue;
|
|
33
|
+
const given = Buffer.from(part.slice(3), "base64");
|
|
34
|
+
if (given.length === expected.length && timingSafeEqual(given, expected))
|
|
35
|
+
ok = true;
|
|
36
|
+
}
|
|
37
|
+
return ok;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../src/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAI3C,SAAS,QAAQ,CAAC,OAAkB,EAAE,IAAY;IAChD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,YAAY,OAAO;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;IACxG,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAwD,CAAC,EAAE,CAAC;QAC9F,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,OAAkB,EAClB,MAAc,EACd,OAAmD,EAAE;IAErD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,uBAAuB,CAAC;YAAE,OAAO,KAAK,CAAC;QACxG,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1F,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5F,IAAI,EAAE,GAAG,KAAK,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,SAAS;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YACnD,IAAI,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC;gBAAE,EAAE,GAAG,IAAI,CAAC;QACtF,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,59 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "diffusr",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "The diffusr API client and command line: make videos, images and music from code or a terminal. Free price checks, idempotent starts, waitFor, signed callbacks.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"diffusr": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist",
|
|
19
|
+
"README.md",
|
|
20
|
+
"LICENSE"
|
|
21
|
+
],
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^26",
|
|
24
|
+
"typescript": "^5",
|
|
25
|
+
"vitest": "^3.2.7",
|
|
26
|
+
"@diffusr/schema": "0.1.0"
|
|
27
|
+
},
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=18"
|
|
32
|
+
},
|
|
33
|
+
"sideEffects": false,
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://github.com/jkrperson/diffusr.git",
|
|
37
|
+
"directory": "packages/sdk"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://diffusr.ai/docs",
|
|
40
|
+
"keywords": [
|
|
41
|
+
"diffusr",
|
|
42
|
+
"video",
|
|
43
|
+
"image",
|
|
44
|
+
"ai",
|
|
45
|
+
"api",
|
|
46
|
+
"sdk",
|
|
47
|
+
"cli"
|
|
48
|
+
],
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"scripts": {
|
|
53
|
+
"gen:spec": "tsx scripts/gen-spec.ts",
|
|
54
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json && mkdir -p dist/cli && cp src/cli/spec.json dist/cli/spec.json && chmod +x dist/cli.js",
|
|
55
|
+
"typecheck": "tsc --noEmit",
|
|
56
|
+
"test": "vitest run",
|
|
57
|
+
"pack:check": "node scripts/pack-check.mjs"
|
|
58
|
+
}
|
|
6
59
|
}
|