@kallfi/sdk 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/dist/client.js ADDED
@@ -0,0 +1,462 @@
1
+ import { KALLFI_OPERATIONS } from "./operations.js";
2
+ export class KallfiWorkspaceUnsupportedError extends Error {
3
+ code = "workspace_capability_unsupported";
4
+ constructor() { super("The server does not support explicit Account workspace selection"); this.name = "KallfiWorkspaceUnsupportedError"; }
5
+ }
6
+ export class KallfiNetworkError extends Error {
7
+ cause;
8
+ constructor(message, cause) {
9
+ super(message, { cause });
10
+ this.name = "KallfiNetworkError";
11
+ this.cause = cause;
12
+ }
13
+ }
14
+ export class KallfiTimeoutError extends KallfiNetworkError {
15
+ timeoutMs;
16
+ constructor(timeoutMs, cause) {
17
+ super(`Kallfi request timed out after ${timeoutMs}ms`, cause);
18
+ this.name = "KallfiTimeoutError";
19
+ this.timeoutMs = timeoutMs;
20
+ }
21
+ }
22
+ export class KallfiApiError extends Error {
23
+ status;
24
+ code;
25
+ request_id;
26
+ details;
27
+ retry_after;
28
+ constructor(options) {
29
+ super(options.message);
30
+ this.name = "KallfiApiError";
31
+ this.status = options.status;
32
+ this.code = options.code;
33
+ this.request_id = options.request_id;
34
+ this.details = options.details;
35
+ this.retry_after = options.retry_after;
36
+ }
37
+ get requestId() { return this.request_id; }
38
+ get retryAfter() { return this.retry_after; }
39
+ }
40
+ function rejectTraversal(value) {
41
+ let decoded = value;
42
+ for (let depth = 0; depth < 6; depth++) {
43
+ if (decoded.split(/[\\/]/).some(segment => segment === "." || segment === ".."))
44
+ throw new TypeError("Dot path segments are not allowed");
45
+ if (!/%[0-9a-f]{2}/i.test(decoded))
46
+ return;
47
+ let next;
48
+ try {
49
+ next = decodeURIComponent(decoded);
50
+ }
51
+ catch {
52
+ throw new TypeError("Path encoding is invalid");
53
+ }
54
+ if (next === decoded)
55
+ return;
56
+ decoded = next;
57
+ }
58
+ throw new TypeError("Nested path encoding is not allowed");
59
+ }
60
+ function encoded(value) {
61
+ if (typeof value !== "string" || !value || value.length > 2048)
62
+ throw new TypeError("Path identifier is invalid");
63
+ rejectTraversal(value);
64
+ return encodeURIComponent(value);
65
+ }
66
+ function mutationKey(options) {
67
+ const key = typeof options === "string" ? options : options.idempotencyKey;
68
+ return key?.trim() ? key : "";
69
+ }
70
+ export class Kallfi {
71
+ sourceAssets;
72
+ souls;
73
+ operations;
74
+ baseUrl;
75
+ apiKey;
76
+ fetcher;
77
+ timeoutMs;
78
+ workspaceId;
79
+ maxResponseBytes;
80
+ constructor(options) {
81
+ if (!options.apiKey?.trim())
82
+ throw new TypeError("apiKey is required");
83
+ this.apiKey = options.apiKey;
84
+ const knownOrigins = {
85
+ "https://acr.kallfi.com": "nsfw-disabled", "https://acr.kallfi.red": "nsfw-enabled",
86
+ "https://api.kallfi.com": "nsfw-disabled", "https://api.kallfi.red": "nsfw-enabled",
87
+ };
88
+ let supplied;
89
+ if (options.baseUrl !== undefined) {
90
+ try {
91
+ supplied = new URL(options.baseUrl);
92
+ }
93
+ catch {
94
+ throw new TypeError("baseUrl is invalid");
95
+ }
96
+ }
97
+ const surface = options.surface ?? (supplied ? knownOrigins[supplied.origin] : undefined) ?? "nsfw-disabled";
98
+ if (surface !== "nsfw-disabled" && surface !== "nsfw-enabled")
99
+ throw new TypeError("surface is invalid");
100
+ const expectedOrigin = surface === "nsfw-disabled" ? "https://acr.kallfi.com" : "https://acr.kallfi.red";
101
+ let base;
102
+ try {
103
+ base = new URL(options.baseUrl ?? expectedOrigin);
104
+ }
105
+ catch {
106
+ throw new TypeError("baseUrl is invalid");
107
+ }
108
+ if (knownOrigins[base.origin] !== surface || base.username || base.password || base.search || base.hash || !["", "/"].includes(base.pathname)) {
109
+ throw new TypeError("baseUrl must match the selected canonical surface");
110
+ }
111
+ this.baseUrl = base.origin;
112
+ if (options.workspaceId !== undefined && !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(options.workspaceId)) {
113
+ throw new TypeError("workspaceId must be a UUID");
114
+ }
115
+ this.workspaceId = options.workspaceId;
116
+ this.maxResponseBytes = options.maxResponseBytes ?? 2_097_152;
117
+ if (!Number.isSafeInteger(this.maxResponseBytes) || this.maxResponseBytes < 1 || this.maxResponseBytes > 16_777_216)
118
+ throw new TypeError("maxResponseBytes must be between 1 and 16777216");
119
+ this.fetcher = options.fetch ?? globalThis.fetch;
120
+ if (!this.fetcher)
121
+ throw new TypeError("A fetch implementation is required");
122
+ this.timeoutMs = options.timeoutMs ?? 30_000;
123
+ if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0)
124
+ throw new TypeError("timeoutMs must be positive");
125
+ this.sourceAssets = new SourceAssetsResource(this);
126
+ this.souls = new SoulsResource(this);
127
+ this.operations = new OperationsResource(this);
128
+ }
129
+ static fromEnv(options = {}) {
130
+ const apiKey = process.env.KALLFI_API_KEY;
131
+ if (!apiKey)
132
+ throw new TypeError("KALLFI_API_KEY is required");
133
+ return new Kallfi({ ...options, apiKey });
134
+ }
135
+ async operation(operationId, args = {}, options = {}) {
136
+ if (!Object.hasOwn(KALLFI_OPERATIONS, operationId))
137
+ throw new TypeError("Unknown operationId");
138
+ const operation = KALLFI_OPERATIONS[operationId];
139
+ if (operation.scope === "account" && this.workspaceId !== undefined)
140
+ throw new TypeError("Account operations do not accept a workspace selector");
141
+ if (Object.keys(args).some(key => !["path", "query", "body"].includes(key)))
142
+ throw new TypeError("Unknown operation argument");
143
+ const paths = args.path ?? {};
144
+ const query = args.query ?? {};
145
+ const pathParameters = operation.pathParameters;
146
+ const queryParameters = operation.queryParameters;
147
+ if (Object.keys(paths).some(key => !pathParameters.some(parameter => parameter.name === key)) ||
148
+ Object.keys(query).some(key => !queryParameters.some(parameter => parameter.name === key)))
149
+ throw new TypeError("Unknown path or query parameter");
150
+ let path = operation.path;
151
+ for (const parameter of pathParameters) {
152
+ const value = paths[parameter.name];
153
+ if (value === undefined) {
154
+ if (parameter.required)
155
+ throw new TypeError("Required path parameter is missing");
156
+ continue;
157
+ }
158
+ path = path.replace(`{${parameter.name}}`, encoded(value));
159
+ }
160
+ if (/\{[^}]+\}/.test(path))
161
+ throw new TypeError("Required path parameter is missing");
162
+ const params = new URLSearchParams();
163
+ for (const parameter of queryParameters) {
164
+ const value = query[parameter.name];
165
+ if (value === undefined) {
166
+ if (parameter.required)
167
+ throw new TypeError("Required query parameter is missing");
168
+ continue;
169
+ }
170
+ const values = Array.isArray(value) ? value : [value];
171
+ if (Array.isArray(value) && !parameter.array)
172
+ throw new TypeError("Query parameter is not an array");
173
+ for (const entry of values) {
174
+ if (!["string", "number", "boolean"].includes(typeof entry) || (typeof entry === "number" && !Number.isFinite(entry)))
175
+ throw new TypeError("Query parameter is invalid");
176
+ params.append(parameter.name, String(entry));
177
+ }
178
+ }
179
+ if (operation.bodyRequired && args.body === undefined)
180
+ throw new TypeError("Required request body is missing");
181
+ if (!operation.bodyAllowed && args.body !== undefined)
182
+ throw new TypeError("Operation does not accept a request body");
183
+ const suffix = params.toString();
184
+ return this.requestDetailed(operation.method, suffix ? `${path}?${suffix}` : path, { body: args.body,
185
+ idempotencyKey: options.idempotencyKey, signal: options.signal, timeoutMs: options.timeoutMs });
186
+ }
187
+ async request(method, path, body, idempotencyKey) {
188
+ return (await this.requestDetailed(method, path, { body, idempotencyKey })).data;
189
+ }
190
+ async requestDetailed(method, path, options = {}) {
191
+ if (this.workspaceId === undefined)
192
+ return this.performRequest(method, path, options, "business");
193
+ const timeoutMs = options.timeoutMs ?? this.timeoutMs;
194
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2_147_483_647)
195
+ throw new TypeError("timeoutMs is invalid");
196
+ const deadline = Date.now() + timeoutMs;
197
+ await this.requireWorkspaceCapability({ signal: options.signal, timeoutMs });
198
+ const remaining = deadline - Date.now();
199
+ if (remaining <= 0)
200
+ throw new KallfiTimeoutError(timeoutMs);
201
+ try {
202
+ return await this.performRequest(method, path, { ...options, timeoutMs: remaining }, "business");
203
+ }
204
+ catch (error) {
205
+ if (error instanceof KallfiTimeoutError)
206
+ throw new KallfiTimeoutError(timeoutMs);
207
+ throw error;
208
+ }
209
+ }
210
+ async requireWorkspaceCapability(options) {
211
+ try {
212
+ const response = await this.performRequest("GET", "/v1/capabilities", options, "capability");
213
+ const value = response.data;
214
+ if (response.status !== 200 || response.contentType !== "application/json" || !value || typeof value !== "object" || Array.isArray(value))
215
+ throw new KallfiWorkspaceUnsupportedError();
216
+ const record = value;
217
+ const fields = ["protocolVersion", "workspaceSelection", "selectorHeader", "omittedWorkspace", "explicitWorkspaceScopes", "accountOperationWorkspace"];
218
+ if (Object.keys(record).length !== fields.length || fields.some(key => !Object.hasOwn(record, key)) ||
219
+ record.protocolVersion !== 1 || record.workspaceSelection !== "account-principal-v1" ||
220
+ record.selectorHeader !== "X-Kallfi-Workspace-ID" || record.omittedWorkspace !== "personal" ||
221
+ record.accountOperationWorkspace !== "personal-only" || !Array.isArray(record.explicitWorkspaceScopes) ||
222
+ record.explicitWorkspaceScopes.length !== 1 || record.explicitWorkspaceScopes[0] !== "organization-runtime")
223
+ throw new KallfiWorkspaceUnsupportedError();
224
+ }
225
+ catch (error) {
226
+ if (error instanceof KallfiTimeoutError || options.signal?.aborted)
227
+ throw error;
228
+ throw new KallfiWorkspaceUnsupportedError();
229
+ }
230
+ }
231
+ async performRequest(method, path, options, purpose) {
232
+ const verb = method.toUpperCase();
233
+ if (!["GET", "HEAD", "POST", "PUT", "PATCH", "DELETE"].includes(verb))
234
+ throw new TypeError("method is invalid");
235
+ // Resolve only relative API paths: caller cannot redirect credentials or inject a selector header.
236
+ if (!path.startsWith("/v1/") || path.startsWith("//") || /[\\#\r\n]/.test(path))
237
+ throw new TypeError("path must be an API path");
238
+ rejectTraversal(path.split("?", 1)[0]);
239
+ const url = new URL(path, this.baseUrl);
240
+ if (url.origin !== this.baseUrl || !url.pathname.startsWith("/v1/"))
241
+ throw new TypeError("path is invalid");
242
+ const mutation = verb !== "GET" && verb !== "HEAD";
243
+ if (mutation && (!options.idempotencyKey?.trim() || options.idempotencyKey.length > 128 || /[\r\n]/.test(options.idempotencyKey)))
244
+ throw new TypeError("idempotencyKey is required for mutations");
245
+ const timeoutMs = options.timeoutMs ?? this.timeoutMs;
246
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2_147_483_647)
247
+ throw new TypeError("timeoutMs is invalid");
248
+ const controller = new AbortController();
249
+ let timedOut = false;
250
+ const abort = () => controller.abort();
251
+ options.signal?.addEventListener("abort", abort, { once: true });
252
+ if (options.signal?.aborted)
253
+ controller.abort();
254
+ const timer = setTimeout(() => { timedOut = true; controller.abort(); }, timeoutMs);
255
+ const headers = { Accept: "application/json" };
256
+ if (purpose === "business")
257
+ headers.Authorization = `Bearer ${this.apiKey}`;
258
+ if (purpose === "business" && this.workspaceId !== undefined)
259
+ headers["X-Kallfi-Workspace-ID"] = this.workspaceId;
260
+ const responseLimit = purpose === "capability" ? 4096 : this.maxResponseBytes;
261
+ if (mutation)
262
+ headers["Idempotency-Key"] = options.idempotencyKey;
263
+ if (options.body !== undefined)
264
+ headers["Content-Type"] = "application/json";
265
+ const aborted = () => timedOut ? new KallfiTimeoutError(timeoutMs) : new KallfiNetworkError("Kallfi request was aborted");
266
+ const withAbort = async (pending) => {
267
+ // Always attach Promise.race handlers, even if custom fetch synchronously aborted.
268
+ let rejectAbort;
269
+ const cancellation = new Promise((_resolve, reject) => {
270
+ rejectAbort = () => reject(aborted());
271
+ controller.signal.addEventListener("abort", rejectAbort, { once: true });
272
+ if (controller.signal.aborted)
273
+ rejectAbort();
274
+ });
275
+ try {
276
+ return await Promise.race([pending, cancellation]);
277
+ }
278
+ finally {
279
+ if (rejectAbort)
280
+ controller.signal.removeEventListener("abort", rejectAbort);
281
+ }
282
+ };
283
+ try {
284
+ if (controller.signal.aborted)
285
+ throw aborted();
286
+ const response = await withAbort(this.fetcher(url.toString(), { method: verb, headers,
287
+ body: options.body === undefined ? undefined : JSON.stringify(options.body), signal: controller.signal, redirect: "manual", cache: "no-store" }));
288
+ const token = (value) => value && /^[A-Za-z0-9._:-]{1,128}$/.test(value) ? value : undefined;
289
+ const requestId = token(response.headers.get("x-request-id"));
290
+ const retryRaw = response.headers.get("retry-after");
291
+ const retryAfter = retryRaw && (/^\d{1,10}$/.test(retryRaw) || (/^[A-Za-z]{3}, \d{2} [A-Za-z]{3} \d{4} \d{2}:\d{2}:\d{2} GMT$/.test(retryRaw) && Number.isFinite(Date.parse(retryRaw)))) ? retryRaw : undefined;
292
+ const contentType = response.headers.get("content-type")?.split(";", 1)[0]?.trim().toLowerCase();
293
+ let location;
294
+ const rawLocation = response.headers.get("location");
295
+ if (rawLocation && rawLocation.length <= 2048) {
296
+ try {
297
+ const target = new URL(rawLocation, this.baseUrl);
298
+ if (target.origin === this.baseUrl && target.pathname.startsWith("/v1/") && !target.search && !target.hash && !target.username && !target.password)
299
+ location = target.toString();
300
+ }
301
+ catch { /* no untrusted metadata */ }
302
+ }
303
+ const fail = (code) => new KallfiApiError({ status: response.status, code,
304
+ message: `Kallfi API request failed (${response.status})`, request_id: requestId, retry_after: retryAfter });
305
+ if (response.status >= 300 && response.status <= 399) {
306
+ void response.body?.cancel().catch(() => undefined);
307
+ throw fail("redirect_rejected");
308
+ }
309
+ if (response.status === 204 || verb === "HEAD") {
310
+ void response.body?.cancel().catch(() => undefined);
311
+ if (!response.ok)
312
+ throw fail("http_error");
313
+ return { status: response.status, data: undefined, requestId, retryAfter, location, contentType };
314
+ }
315
+ if (contentType !== "application/json" && !contentType?.endsWith("+json")) {
316
+ void response.body?.cancel().catch(() => undefined);
317
+ throw fail("non_json_response");
318
+ }
319
+ const declared = response.headers.get("content-length");
320
+ if (declared && /^\d+$/.test(declared) && Number(declared) > responseLimit) {
321
+ void response.body?.cancel().catch(() => undefined);
322
+ throw fail("response_too_large");
323
+ }
324
+ const reader = response.body?.getReader();
325
+ const chunks = [];
326
+ let bytes = 0;
327
+ if (reader) {
328
+ try {
329
+ for (;;) {
330
+ const part = await withAbort(reader.read());
331
+ if (part.done)
332
+ break;
333
+ bytes += part.value.byteLength;
334
+ if (bytes > responseLimit) {
335
+ void reader.cancel().catch(() => undefined);
336
+ throw fail("response_too_large");
337
+ }
338
+ chunks.push(part.value);
339
+ }
340
+ }
341
+ finally {
342
+ if (controller.signal.aborted)
343
+ void reader.cancel().catch(() => undefined);
344
+ reader.releaseLock();
345
+ }
346
+ }
347
+ const joined = new Uint8Array(bytes);
348
+ let offset = 0;
349
+ for (const chunk of chunks) {
350
+ joined.set(chunk, offset);
351
+ offset += chunk.byteLength;
352
+ }
353
+ let payload;
354
+ try {
355
+ payload = bytes ? JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(joined)) : undefined;
356
+ }
357
+ catch {
358
+ throw fail("invalid_json_response");
359
+ }
360
+ if (!response.ok) {
361
+ const envelope = payload && typeof payload === "object" && "error" in payload ? payload.error : undefined;
362
+ const value = envelope && typeof envelope === "object" ? envelope : undefined;
363
+ const code = typeof value?.code === "string" && /^[a-z][a-z0-9_]{0,95}$/.test(value.code) ? value.code : "http_error";
364
+ const id = typeof value?.request_id === "string" ? token(value.request_id) : requestId;
365
+ throw new KallfiApiError({ status: response.status, code, message: `Kallfi API request failed (${response.status})`, request_id: id, retry_after: retryAfter });
366
+ }
367
+ return { status: response.status, data: payload, requestId, retryAfter, location, contentType };
368
+ }
369
+ catch (error) {
370
+ if (error instanceof KallfiApiError || error instanceof KallfiNetworkError)
371
+ throw error;
372
+ if (controller.signal.aborted)
373
+ throw aborted();
374
+ throw new KallfiNetworkError("Kallfi request failed");
375
+ }
376
+ finally {
377
+ clearTimeout(timer);
378
+ options.signal?.removeEventListener("abort", abort);
379
+ }
380
+ }
381
+ }
382
+ export class SourceAssetsResource {
383
+ client;
384
+ constructor(client) {
385
+ this.client = client;
386
+ }
387
+ create(body, options) {
388
+ return this.client.request("POST", "/v1/soul-source-assets", body, mutationKey(options));
389
+ }
390
+ }
391
+ export class SoulsResource {
392
+ client;
393
+ constructor(client) {
394
+ this.client = client;
395
+ }
396
+ create(body, options) {
397
+ return this.client.request("POST", "/v1/souls", body, mutationKey(options));
398
+ }
399
+ retrieve(soulId) {
400
+ return this.client.request("GET", `/v1/souls/${encoded(soulId)}`);
401
+ }
402
+ update(soulId, body, options) {
403
+ return this.client.request("PATCH", `/v1/souls/${encoded(soulId)}`, body, mutationKey(options));
404
+ }
405
+ createResponse(soulId, body, options) {
406
+ return this.client.request("POST", `/v1/souls/${encoded(soulId)}/responses`, body, mutationKey(options));
407
+ }
408
+ createGeneration(soulId, body, options) {
409
+ return this.client.request("POST", `/v1/souls/${encoded(soulId)}/generations`, body, mutationKey(options));
410
+ }
411
+ }
412
+ export class OperationsResource {
413
+ client;
414
+ constructor(client) {
415
+ this.client = client;
416
+ }
417
+ retrieve(operationId) {
418
+ return this.client.request("GET", `/v1/operations/${encoded(operationId)}`);
419
+ }
420
+ async wait(operationId, options = {}) {
421
+ const timeoutMs = options.timeoutMs ?? 120_000;
422
+ const intervalMs = options.intervalMs ?? 2_000;
423
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0)
424
+ throw new TypeError("timeoutMs must be positive");
425
+ if (!Number.isFinite(intervalMs) || intervalMs < 100 || intervalMs > 30_000) {
426
+ throw new TypeError("intervalMs must be between 100 and 30000");
427
+ }
428
+ const deadline = Date.now() + timeoutMs;
429
+ const terminal = new Set(["succeeded", "failed", "canceled"]);
430
+ for (;;) {
431
+ if (options.signal?.aborted)
432
+ throw new KallfiNetworkError("Operation wait was aborted");
433
+ const budget = deadline - Date.now();
434
+ if (budget <= 0)
435
+ throw new KallfiTimeoutError(timeoutMs);
436
+ let operation;
437
+ try {
438
+ operation = (await this.client.requestDetailed("GET", `/v1/operations/${encoded(operationId)}`, { signal: options.signal, timeoutMs: budget })).data;
439
+ }
440
+ catch (error) {
441
+ if (error instanceof KallfiTimeoutError)
442
+ throw new KallfiTimeoutError(timeoutMs);
443
+ throw error;
444
+ }
445
+ if (Date.now() >= deadline)
446
+ throw new KallfiTimeoutError(timeoutMs);
447
+ if (terminal.has(operation.status))
448
+ return operation;
449
+ const remaining = deadline - Date.now();
450
+ await new Promise((resolve, reject) => {
451
+ let timer;
452
+ const cleanup = () => options.signal?.removeEventListener("abort", onAbort);
453
+ const onAbort = () => { clearTimeout(timer); cleanup(); reject(new KallfiNetworkError("Operation wait was aborted")); };
454
+ timer = setTimeout(() => { cleanup(); resolve(); }, Math.min(intervalMs, remaining));
455
+ options.signal?.addEventListener("abort", onAbort, { once: true });
456
+ if (options.signal?.aborted)
457
+ onAbort();
458
+ });
459
+ }
460
+ }
461
+ }
462
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}