@5ss/ai-tools 2.11.1
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/CHANGELOG.md +112 -0
- package/LICENSE +21 -0
- package/README.md +221 -0
- package/dist/ai-sdk/index.d.ts +15 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +24 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/artifact-D064mHfK.js +44 -0
- package/dist/artifact-D064mHfK.js.map +1 -0
- package/dist/artifacts-O8g-40Pw.js +404 -0
- package/dist/artifacts-O8g-40Pw.js.map +1 -0
- package/dist/aws-json-CecFqzqX.js +23 -0
- package/dist/aws-json-CecFqzqX.js.map +1 -0
- package/dist/aws-service-msttbPrz.js +58 -0
- package/dist/aws-service-msttbPrz.js.map +1 -0
- package/dist/batch-BMM5dXqL.d.ts +22 -0
- package/dist/batch-BMM5dXqL.d.ts.map +1 -0
- package/dist/batch-Co1ujeAW.js +67 -0
- package/dist/batch-Co1ujeAW.js.map +1 -0
- package/dist/bedrock-agentcore-browser-a_qOs-NR.js +182 -0
- package/dist/bedrock-agentcore-browser-a_qOs-NR.js.map +1 -0
- package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js +357 -0
- package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js.map +1 -0
- package/dist/bytes-BxpimpQx.js +45 -0
- package/dist/bytes-BxpimpQx.js.map +1 -0
- package/dist/client-CCKGsTeI.js +743 -0
- package/dist/client-CCKGsTeI.js.map +1 -0
- package/dist/cloudflare/index.d.ts +37 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +41 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare-browser-B6Yolpin.js +428 -0
- package/dist/cloudflare-browser-B6Yolpin.js.map +1 -0
- package/dist/cloudflare-email-Dy0KHeDf.js +197 -0
- package/dist/cloudflare-email-Dy0KHeDf.js.map +1 -0
- package/dist/cloudflare-sandbox-Dp_uNaqW.js +982 -0
- package/dist/cloudflare-sandbox-Dp_uNaqW.js.map +1 -0
- package/dist/content-type-CORxaxcv.js +49 -0
- package/dist/content-type-CORxaxcv.js.map +1 -0
- package/dist/core/index.d.ts +4 -0
- package/dist/core/index.js +204 -0
- package/dist/core/index.js.map +1 -0
- package/dist/define-CvpJ_pNP.js +115 -0
- package/dist/define-CvpJ_pNP.js.map +1 -0
- package/dist/errors-DoSpNHvs.js +20 -0
- package/dist/errors-DoSpNHvs.js.map +1 -0
- package/dist/errors-aKhko9T1.d.ts +18 -0
- package/dist/errors-aKhko9T1.d.ts.map +1 -0
- package/dist/eventbridge-scheduler-Bh6GqZY2.js +349 -0
- package/dist/eventbridge-scheduler-Bh6GqZY2.js.map +1 -0
- package/dist/framework-context-DVIIY8ZO.js +24 -0
- package/dist/framework-context-DVIIY8ZO.js.map +1 -0
- package/dist/gotenberg-NuJjxyln.js +291 -0
- package/dist/gotenberg-NuJjxyln.js.map +1 -0
- package/dist/http/index.d.ts +47 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +3 -0
- package/dist/http-service-DDNCO1s4.js +254 -0
- package/dist/http-service-DDNCO1s4.js.map +1 -0
- package/dist/http-service-T7E5UjP8.d.ts +80 -0
- package/dist/http-service-T7E5UjP8.d.ts.map +1 -0
- package/dist/imessage-BSAFOI8Z.js +154 -0
- package/dist/imessage-BSAFOI8Z.js.map +1 -0
- package/dist/index-BU4gmYO8.d.ts +254 -0
- package/dist/index-BU4gmYO8.d.ts.map +1 -0
- package/dist/index-CCivzmxO.d.ts +188 -0
- package/dist/index-CCivzmxO.d.ts.map +1 -0
- package/dist/index-CLmTrcu5.d.ts +22 -0
- package/dist/index-CLmTrcu5.d.ts.map +1 -0
- package/dist/index-CZX5OeOF.d.ts +235 -0
- package/dist/index-CZX5OeOF.d.ts.map +1 -0
- package/dist/index-CdFmEfZO.d.ts +359 -0
- package/dist/index-CdFmEfZO.d.ts.map +1 -0
- package/dist/index-Cuh6eMWc.d.ts +285 -0
- package/dist/index-Cuh6eMWc.d.ts.map +1 -0
- package/dist/index-DuOGj7vc.d.ts +107 -0
- package/dist/index-DuOGj7vc.d.ts.map +1 -0
- package/dist/index-ccZ1XOHw.d.ts +69 -0
- package/dist/index-ccZ1XOHw.d.ts.map +1 -0
- package/dist/index-n8JTpNf1.d.ts +247 -0
- package/dist/index-n8JTpNf1.d.ts.map +1 -0
- package/dist/index-pwW1OsOx.d.ts +134 -0
- package/dist/index-pwW1OsOx.d.ts.map +1 -0
- package/dist/index-zK1ZwS4m.d.ts +347 -0
- package/dist/index-zK1ZwS4m.d.ts.map +1 -0
- package/dist/limits-hjrO8zUG.js +80 -0
- package/dist/limits-hjrO8zUG.js.map +1 -0
- package/dist/mastra/index.d.ts +14 -0
- package/dist/mastra/index.d.ts.map +1 -0
- package/dist/mastra/index.js +26 -0
- package/dist/mastra/index.js.map +1 -0
- package/dist/mastra-vector-Dhc6XZ8l.js +234 -0
- package/dist/mastra-vector-Dhc6XZ8l.js.map +1 -0
- package/dist/mcp/index.d.ts +80 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +97 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/modules/artifacts/index.d.ts +337 -0
- package/dist/modules/artifacts/index.d.ts.map +1 -0
- package/dist/modules/artifacts/index.js +348 -0
- package/dist/modules/artifacts/index.js.map +1 -0
- package/dist/modules/browser/index.d.ts +516 -0
- package/dist/modules/browser/index.d.ts.map +1 -0
- package/dist/modules/browser/index.js +475 -0
- package/dist/modules/browser/index.js.map +1 -0
- package/dist/modules/calendar/index.d.ts +93 -0
- package/dist/modules/calendar/index.d.ts.map +1 -0
- package/dist/modules/calendar/index.js +131 -0
- package/dist/modules/calendar/index.js.map +1 -0
- package/dist/modules/code-sandbox/index.d.ts +317 -0
- package/dist/modules/code-sandbox/index.d.ts.map +1 -0
- package/dist/modules/code-sandbox/index.js +537 -0
- package/dist/modules/code-sandbox/index.js.map +1 -0
- package/dist/modules/content-type/index.d.ts +22 -0
- package/dist/modules/content-type/index.d.ts.map +1 -0
- package/dist/modules/content-type/index.js +66 -0
- package/dist/modules/content-type/index.js.map +1 -0
- package/dist/modules/crypto/index.d.ts +115 -0
- package/dist/modules/crypto/index.d.ts.map +1 -0
- package/dist/modules/crypto/index.js +139 -0
- package/dist/modules/crypto/index.js.map +1 -0
- package/dist/modules/document/index.d.ts +575 -0
- package/dist/modules/document/index.d.ts.map +1 -0
- package/dist/modules/document/index.js +444 -0
- package/dist/modules/document/index.js.map +1 -0
- package/dist/modules/document-extract/index.d.ts +438 -0
- package/dist/modules/document-extract/index.d.ts.map +1 -0
- package/dist/modules/document-extract/index.js +127 -0
- package/dist/modules/document-extract/index.js.map +1 -0
- package/dist/modules/document-render/index.d.ts +336 -0
- package/dist/modules/document-render/index.d.ts.map +1 -0
- package/dist/modules/document-render/index.js +155 -0
- package/dist/modules/document-render/index.js.map +1 -0
- package/dist/modules/email/index.d.ts +311 -0
- package/dist/modules/email/index.d.ts.map +1 -0
- package/dist/modules/email/index.js +167 -0
- package/dist/modules/email/index.js.map +1 -0
- package/dist/modules/email-message/index.d.ts +95 -0
- package/dist/modules/email-message/index.d.ts.map +1 -0
- package/dist/modules/email-message/index.js +264 -0
- package/dist/modules/email-message/index.js.map +1 -0
- package/dist/modules/file-convert/index.d.ts +273 -0
- package/dist/modules/file-convert/index.d.ts.map +1 -0
- package/dist/modules/file-convert/index.js +103 -0
- package/dist/modules/file-convert/index.js.map +1 -0
- package/dist/modules/files/index.d.ts +452 -0
- package/dist/modules/files/index.d.ts.map +1 -0
- package/dist/modules/files/index.js +733 -0
- package/dist/modules/files/index.js.map +1 -0
- package/dist/modules/image/index.d.ts +342 -0
- package/dist/modules/image/index.d.ts.map +1 -0
- package/dist/modules/image/index.js +281 -0
- package/dist/modules/image/index.js.map +1 -0
- package/dist/modules/messaging/index.d.ts +608 -0
- package/dist/modules/messaging/index.d.ts.map +1 -0
- package/dist/modules/messaging/index.js +1067 -0
- package/dist/modules/messaging/index.js.map +1 -0
- package/dist/modules/pdf/index.d.ts +287 -0
- package/dist/modules/pdf/index.d.ts.map +1 -0
- package/dist/modules/pdf/index.js +259 -0
- package/dist/modules/pdf/index.js.map +1 -0
- package/dist/modules/presentation/index.d.ts +247 -0
- package/dist/modules/presentation/index.d.ts.map +1 -0
- package/dist/modules/presentation/index.js +12657 -0
- package/dist/modules/presentation/index.js.map +1 -0
- package/dist/modules/queue/index.d.ts +129 -0
- package/dist/modules/queue/index.d.ts.map +1 -0
- package/dist/modules/queue/index.js +131 -0
- package/dist/modules/queue/index.js.map +1 -0
- package/dist/modules/rag/index.d.ts +250 -0
- package/dist/modules/rag/index.d.ts.map +1 -0
- package/dist/modules/rag/index.js +366 -0
- package/dist/modules/rag/index.js.map +1 -0
- package/dist/modules/scheduler/index.d.ts +216 -0
- package/dist/modules/scheduler/index.d.ts.map +1 -0
- package/dist/modules/scheduler/index.js +153 -0
- package/dist/modules/scheduler/index.js.map +1 -0
- package/dist/modules/skills/index.d.ts +205 -0
- package/dist/modules/skills/index.d.ts.map +1 -0
- package/dist/modules/skills/index.js +203 -0
- package/dist/modules/skills/index.js.map +1 -0
- package/dist/modules/tasks/index.d.ts +287 -0
- package/dist/modules/tasks/index.d.ts.map +1 -0
- package/dist/modules/tasks/index.js +207 -0
- package/dist/modules/tasks/index.js.map +1 -0
- package/dist/modules/vector-store/index.d.ts +3 -0
- package/dist/modules/vector-store/index.js +3 -0
- package/dist/modules/web-fetch/index.d.ts +99 -0
- package/dist/modules/web-fetch/index.d.ts.map +1 -0
- package/dist/modules/web-fetch/index.js +242 -0
- package/dist/modules/web-fetch/index.js.map +1 -0
- package/dist/object-artifact-store-CMTzCm_G.d.ts +7 -0
- package/dist/object-artifact-store-CMTzCm_G.d.ts.map +1 -0
- package/dist/object-artifact-store-wZ2j9cto.js +28 -0
- package/dist/object-artifact-store-wZ2j9cto.js.map +1 -0
- package/dist/pinecone-umY4t6OF.js +190 -0
- package/dist/pinecone-umY4t6OF.js.map +1 -0
- package/dist/provider-CgDAlg6K.js +34 -0
- package/dist/provider-CgDAlg6K.js.map +1 -0
- package/dist/qdrant-DMp4NhKR.js +253 -0
- package/dist/qdrant-DMp4NhKR.js.map +1 -0
- package/dist/resend-BAC38_dA.js +155 -0
- package/dist/resend-BAC38_dA.js.map +1 -0
- package/dist/s3-CsOaPWMP.js +955 -0
- package/dist/s3-CsOaPWMP.js.map +1 -0
- package/dist/schemas-ChOAhdo9.js +192 -0
- package/dist/schemas-ChOAhdo9.js.map +1 -0
- package/dist/slack-Di5BBNpt.js +1455 -0
- package/dist/slack-Di5BBNpt.js.map +1 -0
- package/dist/sqs-DCwS1i2N.js +225 -0
- package/dist/sqs-DCwS1i2N.js.map +1 -0
- package/dist/supabase-vector-Dpp9mmJR.js +218 -0
- package/dist/supabase-vector-Dpp9mmJR.js.map +1 -0
- package/dist/tanstack/index.d.ts +15 -0
- package/dist/tanstack/index.d.ts.map +1 -0
- package/dist/tanstack/index.js +28 -0
- package/dist/tanstack/index.js.map +1 -0
- package/dist/teams-DYAHNb39.js +835 -0
- package/dist/teams-DYAHNb39.js.map +1 -0
- package/dist/telegram-DDXWzkfL.js +734 -0
- package/dist/telegram-DDXWzkfL.js.map +1 -0
- package/dist/textract-CPLiB22H.js +554 -0
- package/dist/textract-CPLiB22H.js.map +1 -0
- package/dist/transport-B4vn-XiQ.js +157 -0
- package/dist/transport-B4vn-XiQ.js.map +1 -0
- package/dist/transport-i96ACAI_.d.ts +46 -0
- package/dist/transport-i96ACAI_.d.ts.map +1 -0
- package/dist/types-Ccb0DXY9.d.ts +150 -0
- package/dist/types-Ccb0DXY9.d.ts.map +1 -0
- package/dist/unique-EwBH1JPB.js +19 -0
- package/dist/unique-EwBH1JPB.js.map +1 -0
- package/dist/vector-store-C3nEO80e.js +193 -0
- package/dist/vector-store-C3nEO80e.js.map +1 -0
- package/dist/vendors/amazon-sp-api/index.d.ts +526 -0
- package/dist/vendors/amazon-sp-api/index.d.ts.map +1 -0
- package/dist/vendors/amazon-sp-api/index.js +975 -0
- package/dist/vendors/amazon-sp-api/index.js.map +1 -0
- package/dist/vendors/bedrock-agentcore-browser/index.d.ts +2 -0
- package/dist/vendors/bedrock-agentcore-browser/index.js +2 -0
- package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts +228 -0
- package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts.map +1 -0
- package/dist/vendors/bedrock-agentcore-code-interpreter/index.js +2 -0
- package/dist/vendors/cloudflare-browser/index.d.ts +2 -0
- package/dist/vendors/cloudflare-browser/index.js +2 -0
- package/dist/vendors/cloudflare-email/index.d.ts +260 -0
- package/dist/vendors/cloudflare-email/index.d.ts.map +1 -0
- package/dist/vendors/cloudflare-email/index.js +3 -0
- package/dist/vendors/cloudflare-sandbox/index.d.ts +565 -0
- package/dist/vendors/cloudflare-sandbox/index.d.ts.map +1 -0
- package/dist/vendors/cloudflare-sandbox/index.js +2 -0
- package/dist/vendors/eventbridge-scheduler/index.d.ts +2 -0
- package/dist/vendors/eventbridge-scheduler/index.js +2 -0
- package/dist/vendors/gotenberg/index.d.ts +306 -0
- package/dist/vendors/gotenberg/index.d.ts.map +1 -0
- package/dist/vendors/gotenberg/index.js +2 -0
- package/dist/vendors/imessage/index.d.ts +420 -0
- package/dist/vendors/imessage/index.d.ts.map +1 -0
- package/dist/vendors/imessage/index.js +4 -0
- package/dist/vendors/katana/index.d.ts +1570 -0
- package/dist/vendors/katana/index.d.ts.map +1 -0
- package/dist/vendors/katana/index.js +1639 -0
- package/dist/vendors/katana/index.js.map +1 -0
- package/dist/vendors/mastra-vector/index.d.ts +120 -0
- package/dist/vendors/mastra-vector/index.d.ts.map +1 -0
- package/dist/vendors/mastra-vector/index.js +3 -0
- package/dist/vendors/pinecone/index.d.ts +75 -0
- package/dist/vendors/pinecone/index.d.ts.map +1 -0
- package/dist/vendors/pinecone/index.js +3 -0
- package/dist/vendors/qdrant/index.d.ts +75 -0
- package/dist/vendors/qdrant/index.d.ts.map +1 -0
- package/dist/vendors/qdrant/index.js +3 -0
- package/dist/vendors/resend/index.d.ts +3 -0
- package/dist/vendors/resend/index.js +3 -0
- package/dist/vendors/s3/index.d.ts +2 -0
- package/dist/vendors/s3/index.js +2 -0
- package/dist/vendors/slack/index.d.ts +576 -0
- package/dist/vendors/slack/index.d.ts.map +1 -0
- package/dist/vendors/slack/index.js +3 -0
- package/dist/vendors/sqs/index.d.ts +2 -0
- package/dist/vendors/sqs/index.js +2 -0
- package/dist/vendors/supabase-vector/index.d.ts +89 -0
- package/dist/vendors/supabase-vector/index.d.ts.map +1 -0
- package/dist/vendors/supabase-vector/index.js +3 -0
- package/dist/vendors/teams/index.d.ts +303 -0
- package/dist/vendors/teams/index.d.ts.map +1 -0
- package/dist/vendors/teams/index.js +3 -0
- package/dist/vendors/telegram/index.d.ts +319 -0
- package/dist/vendors/telegram/index.d.ts.map +1 -0
- package/dist/vendors/telegram/index.js +3 -0
- package/dist/vendors/textract/index.d.ts +2 -0
- package/dist/vendors/textract/index.js +2 -0
- package/dist/vendors/woocommerce/index.d.ts +1700 -0
- package/dist/vendors/woocommerce/index.d.ts.map +1 -0
- package/dist/vendors/woocommerce/index.js +1427 -0
- package/dist/vendors/woocommerce/index.js.map +1 -0
- package/dist/with-auth-CpKqTrGK.js +240 -0
- package/dist/with-auth-CpKqTrGK.js.map +1 -0
- package/logos/LUCIDE-ATTRIBUTION.txt +4 -0
- package/logos/README.md +89 -0
- package/logos/amazon.svg +6 -0
- package/logos/artifacts.svg +9 -0
- package/logos/browser.svg +9 -0
- package/logos/calendar.svg +15 -0
- package/logos/cloudflare-browser.svg +5 -0
- package/logos/cloudflare-email.svg +5 -0
- package/logos/cloudflare.svg +4 -0
- package/logos/code-sandbox.svg +8 -0
- package/logos/content-type.svg +10 -0
- package/logos/crypto.svg +7 -0
- package/logos/document-extract.svg +12 -0
- package/logos/document-render.svg +8 -0
- package/logos/document.svg +10 -0
- package/logos/email-message.svg +8 -0
- package/logos/email.svg +7 -0
- package/logos/file-convert.svg +9 -0
- package/logos/files.svg +6 -0
- package/logos/gotenberg.svg +340 -0
- package/logos/image.svg +8 -0
- package/logos/imessage.svg +7 -0
- package/logos/katana.svg +13 -0
- package/logos/mastra.svg +7 -0
- package/logos/messaging.svg +7 -0
- package/logos/pack-logos.json +48 -0
- package/logos/pdf.svg +10 -0
- package/logos/pinecone.svg +25 -0
- package/logos/presentation.svg +8 -0
- package/logos/qdrant.svg +4 -0
- package/logos/queue.svg +11 -0
- package/logos/rag.svg +18 -0
- package/logos/resend.svg +5 -0
- package/logos/scheduler.svg +7 -0
- package/logos/skills.svg +10 -0
- package/logos/slack.svg +14 -0
- package/logos/supabase.svg +4 -0
- package/logos/tasks.svg +10 -0
- package/logos/teams.svg +6 -0
- package/logos/telegram.svg +10 -0
- package/logos/textract.svg +5 -0
- package/logos/vector-store.svg +8 -0
- package/logos/web-fetch.svg +8 -0
- package/logos/woocommerce.svg +4 -0
- package/package.json +373 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-Di5BBNpt.js","names":["firstString","#token","#http","#external","#api","#apiForm"],"sources":["../src/vendors/slack/contracts.ts","../src/vendors/slack/domain.ts","../src/vendors/slack/client.ts","../src/vendors/slack/module.ts","../src/vendors/slack/reference.ts","../src/vendors/slack/webhook.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const MAX_MEDIA_BYTES = 100 * 1024 * 1024\n\nexport const slackChatActionSchema = z.enum([\n\t'typing',\n\t'upload_photo',\n\t'record_video',\n\t'upload_video',\n\t'record_voice',\n\t'upload_voice',\n\t'upload_document',\n\t'choose_sticker',\n\t'find_location',\n\t'record_video_note',\n\t'upload_video_note'\n])\n\nexport const slackAuthSchema = z.object({\n\tbot_token: z.string().min(1).describe('Slack bot token (xoxb-…)')\n})\n\nexport type SlackAuth = z.infer<typeof slackAuthSchema>\n\nexport const slackSendTextInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Slack channel or conversation id'),\n\ttext: z.string().min(1).max(40_000).describe('Message text (max 40000 characters)'),\n\treply_to_message_id: z.string().min(1).optional().describe('Optional thread_ts to reply in a thread'),\n\treply_markup: z.unknown().optional().describe('Optional Slack blocks array (Block Kit)')\n})\n\nexport const slackMessageOutputSchema = z.object({\n\tmessage_id: z.string().describe('Slack message timestamp (ts) as string'),\n\tfile_id: z.string().min(1).optional().describe('Slack file id when the message carries an uploaded file (sendMedia)')\n})\n\nexport const slackEditTextInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Slack channel or conversation id'),\n\tmessage_id: z.string().min(1).describe('Message ts to edit'),\n\ttext: z.string().min(1).max(40_000).describe('Replacement text (max 40000 characters)'),\n\treply_markup: z.unknown().optional().describe('Optional Slack blocks array (Block Kit)')\n})\n\nexport const slackSendChatActionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Slack channel or conversation id'),\n\taction: slackChatActionSchema.describe(\n\t\t'Chat action. With reply_to_message_id (thread_ts), maps to assistant.threads.setStatus loading text.'\n\t),\n\treply_to_message_id: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe(\n\t\t\t'Thread root ts (thread_ts). Required for assistant status; without it sendChatAction is a no-op on Slack.'\n\t\t)\n})\n\n/** Clear assistant thread status (empty status). Needs the same thread_ts as set. */\nexport const slackStopTypingInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Slack channel or conversation id'),\n\treply_to_message_id: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Thread root ts (thread_ts). Required to clear assistant status; without it stop is a no-op.')\n})\n\nexport const slackSetReactionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Slack channel or conversation id'),\n\tmessage_id: z.string().min(1).describe('Message ts to react to'),\n\temoji: z.string().min(1).max(64).describe('Emoji name (with or without colons), e.g. thumbsup or :thumbsup:')\n})\n\nexport const slackClearReactionInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Slack channel or conversation id'),\n\tmessage_id: z.string().min(1).describe('Message ts to clear a reaction on'),\n\temoji: z.string().min(1).max(64).describe('Emoji name to remove (with or without colons); required on Slack')\n})\n\nexport const slackSendMediaInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Slack channel or conversation id'),\n\tkind: z.enum(['photo', 'document']).describe('Media kind'),\n\tbody_base64: z.string().min(1).describe('File body as base64'),\n\tfile_name: z.string().min(1).describe('File name including extension'),\n\tcaption: z.string().max(3000).optional().describe('Optional initial comment / caption'),\n\treply_to_message_id: z.string().min(1).optional().describe('Optional thread_ts for the upload'),\n\tcontent_type: z.string().optional().describe('Optional content type for the upload')\n})\n\nexport const slackDownloadFileInputSchema = z.object({\n\tfile_id: z.string().min(1).describe('Slack file id from an inbound attachment'),\n\tfile_name: z.string().min(1).optional().describe('Preferred file name for the download result')\n})\n\nexport const slackDownloadFileOutputSchema = z.object({\n\tfile_name: z.string(),\n\tfile_size: z.number().optional(),\n\tbody_base64: z.string().describe('Downloaded file body as base64')\n})\n\nexport const slackAnswerCallbackInputSchema = z.object({\n\tcallback_query_id: z\n\t\t.string()\n\t\t.min(1)\n\t\t.describe('Slack response_url from an interactive payload, or opaque callback id'),\n\ttext: z.string().max(3000).optional().describe('Optional ephemeral response text'),\n\tshow_alert: z.boolean().optional().describe('Ignored on Slack; reserved for channel seam parity')\n})\n\nexport const slackGetBotOutputSchema = z.object({\n\tbot_id: z.string(),\n\tusername: z.string(),\n\tdisplay_name: z.string()\n})\n\nexport const slackOkOutputSchema = z.object({\n\tok: z.boolean()\n})\n\nexport const slackPostEphemeralInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Slack channel id'),\n\tuser_id: z.string().min(1).describe('User id who should see the ephemeral message'),\n\ttext: z.string().min(1).max(40_000).describe('Ephemeral message text'),\n\treply_markup: z.unknown().optional().describe('Optional Slack blocks array (Block Kit)')\n})\n\nexport const slackListConversationsInputSchema = z.object({\n\tlimit: z.number().int().min(1).max(1000).optional().describe('Page size (default Slack limit)'),\n\tcursor: z.string().min(1).optional().describe('Pagination cursor from a previous page'),\n\ttypes: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Comma-separated conversation types, e.g. public_channel,private_channel,im,mpim')\n})\n\nexport const slackListConversationsOutputSchema = z.object({\n\tchannels: z.array(\n\t\tz.object({\n\t\t\tid: z.string(),\n\t\t\tname: z.string().optional(),\n\t\t\tis_channel: z.boolean().optional(),\n\t\t\tis_im: z.boolean().optional(),\n\t\t\tis_mpim: z.boolean().optional(),\n\t\t\tis_private: z.boolean().optional()\n\t\t})\n\t),\n\tnext_cursor: z.string().optional()\n})\n\nexport type SlackSendTextInput = z.infer<typeof slackSendTextInputSchema>\nexport type SlackMessageOutput = z.infer<typeof slackMessageOutputSchema>\nexport type SlackEditTextInput = z.infer<typeof slackEditTextInputSchema>\nexport type SlackSendChatActionInput = z.infer<typeof slackSendChatActionInputSchema>\nexport type SlackStopTypingInput = z.infer<typeof slackStopTypingInputSchema>\nexport type SlackSetReactionInput = z.infer<typeof slackSetReactionInputSchema>\nexport type SlackClearReactionInput = z.infer<typeof slackClearReactionInputSchema>\nexport type SlackSendMediaInput = z.infer<typeof slackSendMediaInputSchema>\nexport type SlackDownloadFileInput = z.infer<typeof slackDownloadFileInputSchema>\nexport type SlackDownloadFileOutput = z.infer<typeof slackDownloadFileOutputSchema>\nexport type SlackAnswerCallbackInput = z.infer<typeof slackAnswerCallbackInputSchema>\nexport type SlackGetBotOutput = z.infer<typeof slackGetBotOutputSchema>\nexport type SlackPostEphemeralInput = z.infer<typeof slackPostEphemeralInputSchema>\nexport type SlackListConversationsInput = z.infer<typeof slackListConversationsInputSchema>\nexport type SlackListConversationsOutput = z.infer<typeof slackListConversationsOutputSchema>\n\nexport const MAX_SLACK_MEDIA_BATCH = 10\n\n/** Host-only: full assistant.threads.setStatus (custom status + loading_messages). */\nexport const slackSetAssistantStatusInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Channel or DM id containing the assistant thread'),\n\tthread_ts: z.string().min(1).describe('Thread root message ts'),\n\tstatus: z.string().describe('Status text Slack shows after the app name (empty string clears)'),\n\tloading_messages: z.array(z.string().min(1)).max(10).optional().describe('Up to 10 rotating loading messages')\n})\n\nexport const slackSetSuggestedPromptsInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Channel or DM id'),\n\tthread_ts: z.string().min(1).optional().describe('Thread ts; optional in agent Messages-tab experience'),\n\ttitle: z.string().min(1).optional().describe('Title above the prompt list'),\n\tprompts: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\ttitle: z.string().min(1),\n\t\t\t\tmessage: z.string().min(1)\n\t\t\t})\n\t\t)\n\t\t.min(1)\n\t\t.max(4)\n\t\t.describe('Up to four suggested prompts')\n})\n\nexport const slackPublishHomeInputSchema = z.object({\n\tuser_id: z.string().min(1).describe('User id to publish the Home tab view for'),\n\tview: z.unknown().describe('Slack home view payload (type home + blocks)'),\n\thash: z.string().min(1).optional().describe('Optional view hash for race protection')\n})\n\nexport const slackStartStreamInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Channel or DM id'),\n\tthread_ts: z.string().min(1).describe('Parent message ts (streamed messages are thread replies)'),\n\tmarkdown_text: z.string().max(12_000).optional().describe('Optional initial markdown chunk'),\n\trecipient_user_id: z.string().min(1).optional().describe('Required when streaming into channels'),\n\trecipient_team_id: z.string().min(1).optional().describe('Required when streaming into channels'),\n\ttask_display_mode: z.enum(['timeline', 'plan', 'dense']).optional()\n})\n\nexport const slackAppendStreamInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Channel or DM id'),\n\tmessage_id: z.string().min(1).describe('Streaming message ts from startStream'),\n\tmarkdown_text: z.string().min(1).max(12_000).describe('Markdown text to append')\n})\n\nexport const slackStopStreamInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Channel or DM id'),\n\tmessage_id: z.string().min(1).describe('Streaming message ts'),\n\tmarkdown_text: z.string().max(12_000).optional().describe('Optional final markdown append'),\n\tblocks: z.unknown().optional().describe('Optional Block Kit blocks on finalize')\n})\n\nexport const slackAuthRevokeInputSchema = z.object({\n\ttest: z.boolean().optional().describe('When true, tests revoke without revoking (Slack auth.revoke test flag)')\n})\n\nexport const slackAuthRevokeOutputSchema = z.object({\n\trevoked: z.boolean()\n})\n\nexport const slackUsersInfoInputSchema = z.object({\n\tuser_id: z.string().min(1).describe('Slack user id'),\n\tinclude_locale: z.boolean().optional()\n})\n\nexport const slackUsersInfoOutputSchema = z.object({\n\tuser_id: z.string(),\n\tname: z.string().optional(),\n\treal_name: z.string().optional(),\n\tdisplay_name: z.string().optional(),\n\tis_bot: z.boolean().optional(),\n\ttz: z.string().optional(),\n\tprofile: z.record(z.string(), z.unknown()).optional()\n})\n\nexport const slackUsersConversationsInputSchema = z.object({\n\tuser_id: z.string().min(1).optional().describe('User id; omit for the authed user'),\n\tlimit: z.number().int().min(1).max(1000).optional(),\n\tcursor: z.string().min(1).optional(),\n\ttypes: z.string().min(1).optional().describe('e.g. public_channel,private_channel,im,mpim'),\n\texclude_archived: z.boolean().optional()\n})\n\nexport const slackConversationInfoInputSchema = z.object({\n\tchat_id: z.string().min(1).describe('Channel, group, or DM id'),\n\tinclude_locale: z.boolean().optional(),\n\tinclude_num_members: z.boolean().optional()\n})\n\nexport const slackConversationInfoOutputSchema = z.object({\n\tid: z.string(),\n\tname: z.string().optional(),\n\tis_channel: z.boolean().optional(),\n\tis_im: z.boolean().optional(),\n\tis_mpim: z.boolean().optional(),\n\tis_private: z.boolean().optional(),\n\tis_archived: z.boolean().optional(),\n\tnum_members: z.number().optional(),\n\traw: z.record(z.string(), z.unknown()).optional()\n})\n\nexport const slackConversationHistoryInputSchema = z.object({\n\tchat_id: z.string().min(1),\n\tlimit: z.number().int().min(1).max(1000).optional(),\n\tcursor: z.string().min(1).optional(),\n\toldest: z.string().min(1).optional(),\n\tlatest: z.string().min(1).optional(),\n\tinclusive: z.boolean().optional()\n})\n\nexport const slackConversationRepliesInputSchema = z.object({\n\tchat_id: z.string().min(1),\n\tmessage_id: z.string().min(1).describe('Parent message ts'),\n\tlimit: z.number().int().min(1).max(1000).optional(),\n\tcursor: z.string().min(1).optional(),\n\toldest: z.string().min(1).optional(),\n\tlatest: z.string().min(1).optional(),\n\tinclusive: z.boolean().optional()\n})\n\nexport const slackConversationMessagesOutputSchema = z.object({\n\tmessages: z.array(z.record(z.string(), z.unknown())),\n\tnext_cursor: z.string().optional(),\n\thas_more: z.boolean().optional()\n})\n\n/** Host batch upload: many files, one completeUploadExternal share. */\nexport const slackSendMediaBatchItemSchema = z.object({\n\tfile_name: z.string().min(1),\n\tbody_base64: z.string().min(1).optional().describe('File body as base64 (tool/host JSON path)'),\n\tcontent_type: z.string().optional(),\n\ttitle: z.string().min(1).optional()\n})\n\nexport const slackSendMediaBatchInputSchema = z.object({\n\tchat_id: z.string().min(1),\n\tfiles: z.array(slackSendMediaBatchItemSchema).min(1).max(MAX_SLACK_MEDIA_BATCH),\n\tcaption: z.string().max(3000).optional(),\n\treply_to_message_id: z.string().min(1).optional()\n})\n\nexport const slackSendMediaBatchOutputSchema = z.object({\n\tmessage_id: z.string(),\n\tfile_ids: z.array(z.string().min(1)).min(1)\n})\n\nexport type SlackSetAssistantStatusInput = z.infer<typeof slackSetAssistantStatusInputSchema>\nexport type SlackSetSuggestedPromptsInput = z.infer<typeof slackSetSuggestedPromptsInputSchema>\nexport type SlackPublishHomeInput = z.infer<typeof slackPublishHomeInputSchema>\nexport type SlackStartStreamInput = z.infer<typeof slackStartStreamInputSchema>\nexport type SlackAppendStreamInput = z.infer<typeof slackAppendStreamInputSchema>\nexport type SlackStopStreamInput = z.infer<typeof slackStopStreamInputSchema>\nexport type SlackAuthRevokeInput = z.infer<typeof slackAuthRevokeInputSchema>\nexport type SlackAuthRevokeOutput = z.infer<typeof slackAuthRevokeOutputSchema>\nexport type SlackUsersInfoInput = z.infer<typeof slackUsersInfoInputSchema>\nexport type SlackUsersInfoOutput = z.infer<typeof slackUsersInfoOutputSchema>\nexport type SlackUsersConversationsInput = z.infer<typeof slackUsersConversationsInputSchema>\nexport type SlackConversationInfoInput = z.infer<typeof slackConversationInfoInputSchema>\nexport type SlackConversationInfoOutput = z.infer<typeof slackConversationInfoOutputSchema>\nexport type SlackConversationHistoryInput = z.infer<typeof slackConversationHistoryInputSchema>\nexport type SlackConversationRepliesInput = z.infer<typeof slackConversationRepliesInputSchema>\nexport type SlackConversationMessagesOutput = z.infer<typeof slackConversationMessagesOutputSchema>\nexport type SlackSendMediaBatchItem = z.infer<typeof slackSendMediaBatchItemSchema>\nexport type SlackSendMediaBatchInput = z.infer<typeof slackSendMediaBatchInputSchema>\nexport type SlackSendMediaBatchOutput = z.infer<typeof slackSendMediaBatchOutputSchema>\n","/**\n * Slack payload shaping + envelope/result parse.\n * No HTTP — client owns transport.\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { base64ToBytes, bytesToBase64, toArrayBuffer } from '../../shared/bytes'\nimport type {\n\tSlackConversationInfoOutput,\n\tSlackConversationMessagesOutput,\n\tSlackDownloadFileInput,\n\tSlackDownloadFileOutput,\n\tSlackGetBotOutput,\n\tSlackListConversationsOutput,\n\tSlackMessageOutput,\n\tSlackSendMediaBatchOutput,\n\tSlackUsersInfoOutput\n} from './contracts'\nimport { MAX_MEDIA_BYTES } from './contracts'\n\nexport type SlackFailureKind = 'definite_rejection' | 'outcome_unknown'\n\nexport class SlackClientError extends ToolError {\n\treadonly failureKind: SlackFailureKind\n\n\tconstructor(input: {\n\t\tmessage: string\n\t\tfailureKind: SlackFailureKind\n\t\tmethod: string\n\t\tstatus?: number\n\t\tslackError?: string\n\t\tretryAfterSeconds?: number\n\t\tcause?: unknown\n\t}) {\n\t\tsuper(input.message, {\n\t\t\tcode: 'upstream',\n\t\t\tretryable: input.failureKind === 'outcome_unknown',\n\t\t\tcause: input.cause,\n\t\t\tdetails: {\n\t\t\t\tmethod: input.method,\n\t\t\t\tfailure_kind: input.failureKind,\n\t\t\t\tstatus: input.status,\n\t\t\t\tslack_error: input.slackError,\n\t\t\t\tretry_after_seconds: input.retryAfterSeconds\n\t\t\t}\n\t\t})\n\t\tthis.name = 'SlackClientError'\n\t\tthis.failureKind = input.failureKind\n\t}\n}\n\nexport function isSlackDefiniteRejection(error: unknown): boolean {\n\treturn error instanceof SlackClientError && error.failureKind === 'definite_rejection'\n}\n\nexport function isSlackOutcomeUnknown(error: unknown): boolean {\n\treturn error instanceof SlackClientError && error.failureKind === 'outcome_unknown'\n}\n\n/** Network / abort / transport failures before a parseable Slack envelope. */\nexport function throwSlackTransportError(method: string, error: unknown): never {\n\tif (error instanceof SlackClientError) throw error\n\tconst message = error instanceof Error ? error.message : `${method} request failed`\n\tthrow new SlackClientError({\n\t\tmessage,\n\t\tfailureKind: 'outcome_unknown',\n\t\tmethod,\n\t\tcause: error\n\t})\n}\n\n/** Client/auth/validation errors that should not be retried as if delivery might have succeeded. */\nconst DEFINITE_SLACK_ERRORS = new Set([\n\t'invalid_auth',\n\t'not_authed',\n\t'account_inactive',\n\t'token_revoked',\n\t'token_expired',\n\t'invalid_token',\n\t'missing_scope',\n\t'not_allowed_token_type',\n\t'ekm_access_denied',\n\t'access_denied',\n\t'org_login_required',\n\t'team_access_not_granted',\n\t'channel_not_found',\n\t'is_archived',\n\t'not_in_channel',\n\t'is_inactive',\n\t'method_not_supported_for_channel_type',\n\t'msg_too_long',\n\t'no_text',\n\t'invalid_arguments',\n\t'invalid_blocks',\n\t'invalid_blocks_format',\n\t'cant_update_message',\n\t'message_not_found',\n\t'cant_delete_message',\n\t'already_reacted',\n\t'no_reaction',\n\t'invalid_name',\n\t'too_many_emoji',\n\t'file_not_found',\n\t'file_deleted',\n\t'cant_find_user',\n\t'user_not_found',\n\t'user_not_visible',\n\t'invalid_channel',\n\t'name_taken',\n\t'restricted_action',\n\t'as_user_not_supported',\n\t'cannot_reply_to_message',\n\t'thread_not_found'\n])\n\nconst RETRYABLE_SLACK_ERRORS = new Set([\n\t'rate_limited',\n\t'ratelimited',\n\t'internal_error',\n\t'fatal_error',\n\t'service_unavailable',\n\t'request_timeout'\n])\n\nfunction isDefiniteStatus(status: number): boolean {\n\treturn status === 400 || status === 401 || status === 403 || status === 404\n}\n\nexport function classifySlackFailure(status: number, errorCode: string | undefined): SlackFailureKind {\n\tif (status === 429 || status >= 500) return 'outcome_unknown'\n\tif (errorCode && RETRYABLE_SLACK_ERRORS.has(errorCode)) return 'outcome_unknown'\n\tif (errorCode && DEFINITE_SLACK_ERRORS.has(errorCode)) return 'definite_rejection'\n\tif (isDefiniteStatus(status)) return 'definite_rejection'\n\treturn 'outcome_unknown'\n}\n\n/** Map Slack `{ ok, error?, … }` (HTTP may be non-2xx). Returns the full envelope object when ok. */\nexport function parseSlackResult(label: string, status: number, data: unknown): Record<string, unknown> {\n\tif (!isPlainObject(data) || typeof data['ok'] !== 'boolean') {\n\t\tthrow new SlackClientError({\n\t\t\tmessage: `${label} returned an invalid envelope`,\n\t\t\tfailureKind:\n\t\t\t\tstatus === 429 || status >= 500 || status === 0 ? 'outcome_unknown' : classifySlackFailure(status, undefined),\n\t\t\tmethod: label,\n\t\t\tstatus\n\t\t})\n\t}\n\tif (data['ok'] === true) {\n\t\treturn data\n\t}\n\tconst errorCode = isString(data['error']) ? data['error'] : undefined\n\tconst retryAfter =\n\t\ttypeof data['retry_after'] === 'number'\n\t\t\t? data['retry_after']\n\t\t\t: typeof data['Retry-After'] === 'number'\n\t\t\t\t? data['Retry-After']\n\t\t\t\t: undefined\n\tthrow new SlackClientError({\n\t\tmessage: errorCode ? `${label} failed: ${errorCode}` : `${label} failed`,\n\t\tfailureKind: classifySlackFailure(status, errorCode),\n\t\tmethod: label,\n\t\tstatus,\n\t\t...(errorCode && { slackError: errorCode }),\n\t\t...(retryAfter !== undefined && { retryAfterSeconds: retryAfter })\n\t})\n}\n\n/** Strip surrounding colons from emoji names (`:thumbsup:` → `thumbsup`). */\nexport function normalizeEmojiName(emoji: string): string {\n\treturn emoji.replace(/^:+/, '').replace(/:+$/, '')\n}\n\nexport function parseMessageTs(value: Record<string, unknown>): SlackMessageOutput {\n\tconst ts = value['ts']\n\tif (!isString(ts) || ts.length === 0) {\n\t\tthrow new ToolError('Slack returned an invalid message ts', { code: 'upstream' })\n\t}\n\treturn { message_id: ts }\n}\n\nexport function parseOk(value: Record<string, unknown>): void {\n\tif (value['ok'] !== true) {\n\t\tthrow new ToolError('Slack returned unexpected result', { code: 'upstream' })\n\t}\n}\n\nexport function parseBot(value: Record<string, unknown>): SlackGetBotOutput {\n\tconst botId = firstString(value['bot_id'], value['user_id'])\n\tconst username = firstString(value['user'], value['team'])\n\tconst displayName = firstString(value['user'], value['team'])\n\tif (!botId || !username || !displayName) {\n\t\tthrow new ToolError('Slack auth.test returned invalid bot identity', { code: 'upstream' })\n\t}\n\treturn {\n\t\tbot_id: botId,\n\t\tusername,\n\t\tdisplay_name: displayName\n\t}\n}\n\nexport function parseFileInfo(value: Record<string, unknown>): {\n\tfile_id: string\n\tfile_name?: string\n\tfile_size?: number\n\turl_private_download: string\n} {\n\tconst file = value['file']\n\tif (!isPlainObject(file) || !isString(file['id'])) {\n\t\tthrow new ToolError('Slack files.info returned invalid payload', { code: 'upstream' })\n\t}\n\tconst downloadUrl = file['url_private_download']\n\tif (!isString(downloadUrl) || downloadUrl.length === 0) {\n\t\tthrow new ToolError('Slack files.info missing url_private_download', { code: 'upstream' })\n\t}\n\treturn {\n\t\tfile_id: file['id'],\n\t\turl_private_download: downloadUrl,\n\t\t...(isString(file['name']) && { file_name: file['name'] }),\n\t\t...(typeof file['size'] === 'number' && { file_size: file['size'] })\n\t}\n}\n\nexport function parseDownload(\n\tinput: SlackDownloadFileInput,\n\tfile: { file_id: string; file_name?: string; file_size?: number },\n\tbytes: Uint8Array\n): SlackDownloadFileOutput {\n\treturn {\n\t\tfile_name: input.file_name ?? file.file_name ?? file.file_id,\n\t\t...(file.file_size !== undefined && { file_size: file.file_size }),\n\t\tbody_base64: bytesToBase64(bytes)\n\t}\n}\n\nexport function parseUploadUrl(value: Record<string, unknown>): { upload_url: string; file_id: string } {\n\tconst uploadUrl = value['upload_url']\n\tconst fileId = value['file_id']\n\tif (!isString(uploadUrl) || uploadUrl.length === 0 || !isString(fileId) || fileId.length === 0) {\n\t\tthrow new ToolError('Slack files.getUploadURLExternal returned invalid payload', { code: 'upstream' })\n\t}\n\treturn { upload_url: uploadUrl, file_id: fileId }\n}\n\n/**\n * Prefer message ts from shares; fall back to uploaded file id.\n * Always surface `file_id` when known so hosts can download the just-uploaded file.\n */\nexport function parseUploadComplete(value: Record<string, unknown>, knownFileId?: string): SlackMessageOutput {\n\tconst files = value['files']\n\tif (Array.isArray(files) && files.length > 0) {\n\t\tconst first = files[0]\n\t\tif (isPlainObject(first)) {\n\t\t\tconst fromFile = isString(first['id']) && first['id'].length > 0 ? first['id'] : undefined\n\t\t\tconst fileId = fromFile ?? knownFileId\n\t\t\tconst fromShares = extractTsFromShares(first['shares'])\n\t\t\tif (fromShares) {\n\t\t\t\treturn { message_id: fromShares, ...(fileId && { file_id: fileId }) }\n\t\t\t}\n\t\t\tif (fileId) {\n\t\t\t\treturn { message_id: fileId, file_id: fileId }\n\t\t\t}\n\t\t}\n\t}\n\tif (knownFileId) {\n\t\treturn { message_id: knownFileId, file_id: knownFileId }\n\t}\n\tthrow new ToolError('Slack files.completeUploadExternal returned invalid payload', { code: 'upstream' })\n}\n\nfunction extractTsFromShares(shares: unknown): string | undefined {\n\tif (!isPlainObject(shares)) return undefined\n\tfor (const bucket of Object.values(shares)) {\n\t\tif (!isPlainObject(bucket)) continue\n\t\tfor (const entries of Object.values(bucket)) {\n\t\t\tif (!Array.isArray(entries)) continue\n\t\t\tfor (const entry of entries) {\n\t\t\t\tif (isPlainObject(entry) && isString(entry['ts']) && entry['ts'].length > 0) {\n\t\t\t\t\treturn entry['ts']\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined\n}\n\nexport function parseConversationsList(value: Record<string, unknown>): SlackListConversationsOutput {\n\tconst channelsRaw = value['channels']\n\tif (!Array.isArray(channelsRaw)) {\n\t\tthrow new ToolError('Slack conversations.list returned invalid payload', { code: 'upstream' })\n\t}\n\tconst channels: SlackListConversationsOutput['channels'] = []\n\tfor (const row of channelsRaw) {\n\t\tif (!isPlainObject(row) || !isString(row['id'])) continue\n\t\tchannels.push({\n\t\t\tid: row['id'],\n\t\t\t...(isString(row['name']) && { name: row['name'] }),\n\t\t\t...(typeof row['is_channel'] === 'boolean' && { is_channel: row['is_channel'] }),\n\t\t\t...(typeof row['is_im'] === 'boolean' && { is_im: row['is_im'] }),\n\t\t\t...(typeof row['is_mpim'] === 'boolean' && { is_mpim: row['is_mpim'] }),\n\t\t\t...(typeof row['is_private'] === 'boolean' && { is_private: row['is_private'] })\n\t\t})\n\t}\n\tconst nextCursor = nextCursorFrom(value)\n\treturn {\n\t\tchannels,\n\t\t...(nextCursor && { next_cursor: nextCursor })\n\t}\n}\n\n/** Empty + size checks shared by base64 and raw-byte media paths. */\nfunction assertMediaBytes(bytes: Uint8Array): Uint8Array {\n\tif (bytes.byteLength === 0) {\n\t\tthrow new ToolError('Media body must not be empty', { code: 'bad_input' })\n\t}\n\tif (bytes.byteLength > MAX_MEDIA_BYTES) {\n\t\tthrow new ToolError('Media exceeds 100 MiB limit', {\n\t\t\tcode: 'too_large',\n\t\t\tdetails: { max_bytes: MAX_MEDIA_BYTES, content_length: bytes.byteLength }\n\t\t})\n\t}\n\treturn bytes\n}\n\nexport function decodeMediaBytes(bodyBase64: string): Uint8Array {\n\tlet bytes: Uint8Array\n\ttry {\n\t\tbytes = base64ToBytes(bodyBase64)\n\t} catch (error) {\n\t\tthrow new ToolError('Invalid base64 body', { code: 'bad_input', cause: error })\n\t}\n\treturn assertMediaBytes(bytes)\n}\n\n/** Host may pass raw bytes instead of base64 (client path only). */\nexport function resolveMediaBytes(input: { body_base64?: string | undefined; body?: Uint8Array | undefined }): {\n\tbytes: Uint8Array\n\tbody: ArrayBuffer\n} {\n\tconst bytes =\n\t\tinput.body !== undefined\n\t\t\t? assertMediaBytes(input.body)\n\t\t\t: input.body_base64\n\t\t\t\t? decodeMediaBytes(input.body_base64)\n\t\t\t\t: undefined\n\tif (!bytes) {\n\t\tthrow new ToolError('Media requires body_base64 or body (Uint8Array)', { code: 'bad_input' })\n\t}\n\treturn { bytes, body: toArrayBuffer(bytes) }\n}\n\nfunction nextCursorFrom(value: Record<string, unknown>): string | undefined {\n\tconst metadata = value['response_metadata']\n\treturn isPlainObject(metadata) ? firstString(metadata['next_cursor']) : undefined\n}\n\nexport function parseUsersInfo(value: Record<string, unknown>): SlackUsersInfoOutput {\n\tconst user = value['user']\n\tif (!isPlainObject(user) || !isString(user['id'])) {\n\t\tthrow new ToolError('Slack users.info returned invalid payload', { code: 'upstream' })\n\t}\n\tconst profile = isPlainObject(user['profile']) ? user['profile'] : undefined\n\tconst out: SlackUsersInfoOutput = { user_id: user['id'] }\n\tconst name = firstString(user['name'])\n\tif (name) out.name = name\n\tconst realName = firstString(user['real_name'])\n\tif (realName) out.real_name = realName\n\tconst displayName = firstString(profile?.['display_name'], profile?.['real_name'], user['real_name'])\n\tif (displayName) out.display_name = displayName\n\tif (typeof user['is_bot'] === 'boolean') out.is_bot = user['is_bot']\n\tconst tz = firstString(user['tz'])\n\tif (tz) out.tz = tz\n\tif (profile) out.profile = profile\n\treturn out\n}\n\nexport function parseConversationInfo(value: Record<string, unknown>): SlackConversationInfoOutput {\n\tconst channel = value['channel']\n\tif (!isPlainObject(channel) || !isString(channel['id'])) {\n\t\tthrow new ToolError('Slack conversations.info returned invalid payload', { code: 'upstream' })\n\t}\n\tconst out: SlackConversationInfoOutput = { id: channel['id'], raw: channel }\n\tconst name = firstString(channel['name'])\n\tif (name) out.name = name\n\tif (typeof channel['is_channel'] === 'boolean') out.is_channel = channel['is_channel']\n\tif (typeof channel['is_im'] === 'boolean') out.is_im = channel['is_im']\n\tif (typeof channel['is_mpim'] === 'boolean') out.is_mpim = channel['is_mpim']\n\tif (typeof channel['is_private'] === 'boolean') out.is_private = channel['is_private']\n\tif (typeof channel['is_archived'] === 'boolean') out.is_archived = channel['is_archived']\n\tif (typeof channel['num_members'] === 'number') out.num_members = channel['num_members']\n\treturn out\n}\n\nexport function parseConversationMessages(value: Record<string, unknown>): SlackConversationMessagesOutput {\n\tconst messagesRaw = value['messages']\n\tif (!Array.isArray(messagesRaw)) {\n\t\tthrow new ToolError('Slack conversation messages payload invalid', { code: 'upstream' })\n\t}\n\tconst out: SlackConversationMessagesOutput = {\n\t\tmessages: messagesRaw.filter(isPlainObject)\n\t}\n\tconst nextCursor = nextCursorFrom(value)\n\tif (nextCursor) out.next_cursor = nextCursor\n\tif (typeof value['has_more'] === 'boolean') out.has_more = value['has_more']\n\treturn out\n}\n\nexport function parseAuthRevoke(value: Record<string, unknown>): { revoked: boolean } {\n\treturn { revoked: value['revoked'] === true }\n}\n\nexport function parseStreamTs(value: Record<string, unknown>): SlackMessageOutput {\n\tconst ts = firstString(value['ts'])\n\tif (!ts) {\n\t\tthrow new ToolError('Slack stream API returned invalid payload (missing ts)', { code: 'upstream' })\n\t}\n\treturn { message_id: ts }\n}\n\nexport function parseUploadBatchComplete(\n\tvalue: Record<string, unknown>,\n\tknownFileIds: string[]\n): SlackSendMediaBatchOutput {\n\tconst files = Array.isArray(value['files']) ? value['files'] : []\n\tconst fromResponse: string[] = []\n\tfor (const file of files) {\n\t\tif (isPlainObject(file)) {\n\t\t\tconst id = firstString(file['id'])\n\t\t\tif (id) fromResponse.push(id)\n\t\t}\n\t}\n\tconst fileIds = fromResponse.length > 0 ? fromResponse : knownFileIds\n\tconst first = isPlainObject(files[0]) ? files[0] : undefined\n\tconst messageId = (first ? extractTsFromShares(first['shares']) : undefined) ?? fileIds[0]\n\tif (!messageId || fileIds.length === 0) {\n\t\tthrow new ToolError('Slack files.completeUploadExternal returned no file ids', { code: 'upstream' })\n\t}\n\treturn { message_id: messageId, file_ids: fileIds }\n}\n\nexport function isHttpsUrl(value: string): boolean {\n\treturn value.startsWith('https://') || value.startsWith('http://')\n}\n\n/**\n * Map shared chat-action enum → assistant.threads.setStatus status text.\n * Slack renders as \"{App Name} {status}\" (do not include the app name).\n */\nexport function assistantStatusFromChatAction(action: string): string {\n\tswitch (action) {\n\t\tcase 'upload_photo':\n\t\tcase 'upload_video':\n\t\tcase 'upload_voice':\n\t\tcase 'upload_document':\n\t\tcase 'upload_video_note':\n\t\t\treturn 'is uploading a file…'\n\t\tcase 'record_video':\n\t\tcase 'record_voice':\n\t\tcase 'record_video_note':\n\t\t\treturn 'is recording…'\n\t\tcase 'choose_sticker':\n\t\tcase 'find_location':\n\t\t\treturn 'is working on your request…'\n\t\tcase 'typing':\n\t\tdefault:\n\t\t\treturn 'is checking the request…'\n\t}\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n\tfor (const value of values) {\n\t\tif (isString(value) && value.length > 0) return value\n\t}\n\treturn undefined\n}\n","/**\n * Slack Web API vendor client.\n * Host: `new SlackClient(auth)`. Agent tools: `fromContext(ctx)`.\n */\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { HttpService } from '../../transport/http-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport type {\n\tSlackAnswerCallbackInput,\n\tSlackAppendStreamInput,\n\tSlackAuth,\n\tSlackAuthRevokeInput,\n\tSlackAuthRevokeOutput,\n\tSlackClearReactionInput,\n\tSlackConversationHistoryInput,\n\tSlackConversationInfoInput,\n\tSlackConversationInfoOutput,\n\tSlackConversationMessagesOutput,\n\tSlackConversationRepliesInput,\n\tSlackDownloadFileInput,\n\tSlackDownloadFileOutput,\n\tSlackEditTextInput,\n\tSlackGetBotOutput,\n\tSlackListConversationsInput,\n\tSlackListConversationsOutput,\n\tSlackMessageOutput,\n\tSlackPostEphemeralInput,\n\tSlackPublishHomeInput,\n\tSlackSendChatActionInput,\n\tSlackSendMediaBatchInput,\n\tSlackSendMediaBatchOutput,\n\tSlackSendMediaInput,\n\tSlackSendTextInput,\n\tSlackSetAssistantStatusInput,\n\tSlackSetReactionInput,\n\tSlackSetSuggestedPromptsInput,\n\tSlackStartStreamInput,\n\tSlackStopStreamInput,\n\tSlackStopTypingInput,\n\tSlackUsersConversationsInput,\n\tSlackUsersInfoInput,\n\tSlackUsersInfoOutput\n} from './contracts'\nimport { slackAuthSchema } from './contracts'\nimport {\n\tassistantStatusFromChatAction,\n\tisHttpsUrl,\n\tisSlackDefiniteRejection,\n\tisSlackOutcomeUnknown,\n\tnormalizeEmojiName,\n\tparseAuthRevoke,\n\tparseBot,\n\tparseConversationInfo,\n\tparseConversationMessages,\n\tparseConversationsList,\n\tparseDownload,\n\tparseFileInfo,\n\tparseMessageTs,\n\tparseOk,\n\tparseSlackResult,\n\tparseStreamTs,\n\tparseUploadBatchComplete,\n\tparseUploadComplete,\n\tparseUploadUrl,\n\tparseUsersInfo,\n\tresolveMediaBytes,\n\tSlackClientError,\n\tthrowSlackTransportError\n} from './domain'\n\nexport type SlackClientOptions = Pick<HttpServiceOptions, 'fetch' | 'signal'>\n\nexport class SlackClient {\n\treadonly #token: string\n\t/** Authenticated Slack Web API (`https://slack.com/api`). */\n\treadonly #http: HttpService\n\t/** Bare HTTP for pre-signed upload URLs and interactive response_url (no bot Authorization). */\n\treadonly #external: HttpService\n\n\tconstructor(auth: SlackAuth, options: SlackClientOptions = {}) {\n\t\tconst parsed = slackAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Slack auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tthis.#token = parsed.data.bot_token\n\t\tthis.#http = new HttpService({\n\t\t\t...options,\n\t\t\tbaseURL: 'https://slack.com/api',\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${parsed.data.bot_token}`,\n\t\t\t\t'Content-Type': 'application/json'\n\t\t\t},\n\t\t\tlabel: 'Slack'\n\t\t})\n\t\tthis.#external = new HttpService({\n\t\t\t...options,\n\t\t\tlabel: 'Slack'\n\t\t})\n\t}\n\n\tstatic fromContext(ctx: ToolContext): SlackClient {\n\t\tconst auth = requireAuth(ctx, slackAuthSchema)\n\t\treturn new SlackClient(auth, {\n\t\t\t...(ctx.fetch && { fetch: ctx.fetch }),\n\t\t\t...(ctx.signal && { signal: ctx.signal })\n\t\t})\n\t}\n\n\tasync #api(method: string, body: Record<string, unknown>, label: string): Promise<Record<string, unknown>> {\n\t\ttry {\n\t\t\tconst res = await this.#http.post(`/${method}`, body, { label, noThrow: true })\n\t\t\treturn parseSlackResult(label, res.status, res.data)\n\t\t} catch (error) {\n\t\t\tthrowSlackTransportError(label, error)\n\t\t}\n\t}\n\n\t/** Form-urlencoded Web API call (used where Slack documents form as primary, e.g. getUploadURLExternal). */\n\tasync #apiForm(method: string, body: URLSearchParams, label: string): Promise<Record<string, unknown>> {\n\t\ttry {\n\t\t\tconst res = await this.#http.post(`/${method}`, body, {\n\t\t\t\tlabel,\n\t\t\t\tnoThrow: true,\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${this.#token}`,\n\t\t\t\t\t'Content-Type': 'application/x-www-form-urlencoded'\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn parseSlackResult(label, res.status, res.data)\n\t\t} catch (error) {\n\t\t\tthrowSlackTransportError(label, error)\n\t\t}\n\t}\n\n\t/** POST chat.postMessage */\n\tasync sendText(input: SlackSendTextInput): Promise<SlackMessageOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchannel: input.chat_id,\n\t\t\ttext: input.text,\n\t\t\t...(input.reply_to_message_id && { thread_ts: input.reply_to_message_id }),\n\t\t\t...(input.reply_markup !== undefined && { blocks: input.reply_markup })\n\t\t}\n\t\treturn parseMessageTs(await this.#api('chat.postMessage', body, 'Slack chat.postMessage'))\n\t}\n\n\t/** POST chat.update */\n\tasync editText(input: SlackEditTextInput): Promise<SlackMessageOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchannel: input.chat_id,\n\t\t\tts: input.message_id,\n\t\t\ttext: input.text,\n\t\t\t...(input.reply_markup !== undefined && { blocks: input.reply_markup })\n\t\t}\n\t\treturn parseMessageTs(await this.#api('chat.update', body, 'Slack chat.update'))\n\t}\n\n\t/**\n\t * Chat action (typing / upload_*).\n\t * With `reply_to_message_id` (thread_ts): `assistant.threads.setStatus` loading line.\n\t * Without thread_ts: no-op (Slack has no channel-level typing API).\n\t * @see https://docs.slack.dev/reference/methods/assistant.threads.setStatus\n\t */\n\tasync sendChatAction(input: SlackSendChatActionInput): Promise<void> {\n\t\tconst threadTs = input.reply_to_message_id\n\t\tif (!threadTs) return\n\t\tparseOk(\n\t\t\tawait this.#api(\n\t\t\t\t'assistant.threads.setStatus',\n\t\t\t\t{\n\t\t\t\t\tchannel_id: input.chat_id,\n\t\t\t\t\tthread_ts: threadTs,\n\t\t\t\t\tstatus: assistantStatusFromChatAction(input.action)\n\t\t\t\t},\n\t\t\t\t'Slack assistant.threads.setStatus'\n\t\t\t)\n\t\t)\n\t}\n\n\t/**\n\t * Clear assistant thread status (`status: \"\"`).\n\t * Requires `reply_to_message_id` (thread_ts); otherwise no-op.\n\t */\n\tasync stopTyping(input: SlackStopTypingInput): Promise<void> {\n\t\tconst threadTs = input.reply_to_message_id\n\t\tif (!threadTs) return\n\t\tparseOk(\n\t\t\tawait this.#api(\n\t\t\t\t'assistant.threads.setStatus',\n\t\t\t\t{\n\t\t\t\t\tchannel_id: input.chat_id,\n\t\t\t\t\tthread_ts: threadTs,\n\t\t\t\t\tstatus: ''\n\t\t\t\t},\n\t\t\t\t'Slack assistant.threads.setStatus clear'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST reactions.add */\n\tasync setReaction(input: SlackSetReactionInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#api(\n\t\t\t\t'reactions.add',\n\t\t\t\t{\n\t\t\t\t\tchannel: input.chat_id,\n\t\t\t\t\ttimestamp: input.message_id,\n\t\t\t\t\tname: normalizeEmojiName(input.emoji)\n\t\t\t\t},\n\t\t\t\t'Slack reactions.add'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST reactions.remove — emoji required on Slack. */\n\tasync clearReaction(input: SlackClearReactionInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#api(\n\t\t\t\t'reactions.remove',\n\t\t\t\t{\n\t\t\t\t\tchannel: input.chat_id,\n\t\t\t\t\ttimestamp: input.message_id,\n\t\t\t\t\tname: normalizeEmojiName(input.emoji)\n\t\t\t\t},\n\t\t\t\t'Slack reactions.remove'\n\t\t\t)\n\t\t)\n\t}\n\n\t/**\n\t * External upload flow:\n\t * files.getUploadURLExternal → POST bytes to upload_url → files.completeUploadExternal\n\t * @see https://docs.slack.dev/reference/methods/files.getUploadURLExternal\n\t */\n\tasync sendMedia(input: SlackSendMediaInput & { body?: Uint8Array }): Promise<SlackMessageOutput> {\n\t\tconst { bytes, body } = resolveMediaBytes(input)\n\t\t// Slack accepts JSON, but form-urlencoded is the documented primary content type for this\n\t\t// method and avoids edge cases with numeric `length` on some gateways.\n\t\tconst form = new URLSearchParams()\n\t\tform.set('filename', input.file_name)\n\t\tform.set('length', String(bytes.byteLength))\n\t\tconst upload = parseUploadUrl(\n\t\t\tawait this.#apiForm('files.getUploadURLExternal', form, 'Slack files.getUploadURLExternal')\n\t\t)\n\n\t\t// Slack expects POST of raw bytes (or multipart) to the upload URL — not JSON API.\n\t\tconst putHeaders: Record<string, string> = {\n\t\t\t'Content-Type': input.content_type ?? 'application/octet-stream'\n\t\t}\n\t\tlet put: Awaited<ReturnType<HttpService['post']>>\n\t\ttry {\n\t\t\tput = await this.#external.post(upload.upload_url, body, {\n\t\t\t\tlabel: 'Slack file upload POST',\n\t\t\t\tnoThrow: true,\n\t\t\t\theaders: putHeaders\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tthrowSlackTransportError('Slack file upload POST', error)\n\t\t}\n\t\tif (!put.ok) {\n\t\t\tthrow new SlackClientError({\n\t\t\t\tmessage: `Slack file upload POST failed with HTTP ${put.status}`,\n\t\t\t\tfailureKind:\n\t\t\t\t\tput.status === 400 || put.status === 401 || put.status === 403 || put.status === 404\n\t\t\t\t\t\t? 'definite_rejection'\n\t\t\t\t\t\t: 'outcome_unknown',\n\t\t\t\tmethod: 'Slack file upload POST',\n\t\t\t\tstatus: put.status\n\t\t\t})\n\t\t}\n\n\t\treturn parseUploadComplete(\n\t\t\tawait this.#api(\n\t\t\t\t'files.completeUploadExternal',\n\t\t\t\t{\n\t\t\t\t\tfiles: [{ id: upload.file_id, title: input.file_name }],\n\t\t\t\t\tchannel_id: input.chat_id,\n\t\t\t\t\t...(input.reply_to_message_id && { thread_ts: input.reply_to_message_id }),\n\t\t\t\t\t...(input.caption && { initial_comment: input.caption })\n\t\t\t\t},\n\t\t\t\t'Slack files.completeUploadExternal'\n\t\t\t),\n\t\t\tupload.file_id\n\t\t)\n\t}\n\n\t/** POST files.info + GET url_private_download (Bearer). */\n\tasync downloadFile(input: SlackDownloadFileInput): Promise<SlackDownloadFileOutput> {\n\t\tconst file = parseFileInfo(await this.#api('files.info', { file: input.file_id }, 'Slack files.info'))\n\t\tlet res: Awaited<ReturnType<HttpService['bytes']>>\n\t\ttry {\n\t\t\tres = await this.#http.bytes('GET', file.url_private_download, {\n\t\t\t\tlabel: 'Slack downloadFile',\n\t\t\t\tnoThrow: true,\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${this.#token}`\n\t\t\t\t}\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tthrowSlackTransportError('Slack downloadFile', error)\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tthrow new SlackClientError({\n\t\t\t\tmessage: `Slack downloadFile failed with HTTP ${res.status}`,\n\t\t\t\tfailureKind:\n\t\t\t\t\tres.status === 400 || res.status === 401 || res.status === 403 || res.status === 404\n\t\t\t\t\t\t? 'definite_rejection'\n\t\t\t\t\t\t: 'outcome_unknown',\n\t\t\t\tmethod: 'Slack downloadFile',\n\t\t\t\tstatus: res.status\n\t\t\t})\n\t\t}\n\t\treturn parseDownload(input, file, res.bytes)\n\t}\n\n\t/**\n\t * Answer an interactive payload.\n\t * When callback_query_id is an http(s) response_url, POST ephemeral JSON to it.\n\t * Otherwise no-op success (Slack has no Telegram-style answerCallbackQuery id).\n\t */\n\tasync answerCallback(input: SlackAnswerCallbackInput): Promise<void> {\n\t\tif (!isHttpsUrl(input.callback_query_id)) {\n\t\t\treturn\n\t\t}\n\t\tconst body: Record<string, unknown> = {\n\t\t\treplace_original: false,\n\t\t\tresponse_type: 'ephemeral',\n\t\t\t...(input.text && { text: input.text })\n\t\t}\n\t\tlet res: Awaited<ReturnType<HttpService['post']>>\n\t\ttry {\n\t\t\tres = await this.#external.post(input.callback_query_id, body, {\n\t\t\t\tlabel: 'Slack response_url',\n\t\t\t\tnoThrow: true,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tthrowSlackTransportError('Slack response_url', error)\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tthrow new SlackClientError({\n\t\t\t\tmessage: `Slack response_url failed with HTTP ${res.status}`,\n\t\t\t\tfailureKind:\n\t\t\t\t\tres.status === 400 || res.status === 401 || res.status === 403 || res.status === 404\n\t\t\t\t\t\t? 'definite_rejection'\n\t\t\t\t\t\t: 'outcome_unknown',\n\t\t\t\tmethod: 'Slack response_url',\n\t\t\t\tstatus: res.status\n\t\t\t})\n\t\t}\n\t}\n\n\t/** POST auth.test */\n\tasync getBot(): Promise<SlackGetBotOutput> {\n\t\treturn parseBot(await this.#api('auth.test', {}, 'Slack auth.test'))\n\t}\n\n\t/** POST chat.postEphemeral */\n\tasync postEphemeral(input: SlackPostEphemeralInput): Promise<SlackMessageOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchannel: input.chat_id,\n\t\t\tuser: input.user_id,\n\t\t\ttext: input.text,\n\t\t\t...(input.reply_markup !== undefined && { blocks: input.reply_markup })\n\t\t}\n\t\tconst result = await this.#api('chat.postEphemeral', body, 'Slack chat.postEphemeral')\n\t\tconst messageTs = result['message_ts']\n\t\tif (typeof messageTs === 'string' && messageTs.length > 0) {\n\t\t\treturn { message_id: messageTs }\n\t\t}\n\t\t// Some workspaces only return ok without message_ts.\n\t\treturn { message_id: 'ephemeral' }\n\t}\n\n\t/** POST conversations.list */\n\tasync listConversations(input: SlackListConversationsInput = {}): Promise<SlackListConversationsOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\t...(input.limit !== undefined && { limit: input.limit }),\n\t\t\t...(input.cursor && { cursor: input.cursor }),\n\t\t\t...(input.types && { types: input.types })\n\t\t}\n\t\treturn parseConversationsList(await this.#api('conversations.list', body, 'Slack conversations.list'))\n\t}\n\n\t/**\n\t * Full assistant.threads.setStatus (custom status + optional loading_messages).\n\t * Prefer this over sendChatAction when the host already has status copy.\n\t * @see https://docs.slack.dev/reference/methods/assistant.threads.setStatus\n\t */\n\tasync setAssistantStatus(input: SlackSetAssistantStatusInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#api(\n\t\t\t\t'assistant.threads.setStatus',\n\t\t\t\t{\n\t\t\t\t\tchannel_id: input.chat_id,\n\t\t\t\t\tthread_ts: input.thread_ts,\n\t\t\t\t\tstatus: input.status,\n\t\t\t\t\t...(input.loading_messages &&\n\t\t\t\t\t\tinput.loading_messages.length > 0 && { loading_messages: input.loading_messages })\n\t\t\t\t},\n\t\t\t\t'Slack assistant.threads.setStatus'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST assistant.threads.setSuggestedPrompts (max 4). */\n\tasync setSuggestedPrompts(input: SlackSetSuggestedPromptsInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#api(\n\t\t\t\t'assistant.threads.setSuggestedPrompts',\n\t\t\t\t{\n\t\t\t\t\tchannel_id: input.chat_id,\n\t\t\t\t\tprompts: input.prompts,\n\t\t\t\t\t...(input.thread_ts && { thread_ts: input.thread_ts }),\n\t\t\t\t\t...(input.title && { title: input.title })\n\t\t\t\t},\n\t\t\t\t'Slack assistant.threads.setSuggestedPrompts'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST views.publish — App Home for a user. */\n\tasync publishHome(input: SlackPublishHomeInput): Promise<void> {\n\t\tparseOk(\n\t\t\tawait this.#api(\n\t\t\t\t'views.publish',\n\t\t\t\t{\n\t\t\t\t\tuser_id: input.user_id,\n\t\t\t\t\tview: input.view,\n\t\t\t\t\t...(input.hash && { hash: input.hash })\n\t\t\t\t},\n\t\t\t\t'Slack views.publish'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST chat.startStream — begins a streaming thread reply. */\n\tasync startStream(input: SlackStartStreamInput): Promise<SlackMessageOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchannel: input.chat_id,\n\t\t\tthread_ts: input.thread_ts,\n\t\t\t...(input.markdown_text && { markdown_text: input.markdown_text }),\n\t\t\t...(input.recipient_user_id && { recipient_user_id: input.recipient_user_id }),\n\t\t\t...(input.recipient_team_id && { recipient_team_id: input.recipient_team_id }),\n\t\t\t...(input.task_display_mode && { task_display_mode: input.task_display_mode })\n\t\t}\n\t\treturn parseStreamTs(await this.#api('chat.startStream', body, 'Slack chat.startStream'))\n\t}\n\n\t/** POST chat.appendStream */\n\tasync appendStream(input: SlackAppendStreamInput): Promise<SlackMessageOutput> {\n\t\treturn parseStreamTs(\n\t\t\tawait this.#api(\n\t\t\t\t'chat.appendStream',\n\t\t\t\t{\n\t\t\t\t\tchannel: input.chat_id,\n\t\t\t\t\tts: input.message_id,\n\t\t\t\t\tmarkdown_text: input.markdown_text\n\t\t\t\t},\n\t\t\t\t'Slack chat.appendStream'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST chat.stopStream */\n\tasync stopStream(input: SlackStopStreamInput): Promise<SlackMessageOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchannel: input.chat_id,\n\t\t\tts: input.message_id,\n\t\t\t...(input.markdown_text && { markdown_text: input.markdown_text }),\n\t\t\t...(input.blocks !== undefined && { blocks: input.blocks })\n\t\t}\n\t\treturn parseStreamTs(await this.#api('chat.stopStream', body, 'Slack chat.stopStream'))\n\t}\n\n\t/** POST auth.revoke — disconnect installation (host-only). */\n\tasync authRevoke(input: SlackAuthRevokeInput = {}): Promise<SlackAuthRevokeOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\t...(input.test !== undefined && { test: input.test })\n\t\t}\n\t\treturn parseAuthRevoke(await this.#api('auth.revoke', body, 'Slack auth.revoke'))\n\t}\n\n\t/** POST users.info */\n\tasync usersInfo(input: SlackUsersInfoInput): Promise<SlackUsersInfoOutput> {\n\t\treturn parseUsersInfo(\n\t\t\tawait this.#api(\n\t\t\t\t'users.info',\n\t\t\t\t{\n\t\t\t\t\tuser: input.user_id,\n\t\t\t\t\t...(input.include_locale !== undefined && { include_locale: input.include_locale })\n\t\t\t\t},\n\t\t\t\t'Slack users.info'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST users.conversations */\n\tasync usersConversations(input: SlackUsersConversationsInput = {}): Promise<SlackListConversationsOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\t...(input.user_id && { user: input.user_id }),\n\t\t\t...(input.limit !== undefined && { limit: input.limit }),\n\t\t\t...(input.cursor && { cursor: input.cursor }),\n\t\t\t...(input.types && { types: input.types }),\n\t\t\t...(input.exclude_archived !== undefined && { exclude_archived: input.exclude_archived })\n\t\t}\n\t\treturn parseConversationsList(await this.#api('users.conversations', body, 'Slack users.conversations'))\n\t}\n\n\t/** POST conversations.info */\n\tasync conversationsInfo(input: SlackConversationInfoInput): Promise<SlackConversationInfoOutput> {\n\t\treturn parseConversationInfo(\n\t\t\tawait this.#api(\n\t\t\t\t'conversations.info',\n\t\t\t\t{\n\t\t\t\t\tchannel: input.chat_id,\n\t\t\t\t\t...(input.include_locale !== undefined && { include_locale: input.include_locale }),\n\t\t\t\t\t...(input.include_num_members !== undefined && {\n\t\t\t\t\t\tinclude_num_members: input.include_num_members\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\t'Slack conversations.info'\n\t\t\t)\n\t\t)\n\t}\n\n\t/** POST conversations.history */\n\tasync conversationsHistory(input: SlackConversationHistoryInput): Promise<SlackConversationMessagesOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchannel: input.chat_id,\n\t\t\t...(input.limit !== undefined && { limit: input.limit }),\n\t\t\t...(input.cursor && { cursor: input.cursor }),\n\t\t\t...(input.oldest && { oldest: input.oldest }),\n\t\t\t...(input.latest && { latest: input.latest }),\n\t\t\t...(input.inclusive !== undefined && { inclusive: input.inclusive })\n\t\t}\n\t\treturn parseConversationMessages(await this.#api('conversations.history', body, 'Slack conversations.history'))\n\t}\n\n\t/** POST conversations.replies */\n\tasync conversationsReplies(input: SlackConversationRepliesInput): Promise<SlackConversationMessagesOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tchannel: input.chat_id,\n\t\t\tts: input.message_id,\n\t\t\t...(input.limit !== undefined && { limit: input.limit }),\n\t\t\t...(input.cursor && { cursor: input.cursor }),\n\t\t\t...(input.oldest && { oldest: input.oldest }),\n\t\t\t...(input.latest && { latest: input.latest }),\n\t\t\t...(input.inclusive !== undefined && { inclusive: input.inclusive })\n\t\t}\n\t\treturn parseConversationMessages(await this.#api('conversations.replies', body, 'Slack conversations.replies'))\n\t}\n\n\t/**\n\t * Multi-file external upload: get URL + PUT each file, then one completeUploadExternal.\n\t * Host may pass `body` (Uint8Array) on each item instead of body_base64.\n\t */\n\tasync sendMediaBatch(\n\t\tinput: SlackSendMediaBatchInput & {\n\t\t\tfiles: Array<SlackSendMediaBatchInput['files'][number] & { body?: Uint8Array }>\n\t\t}\n\t): Promise<SlackSendMediaBatchOutput> {\n\t\tconst completed: { id: string; title?: string }[] = []\n\t\tfor (const file of input.files) {\n\t\t\tconst { bytes, body } = resolveMediaBytes(file)\n\t\t\tconst form = new URLSearchParams()\n\t\t\tform.set('filename', file.file_name)\n\t\t\tform.set('length', String(bytes.byteLength))\n\t\t\tconst upload = parseUploadUrl(\n\t\t\t\tawait this.#apiForm('files.getUploadURLExternal', form, 'Slack files.getUploadURLExternal')\n\t\t\t)\n\t\t\tlet put: Awaited<ReturnType<HttpService['post']>>\n\t\t\ttry {\n\t\t\t\tput = await this.#external.post(upload.upload_url, body, {\n\t\t\t\t\tlabel: 'Slack file upload POST',\n\t\t\t\t\tnoThrow: true,\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': file.content_type ?? 'application/octet-stream'\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tthrowSlackTransportError('Slack file upload POST', error)\n\t\t\t}\n\t\t\tif (!put.ok) {\n\t\t\t\tthrow new SlackClientError({\n\t\t\t\t\tmessage: `Slack file upload POST failed with HTTP ${put.status}`,\n\t\t\t\t\tfailureKind:\n\t\t\t\t\t\tput.status === 400 || put.status === 401 || put.status === 403 || put.status === 404\n\t\t\t\t\t\t\t? 'definite_rejection'\n\t\t\t\t\t\t\t: 'outcome_unknown',\n\t\t\t\t\tmethod: 'Slack file upload POST',\n\t\t\t\t\tstatus: put.status\n\t\t\t\t})\n\t\t\t}\n\t\t\tcompleted.push({\n\t\t\t\tid: upload.file_id,\n\t\t\t\t...(file.title || file.file_name ? { title: file.title ?? file.file_name } : {})\n\t\t\t})\n\t\t}\n\t\treturn parseUploadBatchComplete(\n\t\t\tawait this.#api(\n\t\t\t\t'files.completeUploadExternal',\n\t\t\t\t{\n\t\t\t\t\tfiles: completed,\n\t\t\t\t\tchannel_id: input.chat_id,\n\t\t\t\t\t...(input.reply_to_message_id && { thread_ts: input.reply_to_message_id }),\n\t\t\t\t\t...(input.caption && { initial_comment: input.caption })\n\t\t\t\t},\n\t\t\t\t'Slack files.completeUploadExternal'\n\t\t\t),\n\t\t\tcompleted.map((f) => f.id)\n\t\t)\n\t}\n\n\t/**\n\t * Download file bytes for host (no base64). Tool path still uses downloadFile → body_base64.\n\t */\n\tasync downloadFileBytes(\n\t\tinput: SlackDownloadFileInput\n\t): Promise<{ file_name: string; file_size?: number; body: Uint8Array }> {\n\t\tconst file = parseFileInfo(await this.#api('files.info', { file: input.file_id }, 'Slack files.info'))\n\t\tlet res: Awaited<ReturnType<HttpService['bytes']>>\n\t\ttry {\n\t\t\tres = await this.#http.bytes('GET', file.url_private_download, {\n\t\t\t\tlabel: 'Slack downloadFileBytes',\n\t\t\t\tnoThrow: true,\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: `Bearer ${this.#token}`\n\t\t\t\t}\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tthrowSlackTransportError('Slack downloadFileBytes', error)\n\t\t}\n\t\tif (!res.ok) {\n\t\t\tthrow new SlackClientError({\n\t\t\t\tmessage: `Slack downloadFileBytes failed with HTTP ${res.status}`,\n\t\t\t\tfailureKind:\n\t\t\t\t\tres.status === 400 || res.status === 401 || res.status === 403 || res.status === 404\n\t\t\t\t\t\t? 'definite_rejection'\n\t\t\t\t\t\t: 'outcome_unknown',\n\t\t\t\tmethod: 'Slack downloadFileBytes',\n\t\t\t\tstatus: res.status\n\t\t\t})\n\t\t}\n\t\tconst out: { file_name: string; file_size?: number; body: Uint8Array } = {\n\t\t\tfile_name: input.file_name ?? file.file_name ?? file.file_id,\n\t\t\tbody: res.bytes\n\t\t}\n\t\tif (file.file_size !== undefined) out.file_size = file.file_size\n\t\treturn out\n\t}\n}\n\nexport { isSlackDefiniteRejection, isSlackOutcomeUnknown, SlackClientError }\n","import { z } from 'zod'\n\nimport { defineModule, defineTool } from '../../core/define'\nimport { SlackClient } from './client'\nimport {\n\tslackAnswerCallbackInputSchema,\n\tslackAuthSchema,\n\tslackClearReactionInputSchema,\n\tslackDownloadFileInputSchema,\n\tslackDownloadFileOutputSchema,\n\tslackEditTextInputSchema,\n\tslackGetBotOutputSchema,\n\tslackMessageOutputSchema,\n\tslackOkOutputSchema,\n\tslackSendChatActionInputSchema,\n\tslackSendMediaInputSchema,\n\tslackSendTextInputSchema,\n\tslackSetReactionInputSchema\n} from './contracts'\n\nconst emptyInputSchema = z.object({}).describe('No input fields')\n\nexport const slackSendTextTool = defineTool({\n\tid: 'slack-send-text',\n\tname: 'slackSendText',\n\tdescription:\n\t\t'Send a text message to a Slack channel or DM. Optional reply_to_message_id anchors a thread reply. Optional reply_markup is a Block Kit blocks array. Returns the new message_id (ts).',\n\tinputSchema: slackSendTextInputSchema,\n\toutputSchema: slackMessageOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'node',\n\texecute: async (input, ctx) => SlackClient.fromContext(ctx).sendText(input)\n})\n\nexport const slackEditTextTool = defineTool({\n\tid: 'slack-edit-text',\n\tname: 'slackEditText',\n\tdescription: 'Edit the text of an existing Slack message. Used for progressive live updates and corrections.',\n\tinputSchema: slackEditTextInputSchema,\n\toutputSchema: slackMessageOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'node',\n\texecute: async (input, ctx) => SlackClient.fromContext(ctx).editText(input)\n})\n\nexport const slackSendChatActionTool = defineTool({\n\tid: 'slack-send-chat-action',\n\tname: 'slackSendChatAction',\n\tdescription:\n\t\t'Show busy status on a Slack assistant thread. Pass reply_to_message_id as the thread root ts (thread_ts) to call assistant.threads.setStatus (e.g. “is checking the request…”). Without reply_to_message_id this is a no-op (no channel-level typing API).',\n\tinputSchema: slackSendChatActionInputSchema,\n\toutputSchema: slackOkOutputSchema,\n\tsideEffect: 'none',\n\truntime: 'node',\n\texecute: async (input, ctx) => {\n\t\tawait SlackClient.fromContext(ctx).sendChatAction(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const slackSetReactionTool = defineTool({\n\tid: 'slack-set-reaction',\n\tname: 'slackSetReaction',\n\tdescription:\n\t\t'Add an emoji reaction on a Slack message. Pass the emoji name with or without colons (e.g. thumbsup or :thumbsup:).',\n\tinputSchema: slackSetReactionInputSchema,\n\toutputSchema: slackOkOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'node',\n\texecute: async (input, ctx) => {\n\t\tawait SlackClient.fromContext(ctx).setReaction(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const slackClearReactionTool = defineTool({\n\tid: 'slack-clear-reaction',\n\tname: 'slackClearReaction',\n\tdescription:\n\t\t'Remove one emoji reaction the bot added on a Slack message. emoji is required (Slack cannot clear all reactions in one call).',\n\tinputSchema: slackClearReactionInputSchema,\n\toutputSchema: slackOkOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'node',\n\texecute: async (input, ctx) => {\n\t\tawait SlackClient.fromContext(ctx).clearReaction(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const slackSendMediaTool = defineTool({\n\tid: 'slack-send-media',\n\tname: 'slackSendMedia',\n\tdescription:\n\t\t'Upload one photo or document to a Slack channel from a base64 body (external upload flow). Optional caption becomes the initial comment.',\n\tinputSchema: slackSendMediaInputSchema,\n\toutputSchema: slackMessageOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'node',\n\texecute: async (input, ctx) => SlackClient.fromContext(ctx).sendMedia(input)\n})\n\nexport const slackDownloadFileTool = defineTool({\n\tid: 'slack-download-file',\n\tname: 'slackDownloadFile',\n\tdescription: 'Download a Slack file by file_id and return the body as base64 with optional size and name.',\n\tinputSchema: slackDownloadFileInputSchema,\n\toutputSchema: slackDownloadFileOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'node',\n\texecute: async (input, ctx) => SlackClient.fromContext(ctx).downloadFile(input)\n})\n\nexport const slackAnswerCallbackTool = defineTool({\n\tid: 'slack-answer-callback',\n\tname: 'slackAnswerCallback',\n\tdescription:\n\t\t'Acknowledge a Slack interactive payload. When callback_query_id is a response_url, posts an ephemeral reply. Otherwise succeeds without a network call.',\n\tinputSchema: slackAnswerCallbackInputSchema,\n\toutputSchema: slackOkOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'node',\n\texecute: async (input, ctx) => {\n\t\tawait SlackClient.fromContext(ctx).answerCallback(input)\n\t\treturn { ok: true }\n\t}\n})\n\nexport const slackGetBotTool = defineTool({\n\tid: 'slack-get-bot',\n\tname: 'slackGetBot',\n\tdescription: 'Return the current Slack bot identity, including bot_id, username, and display_name.',\n\tinputSchema: emptyInputSchema,\n\toutputSchema: slackGetBotOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'node',\n\texecute: async (_input, ctx) => SlackClient.fromContext(ctx).getBot()\n})\n\nexport const slackModule = defineModule({\n\tid: 'slack',\n\ttitle: 'Slack',\n\tdescription:\n\t\t'Slack Web API vendor pack: text, media upload, chat-action parity, reactions, file download, interactive callbacks, bot identity. Expand with more Web API methods over time. Not a multi-provider messaging seam.',\n\truntime: 'node',\n\tauth: { type: 'custom', schema: slackAuthSchema },\n\tcategories: ['messaging', 'chat'],\n\tclassification: 'pii',\n\ttags: ['slack'],\n\ttools: [\n\t\tslackSendTextTool,\n\t\tslackEditTextTool,\n\t\tslackSendChatActionTool,\n\t\tslackSetReactionTool,\n\t\tslackClearReactionTool,\n\t\tslackSendMediaTool,\n\t\tslackDownloadFileTool,\n\t\tslackAnswerCallbackTool,\n\t\tslackGetBotTool\n\t]\n})\n","/**\n * Pure Slack mrkdwn / reference helpers (no HTTP).\n * Host uses these when resolving mentions, channel refs, and permalinks for tools.\n */\n\n/** User mention: `<@U123>` or `<@U123|label>` → user id. */\nconst USER_MENTION = /<@([UW][A-Z0-9]+)(?:\\|[^>]*)?>/g\n\n/** Channel reference: `<#C123>` or `<#C123|name>` → channel id. */\nconst CHANNEL_REF = /<#([CGD][A-Z0-9]+)(?:\\|[^>]*)?>/g\n\n/** Special commands / mailto / bare links in angle brackets. */\nconst SPECIAL_CMD = /<!([^>|]+)(?:\\|[^>]*)?>/g\n\n/**\n * Extract Slack user ids mentioned in message text (`<@U…>`).\n */\nexport function extractSlackUserMentions(text: string): string[] {\n\tconst ids: string[] = []\n\tconst seen = new Set<string>()\n\tUSER_MENTION.lastIndex = 0\n\tlet match: RegExpExecArray | null\n\twhile ((match = USER_MENTION.exec(text)) !== null) {\n\t\tconst id = match[1]\n\t\tif (id && !seen.has(id)) {\n\t\t\tseen.add(id)\n\t\t\tids.push(id)\n\t\t}\n\t}\n\treturn ids\n}\n\n/**\n * Extract channel ids from `<#C…>` references in text.\n */\nexport function extractSlackChannelRefs(text: string): string[] {\n\tconst ids: string[] = []\n\tconst seen = new Set<string>()\n\tCHANNEL_REF.lastIndex = 0\n\tlet match: RegExpExecArray | null\n\twhile ((match = CHANNEL_REF.exec(text)) !== null) {\n\t\tconst id = match[1]\n\t\tif (id && !seen.has(id)) {\n\t\t\tseen.add(id)\n\t\t\tids.push(id)\n\t\t}\n\t}\n\treturn ids\n}\n\n/**\n * Format a user mention for outgoing mrkdwn.\n */\nexport function formatSlackUserMention(userId: string, label?: string): string {\n\treturn label && label.length > 0 ? `<@${userId}|${label}>` : `<@${userId}>`\n}\n\n/**\n * Format a channel reference for outgoing mrkdwn.\n */\nexport function formatSlackChannelRef(channelId: string, name?: string): string {\n\treturn name && name.length > 0 ? `<#${channelId}|${name}>` : `<#${channelId}>`\n}\n\n/**\n * Build an app message permalink.\n * @see https://api.slack.com/methods/chat.getPermalink (host may also call the API)\n */\nexport function formatSlackMessagePermalink(input: {\n\tteam_domain: string\n\tchat_id: string\n\tmessage_id: string\n}): string {\n\tconst domain = input.team_domain.replace(/^https?:\\/\\//, '').replace(/\\.slack\\.com\\/?$/, '')\n\tconst ts = input.message_id.replace('.', '')\n\treturn `https://${domain}.slack.com/archives/${input.chat_id}/p${ts}`\n}\n\n/**\n * Strip a leading bot user mention from inbound text (common in channels with @bot).\n * Only removes a mention of `botUserId` at the start (optional surrounding whitespace).\n */\nexport function stripLeadingSlackBotMention(text: string, botUserId: string): string {\n\tif (!botUserId) return text\n\tconst escaped = botUserId.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\tconst re = new RegExp(`^\\\\s*<@${escaped}(?:\\\\|[^>]*)?>\\\\s*`)\n\treturn text.replace(re, '')\n}\n\n/**\n * Lightweight mrkdwn → plain-ish text for logging / model context (not full Slack rendering).\n * Removes mention markup, channel refs, and special commands; keeps link labels when present.\n */\nexport function slackMrkdwnToPlainText(text: string): string {\n\tlet out = text\n\tout = out.replace(USER_MENTION, (_m, id: string) => `@${id}`)\n\tout = out.replace(CHANNEL_REF, (_m, id: string) => `#${id}`)\n\tout = out.replace(SPECIAL_CMD, (_m, cmd: string) => `@${cmd}`)\n\t// <url|label> or <url>\n\tout = out.replace(/<([^|>]+)\\|([^>]+)>/g, '$2')\n\tout = out.replace(/<([^>]+)>/g, '$1')\n\treturn out\n}\n","import { createHmac, timingSafeEqual } from 'node:crypto'\n\nimport { isPlainObject, isString } from 'es-toolkit'\n\n/**\n * Verify Slack request signature (X-Slack-Signature).\n * HMAC-SHA256 of `v0:{timestamp}:{raw_body}` compared to `v0={hex}`.\n * Rejects empty inputs and timestamps older/newer than maxAgeSeconds (default 5 minutes).\n */\nexport function verifySlackRequestSignature(input: {\n\tsigning_secret: string\n\traw_body: string\n\ttimestamp: string\n\tsignature: string\n\t/** Max clock skew in seconds. Default 300 (Slack recommendation). */\n\tmaxAgeSeconds?: number\n\t/** Clock override for tests. */\n\tnowSeconds?: number\n}): boolean {\n\tconst { signing_secret, raw_body, timestamp, signature } = input\n\tif (!signing_secret || !timestamp || !signature) return false\n\tif (!/^\\d+$/.test(timestamp)) return false\n\n\tconst maxAge = input.maxAgeSeconds ?? 300\n\tconst now = input.nowSeconds ?? Math.floor(Date.now() / 1000)\n\tconst ts = Number.parseInt(timestamp, 10)\n\tif (!Number.isFinite(ts) || Math.abs(now - ts) > maxAge) return false\n\n\tconst base = `v0:${timestamp}:${raw_body}`\n\tconst digest = createHmac('sha256', signing_secret).update(base, 'utf8').digest('hex')\n\tconst expected = `v0=${digest}`\n\n\tconst a = Buffer.from(expected, 'utf8')\n\tconst b = Buffer.from(signature, 'utf8')\n\tif (a.byteLength !== b.byteLength) return false\n\treturn timingSafeEqual(a, b)\n}\n\nexport type SlackInboundMedia = {\n\tkind: string\n\tref?: string\n\tmedia_type?: string\n\tfile_name?: string\n\tfile_size?: number\n\tunique_ref?: string\n}\n\n/** Package-owned normalized inbound event for host routing. */\nexport type SlackInboundEvent = {\n\tchannel: 'slack'\n\tevent_id: string\n\tchat_id: string\n\tuser_id?: string\n\tmessage_id?: string\n\ttext?: string\n\tmedia?: SlackInboundMedia[]\n\treply_to?: string\n\traw_type: string\n\treceived_at: string\n\t/** Interactive response_url when raw_type is an interaction. */\n\tcallback_query_id?: string\n\t/** Opaque action value / callback data when present. */\n\tcallback_data?: string\n\tusername?: string\n\tchat_type?: string\n\tteam_id?: string\n}\n\nexport type ParseSlackEventResult =\n\t| { ok: true; event: SlackInboundEvent }\n\t| { ok: true; challenge: string }\n\t| { ok: false; reason: string }\n\n/**\n * Parse one raw Slack Events API / interactive body into a normalized inbound event.\n * Handles url_verification challenges, event_callback messages, and interactive payloads.\n */\nexport function parseSlackEvent(\n\tbody: unknown,\n\toptions?: { received_at?: string; allow_group_chats?: boolean }\n): ParseSlackEventResult {\n\tif (isString(body)) {\n\t\treturn parseSlackEvent(tryParseJson(body) ?? tryParsePayloadForm(body) ?? body, options)\n\t}\n\tif (!isPlainObject(body)) {\n\t\treturn { ok: false, reason: 'body_not_object' }\n\t}\n\n\tconst receivedAt = options?.received_at ?? new Date().toISOString()\n\tconst allowGroups = options?.allow_group_chats ?? true\n\n\tif (body['type'] === 'url_verification' && isString(body['challenge'])) {\n\t\treturn { ok: true, challenge: body['challenge'] }\n\t}\n\n\tif (body['type'] === 'event_callback' && isPlainObject(body['event'])) {\n\t\treturn parseEventCallback(body, body['event'], receivedAt, allowGroups)\n\t}\n\n\tif (isInteractionType(body['type'])) {\n\t\treturn parseInteraction(body, receivedAt)\n\t}\n\n\t// Some hosts pass the inner event object only.\n\tif (isString(body['type']) && (body['type'] === 'message' || body['type'] === 'app_mention')) {\n\t\tconst teamId = isString(body['team']) ? body['team'] : undefined\n\t\treturn parseMessageEvent(body, {\n\t\t\teventId: firstString(body['event_ts'], body['ts']) ?? 'unknown',\n\t\t\treceivedAt,\n\t\t\tallowGroups,\n\t\t\trawType: body['type'],\n\t\t\t...(teamId && { teamId })\n\t\t})\n\t}\n\n\treturn { ok: false, reason: 'unsupported_event_type' }\n}\n\nfunction parseEventCallback(\n\tenvelope: Record<string, unknown>,\n\tevent: Record<string, unknown>,\n\treceivedAt: string,\n\tallowGroups: boolean\n): ParseSlackEventResult {\n\tconst eventId = firstString(envelope['event_id'], event['event_ts'], event['ts'])\n\tif (!eventId) return { ok: false, reason: 'missing_event_id' }\n\tconst teamId = isString(envelope['team_id']) ? envelope['team_id'] : undefined\n\tconst type = isString(event['type']) ? event['type'] : 'unknown'\n\n\tif (type === 'message' || type === 'app_mention') {\n\t\treturn parseMessageEvent(event, {\n\t\t\teventId,\n\t\t\treceivedAt,\n\t\t\tallowGroups,\n\t\t\trawType: type,\n\t\t\t...(teamId && { teamId })\n\t\t})\n\t}\n\n\treturn { ok: false, reason: 'unsupported_event_type' }\n}\n\nfunction parseMessageEvent(\n\tevent: Record<string, unknown>,\n\tctx: {\n\t\teventId: string\n\t\tteamId?: string\n\t\treceivedAt: string\n\t\tallowGroups: boolean\n\t\trawType: string\n\t}\n): ParseSlackEventResult {\n\t// Bot message echoes / message_changed noise — skip subtypes except file_share.\n\tconst subtype = isString(event['subtype']) ? event['subtype'] : undefined\n\tif (subtype && subtype !== 'file_share') {\n\t\treturn { ok: false, reason: 'unsupported_message_subtype' }\n\t}\n\n\tconst chatId = firstString(event['channel'])\n\tif (!chatId) return { ok: false, reason: 'missing_channel' }\n\n\tconst channelType = firstString(event['channel_type'])\n\tif (!ctx.allowGroups && channelType && channelType !== 'im' && channelType !== 'mpim') {\n\t\treturn { ok: false, reason: 'non_dm_chat' }\n\t}\n\n\tconst userId = firstString(event['user'])\n\tconst messageId = firstString(event['ts'])\n\tconst text = firstString(event['text'])\n\tconst media = collectMedia(event)\n\tconst replyTo = firstString(event['thread_ts'])\n\t// thread_ts equals ts for root messages; only surface as reply_to when different.\n\tconst replyToParent = replyTo && messageId && replyTo !== messageId ? replyTo : undefined\n\n\tif (!text && media.length === 0) {\n\t\treturn { ok: false, reason: 'empty_message' }\n\t}\n\n\tconst inbound: SlackInboundEvent = {\n\t\tchannel: 'slack',\n\t\tevent_id: ctx.eventId,\n\t\tchat_id: chatId,\n\t\traw_type: ctx.rawType,\n\t\treceived_at: ctx.receivedAt,\n\t\t...(userId && { user_id: userId }),\n\t\t...(messageId && { message_id: messageId }),\n\t\t...(text && { text }),\n\t\t...(media.length > 0 && { media }),\n\t\t...(replyToParent && { reply_to: replyToParent }),\n\t\t...(channelType && { chat_type: channelType }),\n\t\t...(ctx.teamId && { team_id: ctx.teamId })\n\t}\n\treturn { ok: true, event: inbound }\n}\n\nfunction parseInteraction(body: Record<string, unknown>, receivedAt: string): ParseSlackEventResult {\n\tconst type = isString(body['type']) ? body['type'] : 'interaction'\n\tconst channel = body['channel']\n\tconst chatId = isPlainObject(channel) ? firstString(channel['id']) : firstString(body['channel_id'], body['channel'])\n\tif (!chatId) return { ok: false, reason: 'interaction_missing_channel' }\n\n\tconst user = body['user']\n\tconst userId = isPlainObject(user) ? firstString(user['id']) : firstString(body['user_id'])\n\tconst username = isPlainObject(user) ? firstString(user['username'], user['name']) : undefined\n\n\tconst message = body['message']\n\tconst messageId = isPlainObject(message) ? firstString(message['ts']) : firstString(body['message_ts'])\n\n\tconst responseUrl = firstString(body['response_url'])\n\tconst callbackData = extractCallbackData(body)\n\tconst team = body['team']\n\tconst teamId = isPlainObject(team) ? firstString(team['id']) : firstString(body['team_id'])\n\tconst eventId = firstString(body['trigger_id'], responseUrl, messageId) ?? `${type}:${chatId}`\n\n\tconst inbound: SlackInboundEvent = {\n\t\tchannel: 'slack',\n\t\tevent_id: eventId,\n\t\tchat_id: chatId,\n\t\traw_type: type,\n\t\treceived_at: receivedAt,\n\t\t...(userId && { user_id: userId }),\n\t\t...(username && { username }),\n\t\t...(messageId && { message_id: messageId }),\n\t\t...(responseUrl && { callback_query_id: responseUrl }),\n\t\t...(callbackData && { callback_data: callbackData }),\n\t\t...(teamId && { team_id: teamId })\n\t}\n\treturn { ok: true, event: inbound }\n}\n\nfunction extractCallbackData(body: Record<string, unknown>): string | undefined {\n\tconst actions = body['actions']\n\tif (Array.isArray(actions) && actions.length > 0) {\n\t\tconst first = actions[0]\n\t\tif (isPlainObject(first)) {\n\t\t\tconst selected = first['selected_option']\n\t\t\tconst selectedValue = isPlainObject(selected) ? selected['value'] : undefined\n\t\t\treturn firstString(first['value'], first['action_id'], selectedValue)\n\t\t}\n\t}\n\tconst view = body['view']\n\tif (isPlainObject(view) && isString(view['callback_id'])) {\n\t\treturn view['callback_id']\n\t}\n\treturn firstString(body['callback_id'])\n}\n\nfunction collectMedia(event: Record<string, unknown>): SlackInboundMedia[] {\n\tconst out: SlackInboundMedia[] = []\n\tconst files = event['files']\n\tif (!Array.isArray(files)) return out\n\tfor (const file of files) {\n\t\tif (!isPlainObject(file) || !isString(file['id'])) continue\n\t\tconst mimetype = isString(file['mimetype']) ? file['mimetype'] : undefined\n\t\tconst kind = mimetype?.startsWith('image/') ? 'photo' : 'document'\n\t\tout.push({\n\t\t\tkind,\n\t\t\tref: file['id'],\n\t\t\t...(isString(file['name']) && { file_name: file['name'] }),\n\t\t\t...(typeof file['size'] === 'number' && { file_size: file['size'] }),\n\t\t\t...(mimetype && { media_type: mimetype }),\n\t\t\t...(isString(file['file_access']) && { unique_ref: file['file_access'] })\n\t\t})\n\t}\n\treturn out\n}\n\nfunction isInteractionType(type: unknown): boolean {\n\treturn (\n\t\ttype === 'block_actions' ||\n\t\ttype === 'interactive_message' ||\n\t\ttype === 'shortcut' ||\n\t\ttype === 'message_action' ||\n\t\ttype === 'view_submission' ||\n\t\ttype === 'view_closed' ||\n\t\ttype === 'slash_command'\n\t)\n}\n\nfunction tryParseJson(raw: string): unknown {\n\ttry {\n\t\treturn JSON.parse(raw)\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\n/** Interactive endpoints often post `payload=<urlencoded json>`. */\nfunction tryParsePayloadForm(raw: string): unknown {\n\tif (!raw.includes('payload=')) return undefined\n\ttry {\n\t\tconst params = new URLSearchParams(raw)\n\t\tconst payload = params.get('payload')\n\t\tif (!payload) return undefined\n\t\treturn JSON.parse(payload)\n\t} catch {\n\t\treturn undefined\n\t}\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n\tfor (const value of values) {\n\t\tif (isString(value) && value.length > 0) return value\n\t}\n\treturn undefined\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { t as ToolError } from "./errors-DoSpNHvs.js";
|
|
2
|
+
import { n as defineModule, r as defineTool } from "./define-CvpJ_pNP.js";
|
|
3
|
+
import { n as requireAuth } from "./provider-CgDAlg6K.js";
|
|
4
|
+
import { t as AwsService } from "./aws-service-msttbPrz.js";
|
|
5
|
+
import { t as parseAwsJsonBody } from "./aws-json-CecFqzqX.js";
|
|
6
|
+
import { isPlainObject, isString } from "es-toolkit";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
//#region src/vendors/sqs/contracts.ts
|
|
9
|
+
const MAX_SQS_MESSAGE_CHARS = 1048576;
|
|
10
|
+
const sqsAuthSchema = z.object({
|
|
11
|
+
access_key_id: z.string().min(1).describe("AWS access key id"),
|
|
12
|
+
secret_access_key: z.string().min(1).describe("AWS secret access key"),
|
|
13
|
+
region: z.string().min(1).describe("AWS region for SQS"),
|
|
14
|
+
session_token: z.string().min(1).optional().describe("Optional session token"),
|
|
15
|
+
queue_url: z.url().describe("Default SQS queue URL")
|
|
16
|
+
});
|
|
17
|
+
const queueEnqueueInputSchema = z.object({
|
|
18
|
+
body: z.string().min(1).max(MAX_SQS_MESSAGE_CHARS).describe("Message body"),
|
|
19
|
+
delay_seconds: z.int().min(0).max(900).optional().describe("Delivery delay in seconds"),
|
|
20
|
+
message_group_id: z.string().min(1).max(128).optional().describe("FIFO message group id"),
|
|
21
|
+
deduplication_id: z.string().min(1).max(128).optional().describe("FIFO deduplication id")
|
|
22
|
+
});
|
|
23
|
+
const queueEnqueueOutputSchema = z.object({
|
|
24
|
+
message_id: z.string(),
|
|
25
|
+
body_md5: z.string().optional(),
|
|
26
|
+
sequence_number: z.string().optional()
|
|
27
|
+
});
|
|
28
|
+
const queueReceiveInputSchema = z.object({
|
|
29
|
+
max_messages: z.int().min(1).max(10).optional().describe("Maximum messages to receive; defaults to 1"),
|
|
30
|
+
wait_seconds: z.int().min(0).max(20).optional().describe("Long-poll wait in seconds"),
|
|
31
|
+
visibility_timeout_seconds: z.int().min(0).max(43200).optional().describe("Temporary message invisibility duration in seconds")
|
|
32
|
+
});
|
|
33
|
+
const queueMessageSchema = z.object({
|
|
34
|
+
message_id: z.string(),
|
|
35
|
+
receipt_handle: z.string().describe("Opaque handle used to acknowledge or extend this delivery"),
|
|
36
|
+
body: z.string(),
|
|
37
|
+
body_md5: z.string().optional(),
|
|
38
|
+
attributes: z.record(z.string(), z.string()).optional().describe("Provider-supplied message attributes")
|
|
39
|
+
});
|
|
40
|
+
const queueReceiveOutputSchema = z.object({ messages: z.array(queueMessageSchema) });
|
|
41
|
+
const queueReceiptInputSchema = z.object({ receipt_handle: z.string().min(1).describe("Receipt handle returned by receive") });
|
|
42
|
+
const queueAcknowledgeOutputSchema = z.object({ acknowledged: z.literal(true) });
|
|
43
|
+
const queueExtendVisibilityInputSchema = queueReceiptInputSchema.extend({ visibility_timeout_seconds: z.int().min(0).max(43200).describe("New invisibility duration in seconds") });
|
|
44
|
+
const queueExtendVisibilityOutputSchema = z.object({
|
|
45
|
+
extended: z.literal(true),
|
|
46
|
+
visibility_timeout_seconds: z.int().min(0).max(43200)
|
|
47
|
+
});
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/vendors/sqs/client.ts
|
|
50
|
+
const jsonHeaders = (action) => ({
|
|
51
|
+
"content-type": "application/x-amz-json-1.0",
|
|
52
|
+
"x-amz-target": `AmazonSQS.${action}`
|
|
53
|
+
});
|
|
54
|
+
function attributes(value) {
|
|
55
|
+
if (!isPlainObject(value)) return void 0;
|
|
56
|
+
const result = {};
|
|
57
|
+
for (const [key, current] of Object.entries(value)) if (isString(current)) result[key] = current;
|
|
58
|
+
return Object.keys(result).length > 0 ? result : void 0;
|
|
59
|
+
}
|
|
60
|
+
function mapMessage(value) {
|
|
61
|
+
if (!isPlainObject(value)) return void 0;
|
|
62
|
+
const messageId = value["MessageId"];
|
|
63
|
+
const receiptHandle = value["ReceiptHandle"];
|
|
64
|
+
const body = value["Body"];
|
|
65
|
+
if (!isString(messageId) || !isString(receiptHandle) || !isString(body)) return void 0;
|
|
66
|
+
const result = {
|
|
67
|
+
message_id: messageId,
|
|
68
|
+
receipt_handle: receiptHandle,
|
|
69
|
+
body
|
|
70
|
+
};
|
|
71
|
+
if (isString(value["MD5OfBody"])) result.body_md5 = value["MD5OfBody"];
|
|
72
|
+
const mappedAttributes = attributes(value["Attributes"]);
|
|
73
|
+
if (mappedAttributes) result.attributes = mappedAttributes;
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
var SqsClient = class SqsClient {
|
|
77
|
+
#auth;
|
|
78
|
+
#aws;
|
|
79
|
+
constructor(auth, options = {}) {
|
|
80
|
+
const parsed = sqsAuthSchema.safeParse(auth);
|
|
81
|
+
if (!parsed.success) throw new ToolError("Invalid SQS auth credentials", {
|
|
82
|
+
code: "bad_auth",
|
|
83
|
+
details: { issues: parsed.error.issues.map((issue) => issue.message) }
|
|
84
|
+
});
|
|
85
|
+
this.#auth = parsed.data;
|
|
86
|
+
const awsOptions = {
|
|
87
|
+
accessKeyId: this.#auth.access_key_id,
|
|
88
|
+
secretAccessKey: this.#auth.secret_access_key,
|
|
89
|
+
region: this.#auth.region,
|
|
90
|
+
service: "sqs",
|
|
91
|
+
baseURL: `https://sqs.${this.#auth.region}.amazonaws.com`,
|
|
92
|
+
label: "SQS",
|
|
93
|
+
...options.fetch && { fetch: options.fetch },
|
|
94
|
+
...options.signal && { signal: options.signal },
|
|
95
|
+
...this.#auth.session_token && { sessionToken: this.#auth.session_token }
|
|
96
|
+
};
|
|
97
|
+
this.#aws = new AwsService(awsOptions);
|
|
98
|
+
}
|
|
99
|
+
static fromContext(ctx) {
|
|
100
|
+
return new SqsClient(requireAuth(ctx, sqsAuthSchema), {
|
|
101
|
+
...ctx.fetch && { fetch: ctx.fetch },
|
|
102
|
+
...ctx.signal && { signal: ctx.signal }
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
async enqueue(input) {
|
|
106
|
+
const body = {
|
|
107
|
+
QueueUrl: this.#auth.queue_url,
|
|
108
|
+
MessageBody: input.body
|
|
109
|
+
};
|
|
110
|
+
if (input.delay_seconds !== void 0) body["DelaySeconds"] = input.delay_seconds;
|
|
111
|
+
if (input.message_group_id) body["MessageGroupId"] = input.message_group_id;
|
|
112
|
+
if (input.deduplication_id) body["MessageDeduplicationId"] = input.deduplication_id;
|
|
113
|
+
const data = await this.#postJson("SendMessage", body);
|
|
114
|
+
if (!isPlainObject(data) || !isString(data["MessageId"])) throw new ToolError("Unexpected SQS SendMessage response", { code: "upstream" });
|
|
115
|
+
const output = { message_id: data["MessageId"] };
|
|
116
|
+
if (isString(data["MD5OfMessageBody"])) output.body_md5 = data["MD5OfMessageBody"];
|
|
117
|
+
if (isString(data["SequenceNumber"])) output.sequence_number = data["SequenceNumber"];
|
|
118
|
+
return output;
|
|
119
|
+
}
|
|
120
|
+
async receive(input = {}) {
|
|
121
|
+
const body = {
|
|
122
|
+
QueueUrl: this.#auth.queue_url,
|
|
123
|
+
MaxNumberOfMessages: input.max_messages ?? 1,
|
|
124
|
+
AttributeNames: ["All"]
|
|
125
|
+
};
|
|
126
|
+
if (input.wait_seconds !== void 0) body["WaitTimeSeconds"] = input.wait_seconds;
|
|
127
|
+
if (input.visibility_timeout_seconds !== void 0) body["VisibilityTimeout"] = input.visibility_timeout_seconds;
|
|
128
|
+
const data = await this.#postJson("ReceiveMessage", body);
|
|
129
|
+
if (!isPlainObject(data)) throw new ToolError("Unexpected SQS ReceiveMessage response", { code: "upstream" });
|
|
130
|
+
const rawMessages = data["Messages"];
|
|
131
|
+
return { messages: Array.isArray(rawMessages) ? rawMessages.map(mapMessage).filter((message) => message !== void 0) : [] };
|
|
132
|
+
}
|
|
133
|
+
async acknowledge(input) {
|
|
134
|
+
await this.#postJson("DeleteMessage", {
|
|
135
|
+
QueueUrl: this.#auth.queue_url,
|
|
136
|
+
ReceiptHandle: input.receipt_handle
|
|
137
|
+
});
|
|
138
|
+
return { acknowledged: true };
|
|
139
|
+
}
|
|
140
|
+
async extendVisibility(input) {
|
|
141
|
+
await this.#postJson("ChangeMessageVisibility", {
|
|
142
|
+
QueueUrl: this.#auth.queue_url,
|
|
143
|
+
ReceiptHandle: input.receipt_handle,
|
|
144
|
+
VisibilityTimeout: input.visibility_timeout_seconds
|
|
145
|
+
});
|
|
146
|
+
return {
|
|
147
|
+
extended: true,
|
|
148
|
+
visibility_timeout_seconds: input.visibility_timeout_seconds
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/** SQS uses application/x-amz-json-1.0 — ofetch does not auto-parse that content-type. */
|
|
152
|
+
async #postJson(action, body) {
|
|
153
|
+
const { data } = await this.#aws.post("/", body, { headers: jsonHeaders(action) });
|
|
154
|
+
return parseAwsJsonBody(data);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region src/vendors/sqs/module.ts
|
|
159
|
+
const sqsSendTool = defineTool({
|
|
160
|
+
id: "sqs-send",
|
|
161
|
+
name: "sqsSend",
|
|
162
|
+
description: "Send one message to the configured SQS queue, with optional delay and FIFO controls.",
|
|
163
|
+
inputSchema: queueEnqueueInputSchema,
|
|
164
|
+
outputSchema: queueEnqueueOutputSchema,
|
|
165
|
+
sideEffect: "write",
|
|
166
|
+
runtime: "both",
|
|
167
|
+
network: true,
|
|
168
|
+
execute: async (input, ctx) => SqsClient.fromContext(ctx).enqueue(input)
|
|
169
|
+
});
|
|
170
|
+
const sqsReceiveTool = defineTool({
|
|
171
|
+
id: "sqs-receive",
|
|
172
|
+
name: "sqsReceive",
|
|
173
|
+
description: "Receive up to 10 messages from the configured SQS queue, with optional long polling and visibility timeout.",
|
|
174
|
+
inputSchema: queueReceiveInputSchema,
|
|
175
|
+
outputSchema: queueReceiveOutputSchema,
|
|
176
|
+
sideEffect: "write",
|
|
177
|
+
runtime: "both",
|
|
178
|
+
network: true,
|
|
179
|
+
execute: async (input, ctx) => SqsClient.fromContext(ctx).receive(input)
|
|
180
|
+
});
|
|
181
|
+
const sqsDeleteTool = defineTool({
|
|
182
|
+
id: "sqs-delete",
|
|
183
|
+
name: "sqsDelete",
|
|
184
|
+
description: "Delete a received SQS message using its receipt handle after processing succeeds.",
|
|
185
|
+
inputSchema: queueReceiptInputSchema,
|
|
186
|
+
outputSchema: queueAcknowledgeOutputSchema,
|
|
187
|
+
sideEffect: "delete",
|
|
188
|
+
runtime: "both",
|
|
189
|
+
network: true,
|
|
190
|
+
execute: async (input, ctx) => SqsClient.fromContext(ctx).acknowledge(input)
|
|
191
|
+
});
|
|
192
|
+
const sqsChangeVisibilityTool = defineTool({
|
|
193
|
+
id: "sqs-change-visibility",
|
|
194
|
+
name: "sqsChangeVisibility",
|
|
195
|
+
description: "Change the visibility timeout for a received SQS message using its receipt handle.",
|
|
196
|
+
inputSchema: queueExtendVisibilityInputSchema,
|
|
197
|
+
outputSchema: queueExtendVisibilityOutputSchema,
|
|
198
|
+
sideEffect: "write",
|
|
199
|
+
runtime: "both",
|
|
200
|
+
network: true,
|
|
201
|
+
execute: async (input, ctx) => SqsClient.fromContext(ctx).extendVisibility(input)
|
|
202
|
+
});
|
|
203
|
+
const sqsModule = defineModule({
|
|
204
|
+
id: "sqs",
|
|
205
|
+
title: "SQS",
|
|
206
|
+
description: "Send, receive, delete, and extend message visibility in Amazon SQS.",
|
|
207
|
+
runtime: "both",
|
|
208
|
+
auth: {
|
|
209
|
+
type: "custom",
|
|
210
|
+
schema: sqsAuthSchema
|
|
211
|
+
},
|
|
212
|
+
categories: ["queue", "aws"],
|
|
213
|
+
classification: "standard",
|
|
214
|
+
tags: ["sqs"],
|
|
215
|
+
tools: [
|
|
216
|
+
sqsSendTool,
|
|
217
|
+
sqsReceiveTool,
|
|
218
|
+
sqsDeleteTool,
|
|
219
|
+
sqsChangeVisibilityTool
|
|
220
|
+
]
|
|
221
|
+
});
|
|
222
|
+
//#endregion
|
|
223
|
+
export { sqsAuthSchema as _, sqsSendTool as a, queueAcknowledgeOutputSchema as c, queueExtendVisibilityInputSchema as d, queueExtendVisibilityOutputSchema as f, queueReceiveOutputSchema as g, queueReceiveInputSchema as h, sqsReceiveTool as i, queueEnqueueInputSchema as l, queueReceiptInputSchema as m, sqsDeleteTool as n, SqsClient as o, queueMessageSchema as p, sqsModule as r, MAX_SQS_MESSAGE_CHARS as s, sqsChangeVisibilityTool as t, queueEnqueueOutputSchema as u };
|
|
224
|
+
|
|
225
|
+
//# sourceMappingURL=sqs-DCwS1i2N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqs-DCwS1i2N.js","names":["#auth","#aws","#postJson"],"sources":["../src/vendors/sqs/contracts.ts","../src/vendors/sqs/client.ts","../src/vendors/sqs/module.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const MAX_SQS_MESSAGE_CHARS = 1_048_576\n\nexport const sqsAuthSchema = z.object({\n\taccess_key_id: z.string().min(1).describe('AWS access key id'),\n\tsecret_access_key: z.string().min(1).describe('AWS secret access key'),\n\tregion: z.string().min(1).describe('AWS region for SQS'),\n\tsession_token: z.string().min(1).optional().describe('Optional session token'),\n\tqueue_url: z.url().describe('Default SQS queue URL')\n})\n\nexport const queueEnqueueInputSchema = z.object({\n\tbody: z.string().min(1).max(MAX_SQS_MESSAGE_CHARS).describe('Message body'),\n\tdelay_seconds: z.int().min(0).max(900).optional().describe('Delivery delay in seconds'),\n\tmessage_group_id: z.string().min(1).max(128).optional().describe('FIFO message group id'),\n\tdeduplication_id: z.string().min(1).max(128).optional().describe('FIFO deduplication id')\n})\n\nexport const queueEnqueueOutputSchema = z.object({\n\tmessage_id: z.string(),\n\tbody_md5: z.string().optional(),\n\tsequence_number: z.string().optional()\n})\n\nexport const queueReceiveInputSchema = z.object({\n\tmax_messages: z.int().min(1).max(10).optional().describe('Maximum messages to receive; defaults to 1'),\n\twait_seconds: z.int().min(0).max(20).optional().describe('Long-poll wait in seconds'),\n\tvisibility_timeout_seconds: z\n\t\t.int()\n\t\t.min(0)\n\t\t.max(43_200)\n\t\t.optional()\n\t\t.describe('Temporary message invisibility duration in seconds')\n})\n\nexport const queueMessageSchema = z.object({\n\tmessage_id: z.string(),\n\treceipt_handle: z.string().describe('Opaque handle used to acknowledge or extend this delivery'),\n\tbody: z.string(),\n\tbody_md5: z.string().optional(),\n\tattributes: z.record(z.string(), z.string()).optional().describe('Provider-supplied message attributes')\n})\n\nexport const queueReceiveOutputSchema = z.object({\n\tmessages: z.array(queueMessageSchema)\n})\n\nexport const queueReceiptInputSchema = z.object({\n\treceipt_handle: z.string().min(1).describe('Receipt handle returned by receive')\n})\n\nexport const queueAcknowledgeOutputSchema = z.object({\n\tacknowledged: z.literal(true)\n})\n\nexport const queueExtendVisibilityInputSchema = queueReceiptInputSchema.extend({\n\tvisibility_timeout_seconds: z.int().min(0).max(43_200).describe('New invisibility duration in seconds')\n})\n\nexport const queueExtendVisibilityOutputSchema = z.object({\n\textended: z.literal(true),\n\tvisibility_timeout_seconds: z.int().min(0).max(43_200)\n})\n\nexport type SqsAuth = z.infer<typeof sqsAuthSchema>\nexport type QueueEnqueueInput = z.infer<typeof queueEnqueueInputSchema>\nexport type QueueEnqueueOutput = z.infer<typeof queueEnqueueOutputSchema>\nexport type QueueReceiveInput = z.infer<typeof queueReceiveInputSchema>\nexport type QueueReceiveOutput = z.infer<typeof queueReceiveOutputSchema>\nexport type QueueMessage = z.infer<typeof queueMessageSchema>\nexport type QueueReceiptInput = z.infer<typeof queueReceiptInputSchema>\nexport type QueueAcknowledgeOutput = z.infer<typeof queueAcknowledgeOutputSchema>\nexport type QueueExtendVisibilityInput = z.infer<typeof queueExtendVisibilityInputSchema>\nexport type QueueExtendVisibilityOutput = z.infer<typeof queueExtendVisibilityOutputSchema>\n\nexport type QueueOps = {\n\tenqueue(input: QueueEnqueueInput): Promise<QueueEnqueueOutput>\n\treceive(input?: QueueReceiveInput): Promise<QueueReceiveOutput>\n\tacknowledge(input: QueueReceiptInput): Promise<QueueAcknowledgeOutput>\n\textendVisibility(input: QueueExtendVisibilityInput): Promise<QueueExtendVisibilityOutput>\n}\n","import { isPlainObject, isString } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { parseAwsJsonBody } from '../../transport/aws-json'\nimport { AwsService } from '../../transport/aws-service'\nimport type { AwsServiceOptions } from '../../transport/aws-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport type {\n\tQueueAcknowledgeOutput,\n\tQueueEnqueueInput,\n\tQueueEnqueueOutput,\n\tQueueExtendVisibilityInput,\n\tQueueExtendVisibilityOutput,\n\tQueueMessage,\n\tQueueReceiveInput,\n\tQueueReceiveOutput,\n\tQueueReceiptInput,\n\tSqsAuth\n} from './contracts'\nimport { sqsAuthSchema } from './contracts'\n\nexport type SqsClientOptions = Pick<HttpServiceOptions, 'fetch' | 'signal'>\n\nconst jsonHeaders = (action: string): Record<string, string> => ({\n\t'content-type': 'application/x-amz-json-1.0',\n\t'x-amz-target': `AmazonSQS.${action}`\n})\n\nfunction attributes(value: unknown): Record<string, string> | undefined {\n\tif (!isPlainObject(value)) return undefined\n\tconst result: Record<string, string> = {}\n\tfor (const [key, current] of Object.entries(value)) {\n\t\tif (isString(current)) result[key] = current\n\t}\n\treturn Object.keys(result).length > 0 ? result : undefined\n}\n\nfunction mapMessage(value: unknown): QueueMessage | undefined {\n\tif (!isPlainObject(value)) return undefined\n\tconst messageId = value['MessageId']\n\tconst receiptHandle = value['ReceiptHandle']\n\tconst body = value['Body']\n\tif (!isString(messageId) || !isString(receiptHandle) || !isString(body)) return undefined\n\tconst result: QueueMessage = { message_id: messageId, receipt_handle: receiptHandle, body }\n\tif (isString(value['MD5OfBody'])) result.body_md5 = value['MD5OfBody']\n\tconst mappedAttributes = attributes(value['Attributes'])\n\tif (mappedAttributes) result.attributes = mappedAttributes\n\treturn result\n}\n\nexport class SqsClient {\n\treadonly #auth: SqsAuth\n\treadonly #aws: AwsService\n\n\tconstructor(auth: SqsAuth, options: SqsClientOptions = {}) {\n\t\tconst parsed = sqsAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid SQS auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tthis.#auth = parsed.data\n\t\tconst awsOptions: AwsServiceOptions = {\n\t\t\taccessKeyId: this.#auth.access_key_id,\n\t\t\tsecretAccessKey: this.#auth.secret_access_key,\n\t\t\tregion: this.#auth.region,\n\t\t\tservice: 'sqs',\n\t\t\tbaseURL: `https://sqs.${this.#auth.region}.amazonaws.com`,\n\t\t\tlabel: 'SQS',\n\t\t\t...(options.fetch && { fetch: options.fetch }),\n\t\t\t...(options.signal && { signal: options.signal }),\n\t\t\t...(this.#auth.session_token && { sessionToken: this.#auth.session_token })\n\t\t}\n\t\tthis.#aws = new AwsService(awsOptions)\n\t}\n\n\tstatic fromContext(ctx: ToolContext): SqsClient {\n\t\treturn new SqsClient(requireAuth(ctx, sqsAuthSchema), {\n\t\t\t...(ctx.fetch && { fetch: ctx.fetch }),\n\t\t\t...(ctx.signal && { signal: ctx.signal })\n\t\t})\n\t}\n\n\tasync enqueue(input: QueueEnqueueInput): Promise<QueueEnqueueOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tQueueUrl: this.#auth.queue_url,\n\t\t\tMessageBody: input.body\n\t\t}\n\t\tif (input.delay_seconds !== undefined) body['DelaySeconds'] = input.delay_seconds\n\t\tif (input.message_group_id) body['MessageGroupId'] = input.message_group_id\n\t\tif (input.deduplication_id) body['MessageDeduplicationId'] = input.deduplication_id\n\t\tconst data = await this.#postJson('SendMessage', body)\n\t\tif (!isPlainObject(data) || !isString(data['MessageId'])) {\n\t\t\tthrow new ToolError('Unexpected SQS SendMessage response', { code: 'upstream' })\n\t\t}\n\t\tconst output: QueueEnqueueOutput = { message_id: data['MessageId'] }\n\t\tif (isString(data['MD5OfMessageBody'])) output.body_md5 = data['MD5OfMessageBody']\n\t\tif (isString(data['SequenceNumber'])) output.sequence_number = data['SequenceNumber']\n\t\treturn output\n\t}\n\n\tasync receive(input: QueueReceiveInput = {}): Promise<QueueReceiveOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tQueueUrl: this.#auth.queue_url,\n\t\t\tMaxNumberOfMessages: input.max_messages ?? 1,\n\t\t\tAttributeNames: ['All']\n\t\t}\n\t\tif (input.wait_seconds !== undefined) body['WaitTimeSeconds'] = input.wait_seconds\n\t\tif (input.visibility_timeout_seconds !== undefined) {\n\t\t\tbody['VisibilityTimeout'] = input.visibility_timeout_seconds\n\t\t}\n\t\tconst data = await this.#postJson('ReceiveMessage', body)\n\t\tif (!isPlainObject(data)) {\n\t\t\tthrow new ToolError('Unexpected SQS ReceiveMessage response', { code: 'upstream' })\n\t\t}\n\t\tconst rawMessages = data['Messages']\n\t\tconst messages = Array.isArray(rawMessages)\n\t\t\t? rawMessages.map(mapMessage).filter((message) => message !== undefined)\n\t\t\t: []\n\t\treturn { messages }\n\t}\n\n\tasync acknowledge(input: QueueReceiptInput): Promise<QueueAcknowledgeOutput> {\n\t\tawait this.#postJson('DeleteMessage', {\n\t\t\tQueueUrl: this.#auth.queue_url,\n\t\t\tReceiptHandle: input.receipt_handle\n\t\t})\n\t\treturn { acknowledged: true }\n\t}\n\n\tasync extendVisibility(input: QueueExtendVisibilityInput): Promise<QueueExtendVisibilityOutput> {\n\t\tawait this.#postJson('ChangeMessageVisibility', {\n\t\t\tQueueUrl: this.#auth.queue_url,\n\t\t\tReceiptHandle: input.receipt_handle,\n\t\t\tVisibilityTimeout: input.visibility_timeout_seconds\n\t\t})\n\t\treturn { extended: true, visibility_timeout_seconds: input.visibility_timeout_seconds }\n\t}\n\n\t/** SQS uses application/x-amz-json-1.0 — ofetch does not auto-parse that content-type. */\n\tasync #postJson(action: string, body: Record<string, unknown>): Promise<unknown> {\n\t\tconst { data } = await this.#aws.post('/', body, { headers: jsonHeaders(action) })\n\t\treturn parseAwsJsonBody(data)\n\t}\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { SqsClient } from './client'\nimport {\n\tqueueAcknowledgeOutputSchema,\n\tqueueEnqueueInputSchema,\n\tqueueEnqueueOutputSchema,\n\tqueueExtendVisibilityInputSchema,\n\tqueueExtendVisibilityOutputSchema,\n\tqueueReceiptInputSchema,\n\tqueueReceiveInputSchema,\n\tqueueReceiveOutputSchema,\n\tsqsAuthSchema\n} from './contracts'\n\nexport const sqsSendTool = defineTool({\n\tid: 'sqs-send',\n\tname: 'sqsSend',\n\tdescription: 'Send one message to the configured SQS queue, with optional delay and FIFO controls.',\n\tinputSchema: queueEnqueueInputSchema,\n\toutputSchema: queueEnqueueOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\tnetwork: true,\n\texecute: async (input, ctx) => SqsClient.fromContext(ctx).enqueue(input)\n})\n\nexport const sqsReceiveTool = defineTool({\n\tid: 'sqs-receive',\n\tname: 'sqsReceive',\n\tdescription:\n\t\t'Receive up to 10 messages from the configured SQS queue, with optional long polling and visibility timeout.',\n\tinputSchema: queueReceiveInputSchema,\n\toutputSchema: queueReceiveOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\tnetwork: true,\n\texecute: async (input, ctx) => SqsClient.fromContext(ctx).receive(input)\n})\n\nexport const sqsDeleteTool = defineTool({\n\tid: 'sqs-delete',\n\tname: 'sqsDelete',\n\tdescription: 'Delete a received SQS message using its receipt handle after processing succeeds.',\n\tinputSchema: queueReceiptInputSchema,\n\toutputSchema: queueAcknowledgeOutputSchema,\n\tsideEffect: 'delete',\n\truntime: 'both',\n\tnetwork: true,\n\texecute: async (input, ctx) => SqsClient.fromContext(ctx).acknowledge(input)\n})\n\nexport const sqsChangeVisibilityTool = defineTool({\n\tid: 'sqs-change-visibility',\n\tname: 'sqsChangeVisibility',\n\tdescription: 'Change the visibility timeout for a received SQS message using its receipt handle.',\n\tinputSchema: queueExtendVisibilityInputSchema,\n\toutputSchema: queueExtendVisibilityOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\tnetwork: true,\n\texecute: async (input, ctx) => SqsClient.fromContext(ctx).extendVisibility(input)\n})\n\nexport const sqsModule = defineModule({\n\tid: 'sqs',\n\ttitle: 'SQS',\n\tdescription: 'Send, receive, delete, and extend message visibility in Amazon SQS.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: sqsAuthSchema },\n\tcategories: ['queue', 'aws'],\n\tclassification: 'standard',\n\ttags: ['sqs'],\n\ttools: [sqsSendTool, sqsReceiveTool, sqsDeleteTool, sqsChangeVisibilityTool]\n})\n"],"mappings":"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"}
|