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.
Files changed (2) hide show
  1. package/esm/main.js +315 -40
  2. 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.689.0",
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
- after_id: data3.afterId
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 (currentBranch) {
61236
- const branchSpecificJSON = toWorkspaceSpecificPath(contentBasePathJSON, currentBranch);
61237
- const branchSpecificYAML = toWorkspaceSpecificPath(contentBasePathYAML, currentBranch);
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
- if (!hasExplicitCredentials && !branchDeprecationWarned) {
65183
- warn("⚠️ --branch/--env is deprecated. Use --workspace instead.");
65184
- branchDeprecationWarned = true;
65185
- }
65186
- wsNameForConfig = resolveWsNameFromBranch(opts, opts.branch);
65187
- } else if (opts.workspace && !hasExplicitCredentials) {
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
- if (!hasExplicitCredentials && !branchDeprecationWarned) {
65440
- warn("⚠️ --branch/--env is deprecated. Use --workspace instead.");
65441
- branchDeprecationWarned = true;
65442
- }
65443
- wsNameForConfig = resolveWsNameFromBranch(opts, opts.branch);
65444
- } else if (opts.workspace && !hasExplicitCredentials) {
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
- pathToAnalyze = fromWorkspaceSpecificPath(filePath, currentBranch);
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.689.0";
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");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "windmill-cli",
3
- "version": "1.689.0",
3
+ "version": "1.690.0",
4
4
  "description": "CLI for Windmill",
5
5
  "license": "Apache 2.0",
6
6
  "type": "module",