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
|
@@ -4,6 +4,8 @@ import { join } from 'node:path'
|
|
|
4
4
|
|
|
5
5
|
import { ClassicLevel } from 'classic-level'
|
|
6
6
|
|
|
7
|
+
import { getAgentBrowserProfileDirs } from '@/shared/chromium'
|
|
8
|
+
|
|
7
9
|
export interface ExtractedWebexToken {
|
|
8
10
|
accessToken: string
|
|
9
11
|
refreshToken?: string
|
|
@@ -74,11 +76,18 @@ export class WebexTokenExtractor {
|
|
|
74
76
|
private platform: NodeJS.Platform
|
|
75
77
|
private baseDir: string | null
|
|
76
78
|
private debugLog: ((message: string) => void) | null
|
|
77
|
-
|
|
78
|
-
|
|
79
|
+
private customBrowserProfileDirs: string[]
|
|
80
|
+
|
|
81
|
+
constructor(
|
|
82
|
+
platform?: NodeJS.Platform,
|
|
83
|
+
debugLog?: (message: string) => void,
|
|
84
|
+
baseDir?: string,
|
|
85
|
+
customBrowserProfileDirs?: string[],
|
|
86
|
+
) {
|
|
79
87
|
this.platform = platform ?? process.platform
|
|
80
88
|
this.debugLog = debugLog ?? null
|
|
81
89
|
this.baseDir = baseDir ?? null
|
|
90
|
+
this.customBrowserProfileDirs = customBrowserProfileDirs ?? []
|
|
82
91
|
}
|
|
83
92
|
|
|
84
93
|
private debug(message: string): void {
|
|
@@ -87,7 +96,7 @@ export class WebexTokenExtractor {
|
|
|
87
96
|
|
|
88
97
|
getBrowserProfileDirs(): string[] {
|
|
89
98
|
if (this.baseDir) {
|
|
90
|
-
return this.discoverProfileDirs(this.baseDir)
|
|
99
|
+
return [...this.discoverProfileDirs(this.baseDir), ...this.getCustomBrowserProfileLevelDBDirs()]
|
|
91
100
|
}
|
|
92
101
|
|
|
93
102
|
const dirs: string[] = []
|
|
@@ -100,6 +109,19 @@ export class WebexTokenExtractor {
|
|
|
100
109
|
dirs.push(...profileDirs)
|
|
101
110
|
}
|
|
102
111
|
|
|
112
|
+
dirs.push(...this.getCustomBrowserProfileLevelDBDirs())
|
|
113
|
+
|
|
114
|
+
return dirs
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
private getCustomBrowserProfileLevelDBDirs(): string[] {
|
|
118
|
+
const dirs: string[] = []
|
|
119
|
+
for (const profileDir of getAgentBrowserProfileDirs({ customProfileDirs: this.customBrowserProfileDirs })) {
|
|
120
|
+
const leveldb = join(profileDir, 'Local Storage', 'leveldb')
|
|
121
|
+
if (existsSync(leveldb)) {
|
|
122
|
+
dirs.push(leveldb)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
103
125
|
return dirs
|
|
104
126
|
}
|
|
105
127
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { expect,
|
|
1
|
+
import { expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
WebexConfigSchema,
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
WebexSpaceSchema,
|
|
10
10
|
} from './types'
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
it('WebexSpaceSchema validates valid space', () => {
|
|
13
13
|
const result = WebexSpaceSchema.safeParse({
|
|
14
14
|
id: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
15
15
|
title: 'Project Alpha',
|
|
@@ -22,7 +22,7 @@ test('WebexSpaceSchema validates valid space', () => {
|
|
|
22
22
|
expect(result.success).toBe(true)
|
|
23
23
|
})
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
it('WebexSpaceSchema validates space with optional teamId', () => {
|
|
26
26
|
const result = WebexSpaceSchema.safeParse({
|
|
27
27
|
id: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
28
28
|
title: 'Project Alpha',
|
|
@@ -36,7 +36,7 @@ test('WebexSpaceSchema validates space with optional teamId', () => {
|
|
|
36
36
|
expect(result.success).toBe(true)
|
|
37
37
|
})
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
it('WebexSpaceSchema validates direct space type', () => {
|
|
40
40
|
const result = WebexSpaceSchema.safeParse({
|
|
41
41
|
id: 'Y2lzY29zcGFyazovL3VzL1JPT00vZGlyZWN0',
|
|
42
42
|
title: 'Direct Message',
|
|
@@ -49,7 +49,7 @@ test('WebexSpaceSchema validates direct space type', () => {
|
|
|
49
49
|
expect(result.success).toBe(true)
|
|
50
50
|
})
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
it('WebexSpaceSchema rejects missing required fields', () => {
|
|
53
53
|
const result = WebexSpaceSchema.safeParse({
|
|
54
54
|
id: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
55
55
|
title: 'Project Alpha',
|
|
@@ -57,7 +57,7 @@ test('WebexSpaceSchema rejects missing required fields', () => {
|
|
|
57
57
|
expect(result.success).toBe(false)
|
|
58
58
|
})
|
|
59
59
|
|
|
60
|
-
|
|
60
|
+
it('WebexSpaceSchema rejects invalid type', () => {
|
|
61
61
|
const result = WebexSpaceSchema.safeParse({
|
|
62
62
|
id: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
63
63
|
title: 'Project Alpha',
|
|
@@ -70,7 +70,7 @@ test('WebexSpaceSchema rejects invalid type', () => {
|
|
|
70
70
|
expect(result.success).toBe(false)
|
|
71
71
|
})
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
it('WebexMessageSchema validates valid message', () => {
|
|
74
74
|
const result = WebexMessageSchema.safeParse({
|
|
75
75
|
id: 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvbXNn',
|
|
76
76
|
roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
@@ -83,7 +83,7 @@ test('WebexMessageSchema validates valid message', () => {
|
|
|
83
83
|
expect(result.success).toBe(true)
|
|
84
84
|
})
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
it('WebexMessageSchema validates message with optional fields', () => {
|
|
87
87
|
const result = WebexMessageSchema.safeParse({
|
|
88
88
|
id: 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvbXNn',
|
|
89
89
|
roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
@@ -101,7 +101,7 @@ test('WebexMessageSchema validates message with optional fields', () => {
|
|
|
101
101
|
expect(result.success).toBe(true)
|
|
102
102
|
})
|
|
103
103
|
|
|
104
|
-
|
|
104
|
+
it('WebexMessageSchema rejects missing required fields', () => {
|
|
105
105
|
const result = WebexMessageSchema.safeParse({
|
|
106
106
|
id: 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvbXNn',
|
|
107
107
|
roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
@@ -110,7 +110,7 @@ test('WebexMessageSchema rejects missing required fields', () => {
|
|
|
110
110
|
expect(result.success).toBe(false)
|
|
111
111
|
})
|
|
112
112
|
|
|
113
|
-
|
|
113
|
+
it('WebexMessageSchema rejects invalid roomType', () => {
|
|
114
114
|
const result = WebexMessageSchema.safeParse({
|
|
115
115
|
id: 'Y2lzY29zcGFyazovL3VzL01FU1NBR0UvbXNn',
|
|
116
116
|
roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
@@ -122,7 +122,7 @@ test('WebexMessageSchema rejects invalid roomType', () => {
|
|
|
122
122
|
expect(result.success).toBe(false)
|
|
123
123
|
})
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
it('WebexPersonSchema validates valid person', () => {
|
|
126
126
|
const result = WebexPersonSchema.safeParse({
|
|
127
127
|
id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9hYmM',
|
|
128
128
|
emails: ['user@example.com'],
|
|
@@ -134,7 +134,7 @@ test('WebexPersonSchema validates valid person', () => {
|
|
|
134
134
|
expect(result.success).toBe(true)
|
|
135
135
|
})
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
it('WebexPersonSchema validates person with optional fields', () => {
|
|
138
138
|
const result = WebexPersonSchema.safeParse({
|
|
139
139
|
id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9hYmM',
|
|
140
140
|
emails: ['user@example.com', 'user@work.com'],
|
|
@@ -150,7 +150,7 @@ test('WebexPersonSchema validates person with optional fields', () => {
|
|
|
150
150
|
expect(result.success).toBe(true)
|
|
151
151
|
})
|
|
152
152
|
|
|
153
|
-
|
|
153
|
+
it('WebexPersonSchema validates bot type', () => {
|
|
154
154
|
const result = WebexPersonSchema.safeParse({
|
|
155
155
|
id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9ib3Q',
|
|
156
156
|
emails: ['bot@webex.bot'],
|
|
@@ -162,7 +162,7 @@ test('WebexPersonSchema validates bot type', () => {
|
|
|
162
162
|
expect(result.success).toBe(true)
|
|
163
163
|
})
|
|
164
164
|
|
|
165
|
-
|
|
165
|
+
it('WebexPersonSchema rejects missing required fields', () => {
|
|
166
166
|
const result = WebexPersonSchema.safeParse({
|
|
167
167
|
id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9hYmM',
|
|
168
168
|
displayName: 'Test User',
|
|
@@ -170,7 +170,7 @@ test('WebexPersonSchema rejects missing required fields', () => {
|
|
|
170
170
|
expect(result.success).toBe(false)
|
|
171
171
|
})
|
|
172
172
|
|
|
173
|
-
|
|
173
|
+
it('WebexPersonSchema rejects invalid type', () => {
|
|
174
174
|
const result = WebexPersonSchema.safeParse({
|
|
175
175
|
id: 'Y2lzY29zcGFyazovL3VzL1BFT1BMRS9hYmM',
|
|
176
176
|
emails: ['user@example.com'],
|
|
@@ -182,7 +182,7 @@ test('WebexPersonSchema rejects invalid type', () => {
|
|
|
182
182
|
expect(result.success).toBe(false)
|
|
183
183
|
})
|
|
184
184
|
|
|
185
|
-
|
|
185
|
+
it('WebexMembershipSchema validates valid membership', () => {
|
|
186
186
|
const result = WebexMembershipSchema.safeParse({
|
|
187
187
|
id: 'Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvbWVt',
|
|
188
188
|
roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
@@ -195,7 +195,7 @@ test('WebexMembershipSchema validates valid membership', () => {
|
|
|
195
195
|
expect(result.success).toBe(true)
|
|
196
196
|
})
|
|
197
197
|
|
|
198
|
-
|
|
198
|
+
it('WebexMembershipSchema validates moderator membership', () => {
|
|
199
199
|
const result = WebexMembershipSchema.safeParse({
|
|
200
200
|
id: 'Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvbWVt',
|
|
201
201
|
roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
@@ -208,7 +208,7 @@ test('WebexMembershipSchema validates moderator membership', () => {
|
|
|
208
208
|
expect(result.success).toBe(true)
|
|
209
209
|
})
|
|
210
210
|
|
|
211
|
-
|
|
211
|
+
it('WebexMembershipSchema rejects missing required fields', () => {
|
|
212
212
|
const result = WebexMembershipSchema.safeParse({
|
|
213
213
|
id: 'Y2lzY29zcGFyazovL3VzL01FTUJFUlNISVAvbWVt',
|
|
214
214
|
roomId: 'Y2lzY29zcGFyazovL3VzL1JPT00vYWJj',
|
|
@@ -216,7 +216,7 @@ test('WebexMembershipSchema rejects missing required fields', () => {
|
|
|
216
216
|
expect(result.success).toBe(false)
|
|
217
217
|
})
|
|
218
218
|
|
|
219
|
-
|
|
219
|
+
it('WebexConfigSchema validates valid OAuth config', () => {
|
|
220
220
|
const result = WebexConfigSchema.safeParse({
|
|
221
221
|
accessToken: 'test',
|
|
222
222
|
refreshToken: 'test',
|
|
@@ -225,7 +225,7 @@ test('WebexConfigSchema validates valid OAuth config', () => {
|
|
|
225
225
|
expect(result.success).toBe(true)
|
|
226
226
|
})
|
|
227
227
|
|
|
228
|
-
|
|
228
|
+
it('WebexConfigSchema validates config with clientId and clientSecret', () => {
|
|
229
229
|
const result = WebexConfigSchema.safeParse({
|
|
230
230
|
accessToken: 'test',
|
|
231
231
|
refreshToken: 'test',
|
|
@@ -240,7 +240,7 @@ test('WebexConfigSchema validates config with clientId and clientSecret', () =>
|
|
|
240
240
|
}
|
|
241
241
|
})
|
|
242
242
|
|
|
243
|
-
|
|
243
|
+
it('WebexConfigSchema validates config with tokenType oauth', () => {
|
|
244
244
|
const result = WebexConfigSchema.safeParse({
|
|
245
245
|
accessToken: 'test',
|
|
246
246
|
refreshToken: 'test',
|
|
@@ -253,7 +253,7 @@ test('WebexConfigSchema validates config with tokenType oauth', () => {
|
|
|
253
253
|
}
|
|
254
254
|
})
|
|
255
255
|
|
|
256
|
-
|
|
256
|
+
it('WebexConfigSchema validates config with tokenType manual', () => {
|
|
257
257
|
const result = WebexConfigSchema.safeParse({
|
|
258
258
|
accessToken: 'test',
|
|
259
259
|
refreshToken: '',
|
|
@@ -266,7 +266,7 @@ test('WebexConfigSchema validates config with tokenType manual', () => {
|
|
|
266
266
|
}
|
|
267
267
|
})
|
|
268
268
|
|
|
269
|
-
|
|
269
|
+
it('WebexConfigSchema rejects invalid tokenType', () => {
|
|
270
270
|
const result = WebexConfigSchema.safeParse({
|
|
271
271
|
accessToken: 'test',
|
|
272
272
|
refreshToken: 'test',
|
|
@@ -276,7 +276,7 @@ test('WebexConfigSchema rejects invalid tokenType', () => {
|
|
|
276
276
|
expect(result.success).toBe(false)
|
|
277
277
|
})
|
|
278
278
|
|
|
279
|
-
|
|
279
|
+
it('WebexConfigSchema accepts config without clientId/clientSecret (backward compat)', () => {
|
|
280
280
|
const result = WebexConfigSchema.safeParse({
|
|
281
281
|
accessToken: 'test',
|
|
282
282
|
refreshToken: 'test',
|
|
@@ -289,19 +289,19 @@ test('WebexConfigSchema accepts config without clientId/clientSecret (backward c
|
|
|
289
289
|
}
|
|
290
290
|
})
|
|
291
291
|
|
|
292
|
-
|
|
292
|
+
it('WebexConfigSchema rejects missing fields', () => {
|
|
293
293
|
const result = WebexConfigSchema.safeParse({})
|
|
294
294
|
expect(result.success).toBe(false)
|
|
295
295
|
})
|
|
296
296
|
|
|
297
|
-
|
|
297
|
+
it('WebexError has correct name and code', () => {
|
|
298
298
|
const error = new WebexError('Not found', 'NOT_FOUND')
|
|
299
299
|
expect(error.name).toBe('WebexError')
|
|
300
300
|
expect(error.message).toBe('Not found')
|
|
301
301
|
expect(error.code).toBe('NOT_FOUND')
|
|
302
302
|
})
|
|
303
303
|
|
|
304
|
-
|
|
304
|
+
it('WebexError is instance of Error', () => {
|
|
305
305
|
const error = new WebexError('Unauthorized', 'UNAUTHORIZED')
|
|
306
306
|
expect(error instanceof Error).toBe(true)
|
|
307
307
|
})
|
|
@@ -13,6 +13,15 @@ program
|
|
|
13
13
|
.version(pkg.version)
|
|
14
14
|
.option('--pretty', 'Pretty-print JSON output')
|
|
15
15
|
.option('--account <id>', 'Account ID to use')
|
|
16
|
+
.hook('preAction', (thisCmd, actionCmd) => {
|
|
17
|
+
for (const [key, value] of Object.entries(thisCmd.opts())) {
|
|
18
|
+
if (value === undefined) continue
|
|
19
|
+
const source = actionCmd.getOptionValueSource(key)
|
|
20
|
+
if (source === undefined || source === 'default') {
|
|
21
|
+
actionCmd.setOptionValue(key, value)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
})
|
|
16
25
|
|
|
17
26
|
program.addCommand(authCommand)
|
|
18
27
|
program.addCommand(whoamiCommand)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { WeChatBotClient } from '@/platforms/wechatbot/client'
|
|
4
4
|
import { WeChatBotError } from '@/platforms/wechatbot/types'
|
|
@@ -48,28 +48,28 @@ describe('WeChatBotClient', () => {
|
|
|
48
48
|
const tokenResponse = () => mockResponse({ access_token: 'test-token', expires_in: 7200 })
|
|
49
49
|
|
|
50
50
|
describe('login', () => {
|
|
51
|
-
|
|
51
|
+
it('throws on empty appId', async () => {
|
|
52
52
|
await expect(new WeChatBotClient().login({ appId: '', appSecret: 'secret' })).rejects.toThrow(WeChatBotError)
|
|
53
53
|
await expect(new WeChatBotClient().login({ appId: '', appSecret: 'secret' })).rejects.toThrow(
|
|
54
54
|
'App ID is required',
|
|
55
55
|
)
|
|
56
56
|
})
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
it('throws on empty appSecret', async () => {
|
|
59
59
|
await expect(new WeChatBotClient().login({ appId: 'wx123', appSecret: '' })).rejects.toThrow(WeChatBotError)
|
|
60
60
|
await expect(new WeChatBotClient().login({ appId: 'wx123', appSecret: '' })).rejects.toThrow(
|
|
61
61
|
'App Secret is required',
|
|
62
62
|
)
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
it('accepts valid credentials and returns client', async () => {
|
|
66
66
|
const client = await new WeChatBotClient().login({ appId: 'wx123', appSecret: 'secret123' })
|
|
67
67
|
expect(client).toBeInstanceOf(WeChatBotClient)
|
|
68
68
|
})
|
|
69
69
|
})
|
|
70
70
|
|
|
71
71
|
describe('verifyCredentials', () => {
|
|
72
|
-
|
|
72
|
+
it('calls token endpoint and returns true on success', async () => {
|
|
73
73
|
tokenResponse()
|
|
74
74
|
|
|
75
75
|
const client = await new WeChatBotClient().login({ appId: 'wx123', appSecret: 'secret123' })
|
|
@@ -82,7 +82,7 @@ describe('WeChatBotClient', () => {
|
|
|
82
82
|
expect(fetchCalls[0].url).toContain('secret=secret123')
|
|
83
83
|
})
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
it('returns false on token error', async () => {
|
|
86
86
|
mockResponse({ errcode: 40125, errmsg: 'invalid appsecret' })
|
|
87
87
|
|
|
88
88
|
const client = await new WeChatBotClient().login({ appId: 'wx123', appSecret: 'bad-secret' })
|
|
@@ -91,7 +91,7 @@ describe('WeChatBotClient', () => {
|
|
|
91
91
|
expect(result).toBe(false)
|
|
92
92
|
})
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
it('returns false on network error', async () => {
|
|
95
95
|
fetchResponses = []
|
|
96
96
|
Object.defineProperty(globalThis, 'fetch', {
|
|
97
97
|
value: async (): Promise<Response> => {
|
|
@@ -109,7 +109,7 @@ describe('WeChatBotClient', () => {
|
|
|
109
109
|
})
|
|
110
110
|
|
|
111
111
|
describe('sendTextMessage', () => {
|
|
112
|
-
|
|
112
|
+
it('sends POST to /cgi-bin/message/custom/send with token in query', async () => {
|
|
113
113
|
tokenResponse()
|
|
114
114
|
mockResponse({ errcode: 0, errmsg: 'ok' })
|
|
115
115
|
|
|
@@ -123,7 +123,7 @@ describe('WeChatBotClient', () => {
|
|
|
123
123
|
expect(call.options?.method).toBe('POST')
|
|
124
124
|
})
|
|
125
125
|
|
|
126
|
-
|
|
126
|
+
it('sends correct body shape', async () => {
|
|
127
127
|
tokenResponse()
|
|
128
128
|
mockResponse({ errcode: 0, errmsg: 'ok' })
|
|
129
129
|
|
|
@@ -140,7 +140,7 @@ describe('WeChatBotClient', () => {
|
|
|
140
140
|
})
|
|
141
141
|
|
|
142
142
|
describe('sendImageMessage', () => {
|
|
143
|
-
|
|
143
|
+
it('sends POST with image payload', async () => {
|
|
144
144
|
tokenResponse()
|
|
145
145
|
mockResponse({ errcode: 0, errmsg: 'ok' })
|
|
146
146
|
|
|
@@ -157,7 +157,7 @@ describe('WeChatBotClient', () => {
|
|
|
157
157
|
})
|
|
158
158
|
|
|
159
159
|
describe('sendNewsMessage', () => {
|
|
160
|
-
|
|
160
|
+
it('sends POST with news/articles payload', async () => {
|
|
161
161
|
tokenResponse()
|
|
162
162
|
mockResponse({ errcode: 0, errmsg: 'ok' })
|
|
163
163
|
|
|
@@ -182,7 +182,7 @@ describe('WeChatBotClient', () => {
|
|
|
182
182
|
})
|
|
183
183
|
|
|
184
184
|
describe('sendTemplateMessage', () => {
|
|
185
|
-
|
|
185
|
+
it('sends POST to /cgi-bin/message/template/send and returns msgid', async () => {
|
|
186
186
|
tokenResponse()
|
|
187
187
|
mockResponse({ errcode: 0, errmsg: 'ok', msgid: 12345 })
|
|
188
188
|
|
|
@@ -208,7 +208,7 @@ describe('WeChatBotClient', () => {
|
|
|
208
208
|
})
|
|
209
209
|
|
|
210
210
|
describe('listTemplates', () => {
|
|
211
|
-
|
|
211
|
+
it('sends GET and unwraps template_list from response', async () => {
|
|
212
212
|
tokenResponse()
|
|
213
213
|
mockResponse({
|
|
214
214
|
errcode: 0,
|
|
@@ -236,7 +236,7 @@ describe('WeChatBotClient', () => {
|
|
|
236
236
|
})
|
|
237
237
|
|
|
238
238
|
describe('deleteTemplate', () => {
|
|
239
|
-
|
|
239
|
+
it('sends POST with template_id body', async () => {
|
|
240
240
|
tokenResponse()
|
|
241
241
|
mockResponse({ errcode: 0, errmsg: 'ok' })
|
|
242
242
|
|
|
@@ -250,7 +250,7 @@ describe('WeChatBotClient', () => {
|
|
|
250
250
|
})
|
|
251
251
|
|
|
252
252
|
describe('getFollowers', () => {
|
|
253
|
-
|
|
253
|
+
it('sends GET to /cgi-bin/user/get and returns openids array', async () => {
|
|
254
254
|
tokenResponse()
|
|
255
255
|
mockResponse({
|
|
256
256
|
errcode: 0,
|
|
@@ -270,7 +270,7 @@ describe('WeChatBotClient', () => {
|
|
|
270
270
|
expect(fetchCalls[1].url).toContain('/cgi-bin/user/get')
|
|
271
271
|
})
|
|
272
272
|
|
|
273
|
-
|
|
273
|
+
it('passes next_openid parameter when provided', async () => {
|
|
274
274
|
tokenResponse()
|
|
275
275
|
mockResponse({
|
|
276
276
|
total: 1,
|
|
@@ -285,7 +285,7 @@ describe('WeChatBotClient', () => {
|
|
|
285
285
|
expect(fetchCalls[1].url).toContain('next_openid=openid-2')
|
|
286
286
|
})
|
|
287
287
|
|
|
288
|
-
|
|
288
|
+
it('returns empty openids when data is missing', async () => {
|
|
289
289
|
tokenResponse()
|
|
290
290
|
mockResponse({
|
|
291
291
|
total: 0,
|
|
@@ -301,7 +301,7 @@ describe('WeChatBotClient', () => {
|
|
|
301
301
|
})
|
|
302
302
|
|
|
303
303
|
describe('getUserInfo', () => {
|
|
304
|
-
|
|
304
|
+
it('sends GET with openid and lang params', async () => {
|
|
305
305
|
tokenResponse()
|
|
306
306
|
mockResponse({
|
|
307
307
|
subscribe: 1,
|
|
@@ -325,7 +325,7 @@ describe('WeChatBotClient', () => {
|
|
|
325
325
|
expect(fetchCalls[1].url).toContain('lang=zh_CN')
|
|
326
326
|
})
|
|
327
327
|
|
|
328
|
-
|
|
328
|
+
it('defaults to zh_CN lang', async () => {
|
|
329
329
|
tokenResponse()
|
|
330
330
|
mockResponse({
|
|
331
331
|
subscribe: 1,
|
|
@@ -347,7 +347,7 @@ describe('WeChatBotClient', () => {
|
|
|
347
347
|
})
|
|
348
348
|
|
|
349
349
|
describe('token caching', () => {
|
|
350
|
-
|
|
350
|
+
it('second call does not re-fetch token if not expired', async () => {
|
|
351
351
|
tokenResponse()
|
|
352
352
|
mockResponse({ errcode: 0, errmsg: 'ok' })
|
|
353
353
|
mockResponse({ errcode: 0, errmsg: 'ok' })
|
|
@@ -364,7 +364,7 @@ describe('WeChatBotClient', () => {
|
|
|
364
364
|
})
|
|
365
365
|
|
|
366
366
|
describe('token auto-refresh on 40001', () => {
|
|
367
|
-
|
|
367
|
+
it('fetches new token and retries on errcode 40001', async () => {
|
|
368
368
|
tokenResponse()
|
|
369
369
|
mockResponse({ errcode: 40001, errmsg: 'invalid credential' })
|
|
370
370
|
mockResponse({ access_token: 'new-token', expires_in: 7200 })
|
|
@@ -381,7 +381,7 @@ describe('WeChatBotClient', () => {
|
|
|
381
381
|
})
|
|
382
382
|
|
|
383
383
|
describe('retry on system busy (errcode -1)', () => {
|
|
384
|
-
|
|
384
|
+
it('retries with backoff on errcode -1', async () => {
|
|
385
385
|
tokenResponse()
|
|
386
386
|
mockResponse({ errcode: -1, errmsg: 'system busy' })
|
|
387
387
|
mockResponse({ errcode: -1, errmsg: 'system busy' })
|
|
@@ -401,7 +401,7 @@ describe('WeChatBotClient', () => {
|
|
|
401
401
|
})
|
|
402
402
|
|
|
403
403
|
describe('network error retry', () => {
|
|
404
|
-
|
|
404
|
+
it('GET retries on fetch throw', async () => {
|
|
405
405
|
let callCount = 0
|
|
406
406
|
Object.defineProperty(globalThis, 'fetch', {
|
|
407
407
|
value: async (url: string | URL | Request, options?: RequestInit): Promise<Response> => {
|
|
@@ -434,7 +434,7 @@ describe('WeChatBotClient', () => {
|
|
|
434
434
|
expect(callCount).toBe(4)
|
|
435
435
|
})
|
|
436
436
|
|
|
437
|
-
|
|
437
|
+
it('POST does not retry on fetch throw', async () => {
|
|
438
438
|
let callCount = 0
|
|
439
439
|
Object.defineProperty(globalThis, 'fetch', {
|
|
440
440
|
value: async (url: string | URL | Request, options?: RequestInit): Promise<Response> => {
|
|
@@ -456,7 +456,7 @@ describe('WeChatBotClient', () => {
|
|
|
456
456
|
})
|
|
457
457
|
|
|
458
458
|
describe('errcode handling', () => {
|
|
459
|
-
|
|
459
|
+
it('non-zero errcode throws WeChatBotError with correct code', async () => {
|
|
460
460
|
tokenResponse()
|
|
461
461
|
mockResponse({ errcode: 48001, errmsg: 'api unauthorized' })
|
|
462
462
|
|
|
@@ -472,7 +472,7 @@ describe('WeChatBotClient', () => {
|
|
|
472
472
|
}
|
|
473
473
|
})
|
|
474
474
|
|
|
475
|
-
|
|
475
|
+
it('errcode 0 does not throw', async () => {
|
|
476
476
|
tokenResponse()
|
|
477
477
|
mockResponse({ errcode: 0, errmsg: 'ok' })
|
|
478
478
|
|
|
@@ -482,7 +482,7 @@ describe('WeChatBotClient', () => {
|
|
|
482
482
|
})
|
|
483
483
|
|
|
484
484
|
describe('rate limit (errcode 45009)', () => {
|
|
485
|
-
|
|
485
|
+
it('throws WeChatBotError with code 45009 and appropriate message', async () => {
|
|
486
486
|
tokenResponse()
|
|
487
487
|
mockResponse({ errcode: 45009, errmsg: 'reach max api daily quota limit' })
|
|
488
488
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterAll, describe, expect, mock,
|
|
1
|
+
import { afterAll, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
import { rmSync } from 'node:fs'
|
|
3
3
|
import { join } from 'node:path'
|
|
4
4
|
|
|
@@ -31,7 +31,7 @@ afterAll(() => {
|
|
|
31
31
|
})
|
|
32
32
|
|
|
33
33
|
describe('setAction', () => {
|
|
34
|
-
|
|
34
|
+
it('returns success with app_id when credentials are valid', async () => {
|
|
35
35
|
const credManager = makeCredManager()
|
|
36
36
|
const result = await setAction('wx123', 'secret123', { _credManager: credManager })
|
|
37
37
|
|
|
@@ -40,7 +40,7 @@ describe('setAction', () => {
|
|
|
40
40
|
expect(result.account_name).toBe('wx123')
|
|
41
41
|
})
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
it('saves credentials to credManager', async () => {
|
|
44
44
|
const credManager = makeCredManager()
|
|
45
45
|
await setAction('wx456', 'secret456', { _credManager: credManager })
|
|
46
46
|
|
|
@@ -48,7 +48,7 @@ describe('setAction', () => {
|
|
|
48
48
|
expect(creds?.app_id).toBe('wx456')
|
|
49
49
|
})
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
it('returns error when verifyCredentials returns false', async () => {
|
|
52
52
|
mock.module('../client', () => ({
|
|
53
53
|
WeChatBotClient: class MockWeChatBotClient {
|
|
54
54
|
async login() {
|
|
@@ -68,7 +68,7 @@ describe('setAction', () => {
|
|
|
68
68
|
})
|
|
69
69
|
|
|
70
70
|
describe('statusAction', () => {
|
|
71
|
-
|
|
71
|
+
it('returns valid: false when no credentials configured', async () => {
|
|
72
72
|
const credManager = makeCredManager()
|
|
73
73
|
const result = await statusAction({ _credManager: credManager })
|
|
74
74
|
|
|
@@ -76,7 +76,7 @@ describe('statusAction', () => {
|
|
|
76
76
|
expect(result.error).toBeDefined()
|
|
77
77
|
})
|
|
78
78
|
|
|
79
|
-
|
|
79
|
+
it('returns valid: true when credentials exist and are valid', async () => {
|
|
80
80
|
mock.module('../client', () => ({
|
|
81
81
|
WeChatBotClient: class MockWeChatBotClient {
|
|
82
82
|
async login() {
|
|
@@ -96,7 +96,7 @@ describe('statusAction', () => {
|
|
|
96
96
|
expect(result.app_id).toBe('wx123')
|
|
97
97
|
})
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
it('returns valid: false when credentials exist but are invalid', async () => {
|
|
100
100
|
mock.module('../client', () => ({
|
|
101
101
|
WeChatBotClient: class MockWeChatBotClient {
|
|
102
102
|
async login() {
|
|
@@ -115,7 +115,7 @@ describe('statusAction', () => {
|
|
|
115
115
|
expect(result.valid).toBe(false)
|
|
116
116
|
})
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
it('returns error message when account not found', async () => {
|
|
119
119
|
const credManager = makeCredManager()
|
|
120
120
|
const result = await statusAction({ account: 'nonexistent', _credManager: credManager })
|
|
121
121
|
|
|
@@ -125,7 +125,7 @@ describe('statusAction', () => {
|
|
|
125
125
|
})
|
|
126
126
|
|
|
127
127
|
describe('clearAction', () => {
|
|
128
|
-
|
|
128
|
+
it('clears all credentials and returns success', async () => {
|
|
129
129
|
const credManager = makeCredManager()
|
|
130
130
|
await credManager.setCredentials({ app_id: 'wx123', app_secret: 'secret123', account_name: 'My Account' })
|
|
131
131
|
|
|
@@ -139,14 +139,14 @@ describe('clearAction', () => {
|
|
|
139
139
|
})
|
|
140
140
|
|
|
141
141
|
describe('listAction', () => {
|
|
142
|
-
|
|
142
|
+
it('returns empty accounts array when none configured', async () => {
|
|
143
143
|
const credManager = makeCredManager()
|
|
144
144
|
const result = await listAction({ _credManager: credManager })
|
|
145
145
|
|
|
146
146
|
expect(result.accounts).toEqual([])
|
|
147
147
|
})
|
|
148
148
|
|
|
149
|
-
|
|
149
|
+
it('returns all accounts with is_current flag', async () => {
|
|
150
150
|
const credManager = makeCredManager()
|
|
151
151
|
await credManager.setCredentials({ app_id: 'wx-a', app_secret: 'secret-a', account_name: 'Account A' })
|
|
152
152
|
await credManager.setCredentials({ app_id: 'wx-b', app_secret: 'secret-b', account_name: 'Account B' })
|
|
@@ -162,7 +162,7 @@ describe('listAction', () => {
|
|
|
162
162
|
})
|
|
163
163
|
|
|
164
164
|
describe('useAction', () => {
|
|
165
|
-
|
|
165
|
+
it('switches to specified account and returns success', async () => {
|
|
166
166
|
const credManager = makeCredManager()
|
|
167
167
|
await credManager.setCredentials({ app_id: 'wx-a', app_secret: 'secret-a', account_name: 'Account A' })
|
|
168
168
|
await credManager.setCredentials({ app_id: 'wx-b', app_secret: 'secret-b', account_name: 'Account B' })
|
|
@@ -173,7 +173,7 @@ describe('useAction', () => {
|
|
|
173
173
|
expect(result.app_id).toBe('wx-a')
|
|
174
174
|
})
|
|
175
175
|
|
|
176
|
-
|
|
176
|
+
it('returns error when account not found', async () => {
|
|
177
177
|
const credManager = makeCredManager()
|
|
178
178
|
const result = await useAction('nonexistent', { _credManager: credManager })
|
|
179
179
|
|
|
@@ -184,7 +184,7 @@ describe('useAction', () => {
|
|
|
184
184
|
})
|
|
185
185
|
|
|
186
186
|
describe('removeAction', () => {
|
|
187
|
-
|
|
187
|
+
it('removes specified account and returns success', async () => {
|
|
188
188
|
const credManager = makeCredManager()
|
|
189
189
|
await credManager.setCredentials({ app_id: 'wx123', app_secret: 'secret123', account_name: 'My Account' })
|
|
190
190
|
|
|
@@ -196,7 +196,7 @@ describe('removeAction', () => {
|
|
|
196
196
|
expect(creds).toBeNull()
|
|
197
197
|
})
|
|
198
198
|
|
|
199
|
-
|
|
199
|
+
it('returns error when account not found', async () => {
|
|
200
200
|
const credManager = makeCredManager()
|
|
201
201
|
const result = await removeAction('nonexistent', { _credManager: credManager })
|
|
202
202
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Command } from 'commander'
|
|
2
2
|
|
|
3
|
+
import { cliOutput } from '@/shared/utils/cli-output'
|
|
3
4
|
import { formatOutput } from '@/shared/utils/output'
|
|
4
5
|
|
|
5
6
|
import { WeChatBotClient } from '../client'
|
|
@@ -139,11 +140,6 @@ export async function removeAction(accountId: string, options: ActionOptions): P
|
|
|
139
140
|
}
|
|
140
141
|
}
|
|
141
142
|
|
|
142
|
-
function cliOutput(result: ActionResult, pretty?: boolean, exitOnError = true): void {
|
|
143
|
-
console.log(formatOutput(result, pretty))
|
|
144
|
-
if (result.error && exitOnError) process.exit(1)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
143
|
export const authCommand = new Command('auth')
|
|
148
144
|
.description('Authentication commands')
|
|
149
145
|
.addCommand(
|