@rnsk/toolkits 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/README.md +9 -1
  2. package/dist/index.d.ts +9 -1
  3. package/dist/index.js +17 -1
  4. package/dist/toolkits/bitbucket/icon.d.ts +5 -0
  5. package/dist/toolkits/bitbucket/icon.js +6 -0
  6. package/dist/toolkits/bitbucket/manifest.d.ts +3 -0
  7. package/dist/toolkits/bitbucket/manifest.js +56 -0
  8. package/dist/toolkits/bitbucket/tools/client.d.ts +38 -0
  9. package/dist/toolkits/bitbucket/tools/client.js +87 -0
  10. package/dist/toolkits/bitbucket/tools/commits.d.ts +149 -0
  11. package/dist/toolkits/bitbucket/tools/commits.js +444 -0
  12. package/dist/toolkits/bitbucket/tools/index.d.ts +1093 -0
  13. package/dist/toolkits/bitbucket/tools/index.js +770 -0
  14. package/dist/toolkits/bitbucket/tools/issues.d.ts +73 -0
  15. package/dist/toolkits/bitbucket/tools/issues.js +234 -0
  16. package/dist/toolkits/bitbucket/tools/pipelines.d.ts +124 -0
  17. package/dist/toolkits/bitbucket/tools/pipelines.js +446 -0
  18. package/dist/toolkits/bitbucket/tools/pull-requests.d.ts +174 -0
  19. package/dist/toolkits/bitbucket/tools/pull-requests.js +541 -0
  20. package/dist/toolkits/bitbucket/tools/reports.d.ts +84 -0
  21. package/dist/toolkits/bitbucket/tools/reports.js +213 -0
  22. package/dist/toolkits/bitbucket/tools/repositories.d.ts +156 -0
  23. package/dist/toolkits/bitbucket/tools/repositories.js +531 -0
  24. package/dist/toolkits/bitbucket/tools/search.d.ts +17 -0
  25. package/dist/toolkits/bitbucket/tools/search.js +67 -0
  26. package/dist/toolkits/bitbucket/tools/snippets.d.ts +34 -0
  27. package/dist/toolkits/bitbucket/tools/snippets.js +122 -0
  28. package/dist/toolkits/bitbucket/tools/users-workspaces.d.ts +65 -0
  29. package/dist/toolkits/bitbucket/tools/users-workspaces.js +294 -0
  30. package/dist/toolkits/discord/icon.d.ts +5 -0
  31. package/dist/toolkits/discord/icon.js +12 -0
  32. package/dist/toolkits/discord/manifest.d.ts +3 -0
  33. package/dist/toolkits/discord/manifest.js +52 -0
  34. package/dist/toolkits/discord/tools/applications.d.ts +79 -0
  35. package/dist/toolkits/discord/tools/applications.js +216 -0
  36. package/dist/toolkits/discord/tools/client.d.ts +22 -0
  37. package/dist/toolkits/discord/tools/client.js +69 -0
  38. package/dist/toolkits/discord/tools/guilds.d.ts +39 -0
  39. package/dist/toolkits/discord/tools/guilds.js +123 -0
  40. package/dist/toolkits/discord/tools/index.d.ts +222 -0
  41. package/dist/toolkits/discord/tools/index.js +170 -0
  42. package/dist/toolkits/discord/tools/misc.d.ts +7 -0
  43. package/dist/toolkits/discord/tools/misc.js +40 -0
  44. package/dist/toolkits/discord/tools/users.d.ts +28 -0
  45. package/dist/toolkits/discord/tools/users.js +128 -0
  46. package/dist/toolkits/figma/tools/index.d.ts +1 -1
  47. package/dist/toolkits/figma/tools/render-images-of-file-nodes.d.ts +1 -1
  48. package/dist/toolkits/gitlab/icon.d.ts +5 -0
  49. package/dist/toolkits/gitlab/icon.js +6 -0
  50. package/dist/toolkits/gitlab/manifest.d.ts +3 -0
  51. package/dist/toolkits/gitlab/manifest.js +36 -0
  52. package/dist/toolkits/gitlab/tools/client.d.ts +7 -0
  53. package/dist/toolkits/gitlab/tools/client.js +45 -0
  54. package/dist/toolkits/gitlab/tools/index.d.ts +306 -0
  55. package/dist/toolkits/gitlab/tools/index.js +36 -0
  56. package/dist/toolkits/gitlab/tools/issues.d.ts +45 -0
  57. package/dist/toolkits/gitlab/tools/issues.js +103 -0
  58. package/dist/toolkits/gitlab/tools/merge-requests.d.ts +35 -0
  59. package/dist/toolkits/gitlab/tools/merge-requests.js +91 -0
  60. package/dist/toolkits/gitlab/tools/pipelines.d.ts +30 -0
  61. package/dist/toolkits/gitlab/tools/pipelines.js +66 -0
  62. package/dist/toolkits/gitlab/tools/projects.d.ts +36 -0
  63. package/dist/toolkits/gitlab/tools/projects.js +94 -0
  64. package/dist/toolkits/gitlab/tools/repository.d.ts +21 -0
  65. package/dist/toolkits/gitlab/tools/repository.js +53 -0
  66. package/dist/toolkits/gitlab/tools/users-groups.d.ts +11 -0
  67. package/dist/toolkits/gitlab/tools/users-groups.js +30 -0
  68. package/dist/toolkits/google-ads/tools/get-rmf-report.d.ts +2 -2
  69. package/dist/toolkits/google-ads/tools/index.d.ts +2 -2
  70. package/dist/toolkits/google-analytics/icon.d.ts +5 -0
  71. package/dist/toolkits/google-analytics/icon.js +11 -0
  72. package/dist/toolkits/google-analytics/manifest.d.ts +3 -0
  73. package/dist/toolkits/google-analytics/manifest.js +48 -0
  74. package/dist/toolkits/google-analytics/tools/admin.d.ts +73 -0
  75. package/dist/toolkits/google-analytics/tools/admin.js +238 -0
  76. package/dist/toolkits/google-analytics/tools/audiences.d.ts +81 -0
  77. package/dist/toolkits/google-analytics/tools/audiences.js +190 -0
  78. package/dist/toolkits/google-analytics/tools/client.d.ts +47 -0
  79. package/dist/toolkits/google-analytics/tools/client.js +74 -0
  80. package/dist/toolkits/google-analytics/tools/custom-definitions.d.ts +62 -0
  81. package/dist/toolkits/google-analytics/tools/custom-definitions.js +106 -0
  82. package/dist/toolkits/google-analytics/tools/index.d.ts +16 -0
  83. package/dist/toolkits/google-analytics/tools/index.js +88 -0
  84. package/dist/toolkits/google-analytics/tools/links.d.ts +22 -0
  85. package/dist/toolkits/google-analytics/tools/links.js +56 -0
  86. package/dist/toolkits/google-analytics/tools/measurement.d.ts +3 -0
  87. package/dist/toolkits/google-analytics/tools/measurement.js +55 -0
  88. package/dist/toolkits/google-analytics/tools/reports.d.ts +136 -0
  89. package/dist/toolkits/google-analytics/tools/reports.js +200 -0
  90. package/dist/toolkits/google-contacts/icon.d.ts +5 -0
  91. package/dist/toolkits/google-contacts/icon.js +6 -0
  92. package/dist/toolkits/google-contacts/manifest.d.ts +3 -0
  93. package/dist/toolkits/google-contacts/manifest.js +48 -0
  94. package/dist/toolkits/google-contacts/tools/client.d.ts +19 -0
  95. package/dist/toolkits/google-contacts/tools/client.js +44 -0
  96. package/dist/toolkits/google-contacts/tools/contacts.d.ts +94 -0
  97. package/dist/toolkits/google-contacts/tools/contacts.js +273 -0
  98. package/dist/toolkits/google-contacts/tools/directory.d.ts +36 -0
  99. package/dist/toolkits/google-contacts/tools/directory.js +99 -0
  100. package/dist/toolkits/google-contacts/tools/groups.d.ts +68 -0
  101. package/dist/toolkits/google-contacts/tools/groups.js +169 -0
  102. package/dist/toolkits/google-contacts/tools/index.d.ts +347 -0
  103. package/dist/toolkits/google-contacts/tools/index.js +34 -0
  104. package/dist/toolkits/google-contacts/tools/photos.d.ts +26 -0
  105. package/dist/toolkits/google-contacts/tools/photos.js +52 -0
  106. package/dist/toolkits/google-maps/icon.d.ts +5 -0
  107. package/dist/toolkits/google-maps/icon.js +39 -0
  108. package/dist/toolkits/google-maps/manifest.d.ts +3 -0
  109. package/dist/toolkits/google-maps/manifest.js +55 -0
  110. package/dist/toolkits/google-maps/tools/client.d.ts +27 -0
  111. package/dist/toolkits/google-maps/tools/client.js +72 -0
  112. package/dist/toolkits/google-maps/tools/geocode.d.ts +49 -0
  113. package/dist/toolkits/google-maps/tools/geocode.js +168 -0
  114. package/dist/toolkits/google-maps/tools/index.d.ts +432 -0
  115. package/dist/toolkits/google-maps/tools/index.js +31 -0
  116. package/dist/toolkits/google-maps/tools/misc.d.ts +70 -0
  117. package/dist/toolkits/google-maps/tools/misc.js +158 -0
  118. package/dist/toolkits/google-maps/tools/places.d.ts +112 -0
  119. package/dist/toolkits/google-maps/tools/places.js +185 -0
  120. package/dist/toolkits/google-maps/tools/routes.d.ts +48 -0
  121. package/dist/toolkits/google-maps/tools/routes.js +97 -0
  122. package/dist/toolkits/google-maps/tools/tiles.d.ts +51 -0
  123. package/dist/toolkits/google-maps/tools/tiles.js +84 -0
  124. package/dist/toolkits/google-photos/icon.d.ts +5 -0
  125. package/dist/toolkits/google-photos/icon.js +6 -0
  126. package/dist/toolkits/google-photos/manifest.d.ts +3 -0
  127. package/dist/toolkits/google-photos/manifest.js +47 -0
  128. package/dist/toolkits/google-photos/tools/albums.d.ts +83 -0
  129. package/dist/toolkits/google-photos/tools/albums.js +180 -0
  130. package/dist/toolkits/google-photos/tools/client.d.ts +24 -0
  131. package/dist/toolkits/google-photos/tools/client.js +77 -0
  132. package/dist/toolkits/google-photos/tools/index.d.ts +261 -0
  133. package/dist/toolkits/google-photos/tools/index.js +22 -0
  134. package/dist/toolkits/google-photos/tools/media.d.ts +52 -0
  135. package/dist/toolkits/google-photos/tools/media.js +142 -0
  136. package/dist/toolkits/google-photos/tools/uploads.d.ts +58 -0
  137. package/dist/toolkits/google-photos/tools/uploads.js +107 -0
  138. package/dist/toolkits/google-tasks/tools/index.d.ts +1 -1
  139. package/dist/toolkits/google-tasks/tools/update-task-full.d.ts +1 -1
  140. package/dist/toolkits/groww/tools/index.d.ts +1 -1
  141. package/dist/toolkits/groww/tools/instruments.d.ts +1 -1
  142. package/dist/toolkits/reddit/tools/index.d.ts +1 -1
  143. package/dist/toolkits/reddit/tools/search-across-subreddits.d.ts +1 -1
  144. package/dist/toolkits/slack/icon.d.ts +5 -0
  145. package/dist/toolkits/slack/icon.js +20 -0
  146. package/dist/toolkits/slack/manifest.d.ts +3 -0
  147. package/dist/toolkits/slack/manifest.js +93 -0
  148. package/dist/toolkits/slack/tools/admin-apps.d.ts +32 -0
  149. package/dist/toolkits/slack/tools/admin-apps.js +116 -0
  150. package/dist/toolkits/slack/tools/admin-conversations.d.ts +62 -0
  151. package/dist/toolkits/slack/tools/admin-conversations.js +246 -0
  152. package/dist/toolkits/slack/tools/admin-invites.d.ts +19 -0
  153. package/dist/toolkits/slack/tools/admin-invites.js +75 -0
  154. package/dist/toolkits/slack/tools/admin-users.d.ts +52 -0
  155. package/dist/toolkits/slack/tools/admin-users.js +182 -0
  156. package/dist/toolkits/slack/tools/audit.d.ts +20 -0
  157. package/dist/toolkits/slack/tools/audit.js +81 -0
  158. package/dist/toolkits/slack/tools/calls.d.ts +38 -0
  159. package/dist/toolkits/slack/tools/calls.js +141 -0
  160. package/dist/toolkits/slack/tools/canvas.d.ts +24 -0
  161. package/dist/toolkits/slack/tools/canvas.js +102 -0
  162. package/dist/toolkits/slack/tools/client.d.ts +22 -0
  163. package/dist/toolkits/slack/tools/client.js +73 -0
  164. package/dist/toolkits/slack/tools/conversations.d.ts +131 -0
  165. package/dist/toolkits/slack/tools/conversations.js +463 -0
  166. package/dist/toolkits/slack/tools/emoji.d.ts +29 -0
  167. package/dist/toolkits/slack/tools/emoji.js +118 -0
  168. package/dist/toolkits/slack/tools/files.d.ts +113 -0
  169. package/dist/toolkits/slack/tools/files.js +368 -0
  170. package/dist/toolkits/slack/tools/index.d.ts +28 -0
  171. package/dist/toolkits/slack/tools/index.js +187 -0
  172. package/dist/toolkits/slack/tools/messages.d.ts +106 -0
  173. package/dist/toolkits/slack/tools/messages.js +340 -0
  174. package/dist/toolkits/slack/tools/misc.d.ts +42 -0
  175. package/dist/toolkits/slack/tools/misc.js +127 -0
  176. package/dist/toolkits/slack/tools/reactions-stars-pins.d.ts +69 -0
  177. package/dist/toolkits/slack/tools/reactions-stars-pins.js +236 -0
  178. package/dist/toolkits/slack/tools/reminders.d.ts +22 -0
  179. package/dist/toolkits/slack/tools/reminders.js +83 -0
  180. package/dist/toolkits/slack/tools/search.d.ts +49 -0
  181. package/dist/toolkits/slack/tools/search.js +155 -0
  182. package/dist/toolkits/slack/tools/slack-lists.d.ts +65 -0
  183. package/dist/toolkits/slack/tools/slack-lists.js +282 -0
  184. package/dist/toolkits/slack/tools/teams.d.ts +75 -0
  185. package/dist/toolkits/slack/tools/teams.js +285 -0
  186. package/dist/toolkits/slack/tools/usergroups.d.ts +56 -0
  187. package/dist/toolkits/slack/tools/usergroups.js +194 -0
  188. package/dist/toolkits/slack/tools/users.d.ts +87 -0
  189. package/dist/toolkits/slack/tools/users.js +396 -0
  190. package/dist/toolkits/youtube/tools/add-video-to-playlist.d.ts +1 -1
  191. package/dist/toolkits/youtube/tools/delete-video.d.ts +1 -1
  192. package/dist/toolkits/youtube/tools/index.d.ts +10 -10
  193. package/dist/toolkits/youtube/tools/list-caption-track.d.ts +1 -1
  194. package/dist/toolkits/youtube/tools/list-playlist-items.d.ts +1 -1
  195. package/dist/toolkits/youtube/tools/list-video-categories.d.ts +1 -1
  196. package/dist/toolkits/youtube/tools/post-comment.d.ts +1 -1
  197. package/dist/toolkits/youtube/tools/report-video-abuse.d.ts +1 -1
  198. package/dist/toolkits/youtube/tools/search-youtube.d.ts +1 -1
  199. package/dist/toolkits/youtube/tools/update-thumbnail.d.ts +1 -1
  200. package/dist/toolkits/youtube/tools/update-video.d.ts +1 -1
  201. package/package.json +1 -1
@@ -0,0 +1,463 @@
1
+ // @ts-nocheck
2
+ import { tool } from 'ai';
3
+ import { z } from 'zod';
4
+ import { slackApi, toSlackError, requireToken } from './client.js';
5
+ const tokenField = z.string().optional().describe('Injected by system; do not provide');
6
+ export const slackListAllChannels = tool({
7
+ description: 'List conversations visible to the caller, with type and archive filters. Always use the returned channel IDs (not names) in downstream tools. Loop on response_metadata.next_cursor until empty for full coverage.',
8
+ inputSchema: z.object({
9
+ slackToken: tokenField,
10
+ types: z.string().optional().describe('Comma-separated: public_channel,private_channel,im,mpim'),
11
+ limit: z.number().min(1).max(1000).optional().describe('Channels per page (max 1000)'),
12
+ cursor: z.string().optional().describe('Pagination cursor from a previous response'),
13
+ excludeArchived: z.boolean().optional().describe('Hide archived channels'),
14
+ teamId: z.string().optional().describe('Workspace ID (org-level tokens only)'),
15
+ }),
16
+ execute: async ({ slackToken, teamId, excludeArchived, ...rest }) => {
17
+ try {
18
+ const missing = requireToken(slackToken);
19
+ if (missing)
20
+ return missing;
21
+ return await slackApi(slackToken, 'conversations.list', {
22
+ ...rest,
23
+ team_id: teamId,
24
+ exclude_archived: excludeArchived,
25
+ });
26
+ }
27
+ catch (error) {
28
+ return toSlackError(error, 'Failed to list channels');
29
+ }
30
+ },
31
+ });
32
+ export const slackFindChannels = tool({
33
+ description: 'Find channels by name, topic, purpose, or description (case-insensitive partial match). Always resolve names to IDs here before passing to other tools. Empty results may mean no match or no access — retry with exactMatch=false and excludeArchived=false.',
34
+ inputSchema: z.object({
35
+ slackToken: tokenField,
36
+ query: z.string().describe('Search text; a leading # is stripped automatically'),
37
+ types: z.string().optional().default('public_channel,private_channel').describe('Channel types to search'),
38
+ limit: z.number().min(1).max(999).optional().default(50).describe('Max channels to return'),
39
+ exactMatch: z.boolean().optional().describe('Only return exact name matches'),
40
+ memberOnly: z.boolean().optional().describe('Only channels the caller is a member of'),
41
+ excludeArchived: z.boolean().optional().default(true).describe('Hide archived channels'),
42
+ teamId: z.string().optional().describe('Workspace ID (org-level tokens only)'),
43
+ }),
44
+ execute: async ({ slackToken, query, types = 'public_channel,private_channel', limit = 50, exactMatch, memberOnly, excludeArchived = true, teamId, }) => {
45
+ try {
46
+ const missing = requireToken(slackToken);
47
+ if (missing)
48
+ return missing;
49
+ const normalized = query.startsWith('#') ? query.slice(1) : query;
50
+ const data = await slackApi(slackToken, 'conversations.list', {
51
+ types,
52
+ limit: Math.min(1000, Math.max(limit, 50)),
53
+ exclude_archived: excludeArchived,
54
+ team_id: teamId,
55
+ });
56
+ const all = data?.channels ?? [];
57
+ const q = normalized.toLowerCase();
58
+ const matches = all.filter((c) => {
59
+ if (memberOnly && !c.is_member)
60
+ return false;
61
+ if (exactMatch) {
62
+ return (c.name ?? '').toLowerCase() === q;
63
+ }
64
+ return [c.name, c.topic?.value, c.purpose?.value]
65
+ .filter(Boolean)
66
+ .some((v) => String(v).toLowerCase().includes(q));
67
+ });
68
+ return { ok: true, channels: matches.slice(0, limit), total_channels_searched: all.length };
69
+ }
70
+ catch (error) {
71
+ return toSlackError(error, 'Failed to find channels');
72
+ }
73
+ },
74
+ });
75
+ export const slackListConversations = tool({
76
+ description: 'List conversations accessible to a user (defaults to the caller). Returns IDs, not names. Private channels and DMs appear only with shared membership and proper scopes. Paginate on next_cursor until empty.',
77
+ inputSchema: z.object({
78
+ slackToken: tokenField,
79
+ user: z.string().optional().describe('User ID; omit for the authenticated user'),
80
+ types: z.string().optional().describe('Comma-separated: public_channel,private_channel,im,mpim'),
81
+ limit: z.number().min(1).max(1000).optional().describe('Items per page'),
82
+ cursor: z.string().optional().describe('Pagination cursor from a previous response'),
83
+ excludeArchived: z.boolean().optional().describe('Hide archived channels'),
84
+ teamId: z.string().optional().describe('Workspace ID (org-level tokens only)'),
85
+ }),
86
+ execute: async ({ slackToken, teamId, excludeArchived, ...rest }) => {
87
+ try {
88
+ const missing = requireToken(slackToken);
89
+ if (missing)
90
+ return missing;
91
+ return await slackApi(slackToken, 'users.conversations', {
92
+ ...rest,
93
+ team_id: teamId,
94
+ exclude_archived: excludeArchived,
95
+ });
96
+ }
97
+ catch (error) {
98
+ return toSlackError(error, 'Failed to list conversations');
99
+ }
100
+ },
101
+ });
102
+ export const slackGetConversationInfo = tool({
103
+ description: 'Get metadata for a conversation by ID (name, purpose, dates, member count). No message content. Check is_archived and is_member to diagnose access issues.',
104
+ inputSchema: z.object({
105
+ slackToken: tokenField,
106
+ channel: z.string().describe('Conversation ID'),
107
+ includeNumMembers: z.boolean().optional().describe('Include member count'),
108
+ includeLocale: z.boolean().optional().describe('Include locale setting'),
109
+ }),
110
+ execute: async ({ slackToken, channel, includeNumMembers, includeLocale }) => {
111
+ try {
112
+ const missing = requireToken(slackToken);
113
+ if (missing)
114
+ return missing;
115
+ return await slackApi(slackToken, 'conversations.info', {
116
+ channel,
117
+ include_num_members: includeNumMembers,
118
+ include_locale: includeLocale,
119
+ });
120
+ }
121
+ catch (error) {
122
+ return toSlackError(error, 'Failed to get conversation info');
123
+ }
124
+ },
125
+ });
126
+ export const slackGetConversationMembers = tool({
127
+ description: 'List active member user IDs for a channel, DM, or group DM. Returns IDs only — enrich with user lookup tools. Paginate on next_cursor until empty for large channels.',
128
+ inputSchema: z.object({
129
+ slackToken: tokenField,
130
+ channel: z.string().describe('Conversation ID (names not accepted)'),
131
+ limit: z.number().min(1).optional().describe('Members per page'),
132
+ cursor: z.string().optional().describe('Pagination cursor from a previous response'),
133
+ }),
134
+ execute: async ({ slackToken, channel, limit, cursor }) => {
135
+ try {
136
+ const missing = requireToken(slackToken);
137
+ if (missing)
138
+ return missing;
139
+ return await slackApi(slackToken, 'conversations.members', { channel, limit, cursor });
140
+ }
141
+ catch (error) {
142
+ return toSlackError(error, 'Failed to get conversation members');
143
+ }
144
+ },
145
+ });
146
+ export const slackGetConversationHistory = tool({
147
+ description: 'Fetch one page of main-timeline messages from a conversation, with time-range filters. Threaded replies are NOT included — use slackGetConversationReplies with a parent ts for those. Paginate with cursor.',
148
+ inputSchema: z.object({
149
+ slackToken: tokenField,
150
+ channel: z.string().describe('Conversation ID'),
151
+ oldest: z.string().optional().describe('Start of time range (Slack ts)'),
152
+ latest: z.string().optional().describe('End of time range (Slack ts)'),
153
+ limit: z.number().min(1).max(1000).optional().default(100).describe('Messages per page (max 1000)'),
154
+ cursor: z.string().optional().describe('Pagination cursor from a previous response'),
155
+ inclusive: z.boolean().optional().describe('Include boundary messages'),
156
+ includeAllMetadata: z.boolean().optional().describe('Return all message metadata'),
157
+ }),
158
+ execute: async ({ slackToken, channel, limit = 100, includeAllMetadata, ...rest }) => {
159
+ try {
160
+ const missing = requireToken(slackToken);
161
+ if (missing)
162
+ return missing;
163
+ return await slackApi(slackToken, 'conversations.history', {
164
+ channel,
165
+ limit,
166
+ include_all_metadata: includeAllMetadata,
167
+ ...rest,
168
+ });
169
+ }
170
+ catch (error) {
171
+ return toSlackError(error, 'Failed to fetch conversation history');
172
+ }
173
+ },
174
+ });
175
+ export const slackGetConversationReplies = tool({
176
+ description: 'Fetch replies in a thread by channel ID and parent message ts. The first returned message is the parent; use has_more/cursor for large threads.',
177
+ inputSchema: z.object({
178
+ slackToken: tokenField,
179
+ channel: z.string().describe('Conversation ID'),
180
+ ts: z.string().describe('Parent message ts (exact, not a reply ts or permalink)'),
181
+ oldest: z.string().optional().describe('Earliest reply ts to include'),
182
+ latest: z.string().optional().describe('Latest reply ts to include'),
183
+ limit: z.number().min(1).optional().describe('Max messages to return'),
184
+ cursor: z.string().optional().describe('Pagination cursor from a previous response'),
185
+ inclusive: z.boolean().optional().describe('Include boundary messages'),
186
+ includeAllMetadata: z.boolean().optional().describe('Return all message metadata'),
187
+ }),
188
+ execute: async ({ slackToken, channel, ts, includeAllMetadata, ...rest }) => {
189
+ try {
190
+ const missing = requireToken(slackToken);
191
+ if (missing)
192
+ return missing;
193
+ return await slackApi(slackToken, 'conversations.replies', {
194
+ channel,
195
+ ts,
196
+ include_all_metadata: includeAllMetadata,
197
+ ...rest,
198
+ });
199
+ }
200
+ catch (error) {
201
+ return toSlackError(error, 'Failed to fetch conversation replies');
202
+ }
203
+ },
204
+ });
205
+ export const slackCreateChannel = tool({
206
+ description: 'Create a public or private channel. Names must be lowercase, unique, 80 chars max, no spaces or periods. Confirm with the user first.',
207
+ inputSchema: z.object({
208
+ slackToken: tokenField,
209
+ name: z.string().describe('Channel name, e.g. mychannel'),
210
+ isPrivate: z.boolean().optional().describe('Create a private invite-only channel'),
211
+ teamId: z.string().optional().describe('Workspace ID (org-level tokens only)'),
212
+ }),
213
+ execute: async ({ slackToken, name, isPrivate, teamId }) => {
214
+ try {
215
+ const missing = requireToken(slackToken);
216
+ if (missing)
217
+ return missing;
218
+ return await slackApi(slackToken, 'conversations.create', {
219
+ name,
220
+ is_private: isPrivate,
221
+ team_id: teamId,
222
+ });
223
+ }
224
+ catch (error) {
225
+ return toSlackError(error, 'Failed to create channel');
226
+ }
227
+ },
228
+ });
229
+ export const slackArchiveChannel = tool({
230
+ description: 'Archive a conversation, making it read-only while keeping history. Some channels (#general, DMs) cannot be archived. Confirm with the user first.',
231
+ inputSchema: z.object({
232
+ slackToken: tokenField,
233
+ channel: z.string().describe('Conversation ID to archive'),
234
+ }),
235
+ execute: async ({ slackToken, channel }) => {
236
+ try {
237
+ const missing = requireToken(slackToken);
238
+ if (missing)
239
+ return missing;
240
+ return await slackApi(slackToken, 'conversations.archive', { channel });
241
+ }
242
+ catch (error) {
243
+ return toSlackError(error, 'Failed to archive conversation');
244
+ }
245
+ },
246
+ });
247
+ export const slackUnarchiveChannel = tool({
248
+ description: 'Unarchive a conversation, making it active again.',
249
+ inputSchema: z.object({
250
+ slackToken: tokenField,
251
+ channel: z.string().describe('Conversation ID to unarchive'),
252
+ }),
253
+ execute: async ({ slackToken, channel }) => {
254
+ try {
255
+ const missing = requireToken(slackToken);
256
+ if (missing)
257
+ return missing;
258
+ return await slackApi(slackToken, 'conversations.unarchive', { channel });
259
+ }
260
+ catch (error) {
261
+ return toSlackError(error, 'Failed to unarchive conversation');
262
+ }
263
+ },
264
+ });
265
+ export const slackCloseDm = tool({
266
+ description: 'Close a DM or group DM, removing it from the caller sidebar without deleting history. Affects only the calling user view.',
267
+ inputSchema: z.object({
268
+ slackToken: tokenField,
269
+ channel: z.string().describe('DM (D...) or group DM (G...) ID to close'),
270
+ }),
271
+ execute: async ({ slackToken, channel }) => {
272
+ try {
273
+ const missing = requireToken(slackToken);
274
+ if (missing)
275
+ return missing;
276
+ return await slackApi(slackToken, 'conversations.close', { channel });
277
+ }
278
+ catch (error) {
279
+ return toSlackError(error, 'Failed to close conversation');
280
+ }
281
+ },
282
+ });
283
+ export const slackJoinConversation = tool({
284
+ description: 'Join a conversation by ID. Joining an already-joined channel is a non-fatal no-op. Private channel joins may fail without permission.',
285
+ inputSchema: z.object({
286
+ slackToken: tokenField,
287
+ channel: z.string().describe('Conversation ID to join'),
288
+ }),
289
+ execute: async ({ slackToken, channel }) => {
290
+ try {
291
+ const missing = requireToken(slackToken);
292
+ if (missing)
293
+ return missing;
294
+ return await slackApi(slackToken, 'conversations.join', { channel });
295
+ }
296
+ catch (error) {
297
+ return toSlackError(error, 'Failed to join conversation');
298
+ }
299
+ },
300
+ });
301
+ export const slackLeaveConversation = tool({
302
+ description: 'Leave a conversation by ID. Fails as the last member of a private channel or on #general / Slack Connect channels.',
303
+ inputSchema: z.object({
304
+ slackToken: tokenField,
305
+ channel: z.string().describe('Conversation ID to leave'),
306
+ }),
307
+ execute: async ({ slackToken, channel }) => {
308
+ try {
309
+ const missing = requireToken(slackToken);
310
+ if (missing)
311
+ return missing;
312
+ return await slackApi(slackToken, 'conversations.leave', { channel });
313
+ }
314
+ catch (error) {
315
+ return toSlackError(error, 'Failed to leave conversation');
316
+ }
317
+ },
318
+ });
319
+ export const slackRenameConversation = tool({
320
+ description: 'Rename a channel (Slack normalizes to lowercase conventions). May affect integrations using the old name.',
321
+ inputSchema: z.object({
322
+ slackToken: tokenField,
323
+ channel: z.string().describe('Conversation ID to rename'),
324
+ name: z.string().describe('New name: lowercase, max 80 chars, no spaces'),
325
+ }),
326
+ execute: async ({ slackToken, channel, name }) => {
327
+ try {
328
+ const missing = requireToken(slackToken);
329
+ if (missing)
330
+ return missing;
331
+ return await slackApi(slackToken, 'conversations.rename', { channel, name });
332
+ }
333
+ catch (error) {
334
+ return toSlackError(error, 'Failed to rename conversation');
335
+ }
336
+ },
337
+ });
338
+ export const slackSetConversationTopic = tool({
339
+ description: 'Set the topic header for a conversation by ID (max 250 chars, no formatting). The caller must be a member.',
340
+ inputSchema: z.object({
341
+ slackToken: tokenField,
342
+ channel: z.string().describe('Conversation ID (C/G/D prefix, not a name)'),
343
+ topic: z.string().describe('New topic text'),
344
+ }),
345
+ execute: async ({ slackToken, channel, topic }) => {
346
+ try {
347
+ const missing = requireToken(slackToken);
348
+ if (missing)
349
+ return missing;
350
+ return await slackApi(slackToken, 'conversations.setTopic', { channel, topic });
351
+ }
352
+ catch (error) {
353
+ return toSlackError(error, 'Failed to set conversation topic');
354
+ }
355
+ },
356
+ });
357
+ export const slackSetConversationPurpose = tool({
358
+ description: 'Set the purpose (short goal description) for a conversation by ID (max 250 chars). The caller must be a member.',
359
+ inputSchema: z.object({
360
+ slackToken: tokenField,
361
+ channel: z.string().describe('Conversation ID'),
362
+ purpose: z.string().describe('New purpose text'),
363
+ }),
364
+ execute: async ({ slackToken, channel, purpose }) => {
365
+ try {
366
+ const missing = requireToken(slackToken);
367
+ if (missing)
368
+ return missing;
369
+ return await slackApi(slackToken, 'conversations.setPurpose', { channel, purpose });
370
+ }
371
+ catch (error) {
372
+ return toSlackError(error, 'Failed to set conversation purpose');
373
+ }
374
+ },
375
+ });
376
+ export const slackMarkConversationRead = tool({
377
+ description: 'Mark a message as the most recently read for the caller in a channel. The caller must be a member and the message must exist.',
378
+ inputSchema: z.object({
379
+ slackToken: tokenField,
380
+ channel: z.string().describe('Conversation ID'),
381
+ ts: z.string().describe('Message ts to mark as last read'),
382
+ }),
383
+ execute: async ({ slackToken, channel, ts }) => {
384
+ try {
385
+ const missing = requireToken(slackToken);
386
+ if (missing)
387
+ return missing;
388
+ return await slackApi(slackToken, 'conversations.mark', { channel, ts });
389
+ }
390
+ catch (error) {
391
+ return toSlackError(error, 'Failed to set conversation read cursor');
392
+ }
393
+ },
394
+ });
395
+ export const slackInviteUsersToChannel = tool({
396
+ description: 'Invite users to a channel by comma-separated user IDs (up to 1000). The bot must be a member of private channels. Inspect ok/error/errors — HTTP is always 200.',
397
+ inputSchema: z.object({
398
+ slackToken: tokenField,
399
+ channel: z.string().describe('Channel ID to invite users to'),
400
+ users: z.string().describe("Comma-separated user IDs, e.g. 'U123,U456'"),
401
+ force: z.boolean().optional().describe('Invite valid users even when some IDs are invalid'),
402
+ }),
403
+ execute: async ({ slackToken, channel, users, force }) => {
404
+ try {
405
+ const missing = requireToken(slackToken);
406
+ if (missing)
407
+ return missing;
408
+ return await slackApi(slackToken, 'conversations.invite', { channel, users, force });
409
+ }
410
+ catch (error) {
411
+ return toSlackError(error, 'Failed to invite users to channel');
412
+ }
413
+ },
414
+ });
415
+ export const slackRemoveUserFromConversation = tool({
416
+ description: 'Remove (kick) a user from a conversation. The caller needs permission and cannot remove themselves with this tool.',
417
+ inputSchema: z.object({
418
+ slackToken: tokenField,
419
+ channel: z.string().describe('Conversation ID'),
420
+ user: z.string().describe('User ID to remove'),
421
+ }),
422
+ execute: async ({ slackToken, channel, user }) => {
423
+ try {
424
+ const missing = requireToken(slackToken);
425
+ if (missing)
426
+ return missing;
427
+ return await slackApi(slackToken, 'conversations.kick', { channel, user });
428
+ }
429
+ catch (error) {
430
+ return toSlackError(error, 'Failed to remove user from conversation');
431
+ }
432
+ },
433
+ });
434
+ export const slackOpenDm = tool({
435
+ description: 'Open or resume a DM (1 user) or group DM (2-8 users) by user IDs, or reopen an existing channel. Reuse the returned channel.id for messaging — never pass user IDs or emails directly to slackSendMessage.',
436
+ inputSchema: z.object({
437
+ slackToken: tokenField,
438
+ users: z.string().optional().describe("Comma-separated user IDs, e.g. 'U123' or 'U123,U456'"),
439
+ channel: z.string().optional().describe('Existing DM/MPIM channel to reopen'),
440
+ returnIm: z.boolean().optional().describe('Return the full DM object (single-user opens only)'),
441
+ preventCreation: z.boolean().optional().describe('Only check for an existing DM without creating one'),
442
+ }),
443
+ execute: async ({ slackToken, users, channel, returnIm, preventCreation }) => {
444
+ try {
445
+ const missing = requireToken(slackToken);
446
+ if (missing)
447
+ return missing;
448
+ if ((users && channel) || (!users && !channel)) {
449
+ return { error: 'Provide exactly one of users or channel.' };
450
+ }
451
+ return await slackApi(slackToken, 'conversations.open', {
452
+ users,
453
+ channel,
454
+ return_im: returnIm,
455
+ prevent_creation: preventCreation,
456
+ });
457
+ }
458
+ catch (error) {
459
+ return toSlackError(error, 'Failed to open DM');
460
+ }
461
+ },
462
+ });
463
+ //# sourceMappingURL=conversations.js.map
@@ -0,0 +1,29 @@
1
+ export declare const slackAddEmoji: import("ai").Tool<{
2
+ url: string;
3
+ name: string;
4
+ slackToken?: string | undefined;
5
+ }, any>;
6
+ export declare const slackAddEmojiAlias: import("ai").Tool<{
7
+ name: string;
8
+ aliasFor: string;
9
+ slackToken?: string | undefined;
10
+ }, any>;
11
+ export declare const slackRenameEmoji: import("ai").Tool<{
12
+ name: string;
13
+ newName: string;
14
+ slackToken?: string | undefined;
15
+ }, any>;
16
+ export declare const slackRemoveEmoji: import("ai").Tool<{
17
+ name: string;
18
+ slackToken?: string | undefined;
19
+ }, any>;
20
+ export declare const slackListCustomEmojis: import("ai").Tool<{
21
+ slackToken?: string | undefined;
22
+ includeCategories?: boolean | undefined;
23
+ }, any>;
24
+ export declare const slackListAdminEmoji: import("ai").Tool<{
25
+ limit?: number | undefined;
26
+ cursor?: string | undefined;
27
+ slackToken?: string | undefined;
28
+ }, any>;
29
+ //# sourceMappingURL=emoji.d.ts.map
@@ -0,0 +1,118 @@
1
+ // @ts-nocheck
2
+ import { tool } from 'ai';
3
+ import { z } from 'zod';
4
+ import { slackApi, toSlackError, requireToken } from './client.js';
5
+ const tokenField = z.string().optional().describe('Injected by system; do not provide');
6
+ export const slackAddEmoji = tool({
7
+ description: 'Add a custom emoji from a public image URL (PNG/GIF/JPEG) under a lowercase name. Subject to workspace emoji limits; admin scope required.',
8
+ inputSchema: z.object({
9
+ slackToken: tokenField,
10
+ name: z.string().describe("Emoji name, lowercase, no colons — e.g. 'partyparrot'"),
11
+ url: z.string().describe('Public image URL for the emoji'),
12
+ }),
13
+ execute: async ({ slackToken, name, url }) => {
14
+ try {
15
+ const missing = requireToken(slackToken);
16
+ if (missing)
17
+ return missing;
18
+ return await slackApi(slackToken, 'admin.emoji.add', { name, url });
19
+ }
20
+ catch (error) {
21
+ return toSlackError(error, 'Failed to add emoji');
22
+ }
23
+ },
24
+ });
25
+ export const slackAddEmojiAlias = tool({
26
+ description: 'Create an alias name pointing at an existing custom emoji (Enterprise Grid). Colons and whitespace are trimmed automatically.',
27
+ inputSchema: z.object({
28
+ slackToken: tokenField,
29
+ name: z.string().describe('New alias name'),
30
+ aliasFor: z.string().describe('Canonical name of the existing emoji'),
31
+ }),
32
+ execute: async ({ slackToken, name, aliasFor }) => {
33
+ try {
34
+ const missing = requireToken(slackToken);
35
+ if (missing)
36
+ return missing;
37
+ return await slackApi(slackToken, 'admin.emoji.addAlias', { name, alias_for: aliasFor });
38
+ }
39
+ catch (error) {
40
+ return toSlackError(error, 'Failed to add emoji alias');
41
+ }
42
+ },
43
+ });
44
+ export const slackRenameEmoji = tool({
45
+ description: 'Rename a custom emoji, updating all its instances. The new name must be unique in the workspace.',
46
+ inputSchema: z.object({
47
+ slackToken: tokenField,
48
+ name: z.string().describe('Current emoji name (colons optional)'),
49
+ newName: z.string().describe('New unique emoji name'),
50
+ }),
51
+ execute: async ({ slackToken, name, newName }) => {
52
+ try {
53
+ const missing = requireToken(slackToken);
54
+ if (missing)
55
+ return missing;
56
+ return await slackApi(slackToken, 'admin.emoji.rename', { name, new_name: newName });
57
+ }
58
+ catch (error) {
59
+ return toSlackError(error, 'Failed to rename emoji');
60
+ }
61
+ },
62
+ });
63
+ export const slackRemoveEmoji = tool({
64
+ description: 'Remove a custom emoji across the Enterprise Grid org. Confirm with the user first.',
65
+ inputSchema: z.object({
66
+ slackToken: tokenField,
67
+ name: z.string().describe('Emoji name to remove (colons optional)'),
68
+ }),
69
+ execute: async ({ slackToken, name }) => {
70
+ try {
71
+ const missing = requireToken(slackToken);
72
+ if (missing)
73
+ return missing;
74
+ return await slackApi(slackToken, 'admin.emoji.remove', { name });
75
+ }
76
+ catch (error) {
77
+ return toSlackError(error, 'Failed to remove emoji');
78
+ }
79
+ },
80
+ });
81
+ export const slackListCustomEmojis = tool({
82
+ description: 'List workspace custom emojis (image URLs or alias: references). Unicode emojis, usage stats, and dates are not included. Optionally include Unicode categories.',
83
+ inputSchema: z.object({
84
+ slackToken: tokenField,
85
+ includeCategories: z.boolean().optional().describe('Include Unicode emoji categories'),
86
+ }),
87
+ execute: async ({ slackToken, includeCategories }) => {
88
+ try {
89
+ const missing = requireToken(slackToken);
90
+ if (missing)
91
+ return missing;
92
+ return await slackApi(slackToken, 'emoji.list', { include_categories: includeCategories });
93
+ }
94
+ catch (error) {
95
+ return toSlackError(error, 'Failed to list custom emojis');
96
+ }
97
+ },
98
+ });
99
+ export const slackListAdminEmoji = tool({
100
+ description: 'List custom emoji across an Enterprise Grid org (admin token required). For a single workspace use slackListCustomEmojis. Paginate with cursor.',
101
+ inputSchema: z.object({
102
+ slackToken: tokenField,
103
+ limit: z.number().min(1).max(1000).optional().describe('Emojis per page (max 1000)'),
104
+ cursor: z.string().optional().describe('Pagination cursor from a previous response'),
105
+ }),
106
+ execute: async ({ slackToken, limit, cursor }) => {
107
+ try {
108
+ const missing = requireToken(slackToken);
109
+ if (missing)
110
+ return missing;
111
+ return await slackApi(slackToken, 'admin.emoji.list', { limit, cursor });
112
+ }
113
+ catch (error) {
114
+ return toSlackError(error, 'Failed to list admin emoji');
115
+ }
116
+ },
117
+ });
118
+ //# sourceMappingURL=emoji.js.map