diff --git a/json-logs/samples/api/admin.slackbot.skills.list.json b/json-logs/samples/api/admin.slackbot.skills.list.json new file mode 100644 index 000000000..eec13564f --- /dev/null +++ b/json-logs/samples/api/admin.slackbot.skills.list.json @@ -0,0 +1,35 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "response_metadata": { + "messages": [ + "" + ], + "next_cursor": "" + }, + "skills": [ + { + "auto_enabled": { + "permission_type": "", + "usergroup_ids": [ + "S00000000", + "" + ] + }, + "category": "", + "creator_id": "U00000000", + "date_created": 12345, + "date_updated": 12345, + "description": "", + "display_name": "", + "id": "F00000000", + "is_official": false, + "library_count": 12345, + "usage_count": 12345, + "visibility": "" + } + ] +} \ No newline at end of file diff --git a/json-logs/samples/api/admin.slackbot.skills.publish.json b/json-logs/samples/api/admin.slackbot.skills.publish.json new file mode 100644 index 000000000..0d4f2bd19 --- /dev/null +++ b/json-logs/samples/api/admin.slackbot.skills.publish.json @@ -0,0 +1,18 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "failed_skills": [ + { + "error": "", + "skill_id": "F00000000" + } + ], + "response_metadata": { + "messages": [ + "" + ] + } +} \ No newline at end of file diff --git a/json-logs/samples/api/admin.slackbot.skills.setAutoEnabled.json b/json-logs/samples/api/admin.slackbot.skills.setAutoEnabled.json new file mode 100644 index 000000000..4f7c5badd --- /dev/null +++ b/json-logs/samples/api/admin.slackbot.skills.setAutoEnabled.json @@ -0,0 +1,20 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "invalid_usergroup_ids": [ + "S00000000" + ], + "permission_type": "", + "response_metadata": { + "messages": [ + "" + ] + }, + "skill_id": "F00000000", + "usergroup_ids": [ + "S00000000" + ] +} \ No newline at end of file diff --git a/json-logs/samples/api/admin.slackbot.skills.unpublish.json b/json-logs/samples/api/admin.slackbot.skills.unpublish.json new file mode 100644 index 000000000..0d4f2bd19 --- /dev/null +++ b/json-logs/samples/api/admin.slackbot.skills.unpublish.json @@ -0,0 +1,18 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "failed_skills": [ + { + "error": "", + "skill_id": "F00000000" + } + ], + "response_metadata": { + "messages": [ + "" + ] + } +} \ No newline at end of file diff --git a/json-logs/samples/api/slackbot.skills.create.json b/json-logs/samples/api/slackbot.skills.create.json new file mode 100644 index 000000000..c3592f707 --- /dev/null +++ b/json-logs/samples/api/slackbot.skills.create.json @@ -0,0 +1,47 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "invalid_mcp_servers": [ + { + "app_id": "A00000000", + "server_id": "", + "service_type": "" + } + ], + "response_metadata": { + "messages": [ + "" + ] + }, + "skill": { + "access": "", + "category": "", + "creator_id": "U00000000", + "date_created": 12345, + "date_updated": 12345, + "description": "", + "display_name": "", + "example_prompt": "", + "id": "F00000000", + "instructions": "", + "is_official": false, + "library_count": 12345, + "mcp_servers": [ + { + "app_id": "A00000000", + "display_name": "", + "is_available": false, + "server_id": "", + "service_type": "" + } + ], + "name": "", + "permalink": "", + "type": "", + "usage_count": 12345, + "visibility": "" + } +} \ No newline at end of file diff --git a/json-logs/samples/api/slackbot.skills.delete.json b/json-logs/samples/api/slackbot.skills.delete.json new file mode 100644 index 000000000..e7a9e361c --- /dev/null +++ b/json-logs/samples/api/slackbot.skills.delete.json @@ -0,0 +1,12 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "response_metadata": { + "messages": [ + "" + ] + } +} \ No newline at end of file diff --git a/json-logs/samples/api/slackbot.skills.info.json b/json-logs/samples/api/slackbot.skills.info.json new file mode 100644 index 000000000..a5e114c03 --- /dev/null +++ b/json-logs/samples/api/slackbot.skills.info.json @@ -0,0 +1,40 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "response_metadata": { + "messages": [ + "" + ] + }, + "skill": { + "access": "", + "category": "", + "creator_id": "U00000000", + "date_created": 12345, + "date_updated": 12345, + "description": "", + "display_name": "", + "example_prompt": "", + "id": "F00000000", + "instructions": "", + "is_official": false, + "library_count": 12345, + "mcp_servers": [ + { + "app_id": "A00000000", + "display_name": "", + "is_available": false, + "server_id": "", + "service_type": "" + } + ], + "name": "", + "permalink": "", + "type": "", + "usage_count": 12345, + "visibility": "" + } +} \ No newline at end of file diff --git a/json-logs/samples/api/slackbot.skills.library.add.json b/json-logs/samples/api/slackbot.skills.library.add.json new file mode 100644 index 000000000..e7a9e361c --- /dev/null +++ b/json-logs/samples/api/slackbot.skills.library.add.json @@ -0,0 +1,12 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "response_metadata": { + "messages": [ + "" + ] + } +} \ No newline at end of file diff --git a/json-logs/samples/api/slackbot.skills.library.remove.json b/json-logs/samples/api/slackbot.skills.library.remove.json new file mode 100644 index 000000000..e7a9e361c --- /dev/null +++ b/json-logs/samples/api/slackbot.skills.library.remove.json @@ -0,0 +1,12 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "response_metadata": { + "messages": [ + "" + ] + } +} \ No newline at end of file diff --git a/json-logs/samples/api/slackbot.skills.list.json b/json-logs/samples/api/slackbot.skills.list.json new file mode 100644 index 000000000..4165406f0 --- /dev/null +++ b/json-logs/samples/api/slackbot.skills.list.json @@ -0,0 +1,43 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "response_metadata": { + "messages": [ + "" + ], + "next_cursor": "" + }, + "skills": [ + { + "access": "", + "category": "", + "creator_id": "U00000000", + "date_created": 12345, + "date_updated": 12345, + "description": "", + "display_name": "", + "example_prompt": "", + "id": "F00000000", + "instructions": "", + "is_official": false, + "library_count": 12345, + "mcp_servers": [ + { + "app_id": "A00000000", + "display_name": "", + "is_available": false, + "server_id": "", + "service_type": "" + } + ], + "name": "", + "permalink": "", + "type": "", + "usage_count": 12345, + "visibility": "" + } + ] +} \ No newline at end of file diff --git a/json-logs/samples/api/slackbot.skills.update.json b/json-logs/samples/api/slackbot.skills.update.json new file mode 100644 index 000000000..c3592f707 --- /dev/null +++ b/json-logs/samples/api/slackbot.skills.update.json @@ -0,0 +1,47 @@ +{ + "ok": false, + "error": "", + "needed": "", + "provided": "", + "warning": "", + "invalid_mcp_servers": [ + { + "app_id": "A00000000", + "server_id": "", + "service_type": "" + } + ], + "response_metadata": { + "messages": [ + "" + ] + }, + "skill": { + "access": "", + "category": "", + "creator_id": "U00000000", + "date_created": 12345, + "date_updated": 12345, + "description": "", + "display_name": "", + "example_prompt": "", + "id": "F00000000", + "instructions": "", + "is_official": false, + "library_count": 12345, + "mcp_servers": [ + { + "app_id": "A00000000", + "display_name": "", + "is_available": false, + "server_id": "", + "service_type": "" + } + ], + "name": "", + "permalink": "", + "type": "", + "usage_count": 12345, + "visibility": "" + } +} \ No newline at end of file diff --git a/metadata/web-api/rate_limit_tiers.json b/metadata/web-api/rate_limit_tiers.json index e2f183194..3f3760658 100644 --- a/metadata/web-api/rate_limit_tiers.json +++ b/metadata/web-api/rate_limit_tiers.json @@ -62,6 +62,10 @@ "admin.roles.addAssignments": "Tier2", "admin.roles.listAssignments": "Tier3", "admin.roles.removeAssignments": "Tier2", + "admin.slackbot.skills.list": "Tier2", + "admin.slackbot.skills.publish": "Tier2", + "admin.slackbot.skills.setAutoEnabled": "Tier2", + "admin.slackbot.skills.unpublish": "Tier2", "admin.teams.admins.list": "Tier3", "admin.teams.create": "Tier1", "admin.teams.list": "Tier3", @@ -296,6 +300,13 @@ "slackLists.items.list": "Tier2", "slackLists.items.update": "Tier3", "slackLists.update": "Tier2", + "slackbot.skills.create": "Tier2", + "slackbot.skills.delete": "Tier2", + "slackbot.skills.info": "Tier3", + "slackbot.skills.library.add": "Tier3", + "slackbot.skills.library.remove": "Tier3", + "slackbot.skills.list": "Tier3", + "slackbot.skills.update": "Tier3", "stars.add": "Tier2", "stars.list": "Tier3", "stars.remove": "Tier2", diff --git a/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java b/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java index 2492e85c9..ac0097e12 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/AsyncMethodsClient.java @@ -26,6 +26,10 @@ import com.slack.api.methods.request.admin.roles.AdminRolesAddAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesListAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesRemoveAssignmentsRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsListRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsPublishRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsUnpublishRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsAdminsListRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsCreateRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsListRequest; @@ -129,6 +133,13 @@ import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest; import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest; import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsDeleteRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsInfoRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsListRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryAddRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryRemoveRequest; import com.slack.api.methods.request.stars.StarsAddRequest; import com.slack.api.methods.request.stars.StarsListRequest; import com.slack.api.methods.request.stars.StarsRemoveRequest; @@ -180,6 +191,10 @@ import com.slack.api.methods.response.admin.roles.AdminRolesAddAssignmentsResponse; import com.slack.api.methods.response.admin.roles.AdminRolesListAssignmentsResponse; import com.slack.api.methods.response.admin.roles.AdminRolesRemoveAssignmentsResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsListResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsPublishResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsUnpublishResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsAdminsListResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsCreateResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsListResponse; @@ -283,6 +298,13 @@ import com.slack.api.methods.response.slack_lists.SlackListsItemsListResponse; import com.slack.api.methods.response.slack_lists.SlackListsItemsUpdateResponse; import com.slack.api.methods.response.slack_lists.SlackListsUpdateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsDeleteResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsInfoResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsListResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsUpdateResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryAddResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryRemoveResponse; import com.slack.api.methods.response.stars.StarsAddResponse; import com.slack.api.methods.response.stars.StarsListResponse; import com.slack.api.methods.response.stars.StarsRemoveResponse; @@ -644,6 +666,26 @@ CompletableFuture CompletableFuture adminRolesRemoveAssignments(RequestConfigurator req); + // ------------------------------ + // admin.slackbot.skills + // ------------------------------ + + CompletableFuture adminSlackbotSkillsList(AdminSlackbotSkillsListRequest req); + + CompletableFuture adminSlackbotSkillsList(RequestConfigurator req); + + CompletableFuture adminSlackbotSkillsPublish(AdminSlackbotSkillsPublishRequest req); + + CompletableFuture adminSlackbotSkillsPublish(RequestConfigurator req); + + CompletableFuture adminSlackbotSkillsSetAutoEnabled(AdminSlackbotSkillsSetAutoEnabledRequest req); + + CompletableFuture adminSlackbotSkillsSetAutoEnabled(RequestConfigurator req); + + CompletableFuture adminSlackbotSkillsUnpublish(AdminSlackbotSkillsUnpublishRequest req); + + CompletableFuture adminSlackbotSkillsUnpublish(RequestConfigurator req); + // ------------------------------ // admin.teams.admins // ------------------------------ @@ -1531,6 +1573,38 @@ CompletableFuture CompletableFuture searchFiles(RequestConfigurator req); + // ------------------------------ + // slackbot.skills + // ------------------------------ + + CompletableFuture slackbotSkillsCreate(SlackbotSkillsCreateRequest req); + + CompletableFuture slackbotSkillsCreate(RequestConfigurator req); + + CompletableFuture slackbotSkillsDelete(SlackbotSkillsDeleteRequest req); + + CompletableFuture slackbotSkillsDelete(RequestConfigurator req); + + CompletableFuture slackbotSkillsInfo(SlackbotSkillsInfoRequest req); + + CompletableFuture slackbotSkillsInfo(RequestConfigurator req); + + CompletableFuture slackbotSkillsLibraryAdd(SlackbotSkillsLibraryAddRequest req); + + CompletableFuture slackbotSkillsLibraryAdd(RequestConfigurator req); + + CompletableFuture slackbotSkillsLibraryRemove(SlackbotSkillsLibraryRemoveRequest req); + + CompletableFuture slackbotSkillsLibraryRemove(RequestConfigurator req); + + CompletableFuture slackbotSkillsList(SlackbotSkillsListRequest req); + + CompletableFuture slackbotSkillsList(RequestConfigurator req); + + CompletableFuture slackbotSkillsUpdate(SlackbotSkillsUpdateRequest req); + + CompletableFuture slackbotSkillsUpdate(RequestConfigurator req); + // ------------------------------ // slackLists // ------------------------------ diff --git a/slack-api-client/src/main/java/com/slack/api/methods/Methods.java b/slack-api-client/src/main/java/com/slack/api/methods/Methods.java index 2e5f2ff70..7eef3c3fd 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/Methods.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/Methods.java @@ -138,6 +138,15 @@ private Methods() { public static final String ADMIN_ROLES_ADD_ASSIGNMENTS = "admin.roles.addAssignments"; public static final String ADMIN_ROLES_REMOVE_ASSIGNMENTS = "admin.roles.removeAssignments"; + // ------------------------------ + // admin.slackbot.skills + // ------------------------------ + + public static final String ADMIN_SLACKBOT_SKILLS_LIST = "admin.slackbot.skills.list"; + public static final String ADMIN_SLACKBOT_SKILLS_PUBLISH = "admin.slackbot.skills.publish"; + public static final String ADMIN_SLACKBOT_SKILLS_SET_AUTO_ENABLED = "admin.slackbot.skills.setAutoEnabled"; + public static final String ADMIN_SLACKBOT_SKILLS_UNPUBLISH = "admin.slackbot.skills.unpublish"; + // ------------------------------ // admin.teams.admins // ------------------------------ @@ -684,6 +693,18 @@ private Methods() { public static final String SEARCH_FILES = "search.files"; public static final String SEARCH_MESSAGES = "search.messages"; + // ------------------------------ + // slackbot.skills + // ------------------------------ + + public static final String SLACKBOT_SKILLS_CREATE = "slackbot.skills.create"; + public static final String SLACKBOT_SKILLS_DELETE = "slackbot.skills.delete"; + public static final String SLACKBOT_SKILLS_INFO = "slackbot.skills.info"; + public static final String SLACKBOT_SKILLS_LIBRARY_ADD = "slackbot.skills.library.add"; + public static final String SLACKBOT_SKILLS_LIBRARY_REMOVE = "slackbot.skills.library.remove"; + public static final String SLACKBOT_SKILLS_LIST = "slackbot.skills.list"; + public static final String SLACKBOT_SKILLS_UPDATE = "slackbot.skills.update"; + // ------------------------------ // slackLists // ------------------------------ diff --git a/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java b/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java index 778aea159..5ea745941 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/MethodsClient.java @@ -26,6 +26,10 @@ import com.slack.api.methods.request.admin.roles.AdminRolesAddAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesListAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesRemoveAssignmentsRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsListRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsPublishRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsUnpublishRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsAdminsListRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsCreateRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsListRequest; @@ -145,6 +149,13 @@ import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest; import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest; import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsDeleteRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsInfoRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsListRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryAddRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryRemoveRequest; import com.slack.api.methods.request.team.*; import com.slack.api.methods.request.team.external_teams.TeamExternalTeamsDisconnectRequest; import com.slack.api.methods.request.team.external_teams.TeamExternalTeamsListRequest; @@ -193,6 +204,10 @@ import com.slack.api.methods.response.admin.roles.AdminRolesAddAssignmentsResponse; import com.slack.api.methods.response.admin.roles.AdminRolesListAssignmentsResponse; import com.slack.api.methods.response.admin.roles.AdminRolesRemoveAssignmentsResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsListResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsPublishResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsUnpublishResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsAdminsListResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsCreateResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsListResponse; @@ -308,6 +323,13 @@ import com.slack.api.methods.response.slack_lists.SlackListsItemsListResponse; import com.slack.api.methods.response.slack_lists.SlackListsItemsUpdateResponse; import com.slack.api.methods.response.slack_lists.SlackListsUpdateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsDeleteResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsInfoResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsListResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsUpdateResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryAddResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryRemoveResponse; import com.slack.api.methods.response.stars.StarsAddResponse; import com.slack.api.methods.response.stars.StarsListResponse; import com.slack.api.methods.response.stars.StarsRemoveResponse; @@ -884,6 +906,30 @@ AdminRolesRemoveAssignmentsResponse adminRolesRemoveAssignments( RequestConfigurator req) throws IOException, SlackApiException; + // ------------------------------ + // admin.slackbot.skills + // ------------------------------ + + AdminSlackbotSkillsListResponse adminSlackbotSkillsList(AdminSlackbotSkillsListRequest req) throws IOException, SlackApiException; + + AdminSlackbotSkillsListResponse adminSlackbotSkillsList(RequestConfigurator req) + throws IOException, SlackApiException; + + AdminSlackbotSkillsPublishResponse adminSlackbotSkillsPublish(AdminSlackbotSkillsPublishRequest req) throws IOException, SlackApiException; + + AdminSlackbotSkillsPublishResponse adminSlackbotSkillsPublish(RequestConfigurator req) + throws IOException, SlackApiException; + + AdminSlackbotSkillsSetAutoEnabledResponse adminSlackbotSkillsSetAutoEnabled(AdminSlackbotSkillsSetAutoEnabledRequest req) throws IOException, SlackApiException; + + AdminSlackbotSkillsSetAutoEnabledResponse adminSlackbotSkillsSetAutoEnabled(RequestConfigurator req) + throws IOException, SlackApiException; + + AdminSlackbotSkillsUnpublishResponse adminSlackbotSkillsUnpublish(AdminSlackbotSkillsUnpublishRequest req) throws IOException, SlackApiException; + + AdminSlackbotSkillsUnpublishResponse adminSlackbotSkillsUnpublish(RequestConfigurator req) + throws IOException, SlackApiException; + // ------------------------------ // admin.teams.admins // ------------------------------ @@ -2664,6 +2710,45 @@ SearchMessagesResponse searchMessages(RequestConfigurator req) throws IOException, SlackApiException; + // ------------------------------ + // slackbot.skills + // ------------------------------ + + SlackbotSkillsCreateResponse slackbotSkillsCreate(SlackbotSkillsCreateRequest req) throws IOException, SlackApiException; + + SlackbotSkillsCreateResponse slackbotSkillsCreate(RequestConfigurator req) + throws IOException, SlackApiException; + + SlackbotSkillsDeleteResponse slackbotSkillsDelete(SlackbotSkillsDeleteRequest req) throws IOException, SlackApiException; + + SlackbotSkillsDeleteResponse slackbotSkillsDelete(RequestConfigurator req) + throws IOException, SlackApiException; + + SlackbotSkillsInfoResponse slackbotSkillsInfo(SlackbotSkillsInfoRequest req) throws IOException, SlackApiException; + + SlackbotSkillsInfoResponse slackbotSkillsInfo(RequestConfigurator req) + throws IOException, SlackApiException; + + SlackbotSkillsLibraryAddResponse slackbotSkillsLibraryAdd(SlackbotSkillsLibraryAddRequest req) throws IOException, SlackApiException; + + SlackbotSkillsLibraryAddResponse slackbotSkillsLibraryAdd(RequestConfigurator req) + throws IOException, SlackApiException; + + SlackbotSkillsLibraryRemoveResponse slackbotSkillsLibraryRemove(SlackbotSkillsLibraryRemoveRequest req) throws IOException, SlackApiException; + + SlackbotSkillsLibraryRemoveResponse slackbotSkillsLibraryRemove(RequestConfigurator req) + throws IOException, SlackApiException; + + SlackbotSkillsListResponse slackbotSkillsList(SlackbotSkillsListRequest req) throws IOException, SlackApiException; + + SlackbotSkillsListResponse slackbotSkillsList(RequestConfigurator req) + throws IOException, SlackApiException; + + SlackbotSkillsUpdateResponse slackbotSkillsUpdate(SlackbotSkillsUpdateRequest req) throws IOException, SlackApiException; + + SlackbotSkillsUpdateResponse slackbotSkillsUpdate(RequestConfigurator req) + throws IOException, SlackApiException; + // ------------------------------ // slackLists // ------------------------------ diff --git a/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java b/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java index bfdbb259b..c977b1cb6 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/MethodsRateLimits.java @@ -129,6 +129,11 @@ public static void setRateLimitTier(String methodName, MethodsRateLimitTier tier ADMIN_ROLES_ADD_ASSIGNMENTS, ADMIN_ROLES_REMOVE_ASSIGNMENTS, + ADMIN_SLACKBOT_SKILLS_LIST, + ADMIN_SLACKBOT_SKILLS_PUBLISH, + ADMIN_SLACKBOT_SKILLS_SET_AUTO_ENABLED, + ADMIN_SLACKBOT_SKILLS_UNPUBLISH, + ADMIN_TEAMS_SETTINGS_SET_DEFAULT_CHANNELS, ADMIN_TEAMS_SETTINGS_SET_DESCRIPTION, ADMIN_TEAMS_SETTINGS_SET_DISCOVERABILITY, @@ -444,6 +449,14 @@ public static void setRateLimitTier(String methodName, MethodsRateLimitTier tier setRateLimitTier(SEARCH_FILES, Tier2); setRateLimitTier(SEARCH_MESSAGES, Tier2); + setRateLimitTier(SLACKBOT_SKILLS_CREATE, Tier2); + setRateLimitTier(SLACKBOT_SKILLS_DELETE, Tier2); + setRateLimitTier(SLACKBOT_SKILLS_INFO, Tier3); + setRateLimitTier(SLACKBOT_SKILLS_LIBRARY_ADD, Tier3); + setRateLimitTier(SLACKBOT_SKILLS_LIBRARY_REMOVE, Tier3); + setRateLimitTier(SLACKBOT_SKILLS_LIST, Tier3); + setRateLimitTier(SLACKBOT_SKILLS_UPDATE, Tier3); + setRateLimitTier(SLACKLISTS_ACCESS_DELETE, Tier3); setRateLimitTier(SLACKLISTS_ACCESS_SET, Tier3); setRateLimitTier(SLACKLISTS_CREATE, Tier2); diff --git a/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java b/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java index bd8f469e2..99e9dd61b 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/RequestFormBuilder.java @@ -27,6 +27,10 @@ import com.slack.api.methods.request.admin.roles.AdminRolesAddAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesListAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesRemoveAssignmentsRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsListRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsPublishRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsUnpublishRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsAdminsListRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsCreateRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsListRequest; @@ -142,6 +146,13 @@ import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest; import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest; import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsDeleteRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsInfoRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsListRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryAddRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryRemoveRequest; import com.slack.api.methods.request.stars.StarsAddRequest; import com.slack.api.methods.request.stars.StarsListRequest; import com.slack.api.methods.request.stars.StarsRemoveRequest; @@ -816,6 +827,47 @@ public static FormBody.Builder toForm(AdminRolesRemoveAssignmentsRequest req) { return form; } + public static FormBody.Builder toForm(AdminSlackbotSkillsListRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("auto_enabled_status", req.getAutoEnabledStatus(), form); + setIfNotNull("category", req.getCategory(), form); + if (req.getCreatorIds() != null) { + setIfNotNull("creator_ids", req.getCreatorIds().stream().collect(joining(",")), form); + } + setIfNotNull("cursor", req.getCursor(), form); + setIfNotNull("limit", req.getLimit(), form); + setIfNotNull("publish_status", req.getPublishStatus(), form); + setIfNotNull("sort", req.getSort(), form); + setIfNotNull("sort_dir", req.getSortDir(), form); + return form; + } + + public static FormBody.Builder toForm(AdminSlackbotSkillsPublishRequest req) { + FormBody.Builder form = new FormBody.Builder(); + if (req.getSkillIds() != null) { + setIfNotNull("skill_ids", req.getSkillIds().stream().collect(joining(",")), form); + } + return form; + } + + public static FormBody.Builder toForm(AdminSlackbotSkillsSetAutoEnabledRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("permission_type", req.getPermissionType(), form); + setIfNotNull("skill_id", req.getSkillId(), form); + if (req.getUsergroupIds() != null) { + setIfNotNull("usergroup_ids", req.getUsergroupIds().stream().collect(joining(",")), form); + } + return form; + } + + public static FormBody.Builder toForm(AdminSlackbotSkillsUnpublishRequest req) { + FormBody.Builder form = new FormBody.Builder(); + if (req.getSkillIds() != null) { + setIfNotNull("skill_ids", req.getSkillIds().stream().collect(joining(",")), form); + } + return form; + } + public static FormBody.Builder toForm(AdminTeamsAdminsListRequest req) { FormBody.Builder form = new FormBody.Builder(); setIfNotNull("cursor", req.getCursor(), form); @@ -3019,6 +3071,67 @@ public static FormBody.Builder toForm(StarsRemoveRequest req) { return form; } + public static FormBody.Builder toForm(SlackbotSkillsCreateRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("canvas_id", req.getCanvasId(), form); + setIfNotNull("category", req.getCategory(), form); + setIfNotNull("description", req.getDescription(), form); + setIfNotNull("display_name", req.getDisplayName(), form); + setIfNotNull("example_prompt", req.getExamplePrompt(), form); + setIfNotNull("instructions", req.getInstructions(), form); + if (req.getMcpServers() != null) { + setIfNotNull("mcp_servers", GSON.toJson(req.getMcpServers()), form); + } + return form; + } + + public static FormBody.Builder toForm(SlackbotSkillsDeleteRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("skill_id", req.getSkillId(), form); + return form; + } + + public static FormBody.Builder toForm(SlackbotSkillsInfoRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("skill_id", req.getSkillId(), form); + return form; + } + + public static FormBody.Builder toForm(SlackbotSkillsLibraryAddRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("skill_id", req.getSkillId(), form); + return form; + } + + public static FormBody.Builder toForm(SlackbotSkillsLibraryRemoveRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("skill_id", req.getSkillId(), form); + return form; + } + + public static FormBody.Builder toForm(SlackbotSkillsListRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("category", req.getCategory(), form); + setIfNotNull("cursor", req.getCursor(), form); + setIfNotNull("filter", req.getFilter(), form); + setIfNotNull("limit", req.getLimit(), form); + return form; + } + + public static FormBody.Builder toForm(SlackbotSkillsUpdateRequest req) { + FormBody.Builder form = new FormBody.Builder(); + setIfNotNull("category", req.getCategory(), form); + setIfNotNull("description", req.getDescription(), form); + setIfNotNull("display_name", req.getDisplayName(), form); + setIfNotNull("example_prompt", req.getExamplePrompt(), form); + setIfNotNull("instructions", req.getInstructions(), form); + if (req.getMcpServers() != null) { + setIfNotNull("mcp_servers", GSON.toJson(req.getMcpServers()), form); + } + setIfNotNull("skill_id", req.getSkillId(), form); + return form; + } + public static FormBody.Builder toForm(SlackListsAccessDeleteRequest req) { FormBody.Builder form = new FormBody.Builder(); setIfNotNull("list_id", req.getListId(), form); diff --git a/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java b/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java index 90400c589..7ced3d32b 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/impl/AsyncMethodsClientImpl.java @@ -31,6 +31,10 @@ import com.slack.api.methods.request.admin.roles.AdminRolesAddAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesListAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesRemoveAssignmentsRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsListRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsPublishRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsUnpublishRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsAdminsListRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsCreateRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsListRequest; @@ -133,6 +137,13 @@ import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest; import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest; import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsDeleteRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsInfoRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsListRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryAddRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryRemoveRequest; import com.slack.api.methods.request.stars.StarsAddRequest; import com.slack.api.methods.request.stars.StarsListRequest; import com.slack.api.methods.request.stars.StarsRemoveRequest; @@ -185,6 +196,10 @@ import com.slack.api.methods.response.admin.roles.AdminRolesAddAssignmentsResponse; import com.slack.api.methods.response.admin.roles.AdminRolesListAssignmentsResponse; import com.slack.api.methods.response.admin.roles.AdminRolesRemoveAssignmentsResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsListResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsPublishResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsUnpublishResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsAdminsListResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsCreateResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsListResponse; @@ -287,6 +302,13 @@ import com.slack.api.methods.response.slack_lists.SlackListsItemsListResponse; import com.slack.api.methods.response.slack_lists.SlackListsItemsUpdateResponse; import com.slack.api.methods.response.slack_lists.SlackListsUpdateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsDeleteResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsInfoResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsListResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsUpdateResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryAddResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryRemoveResponse; import com.slack.api.methods.response.stars.StarsAddResponse; import com.slack.api.methods.response.stars.StarsListResponse; import com.slack.api.methods.response.stars.StarsRemoveResponse; @@ -987,6 +1009,46 @@ public CompletableFuture adminRolesRemoveAs return adminRolesRemoveAssignments(req.configure(AdminRolesRemoveAssignmentsRequest.builder()).build()); } + @Override + public CompletableFuture adminSlackbotSkillsList(AdminSlackbotSkillsListRequest req) { + return executor.execute(ADMIN_SLACKBOT_SKILLS_LIST, toMap(req), () -> methods.adminSlackbotSkillsList(req)); + } + + @Override + public CompletableFuture adminSlackbotSkillsList(RequestConfigurator req) { + return adminSlackbotSkillsList(req.configure(AdminSlackbotSkillsListRequest.builder()).build()); + } + + @Override + public CompletableFuture adminSlackbotSkillsPublish(AdminSlackbotSkillsPublishRequest req) { + return executor.execute(ADMIN_SLACKBOT_SKILLS_PUBLISH, toMap(req), () -> methods.adminSlackbotSkillsPublish(req)); + } + + @Override + public CompletableFuture adminSlackbotSkillsPublish(RequestConfigurator req) { + return adminSlackbotSkillsPublish(req.configure(AdminSlackbotSkillsPublishRequest.builder()).build()); + } + + @Override + public CompletableFuture adminSlackbotSkillsSetAutoEnabled(AdminSlackbotSkillsSetAutoEnabledRequest req) { + return executor.execute(ADMIN_SLACKBOT_SKILLS_SET_AUTO_ENABLED, toMap(req), () -> methods.adminSlackbotSkillsSetAutoEnabled(req)); + } + + @Override + public CompletableFuture adminSlackbotSkillsSetAutoEnabled(RequestConfigurator req) { + return adminSlackbotSkillsSetAutoEnabled(req.configure(AdminSlackbotSkillsSetAutoEnabledRequest.builder()).build()); + } + + @Override + public CompletableFuture adminSlackbotSkillsUnpublish(AdminSlackbotSkillsUnpublishRequest req) { + return executor.execute(ADMIN_SLACKBOT_SKILLS_UNPUBLISH, toMap(req), () -> methods.adminSlackbotSkillsUnpublish(req)); + } + + @Override + public CompletableFuture adminSlackbotSkillsUnpublish(RequestConfigurator req) { + return adminSlackbotSkillsUnpublish(req.configure(AdminSlackbotSkillsUnpublishRequest.builder()).build()); + } + @Override public CompletableFuture adminTeamsAdminsList(AdminTeamsAdminsListRequest req) { return executor.execute(ADMIN_TEAMS_ADMINS_LIST, toMap(req), () -> methods.adminTeamsAdminsList(req)); @@ -2743,6 +2805,76 @@ public CompletableFuture searchFiles(RequestConfigurator slackbotSkillsCreate(SlackbotSkillsCreateRequest req) { + return executor.execute(SLACKBOT_SKILLS_CREATE, toMap(req), () -> methods.slackbotSkillsCreate(req)); + } + + @Override + public CompletableFuture slackbotSkillsCreate(RequestConfigurator req) { + return slackbotSkillsCreate(req.configure(SlackbotSkillsCreateRequest.builder()).build()); + } + + @Override + public CompletableFuture slackbotSkillsDelete(SlackbotSkillsDeleteRequest req) { + return executor.execute(SLACKBOT_SKILLS_DELETE, toMap(req), () -> methods.slackbotSkillsDelete(req)); + } + + @Override + public CompletableFuture slackbotSkillsDelete(RequestConfigurator req) { + return slackbotSkillsDelete(req.configure(SlackbotSkillsDeleteRequest.builder()).build()); + } + + @Override + public CompletableFuture slackbotSkillsInfo(SlackbotSkillsInfoRequest req) { + return executor.execute(SLACKBOT_SKILLS_INFO, toMap(req), () -> methods.slackbotSkillsInfo(req)); + } + + @Override + public CompletableFuture slackbotSkillsInfo(RequestConfigurator req) { + return slackbotSkillsInfo(req.configure(SlackbotSkillsInfoRequest.builder()).build()); + } + + @Override + public CompletableFuture slackbotSkillsLibraryAdd(SlackbotSkillsLibraryAddRequest req) { + return executor.execute(SLACKBOT_SKILLS_LIBRARY_ADD, toMap(req), () -> methods.slackbotSkillsLibraryAdd(req)); + } + + @Override + public CompletableFuture slackbotSkillsLibraryAdd(RequestConfigurator req) { + return slackbotSkillsLibraryAdd(req.configure(SlackbotSkillsLibraryAddRequest.builder()).build()); + } + + @Override + public CompletableFuture slackbotSkillsLibraryRemove(SlackbotSkillsLibraryRemoveRequest req) { + return executor.execute(SLACKBOT_SKILLS_LIBRARY_REMOVE, toMap(req), () -> methods.slackbotSkillsLibraryRemove(req)); + } + + @Override + public CompletableFuture slackbotSkillsLibraryRemove(RequestConfigurator req) { + return slackbotSkillsLibraryRemove(req.configure(SlackbotSkillsLibraryRemoveRequest.builder()).build()); + } + + @Override + public CompletableFuture slackbotSkillsList(SlackbotSkillsListRequest req) { + return executor.execute(SLACKBOT_SKILLS_LIST, toMap(req), () -> methods.slackbotSkillsList(req)); + } + + @Override + public CompletableFuture slackbotSkillsList(RequestConfigurator req) { + return slackbotSkillsList(req.configure(SlackbotSkillsListRequest.builder()).build()); + } + + @Override + public CompletableFuture slackbotSkillsUpdate(SlackbotSkillsUpdateRequest req) { + return executor.execute(SLACKBOT_SKILLS_UPDATE, toMap(req), () -> methods.slackbotSkillsUpdate(req)); + } + + @Override + public CompletableFuture slackbotSkillsUpdate(RequestConfigurator req) { + return slackbotSkillsUpdate(req.configure(SlackbotSkillsUpdateRequest.builder()).build()); + } + @Override public CompletableFuture slackListsAccessDelete(SlackListsAccessDeleteRequest req) { return executor.execute(SLACKLISTS_ACCESS_DELETE, toMap(req), () -> methods.slackListsAccessDelete(req)); diff --git a/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java b/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java index 12933c5d5..4a9290ae0 100644 --- a/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java +++ b/slack-api-client/src/main/java/com/slack/api/methods/impl/MethodsClientImpl.java @@ -27,6 +27,10 @@ import com.slack.api.methods.request.admin.roles.AdminRolesAddAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesListAssignmentsRequest; import com.slack.api.methods.request.admin.roles.AdminRolesRemoveAssignmentsRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsListRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsPublishRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledRequest; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsUnpublishRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsAdminsListRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsCreateRequest; import com.slack.api.methods.request.admin.teams.AdminTeamsListRequest; @@ -143,6 +147,13 @@ import com.slack.api.methods.request.slack_lists.SlackListsItemsListRequest; import com.slack.api.methods.request.slack_lists.SlackListsItemsUpdateRequest; import com.slack.api.methods.request.slack_lists.SlackListsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsCreateRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsDeleteRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsInfoRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsListRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsUpdateRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryAddRequest; +import com.slack.api.methods.request.slackbot.skills.library.SlackbotSkillsLibraryRemoveRequest; import com.slack.api.methods.request.stars.StarsAddRequest; import com.slack.api.methods.request.stars.StarsListRequest; import com.slack.api.methods.request.stars.StarsRemoveRequest; @@ -194,6 +205,10 @@ import com.slack.api.methods.response.admin.roles.AdminRolesAddAssignmentsResponse; import com.slack.api.methods.response.admin.roles.AdminRolesListAssignmentsResponse; import com.slack.api.methods.response.admin.roles.AdminRolesRemoveAssignmentsResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsListResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsPublishResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsUnpublishResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsAdminsListResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsCreateResponse; import com.slack.api.methods.response.admin.teams.AdminTeamsListResponse; @@ -310,6 +325,13 @@ import com.slack.api.methods.response.slack_lists.SlackListsItemsListResponse; import com.slack.api.methods.response.slack_lists.SlackListsItemsUpdateResponse; import com.slack.api.methods.response.slack_lists.SlackListsUpdateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsDeleteResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsInfoResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsListResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsUpdateResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryAddResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryRemoveResponse; import com.slack.api.methods.response.stars.StarsAddResponse; import com.slack.api.methods.response.stars.StarsListResponse; import com.slack.api.methods.response.stars.StarsRemoveResponse; @@ -1028,6 +1050,46 @@ public AdminRolesRemoveAssignmentsResponse adminRolesRemoveAssignments(RequestCo return adminRolesRemoveAssignments(req.configure(AdminRolesRemoveAssignmentsRequest.builder()).build()); } + @Override + public AdminSlackbotSkillsListResponse adminSlackbotSkillsList(AdminSlackbotSkillsListRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.ADMIN_SLACKBOT_SKILLS_LIST, getToken(req), AdminSlackbotSkillsListResponse.class); + } + + @Override + public AdminSlackbotSkillsListResponse adminSlackbotSkillsList(RequestConfigurator req) throws IOException, SlackApiException { + return adminSlackbotSkillsList(req.configure(AdminSlackbotSkillsListRequest.builder()).build()); + } + + @Override + public AdminSlackbotSkillsPublishResponse adminSlackbotSkillsPublish(AdminSlackbotSkillsPublishRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.ADMIN_SLACKBOT_SKILLS_PUBLISH, getToken(req), AdminSlackbotSkillsPublishResponse.class); + } + + @Override + public AdminSlackbotSkillsPublishResponse adminSlackbotSkillsPublish(RequestConfigurator req) throws IOException, SlackApiException { + return adminSlackbotSkillsPublish(req.configure(AdminSlackbotSkillsPublishRequest.builder()).build()); + } + + @Override + public AdminSlackbotSkillsSetAutoEnabledResponse adminSlackbotSkillsSetAutoEnabled(AdminSlackbotSkillsSetAutoEnabledRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.ADMIN_SLACKBOT_SKILLS_SET_AUTO_ENABLED, getToken(req), AdminSlackbotSkillsSetAutoEnabledResponse.class); + } + + @Override + public AdminSlackbotSkillsSetAutoEnabledResponse adminSlackbotSkillsSetAutoEnabled(RequestConfigurator req) throws IOException, SlackApiException { + return adminSlackbotSkillsSetAutoEnabled(req.configure(AdminSlackbotSkillsSetAutoEnabledRequest.builder()).build()); + } + + @Override + public AdminSlackbotSkillsUnpublishResponse adminSlackbotSkillsUnpublish(AdminSlackbotSkillsUnpublishRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.ADMIN_SLACKBOT_SKILLS_UNPUBLISH, getToken(req), AdminSlackbotSkillsUnpublishResponse.class); + } + + @Override + public AdminSlackbotSkillsUnpublishResponse adminSlackbotSkillsUnpublish(RequestConfigurator req) throws IOException, SlackApiException { + return adminSlackbotSkillsUnpublish(req.configure(AdminSlackbotSkillsUnpublishRequest.builder()).build()); + } + @Override public AdminTeamsAdminsListResponse adminTeamsAdminsList(AdminTeamsAdminsListRequest req) throws IOException, SlackApiException { return postFormWithTokenAndParseResponse(toForm(req), Methods.ADMIN_TEAMS_ADMINS_LIST, getToken(req), AdminTeamsAdminsListResponse.class); @@ -3421,6 +3483,76 @@ public SearchFilesResponse searchFiles(RequestConfigurator req) throws IOException, SlackApiException { + return slackbotSkillsCreate(req.configure(SlackbotSkillsCreateRequest.builder()).build()); + } + + @Override + public SlackbotSkillsDeleteResponse slackbotSkillsDelete(SlackbotSkillsDeleteRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.SLACKBOT_SKILLS_DELETE, getToken(req), SlackbotSkillsDeleteResponse.class); + } + + @Override + public SlackbotSkillsDeleteResponse slackbotSkillsDelete(RequestConfigurator req) throws IOException, SlackApiException { + return slackbotSkillsDelete(req.configure(SlackbotSkillsDeleteRequest.builder()).build()); + } + + @Override + public SlackbotSkillsInfoResponse slackbotSkillsInfo(SlackbotSkillsInfoRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.SLACKBOT_SKILLS_INFO, getToken(req), SlackbotSkillsInfoResponse.class); + } + + @Override + public SlackbotSkillsInfoResponse slackbotSkillsInfo(RequestConfigurator req) throws IOException, SlackApiException { + return slackbotSkillsInfo(req.configure(SlackbotSkillsInfoRequest.builder()).build()); + } + + @Override + public SlackbotSkillsLibraryAddResponse slackbotSkillsLibraryAdd(SlackbotSkillsLibraryAddRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.SLACKBOT_SKILLS_LIBRARY_ADD, getToken(req), SlackbotSkillsLibraryAddResponse.class); + } + + @Override + public SlackbotSkillsLibraryAddResponse slackbotSkillsLibraryAdd(RequestConfigurator req) throws IOException, SlackApiException { + return slackbotSkillsLibraryAdd(req.configure(SlackbotSkillsLibraryAddRequest.builder()).build()); + } + + @Override + public SlackbotSkillsLibraryRemoveResponse slackbotSkillsLibraryRemove(SlackbotSkillsLibraryRemoveRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.SLACKBOT_SKILLS_LIBRARY_REMOVE, getToken(req), SlackbotSkillsLibraryRemoveResponse.class); + } + + @Override + public SlackbotSkillsLibraryRemoveResponse slackbotSkillsLibraryRemove(RequestConfigurator req) throws IOException, SlackApiException { + return slackbotSkillsLibraryRemove(req.configure(SlackbotSkillsLibraryRemoveRequest.builder()).build()); + } + + @Override + public SlackbotSkillsListResponse slackbotSkillsList(SlackbotSkillsListRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.SLACKBOT_SKILLS_LIST, getToken(req), SlackbotSkillsListResponse.class); + } + + @Override + public SlackbotSkillsListResponse slackbotSkillsList(RequestConfigurator req) throws IOException, SlackApiException { + return slackbotSkillsList(req.configure(SlackbotSkillsListRequest.builder()).build()); + } + + @Override + public SlackbotSkillsUpdateResponse slackbotSkillsUpdate(SlackbotSkillsUpdateRequest req) throws IOException, SlackApiException { + return postFormWithTokenAndParseResponse(toForm(req), Methods.SLACKBOT_SKILLS_UPDATE, getToken(req), SlackbotSkillsUpdateResponse.class); + } + + @Override + public SlackbotSkillsUpdateResponse slackbotSkillsUpdate(RequestConfigurator req) throws IOException, SlackApiException { + return slackbotSkillsUpdate(req.configure(SlackbotSkillsUpdateRequest.builder()).build()); + } + @Override public SlackListsAccessDeleteResponse slackListsAccessDelete(SlackListsAccessDeleteRequest req) throws IOException, SlackApiException { return postFormWithTokenAndParseResponse(toForm(req), Methods.SLACKLISTS_ACCESS_DELETE, getToken(req), SlackListsAccessDeleteResponse.class); diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsListRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsListRequest.java new file mode 100644 index 000000000..b8f45b068 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsListRequest.java @@ -0,0 +1,66 @@ +package com.slack.api.methods.request.admin.slackbot.skills; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * https://docs.slack.dev/reference/methods/admin.slackbot.skills.list + */ +@Data +@Builder +public class AdminSlackbotSkillsListRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * Filter by org deployment, independently of publication. + * Acceptable values: `all`, `enabled`, `disabled` + */ + private String autoEnabledStatus; + + /** + * Only return skills in this category. + * Acceptable values: `communication`, `customer_support`, `data_and_analytics`, `engineering`, `product_management`, `productivity`, `professional_development`, `project_management`, `sales`, `system`, `team_management`, `other` + */ + private String category; + + /** + * Only return skills created by these users. Accepts U or W user IDs. + */ + private List creatorIds; + + /** + * 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. + */ + private String cursor; + + /** + * The maximum number of skills to return. Fewer may be returned even when more remain. + */ + private Integer limit; + + /** + * Filter by publication to the org catalog. + * Acceptable values: `all`, `published`, `unpublished` + */ + private String publishStatus; + + /** + * Sort across the inventory. Name uses case-insensitive ordering. Unedited skills use their creation date for date_updated sorting. + * Acceptable values: `name`, `usage_count`, `date_updated` + */ + private String sort; + + /** + * Sort direction; file ID breaks ties. + * Acceptable values: `asc`, `desc` + */ + private String sortDir; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsPublishRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsPublishRequest.java new file mode 100644 index 000000000..bf76afefc --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsPublishRequest.java @@ -0,0 +1,26 @@ +package com.slack.api.methods.request.admin.slackbot.skills; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * https://docs.slack.dev/reference/methods/admin.slackbot.skills.publish + */ +@Data +@Builder +public class AdminSlackbotSkillsPublishRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * One to 50 skill IDs. Successful items are not rolled back if other items fail. + */ + private List skillIds; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsSetAutoEnabledRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsSetAutoEnabledRequest.java new file mode 100644 index 000000000..cef71d74d --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsSetAutoEnabledRequest.java @@ -0,0 +1,37 @@ +package com.slack.api.methods.request.admin.slackbot.skills; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * https://docs.slack.dev/reference/methods/admin.slackbot.skills.setAutoEnabled + */ +@Data +@Builder +public class AdminSlackbotSkillsSetAutoEnabledRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * Deployment audience. + * Acceptable values: `everyone`, `named_entities`, `no_one` + */ + private String permissionType; + + /** + * Canvas skill to deploy. + */ + private String skillId; + + /** + * One to 100 user groups for named_entities. Duplicates count toward the input limit and are stored once. Omit for other permission types. + */ + private List usergroupIds; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsUnpublishRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsUnpublishRequest.java new file mode 100644 index 000000000..5cbf0b522 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/admin/slackbot/skills/AdminSlackbotSkillsUnpublishRequest.java @@ -0,0 +1,26 @@ +package com.slack.api.methods.request.admin.slackbot.skills; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * https://docs.slack.dev/reference/methods/admin.slackbot.skills.unpublish + */ +@Data +@Builder +public class AdminSlackbotSkillsUnpublishRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * One to 50 skill IDs. Successful items are not rolled back if other items fail. + */ + private List skillIds; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsCreateRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsCreateRequest.java new file mode 100644 index 000000000..85de24e76 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsCreateRequest.java @@ -0,0 +1,58 @@ +package com.slack.api.methods.request.slackbot.skills; + +import com.slack.api.methods.SlackApiRequest; +import com.slack.api.model.slackbot.SkillMcpServer; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * https://docs.slack.dev/reference/methods/slackbot.skills.create + */ +@Data +@Builder +public class SlackbotSkillsCreateRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * Canvas the caller owns to turn into a skill. Send exactly one of `instructions` or `canvas_id`. + */ + private String canvasId; + + /** + * One of the skill categories. + * Acceptable values: `communication`, `customer_support`, `data_and_analytics`, `engineering`, `product_management`, `productivity`, `professional_development`, `project_management`, `sales`, `system`, `team_management`, `other` + */ + private String category; + + /** + * When Slackbot should use the skill. Max 400 characters. + */ + private String description; + + /** + * Human-readable label. Max 255 characters; not unique. + */ + private String displayName; + + /** + * Max 200 characters. May contain `{skill}`, which becomes the skill mention. + */ + private String examplePrompt; + + /** + * Markdown body of the skill. Send exactly one of `instructions` or `canvas_id`. + */ + private String instructions; + + /** + * Apps the skill needs, capped at the caller's MCP server limit. Declaring an app doesn't grant access to it. + */ + private List mcpServers; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsDeleteRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsDeleteRequest.java new file mode 100644 index 000000000..df53e3382 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsDeleteRequest.java @@ -0,0 +1,24 @@ +package com.slack.api.methods.request.slackbot.skills; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +/** + * https://docs.slack.dev/reference/methods/slackbot.skills.delete + */ +@Data +@Builder +public class SlackbotSkillsDeleteRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * Skill to delete. + */ + private String skillId; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsInfoRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsInfoRequest.java new file mode 100644 index 000000000..8a52dcd5e --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsInfoRequest.java @@ -0,0 +1,24 @@ +package com.slack.api.methods.request.slackbot.skills; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +/** + * https://docs.slack.dev/reference/methods/slackbot.skills.info + */ +@Data +@Builder +public class SlackbotSkillsInfoRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * Skill to fetch: a canvas file ID or a `builtin:` reference. + */ + private String skillId; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsListRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsListRequest.java new file mode 100644 index 000000000..1cdedfdb8 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsListRequest.java @@ -0,0 +1,40 @@ +package com.slack.api.methods.request.slackbot.skills; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +/** + * https://docs.slack.dev/reference/methods/slackbot.skills.list + */ +@Data +@Builder +public class SlackbotSkillsListRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * Only return skills in this category. + */ + private String category; + + /** + * 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`. + */ + private String cursor; + + /** + * `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. + * Acceptable values: `library`, `owned`, `catalog` + */ + private String filter; + + /** + * The maximum number of skills to return. Fewer may be returned even when more remain. + */ + private Integer limit; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsUpdateRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsUpdateRequest.java new file mode 100644 index 000000000..a4b221200 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/SlackbotSkillsUpdateRequest.java @@ -0,0 +1,58 @@ +package com.slack.api.methods.request.slackbot.skills; + +import com.slack.api.methods.SlackApiRequest; +import com.slack.api.model.slackbot.SkillMcpServer; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +/** + * https://docs.slack.dev/reference/methods/slackbot.skills.update + */ +@Data +@Builder +public class SlackbotSkillsUpdateRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * One of the skill categories. Send an empty string to clear. + * Acceptable values: `communication`, `customer_support`, `data_and_analytics`, `engineering`, `product_management`, `productivity`, `professional_development`, `project_management`, `sales`, `system`, `team_management`, `other` + */ + private String category; + + /** + * When Slackbot should use the skill. Max 400 characters. Send an empty string to clear. + */ + private String description; + + /** + * Human-readable label. Max 255 characters. + */ + private String displayName; + + /** + * Max 200 characters. May contain `{skill}`. Send an empty string to clear. + */ + private String examplePrompt; + + /** + * Markdown that replaces the whole document. + */ + private String instructions; + + /** + * Apps the skill needs. Replaces the whole list; send `[]` to clear. + */ + private List mcpServers; + + /** + * Skill to change. + */ + private String skillId; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/library/SlackbotSkillsLibraryAddRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/library/SlackbotSkillsLibraryAddRequest.java new file mode 100644 index 000000000..f4170f720 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/library/SlackbotSkillsLibraryAddRequest.java @@ -0,0 +1,24 @@ +package com.slack.api.methods.request.slackbot.skills.library; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +/** + * https://docs.slack.dev/reference/methods/slackbot.skills.library.add + */ +@Data +@Builder +public class SlackbotSkillsLibraryAddRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * Skill to turn on for the caller. + */ + private String skillId; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/library/SlackbotSkillsLibraryRemoveRequest.java b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/library/SlackbotSkillsLibraryRemoveRequest.java new file mode 100644 index 000000000..53f0244c0 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/request/slackbot/skills/library/SlackbotSkillsLibraryRemoveRequest.java @@ -0,0 +1,24 @@ +package com.slack.api.methods.request.slackbot.skills.library; + +import com.slack.api.methods.SlackApiRequest; +import lombok.Builder; +import lombok.Data; + +/** + * https://docs.slack.dev/reference/methods/slackbot.skills.library.remove + */ +@Data +@Builder +public class SlackbotSkillsLibraryRemoveRequest implements SlackApiRequest { + + /** + * Authentication token bearing required scopes. Tokens should be passed as an HTTP Authorization header or alternatively, as a POST parameter. + */ + private String token; + + /** + * Skill to turn off for the caller. + */ + private String skillId; + +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsListResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsListResponse.java new file mode 100644 index 000000000..8f3e7a367 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsListResponse.java @@ -0,0 +1,44 @@ +package com.slack.api.methods.response.admin.slackbot.skills; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class AdminSlackbotSkillsListResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private ResponseMetadata responseMetadata; + private List skills; + + @Data + public static class AutoEnabled { + private String permissionType; + private List usergroupIds; + } + + @Data + public static class Skill { + private AutoEnabled autoEnabled; + private String category; + private String creatorId; + private Integer dateCreated; + private Integer dateUpdated; + private String description; + private String displayName; + private String id; + private Boolean isOfficial; + private Integer libraryCount; + private Integer usageCount; + private String visibility; + } +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsPublishResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsPublishResponse.java new file mode 100644 index 000000000..eb90ca725 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsPublishResponse.java @@ -0,0 +1,28 @@ +package com.slack.api.methods.response.admin.slackbot.skills; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class AdminSlackbotSkillsPublishResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private List failedSkills; + private ResponseMetadata responseMetadata; + + @Data + public static class FailedSkill { + private String error; + private String skillId; + } +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsSetAutoEnabledResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsSetAutoEnabledResponse.java new file mode 100644 index 000000000..21b293a4c --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsSetAutoEnabledResponse.java @@ -0,0 +1,25 @@ +package com.slack.api.methods.response.admin.slackbot.skills; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class AdminSlackbotSkillsSetAutoEnabledResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private List invalidUsergroupIds; + private String permissionType; + private ResponseMetadata responseMetadata; + private String skillId; + private List usergroupIds; +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsUnpublishResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsUnpublishResponse.java new file mode 100644 index 000000000..420b34d9f --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/admin/slackbot/skills/AdminSlackbotSkillsUnpublishResponse.java @@ -0,0 +1,28 @@ +package com.slack.api.methods.response.admin.slackbot.skills; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class AdminSlackbotSkillsUnpublishResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private List failedSkills; + private ResponseMetadata responseMetadata; + + @Data + public static class FailedSkill { + private String error; + private String skillId; + } +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsCreateResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsCreateResponse.java new file mode 100644 index 000000000..801da1354 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsCreateResponse.java @@ -0,0 +1,25 @@ +package com.slack.api.methods.response.slackbot.skills; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import com.slack.api.model.slackbot.Skill; +import com.slack.api.model.slackbot.SkillMcpServer; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class SlackbotSkillsCreateResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private List invalidMcpServers; + private ResponseMetadata responseMetadata; + private Skill skill; +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsDeleteResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsDeleteResponse.java new file mode 100644 index 000000000..57a241f4a --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsDeleteResponse.java @@ -0,0 +1,21 @@ +package com.slack.api.methods.response.slackbot.skills; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class SlackbotSkillsDeleteResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private ResponseMetadata responseMetadata; +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsInfoResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsInfoResponse.java new file mode 100644 index 000000000..7ca55755c --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsInfoResponse.java @@ -0,0 +1,23 @@ +package com.slack.api.methods.response.slackbot.skills; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import com.slack.api.model.slackbot.Skill; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class SlackbotSkillsInfoResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private ResponseMetadata responseMetadata; + private Skill skill; +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsListResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsListResponse.java new file mode 100644 index 000000000..b6585a353 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsListResponse.java @@ -0,0 +1,23 @@ +package com.slack.api.methods.response.slackbot.skills; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import com.slack.api.model.slackbot.Skill; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class SlackbotSkillsListResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private ResponseMetadata responseMetadata; + private List skills; +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsUpdateResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsUpdateResponse.java new file mode 100644 index 000000000..533316baa --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/SlackbotSkillsUpdateResponse.java @@ -0,0 +1,25 @@ +package com.slack.api.methods.response.slackbot.skills; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import com.slack.api.model.slackbot.Skill; +import com.slack.api.model.slackbot.SkillMcpServer; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class SlackbotSkillsUpdateResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private List invalidMcpServers; + private ResponseMetadata responseMetadata; + private Skill skill; +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/library/SlackbotSkillsLibraryAddResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/library/SlackbotSkillsLibraryAddResponse.java new file mode 100644 index 000000000..b0ced14c5 --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/library/SlackbotSkillsLibraryAddResponse.java @@ -0,0 +1,21 @@ +package com.slack.api.methods.response.slackbot.skills.library; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class SlackbotSkillsLibraryAddResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private ResponseMetadata responseMetadata; +} diff --git a/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/library/SlackbotSkillsLibraryRemoveResponse.java b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/library/SlackbotSkillsLibraryRemoveResponse.java new file mode 100644 index 000000000..4627469ac --- /dev/null +++ b/slack-api-client/src/main/java/com/slack/api/methods/response/slackbot/skills/library/SlackbotSkillsLibraryRemoveResponse.java @@ -0,0 +1,21 @@ +package com.slack.api.methods.response.slackbot.skills.library; + +import com.slack.api.methods.SlackApiTextResponse; +import com.slack.api.model.ResponseMetadata; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class SlackbotSkillsLibraryRemoveResponse implements SlackApiTextResponse { + + private boolean ok; + private String warning; + private String error; + private String needed; + private String provided; + private transient Map> httpResponseHeaders; + + private ResponseMetadata responseMetadata; +} diff --git a/slack-api-client/src/test/java/test_locally/api/MethodsTest.java b/slack-api-client/src/test/java/test_locally/api/MethodsTest.java index 698e936f7..08a8c42eb 100644 --- a/slack-api-client/src/test/java/test_locally/api/MethodsTest.java +++ b/slack-api-client/src/test/java/test_locally/api/MethodsTest.java @@ -19,8 +19,8 @@ public class MethodsTest { public void verifyTheCoverage() { // https://docs.slack.dev/reference/methods // var methodNames = [].slice.call(document.getElementsByClassName('apiReferenceFilterableList__listItemLink')).map(e => e.href.replace("https://docs.slack.dev/reference/methods/", ""));console.log(methodNames.toString());console.log(methodNames.length); - // 313 endpoints as of October 27, 2026 (apps.user.connection.bulkUpdate and requestAuth added ahead of their docs.slack.dev pages) - String methods = "admin.analytics.getFile,admin.apps.activities.list,admin.apps.approve,admin.apps.clearResolution,admin.apps.restrict,admin.apps.uninstall,admin.apps.approved.list,admin.apps.config.lookup,admin.apps.config.set,admin.apps.requests.cancel,admin.apps.requests.list,admin.apps.restricted.list,admin.audit.anomaly.allow.getItem,admin.audit.anomaly.allow.updateItem,admin.auth.policy.assignEntities,admin.auth.policy.getEntities,admin.auth.policy.removeEntities,admin.barriers.create,admin.barriers.delete,admin.barriers.list,admin.barriers.update,admin.conversations.archive,admin.conversations.bulkArchive,admin.conversations.bulkDelete,admin.conversations.bulkMove,admin.conversations.convertToPrivate,admin.conversations.convertToPublic,admin.conversations.create,admin.conversations.createForObjects,admin.conversations.delete,admin.conversations.disconnectShared,admin.conversations.getConversationPrefs,admin.conversations.getCustomRetention,admin.conversations.getTeams,admin.conversations.invite,admin.conversations.linkObjects,admin.conversations.lookup,admin.conversations.removeCustomRetention,admin.conversations.rename,admin.conversations.search,admin.conversations.setConversationPrefs,admin.conversations.setCustomRetention,admin.conversations.setTeams,admin.conversations.unarchive,admin.conversations.unlinkObjects,admin.conversations.ekm.listOriginalConnectedChannelInfo,admin.conversations.restrictAccess.addGroup,admin.conversations.restrictAccess.listGroups,admin.conversations.restrictAccess.removeGroup,admin.emoji.add,admin.emoji.addAlias,admin.emoji.list,admin.emoji.remove,admin.emoji.rename,admin.functions.list,admin.functions.permissions.lookup,admin.functions.permissions.set,admin.inviteRequests.approve,admin.inviteRequests.deny,admin.inviteRequests.list,admin.inviteRequests.approved.list,admin.inviteRequests.denied.list,admin.roles.addAssignments,admin.roles.listAssignments,admin.roles.removeAssignments,admin.teams.admins.list,admin.teams.create,admin.teams.list,admin.teams.owners.list,admin.teams.settings.info,admin.teams.settings.setDefaultChannels,admin.teams.settings.setDescription,admin.teams.settings.setDiscoverability,admin.teams.settings.setIcon,admin.teams.settings.setName,admin.usergroups.addChannels,admin.usergroups.addTeams,admin.usergroups.listChannels,admin.usergroups.removeChannels,admin.users.assign,admin.users.getExpiration,admin.users.invite,admin.users.list,admin.users.remove,admin.users.setAdmin,admin.users.setExpiration,admin.users.setOwner,admin.users.setRegular,admin.users.session.clearSettings,admin.users.session.getSettings,admin.users.session.invalidate,admin.users.session.list,admin.users.session.reset,admin.users.session.resetBulk,admin.users.session.setSettings,admin.users.unsupportedVersions.export,admin.workflows.collaborators.add,admin.workflows.collaborators.remove,admin.workflows.permissions.lookup,admin.workflows.search,admin.workflows.unpublish,admin.workflows.triggers.types.permissions.lookup,admin.workflows.triggers.types.permissions.set,api.test,apps.activities.list,apps.auth.external.delete,apps.auth.external.get,apps.connections.open,apps.datastore.bulkDelete,apps.datastore.bulkGet,apps.datastore.bulkPut,apps.datastore.count,apps.datastore.delete,apps.datastore.get,apps.datastore.put,apps.datastore.query,apps.datastore.update,apps.event.authorizations.list,apps.manifest.create,apps.manifest.delete,apps.manifest.export,apps.manifest.update,apps.manifest.validate,apps.uninstall,apps.user.connection.bulkUpdate,apps.user.connection.requestAuth,apps.user.connection.update,assistant.search.context,assistant.threads.setStatus,assistant.threads.setSuggestedPrompts,assistant.threads.setTitle,auth.revoke,auth.test,auth.teams.list,blocks.validate,bookmarks.add,bookmarks.edit,bookmarks.list,bookmarks.remove,bots.info,calls.add,calls.end,calls.info,calls.update,calls.participants.add,calls.participants.remove,canvases.access.delete,canvases.access.set,canvases.create,canvases.delete,canvases.edit,canvases.getContent,canvases.sections.lookup,channels.mark,chat.appendStream,chat.delete,chat.deleteScheduledMessage,chat.getPermalink,chat.meMessage,chat.postEphemeral,chat.postMessage,chat.scheduleMessage,chat.startStream,chat.stopStream,chat.unfurl,chat.update,chat.scheduledMessages.list,conversations.acceptSharedInvite,conversations.approveSharedInvite,conversations.archive,conversations.close,conversations.create,conversations.declineSharedInvite,conversations.history,conversations.info,conversations.invite,conversations.inviteShared,conversations.join,conversations.kick,conversations.leave,conversations.list,conversations.listConnectInvites,conversations.mark,conversations.members,conversations.open,conversations.rename,conversations.replies,conversations.setPurpose,conversations.setTopic,conversations.unarchive,conversations.canvases.create,conversations.externalInvitePermissions.set,conversations.requestSharedInvite.approve,conversations.requestSharedInvite.deny,conversations.requestSharedInvite.list,dialog.open,dnd.endDnd,dnd.endSnooze,dnd.info,dnd.setSnooze,dnd.teamInfo,emoji.list,files.comments.delete,files.completeUploadExternal,files.delete,files.getUploadURLExternal,files.info,files.list,files.revokePublicURL,files.sharedPublicURL,files.upload,files.remote.add,files.remote.info,files.remote.list,files.remote.remove,files.remote.share,files.remote.update,functions.completeError,functions.completeSuccess,functions.distributions.permissions.add,functions.distributions.permissions.list,functions.distributions.permissions.remove,functions.distributions.permissions.set,functions.workflows.steps.list,functions.workflows.steps.responses.export,groups.mark,migration.exchange,oauth.access,oauth.v2.access,oauth.v2.exchange,openid.connect.token,openid.connect.userInfo,pins.add,pins.list,pins.remove,reactions.add,reactions.get,reactions.list,reactions.remove,reminders.add,reminders.complete,reminders.delete,reminders.info,reminders.list,rtm.connect,rtm.start,search.all,search.files,search.messages,slackLists.access.delete,slackLists.access.set,slackLists.create,slackLists.download.get,slackLists.download.start,slackLists.items.create,slackLists.items.delete,slackLists.items.deleteMultiple,slackLists.items.info,slackLists.items.list,slackLists.items.update,slackLists.update,stars.add,stars.list,stars.remove,team.accessLogs,team.billableInfo,team.info,team.integrationLogs,team.billing.info,team.externalTeams.disconnect,team.externalTeams.list,team.preferences.list,team.profile.get,tooling.tokens.rotate,usergroups.create,usergroups.disable,usergroups.enable,usergroups.list,usergroups.update,usergroups.users.list,usergroups.users.update,users.conversations,users.deletePhoto,users.getPresence,users.identity,users.info,users.list,users.lookupByEmail,users.setActive,users.setPhoto,users.setPresence,users.discoverableContacts.lookup,users.profile.get,users.profile.set,views.open,views.publish,views.push,views.update,workflows.featured.add,workflows.featured.list,workflows.featured.remove,workflows.featured.set,workflows.stepCompleted,workflows.stepFailed,workflows.updateStep,workflows.triggers.permissions.add,workflows.triggers.permissions.list,workflows.triggers.permissions.remove,workflows.triggers.permissions.set,im.list,im.mark,mpim.list,mpim.mark"; + // 324 endpoints as of November 11, 2026 (apps.user.connection.bulkUpdate and requestAuth added ahead of their docs.slack.dev pages) + String methods = "admin.analytics.getFile,admin.apps.activities.list,admin.apps.approve,admin.apps.clearResolution,admin.apps.restrict,admin.apps.uninstall,admin.apps.approved.list,admin.apps.config.lookup,admin.apps.config.set,admin.apps.requests.cancel,admin.apps.requests.list,admin.apps.restricted.list,admin.audit.anomaly.allow.getItem,admin.audit.anomaly.allow.updateItem,admin.auth.policy.assignEntities,admin.auth.policy.getEntities,admin.auth.policy.removeEntities,admin.barriers.create,admin.barriers.delete,admin.barriers.list,admin.barriers.update,admin.conversations.archive,admin.conversations.bulkArchive,admin.conversations.bulkDelete,admin.conversations.bulkMove,admin.conversations.convertToPrivate,admin.conversations.convertToPublic,admin.conversations.create,admin.conversations.createForObjects,admin.conversations.delete,admin.conversations.disconnectShared,admin.conversations.getConversationPrefs,admin.conversations.getCustomRetention,admin.conversations.getTeams,admin.conversations.invite,admin.conversations.linkObjects,admin.conversations.lookup,admin.conversations.removeCustomRetention,admin.conversations.rename,admin.conversations.search,admin.conversations.setConversationPrefs,admin.conversations.setCustomRetention,admin.conversations.setTeams,admin.conversations.unarchive,admin.conversations.unlinkObjects,admin.conversations.ekm.listOriginalConnectedChannelInfo,admin.conversations.restrictAccess.addGroup,admin.conversations.restrictAccess.listGroups,admin.conversations.restrictAccess.removeGroup,admin.emoji.add,admin.emoji.addAlias,admin.emoji.list,admin.emoji.remove,admin.emoji.rename,admin.functions.list,admin.functions.permissions.lookup,admin.functions.permissions.set,admin.inviteRequests.approve,admin.inviteRequests.deny,admin.inviteRequests.list,admin.inviteRequests.approved.list,admin.inviteRequests.denied.list,admin.roles.addAssignments,admin.roles.listAssignments,admin.roles.removeAssignments,admin.slackbot.skills.list,admin.slackbot.skills.publish,admin.slackbot.skills.setAutoEnabled,admin.slackbot.skills.unpublish,admin.teams.admins.list,admin.teams.create,admin.teams.list,admin.teams.owners.list,admin.teams.settings.info,admin.teams.settings.setDefaultChannels,admin.teams.settings.setDescription,admin.teams.settings.setDiscoverability,admin.teams.settings.setIcon,admin.teams.settings.setName,admin.usergroups.addChannels,admin.usergroups.addTeams,admin.usergroups.listChannels,admin.usergroups.removeChannels,admin.users.assign,admin.users.getExpiration,admin.users.invite,admin.users.list,admin.users.remove,admin.users.setAdmin,admin.users.setExpiration,admin.users.setOwner,admin.users.setRegular,admin.users.session.clearSettings,admin.users.session.getSettings,admin.users.session.invalidate,admin.users.session.list,admin.users.session.reset,admin.users.session.resetBulk,admin.users.session.setSettings,admin.users.unsupportedVersions.export,admin.workflows.collaborators.add,admin.workflows.collaborators.remove,admin.workflows.permissions.lookup,admin.workflows.search,admin.workflows.unpublish,admin.workflows.triggers.types.permissions.lookup,admin.workflows.triggers.types.permissions.set,api.test,apps.activities.list,apps.auth.external.delete,apps.auth.external.get,apps.connections.open,apps.datastore.bulkDelete,apps.datastore.bulkGet,apps.datastore.bulkPut,apps.datastore.count,apps.datastore.delete,apps.datastore.get,apps.datastore.put,apps.datastore.query,apps.datastore.update,apps.event.authorizations.list,apps.manifest.create,apps.manifest.delete,apps.manifest.export,apps.manifest.update,apps.manifest.validate,apps.uninstall,apps.user.connection.bulkUpdate,apps.user.connection.requestAuth,apps.user.connection.update,assistant.search.context,assistant.threads.setStatus,assistant.threads.setSuggestedPrompts,assistant.threads.setTitle,auth.revoke,auth.test,auth.teams.list,blocks.validate,bookmarks.add,bookmarks.edit,bookmarks.list,bookmarks.remove,bots.info,calls.add,calls.end,calls.info,calls.update,calls.participants.add,calls.participants.remove,canvases.access.delete,canvases.access.set,canvases.create,canvases.delete,canvases.edit,canvases.getContent,canvases.sections.lookup,channels.mark,chat.appendStream,chat.delete,chat.deleteScheduledMessage,chat.getPermalink,chat.meMessage,chat.postEphemeral,chat.postMessage,chat.scheduleMessage,chat.startStream,chat.stopStream,chat.unfurl,chat.update,chat.scheduledMessages.list,conversations.acceptSharedInvite,conversations.approveSharedInvite,conversations.archive,conversations.close,conversations.create,conversations.declineSharedInvite,conversations.history,conversations.info,conversations.invite,conversations.inviteShared,conversations.join,conversations.kick,conversations.leave,conversations.list,conversations.listConnectInvites,conversations.mark,conversations.members,conversations.open,conversations.rename,conversations.replies,conversations.setPurpose,conversations.setTopic,conversations.unarchive,conversations.canvases.create,conversations.externalInvitePermissions.set,conversations.requestSharedInvite.approve,conversations.requestSharedInvite.deny,conversations.requestSharedInvite.list,dialog.open,dnd.endDnd,dnd.endSnooze,dnd.info,dnd.setSnooze,dnd.teamInfo,emoji.list,files.comments.delete,files.completeUploadExternal,files.delete,files.getUploadURLExternal,files.info,files.list,files.revokePublicURL,files.sharedPublicURL,files.upload,files.remote.add,files.remote.info,files.remote.list,files.remote.remove,files.remote.share,files.remote.update,functions.completeError,functions.completeSuccess,functions.distributions.permissions.add,functions.distributions.permissions.list,functions.distributions.permissions.remove,functions.distributions.permissions.set,functions.workflows.steps.list,functions.workflows.steps.responses.export,groups.mark,migration.exchange,oauth.access,oauth.v2.access,oauth.v2.exchange,openid.connect.token,openid.connect.userInfo,pins.add,pins.list,pins.remove,reactions.add,reactions.get,reactions.list,reactions.remove,reminders.add,reminders.complete,reminders.delete,reminders.info,reminders.list,rtm.connect,rtm.start,search.all,search.files,search.messages,slackbot.skills.create,slackbot.skills.delete,slackbot.skills.info,slackbot.skills.library.add,slackbot.skills.library.remove,slackbot.skills.list,slackbot.skills.update,slackLists.access.delete,slackLists.access.set,slackLists.create,slackLists.download.get,slackLists.download.start,slackLists.items.create,slackLists.items.delete,slackLists.items.deleteMultiple,slackLists.items.info,slackLists.items.list,slackLists.items.update,slackLists.update,stars.add,stars.list,stars.remove,team.accessLogs,team.billableInfo,team.info,team.integrationLogs,team.billing.info,team.externalTeams.disconnect,team.externalTeams.list,team.preferences.list,team.profile.get,tooling.tokens.rotate,usergroups.create,usergroups.disable,usergroups.enable,usergroups.list,usergroups.update,usergroups.users.list,usergroups.users.update,users.conversations,users.deletePhoto,users.getPresence,users.identity,users.info,users.list,users.lookupByEmail,users.setActive,users.setPhoto,users.setPresence,users.discoverableContacts.lookup,users.profile.get,users.profile.set,views.open,views.publish,views.push,views.update,workflows.featured.add,workflows.featured.list,workflows.featured.remove,workflows.featured.set,workflows.stepCompleted,workflows.stepFailed,workflows.updateStep,workflows.triggers.permissions.add,workflows.triggers.permissions.list,workflows.triggers.permissions.remove,workflows.triggers.permissions.set,im.list,im.mark,mpim.list,mpim.mark"; final List existingMethods = new ArrayList<>(); for (Field f : Methods.class.getDeclaredFields()) { int modifiers = f.getModifiers(); diff --git a/slack-api-client/src/test/java/test_locally/api/methods/RequestFormBuilderTest.java b/slack-api-client/src/test/java/test_locally/api/methods/RequestFormBuilderTest.java index 05ee3116b..42ba0e898 100644 --- a/slack-api-client/src/test/java/test_locally/api/methods/RequestFormBuilderTest.java +++ b/slack-api-client/src/test/java/test_locally/api/methods/RequestFormBuilderTest.java @@ -1,11 +1,13 @@ package test_locally.api.methods; import com.slack.api.methods.RequestFormBuilder; +import com.slack.api.methods.request.admin.slackbot.skills.AdminSlackbotSkillsPublishRequest; import com.slack.api.methods.request.apps.user.connection.AppsUserConnectionBulkUpdateRequest; import com.slack.api.methods.request.apps.user.connection.AppsUserConnectionRequestAuthRequest; import com.slack.api.methods.request.calls.CallsAddRequest; import com.slack.api.methods.request.chat.ChatPostMessageRequest; import com.slack.api.methods.request.chat.ChatUnfurlRequest; +import com.slack.api.methods.request.slackbot.skills.SlackbotSkillsUpdateRequest; import com.slack.api.methods.request.team.TeamInfoRequest; import com.slack.api.model.Attachment; import com.slack.api.model.CallParticipant; @@ -13,6 +15,7 @@ import com.slack.api.model.block.composition.OptionObject; import com.slack.api.model.block.composition.PlainTextObject; import com.slack.api.model.block.element.OverflowMenuElement; +import com.slack.api.model.slackbot.SkillMcpServer; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -22,6 +25,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -45,6 +49,39 @@ public void teamInfoSlackbotAvailability() { } } + @Test + public void adminSlackbotSkillsPublishSkillIds() { + FormBody form = RequestFormBuilder.toForm(AdminSlackbotSkillsPublishRequest.builder() + .skillIds(Arrays.asList("F0123ABCD", "F0456EFGH")).build()).build(); + assertThat(form.size(), is(1)); + assertThat(form.name(0), is("skill_ids")); + assertThat(form.value(0), is("F0123ABCD,F0456EFGH")); + } + + @Test + public void slackbotSkillsUpdateMcpServers() { + FormBody omitted = RequestFormBuilder.toForm(SlackbotSkillsUpdateRequest.builder() + .skillId("F0123ABCD").build()).build(); + assertThat(omitted.size(), is(1)); + assertThat(omitted.name(0), is("skill_id")); + + FormBody cleared = RequestFormBuilder.toForm(SlackbotSkillsUpdateRequest.builder() + .mcpServers(Collections.emptyList()).skillId("F0123ABCD").build()).build(); + assertThat(cleared.size(), is(2)); + assertThat(cleared.name(0), is("mcp_servers")); + assertThat(cleared.value(0), is("[]")); + + FormBody declared = RequestFormBuilder.toForm(SlackbotSkillsUpdateRequest.builder() + .mcpServers(Arrays.asList(SkillMcpServer.builder() + .appId("A0123ABCD") + .serverId("Amcp0456EFGH") + .serviceType("app") + .build())) + .skillId("F0123ABCD").build()).build(); + assertThat(declared.name(0), is("mcp_servers")); + assertThat(declared.value(0), is("[{\"app_id\":\"A0123ABCD\",\"server_id\":\"Amcp0456EFGH\",\"service_type\":\"app\"}]")); + } + @Test public void testBlocksJsonSerialization() { // GIVEN diff --git a/slack-api-client/src/test/java/test_locally/api/methods/SlackbotSkillsTest.java b/slack-api-client/src/test/java/test_locally/api/methods/SlackbotSkillsTest.java new file mode 100644 index 000000000..0cd854519 --- /dev/null +++ b/slack-api-client/src/test/java/test_locally/api/methods/SlackbotSkillsTest.java @@ -0,0 +1,128 @@ +package test_locally.api.methods; + +import com.slack.api.Slack; +import com.slack.api.SlackConfig; +import com.slack.api.model.slackbot.SkillMcpServer; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import util.MockSlackApiServer; + +import java.util.Arrays; +import java.util.Collections; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static util.MockSlackApi.ValidToken; + +public class SlackbotSkillsTest { + + MockSlackApiServer server = new MockSlackApiServer(); + SlackConfig config = new SlackConfig(); + Slack slack = Slack.getInstance(config); + + @Before + public void setup() throws Exception { + server.start(); + config.setMethodsEndpointUrlPrefix(server.getMethodsEndpointPrefix()); + } + + @After + public void tearDown() throws Exception { + server.stop(); + } + + @Test + public void test() throws Exception { + assertThat(slack.methods(ValidToken).slackbotSkillsCreate(r -> r + .category("productivity") + .description("Reviews information from Slack and your calendar to suggest priorities for the day.") + .displayName("Daily priorities") + .examplePrompt("Run {skill} for today") + .instructions("# Purpose\nSuggest the three most important things to work on today.") + .mcpServers(Arrays.asList(SkillMcpServer.builder() + .appId("A0123ABCD") + .serverId("Amcp0456EFGH") + .serviceType("app") + .build())) + ).isOk(), is(true)); + assertThat(slack.methods(ValidToken).slackbotSkillsCreate(r -> r + .canvasId("F0123ABCD") + .displayName("Daily priorities") + ).isOk(), is(true)); + assertThat(slack.methods(ValidToken).slackbotSkillsDelete(r -> r + .skillId("F0123ABCD") + ).isOk(), is(true)); + assertThat(slack.methods(ValidToken).slackbotSkillsInfo(r -> r + .skillId("F0123ABCD") + ).isOk(), is(true)); + assertThat(slack.methods(ValidToken).slackbotSkillsLibraryAdd(r -> r + .skillId("F0123ABCD") + ).isOk(), is(true)); + assertThat(slack.methods(ValidToken).slackbotSkillsLibraryRemove(r -> r + .skillId("F0123ABCD") + ).isOk(), is(true)); + assertThat(slack.methods(ValidToken).slackbotSkillsList(r -> r + .category("productivity") + .cursor("dGVhbTpDMDYxRkE1UEI=") + .filter("owned") + .limit(100) + ).isOk(), is(true)); + assertThat(slack.methods(ValidToken).slackbotSkillsUpdate(r -> r + .category("") + .description("") + .displayName("Daily priorities") + .examplePrompt("") + .instructions("# Purpose\nSuggest the three most important things to work on today.") + .mcpServers(Collections.emptyList()) + .skillId("F0123ABCD") + ).isOk(), is(true)); + } + + @Test + public void test_async() throws Exception { + assertThat(slack.methodsAsync(ValidToken).slackbotSkillsCreate(r -> r + .category("productivity") + .description("Reviews information from Slack and your calendar to suggest priorities for the day.") + .displayName("Daily priorities") + .examplePrompt("Run {skill} for today") + .instructions("# Purpose\nSuggest the three most important things to work on today.") + .mcpServers(Arrays.asList(SkillMcpServer.builder() + .appId("A0123ABCD") + .serverId("Amcp0456EFGH") + .serviceType("app") + .build())) + ).get().isOk(), is(true)); + assertThat(slack.methodsAsync(ValidToken).slackbotSkillsCreate(r -> r + .canvasId("F0123ABCD") + .displayName("Daily priorities") + ).get().isOk(), is(true)); + assertThat(slack.methodsAsync(ValidToken).slackbotSkillsDelete(r -> r + .skillId("F0123ABCD") + ).get().isOk(), is(true)); + assertThat(slack.methodsAsync(ValidToken).slackbotSkillsInfo(r -> r + .skillId("F0123ABCD") + ).get().isOk(), is(true)); + assertThat(slack.methodsAsync(ValidToken).slackbotSkillsLibraryAdd(r -> r + .skillId("F0123ABCD") + ).get().isOk(), is(true)); + assertThat(slack.methodsAsync(ValidToken).slackbotSkillsLibraryRemove(r -> r + .skillId("F0123ABCD") + ).get().isOk(), is(true)); + assertThat(slack.methodsAsync(ValidToken).slackbotSkillsList(r -> r + .category("productivity") + .cursor("dGVhbTpDMDYxRkE1UEI=") + .filter("owned") + .limit(100) + ).get().isOk(), is(true)); + assertThat(slack.methodsAsync(ValidToken).slackbotSkillsUpdate(r -> r + .category("") + .description("") + .displayName("Daily priorities") + .examplePrompt("") + .instructions("# Purpose\nSuggest the three most important things to work on today.") + .mcpServers(Collections.emptyList()) + .skillId("F0123ABCD") + ).get().isOk(), is(true)); + } +} diff --git a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiAsyncTest.java b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiAsyncTest.java index d24132132..2200da04e 100644 --- a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiAsyncTest.java +++ b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiAsyncTest.java @@ -212,6 +212,31 @@ public void adminRoles() throws Exception { .get().isOk(), is(true)); } + @Test + public void adminSlackbotSkills() throws Exception { + AsyncMethodsClient methods = slack.methodsAsync(ValidToken); + + assertThat(methods.adminSlackbotSkillsList(r -> r + .autoEnabledStatus("enabled") + .category("productivity") + .creatorIds(Arrays.asList("U0123ABCD")) + .cursor("xxx") + .limit(100) + .publishStatus("published") + .sort("usage_count") + .sortDir("desc")) + .get().isOk(), is(true)); + assertThat(methods.adminSlackbotSkillsPublish(r -> r.skillIds(Arrays.asList("F0123ABCD", "F0456EFGH"))) + .get().isOk(), is(true)); + assertThat(methods.adminSlackbotSkillsSetAutoEnabled(r -> r + .permissionType("named_entities") + .skillId("F0123ABCD") + .usergroupIds(Arrays.asList("S0123ABCD"))) + .get().isOk(), is(true)); + assertThat(methods.adminSlackbotSkillsUnpublish(r -> r.skillIds(Arrays.asList("F0123ABCD", "F0456EFGH"))) + .get().isOk(), is(true)); + } + @Test public void adminTeams() throws Exception { AsyncMethodsClient methods = slack.methodsAsync(ValidToken); diff --git a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiTest.java b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiTest.java index 5456d9b01..753a1ad8d 100644 --- a/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiTest.java +++ b/slack-api-client/src/test/java/test_locally/api/methods_admin_api/AdminApiTest.java @@ -194,6 +194,27 @@ public void adminRoles() throws Exception { assertThat(methods.adminRolesRemoveAssignments(r -> r).isOk(), is(true)); } + @Test + public void adminSlackbotSkills() throws Exception { + MethodsClient methods = slack.methods(ValidToken); + + assertThat(methods.adminSlackbotSkillsList(r -> r + .autoEnabledStatus("enabled") + .category("productivity") + .creatorIds(Arrays.asList("U0123ABCD")) + .cursor("xxx") + .limit(100) + .publishStatus("published") + .sort("usage_count") + .sortDir("desc")).isOk(), is(true)); + assertThat(methods.adminSlackbotSkillsPublish(r -> r.skillIds(Arrays.asList("F0123ABCD", "F0456EFGH"))).isOk(), is(true)); + assertThat(methods.adminSlackbotSkillsSetAutoEnabled(r -> r + .permissionType("named_entities") + .skillId("F0123ABCD") + .usergroupIds(Arrays.asList("S0123ABCD"))).isOk(), is(true)); + assertThat(methods.adminSlackbotSkillsUnpublish(r -> r.skillIds(Arrays.asList("F0123ABCD", "F0456EFGH"))).isOk(), is(true)); + } + @Test public void adminTeams() throws Exception { MethodsClient methods = slack.methods(ValidToken); diff --git a/slack-api-client/src/test/java/test_with_remote_apis/methods/slackbot_skills_Test.java b/slack-api-client/src/test/java/test_with_remote_apis/methods/slackbot_skills_Test.java new file mode 100644 index 000000000..b7bffdbeb --- /dev/null +++ b/slack-api-client/src/test/java/test_with_remote_apis/methods/slackbot_skills_Test.java @@ -0,0 +1,140 @@ +package test_with_remote_apis.methods; + +import com.slack.api.Slack; +import com.slack.api.methods.AsyncMethodsClient; +import com.slack.api.methods.MethodsClient; +import com.slack.api.methods.response.canvases.CanvasesCreateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsDeleteResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsInfoResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsListResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsUpdateResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryAddResponse; +import com.slack.api.methods.response.slackbot.skills.library.SlackbotSkillsLibraryRemoveResponse; +import com.slack.api.model.canvas.CanvasDocumentContent; +import com.slack.api.model.slackbot.Skill; +import com.slack.api.model.slackbot.SkillMcpServer; +import config.Constants; +import config.SlackTestConfig; +import lombok.extern.slf4j.Slf4j; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +@Slf4j +public class slackbot_skills_Test { + + String botToken = System.getenv(Constants.SLACK_SDK_TEST_BOT_TOKEN); + + static SlackTestConfig testConfig = SlackTestConfig.getInstance(); + static Slack slack = Slack.getInstance(testConfig.getConfig()); + + @BeforeClass + public static void setUp() throws Exception { + SlackTestConfig.initializeRawJSONDataFiles("slackbot.skills.*"); + } + + @AfterClass + public static void tearDown() throws InterruptedException { + SlackTestConfig.awaitCompletion(testConfig); + } + + @Test + public void skills() throws Exception { + MethodsClient client = slack.methods(botToken); + + SlackbotSkillsCreateResponse creation = client.slackbotSkillsCreate(r -> r + .category("engineering") + .description("Test skill for SDK development.") + .displayName("java-slack-sdk test skill " + System.currentTimeMillis()) + .examplePrompt("Run {skill} now") + .instructions("# Purpose\nTest skill created by the java-slack-sdk tests. Safe to delete.")); + assertThat(creation.getError(), is(nullValue())); + Skill skill = creation.getSkill(); + assertThat(skill.getId(), is(notNullValue())); + String skillId = skill.getId(); + + try { + SlackbotSkillsInfoResponse info = client.slackbotSkillsInfo(r -> r.skillId(skillId)); + assertThat(info.getError(), is(nullValue())); + assertThat(info.getSkill().getInstructions(), is(notNullValue())); + + SlackbotSkillsUpdateResponse update = client.slackbotSkillsUpdate(r -> r + .description("Updated test skill for SDK development.") + .mcpServers(Collections.emptyList()) + .skillId(skillId)); + assertThat(update.getError(), is(nullValue())); + assertThat(update.getSkill().getDescription(), is("Updated test skill for SDK development.")); + + SlackbotSkillsUpdateResponse invalidUpdate = client.slackbotSkillsUpdate(r -> r + .mcpServers(Arrays.asList(SkillMcpServer.builder() + .appId("A0123ABCD") + .serverId("Amcp0456EFGH") + .serviceType("app") + .build())) + .skillId(skillId)); + assertThat(invalidUpdate.getError(), is("mcp_server_not_found")); + assertThat(invalidUpdate.getInvalidMcpServers().get(0).getAppId(), is("A0123ABCD")); + + SlackbotSkillsListResponse owned = client.slackbotSkillsList(r -> r.filter("owned").limit(100)); + assertThat(owned.getError(), is(nullValue())); + assertThat(owned.getSkills(), is(notNullValue())); + assertThat(owned.getResponseMetadata(), is(notNullValue())); + + SlackbotSkillsLibraryRemoveResponse removal = client.slackbotSkillsLibraryRemove(r -> r.skillId(skillId)); + assertThat(removal.getError(), is(nullValue())); + + SlackbotSkillsLibraryAddResponse addition = client.slackbotSkillsLibraryAdd(r -> r.skillId(skillId)); + assertThat(addition.getError(), is(nullValue())); + } finally { + SlackbotSkillsDeleteResponse deletion = client.slackbotSkillsDelete(r -> r.skillId(skillId)); + assertThat(deletion.getError(), is(nullValue())); + } + } + + @Test + public void skills_canvas() throws Exception { + MethodsClient client = slack.methods(botToken); + + CanvasesCreateResponse canvas = client.canvasesCreate(r -> r + .title("java-slack-sdk canvas skill " + System.currentTimeMillis()) + .documentContent(CanvasDocumentContent.builder() + .markdown("# Purpose\nCanvas converted to a skill by the java-slack-sdk tests. Safe to delete.") + .build())); + assertThat(canvas.getError(), is(nullValue())); + String canvasId = canvas.getCanvasId(); + + SlackbotSkillsCreateResponse creation = client.slackbotSkillsCreate(r -> r + .canvasId(canvasId) + .displayName("java-slack-sdk canvas skill")); + assertThat(creation.getError(), is(nullValue())); + assertThat(creation.getSkill().getId(), is(canvasId)); + + Thread.sleep(3000L); // A converted canvas can briefly read as skill_not_found + + SlackbotSkillsDeleteResponse deletion = client.slackbotSkillsDelete(r -> r.skillId(canvasId)); + assertThat(deletion.getError(), is(nullValue())); + } + + @Test + public void skills_async() throws Exception { + AsyncMethodsClient client = slack.methodsAsync(botToken); + + for (String filter : Arrays.asList("catalog", "library", "owned")) { + SlackbotSkillsListResponse list = client.slackbotSkillsList(r -> r.filter(filter).limit(1)).get(); + assertThat(list.getError(), is(nullValue())); + assertThat(list.getSkills(), is(notNullValue())); + } + + SlackbotSkillsInfoResponse missing = client.slackbotSkillsInfo(r -> r.skillId("F00000000")).get(); + assertThat(missing.getError(), is("skill_not_found")); + } +} diff --git a/slack-api-client/src/test/java/test_with_remote_apis/methods_admin_api/AdminApi_slackbot_skills_Test.java b/slack-api-client/src/test/java/test_with_remote_apis/methods_admin_api/AdminApi_slackbot_skills_Test.java new file mode 100644 index 000000000..86d5cd602 --- /dev/null +++ b/slack-api-client/src/test/java/test_with_remote_apis/methods_admin_api/AdminApi_slackbot_skills_Test.java @@ -0,0 +1,122 @@ +package test_with_remote_apis.methods_admin_api; + +import com.slack.api.Slack; +import com.slack.api.methods.MethodsClient; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsListResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsPublishResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsSetAutoEnabledResponse; +import com.slack.api.methods.response.admin.slackbot.skills.AdminSlackbotSkillsUnpublishResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsCreateResponse; +import com.slack.api.methods.response.slackbot.skills.SlackbotSkillsDeleteResponse; +import config.Constants; +import config.SlackTestConfig; +import lombok.extern.slf4j.Slf4j; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +@Slf4j +public class AdminApi_slackbot_skills_Test { + + static SlackTestConfig testConfig = SlackTestConfig.getInstance(); + static Slack slack = Slack.getInstance(testConfig.getConfig()); + + @BeforeClass + public static void setUp() throws Exception { + SlackTestConfig.initializeRawJSONDataFiles("admin.slackbot.skills.*"); + } + + @AfterClass + public static void tearDown() throws InterruptedException { + SlackTestConfig.awaitCompletion(testConfig); + } + + static String orgAdminUserToken = System.getenv(Constants.SLACK_SDK_TEST_GRID_ORG_ADMIN_USER_TOKEN); + static String usergroupId = System.getenv(Constants.SLACK_SDK_TEST_GRID_IDP_USERGROUP_ID_2); + + @Test + public void list() throws Exception { + if (orgAdminUserToken != null) { + MethodsClient client = slack.methods(orgAdminUserToken); + for (String sort : Arrays.asList("date_updated", "name", "usage_count")) { + AdminSlackbotSkillsListResponse list = client.adminSlackbotSkillsList(r -> r + .autoEnabledStatus("all") + .limit(100) + .publishStatus("all") + .sort(sort) + .sortDir("desc")); + assertThat(list.getError(), is(nullValue())); + assertThat(list.getSkills(), is(notNullValue())); + assertThat(list.getResponseMetadata(), is(notNullValue())); + } + } + } + + @Test + public void publishAndAutoEnable() throws Exception { + if (orgAdminUserToken != null) { + MethodsClient client = slack.methods(orgAdminUserToken); + + SlackbotSkillsCreateResponse creation = client.slackbotSkillsCreate(r -> r + .category("engineering") + .description("Test skill for SDK development.") + .displayName("java-slack-sdk admin test skill " + System.currentTimeMillis()) + .instructions("# Purpose\nTest skill created by the java-slack-sdk tests. Safe to delete.")); + assertThat(creation.getError(), is(nullValue())); + String skillId = creation.getSkill().getId(); + + try { + Thread.sleep(3000L); // A new skill can briefly read as skill_not_found + + AdminSlackbotSkillsPublishResponse publication = client.adminSlackbotSkillsPublish(r -> r + .skillIds(Collections.singletonList(skillId))); + assertThat(publication.getError(), is(nullValue())); + + AdminSlackbotSkillsPublishResponse partialPublication = client.adminSlackbotSkillsPublish(r -> r + .skillIds(Arrays.asList(skillId, "F00000000"))); + assertThat(partialPublication.getError(), is("failed_for_some_skills")); + assertThat(partialPublication.getFailedSkills().get(0).getSkillId(), is("F00000000")); + assertThat(partialPublication.getFailedSkills().get(0).getError(), is("skill_not_found")); + + if (usergroupId != null) { + AdminSlackbotSkillsSetAutoEnabledResponse namedEntities = client.adminSlackbotSkillsSetAutoEnabled(r -> r + .permissionType("named_entities") + .skillId(skillId) + .usergroupIds(Collections.singletonList(usergroupId))); + assertThat(namedEntities.getError(), is(nullValue())); + assertThat(namedEntities.getUsergroupIds(), is(Collections.singletonList(usergroupId))); + } + + AdminSlackbotSkillsSetAutoEnabledResponse missingUsergroup = client.adminSlackbotSkillsSetAutoEnabled(r -> r + .permissionType("named_entities") + .skillId(skillId) + .usergroupIds(Collections.singletonList("S00000000"))); + assertThat(missingUsergroup.getError(), is("usergroup_not_found")); + assertThat(missingUsergroup.getInvalidUsergroupIds(), is(Collections.singletonList("S00000000"))); + + AdminSlackbotSkillsSetAutoEnabledResponse noOne = client.adminSlackbotSkillsSetAutoEnabled(r -> r + .permissionType("no_one") + .skillId(skillId)); + assertThat(noOne.getError(), is(nullValue())); + assertThat(noOne.getPermissionType(), is("no_one")); + assertThat(noOne.getSkillId(), is(skillId)); + assertThat(noOne.getUsergroupIds(), is(Collections.emptyList())); + + AdminSlackbotSkillsUnpublishResponse unpublication = client.adminSlackbotSkillsUnpublish(r -> r + .skillIds(Collections.singletonList(skillId))); + assertThat(unpublication.getError(), is(nullValue())); + } finally { + SlackbotSkillsDeleteResponse deletion = client.slackbotSkillsDelete(r -> r.skillId(skillId)); + assertThat(deletion.getError(), is(nullValue())); + } + } + } +} diff --git a/slack-api-client/src/test/java/util/sample_json_generation/JsonDataRecorder.java b/slack-api-client/src/test/java/util/sample_json_generation/JsonDataRecorder.java index dc939430c..68cad55d7 100644 --- a/slack-api-client/src/test/java/util/sample_json_generation/JsonDataRecorder.java +++ b/slack-api-client/src/test/java/util/sample_json_generation/JsonDataRecorder.java @@ -12,6 +12,7 @@ import com.slack.api.methods.response.team.profile.TeamProfileGetResponse; import com.slack.api.model.*; import com.slack.api.model.admin.*; +import com.slack.api.model.slackbot.Skill; import com.slack.api.scim.model.User; import com.slack.api.status.v2.model.SlackIssue; import com.slack.api.util.json.GsonFactory; @@ -458,6 +459,8 @@ private void scanToNormalizeValues(String path, JsonElement parent, String name, array.add(gson.toJsonTree(initProperties(new AppRequest()))); } else if (path.equals("/api/chat.scheduledMessages.list") && name.equals("scheduled_messages")) { array.add(gson.toJsonTree(initProperties(new ChatScheduledMessagesListResponse.ScheduledMessage()))); + } else if (path.startsWith("/api/slackbot.skills.") && name.equals("mcp_servers")) { + array.add(gson.toJsonTree(initProperties(new Skill.McpServer()))); } else if (path.equals("/api/team.profile.get") && name.equals("possible_values")) { array.add(""); } else if (name.equals("replies")) { diff --git a/slack-api-model/src/main/java/com/slack/api/model/slackbot/Skill.java b/slack-api-model/src/main/java/com/slack/api/model/slackbot/Skill.java new file mode 100644 index 000000000..6e975c8ff --- /dev/null +++ b/slack-api-model/src/main/java/com/slack/api/model/slackbot/Skill.java @@ -0,0 +1,48 @@ +package com.slack.api.model.slackbot; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * https://docs.slack.dev/ai/slackbot-skills + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Skill { + private String access; + private String category; + private String creatorId; + private Integer dateCreated; + private Integer dateUpdated; + private String description; + private String displayName; + private String examplePrompt; + private String id; + private String instructions; + private Boolean isOfficial; + private Integer libraryCount; + private List mcpServers; + private String name; + private String permalink; + private String type; + private Integer usageCount; + private String visibility; + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class McpServer { + private String appId; + private String displayName; + private Boolean isAvailable; + private String serverId; + private String serviceType; + } +} diff --git a/slack-api-model/src/main/java/com/slack/api/model/slackbot/SkillMcpServer.java b/slack-api-model/src/main/java/com/slack/api/model/slackbot/SkillMcpServer.java new file mode 100644 index 000000000..efeae56c1 --- /dev/null +++ b/slack-api-model/src/main/java/com/slack/api/model/slackbot/SkillMcpServer.java @@ -0,0 +1,20 @@ +package com.slack.api.model.slackbot; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * https://docs.slack.dev/reference/methods/slackbot.skills.create + * https://docs.slack.dev/reference/methods/slackbot.skills.update + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SkillMcpServer { + private String appId; + private String serverId; + private String serviceType; +}