windmill-cli 1.689.0 → 1.690.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 +315 -40
- package/package.json +1 -1
package/esm/main.js
CHANGED
|
@@ -16701,7 +16701,7 @@ var init_OpenAPI = __esm(() => {
|
|
|
16701
16701
|
PASSWORD: undefined,
|
|
16702
16702
|
TOKEN: getEnv3("WM_TOKEN"),
|
|
16703
16703
|
USERNAME: undefined,
|
|
16704
|
-
VERSION: "1.
|
|
16704
|
+
VERSION: "1.690.0",
|
|
16705
16705
|
WITH_CREDENTIALS: true,
|
|
16706
16706
|
interceptors: {
|
|
16707
16707
|
request: new Interceptors,
|
|
@@ -17008,6 +17008,7 @@ __export(exports_services_gen, {
|
|
|
17008
17008
|
updateFlow: () => updateFlow,
|
|
17009
17009
|
updateEmailTrigger: () => updateEmailTrigger,
|
|
17010
17010
|
updateConfig: () => updateConfig,
|
|
17011
|
+
updateAzureTrigger: () => updateAzureTrigger,
|
|
17011
17012
|
updateAppRaw: () => updateAppRaw,
|
|
17012
17013
|
updateAppHistory: () => updateAppHistory,
|
|
17013
17014
|
updateApp: () => updateApp,
|
|
@@ -17029,6 +17030,7 @@ __export(exports_services_gen, {
|
|
|
17029
17030
|
testGcpConnection: () => testGcpConnection,
|
|
17030
17031
|
testCriticalChannels: () => testCriticalChannels,
|
|
17031
17032
|
testAzureKvBackend: () => testAzureKvBackend,
|
|
17033
|
+
testAzureConnection: () => testAzureConnection,
|
|
17032
17034
|
testAwsSmBackend: () => testAwsSmBackend,
|
|
17033
17035
|
syncNativeTriggers: () => syncNativeTriggers,
|
|
17034
17036
|
submitOnboardingData: () => submitOnboardingData,
|
|
@@ -17061,6 +17063,7 @@ __export(exports_services_gen, {
|
|
|
17061
17063
|
setEmailTriggerMode: () => setEmailTriggerMode,
|
|
17062
17064
|
setDefaultErrorOrRecoveryHandler: () => setDefaultErrorOrRecoveryHandler,
|
|
17063
17065
|
setCaptureConfig: () => setCaptureConfig,
|
|
17066
|
+
setAzureTriggerMode: () => setAzureTriggerMode,
|
|
17064
17067
|
sendStats: () => sendStats,
|
|
17065
17068
|
sendMessageToConversation: () => sendMessageToConversation,
|
|
17066
17069
|
searchLogsIndex: () => searchLogsIndex,
|
|
@@ -17254,6 +17257,11 @@ __export(exports_services_gen, {
|
|
|
17254
17257
|
listCompletedJobs: () => listCompletedJobs,
|
|
17255
17258
|
listCaptures: () => listCaptures,
|
|
17256
17259
|
listBlacklistedAgentTokens: () => listBlacklistedAgentTokens,
|
|
17260
|
+
listAzureTriggers: () => listAzureTriggers,
|
|
17261
|
+
listAzureNamespaces: () => listAzureNamespaces,
|
|
17262
|
+
listAzureNamespaceTopics: () => listAzureNamespaceTopics,
|
|
17263
|
+
listAzureNamespaceSubscriptions: () => listAzureNamespaceSubscriptions,
|
|
17264
|
+
listAzureBasicTopics: () => listAzureBasicTopics,
|
|
17257
17265
|
listAvailableTeamsIds: () => listAvailableTeamsIds,
|
|
17258
17266
|
listAvailableTeamsChannels: () => listAvailableTeamsChannels,
|
|
17259
17267
|
listAvailableScopes: () => listAvailableScopes,
|
|
@@ -17446,6 +17454,7 @@ __export(exports_services_gen, {
|
|
|
17446
17454
|
getCiTestResults: () => getCiTestResults,
|
|
17447
17455
|
getCaptureConfigs: () => getCaptureConfigs,
|
|
17448
17456
|
getCapture: () => getCapture,
|
|
17457
|
+
getAzureTrigger: () => getAzureTrigger,
|
|
17449
17458
|
getAuditLog: () => getAuditLog,
|
|
17450
17459
|
getArgsFromHistoryOrSavedInput: () => getArgsFromHistoryOrSavedInput,
|
|
17451
17460
|
getApprovalInfo: () => getApprovalInfo,
|
|
@@ -17493,6 +17502,7 @@ __export(exports_services_gen, {
|
|
|
17493
17502
|
existsEmailTrigger: () => existsEmailTrigger,
|
|
17494
17503
|
existsEmailLocalPart: () => existsEmailLocalPart,
|
|
17495
17504
|
existsEmail: () => existsEmail,
|
|
17505
|
+
existsAzureTrigger: () => existsAzureTrigger,
|
|
17496
17506
|
existsApp: () => existsApp,
|
|
17497
17507
|
executeComponent: () => executeComponent,
|
|
17498
17508
|
encryptValue: () => encryptValue,
|
|
@@ -17570,6 +17580,8 @@ __export(exports_services_gen, {
|
|
|
17570
17580
|
deleteConcurrencyGroup: () => deleteConcurrencyGroup,
|
|
17571
17581
|
deleteCompletedJob: () => deleteCompletedJob,
|
|
17572
17582
|
deleteCapture: () => deleteCapture,
|
|
17583
|
+
deleteAzureTrigger: () => deleteAzureTrigger,
|
|
17584
|
+
deleteAzureSubscription: () => deleteAzureSubscription,
|
|
17573
17585
|
deleteApp: () => deleteApp,
|
|
17574
17586
|
declineInvite: () => declineInvite,
|
|
17575
17587
|
datasetStorageTestConnection: () => datasetStorageTestConnection,
|
|
@@ -17615,6 +17627,7 @@ __export(exports_services_gen, {
|
|
|
17615
17627
|
createDeploymentRequestComment: () => createDeploymentRequestComment,
|
|
17616
17628
|
createDeploymentRequest: () => createDeploymentRequest,
|
|
17617
17629
|
createCustomerPortalSession: () => createCustomerPortalSession,
|
|
17630
|
+
createAzureTrigger: () => createAzureTrigger,
|
|
17618
17631
|
createAppRaw: () => createAppRaw,
|
|
17619
17632
|
createApp: () => createApp,
|
|
17620
17633
|
createAgentToken: () => createAgentToken,
|
|
@@ -20970,7 +20983,7 @@ var backendVersion = () => {
|
|
|
20970
20983
|
query: {
|
|
20971
20984
|
page: data3.page,
|
|
20972
20985
|
per_page: data3.perPage,
|
|
20973
|
-
|
|
20986
|
+
after_seq: data3.afterSeq
|
|
20974
20987
|
}
|
|
20975
20988
|
});
|
|
20976
20989
|
}, listPathAutocompletePaths = (data3) => {
|
|
@@ -21849,7 +21862,8 @@ var backendVersion = () => {
|
|
|
21849
21862
|
},
|
|
21850
21863
|
query: {
|
|
21851
21864
|
no_logs: data3.noLogs,
|
|
21852
|
-
no_code: data3.noCode
|
|
21865
|
+
no_code: data3.noCode,
|
|
21866
|
+
approval_token: data3.approvalToken
|
|
21853
21867
|
}
|
|
21854
21868
|
});
|
|
21855
21869
|
}, getRootJobId = (data3) => {
|
|
@@ -23265,6 +23279,141 @@ var backendVersion = () => {
|
|
|
23265
23279
|
body: data3.requestBody,
|
|
23266
23280
|
mediaType: "application/json"
|
|
23267
23281
|
});
|
|
23282
|
+
}, createAzureTrigger = (data3) => {
|
|
23283
|
+
return request(OpenAPI, {
|
|
23284
|
+
method: "POST",
|
|
23285
|
+
url: "/w/{workspace}/azure_triggers/create",
|
|
23286
|
+
path: {
|
|
23287
|
+
workspace: data3.workspace
|
|
23288
|
+
},
|
|
23289
|
+
body: data3.requestBody,
|
|
23290
|
+
mediaType: "application/json"
|
|
23291
|
+
});
|
|
23292
|
+
}, updateAzureTrigger = (data3) => {
|
|
23293
|
+
return request(OpenAPI, {
|
|
23294
|
+
method: "POST",
|
|
23295
|
+
url: "/w/{workspace}/azure_triggers/update/{path}",
|
|
23296
|
+
path: {
|
|
23297
|
+
workspace: data3.workspace,
|
|
23298
|
+
path: data3.path
|
|
23299
|
+
},
|
|
23300
|
+
body: data3.requestBody,
|
|
23301
|
+
mediaType: "application/json"
|
|
23302
|
+
});
|
|
23303
|
+
}, deleteAzureTrigger = (data3) => {
|
|
23304
|
+
return request(OpenAPI, {
|
|
23305
|
+
method: "DELETE",
|
|
23306
|
+
url: "/w/{workspace}/azure_triggers/delete/{path}",
|
|
23307
|
+
path: {
|
|
23308
|
+
workspace: data3.workspace,
|
|
23309
|
+
path: data3.path
|
|
23310
|
+
}
|
|
23311
|
+
});
|
|
23312
|
+
}, getAzureTrigger = (data3) => {
|
|
23313
|
+
return request(OpenAPI, {
|
|
23314
|
+
method: "GET",
|
|
23315
|
+
url: "/w/{workspace}/azure_triggers/get/{path}",
|
|
23316
|
+
path: {
|
|
23317
|
+
workspace: data3.workspace,
|
|
23318
|
+
path: data3.path
|
|
23319
|
+
}
|
|
23320
|
+
});
|
|
23321
|
+
}, listAzureTriggers = (data3) => {
|
|
23322
|
+
return request(OpenAPI, {
|
|
23323
|
+
method: "GET",
|
|
23324
|
+
url: "/w/{workspace}/azure_triggers/list",
|
|
23325
|
+
path: {
|
|
23326
|
+
workspace: data3.workspace
|
|
23327
|
+
},
|
|
23328
|
+
query: {
|
|
23329
|
+
page: data3.page,
|
|
23330
|
+
per_page: data3.perPage,
|
|
23331
|
+
path: data3.path,
|
|
23332
|
+
is_flow: data3.isFlow,
|
|
23333
|
+
path_start: data3.pathStart
|
|
23334
|
+
}
|
|
23335
|
+
});
|
|
23336
|
+
}, existsAzureTrigger = (data3) => {
|
|
23337
|
+
return request(OpenAPI, {
|
|
23338
|
+
method: "GET",
|
|
23339
|
+
url: "/w/{workspace}/azure_triggers/exists/{path}",
|
|
23340
|
+
path: {
|
|
23341
|
+
workspace: data3.workspace,
|
|
23342
|
+
path: data3.path
|
|
23343
|
+
}
|
|
23344
|
+
});
|
|
23345
|
+
}, setAzureTriggerMode = (data3) => {
|
|
23346
|
+
return request(OpenAPI, {
|
|
23347
|
+
method: "POST",
|
|
23348
|
+
url: "/w/{workspace}/azure_triggers/setmode/{path}",
|
|
23349
|
+
path: {
|
|
23350
|
+
workspace: data3.workspace,
|
|
23351
|
+
path: data3.path
|
|
23352
|
+
},
|
|
23353
|
+
body: data3.requestBody,
|
|
23354
|
+
mediaType: "application/json"
|
|
23355
|
+
});
|
|
23356
|
+
}, testAzureConnection = (data3) => {
|
|
23357
|
+
return request(OpenAPI, {
|
|
23358
|
+
method: "POST",
|
|
23359
|
+
url: "/w/{workspace}/azure_triggers/test",
|
|
23360
|
+
path: {
|
|
23361
|
+
workspace: data3.workspace
|
|
23362
|
+
},
|
|
23363
|
+
body: data3.requestBody,
|
|
23364
|
+
mediaType: "application/json"
|
|
23365
|
+
});
|
|
23366
|
+
}, listAzureNamespaceTopics = (data3) => {
|
|
23367
|
+
return request(OpenAPI, {
|
|
23368
|
+
method: "POST",
|
|
23369
|
+
url: "/w/{workspace}/azure_triggers/namespaces/topics/list/{path}",
|
|
23370
|
+
path: {
|
|
23371
|
+
workspace: data3.workspace,
|
|
23372
|
+
path: data3.path
|
|
23373
|
+
},
|
|
23374
|
+
body: data3.requestBody,
|
|
23375
|
+
mediaType: "application/json"
|
|
23376
|
+
});
|
|
23377
|
+
}, listAzureNamespaceSubscriptions = (data3) => {
|
|
23378
|
+
return request(OpenAPI, {
|
|
23379
|
+
method: "POST",
|
|
23380
|
+
url: "/w/{workspace}/azure_triggers/namespaces/subscriptions/list/{path}",
|
|
23381
|
+
path: {
|
|
23382
|
+
workspace: data3.workspace,
|
|
23383
|
+
path: data3.path
|
|
23384
|
+
},
|
|
23385
|
+
body: data3.requestBody,
|
|
23386
|
+
mediaType: "application/json"
|
|
23387
|
+
});
|
|
23388
|
+
}, deleteAzureSubscription = (data3) => {
|
|
23389
|
+
return request(OpenAPI, {
|
|
23390
|
+
method: "DELETE",
|
|
23391
|
+
url: "/w/{workspace}/azure_triggers/subscriptions/delete/{path}",
|
|
23392
|
+
path: {
|
|
23393
|
+
workspace: data3.workspace,
|
|
23394
|
+
path: data3.path
|
|
23395
|
+
},
|
|
23396
|
+
body: data3.requestBody,
|
|
23397
|
+
mediaType: "application/json"
|
|
23398
|
+
});
|
|
23399
|
+
}, listAzureNamespaces = (data3) => {
|
|
23400
|
+
return request(OpenAPI, {
|
|
23401
|
+
method: "POST",
|
|
23402
|
+
url: "/w/{workspace}/azure_triggers/namespaces/list/{path}",
|
|
23403
|
+
path: {
|
|
23404
|
+
workspace: data3.workspace,
|
|
23405
|
+
path: data3.path
|
|
23406
|
+
}
|
|
23407
|
+
});
|
|
23408
|
+
}, listAzureBasicTopics = (data3) => {
|
|
23409
|
+
return request(OpenAPI, {
|
|
23410
|
+
method: "POST",
|
|
23411
|
+
url: "/w/{workspace}/azure_triggers/basic/topics/list/{path}",
|
|
23412
|
+
path: {
|
|
23413
|
+
workspace: data3.workspace,
|
|
23414
|
+
path: data3.path
|
|
23415
|
+
}
|
|
23416
|
+
});
|
|
23268
23417
|
}, getPostgresVersion = (data3) => {
|
|
23269
23418
|
return request(OpenAPI, {
|
|
23270
23419
|
method: "GET",
|
|
@@ -60846,6 +60995,11 @@ var require_dist3 = __commonJS((exports) => {
|
|
|
60846
60995
|
});
|
|
60847
60996
|
|
|
60848
60997
|
// src/core/specific_items.ts
|
|
60998
|
+
async function resolveWsNameForGitBranch(branchName) {
|
|
60999
|
+
const config = await readConfigFile({ warnIfMissing: false });
|
|
61000
|
+
const match2 = findWorkspaceByGitBranch(config.workspaces, branchName);
|
|
61001
|
+
return match2 ? match2[0] : branchName;
|
|
61002
|
+
}
|
|
60849
61003
|
function getWorkspaceSpecificTypes() {
|
|
60850
61004
|
return {
|
|
60851
61005
|
variable: ".variable.yaml",
|
|
@@ -61231,10 +61385,11 @@ async function findResourceFile(path8) {
|
|
|
61231
61385
|
let contentBasePathJSON = splitPath[0] + "." + splitPath[1] + ".json";
|
|
61232
61386
|
let contentBasePathYAML = splitPath[0] + "." + splitPath[1] + ".yaml";
|
|
61233
61387
|
const currentBranch = getCurrentGitBranch();
|
|
61388
|
+
const wsName = currentBranch ? await resolveWsNameForGitBranch(currentBranch) : null;
|
|
61234
61389
|
const candidates = [contentBasePathJSON, contentBasePathYAML];
|
|
61235
|
-
if (
|
|
61236
|
-
const branchSpecificJSON = toWorkspaceSpecificPath(contentBasePathJSON,
|
|
61237
|
-
const branchSpecificYAML = toWorkspaceSpecificPath(contentBasePathYAML,
|
|
61390
|
+
if (wsName) {
|
|
61391
|
+
const branchSpecificJSON = toWorkspaceSpecificPath(contentBasePathJSON, wsName);
|
|
61392
|
+
const branchSpecificYAML = toWorkspaceSpecificPath(contentBasePathYAML, wsName);
|
|
61238
61393
|
candidates.unshift(branchSpecificJSON, branchSpecificYAML);
|
|
61239
61394
|
}
|
|
61240
61395
|
const validCandidates = (await Promise.all(candidates.map((x) => {
|
|
@@ -63744,6 +63899,7 @@ var init_flow_metadata = __esm(async () => {
|
|
|
63744
63899
|
var exports_sync = {};
|
|
63745
63900
|
__export(exports_sync, {
|
|
63746
63901
|
yamlOptions: () => yamlOptions,
|
|
63902
|
+
resolveWsNameForConfigFromFlags: () => resolveWsNameForConfigFromFlags,
|
|
63747
63903
|
readDirRecursiveWithIgnore: () => readDirRecursiveWithIgnore2,
|
|
63748
63904
|
push: () => push4,
|
|
63749
63905
|
pull: () => pull,
|
|
@@ -63765,6 +63921,18 @@ function resolveWsNameFromBranch(opts, branchName) {
|
|
|
63765
63921
|
const match2 = findWorkspaceByGitBranch(opts.workspaces, branchName);
|
|
63766
63922
|
return match2 ? match2[0] : branchName;
|
|
63767
63923
|
}
|
|
63924
|
+
function resolveWsNameForConfigFromFlags(opts) {
|
|
63925
|
+
if (opts.branch) {
|
|
63926
|
+
return resolveWsNameFromBranch(opts, opts.branch);
|
|
63927
|
+
}
|
|
63928
|
+
if (opts.workspace) {
|
|
63929
|
+
const validKeys = getWorkspaceNames(opts.workspaces);
|
|
63930
|
+
if (validKeys.includes(opts.workspace)) {
|
|
63931
|
+
return opts.workspace;
|
|
63932
|
+
}
|
|
63933
|
+
}
|
|
63934
|
+
return;
|
|
63935
|
+
}
|
|
63768
63936
|
function warnWorkspaceOverride(opts, wsNameForConfig) {
|
|
63769
63937
|
if (!wsNameForConfig || !opts.workspaces)
|
|
63770
63938
|
return;
|
|
@@ -64738,7 +64906,7 @@ async function elementsToMap(els, ignore, json, skips, specificItems, branchOver
|
|
|
64738
64906
|
const ext2 = json ? ".json" : ".yaml";
|
|
64739
64907
|
if (!skips.includeSchedules && path11.endsWith(".schedule" + ext2))
|
|
64740
64908
|
continue;
|
|
64741
|
-
if (!skips.includeTriggers && (path11.endsWith(".http_trigger" + ext2) || path11.endsWith(".websocket_trigger" + ext2) || path11.endsWith(".kafka_trigger" + ext2) || path11.endsWith(".nats_trigger" + ext2) || path11.endsWith(".postgres_trigger" + ext2) || path11.endsWith(".mqtt_trigger" + ext2) || path11.endsWith(".sqs_trigger" + ext2) || path11.endsWith(".gcp_trigger" + ext2) || path11.endsWith(".email_trigger" + ext2) || path11.endsWith("_native_trigger" + ext2))) {
|
|
64909
|
+
if (!skips.includeTriggers && (path11.endsWith(".http_trigger" + ext2) || path11.endsWith(".websocket_trigger" + ext2) || path11.endsWith(".kafka_trigger" + ext2) || path11.endsWith(".nats_trigger" + ext2) || path11.endsWith(".postgres_trigger" + ext2) || path11.endsWith(".mqtt_trigger" + ext2) || path11.endsWith(".sqs_trigger" + ext2) || path11.endsWith(".gcp_trigger" + ext2) || path11.endsWith(".azure_trigger" + ext2) || path11.endsWith(".email_trigger" + ext2) || path11.endsWith("_native_trigger" + ext2))) {
|
|
64742
64910
|
continue;
|
|
64743
64911
|
}
|
|
64744
64912
|
if (!skips.includeUsers && path11.endsWith(".user" + ext2))
|
|
@@ -65025,7 +65193,7 @@ function getOrderFromPath(p) {
|
|
|
65025
65193
|
return 12;
|
|
65026
65194
|
} else if (typ == "schedule") {
|
|
65027
65195
|
return 13;
|
|
65028
|
-
} else if (typ == "http_trigger" || typ == "websocket_trigger" || typ == "kafka_trigger" || typ == "nats_trigger" || typ == "postgres_trigger" || typ == "mqtt_trigger" || typ == "sqs_trigger" || typ == "gcp_trigger" || typ == "email_trigger" || typ == "native_trigger") {
|
|
65196
|
+
} else if (typ == "http_trigger" || typ == "websocket_trigger" || typ == "kafka_trigger" || typ == "nats_trigger" || typ == "postgres_trigger" || typ == "mqtt_trigger" || typ == "sqs_trigger" || typ == "gcp_trigger" || typ == "azure_trigger" || typ == "email_trigger" || typ == "native_trigger") {
|
|
65029
65197
|
return 14;
|
|
65030
65198
|
} else {
|
|
65031
65199
|
return 15;
|
|
@@ -65178,18 +65346,16 @@ async function pull(opts) {
|
|
|
65178
65346
|
}
|
|
65179
65347
|
const hasExplicitCredentials = !!opts.baseUrl;
|
|
65180
65348
|
let wsNameForConfig;
|
|
65181
|
-
if (opts.branch) {
|
|
65182
|
-
|
|
65183
|
-
|
|
65184
|
-
|
|
65185
|
-
|
|
65186
|
-
|
|
65187
|
-
|
|
65188
|
-
wsNameForConfig = opts.workspace;
|
|
65189
|
-
warnWorkspaceOverride(opts, wsNameForConfig);
|
|
65349
|
+
if (opts.branch && !hasExplicitCredentials && !branchDeprecationWarned) {
|
|
65350
|
+
warn("⚠️ --branch/--env is deprecated. Use --workspace instead.");
|
|
65351
|
+
branchDeprecationWarned = true;
|
|
65352
|
+
}
|
|
65353
|
+
wsNameForConfig = resolveWsNameForConfigFromFlags(opts);
|
|
65354
|
+
if (!opts.branch && opts.workspace && !hasExplicitCredentials) {
|
|
65355
|
+
warnWorkspaceOverride(opts, opts.workspace);
|
|
65190
65356
|
}
|
|
65191
65357
|
try {
|
|
65192
|
-
await validateBranchConfiguration(opts, wsNameForConfig);
|
|
65358
|
+
await validateBranchConfiguration(opts, wsNameForConfig ?? opts.workspace);
|
|
65193
65359
|
} catch (error2) {
|
|
65194
65360
|
if (error2 instanceof Error && error2.message.includes("overrides")) {
|
|
65195
65361
|
error(error2.message);
|
|
@@ -65435,18 +65601,16 @@ async function push4(opts) {
|
|
|
65435
65601
|
}
|
|
65436
65602
|
const hasExplicitCredentials = !!opts.baseUrl;
|
|
65437
65603
|
let wsNameForConfig;
|
|
65438
|
-
if (opts.branch) {
|
|
65439
|
-
|
|
65440
|
-
|
|
65441
|
-
|
|
65442
|
-
|
|
65443
|
-
|
|
65444
|
-
|
|
65445
|
-
wsNameForConfig = opts.workspace;
|
|
65446
|
-
warnWorkspaceOverride(opts, wsNameForConfig);
|
|
65604
|
+
if (opts.branch && !hasExplicitCredentials && !branchDeprecationWarned) {
|
|
65605
|
+
warn("⚠️ --branch/--env is deprecated. Use --workspace instead.");
|
|
65606
|
+
branchDeprecationWarned = true;
|
|
65607
|
+
}
|
|
65608
|
+
wsNameForConfig = resolveWsNameForConfigFromFlags(opts);
|
|
65609
|
+
if (!opts.branch && opts.workspace && !hasExplicitCredentials) {
|
|
65610
|
+
warnWorkspaceOverride(opts, opts.workspace);
|
|
65447
65611
|
}
|
|
65448
65612
|
try {
|
|
65449
|
-
await validateBranchConfiguration(opts, wsNameForConfig);
|
|
65613
|
+
await validateBranchConfiguration(opts, wsNameForConfig ?? opts.workspace);
|
|
65450
65614
|
} catch (error2) {
|
|
65451
65615
|
if (error2 instanceof Error && error2.message.includes("overrides")) {
|
|
65452
65616
|
error(error2.message);
|
|
@@ -65704,7 +65868,7 @@ ${folderList}
|
|
|
65704
65868
|
}
|
|
65705
65869
|
}
|
|
65706
65870
|
const rules = folderRulesCache.get(folderName2);
|
|
65707
|
-
const remotePath = change.path.replace(/\.(script|schedule|http_trigger|websocket_trigger|kafka_trigger|nats_trigger|postgres_trigger|mqtt_trigger|sqs_trigger|gcp_trigger|email_trigger)\.(yaml|json)$/, "").replace(/(\.flow|__flow)\/flow\.(yaml|json)$/, "").replace(/\.(app|raw_app)(\/app\.(yaml|json))?$/, "");
|
|
65871
|
+
const remotePath = change.path.replace(/\.(script|schedule|http_trigger|websocket_trigger|kafka_trigger|nats_trigger|postgres_trigger|mqtt_trigger|sqs_trigger|gcp_trigger|azure_trigger|email_trigger)\.(yaml|json)$/, "").replace(/(\.flow|__flow)\/flow\.(yaml|json)$/, "").replace(/\.(app|raw_app)(\/app\.(yaml|json))?$/, "");
|
|
65708
65872
|
const relative6 = remotePath.slice(`f/${folderName2}/`.length);
|
|
65709
65873
|
if (!relative6)
|
|
65710
65874
|
continue;
|
|
@@ -66090,6 +66254,12 @@ ${folderList}
|
|
|
66090
66254
|
path: removeSuffix(target, ".gcp_trigger.json")
|
|
66091
66255
|
});
|
|
66092
66256
|
break;
|
|
66257
|
+
case "azure_trigger":
|
|
66258
|
+
await deleteAzureTrigger({
|
|
66259
|
+
workspace: workspaceId,
|
|
66260
|
+
path: removeSuffix(target, ".azure_trigger.json")
|
|
66261
|
+
});
|
|
66262
|
+
break;
|
|
66093
66263
|
case "email_trigger":
|
|
66094
66264
|
await deleteEmailTrigger({
|
|
66095
66265
|
workspace: workspaceId,
|
|
@@ -72525,6 +72695,7 @@ async function getTrigger(triggerType, workspace, path19) {
|
|
|
72525
72695
|
mqtt: getMqttTrigger,
|
|
72526
72696
|
sqs: getSqsTrigger,
|
|
72527
72697
|
gcp: getGcpTrigger,
|
|
72698
|
+
azure: getAzureTrigger,
|
|
72528
72699
|
email: getEmailTrigger
|
|
72529
72700
|
};
|
|
72530
72701
|
const triggerFunction = triggerFunctions[triggerType];
|
|
@@ -72541,6 +72712,7 @@ async function updateTrigger(triggerType, workspace, path19, trigger) {
|
|
|
72541
72712
|
mqtt: updateMqttTrigger,
|
|
72542
72713
|
sqs: updateSqsTrigger,
|
|
72543
72714
|
gcp: updateGcpTrigger,
|
|
72715
|
+
azure: updateAzureTrigger,
|
|
72544
72716
|
email: updateEmailTrigger
|
|
72545
72717
|
};
|
|
72546
72718
|
const triggerFunction = triggerFunctions[triggerType];
|
|
@@ -72556,6 +72728,7 @@ async function createTrigger(triggerType, workspace, path19, trigger) {
|
|
|
72556
72728
|
mqtt: createMqttTrigger,
|
|
72557
72729
|
sqs: createSqsTrigger,
|
|
72558
72730
|
gcp: createGcpTrigger,
|
|
72731
|
+
azure: createAzureTrigger,
|
|
72559
72732
|
email: createEmailTrigger
|
|
72560
72733
|
};
|
|
72561
72734
|
const triggerFunction = triggerFunctions[triggerType];
|
|
@@ -72799,6 +72972,7 @@ async function list11(opts) {
|
|
|
72799
72972
|
mqttTriggers,
|
|
72800
72973
|
sqsTriggers,
|
|
72801
72974
|
gcpTriggers,
|
|
72975
|
+
azureTriggers,
|
|
72802
72976
|
emailTriggers
|
|
72803
72977
|
] = await Promise.all([
|
|
72804
72978
|
listOrEmpty(() => listHttpTriggers({ workspace: ws })),
|
|
@@ -72809,6 +72983,7 @@ async function list11(opts) {
|
|
|
72809
72983
|
listOrEmpty(() => listMqttTriggers({ workspace: ws })),
|
|
72810
72984
|
listOrEmpty(() => listSqsTriggers({ workspace: ws })),
|
|
72811
72985
|
listOrEmpty(() => listGcpTriggers({ workspace: ws })),
|
|
72986
|
+
listOrEmpty(() => listAzureTriggers({ workspace: ws })),
|
|
72812
72987
|
listOrEmpty(() => listEmailTriggers({ workspace: ws }))
|
|
72813
72988
|
]);
|
|
72814
72989
|
const triggers = [
|
|
@@ -72820,6 +72995,7 @@ async function list11(opts) {
|
|
|
72820
72995
|
...mqttTriggers.map((x) => ({ path: x.path, kind: "mqtt" })),
|
|
72821
72996
|
...sqsTriggers.map((x) => ({ path: x.path, kind: "sqs" })),
|
|
72822
72997
|
...gcpTriggers.map((x) => ({ path: x.path, kind: "gcp" })),
|
|
72998
|
+
...azureTriggers.map((x) => ({ path: x.path, kind: "azure" })),
|
|
72823
72999
|
...emailTriggers.map((x) => ({ path: x.path, kind: "email" }))
|
|
72824
73000
|
];
|
|
72825
73001
|
if (opts.json) {
|
|
@@ -72835,12 +73011,13 @@ function checkIfValidTrigger(kind) {
|
|
|
72835
73011
|
return false;
|
|
72836
73012
|
}
|
|
72837
73013
|
}
|
|
72838
|
-
function extractTriggerKindFromPath(filePath) {
|
|
73014
|
+
async function extractTriggerKindFromPath(filePath) {
|
|
72839
73015
|
let pathToAnalyze = filePath;
|
|
72840
73016
|
if (isWorkspaceSpecificFile(filePath)) {
|
|
72841
73017
|
const currentBranch = getCurrentGitBranch();
|
|
72842
73018
|
if (currentBranch) {
|
|
72843
|
-
|
|
73019
|
+
const wsName = await resolveWsNameForGitBranch(currentBranch);
|
|
73020
|
+
pathToAnalyze = fromWorkspaceSpecificPath(filePath, wsName);
|
|
72844
73021
|
}
|
|
72845
73022
|
}
|
|
72846
73023
|
const triggerMatch = pathToAnalyze.match(/\.(\w+)_trigger\.yaml$/);
|
|
@@ -72857,7 +73034,7 @@ async function push10(opts, filePath, remotePath) {
|
|
|
72857
73034
|
throw new Error("file path must refer to a file.");
|
|
72858
73035
|
}
|
|
72859
73036
|
console.log(colors.bold.yellow("Pushing trigger..."));
|
|
72860
|
-
const triggerKind = extractTriggerKindFromPath(filePath);
|
|
73037
|
+
const triggerKind = await extractTriggerKindFromPath(filePath);
|
|
72861
73038
|
if (!checkIfValidTrigger(triggerKind)) {
|
|
72862
73039
|
throw new Error("Invalid trigger kind: " + triggerKind);
|
|
72863
73040
|
}
|
|
@@ -72953,6 +73130,15 @@ var init_trigger = __esm(async () => {
|
|
|
72953
73130
|
subscription_mode: "create_update",
|
|
72954
73131
|
enabled: false
|
|
72955
73132
|
},
|
|
73133
|
+
azure: {
|
|
73134
|
+
script_path: "",
|
|
73135
|
+
is_flow: false,
|
|
73136
|
+
azure_resource_path: "",
|
|
73137
|
+
azure_mode: "namespace_pull",
|
|
73138
|
+
scope_resource_id: "",
|
|
73139
|
+
subscription_name: "",
|
|
73140
|
+
enabled: false
|
|
73141
|
+
},
|
|
72956
73142
|
email: {
|
|
72957
73143
|
script_path: "",
|
|
72958
73144
|
is_flow: false,
|
|
@@ -72961,7 +73147,7 @@ var init_trigger = __esm(async () => {
|
|
|
72961
73147
|
}
|
|
72962
73148
|
};
|
|
72963
73149
|
TRIGGER_SKIP_FIELDS = new Set(["workspace_id", "extra_perms", "edited_by", "edited_at"]);
|
|
72964
|
-
command19 = new Command().description("trigger related commands").option("--json", "Output as JSON (for piping to jq)").action(list11).command("list", "list all triggers").option("--json", "Output as JSON (for piping to jq)").action(list11).command("get", "get a trigger's details").arguments("<path:string>").option("--json", "Output as JSON (for piping to jq)").option("--kind <kind:string>", "Trigger kind (http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, email). Recommended for faster lookup").action(get8).command("new", "create a new trigger locally").arguments("<path:string>").option("--kind <kind:string>", "Trigger kind (required: http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, email)").action(newTrigger).command("push", "push a local trigger spec. This overrides any remote versions.").arguments("<file_path:string> <remote_path:string>").action(push10).command("set-permissioned-as", "Set the email (run-as user) for a trigger (requires admin or wm_deployers group)").arguments("<path:string> <email:string>").option("--kind <kind:string>", "Trigger kind (required: http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, email)").action(async (opts, triggerPath, email) => {
|
|
73150
|
+
command19 = new Command().description("trigger related commands").option("--json", "Output as JSON (for piping to jq)").action(list11).command("list", "list all triggers").option("--json", "Output as JSON (for piping to jq)").action(list11).command("get", "get a trigger's details").arguments("<path:string>").option("--json", "Output as JSON (for piping to jq)").option("--kind <kind:string>", "Trigger kind (http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, azure, email). Recommended for faster lookup").action(get8).command("new", "create a new trigger locally").arguments("<path:string>").option("--kind <kind:string>", "Trigger kind (required: http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, azure, email)").action(newTrigger).command("push", "push a local trigger spec. This overrides any remote versions.").arguments("<file_path:string> <remote_path:string>").action(push10).command("set-permissioned-as", "Set the email (run-as user) for a trigger (requires admin or wm_deployers group)").arguments("<path:string> <email:string>").option("--kind <kind:string>", "Trigger kind (required: http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, azure, email)").action(async (opts, triggerPath, email) => {
|
|
72965
73151
|
const workspace = await resolveWorkspace(opts);
|
|
72966
73152
|
await requireLogin(opts);
|
|
72967
73153
|
if (!opts.kind) {
|
|
@@ -73088,6 +73274,8 @@ async function pushObj(workspace, p, befObj, newObj, plainSecrets, alreadySynced
|
|
|
73088
73274
|
await pushTrigger("sqs", workspace, p, befObj, newObj, permissionedAsContext);
|
|
73089
73275
|
} else if (typeEnding === "gcp_trigger") {
|
|
73090
73276
|
await pushTrigger("gcp", workspace, p, befObj, newObj, permissionedAsContext);
|
|
73277
|
+
} else if (typeEnding === "azure_trigger") {
|
|
73278
|
+
await pushTrigger("azure", workspace, p, befObj, newObj, permissionedAsContext);
|
|
73091
73279
|
} else if (typeEnding === "email_trigger") {
|
|
73092
73280
|
await pushTrigger("email", workspace, p, befObj, newObj, permissionedAsContext);
|
|
73093
73281
|
} else if (typeEnding === "native_trigger") {
|
|
@@ -73154,7 +73342,7 @@ function getTypeStrFromPath(p) {
|
|
|
73154
73342
|
if (typeEnding?.endsWith("_native_trigger")) {
|
|
73155
73343
|
return "native_trigger";
|
|
73156
73344
|
}
|
|
73157
|
-
if (typeEnding === "script" || typeEnding === "variable" || typeEnding === "resource" || typeEnding === "resource-type" || typeEnding === "app" || typeEnding === "schedule" || typeEnding === "http_trigger" || typeEnding === "websocket_trigger" || typeEnding === "kafka_trigger" || typeEnding === "nats_trigger" || typeEnding === "postgres_trigger" || typeEnding === "mqtt_trigger" || typeEnding === "sqs_trigger" || typeEnding === "gcp_trigger" || typeEnding === "email_trigger" || typeEnding === "user" || typeEnding === "group" || typeEnding === "settings" || typeEnding === "encryption_key") {
|
|
73345
|
+
if (typeEnding === "script" || typeEnding === "variable" || typeEnding === "resource" || typeEnding === "resource-type" || typeEnding === "app" || typeEnding === "schedule" || typeEnding === "http_trigger" || typeEnding === "websocket_trigger" || typeEnding === "kafka_trigger" || typeEnding === "nats_trigger" || typeEnding === "postgres_trigger" || typeEnding === "mqtt_trigger" || typeEnding === "sqs_trigger" || typeEnding === "gcp_trigger" || typeEnding === "azure_trigger" || typeEnding === "email_trigger" || typeEnding === "user" || typeEnding === "group" || typeEnding === "settings" || typeEnding === "encryption_key") {
|
|
73158
73346
|
return typeEnding;
|
|
73159
73347
|
} else {
|
|
73160
73348
|
throw new Error("Could not infer type of path " + JSON.stringify(parsed));
|
|
@@ -73230,6 +73418,7 @@ var init_types = __esm(async () => {
|
|
|
73230
73418
|
"mqtt",
|
|
73231
73419
|
"sqs",
|
|
73232
73420
|
"gcp",
|
|
73421
|
+
"azure",
|
|
73233
73422
|
"email"
|
|
73234
73423
|
];
|
|
73235
73424
|
});
|
|
@@ -81663,7 +81852,7 @@ Reference a specific resource using \`$res:\` prefix:
|
|
|
81663
81852
|
|
|
81664
81853
|
## OpenFlow Schema
|
|
81665
81854
|
|
|
81666
|
-
{"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"},"delete_after_secs":{"type":"integer","description":"If set, delete the flow job's args, result and logs after this many seconds following job completion"},"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_secs":{"type":"integer","description":"If set, delete the step's args, result and logs after this many seconds following job completion"},"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","rlang","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_attachments":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Array of file references (images or PDFs) for the AI agent.\\nFormat: Array<{ bucket: string, key: string }> - S3 object references\\nExample: [{ bucket: 'my-bucket', key: 'documents/report.pdf' }]\\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"]}}`,
|
|
81855
|
+
{"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"},"delete_after_secs":{"type":"integer","description":"If set, delete the flow job's args, result and logs after this many seconds following job completion"},"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_secs":{"type":"integer","description":"If set, delete the step's args, result and logs after this many seconds following job completion"},"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","rlang","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_attachments":{"allOf":[{"$ref":"#/components/schemas/InputTransform"}],"description":"Array of file references (images or PDFs) for the AI agent.\\nFormat: Array<{ bucket: string, key: string }> - S3 object references\\nExample: [{ bucket: 'my-bucket', key: 'documents/report.pdf' }]\\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"]},"omit_output_from_conversation":{"type":"boolean","default":false,"description":"If true, this AI agent step does not persist its assistant or tool messages to the flow conversation when chat mode is enabled."},"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"]}}`,
|
|
81667
81856
|
"raw-app": `---
|
|
81668
81857
|
name: raw-app
|
|
81669
81858
|
description: MUST use when creating raw apps.
|
|
@@ -82764,12 +82953,12 @@ trigger related commands
|
|
|
82764
82953
|
- \`--json\` - Output as JSON (for piping to jq)
|
|
82765
82954
|
- \`trigger get <path:string>\` - get a trigger's details
|
|
82766
82955
|
- \`--json\` - Output as JSON (for piping to jq)
|
|
82767
|
-
- \`--kind <kind:string>\` - Trigger kind (http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, email). Recommended for faster lookup
|
|
82956
|
+
- \`--kind <kind:string>\` - Trigger kind (http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, azure, email). Recommended for faster lookup
|
|
82768
82957
|
- \`trigger new <path:string>\` - create a new trigger locally
|
|
82769
|
-
- \`--kind <kind:string>\` - Trigger kind (required: http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, email)
|
|
82958
|
+
- \`--kind <kind:string>\` - Trigger kind (required: http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, azure, email)
|
|
82770
82959
|
- \`trigger push <file_path:string> <remote_path:string>\` - push a local trigger spec. This overrides any remote versions.
|
|
82771
82960
|
- \`trigger set-permissioned-as <path:string> <email:string>\` - Set the email (run-as user) for a trigger (requires admin or wm_deployers group)
|
|
82772
|
-
- \`--kind <kind:string>\` - Trigger kind (required: http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, email)
|
|
82961
|
+
- \`--kind <kind:string>\` - Trigger kind (required: http, websocket, kafka, nats, postgres, mqtt, sqs, gcp, azure, email)
|
|
82773
82962
|
|
|
82774
82963
|
### user
|
|
82775
82964
|
|
|
@@ -82875,6 +83064,91 @@ workspace related commands
|
|
|
82875
83064
|
`
|
|
82876
83065
|
};
|
|
82877
83066
|
var SCHEMAS = {
|
|
83067
|
+
azure_trigger: `type: object
|
|
83068
|
+
properties:
|
|
83069
|
+
script_path:
|
|
83070
|
+
type: string
|
|
83071
|
+
description: Path to the script or flow to execute when triggered
|
|
83072
|
+
permissioned_as:
|
|
83073
|
+
type: string
|
|
83074
|
+
description: The user or group this trigger runs as (permissioned_as)
|
|
83075
|
+
is_flow:
|
|
83076
|
+
type: boolean
|
|
83077
|
+
description: True if script_path points to a flow, false if it points to a script
|
|
83078
|
+
labels:
|
|
83079
|
+
type: array
|
|
83080
|
+
items:
|
|
83081
|
+
type: string
|
|
83082
|
+
azure_resource_path:
|
|
83083
|
+
type: string
|
|
83084
|
+
azure_mode:
|
|
83085
|
+
type: string
|
|
83086
|
+
enum:
|
|
83087
|
+
- basic_push
|
|
83088
|
+
- namespace_push
|
|
83089
|
+
- namespace_pull
|
|
83090
|
+
description: Azure Event Grid trigger mode.
|
|
83091
|
+
scope_resource_id:
|
|
83092
|
+
type: string
|
|
83093
|
+
description: ARM resource ID of the topic (basic) or namespace (namespace modes).
|
|
83094
|
+
topic_name:
|
|
83095
|
+
type: string
|
|
83096
|
+
description: Topic name within the namespace (namespace modes only).
|
|
83097
|
+
subscription_name:
|
|
83098
|
+
type: string
|
|
83099
|
+
event_type_filters:
|
|
83100
|
+
type: array
|
|
83101
|
+
items:
|
|
83102
|
+
type: string
|
|
83103
|
+
error_handler_path:
|
|
83104
|
+
type: string
|
|
83105
|
+
error_handler_args:
|
|
83106
|
+
type: object
|
|
83107
|
+
description: The arguments to pass to the script or flow
|
|
83108
|
+
retry:
|
|
83109
|
+
type: object
|
|
83110
|
+
properties:
|
|
83111
|
+
constant:
|
|
83112
|
+
type: object
|
|
83113
|
+
description: Retry with constant delay between attempts
|
|
83114
|
+
properties:
|
|
83115
|
+
attempts:
|
|
83116
|
+
type: integer
|
|
83117
|
+
description: Number of retry attempts
|
|
83118
|
+
seconds:
|
|
83119
|
+
type: integer
|
|
83120
|
+
description: Seconds to wait between retries
|
|
83121
|
+
exponential:
|
|
83122
|
+
type: object
|
|
83123
|
+
description: Retry with exponential backoff (delay doubles each time)
|
|
83124
|
+
properties:
|
|
83125
|
+
attempts:
|
|
83126
|
+
type: integer
|
|
83127
|
+
description: Number of retry attempts
|
|
83128
|
+
multiplier:
|
|
83129
|
+
type: integer
|
|
83130
|
+
description: Multiplier for exponential backoff
|
|
83131
|
+
seconds:
|
|
83132
|
+
type: integer
|
|
83133
|
+
minimum: 1
|
|
83134
|
+
description: Initial delay in seconds
|
|
83135
|
+
random_factor:
|
|
83136
|
+
type: integer
|
|
83137
|
+
minimum: 0
|
|
83138
|
+
maximum: 100
|
|
83139
|
+
description: Random jitter percentage (0-100) to avoid thundering herd
|
|
83140
|
+
retry_if:
|
|
83141
|
+
$ref: '#/components/schemas/RetryIf'
|
|
83142
|
+
description: Retry configuration for failed module executions
|
|
83143
|
+
required:
|
|
83144
|
+
- script_path
|
|
83145
|
+
- permissioned_as
|
|
83146
|
+
- is_flow
|
|
83147
|
+
- azure_resource_path
|
|
83148
|
+
- azure_mode
|
|
83149
|
+
- scope_resource_id
|
|
83150
|
+
- subscription_name
|
|
83151
|
+
`,
|
|
82878
83152
|
gcp_trigger: `type: object
|
|
82879
83153
|
properties:
|
|
82880
83154
|
script_path:
|
|
@@ -83800,7 +84074,8 @@ var SCHEMA_MAPPINGS = {
|
|
|
83800
84074
|
{ name: "PostgresTrigger", schemaKey: "postgres_trigger", filePattern: "*.postgres_trigger.yaml" },
|
|
83801
84075
|
{ name: "MqttTrigger", schemaKey: "mqtt_trigger", filePattern: "*.mqtt_trigger.yaml" },
|
|
83802
84076
|
{ name: "SqsTrigger", schemaKey: "sqs_trigger", filePattern: "*.sqs_trigger.yaml" },
|
|
83803
|
-
{ name: "GcpTrigger", schemaKey: "gcp_trigger", filePattern: "*.gcp_trigger.yaml" }
|
|
84077
|
+
{ name: "GcpTrigger", schemaKey: "gcp_trigger", filePattern: "*.gcp_trigger.yaml" },
|
|
84078
|
+
{ name: "AzureTrigger", schemaKey: "azure_trigger", filePattern: "*.azure_trigger.yaml" }
|
|
83804
84079
|
],
|
|
83805
84080
|
schedules: [
|
|
83806
84081
|
{ name: "Schedule", schemaKey: "schedule", filePattern: "*.schedule.yaml" }
|
|
@@ -85726,7 +86001,7 @@ var config_default = command35;
|
|
|
85726
86001
|
|
|
85727
86002
|
// src/main.ts
|
|
85728
86003
|
await init_context();
|
|
85729
|
-
var VERSION = "1.
|
|
86004
|
+
var VERSION = "1.690.0";
|
|
85730
86005
|
async function checkVersionSafe(cmd) {
|
|
85731
86006
|
const mainCommand = cmd.getMainCommand();
|
|
85732
86007
|
const upgradeCommand = mainCommand.getCommand("upgrade");
|