ima2-gen 1.1.7 → 1.1.9
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/README.md +56 -27
- package/bin/commands/annotate.js +137 -0
- package/bin/commands/annotate.ts +118 -0
- package/bin/commands/cancel.js +37 -33
- package/bin/commands/cancel.ts +45 -0
- package/bin/commands/canvas-versions.js +91 -0
- package/bin/commands/canvas-versions.ts +80 -0
- package/bin/commands/cardnews.js +293 -0
- package/bin/commands/cardnews.ts +248 -0
- package/bin/commands/comfy.js +63 -0
- package/bin/commands/comfy.ts +54 -0
- package/bin/commands/config.js +270 -0
- package/bin/commands/config.ts +265 -0
- package/bin/commands/edit.js +97 -72
- package/bin/commands/edit.ts +116 -0
- package/bin/commands/gen.js +140 -118
- package/bin/commands/gen.ts +176 -0
- package/bin/commands/history.js +164 -0
- package/bin/commands/history.ts +145 -0
- package/bin/commands/ls.js +60 -42
- package/bin/commands/ls.ts +60 -0
- package/bin/commands/metadata.js +45 -0
- package/bin/commands/metadata.ts +36 -0
- package/bin/commands/multimode.js +159 -0
- package/bin/commands/multimode.ts +146 -0
- package/bin/commands/node.js +176 -0
- package/bin/commands/node.ts +157 -0
- package/bin/commands/observability.js +201 -0
- package/bin/commands/observability.ts +176 -0
- package/bin/commands/ping.js +26 -20
- package/bin/commands/ping.ts +29 -0
- package/bin/commands/prompt.js +506 -0
- package/bin/commands/prompt.ts +421 -0
- package/bin/commands/ps.js +78 -71
- package/bin/commands/ps.ts +78 -0
- package/bin/commands/session.js +308 -0
- package/bin/commands/session.ts +265 -0
- package/bin/commands/show.js +75 -40
- package/bin/commands/show.ts +69 -0
- package/bin/ima2.js +324 -310
- package/bin/ima2.ts +444 -0
- package/bin/lib/args.js +75 -66
- package/bin/lib/args.ts +73 -0
- package/bin/lib/browser-id.js +15 -0
- package/bin/lib/browser-id.ts +16 -0
- package/bin/lib/client.js +91 -83
- package/bin/lib/client.ts +109 -0
- package/bin/lib/error-hints.js +14 -17
- package/bin/lib/error-hints.ts +23 -0
- package/bin/lib/files.js +26 -28
- package/bin/lib/files.ts +39 -0
- package/bin/lib/output.js +44 -42
- package/bin/lib/output.ts +58 -0
- package/bin/lib/platform.js +60 -56
- package/bin/lib/platform.ts +97 -0
- package/bin/lib/sse.js +73 -0
- package/bin/lib/sse.ts +73 -0
- package/bin/lib/star-prompt.js +69 -76
- package/bin/lib/star-prompt.ts +97 -0
- package/bin/lib/storage-doctor.js +34 -35
- package/bin/lib/storage-doctor.ts +38 -0
- package/config.js +147 -190
- package/config.ts +331 -0
- package/docs/API.md +48 -8
- package/docs/CLI.md +190 -0
- package/docs/FAQ.ko.md +5 -5
- package/docs/FAQ.md +5 -5
- package/docs/README.ja.md +71 -25
- package/docs/README.ko.md +61 -24
- package/docs/README.zh-CN.md +73 -27
- package/lib/assetLifecycle.js +130 -130
- package/lib/assetLifecycle.ts +142 -0
- package/lib/canvasVersionStore.js +135 -153
- package/lib/canvasVersionStore.ts +181 -0
- package/lib/cardNewsGenerator.js +127 -142
- package/lib/cardNewsGenerator.ts +162 -0
- package/lib/cardNewsJobStore.js +78 -84
- package/lib/cardNewsJobStore.ts +107 -0
- package/lib/cardNewsManifestStore.js +88 -93
- package/lib/cardNewsManifestStore.ts +112 -0
- package/lib/cardNewsPlanner.js +157 -152
- package/lib/cardNewsPlanner.ts +180 -0
- package/lib/cardNewsPlannerClient.js +101 -98
- package/lib/cardNewsPlannerClient.ts +114 -0
- package/lib/cardNewsPlannerPrompt.js +56 -56
- package/lib/cardNewsPlannerPrompt.ts +60 -0
- package/lib/cardNewsPlannerSchema.js +231 -223
- package/lib/cardNewsPlannerSchema.ts +259 -0
- package/lib/cardNewsRoleTemplateStore.js +39 -41
- package/lib/cardNewsRoleTemplateStore.ts +47 -0
- package/lib/cardNewsTemplateStore.js +171 -175
- package/lib/cardNewsTemplateStore.ts +210 -0
- package/lib/codexDetect.js +44 -47
- package/lib/codexDetect.ts +69 -0
- package/lib/comfyBridge.js +164 -184
- package/lib/comfyBridge.ts +214 -0
- package/lib/db.js +41 -51
- package/lib/db.ts +166 -0
- package/lib/errorClassify.js +62 -78
- package/lib/errorClassify.ts +100 -0
- package/lib/generationErrors.js +140 -103
- package/lib/generationErrors.ts +125 -0
- package/lib/historyList.js +149 -147
- package/lib/historyList.ts +164 -0
- package/lib/imageMetadata.js +86 -89
- package/lib/imageMetadata.ts +111 -0
- package/lib/imageMetadataStore.js +46 -51
- package/lib/imageMetadataStore.ts +67 -0
- package/lib/imageModels.js +38 -45
- package/lib/imageModels.ts +52 -0
- package/lib/inflight.js +131 -150
- package/lib/inflight.ts +204 -0
- package/lib/localImportStore.js +105 -0
- package/lib/localImportStore.ts +111 -0
- package/lib/logger.js +105 -112
- package/lib/logger.ts +150 -0
- package/lib/nodeStore.js +65 -64
- package/lib/nodeStore.ts +81 -0
- package/lib/oauthLauncher.js +61 -59
- package/lib/oauthLauncher.ts +64 -0
- package/lib/oauthNormalize.js +15 -19
- package/lib/oauthNormalize.ts +30 -0
- package/lib/oauthProxy.js +834 -832
- package/lib/oauthProxy.ts +995 -0
- package/lib/openDirectory.js +41 -40
- package/lib/openDirectory.ts +45 -0
- package/lib/pngInfo.js +18 -20
- package/lib/pngInfo.ts +26 -0
- package/lib/promptImport/curatedSources.js +135 -0
- package/lib/promptImport/curatedSources.ts +139 -0
- package/lib/promptImport/discoveryRegistry.js +218 -0
- package/lib/promptImport/discoveryRegistry.ts +236 -0
- package/lib/promptImport/errors.js +10 -10
- package/lib/promptImport/errors.ts +18 -0
- package/lib/promptImport/githubDiscovery.js +238 -0
- package/lib/promptImport/githubDiscovery.ts +248 -0
- package/lib/promptImport/githubFolder.js +302 -0
- package/lib/promptImport/githubFolder.ts +308 -0
- package/lib/promptImport/githubSource.js +194 -171
- package/lib/promptImport/githubSource.ts +239 -0
- package/lib/promptImport/gptImageHints.js +61 -0
- package/lib/promptImport/gptImageHints.ts +68 -0
- package/lib/promptImport/parsePromptCandidates.js +110 -112
- package/lib/promptImport/parsePromptCandidates.ts +153 -0
- package/lib/promptImport/promptIndex.js +230 -0
- package/lib/promptImport/promptIndex.ts +248 -0
- package/lib/promptImport/rankPromptCandidates.js +52 -0
- package/lib/promptImport/rankPromptCandidates.ts +49 -0
- package/lib/providerOptions.js +31 -0
- package/lib/providerOptions.ts +41 -0
- package/lib/referenceImageCompress.js +51 -62
- package/lib/referenceImageCompress.ts +75 -0
- package/lib/refs.js +93 -81
- package/lib/refs.ts +117 -0
- package/lib/requestLogger.js +32 -38
- package/lib/requestLogger.ts +48 -0
- package/lib/responsesImageAdapter.js +351 -0
- package/lib/responsesImageAdapter.ts +352 -0
- package/lib/runtimePorts.js +71 -73
- package/lib/runtimePorts.ts +93 -0
- package/lib/sessionStore.js +179 -230
- package/lib/sessionStore.ts +272 -0
- package/lib/storageMigration.js +247 -245
- package/lib/storageMigration.ts +284 -0
- package/lib/styleSheet.js +86 -90
- package/lib/styleSheet.ts +128 -0
- package/lib/systemTrash.js +18 -0
- package/lib/systemTrash.ts +20 -0
- package/package.json +26 -10
- package/routes/annotations.js +76 -79
- package/routes/annotations.ts +95 -0
- package/routes/canvasVersions.js +50 -54
- package/routes/canvasVersions.ts +64 -0
- package/routes/cardNews.js +158 -171
- package/routes/cardNews.ts +183 -0
- package/routes/comfy.js +23 -31
- package/routes/comfy.ts +39 -0
- package/routes/edit.js +183 -214
- package/routes/edit.ts +230 -0
- package/routes/generate.js +269 -291
- package/routes/generate.ts +309 -0
- package/routes/health.js +102 -107
- package/routes/health.ts +114 -0
- package/routes/history.js +136 -144
- package/routes/history.ts +153 -0
- package/routes/imageImport.js +33 -0
- package/routes/imageImport.ts +33 -0
- package/routes/index.js +18 -16
- package/routes/index.ts +35 -0
- package/routes/metadata.js +60 -64
- package/routes/metadata.ts +71 -0
- package/routes/multimode.js +228 -263
- package/routes/multimode.ts +280 -0
- package/routes/nodes.js +378 -424
- package/routes/nodes.ts +455 -0
- package/routes/promptImport.js +291 -152
- package/routes/promptImport.ts +354 -0
- package/routes/prompts.js +333 -360
- package/routes/prompts.ts +379 -0
- package/routes/sessions.js +277 -285
- package/routes/sessions.ts +292 -0
- package/routes/storage.js +29 -31
- package/routes/storage.ts +39 -0
- package/server.js +189 -196
- package/server.ts +235 -0
- package/ui/dist/.vite/manifest.json +101 -0
- package/ui/dist/assets/CardNewsWorkspace-BJOCey7Z.js +2 -0
- package/ui/dist/assets/NodeCanvas-BZV40eAE.css +1 -0
- package/ui/dist/assets/NodeCanvas-C3dzYNsk.js +7 -0
- package/ui/dist/assets/PromptImportDialog-Dqu1VpUh.js +2 -0
- package/ui/dist/assets/PromptImportDiscoverySection-Dg8T9X0L.js +1 -0
- package/ui/dist/assets/PromptImportFolderSection-DBaqsFO4.js +1 -0
- package/ui/dist/assets/PromptLibraryPanel-p5QqR97M.js +2 -0
- package/ui/dist/assets/SettingsWorkspace-B5bSAZ6u.js +1 -0
- package/ui/dist/assets/index-C9cXwiWE.js +25 -0
- package/ui/dist/assets/index-CGMIkZXn.css +1 -0
- package/ui/dist/assets/index-Cvld7dUZ.js +1 -0
- package/ui/dist/index.html +6 -3
- package/assets/screenshot.png +0 -0
- package/assets/screenshots/classic-generate-light.png +0 -0
- package/assets/screenshots/node-graph-branching.png +0 -0
- package/assets/screenshots/settings-oauth-generation.png +0 -0
- package/assets/screenshots/settings-workspace.png +0 -0
- package/assets/screenshots/style-sheet-editor.png +0 -0
- package/integrations/comfyui/ima2_gen_bridge/__pycache__/__init__.cpython-313.pyc +0 -0
- package/integrations/comfyui/ima2_gen_bridge/__pycache__/nodes.cpython-313.pyc +0 -0
- package/ui/dist/assets/index-DARPdT4Q.css +0 -1
- package/ui/dist/assets/index-ht80GMq4.js +0 -31
- package/ui/dist/assets/index-ht80GMq4.js.map +0 -1
package/lib/nodeStore.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { writeFile, readFile, access, mkdir } from "fs/promises";
|
|
2
|
+
import { join, resolve, sep } from "path";
|
|
3
|
+
import { randomBytes } from "crypto";
|
|
4
|
+
import { config } from "../config.js";
|
|
5
|
+
import { embedImageMetadataBestEffort } from "./imageMetadataStore.js";
|
|
6
|
+
|
|
7
|
+
export function newNodeId() {
|
|
8
|
+
return "n_" + randomBytes(config.ids.nodeHexBytes).toString("hex");
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export async function saveNode(rootDir, { nodeId, b64, meta, ext = "png", generatedDir = config.storage.generatedDir }) {
|
|
12
|
+
void rootDir;
|
|
13
|
+
const filename = `${nodeId}.${ext}`;
|
|
14
|
+
await mkdir(generatedDir, { recursive: true });
|
|
15
|
+
const imageMeta = {
|
|
16
|
+
...meta,
|
|
17
|
+
kind: meta?.kind || "node",
|
|
18
|
+
nodeId: meta?.nodeId || nodeId,
|
|
19
|
+
format: meta?.format || ext,
|
|
20
|
+
};
|
|
21
|
+
const rawBuffer = Buffer.from(b64, "base64");
|
|
22
|
+
const embedded: any = await embedImageMetadataBestEffort(rawBuffer, ext, imageMeta);
|
|
23
|
+
if (!embedded.embedded) {
|
|
24
|
+
console.warn("[nodeStore] metadata embed skipped:", embedded.warning);
|
|
25
|
+
}
|
|
26
|
+
await writeFile(join(generatedDir, filename), embedded.buffer);
|
|
27
|
+
await writeFile(join(generatedDir, filename + ".json"), JSON.stringify(meta, null, 2));
|
|
28
|
+
return { filename };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export async function loadNodeB64(rootDir, filename, generatedDir = config.storage.generatedDir) {
|
|
32
|
+
const p = resolveGeneratedPath(rootDir, filename, generatedDir);
|
|
33
|
+
try { await access(p); } catch {
|
|
34
|
+
const err: any = new Error(`Node file not found: ${filename}`);
|
|
35
|
+
err.code = "NODE_NOT_FOUND";
|
|
36
|
+
err.status = 404;
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
const buf = await readFile(p);
|
|
40
|
+
return buf.toString("base64");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export async function loadNodeMeta(rootDir, nodeId, ext = "png", generatedDir = config.storage.generatedDir) {
|
|
44
|
+
void rootDir;
|
|
45
|
+
try {
|
|
46
|
+
return JSON.parse(await readFile(join(generatedDir, `${nodeId}.${ext}.json`), "utf-8"));
|
|
47
|
+
} catch {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export async function loadAssetB64(rootDir, externalSrc, generatedDir = config.storage.generatedDir) {
|
|
53
|
+
const p = resolveGeneratedPath(rootDir, externalSrc, generatedDir);
|
|
54
|
+
try { await access(p); } catch {
|
|
55
|
+
const err: any = new Error(`Asset file not found: ${externalSrc}`);
|
|
56
|
+
err.code = "NODE_NOT_FOUND";
|
|
57
|
+
err.status = 404;
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
const buf = await readFile(p);
|
|
61
|
+
return buf.toString("base64");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function resolveGeneratedPath(rootDir, relPath, generatedDir = config.storage.generatedDir) {
|
|
65
|
+
void rootDir;
|
|
66
|
+
if (typeof relPath !== "string" || relPath.length === 0) {
|
|
67
|
+
const err: any = new Error("Asset path is required");
|
|
68
|
+
err.code = "NODE_SOURCE_INVALID";
|
|
69
|
+
err.status = 400;
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
const baseDir = resolve(generatedDir);
|
|
73
|
+
const target = resolve(baseDir, relPath);
|
|
74
|
+
if (target !== baseDir && !target.startsWith(baseDir + sep)) {
|
|
75
|
+
const err: any = new Error(`Asset path escapes generated/: ${relPath}`);
|
|
76
|
+
err.code = "NODE_SOURCE_INVALID";
|
|
77
|
+
err.status = 400;
|
|
78
|
+
throw err;
|
|
79
|
+
}
|
|
80
|
+
return target;
|
|
81
|
+
}
|
package/lib/oauthLauncher.js
CHANGED
|
@@ -1,64 +1,66 @@
|
|
|
1
1
|
import { spawnBin } from "../bin/lib/platform.js";
|
|
2
2
|
import { config } from "../config.js";
|
|
3
3
|
import { parseLocalhostPortFromUrl, parseOAuthReadyUrl } from "./runtimePorts.js";
|
|
4
|
-
|
|
5
4
|
export function startOAuthProxy(options = {}) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
5
|
+
const oauthPort = options.oauthPort ?? config.oauth.proxyPort;
|
|
6
|
+
const restartDelayMs = options.restartDelayMs ?? config.oauth.restartDelayMs;
|
|
7
|
+
let currentChild = null;
|
|
8
|
+
let stopping = false;
|
|
9
|
+
let restartTimer = null;
|
|
10
|
+
const spawnProxy = () => {
|
|
11
|
+
console.log(`Starting openai-oauth on port ${oauthPort}...`);
|
|
12
|
+
const child = spawnBin("npx", ["openai-oauth", "--port", String(oauthPort)], {
|
|
13
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
14
|
+
env: { ...process.env },
|
|
15
|
+
});
|
|
16
|
+
currentChild = child;
|
|
17
|
+
child.stdout.on("data", (d) => {
|
|
18
|
+
const msg = d.toString().trim();
|
|
19
|
+
if (!msg)
|
|
20
|
+
return;
|
|
21
|
+
console.log(`[oauth] ${msg}`);
|
|
22
|
+
for (const line of msg.split(/\r?\n/)) {
|
|
23
|
+
const url = parseOAuthReadyUrl(line);
|
|
24
|
+
if (!url)
|
|
25
|
+
continue;
|
|
26
|
+
const port = parseLocalhostPortFromUrl(url);
|
|
27
|
+
if (port && port !== oauthPort) {
|
|
28
|
+
console.log(`[oauth] requested port ${oauthPort}, actual port ${port}`);
|
|
29
|
+
}
|
|
30
|
+
options.onReady?.({ url, port: port || oauthPort, requestedPort: oauthPort });
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
child.stderr.on("data", (d) => {
|
|
34
|
+
const msg = d.toString().trim();
|
|
35
|
+
if (msg && !msg.includes("npm warn"))
|
|
36
|
+
console.error(`[oauth] ${msg}`);
|
|
37
|
+
});
|
|
38
|
+
child.on("exit", (code) => {
|
|
39
|
+
if (currentChild === child)
|
|
40
|
+
currentChild = null;
|
|
41
|
+
if (stopping)
|
|
42
|
+
return;
|
|
43
|
+
options.onExit?.({ code });
|
|
44
|
+
console.log(`[oauth] exited with code ${code}, restarting in ${Math.round(restartDelayMs / 1000)}s...`);
|
|
45
|
+
restartTimer = setTimeout(spawnProxy, restartDelayMs);
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
spawnProxy();
|
|
49
|
+
return {
|
|
50
|
+
get child() {
|
|
51
|
+
return currentChild;
|
|
52
|
+
},
|
|
53
|
+
kill(signal = "SIGTERM") {
|
|
54
|
+
this.stop(signal);
|
|
55
|
+
},
|
|
56
|
+
stop(signal = "SIGTERM") {
|
|
57
|
+
stopping = true;
|
|
58
|
+
if (restartTimer)
|
|
59
|
+
clearTimeout(restartTimer);
|
|
60
|
+
try {
|
|
61
|
+
currentChild?.kill(signal);
|
|
62
|
+
}
|
|
63
|
+
catch { }
|
|
64
|
+
},
|
|
65
|
+
};
|
|
64
66
|
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { spawnBin } from "../bin/lib/platform.js";
|
|
2
|
+
import { config } from "../config.js";
|
|
3
|
+
import { parseLocalhostPortFromUrl, parseOAuthReadyUrl } from "./runtimePorts.js";
|
|
4
|
+
|
|
5
|
+
export function startOAuthProxy(options: any = {}) {
|
|
6
|
+
const oauthPort = options.oauthPort ?? config.oauth.proxyPort;
|
|
7
|
+
const restartDelayMs = options.restartDelayMs ?? config.oauth.restartDelayMs;
|
|
8
|
+
let currentChild = null;
|
|
9
|
+
let stopping = false;
|
|
10
|
+
let restartTimer = null;
|
|
11
|
+
|
|
12
|
+
const spawnProxy = () => {
|
|
13
|
+
console.log(`Starting openai-oauth on port ${oauthPort}...`);
|
|
14
|
+
const child = spawnBin("npx", ["openai-oauth", "--port", String(oauthPort)], {
|
|
15
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
16
|
+
env: { ...process.env },
|
|
17
|
+
});
|
|
18
|
+
currentChild = child;
|
|
19
|
+
|
|
20
|
+
child.stdout.on("data", (d) => {
|
|
21
|
+
const msg = d.toString().trim();
|
|
22
|
+
if (!msg) return;
|
|
23
|
+
console.log(`[oauth] ${msg}`);
|
|
24
|
+
for (const line of msg.split(/\r?\n/)) {
|
|
25
|
+
const url = parseOAuthReadyUrl(line);
|
|
26
|
+
if (!url) continue;
|
|
27
|
+
const port = parseLocalhostPortFromUrl(url);
|
|
28
|
+
if (port && port !== oauthPort) {
|
|
29
|
+
console.log(`[oauth] requested port ${oauthPort}, actual port ${port}`);
|
|
30
|
+
}
|
|
31
|
+
options.onReady?.({ url, port: port || oauthPort, requestedPort: oauthPort });
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
child.stderr.on("data", (d) => {
|
|
36
|
+
const msg = d.toString().trim();
|
|
37
|
+
if (msg && !msg.includes("npm warn")) console.error(`[oauth] ${msg}`);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
child.on("exit", (code) => {
|
|
41
|
+
if (currentChild === child) currentChild = null;
|
|
42
|
+
if (stopping) return;
|
|
43
|
+
options.onExit?.({ code });
|
|
44
|
+
console.log(`[oauth] exited with code ${code}, restarting in ${Math.round(restartDelayMs / 1000)}s...`);
|
|
45
|
+
restartTimer = setTimeout(spawnProxy, restartDelayMs);
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
spawnProxy();
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
get child() {
|
|
53
|
+
return currentChild;
|
|
54
|
+
},
|
|
55
|
+
kill(signal = "SIGTERM") {
|
|
56
|
+
this.stop(signal);
|
|
57
|
+
},
|
|
58
|
+
stop(signal = "SIGTERM") {
|
|
59
|
+
stopping = true;
|
|
60
|
+
if (restartTimer) clearTimeout(restartTimer);
|
|
61
|
+
try { currentChild?.kill(signal); } catch {}
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
package/lib/oauthNormalize.js
CHANGED
|
@@ -1,30 +1,26 @@
|
|
|
1
1
|
// 0.09.12.2 — Keep supported image tool qualities intact for OAuth.
|
|
2
2
|
// The exposed app contract accepts low/medium/high; normalize only malformed input so
|
|
3
3
|
// the API response, UI metadata, and actual image_generation payload stay aligned.
|
|
4
|
-
|
|
5
4
|
export const DEFAULT_IMAGE_QUALITY = "medium";
|
|
6
5
|
export const VALID_IMAGE_QUALITIES = new Set(["low", "medium", "high"]);
|
|
7
|
-
|
|
8
6
|
/**
|
|
9
7
|
* @param {{ provider?: string, quality?: string }} input
|
|
10
8
|
* @returns {{ quality: string, warnings: Array<{code:string,field:string,normalizedTo:string,reason:string}> }}
|
|
11
9
|
*/
|
|
12
10
|
export function normalizeOAuthParams(input) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
],
|
|
29
|
-
};
|
|
11
|
+
const requested = typeof input?.quality === "string" ? input.quality : DEFAULT_IMAGE_QUALITY;
|
|
12
|
+
if (VALID_IMAGE_QUALITIES.has(requested)) {
|
|
13
|
+
return { quality: requested, warnings: [] };
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
quality: DEFAULT_IMAGE_QUALITY,
|
|
17
|
+
warnings: [
|
|
18
|
+
{
|
|
19
|
+
code: "QUALITY_DEFAULTED",
|
|
20
|
+
field: "quality",
|
|
21
|
+
normalizedTo: DEFAULT_IMAGE_QUALITY,
|
|
22
|
+
reason: "invalid-quality",
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
};
|
|
30
26
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// 0.09.12.2 — Keep supported image tool qualities intact for OAuth.
|
|
2
|
+
// The exposed app contract accepts low/medium/high; normalize only malformed input so
|
|
3
|
+
// the API response, UI metadata, and actual image_generation payload stay aligned.
|
|
4
|
+
|
|
5
|
+
export const DEFAULT_IMAGE_QUALITY = "medium";
|
|
6
|
+
export const VALID_IMAGE_QUALITIES = new Set(["low", "medium", "high"]);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @param {{ provider?: string, quality?: string }} input
|
|
10
|
+
* @returns {{ quality: string, warnings: Array<{code:string,field:string,normalizedTo:string,reason:string}> }}
|
|
11
|
+
*/
|
|
12
|
+
export function normalizeOAuthParams(input) {
|
|
13
|
+
const requested = typeof input?.quality === "string" ? input.quality : DEFAULT_IMAGE_QUALITY;
|
|
14
|
+
|
|
15
|
+
if (VALID_IMAGE_QUALITIES.has(requested)) {
|
|
16
|
+
return { quality: requested, warnings: [] };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
quality: DEFAULT_IMAGE_QUALITY,
|
|
21
|
+
warnings: [
|
|
22
|
+
{
|
|
23
|
+
code: "QUALITY_DEFAULTED",
|
|
24
|
+
field: "quality",
|
|
25
|
+
normalizedTo: DEFAULT_IMAGE_QUALITY,
|
|
26
|
+
reason: "invalid-quality",
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
}
|