From 8e7c65f4fa98b9276988850367d9e8d1fd02a0a7 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Wed, 11 Nov 2026 12:46:37 -0800 Subject: [PATCH 1/4] feat: add slackbot.skills and admin.slackbot.skills methods Adds the Slackbot skills Web API methods to @slack/web-api: admin.slackbot.skills.{list,publish,setAutoEnabled,unpublish} and slackbot.skills.{create,delete,info,library.add,library.remove,list,update}. Co-Authored-By: Claude --- .changeset/slackbot-skills-methods.md | 5 + packages/web-api/src/methods.ts | 109 +++++++++++ .../src/types/request/admin/slackbot.ts | 57 ++++++ packages/web-api/src/types/request/index.ts | 17 ++ .../web-api/src/types/request/slackbot.ts | 117 ++++++++++++ .../AdminSlackbotSkillsListResponse.ts | 43 +++++ .../AdminSlackbotSkillsPublishResponse.ts | 23 +++ ...minSlackbotSkillsSetAutoEnabledResponse.ts | 21 ++ .../AdminSlackbotSkillsUnpublishResponse.ts | 23 +++ .../response/SlackbotSkillsCreateResponse.ts | 54 ++++++ .../response/SlackbotSkillsDeleteResponse.ts | 17 ++ .../response/SlackbotSkillsInfoResponse.ts | 47 +++++ .../SlackbotSkillsLibraryAddResponse.ts | 17 ++ .../SlackbotSkillsLibraryRemoveResponse.ts | 17 ++ .../response/SlackbotSkillsListResponse.ts | 52 +++++ .../response/SlackbotSkillsUpdateResponse.ts | 54 ++++++ packages/web-api/src/types/response/index.ts | 11 ++ .../types/methods/admin.slackbot.test-d.ts | 127 ++++++++++++ .../test/types/methods/slackbot.test-d.ts | 180 ++++++++++++++++++ 19 files changed, 991 insertions(+) create mode 100644 .changeset/slackbot-skills-methods.md create mode 100644 packages/web-api/src/types/request/admin/slackbot.ts create mode 100644 packages/web-api/src/types/request/slackbot.ts create mode 100644 packages/web-api/src/types/response/AdminSlackbotSkillsListResponse.ts create mode 100644 packages/web-api/src/types/response/AdminSlackbotSkillsPublishResponse.ts create mode 100644 packages/web-api/src/types/response/AdminSlackbotSkillsSetAutoEnabledResponse.ts create mode 100644 packages/web-api/src/types/response/AdminSlackbotSkillsUnpublishResponse.ts create mode 100644 packages/web-api/src/types/response/SlackbotSkillsCreateResponse.ts create mode 100644 packages/web-api/src/types/response/SlackbotSkillsDeleteResponse.ts create mode 100644 packages/web-api/src/types/response/SlackbotSkillsInfoResponse.ts create mode 100644 packages/web-api/src/types/response/SlackbotSkillsLibraryAddResponse.ts create mode 100644 packages/web-api/src/types/response/SlackbotSkillsLibraryRemoveResponse.ts create mode 100644 packages/web-api/src/types/response/SlackbotSkillsListResponse.ts create mode 100644 packages/web-api/src/types/response/SlackbotSkillsUpdateResponse.ts create mode 100644 packages/web-api/test/types/methods/admin.slackbot.test-d.ts create mode 100644 packages/web-api/test/types/methods/slackbot.test-d.ts diff --git a/.changeset/slackbot-skills-methods.md b/.changeset/slackbot-skills-methods.md new file mode 100644 index 000000000..73bb694f7 --- /dev/null +++ b/.changeset/slackbot-skills-methods.md @@ -0,0 +1,5 @@ +--- +"@slack/web-api": minor +--- + +feat(web-api): add [`admin.slackbot.skills.list`](https://docs.slack.dev/reference/methods/admin.slackbot.skills.list), [`admin.slackbot.skills.publish`](https://docs.slack.dev/reference/methods/admin.slackbot.skills.publish), [`admin.slackbot.skills.setAutoEnabled`](https://docs.slack.dev/reference/methods/admin.slackbot.skills.setAutoEnabled), [`admin.slackbot.skills.unpublish`](https://docs.slack.dev/reference/methods/admin.slackbot.skills.unpublish), [`slackbot.skills.create`](https://docs.slack.dev/reference/methods/slackbot.skills.create), [`slackbot.skills.delete`](https://docs.slack.dev/reference/methods/slackbot.skills.delete), [`slackbot.skills.info`](https://docs.slack.dev/reference/methods/slackbot.skills.info), [`slackbot.skills.library.add`](https://docs.slack.dev/reference/methods/slackbot.skills.library.add), [`slackbot.skills.library.remove`](https://docs.slack.dev/reference/methods/slackbot.skills.library.remove), [`slackbot.skills.list`](https://docs.slack.dev/reference/methods/slackbot.skills.list), and [`slackbot.skills.update`](https://docs.slack.dev/reference/methods/slackbot.skills.update) methods diff --git a/packages/web-api/src/methods.ts b/packages/web-api/src/methods.ts index 640249ff2..6dde54072 100644 --- a/packages/web-api/src/methods.ts +++ b/packages/web-api/src/methods.ts @@ -62,6 +62,10 @@ import type { AdminRolesAddAssignmentsArguments, AdminRolesListAssignmentsArguments, AdminRolesRemoveAssignmentsArguments, + AdminSlackbotSkillsListArguments, + AdminSlackbotSkillsPublishArguments, + AdminSlackbotSkillsSetAutoEnabledArguments, + AdminSlackbotSkillsUnpublishArguments, AdminTeamsAdminsListArguments, AdminTeamsCreateArguments, AdminTeamsListArguments, @@ -234,6 +238,13 @@ import type { SearchAllArguments, SearchFilesArguments, SearchMessagesArguments, + SlackbotSkillsCreateArguments, + SlackbotSkillsDeleteArguments, + SlackbotSkillsInfoArguments, + SlackbotSkillsLibraryAddArguments, + SlackbotSkillsLibraryRemoveArguments, + SlackbotSkillsListArguments, + SlackbotSkillsUpdateArguments, SlackListsAccessDeleteArguments, SlackListsAccessSetArguments, SlackListsCreateArguments, @@ -347,6 +358,10 @@ import type { AdminRolesAddAssignmentsResponse, AdminRolesListAssignmentsResponse, AdminRolesRemoveAssignmentsResponse, + AdminSlackbotSkillsListResponse, + AdminSlackbotSkillsPublishResponse, + AdminSlackbotSkillsSetAutoEnabledResponse, + AdminSlackbotSkillsUnpublishResponse, AdminTeamsAdminsListResponse, AdminTeamsCreateResponse, AdminTeamsListResponse, @@ -518,6 +533,13 @@ import type { SearchAllResponse, SearchFilesResponse, SearchMessagesResponse, + SlackbotSkillsCreateResponse, + SlackbotSkillsDeleteResponse, + SlackbotSkillsInfoResponse, + SlackbotSkillsLibraryAddResponse, + SlackbotSkillsLibraryRemoveResponse, + SlackbotSkillsListResponse, + SlackbotSkillsUpdateResponse, SlackListsAccessDeleteResponse, SlackListsAccessSetResponse, SlackListsCreateResponse, @@ -1118,6 +1140,42 @@ export abstract class Methods extends EventEmitter { 'admin.roles.removeAssignments', ), }, + slackbot: { + skills: { + /** + * @description Lists metadata for Slackbot skills owned by an organization. + * @see {@link https://docs.slack.dev/reference/methods/admin.slackbot.skills.list `admin.slackbot.skills.list` API reference}. + */ + list: bindApiCallWithOptionalArgument( + this, + 'admin.slackbot.skills.list', + ), + /** + * @description Publishes Slackbot skills to an organization's catalog. + * @see {@link https://docs.slack.dev/reference/methods/admin.slackbot.skills.publish `admin.slackbot.skills.publish` API reference}. + */ + publish: bindApiCall( + this, + 'admin.slackbot.skills.publish', + ), + /** + * @description Sets who a Slackbot skill is automatically turned on for. + * @see {@link https://docs.slack.dev/reference/methods/admin.slackbot.skills.setAutoEnabled `admin.slackbot.skills.setAutoEnabled` API reference}. + */ + setAutoEnabled: bindApiCall< + AdminSlackbotSkillsSetAutoEnabledArguments, + AdminSlackbotSkillsSetAutoEnabledResponse + >(this, 'admin.slackbot.skills.setAutoEnabled'), + /** + * @description Removes Slackbot skills from the org catalog, preserving access, libraries, and deployments. + * @see {@link https://docs.slack.dev/reference/methods/admin.slackbot.skills.unpublish `admin.slackbot.skills.unpublish` API reference}. + */ + unpublish: bindApiCall( + this, + 'admin.slackbot.skills.unpublish', + ), + }, + }, teams: { admins: { /** @@ -2350,6 +2408,57 @@ export abstract class Methods extends EventEmitter { messages: bindApiCall(this, 'search.messages'), }; + public readonly slackbot = { + skills: { + /** + * @description Creates a skill from markdown instructions, or turns an existing canvas the caller owns into a skill. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.create `slackbot.skills.create` API reference}. + */ + create: bindApiCall(this, 'slackbot.skills.create'), + /** + * @description Deletes a Slackbot skill and its canvas, and removes it from every library, skill set, and the org catalog. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.delete `slackbot.skills.delete` API reference}. + */ + delete: bindApiCall(this, 'slackbot.skills.delete'), + /** + * @description Returns one Slackbot skill, including its instructions. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.info `slackbot.skills.info` API reference}. + */ + info: bindApiCall(this, 'slackbot.skills.info'), + library: { + /** + * @description Turns a skill on in the caller's Slackbot library. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.add `slackbot.skills.library.add` API reference}. + */ + add: bindApiCall( + this, + 'slackbot.skills.library.add', + ), + /** + * @description Turns a skill off in the caller's Slackbot library. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.remove `slackbot.skills.library.remove` API reference}. + */ + remove: bindApiCall( + this, + 'slackbot.skills.library.remove', + ), + }, + /** + * @description Lists Slackbot skills from the caller's point of view. Instructions are not included. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.list `slackbot.skills.list` API reference}. + */ + list: bindApiCallWithOptionalArgument( + this, + 'slackbot.skills.list', + ), + /** + * @description Changes a Slackbot skill's instructions or metadata. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.update `slackbot.skills.update` API reference}. + */ + update: bindApiCall(this, 'slackbot.skills.update'), + }, + }; + public readonly slackLists = { access: { /** diff --git a/packages/web-api/src/types/request/admin/slackbot.ts b/packages/web-api/src/types/request/admin/slackbot.ts new file mode 100644 index 000000000..d8c1567ed --- /dev/null +++ b/packages/web-api/src/types/request/admin/slackbot.ts @@ -0,0 +1,57 @@ +import type { OptionalArgument } from '../../helpers'; + +import type { TokenOverridable } from '../common'; +import type { SlackbotSkillCategory } from '../slackbot'; + +interface SkillIDs { + /** @description One to 50 skill IDs. Successful items are not rolled back if other items fail. */ + skill_ids: [string, ...string[]]; +} + +// https://docs.slack.dev/reference/methods/admin.slackbot.skills.list +export type AdminSlackbotSkillsListArguments = OptionalArgument< + TokenOverridable & { + /** @description Filter by org deployment, independently of publication. */ + auto_enabled_status?: 'all' | 'disabled' | 'enabled'; + /** @description Only return skills in this category. */ + category?: SlackbotSkillCategory; + /** @description Only return skills created by these users. Accepts U or W user IDs. */ + creator_ids?: string[]; + /** + * @description Continuation from the previous page. Keep all filters and sorting unchanged. Pages can be empty + * while a continuation remains; continue until next_cursor is empty. Changes during traversal may move results; + * pagination is not a snapshot. + */ + cursor?: string; + /** @description The maximum number of skills to return. Fewer may be returned even when more remain. */ + limit?: number; + /** @description Filter by publication to the org catalog. */ + publish_status?: 'all' | 'published' | 'unpublished'; + /** + * @description Sort across the inventory. Name uses case-insensitive ordering. Unedited skills use their creation + * date for date_updated sorting. + */ + sort?: 'date_updated' | 'name' | 'usage_count'; + /** @description Sort direction; file ID breaks ties. */ + sort_dir?: 'asc' | 'desc'; + } +>; + +// https://docs.slack.dev/reference/methods/admin.slackbot.skills.publish +export interface AdminSlackbotSkillsPublishArguments extends SkillIDs, TokenOverridable {} + +// https://docs.slack.dev/reference/methods/admin.slackbot.skills.setAutoEnabled +export interface AdminSlackbotSkillsSetAutoEnabledArguments extends TokenOverridable { + /** @description Deployment audience. */ + permission_type: 'everyone' | 'named_entities' | 'no_one'; + /** @description Canvas skill to deploy. */ + skill_id: string; + /** + * @description One to 100 user groups for named_entities. Duplicates count toward the input limit and are stored + * once. Omit for other permission types. + */ + usergroup_ids?: [string, ...string[]]; +} + +// https://docs.slack.dev/reference/methods/admin.slackbot.skills.unpublish +export interface AdminSlackbotSkillsUnpublishArguments extends SkillIDs, TokenOverridable {} diff --git a/packages/web-api/src/types/request/index.ts b/packages/web-api/src/types/request/index.ts index f38ebbf54..f56d269f5 100644 --- a/packages/web-api/src/types/request/index.ts +++ b/packages/web-api/src/types/request/index.ts @@ -74,6 +74,12 @@ export type { AdminRolesListAssignmentsArguments, AdminRolesRemoveAssignmentsArguments, } from './admin/roles'; +export type { + AdminSlackbotSkillsListArguments, + AdminSlackbotSkillsPublishArguments, + AdminSlackbotSkillsSetAutoEnabledArguments, + AdminSlackbotSkillsUnpublishArguments, +} from './admin/slackbot'; export type { AdminTeamsAdminsListArguments, AdminTeamsCreateArguments, @@ -291,6 +297,17 @@ export type { SearchFilesArguments, SearchMessagesArguments, } from './search'; +export type { + SlackbotSkillCategory, + SlackbotSkillMCPServer, + SlackbotSkillsCreateArguments, + SlackbotSkillsDeleteArguments, + SlackbotSkillsInfoArguments, + SlackbotSkillsLibraryAddArguments, + SlackbotSkillsLibraryRemoveArguments, + SlackbotSkillsListArguments, + SlackbotSkillsUpdateArguments, +} from './slackbot'; export type { SlackListsAccessDeleteArguments, SlackListsAccessSetArguments, diff --git a/packages/web-api/src/types/request/slackbot.ts b/packages/web-api/src/types/request/slackbot.ts new file mode 100644 index 000000000..19ef0b3d3 --- /dev/null +++ b/packages/web-api/src/types/request/slackbot.ts @@ -0,0 +1,117 @@ +import type { OptionalArgument } from '../helpers'; + +import type { TokenOverridable } from './common'; + +export type SlackbotSkillCategory = + | 'communication' + | 'customer_support' + | 'data_and_analytics' + | 'engineering' + | 'other' + | 'product_management' + | 'productivity' + | 'professional_development' + | 'project_management' + | 'sales' + | 'system' + | 'team_management'; + +export interface SlackbotSkillMCPServer { + app_id?: string; + server_id?: string; + service_type: string; +} + +interface SkillCanvasID { + /** @description Canvas the caller owns to turn into a skill. Send exactly one of `instructions` or `canvas_id`. */ + canvas_id: string; +} +interface SkillInstructions { + /** @description Markdown body of the skill. Send exactly one of `instructions` or `canvas_id`. */ + instructions: string; +} +// Models either canvas_id or instructions - but not both. +type SkillCanvasIDOrInstructions = + | (SkillCanvasID & { instructions?: never }) + | (SkillInstructions & { canvas_id?: never }); + +// https://docs.slack.dev/reference/methods/slackbot.skills.create +export type SlackbotSkillsCreateArguments = SkillCanvasIDOrInstructions & + TokenOverridable & { + /** @description One of the skill categories. */ + category?: SlackbotSkillCategory; + /** @description When Slackbot should use the skill. Max 400 characters. */ + description?: string; + /** @description Human-readable label. Max 255 characters; not unique. */ + display_name: string; + /** @description Max 200 characters. May contain `{skill}`, which becomes the skill mention. */ + example_prompt?: string; + /** + * @description Apps the skill needs, capped at the caller's MCP server limit. Declaring an app doesn't grant + * access to it. + */ + mcp_servers?: SlackbotSkillMCPServer[]; + }; + +// https://docs.slack.dev/reference/methods/slackbot.skills.delete +export interface SlackbotSkillsDeleteArguments extends TokenOverridable { + /** @description Skill to delete. */ + skill_id: string; +} + +// https://docs.slack.dev/reference/methods/slackbot.skills.info +export interface SlackbotSkillsInfoArguments extends TokenOverridable { + /** @description Skill to fetch: a canvas file ID or a `builtin:` reference. */ + skill_id: string; +} + +// https://docs.slack.dev/reference/methods/slackbot.skills.library.add +export interface SlackbotSkillsLibraryAddArguments extends TokenOverridable { + /** @description Skill to turn on for the caller. */ + skill_id: string; +} + +// https://docs.slack.dev/reference/methods/slackbot.skills.library.remove +export interface SlackbotSkillsLibraryRemoveArguments extends TokenOverridable { + /** @description Skill to turn off for the caller. */ + skill_id: string; +} + +// https://docs.slack.dev/reference/methods/slackbot.skills.list +export type SlackbotSkillsListArguments = OptionalArgument< + TokenOverridable & { + /** @description Only return skills in this category. */ + category?: SlackbotSkillCategory; + /** + * @description Paginate through collections of data by setting the `cursor` parameter to a `next_cursor` + * attribute returned by a previous request's `response_metadata`. Must be used with the same `filter` and + * `category`. + */ + cursor?: string; + /** + * @description `library`: skills enabled for the caller, including auto-enabled skills and skills from skill + * sets. `owned`: skills the caller created. `catalog`: the organization's official skills. + */ + filter?: 'catalog' | 'library' | 'owned'; + /** @description The maximum number of skills to return. Fewer may be returned even when more remain. */ + limit?: number; + } +>; + +// https://docs.slack.dev/reference/methods/slackbot.skills.update +export interface SlackbotSkillsUpdateArguments extends TokenOverridable { + /** @description One of the skill categories. Send an empty string to clear. */ + category?: SlackbotSkillCategory | ''; + /** @description When Slackbot should use the skill. Max 400 characters. Send an empty string to clear. */ + description?: string; + /** @description Human-readable label. Max 255 characters. */ + display_name?: string; + /** @description Max 200 characters. May contain `{skill}`. Send an empty string to clear. */ + example_prompt?: string; + /** @description Markdown that replaces the whole document. */ + instructions?: string; + /** @description Apps the skill needs. Replaces the whole list; send `[]` to clear. */ + mcp_servers?: SlackbotSkillMCPServer[]; + /** @description Skill to change. */ + skill_id: string; +} diff --git a/packages/web-api/src/types/response/AdminSlackbotSkillsListResponse.ts b/packages/web-api/src/types/response/AdminSlackbotSkillsListResponse.ts new file mode 100644 index 000000000..84d77773a --- /dev/null +++ b/packages/web-api/src/types/response/AdminSlackbotSkillsListResponse.ts @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type AdminSlackbotSkillsListResponse = WebAPICallResult & { + error?: string; + needed?: string; + ok?: boolean; + provided?: string; + response_metadata?: ResponseMetadata; + skills?: Skill[]; + warning?: string; +}; + +export interface ResponseMetadata { + next_cursor?: string; +} + +export interface Skill { + auto_enabled?: AutoEnabled; + category?: string; + creator_id?: string; + date_created?: number; + date_updated?: number; + description?: string; + display_name?: string; + id?: string; + is_official?: boolean; + library_count?: number; + usage_count?: number; + visibility?: string; +} + +export interface AutoEnabled { + permission_type?: string; + usergroup_ids?: string[]; +} diff --git a/packages/web-api/src/types/response/AdminSlackbotSkillsPublishResponse.ts b/packages/web-api/src/types/response/AdminSlackbotSkillsPublishResponse.ts new file mode 100644 index 000000000..a548f452f --- /dev/null +++ b/packages/web-api/src/types/response/AdminSlackbotSkillsPublishResponse.ts @@ -0,0 +1,23 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type AdminSlackbotSkillsPublishResponse = WebAPICallResult & { + error?: string; + failed_skills?: FailedSkill[]; + needed?: string; + ok?: boolean; + provided?: string; + warning?: string; +}; + +export interface FailedSkill { + error?: string; + skill_id?: string; +} diff --git a/packages/web-api/src/types/response/AdminSlackbotSkillsSetAutoEnabledResponse.ts b/packages/web-api/src/types/response/AdminSlackbotSkillsSetAutoEnabledResponse.ts new file mode 100644 index 000000000..7368cd843 --- /dev/null +++ b/packages/web-api/src/types/response/AdminSlackbotSkillsSetAutoEnabledResponse.ts @@ -0,0 +1,21 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type AdminSlackbotSkillsSetAutoEnabledResponse = WebAPICallResult & { + error?: string; + invalid_usergroup_ids?: string[]; + needed?: string; + ok?: boolean; + permission_type?: string; + provided?: string; + skill_id?: string; + usergroup_ids?: string[]; + warning?: string; +}; diff --git a/packages/web-api/src/types/response/AdminSlackbotSkillsUnpublishResponse.ts b/packages/web-api/src/types/response/AdminSlackbotSkillsUnpublishResponse.ts new file mode 100644 index 000000000..b18c3556f --- /dev/null +++ b/packages/web-api/src/types/response/AdminSlackbotSkillsUnpublishResponse.ts @@ -0,0 +1,23 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type AdminSlackbotSkillsUnpublishResponse = WebAPICallResult & { + error?: string; + failed_skills?: FailedSkill[]; + needed?: string; + ok?: boolean; + provided?: string; + warning?: string; +}; + +export interface FailedSkill { + error?: string; + skill_id?: string; +} diff --git a/packages/web-api/src/types/response/SlackbotSkillsCreateResponse.ts b/packages/web-api/src/types/response/SlackbotSkillsCreateResponse.ts new file mode 100644 index 000000000..09a6e94c8 --- /dev/null +++ b/packages/web-api/src/types/response/SlackbotSkillsCreateResponse.ts @@ -0,0 +1,54 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type SlackbotSkillsCreateResponse = WebAPICallResult & { + error?: string; + invalid_mcp_servers?: InvalidmcpServer[]; + needed?: string; + ok?: boolean; + provided?: string; + skill?: Skill; + warning?: string; +}; + +export interface InvalidmcpServer { + app_id?: string; + server_id?: string; + service_type?: string; +} + +export interface Skill { + access?: string; + category?: string; + creator_id?: string; + date_created?: number; + date_updated?: number; + description?: string; + display_name?: string; + example_prompt?: string; + id?: string; + instructions?: string; + is_official?: boolean; + library_count?: number; + mcp_servers?: McpServer[]; + name?: string; + permalink?: string; + type?: string; + usage_count?: number; + visibility?: string; +} + +export interface McpServer { + app_id?: string; + display_name?: string; + is_available?: boolean; + server_id?: string; + service_type?: string; +} diff --git a/packages/web-api/src/types/response/SlackbotSkillsDeleteResponse.ts b/packages/web-api/src/types/response/SlackbotSkillsDeleteResponse.ts new file mode 100644 index 000000000..47b2f99f0 --- /dev/null +++ b/packages/web-api/src/types/response/SlackbotSkillsDeleteResponse.ts @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type SlackbotSkillsDeleteResponse = WebAPICallResult & { + error?: string; + needed?: string; + ok?: boolean; + provided?: string; + warning?: string; +}; diff --git a/packages/web-api/src/types/response/SlackbotSkillsInfoResponse.ts b/packages/web-api/src/types/response/SlackbotSkillsInfoResponse.ts new file mode 100644 index 000000000..430e21eb1 --- /dev/null +++ b/packages/web-api/src/types/response/SlackbotSkillsInfoResponse.ts @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type SlackbotSkillsInfoResponse = WebAPICallResult & { + error?: string; + needed?: string; + ok?: boolean; + provided?: string; + skill?: Skill; + warning?: string; +}; + +export interface Skill { + access?: string; + category?: string; + creator_id?: string; + date_created?: number; + date_updated?: number; + description?: string; + display_name?: string; + example_prompt?: string; + id?: string; + instructions?: string; + is_official?: boolean; + library_count?: number; + mcp_servers?: McpServer[]; + name?: string; + permalink?: string; + type?: string; + usage_count?: number; + visibility?: string; +} + +export interface McpServer { + app_id?: string; + display_name?: string; + is_available?: boolean; + server_id?: string; + service_type?: string; +} diff --git a/packages/web-api/src/types/response/SlackbotSkillsLibraryAddResponse.ts b/packages/web-api/src/types/response/SlackbotSkillsLibraryAddResponse.ts new file mode 100644 index 000000000..2f1802bb2 --- /dev/null +++ b/packages/web-api/src/types/response/SlackbotSkillsLibraryAddResponse.ts @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type SlackbotSkillsLibraryAddResponse = WebAPICallResult & { + error?: string; + needed?: string; + ok?: boolean; + provided?: string; + warning?: string; +}; diff --git a/packages/web-api/src/types/response/SlackbotSkillsLibraryRemoveResponse.ts b/packages/web-api/src/types/response/SlackbotSkillsLibraryRemoveResponse.ts new file mode 100644 index 000000000..439f16ce9 --- /dev/null +++ b/packages/web-api/src/types/response/SlackbotSkillsLibraryRemoveResponse.ts @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type SlackbotSkillsLibraryRemoveResponse = WebAPICallResult & { + error?: string; + needed?: string; + ok?: boolean; + provided?: string; + warning?: string; +}; diff --git a/packages/web-api/src/types/response/SlackbotSkillsListResponse.ts b/packages/web-api/src/types/response/SlackbotSkillsListResponse.ts new file mode 100644 index 000000000..70b003d47 --- /dev/null +++ b/packages/web-api/src/types/response/SlackbotSkillsListResponse.ts @@ -0,0 +1,52 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type SlackbotSkillsListResponse = WebAPICallResult & { + error?: string; + needed?: string; + ok?: boolean; + provided?: string; + response_metadata?: ResponseMetadata; + skills?: Skill[]; + warning?: string; +}; + +export interface ResponseMetadata { + next_cursor?: string; +} + +export interface Skill { + access?: string; + category?: string; + creator_id?: string; + date_created?: number; + date_updated?: number; + description?: string; + display_name?: string; + example_prompt?: string; + id?: string; + instructions?: string; + is_official?: boolean; + library_count?: number; + mcp_servers?: McpServer[]; + name?: string; + permalink?: string; + type?: string; + usage_count?: number; + visibility?: string; +} + +export interface McpServer { + app_id?: string; + display_name?: string; + is_available?: boolean; + server_id?: string; + service_type?: string; +} diff --git a/packages/web-api/src/types/response/SlackbotSkillsUpdateResponse.ts b/packages/web-api/src/types/response/SlackbotSkillsUpdateResponse.ts new file mode 100644 index 000000000..bedf5cbc0 --- /dev/null +++ b/packages/web-api/src/types/response/SlackbotSkillsUpdateResponse.ts @@ -0,0 +1,54 @@ +///////////////////////////////////////////////////////////////////////////////////////// +// // +// !!! DO NOT EDIT THIS FILE !!! // +// // +// This file is auto-generated by scripts/generate-web-api-types.sh in the repository. // +// Please refer to the script code to learn how to update the source data. // +// // +///////////////////////////////////////////////////////////////////////////////////////// + +import type { WebAPICallResult } from '../../WebClient'; +export type SlackbotSkillsUpdateResponse = WebAPICallResult & { + error?: string; + invalid_mcp_servers?: InvalidmcpServer[]; + needed?: string; + ok?: boolean; + provided?: string; + skill?: Skill; + warning?: string; +}; + +export interface InvalidmcpServer { + app_id?: string; + server_id?: string; + service_type?: string; +} + +export interface Skill { + access?: string; + category?: string; + creator_id?: string; + date_created?: number; + date_updated?: number; + description?: string; + display_name?: string; + example_prompt?: string; + id?: string; + instructions?: string; + is_official?: boolean; + library_count?: number; + mcp_servers?: McpServer[]; + name?: string; + permalink?: string; + type?: string; + usage_count?: number; + visibility?: string; +} + +export interface McpServer { + app_id?: string; + display_name?: string; + is_available?: boolean; + server_id?: string; + service_type?: string; +} diff --git a/packages/web-api/src/types/response/index.ts b/packages/web-api/src/types/response/index.ts index fe0e41999..fc42a4431 100644 --- a/packages/web-api/src/types/response/index.ts +++ b/packages/web-api/src/types/response/index.ts @@ -66,6 +66,10 @@ export { AdminInviteRequestsListResponse } from './AdminInviteRequestsListRespon export { AdminRolesAddAssignmentsResponse } from './AdminRolesAddAssignmentsResponse'; export { AdminRolesListAssignmentsResponse } from './AdminRolesListAssignmentsResponse'; export { AdminRolesRemoveAssignmentsResponse } from './AdminRolesRemoveAssignmentsResponse'; +export { AdminSlackbotSkillsListResponse } from './AdminSlackbotSkillsListResponse'; +export { AdminSlackbotSkillsPublishResponse } from './AdminSlackbotSkillsPublishResponse'; +export { AdminSlackbotSkillsSetAutoEnabledResponse } from './AdminSlackbotSkillsSetAutoEnabledResponse'; +export { AdminSlackbotSkillsUnpublishResponse } from './AdminSlackbotSkillsUnpublishResponse'; export { AdminTeamsAdminsListResponse } from './AdminTeamsAdminsListResponse'; export { AdminTeamsCreateResponse } from './AdminTeamsCreateResponse'; export { AdminTeamsListResponse } from './AdminTeamsListResponse'; @@ -292,6 +296,13 @@ export { RtmStartResponse } from './RtmStartResponse'; export { SearchAllResponse } from './SearchAllResponse'; export { SearchFilesResponse } from './SearchFilesResponse'; export { SearchMessagesResponse } from './SearchMessagesResponse'; +export { SlackbotSkillsCreateResponse } from './SlackbotSkillsCreateResponse'; +export { SlackbotSkillsDeleteResponse } from './SlackbotSkillsDeleteResponse'; +export { SlackbotSkillsInfoResponse } from './SlackbotSkillsInfoResponse'; +export { SlackbotSkillsLibraryAddResponse } from './SlackbotSkillsLibraryAddResponse'; +export { SlackbotSkillsLibraryRemoveResponse } from './SlackbotSkillsLibraryRemoveResponse'; +export { SlackbotSkillsListResponse } from './SlackbotSkillsListResponse'; +export { SlackbotSkillsUpdateResponse } from './SlackbotSkillsUpdateResponse'; export { SlackListsAccessDeleteResponse } from './SlackListsAccessDeleteResponse'; export { SlackListsAccessSetResponse } from './SlackListsAccessSetResponse'; export { SlackListsCreateResponse } from './SlackListsCreateResponse'; diff --git a/packages/web-api/test/types/methods/admin.slackbot.test-d.ts b/packages/web-api/test/types/methods/admin.slackbot.test-d.ts new file mode 100644 index 000000000..86c148e6e --- /dev/null +++ b/packages/web-api/test/types/methods/admin.slackbot.test-d.ts @@ -0,0 +1,127 @@ +import { expectAssignable, expectError } from 'tsd'; +import { WebClient } from '../../../src/WebClient'; + +const web = new WebClient('TOKEN'); + +// admin.slackbot.skills.list +// -- sad path +expectError( + web.admin.slackbot.skills.list({ + auto_enabled_status: 'on', // invalid auto_enabled_status + }), +); +expectError( + web.admin.slackbot.skills.list({ + category: 'cooking', // invalid category + }), +); +expectError( + web.admin.slackbot.skills.list({ + publish_status: 'draft', // invalid publish_status + }), +); +expectError( + web.admin.slackbot.skills.list({ + sort: 'date_created', // invalid sort + }), +); +expectError( + web.admin.slackbot.skills.list({ + sort_dir: 'up', // invalid sort_dir + }), +); +// -- happy path +expectAssignable>([]); // no arg is fine +expectAssignable>([{}]); // empty arg is fine +expectAssignable>([ + { + auto_enabled_status: 'enabled', + category: 'productivity', + creator_ids: ['U1234', 'W1234'], + cursor: 'dXNlcjpVMDYxTkZUVDI=', + limit: 100, + publish_status: 'published', + sort: 'usage_count', + sort_dir: 'desc', + }, +]); + +// admin.slackbot.skills.publish +// -- sad path +expectError(web.admin.slackbot.skills.publish()); // lacking argument +expectError(web.admin.slackbot.skills.publish({})); // empty argument +expectError( + web.admin.slackbot.skills.publish({ + skill_ids: [], // need at least 1 item + }), +); +// -- happy path +expectAssignable>([ + { + skill_ids: ['F1234', 'F5678'], + }, +]); + +// admin.slackbot.skills.setAutoEnabled +// -- sad path +expectError(web.admin.slackbot.skills.setAutoEnabled()); // lacking argument +expectError(web.admin.slackbot.skills.setAutoEnabled({})); // empty argument +expectError( + web.admin.slackbot.skills.setAutoEnabled({ + permission_type: 'everyone', // missing skill_id + }), +); +expectError( + web.admin.slackbot.skills.setAutoEnabled({ + skill_id: 'F1234', // missing permission_type + }), +); +expectError( + web.admin.slackbot.skills.setAutoEnabled({ + permission_type: 'some_people', // invalid permission_type + skill_id: 'F1234', + }), +); +expectError( + web.admin.slackbot.skills.setAutoEnabled({ + permission_type: 'named_entities', + skill_id: 'F1234', + usergroup_ids: [], // need at least 1 item + }), +); +// -- happy path +expectAssignable>([ + { + permission_type: 'everyone', + skill_id: 'F1234', + }, +]); +expectAssignable>([ + { + permission_type: 'named_entities', + skill_id: 'F1234', + usergroup_ids: ['S1234'], + }, +]); +expectAssignable>([ + { + permission_type: 'no_one', + skill_id: 'F1234', + }, +]); + +// admin.slackbot.skills.unpublish +// -- sad path +expectError(web.admin.slackbot.skills.unpublish()); // lacking argument +expectError(web.admin.slackbot.skills.unpublish({})); // empty argument +expectError( + web.admin.slackbot.skills.unpublish({ + skill_ids: [], // need at least 1 item + }), +); +// -- happy path +expectAssignable>([ + { + skill_ids: ['F1234', 'F5678'], + }, +]); diff --git a/packages/web-api/test/types/methods/slackbot.test-d.ts b/packages/web-api/test/types/methods/slackbot.test-d.ts new file mode 100644 index 000000000..0660fd200 --- /dev/null +++ b/packages/web-api/test/types/methods/slackbot.test-d.ts @@ -0,0 +1,180 @@ +import { expectAssignable, expectError } from 'tsd'; +import { WebClient } from '../../../src/WebClient'; + +const web = new WebClient('TOKEN'); + +// slackbot.skills.create +// -- sad path +expectError(web.slackbot.skills.create()); // lacking argument +expectError(web.slackbot.skills.create({})); // empty argument +expectError( + web.slackbot.skills.create({ + instructions: '# Purpose', // missing display_name + }), +); +expectError( + web.slackbot.skills.create({ + display_name: 'Daily priorities', // missing instructions or canvas_id + }), +); +expectError( + web.slackbot.skills.create({ + canvas_id: 'F1234', // both instructions and canvas_id + display_name: 'Daily priorities', + instructions: '# Purpose', + }), +); +expectError( + web.slackbot.skills.create({ + category: 'cooking', // invalid category + display_name: 'Daily priorities', + instructions: '# Purpose', + }), +); +expectError( + web.slackbot.skills.create({ + display_name: 'Daily priorities', + instructions: '# Purpose', + mcp_servers: ['A1234'], // mcp_servers are objects + }), +); +expectError( + web.slackbot.skills.create({ + display_name: 'Daily priorities', + instructions: '# Purpose', + mcp_servers: [{ app_id: 'A1234' }], // missing service_type + }), +); +// -- happy path +expectAssignable>([ + { + display_name: 'Daily priorities', + instructions: '# Purpose\nSuggest the three most important things to work on today.', + }, +]); +expectAssignable>([ + { + canvas_id: 'F1234', + display_name: 'Daily priorities', + }, +]); +expectAssignable>([ + { + category: 'productivity', + description: 'Reviews information from Slack and your calendar to suggest priorities for the day.', + display_name: 'Daily priorities', + example_prompt: 'Run {skill} for today', + instructions: '# Purpose\nSuggest the three most important things to work on today.', + mcp_servers: [{ app_id: 'A1234', server_id: 'Amcp1234', service_type: 'app' }], + }, +]); + +// slackbot.skills.delete +// -- sad path +expectError(web.slackbot.skills.delete()); // lacking argument +expectError(web.slackbot.skills.delete({})); // empty argument +// -- happy path +expectAssignable>([ + { + skill_id: 'F1234', + }, +]); + +// slackbot.skills.info +// -- sad path +expectError(web.slackbot.skills.info()); // lacking argument +expectError(web.slackbot.skills.info({})); // empty argument +// -- happy path +expectAssignable>([ + { + skill_id: 'F1234', + }, +]); + +// slackbot.skills.library.add +// -- sad path +expectError(web.slackbot.skills.library.add()); // lacking argument +expectError(web.slackbot.skills.library.add({})); // empty argument +// -- happy path +expectAssignable>([ + { + skill_id: 'F1234', + }, +]); + +// slackbot.skills.library.remove +// -- sad path +expectError(web.slackbot.skills.library.remove()); // lacking argument +expectError(web.slackbot.skills.library.remove({})); // empty argument +// -- happy path +expectAssignable>([ + { + skill_id: 'F1234', + }, +]); + +// slackbot.skills.list +// -- sad path +expectError( + web.slackbot.skills.list({ + filter: 'shared', // invalid filter + }), +); +expectError( + web.slackbot.skills.list({ + category: 'cooking', // invalid category + }), +); +// -- happy path +expectAssignable>([]); // no arg is fine +expectAssignable>([{}]); // empty arg is fine +expectAssignable>([ + { + category: 'engineering', + cursor: 'dGVhbTpDMDYxRkE1UEI=', + filter: 'owned', + limit: 100, + }, +]); + +// slackbot.skills.update +// -- sad path +expectError(web.slackbot.skills.update()); // lacking argument +expectError(web.slackbot.skills.update({})); // empty argument +expectError( + web.slackbot.skills.update({ + display_name: 'Daily priorities', // missing skill_id + }), +); +expectError( + web.slackbot.skills.update({ + category: 'cooking', // invalid category + skill_id: 'F1234', + }), +); +// -- happy path +expectAssignable>([ + { + skill_id: 'F1234', + }, +]); +expectAssignable>([ + { + category: '', + description: '', + example_prompt: '', + mcp_servers: [], + skill_id: 'F1234', + }, +]); +expectAssignable>([ + { + category: 'productivity', + description: 'Reviews information from Slack and your calendar to suggest priorities for the day.', + display_name: 'Daily priorities', + example_prompt: 'Run {skill} for today', + instructions: '# Purpose\nSuggest the three most important things to work on today.', + mcp_servers: [{ app_id: 'A1234', service_type: 'app' }], + skill_id: 'F1234', + }, +]); From 667307912d160189143a4e6491d58694ad9e9f07 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Wed, 11 Nov 2026 13:04:10 -0800 Subject: [PATCH 2/4] refactor: inline slackbot skills argument types and use plain string arrays Inlines the skill ID, category, MCP server, and canvas or instructions helper types into each argument, drops the SlackbotSkillCategory and SlackbotSkillMCPServer exports, and types skill_ids and usergroup_ids as string[] instead of non-empty tuples. Co-Authored-By: Claude --- .../src/types/request/admin/slackbot.ts | 32 +++-- packages/web-api/src/types/request/index.ts | 2 - .../web-api/src/types/request/slackbot.ts | 118 ++++++++++-------- .../types/methods/admin.slackbot.test-d.ts | 17 --- 4 files changed, 88 insertions(+), 81 deletions(-) diff --git a/packages/web-api/src/types/request/admin/slackbot.ts b/packages/web-api/src/types/request/admin/slackbot.ts index d8c1567ed..543134792 100644 --- a/packages/web-api/src/types/request/admin/slackbot.ts +++ b/packages/web-api/src/types/request/admin/slackbot.ts @@ -1,12 +1,6 @@ import type { OptionalArgument } from '../../helpers'; import type { TokenOverridable } from '../common'; -import type { SlackbotSkillCategory } from '../slackbot'; - -interface SkillIDs { - /** @description One to 50 skill IDs. Successful items are not rolled back if other items fail. */ - skill_ids: [string, ...string[]]; -} // https://docs.slack.dev/reference/methods/admin.slackbot.skills.list export type AdminSlackbotSkillsListArguments = OptionalArgument< @@ -14,7 +8,19 @@ export type AdminSlackbotSkillsListArguments = OptionalArgument< /** @description Filter by org deployment, independently of publication. */ auto_enabled_status?: 'all' | 'disabled' | 'enabled'; /** @description Only return skills in this category. */ - category?: SlackbotSkillCategory; + category?: + | 'communication' + | 'customer_support' + | 'data_and_analytics' + | 'engineering' + | 'other' + | 'product_management' + | 'productivity' + | 'professional_development' + | 'project_management' + | 'sales' + | 'system' + | 'team_management'; /** @description Only return skills created by these users. Accepts U or W user IDs. */ creator_ids?: string[]; /** @@ -38,7 +44,10 @@ export type AdminSlackbotSkillsListArguments = OptionalArgument< >; // https://docs.slack.dev/reference/methods/admin.slackbot.skills.publish -export interface AdminSlackbotSkillsPublishArguments extends SkillIDs, TokenOverridable {} +export interface AdminSlackbotSkillsPublishArguments extends TokenOverridable { + /** @description One to 50 skill IDs. Successful items are not rolled back if other items fail. */ + skill_ids: string[]; +} // https://docs.slack.dev/reference/methods/admin.slackbot.skills.setAutoEnabled export interface AdminSlackbotSkillsSetAutoEnabledArguments extends TokenOverridable { @@ -50,8 +59,11 @@ export interface AdminSlackbotSkillsSetAutoEnabledArguments extends TokenOverrid * @description One to 100 user groups for named_entities. Duplicates count toward the input limit and are stored * once. Omit for other permission types. */ - usergroup_ids?: [string, ...string[]]; + usergroup_ids?: string[]; } // https://docs.slack.dev/reference/methods/admin.slackbot.skills.unpublish -export interface AdminSlackbotSkillsUnpublishArguments extends SkillIDs, TokenOverridable {} +export interface AdminSlackbotSkillsUnpublishArguments extends TokenOverridable { + /** @description One to 50 skill IDs. Successful items are not rolled back if other items fail. */ + skill_ids: string[]; +} diff --git a/packages/web-api/src/types/request/index.ts b/packages/web-api/src/types/request/index.ts index f56d269f5..d155111c2 100644 --- a/packages/web-api/src/types/request/index.ts +++ b/packages/web-api/src/types/request/index.ts @@ -298,8 +298,6 @@ export type { SearchMessagesArguments, } from './search'; export type { - SlackbotSkillCategory, - SlackbotSkillMCPServer, SlackbotSkillsCreateArguments, SlackbotSkillsDeleteArguments, SlackbotSkillsInfoArguments, diff --git a/packages/web-api/src/types/request/slackbot.ts b/packages/web-api/src/types/request/slackbot.ts index 19ef0b3d3..e672d21a3 100644 --- a/packages/web-api/src/types/request/slackbot.ts +++ b/packages/web-api/src/types/request/slackbot.ts @@ -2,56 +2,45 @@ import type { OptionalArgument } from '../helpers'; import type { TokenOverridable } from './common'; -export type SlackbotSkillCategory = - | 'communication' - | 'customer_support' - | 'data_and_analytics' - | 'engineering' - | 'other' - | 'product_management' - | 'productivity' - | 'professional_development' - | 'project_management' - | 'sales' - | 'system' - | 'team_management'; - -export interface SlackbotSkillMCPServer { - app_id?: string; - server_id?: string; - service_type: string; -} - -interface SkillCanvasID { - /** @description Canvas the caller owns to turn into a skill. Send exactly one of `instructions` or `canvas_id`. */ - canvas_id: string; -} -interface SkillInstructions { - /** @description Markdown body of the skill. Send exactly one of `instructions` or `canvas_id`. */ - instructions: string; -} -// Models either canvas_id or instructions - but not both. -type SkillCanvasIDOrInstructions = - | (SkillCanvasID & { instructions?: never }) - | (SkillInstructions & { canvas_id?: never }); - // https://docs.slack.dev/reference/methods/slackbot.skills.create -export type SlackbotSkillsCreateArguments = SkillCanvasIDOrInstructions & - TokenOverridable & { - /** @description One of the skill categories. */ - category?: SlackbotSkillCategory; - /** @description When Slackbot should use the skill. Max 400 characters. */ - description?: string; - /** @description Human-readable label. Max 255 characters; not unique. */ - display_name: string; - /** @description Max 200 characters. May contain `{skill}`, which becomes the skill mention. */ - example_prompt?: string; - /** - * @description Apps the skill needs, capped at the caller's MCP server limit. Declaring an app doesn't grant - * access to it. - */ - mcp_servers?: SlackbotSkillMCPServer[]; - }; +export type SlackbotSkillsCreateArguments = TokenOverridable & { + /** @description One of the skill categories. */ + category?: + | 'communication' + | 'customer_support' + | 'data_and_analytics' + | 'engineering' + | 'other' + | 'product_management' + | 'productivity' + | 'professional_development' + | 'project_management' + | 'sales' + | 'system' + | 'team_management'; + /** @description When Slackbot should use the skill. Max 400 characters. */ + description?: string; + /** @description Human-readable label. Max 255 characters; not unique. */ + display_name: string; + /** @description Max 200 characters. May contain `{skill}`, which becomes the skill mention. */ + example_prompt?: string; + /** + * @description Apps the skill needs, capped at the caller's MCP server limit. Declaring an app doesn't grant + * access to it. + */ + mcp_servers?: { app_id?: string; server_id?: string; service_type: string }[]; +} & ( + | { + /** @description Canvas the caller owns to turn into a skill. Send exactly one of `instructions` or `canvas_id`. */ + canvas_id: string; + instructions?: never; + } + | { + canvas_id?: never; + /** @description Markdown body of the skill. Send exactly one of `instructions` or `canvas_id`. */ + instructions: string; + } + ); // https://docs.slack.dev/reference/methods/slackbot.skills.delete export interface SlackbotSkillsDeleteArguments extends TokenOverridable { @@ -81,7 +70,19 @@ export interface SlackbotSkillsLibraryRemoveArguments extends TokenOverridable { export type SlackbotSkillsListArguments = OptionalArgument< TokenOverridable & { /** @description Only return skills in this category. */ - category?: SlackbotSkillCategory; + category?: + | 'communication' + | 'customer_support' + | 'data_and_analytics' + | 'engineering' + | 'other' + | 'product_management' + | 'productivity' + | 'professional_development' + | 'project_management' + | 'sales' + | 'system' + | 'team_management'; /** * @description Paginate through collections of data by setting the `cursor` parameter to a `next_cursor` * attribute returned by a previous request's `response_metadata`. Must be used with the same `filter` and @@ -101,7 +102,20 @@ export type SlackbotSkillsListArguments = OptionalArgument< // https://docs.slack.dev/reference/methods/slackbot.skills.update export interface SlackbotSkillsUpdateArguments extends TokenOverridable { /** @description One of the skill categories. Send an empty string to clear. */ - category?: SlackbotSkillCategory | ''; + category?: + | 'communication' + | 'customer_support' + | 'data_and_analytics' + | 'engineering' + | 'other' + | 'product_management' + | 'productivity' + | 'professional_development' + | 'project_management' + | 'sales' + | 'system' + | 'team_management' + | ''; /** @description When Slackbot should use the skill. Max 400 characters. Send an empty string to clear. */ description?: string; /** @description Human-readable label. Max 255 characters. */ @@ -111,7 +125,7 @@ export interface SlackbotSkillsUpdateArguments extends TokenOverridable { /** @description Markdown that replaces the whole document. */ instructions?: string; /** @description Apps the skill needs. Replaces the whole list; send `[]` to clear. */ - mcp_servers?: SlackbotSkillMCPServer[]; + mcp_servers?: { app_id?: string; server_id?: string; service_type: string }[]; /** @description Skill to change. */ skill_id: string; } diff --git a/packages/web-api/test/types/methods/admin.slackbot.test-d.ts b/packages/web-api/test/types/methods/admin.slackbot.test-d.ts index 86c148e6e..98bd69ea2 100644 --- a/packages/web-api/test/types/methods/admin.slackbot.test-d.ts +++ b/packages/web-api/test/types/methods/admin.slackbot.test-d.ts @@ -50,11 +50,6 @@ expectAssignable>([ // -- sad path expectError(web.admin.slackbot.skills.publish()); // lacking argument expectError(web.admin.slackbot.skills.publish({})); // empty argument -expectError( - web.admin.slackbot.skills.publish({ - skill_ids: [], // need at least 1 item - }), -); // -- happy path expectAssignable>([ { @@ -82,13 +77,6 @@ expectError( skill_id: 'F1234', }), ); -expectError( - web.admin.slackbot.skills.setAutoEnabled({ - permission_type: 'named_entities', - skill_id: 'F1234', - usergroup_ids: [], // need at least 1 item - }), -); // -- happy path expectAssignable>([ { @@ -114,11 +102,6 @@ expectAssignable>([ // -- sad path expectError(web.admin.slackbot.skills.unpublish()); // lacking argument expectError(web.admin.slackbot.skills.unpublish({})); // empty argument -expectError( - web.admin.slackbot.skills.unpublish({ - skill_ids: [], // need at least 1 item - }), -); // -- happy path expectAssignable>([ { From 080f82d7e36ab436d590b5e80fdeac99b825e8b6 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Wed, 11 Nov 2026 21:10:55 -0800 Subject: [PATCH 3/4] refactor: sort the slackbot methods after slackLists in ascii order Co-Authored-By: Claude --- packages/web-api/src/methods.ts | 102 ++++++++++++++++---------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/packages/web-api/src/methods.ts b/packages/web-api/src/methods.ts index 6dde54072..56df6bfb5 100644 --- a/packages/web-api/src/methods.ts +++ b/packages/web-api/src/methods.ts @@ -2408,57 +2408,6 @@ export abstract class Methods extends EventEmitter { messages: bindApiCall(this, 'search.messages'), }; - public readonly slackbot = { - skills: { - /** - * @description Creates a skill from markdown instructions, or turns an existing canvas the caller owns into a skill. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.create `slackbot.skills.create` API reference}. - */ - create: bindApiCall(this, 'slackbot.skills.create'), - /** - * @description Deletes a Slackbot skill and its canvas, and removes it from every library, skill set, and the org catalog. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.delete `slackbot.skills.delete` API reference}. - */ - delete: bindApiCall(this, 'slackbot.skills.delete'), - /** - * @description Returns one Slackbot skill, including its instructions. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.info `slackbot.skills.info` API reference}. - */ - info: bindApiCall(this, 'slackbot.skills.info'), - library: { - /** - * @description Turns a skill on in the caller's Slackbot library. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.add `slackbot.skills.library.add` API reference}. - */ - add: bindApiCall( - this, - 'slackbot.skills.library.add', - ), - /** - * @description Turns a skill off in the caller's Slackbot library. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.remove `slackbot.skills.library.remove` API reference}. - */ - remove: bindApiCall( - this, - 'slackbot.skills.library.remove', - ), - }, - /** - * @description Lists Slackbot skills from the caller's point of view. Instructions are not included. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.list `slackbot.skills.list` API reference}. - */ - list: bindApiCallWithOptionalArgument( - this, - 'slackbot.skills.list', - ), - /** - * @description Changes a Slackbot skill's instructions or metadata. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.update `slackbot.skills.update` API reference}. - */ - update: bindApiCall(this, 'slackbot.skills.update'), - }, - }; - public readonly slackLists = { access: { /** @@ -2546,6 +2495,57 @@ export abstract class Methods extends EventEmitter { update: bindApiCall(this, 'slackLists.update'), }; + public readonly slackbot = { + skills: { + /** + * @description Creates a skill from markdown instructions, or turns an existing canvas the caller owns into a skill. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.create `slackbot.skills.create` API reference}. + */ + create: bindApiCall(this, 'slackbot.skills.create'), + /** + * @description Deletes a Slackbot skill and its canvas, and removes it from every library, skill set, and the org catalog. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.delete `slackbot.skills.delete` API reference}. + */ + delete: bindApiCall(this, 'slackbot.skills.delete'), + /** + * @description Returns one Slackbot skill, including its instructions. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.info `slackbot.skills.info` API reference}. + */ + info: bindApiCall(this, 'slackbot.skills.info'), + library: { + /** + * @description Turns a skill on in the caller's Slackbot library. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.add `slackbot.skills.library.add` API reference}. + */ + add: bindApiCall( + this, + 'slackbot.skills.library.add', + ), + /** + * @description Turns a skill off in the caller's Slackbot library. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.remove `slackbot.skills.library.remove` API reference}. + */ + remove: bindApiCall( + this, + 'slackbot.skills.library.remove', + ), + }, + /** + * @description Lists Slackbot skills from the caller's point of view. Instructions are not included. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.list `slackbot.skills.list` API reference}. + */ + list: bindApiCallWithOptionalArgument( + this, + 'slackbot.skills.list', + ), + /** + * @description Changes a Slackbot skill's instructions or metadata. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.update `slackbot.skills.update` API reference}. + */ + update: bindApiCall(this, 'slackbot.skills.update'), + }, + }; + public readonly team = { /** * @description Gets the access logs for the current team. From 00ef370caba96c16a72794116e83727e1a56f5d2 Mon Sep 17 00:00:00 2001 From: Eden Zimbelman Date: Wed, 11 Nov 2026 21:27:44 -0800 Subject: [PATCH 4/4] refactor: sort the slackbot methods before slackLists to match biome Reverts 080f82d7. All three SDKs follow Biome's case-insensitive order. Co-Authored-By: Claude --- packages/web-api/src/methods.ts | 102 ++++++++++++++++---------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/packages/web-api/src/methods.ts b/packages/web-api/src/methods.ts index 56df6bfb5..6dde54072 100644 --- a/packages/web-api/src/methods.ts +++ b/packages/web-api/src/methods.ts @@ -2408,6 +2408,57 @@ export abstract class Methods extends EventEmitter { messages: bindApiCall(this, 'search.messages'), }; + public readonly slackbot = { + skills: { + /** + * @description Creates a skill from markdown instructions, or turns an existing canvas the caller owns into a skill. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.create `slackbot.skills.create` API reference}. + */ + create: bindApiCall(this, 'slackbot.skills.create'), + /** + * @description Deletes a Slackbot skill and its canvas, and removes it from every library, skill set, and the org catalog. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.delete `slackbot.skills.delete` API reference}. + */ + delete: bindApiCall(this, 'slackbot.skills.delete'), + /** + * @description Returns one Slackbot skill, including its instructions. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.info `slackbot.skills.info` API reference}. + */ + info: bindApiCall(this, 'slackbot.skills.info'), + library: { + /** + * @description Turns a skill on in the caller's Slackbot library. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.add `slackbot.skills.library.add` API reference}. + */ + add: bindApiCall( + this, + 'slackbot.skills.library.add', + ), + /** + * @description Turns a skill off in the caller's Slackbot library. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.remove `slackbot.skills.library.remove` API reference}. + */ + remove: bindApiCall( + this, + 'slackbot.skills.library.remove', + ), + }, + /** + * @description Lists Slackbot skills from the caller's point of view. Instructions are not included. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.list `slackbot.skills.list` API reference}. + */ + list: bindApiCallWithOptionalArgument( + this, + 'slackbot.skills.list', + ), + /** + * @description Changes a Slackbot skill's instructions or metadata. + * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.update `slackbot.skills.update` API reference}. + */ + update: bindApiCall(this, 'slackbot.skills.update'), + }, + }; + public readonly slackLists = { access: { /** @@ -2495,57 +2546,6 @@ export abstract class Methods extends EventEmitter { update: bindApiCall(this, 'slackLists.update'), }; - public readonly slackbot = { - skills: { - /** - * @description Creates a skill from markdown instructions, or turns an existing canvas the caller owns into a skill. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.create `slackbot.skills.create` API reference}. - */ - create: bindApiCall(this, 'slackbot.skills.create'), - /** - * @description Deletes a Slackbot skill and its canvas, and removes it from every library, skill set, and the org catalog. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.delete `slackbot.skills.delete` API reference}. - */ - delete: bindApiCall(this, 'slackbot.skills.delete'), - /** - * @description Returns one Slackbot skill, including its instructions. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.info `slackbot.skills.info` API reference}. - */ - info: bindApiCall(this, 'slackbot.skills.info'), - library: { - /** - * @description Turns a skill on in the caller's Slackbot library. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.add `slackbot.skills.library.add` API reference}. - */ - add: bindApiCall( - this, - 'slackbot.skills.library.add', - ), - /** - * @description Turns a skill off in the caller's Slackbot library. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.library.remove `slackbot.skills.library.remove` API reference}. - */ - remove: bindApiCall( - this, - 'slackbot.skills.library.remove', - ), - }, - /** - * @description Lists Slackbot skills from the caller's point of view. Instructions are not included. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.list `slackbot.skills.list` API reference}. - */ - list: bindApiCallWithOptionalArgument( - this, - 'slackbot.skills.list', - ), - /** - * @description Changes a Slackbot skill's instructions or metadata. - * @see {@link https://docs.slack.dev/reference/methods/slackbot.skills.update `slackbot.skills.update` API reference}. - */ - update: bindApiCall(this, 'slackbot.skills.update'), - }, - }; - public readonly team = { /** * @description Gets the access logs for the current team.