@ubnt/cawcut 0.1.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/config/developer-capabilities.json +36 -0
- package/config/products.json +45 -0
- package/dist/commands/app.d.ts +2 -0
- package/dist/commands/app.js +156 -0
- package/dist/commands/app.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +62 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/capabilities.d.ts +2 -0
- package/dist/commands/capabilities.js +83 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/generate.d.ts +2 -0
- package/dist/commands/generate.js +73 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/set.d.ts +2 -0
- package/dist/commands/set.js +25 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/task.d.ts +2 -0
- package/dist/commands/task.js +48 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/app-inputs.d.ts +17 -0
- package/dist/lib/app-inputs.js +191 -0
- package/dist/lib/app-inputs.js.map +1 -0
- package/dist/lib/assets.d.ts +16 -0
- package/dist/lib/assets.js +42 -0
- package/dist/lib/assets.js.map +1 -0
- package/dist/lib/capabilities.d.ts +6 -0
- package/dist/lib/capabilities.js +17 -0
- package/dist/lib/capabilities.js.map +1 -0
- package/dist/lib/capability-catalog.d.ts +56 -0
- package/dist/lib/capability-catalog.js +135 -0
- package/dist/lib/capability-catalog.js.map +1 -0
- package/dist/lib/capability-catalog.json +2743 -0
- package/dist/lib/config.d.ts +46 -0
- package/dist/lib/config.js +177 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/credentials.d.ts +11 -0
- package/dist/lib/credentials.js +47 -0
- package/dist/lib/credentials.js.map +1 -0
- package/dist/lib/developer.d.ts +36 -0
- package/dist/lib/developer.js +75 -0
- package/dist/lib/developer.js.map +1 -0
- package/dist/lib/download.d.ts +3 -0
- package/dist/lib/download.js +38 -0
- package/dist/lib/download.js.map +1 -0
- package/dist/lib/generate-request.d.ts +20 -0
- package/dist/lib/generate-request.js +74 -0
- package/dist/lib/generate-request.js.map +1 -0
- package/dist/lib/http.d.ts +16 -0
- package/dist/lib/http.js +90 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/local-config.d.ts +6 -0
- package/dist/lib/local-config.js +23 -0
- package/dist/lib/local-config.js.map +1 -0
- package/dist/lib/oauth.d.ts +25 -0
- package/dist/lib/oauth.js +141 -0
- package/dist/lib/oauth.js.map +1 -0
- package/dist/lib/output.d.ts +4 -0
- package/dist/lib/output.js +22 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/poll.d.ts +12 -0
- package/dist/lib/poll.js +26 -0
- package/dist/lib/poll.js.map +1 -0
- package/dist/lib/result-output.d.ts +18 -0
- package/dist/lib/result-output.js +82 -0
- package/dist/lib/result-output.js.map +1 -0
- package/dist/lib/spinner.d.ts +5 -0
- package/dist/lib/spinner.js +39 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/validate-generate.d.ts +21 -0
- package/dist/lib/validate-generate.js +191 -0
- package/dist/lib/validate-generate.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export declare const DEFAULT_ENV = "prd";
|
|
2
|
+
export interface ProductUrls {
|
|
3
|
+
portalBase: string;
|
|
4
|
+
userApiBase: string;
|
|
5
|
+
workflowApiBase: string;
|
|
6
|
+
consentPath: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ProductDefinition {
|
|
9
|
+
displayName: string;
|
|
10
|
+
cliName: string;
|
|
11
|
+
oauthEndpoint: string;
|
|
12
|
+
clientName: string;
|
|
13
|
+
credentialsDir: string;
|
|
14
|
+
defaultEnv?: string;
|
|
15
|
+
env: Record<string, ProductUrls>;
|
|
16
|
+
}
|
|
17
|
+
export interface ProductsFile {
|
|
18
|
+
products: Record<string, ProductDefinition>;
|
|
19
|
+
}
|
|
20
|
+
export interface ResolvedConfig {
|
|
21
|
+
productId: string;
|
|
22
|
+
product: ProductDefinition;
|
|
23
|
+
environment: string;
|
|
24
|
+
portalBase: string;
|
|
25
|
+
userApiBase: string;
|
|
26
|
+
workflowApiBase: string;
|
|
27
|
+
consentPath: string;
|
|
28
|
+
oauthEndpoint: string;
|
|
29
|
+
clientName: string;
|
|
30
|
+
credentialsPath: string;
|
|
31
|
+
/** True when any API base URL was overridden via env vars. */
|
|
32
|
+
customApi: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare function normalizeEnvName(raw: string | undefined): string | undefined;
|
|
35
|
+
export declare function listProductEnvironments(productId?: string): string[];
|
|
36
|
+
export declare function getProductDefinition(productId?: string): ProductDefinition;
|
|
37
|
+
export declare function loadConfig(options?: {
|
|
38
|
+
productId?: string;
|
|
39
|
+
environment?: string;
|
|
40
|
+
}): ResolvedConfig;
|
|
41
|
+
export declare function buildConsentUrl(config: ResolvedConfig, redirectUri: string): string;
|
|
42
|
+
export declare function exchangeUrl(config: ResolvedConfig): string;
|
|
43
|
+
export declare function refreshUrl(config: ResolvedConfig): string;
|
|
44
|
+
export declare function productsConfigPath(): string;
|
|
45
|
+
/** @internal test helper */
|
|
46
|
+
export declare function resetProductsCache(): void;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { localConfigPath } from "./local-config.js";
|
|
6
|
+
export const DEFAULT_ENV = "prd";
|
|
7
|
+
/** Legacy aliases accepted by CAWCUT_ENV for backward compatibility. */
|
|
8
|
+
const ENV_ALIASES = {
|
|
9
|
+
production: "prd",
|
|
10
|
+
playground: "local",
|
|
11
|
+
prd: "prd",
|
|
12
|
+
proto: "proto",
|
|
13
|
+
"cell-proto": "cell-proto",
|
|
14
|
+
local: "local",
|
|
15
|
+
};
|
|
16
|
+
const DEFAULT_PRODUCT_ID = "cawcut";
|
|
17
|
+
let productsCache;
|
|
18
|
+
function trimTrailingSlash(url) {
|
|
19
|
+
return url.replace(/\/+$/, "");
|
|
20
|
+
}
|
|
21
|
+
function loadProductsFile() {
|
|
22
|
+
if (productsCache) {
|
|
23
|
+
return productsCache;
|
|
24
|
+
}
|
|
25
|
+
const path = fileURLToPath(new URL("../../config/products.json", import.meta.url));
|
|
26
|
+
const raw = readFileSync(path, "utf8");
|
|
27
|
+
const parsed = JSON.parse(raw);
|
|
28
|
+
productsCache = parsed.products;
|
|
29
|
+
return productsCache;
|
|
30
|
+
}
|
|
31
|
+
export function normalizeEnvName(raw) {
|
|
32
|
+
if (!raw) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
const key = raw.trim().toLowerCase();
|
|
36
|
+
return ENV_ALIASES[key] ?? key;
|
|
37
|
+
}
|
|
38
|
+
export function listProductEnvironments(productId = DEFAULT_PRODUCT_ID) {
|
|
39
|
+
const product = getProductDefinition(productId);
|
|
40
|
+
return Object.keys(product.env);
|
|
41
|
+
}
|
|
42
|
+
function defaultEnvFor(product) {
|
|
43
|
+
const candidate = normalizeEnvName(product.defaultEnv) ?? DEFAULT_ENV;
|
|
44
|
+
if (product.env[candidate]) {
|
|
45
|
+
return candidate;
|
|
46
|
+
}
|
|
47
|
+
if (product.env[DEFAULT_ENV]) {
|
|
48
|
+
return DEFAULT_ENV;
|
|
49
|
+
}
|
|
50
|
+
return Object.keys(product.env)[0];
|
|
51
|
+
}
|
|
52
|
+
function hasCustomApiOverride() {
|
|
53
|
+
return Boolean(process.env.CAWCUT_API_BASE?.trim() ||
|
|
54
|
+
process.env.CAWCUT_USER_API_BASE?.trim() ||
|
|
55
|
+
process.env.CAWCUT_PORTAL_BASE?.trim());
|
|
56
|
+
}
|
|
57
|
+
function resolveEnvironment(product, overrides) {
|
|
58
|
+
const explicit = normalizeEnvName(process.env.CAWCUT_ENV);
|
|
59
|
+
if (explicit) {
|
|
60
|
+
if (!product.env[explicit]) {
|
|
61
|
+
throw new Error(`Unknown CAWCUT_ENV="${process.env.CAWCUT_ENV}". ` +
|
|
62
|
+
`Valid values: ${Object.keys(product.env).join(", ")}`);
|
|
63
|
+
}
|
|
64
|
+
return explicit;
|
|
65
|
+
}
|
|
66
|
+
const hints = [
|
|
67
|
+
overrides.apiBase,
|
|
68
|
+
overrides.userApiBase,
|
|
69
|
+
overrides.portalBase,
|
|
70
|
+
process.env.CAWCUT_API_BASE,
|
|
71
|
+
process.env.CAWCUT_USER_API_BASE,
|
|
72
|
+
process.env.CAWCUT_PORTAL_BASE,
|
|
73
|
+
]
|
|
74
|
+
.filter(Boolean)
|
|
75
|
+
.join(" ");
|
|
76
|
+
if (/localhost|127\.0\.0\.1/.test(hints) && product.env.local) {
|
|
77
|
+
return "local";
|
|
78
|
+
}
|
|
79
|
+
const saved = normalizeEnvName(readLocalEnv(product));
|
|
80
|
+
if (saved && product.env[saved]) {
|
|
81
|
+
return saved;
|
|
82
|
+
}
|
|
83
|
+
return defaultEnvFor(product);
|
|
84
|
+
}
|
|
85
|
+
function defaultCredentialsPath(product) {
|
|
86
|
+
return join(homedir(), product.credentialsDir, "credentials.json");
|
|
87
|
+
}
|
|
88
|
+
function readLocalEnv(product) {
|
|
89
|
+
try {
|
|
90
|
+
const path = process.env.CAWCUT_CONFIG_PATH?.trim() || localConfigPath(product.credentialsDir);
|
|
91
|
+
const raw = readFileSync(path, "utf8");
|
|
92
|
+
const parsed = JSON.parse(raw);
|
|
93
|
+
return typeof parsed.env === "string" ? parsed.env : undefined;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export function getProductDefinition(productId = DEFAULT_PRODUCT_ID) {
|
|
100
|
+
const product = loadProductsFile()[productId];
|
|
101
|
+
if (!product) {
|
|
102
|
+
throw new Error(`Unknown product "${productId}". Known: ${Object.keys(loadProductsFile()).join(", ")}`);
|
|
103
|
+
}
|
|
104
|
+
return product;
|
|
105
|
+
}
|
|
106
|
+
export function loadConfig(options) {
|
|
107
|
+
const productId = options?.productId ?? DEFAULT_PRODUCT_ID;
|
|
108
|
+
const product = getProductDefinition(productId);
|
|
109
|
+
const workflowOverride = process.env.CAWCUT_API_BASE?.trim();
|
|
110
|
+
const userOverride = process.env.CAWCUT_USER_API_BASE?.trim();
|
|
111
|
+
const portalOverride = process.env.CAWCUT_PORTAL_BASE?.trim();
|
|
112
|
+
const customApi = hasCustomApiOverride();
|
|
113
|
+
let environment;
|
|
114
|
+
if (options?.environment) {
|
|
115
|
+
const normalized = normalizeEnvName(options.environment);
|
|
116
|
+
if (!normalized || !product.env[normalized]) {
|
|
117
|
+
throw new Error(`Unknown environment "${options.environment}" for product "${productId}"`);
|
|
118
|
+
}
|
|
119
|
+
environment = normalized;
|
|
120
|
+
}
|
|
121
|
+
else if (process.env.CAWCUT_ENV?.trim()) {
|
|
122
|
+
environment = resolveEnvironment(product, {
|
|
123
|
+
apiBase: workflowOverride,
|
|
124
|
+
userApiBase: userOverride,
|
|
125
|
+
portalBase: portalOverride,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
environment = resolveEnvironment(product, {
|
|
130
|
+
apiBase: workflowOverride,
|
|
131
|
+
userApiBase: userOverride,
|
|
132
|
+
portalBase: portalOverride,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
const defaults = product.env[environment];
|
|
136
|
+
if (!defaults) {
|
|
137
|
+
throw new Error(`Product "${productId}" has no URL profile for environment "${environment}"`);
|
|
138
|
+
}
|
|
139
|
+
const portalBase = trimTrailingSlash(portalOverride || defaults.portalBase);
|
|
140
|
+
const userApiBase = trimTrailingSlash(userOverride || defaults.userApiBase);
|
|
141
|
+
const workflowApiBase = trimTrailingSlash(workflowOverride || defaults.workflowApiBase);
|
|
142
|
+
const credentialsPath = process.env.CAWCUT_CREDENTIALS_PATH?.trim() || defaultCredentialsPath(product);
|
|
143
|
+
return {
|
|
144
|
+
productId,
|
|
145
|
+
product,
|
|
146
|
+
environment,
|
|
147
|
+
portalBase,
|
|
148
|
+
userApiBase,
|
|
149
|
+
workflowApiBase,
|
|
150
|
+
consentPath: defaults.consentPath,
|
|
151
|
+
oauthEndpoint: product.oauthEndpoint,
|
|
152
|
+
clientName: product.clientName,
|
|
153
|
+
credentialsPath,
|
|
154
|
+
customApi,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export function buildConsentUrl(config, redirectUri) {
|
|
158
|
+
const url = new URL(config.consentPath, config.portalBase);
|
|
159
|
+
url.searchParams.set("endpoint", config.oauthEndpoint);
|
|
160
|
+
url.searchParams.set("redirect_uri", redirectUri);
|
|
161
|
+
url.searchParams.set("client_name", config.clientName);
|
|
162
|
+
return url.toString();
|
|
163
|
+
}
|
|
164
|
+
export function exchangeUrl(config) {
|
|
165
|
+
return `${config.userApiBase}/public/auth/${config.oauthEndpoint}/exchange`;
|
|
166
|
+
}
|
|
167
|
+
export function refreshUrl(config) {
|
|
168
|
+
return `${config.userApiBase}/public/auth/token/refresh`;
|
|
169
|
+
}
|
|
170
|
+
export function productsConfigPath() {
|
|
171
|
+
return fileURLToPath(new URL("../../config/products.json", import.meta.url));
|
|
172
|
+
}
|
|
173
|
+
/** @internal test helper */
|
|
174
|
+
export function resetProductsCache() {
|
|
175
|
+
productsCache = undefined;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface Credentials {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
userId: number;
|
|
5
|
+
/** Unix timestamp (seconds) when access token expires */
|
|
6
|
+
expire: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function isAccessTokenExpired(credentials: Credentials, nowSeconds?: number): boolean;
|
|
9
|
+
export declare function readCredentials(path: string): Promise<Credentials | null>;
|
|
10
|
+
export declare function writeCredentials(path: string, credentials: Credentials): Promise<void>;
|
|
11
|
+
export declare function deleteCredentials(path: string): Promise<void>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { chmod, mkdir, readFile, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
const CREDENTIALS_MODE = 0o600;
|
|
4
|
+
export function isAccessTokenExpired(credentials, nowSeconds = Math.floor(Date.now() / 1000)) {
|
|
5
|
+
return credentials.expire <= nowSeconds;
|
|
6
|
+
}
|
|
7
|
+
export async function readCredentials(path) {
|
|
8
|
+
try {
|
|
9
|
+
const raw = await readFile(path, "utf8");
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
if (!parsed.accessToken ||
|
|
12
|
+
!parsed.refreshToken ||
|
|
13
|
+
typeof parsed.userId !== "number" ||
|
|
14
|
+
typeof parsed.expire !== "number") {
|
|
15
|
+
throw new Error("credentials file is missing required fields");
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
accessToken: parsed.accessToken,
|
|
19
|
+
refreshToken: parsed.refreshToken,
|
|
20
|
+
userId: parsed.userId,
|
|
21
|
+
expire: parsed.expire,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error.code === "ENOENT") {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export async function writeCredentials(path, credentials) {
|
|
32
|
+
await mkdir(dirname(path), { recursive: true });
|
|
33
|
+
const payload = `${JSON.stringify(credentials, null, 2)}\n`;
|
|
34
|
+
await writeFile(path, payload, { encoding: "utf8", mode: CREDENTIALS_MODE });
|
|
35
|
+
await chmod(path, CREDENTIALS_MODE);
|
|
36
|
+
}
|
|
37
|
+
export async function deleteCredentials(path) {
|
|
38
|
+
try {
|
|
39
|
+
await unlink(path);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error.code !== "ENOENT") {
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,MAAM,UAAU,oBAAoB,CAClC,WAAwB,EACxB,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAE1C,OAAO,WAAW,CAAC,MAAM,IAAI,UAAU,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACvD,IACE,CAAC,MAAM,CAAC,WAAW;YACnB,CAAC,MAAM,CAAC,YAAY;YACpB,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YACjC,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EACjC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO;YACL,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,WAAwB;IAC3E,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAC5D,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC7E,MAAM,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ResolvedConfig } from "./config.js";
|
|
2
|
+
export interface DeveloperTool {
|
|
3
|
+
name: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
input_schema?: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface AsyncResult {
|
|
8
|
+
result_url?: string;
|
|
9
|
+
task_id?: string;
|
|
10
|
+
}
|
|
11
|
+
export type TaskStatusValue = "pending" | "running" | "done" | "failed";
|
|
12
|
+
export interface TaskStatus {
|
|
13
|
+
status: TaskStatusValue;
|
|
14
|
+
result_url?: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function listDeveloperTools(config: ResolvedConfig, fetchImpl?: typeof fetch): Promise<DeveloperTool[]>;
|
|
18
|
+
export declare function findDeveloperAppTool(config: ResolvedConfig, appId: string, fetchImpl?: typeof fetch): Promise<DeveloperTool | undefined>;
|
|
19
|
+
export interface DeveloperGenerateBody {
|
|
20
|
+
capability: string;
|
|
21
|
+
prompt?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
params?: Record<string, unknown>;
|
|
24
|
+
media?: Array<{
|
|
25
|
+
type: string;
|
|
26
|
+
asset_id?: string;
|
|
27
|
+
url?: string;
|
|
28
|
+
}>;
|
|
29
|
+
}
|
|
30
|
+
export declare function developerGenerate(config: ResolvedConfig, body: DeveloperGenerateBody, fetchImpl?: typeof fetch): Promise<AsyncResult>;
|
|
31
|
+
export declare function developerRunApp(config: ResolvedConfig, appUniqueId: string, inputs: Record<string, unknown>, fetchImpl?: typeof fetch): Promise<AsyncResult>;
|
|
32
|
+
export declare function developerGetTask(config: ResolvedConfig, taskId: string, fetchImpl?: typeof fetch): Promise<TaskStatus>;
|
|
33
|
+
export declare function isAppToolName(name: string): boolean;
|
|
34
|
+
export declare function appIdFromToolName(name: string): string;
|
|
35
|
+
export declare function formatAsyncResult(result: AsyncResult, actionLabel?: string): string | null;
|
|
36
|
+
export declare function parseInputPairs(pairs: string[] | undefined): Record<string, string>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { apiRequest } from "./http.js";
|
|
2
|
+
async function parseDataResponse(response) {
|
|
3
|
+
const body = (await response.json());
|
|
4
|
+
if (body.data !== undefined) {
|
|
5
|
+
return body.data;
|
|
6
|
+
}
|
|
7
|
+
if (body.code !== undefined && body.code !== 0) {
|
|
8
|
+
const detail = body.msg || body.message;
|
|
9
|
+
throw new Error(detail ? String(detail) : `API error (code ${body.code})`);
|
|
10
|
+
}
|
|
11
|
+
throw new Error("Empty API response");
|
|
12
|
+
}
|
|
13
|
+
export async function listDeveloperTools(config, fetchImpl = fetch) {
|
|
14
|
+
const response = await apiRequest(config, "/developer/tools", { api: "workflow" }, fetchImpl);
|
|
15
|
+
return parseDataResponse(response);
|
|
16
|
+
}
|
|
17
|
+
export async function findDeveloperAppTool(config, appId, fetchImpl = fetch) {
|
|
18
|
+
const tools = await listDeveloperTools(config, fetchImpl);
|
|
19
|
+
const toolName = `app_${appId}`;
|
|
20
|
+
return tools.find((tool) => tool.name === toolName);
|
|
21
|
+
}
|
|
22
|
+
export async function developerGenerate(config, body, fetchImpl = fetch) {
|
|
23
|
+
const response = await apiRequest(config, "/developer/generate", {
|
|
24
|
+
api: "workflow",
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: { "Content-Type": "application/json" },
|
|
27
|
+
body: JSON.stringify(body),
|
|
28
|
+
}, fetchImpl);
|
|
29
|
+
return parseDataResponse(response);
|
|
30
|
+
}
|
|
31
|
+
export async function developerRunApp(config, appUniqueId, inputs, fetchImpl = fetch) {
|
|
32
|
+
const response = await apiRequest(config, `/developer/apps/${encodeURIComponent(appUniqueId)}/run`, {
|
|
33
|
+
api: "workflow",
|
|
34
|
+
method: "POST",
|
|
35
|
+
headers: { "Content-Type": "application/json" },
|
|
36
|
+
body: JSON.stringify({ inputs }),
|
|
37
|
+
}, fetchImpl);
|
|
38
|
+
return parseDataResponse(response);
|
|
39
|
+
}
|
|
40
|
+
export async function developerGetTask(config, taskId, fetchImpl = fetch) {
|
|
41
|
+
const response = await apiRequest(config, `/developer/tasks/${encodeURIComponent(taskId)}`, { api: "workflow" }, fetchImpl);
|
|
42
|
+
return parseDataResponse(response);
|
|
43
|
+
}
|
|
44
|
+
export function isAppToolName(name) {
|
|
45
|
+
return name.startsWith("app_");
|
|
46
|
+
}
|
|
47
|
+
export function appIdFromToolName(name) {
|
|
48
|
+
return name.startsWith("app_") ? name.slice("app_".length) : name;
|
|
49
|
+
}
|
|
50
|
+
export function formatAsyncResult(result, actionLabel = "Generation") {
|
|
51
|
+
if (result.result_url) {
|
|
52
|
+
return result.result_url;
|
|
53
|
+
}
|
|
54
|
+
if (result.task_id) {
|
|
55
|
+
return `${actionLabel} in progress, check status: cawcut task status ${result.task_id}`;
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
export function parseInputPairs(pairs) {
|
|
60
|
+
const inputs = {};
|
|
61
|
+
for (const pair of pairs ?? []) {
|
|
62
|
+
const separator = pair.indexOf("=");
|
|
63
|
+
if (separator <= 0) {
|
|
64
|
+
throw new Error(`Invalid --input "${pair}". Expected key=value.`);
|
|
65
|
+
}
|
|
66
|
+
const key = pair.slice(0, separator).trim();
|
|
67
|
+
const value = pair.slice(separator + 1);
|
|
68
|
+
if (!key) {
|
|
69
|
+
throw new Error(`Invalid --input "${pair}". Expected key=value.`);
|
|
70
|
+
}
|
|
71
|
+
inputs[key] = value;
|
|
72
|
+
}
|
|
73
|
+
return inputs;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=developer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developer.js","sourceRoot":"","sources":["../../src/lib/developer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { homedir, tmpdir } from "node:os";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
export function resolveDownloadDir(target) {
|
|
5
|
+
const normalized = target?.trim().toLowerCase();
|
|
6
|
+
if (!normalized || normalized === "downloads") {
|
|
7
|
+
return join(homedir(), "Downloads");
|
|
8
|
+
}
|
|
9
|
+
if (normalized === "tmp") {
|
|
10
|
+
return tmpdir();
|
|
11
|
+
}
|
|
12
|
+
return target.trim();
|
|
13
|
+
}
|
|
14
|
+
function filenameFromUrl(url) {
|
|
15
|
+
try {
|
|
16
|
+
const pathname = new URL(url).pathname;
|
|
17
|
+
const name = basename(pathname);
|
|
18
|
+
if (name && name !== "/") {
|
|
19
|
+
return name;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// fall through
|
|
24
|
+
}
|
|
25
|
+
return `cawcut-${Date.now()}`;
|
|
26
|
+
}
|
|
27
|
+
export async function downloadFromUrl(url, targetDir, fetchImpl = fetch) {
|
|
28
|
+
await mkdir(targetDir, { recursive: true });
|
|
29
|
+
const response = await fetchImpl(url);
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
throw new Error(`Download failed: HTTP ${response.status} for ${url}`);
|
|
32
|
+
}
|
|
33
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
34
|
+
const dest = join(targetDir, filenameFromUrl(url));
|
|
35
|
+
await writeFile(dest, buffer);
|
|
36
|
+
return dest;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/lib/download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI3C,MAAM,UAAU,kBAAkB,CAAC,MAAe;IAChD,MAAM,UAAU,GAAG,MAAM,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IACD,OAAO,MAAO,CAAC,IAAI,EAAE,CAAC;AACxB,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;IACD,OAAO,UAAU,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAW,EACX,SAAiB,EACjB,YAA0B,KAAK;IAE/B,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ResolvedConfig } from "./config.js";
|
|
2
|
+
import { type AsyncResult } from "./developer.js";
|
|
3
|
+
export interface GenerateMediaItem {
|
|
4
|
+
type: "image" | "video" | "audio";
|
|
5
|
+
asset_id?: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
format?: string;
|
|
8
|
+
preview_url?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface GenerateOptions {
|
|
11
|
+
capability: string;
|
|
12
|
+
prompt?: string;
|
|
13
|
+
model?: string;
|
|
14
|
+
params?: Record<string, unknown>;
|
|
15
|
+
image?: string[];
|
|
16
|
+
video?: string[];
|
|
17
|
+
audio?: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function parseParamFlags(paramFlags: string[] | undefined): Record<string, unknown>;
|
|
20
|
+
export declare function runGenerate(config: ResolvedConfig, options: GenerateOptions, fetchImpl?: typeof fetch): Promise<AsyncResult>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { assertCapabilityKey } from "./capabilities.js";
|
|
2
|
+
import { resolveMediaReference } from "./assets.js";
|
|
3
|
+
import { developerGenerate } from "./developer.js";
|
|
4
|
+
import { validateGenerateInput } from "./validate-generate.js";
|
|
5
|
+
function collectParams(pairs) {
|
|
6
|
+
const params = {};
|
|
7
|
+
for (const pair of pairs) {
|
|
8
|
+
const separator = pair.indexOf("=");
|
|
9
|
+
if (separator <= 0) {
|
|
10
|
+
throw new Error(`Invalid --param "${pair}". Expected key=value.`);
|
|
11
|
+
}
|
|
12
|
+
const key = pair.slice(0, separator).trim();
|
|
13
|
+
const value = pair.slice(separator + 1);
|
|
14
|
+
if (!key) {
|
|
15
|
+
throw new Error(`Invalid --param "${pair}". Expected key=value.`);
|
|
16
|
+
}
|
|
17
|
+
params[key] = value;
|
|
18
|
+
}
|
|
19
|
+
return params;
|
|
20
|
+
}
|
|
21
|
+
export function parseParamFlags(paramFlags) {
|
|
22
|
+
return collectParams(paramFlags ?? []);
|
|
23
|
+
}
|
|
24
|
+
export async function runGenerate(config, options, fetchImpl = fetch) {
|
|
25
|
+
const capability = assertCapabilityKey(options.capability);
|
|
26
|
+
const validated = validateGenerateInput({
|
|
27
|
+
capability,
|
|
28
|
+
prompt: options.prompt,
|
|
29
|
+
model: options.model,
|
|
30
|
+
params: options.params,
|
|
31
|
+
image: options.image,
|
|
32
|
+
video: options.video,
|
|
33
|
+
audio: options.audio,
|
|
34
|
+
});
|
|
35
|
+
const media = [];
|
|
36
|
+
for (const img of options.image ?? []) {
|
|
37
|
+
const ref = await resolveMediaReference(config, img, fetchImpl);
|
|
38
|
+
media.push({
|
|
39
|
+
type: "image",
|
|
40
|
+
asset_id: ref.asset_id,
|
|
41
|
+
url: ref.url,
|
|
42
|
+
format: ref.format,
|
|
43
|
+
preview_url: ref.preview_url,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
for (const vid of options.video ?? []) {
|
|
47
|
+
const ref = await resolveMediaReference(config, vid, fetchImpl);
|
|
48
|
+
media.push({
|
|
49
|
+
type: "video",
|
|
50
|
+
asset_id: ref.asset_id,
|
|
51
|
+
url: ref.url,
|
|
52
|
+
format: ref.format,
|
|
53
|
+
preview_url: ref.preview_url,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
for (const aud of options.audio ?? []) {
|
|
57
|
+
const ref = await resolveMediaReference(config, aud, fetchImpl);
|
|
58
|
+
media.push({
|
|
59
|
+
type: "audio",
|
|
60
|
+
asset_id: ref.asset_id,
|
|
61
|
+
url: ref.url,
|
|
62
|
+
format: ref.format,
|
|
63
|
+
preview_url: ref.preview_url,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return developerGenerate(config, {
|
|
67
|
+
capability: validated.capability,
|
|
68
|
+
prompt: validated.prompt,
|
|
69
|
+
model: options.model?.trim() ? validated.model : undefined,
|
|
70
|
+
params: Object.keys(validated.params).length > 0 ? validated.params : undefined,
|
|
71
|
+
media: media.length > 0 ? media : undefined,
|
|
72
|
+
}, fetchImpl);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=generate-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-request.js","sourceRoot":"","sources":["../../src/lib/generate-request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type ResolvedConfig } from "./config.js";
|
|
2
|
+
import { type Credentials } from "./credentials.js";
|
|
3
|
+
export declare const TOKEN_EXPIRED_MESSAGE = "Token expired, run `cawcut auth login`";
|
|
4
|
+
export declare class ApiError extends Error {
|
|
5
|
+
readonly status: number;
|
|
6
|
+
readonly body?: unknown | undefined;
|
|
7
|
+
constructor(message: string, status: number, body?: unknown | undefined);
|
|
8
|
+
}
|
|
9
|
+
export type ApiTarget = "user" | "workflow";
|
|
10
|
+
export interface ApiRequestOptions extends Omit<RequestInit, "headers"> {
|
|
11
|
+
api?: ApiTarget;
|
|
12
|
+
skipAuth?: boolean;
|
|
13
|
+
headers?: Record<string, string>;
|
|
14
|
+
}
|
|
15
|
+
export declare function getValidCredentials(config: ResolvedConfig, fetchImpl?: typeof fetch): Promise<Credentials>;
|
|
16
|
+
export declare function apiRequest(config: ResolvedConfig, path: string, options?: ApiRequestOptions, fetchImpl?: typeof fetch): Promise<Response>;
|