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,6 +1,6 @@
|
|
|
1
1
|
import { Command } from 'commander'
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { cliOutput } from '@/shared/utils/cli-output'
|
|
4
4
|
|
|
5
5
|
import { WhatsAppBotClient } from '../client'
|
|
6
6
|
import { WhatsAppBotCredentialManager } from '../credential-manager'
|
|
@@ -43,11 +43,6 @@ export async function whoamiAction(options: WhoamiOptions): Promise<WhoamiResult
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
function cliOutput(result: WhoamiResult, pretty?: boolean): void {
|
|
47
|
-
console.log(formatOutput(result, pretty))
|
|
48
|
-
if (result.error) process.exit(1)
|
|
49
|
-
}
|
|
50
|
-
|
|
51
46
|
export const whoamiCommand = new Command('whoami')
|
|
52
47
|
.description('Show current authenticated bot')
|
|
53
48
|
.option('--account <id>', 'Account ID to use')
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterAll, describe, expect,
|
|
1
|
+
import { afterAll, describe, expect, it } from 'bun:test'
|
|
2
2
|
import { existsSync, rmSync } from 'node:fs'
|
|
3
3
|
import { join } from 'node:path'
|
|
4
4
|
|
|
@@ -22,7 +22,7 @@ afterAll(() => {
|
|
|
22
22
|
})
|
|
23
23
|
|
|
24
24
|
describe('WhatsAppBotCredentialManager', () => {
|
|
25
|
-
|
|
25
|
+
it('load returns default config when file does not exist', async () => {
|
|
26
26
|
const manager = setup()
|
|
27
27
|
const config = await manager.load()
|
|
28
28
|
|
|
@@ -32,7 +32,7 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
32
32
|
})
|
|
33
33
|
})
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
it('save creates file with correct permissions', async () => {
|
|
36
36
|
const testConfigDir = join(
|
|
37
37
|
import.meta.dir,
|
|
38
38
|
`.test-whatsappbot-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
@@ -61,13 +61,13 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
61
61
|
expect(loaded).toEqual(config)
|
|
62
62
|
})
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
it('getCredentials returns null when not configured', async () => {
|
|
65
65
|
const manager = setup()
|
|
66
66
|
const creds = await manager.getCredentials()
|
|
67
67
|
expect(creds).toBeNull()
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
it('getCredentials returns credentials from env vars when E2E env vars are set', async () => {
|
|
71
71
|
const originalAccessToken = process.env.E2E_WHATSAPPBOT_ACCESS_TOKEN
|
|
72
72
|
const originalPhoneNumberId = process.env.E2E_WHATSAPPBOT_PHONE_NUMBER_ID
|
|
73
73
|
|
|
@@ -96,7 +96,7 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
96
96
|
}
|
|
97
97
|
})
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
it('getCredentials ignores env vars when accountId is provided', async () => {
|
|
100
100
|
const originalAccessToken = process.env.E2E_WHATSAPPBOT_ACCESS_TOKEN
|
|
101
101
|
const originalPhoneNumberId = process.env.E2E_WHATSAPPBOT_PHONE_NUMBER_ID
|
|
102
102
|
|
|
@@ -121,7 +121,7 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
121
121
|
}
|
|
122
122
|
})
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
it('getCredentials returns specific account by accountId', async () => {
|
|
125
125
|
const manager = setup()
|
|
126
126
|
await manager.setCredentials({
|
|
127
127
|
phone_number_id: 'phone-1',
|
|
@@ -142,13 +142,13 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
142
142
|
})
|
|
143
143
|
})
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
it('getCredentials returns null for nonexistent accountId', async () => {
|
|
146
146
|
const manager = setup()
|
|
147
147
|
const creds = await manager.getCredentials('nonexistent')
|
|
148
148
|
expect(creds).toBeNull()
|
|
149
149
|
})
|
|
150
150
|
|
|
151
|
-
|
|
151
|
+
it('setCredentials saves and sets as current', async () => {
|
|
152
152
|
const manager = setup()
|
|
153
153
|
await manager.setCredentials({
|
|
154
154
|
phone_number_id: '123456789',
|
|
@@ -167,7 +167,7 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
167
167
|
expect(config.current).toEqual({ account_id: '123456789' })
|
|
168
168
|
})
|
|
169
169
|
|
|
170
|
-
|
|
170
|
+
it('removeAccount deletes account and adjusts current', async () => {
|
|
171
171
|
const manager = setup()
|
|
172
172
|
await manager.setCredentials({
|
|
173
173
|
phone_number_id: '123456789',
|
|
@@ -186,13 +186,13 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
186
186
|
expect(config.accounts['123456789']).toBeUndefined()
|
|
187
187
|
})
|
|
188
188
|
|
|
189
|
-
|
|
189
|
+
it('removeAccount returns false for non-existent account', async () => {
|
|
190
190
|
const manager = setup()
|
|
191
191
|
const removed = await manager.removeAccount('nonexistent')
|
|
192
192
|
expect(removed).toBe(false)
|
|
193
193
|
})
|
|
194
194
|
|
|
195
|
-
|
|
195
|
+
it('removeAccount does not clear current when a different account is removed', async () => {
|
|
196
196
|
const manager = setup()
|
|
197
197
|
await manager.setCredentials({
|
|
198
198
|
phone_number_id: 'phone-1',
|
|
@@ -212,7 +212,7 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
212
212
|
expect(config.current).toEqual({ account_id: 'phone-2' })
|
|
213
213
|
})
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
it('setCurrent switches active account', async () => {
|
|
216
216
|
const manager = setup()
|
|
217
217
|
await manager.setCredentials({
|
|
218
218
|
phone_number_id: 'phone-1',
|
|
@@ -232,13 +232,13 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
232
232
|
expect(config.current).toEqual({ account_id: 'phone-1' })
|
|
233
233
|
})
|
|
234
234
|
|
|
235
|
-
|
|
235
|
+
it('setCurrent returns false for non-existent account', async () => {
|
|
236
236
|
const manager = setup()
|
|
237
237
|
const result = await manager.setCurrent('nonexistent')
|
|
238
238
|
expect(result).toBe(false)
|
|
239
239
|
})
|
|
240
240
|
|
|
241
|
-
|
|
241
|
+
it('listAll returns all accounts with is_current flag', async () => {
|
|
242
242
|
const manager = setup()
|
|
243
243
|
await manager.setCredentials({
|
|
244
244
|
phone_number_id: 'phone-1',
|
|
@@ -261,13 +261,13 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
261
261
|
expect(phone2?.is_current).toBe(true)
|
|
262
262
|
})
|
|
263
263
|
|
|
264
|
-
|
|
264
|
+
it('listAll returns empty array when no accounts', async () => {
|
|
265
265
|
const manager = setup()
|
|
266
266
|
const accounts = await manager.listAll()
|
|
267
267
|
expect(accounts).toHaveLength(0)
|
|
268
268
|
})
|
|
269
269
|
|
|
270
|
-
|
|
270
|
+
it('clearCredentials resets everything', async () => {
|
|
271
271
|
const manager = setup()
|
|
272
272
|
await manager.setCredentials({
|
|
273
273
|
phone_number_id: '123456789',
|
|
@@ -282,7 +282,7 @@ describe('WhatsAppBotCredentialManager', () => {
|
|
|
282
282
|
expect(config.accounts).toEqual({})
|
|
283
283
|
})
|
|
284
284
|
|
|
285
|
-
|
|
285
|
+
it('completes round-trip: set → get → remove → get null', async () => {
|
|
286
286
|
const manager = setup()
|
|
287
287
|
|
|
288
288
|
await manager.setCredentials({
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { expect,
|
|
1
|
+
import { expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
WhatsAppBotAccountEntrySchema,
|
|
@@ -9,26 +9,26 @@ import {
|
|
|
9
9
|
WhatsAppBotError,
|
|
10
10
|
} from '@/platforms/whatsappbot/index'
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
it('WhatsAppBotClient is exported from barrel', () => {
|
|
13
13
|
expect(typeof WhatsAppBotClient).toBe('function')
|
|
14
14
|
})
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
it('WhatsAppBotCredentialManager is exported from barrel', () => {
|
|
17
17
|
expect(typeof WhatsAppBotCredentialManager).toBe('function')
|
|
18
18
|
})
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
it('WhatsAppBotError is exported from barrel', () => {
|
|
21
21
|
expect(typeof WhatsAppBotError).toBe('function')
|
|
22
22
|
})
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
it('WhatsAppBotAccountEntrySchema is exported from barrel', () => {
|
|
25
25
|
expect(typeof WhatsAppBotAccountEntrySchema.parse).toBe('function')
|
|
26
26
|
})
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
it('WhatsAppBotConfigSchema is exported from barrel', () => {
|
|
29
29
|
expect(typeof WhatsAppBotConfigSchema.parse).toBe('function')
|
|
30
30
|
})
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
it('WhatsAppBotCredentialsSchema is exported from barrel', () => {
|
|
33
33
|
expect(typeof WhatsAppBotCredentialsSchema.parse).toBe('function')
|
|
34
34
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { expect,
|
|
1
|
+
import { expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
WhatsAppBotAccountEntrySchema,
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
WhatsAppBotError,
|
|
8
8
|
} from '@/platforms/whatsappbot/types'
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
it('WhatsAppBotAccountEntrySchema validates correct data', () => {
|
|
11
11
|
const result = WhatsAppBotAccountEntrySchema.safeParse({
|
|
12
12
|
phone_number_id: '123456789',
|
|
13
13
|
account_name: 'Test Business',
|
|
@@ -16,7 +16,7 @@ test('WhatsAppBotAccountEntrySchema validates correct data', () => {
|
|
|
16
16
|
expect(result.success).toBe(true)
|
|
17
17
|
})
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
it('WhatsAppBotAccountEntrySchema rejects missing phone_number_id', () => {
|
|
20
20
|
const result = WhatsAppBotAccountEntrySchema.safeParse({
|
|
21
21
|
account_name: 'Test Business',
|
|
22
22
|
access_token: 'EAAtest123',
|
|
@@ -24,7 +24,7 @@ test('WhatsAppBotAccountEntrySchema rejects missing phone_number_id', () => {
|
|
|
24
24
|
expect(result.success).toBe(false)
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
it('WhatsAppBotAccountEntrySchema rejects missing account_name', () => {
|
|
28
28
|
const result = WhatsAppBotAccountEntrySchema.safeParse({
|
|
29
29
|
phone_number_id: '123456789',
|
|
30
30
|
access_token: 'EAAtest123',
|
|
@@ -32,7 +32,7 @@ test('WhatsAppBotAccountEntrySchema rejects missing account_name', () => {
|
|
|
32
32
|
expect(result.success).toBe(false)
|
|
33
33
|
})
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
it('WhatsAppBotAccountEntrySchema rejects missing access_token', () => {
|
|
36
36
|
const result = WhatsAppBotAccountEntrySchema.safeParse({
|
|
37
37
|
phone_number_id: '123456789',
|
|
38
38
|
account_name: 'Test Business',
|
|
@@ -40,7 +40,7 @@ test('WhatsAppBotAccountEntrySchema rejects missing access_token', () => {
|
|
|
40
40
|
expect(result.success).toBe(false)
|
|
41
41
|
})
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
it('WhatsAppBotConfigSchema validates with current account', () => {
|
|
44
44
|
const result = WhatsAppBotConfigSchema.safeParse({
|
|
45
45
|
current: { account_id: '123456789' },
|
|
46
46
|
accounts: {
|
|
@@ -54,7 +54,7 @@ test('WhatsAppBotConfigSchema validates with current account', () => {
|
|
|
54
54
|
expect(result.success).toBe(true)
|
|
55
55
|
})
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
it('WhatsAppBotConfigSchema validates with current null and empty accounts', () => {
|
|
58
58
|
const result = WhatsAppBotConfigSchema.safeParse({
|
|
59
59
|
current: null,
|
|
60
60
|
accounts: {},
|
|
@@ -62,7 +62,7 @@ test('WhatsAppBotConfigSchema validates with current null and empty accounts', (
|
|
|
62
62
|
expect(result.success).toBe(true)
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
it('WhatsAppBotConfigSchema validates with multiple accounts', () => {
|
|
66
66
|
const result = WhatsAppBotConfigSchema.safeParse({
|
|
67
67
|
current: { account_id: 'phone-1' },
|
|
68
68
|
accounts: {
|
|
@@ -73,21 +73,21 @@ test('WhatsAppBotConfigSchema validates with multiple accounts', () => {
|
|
|
73
73
|
expect(result.success).toBe(true)
|
|
74
74
|
})
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
it('WhatsAppBotConfigSchema rejects missing accounts field', () => {
|
|
77
77
|
const result = WhatsAppBotConfigSchema.safeParse({
|
|
78
78
|
current: null,
|
|
79
79
|
})
|
|
80
80
|
expect(result.success).toBe(false)
|
|
81
81
|
})
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
it('WhatsAppBotConfigSchema rejects missing current field', () => {
|
|
84
84
|
const result = WhatsAppBotConfigSchema.safeParse({
|
|
85
85
|
accounts: {},
|
|
86
86
|
})
|
|
87
87
|
expect(result.success).toBe(false)
|
|
88
88
|
})
|
|
89
89
|
|
|
90
|
-
|
|
90
|
+
it('WhatsAppBotCredentialsSchema validates correct data', () => {
|
|
91
91
|
const result = WhatsAppBotCredentialsSchema.safeParse({
|
|
92
92
|
phone_number_id: '123456789',
|
|
93
93
|
account_name: 'Test Business',
|
|
@@ -96,7 +96,7 @@ test('WhatsAppBotCredentialsSchema validates correct data', () => {
|
|
|
96
96
|
expect(result.success).toBe(true)
|
|
97
97
|
})
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
it('WhatsAppBotCredentialsSchema rejects missing phone_number_id', () => {
|
|
100
100
|
const result = WhatsAppBotCredentialsSchema.safeParse({
|
|
101
101
|
account_name: 'Test Business',
|
|
102
102
|
access_token: 'EAAtest123',
|
|
@@ -104,7 +104,7 @@ test('WhatsAppBotCredentialsSchema rejects missing phone_number_id', () => {
|
|
|
104
104
|
expect(result.success).toBe(false)
|
|
105
105
|
})
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
it('WhatsAppBotCredentialsSchema rejects missing account_name', () => {
|
|
108
108
|
const result = WhatsAppBotCredentialsSchema.safeParse({
|
|
109
109
|
phone_number_id: '123456789',
|
|
110
110
|
access_token: 'EAAtest123',
|
|
@@ -112,7 +112,7 @@ test('WhatsAppBotCredentialsSchema rejects missing account_name', () => {
|
|
|
112
112
|
expect(result.success).toBe(false)
|
|
113
113
|
})
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
it('WhatsAppBotCredentialsSchema rejects missing access_token', () => {
|
|
116
116
|
const result = WhatsAppBotCredentialsSchema.safeParse({
|
|
117
117
|
phone_number_id: '123456789',
|
|
118
118
|
account_name: 'Test Business',
|
|
@@ -120,22 +120,22 @@ test('WhatsAppBotCredentialsSchema rejects missing access_token', () => {
|
|
|
120
120
|
expect(result.success).toBe(false)
|
|
121
121
|
})
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
it('WhatsAppBotError has correct name', () => {
|
|
124
124
|
const error = new WhatsAppBotError('Test error', 'TEST_CODE')
|
|
125
125
|
expect(error.name).toBe('WhatsAppBotError')
|
|
126
126
|
})
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
it('WhatsAppBotError has correct message', () => {
|
|
129
129
|
const error = new WhatsAppBotError('Test error', 'TEST_CODE')
|
|
130
130
|
expect(error.message).toBe('Test error')
|
|
131
131
|
})
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
it('WhatsAppBotError has correct code', () => {
|
|
134
134
|
const error = new WhatsAppBotError('Test error', 'TEST_CODE')
|
|
135
135
|
expect(error.code).toBe('TEST_CODE')
|
|
136
136
|
})
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
it('WhatsAppBotError is instance of Error', () => {
|
|
139
139
|
const error = new WhatsAppBotError('Test error', 'TEST_CODE')
|
|
140
140
|
expect(error instanceof Error).toBe(true)
|
|
141
141
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, describe, expect,
|
|
1
|
+
import { afterEach, describe, expect, it } from 'bun:test'
|
|
2
2
|
import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
|
|
3
3
|
import { tmpdir } from 'node:os'
|
|
4
4
|
import { join } from 'node:path'
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
CHROMIUM_BROWSERS,
|
|
9
9
|
discoverBrowserProfileDirs,
|
|
10
10
|
findLocalStatePath,
|
|
11
|
+
getAgentBrowserProfileDirs,
|
|
11
12
|
getBrowserBasePath,
|
|
12
13
|
} from './browsers'
|
|
13
14
|
|
|
@@ -26,34 +27,34 @@ describe('browsers', () => {
|
|
|
26
27
|
})
|
|
27
28
|
|
|
28
29
|
describe('CHROMIUM_BROWSERS', () => {
|
|
29
|
-
|
|
30
|
+
it('has 7 browsers', () => {
|
|
30
31
|
expect(CHROMIUM_BROWSERS).toHaveLength(7)
|
|
31
32
|
})
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
it('includes major supported browsers', () => {
|
|
34
35
|
const browserNames = CHROMIUM_BROWSERS.map((browser) => browser.name)
|
|
35
36
|
|
|
36
37
|
expect(browserNames).toEqual(expect.arrayContaining(['Chrome', 'Edge', 'Arc', 'Brave', 'Vivaldi', 'Chromium']))
|
|
37
38
|
})
|
|
38
39
|
|
|
39
|
-
|
|
40
|
+
it('Arc has empty linux path', () => {
|
|
40
41
|
expect(CHROMIUM_BROWSERS.find((browser) => browser.name === 'Arc')?.linux).toBe('')
|
|
41
42
|
})
|
|
42
43
|
})
|
|
43
44
|
|
|
44
45
|
describe('BROWSER_KEYCHAIN_VARIANTS', () => {
|
|
45
|
-
|
|
46
|
+
it('has 7 keychain variants', () => {
|
|
46
47
|
expect(BROWSER_KEYCHAIN_VARIANTS).toHaveLength(7)
|
|
47
48
|
})
|
|
48
49
|
|
|
49
|
-
|
|
50
|
+
it('each variant has service and account properties', () => {
|
|
50
51
|
for (const variant of BROWSER_KEYCHAIN_VARIANTS) {
|
|
51
52
|
expect(variant.service).toBeString()
|
|
52
53
|
expect(variant.account).toBeString()
|
|
53
54
|
}
|
|
54
55
|
})
|
|
55
56
|
|
|
56
|
-
|
|
57
|
+
it('includes known safe storage services', () => {
|
|
57
58
|
const services = BROWSER_KEYCHAIN_VARIANTS.map((variant) => variant.service)
|
|
58
59
|
|
|
59
60
|
expect(services).toEqual(expect.arrayContaining(['Chrome Safe Storage', 'Microsoft Edge Safe Storage']))
|
|
@@ -61,7 +62,7 @@ describe('browsers', () => {
|
|
|
61
62
|
})
|
|
62
63
|
|
|
63
64
|
describe('getBrowserBasePath', () => {
|
|
64
|
-
|
|
65
|
+
it('returns darwin path with Library/Application Support prefix', () => {
|
|
65
66
|
// given
|
|
66
67
|
const chrome = CHROMIUM_BROWSERS.find((browser) => browser.name === 'Chrome')!
|
|
67
68
|
|
|
@@ -74,7 +75,7 @@ describe('browsers', () => {
|
|
|
74
75
|
expect(path).toEndWith(join('Google', 'Chrome'))
|
|
75
76
|
})
|
|
76
77
|
|
|
77
|
-
|
|
78
|
+
it('returns linux path with .config prefix', () => {
|
|
78
79
|
// given
|
|
79
80
|
const chrome = CHROMIUM_BROWSERS.find((browser) => browser.name === 'Chrome')!
|
|
80
81
|
|
|
@@ -86,7 +87,7 @@ describe('browsers', () => {
|
|
|
86
87
|
expect(path).toContain(join('.config', 'google-chrome'))
|
|
87
88
|
})
|
|
88
89
|
|
|
89
|
-
|
|
90
|
+
it('returns win32 path with LOCALAPPDATA prefix', () => {
|
|
90
91
|
// given
|
|
91
92
|
const localAppData = mkdtempSync(join(tmpdir(), 'browser-localappdata-'))
|
|
92
93
|
tempDirs.push(localAppData)
|
|
@@ -100,7 +101,7 @@ describe('browsers', () => {
|
|
|
100
101
|
expect(path).toBe(join(localAppData, 'Google', 'Chrome', 'User Data'))
|
|
101
102
|
})
|
|
102
103
|
|
|
103
|
-
|
|
104
|
+
it('returns null for unsupported platform', () => {
|
|
104
105
|
// given
|
|
105
106
|
const chrome = CHROMIUM_BROWSERS.find((browser) => browser.name === 'Chrome')!
|
|
106
107
|
|
|
@@ -111,7 +112,7 @@ describe('browsers', () => {
|
|
|
111
112
|
expect(path).toBeNull()
|
|
112
113
|
})
|
|
113
114
|
|
|
114
|
-
|
|
115
|
+
it('returns null when browser has empty path for platform', () => {
|
|
115
116
|
// given
|
|
116
117
|
const arc = CHROMIUM_BROWSERS.find((browser) => browser.name === 'Arc')!
|
|
117
118
|
|
|
@@ -124,7 +125,7 @@ describe('browsers', () => {
|
|
|
124
125
|
})
|
|
125
126
|
|
|
126
127
|
describe('discoverBrowserProfileDirs', () => {
|
|
127
|
-
|
|
128
|
+
it('always includes Default dir even when base does not exist', () => {
|
|
128
129
|
// given
|
|
129
130
|
const browserBase = join(tmpdir(), `missing-browser-base-${Date.now()}-${Math.random().toString(36).slice(2)}`)
|
|
130
131
|
|
|
@@ -135,7 +136,7 @@ describe('browsers', () => {
|
|
|
135
136
|
expect(dirs).toEqual([join(browserBase, 'Default')])
|
|
136
137
|
})
|
|
137
138
|
|
|
138
|
-
|
|
139
|
+
it('discovers Profile 1 and Profile 2 dirs when they exist', () => {
|
|
139
140
|
// given
|
|
140
141
|
const browserBase = mkdtempSync(join(tmpdir(), 'browser-profiles-'))
|
|
141
142
|
tempDirs.push(browserBase)
|
|
@@ -153,7 +154,7 @@ describe('browsers', () => {
|
|
|
153
154
|
])
|
|
154
155
|
})
|
|
155
156
|
|
|
156
|
-
|
|
157
|
+
it('ignores non-profile directories', () => {
|
|
157
158
|
// given
|
|
158
159
|
const browserBase = mkdtempSync(join(tmpdir(), 'browser-non-profile-'))
|
|
159
160
|
tempDirs.push(browserBase)
|
|
@@ -168,7 +169,7 @@ describe('browsers', () => {
|
|
|
168
169
|
expect(dirs).toEqual([join(browserBase, 'Default'), join(browserBase, 'Profile 1')])
|
|
169
170
|
})
|
|
170
171
|
|
|
171
|
-
|
|
172
|
+
it('ignores files that match profile pattern', () => {
|
|
172
173
|
// given
|
|
173
174
|
const browserBase = mkdtempSync(join(tmpdir(), 'browser-profile-files-'))
|
|
174
175
|
tempDirs.push(browserBase)
|
|
@@ -182,7 +183,7 @@ describe('browsers', () => {
|
|
|
182
183
|
expect(dirs).toEqual([join(browserBase, 'Default'), join(browserBase, 'Profile 2')])
|
|
183
184
|
})
|
|
184
185
|
|
|
185
|
-
|
|
186
|
+
it('returns only Default when base directory is empty', () => {
|
|
186
187
|
// given
|
|
187
188
|
const browserBase = mkdtempSync(join(tmpdir(), 'browser-empty-'))
|
|
188
189
|
tempDirs.push(browserBase)
|
|
@@ -195,8 +196,87 @@ describe('browsers', () => {
|
|
|
195
196
|
})
|
|
196
197
|
})
|
|
197
198
|
|
|
199
|
+
describe('getAgentBrowserProfileDirs', () => {
|
|
200
|
+
it('includes profile dirs from env and config files', () => {
|
|
201
|
+
// given
|
|
202
|
+
const homeDir = mkdtempSync(join(tmpdir(), 'agent-browser-home-'))
|
|
203
|
+
const projectDir = mkdtempSync(join(tmpdir(), 'agent-browser-project-'))
|
|
204
|
+
const customConfigDir = mkdtempSync(join(tmpdir(), 'agent-browser-custom-'))
|
|
205
|
+
tempDirs.push(homeDir, projectDir, customConfigDir)
|
|
206
|
+
|
|
207
|
+
mkdirSync(join(homeDir, '.agent-browser'))
|
|
208
|
+
writeFileSync(join(homeDir, '.agent-browser', 'config.json'), JSON.stringify({ profile: './global-profile' }))
|
|
209
|
+
writeFileSync(join(projectDir, 'agent-browser.json'), JSON.stringify({ profile: './project-profile' }))
|
|
210
|
+
const customConfigPath = join(customConfigDir, 'custom-agent-browser.json')
|
|
211
|
+
writeFileSync(customConfigPath, JSON.stringify({ profile: './custom-profile' }))
|
|
212
|
+
|
|
213
|
+
// when
|
|
214
|
+
const dirs = getAgentBrowserProfileDirs({
|
|
215
|
+
cwd: projectDir,
|
|
216
|
+
env: {
|
|
217
|
+
AGENT_BROWSER_CONFIG: customConfigPath,
|
|
218
|
+
AGENT_BROWSER_PROFILE: join(projectDir, 'env-profile'),
|
|
219
|
+
},
|
|
220
|
+
homeDir,
|
|
221
|
+
customProfileDirs: ['./cli-profile', join(projectDir, 'second-cli-profile')],
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
// then
|
|
225
|
+
expect(dirs).toEqual([
|
|
226
|
+
join(projectDir, 'cli-profile'),
|
|
227
|
+
join(projectDir, 'cli-profile', 'Default'),
|
|
228
|
+
join(projectDir, 'second-cli-profile'),
|
|
229
|
+
join(projectDir, 'second-cli-profile', 'Default'),
|
|
230
|
+
join(projectDir, 'env-profile'),
|
|
231
|
+
join(projectDir, 'env-profile', 'Default'),
|
|
232
|
+
join(homeDir, '.agent-browser', 'global-profile'),
|
|
233
|
+
join(homeDir, '.agent-browser', 'global-profile', 'Default'),
|
|
234
|
+
join(projectDir, 'project-profile'),
|
|
235
|
+
join(projectDir, 'project-profile', 'Default'),
|
|
236
|
+
join(customConfigDir, 'custom-profile'),
|
|
237
|
+
join(customConfigDir, 'custom-profile', 'Default'),
|
|
238
|
+
])
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
it('expands existing agent-browser profile bases with numbered Chromium profiles', () => {
|
|
242
|
+
// given
|
|
243
|
+
const homeDir = mkdtempSync(join(tmpdir(), 'agent-browser-expand-home-'))
|
|
244
|
+
const projectDir = mkdtempSync(join(tmpdir(), 'agent-browser-expand-project-'))
|
|
245
|
+
const profileBase = join(projectDir, 'browser-data')
|
|
246
|
+
tempDirs.push(homeDir, projectDir)
|
|
247
|
+
mkdirSync(join(profileBase, 'Profile 1'), { recursive: true })
|
|
248
|
+
mkdirSync(join(profileBase, 'Profile 2'))
|
|
249
|
+
writeFileSync(join(projectDir, 'agent-browser.json'), JSON.stringify({ profile: './browser-data' }))
|
|
250
|
+
|
|
251
|
+
// when
|
|
252
|
+
const dirs = getAgentBrowserProfileDirs({ cwd: projectDir, env: {}, homeDir })
|
|
253
|
+
|
|
254
|
+
// then
|
|
255
|
+
expect(dirs).toEqual([
|
|
256
|
+
profileBase,
|
|
257
|
+
join(profileBase, 'Default'),
|
|
258
|
+
join(profileBase, 'Profile 1'),
|
|
259
|
+
join(profileBase, 'Profile 2'),
|
|
260
|
+
])
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
it('ignores malformed agent-browser configs', () => {
|
|
264
|
+
// given
|
|
265
|
+
const homeDir = mkdtempSync(join(tmpdir(), 'agent-browser-malformed-home-'))
|
|
266
|
+
const projectDir = mkdtempSync(join(tmpdir(), 'agent-browser-malformed-project-'))
|
|
267
|
+
tempDirs.push(homeDir, projectDir)
|
|
268
|
+
writeFileSync(join(projectDir, 'agent-browser.json'), '{')
|
|
269
|
+
|
|
270
|
+
// when
|
|
271
|
+
const dirs = getAgentBrowserProfileDirs({ cwd: projectDir, env: {}, homeDir })
|
|
272
|
+
|
|
273
|
+
// then
|
|
274
|
+
expect(dirs).toEqual([])
|
|
275
|
+
})
|
|
276
|
+
})
|
|
277
|
+
|
|
198
278
|
describe('findLocalStatePath', () => {
|
|
199
|
-
|
|
279
|
+
it('returns null when no Local State exists at any level', () => {
|
|
200
280
|
// given
|
|
201
281
|
const rootDir = mkdtempSync(join(tmpdir(), 'browser-local-state-missing-'))
|
|
202
282
|
tempDirs.push(rootDir)
|
|
@@ -210,7 +290,7 @@ describe('browsers', () => {
|
|
|
210
290
|
expect(path).toBeNull()
|
|
211
291
|
})
|
|
212
292
|
|
|
213
|
-
|
|
293
|
+
it('finds Local State 2 levels up from cookie path', () => {
|
|
214
294
|
// given
|
|
215
295
|
const rootDir = mkdtempSync(join(tmpdir(), 'browser-local-state-two-'))
|
|
216
296
|
tempDirs.push(rootDir)
|
|
@@ -226,7 +306,7 @@ describe('browsers', () => {
|
|
|
226
306
|
expect(path).toBe(join(profileDir, 'Local State'))
|
|
227
307
|
})
|
|
228
308
|
|
|
229
|
-
|
|
309
|
+
it('finds Local State 3 levels up from cookie path', () => {
|
|
230
310
|
// given
|
|
231
311
|
const rootDir = mkdtempSync(join(tmpdir(), 'browser-local-state-three-'))
|
|
232
312
|
tempDirs.push(rootDir)
|
|
@@ -242,7 +322,7 @@ describe('browsers', () => {
|
|
|
242
322
|
expect(path).toBe(join(browserDir, 'Local State'))
|
|
243
323
|
})
|
|
244
324
|
|
|
245
|
-
|
|
325
|
+
it('returns null for path with too few segments', () => {
|
|
246
326
|
// given
|
|
247
327
|
const cookiePath = 'Cookies'
|
|
248
328
|
|
|
@@ -253,7 +333,7 @@ describe('browsers', () => {
|
|
|
253
333
|
expect(path).toBeNull()
|
|
254
334
|
})
|
|
255
335
|
|
|
256
|
-
|
|
336
|
+
it('finds the first match when multiple levels could match', () => {
|
|
257
337
|
// given
|
|
258
338
|
const rootDir = mkdtempSync(join(tmpdir(), 'browser-local-state-first-'))
|
|
259
339
|
tempDirs.push(rootDir)
|