windmill-cli 1.663.0 → 1.665.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/esm/main.js +108 -45
- package/package.json +1 -1
package/esm/main.js
CHANGED
|
@@ -11785,7 +11785,7 @@ var init_OpenAPI = __esm(() => {
|
|
|
11785
11785
|
PASSWORD: undefined,
|
|
11786
11786
|
TOKEN: getEnv2("WM_TOKEN"),
|
|
11787
11787
|
USERNAME: undefined,
|
|
11788
|
-
VERSION: "1.
|
|
11788
|
+
VERSION: "1.665.0",
|
|
11789
11789
|
WITH_CREDENTIALS: true,
|
|
11790
11790
|
interceptors: {
|
|
11791
11791
|
request: new Interceptors,
|
|
@@ -12181,6 +12181,7 @@ __export(exports_services_gen, {
|
|
|
12181
12181
|
resumeSuspendedJobPost: () => resumeSuspendedJobPost,
|
|
12182
12182
|
resumeSuspendedJobGet: () => resumeSuspendedJobGet,
|
|
12183
12183
|
resumeSuspendedFlowAsOwner: () => resumeSuspendedFlowAsOwner,
|
|
12184
|
+
resumeSuspended: () => resumeSuspended,
|
|
12184
12185
|
resultById: () => resultById,
|
|
12185
12186
|
restartFlowAtStep: () => restartFlowAtStep,
|
|
12186
12187
|
resolveNpmPackageVersion: () => resolveNpmPackageVersion,
|
|
@@ -12309,6 +12310,7 @@ __export(exports_services_gen, {
|
|
|
12309
12310
|
listExtendedJobs: () => listExtendedJobs,
|
|
12310
12311
|
listEmailTriggers: () => listEmailTriggers,
|
|
12311
12312
|
listDucklakes: () => listDucklakes,
|
|
12313
|
+
listDedicatedWithDeps: () => listDedicatedWithDeps,
|
|
12312
12314
|
listDataTables: () => listDataTables,
|
|
12313
12315
|
listDataTableSchemas: () => listDataTableSchemas,
|
|
12314
12316
|
listCustomInstanceDbs: () => listCustomInstanceDbs,
|
|
@@ -12440,6 +12442,7 @@ __export(exports_services_gen, {
|
|
|
12440
12442
|
getInputHistory: () => getInputHistory,
|
|
12441
12443
|
getIndexerStatus: () => getIndexerStatus,
|
|
12442
12444
|
getIndexStorageSizes: () => getIndexStorageSizes,
|
|
12445
|
+
getIndexDiskStorageSizes: () => getIndexDiskStorageSizes,
|
|
12443
12446
|
getHubScriptContentByPath: () => getHubScriptContentByPath,
|
|
12444
12447
|
getHubScriptByPath: () => getHubScriptByPath,
|
|
12445
12448
|
getHubRawAppById: () => getHubRawAppById,
|
|
@@ -12454,6 +12457,7 @@ __export(exports_services_gen, {
|
|
|
12454
12457
|
getGlobalConnectedRepositories: () => getGlobalConnectedRepositories,
|
|
12455
12458
|
getGlobal: () => getGlobal,
|
|
12456
12459
|
getGithubAppToken: () => getGithubAppToken,
|
|
12460
|
+
getGitSyncEnabled: () => getGitSyncEnabled,
|
|
12457
12461
|
getGitCommitHash: () => getGitCommitHash,
|
|
12458
12462
|
getGhesConfig: () => getGhesConfig,
|
|
12459
12463
|
getGcpTrigger: () => getGcpTrigger,
|
|
@@ -12481,6 +12485,7 @@ __export(exports_services_gen, {
|
|
|
12481
12485
|
getCriticalAlerts: () => getCriticalAlerts,
|
|
12482
12486
|
getCountsOfRunningJobsPerTag: () => getCountsOfRunningJobsPerTag,
|
|
12483
12487
|
getCountsOfJobsWaitingPerTag: () => getCountsOfJobsWaitingPerTag,
|
|
12488
|
+
getCopilotSettingsState: () => getCopilotSettingsState,
|
|
12484
12489
|
getCopilotInfo: () => getCopilotInfo,
|
|
12485
12490
|
getConfig: () => getConfig,
|
|
12486
12491
|
getConcurrencyKey: () => getConcurrencyKey,
|
|
@@ -12495,6 +12500,7 @@ __export(exports_services_gen, {
|
|
|
12495
12500
|
getCapture: () => getCapture,
|
|
12496
12501
|
getAuditLog: () => getAuditLog,
|
|
12497
12502
|
getArgsFromHistoryOrSavedInput: () => getArgsFromHistoryOrSavedInput,
|
|
12503
|
+
getApprovalInfo: () => getApprovalInfo,
|
|
12498
12504
|
getAppLiteByPath: () => getAppLiteByPath,
|
|
12499
12505
|
getAppLatestVersion: () => getAppLatestVersion,
|
|
12500
12506
|
getAppHistoryByPath: () => getAppHistoryByPath,
|
|
@@ -13750,6 +13756,14 @@ var backendVersion = () => {
|
|
|
13750
13756
|
body: data2.requestBody,
|
|
13751
13757
|
mediaType: "application/json"
|
|
13752
13758
|
});
|
|
13759
|
+
}, getCopilotSettingsState = (data2) => {
|
|
13760
|
+
return request(OpenAPI, {
|
|
13761
|
+
method: "GET",
|
|
13762
|
+
url: "/w/{workspace}/workspaces/get_copilot_settings_state",
|
|
13763
|
+
path: {
|
|
13764
|
+
workspace: data2.workspace
|
|
13765
|
+
}
|
|
13766
|
+
});
|
|
13753
13767
|
}, getCopilotInfo = (data2) => {
|
|
13754
13768
|
return request(OpenAPI, {
|
|
13755
13769
|
method: "GET",
|
|
@@ -13832,6 +13846,14 @@ var backendVersion = () => {
|
|
|
13832
13846
|
body: data2.requestBody,
|
|
13833
13847
|
mediaType: "application/json"
|
|
13834
13848
|
});
|
|
13849
|
+
}, getGitSyncEnabled = (data2) => {
|
|
13850
|
+
return request(OpenAPI, {
|
|
13851
|
+
method: "GET",
|
|
13852
|
+
url: "/w/{workspace}/workspaces/git_sync_enabled",
|
|
13853
|
+
path: {
|
|
13854
|
+
workspace: data2.workspace
|
|
13855
|
+
}
|
|
13856
|
+
});
|
|
13835
13857
|
}, editWorkspaceGitSyncConfig = (data2) => {
|
|
13836
13858
|
return request(OpenAPI, {
|
|
13837
13859
|
method: "POST",
|
|
@@ -15068,6 +15090,14 @@ var backendVersion = () => {
|
|
|
15068
15090
|
body: data2.requestBody,
|
|
15069
15091
|
mediaType: "application/json"
|
|
15070
15092
|
});
|
|
15093
|
+
}, listDedicatedWithDeps = (data2) => {
|
|
15094
|
+
return request(OpenAPI, {
|
|
15095
|
+
method: "GET",
|
|
15096
|
+
url: "/w/{workspace}/scripts/list_dedicated_with_deps",
|
|
15097
|
+
path: {
|
|
15098
|
+
workspace: data2.workspace
|
|
15099
|
+
}
|
|
15100
|
+
});
|
|
15071
15101
|
}, rawScriptByPath = (data2) => {
|
|
15072
15102
|
return request(OpenAPI, {
|
|
15073
15103
|
method: "GET",
|
|
@@ -16600,7 +16630,8 @@ var backendVersion = () => {
|
|
|
16600
16630
|
stream_offset: data2.streamOffset,
|
|
16601
16631
|
get_progress: data2.getProgress,
|
|
16602
16632
|
only_result: data2.onlyResult,
|
|
16603
|
-
no_logs: data2.noLogs
|
|
16633
|
+
no_logs: data2.noLogs,
|
|
16634
|
+
fast: data2.fast
|
|
16604
16635
|
}
|
|
16605
16636
|
});
|
|
16606
16637
|
}, getLogFileFromStore = (data2) => {
|
|
@@ -16793,6 +16824,29 @@ var backendVersion = () => {
|
|
|
16793
16824
|
cancel_button_text: data2.cancelButtonText
|
|
16794
16825
|
}
|
|
16795
16826
|
});
|
|
16827
|
+
}, resumeSuspended = (data2) => {
|
|
16828
|
+
return request(OpenAPI, {
|
|
16829
|
+
method: "POST",
|
|
16830
|
+
url: "/w/{workspace}/jobs_u/flow/resume_suspended/{job_id}",
|
|
16831
|
+
path: {
|
|
16832
|
+
workspace: data2.workspace,
|
|
16833
|
+
job_id: data2.jobId
|
|
16834
|
+
},
|
|
16835
|
+
body: data2.requestBody,
|
|
16836
|
+
mediaType: "application/json"
|
|
16837
|
+
});
|
|
16838
|
+
}, getApprovalInfo = (data2) => {
|
|
16839
|
+
return request(OpenAPI, {
|
|
16840
|
+
method: "GET",
|
|
16841
|
+
url: "/w/{workspace}/jobs_u/flow/approval_info/{job_id}",
|
|
16842
|
+
path: {
|
|
16843
|
+
workspace: data2.workspace,
|
|
16844
|
+
job_id: data2.jobId
|
|
16845
|
+
},
|
|
16846
|
+
query: {
|
|
16847
|
+
token: data2.token
|
|
16848
|
+
}
|
|
16849
|
+
});
|
|
16796
16850
|
}, resumeSuspendedJobGet = (data2) => {
|
|
16797
16851
|
return request(OpenAPI, {
|
|
16798
16852
|
method: "GET",
|
|
@@ -19242,6 +19296,11 @@ var backendVersion = () => {
|
|
|
19242
19296
|
max_ts: data2.maxTs
|
|
19243
19297
|
}
|
|
19244
19298
|
});
|
|
19299
|
+
}, getIndexDiskStorageSizes = () => {
|
|
19300
|
+
return request(OpenAPI, {
|
|
19301
|
+
method: "GET",
|
|
19302
|
+
url: "/srch/index/storage/disk"
|
|
19303
|
+
});
|
|
19245
19304
|
}, clearIndex = (data2) => {
|
|
19246
19305
|
return request(OpenAPI, {
|
|
19247
19306
|
method: "DELETE",
|
|
@@ -58892,7 +58951,7 @@ var init_tar = __esm(() => {
|
|
|
58892
58951
|
});
|
|
58893
58952
|
|
|
58894
58953
|
// src/commands/script/script.ts
|
|
58895
|
-
import { readFile as readFile5, writeFile as writeFile4, stat as stat3 } from "node:fs/promises";
|
|
58954
|
+
import { readFile as readFile5, writeFile as writeFile4, stat as stat3, mkdir as mkdir3 } from "node:fs/promises";
|
|
58896
58955
|
import { Buffer as Buffer4 } from "node:buffer";
|
|
58897
58956
|
import { sep as SEP4 } from "node:path";
|
|
58898
58957
|
import * as path5 from "node:path";
|
|
@@ -59468,12 +59527,13 @@ async function bootstrap(opts, scriptPath, language) {
|
|
|
59468
59527
|
if (!validatePath(scriptPath)) {
|
|
59469
59528
|
return;
|
|
59470
59529
|
}
|
|
59471
|
-
const
|
|
59530
|
+
const resolvedLanguage = languageAliases[language] ?? language;
|
|
59531
|
+
const scriptInitialCode = scriptBootstrapCode[resolvedLanguage];
|
|
59472
59532
|
if (scriptInitialCode === undefined) {
|
|
59473
59533
|
throw new Error("Language unknown");
|
|
59474
59534
|
}
|
|
59475
59535
|
const config = await readConfigFile();
|
|
59476
|
-
const extension = filePathExtensionFromContentType(
|
|
59536
|
+
const extension = filePathExtensionFromContentType(resolvedLanguage, config.defaultTs);
|
|
59477
59537
|
const scriptCodeFileFullPath = scriptPath + extension;
|
|
59478
59538
|
const scriptMetadataFileFullPath = scriptPath + ".script.yaml";
|
|
59479
59539
|
try {
|
|
@@ -59498,6 +59558,8 @@ async function bootstrap(opts, scriptPath, language) {
|
|
|
59498
59558
|
scriptMetadata.description = opts.description;
|
|
59499
59559
|
}
|
|
59500
59560
|
const scriptInitialMetadataYaml = import_yaml5.stringify(scriptMetadata, yamlOptions);
|
|
59561
|
+
const parentDir = path5.dirname(scriptCodeFileFullPath);
|
|
59562
|
+
await mkdir3(parentDir, { recursive: true });
|
|
59501
59563
|
await writeFile4(scriptCodeFileFullPath, scriptInitialCode, {
|
|
59502
59564
|
flag: "wx",
|
|
59503
59565
|
encoding: "utf-8"
|
|
@@ -59713,7 +59775,7 @@ async function preview(opts, filePath) {
|
|
|
59713
59775
|
}
|
|
59714
59776
|
}
|
|
59715
59777
|
}
|
|
59716
|
-
var import_yaml5, exts, command3, script_default;
|
|
59778
|
+
var import_yaml5, exts, languageAliases, command3, script_default;
|
|
59717
59779
|
var init_script = __esm(async () => {
|
|
59718
59780
|
init_colors2();
|
|
59719
59781
|
init_mod3();
|
|
@@ -59765,6 +59827,9 @@ var init_script = __esm(async () => {
|
|
|
59765
59827
|
".java",
|
|
59766
59828
|
".rb"
|
|
59767
59829
|
];
|
|
59830
|
+
languageAliases = {
|
|
59831
|
+
python: "python3"
|
|
59832
|
+
};
|
|
59768
59833
|
command3 = new Command().description("script related commands").option("--show-archived", "Enable archived scripts in output").option("--json", "Output as JSON (for piping to jq)").action(list2).command("list", "list all scripts").option("--show-archived", "Enable archived scripts in output").option("--json", "Output as JSON (for piping to jq)").action(list2).command("push", "push a local script spec. This overrides any remote versions. Use the script file (.ts, .js, .py, .sh)").arguments("<path:file>").action(push).command("get", "get a script's details").arguments("<path:file>").option("--json", "Output as JSON (for piping to jq)").action(get).command("show", "show a script's content (alias for get)").arguments("<path:file>").action(show).command("run", "run a script by path").arguments("<path:file>").option("-d --data <data:file>", "Inputs specified as a JSON string or a file using @<filename> or stdin using @-.").option("-s --silent", "Do not output anything other then the final output. Useful for scripting.").action(run2).command("preview", "preview a local script without deploying it. Supports both regular and codebase scripts.").arguments("<path:file>").option("-d --data <data:file>", "Inputs specified as a JSON string or a file using @<filename> or stdin using @-.").option("-s --silent", "Do not output anything other than the final output. Useful for scripting.").action(preview).command("new", "create a new script").arguments("<path:file> <language:string>").option("--summary <summary:string>", "script summary").option("--description <description:string>", "script description").action(bootstrap).command("bootstrap", "create a new script (alias for new)").arguments("<path:file> <language:string>").option("--summary <summary:string>", "script summary").option("--description <description:string>", "script description").action(bootstrap).command("generate-metadata", "re-generate the metadata file updating the lock and the script schema (for flows, use `wmill flow generate-locks`)").arguments("[script:file]").option("--yes", "Skip confirmation prompt").option("--dry-run", "Perform a dry run without making changes").option("--lock-only", "re-generate only the lock").option("--schema-only", "re-generate only script schema").option("-i --includes <patterns:file[]>", "Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string)").option("-e --excludes <patterns:file[]>", "Comma separated patterns to specify which file to NOT take into account.").action(generateMetadata);
|
|
59769
59834
|
script_default = command3;
|
|
59770
59835
|
});
|
|
@@ -61081,7 +61146,7 @@ __export(exports_sync, {
|
|
|
61081
61146
|
default: () => sync_default,
|
|
61082
61147
|
FSFSElement: () => FSFSElement
|
|
61083
61148
|
});
|
|
61084
|
-
import { readFile as readFile8, writeFile as writeFile6, readdir as readdir4, stat as stat6, rm, copyFile, mkdir as
|
|
61149
|
+
import { readFile as readFile8, writeFile as writeFile6, readdir as readdir4, stat as stat6, rm, copyFile, mkdir as mkdir4 } from "node:fs/promises";
|
|
61085
61150
|
import * as path8 from "node:path";
|
|
61086
61151
|
import { sep as SEP8 } from "node:path";
|
|
61087
61152
|
function mergeCliWithEffectiveOptions(cliOpts, effectiveOpts) {
|
|
@@ -62384,7 +62449,7 @@ async function pull(opts) {
|
|
|
62384
62449
|
throw error2;
|
|
62385
62450
|
}
|
|
62386
62451
|
if (opts.stateful) {
|
|
62387
|
-
await
|
|
62452
|
+
await mkdir4(path8.join(process.cwd(), ".wmill"), { recursive: true });
|
|
62388
62453
|
}
|
|
62389
62454
|
const workspace = await resolveWorkspace(opts, opts.branch);
|
|
62390
62455
|
await requireLogin(opts);
|
|
@@ -62483,13 +62548,13 @@ Both local and remote have been modified.`));
|
|
|
62483
62548
|
}
|
|
62484
62549
|
await writeFile6(target, change.after, "utf-8");
|
|
62485
62550
|
if (opts.stateful) {
|
|
62486
|
-
await
|
|
62551
|
+
await mkdir4(path8.dirname(stateTarget), { recursive: true });
|
|
62487
62552
|
await copyFile(target, stateTarget);
|
|
62488
62553
|
}
|
|
62489
62554
|
} else if (change.name === "added") {
|
|
62490
|
-
await
|
|
62555
|
+
await mkdir4(path8.dirname(target), { recursive: true });
|
|
62491
62556
|
if (opts.stateful) {
|
|
62492
|
-
await
|
|
62557
|
+
await mkdir4(path8.dirname(stateTarget), { recursive: true });
|
|
62493
62558
|
info(`Adding ${getTypeStrFromPath(change.path)} ${targetPath}${targetPath !== change.path ? colors.gray(` (branch-specific override for ${change.path})`) : ""}`);
|
|
62494
62559
|
}
|
|
62495
62560
|
await writeFile6(target, change.content, "utf-8");
|
|
@@ -62868,7 +62933,7 @@ ${folderList}
|
|
|
62868
62933
|
continue;
|
|
62869
62934
|
}
|
|
62870
62935
|
if (stateTarget) {
|
|
62871
|
-
await
|
|
62936
|
+
await mkdir4(path8.dirname(stateTarget), { recursive: true });
|
|
62872
62937
|
info(`Editing ${getTypeStrFromPath(change.path)} ${change.path}`);
|
|
62873
62938
|
}
|
|
62874
62939
|
if (isFileResource(change.path)) {
|
|
@@ -62925,7 +62990,7 @@ ${folderList}
|
|
|
62925
62990
|
continue;
|
|
62926
62991
|
}
|
|
62927
62992
|
if (stateTarget) {
|
|
62928
|
-
await
|
|
62993
|
+
await mkdir4(path8.dirname(stateTarget), { recursive: true });
|
|
62929
62994
|
info(`Adding ${getTypeStrFromPath(change.path)} ${change.path}`);
|
|
62930
62995
|
}
|
|
62931
62996
|
const obj = parseFromPath(change.path, change.content);
|
|
@@ -64577,7 +64642,7 @@ __export(exports_app_metadata, {
|
|
|
64577
64642
|
APP_BACKEND_FOLDER: () => APP_BACKEND_FOLDER
|
|
64578
64643
|
});
|
|
64579
64644
|
import path11 from "node:path";
|
|
64580
|
-
import { readFile as readFile11, mkdir as
|
|
64645
|
+
import { readFile as readFile11, mkdir as mkdir5 } from "node:fs/promises";
|
|
64581
64646
|
import { sep as SEP11 } from "node:path";
|
|
64582
64647
|
async function generateAppHash(rawReqs, folder, rawApp, defaultTs) {
|
|
64583
64648
|
const runnablesFolder = rawApp ? path11.join(folder, APP_BACKEND_FOLDER) : folder;
|
|
@@ -64764,7 +64829,7 @@ async function updateRawAppRunnables(workspace, runnables, remotePath, appFolder
|
|
|
64764
64829
|
const updatedRunnables = [];
|
|
64765
64830
|
const runnablesFolder = path11.join(appFolder, APP_BACKEND_FOLDER);
|
|
64766
64831
|
try {
|
|
64767
|
-
await
|
|
64832
|
+
await mkdir5(runnablesFolder, { recursive: true });
|
|
64768
64833
|
} catch {}
|
|
64769
64834
|
const pathAssigner = newRawAppPathAssigner(defaultTs);
|
|
64770
64835
|
for (const [runnableId, runnable] of Object.entries(runnables)) {
|
|
@@ -66504,7 +66569,7 @@ var init_lint2 = __esm(async () => {
|
|
|
66504
66569
|
});
|
|
66505
66570
|
|
|
66506
66571
|
// src/commands/app/new.ts
|
|
66507
|
-
import { stat as stat8, writeFile as writeFile9, mkdir as
|
|
66572
|
+
import { stat as stat8, writeFile as writeFile9, mkdir as mkdir6 } from "node:fs/promises";
|
|
66508
66573
|
import path15 from "node:path";
|
|
66509
66574
|
function validateAppPath(appPath) {
|
|
66510
66575
|
if (!appPath.startsWith("u/") && !appPath.startsWith("f/")) {
|
|
@@ -66722,9 +66787,9 @@ CREATE SCHEMA IF NOT EXISTS ${schemaName};
|
|
|
66722
66787
|
return;
|
|
66723
66788
|
}
|
|
66724
66789
|
} catch {}
|
|
66725
|
-
await
|
|
66726
|
-
await
|
|
66727
|
-
await
|
|
66790
|
+
await mkdir6(appDir, { recursive: true });
|
|
66791
|
+
await mkdir6(path15.join(appDir, "backend"), { recursive: true });
|
|
66792
|
+
await mkdir6(path15.join(appDir, "sql_to_apply"), { recursive: true });
|
|
66728
66793
|
const rawAppConfig = {
|
|
66729
66794
|
summary
|
|
66730
66795
|
};
|
|
@@ -67198,7 +67263,7 @@ var init_app = __esm(async () => {
|
|
|
67198
67263
|
});
|
|
67199
67264
|
|
|
67200
67265
|
// src/commands/folder/folder.ts
|
|
67201
|
-
import { stat as stat9, readdir as readdir7, writeFile as writeFile10, mkdir as
|
|
67266
|
+
import { stat as stat9, readdir as readdir7, writeFile as writeFile10, mkdir as mkdir7 } from "node:fs/promises";
|
|
67202
67267
|
import { sep as SEP14 } from "node:path";
|
|
67203
67268
|
async function list5(opts) {
|
|
67204
67269
|
const workspace = await resolveWorkspace(opts);
|
|
@@ -67232,7 +67297,7 @@ async function newFolder(opts, name) {
|
|
|
67232
67297
|
owners: [],
|
|
67233
67298
|
extra_perms: {}
|
|
67234
67299
|
};
|
|
67235
|
-
await
|
|
67300
|
+
await mkdir7(dirPath, { recursive: true });
|
|
67236
67301
|
await writeFile10(filePath, import_yaml23.stringify(template), {
|
|
67237
67302
|
flag: "wx",
|
|
67238
67303
|
encoding: "utf-8"
|
|
@@ -68477,7 +68542,7 @@ var init_settings = __esm(async () => {
|
|
|
68477
68542
|
});
|
|
68478
68543
|
|
|
68479
68544
|
// src/commands/instance/instance.ts
|
|
68480
|
-
import { readFile as readFile13, writeFile as writeFile15, readdir as readdir8, mkdir as
|
|
68545
|
+
import { readFile as readFile13, writeFile as writeFile15, readdir as readdir8, mkdir as mkdir8, rm as rm3, stat as stat13 } from "node:fs/promises";
|
|
68481
68546
|
import { appendFile } from "node:fs/promises";
|
|
68482
68547
|
import * as path17 from "node:path";
|
|
68483
68548
|
async function allInstances() {
|
|
@@ -68656,7 +68721,7 @@ async function instancePull(opts) {
|
|
|
68656
68721
|
if (confirm) {
|
|
68657
68722
|
if (uChanges > 0) {
|
|
68658
68723
|
if (opts.folderPerInstance && opts.prefixSettings) {
|
|
68659
|
-
await
|
|
68724
|
+
await mkdir8(path17.join(rootDir, opts.prefix), {
|
|
68660
68725
|
recursive: true
|
|
68661
68726
|
});
|
|
68662
68727
|
}
|
|
@@ -68690,7 +68755,7 @@ Pulling all workspaces`);
|
|
|
68690
68755
|
info(`
|
|
68691
68756
|
Pulling workspace ` + remoteWorkspace.id);
|
|
68692
68757
|
const workspaceName = opts?.folderPerInstance ? instance.prefix + "/" + remoteWorkspace.id : instance.prefix + "_" + remoteWorkspace.id;
|
|
68693
|
-
await
|
|
68758
|
+
await mkdir8(path17.join(rootDir, workspaceName), {
|
|
68694
68759
|
recursive: true
|
|
68695
68760
|
});
|
|
68696
68761
|
process.chdir(path17.join(rootDir, workspaceName));
|
|
@@ -68874,7 +68939,7 @@ Pushing workspace ` + localWorkspace.id);
|
|
|
68874
68939
|
async function getLocalWorkspaces(rootDir, localPrefix, folderPerInstance) {
|
|
68875
68940
|
const localWorkspaces = [];
|
|
68876
68941
|
if (!await stat13(localPrefix).catch(() => null)) {
|
|
68877
|
-
await
|
|
68942
|
+
await mkdir8(localPrefix);
|
|
68878
68943
|
}
|
|
68879
68944
|
if (folderPerInstance) {
|
|
68880
68945
|
const prefixEntries = await readdir8(rootDir + "/" + localPrefix, { withFileTypes: true });
|
|
@@ -73485,7 +73550,7 @@ await __promiseAll([
|
|
|
73485
73550
|
init_resource_type()
|
|
73486
73551
|
]);
|
|
73487
73552
|
var import_yaml40 = __toESM(require_dist(), 1);
|
|
73488
|
-
import { stat as stat16, writeFile as writeFile19, rm as rm4, mkdir as
|
|
73553
|
+
import { stat as stat16, writeFile as writeFile19, rm as rm4, mkdir as mkdir9 } from "node:fs/promises";
|
|
73489
73554
|
|
|
73490
73555
|
// src/guidance/skills.ts
|
|
73491
73556
|
var SKILLS = [
|
|
@@ -74220,7 +74285,7 @@ workflow<T>(fn: (...args: any[]) => Promise<T>): void
|
|
|
74220
74285
|
* await step("notify", () => sendEmail(urls.approvalPage));
|
|
74221
74286
|
* const { value, approver } = await waitForApproval({ timeout: 3600 });
|
|
74222
74287
|
*/
|
|
74223
|
-
waitForApproval(options?: { timeout?: number; form?: object; }): PromiseLike<{ value: any; approver: string; approved: boolean }>
|
|
74288
|
+
waitForApproval(options?: { timeout?: number; form?: object; selfApproval?: boolean; }): PromiseLike<{ value: any; approver: string; approved: boolean }>
|
|
74224
74289
|
|
|
74225
74290
|
/**
|
|
74226
74291
|
* Process items in parallel with optional concurrency control.
|
|
@@ -74883,7 +74948,7 @@ workflow<T>(fn: (...args: any[]) => Promise<T>): void
|
|
|
74883
74948
|
* await step("notify", () => sendEmail(urls.approvalPage));
|
|
74884
74949
|
* const { value, approver } = await waitForApproval({ timeout: 3600 });
|
|
74885
74950
|
*/
|
|
74886
|
-
waitForApproval(options?: { timeout?: number; form?: object; }): PromiseLike<{ value: any; approver: string; approved: boolean }>
|
|
74951
|
+
waitForApproval(options?: { timeout?: number; form?: object; selfApproval?: boolean; }): PromiseLike<{ value: any; approver: string; approved: boolean }>
|
|
74887
74952
|
|
|
74888
74953
|
/**
|
|
74889
74954
|
* Process items in parallel with optional concurrency control.
|
|
@@ -75609,7 +75674,7 @@ workflow<T>(fn: (...args: any[]) => Promise<T>): void
|
|
|
75609
75674
|
* await step("notify", () => sendEmail(urls.approvalPage));
|
|
75610
75675
|
* const { value, approver } = await waitForApproval({ timeout: 3600 });
|
|
75611
75676
|
*/
|
|
75612
|
-
waitForApproval(options?: { timeout?: number; form?: object; }): PromiseLike<{ value: any; approver: string; approved: boolean }>
|
|
75677
|
+
waitForApproval(options?: { timeout?: number; form?: object; selfApproval?: boolean; }): PromiseLike<{ value: any; approver: string; approved: boolean }>
|
|
75613
75678
|
|
|
75614
75679
|
/**
|
|
75615
75680
|
* Process items in parallel with optional concurrency control.
|
|
@@ -76549,7 +76614,7 @@ workflow<T>(fn: (...args: any[]) => Promise<T>): void
|
|
|
76549
76614
|
* await step("notify", () => sendEmail(urls.approvalPage));
|
|
76550
76615
|
* const { value, approver } = await waitForApproval({ timeout: 3600 });
|
|
76551
76616
|
*/
|
|
76552
|
-
waitForApproval(options?: { timeout?: number; form?: object; }): PromiseLike<{ value: any; approver: string; approved: boolean }>
|
|
76617
|
+
waitForApproval(options?: { timeout?: number; form?: object; selfApproval?: boolean; }): PromiseLike<{ value: any; approver: string; approved: boolean }>
|
|
76553
76618
|
|
|
76554
76619
|
/**
|
|
76555
76620
|
* Process items in parallel with optional concurrency control.
|
|
@@ -77558,12 +77623,17 @@ async def sleep(seconds: int)
|
|
|
77558
77623
|
#
|
|
77559
77624
|
# Returns a dict with \`\`value\`\` (form data), \`\`approver\`\`, and \`\`approved\`\`.
|
|
77560
77625
|
#
|
|
77626
|
+
# Args:
|
|
77627
|
+
# timeout: Approval timeout in seconds (default 1800).
|
|
77628
|
+
# form: Optional form schema for the approval page.
|
|
77629
|
+
# self_approval: Whether the user who triggered the flow can approve it (default True).
|
|
77630
|
+
#
|
|
77561
77631
|
# Example::
|
|
77562
77632
|
#
|
|
77563
77633
|
# urls = await step("urls", lambda: get_resume_urls())
|
|
77564
77634
|
# await step("notify", lambda: send_email(urls["approvalPage"]))
|
|
77565
77635
|
# result = await wait_for_approval(timeout=3600)
|
|
77566
|
-
async def wait_for_approval(timeout: int = 1800, form: dict | None = None) -> dict
|
|
77636
|
+
async def wait_for_approval(timeout: int = 1800, form: dict | None = None, self_approval: bool = True) -> dict
|
|
77567
77637
|
|
|
77568
77638
|
# Process items in parallel with optional concurrency control.
|
|
77569
77639
|
#
|
|
@@ -77834,7 +77904,7 @@ Reference a specific resource using \`$res:\` prefix:
|
|
|
77834
77904
|
|
|
77835
77905
|
## OpenFlow Schema
|
|
77836
77906
|
|
|
77837
|
-
{"OpenFlow":{"type":"object","description":"Top-level flow definition containing metadata, configuration, and the flow structure","properties":{"summary":{"type":"string","description":"Short description of what this flow does"},"description":{"type":"string","description":"Detailed documentation for this flow"},"value":{"$ref":"#/components/schemas/FlowValue"},"schema":{"type":"object","description":"JSON Schema for flow inputs. Use this to define input parameters, their types, defaults, and validation. For resource inputs, set type to 'object' and format to 'resource-<type>' (e.g., 'resource-stripe')"},"on_behalf_of_email":{"type":"string","description":"The flow will be run with the permissions of the user with this email."}},"required":["summary","value"]},"FlowValue":{"type":"object","description":"The flow structure containing modules and optional preprocessor/failure handlers","properties":{"modules":{"type":"array","description":"Array of steps that execute in sequence. Each step can be a script, subflow, loop, or branch","items":{"$ref":"#/components/schemas/FlowModule"}},"failure_module":{"description":"Special module that executes when the flow fails. Receives error object with message, name, stack, and step_id. Must have id 'failure'. Only supports script/rawscript types","$ref":"#/components/schemas/FlowModule"},"preprocessor_module":{"description":"Special module that runs before the first step on external triggers. Must have id 'preprocessor'. Only supports script/rawscript types. Cannot reference other step results","$ref":"#/components/schemas/FlowModule"},"same_worker":{"type":"boolean","description":"If true, all steps run on the same worker for better performance"},"concurrent_limit":{"type":"number","description":"Maximum number of concurrent executions of this flow"},"concurrency_key":{"type":"string","description":"Expression to group concurrent executions (e.g., by user ID)"},"concurrency_time_window_s":{"type":"number","description":"Time window in seconds for concurrent_limit"},"debounce_delay_s":{"type":"integer","description":"Delay in seconds to debounce flow executions"},"debounce_key":{"type":"string","description":"Expression to group debounced executions"},"debounce_args_to_accumulate":{"type":"array","description":"Arguments to accumulate across debounced executions","items":{"type":"string"}},"max_total_debouncing_time":{"type":"integer","description":"Maximum total time in seconds that a job can be debounced"},"max_total_debounces_amount":{"type":"integer","description":"Maximum number of times a job can be debounced"},"skip_expr":{"type":"string","description":"JavaScript expression to conditionally skip the entire flow"},"cache_ttl":{"type":"number","description":"Cache duration in seconds for flow results"},"cache_ignore_s3_path":{"type":"boolean"},"flow_env":{"type":"object","description":"Environment variables available to all steps. Values can be strings, JSON values, or special references: '$var:path' (workspace variable) or '$res:path' (resource).","additionalProperties":{}},"priority":{"type":"number","description":"Execution priority (higher numbers run first)"},"early_return":{"type":"string","description":"JavaScript expression to return early from the flow"},"chat_input_enabled":{"type":"boolean","description":"Whether this flow accepts chat-style input"},"notes":{"type":"array","description":"Sticky notes attached to the flow","items":{"$ref":"#/components/schemas/FlowNote"}}},"required":["modules"]},"Retry":{"type":"object","description":"Retry configuration for failed module executions","properties":{"constant":{"type":"object","description":"Retry with constant delay between attempts","properties":{"attempts":{"type":"integer","description":"Number of retry attempts"},"seconds":{"type":"integer","description":"Seconds to wait between retries"}}},"exponential":{"type":"object","description":"Retry with exponential backoff (delay doubles each time)","properties":{"attempts":{"type":"integer","description":"Number of retry attempts"},"multiplier":{"type":"integer","description":"Multiplier for exponential backoff"},"seconds":{"type":"integer","minimum":1,"description":"Initial delay in seconds"},"random_factor":{"type":"integer","minimum":0,"maximum":100,"description":"Random jitter percentage (0-100) to avoid thundering herd"}}},"retry_if":{"$ref":"#/components/schemas/RetryIf"}}},"FlowNote":{"type":"object","description":"A sticky note attached to a flow for documentation and annotation","properties":{"id":{"type":"string","description":"Unique identifier for the note"},"text":{"type":"string","description":"Content of the note"},"position":{"type":"object","description":"Position of the note in the flow editor","properties":{"x":{"type":"number","description":"X coordinate"},"y":{"type":"number","description":"Y coordinate"}},"required":["x","y"]},"size":{"type":"object","description":"Size of the note in the flow editor","properties":{"width":{"type":"number","description":"Width in pixels"},"height":{"type":"number","description":"Height in pixels"}},"required":["width","height"]},"color":{"type":"string","description":"Color of the note (e.g., \\"yellow\\", \\"#ffff00\\")"},"type":{"type":"string","enum":["free","group"],"description":"Type of note - 'free' for standalone notes, 'group' for notes that group other nodes"},"locked":{"type":"boolean","default":false,"description":"Whether the note is locked and cannot be edited or moved"},"contained_node_ids":{"type":"array","items":{"type":"string"},"description":"For group notes, the IDs of nodes contained within this group"}},"required":["id","text","color","type"]},"RetryIf":{"type":"object","description":"Conditional retry based on error or result","properties":{"expr":{"type":"string","description":"JavaScript expression that returns true to retry. Has access to 'result' and 'error' variables"}},"required":["expr"]},"StopAfterIf":{"type":"object","description":"Early termination condition for a module","properties":{"skip_if_stopped":{"type":"boolean","description":"If true, following steps are skipped when this condition triggers"},"expr":{"type":"string","description":"JavaScript expression evaluated after the module runs. Can use 'result' (step's result) or 'flow_input'. Return true to stop"},"error_message":{"type":"string","nullable":true,"description":"Custom error message when stopping with an error. Mutually exclusive with skip_if_stopped. If set to a non-empty string, the flow stops with this error. If empty string, a default error message is used. If null or omitted, no error is raised."}},"required":["expr"]},"FlowModule":{"type":"object","description":"A single step in a flow. Can be a script, subflow, loop, or branch","properties":{"id":{"type":"string","description":"Unique identifier for this step. Used to reference results via 'results.step_id'. Must be a valid identifier (alphanumeric, underscore, hyphen)"},"value":{"$ref":"#/components/schemas/FlowModuleValue"},"stop_after_if":{"description":"Early termination condition evaluated after this step completes","$ref":"#/components/schemas/StopAfterIf"},"stop_after_all_iters_if":{"description":"For loops only - early termination condition evaluated after all iterations complete","$ref":"#/components/schemas/StopAfterIf"},"skip_if":{"type":"object","description":"Conditionally skip this step based on previous results or flow inputs","properties":{"expr":{"type":"string","description":"JavaScript expression that returns true to skip. Can use 'flow_input' or 'results.<step_id>'"}},"required":["expr"]},"sleep":{"description":"Delay before executing this step (in seconds or as expression)","$ref":"#/components/schemas/InputTransform"},"cache_ttl":{"type":"number","description":"Cache duration in seconds for this step's results"},"cache_ignore_s3_path":{"type":"boolean"},"timeout":{"description":"Maximum execution time in seconds (static value or expression)","$ref":"#/components/schemas/InputTransform"},"delete_after_use":{"type":"boolean","description":"If true, this step's result is deleted after use to save memory"},"summary":{"type":"string","description":"Short description of what this step does"},"mock":{"type":"object","description":"Mock configuration for testing without executing the actual step","properties":{"enabled":{"type":"boolean","description":"If true, return mock value instead of executing"},"return_value":{"description":"Value to return when mocked"}}},"suspend":{"type":"object","description":"Configuration for approval/resume steps that wait for user input","properties":{"required_events":{"type":"integer","description":"Number of approvals required before continuing"},"timeout":{"type":"integer","description":"Timeout in seconds before auto-continuing or canceling"},"resume_form":{"type":"object","description":"Form schema for collecting input when resuming","properties":{"schema":{"type":"object","description":"JSON Schema for the resume form"}}},"user_auth_required":{"type":"boolean","description":"If true, only authenticated users can approve"},"user_groups_required":{"description":"Expression or list of groups that can approve","$ref":"#/components/schemas/InputTransform"},"self_approval_disabled":{"type":"boolean","description":"If true, the user who started the flow cannot approve"},"hide_cancel":{"type":"boolean","description":"If true, hide the cancel button on the approval form"},"continue_on_disapprove_timeout":{"type":"boolean","description":"If true, continue flow on timeout instead of canceling"}}},"priority":{"type":"number","description":"Execution priority for this step (higher numbers run first)"},"continue_on_error":{"type":"boolean","description":"If true, flow continues even if this step fails"},"retry":{"description":"Retry configuration if this step fails","$ref":"#/components/schemas/Retry"},"debouncing":{"description":"Debounce configuration for this step (EE only)","type":"object","properties":{"debounce_delay_s":{"type":"integer","description":"Delay in seconds to debounce this step's executions across flow runs"},"debounce_key":{"type":"string","description":"Expression to group debounced executions. Supports $workspace and $args[name]. Default: $workspace/flow/<flow_path>-<step_id>"},"debounce_args_to_accumulate":{"type":"array","description":"Array-type arguments to accumulate across debounced executions","items":{"type":"string"}},"max_total_debouncing_time":{"type":"integer","description":"Maximum total time in seconds before forced execution"},"max_total_debounces_amount":{"type":"integer","description":"Maximum number of debounces before forced execution"}}}},"required":["value","id"]},"InputTransform":{"description":"Maps input parameters for a step. Can be a static value or a JavaScript expression that references previous results or flow inputs","oneOf":[{"$ref":"#/components/schemas/StaticTransform"},{"$ref":"#/components/schemas/JavascriptTransform"},{"$ref":"#/components/schemas/AiTransform"}],"discriminator":{"propertyName":"type","mapping":{"static":"#/components/schemas/StaticTransform","javascript":"#/components/schemas/JavascriptTransform","ai":"#/components/schemas/AiTransform"}}},"StaticTransform":{"type":"object","description":"Static value passed directly to the step. Use for hardcoded values or resource references like '$res:path/to/resource'","properties":{"value":{"description":"The static value. For resources, use format '$res:path/to/resource'"},"type":{"type":"string","enum":["static"]}},"required":["type"]},"JavascriptTransform":{"type":"object","description":"JavaScript expression evaluated at runtime. Can reference previous step results via 'results.step_id' or flow inputs via 'flow_input.property'. Inside loops, use 'flow_input.iter.value' for the current iteration value","properties":{"expr":{"type":"string","description":"JavaScript expression returning the value. Available variables - results (object with all previous step results), flow_input (flow inputs), flow_input.iter (in loops)"},"type":{"type":"string","enum":["javascript"]}},"required":["expr","type"]},"AiTransform":{"type":"object","description":"Value resolved by the AI runtime for this input. The AI engine decides how to satisfy the parameter.","properties":{"type":{"type":"string","enum":["ai"]}},"required":["type"]},"AIProviderKind":{"type":"string","description":"Supported AI provider types","enum":["openai","azure_openai","anthropic","mistral","deepseek","googleai","groq","openrouter","togetherai","customai","aws_bedrock"]},"ProviderConfig":{"type":"object","description":"Complete AI provider configuration with resource reference and model selection","properties":{"kind":{"$ref":"#/components/schemas/AIProviderKind"},"resource":{"type":"string","description":"Resource reference in format '$res:{resource_path}' pointing to provider credentials"},"model":{"type":"string","description":"Model identifier (e.g., 'gpt-4', 'claude-3-opus-20240229', 'gemini-pro')"}},"required":["kind","resource","model"]},"StaticProviderTransform":{"type":"object","description":"Static provider configuration passed directly to the AI agent","properties":{"value":{"$ref":"#/components/schemas/ProviderConfig"},"type":{"type":"string","enum":["static"]}},"required":["type","value"]},"ProviderTransform":{"description":"Provider configuration - can be static (ProviderConfig), JavaScript expression, or AI-determined","oneOf":[{"$ref":"#/components/schemas/StaticProviderTransform"},{"$ref":"#/components/schemas/JavascriptTransform"},{"$ref":"#/components/schemas/AiTransform"}],"discriminator":{"propertyName":"type","mapping":{"static":"#/components/schemas/StaticProviderTransform","javascript":"#/components/schemas/JavascriptTransform","ai":"#/components/schemas/AiTransform"}}},"MemoryOff":{"type":"object","description":"No conversation memory/context","properties":{"kind":{"type":"string","enum":["off"]}},"required":["kind"]},"MemoryAuto":{"type":"object","description":"Automatic context management","properties":{"kind":{"type":"string","enum":["auto"]},"context_length":{"type":"integer","description":"Maximum number of messages to retain in context"},"memory_id":{"type":"string","description":"Identifier for persistent memory across agent invocations"}},"required":["kind"]},"MemoryMessage":{"type":"object","description":"A single message in conversation history","properties":{"role":{"type":"string","enum":["user","assistant","system"]},"content":{"type":"string"}},"required":["role","content"]},"MemoryManual":{"type":"object","description":"Explicit message history","properties":{"kind":{"type":"string","enum":["manual"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/MemoryMessage"}}},"required":["kind","messages"]},"MemoryConfig":{"description":"Conversation memory configuration","oneOf":[{"$ref":"#/components/schemas/MemoryOff"},{"$ref":"#/components/schemas/MemoryAuto"},{"$ref":"#/components/schemas/MemoryManual"}],"discriminator":{"propertyName":"kind","mapping":{"off":"#/components/schemas/MemoryOff","auto":"#/components/schemas/MemoryAuto","manual":"#/components/schemas/MemoryManual"}}},"StaticMemoryTransform":{"type":"object","description":"Static memory configuration passed directly to the AI agent","properties":{"value":{"$ref":"#/components/schemas/MemoryConfig"},"type":{"type":"string","enum":["static"]}},"required":["type","value"]},"MemoryTransform":{"description":"Memory configuration - can be static (MemoryConfig), JavaScript expression, or AI-determined","oneOf":[{"$ref":"#/components/schemas/StaticMemoryTransform"},{"$ref":"#/components/schemas/JavascriptTransform"},{"$ref":"#/components/schemas/AiTransform"}],"discriminator":{"propertyName":"type","mapping":{"static":"#/components/schemas/StaticMemoryTransform","javascript":"#/components/schemas/JavascriptTransform","ai":"#/components/schemas/AiTransform"}}},"FlowModuleValue":{"description":"The actual implementation of a flow step. Can be a script (inline or referenced), subflow, loop, branch, or special module type","oneOf":[{"$ref":"#/components/schemas/RawScript"},{"$ref":"#/components/schemas/PathScript"},{"$ref":"#/components/schemas/PathFlow"},{"$ref":"#/components/schemas/ForloopFlow"},{"$ref":"#/components/schemas/WhileloopFlow"},{"$ref":"#/components/schemas/BranchOne"},{"$ref":"#/components/schemas/BranchAll"},{"$ref":"#/components/schemas/Identity"},{"$ref":"#/components/schemas/AiAgent"}],"discriminator":{"propertyName":"type","mapping":{"rawscript":"#/components/schemas/RawScript","script":"#/components/schemas/PathScript","flow":"#/components/schemas/PathFlow","forloopflow":"#/components/schemas/ForloopFlow","whileloopflow":"#/components/schemas/WhileloopFlow","branchone":"#/components/schemas/BranchOne","branchall":"#/components/schemas/BranchAll","identity":"#/components/schemas/Identity","aiagent":"#/components/schemas/AiAgent"}}},"RawScript":{"type":"object","description":"Inline script with code defined directly in the flow. Use 'bun' as default language if unspecified. The script receives arguments from input_transforms","properties":{"input_transforms":{"type":"object","description":"Map of parameter names to their values (static or JavaScript expressions). These become the script's input arguments","additionalProperties":{"$ref":"#/components/schemas/InputTransform"}},"content":{"type":"string","description":"The script source code. Should export a 'main' function"},"language":{"type":"string","description":"Programming language for this script","enum":["deno","bun","python3","go","bash","powershell","postgresql","mysql","bigquery","snowflake","mssql","oracledb","graphql","nativets","php","rust","ansible","csharp","nu","java","ruby","duckdb"]},"path":{"type":"string","description":"Optional path for saving this script"},"lock":{"type":"string","description":"Lock file content for dependencies"},"type":{"type":"string","enum":["rawscript"]},"tag":{"type":"string","description":"Worker group tag for execution routing"},"concurrent_limit":{"type":"number","description":"Maximum concurrent executions of this script"},"concurrency_time_window_s":{"type":"number","description":"Time window for concurrent_limit"},"custom_concurrency_key":{"type":"string","description":"Custom key for grouping concurrent executions"},"is_trigger":{"type":"boolean","description":"If true, this script is a trigger that can start the flow"},"assets":{"type":"array","description":"External resources this script accesses (S3 objects, resources, etc.)","items":{"type":"object","required":["path","kind"],"properties":{"path":{"type":"string","description":"Path to the asset"},"kind":{"type":"string","description":"Type of asset","enum":["s3object","resource","ducklake","datatable","volume"]},"access_type":{"type":"string","nullable":true,"description":"Access level for this asset","enum":["r","w","rw"]},"alt_access_type":{"type":"string","nullable":true,"description":"Alternative access level","enum":["r","w","rw"]}}}}},"required":["type","content","language","input_transforms"]},"PathScript":{"type":"object","description":"Reference to an existing script by path. Use this when calling a previously saved script instead of writing inline code","properties":{"input_transforms":{"type":"object","description":"Map of parameter names to their values (static or JavaScript expressions). These become the script's input arguments","additionalProperties":{"$ref":"#/components/schemas/InputTransform"}},"path":{"type":"string","description":"Path to the script in the workspace (e.g., 'f/scripts/send_email')"},"hash":{"type":"string","description":"Optional specific version hash of the script to use"},"type":{"type":"string","enum":["script"]},"tag_override":{"type":"string","description":"Override the script's default worker group tag"},"is_trigger":{"type":"boolean","description":"If true, this script is a trigger that can start the flow"}},"required":["type","path","input_transforms"]},"PathFlow":{"type":"object","description":"Reference to an existing flow by path. Use this to call another flow as a subflow","properties":{"input_transforms":{"type":"object","description":"Map of parameter names to their values (static or JavaScript expressions). These become the subflow's input arguments","additionalProperties":{"$ref":"#/components/schemas/InputTransform"}},"path":{"type":"string","description":"Path to the flow in the workspace (e.g., 'f/flows/process_user')"},"type":{"type":"string","enum":["flow"]}},"required":["type","path","input_transforms"]},"ForloopFlow":{"type":"object","description":"Executes nested modules in a loop over an iterator. Inside the loop, use 'flow_input.iter.value' to access the current iteration value, and 'flow_input.iter.index' for the index. Supports parallel execution for better performance on I/O-bound operations","properties":{"modules":{"type":"array","description":"Steps to execute for each iteration. These can reference the iteration value via 'flow_input.iter.value'","items":{"$ref":"#/components/schemas/FlowModule"}},"iterator":{"description":"JavaScript expression that returns an array to iterate over. Can reference 'results.step_id' or 'flow_input'","$ref":"#/components/schemas/InputTransform"},"skip_failures":{"type":"boolean","description":"If true, iteration failures don't stop the loop. Failed iterations return null"},"type":{"type":"string","enum":["forloopflow"]},"parallel":{"type":"boolean","description":"If true, iterations run concurrently (faster for I/O-bound operations). Use with parallelism to control concurrency"},"parallelism":{"description":"Maximum number of concurrent iterations when parallel=true. Limits resource usage. Can be static number or expression","$ref":"#/components/schemas/InputTransform"},"squash":{"type":"boolean"}},"required":["modules","iterator","skip_failures","type"]},"WhileloopFlow":{"type":"object","description":"Executes nested modules repeatedly while a condition is true. The loop checks the condition after each iteration. Use stop_after_if on modules to control loop termination","properties":{"modules":{"type":"array","description":"Steps to execute in each iteration. Use stop_after_if to control when the loop ends","items":{"$ref":"#/components/schemas/FlowModule"}},"skip_failures":{"type":"boolean","description":"If true, iteration failures don't stop the loop. Failed iterations return null"},"type":{"type":"string","enum":["whileloopflow"]},"parallel":{"type":"boolean","description":"If true, iterations run concurrently (use with caution in while loops)"},"parallelism":{"description":"Maximum number of concurrent iterations when parallel=true","$ref":"#/components/schemas/InputTransform"},"squash":{"type":"boolean"}},"required":["modules","skip_failures","type"]},"BranchOne":{"type":"object","description":"Conditional branching where only the first matching branch executes. Branches are evaluated in order, and the first one with a true expression runs. If no branches match, the default branch executes","properties":{"branches":{"type":"array","description":"Array of branches to evaluate in order. The first branch with expr evaluating to true executes","items":{"type":"object","properties":{"summary":{"type":"string","description":"Short description of this branch condition"},"expr":{"type":"string","description":"JavaScript expression that returns boolean. Can use 'results.step_id' or 'flow_input'. First true expr wins"},"modules":{"type":"array","description":"Steps to execute if this branch's expr is true","items":{"$ref":"#/components/schemas/FlowModule"}}},"required":["modules","expr"]}},"default":{"type":"array","description":"Steps to execute if no branch expressions match","items":{"$ref":"#/components/schemas/FlowModule"}},"type":{"type":"string","enum":["branchone"]}},"required":["branches","default","type"]},"BranchAll":{"type":"object","description":"Parallel branching where all branches execute simultaneously. Unlike BranchOne, all branches run regardless of conditions. Useful for executing independent tasks concurrently","properties":{"branches":{"type":"array","description":"Array of branches that all execute (either in parallel or sequentially)","items":{"type":"object","properties":{"summary":{"type":"string","description":"Short description of this branch's purpose"},"skip_failure":{"type":"boolean","description":"If true, failure in this branch doesn't fail the entire flow"},"modules":{"type":"array","description":"Steps to execute in this branch","items":{"$ref":"#/components/schemas/FlowModule"}}},"required":["modules"]}},"type":{"type":"string","enum":["branchall"]},"parallel":{"type":"boolean","description":"If true, all branches execute concurrently. If false, they execute sequentially"}},"required":["branches","type"]},"AgentTool":{"type":"object","description":"A tool available to an AI agent. Can be a flow module or an external MCP (Model Context Protocol) tool","properties":{"id":{"type":"string","description":"Unique identifier for this tool. Cannot contain spaces - use underscores instead (e.g., 'get_user_data' not 'get user data')"},"summary":{"type":"string","description":"Short description of what this tool does (shown to the AI)"},"value":{"$ref":"#/components/schemas/ToolValue"}},"required":["id","value"]},"ToolValue":{"description":"The implementation of a tool. Can be a flow module (script/flow) or an MCP tool reference","oneOf":[{"$ref":"#/components/schemas/FlowModuleTool"},{"$ref":"#/components/schemas/McpToolValue"},{"$ref":"#/components/schemas/WebsearchToolValue"}],"discriminator":{"propertyName":"tool_type","mapping":{"flowmodule":"#/components/schemas/FlowModuleTool","mcp":"#/components/schemas/McpToolValue","websearch":"#/components/schemas/WebsearchToolValue"}}},"FlowModuleTool":{"description":"A tool implemented as a flow module (script, flow, etc.). The AI can call this like any other flow module","allOf":[{"type":"object","properties":{"tool_type":{"type":"string","enum":["flowmodule"]}},"required":["tool_type"]},{"$ref":"#/components/schemas/FlowModuleValue"}]},"WebsearchToolValue":{"type":"object","description":"A tool implemented as a websearch tool. The AI can call this like any other websearch tool","properties":{"tool_type":{"type":"string","enum":["websearch"]}},"required":["tool_type"]},"McpToolValue":{"type":"object","description":"Reference to an external MCP (Model Context Protocol) tool. The AI can call tools from MCP servers","properties":{"tool_type":{"type":"string","enum":["mcp"]},"resource_path":{"type":"string","description":"Path to the MCP resource/server configuration"},"include_tools":{"type":"array","description":"Whitelist of specific tools to include from this MCP server","items":{"type":"string"}},"exclude_tools":{"type":"array","description":"Blacklist of tools to exclude from this MCP server","items":{"type":"string"}}},"required":["tool_type","resource_path"]},"AiAgent":{"type":"object","description":"AI agent step that can use tools to accomplish tasks. The agent receives inputs and can call any of its configured tools to complete the task","properties":{"input_transforms":{"type":"object","description":"Input parameters for the AI agent mapped to their values","properties":{"provider":{"$ref":"#/components/schemas/ProviderTransform"},"output_type":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Output format type.\\nValid values: 'text' (default) - plain text response, 'image' - image generation\\n"},"user_message":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"The user's prompt/message to the AI agent. Supports variable interpolation with flow.input syntax."},"system_prompt":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"System instructions that guide the AI's behavior, persona, and response style. Optional."},"streaming":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Boolean. If true, stream the AI response incrementally.\\nStreaming events include: token_delta, tool_call, tool_call_arguments, tool_execution, tool_result\\n"},"memory":{"$ref":"#/components/schemas/MemoryTransform"},"output_schema":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"JSON Schema object defining structured output format. Used when you need the AI to return data in a specific shape.\\nSupports standard JSON Schema properties: type, properties, required, items, enum, pattern, minLength, maxLength, minimum, maximum, etc.\\nExample: { type: 'object', properties: { name: { type: 'string' }, age: { type: 'integer' } }, required: ['name'] }\\n"},"user_images":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Array of image references for vision-capable models.\\nFormat: Array<{ bucket: string, key: string }> - S3 object references\\nExample: [{ bucket: 'my-bucket', key: 'images/photo.jpg' }]\\n"},"max_completion_tokens":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Integer. Maximum number of tokens the AI will generate in its response.\\nRange: 1 to 4,294,967,295. Typical values: 256-4096 for most use cases.\\n"},"temperature":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Float. Controls randomness/creativity of responses.\\nRange: 0.0 to 2.0 (provider-dependent)\\n- 0.0 = deterministic, focused responses\\n- 0.7 = balanced (common default)\\n- 1.0+ = more creative/random\\n"}},"required":["provider","user_message","output_type"]},"tools":{"type":"array","description":"Array of tools the agent can use. The agent decides which tools to call based on the task","items":{"$ref":"#/components/schemas/AgentTool"}},"type":{"type":"string","enum":["aiagent"]},"parallel":{"type":"boolean","description":"If true, the agent can execute multiple tool calls in parallel"}},"required":["tools","type","input_transforms"]},"Identity":{"type":"object","description":"Pass-through module that returns its input unchanged. Useful for flow structure or as a placeholder","properties":{"type":{"type":"string","enum":["identity"]},"flow":{"type":"boolean","description":"If true, marks this as a flow identity (special handling)"}},"required":["type"]},"FlowStatus":{"type":"object","properties":{"step":{"type":"integer"},"modules":{"type":"array","items":{"$ref":"#/components/schemas/FlowStatusModule"}},"user_states":{"additionalProperties":true},"preprocessor_module":{"allOf":[{"$ref":"#/components/schemas/FlowStatusModule"}]},"failure_module":{"allOf":[{"$ref":"#/components/schemas/FlowStatusModule"},{"type":"object","properties":{"parent_module":{"type":"string"}}}]},"retry":{"type":"object","properties":{"fail_count":{"type":"integer"},"failed_jobs":{"type":"array","items":{"type":"string","format":"uuid"}}}}},"required":["step","modules","failure_module"]},"FlowStatusModule":{"type":"object","properties":{"type":{"type":"string","enum":["WaitingForPriorSteps","WaitingForEvents","WaitingForExecutor","InProgress","Success","Failure"]},"id":{"type":"string"},"job":{"type":"string","format":"uuid"},"count":{"type":"integer"},"progress":{"type":"integer"},"iterator":{"type":"object","properties":{"index":{"type":"integer"},"itered":{"type":"array","items":{}},"itered_len":{"type":"integer"},"args":{}}},"flow_jobs":{"type":"array","items":{"type":"string"}},"flow_jobs_success":{"type":"array","items":{"type":"boolean"}},"flow_jobs_duration":{"type":"object","properties":{"started_at":{"type":"array","items":{"type":"string"}},"duration_ms":{"type":"array","items":{"type":"integer"}}}},"branch_chosen":{"type":"object","properties":{"type":{"type":"string","enum":["branch","default"]},"branch":{"type":"integer"}},"required":["type"]},"branchall":{"type":"object","properties":{"branch":{"type":"integer"},"len":{"type":"integer"}},"required":["branch","len"]},"approvers":{"type":"array","items":{"type":"object","properties":{"resume_id":{"type":"integer"},"approver":{"type":"string"}},"required":["resume_id","approver"]}},"failed_retries":{"type":"array","items":{"type":"string","format":"uuid"}},"skipped":{"type":"boolean"},"agent_actions":{"type":"array","items":{"type":"object","oneOf":[{"type":"object","properties":{"job_id":{"type":"string","format":"uuid"},"function_name":{"type":"string"},"type":{"type":"string","enum":["tool_call"]},"module_id":{"type":"string"}},"required":["job_id","function_name","type","module_id"]},{"type":"object","properties":{"call_id":{"type":"string","format":"uuid"},"function_name":{"type":"string"},"resource_path":{"type":"string"},"type":{"type":"string","enum":["mcp_tool_call"]},"arguments":{"type":"object"}},"required":["call_id","function_name","resource_path","type"]},{"type":"object","properties":{"type":{"type":"string","enum":["web_search"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["message"]}},"required":["content","type"]}]}},"agent_actions_success":{"type":"array","items":{"type":"boolean"}}},"required":["type"]}}`,
|
|
77907
|
+
{"OpenFlow":{"type":"object","description":"Top-level flow definition containing metadata, configuration, and the flow structure","properties":{"summary":{"type":"string","description":"Short description of what this flow does"},"description":{"type":"string","description":"Detailed documentation for this flow"},"value":{"$ref":"#/components/schemas/FlowValue"},"schema":{"type":"object","description":"JSON Schema for flow inputs. Use this to define input parameters, their types, defaults, and validation. For resource inputs, set type to 'object' and format to 'resource-<type>' (e.g., 'resource-stripe')"},"on_behalf_of_email":{"type":"string","description":"The flow will be run with the permissions of the user with this email."}},"required":["summary","value"]},"FlowValue":{"type":"object","description":"The flow structure containing modules and optional preprocessor/failure handlers","properties":{"modules":{"type":"array","description":"Array of steps that execute in sequence. Each step can be a script, subflow, loop, or branch","items":{"$ref":"#/components/schemas/FlowModule"}},"failure_module":{"description":"Special module that executes when the flow fails. Receives error object with message, name, stack, and step_id. Must have id 'failure'. Only supports script/rawscript types","$ref":"#/components/schemas/FlowModule"},"preprocessor_module":{"description":"Special module that runs before the first step on external triggers. Must have id 'preprocessor'. Only supports script/rawscript types. Cannot reference other step results","$ref":"#/components/schemas/FlowModule"},"same_worker":{"type":"boolean","description":"If true, all steps run on the same worker for better performance"},"concurrent_limit":{"type":"number","description":"Maximum number of concurrent executions of this flow"},"concurrency_key":{"type":"string","description":"Expression to group concurrent executions (e.g., by user ID)"},"concurrency_time_window_s":{"type":"number","description":"Time window in seconds for concurrent_limit"},"debounce_delay_s":{"type":"integer","description":"Delay in seconds to debounce flow executions"},"debounce_key":{"type":"string","description":"Expression to group debounced executions"},"debounce_args_to_accumulate":{"type":"array","description":"Arguments to accumulate across debounced executions","items":{"type":"string"}},"max_total_debouncing_time":{"type":"integer","description":"Maximum total time in seconds that a job can be debounced"},"max_total_debounces_amount":{"type":"integer","description":"Maximum number of times a job can be debounced"},"skip_expr":{"type":"string","description":"JavaScript expression to conditionally skip the entire flow"},"cache_ttl":{"type":"number","description":"Cache duration in seconds for flow results"},"cache_ignore_s3_path":{"type":"boolean"},"flow_env":{"type":"object","description":"Environment variables available to all steps. Values can be strings, JSON values, or special references: '$var:path' (workspace variable) or '$res:path' (resource).","additionalProperties":{}},"priority":{"type":"number","description":"Execution priority (higher numbers run first)"},"early_return":{"type":"string","description":"JavaScript expression to return early from the flow"},"chat_input_enabled":{"type":"boolean","description":"Whether this flow accepts chat-style input"},"notes":{"type":"array","description":"Sticky notes attached to the flow","items":{"$ref":"#/components/schemas/FlowNote"}},"groups":{"type":"array","description":"Semantic groups of modules for organizational purposes","items":{"$ref":"#/components/schemas/FlowGroup"}}},"required":["modules"]},"Retry":{"type":"object","description":"Retry configuration for failed module executions","properties":{"constant":{"type":"object","description":"Retry with constant delay between attempts","properties":{"attempts":{"type":"integer","description":"Number of retry attempts"},"seconds":{"type":"integer","description":"Seconds to wait between retries"}}},"exponential":{"type":"object","description":"Retry with exponential backoff (delay doubles each time)","properties":{"attempts":{"type":"integer","description":"Number of retry attempts"},"multiplier":{"type":"integer","description":"Multiplier for exponential backoff"},"seconds":{"type":"integer","minimum":1,"description":"Initial delay in seconds"},"random_factor":{"type":"integer","minimum":0,"maximum":100,"description":"Random jitter percentage (0-100) to avoid thundering herd"}}},"retry_if":{"$ref":"#/components/schemas/RetryIf"}}},"FlowNote":{"type":"object","description":"A sticky note attached to a flow for documentation and annotation","properties":{"id":{"type":"string","description":"Unique identifier for the note"},"text":{"type":"string","description":"Content of the note"},"position":{"type":"object","description":"Position of the note in the flow editor","properties":{"x":{"type":"number","description":"X coordinate"},"y":{"type":"number","description":"Y coordinate"}},"required":["x","y"]},"size":{"type":"object","description":"Size of the note in the flow editor","properties":{"width":{"type":"number","description":"Width in pixels"},"height":{"type":"number","description":"Height in pixels"}},"required":["width","height"]},"color":{"type":"string","description":"Color of the note (e.g., \\"yellow\\", \\"#ffff00\\")"},"type":{"type":"string","enum":["free","group"],"description":"Type of note - 'free' for standalone notes, 'group' for notes that group other nodes"},"locked":{"type":"boolean","default":false,"description":"Whether the note is locked and cannot be edited or moved"},"contained_node_ids":{"type":"array","items":{"type":"string"},"description":"For group notes, the IDs of nodes contained within this group"}},"required":["id","text","color","type"]},"FlowGroup":{"type":"object","description":"A semantic group of flow modules for organizational purposes. Does not affect execution \\u2014 modules remain in their original position in the flow. Groups provide naming and collapsibility in the editor. Members are computed dynamically from all nodes on paths between start_id and end_id.","properties":{"summary":{"type":"string","description":"Display name for this group"},"note":{"type":"string","description":"Markdown note shown below the group header"},"autocollapse":{"type":"boolean","default":false,"description":"If true, this group is collapsed by default in the flow editor. UI hint only."},"start_id":{"type":"string","description":"ID of the first flow module in this group (topological entry point)"},"end_id":{"type":"string","description":"ID of the last flow module in this group (topological exit point)"},"color":{"type":"string","description":"Color for the group in the flow editor"}},"required":["start_id","end_id"]},"RetryIf":{"type":"object","description":"Conditional retry based on error or result","properties":{"expr":{"type":"string","description":"JavaScript expression that returns true to retry. Has access to 'result' and 'error' variables"}},"required":["expr"]},"StopAfterIf":{"type":"object","description":"Early termination condition for a module","properties":{"skip_if_stopped":{"type":"boolean","description":"If true, following steps are skipped when this condition triggers"},"expr":{"type":"string","description":"JavaScript expression evaluated after the module runs. Can use 'result' (step's result) or 'flow_input'. Return true to stop"},"error_message":{"type":"string","nullable":true,"description":"Custom error message when stopping with an error. Mutually exclusive with skip_if_stopped. If set to a non-empty string, the flow stops with this error. If empty string, a default error message is used. If null or omitted, no error is raised."}},"required":["expr"]},"FlowModule":{"type":"object","description":"A single step in a flow. Can be a script, subflow, loop, or branch","properties":{"id":{"type":"string","description":"Unique identifier for this step. Used to reference results via 'results.step_id'. Must be a valid identifier (alphanumeric, underscore, hyphen)"},"value":{"$ref":"#/components/schemas/FlowModuleValue"},"stop_after_if":{"description":"Early termination condition evaluated after this step completes","$ref":"#/components/schemas/StopAfterIf"},"stop_after_all_iters_if":{"description":"For loops only - early termination condition evaluated after all iterations complete","$ref":"#/components/schemas/StopAfterIf"},"skip_if":{"type":"object","description":"Conditionally skip this step based on previous results or flow inputs","properties":{"expr":{"type":"string","description":"JavaScript expression that returns true to skip. Can use 'flow_input' or 'results.<step_id>'"}},"required":["expr"]},"sleep":{"description":"Delay before executing this step (in seconds or as expression)","$ref":"#/components/schemas/InputTransform"},"cache_ttl":{"type":"number","description":"Cache duration in seconds for this step's results"},"cache_ignore_s3_path":{"type":"boolean"},"timeout":{"description":"Maximum execution time in seconds (static value or expression)","$ref":"#/components/schemas/InputTransform"},"delete_after_use":{"type":"boolean","description":"If true, this step's result is deleted after use to save memory"},"summary":{"type":"string","description":"Short description of what this step does"},"mock":{"type":"object","description":"Mock configuration for testing without executing the actual step","properties":{"enabled":{"type":"boolean","description":"If true, return mock value instead of executing"},"return_value":{"description":"Value to return when mocked"}}},"suspend":{"type":"object","description":"Configuration for approval/resume steps that wait for user input","properties":{"required_events":{"type":"integer","description":"Number of approvals required before continuing"},"timeout":{"type":"integer","description":"Timeout in seconds before auto-continuing or canceling"},"resume_form":{"type":"object","description":"Form schema for collecting input when resuming","properties":{"schema":{"type":"object","description":"JSON Schema for the resume form"}}},"user_auth_required":{"type":"boolean","description":"If true, only authenticated users can approve"},"user_groups_required":{"description":"Expression or list of groups that can approve","$ref":"#/components/schemas/InputTransform"},"self_approval_disabled":{"type":"boolean","description":"If true, the user who started the flow cannot approve"},"hide_cancel":{"type":"boolean","description":"If true, hide the cancel button on the approval form"},"continue_on_disapprove_timeout":{"type":"boolean","description":"If true, continue flow on timeout instead of canceling"}}},"priority":{"type":"number","description":"Execution priority for this step (higher numbers run first)"},"continue_on_error":{"type":"boolean","description":"If true, flow continues even if this step fails"},"retry":{"description":"Retry configuration if this step fails","$ref":"#/components/schemas/Retry"},"debouncing":{"description":"Debounce configuration for this step (EE only)","type":"object","properties":{"debounce_delay_s":{"type":"integer","description":"Delay in seconds to debounce this step's executions across flow runs"},"debounce_key":{"type":"string","description":"Expression to group debounced executions. Supports $workspace and $args[name]. Default: $workspace/flow/<flow_path>-<step_id>"},"debounce_args_to_accumulate":{"type":"array","description":"Array-type arguments to accumulate across debounced executions","items":{"type":"string"}},"max_total_debouncing_time":{"type":"integer","description":"Maximum total time in seconds before forced execution"},"max_total_debounces_amount":{"type":"integer","description":"Maximum number of debounces before forced execution"}}}},"required":["value","id"]},"InputTransform":{"description":"Maps input parameters for a step. Can be a static value or a JavaScript expression that references previous results or flow inputs","oneOf":[{"$ref":"#/components/schemas/StaticTransform"},{"$ref":"#/components/schemas/JavascriptTransform"},{"$ref":"#/components/schemas/AiTransform"}],"discriminator":{"propertyName":"type","mapping":{"static":"#/components/schemas/StaticTransform","javascript":"#/components/schemas/JavascriptTransform","ai":"#/components/schemas/AiTransform"}}},"StaticTransform":{"type":"object","description":"Static value passed directly to the step. Use for hardcoded values or resource references like '$res:path/to/resource'","properties":{"value":{"description":"The static value. For resources, use format '$res:path/to/resource'"},"type":{"type":"string","enum":["static"]}},"required":["type"]},"JavascriptTransform":{"type":"object","description":"JavaScript expression evaluated at runtime. Can reference previous step results via 'results.step_id' or flow inputs via 'flow_input.property'. Inside loops, use 'flow_input.iter.value' for the current iteration value","properties":{"expr":{"type":"string","description":"JavaScript expression returning the value. Available variables - results (object with all previous step results), flow_input (flow inputs), flow_input.iter (in loops)"},"type":{"type":"string","enum":["javascript"]}},"required":["expr","type"]},"AiTransform":{"type":"object","description":"Value resolved by the AI runtime for this input. The AI engine decides how to satisfy the parameter.","properties":{"type":{"type":"string","enum":["ai"]}},"required":["type"]},"AIProviderKind":{"type":"string","description":"Supported AI provider types","enum":["openai","azure_openai","anthropic","mistral","deepseek","googleai","groq","openrouter","togetherai","customai","aws_bedrock"]},"ProviderConfig":{"type":"object","description":"Complete AI provider configuration with resource reference and model selection","properties":{"kind":{"$ref":"#/components/schemas/AIProviderKind"},"resource":{"type":"string","description":"Resource reference in format '$res:{resource_path}' pointing to provider credentials"},"model":{"type":"string","description":"Model identifier (e.g., 'gpt-4', 'claude-3-opus-20240229', 'gemini-pro')"}},"required":["kind","resource","model"]},"StaticProviderTransform":{"type":"object","description":"Static provider configuration passed directly to the AI agent","properties":{"value":{"$ref":"#/components/schemas/ProviderConfig"},"type":{"type":"string","enum":["static"]}},"required":["type","value"]},"ProviderTransform":{"description":"Provider configuration - can be static (ProviderConfig), JavaScript expression, or AI-determined","oneOf":[{"$ref":"#/components/schemas/StaticProviderTransform"},{"$ref":"#/components/schemas/JavascriptTransform"},{"$ref":"#/components/schemas/AiTransform"}],"discriminator":{"propertyName":"type","mapping":{"static":"#/components/schemas/StaticProviderTransform","javascript":"#/components/schemas/JavascriptTransform","ai":"#/components/schemas/AiTransform"}}},"MemoryOff":{"type":"object","description":"No conversation memory/context","properties":{"kind":{"type":"string","enum":["off"]}},"required":["kind"]},"MemoryAuto":{"type":"object","description":"Automatic context management","properties":{"kind":{"type":"string","enum":["auto"]},"context_length":{"type":"integer","description":"Maximum number of messages to retain in context"},"memory_id":{"type":"string","description":"Identifier for persistent memory across agent invocations"}},"required":["kind"]},"MemoryMessage":{"type":"object","description":"A single message in conversation history","properties":{"role":{"type":"string","enum":["user","assistant","system"]},"content":{"type":"string"}},"required":["role","content"]},"MemoryManual":{"type":"object","description":"Explicit message history","properties":{"kind":{"type":"string","enum":["manual"]},"messages":{"type":"array","items":{"$ref":"#/components/schemas/MemoryMessage"}}},"required":["kind","messages"]},"MemoryConfig":{"description":"Conversation memory configuration","oneOf":[{"$ref":"#/components/schemas/MemoryOff"},{"$ref":"#/components/schemas/MemoryAuto"},{"$ref":"#/components/schemas/MemoryManual"}],"discriminator":{"propertyName":"kind","mapping":{"off":"#/components/schemas/MemoryOff","auto":"#/components/schemas/MemoryAuto","manual":"#/components/schemas/MemoryManual"}}},"StaticMemoryTransform":{"type":"object","description":"Static memory configuration passed directly to the AI agent","properties":{"value":{"$ref":"#/components/schemas/MemoryConfig"},"type":{"type":"string","enum":["static"]}},"required":["type","value"]},"MemoryTransform":{"description":"Memory configuration - can be static (MemoryConfig), JavaScript expression, or AI-determined","oneOf":[{"$ref":"#/components/schemas/StaticMemoryTransform"},{"$ref":"#/components/schemas/JavascriptTransform"},{"$ref":"#/components/schemas/AiTransform"}],"discriminator":{"propertyName":"type","mapping":{"static":"#/components/schemas/StaticMemoryTransform","javascript":"#/components/schemas/JavascriptTransform","ai":"#/components/schemas/AiTransform"}}},"FlowModuleValue":{"description":"The actual implementation of a flow step. Can be a script (inline or referenced), subflow, loop, branch, or special module type","oneOf":[{"$ref":"#/components/schemas/RawScript"},{"$ref":"#/components/schemas/PathScript"},{"$ref":"#/components/schemas/PathFlow"},{"$ref":"#/components/schemas/ForloopFlow"},{"$ref":"#/components/schemas/WhileloopFlow"},{"$ref":"#/components/schemas/BranchOne"},{"$ref":"#/components/schemas/BranchAll"},{"$ref":"#/components/schemas/Identity"},{"$ref":"#/components/schemas/AiAgent"}],"discriminator":{"propertyName":"type","mapping":{"rawscript":"#/components/schemas/RawScript","script":"#/components/schemas/PathScript","flow":"#/components/schemas/PathFlow","forloopflow":"#/components/schemas/ForloopFlow","whileloopflow":"#/components/schemas/WhileloopFlow","branchone":"#/components/schemas/BranchOne","branchall":"#/components/schemas/BranchAll","identity":"#/components/schemas/Identity","aiagent":"#/components/schemas/AiAgent"}}},"RawScript":{"type":"object","description":"Inline script with code defined directly in the flow. Use 'bun' as default language if unspecified. The script receives arguments from input_transforms","properties":{"input_transforms":{"type":"object","description":"Map of parameter names to their values (static or JavaScript expressions). These become the script's input arguments","additionalProperties":{"$ref":"#/components/schemas/InputTransform"}},"content":{"type":"string","description":"The script source code. Should export a 'main' function"},"language":{"type":"string","description":"Programming language for this script","enum":["deno","bun","python3","go","bash","powershell","postgresql","mysql","bigquery","snowflake","mssql","oracledb","graphql","nativets","php","rust","ansible","csharp","nu","java","ruby","duckdb"]},"path":{"type":"string","description":"Optional path for saving this script"},"lock":{"type":"string","description":"Lock file content for dependencies"},"type":{"type":"string","enum":["rawscript"]},"tag":{"type":"string","description":"Worker group tag for execution routing"},"concurrent_limit":{"type":"number","description":"Maximum concurrent executions of this script"},"concurrency_time_window_s":{"type":"number","description":"Time window for concurrent_limit"},"custom_concurrency_key":{"type":"string","description":"Custom key for grouping concurrent executions"},"is_trigger":{"type":"boolean","description":"If true, this script is a trigger that can start the flow"},"assets":{"type":"array","description":"External resources this script accesses (S3 objects, resources, etc.)","items":{"type":"object","required":["path","kind"],"properties":{"path":{"type":"string","description":"Path to the asset"},"kind":{"type":"string","description":"Type of asset","enum":["s3object","resource","ducklake","datatable","volume"]},"access_type":{"type":"string","nullable":true,"description":"Access level for this asset","enum":["r","w","rw"]},"alt_access_type":{"type":"string","nullable":true,"description":"Alternative access level","enum":["r","w","rw"]}}}}},"required":["type","content","language","input_transforms"]},"PathScript":{"type":"object","description":"Reference to an existing script by path. Use this when calling a previously saved script instead of writing inline code","properties":{"input_transforms":{"type":"object","description":"Map of parameter names to their values (static or JavaScript expressions). These become the script's input arguments","additionalProperties":{"$ref":"#/components/schemas/InputTransform"}},"path":{"type":"string","description":"Path to the script in the workspace (e.g., 'f/scripts/send_email')"},"hash":{"type":"string","description":"Optional specific version hash of the script to use"},"type":{"type":"string","enum":["script"]},"tag_override":{"type":"string","description":"Override the script's default worker group tag"},"is_trigger":{"type":"boolean","description":"If true, this script is a trigger that can start the flow"}},"required":["type","path","input_transforms"]},"PathFlow":{"type":"object","description":"Reference to an existing flow by path. Use this to call another flow as a subflow","properties":{"input_transforms":{"type":"object","description":"Map of parameter names to their values (static or JavaScript expressions). These become the subflow's input arguments","additionalProperties":{"$ref":"#/components/schemas/InputTransform"}},"path":{"type":"string","description":"Path to the flow in the workspace (e.g., 'f/flows/process_user')"},"type":{"type":"string","enum":["flow"]}},"required":["type","path","input_transforms"]},"ForloopFlow":{"type":"object","description":"Executes nested modules in a loop over an iterator. Inside the loop, use 'flow_input.iter.value' to access the current iteration value, and 'flow_input.iter.index' for the index. Supports parallel execution for better performance on I/O-bound operations","properties":{"modules":{"type":"array","description":"Steps to execute for each iteration. These can reference the iteration value via 'flow_input.iter.value'","items":{"$ref":"#/components/schemas/FlowModule"}},"iterator":{"description":"JavaScript expression that returns an array to iterate over. Can reference 'results.step_id' or 'flow_input'","$ref":"#/components/schemas/InputTransform"},"skip_failures":{"type":"boolean","description":"If true, iteration failures don't stop the loop. Failed iterations return null"},"type":{"type":"string","enum":["forloopflow"]},"parallel":{"type":"boolean","description":"If true, iterations run concurrently (faster for I/O-bound operations). Use with parallelism to control concurrency"},"parallelism":{"description":"Maximum number of concurrent iterations when parallel=true. Limits resource usage. Can be static number or expression","$ref":"#/components/schemas/InputTransform"},"squash":{"type":"boolean"}},"required":["modules","iterator","skip_failures","type"]},"WhileloopFlow":{"type":"object","description":"Executes nested modules repeatedly while a condition is true. The loop checks the condition after each iteration. Use stop_after_if on modules to control loop termination","properties":{"modules":{"type":"array","description":"Steps to execute in each iteration. Use stop_after_if to control when the loop ends","items":{"$ref":"#/components/schemas/FlowModule"}},"skip_failures":{"type":"boolean","description":"If true, iteration failures don't stop the loop. Failed iterations return null"},"type":{"type":"string","enum":["whileloopflow"]},"parallel":{"type":"boolean","description":"If true, iterations run concurrently (use with caution in while loops)"},"parallelism":{"description":"Maximum number of concurrent iterations when parallel=true","$ref":"#/components/schemas/InputTransform"},"squash":{"type":"boolean"}},"required":["modules","skip_failures","type"]},"BranchOne":{"type":"object","description":"Conditional branching where only the first matching branch executes. Branches are evaluated in order, and the first one with a true expression runs. If no branches match, the default branch executes","properties":{"branches":{"type":"array","description":"Array of branches to evaluate in order. The first branch with expr evaluating to true executes","items":{"type":"object","properties":{"summary":{"type":"string","description":"Short description of this branch condition"},"expr":{"type":"string","description":"JavaScript expression that returns boolean. Can use 'results.step_id' or 'flow_input'. First true expr wins"},"modules":{"type":"array","description":"Steps to execute if this branch's expr is true","items":{"$ref":"#/components/schemas/FlowModule"}}},"required":["modules","expr"]}},"default":{"type":"array","description":"Steps to execute if no branch expressions match","items":{"$ref":"#/components/schemas/FlowModule"}},"type":{"type":"string","enum":["branchone"]}},"required":["branches","default","type"]},"BranchAll":{"type":"object","description":"Parallel branching where all branches execute simultaneously. Unlike BranchOne, all branches run regardless of conditions. Useful for executing independent tasks concurrently","properties":{"branches":{"type":"array","description":"Array of branches that all execute (either in parallel or sequentially)","items":{"type":"object","properties":{"summary":{"type":"string","description":"Short description of this branch's purpose"},"skip_failure":{"type":"boolean","description":"If true, failure in this branch doesn't fail the entire flow"},"modules":{"type":"array","description":"Steps to execute in this branch","items":{"$ref":"#/components/schemas/FlowModule"}}},"required":["modules"]}},"type":{"type":"string","enum":["branchall"]},"parallel":{"type":"boolean","description":"If true, all branches execute concurrently. If false, they execute sequentially"}},"required":["branches","type"]},"AgentTool":{"type":"object","description":"A tool available to an AI agent. Can be a flow module or an external MCP (Model Context Protocol) tool","properties":{"id":{"type":"string","description":"Unique identifier for this tool. Cannot contain spaces - use underscores instead (e.g., 'get_user_data' not 'get user data')"},"summary":{"type":"string","description":"Short description of what this tool does (shown to the AI)"},"value":{"$ref":"#/components/schemas/ToolValue"}},"required":["id","value"]},"ToolValue":{"description":"The implementation of a tool. Can be a flow module (script/flow) or an MCP tool reference","oneOf":[{"$ref":"#/components/schemas/FlowModuleTool"},{"$ref":"#/components/schemas/McpToolValue"},{"$ref":"#/components/schemas/WebsearchToolValue"}],"discriminator":{"propertyName":"tool_type","mapping":{"flowmodule":"#/components/schemas/FlowModuleTool","mcp":"#/components/schemas/McpToolValue","websearch":"#/components/schemas/WebsearchToolValue"}}},"FlowModuleTool":{"description":"A tool implemented as a flow module (script, flow, etc.). The AI can call this like any other flow module","allOf":[{"type":"object","properties":{"tool_type":{"type":"string","enum":["flowmodule"]}},"required":["tool_type"]},{"$ref":"#/components/schemas/FlowModuleValue"}]},"WebsearchToolValue":{"type":"object","description":"A tool implemented as a websearch tool. The AI can call this like any other websearch tool","properties":{"tool_type":{"type":"string","enum":["websearch"]}},"required":["tool_type"]},"McpToolValue":{"type":"object","description":"Reference to an external MCP (Model Context Protocol) tool. The AI can call tools from MCP servers","properties":{"tool_type":{"type":"string","enum":["mcp"]},"resource_path":{"type":"string","description":"Path to the MCP resource/server configuration"},"include_tools":{"type":"array","description":"Whitelist of specific tools to include from this MCP server","items":{"type":"string"}},"exclude_tools":{"type":"array","description":"Blacklist of tools to exclude from this MCP server","items":{"type":"string"}}},"required":["tool_type","resource_path"]},"AiAgent":{"type":"object","description":"AI agent step that can use tools to accomplish tasks. The agent receives inputs and can call any of its configured tools to complete the task","properties":{"input_transforms":{"type":"object","description":"Input parameters for the AI agent mapped to their values","properties":{"provider":{"$ref":"#/components/schemas/ProviderTransform"},"output_type":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Output format type.\\nValid values: 'text' (default) - plain text response, 'image' - image generation\\n"},"user_message":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"The user's prompt/message to the AI agent. Supports variable interpolation with flow.input syntax."},"system_prompt":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"System instructions that guide the AI's behavior, persona, and response style. Optional."},"streaming":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Boolean. If true, stream the AI response incrementally.\\nStreaming events include: token_delta, tool_call, tool_call_arguments, tool_execution, tool_result\\n"},"memory":{"$ref":"#/components/schemas/MemoryTransform"},"output_schema":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"JSON Schema object defining structured output format. Used when you need the AI to return data in a specific shape.\\nSupports standard JSON Schema properties: type, properties, required, items, enum, pattern, minLength, maxLength, minimum, maximum, etc.\\nExample: { type: 'object', properties: { name: { type: 'string' }, age: { type: 'integer' } }, required: ['name'] }\\n"},"user_images":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Array of image references for vision-capable models.\\nFormat: Array<{ bucket: string, key: string }> - S3 object references\\nExample: [{ bucket: 'my-bucket', key: 'images/photo.jpg' }]\\n"},"max_completion_tokens":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Integer. Maximum number of tokens the AI will generate in its response.\\nRange: 1 to 4,294,967,295. Typical values: 256-4096 for most use cases.\\n"},"temperature":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Float. Controls randomness/creativity of responses.\\nRange: 0.0 to 2.0 (provider-dependent)\\n- 0.0 = deterministic, focused responses\\n- 0.7 = balanced (common default)\\n- 1.0+ = more creative/random\\n"}},"required":["provider","user_message","output_type"]},"tools":{"type":"array","description":"Array of tools the agent can use. The agent decides which tools to call based on the task","items":{"$ref":"#/components/schemas/AgentTool"}},"type":{"type":"string","enum":["aiagent"]},"parallel":{"type":"boolean","description":"If true, the agent can execute multiple tool calls in parallel"}},"required":["tools","type","input_transforms"]},"Identity":{"type":"object","description":"Pass-through module that returns its input unchanged. Useful for flow structure or as a placeholder","properties":{"type":{"type":"string","enum":["identity"]},"flow":{"type":"boolean","description":"If true, marks this as a flow identity (special handling)"}},"required":["type"]},"FlowStatus":{"type":"object","properties":{"step":{"type":"integer"},"modules":{"type":"array","items":{"$ref":"#/components/schemas/FlowStatusModule"}},"user_states":{"additionalProperties":true},"preprocessor_module":{"allOf":[{"$ref":"#/components/schemas/FlowStatusModule"}]},"failure_module":{"allOf":[{"$ref":"#/components/schemas/FlowStatusModule"},{"type":"object","properties":{"parent_module":{"type":"string"}}}]},"retry":{"type":"object","properties":{"fail_count":{"type":"integer"},"failed_jobs":{"type":"array","items":{"type":"string","format":"uuid"}}}}},"required":["step","modules","failure_module"]},"FlowStatusModule":{"type":"object","properties":{"type":{"type":"string","enum":["WaitingForPriorSteps","WaitingForEvents","WaitingForExecutor","InProgress","Success","Failure"]},"id":{"type":"string"},"job":{"type":"string","format":"uuid"},"count":{"type":"integer"},"progress":{"type":"integer"},"iterator":{"type":"object","properties":{"index":{"type":"integer"},"itered":{"type":"array","items":{}},"itered_len":{"type":"integer"},"args":{}}},"flow_jobs":{"type":"array","items":{"type":"string"}},"flow_jobs_success":{"type":"array","items":{"type":"boolean"}},"flow_jobs_duration":{"type":"object","properties":{"started_at":{"type":"array","items":{"type":"string"}},"duration_ms":{"type":"array","items":{"type":"integer"}}}},"branch_chosen":{"type":"object","properties":{"type":{"type":"string","enum":["branch","default"]},"branch":{"type":"integer"}},"required":["type"]},"branchall":{"type":"object","properties":{"branch":{"type":"integer"},"len":{"type":"integer"}},"required":["branch","len"]},"approvers":{"type":"array","items":{"type":"object","properties":{"resume_id":{"type":"integer"},"approver":{"type":"string"}},"required":["resume_id","approver"]}},"failed_retries":{"type":"array","items":{"type":"string","format":"uuid"}},"skipped":{"type":"boolean"},"agent_actions":{"type":"array","items":{"type":"object","oneOf":[{"type":"object","properties":{"job_id":{"type":"string","format":"uuid"},"function_name":{"type":"string"},"type":{"type":"string","enum":["tool_call"]},"module_id":{"type":"string"}},"required":["job_id","function_name","type","module_id"]},{"type":"object","properties":{"call_id":{"type":"string","format":"uuid"},"function_name":{"type":"string"},"resource_path":{"type":"string"},"type":{"type":"string","enum":["mcp_tool_call"]},"arguments":{"type":"object"}},"required":["call_id","function_name","resource_path","type"]},{"type":"object","properties":{"type":{"type":"string","enum":["web_search"]}},"required":["type"]},{"type":"object","properties":{"type":{"type":"string","enum":["message"]}},"required":["content","type"]}]}},"agent_actions_success":{"type":"array","items":{"type":"boolean"}}},"required":["type"]}}`,
|
|
77838
77908
|
"raw-app": `---
|
|
77839
77909
|
name: raw-app
|
|
77840
77910
|
description: MUST use when creating raw apps.
|
|
@@ -78082,18 +78152,9 @@ Tell the user they can run these commands (do NOT run them yourself):
|
|
|
78082
78152
|
| \`wmill app dev\` | Start dev server with live reload |
|
|
78083
78153
|
| \`wmill app generate-agents\` | Refresh AGENTS.md and DATATABLES.md |
|
|
78084
78154
|
| \`wmill app generate-locks\` | Generate lock files for backend runnables |
|
|
78085
|
-
| \`wmill sync push
|
|
78155
|
+
| \`wmill sync push\` | Deploy app to Windmill |
|
|
78086
78156
|
| \`wmill sync pull\` | Pull latest from Windmill |
|
|
78087
78157
|
|
|
78088
|
-
## Svelte 5 Event Handling
|
|
78089
|
-
|
|
78090
|
-
When building Svelte 5 raw apps, be aware of event delegation:
|
|
78091
|
-
|
|
78092
|
-
- The Svelte runtime version in \`node_modules/svelte\` **must match** the compiler version used by \`wmill sync push\`. If you get \`$.delegated is undefined\` errors at runtime, run \`npm install svelte@latest\` in the raw app folder and re-push.
|
|
78093
|
-
- \`onclick\` on \`<div>\`, \`<span>\`, and other non-interactive elements uses Svelte's event delegation system. If the runtime doesn't support it, you'll get errors.
|
|
78094
|
-
- \`onclick\` on \`<button>\` elements is native and generally works fine.
|
|
78095
|
-
- For modal overlays or click-outside patterns, prefer using \`<button>\` elements styled as overlays, or ensure the Svelte runtime is up to date.
|
|
78096
|
-
|
|
78097
78158
|
## Best Practices
|
|
78098
78159
|
|
|
78099
78160
|
1. **Check DATATABLES.md** for existing tables before creating new ones
|
|
@@ -78534,6 +78595,7 @@ flow related commands
|
|
|
78534
78595
|
- \`--remote\` - Use deployed workspace scripts for PathScript steps instead of local files.
|
|
78535
78596
|
- \`flow generate-locks [flow:file]\` - re-generate the lock files of all inline scripts of all updated flows
|
|
78536
78597
|
- \`--yes\` - Skip confirmation prompt
|
|
78598
|
+
- \`--dry-run\` - Perform a dry run without making changes
|
|
78537
78599
|
- \`-i --includes <patterns:file[]>\` - Comma separated patterns to specify which file to take into account (among files that are compatible with windmill). Patterns can include * (any string until '/') and ** (any string)
|
|
78538
78600
|
- \`-e --excludes <patterns:file[]>\` - Comma separated patterns to specify which file to NOT take into account.
|
|
78539
78601
|
- \`flow new <flow_path:string>\` - create a new empty flow
|
|
@@ -78576,6 +78638,7 @@ Generate metadata (locks, schemas) for all scripts, flows, and apps
|
|
|
78576
78638
|
- \`--skip-scripts\` - Skip processing scripts
|
|
78577
78639
|
- \`--skip-flows\` - Skip processing flows
|
|
78578
78640
|
- \`--skip-apps\` - Skip processing apps
|
|
78641
|
+
- \`--strict-folder-boundaries\` - Only update items inside the specified folder (requires folder argument)
|
|
78579
78642
|
- \`-i --includes <patterns:file[]>\` - Comma separated patterns to specify which files to include
|
|
78580
78643
|
- \`-e --excludes <patterns:file[]>\` - Comma separated patterns to specify which files to exclude
|
|
78581
78644
|
|
|
@@ -80033,10 +80096,10 @@ Current Git branch: ${colors.bold(currentBranch)}`));
|
|
|
80033
80096
|
info(colors.green("Created CLAUDE.md"));
|
|
80034
80097
|
}
|
|
80035
80098
|
try {
|
|
80036
|
-
await
|
|
80099
|
+
await mkdir9(".claude/skills", { recursive: true });
|
|
80037
80100
|
await Promise.all(SKILLS.map(async (skill) => {
|
|
80038
80101
|
const skillDir = `.claude/skills/${skill.name}`;
|
|
80039
|
-
await
|
|
80102
|
+
await mkdir9(skillDir, { recursive: true });
|
|
80040
80103
|
let skillContent = SKILL_CONTENT[skill.name];
|
|
80041
80104
|
if (skillContent) {
|
|
80042
80105
|
if (nonDottedPaths) {
|
|
@@ -80543,7 +80606,7 @@ var docs_default = command30;
|
|
|
80543
80606
|
|
|
80544
80607
|
// src/main.ts
|
|
80545
80608
|
await init_context();
|
|
80546
|
-
var VERSION = "1.
|
|
80609
|
+
var VERSION = "1.665.0";
|
|
80547
80610
|
var command31 = new Command().name("wmill").action(() => info(`Welcome to Windmill CLI ${VERSION}. Use -h for help.`)).description("Windmill CLI").globalOption("--workspace <workspace:string>", "Specify the target workspace. This overrides the default workspace.").globalOption("--debug --verbose", "Show debug/verbose logs").globalOption("--show-diffs", "Show diff informations when syncing (may show sensitive informations)").globalOption("--token <token:string>", "Specify an API token. This will override any stored token.").globalOption("--base-url <baseUrl:string>", "Specify the base URL of the API. If used, --token and --workspace are required and no local remote/workspace already set will be used.").globalOption("--config-dir <configDir:string>", "Specify a custom config directory. Overrides WMILL_CONFIG_DIR environment variable and default ~/.config location.").env("HEADERS <headers:string>", `Specify headers to use for all requests. e.g: "HEADERS='h1: v1, h2: v2'"`).version(VERSION).versionOption(false).command("init", init_default).command("app", app_default).command("flow", flow_default).command("script", script_default).command("workspace", workspace_default).command("resource", resource_default).command("resource-type", resource_type_default).command("user", user_default).command("variable", variable_default).command("hub", hub_default).command("folder", folder_default).command("schedule", schedule_default).command("trigger", trigger_default).command("dev", dev_default2).command("sync", sync_default).command("lint", lint_default).command("gitsync-settings", gitsync_settings_default).command("instance", instance_default).command("worker-groups", worker_groups_default).command("workers", workers_default).command("queues", queues_default).command("dependencies", dependencies_default).command("jobs", jobs_default).command("generate-metadata", generate_metadata_default).command("docs", docs_default).command("version --version", "Show version information").action(async (opts) => {
|
|
80548
80611
|
console.log("CLI version: " + VERSION);
|
|
80549
80612
|
try {
|