@bubblelab/bubble-core 0.1.11 → 0.1.13
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.
- package/dist/bubble-bundle.d.ts +183 -117
- package/dist/bubble-factory.d.ts +2 -3
- package/dist/bubble-factory.d.ts.map +1 -1
- package/dist/bubble-factory.js +28 -96
- package/dist/bubble-factory.js.map +1 -1
- package/dist/bubbles/service-bubble/ai-agent.d.ts +14 -14
- package/dist/bubbles/service-bubble/ai-agent.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/ai-agent.js +3 -6
- package/dist/bubbles/service-bubble/ai-agent.js.map +1 -1
- package/dist/bubbles/service-bubble/apify/apify.d.ts +5 -5
- package/dist/bubbles/service-bubble/apify/apify.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/apify/apify.js +20 -8
- package/dist/bubbles/service-bubble/apify/apify.js.map +1 -1
- package/dist/bubbles/service-bubble/browserbase/browserbase.d.ts +542 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.d.ts +37 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.js +203 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.integration.flow.js.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.js +593 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.js.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.schema.d.ts +518 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.schema.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.schema.js +311 -0
- package/dist/bubbles/service-bubble/browserbase/browserbase.schema.js.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/index.d.ts +3 -0
- package/dist/bubbles/service-bubble/browserbase/index.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/browserbase/index.js +3 -0
- package/dist/bubbles/service-bubble/browserbase/index.js.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.d.ts +1358 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.js +219 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.js.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.schema.d.ts +1604 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.schema.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.schema.js +194 -0
- package/dist/bubbles/service-bubble/crustdata/crustdata.schema.js.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/index.d.ts +3 -0
- package/dist/bubbles/service-bubble/crustdata/index.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/crustdata/index.js +3 -0
- package/dist/bubbles/service-bubble/crustdata/index.js.map +1 -0
- package/dist/bubbles/service-bubble/firecrawl.d.ts +4 -4
- package/dist/bubbles/service-bubble/firecrawl.js +1 -1
- package/dist/bubbles/service-bubble/firecrawl.js.map +1 -1
- package/dist/bubbles/service-bubble/github.d.ts +0 -6
- package/dist/bubbles/service-bubble/github.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/github.js +1 -7
- package/dist/bubbles/service-bubble/github.js.map +1 -1
- package/dist/bubbles/service-bubble/gmail.d.ts +84 -84
- package/dist/bubbles/service-bubble/google-drive.d.ts +32 -32
- package/dist/bubbles/service-bubble/http.d.ts +13 -1
- package/dist/bubbles/service-bubble/http.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/http.integration.flow.d.ts +49 -0
- package/dist/bubbles/service-bubble/http.integration.flow.d.ts.map +1 -0
- package/dist/bubbles/service-bubble/http.integration.flow.js +425 -0
- package/dist/bubbles/service-bubble/http.integration.flow.js.map +1 -0
- package/dist/bubbles/service-bubble/http.js +40 -4
- package/dist/bubbles/service-bubble/http.js.map +1 -1
- package/dist/bubbles/service-bubble/resend.d.ts +4 -4
- package/dist/bubbles/service-bubble/slack.d.ts +978 -35
- package/dist/bubbles/service-bubble/slack.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/slack.js +320 -26
- package/dist/bubbles/service-bubble/slack.js.map +1 -1
- package/dist/bubbles/service-bubble/storage.d.ts +1 -1
- package/dist/bubbles/service-bubble/storage.d.ts.map +1 -1
- package/dist/bubbles/service-bubble/storage.js +2 -2
- package/dist/bubbles/service-bubble/storage.js.map +1 -1
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.d.ts +494 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.d.ts +31 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.js +100 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.integration.flow.js.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.js +1301 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.d.ts +473 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.js +230 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/amazon-shopping-tool.schema.js.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.d.ts +3 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.js +3 -0
- package/dist/bubbles/tool-bubble/amazon-shopping-tool/index.js.map +1 -0
- package/dist/bubbles/tool-bubble/bubbleflow-validation-tool.d.ts +8 -8
- package/dist/bubbles/tool-bubble/company-enrichment-tool.d.ts +740 -0
- package/dist/bubbles/tool-bubble/company-enrichment-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/company-enrichment-tool.js +350 -0
- package/dist/bubbles/tool-bubble/company-enrichment-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/get-trigger-detail-tool.d.ts +146 -0
- package/dist/bubbles/tool-bubble/get-trigger-detail-tool.d.ts.map +1 -0
- package/dist/bubbles/tool-bubble/get-trigger-detail-tool.js +128 -0
- package/dist/bubbles/tool-bubble/get-trigger-detail-tool.js.map +1 -0
- package/dist/bubbles/tool-bubble/google-maps-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/google-maps-tool.js +1 -0
- package/dist/bubbles/tool-bubble/google-maps-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/instagram-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/instagram-tool.js +2 -0
- package/dist/bubbles/tool-bubble/instagram-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/linkedin-tool.d.ts +6 -6
- package/dist/bubbles/tool-bubble/linkedin-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/linkedin-tool.js +6 -4
- package/dist/bubbles/tool-bubble/linkedin-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/research-agent-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/research-agent-tool.js +6 -1
- package/dist/bubbles/tool-bubble/research-agent-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/tiktok-tool.d.ts +8 -8
- package/dist/bubbles/tool-bubble/twitter-tool.d.ts +10 -10
- package/dist/bubbles/tool-bubble/twitter-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/twitter-tool.js +3 -0
- package/dist/bubbles/tool-bubble/twitter-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts +6 -6
- package/dist/bubbles/tool-bubble/web-scrape-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/web-scrape-tool.js +4 -1
- package/dist/bubbles/tool-bubble/web-scrape-tool.js.map +1 -1
- package/dist/bubbles/tool-bubble/youtube-tool.d.ts.map +1 -1
- package/dist/bubbles/tool-bubble/youtube-tool.js +3 -0
- package/dist/bubbles/tool-bubble/youtube-tool.js.map +1 -1
- package/dist/bubbles/workflow-bubble/pdf-form-operations.workflow.d.ts +24 -24
- package/dist/bubbles/workflow-bubble/slack-formatter-agent.d.ts +8 -8
- package/dist/bubbles.json +64 -15
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/logging/BubbleLogger.d.ts +10 -0
- package/dist/logging/BubbleLogger.d.ts.map +1 -1
- package/dist/logging/BubbleLogger.js +14 -0
- package/dist/logging/BubbleLogger.js.map +1 -1
- package/dist/logging/StreamingBubbleLogger.d.ts +8 -0
- package/dist/logging/StreamingBubbleLogger.d.ts.map +1 -1
- package/dist/logging/StreamingBubbleLogger.js +29 -0
- package/dist/logging/StreamingBubbleLogger.js.map +1 -1
- package/dist/types/available-tools.d.ts +1 -1
- package/dist/types/available-tools.d.ts.map +1 -1
- package/dist/types/available-tools.js +7 -0
- package/dist/types/available-tools.js.map +1 -1
- package/dist/types/base-bubble-class.d.ts.map +1 -1
- package/dist/types/base-bubble-class.js +0 -8
- package/dist/types/base-bubble-class.js.map +1 -1
- package/dist/types/tool-bubble-class.d.ts.map +1 -1
- package/dist/types/tool-bubble-class.js +58 -8
- package/dist/types/tool-bubble-class.js.map +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/bubbles/service-bubble/slack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAmG3D,QAAA,MAAM,iBAAiB
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/bubbles/service-bubble/slack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAmG3D,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAofrB,CAAC;AAuQH,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAiUrB,CAAC;AAEH,KAAK,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,iBAAiB,CAAC,CAAC;AACtD,KAAK,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAIrD,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,WAAW,CAAC,WAAW,CAAC,IAAI,OAAO,CAC5E,WAAW,EACX;IAAE,SAAS,EAAE,CAAC,CAAA;CAAE,CACjB,CAAC;AAkBF,qBAAa,WAAW,CACtB,CAAC,SAAS,WAAW,GAAG,WAAW,CACnC,SAAQ,aAAa,CACrB,CAAC,EACD,OAAO,CAAC,WAAW,EAAE;IAAE,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;CAAE,CAAC,CACpD;IACc,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAQ/C,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAClC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAG,QAAQ,CAAU;IAC7C,MAAM,CAAC,QAAQ,CAAC,UAAU,WAAW;IACrC,MAAM,CAAC,QAAQ,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAqB;IAC3C,MAAM,CAAC,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAqB;IACjD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,8DAC6B;IAC7D,MAAM,CAAC,QAAQ,CAAC,eAAe,6sMAwI7B;IACF,MAAM,CAAC,QAAQ,CAAC,KAAK,WAAW;gBAG9B,MAAM,GAAE,CAEF,EACN,OAAO,CAAC,EAAE,aAAa,EACvB,UAAU,CAAC,EAAE,MAAM;cAKL,aAAa,CAC3B,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE;QAAE,SAAS,EAAE,CAAC,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC,CAAC;IA0D/D;;;;OAIG;YACW,gBAAgB;YAgDhB,WAAW;YAsDX,YAAY;YA4CZ,cAAc;YAoCd,WAAW;YAiCX,SAAS;YA2CT,sBAAsB;YAmDtB,gBAAgB;YAiDhB,aAAa;YAkCb,aAAa;YAyBb,WAAW;YAwBX,cAAc;YAwBd,UAAU;YA4JV,WAAW;YA6BX,eAAe;IA8C7B;;;OAGG;YACW,kBAAkB;IAsBhC,SAAS,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;YAclC,gBAAgB;CAuF/B"}
|
|
@@ -92,11 +92,11 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
92
92
|
z.object({
|
|
93
93
|
operation: z
|
|
94
94
|
.literal('send_message')
|
|
95
|
-
.describe('Send a message to a Slack channel or DM'),
|
|
95
|
+
.describe('Send a message to a Slack channel or DM. Required scopes: chat:write (add chat:write.public for public channels bot has not joined, add im:write to send DMs to users)'),
|
|
96
96
|
channel: z
|
|
97
97
|
.string()
|
|
98
98
|
.min(1, 'Channel ID or name is required')
|
|
99
|
-
.describe('Channel ID (e.g., C1234567890), channel name (e.g., general or #general), or user ID for DM'),
|
|
99
|
+
.describe('Channel ID (e.g., C1234567890), channel name (e.g., general or #general), or user ID for DM (e.g., U1234567890 - requires im:write scope)'),
|
|
100
100
|
text: z
|
|
101
101
|
.string()
|
|
102
102
|
.min(1, 'Message text is required')
|
|
@@ -150,7 +150,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
150
150
|
z.object({
|
|
151
151
|
operation: z
|
|
152
152
|
.literal('list_channels')
|
|
153
|
-
.describe('List all channels in the Slack workspace'),
|
|
153
|
+
.describe('List all channels in the Slack workspace. Required scopes: channels:read (public), groups:read (private), im:read (DMs), mpim:read (group DMs)'),
|
|
154
154
|
types: z
|
|
155
155
|
.array(ChannelTypes)
|
|
156
156
|
.optional()
|
|
@@ -181,7 +181,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
181
181
|
z.object({
|
|
182
182
|
operation: z
|
|
183
183
|
.literal('get_channel_info')
|
|
184
|
-
.describe('Get detailed information about a specific channel'),
|
|
184
|
+
.describe('Get detailed information about a specific channel. Required scopes: channels:read (public), groups:read (private), im:read (DMs), mpim:read (group DMs)'),
|
|
185
185
|
channel: z
|
|
186
186
|
.string()
|
|
187
187
|
.min(1, 'Channel ID or name is required')
|
|
@@ -200,7 +200,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
200
200
|
z.object({
|
|
201
201
|
operation: z
|
|
202
202
|
.literal('get_user_info')
|
|
203
|
-
.describe('Get detailed information about a specific user'),
|
|
203
|
+
.describe('Get detailed information about a specific user. Required scopes: users:read (add users:read.email to access email field)'),
|
|
204
204
|
user: z
|
|
205
205
|
.string()
|
|
206
206
|
.min(1, 'User ID is required')
|
|
@@ -219,7 +219,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
219
219
|
z.object({
|
|
220
220
|
operation: z
|
|
221
221
|
.literal('list_users')
|
|
222
|
-
.describe('List all users in the Slack workspace'),
|
|
222
|
+
.describe('List all users in the Slack workspace. Required scopes: users:read (add users:read.email to access email field)'),
|
|
223
223
|
limit: z
|
|
224
224
|
.number()
|
|
225
225
|
.min(1)
|
|
@@ -245,7 +245,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
245
245
|
z.object({
|
|
246
246
|
operation: z
|
|
247
247
|
.literal('get_conversation_history')
|
|
248
|
-
.describe('Retrieve message history from a channel or direct message'),
|
|
248
|
+
.describe('Retrieve message history from a channel or direct message. Required scopes: channels:history (public), groups:history (private), im:history (DMs), mpim:history (group DMs)'),
|
|
249
249
|
channel: z
|
|
250
250
|
.string()
|
|
251
251
|
.min(1, 'Channel ID or name is required')
|
|
@@ -283,7 +283,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
283
283
|
z.object({
|
|
284
284
|
operation: z
|
|
285
285
|
.literal('get_thread_replies')
|
|
286
|
-
.describe('Retrieve all replies to a thread in a channel'),
|
|
286
|
+
.describe('Retrieve all replies to a thread in a channel. Required scopes: channels:history (public), groups:history (private), im:history (DMs), mpim:history (group DMs)'),
|
|
287
287
|
channel: z
|
|
288
288
|
.string()
|
|
289
289
|
.min(1, 'Channel ID is required')
|
|
@@ -325,7 +325,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
325
325
|
z.object({
|
|
326
326
|
operation: z
|
|
327
327
|
.literal('update_message')
|
|
328
|
-
.describe('Update an existing message in a channel'),
|
|
328
|
+
.describe('Update an existing message in a channel. Required scopes: chat:write'),
|
|
329
329
|
channel: z
|
|
330
330
|
.string()
|
|
331
331
|
.min(1, 'Channel ID or name is required')
|
|
@@ -352,7 +352,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
352
352
|
z.object({
|
|
353
353
|
operation: z
|
|
354
354
|
.literal('delete_message')
|
|
355
|
-
.describe('Delete a message from a channel'),
|
|
355
|
+
.describe('Delete a message from a channel. Required scopes: chat:write. Note: Bot tokens can only delete messages posted by the bot; user tokens can delete any message the user has permission to delete'),
|
|
356
356
|
channel: z
|
|
357
357
|
.string()
|
|
358
358
|
.min(1, 'Channel ID or name is required')
|
|
@@ -370,7 +370,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
370
370
|
z.object({
|
|
371
371
|
operation: z
|
|
372
372
|
.literal('add_reaction')
|
|
373
|
-
.describe('Add an emoji reaction to a message'),
|
|
373
|
+
.describe('Add an emoji reaction to a message. Required scopes: reactions:write'),
|
|
374
374
|
name: z
|
|
375
375
|
.string()
|
|
376
376
|
.min(1, 'Emoji name is required')
|
|
@@ -392,7 +392,7 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
392
392
|
z.object({
|
|
393
393
|
operation: z
|
|
394
394
|
.literal('remove_reaction')
|
|
395
|
-
.describe('Remove an emoji reaction from a message'),
|
|
395
|
+
.describe('Remove an emoji reaction from a message. Required scopes: reactions:write'),
|
|
396
396
|
name: z
|
|
397
397
|
.string()
|
|
398
398
|
.min(1, 'Emoji name is required')
|
|
@@ -410,11 +410,25 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
410
410
|
.optional()
|
|
411
411
|
.describe('Object mapping credential types to values (injected at runtime)'),
|
|
412
412
|
}),
|
|
413
|
+
// Join channel operation
|
|
414
|
+
z.object({
|
|
415
|
+
operation: z
|
|
416
|
+
.literal('join_channel')
|
|
417
|
+
.describe('Join a public Slack channel. Required scopes: channels:join (bot token) or channels:write (user token)'),
|
|
418
|
+
channel: z
|
|
419
|
+
.string()
|
|
420
|
+
.min(1, 'Channel ID or name is required')
|
|
421
|
+
.describe('Channel ID (e.g., C1234567890) or channel name (e.g., general or #general) to join'),
|
|
422
|
+
credentials: z
|
|
423
|
+
.record(z.nativeEnum(CredentialType), z.string())
|
|
424
|
+
.optional()
|
|
425
|
+
.describe('Object mapping credential types to values (injected at runtime)'),
|
|
426
|
+
}),
|
|
413
427
|
// Upload file operation
|
|
414
428
|
z.object({
|
|
415
429
|
operation: z
|
|
416
430
|
.literal('upload_file')
|
|
417
|
-
.describe('Upload a file to a Slack channel'),
|
|
431
|
+
.describe('Upload a file to a Slack channel. Required scopes: files:write'),
|
|
418
432
|
channel: z
|
|
419
433
|
.string()
|
|
420
434
|
.min(1, 'Channel ID or name is required')
|
|
@@ -441,6 +455,47 @@ const SlackParamsSchema = z.discriminatedUnion('operation', [
|
|
|
441
455
|
.optional()
|
|
442
456
|
.describe('Object mapping credential types to values (injected at runtime)'),
|
|
443
457
|
}),
|
|
458
|
+
// Schedule message operation
|
|
459
|
+
z.object({
|
|
460
|
+
operation: z
|
|
461
|
+
.literal('schedule_message')
|
|
462
|
+
.describe('Schedule a message to be sent at a future time. Required scopes: chat:write. Max 120 days in advance.'),
|
|
463
|
+
channel: z
|
|
464
|
+
.string()
|
|
465
|
+
.min(1, 'Channel ID or name is required')
|
|
466
|
+
.describe('Channel ID (e.g., C1234567890), channel name (e.g., general or #general), or user ID for DM'),
|
|
467
|
+
text: z
|
|
468
|
+
.string()
|
|
469
|
+
.min(1, 'Message text is required')
|
|
470
|
+
.describe('Message text content'),
|
|
471
|
+
post_at: z
|
|
472
|
+
.number()
|
|
473
|
+
.int()
|
|
474
|
+
.positive()
|
|
475
|
+
.describe('Unix timestamp (seconds) for when to send the message. Must be within 120 days from now.'),
|
|
476
|
+
thread_ts: z
|
|
477
|
+
.string()
|
|
478
|
+
.optional()
|
|
479
|
+
.describe('Timestamp of parent message to reply in thread'),
|
|
480
|
+
blocks: z
|
|
481
|
+
.array(BlockElementSchema)
|
|
482
|
+
.optional()
|
|
483
|
+
.describe('Block Kit structured message blocks'),
|
|
484
|
+
unfurl_links: z
|
|
485
|
+
.boolean()
|
|
486
|
+
.optional()
|
|
487
|
+
.default(true)
|
|
488
|
+
.describe('Enable automatic link unfurling'),
|
|
489
|
+
unfurl_media: z
|
|
490
|
+
.boolean()
|
|
491
|
+
.optional()
|
|
492
|
+
.default(true)
|
|
493
|
+
.describe('Enable automatic media unfurling'),
|
|
494
|
+
credentials: z
|
|
495
|
+
.record(z.nativeEnum(CredentialType), z.string())
|
|
496
|
+
.optional()
|
|
497
|
+
.describe('Object mapping credential types to values (injected at runtime)'),
|
|
498
|
+
}),
|
|
444
499
|
]);
|
|
445
500
|
// Define Slack API response schemas for type safety
|
|
446
501
|
const SlackChannelSchema = z
|
|
@@ -863,6 +918,19 @@ const SlackResultSchema = z.discriminatedUnion('operation', [
|
|
|
863
918
|
error: z.string().describe('Error message if operation failed'),
|
|
864
919
|
success: z.boolean().describe('Whether the operation was successful'),
|
|
865
920
|
}),
|
|
921
|
+
z.object({
|
|
922
|
+
operation: z
|
|
923
|
+
.literal('join_channel')
|
|
924
|
+
.describe('Join a public Slack channel'),
|
|
925
|
+
ok: z.boolean().describe('Whether the Slack API call was successful'),
|
|
926
|
+
channel: SlackChannelSchema.optional().describe('Channel information object after joining'),
|
|
927
|
+
already_in_channel: z
|
|
928
|
+
.boolean()
|
|
929
|
+
.optional()
|
|
930
|
+
.describe('Whether the bot was already a member of the channel'),
|
|
931
|
+
error: z.string().describe('Error message if operation failed'),
|
|
932
|
+
success: z.boolean().describe('Whether the operation was successful'),
|
|
933
|
+
}),
|
|
866
934
|
z.object({
|
|
867
935
|
operation: z
|
|
868
936
|
.literal('upload_file')
|
|
@@ -956,6 +1024,27 @@ const SlackResultSchema = z.discriminatedUnion('operation', [
|
|
|
956
1024
|
error: z.string().describe('Error message if operation failed'),
|
|
957
1025
|
success: z.boolean().describe('Whether the operation was successful'),
|
|
958
1026
|
}),
|
|
1027
|
+
// Schedule message result
|
|
1028
|
+
z.object({
|
|
1029
|
+
operation: z
|
|
1030
|
+
.literal('schedule_message')
|
|
1031
|
+
.describe('Schedule a message to be sent at a future time'),
|
|
1032
|
+
ok: z.boolean().describe('Whether the Slack API call was successful'),
|
|
1033
|
+
channel: z
|
|
1034
|
+
.string()
|
|
1035
|
+
.optional()
|
|
1036
|
+
.describe('Channel ID where message will be posted'),
|
|
1037
|
+
scheduled_message_id: z
|
|
1038
|
+
.string()
|
|
1039
|
+
.optional()
|
|
1040
|
+
.describe('Unique identifier for the scheduled message'),
|
|
1041
|
+
post_at: z
|
|
1042
|
+
.number()
|
|
1043
|
+
.optional()
|
|
1044
|
+
.describe('Unix timestamp when message will be posted'),
|
|
1045
|
+
error: z.string().describe('Error message if operation failed'),
|
|
1046
|
+
success: z.boolean().describe('Whether the operation was successful'),
|
|
1047
|
+
}),
|
|
959
1048
|
]);
|
|
960
1049
|
export class SlackBubble extends ServiceBubble {
|
|
961
1050
|
async testCredential() {
|
|
@@ -974,19 +1063,141 @@ export class SlackBubble extends ServiceBubble {
|
|
|
974
1063
|
static resultSchema = SlackResultSchema;
|
|
975
1064
|
static shortDescription = 'Slack integration for messaging and workspace management';
|
|
976
1065
|
static longDescription = `
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
1066
|
+
Comprehensive Slack integration for messaging and workspace management.
|
|
1067
|
+
Supports both Bot tokens (xoxb-) and User tokens (xoxp-).
|
|
1068
|
+
|
|
1069
|
+
## Token Types: Bot vs User
|
|
1070
|
+
|
|
1071
|
+
| Aspect | Bot Token (xoxb-) | User Token (xoxp-) |
|
|
1072
|
+
|--------|-------------------|-------------------|
|
|
1073
|
+
| Identity | Acts as the bot | Acts as the authorizing user |
|
|
1074
|
+
| Channel access | Only channels bot is added to | All channels user can access |
|
|
1075
|
+
| Message deletion | Can only delete bot's own messages | Can delete any message user has permission for |
|
|
1076
|
+
| Message posting | Messages appear from the bot | Messages appear from the user |
|
|
1077
|
+
| Scope location | "Bot Token Scopes" section | "User Token Scopes" section |
|
|
1078
|
+
|
|
1079
|
+
Choose **Bot token** for: Automations, notifications, bots that act independently
|
|
1080
|
+
Choose **User token** for: Acting on behalf of a user, accessing user's private channels
|
|
1081
|
+
|
|
1082
|
+
## Required OAuth Scopes by Operation
|
|
1083
|
+
|
|
1084
|
+
Configure in your Slack App: OAuth & Permissions page
|
|
1085
|
+
Official docs: https://docs.slack.dev/reference/scopes/
|
|
1086
|
+
|
|
1087
|
+
### Messaging Operations
|
|
1088
|
+
| Operation | Bot Token Scope | User Token Scope |
|
|
1089
|
+
|------------------|-----------------|------------------|
|
|
1090
|
+
| send_message | chat:write (+ chat:write.public for any public channel) | chat:write |
|
|
1091
|
+
| send_message (to user DM) | chat:write + im:write | chat:write + im:write |
|
|
1092
|
+
| schedule_message | chat:write | chat:write |
|
|
1093
|
+
| update_message | chat:write | chat:write |
|
|
1094
|
+
| delete_message | chat:write (own messages only) | chat:write (any deletable) |
|
|
1095
|
+
|
|
1096
|
+
**Note on DMs**: When you pass a user ID (e.g., U12345678) as the channel, SlackBubble automatically opens a DM conversation with that user. This requires the \`im:write\` scope in addition to \`chat:write\`.
|
|
1097
|
+
|
|
1098
|
+
### Channel & Conversation Operations
|
|
1099
|
+
| Operation | Bot Token Scope | User Token Scope |
|
|
1100
|
+
|--------------------------|-----------------|------------------|
|
|
1101
|
+
| list_channels | channels:read, groups:read | channels:read, groups:read |
|
|
1102
|
+
| get_channel_info | channels:read OR groups:read | channels:read OR groups:read |
|
|
1103
|
+
| join_channel | channels:join | channels:write |
|
|
1104
|
+
| get_conversation_history | channels:history, groups:history | channels:history, groups:history |
|
|
1105
|
+
| get_thread_replies | channels:history, groups:history | channels:history, groups:history |
|
|
1106
|
+
|
|
1107
|
+
### User Operations
|
|
1108
|
+
| Operation | Bot Token Scope | User Token Scope |
|
|
1109
|
+
|---------------|-----------------|------------------|
|
|
1110
|
+
| list_users | users:read | users:read |
|
|
1111
|
+
| get_user_info | users:read | users:read |
|
|
1112
|
+
| (email field) | + users:read.email | + users:read.email |
|
|
1113
|
+
|
|
1114
|
+
### Reaction & File Operations
|
|
1115
|
+
| Operation | Bot Token Scope | User Token Scope |
|
|
1116
|
+
|-----------------|-----------------|------------------|
|
|
1117
|
+
| add_reaction | reactions:write | reactions:write |
|
|
1118
|
+
| remove_reaction | reactions:write | reactions:write |
|
|
1119
|
+
| upload_file | files:write | files:write |
|
|
1120
|
+
|
|
1121
|
+
### Direct Message (DM) Scopes
|
|
1122
|
+
For operations on DMs and group DMs, add these additional scopes:
|
|
1123
|
+
| Scope | Purpose |
|
|
1124
|
+
|-------|---------|
|
|
1125
|
+
| im:read | Access direct message channel info |
|
|
1126
|
+
| im:write | Start direct message conversations |
|
|
1127
|
+
| im:history | Read direct message history |
|
|
1128
|
+
| mpim:read | Access group DM channel info |
|
|
1129
|
+
| mpim:write | Start group DM conversations |
|
|
1130
|
+
| mpim:history | Read group DM history |
|
|
1131
|
+
|
|
1132
|
+
## Quick Setup Guide
|
|
1133
|
+
|
|
1134
|
+
### For Bot Tokens (xoxb-)
|
|
1135
|
+
1. Go to https://api.slack.com/apps → select your app
|
|
1136
|
+
2. Navigate to "OAuth & Permissions"
|
|
1137
|
+
3. Scroll to "Bot Token Scopes" section → add required scopes
|
|
1138
|
+
4. Click "Install to Workspace" (or "Reinstall" if updating)
|
|
1139
|
+
5. Copy "Bot User OAuth Token" (starts with xoxb-)
|
|
1140
|
+
|
|
1141
|
+
### For User Tokens (xoxp-)
|
|
1142
|
+
1. Go to https://api.slack.com/apps → select your app
|
|
1143
|
+
2. Navigate to "OAuth & Permissions"
|
|
1144
|
+
3. Scroll to "User Token Scopes" section → add required scopes
|
|
1145
|
+
4. Click "Install to Workspace" (or "Reinstall" if updating)
|
|
1146
|
+
5. Copy "User OAuth Token" (starts with xoxp-)
|
|
1147
|
+
|
|
1148
|
+
## Minimum Recommended Scopes
|
|
1149
|
+
For Bot Token: chat:write, channels:read, groups:read, users:read, channels:history
|
|
1150
|
+
For User Token: chat:write, channels:read, groups:read, users:read, channels:history, channels:write
|
|
1151
|
+
|
|
1152
|
+
## Setting Up Slack Triggers (Event Subscriptions)
|
|
1153
|
+
|
|
1154
|
+
To trigger BubbleFlow workflows from Slack events (like @mentions), you need to configure Event Subscriptions.
|
|
1155
|
+
Official docs: https://docs.slack.dev/apis/events-api/
|
|
1156
|
+
|
|
1157
|
+
### Supported Trigger Events
|
|
1158
|
+
| Trigger Type | Slack Event | Required Scope |
|
|
1159
|
+
|--------------|-------------|----------------|
|
|
1160
|
+
| slack/bot_mentioned | app_mention | app_mentions:read |
|
|
1161
|
+
|
|
1162
|
+
### Step-by-Step Event Subscriptions Setup
|
|
1163
|
+
|
|
1164
|
+
**Step 1: Get your webhook URL from Bubble Lab**
|
|
1165
|
+
- In Bubble Lab, create a flow with a Slack trigger (e.g., slack/bot_mentioned)
|
|
1166
|
+
- Copy the webhook URL provided (format: https://api.bubblelab.ai/webhook/{userId}/{path})
|
|
1167
|
+
|
|
1168
|
+
**Step 2: Enable Event Subscriptions in Slack**
|
|
1169
|
+
1. Go to https://api.slack.com/apps → select your app
|
|
1170
|
+
2. Click "Event Subscriptions" in the left sidebar
|
|
1171
|
+
3. Toggle "Enable Events" to ON
|
|
1172
|
+
|
|
1173
|
+
**Step 3: Configure Request URL**
|
|
1174
|
+
1. Paste your Bubble Lab webhook URL in the "Request URL" field
|
|
1175
|
+
2. Slack will send a verification challenge to your URL
|
|
1176
|
+
3. Wait for the green "Verified" checkmark (Bubble Lab handles verification automatically)
|
|
1177
|
+
4. If verification fails, click "Retry" (your server may need a moment to respond)
|
|
1178
|
+
|
|
1179
|
+
**Step 4: Subscribe to Bot Events**
|
|
1180
|
+
1. Scroll down to "Subscribe to bot events"
|
|
1181
|
+
2. Click "Add Bot User Event"
|
|
1182
|
+
3. Add the events you need:
|
|
1183
|
+
- For @mentions: add "app_mention"
|
|
1184
|
+
4. Click "Save Changes"
|
|
1185
|
+
|
|
1186
|
+
**Step 5: Add Required OAuth Scopes**
|
|
1187
|
+
1. Go to "OAuth & Permissions" in the sidebar
|
|
1188
|
+
2. Under "Bot Token Scopes", add:
|
|
1189
|
+
- app_mentions:read (for app_mention events)
|
|
1190
|
+
3. Click "Save"
|
|
1191
|
+
|
|
1192
|
+
**Step 6: Reinstall Your App**
|
|
1193
|
+
1. Go to "Install App" in the sidebar
|
|
1194
|
+
2. Click "Reinstall to Workspace"
|
|
1195
|
+
3. Authorize the new permissions
|
|
1196
|
+
|
|
1197
|
+
### Troubleshooting Event Subscriptions
|
|
1198
|
+
- **Verification failed**: Ensure your webhook URL is correct and accessible
|
|
1199
|
+
- **Not receiving events**: Check that you added the correct scopes AND reinstalled the app
|
|
1200
|
+
- **Bot not responding**: Make sure the bot is invited to the channel where it's mentioned
|
|
990
1201
|
`;
|
|
991
1202
|
static alias = 'slack';
|
|
992
1203
|
constructor(params = {
|
|
@@ -1025,6 +1236,10 @@ export class SlackBubble extends ServiceBubble {
|
|
|
1025
1236
|
return await this.removeReaction(this.params);
|
|
1026
1237
|
case 'upload_file':
|
|
1027
1238
|
return await this.uploadFile(this.params);
|
|
1239
|
+
case 'join_channel':
|
|
1240
|
+
return await this.joinChannel(this.params);
|
|
1241
|
+
case 'schedule_message':
|
|
1242
|
+
return await this.scheduleMessage(this.params);
|
|
1028
1243
|
default:
|
|
1029
1244
|
throw new Error(`Unsupported operation: ${operation}`);
|
|
1030
1245
|
}
|
|
@@ -1054,6 +1269,12 @@ export class SlackBubble extends ServiceBubble {
|
|
|
1054
1269
|
if (/^[CGD][A-Z0-9]+$/i.test(channelInput)) {
|
|
1055
1270
|
return channelInput;
|
|
1056
1271
|
}
|
|
1272
|
+
// Check if input is a user ID (starts with U or W for enterprise users)
|
|
1273
|
+
// If so, open a DM conversation with them to get the DM channel ID
|
|
1274
|
+
if (/^[UW][A-Z0-9]+$/i.test(channelInput)) {
|
|
1275
|
+
const dmChannel = await this.openDmConversation(channelInput);
|
|
1276
|
+
return dmChannel;
|
|
1277
|
+
}
|
|
1057
1278
|
// Remove # prefix if present
|
|
1058
1279
|
const channelName = channelInput.replace(/^#/, '');
|
|
1059
1280
|
// Get all channels to find the matching name
|
|
@@ -1453,6 +1674,79 @@ export class SlackBubble extends ServiceBubble {
|
|
|
1453
1674
|
};
|
|
1454
1675
|
}
|
|
1455
1676
|
}
|
|
1677
|
+
async joinChannel(params) {
|
|
1678
|
+
const { channel } = params;
|
|
1679
|
+
// Resolve channel name to ID if needed
|
|
1680
|
+
const resolvedChannel = await this.resolveChannelId(channel);
|
|
1681
|
+
const body = {
|
|
1682
|
+
channel: resolvedChannel,
|
|
1683
|
+
};
|
|
1684
|
+
const response = await this.makeSlackApiCall('conversations.join', body);
|
|
1685
|
+
return {
|
|
1686
|
+
operation: 'join_channel',
|
|
1687
|
+
ok: response.ok,
|
|
1688
|
+
channel: response.ok && response.channel
|
|
1689
|
+
? SlackChannelSchema.parse(response.channel)
|
|
1690
|
+
: undefined,
|
|
1691
|
+
already_in_channel: response.ok
|
|
1692
|
+
? response.already_in_channel
|
|
1693
|
+
: undefined,
|
|
1694
|
+
error: !response.ok ? JSON.stringify(response, null, 2) : '',
|
|
1695
|
+
success: response.ok,
|
|
1696
|
+
};
|
|
1697
|
+
}
|
|
1698
|
+
async scheduleMessage(params) {
|
|
1699
|
+
const { channel, text, post_at, thread_ts, blocks, unfurl_links, unfurl_media, } = params;
|
|
1700
|
+
// Resolve channel name to ID if needed
|
|
1701
|
+
const resolvedChannel = await this.resolveChannelId(channel);
|
|
1702
|
+
const body = {
|
|
1703
|
+
channel: resolvedChannel,
|
|
1704
|
+
text,
|
|
1705
|
+
post_at,
|
|
1706
|
+
};
|
|
1707
|
+
if (thread_ts)
|
|
1708
|
+
body.thread_ts = thread_ts;
|
|
1709
|
+
if (blocks)
|
|
1710
|
+
body.blocks = JSON.stringify(blocks);
|
|
1711
|
+
if (unfurl_links !== undefined)
|
|
1712
|
+
body.unfurl_links = unfurl_links;
|
|
1713
|
+
if (unfurl_media !== undefined)
|
|
1714
|
+
body.unfurl_media = unfurl_media;
|
|
1715
|
+
const response = await this.makeSlackApiCall('chat.scheduleMessage', body);
|
|
1716
|
+
return {
|
|
1717
|
+
operation: 'schedule_message',
|
|
1718
|
+
ok: response.ok,
|
|
1719
|
+
channel: response.ok
|
|
1720
|
+
? response.channel
|
|
1721
|
+
: undefined,
|
|
1722
|
+
scheduled_message_id: response.ok
|
|
1723
|
+
? response.scheduled_message_id
|
|
1724
|
+
: undefined,
|
|
1725
|
+
post_at: response.ok
|
|
1726
|
+
? response.post_at
|
|
1727
|
+
: undefined,
|
|
1728
|
+
error: !response.ok ? JSON.stringify(response, null, 2) : '',
|
|
1729
|
+
success: response.ok,
|
|
1730
|
+
};
|
|
1731
|
+
}
|
|
1732
|
+
/**
|
|
1733
|
+
* Opens a DM conversation with a user and returns the DM channel ID.
|
|
1734
|
+
* Required scope: im:write (for bot tokens) or im:write (for user tokens)
|
|
1735
|
+
*/
|
|
1736
|
+
async openDmConversation(userId) {
|
|
1737
|
+
const response = await this.makeSlackApiCall('conversations.open', {
|
|
1738
|
+
users: userId,
|
|
1739
|
+
});
|
|
1740
|
+
if (!response.ok) {
|
|
1741
|
+
throw new Error(`Failed to open DM with user ${userId}: ${response.error}. ` +
|
|
1742
|
+
`Make sure you have the 'im:write' scope enabled in your Slack app.`);
|
|
1743
|
+
}
|
|
1744
|
+
const channel = response.channel;
|
|
1745
|
+
if (!channel?.id) {
|
|
1746
|
+
throw new Error(`Failed to get DM channel ID for user ${userId}. Unexpected API response.`);
|
|
1747
|
+
}
|
|
1748
|
+
return channel.id;
|
|
1749
|
+
}
|
|
1456
1750
|
chooseCredential() {
|
|
1457
1751
|
const { credentials } = this.params;
|
|
1458
1752
|
// If no credentials were injected, return undefined
|