agent-messenger 2.10.1 → 2.11.0
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/.claude-plugin/plugin.json +1 -1
- package/.env.template +4 -1
- package/README.md +77 -27
- package/bun.lock +26 -0
- package/dist/package.json +14 -1
- package/dist/src/platforms/channeltalk/commands/auth.d.ts +2 -1
- package/dist/src/platforms/channeltalk/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/commands/auth.js +5 -3
- package/dist/src/platforms/channeltalk/commands/auth.js.map +1 -1
- package/dist/src/platforms/channeltalk/token-extractor.d.ts +2 -1
- package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/token-extractor.js +22 -6
- package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/cli.js +11 -1
- package/dist/src/platforms/channeltalkbot/cli.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/auth.js +1 -5
- package/dist/src/platforms/channeltalkbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/bot.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/bot.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/bot.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/chat.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/chat.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/chat.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/group.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/group.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/group.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/manager.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/manager.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/manager.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/message.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/message.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/whoami.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/whoami.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/credential-manager.d.ts +5 -0
- package/dist/src/platforms/channeltalkbot/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/credential-manager.js +34 -4
- package/dist/src/platforms/channeltalkbot/credential-manager.js.map +1 -1
- package/dist/src/platforms/discord/commands/auth.d.ts +1 -0
- package/dist/src/platforms/discord/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/auth.js +3 -1
- package/dist/src/platforms/discord/commands/auth.js.map +1 -1
- package/dist/src/platforms/discord/listener.d.ts +2 -0
- package/dist/src/platforms/discord/listener.d.ts.map +1 -1
- package/dist/src/platforms/discord/listener.js +51 -21
- package/dist/src/platforms/discord/listener.js.map +1 -1
- package/dist/src/platforms/discord/token-extractor.d.ts +2 -1
- package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/discord/token-extractor.js +21 -6
- package/dist/src/platforms/discord/token-extractor.js.map +1 -1
- package/dist/src/platforms/discordbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/cli.js +12 -1
- package/dist/src/platforms/discordbot/cli.js.map +1 -1
- package/dist/src/platforms/discordbot/client.d.ts +3 -0
- package/dist/src/platforms/discordbot/client.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/client.js +3 -0
- package/dist/src/platforms/discordbot/client.js.map +1 -1
- package/dist/src/platforms/discordbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/commands/auth.js +1 -5
- package/dist/src/platforms/discordbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/discordbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/commands/message.js +1 -6
- package/dist/src/platforms/discordbot/commands/message.js.map +1 -1
- package/dist/src/platforms/discordbot/commands/server.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/commands/server.js +1 -4
- package/dist/src/platforms/discordbot/commands/server.js.map +1 -1
- package/dist/src/platforms/discordbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/commands/whoami.js +1 -6
- package/dist/src/platforms/discordbot/commands/whoami.js.map +1 -1
- package/dist/src/platforms/discordbot/index.d.ts +3 -1
- package/dist/src/platforms/discordbot/index.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/index.js +2 -1
- package/dist/src/platforms/discordbot/index.js.map +1 -1
- package/dist/src/platforms/discordbot/listener.d.ts +43 -0
- package/dist/src/platforms/discordbot/listener.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/listener.js +292 -0
- package/dist/src/platforms/discordbot/listener.js.map +1 -0
- package/dist/src/platforms/discordbot/types.d.ts +161 -0
- package/dist/src/platforms/discordbot/types.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/types.js +34 -0
- package/dist/src/platforms/discordbot/types.js.map +1 -1
- package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/instagram/commands/auth.js +3 -1
- package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
- package/dist/src/platforms/instagram/token-extractor.d.ts +2 -1
- package/dist/src/platforms/instagram/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/instagram/token-extractor.js +11 -2
- package/dist/src/platforms/instagram/token-extractor.js.map +1 -1
- package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/auth.js +4 -2
- package/dist/src/platforms/slack/commands/auth.js.map +1 -1
- package/dist/src/platforms/slack/token-extractor.d.ts +4 -1
- package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/slack/token-extractor.js +64 -15
- package/dist/src/platforms/slack/token-extractor.js.map +1 -1
- package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/cli.js +15 -3
- package/dist/src/platforms/slackbot/cli.js.map +1 -1
- package/dist/src/platforms/slackbot/client.d.ts +22 -1
- package/dist/src/platforms/slackbot/client.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/client.js +104 -1
- package/dist/src/platforms/slackbot/client.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/auth.js +1 -5
- package/dist/src/platforms/slackbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/file.d.ts +3 -0
- package/dist/src/platforms/slackbot/commands/file.d.ts.map +1 -0
- package/dist/src/platforms/slackbot/commands/file.js +164 -0
- package/dist/src/platforms/slackbot/commands/file.js.map +1 -0
- package/dist/src/platforms/slackbot/commands/index.d.ts +1 -0
- package/dist/src/platforms/slackbot/commands/index.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/index.js +1 -0
- package/dist/src/platforms/slackbot/commands/index.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/message.js +19 -0
- package/dist/src/platforms/slackbot/commands/message.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/whoami.js +1 -6
- package/dist/src/platforms/slackbot/commands/whoami.js.map +1 -1
- package/dist/src/platforms/slackbot/credential-manager.d.ts +1 -0
- package/dist/src/platforms/slackbot/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/credential-manager.js +30 -2
- package/dist/src/platforms/slackbot/credential-manager.js.map +1 -1
- package/dist/src/platforms/slackbot/index.d.ts +4 -1
- package/dist/src/platforms/slackbot/index.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/index.js +1 -0
- package/dist/src/platforms/slackbot/index.js.map +1 -1
- package/dist/src/platforms/slackbot/listener.d.ts +44 -0
- package/dist/src/platforms/slackbot/listener.d.ts.map +1 -0
- package/dist/src/platforms/slackbot/listener.js +313 -0
- package/dist/src/platforms/slackbot/listener.js.map +1 -0
- package/dist/src/platforms/slackbot/types.d.ts +196 -1
- package/dist/src/platforms/slackbot/types.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/types.js +4 -1
- package/dist/src/platforms/slackbot/types.js.map +1 -1
- package/dist/src/platforms/teams/commands/auth.d.ts +1 -0
- package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/auth.js +37 -6
- package/dist/src/platforms/teams/commands/auth.js.map +1 -1
- package/dist/src/platforms/teams/ensure-auth.js +31 -9
- package/dist/src/platforms/teams/ensure-auth.js.map +1 -1
- package/dist/src/platforms/teams/token-extractor.d.ts +4 -1
- package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/teams/token-extractor.js +80 -31
- package/dist/src/platforms/teams/token-extractor.js.map +1 -1
- package/dist/src/platforms/webex/commands/auth.d.ts +1 -0
- package/dist/src/platforms/webex/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/webex/commands/auth.js +3 -1
- package/dist/src/platforms/webex/commands/auth.js.map +1 -1
- package/dist/src/platforms/webex/token-extractor.d.ts +3 -1
- package/dist/src/platforms/webex/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/webex/token-extractor.js +16 -2
- package/dist/src/platforms/webex/token-extractor.js.map +1 -1
- package/dist/src/platforms/wechatbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/cli.js +11 -1
- package/dist/src/platforms/wechatbot/cli.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/auth.js +1 -5
- package/dist/src/platforms/wechatbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/message.js +1 -6
- package/dist/src/platforms/wechatbot/commands/message.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/template.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/template.js +1 -6
- package/dist/src/platforms/wechatbot/commands/template.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/user.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/user.js +1 -6
- package/dist/src/platforms/wechatbot/commands/user.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/whoami.js +1 -6
- package/dist/src/platforms/wechatbot/commands/whoami.js.map +1 -1
- package/dist/src/platforms/whatsappbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/cli.js +11 -1
- package/dist/src/platforms/whatsappbot/cli.js.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/auth.js +1 -5
- package/dist/src/platforms/whatsappbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/message.js +1 -6
- package/dist/src/platforms/whatsappbot/commands/message.js.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/template.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/template.js +1 -6
- package/dist/src/platforms/whatsappbot/commands/template.js.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/whoami.js +1 -6
- package/dist/src/platforms/whatsappbot/commands/whoami.js.map +1 -1
- package/dist/src/shared/chromium/browsers.d.ts +8 -0
- package/dist/src/shared/chromium/browsers.d.ts.map +1 -1
- package/dist/src/shared/chromium/browsers.js +58 -3
- package/dist/src/shared/chromium/browsers.js.map +1 -1
- package/dist/src/shared/chromium/cli-options.d.ts +5 -0
- package/dist/src/shared/chromium/cli-options.d.ts.map +1 -0
- package/dist/src/shared/chromium/cli-options.js +8 -0
- package/dist/src/shared/chromium/cli-options.js.map +1 -0
- package/dist/src/shared/chromium/decryptor.d.ts +6 -0
- package/dist/src/shared/chromium/decryptor.d.ts.map +1 -1
- package/dist/src/shared/chromium/decryptor.js +26 -6
- package/dist/src/shared/chromium/decryptor.js.map +1 -1
- package/dist/src/shared/chromium/index.d.ts +3 -1
- package/dist/src/shared/chromium/index.d.ts.map +1 -1
- package/dist/src/shared/chromium/index.js +2 -1
- package/dist/src/shared/chromium/index.js.map +1 -1
- package/dist/src/shared/utils/cli-output.d.ts +7 -0
- package/dist/src/shared/utils/cli-output.d.ts.map +1 -0
- package/dist/src/shared/utils/cli-output.js +7 -0
- package/dist/src/shared/utils/cli-output.js.map +1 -0
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +73 -20
- package/dist/src/tui/app.js.map +1 -1
- package/docs/content/docs/cli/channeltalk.mdx +4 -0
- package/docs/content/docs/cli/discord.mdx +5 -0
- package/docs/content/docs/cli/instagram.mdx +3 -0
- package/docs/content/docs/cli/slack.mdx +5 -0
- package/docs/content/docs/cli/slackbot.mdx +60 -22
- package/docs/content/docs/cli/teams.mdx +5 -0
- package/docs/content/docs/cli/webex.mdx +3 -0
- package/docs/content/docs/sdk/channeltalkbot.mdx +38 -1
- package/docs/content/docs/sdk/discordbot.mdx +501 -0
- package/docs/content/docs/sdk/meta.json +2 -0
- package/docs/content/docs/sdk/slackbot.mdx +576 -0
- package/e2e/README.md +1 -1
- package/e2e/channeltalk.e2e.test.ts +13 -13
- package/e2e/channeltalkbot.e2e.test.ts +13 -13
- package/e2e/config.ts +9 -4
- package/e2e/discord.e2e.test.ts +24 -24
- package/e2e/discordbot.e2e.test.ts +16 -16
- package/e2e/instagram.e2e.test.ts +10 -10
- package/e2e/kakaotalk.e2e.test.ts +7 -7
- package/e2e/line.e2e.test.ts +8 -8
- package/e2e/slack.e2e.test.ts +34 -34
- package/e2e/slackbot.e2e.test.ts +14 -14
- package/e2e/teams.e2e.test.ts +23 -23
- package/e2e/telegram.e2e.test.ts +8 -8
- package/e2e/webex.e2e.test.ts +14 -14
- package/e2e/whatsapp.e2e.test.ts +8 -8
- package/e2e/whatsappbot.e2e.test.ts +6 -6
- package/examples/discordbot-listen.ts +65 -0
- package/examples/slackbot-listen.ts +65 -0
- package/package.json +14 -1
- package/skills/agent-channeltalk/SKILL.md +5 -1
- package/skills/agent-channeltalk/references/authentication.md +5 -1
- package/skills/agent-channeltalkbot/SKILL.md +17 -3
- package/skills/agent-channeltalkbot/references/authentication.md +7 -5
- package/skills/agent-discord/SKILL.md +5 -1
- package/skills/agent-discord/references/authentication.md +7 -1
- package/skills/agent-discordbot/SKILL.md +13 -2
- package/skills/agent-discordbot/references/common-patterns.md +1 -1
- package/skills/agent-instagram/SKILL.md +7 -1
- package/skills/agent-instagram/references/authentication.md +6 -0
- package/skills/agent-kakaotalk/SKILL.md +1 -1
- package/skills/agent-line/SKILL.md +1 -1
- package/skills/agent-slack/SKILL.md +5 -1
- package/skills/agent-slack/references/authentication.md +7 -1
- package/skills/agent-slackbot/SKILL.md +56 -4
- package/skills/agent-slackbot/references/authentication.md +4 -0
- package/skills/agent-teams/SKILL.md +5 -1
- package/skills/agent-teams/references/authentication.md +7 -1
- package/skills/agent-telegram/SKILL.md +1 -1
- package/skills/agent-webex/SKILL.md +7 -1
- package/skills/agent-webex/references/authentication.md +6 -0
- package/skills/agent-wechatbot/SKILL.md +16 -1
- package/skills/agent-wechatbot/references/authentication.md +219 -0
- package/skills/agent-wechatbot/references/common-patterns.md +358 -0
- package/skills/agent-wechatbot/templates/account-summary.sh +122 -0
- package/skills/agent-wechatbot/templates/post-message.sh +122 -0
- package/skills/agent-wechatbot/templates/send-template.sh +152 -0
- package/skills/agent-whatsapp/SKILL.md +1 -1
- package/skills/agent-whatsappbot/SKILL.md +30 -1
- package/src/platforms/channeltalk/client.test.ts +26 -26
- package/src/platforms/channeltalk/commands/auth.test.ts +31 -19
- package/src/platforms/channeltalk/commands/auth.ts +15 -5
- package/src/platforms/channeltalk/commands/bot.test.ts +2 -2
- package/src/platforms/channeltalk/commands/chat.test.ts +3 -3
- package/src/platforms/channeltalk/commands/group.test.ts +4 -4
- package/src/platforms/channeltalk/commands/manager.test.ts +2 -2
- package/src/platforms/channeltalk/commands/message.test.ts +17 -17
- package/src/platforms/channeltalk/commands/snapshot.test.ts +7 -7
- package/src/platforms/channeltalk/commands/whoami.test.ts +3 -3
- package/src/platforms/channeltalk/credential-manager.test.ts +18 -18
- package/src/platforms/channeltalk/ensure-auth.test.ts +5 -5
- package/src/platforms/channeltalk/index.test.ts +23 -23
- package/src/platforms/channeltalk/token-extractor.test.ts +21 -21
- package/src/platforms/channeltalk/token-extractor.ts +24 -5
- package/src/platforms/channeltalk/types.test.ts +12 -12
- package/src/platforms/channeltalkbot/cli.ts +9 -0
- package/src/platforms/channeltalkbot/client.test.ts +14 -14
- package/src/platforms/channeltalkbot/commands/auth.test.ts +16 -16
- package/src/platforms/channeltalkbot/commands/auth.ts +1 -5
- package/src/platforms/channeltalkbot/commands/bot.test.ts +6 -6
- package/src/platforms/channeltalkbot/commands/bot.ts +1 -6
- package/src/platforms/channeltalkbot/commands/chat.test.ts +9 -9
- package/src/platforms/channeltalkbot/commands/chat.ts +1 -6
- package/src/platforms/channeltalkbot/commands/group.test.ts +6 -6
- package/src/platforms/channeltalkbot/commands/group.ts +1 -6
- package/src/platforms/channeltalkbot/commands/manager.test.ts +3 -3
- package/src/platforms/channeltalkbot/commands/manager.ts +1 -6
- package/src/platforms/channeltalkbot/commands/message.test.ts +10 -10
- package/src/platforms/channeltalkbot/commands/message.ts +1 -6
- package/src/platforms/channeltalkbot/commands/snapshot.test.ts +7 -7
- package/src/platforms/channeltalkbot/commands/whoami.test.ts +6 -4
- package/src/platforms/channeltalkbot/commands/whoami.ts +1 -6
- package/src/platforms/channeltalkbot/credential-manager.test.ts +123 -29
- package/src/platforms/channeltalkbot/credential-manager.ts +37 -4
- package/src/platforms/channeltalkbot/index.test.ts +15 -15
- package/src/platforms/discord/client.test.ts +28 -28
- package/src/platforms/discord/commands/auth.test.ts +7 -7
- package/src/platforms/discord/commands/auth.ts +13 -2
- package/src/platforms/discord/commands/channel.test.ts +7 -7
- package/src/platforms/discord/commands/dm.test.ts +4 -4
- package/src/platforms/discord/commands/file.test.ts +4 -4
- package/src/platforms/discord/commands/friend.test.ts +6 -6
- package/src/platforms/discord/commands/member.test.ts +5 -5
- package/src/platforms/discord/commands/mention.test.ts +5 -5
- package/src/platforms/discord/commands/message.test.ts +9 -9
- package/src/platforms/discord/commands/note.test.ts +6 -6
- package/src/platforms/discord/commands/profile.test.ts +4 -4
- package/src/platforms/discord/commands/reaction.test.ts +5 -5
- package/src/platforms/discord/commands/server.test.ts +7 -7
- package/src/platforms/discord/commands/snapshot.test.ts +6 -6
- package/src/platforms/discord/commands/thread.test.ts +6 -6
- package/src/platforms/discord/commands/user.test.ts +5 -5
- package/src/platforms/discord/commands/whoami.test.ts +6 -6
- package/src/platforms/discord/credential-manager.test.ts +16 -16
- package/src/platforms/discord/ensure-auth.test.ts +8 -8
- package/src/platforms/discord/index.test.ts +17 -17
- package/src/platforms/discord/listener.test.ts +92 -34
- package/src/platforms/discord/listener.ts +43 -19
- package/src/platforms/discord/token-extractor.test.ts +53 -53
- package/src/platforms/discord/token-extractor.ts +30 -6
- package/src/platforms/discord/types.test.ts +26 -26
- package/src/platforms/discordbot/cli.ts +10 -0
- package/src/platforms/discordbot/client.test.ts +31 -31
- package/src/platforms/discordbot/client.ts +4 -0
- package/src/platforms/discordbot/commands/auth.test.ts +18 -18
- package/src/platforms/discordbot/commands/auth.ts +1 -5
- package/src/platforms/discordbot/commands/channel.test.ts +11 -11
- package/src/platforms/discordbot/commands/file.test.ts +7 -7
- package/src/platforms/discordbot/commands/message.test.ts +25 -25
- package/src/platforms/discordbot/commands/message.ts +1 -6
- package/src/platforms/discordbot/commands/reaction.test.ts +6 -6
- package/src/platforms/discordbot/commands/server.test.ts +12 -12
- package/src/platforms/discordbot/commands/server.ts +1 -5
- package/src/platforms/discordbot/commands/snapshot.test.ts +13 -13
- package/src/platforms/discordbot/commands/thread.test.ts +10 -10
- package/src/platforms/discordbot/commands/user.test.ts +9 -9
- package/src/platforms/discordbot/commands/whoami.test.ts +4 -4
- package/src/platforms/discordbot/commands/whoami.ts +1 -6
- package/src/platforms/discordbot/credential-manager.test.ts +28 -28
- package/src/platforms/discordbot/index.test.ts +82 -0
- package/src/platforms/discordbot/index.ts +27 -9
- package/src/platforms/discordbot/listener.test.ts +1002 -0
- package/src/platforms/discordbot/listener.ts +321 -0
- package/src/platforms/discordbot/types.ts +163 -0
- package/src/platforms/instagram/client.test.ts +18 -18
- package/src/platforms/instagram/commands/auth.test.ts +11 -11
- package/src/platforms/instagram/commands/auth.ts +9 -1
- package/src/platforms/instagram/commands/chat.test.ts +6 -6
- package/src/platforms/instagram/commands/message.test.ts +11 -11
- package/src/platforms/instagram/commands/shared.test.ts +12 -12
- package/src/platforms/instagram/commands/whoami.test.ts +3 -3
- package/src/platforms/instagram/credential-manager.test.ts +21 -21
- package/src/platforms/instagram/ensure-auth.test.ts +4 -4
- package/src/platforms/instagram/index.test.ts +9 -9
- package/src/platforms/instagram/listener.test.ts +8 -8
- package/src/platforms/instagram/token-extractor.test.ts +35 -35
- package/src/platforms/instagram/token-extractor.ts +13 -1
- package/src/platforms/kakaotalk/client.test.ts +33 -33
- package/src/platforms/kakaotalk/commands/auth.test.ts +11 -11
- package/src/platforms/kakaotalk/commands/chat.test.ts +6 -6
- package/src/platforms/kakaotalk/commands/message.test.ts +7 -7
- package/src/platforms/kakaotalk/commands/whoami.test.ts +5 -5
- package/src/platforms/kakaotalk/credential-manager.test.ts +15 -15
- package/src/platforms/kakaotalk/index.test.ts +15 -15
- package/src/platforms/kakaotalk/listener.test.ts +17 -17
- package/src/platforms/line/client.test.ts +17 -17
- package/src/platforms/line/commands/auth.test.ts +8 -8
- package/src/platforms/line/commands/chat.test.ts +7 -7
- package/src/platforms/line/commands/friend.test.ts +6 -6
- package/src/platforms/line/commands/message.test.ts +7 -7
- package/src/platforms/line/commands/whoami.test.ts +6 -6
- package/src/platforms/line/credential-manager.test.ts +17 -17
- package/src/platforms/line/index.test.ts +10 -10
- package/src/platforms/line/listener.test.ts +15 -15
- package/src/platforms/line/types.test.ts +14 -14
- package/src/platforms/slack/cli.test.ts +8 -8
- package/src/platforms/slack/client.test.ts +151 -151
- package/src/platforms/slack/commands/activity.test.ts +13 -13
- package/src/platforms/slack/commands/auth.test.ts +34 -34
- package/src/platforms/slack/commands/auth.ts +11 -2
- package/src/platforms/slack/commands/bookmark.test.ts +9 -9
- package/src/platforms/slack/commands/channel.test.ts +17 -17
- package/src/platforms/slack/commands/drafts.test.ts +7 -7
- package/src/platforms/slack/commands/emoji.test.ts +3 -3
- package/src/platforms/slack/commands/file.test.ts +12 -12
- package/src/platforms/slack/commands/message.test.ts +19 -19
- package/src/platforms/slack/commands/pin.test.ts +7 -7
- package/src/platforms/slack/commands/reaction.test.ts +10 -10
- package/src/platforms/slack/commands/reminder.test.ts +9 -9
- package/src/platforms/slack/commands/saved.test.ts +7 -7
- package/src/platforms/slack/commands/sections.test.ts +5 -5
- package/src/platforms/slack/commands/snapshot.test.ts +13 -13
- package/src/platforms/slack/commands/unread.test.ts +6 -6
- package/src/platforms/slack/commands/user.test.ts +10 -10
- package/src/platforms/slack/commands/usergroup.test.ts +15 -15
- package/src/platforms/slack/commands/whoami.test.ts +6 -6
- package/src/platforms/slack/commands/workspace.test.ts +26 -26
- package/src/platforms/slack/credential-manager.test.ts +14 -14
- package/src/platforms/slack/ensure-auth.test.ts +21 -21
- package/src/platforms/slack/index.test.ts +12 -12
- package/src/platforms/slack/listener.test.ts +17 -17
- package/src/platforms/slack/token-extractor-node.test.ts +2 -2
- package/src/platforms/slack/token-extractor.test.ts +133 -37
- package/src/platforms/slack/token-extractor.ts +76 -13
- package/src/platforms/slack/types.test.ts +21 -21
- package/src/platforms/slackbot/cli.ts +13 -1
- package/src/platforms/slackbot/client.test.ts +296 -22
- package/src/platforms/slackbot/client.ts +130 -2
- package/src/platforms/slackbot/commands/auth.test.ts +14 -14
- package/src/platforms/slackbot/commands/auth.ts +1 -5
- package/src/platforms/slackbot/commands/channel.test.ts +7 -7
- package/src/platforms/slackbot/commands/file.test.ts +201 -0
- package/src/platforms/slackbot/commands/file.ts +212 -0
- package/src/platforms/slackbot/commands/index.ts +1 -0
- package/src/platforms/slackbot/commands/message.test.ts +13 -13
- package/src/platforms/slackbot/commands/message.ts +22 -0
- package/src/platforms/slackbot/commands/reaction.test.ts +6 -6
- package/src/platforms/slackbot/commands/user.test.ts +7 -7
- package/src/platforms/slackbot/commands/whoami.test.ts +4 -4
- package/src/platforms/slackbot/commands/whoami.ts +1 -6
- package/src/platforms/slackbot/credential-manager.test.ts +83 -23
- package/src/platforms/slackbot/credential-manager.ts +32 -2
- package/src/platforms/slackbot/index.test.ts +59 -0
- package/src/platforms/slackbot/index.ts +31 -7
- package/src/platforms/slackbot/listener.test.ts +1012 -0
- package/src/platforms/slackbot/listener.ts +362 -0
- package/src/platforms/slackbot/types.test.ts +7 -7
- package/src/platforms/slackbot/types.ts +224 -1
- package/src/platforms/teams/client.test.ts +30 -30
- package/src/platforms/teams/commands/auth.test.ts +9 -9
- package/src/platforms/teams/commands/auth.ts +66 -7
- package/src/platforms/teams/commands/channel.test.ts +7 -7
- package/src/platforms/teams/commands/file.test.ts +4 -4
- package/src/platforms/teams/commands/message.test.ts +5 -5
- package/src/platforms/teams/commands/reaction.test.ts +4 -4
- package/src/platforms/teams/commands/snapshot.test.ts +7 -7
- package/src/platforms/teams/commands/team.test.ts +8 -8
- package/src/platforms/teams/commands/user.test.ts +4 -4
- package/src/platforms/teams/commands/whoami.test.ts +6 -6
- package/src/platforms/teams/credential-manager.test.ts +17 -17
- package/src/platforms/teams/ensure-auth.test.ts +69 -18
- package/src/platforms/teams/ensure-auth.ts +39 -11
- package/src/platforms/teams/index.test.ts +15 -15
- package/src/platforms/teams/token-extractor.test.ts +251 -69
- package/src/platforms/teams/token-extractor.ts +94 -31
- package/src/platforms/teams/types.test.ts +26 -26
- package/src/platforms/telegram/app-config.test.ts +4 -4
- package/src/platforms/telegram/chat-utils.test.ts +12 -12
- package/src/platforms/telegram/client.test.ts +4 -4
- package/src/platforms/telegram/commands/auth.test.ts +16 -16
- package/src/platforms/telegram/commands/chat.test.ts +9 -9
- package/src/platforms/telegram/commands/message.test.ts +6 -6
- package/src/platforms/telegram/commands/shared.test.ts +3 -3
- package/src/platforms/telegram/commands/whoami.test.ts +3 -3
- package/src/platforms/telegram/credential-manager.test.ts +10 -10
- package/src/platforms/telegram/types.test.ts +6 -6
- package/src/platforms/webex/app-config.test.ts +8 -8
- package/src/platforms/webex/cli.test.ts +5 -5
- package/src/platforms/webex/client.test.ts +65 -65
- package/src/platforms/webex/commands/auth.test.ts +18 -18
- package/src/platforms/webex/commands/auth.ts +13 -2
- package/src/platforms/webex/commands/member.test.ts +5 -5
- package/src/platforms/webex/commands/message.test.ts +12 -12
- package/src/platforms/webex/commands/snapshot.test.ts +5 -5
- package/src/platforms/webex/commands/space.test.ts +10 -10
- package/src/platforms/webex/commands/whoami.test.ts +6 -6
- package/src/platforms/webex/credential-manager.test.ts +22 -22
- package/src/platforms/webex/encryption.test.ts +4 -4
- package/src/platforms/webex/ensure-auth.test.ts +5 -5
- package/src/platforms/webex/index.test.ts +5 -5
- package/src/platforms/webex/markdown-to-html.test.ts +33 -33
- package/src/platforms/webex/token-extractor.test.ts +23 -23
- package/src/platforms/webex/token-extractor.ts +25 -3
- package/src/platforms/webex/types.test.ts +27 -27
- package/src/platforms/wechatbot/cli.ts +9 -0
- package/src/platforms/wechatbot/client.test.ts +27 -27
- package/src/platforms/wechatbot/commands/auth.test.ts +15 -15
- package/src/platforms/wechatbot/commands/auth.ts +1 -5
- package/src/platforms/wechatbot/commands/message.test.ts +8 -8
- package/src/platforms/wechatbot/commands/message.ts +1 -6
- package/src/platforms/wechatbot/commands/template.test.ts +9 -9
- package/src/platforms/wechatbot/commands/template.ts +1 -6
- package/src/platforms/wechatbot/commands/user.test.ts +7 -7
- package/src/platforms/wechatbot/commands/user.ts +1 -6
- package/src/platforms/wechatbot/commands/whoami.test.ts +5 -5
- package/src/platforms/wechatbot/commands/whoami.ts +1 -6
- package/src/platforms/wechatbot/credential-manager.test.ts +18 -18
- package/src/platforms/wechatbot/index.test.ts +10 -10
- package/src/platforms/wechatbot/types.test.ts +25 -25
- package/src/platforms/whatsapp/commands/auth.test.ts +13 -13
- package/src/platforms/whatsapp/commands/chat.test.ts +8 -8
- package/src/platforms/whatsapp/commands/message.test.ts +10 -10
- package/src/platforms/whatsapp/commands/whoami.test.ts +3 -3
- package/src/platforms/whatsapp/credential-manager.test.ts +23 -23
- package/src/platforms/whatsapp/ensure-auth.test.ts +4 -4
- package/src/platforms/whatsapp/index.test.ts +8 -8
- package/src/platforms/whatsapp/types.test.ts +42 -42
- package/src/platforms/whatsappbot/cli.ts +9 -0
- package/src/platforms/whatsappbot/client.test.ts +27 -27
- package/src/platforms/whatsappbot/commands/auth.test.ts +14 -14
- package/src/platforms/whatsappbot/commands/auth.ts +1 -5
- package/src/platforms/whatsappbot/commands/message.test.ts +16 -16
- package/src/platforms/whatsappbot/commands/message.ts +1 -6
- package/src/platforms/whatsappbot/commands/template.test.ts +9 -9
- package/src/platforms/whatsappbot/commands/template.ts +1 -6
- package/src/platforms/whatsappbot/commands/whoami.test.ts +5 -5
- package/src/platforms/whatsappbot/commands/whoami.ts +1 -6
- package/src/platforms/whatsappbot/credential-manager.test.ts +18 -18
- package/src/platforms/whatsappbot/index.test.ts +7 -7
- package/src/platforms/whatsappbot/types.test.ts +18 -18
- package/src/shared/chromium/browsers.test.ts +102 -22
- package/src/shared/chromium/browsers.ts +72 -3
- package/src/shared/chromium/cli-options.test.ts +22 -0
- package/src/shared/chromium/cli-options.ts +12 -0
- package/src/shared/chromium/cookie-reader.test.ts +13 -13
- package/src/shared/chromium/decryptor.test.ts +97 -32
- package/src/shared/chromium/decryptor.ts +27 -6
- package/src/shared/chromium/index.ts +3 -0
- package/src/shared/utils/cli-output.test.ts +57 -0
- package/src/shared/utils/cli-output.ts +8 -0
- package/src/shared/utils/concurrency.test.ts +6 -6
- package/src/shared/utils/derived-key-cache.test.ts +11 -11
- package/src/tui/app.ts +129 -20
- package/src/tui/utils.test.ts +31 -31
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { expect,
|
|
1
|
+
import { expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
ConfigSchema,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
WorkspaceCredentialsSchema,
|
|
11
11
|
} from '@/platforms/slack/types'
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
it('SlackChannelSchema validates correct data', () => {
|
|
14
14
|
const validChannel = {
|
|
15
15
|
id: 'C123456',
|
|
16
16
|
name: 'general',
|
|
@@ -22,7 +22,7 @@ test('SlackChannelSchema validates correct data', () => {
|
|
|
22
22
|
expect(() => SlackChannelSchema.parse(validChannel)).not.toThrow()
|
|
23
23
|
})
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
it('SlackChannelSchema validates with optional fields', () => {
|
|
26
26
|
const validChannel = {
|
|
27
27
|
id: 'C123456',
|
|
28
28
|
name: 'general',
|
|
@@ -44,7 +44,7 @@ test('SlackChannelSchema validates with optional fields', () => {
|
|
|
44
44
|
expect(() => SlackChannelSchema.parse(validChannel)).not.toThrow()
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
it('SlackChannelSchema rejects missing required fields', () => {
|
|
48
48
|
const invalidChannel = {
|
|
49
49
|
id: 'C123456',
|
|
50
50
|
name: 'general',
|
|
@@ -52,7 +52,7 @@ test('SlackChannelSchema rejects missing required fields', () => {
|
|
|
52
52
|
expect(() => SlackChannelSchema.parse(invalidChannel)).toThrow()
|
|
53
53
|
})
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
it('SlackMessageSchema validates correct data', () => {
|
|
56
56
|
const validMessage = {
|
|
57
57
|
ts: '1234567890.123456',
|
|
58
58
|
text: 'Hello world',
|
|
@@ -61,7 +61,7 @@ test('SlackMessageSchema validates correct data', () => {
|
|
|
61
61
|
expect(() => SlackMessageSchema.parse(validMessage)).not.toThrow()
|
|
62
62
|
})
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
it('SlackMessageSchema validates with optional fields', () => {
|
|
65
65
|
const validMessage = {
|
|
66
66
|
ts: '1234567890.123456',
|
|
67
67
|
text: 'Hello world',
|
|
@@ -79,7 +79,7 @@ test('SlackMessageSchema validates with optional fields', () => {
|
|
|
79
79
|
expect(() => SlackMessageSchema.parse(validMessage)).not.toThrow()
|
|
80
80
|
})
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
it('SlackMessageSchema validates with files', () => {
|
|
83
83
|
const validMessage = {
|
|
84
84
|
ts: '1234567890.123456',
|
|
85
85
|
text: 'Hello world',
|
|
@@ -102,14 +102,14 @@ test('SlackMessageSchema validates with files', () => {
|
|
|
102
102
|
expect(() => SlackMessageSchema.parse(validMessage)).not.toThrow()
|
|
103
103
|
})
|
|
104
104
|
|
|
105
|
-
|
|
105
|
+
it('SlackMessageSchema rejects missing required fields', () => {
|
|
106
106
|
const invalidMessage = {
|
|
107
107
|
ts: '1234567890.123456',
|
|
108
108
|
}
|
|
109
109
|
expect(() => SlackMessageSchema.parse(invalidMessage)).toThrow()
|
|
110
110
|
})
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
it('SlackUserSchema validates correct data', () => {
|
|
113
113
|
const validUser = {
|
|
114
114
|
id: 'U123456',
|
|
115
115
|
name: 'john',
|
|
@@ -122,7 +122,7 @@ test('SlackUserSchema validates correct data', () => {
|
|
|
122
122
|
expect(() => SlackUserSchema.parse(validUser)).not.toThrow()
|
|
123
123
|
})
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
it('SlackUserSchema validates with optional profile', () => {
|
|
126
126
|
const validUser = {
|
|
127
127
|
id: 'U123456',
|
|
128
128
|
name: 'john',
|
|
@@ -141,7 +141,7 @@ test('SlackUserSchema validates with optional profile', () => {
|
|
|
141
141
|
expect(() => SlackUserSchema.parse(validUser)).not.toThrow()
|
|
142
142
|
})
|
|
143
143
|
|
|
144
|
-
|
|
144
|
+
it('SlackUserSchema rejects missing required fields', () => {
|
|
145
145
|
const invalidUser = {
|
|
146
146
|
id: 'U123456',
|
|
147
147
|
name: 'john',
|
|
@@ -149,7 +149,7 @@ test('SlackUserSchema rejects missing required fields', () => {
|
|
|
149
149
|
expect(() => SlackUserSchema.parse(invalidUser)).toThrow()
|
|
150
150
|
})
|
|
151
151
|
|
|
152
|
-
|
|
152
|
+
it('SlackReactionSchema validates correct data', () => {
|
|
153
153
|
const validReaction = {
|
|
154
154
|
name: 'thumbsup',
|
|
155
155
|
count: 3,
|
|
@@ -158,7 +158,7 @@ test('SlackReactionSchema validates correct data', () => {
|
|
|
158
158
|
expect(() => SlackReactionSchema.parse(validReaction)).not.toThrow()
|
|
159
159
|
})
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
it('SlackReactionSchema rejects invalid data', () => {
|
|
162
162
|
const invalidReaction = {
|
|
163
163
|
name: 'thumbsup',
|
|
164
164
|
count: 'three',
|
|
@@ -167,7 +167,7 @@ test('SlackReactionSchema rejects invalid data', () => {
|
|
|
167
167
|
expect(() => SlackReactionSchema.parse(invalidReaction)).toThrow()
|
|
168
168
|
})
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
it('SlackFileSchema validates correct data', () => {
|
|
171
171
|
const validFile = {
|
|
172
172
|
id: 'F123456',
|
|
173
173
|
name: 'document.pdf',
|
|
@@ -181,7 +181,7 @@ test('SlackFileSchema validates correct data', () => {
|
|
|
181
181
|
expect(() => SlackFileSchema.parse(validFile)).not.toThrow()
|
|
182
182
|
})
|
|
183
183
|
|
|
184
|
-
|
|
184
|
+
it('SlackFileSchema validates with optional channels', () => {
|
|
185
185
|
const validFile = {
|
|
186
186
|
id: 'F123456',
|
|
187
187
|
name: 'document.pdf',
|
|
@@ -196,7 +196,7 @@ test('SlackFileSchema validates with optional channels', () => {
|
|
|
196
196
|
expect(() => SlackFileSchema.parse(validFile)).not.toThrow()
|
|
197
197
|
})
|
|
198
198
|
|
|
199
|
-
|
|
199
|
+
it('SlackFileSchema rejects missing required fields', () => {
|
|
200
200
|
const invalidFile = {
|
|
201
201
|
id: 'F123456',
|
|
202
202
|
name: 'document.pdf',
|
|
@@ -204,7 +204,7 @@ test('SlackFileSchema rejects missing required fields', () => {
|
|
|
204
204
|
expect(() => SlackFileSchema.parse(invalidFile)).toThrow()
|
|
205
205
|
})
|
|
206
206
|
|
|
207
|
-
|
|
207
|
+
it('WorkspaceCredentialsSchema validates correct data', () => {
|
|
208
208
|
const validCredentials = {
|
|
209
209
|
workspace_id: 'T123456',
|
|
210
210
|
workspace_name: 'my-workspace',
|
|
@@ -214,7 +214,7 @@ test('WorkspaceCredentialsSchema validates correct data', () => {
|
|
|
214
214
|
expect(() => WorkspaceCredentialsSchema.parse(validCredentials)).not.toThrow()
|
|
215
215
|
})
|
|
216
216
|
|
|
217
|
-
|
|
217
|
+
it('WorkspaceCredentialsSchema rejects missing fields', () => {
|
|
218
218
|
const invalidCredentials = {
|
|
219
219
|
workspace_id: 'T123456',
|
|
220
220
|
workspace_name: 'my-workspace',
|
|
@@ -222,7 +222,7 @@ test('WorkspaceCredentialsSchema rejects missing fields', () => {
|
|
|
222
222
|
expect(() => WorkspaceCredentialsSchema.parse(invalidCredentials)).toThrow()
|
|
223
223
|
})
|
|
224
224
|
|
|
225
|
-
|
|
225
|
+
it('ConfigSchema validates correct data', () => {
|
|
226
226
|
const validConfig = {
|
|
227
227
|
current_workspace: 'T123456',
|
|
228
228
|
workspaces: {
|
|
@@ -237,7 +237,7 @@ test('ConfigSchema validates correct data', () => {
|
|
|
237
237
|
expect(() => ConfigSchema.parse(validConfig)).not.toThrow()
|
|
238
238
|
})
|
|
239
239
|
|
|
240
|
-
|
|
240
|
+
it('ConfigSchema validates with null current_workspace', () => {
|
|
241
241
|
const validConfig = {
|
|
242
242
|
current_workspace: null,
|
|
243
243
|
workspaces: {
|
|
@@ -252,7 +252,7 @@ test('ConfigSchema validates with null current_workspace', () => {
|
|
|
252
252
|
expect(() => ConfigSchema.parse(validConfig)).not.toThrow()
|
|
253
253
|
})
|
|
254
254
|
|
|
255
|
-
|
|
255
|
+
it('ConfigSchema rejects invalid workspace credentials', () => {
|
|
256
256
|
const invalidConfig = {
|
|
257
257
|
current_workspace: 'T123456',
|
|
258
258
|
workspaces: {
|
|
@@ -6,6 +6,7 @@ import pkg from '../../../package.json' with { type: 'json' }
|
|
|
6
6
|
import {
|
|
7
7
|
authCommand,
|
|
8
8
|
channelCommand,
|
|
9
|
+
fileCommand,
|
|
9
10
|
messageCommand,
|
|
10
11
|
reactionCommand,
|
|
11
12
|
userCommand,
|
|
@@ -18,7 +19,17 @@ program
|
|
|
18
19
|
.name('agent-slackbot')
|
|
19
20
|
.description('CLI tool for Slack bot integration using bot tokens (xoxb-)')
|
|
20
21
|
.version(pkg.version)
|
|
22
|
+
.option('--pretty', 'Pretty-print JSON output')
|
|
21
23
|
.option('--bot <id>', 'Use specific bot (default: current)')
|
|
24
|
+
.hook('preAction', (thisCmd, actionCmd) => {
|
|
25
|
+
for (const [key, value] of Object.entries(thisCmd.opts())) {
|
|
26
|
+
if (value === undefined) continue
|
|
27
|
+
const source = actionCmd.getOptionValueSource(key)
|
|
28
|
+
if (source === undefined || source === 'default') {
|
|
29
|
+
actionCmd.setOptionValue(key, value)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
})
|
|
22
33
|
|
|
23
34
|
program.addCommand(authCommand)
|
|
24
35
|
program.addCommand(whoamiCommand)
|
|
@@ -26,7 +37,8 @@ program.addCommand(messageCommand)
|
|
|
26
37
|
program.addCommand(channelCommand)
|
|
27
38
|
program.addCommand(userCommand)
|
|
28
39
|
program.addCommand(reactionCommand)
|
|
40
|
+
program.addCommand(fileCommand)
|
|
29
41
|
|
|
30
|
-
program.
|
|
42
|
+
program.parseAsync(process.argv)
|
|
31
43
|
|
|
32
44
|
export default program
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, mock,
|
|
1
|
+
import { beforeEach, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { SlackBotClient } from './client'
|
|
4
4
|
import { SlackBotError } from './types'
|
|
@@ -65,6 +65,70 @@ const mockReactions = {
|
|
|
65
65
|
add: mock(() => Promise.resolve({ ok: true })),
|
|
66
66
|
remove: mock(() => Promise.resolve({ ok: true })),
|
|
67
67
|
}
|
|
68
|
+
const mockAssistant = {
|
|
69
|
+
threads: {
|
|
70
|
+
setStatus: mock(() => Promise.resolve({ ok: true })),
|
|
71
|
+
},
|
|
72
|
+
}
|
|
73
|
+
const mockFiles = {
|
|
74
|
+
uploadV2: mock(() =>
|
|
75
|
+
Promise.resolve({
|
|
76
|
+
ok: true,
|
|
77
|
+
files: [
|
|
78
|
+
{
|
|
79
|
+
ok: true,
|
|
80
|
+
files: [
|
|
81
|
+
{
|
|
82
|
+
id: 'F123',
|
|
83
|
+
name: 'test.txt',
|
|
84
|
+
title: 'test.txt',
|
|
85
|
+
mimetype: 'text/plain',
|
|
86
|
+
size: 12,
|
|
87
|
+
url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
|
|
88
|
+
created: 1234567890,
|
|
89
|
+
user: 'U123',
|
|
90
|
+
channels: ['C123'],
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
],
|
|
95
|
+
}),
|
|
96
|
+
),
|
|
97
|
+
list: mock(() =>
|
|
98
|
+
Promise.resolve({
|
|
99
|
+
ok: true,
|
|
100
|
+
files: [
|
|
101
|
+
{
|
|
102
|
+
id: 'F123',
|
|
103
|
+
name: 'test.txt',
|
|
104
|
+
title: 'test.txt',
|
|
105
|
+
mimetype: 'text/plain',
|
|
106
|
+
size: 1024,
|
|
107
|
+
url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
|
|
108
|
+
created: 1234567890,
|
|
109
|
+
user: 'U123',
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
}),
|
|
113
|
+
),
|
|
114
|
+
info: mock(() =>
|
|
115
|
+
Promise.resolve({
|
|
116
|
+
ok: true,
|
|
117
|
+
file: {
|
|
118
|
+
id: 'F123',
|
|
119
|
+
name: 'test.txt',
|
|
120
|
+
title: 'test.txt',
|
|
121
|
+
mimetype: 'text/plain',
|
|
122
|
+
size: 1024,
|
|
123
|
+
url_private: 'https://files.slack.com/files-pri/T123-F123/test.txt',
|
|
124
|
+
created: 1234567890,
|
|
125
|
+
user: 'U123',
|
|
126
|
+
channels: ['C123'],
|
|
127
|
+
},
|
|
128
|
+
}),
|
|
129
|
+
),
|
|
130
|
+
delete: mock(() => Promise.resolve({ ok: true })),
|
|
131
|
+
}
|
|
68
132
|
const mockUsers = {
|
|
69
133
|
list: mock(() =>
|
|
70
134
|
Promise.resolve({
|
|
@@ -105,6 +169,8 @@ mock.module('@slack/web-api', () => ({
|
|
|
105
169
|
chat = mockChat
|
|
106
170
|
reactions = mockReactions
|
|
107
171
|
users = mockUsers
|
|
172
|
+
files = mockFiles
|
|
173
|
+
assistant = mockAssistant
|
|
108
174
|
},
|
|
109
175
|
}))
|
|
110
176
|
|
|
@@ -120,33 +186,38 @@ describe('SlackBotClient', () => {
|
|
|
120
186
|
mockReactions.remove.mockClear()
|
|
121
187
|
mockUsers.list.mockClear()
|
|
122
188
|
mockUsers.info.mockClear()
|
|
189
|
+
mockFiles.uploadV2.mockClear()
|
|
190
|
+
mockFiles.list.mockClear()
|
|
191
|
+
mockFiles.info.mockClear()
|
|
192
|
+
mockFiles.delete.mockClear()
|
|
193
|
+
mockAssistant.threads.setStatus.mockClear()
|
|
123
194
|
})
|
|
124
195
|
|
|
125
196
|
describe('login', () => {
|
|
126
|
-
|
|
197
|
+
it('accepts bot tokens (xoxb-)', async () => {
|
|
127
198
|
// when/then: should not throw
|
|
128
199
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
129
200
|
expect(client).toBeDefined()
|
|
130
201
|
})
|
|
131
202
|
|
|
132
|
-
|
|
203
|
+
it('rejects user tokens (xoxp-)', async () => {
|
|
133
204
|
// when/then
|
|
134
205
|
await expect(new SlackBotClient().login({ token: 'xoxp-user-token' })).rejects.toThrow(SlackBotError)
|
|
135
206
|
})
|
|
136
207
|
|
|
137
|
-
|
|
208
|
+
it('rejects empty token', async () => {
|
|
138
209
|
// when/then
|
|
139
210
|
await expect(new SlackBotClient().login({ token: '' })).rejects.toThrow(SlackBotError)
|
|
140
211
|
})
|
|
141
212
|
|
|
142
|
-
|
|
213
|
+
it('rejects non-bot tokens', async () => {
|
|
143
214
|
// when/then
|
|
144
215
|
await expect(new SlackBotClient().login({ token: 'invalid-token' })).rejects.toThrow(SlackBotError)
|
|
145
216
|
})
|
|
146
217
|
})
|
|
147
218
|
|
|
148
219
|
describe('testAuth', () => {
|
|
149
|
-
|
|
220
|
+
it('returns auth info for valid token', async () => {
|
|
150
221
|
// given
|
|
151
222
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
152
223
|
|
|
@@ -161,7 +232,7 @@ describe('SlackBotClient', () => {
|
|
|
161
232
|
})
|
|
162
233
|
|
|
163
234
|
describe('postMessage', () => {
|
|
164
|
-
|
|
235
|
+
it('sends message and returns timestamp', async () => {
|
|
165
236
|
// given
|
|
166
237
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
167
238
|
|
|
@@ -175,7 +246,7 @@ describe('SlackBotClient', () => {
|
|
|
175
246
|
})
|
|
176
247
|
|
|
177
248
|
describe('getConversationHistory', () => {
|
|
178
|
-
|
|
249
|
+
it('returns messages', async () => {
|
|
179
250
|
// given
|
|
180
251
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
181
252
|
|
|
@@ -189,7 +260,7 @@ describe('SlackBotClient', () => {
|
|
|
189
260
|
})
|
|
190
261
|
|
|
191
262
|
describe('getMessage', () => {
|
|
192
|
-
|
|
263
|
+
it('returns single message', async () => {
|
|
193
264
|
// given
|
|
194
265
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
195
266
|
|
|
@@ -203,7 +274,7 @@ describe('SlackBotClient', () => {
|
|
|
203
274
|
})
|
|
204
275
|
|
|
205
276
|
describe('addReaction', () => {
|
|
206
|
-
|
|
277
|
+
it('adds reaction to message', async () => {
|
|
207
278
|
// given
|
|
208
279
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
209
280
|
|
|
@@ -214,7 +285,7 @@ describe('SlackBotClient', () => {
|
|
|
214
285
|
})
|
|
215
286
|
|
|
216
287
|
describe('removeReaction', () => {
|
|
217
|
-
|
|
288
|
+
it('removes reaction from message', async () => {
|
|
218
289
|
// given
|
|
219
290
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
220
291
|
|
|
@@ -224,8 +295,40 @@ describe('SlackBotClient', () => {
|
|
|
224
295
|
})
|
|
225
296
|
})
|
|
226
297
|
|
|
298
|
+
describe('setAssistantStatus', () => {
|
|
299
|
+
it('sets assistant typing status with channel_id and thread_ts', async () => {
|
|
300
|
+
// given
|
|
301
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
302
|
+
|
|
303
|
+
// when
|
|
304
|
+
await client.setAssistantStatus('C123', '1234567890.123456', 'is typing...')
|
|
305
|
+
|
|
306
|
+
// then
|
|
307
|
+
expect(mockAssistant.threads.setStatus).toHaveBeenCalledWith({
|
|
308
|
+
channel_id: 'C123',
|
|
309
|
+
thread_ts: '1234567890.123456',
|
|
310
|
+
status: 'is typing...',
|
|
311
|
+
})
|
|
312
|
+
})
|
|
313
|
+
|
|
314
|
+
it('clears status when given empty string', async () => {
|
|
315
|
+
// given
|
|
316
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
317
|
+
|
|
318
|
+
// when
|
|
319
|
+
await client.setAssistantStatus('C123', '1234567890.123456', '')
|
|
320
|
+
|
|
321
|
+
// then
|
|
322
|
+
expect(mockAssistant.threads.setStatus).toHaveBeenCalledWith({
|
|
323
|
+
channel_id: 'C123',
|
|
324
|
+
thread_ts: '1234567890.123456',
|
|
325
|
+
status: '',
|
|
326
|
+
})
|
|
327
|
+
})
|
|
328
|
+
})
|
|
329
|
+
|
|
227
330
|
describe('listChannels', () => {
|
|
228
|
-
|
|
331
|
+
it('returns list of channels', async () => {
|
|
229
332
|
// given
|
|
230
333
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
231
334
|
|
|
@@ -240,7 +343,7 @@ describe('SlackBotClient', () => {
|
|
|
240
343
|
})
|
|
241
344
|
|
|
242
345
|
describe('getChannelInfo', () => {
|
|
243
|
-
|
|
346
|
+
it('returns channel details', async () => {
|
|
244
347
|
// given
|
|
245
348
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
246
349
|
|
|
@@ -254,7 +357,7 @@ describe('SlackBotClient', () => {
|
|
|
254
357
|
})
|
|
255
358
|
|
|
256
359
|
describe('resolveChannel', () => {
|
|
257
|
-
|
|
360
|
+
it('returns channel ID unchanged when it starts with C', async () => {
|
|
258
361
|
// given
|
|
259
362
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
260
363
|
|
|
@@ -266,7 +369,7 @@ describe('SlackBotClient', () => {
|
|
|
266
369
|
expect(mockConversations.list).not.toHaveBeenCalled()
|
|
267
370
|
})
|
|
268
371
|
|
|
269
|
-
|
|
372
|
+
it('returns channel ID unchanged when it starts with D', async () => {
|
|
270
373
|
// given
|
|
271
374
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
272
375
|
|
|
@@ -278,7 +381,7 @@ describe('SlackBotClient', () => {
|
|
|
278
381
|
expect(mockConversations.list).not.toHaveBeenCalled()
|
|
279
382
|
})
|
|
280
383
|
|
|
281
|
-
|
|
384
|
+
it('returns channel ID unchanged when it starts with G', async () => {
|
|
282
385
|
// given
|
|
283
386
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
284
387
|
|
|
@@ -290,7 +393,7 @@ describe('SlackBotClient', () => {
|
|
|
290
393
|
expect(mockConversations.list).not.toHaveBeenCalled()
|
|
291
394
|
})
|
|
292
395
|
|
|
293
|
-
|
|
396
|
+
it('resolves channel name to ID', async () => {
|
|
294
397
|
// given
|
|
295
398
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
296
399
|
|
|
@@ -302,7 +405,7 @@ describe('SlackBotClient', () => {
|
|
|
302
405
|
expect(mockConversations.list).toHaveBeenCalled()
|
|
303
406
|
})
|
|
304
407
|
|
|
305
|
-
|
|
408
|
+
it('strips leading # from channel name', async () => {
|
|
306
409
|
// given
|
|
307
410
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
308
411
|
|
|
@@ -314,7 +417,7 @@ describe('SlackBotClient', () => {
|
|
|
314
417
|
expect(mockConversations.list).toHaveBeenCalled()
|
|
315
418
|
})
|
|
316
419
|
|
|
317
|
-
|
|
420
|
+
it('returns channel ID unchanged when input is #C prefixed ID', async () => {
|
|
318
421
|
// given
|
|
319
422
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
320
423
|
|
|
@@ -325,7 +428,7 @@ describe('SlackBotClient', () => {
|
|
|
325
428
|
expect(channel).toBe('C123ABC')
|
|
326
429
|
})
|
|
327
430
|
|
|
328
|
-
|
|
431
|
+
it('throws channel_not_found error when name is not found', async () => {
|
|
329
432
|
// given
|
|
330
433
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
331
434
|
|
|
@@ -341,7 +444,7 @@ describe('SlackBotClient', () => {
|
|
|
341
444
|
})
|
|
342
445
|
|
|
343
446
|
describe('listUsers', () => {
|
|
344
|
-
|
|
447
|
+
it('returns list of users', async () => {
|
|
345
448
|
// given
|
|
346
449
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
347
450
|
|
|
@@ -355,7 +458,7 @@ describe('SlackBotClient', () => {
|
|
|
355
458
|
})
|
|
356
459
|
|
|
357
460
|
describe('getUserInfo', () => {
|
|
358
|
-
|
|
461
|
+
it('returns user details', async () => {
|
|
359
462
|
// given
|
|
360
463
|
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
361
464
|
|
|
@@ -367,4 +470,175 @@ describe('SlackBotClient', () => {
|
|
|
367
470
|
expect(user.name).toBe('testuser')
|
|
368
471
|
})
|
|
369
472
|
})
|
|
473
|
+
|
|
474
|
+
describe('uploadFile', () => {
|
|
475
|
+
it('uploads file via files.uploadV2 and returns mapped file', async () => {
|
|
476
|
+
// given
|
|
477
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
478
|
+
|
|
479
|
+
// when
|
|
480
|
+
const file = await client.uploadFile('C123', Buffer.from('test content'), 'test.txt')
|
|
481
|
+
|
|
482
|
+
// then
|
|
483
|
+
expect(file.id).toBe('F123')
|
|
484
|
+
expect(file.name).toBe('test.txt')
|
|
485
|
+
expect(file.size).toBe(12)
|
|
486
|
+
expect(mockFiles.uploadV2).toHaveBeenCalledWith(
|
|
487
|
+
expect.objectContaining({ channel_id: 'C123', filename: 'test.txt' }),
|
|
488
|
+
)
|
|
489
|
+
})
|
|
490
|
+
|
|
491
|
+
it('forwards thread_ts, title, initial_comment to the SDK', async () => {
|
|
492
|
+
// given
|
|
493
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
494
|
+
|
|
495
|
+
// when
|
|
496
|
+
await client.uploadFile('C123', Buffer.from('x'), 'test.txt', {
|
|
497
|
+
thread_ts: '1234567890.123456',
|
|
498
|
+
title: 'My Title',
|
|
499
|
+
initial_comment: 'Here you go',
|
|
500
|
+
})
|
|
501
|
+
|
|
502
|
+
// then
|
|
503
|
+
expect(mockFiles.uploadV2).toHaveBeenCalledWith(
|
|
504
|
+
expect.objectContaining({
|
|
505
|
+
channel_id: 'C123',
|
|
506
|
+
filename: 'test.txt',
|
|
507
|
+
thread_ts: '1234567890.123456',
|
|
508
|
+
title: 'My Title',
|
|
509
|
+
initial_comment: 'Here you go',
|
|
510
|
+
}),
|
|
511
|
+
)
|
|
512
|
+
})
|
|
513
|
+
|
|
514
|
+
it('throws SlackBotError when API responds not ok', async () => {
|
|
515
|
+
// given
|
|
516
|
+
mockFiles.uploadV2.mockResolvedValueOnce({ ok: false, error: 'file_upload_failed' } as any)
|
|
517
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
518
|
+
|
|
519
|
+
// when/then
|
|
520
|
+
await expect(client.uploadFile('C123', Buffer.from('x'), 'test.txt')).rejects.toThrow(SlackBotError)
|
|
521
|
+
})
|
|
522
|
+
|
|
523
|
+
it('throws SlackBotError when completion has no inner files', async () => {
|
|
524
|
+
// given
|
|
525
|
+
mockFiles.uploadV2.mockResolvedValueOnce({ ok: true, files: [{ ok: true, files: [] }] } as any)
|
|
526
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
527
|
+
|
|
528
|
+
// when/then
|
|
529
|
+
await expect(client.uploadFile('C123', Buffer.from('x'), 'test.txt')).rejects.toThrow(SlackBotError)
|
|
530
|
+
})
|
|
531
|
+
})
|
|
532
|
+
|
|
533
|
+
describe('listFiles', () => {
|
|
534
|
+
it('returns mapped files', async () => {
|
|
535
|
+
// given
|
|
536
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
537
|
+
|
|
538
|
+
// when
|
|
539
|
+
const files = await client.listFiles()
|
|
540
|
+
|
|
541
|
+
// then
|
|
542
|
+
expect(files).toHaveLength(1)
|
|
543
|
+
expect(files[0].id).toBe('F123')
|
|
544
|
+
expect(files[0].mimetype).toBe('text/plain')
|
|
545
|
+
})
|
|
546
|
+
|
|
547
|
+
it('forwards channel/user/limit to the SDK', async () => {
|
|
548
|
+
// given
|
|
549
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
550
|
+
|
|
551
|
+
// when
|
|
552
|
+
await client.listFiles({ channel: 'C123', user: 'U123', limit: 50 })
|
|
553
|
+
|
|
554
|
+
// then
|
|
555
|
+
expect(mockFiles.list).toHaveBeenCalledWith({ channel: 'C123', user: 'U123', count: 50 })
|
|
556
|
+
})
|
|
557
|
+
})
|
|
558
|
+
|
|
559
|
+
describe('getFileInfo', () => {
|
|
560
|
+
it('returns file metadata', async () => {
|
|
561
|
+
// given
|
|
562
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
563
|
+
|
|
564
|
+
// when
|
|
565
|
+
const file = await client.getFileInfo('F123')
|
|
566
|
+
|
|
567
|
+
// then
|
|
568
|
+
expect(file.id).toBe('F123')
|
|
569
|
+
expect(file.url_private).toBe('https://files.slack.com/files-pri/T123-F123/test.txt')
|
|
570
|
+
})
|
|
571
|
+
|
|
572
|
+
it('throws on API failure', async () => {
|
|
573
|
+
// given
|
|
574
|
+
mockFiles.info.mockResolvedValueOnce({ ok: false, error: 'file_not_found' } as any)
|
|
575
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
576
|
+
|
|
577
|
+
// when/then
|
|
578
|
+
await expect(client.getFileInfo('F999')).rejects.toThrow(SlackBotError)
|
|
579
|
+
})
|
|
580
|
+
})
|
|
581
|
+
|
|
582
|
+
describe('downloadFile', () => {
|
|
583
|
+
it('downloads file content using the bot token', async () => {
|
|
584
|
+
// given
|
|
585
|
+
const originalFetch = globalThis.fetch
|
|
586
|
+
let capturedAuthHeader: string | null = null
|
|
587
|
+
globalThis.fetch = async (_url: any, init: any = {}) => {
|
|
588
|
+
capturedAuthHeader = init?.headers?.Authorization ?? null
|
|
589
|
+
return new Response(Buffer.from('downloaded content'), { status: 200 })
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
try {
|
|
593
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
594
|
+
|
|
595
|
+
// when
|
|
596
|
+
const result = await client.downloadFile('F123')
|
|
597
|
+
|
|
598
|
+
// then
|
|
599
|
+
expect(capturedAuthHeader).toBe('Bearer xoxb-test-token')
|
|
600
|
+
expect(result.file.id).toBe('F123')
|
|
601
|
+
expect(result.buffer.toString()).toBe('downloaded content')
|
|
602
|
+
} finally {
|
|
603
|
+
globalThis.fetch = originalFetch
|
|
604
|
+
}
|
|
605
|
+
})
|
|
606
|
+
|
|
607
|
+
it('throws SlackBotError when download HTTP response is not ok', async () => {
|
|
608
|
+
// given
|
|
609
|
+
const originalFetch = globalThis.fetch
|
|
610
|
+
globalThis.fetch = async () => new Response('forbidden', { status: 403, statusText: 'Forbidden' })
|
|
611
|
+
|
|
612
|
+
try {
|
|
613
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
614
|
+
|
|
615
|
+
// when/then
|
|
616
|
+
await expect(client.downloadFile('F123')).rejects.toThrow(SlackBotError)
|
|
617
|
+
} finally {
|
|
618
|
+
globalThis.fetch = originalFetch
|
|
619
|
+
}
|
|
620
|
+
})
|
|
621
|
+
})
|
|
622
|
+
|
|
623
|
+
describe('deleteFile', () => {
|
|
624
|
+
it('calls files.delete with the given file ID', async () => {
|
|
625
|
+
// given
|
|
626
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
627
|
+
|
|
628
|
+
// when
|
|
629
|
+
await client.deleteFile('F123')
|
|
630
|
+
|
|
631
|
+
// then
|
|
632
|
+
expect(mockFiles.delete).toHaveBeenCalledWith({ file: 'F123' })
|
|
633
|
+
})
|
|
634
|
+
|
|
635
|
+
it('throws on API failure', async () => {
|
|
636
|
+
// given
|
|
637
|
+
mockFiles.delete.mockResolvedValueOnce({ ok: false, error: 'cant_delete_file' } as any)
|
|
638
|
+
const client = await new SlackBotClient().login({ token: 'xoxb-test-token' })
|
|
639
|
+
|
|
640
|
+
// when/then
|
|
641
|
+
await expect(client.deleteFile('F123')).rejects.toThrow(SlackBotError)
|
|
642
|
+
})
|
|
643
|
+
})
|
|
370
644
|
})
|