@seawork/server 1.0.2 → 1.0.7
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/scripts/supervisor-entrypoint.js +1 -1
- package/dist/scripts/supervisor-entrypoint.js.map +1 -1
- package/dist/server/server/agent/provider-manifest.js +5 -5
- package/dist/server/server/agent/provider-manifest.js.map +1 -1
- package/dist/server/server/agent/providers/claude/claude-models.d.ts +1 -1
- package/dist/server/server/agent/providers/claude/claude-models.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude/claude-models.js +3 -41
- package/dist/server/server/agent/providers/claude/claude-models.js.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/claude-agent.js +10 -26
- package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
- package/dist/server/server/agent/providers/codex-app-server-agent.js +24 -71
- package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
- package/dist/server/server/agent/providers/seawork-models.d.ts +4 -0
- package/dist/server/server/agent/providers/seawork-models.d.ts.map +1 -0
- package/dist/server/server/agent/providers/seawork-models.js +119 -0
- package/dist/server/server/agent/providers/seawork-models.js.map +1 -0
- package/dist/server/server/bootstrap.d.ts.map +1 -1
- package/dist/server/server/bootstrap.js +35 -1
- package/dist/server/server/bootstrap.js.map +1 -1
- package/dist/server/server/config.d.ts.map +1 -1
- package/dist/server/server/config.js +6 -1
- package/dist/server/server/config.js.map +1 -1
- package/dist/server/server/index.js +7 -0
- package/dist/server/server/index.js.map +1 -1
- package/dist/server/server/pid-lock.d.ts.map +1 -1
- package/dist/server/server/pid-lock.js +35 -2
- package/dist/server/server/pid-lock.js.map +1 -1
- package/dist/server/server/sac/auth.d.ts +41 -0
- package/dist/server/server/sac/auth.d.ts.map +1 -0
- package/dist/server/server/sac/auth.js +103 -0
- package/dist/server/server/sac/auth.js.map +1 -0
- package/dist/server/server/sac/client.d.ts +15 -0
- package/dist/server/server/sac/client.d.ts.map +1 -0
- package/dist/server/server/sac/client.js +70 -0
- package/dist/server/server/sac/client.js.map +1 -0
- package/dist/server/server/sac/download.d.ts +10 -0
- package/dist/server/server/sac/download.d.ts.map +1 -0
- package/dist/server/server/sac/download.js +67 -0
- package/dist/server/server/sac/download.js.map +1 -0
- package/dist/server/server/sac/endpoints.d.ts +13 -0
- package/dist/server/server/sac/endpoints.d.ts.map +1 -0
- package/dist/server/server/sac/endpoints.js +16 -0
- package/dist/server/server/sac/endpoints.js.map +1 -0
- package/dist/server/server/sac/errors.d.ts +39 -0
- package/dist/server/server/sac/errors.d.ts.map +1 -0
- package/dist/server/server/sac/errors.js +46 -0
- package/dist/server/server/sac/errors.js.map +1 -0
- package/dist/server/server/sac/generate.d.ts +35 -0
- package/dist/server/server/sac/generate.d.ts.map +1 -0
- package/dist/server/server/sac/generate.js +111 -0
- package/dist/server/server/sac/generate.js.map +1 -0
- package/dist/server/server/sac/index.d.ts +24 -0
- package/dist/server/server/sac/index.d.ts.map +1 -0
- package/dist/server/server/sac/index.js +26 -0
- package/dist/server/server/sac/index.js.map +1 -0
- package/dist/server/server/sac/output.d.ts +22 -0
- package/dist/server/server/sac/output.d.ts.map +1 -0
- package/dist/server/server/sac/output.js +142 -0
- package/dist/server/server/sac/output.js.map +1 -0
- package/dist/server/server/sac/poll.d.ts +12 -0
- package/dist/server/server/sac/poll.d.ts.map +1 -0
- package/dist/server/server/sac/poll.js +67 -0
- package/dist/server/server/sac/poll.js.map +1 -0
- package/dist/server/server/sac/providers/index.d.ts +19 -0
- package/dist/server/server/sac/providers/index.d.ts.map +1 -0
- package/dist/server/server/sac/providers/index.js +32 -0
- package/dist/server/server/sac/providers/index.js.map +1 -0
- package/dist/server/server/sac/providers/seaart.d.ts +7 -0
- package/dist/server/server/sac/providers/seaart.d.ts.map +1 -0
- package/dist/server/server/sac/providers/seaart.js +67 -0
- package/dist/server/server/sac/providers/seaart.js.map +1 -0
- package/dist/server/server/sac/providers/store.d.ts +8 -0
- package/dist/server/server/sac/providers/store.d.ts.map +1 -0
- package/dist/server/server/sac/providers/store.js +10 -0
- package/dist/server/server/sac/providers/store.js.map +1 -0
- package/dist/server/server/sac/providers/volces.d.ts +5 -0
- package/dist/server/server/sac/providers/volces.d.ts.map +1 -0
- package/dist/server/server/sac/providers/volces.js +88 -0
- package/dist/server/server/sac/providers/volces.js.map +1 -0
- package/dist/server/server/sac/types.d.ts +76 -0
- package/dist/server/server/sac/types.d.ts.map +1 -0
- package/dist/server/server/sac/types.js +5 -0
- package/dist/server/server/sac/types.js.map +1 -0
- package/dist/src/server/pid-lock.js +35 -2
- package/dist/src/server/pid-lock.js.map +1 -1
- package/package.json +10 -3
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC HTTP client
|
|
3
|
+
*/
|
|
4
|
+
import type { SACConfig } from "./types.js";
|
|
5
|
+
export interface RequestOpts {
|
|
6
|
+
url: string;
|
|
7
|
+
method?: string;
|
|
8
|
+
body?: unknown;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
timeout?: number;
|
|
11
|
+
noAuth?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function request(config: SACConfig, opts: RequestOpts, apiKey?: string): Promise<Response>;
|
|
14
|
+
export declare function requestJson<T>(config: SACConfig, opts: RequestOpts, apiKey?: string): Promise<T>;
|
|
15
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/server/sac/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,WAAW,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,QAAQ,CAAC,CAyEnB;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,WAAW,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,CAAC,CAAC,CAWZ"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC HTTP client
|
|
3
|
+
*/
|
|
4
|
+
import { SACError, ExitCode, mapApiError } from "./errors.js";
|
|
5
|
+
export async function request(config, opts, apiKey) {
|
|
6
|
+
const headers = {
|
|
7
|
+
"Content-Type": "application/json",
|
|
8
|
+
"User-Agent": "seawork-sac/1.0.0",
|
|
9
|
+
...opts.headers,
|
|
10
|
+
};
|
|
11
|
+
if (!opts.noAuth) {
|
|
12
|
+
const token = apiKey || config.apiKey;
|
|
13
|
+
if (!token) {
|
|
14
|
+
throw new SACError("No API key found.", ExitCode.AUTH, "Set env var: export SAC_API_KEY=<token>\nOr add to: ~/.seawork/auth.json");
|
|
15
|
+
}
|
|
16
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
17
|
+
if (config.verbose) {
|
|
18
|
+
process.stderr.write(`> ${opts.method ?? "GET"} ${opts.url}\n`);
|
|
19
|
+
process.stderr.write(`> Auth: ${token.slice(0, 8)}...\n`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const timeoutMs = (opts.timeout ?? config.timeout) * 1000;
|
|
23
|
+
let res;
|
|
24
|
+
try {
|
|
25
|
+
res = await fetch(opts.url, {
|
|
26
|
+
method: opts.method ?? "GET",
|
|
27
|
+
headers,
|
|
28
|
+
body: opts.body ? JSON.stringify(opts.body) : undefined,
|
|
29
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
if (err instanceof Error) {
|
|
34
|
+
if (err.name === "TimeoutError" || err.name === "AbortError") {
|
|
35
|
+
throw new SACError(`Request timed out after ${config.timeout}s`, ExitCode.TIMEOUT, "Try increasing --timeout or retry later.");
|
|
36
|
+
}
|
|
37
|
+
if (err.message.includes("ECONNREFUSED") ||
|
|
38
|
+
err.message.includes("ENOTFOUND") ||
|
|
39
|
+
err.message.includes("fetch failed")) {
|
|
40
|
+
throw new SACError(`Network error: ${err.message}`, ExitCode.NETWORK, "Check your network connection.");
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
if (config.verbose) {
|
|
46
|
+
process.stderr.write(`< ${res.status} ${res.statusText}\n`);
|
|
47
|
+
}
|
|
48
|
+
if (!res.ok) {
|
|
49
|
+
let body = {};
|
|
50
|
+
try {
|
|
51
|
+
body = (await res.json());
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
/* non-JSON */
|
|
55
|
+
}
|
|
56
|
+
throw mapApiError(res.status, body, opts.url);
|
|
57
|
+
}
|
|
58
|
+
return res;
|
|
59
|
+
}
|
|
60
|
+
export async function requestJson(config, opts, apiKey) {
|
|
61
|
+
const res = await request(config, opts, apiKey);
|
|
62
|
+
try {
|
|
63
|
+
return (await res.json());
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
const contentType = res.headers.get("content-type") || "";
|
|
67
|
+
throw new SACError(`API returned non-JSON response (${contentType || "unknown type"}). Server may be experiencing issues.`, ExitCode.GENERAL);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../src/server/sac/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC file download utilities
|
|
3
|
+
*/
|
|
4
|
+
export declare function downloadFile(url: string, destPath: string, opts?: {
|
|
5
|
+
quiet?: boolean;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
size: number;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function formatBytes(bytes: number): string;
|
|
10
|
+
//# sourceMappingURL=download.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../../src/server/sac/download.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAyD3B;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKjD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC file download utilities
|
|
3
|
+
*/
|
|
4
|
+
import { createWriteStream, unlinkSync } from "fs";
|
|
5
|
+
import { createProgressBar } from "./output.js";
|
|
6
|
+
import { SACError, ExitCode } from "./errors.js";
|
|
7
|
+
export async function downloadFile(url, destPath, opts) {
|
|
8
|
+
const res = await fetch(url);
|
|
9
|
+
if (!res.ok) {
|
|
10
|
+
throw new SACError(`Download failed: HTTP ${res.status}`, ExitCode.GENERAL);
|
|
11
|
+
}
|
|
12
|
+
const contentLength = Number(res.headers.get("content-length") || 0);
|
|
13
|
+
const reader = res.body?.getReader();
|
|
14
|
+
if (!reader)
|
|
15
|
+
throw new SACError("No response body", ExitCode.GENERAL);
|
|
16
|
+
const writer = createWriteStream(destPath);
|
|
17
|
+
const progress = contentLength > 0 && !opts?.quiet ? createProgressBar(contentLength, "Downloading") : null;
|
|
18
|
+
let received = 0;
|
|
19
|
+
let completed = false;
|
|
20
|
+
try {
|
|
21
|
+
const writeError = new Promise((_, reject) => {
|
|
22
|
+
writer.on("error", reject);
|
|
23
|
+
});
|
|
24
|
+
while (true) {
|
|
25
|
+
const { done, value } = (await Promise.race([
|
|
26
|
+
reader.read(),
|
|
27
|
+
writeError,
|
|
28
|
+
]));
|
|
29
|
+
if (done)
|
|
30
|
+
break;
|
|
31
|
+
const ok = writer.write(value);
|
|
32
|
+
if (!ok)
|
|
33
|
+
await new Promise((r) => writer.once("drain", r));
|
|
34
|
+
received += value.byteLength;
|
|
35
|
+
progress?.update(received);
|
|
36
|
+
}
|
|
37
|
+
completed = true;
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
reader.releaseLock();
|
|
41
|
+
progress?.finish();
|
|
42
|
+
await new Promise((resolve, reject) => {
|
|
43
|
+
writer.on("finish", resolve);
|
|
44
|
+
writer.on("error", reject);
|
|
45
|
+
writer.end();
|
|
46
|
+
});
|
|
47
|
+
if (!completed) {
|
|
48
|
+
try {
|
|
49
|
+
unlinkSync(destPath);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
/* best effort */
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return { size: received };
|
|
57
|
+
}
|
|
58
|
+
export function formatBytes(bytes) {
|
|
59
|
+
if (bytes < 1024)
|
|
60
|
+
return `${bytes} B`;
|
|
61
|
+
if (bytes < 1024 * 1024)
|
|
62
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
63
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
64
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
65
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../../../src/server/sac/download.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC API endpoints
|
|
3
|
+
*/
|
|
4
|
+
import type { SACConfig } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* POST /v1/generation - create a generation task
|
|
7
|
+
*/
|
|
8
|
+
export declare function generationEndpoint(config: SACConfig): string;
|
|
9
|
+
/**
|
|
10
|
+
* GET /v1/generation/task/{id} - query task status
|
|
11
|
+
*/
|
|
12
|
+
export declare function taskEndpoint(config: SACConfig, taskId: string): string;
|
|
13
|
+
//# sourceMappingURL=endpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../../../src/server/sac/endpoints.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEtE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC API endpoints
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* POST /v1/generation - create a generation task
|
|
6
|
+
*/
|
|
7
|
+
export function generationEndpoint(config) {
|
|
8
|
+
return `${config.multimodalBaseUrl}/v1/generation`;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* GET /v1/generation/task/{id} - query task status
|
|
12
|
+
*/
|
|
13
|
+
export function taskEndpoint(config, taskId) {
|
|
14
|
+
return `${config.multimodalBaseUrl}/v1/generation/task/${taskId}`;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../../../src/server/sac/endpoints.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,OAAO,GAAG,MAAM,CAAC,iBAAiB,gBAAgB,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAiB,EAAE,MAAc;IAC5D,OAAO,GAAG,MAAM,CAAC,iBAAiB,uBAAuB,MAAM,EAAE,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC error handling - Exit codes and error types
|
|
3
|
+
*/
|
|
4
|
+
export declare const ExitCode: {
|
|
5
|
+
readonly SUCCESS: 0;
|
|
6
|
+
readonly GENERAL: 1;
|
|
7
|
+
readonly USAGE: 2;
|
|
8
|
+
readonly AUTH: 3;
|
|
9
|
+
readonly QUOTA: 4;
|
|
10
|
+
readonly TIMEOUT: 5;
|
|
11
|
+
readonly NETWORK: 6;
|
|
12
|
+
readonly CONTENT_FILTER: 10;
|
|
13
|
+
};
|
|
14
|
+
export type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];
|
|
15
|
+
export declare class SACError extends Error {
|
|
16
|
+
readonly exitCode: ExitCode;
|
|
17
|
+
readonly hint?: string;
|
|
18
|
+
/** Optional task ID to surface when a poll/network failure interrupts a generation. */
|
|
19
|
+
taskId?: string;
|
|
20
|
+
constructor(message: string, exitCode?: ExitCode, hint?: string);
|
|
21
|
+
toJSON(): {
|
|
22
|
+
error: {
|
|
23
|
+
task_id?: string | undefined;
|
|
24
|
+
hint?: string | undefined;
|
|
25
|
+
code: ExitCode;
|
|
26
|
+
message: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface ApiErrorBody {
|
|
31
|
+
error?: {
|
|
32
|
+
message?: string;
|
|
33
|
+
code?: string | number;
|
|
34
|
+
};
|
|
35
|
+
message?: string;
|
|
36
|
+
code?: string | number;
|
|
37
|
+
}
|
|
38
|
+
export declare function mapApiError(status: number, body: ApiErrorBody, url?: string): SACError;
|
|
39
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../../src/server/sac/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;CASX,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEhE,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,uFAAuF;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC;gBAEJ,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,QAA2B,EAAE,IAAI,CAAC,EAAE,MAAM;IAOjF,MAAM;;;;;;;;CAUP;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KACxB,CAAC;IACF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,QAAQ,CA0BtF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC error handling - Exit codes and error types
|
|
3
|
+
*/
|
|
4
|
+
export const ExitCode = {
|
|
5
|
+
SUCCESS: 0,
|
|
6
|
+
GENERAL: 1,
|
|
7
|
+
USAGE: 2,
|
|
8
|
+
AUTH: 3,
|
|
9
|
+
QUOTA: 4,
|
|
10
|
+
TIMEOUT: 5,
|
|
11
|
+
NETWORK: 6,
|
|
12
|
+
CONTENT_FILTER: 10,
|
|
13
|
+
};
|
|
14
|
+
export class SACError extends Error {
|
|
15
|
+
constructor(message, exitCode = ExitCode.GENERAL, hint) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = "SACError";
|
|
18
|
+
this.exitCode = exitCode;
|
|
19
|
+
this.hint = hint;
|
|
20
|
+
}
|
|
21
|
+
toJSON() {
|
|
22
|
+
return {
|
|
23
|
+
error: {
|
|
24
|
+
code: this.exitCode,
|
|
25
|
+
message: this.message,
|
|
26
|
+
...(this.hint ? { hint: this.hint } : {}),
|
|
27
|
+
...(this.taskId ? { task_id: this.taskId } : {}),
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function mapApiError(status, body, url) {
|
|
33
|
+
const apiMsg = body.error?.message || body.message || `HTTP ${status}`;
|
|
34
|
+
const urlHint = url ? `\nURL: ${url}` : "";
|
|
35
|
+
if (status === 401 || status === 403) {
|
|
36
|
+
return new SACError(`Authentication failed (HTTP ${status}).${urlHint}`, ExitCode.AUTH, "Check status: seawork sac auth status\nRe-authenticate or set SAC_API_KEY environment variable");
|
|
37
|
+
}
|
|
38
|
+
if (status === 429) {
|
|
39
|
+
return new SACError(`Rate limit exceeded. ${apiMsg}`, ExitCode.QUOTA, "Please wait and retry.");
|
|
40
|
+
}
|
|
41
|
+
if (status === 408 || status === 504) {
|
|
42
|
+
return new SACError(`Request timed out (HTTP ${status}).`, ExitCode.TIMEOUT, "Try increasing --timeout or retry later.");
|
|
43
|
+
}
|
|
44
|
+
return new SACError(`API error: ${apiMsg} (HTTP ${status})${urlHint}`, ExitCode.GENERAL);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../../src/server/sac/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;IACV,cAAc,EAAE,EAAE;CACV,CAAC;AAIX,MAAM,OAAO,QAAS,SAAQ,KAAK;IAMjC,YAAY,OAAe,EAAE,WAAqB,QAAQ,CAAC,OAAO,EAAE,IAAa;QAC/E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM;QACJ,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC,QAAQ;gBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACjD;SACF,CAAC;IACJ,CAAC;CACF;AAWD,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,IAAkB,EAAE,GAAY;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,MAAM,EAAE,CAAC;IAEvE,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,QAAQ,CACjB,+BAA+B,MAAM,KAAK,OAAO,EAAE,EACnD,QAAQ,CAAC,IAAI,EACb,gGAAgG,CACjG,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,IAAI,QAAQ,CAAC,wBAAwB,MAAM,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;IAClG,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,QAAQ,CACjB,2BAA2B,MAAM,IAAI,EACrC,QAAQ,CAAC,OAAO,EAChB,0CAA0C,CAC3C,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,cAAc,MAAM,UAAU,MAAM,IAAI,OAAO,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC image generation core logic
|
|
3
|
+
*/
|
|
4
|
+
import type { SACConfig, GlobalFlags, TaskResponse } from "./types.js";
|
|
5
|
+
import { getProvider, allModels, modelsByProvider } from "./providers/index.js";
|
|
6
|
+
export { allModels, modelsByProvider, getProvider };
|
|
7
|
+
export interface GenerateImageOptions {
|
|
8
|
+
config: SACConfig;
|
|
9
|
+
flags: GlobalFlags;
|
|
10
|
+
apiKey?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface GenerateImageResult {
|
|
13
|
+
taskId: string;
|
|
14
|
+
status?: string;
|
|
15
|
+
urls?: string[];
|
|
16
|
+
saved?: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate images via SeaArt or Volces providers
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateImage(opts: GenerateImageOptions): Promise<GenerateImageResult>;
|
|
22
|
+
/**
|
|
23
|
+
* Query task status
|
|
24
|
+
*/
|
|
25
|
+
export declare function queryTask(config: SACConfig, taskId: string, opts?: {
|
|
26
|
+
wait?: boolean;
|
|
27
|
+
intervalSec?: number;
|
|
28
|
+
timeoutSec?: number;
|
|
29
|
+
apiKey?: string;
|
|
30
|
+
}): Promise<TaskResponse>;
|
|
31
|
+
/**
|
|
32
|
+
* Extract URLs from task response
|
|
33
|
+
*/
|
|
34
|
+
export declare function extractUrls(data: TaskResponse): string[];
|
|
35
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../../src/server/sac/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAA4B,YAAY,EAAE,MAAM,YAAY,CAAC;AAMjG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,WAAW,EAAE,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAqF5F;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;IACL,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,YAAY,CAAC,CAoBvB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,EAAE,CAQxD"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC image generation core logic
|
|
3
|
+
*/
|
|
4
|
+
import { existsSync, mkdirSync } from "fs";
|
|
5
|
+
import { join } from "path";
|
|
6
|
+
import { SACError, ExitCode } from "./errors.js";
|
|
7
|
+
import { requestJson } from "./client.js";
|
|
8
|
+
import { generationEndpoint } from "./endpoints.js";
|
|
9
|
+
import { pollTask } from "./poll.js";
|
|
10
|
+
import { downloadFile } from "./download.js";
|
|
11
|
+
import { getProvider, allModels, modelsByProvider } from "./providers/index.js";
|
|
12
|
+
export { allModels, modelsByProvider, getProvider };
|
|
13
|
+
/**
|
|
14
|
+
* Generate images via SeaArt or Volces providers
|
|
15
|
+
*/
|
|
16
|
+
export async function generateImage(opts) {
|
|
17
|
+
const { config, flags, apiKey } = opts;
|
|
18
|
+
const prompt = flags.prompt;
|
|
19
|
+
if (!prompt) {
|
|
20
|
+
throw new SACError("Prompt is required.", ExitCode.USAGE, "seawork sac image --prompt <text>");
|
|
21
|
+
}
|
|
22
|
+
const DEFAULT_MODEL = "sdxl";
|
|
23
|
+
const model = flags.model || config.defaultImageModel || DEFAULT_MODEL;
|
|
24
|
+
const providerDef = getProvider(model);
|
|
25
|
+
if (!providerDef) {
|
|
26
|
+
throw new SACError(`Unknown model "${model}". Run \`seawork sac models\` to see all options.`, ExitCode.USAGE);
|
|
27
|
+
}
|
|
28
|
+
const body = providerDef.buildBody(model, prompt, flags);
|
|
29
|
+
if (config.dryRun) {
|
|
30
|
+
return { taskId: "dry-run", status: "dry-run" };
|
|
31
|
+
}
|
|
32
|
+
const url = generationEndpoint(config);
|
|
33
|
+
if (!config.quiet) {
|
|
34
|
+
process.stderr.write(`[${providerDef.provider}/${model}]\n`);
|
|
35
|
+
}
|
|
36
|
+
const createResp = await requestJson(config, {
|
|
37
|
+
url,
|
|
38
|
+
method: "POST",
|
|
39
|
+
body,
|
|
40
|
+
}, apiKey);
|
|
41
|
+
const taskId = createResp.id;
|
|
42
|
+
if (!taskId) {
|
|
43
|
+
throw new SACError("No task ID returned from API.", ExitCode.GENERAL);
|
|
44
|
+
}
|
|
45
|
+
// Async mode - return immediately
|
|
46
|
+
if (flags.async || config.async) {
|
|
47
|
+
return { taskId, status: createResp.status };
|
|
48
|
+
}
|
|
49
|
+
// Poll until completion
|
|
50
|
+
const result = await pollTask(config, { taskId, apiKey });
|
|
51
|
+
const urls = [];
|
|
52
|
+
for (const out of result.output ?? []) {
|
|
53
|
+
for (const c of out.content ?? []) {
|
|
54
|
+
if (c.url)
|
|
55
|
+
urls.push(c.url);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (urls.length === 0) {
|
|
59
|
+
return { taskId, status: result.status };
|
|
60
|
+
}
|
|
61
|
+
// Download to disk if --out-dir specified
|
|
62
|
+
if (flags.outDir) {
|
|
63
|
+
const outDir = flags.outDir;
|
|
64
|
+
if (!existsSync(outDir))
|
|
65
|
+
mkdirSync(outDir, { recursive: true });
|
|
66
|
+
const prefix = flags.outPrefix || "image";
|
|
67
|
+
const saved = [];
|
|
68
|
+
for (let i = 0; i < urls.length; i++) {
|
|
69
|
+
const ext = urls[i].includes(".png") ? "png" : "webp";
|
|
70
|
+
const filename = `${prefix}_${String(i + 1).padStart(3, "0")}.${ext}`;
|
|
71
|
+
const destPath = join(outDir, filename);
|
|
72
|
+
await downloadFile(urls[i], destPath, { quiet: config.quiet });
|
|
73
|
+
saved.push(destPath);
|
|
74
|
+
}
|
|
75
|
+
return { taskId, saved };
|
|
76
|
+
}
|
|
77
|
+
return { taskId, urls };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Query task status
|
|
81
|
+
*/
|
|
82
|
+
export async function queryTask(config, taskId, opts) {
|
|
83
|
+
if (opts?.wait) {
|
|
84
|
+
return pollTask(config, {
|
|
85
|
+
taskId,
|
|
86
|
+
intervalSec: opts.intervalSec,
|
|
87
|
+
timeoutSec: opts.timeoutSec,
|
|
88
|
+
apiKey: opts.apiKey,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// Single-shot query
|
|
92
|
+
const { taskEndpoint } = await import("./endpoints.js");
|
|
93
|
+
return requestJson(config, {
|
|
94
|
+
url: taskEndpoint(config, taskId),
|
|
95
|
+
method: "GET",
|
|
96
|
+
}, opts?.apiKey);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Extract URLs from task response
|
|
100
|
+
*/
|
|
101
|
+
export function extractUrls(data) {
|
|
102
|
+
const urls = [];
|
|
103
|
+
for (const out of data.output ?? []) {
|
|
104
|
+
for (const c of out.content ?? []) {
|
|
105
|
+
if (c.url)
|
|
106
|
+
urls.push(c.url);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return urls;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../../src/server/sac/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC (SeaArt CLI) - Image generation module
|
|
3
|
+
*
|
|
4
|
+
* Core logic for image generation via SeaArt and Volces providers.
|
|
5
|
+
* Used by CLI commands and can be used programmatically.
|
|
6
|
+
*/
|
|
7
|
+
export type { SACConfig, GlobalFlags, TaskResponse, GenerationCreateResponse, ProviderDef, OutputFormat, } from "./types.js";
|
|
8
|
+
export { getSACApiKey, getSACBaseUrl, requireSACApiKey, loadAuthConfig, getAuthFilePath, } from "./auth.js";
|
|
9
|
+
export type { StoredAuth } from "./auth.js";
|
|
10
|
+
export { SACError, ExitCode, mapApiError } from "./errors.js";
|
|
11
|
+
export type { ApiErrorBody } from "./errors.js";
|
|
12
|
+
export { request, requestJson } from "./client.js";
|
|
13
|
+
export type { RequestOpts } from "./client.js";
|
|
14
|
+
export { generationEndpoint, taskEndpoint } from "./endpoints.js";
|
|
15
|
+
export { createSpinner, createProgressBar, detectOutputFormat, formatJson, formatText, formatOutput, } from "./output.js";
|
|
16
|
+
export type { Spinner, ProgressBar } from "./output.js";
|
|
17
|
+
export { pollTask } from "./poll.js";
|
|
18
|
+
export type { PollOptions } from "./poll.js";
|
|
19
|
+
export { downloadFile, formatBytes } from "./download.js";
|
|
20
|
+
export { generateImage, queryTask, extractUrls, allModels, modelsByProvider, getProvider, } from "./generate.js";
|
|
21
|
+
export type { GenerateImageOptions, GenerateImageResult } from "./generate.js";
|
|
22
|
+
export { SEAART_MODELS, DEFAULT_MODEL_VER } from "./providers/seaart.js";
|
|
23
|
+
export { VOLCES_MODELS } from "./providers/volces.js";
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/server/sac/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACZ,wBAAwB,EACxB,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGxD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAG7C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG1D,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAG/E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC (SeaArt CLI) - Image generation module
|
|
3
|
+
*
|
|
4
|
+
* Core logic for image generation via SeaArt and Volces providers.
|
|
5
|
+
* Used by CLI commands and can be used programmatically.
|
|
6
|
+
*/
|
|
7
|
+
// Auth
|
|
8
|
+
export { getSACApiKey, getSACBaseUrl, requireSACApiKey, loadAuthConfig, getAuthFilePath, } from "./auth.js";
|
|
9
|
+
// Errors
|
|
10
|
+
export { SACError, ExitCode, mapApiError } from "./errors.js";
|
|
11
|
+
// HTTP Client
|
|
12
|
+
export { request, requestJson } from "./client.js";
|
|
13
|
+
// Endpoints
|
|
14
|
+
export { generationEndpoint, taskEndpoint } from "./endpoints.js";
|
|
15
|
+
// Output formatting
|
|
16
|
+
export { createSpinner, createProgressBar, detectOutputFormat, formatJson, formatText, formatOutput, } from "./output.js";
|
|
17
|
+
// Task polling
|
|
18
|
+
export { pollTask } from "./poll.js";
|
|
19
|
+
// File download
|
|
20
|
+
export { downloadFile, formatBytes } from "./download.js";
|
|
21
|
+
// Image generation
|
|
22
|
+
export { generateImage, queryTask, extractUrls, allModels, modelsByProvider, getProvider, } from "./generate.js";
|
|
23
|
+
// Providers
|
|
24
|
+
export { SEAART_MODELS, DEFAULT_MODEL_VER } from "./providers/seaart.js";
|
|
25
|
+
export { VOLCES_MODELS } from "./providers/volces.js";
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/server/sac/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO;AACP,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,cAAc,EACd,eAAe,GAChB,MAAM,WAAW,CAAC;AAGnB,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG9D,cAAc;AACd,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGnD,YAAY;AACZ,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAElE,oBAAoB;AACpB,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,UAAU,EACV,YAAY,GACb,MAAM,aAAa,CAAC;AAGrB,eAAe;AACf,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE1D,mBAAmB;AACnB,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,WAAW,GACZ,MAAM,eAAe,CAAC;AAGvB,YAAY;AACZ,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SAC output formatting
|
|
3
|
+
*/
|
|
4
|
+
import type { OutputFormat } from "./types.js";
|
|
5
|
+
export interface Spinner {
|
|
6
|
+
start(): void;
|
|
7
|
+
update(text: string): void;
|
|
8
|
+
stop(finalText?: string): void;
|
|
9
|
+
}
|
|
10
|
+
export declare function createSpinner(label: string): Spinner;
|
|
11
|
+
export interface ProgressBar {
|
|
12
|
+
update(current: number): void;
|
|
13
|
+
finish(): void;
|
|
14
|
+
}
|
|
15
|
+
export declare function createProgressBar(total: number, label?: string): ProgressBar;
|
|
16
|
+
export declare function detectOutputFormat(flagValue?: string): OutputFormat;
|
|
17
|
+
export declare function formatJson(data: unknown): string;
|
|
18
|
+
export declare function formatKeyValue(obj: Record<string, unknown>, indent?: number): string;
|
|
19
|
+
export declare function formatText(data: unknown): string;
|
|
20
|
+
export declare function formatTable(rows: Record<string, unknown>[]): string;
|
|
21
|
+
export declare function formatOutput(data: unknown, format: OutputFormat): string;
|
|
22
|
+
//# sourceMappingURL=output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../../src/server/sac/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAe/C,MAAM,WAAW,OAAO;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CA8BpD;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,WAAW,CAkBxE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAInE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEhD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,SAAI,GAAG,MAAM,CA0B/E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAkBhD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAanE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAOxE"}
|