windmill-cli 1.690.0 → 1.691.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 +152 -12
  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.690.0",
16704
+ VERSION: "1.691.0",
16705
16705
  WITH_CREDENTIALS: true,
16706
16706
  interceptors: {
16707
16707
  request: new Interceptors,
@@ -17637,8 +17637,10 @@ __export(exports_services_gen, {
17637
17637
  countCompletedJobs: () => countCompletedJobs,
17638
17638
  convertUserToGroup: () => convertUserToGroup,
17639
17639
  connectTeams: () => connectTeams,
17640
+ connectSlackInstance: () => connectSlackInstance,
17640
17641
  connectSlackCallbackInstance: () => connectSlackCallbackInstance,
17641
17642
  connectSlackCallback: () => connectSlackCallback,
17643
+ connectSlack: () => connectSlack,
17642
17644
  connectClientCredentials: () => connectClientCredentials,
17643
17645
  connectCallback: () => connectCallback,
17644
17646
  computeObjectStorageUsage: () => computeObjectStorageUsage,
@@ -18833,6 +18835,16 @@ var backendVersion = () => {
18833
18835
  body: data3.requestBody,
18834
18836
  mediaType: "application/json"
18835
18837
  });
18838
+ }, connectSlack = (data3) => {
18839
+ return request(OpenAPI, {
18840
+ method: "POST",
18841
+ url: "/w/{workspace}/workspaces/connect_slack",
18842
+ path: {
18843
+ workspace: data3.workspace
18844
+ },
18845
+ body: data3.requestBody,
18846
+ mediaType: "application/json"
18847
+ });
18836
18848
  }, runSlackMessageTestJob = (data3) => {
18837
18849
  return request(OpenAPI, {
18838
18850
  method: "POST",
@@ -19594,6 +19606,13 @@ var backendVersion = () => {
19594
19606
  body: data3.requestBody,
19595
19607
  mediaType: "application/json"
19596
19608
  });
19609
+ }, connectSlackInstance = (data3) => {
19610
+ return request(OpenAPI, {
19611
+ method: "POST",
19612
+ url: "/oauth/connect_slack_instance",
19613
+ body: data3.requestBody,
19614
+ mediaType: "application/json"
19615
+ });
19597
19616
  }, connectCallback = (data3) => {
19598
19617
  return request(OpenAPI, {
19599
19618
  method: "POST",
@@ -26134,6 +26153,36 @@ var init_merge = __esm(async () => {
26134
26153
  };
26135
26154
  });
26136
26155
 
26156
+ // src/commands/workspace/slack.ts
26157
+ async function connectSlack2(opts) {
26158
+ await requireLogin(opts);
26159
+ const workspace = await resolveWorkspace(opts);
26160
+ await connectSlack({
26161
+ workspace: workspace.workspaceId,
26162
+ requestBody: {
26163
+ bot_token: opts.botToken,
26164
+ team_id: opts.teamId,
26165
+ team_name: opts.teamName
26166
+ }
26167
+ });
26168
+ info(colors.bold.underline.green(`Slack connected to workspace ${workspace.workspaceId} (team ${opts.teamName} / ${opts.teamId})`));
26169
+ }
26170
+ async function disconnectSlack2(opts) {
26171
+ await requireLogin(opts);
26172
+ const workspace = await resolveWorkspace(opts);
26173
+ await disconnectSlack({ workspace: workspace.workspaceId });
26174
+ info(colors.bold.underline.green(`Slack disconnected from workspace ${workspace.workspaceId} (slack_team_id / slack_name cleared). ` + `To also remove the bot token variable/resource/folder/group, delete the corresponding files from the local sync folder and run 'wmill sync push'. ` + `To remove the workspace-level OAuth override (if any), set slack_oauth_client_id/_secret to '' in settings.yaml and push.`));
26175
+ }
26176
+ var init_slack = __esm(async () => {
26177
+ init_colors2();
26178
+ init_log();
26179
+ init_services_gen();
26180
+ await __promiseAll([
26181
+ init_auth(),
26182
+ init_context()
26183
+ ]);
26184
+ });
26185
+
26137
26186
  // src/utils/resource_folders.ts
26138
26187
  import { sep as SEP2 } from "node:path";
26139
26188
  import * as fs6 from "node:fs";
@@ -27475,11 +27524,12 @@ var init_workspace = __esm(async () => {
27475
27524
  init_input(),
27476
27525
  init_auth(),
27477
27526
  init_fork(),
27478
- init_merge()
27527
+ init_merge(),
27528
+ init_slack()
27479
27529
  ]);
27480
27530
  command2 = new Command().alias("profile").description("workspace related commands").action(list3).command("switch").complete("workspace", async () => (await allWorkspaces()).map((x) => x.name)).description("Switch to another workspace").arguments("<workspace_name:string:workspace>").action(switchC).command("add").description("Add a workspace").arguments("[workspace_name:string] [workspace_id:string] [remote:string]").option("-c --create", "Create the workspace if it does not exist").option("--create-workspace-name <workspace_name:string>", "Specify the workspace name. Ignored if --create is not specified or the workspace already exists. Will default to the workspace id.").option("--create-username <username:string>", "Specify your own username in the newly created workspace. Ignored if --create is not specified, the workspace already exists or automatic username creation is enabled on the instance.", {
27481
27531
  default: "admin"
27482
- }).action(add).command("remove").description("Remove a workspace").arguments("<workspace_name:string>").action(remove).command("whoami").description("Show the currently active user").action(whoami2).command("list").description("List local workspace profiles").action(list3).command("list-remote").description("List workspaces on the remote server that you have access to").action(listRemote).command("list-forks").description("List forked workspaces on the remote server").action(listForks).command("bind").description("Create or update a workspace entry in wmill.yaml from the active profile").option("--workspace <name:string>", "Workspace name (default: current branch or workspaceId)").option("--branch <branch:string>", "Git branch to associate (default: workspace name)").action((opts) => bind(opts, true)).command("unbind").description("Remove baseUrl and workspaceId from a workspace entry").option("--workspace <name:string>", "Workspace to unbind").action((opts) => bind(opts, false)).command("fork").description("Create a forked workspace").arguments("[workspace_name:string] [workspace_id:string]").option("--create-workspace-name <workspace_name:string>", "Specify the workspace name. Ignored if --create is not specified or the workspace already exists. Will default to the workspace id.").option("--color <color:string>", "Workspace color (hex code, e.g. #ff0000)").option("--datatable-behavior <behavior:string>", "How to handle datatables: skip, schema_only, or schema_and_data (default: interactive prompt)").option("-y --yes", "Skip interactive prompts (defaults datatable behavior to 'skip')").action(createWorkspaceFork2).command("delete-fork").description("Delete a forked workspace and git branch").arguments("<fork_name:string>").option("-y --yes", "Skip confirmation prompt").action(deleteWorkspaceFork).command("merge").description("Compare and deploy changes between a fork and its parent workspace").option("--direction <direction:string>", "Deploy direction: to-parent or to-fork").option("--all", "Deploy all changed items including conflicts").option("--skip-conflicts", "Skip items modified in both workspaces").option("--include <items:string>", "Comma-separated kind:path items to include (e.g. script:f/test/main,flow:f/my/flow)").option("--exclude <items:string>", "Comma-separated kind:path items to exclude").option("--preserve-on-behalf-of", "Preserve original on_behalf_of/permissioned_as values").option("-y --yes", "Non-interactive mode (deploy without prompts)").action(mergeWorkspaces);
27532
+ }).action(add).command("remove").description("Remove a workspace").arguments("<workspace_name:string>").action(remove).command("whoami").description("Show the currently active user").action(whoami2).command("list").description("List local workspace profiles").action(list3).command("list-remote").description("List workspaces on the remote server that you have access to").action(listRemote).command("list-forks").description("List forked workspaces on the remote server").action(listForks).command("bind").description("Create or update a workspace entry in wmill.yaml from the active profile").option("--workspace <name:string>", "Workspace name (default: current branch or workspaceId)").option("--branch <branch:string>", "Git branch to associate (default: workspace name)").action((opts) => bind(opts, true)).command("unbind").description("Remove baseUrl and workspaceId from a workspace entry").option("--workspace <name:string>", "Workspace to unbind").action((opts) => bind(opts, false)).command("fork").description("Create a forked workspace").arguments("[workspace_name:string] [workspace_id:string]").option("--create-workspace-name <workspace_name:string>", "Specify the workspace name. Ignored if --create is not specified or the workspace already exists. Will default to the workspace id.").option("--color <color:string>", "Workspace color (hex code, e.g. #ff0000)").option("--datatable-behavior <behavior:string>", "How to handle datatables: skip, schema_only, or schema_and_data (default: interactive prompt)").option("-y --yes", "Skip interactive prompts (defaults datatable behavior to 'skip')").action(createWorkspaceFork2).command("delete-fork").description("Delete a forked workspace and git branch").arguments("<fork_name:string>").option("-y --yes", "Skip confirmation prompt").action(deleteWorkspaceFork).command("merge").description("Compare and deploy changes between a fork and its parent workspace").option("--direction <direction:string>", "Deploy direction: to-parent or to-fork").option("--all", "Deploy all changed items including conflicts").option("--skip-conflicts", "Skip items modified in both workspaces").option("--include <items:string>", "Comma-separated kind:path items to include (e.g. script:f/test/main,flow:f/my/flow)").option("--exclude <items:string>", "Comma-separated kind:path items to exclude").option("--preserve-on-behalf-of", "Preserve original on_behalf_of/permissioned_as values").option("-y --yes", "Non-interactive mode (deploy without prompts)").action(mergeWorkspaces).command("connect-slack").description("Non-interactively connect Slack to the active workspace using a pre-minted bot token (xoxb-...). Produces the same artifacts as the UI OAuth flow: workspace_settings fields, g/slack group, f/slack_bot folder, and the encrypted bot token variable + resource at f/slack_bot/bot_token.").option("--bot-token <bot_token:string>", "Slack bot token (xoxb-...)", { required: true }).option("--team-id <team_id:string>", "Slack team id", { required: true }).option("--team-name <team_name:string>", "Slack team name", { required: true }).action(connectSlack2).command("disconnect-slack").description("Clear slack_team_id / slack_name on the active workspace (marks the workspace as disconnected). Does NOT remove the bot token variable/resource/folder/group — delete those from the local sync folder and run 'wmill sync push' to tear them down. Does NOT remove the workspace-level OAuth override — set slack_oauth_client_id/_secret to '' in settings.yaml and push.").action(disconnectSlack2);
27483
27533
  workspace_default = command2;
27484
27534
  });
27485
27535
 
@@ -61646,12 +61696,21 @@ async function readModulesFromDisk(moduleFolderPath, defaultTs, folderLayout = f
61646
61696
  }
61647
61697
  async function createScript2(bundleContent, workspaceId, body, workspace) {
61648
61698
  const start = performance.now();
61699
+ const skipIfNoop = "skip_if_noop=true";
61649
61700
  if (!bundleContent) {
61650
61701
  try {
61651
- await createScript({
61652
- workspace: workspaceId,
61653
- requestBody: body
61702
+ const url = workspace.remote + "api/w/" + workspaceId + "/scripts/create?" + skipIfNoop;
61703
+ const req = await fetch(url, {
61704
+ method: "POST",
61705
+ headers: {
61706
+ Authorization: `Bearer ${workspace.token}`,
61707
+ "Content-Type": "application/json"
61708
+ },
61709
+ body: JSON.stringify(body)
61654
61710
  });
61711
+ if (req.status != 201) {
61712
+ throw Error(`${req.status} - ${req.statusText} - ${await req.text()}`);
61713
+ }
61655
61714
  } catch (e) {
61656
61715
  throw Error(`Script creation for ${body.path} with parent ${body.parent_hash} was not successful: ${e.body ?? e.message} `);
61657
61716
  }
@@ -61659,7 +61718,7 @@ async function createScript2(bundleContent, workspaceId, body, workspace) {
61659
61718
  const form = new FormData;
61660
61719
  form.append("script", JSON.stringify(body));
61661
61720
  form.append("file", typeof bundleContent == "string" ? bundleContent : bundleContent);
61662
- const url = workspace.remote + "api/w/" + workspace.workspaceId + "/scripts/create_snapshot";
61721
+ const url = workspace.remote + "api/w/" + workspace.workspaceId + "/scripts/create_snapshot?" + skipIfNoop;
61663
61722
  const req = await fetch(url, {
61664
61723
  method: "POST",
61665
61724
  headers: { Authorization: `Bearer ${workspace.token} ` },
@@ -65025,6 +65084,12 @@ async function compareDynFSElement(els1, els2, ignore, json, skips, ignoreMetada
65025
65084
  if (o["is_template"] != null) {
65026
65085
  delete o["is_template"];
65027
65086
  }
65087
+ if (o["no_main_func"] != null) {
65088
+ delete o["no_main_func"];
65089
+ }
65090
+ if (o["auto_kind"] != null) {
65091
+ delete o["auto_kind"];
65092
+ }
65028
65093
  }
65029
65094
  return o;
65030
65095
  } else {
@@ -66875,6 +66940,7 @@ async function updateScriptSchema(scriptContent, language, metadataContent, path
66875
66940
  delete metadataContent.has_preprocessor;
66876
66941
  }
66877
66942
  delete metadataContent.auto_kind;
66943
+ delete metadataContent.no_main_func;
66878
66944
  }
66879
66945
  function extractWorkspaceDepsAnnotation(scriptContent, language) {
66880
66946
  const config = LANG_ANNOTATION_CONFIG[language];
@@ -71162,6 +71228,45 @@ var init_schedule = __esm(async () => {
71162
71228
  schedule_default = command15;
71163
71229
  });
71164
71230
 
71231
+ // src/commands/instance/slack.ts
71232
+ async function resolveInstance(instanceName) {
71233
+ if (instanceName) {
71234
+ const match3 = (await allInstances()).find((i) => i.name === instanceName);
71235
+ if (!match3) {
71236
+ throw new Error(`No local instance profile named ${instanceName}`);
71237
+ }
71238
+ return match3;
71239
+ }
71240
+ const activeName = await getActiveInstance({});
71241
+ if (!activeName) {
71242
+ throw new Error("No active instance. Run 'wmill instance add' or pass --instance.");
71243
+ }
71244
+ const match2 = (await allInstances()).find((i) => i.name === activeName);
71245
+ if (!match2) {
71246
+ throw new Error(`Active instance ${activeName} not found in config`);
71247
+ }
71248
+ return match2;
71249
+ }
71250
+ async function connectSlackInstance2(opts) {
71251
+ const instance = await resolveInstance(opts.instance);
71252
+ setClient(instance.token, instance.remote.substring(0, instance.remote.length - 1));
71253
+ await connectSlackInstance({
71254
+ requestBody: {
71255
+ bot_token: opts.botToken,
71256
+ team_id: opts.teamId,
71257
+ team_name: opts.teamName
71258
+ }
71259
+ });
71260
+ info(colors.bold.underline.green(`Slack connected at instance ${instance.name} (team ${opts.teamName} / ${opts.teamId})`));
71261
+ }
71262
+ var init_slack2 = __esm(async () => {
71263
+ init_colors2();
71264
+ init_log();
71265
+ init_client();
71266
+ init_services_gen();
71267
+ await init_instance();
71268
+ });
71269
+
71165
71270
  // src/utils/local_encryption.ts
71166
71271
  import crypto3 from "node:crypto";
71167
71272
  function encode2(input) {
@@ -71242,6 +71347,10 @@ function migrateToGroupedFormat(settings) {
71242
71347
  result.slack_name = settings.slack_name;
71243
71348
  if (settings.slack_command_script !== undefined)
71244
71349
  result.slack_command_script = settings.slack_command_script;
71350
+ if (settings.slack_oauth_client_id !== undefined)
71351
+ result.slack_oauth_client_id = settings.slack_oauth_client_id;
71352
+ if (settings.slack_oauth_client_secret !== undefined)
71353
+ result.slack_oauth_client_secret = settings.slack_oauth_client_secret;
71245
71354
  if (settings.auto_invite && typeof settings.auto_invite === "object") {
71246
71355
  result.auto_invite = settings.auto_invite;
71247
71356
  } else if (settings.auto_invite_enabled !== undefined) {
@@ -71251,7 +71360,9 @@ function migrateToGroupedFormat(settings) {
71251
71360
  mode: settings.auto_invite_mode ?? "invite"
71252
71361
  };
71253
71362
  }
71254
- if (settings.error_handler && typeof settings.error_handler === "object") {
71363
+ if (settings.error_handler === null) {
71364
+ result.error_handler = null;
71365
+ } else if (settings.error_handler && typeof settings.error_handler === "object") {
71255
71366
  result.error_handler = settings.error_handler;
71256
71367
  } else if (typeof settings.error_handler === "string") {
71257
71368
  result.error_handler = {
@@ -71260,7 +71371,9 @@ function migrateToGroupedFormat(settings) {
71260
71371
  muted_on_cancel: settings.error_handler_muted_on_cancel ?? false
71261
71372
  };
71262
71373
  }
71263
- if (settings.success_handler && typeof settings.success_handler === "object") {
71374
+ if (settings.success_handler === null) {
71375
+ result.success_handler = null;
71376
+ } else if (settings.success_handler && typeof settings.success_handler === "object") {
71264
71377
  result.success_handler = settings.success_handler;
71265
71378
  } else if (typeof settings.success_handler === "string") {
71266
71379
  result.success_handler = {
@@ -71307,7 +71420,9 @@ async function pushWorkspaceSettings(workspace, _path, settings, localSettings)
71307
71420
  datatable: remoteSettings.datatable,
71308
71421
  slack_team_id: remoteSettings.slack_team_id,
71309
71422
  slack_name: remoteSettings.slack_name,
71310
- slack_command_script: remoteSettings.slack_command_script
71423
+ slack_command_script: remoteSettings.slack_command_script,
71424
+ slack_oauth_client_id: remoteSettings.slack_oauth_client_id,
71425
+ slack_oauth_client_secret: remoteSettings.slack_oauth_client_secret
71311
71426
  };
71312
71427
  } catch (err) {
71313
71428
  throw new Error(`Failed to get workspace settings: ${err}`);
@@ -71479,6 +71594,20 @@ async function pushWorkspaceSettings(workspace, _path, settings, localSettings)
71479
71594
  }
71480
71595
  });
71481
71596
  }
71597
+ if (localSettings.slack_oauth_client_id != settings.slack_oauth_client_id || localSettings.slack_oauth_client_secret != settings.slack_oauth_client_secret) {
71598
+ debug(`Updating slack oauth config...`);
71599
+ if (localSettings.slack_oauth_client_id && localSettings.slack_oauth_client_secret) {
71600
+ await setWorkspaceSlackOauthConfig({
71601
+ workspace,
71602
+ requestBody: {
71603
+ slack_oauth_client_id: localSettings.slack_oauth_client_id,
71604
+ slack_oauth_client_secret: localSettings.slack_oauth_client_secret
71605
+ }
71606
+ });
71607
+ } else {
71608
+ await deleteWorkspaceSlackOauthConfig({ workspace });
71609
+ }
71610
+ }
71482
71611
  }
71483
71612
  async function pushWorkspaceKey(workspace, _path, key, localKey) {
71484
71613
  try {
@@ -72208,6 +72337,7 @@ var init_instance = __esm(async () => {
72208
72337
  init_sync(),
72209
72338
  init_types(),
72210
72339
  init_user(),
72340
+ init_slack2(),
72211
72341
  init_workspace(),
72212
72342
  init_settings(),
72213
72343
  init_utils(),
@@ -72239,7 +72369,7 @@ var init_instance = __esm(async () => {
72239
72369
  });
72240
72370
  await removeInstance(choice);
72241
72371
  info(colors.green.underline(`Removed instance ${choice}`));
72242
- }).command("switch").complete("instance", async () => (await allInstances()).map((x) => x.name)).arguments("<instance:string:instance>").description("Switch the current instance").action(switchI).command("pull").description("Pull instance settings, users, configs, instance groups and overwrite local").option("--yes", "Pull without needing confirmation").option("--dry-run", "Perform a dry run without making changes").option("--skip-users", "Skip pulling users").option("--skip-settings", "Skip pulling settings").option("--skip-configs", "Skip pulling configs (worker groups)").option("--skip-groups", "Skip pulling instance groups").option("--include-workspaces", "Also pull workspaces").option("--folder-per-instance", "Create a folder per instance").option("--instance <instance:string>", "Name of the instance to pull from, override the active instance").option("--prefix <prefix:string>", "Prefix of the local workspaces to pull, used to create the folders when using --include-workspaces").option("--prefix-settings", "Store instance yamls inside prefixed folders when using --prefix and --folder-per-instance").action(instancePull).command("push").description("Push instance settings, users, configs, group and overwrite remote").option("--yes", "Push without needing confirmation").option("--dry-run", "Perform a dry run without making changes").option("--skip-users", "Skip pushing users").option("--skip-settings", "Skip pushing settings").option("--skip-configs", "Skip pushing configs (worker groups)").option("--skip-groups", "Skip pushing instance groups").option("--include-workspaces", "Also push workspaces").option("--folder-per-instance", "Create a folder per instance").option("--instance <instance:string>", "Name of the instance to push to, override the active instance").option("--prefix <prefix:string>", "Prefix of the local workspaces folders to push").option("--prefix-settings", "Store instance yamls inside prefixed folders when using --prefix and --folder-per-instance").action(instancePush).command("whoami").description("Display information about the currently logged-in user").action(whoami3).command("get-config").description("Dump the current instance config (global settings + worker configs) as YAML").option("-o, --output-file <file:string>", "Write YAML to a file instead of stdout").option("--show-secrets", "Include sensitive fields (license key, JWT secret) without prompting").option("--instance <instance:string>", "Name of the instance, override the active instance").action(getConfig2);
72372
+ }).command("switch").complete("instance", async () => (await allInstances()).map((x) => x.name)).arguments("<instance:string:instance>").description("Switch the current instance").action(switchI).command("pull").description("Pull instance settings, users, configs, instance groups and overwrite local").option("--yes", "Pull without needing confirmation").option("--dry-run", "Perform a dry run without making changes").option("--skip-users", "Skip pulling users").option("--skip-settings", "Skip pulling settings").option("--skip-configs", "Skip pulling configs (worker groups)").option("--skip-groups", "Skip pulling instance groups").option("--include-workspaces", "Also pull workspaces").option("--folder-per-instance", "Create a folder per instance").option("--instance <instance:string>", "Name of the instance to pull from, override the active instance").option("--prefix <prefix:string>", "Prefix of the local workspaces to pull, used to create the folders when using --include-workspaces").option("--prefix-settings", "Store instance yamls inside prefixed folders when using --prefix and --folder-per-instance").action(instancePull).command("push").description("Push instance settings, users, configs, group and overwrite remote").option("--yes", "Push without needing confirmation").option("--dry-run", "Perform a dry run without making changes").option("--skip-users", "Skip pushing users").option("--skip-settings", "Skip pushing settings").option("--skip-configs", "Skip pushing configs (worker groups)").option("--skip-groups", "Skip pushing instance groups").option("--include-workspaces", "Also push workspaces").option("--folder-per-instance", "Create a folder per instance").option("--instance <instance:string>", "Name of the instance to push to, override the active instance").option("--prefix <prefix:string>", "Prefix of the local workspaces folders to push").option("--prefix-settings", "Store instance yamls inside prefixed folders when using --prefix and --folder-per-instance").action(instancePush).command("whoami").description("Display information about the currently logged-in user").action(whoami3).command("get-config").description("Dump the current instance config (global settings + worker configs) as YAML").option("-o, --output-file <file:string>", "Write YAML to a file instead of stdout").option("--show-secrets", "Include sensitive fields (license key, JWT secret) without prompting").option("--instance <instance:string>", "Name of the instance, override the active instance").action(getConfig2).command("connect-slack").description("Non-interactively connect Slack at the instance level using a pre-minted bot token (xoxb-...). Produces the same artifacts as the UI OAuth flow: global_settings 'slack' row + encrypted f/slack_bot/global_bot_token variable and resource in the admins workspace.").option("--bot-token <bot_token:string>", "Slack bot token (xoxb-...)", { required: true }).option("--team-id <team_id:string>", "Slack team id", { required: true }).option("--team-name <team_name:string>", "Slack team name", { required: true }).option("--instance <instance:string>", "Instance profile to connect against (defaults to the active instance)").action((opts) => connectSlackInstance2(opts));
72243
72373
  instance_default = command16;
72244
72374
  });
72245
72375
 
@@ -82712,6 +82842,11 @@ sync local with a remote instance or the opposite (push or pull)
82712
82842
  - \`-o, --output-file <file:string>\` - Write YAML to a file instead of stdout
82713
82843
  - \`--show-secrets\` - Include sensitive fields (license key, JWT secret) without prompting
82714
82844
  - \`--instance <instance:string>\` - Name of the instance, override the active instance
82845
+ - \`instance connect-slack\`
82846
+ - \`--bot-token <bot_token:string>\` - Slack bot token (xoxb-...)
82847
+ - \`--team-id <team_id:string>\` - Slack team id
82848
+ - \`--team-name <team_name:string>\` - Slack team name
82849
+ - \`--instance <instance:string>\` - Instance profile to connect against (defaults to the active instance)
82715
82850
 
82716
82851
  ### job
82717
82852
 
@@ -83060,6 +83195,11 @@ workspace related commands
83060
83195
  - \`--exclude <items:string>\` - Comma-separated kind:path items to exclude
83061
83196
  - \`--preserve-on-behalf-of\` - Preserve original on_behalf_of/permissioned_as values
83062
83197
  - \`-y --yes\` - Non-interactive mode (deploy without prompts)
83198
+ - \`workspace connect-slack\` - Non-interactively connect Slack to the active workspace using a pre-minted bot token (xoxb-...). Produces the same artifacts as the UI OAuth flow: workspace_settings fields, g/slack group, f/slack_bot folder, and the encrypted bot token variable + resource at f/slack_bot/bot_token.
83199
+ - \`--bot-token <bot_token:string>\` - Slack bot token (xoxb-...)
83200
+ - \`--team-id <team_id:string>\` - Slack team id
83201
+ - \`--team-name <team_name:string>\` - Slack team name
83202
+ - \`workspace disconnect-slack\`
83063
83203
 
83064
83204
  `
83065
83205
  };
@@ -86001,7 +86141,7 @@ var config_default = command35;
86001
86141
 
86002
86142
  // src/main.ts
86003
86143
  await init_context();
86004
- var VERSION = "1.690.0";
86144
+ var VERSION = "1.691.0";
86005
86145
  async function checkVersionSafe(cmd) {
86006
86146
  const mainCommand = cmd.getMainCommand();
86007
86147
  const upgradeCommand = mainCommand.getCommand("upgrade");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "windmill-cli",
3
- "version": "1.690.0",
3
+ "version": "1.691.0",
4
4
  "description": "CLI for Windmill",
5
5
  "license": "Apache 2.0",
6
6
  "type": "module",