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..543134792 --- /dev/null +++ b/packages/web-api/src/types/request/admin/slackbot.ts @@ -0,0 +1,69 @@ +import type { OptionalArgument } from '../../helpers'; + +import type { TokenOverridable } from '../common'; + +// 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?: + | '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[]; + /** + * @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 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 { + /** @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[]; +} + +// https://docs.slack.dev/reference/methods/admin.slackbot.skills.unpublish +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 f38ebbf54..d155111c2 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,15 @@ export type { SearchFilesArguments, SearchMessagesArguments, } from './search'; +export type { + 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..e672d21a3 --- /dev/null +++ b/packages/web-api/src/types/request/slackbot.ts @@ -0,0 +1,131 @@ +import type { OptionalArgument } from '../helpers'; + +import type { TokenOverridable } from './common'; + +// https://docs.slack.dev/reference/methods/slackbot.skills.create +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 { + /** @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?: + | '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 + * `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?: + | '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. */ + 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?: { app_id?: string; server_id?: string; service_type: string }[]; + /** @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..98bd69ea2 --- /dev/null +++ b/packages/web-api/test/types/methods/admin.slackbot.test-d.ts @@ -0,0 +1,110 @@ +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 +// -- 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', + }), +); +// -- 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 +// -- 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', + }, +]);