agent-messenger 2.10.1 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/.env.template +4 -1
- package/README.md +77 -27
- package/bun.lock +26 -0
- package/dist/package.json +14 -1
- package/dist/src/platforms/channeltalk/commands/auth.d.ts +2 -1
- package/dist/src/platforms/channeltalk/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/commands/auth.js +5 -3
- package/dist/src/platforms/channeltalk/commands/auth.js.map +1 -1
- package/dist/src/platforms/channeltalk/token-extractor.d.ts +2 -1
- package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/token-extractor.js +22 -6
- package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/cli.js +11 -1
- package/dist/src/platforms/channeltalkbot/cli.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/auth.js +1 -5
- package/dist/src/platforms/channeltalkbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/bot.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/bot.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/bot.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/chat.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/chat.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/chat.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/group.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/group.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/group.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/manager.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/manager.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/manager.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/message.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/message.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/whoami.js +1 -6
- package/dist/src/platforms/channeltalkbot/commands/whoami.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/credential-manager.d.ts +5 -0
- package/dist/src/platforms/channeltalkbot/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/credential-manager.js +34 -4
- package/dist/src/platforms/channeltalkbot/credential-manager.js.map +1 -1
- package/dist/src/platforms/discord/commands/auth.d.ts +1 -0
- package/dist/src/platforms/discord/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/auth.js +3 -1
- package/dist/src/platforms/discord/commands/auth.js.map +1 -1
- package/dist/src/platforms/discord/listener.d.ts +2 -0
- package/dist/src/platforms/discord/listener.d.ts.map +1 -1
- package/dist/src/platforms/discord/listener.js +51 -21
- package/dist/src/platforms/discord/listener.js.map +1 -1
- package/dist/src/platforms/discord/token-extractor.d.ts +2 -1
- package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/discord/token-extractor.js +21 -6
- package/dist/src/platforms/discord/token-extractor.js.map +1 -1
- package/dist/src/platforms/discordbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/cli.js +12 -1
- package/dist/src/platforms/discordbot/cli.js.map +1 -1
- package/dist/src/platforms/discordbot/client.d.ts +3 -0
- package/dist/src/platforms/discordbot/client.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/client.js +3 -0
- package/dist/src/platforms/discordbot/client.js.map +1 -1
- package/dist/src/platforms/discordbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/commands/auth.js +1 -5
- package/dist/src/platforms/discordbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/discordbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/commands/message.js +1 -6
- package/dist/src/platforms/discordbot/commands/message.js.map +1 -1
- package/dist/src/platforms/discordbot/commands/server.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/commands/server.js +1 -4
- package/dist/src/platforms/discordbot/commands/server.js.map +1 -1
- package/dist/src/platforms/discordbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/commands/whoami.js +1 -6
- package/dist/src/platforms/discordbot/commands/whoami.js.map +1 -1
- package/dist/src/platforms/discordbot/index.d.ts +3 -1
- package/dist/src/platforms/discordbot/index.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/index.js +2 -1
- package/dist/src/platforms/discordbot/index.js.map +1 -1
- package/dist/src/platforms/discordbot/listener.d.ts +43 -0
- package/dist/src/platforms/discordbot/listener.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/listener.js +292 -0
- package/dist/src/platforms/discordbot/listener.js.map +1 -0
- package/dist/src/platforms/discordbot/types.d.ts +161 -0
- package/dist/src/platforms/discordbot/types.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/types.js +34 -0
- package/dist/src/platforms/discordbot/types.js.map +1 -1
- package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/instagram/commands/auth.js +3 -1
- package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
- package/dist/src/platforms/instagram/token-extractor.d.ts +2 -1
- package/dist/src/platforms/instagram/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/instagram/token-extractor.js +11 -2
- package/dist/src/platforms/instagram/token-extractor.js.map +1 -1
- package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/auth.js +4 -2
- package/dist/src/platforms/slack/commands/auth.js.map +1 -1
- package/dist/src/platforms/slack/token-extractor.d.ts +4 -1
- package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/slack/token-extractor.js +64 -15
- package/dist/src/platforms/slack/token-extractor.js.map +1 -1
- package/dist/src/platforms/slackbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/cli.js +15 -3
- package/dist/src/platforms/slackbot/cli.js.map +1 -1
- package/dist/src/platforms/slackbot/client.d.ts +22 -1
- package/dist/src/platforms/slackbot/client.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/client.js +104 -1
- package/dist/src/platforms/slackbot/client.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/auth.js +1 -5
- package/dist/src/platforms/slackbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/file.d.ts +3 -0
- package/dist/src/platforms/slackbot/commands/file.d.ts.map +1 -0
- package/dist/src/platforms/slackbot/commands/file.js +164 -0
- package/dist/src/platforms/slackbot/commands/file.js.map +1 -0
- package/dist/src/platforms/slackbot/commands/index.d.ts +1 -0
- package/dist/src/platforms/slackbot/commands/index.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/index.js +1 -0
- package/dist/src/platforms/slackbot/commands/index.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/message.js +19 -0
- package/dist/src/platforms/slackbot/commands/message.js.map +1 -1
- package/dist/src/platforms/slackbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/commands/whoami.js +1 -6
- package/dist/src/platforms/slackbot/commands/whoami.js.map +1 -1
- package/dist/src/platforms/slackbot/credential-manager.d.ts +1 -0
- package/dist/src/platforms/slackbot/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/credential-manager.js +30 -2
- package/dist/src/platforms/slackbot/credential-manager.js.map +1 -1
- package/dist/src/platforms/slackbot/index.d.ts +4 -1
- package/dist/src/platforms/slackbot/index.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/index.js +1 -0
- package/dist/src/platforms/slackbot/index.js.map +1 -1
- package/dist/src/platforms/slackbot/listener.d.ts +44 -0
- package/dist/src/platforms/slackbot/listener.d.ts.map +1 -0
- package/dist/src/platforms/slackbot/listener.js +313 -0
- package/dist/src/platforms/slackbot/listener.js.map +1 -0
- package/dist/src/platforms/slackbot/types.d.ts +196 -1
- package/dist/src/platforms/slackbot/types.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/types.js +4 -1
- package/dist/src/platforms/slackbot/types.js.map +1 -1
- package/dist/src/platforms/teams/commands/auth.d.ts +1 -0
- package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/auth.js +37 -6
- package/dist/src/platforms/teams/commands/auth.js.map +1 -1
- package/dist/src/platforms/teams/ensure-auth.js +31 -9
- package/dist/src/platforms/teams/ensure-auth.js.map +1 -1
- package/dist/src/platforms/teams/token-extractor.d.ts +4 -1
- package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/teams/token-extractor.js +80 -31
- package/dist/src/platforms/teams/token-extractor.js.map +1 -1
- package/dist/src/platforms/webex/commands/auth.d.ts +1 -0
- package/dist/src/platforms/webex/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/webex/commands/auth.js +3 -1
- package/dist/src/platforms/webex/commands/auth.js.map +1 -1
- package/dist/src/platforms/webex/token-extractor.d.ts +3 -1
- package/dist/src/platforms/webex/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/webex/token-extractor.js +16 -2
- package/dist/src/platforms/webex/token-extractor.js.map +1 -1
- package/dist/src/platforms/wechatbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/cli.js +11 -1
- package/dist/src/platforms/wechatbot/cli.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/auth.js +1 -5
- package/dist/src/platforms/wechatbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/message.js +1 -6
- package/dist/src/platforms/wechatbot/commands/message.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/template.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/template.js +1 -6
- package/dist/src/platforms/wechatbot/commands/template.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/user.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/user.js +1 -6
- package/dist/src/platforms/wechatbot/commands/user.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/whoami.js +1 -6
- package/dist/src/platforms/wechatbot/commands/whoami.js.map +1 -1
- package/dist/src/platforms/whatsappbot/cli.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/cli.js +11 -1
- package/dist/src/platforms/whatsappbot/cli.js.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/auth.js +1 -5
- package/dist/src/platforms/whatsappbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/message.js +1 -6
- package/dist/src/platforms/whatsappbot/commands/message.js.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/template.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/template.js +1 -6
- package/dist/src/platforms/whatsappbot/commands/template.js.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/whoami.js +1 -6
- package/dist/src/platforms/whatsappbot/commands/whoami.js.map +1 -1
- package/dist/src/shared/chromium/browsers.d.ts +8 -0
- package/dist/src/shared/chromium/browsers.d.ts.map +1 -1
- package/dist/src/shared/chromium/browsers.js +58 -3
- package/dist/src/shared/chromium/browsers.js.map +1 -1
- package/dist/src/shared/chromium/cli-options.d.ts +5 -0
- package/dist/src/shared/chromium/cli-options.d.ts.map +1 -0
- package/dist/src/shared/chromium/cli-options.js +8 -0
- package/dist/src/shared/chromium/cli-options.js.map +1 -0
- package/dist/src/shared/chromium/decryptor.d.ts +6 -0
- package/dist/src/shared/chromium/decryptor.d.ts.map +1 -1
- package/dist/src/shared/chromium/decryptor.js +26 -6
- package/dist/src/shared/chromium/decryptor.js.map +1 -1
- package/dist/src/shared/chromium/index.d.ts +3 -1
- package/dist/src/shared/chromium/index.d.ts.map +1 -1
- package/dist/src/shared/chromium/index.js +2 -1
- package/dist/src/shared/chromium/index.js.map +1 -1
- package/dist/src/shared/utils/cli-output.d.ts +7 -0
- package/dist/src/shared/utils/cli-output.d.ts.map +1 -0
- package/dist/src/shared/utils/cli-output.js +7 -0
- package/dist/src/shared/utils/cli-output.js.map +1 -0
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +73 -20
- package/dist/src/tui/app.js.map +1 -1
- package/docs/content/docs/cli/channeltalk.mdx +4 -0
- package/docs/content/docs/cli/discord.mdx +5 -0
- package/docs/content/docs/cli/instagram.mdx +3 -0
- package/docs/content/docs/cli/slack.mdx +5 -0
- package/docs/content/docs/cli/slackbot.mdx +60 -22
- package/docs/content/docs/cli/teams.mdx +5 -0
- package/docs/content/docs/cli/webex.mdx +3 -0
- package/docs/content/docs/sdk/channeltalkbot.mdx +38 -1
- package/docs/content/docs/sdk/discordbot.mdx +501 -0
- package/docs/content/docs/sdk/meta.json +2 -0
- package/docs/content/docs/sdk/slackbot.mdx +576 -0
- package/e2e/README.md +1 -1
- package/e2e/channeltalk.e2e.test.ts +13 -13
- package/e2e/channeltalkbot.e2e.test.ts +13 -13
- package/e2e/config.ts +9 -4
- package/e2e/discord.e2e.test.ts +24 -24
- package/e2e/discordbot.e2e.test.ts +16 -16
- package/e2e/instagram.e2e.test.ts +10 -10
- package/e2e/kakaotalk.e2e.test.ts +7 -7
- package/e2e/line.e2e.test.ts +8 -8
- package/e2e/slack.e2e.test.ts +34 -34
- package/e2e/slackbot.e2e.test.ts +14 -14
- package/e2e/teams.e2e.test.ts +23 -23
- package/e2e/telegram.e2e.test.ts +8 -8
- package/e2e/webex.e2e.test.ts +14 -14
- package/e2e/whatsapp.e2e.test.ts +8 -8
- package/e2e/whatsappbot.e2e.test.ts +6 -6
- package/examples/discordbot-listen.ts +65 -0
- package/examples/slackbot-listen.ts +65 -0
- package/package.json +14 -1
- package/skills/agent-channeltalk/SKILL.md +5 -1
- package/skills/agent-channeltalk/references/authentication.md +5 -1
- package/skills/agent-channeltalkbot/SKILL.md +17 -3
- package/skills/agent-channeltalkbot/references/authentication.md +7 -5
- package/skills/agent-discord/SKILL.md +5 -1
- package/skills/agent-discord/references/authentication.md +7 -1
- package/skills/agent-discordbot/SKILL.md +13 -2
- package/skills/agent-discordbot/references/common-patterns.md +1 -1
- package/skills/agent-instagram/SKILL.md +7 -1
- package/skills/agent-instagram/references/authentication.md +6 -0
- package/skills/agent-kakaotalk/SKILL.md +1 -1
- package/skills/agent-line/SKILL.md +1 -1
- package/skills/agent-slack/SKILL.md +5 -1
- package/skills/agent-slack/references/authentication.md +7 -1
- package/skills/agent-slackbot/SKILL.md +56 -4
- package/skills/agent-slackbot/references/authentication.md +4 -0
- package/skills/agent-teams/SKILL.md +5 -1
- package/skills/agent-teams/references/authentication.md +7 -1
- package/skills/agent-telegram/SKILL.md +1 -1
- package/skills/agent-webex/SKILL.md +7 -1
- package/skills/agent-webex/references/authentication.md +6 -0
- package/skills/agent-wechatbot/SKILL.md +16 -1
- package/skills/agent-wechatbot/references/authentication.md +219 -0
- package/skills/agent-wechatbot/references/common-patterns.md +358 -0
- package/skills/agent-wechatbot/templates/account-summary.sh +122 -0
- package/skills/agent-wechatbot/templates/post-message.sh +122 -0
- package/skills/agent-wechatbot/templates/send-template.sh +152 -0
- package/skills/agent-whatsapp/SKILL.md +1 -1
- package/skills/agent-whatsappbot/SKILL.md +30 -1
- package/src/platforms/channeltalk/client.test.ts +26 -26
- package/src/platforms/channeltalk/commands/auth.test.ts +31 -19
- package/src/platforms/channeltalk/commands/auth.ts +15 -5
- package/src/platforms/channeltalk/commands/bot.test.ts +2 -2
- package/src/platforms/channeltalk/commands/chat.test.ts +3 -3
- package/src/platforms/channeltalk/commands/group.test.ts +4 -4
- package/src/platforms/channeltalk/commands/manager.test.ts +2 -2
- package/src/platforms/channeltalk/commands/message.test.ts +17 -17
- package/src/platforms/channeltalk/commands/snapshot.test.ts +7 -7
- package/src/platforms/channeltalk/commands/whoami.test.ts +3 -3
- package/src/platforms/channeltalk/credential-manager.test.ts +18 -18
- package/src/platforms/channeltalk/ensure-auth.test.ts +5 -5
- package/src/platforms/channeltalk/index.test.ts +23 -23
- package/src/platforms/channeltalk/token-extractor.test.ts +21 -21
- package/src/platforms/channeltalk/token-extractor.ts +24 -5
- package/src/platforms/channeltalk/types.test.ts +12 -12
- package/src/platforms/channeltalkbot/cli.ts +9 -0
- package/src/platforms/channeltalkbot/client.test.ts +14 -14
- package/src/platforms/channeltalkbot/commands/auth.test.ts +16 -16
- package/src/platforms/channeltalkbot/commands/auth.ts +1 -5
- package/src/platforms/channeltalkbot/commands/bot.test.ts +6 -6
- package/src/platforms/channeltalkbot/commands/bot.ts +1 -6
- package/src/platforms/channeltalkbot/commands/chat.test.ts +9 -9
- package/src/platforms/channeltalkbot/commands/chat.ts +1 -6
- package/src/platforms/channeltalkbot/commands/group.test.ts +6 -6
- package/src/platforms/channeltalkbot/commands/group.ts +1 -6
- package/src/platforms/channeltalkbot/commands/manager.test.ts +3 -3
- package/src/platforms/channeltalkbot/commands/manager.ts +1 -6
- package/src/platforms/channeltalkbot/commands/message.test.ts +10 -10
- package/src/platforms/channeltalkbot/commands/message.ts +1 -6
- package/src/platforms/channeltalkbot/commands/snapshot.test.ts +7 -7
- package/src/platforms/channeltalkbot/commands/whoami.test.ts +6 -4
- package/src/platforms/channeltalkbot/commands/whoami.ts +1 -6
- package/src/platforms/channeltalkbot/credential-manager.test.ts +123 -29
- package/src/platforms/channeltalkbot/credential-manager.ts +37 -4
- package/src/platforms/channeltalkbot/index.test.ts +15 -15
- package/src/platforms/discord/client.test.ts +28 -28
- package/src/platforms/discord/commands/auth.test.ts +7 -7
- package/src/platforms/discord/commands/auth.ts +13 -2
- package/src/platforms/discord/commands/channel.test.ts +7 -7
- package/src/platforms/discord/commands/dm.test.ts +4 -4
- package/src/platforms/discord/commands/file.test.ts +4 -4
- package/src/platforms/discord/commands/friend.test.ts +6 -6
- package/src/platforms/discord/commands/member.test.ts +5 -5
- package/src/platforms/discord/commands/mention.test.ts +5 -5
- package/src/platforms/discord/commands/message.test.ts +9 -9
- package/src/platforms/discord/commands/note.test.ts +6 -6
- package/src/platforms/discord/commands/profile.test.ts +4 -4
- package/src/platforms/discord/commands/reaction.test.ts +5 -5
- package/src/platforms/discord/commands/server.test.ts +7 -7
- package/src/platforms/discord/commands/snapshot.test.ts +6 -6
- package/src/platforms/discord/commands/thread.test.ts +6 -6
- package/src/platforms/discord/commands/user.test.ts +5 -5
- package/src/platforms/discord/commands/whoami.test.ts +6 -6
- package/src/platforms/discord/credential-manager.test.ts +16 -16
- package/src/platforms/discord/ensure-auth.test.ts +8 -8
- package/src/platforms/discord/index.test.ts +17 -17
- package/src/platforms/discord/listener.test.ts +92 -34
- package/src/platforms/discord/listener.ts +43 -19
- package/src/platforms/discord/token-extractor.test.ts +53 -53
- package/src/platforms/discord/token-extractor.ts +30 -6
- package/src/platforms/discord/types.test.ts +26 -26
- package/src/platforms/discordbot/cli.ts +10 -0
- package/src/platforms/discordbot/client.test.ts +31 -31
- package/src/platforms/discordbot/client.ts +4 -0
- package/src/platforms/discordbot/commands/auth.test.ts +18 -18
- package/src/platforms/discordbot/commands/auth.ts +1 -5
- package/src/platforms/discordbot/commands/channel.test.ts +11 -11
- package/src/platforms/discordbot/commands/file.test.ts +7 -7
- package/src/platforms/discordbot/commands/message.test.ts +25 -25
- package/src/platforms/discordbot/commands/message.ts +1 -6
- package/src/platforms/discordbot/commands/reaction.test.ts +6 -6
- package/src/platforms/discordbot/commands/server.test.ts +12 -12
- package/src/platforms/discordbot/commands/server.ts +1 -5
- package/src/platforms/discordbot/commands/snapshot.test.ts +13 -13
- package/src/platforms/discordbot/commands/thread.test.ts +10 -10
- package/src/platforms/discordbot/commands/user.test.ts +9 -9
- package/src/platforms/discordbot/commands/whoami.test.ts +4 -4
- package/src/platforms/discordbot/commands/whoami.ts +1 -6
- package/src/platforms/discordbot/credential-manager.test.ts +28 -28
- package/src/platforms/discordbot/index.test.ts +82 -0
- package/src/platforms/discordbot/index.ts +27 -9
- package/src/platforms/discordbot/listener.test.ts +1002 -0
- package/src/platforms/discordbot/listener.ts +321 -0
- package/src/platforms/discordbot/types.ts +163 -0
- package/src/platforms/instagram/client.test.ts +18 -18
- package/src/platforms/instagram/commands/auth.test.ts +11 -11
- package/src/platforms/instagram/commands/auth.ts +9 -1
- package/src/platforms/instagram/commands/chat.test.ts +6 -6
- package/src/platforms/instagram/commands/message.test.ts +11 -11
- package/src/platforms/instagram/commands/shared.test.ts +12 -12
- package/src/platforms/instagram/commands/whoami.test.ts +3 -3
- package/src/platforms/instagram/credential-manager.test.ts +21 -21
- package/src/platforms/instagram/ensure-auth.test.ts +4 -4
- package/src/platforms/instagram/index.test.ts +9 -9
- package/src/platforms/instagram/listener.test.ts +8 -8
- package/src/platforms/instagram/token-extractor.test.ts +35 -35
- package/src/platforms/instagram/token-extractor.ts +13 -1
- package/src/platforms/kakaotalk/client.test.ts +33 -33
- package/src/platforms/kakaotalk/commands/auth.test.ts +11 -11
- package/src/platforms/kakaotalk/commands/chat.test.ts +6 -6
- package/src/platforms/kakaotalk/commands/message.test.ts +7 -7
- package/src/platforms/kakaotalk/commands/whoami.test.ts +5 -5
- package/src/platforms/kakaotalk/credential-manager.test.ts +15 -15
- package/src/platforms/kakaotalk/index.test.ts +15 -15
- package/src/platforms/kakaotalk/listener.test.ts +17 -17
- package/src/platforms/line/client.test.ts +17 -17
- package/src/platforms/line/commands/auth.test.ts +8 -8
- package/src/platforms/line/commands/chat.test.ts +7 -7
- package/src/platforms/line/commands/friend.test.ts +6 -6
- package/src/platforms/line/commands/message.test.ts +7 -7
- package/src/platforms/line/commands/whoami.test.ts +6 -6
- package/src/platforms/line/credential-manager.test.ts +17 -17
- package/src/platforms/line/index.test.ts +10 -10
- package/src/platforms/line/listener.test.ts +15 -15
- package/src/platforms/line/types.test.ts +14 -14
- package/src/platforms/slack/cli.test.ts +8 -8
- package/src/platforms/slack/client.test.ts +151 -151
- package/src/platforms/slack/commands/activity.test.ts +13 -13
- package/src/platforms/slack/commands/auth.test.ts +34 -34
- package/src/platforms/slack/commands/auth.ts +11 -2
- package/src/platforms/slack/commands/bookmark.test.ts +9 -9
- package/src/platforms/slack/commands/channel.test.ts +17 -17
- package/src/platforms/slack/commands/drafts.test.ts +7 -7
- package/src/platforms/slack/commands/emoji.test.ts +3 -3
- package/src/platforms/slack/commands/file.test.ts +12 -12
- package/src/platforms/slack/commands/message.test.ts +19 -19
- package/src/platforms/slack/commands/pin.test.ts +7 -7
- package/src/platforms/slack/commands/reaction.test.ts +10 -10
- package/src/platforms/slack/commands/reminder.test.ts +9 -9
- package/src/platforms/slack/commands/saved.test.ts +7 -7
- package/src/platforms/slack/commands/sections.test.ts +5 -5
- package/src/platforms/slack/commands/snapshot.test.ts +13 -13
- package/src/platforms/slack/commands/unread.test.ts +6 -6
- package/src/platforms/slack/commands/user.test.ts +10 -10
- package/src/platforms/slack/commands/usergroup.test.ts +15 -15
- package/src/platforms/slack/commands/whoami.test.ts +6 -6
- package/src/platforms/slack/commands/workspace.test.ts +26 -26
- package/src/platforms/slack/credential-manager.test.ts +14 -14
- package/src/platforms/slack/ensure-auth.test.ts +21 -21
- package/src/platforms/slack/index.test.ts +12 -12
- package/src/platforms/slack/listener.test.ts +17 -17
- package/src/platforms/slack/token-extractor-node.test.ts +2 -2
- package/src/platforms/slack/token-extractor.test.ts +133 -37
- package/src/platforms/slack/token-extractor.ts +76 -13
- package/src/platforms/slack/types.test.ts +21 -21
- package/src/platforms/slackbot/cli.ts +13 -1
- package/src/platforms/slackbot/client.test.ts +296 -22
- package/src/platforms/slackbot/client.ts +130 -2
- package/src/platforms/slackbot/commands/auth.test.ts +14 -14
- package/src/platforms/slackbot/commands/auth.ts +1 -5
- package/src/platforms/slackbot/commands/channel.test.ts +7 -7
- package/src/platforms/slackbot/commands/file.test.ts +201 -0
- package/src/platforms/slackbot/commands/file.ts +212 -0
- package/src/platforms/slackbot/commands/index.ts +1 -0
- package/src/platforms/slackbot/commands/message.test.ts +13 -13
- package/src/platforms/slackbot/commands/message.ts +22 -0
- package/src/platforms/slackbot/commands/reaction.test.ts +6 -6
- package/src/platforms/slackbot/commands/user.test.ts +7 -7
- package/src/platforms/slackbot/commands/whoami.test.ts +4 -4
- package/src/platforms/slackbot/commands/whoami.ts +1 -6
- package/src/platforms/slackbot/credential-manager.test.ts +83 -23
- package/src/platforms/slackbot/credential-manager.ts +32 -2
- package/src/platforms/slackbot/index.test.ts +59 -0
- package/src/platforms/slackbot/index.ts +31 -7
- package/src/platforms/slackbot/listener.test.ts +1012 -0
- package/src/platforms/slackbot/listener.ts +362 -0
- package/src/platforms/slackbot/types.test.ts +7 -7
- package/src/platforms/slackbot/types.ts +224 -1
- package/src/platforms/teams/client.test.ts +30 -30
- package/src/platforms/teams/commands/auth.test.ts +9 -9
- package/src/platforms/teams/commands/auth.ts +66 -7
- package/src/platforms/teams/commands/channel.test.ts +7 -7
- package/src/platforms/teams/commands/file.test.ts +4 -4
- package/src/platforms/teams/commands/message.test.ts +5 -5
- package/src/platforms/teams/commands/reaction.test.ts +4 -4
- package/src/platforms/teams/commands/snapshot.test.ts +7 -7
- package/src/platforms/teams/commands/team.test.ts +8 -8
- package/src/platforms/teams/commands/user.test.ts +4 -4
- package/src/platforms/teams/commands/whoami.test.ts +6 -6
- package/src/platforms/teams/credential-manager.test.ts +17 -17
- package/src/platforms/teams/ensure-auth.test.ts +69 -18
- package/src/platforms/teams/ensure-auth.ts +39 -11
- package/src/platforms/teams/index.test.ts +15 -15
- package/src/platforms/teams/token-extractor.test.ts +251 -69
- package/src/platforms/teams/token-extractor.ts +94 -31
- package/src/platforms/teams/types.test.ts +26 -26
- package/src/platforms/telegram/app-config.test.ts +4 -4
- package/src/platforms/telegram/chat-utils.test.ts +12 -12
- package/src/platforms/telegram/client.test.ts +4 -4
- package/src/platforms/telegram/commands/auth.test.ts +16 -16
- package/src/platforms/telegram/commands/chat.test.ts +9 -9
- package/src/platforms/telegram/commands/message.test.ts +6 -6
- package/src/platforms/telegram/commands/shared.test.ts +3 -3
- package/src/platforms/telegram/commands/whoami.test.ts +3 -3
- package/src/platforms/telegram/credential-manager.test.ts +10 -10
- package/src/platforms/telegram/types.test.ts +6 -6
- package/src/platforms/webex/app-config.test.ts +8 -8
- package/src/platforms/webex/cli.test.ts +5 -5
- package/src/platforms/webex/client.test.ts +65 -65
- package/src/platforms/webex/commands/auth.test.ts +18 -18
- package/src/platforms/webex/commands/auth.ts +13 -2
- package/src/platforms/webex/commands/member.test.ts +5 -5
- package/src/platforms/webex/commands/message.test.ts +12 -12
- package/src/platforms/webex/commands/snapshot.test.ts +5 -5
- package/src/platforms/webex/commands/space.test.ts +10 -10
- package/src/platforms/webex/commands/whoami.test.ts +6 -6
- package/src/platforms/webex/credential-manager.test.ts +22 -22
- package/src/platforms/webex/encryption.test.ts +4 -4
- package/src/platforms/webex/ensure-auth.test.ts +5 -5
- package/src/platforms/webex/index.test.ts +5 -5
- package/src/platforms/webex/markdown-to-html.test.ts +33 -33
- package/src/platforms/webex/token-extractor.test.ts +23 -23
- package/src/platforms/webex/token-extractor.ts +25 -3
- package/src/platforms/webex/types.test.ts +27 -27
- package/src/platforms/wechatbot/cli.ts +9 -0
- package/src/platforms/wechatbot/client.test.ts +27 -27
- package/src/platforms/wechatbot/commands/auth.test.ts +15 -15
- package/src/platforms/wechatbot/commands/auth.ts +1 -5
- package/src/platforms/wechatbot/commands/message.test.ts +8 -8
- package/src/platforms/wechatbot/commands/message.ts +1 -6
- package/src/platforms/wechatbot/commands/template.test.ts +9 -9
- package/src/platforms/wechatbot/commands/template.ts +1 -6
- package/src/platforms/wechatbot/commands/user.test.ts +7 -7
- package/src/platforms/wechatbot/commands/user.ts +1 -6
- package/src/platforms/wechatbot/commands/whoami.test.ts +5 -5
- package/src/platforms/wechatbot/commands/whoami.ts +1 -6
- package/src/platforms/wechatbot/credential-manager.test.ts +18 -18
- package/src/platforms/wechatbot/index.test.ts +10 -10
- package/src/platforms/wechatbot/types.test.ts +25 -25
- package/src/platforms/whatsapp/commands/auth.test.ts +13 -13
- package/src/platforms/whatsapp/commands/chat.test.ts +8 -8
- package/src/platforms/whatsapp/commands/message.test.ts +10 -10
- package/src/platforms/whatsapp/commands/whoami.test.ts +3 -3
- package/src/platforms/whatsapp/credential-manager.test.ts +23 -23
- package/src/platforms/whatsapp/ensure-auth.test.ts +4 -4
- package/src/platforms/whatsapp/index.test.ts +8 -8
- package/src/platforms/whatsapp/types.test.ts +42 -42
- package/src/platforms/whatsappbot/cli.ts +9 -0
- package/src/platforms/whatsappbot/client.test.ts +27 -27
- package/src/platforms/whatsappbot/commands/auth.test.ts +14 -14
- package/src/platforms/whatsappbot/commands/auth.ts +1 -5
- package/src/platforms/whatsappbot/commands/message.test.ts +16 -16
- package/src/platforms/whatsappbot/commands/message.ts +1 -6
- package/src/platforms/whatsappbot/commands/template.test.ts +9 -9
- package/src/platforms/whatsappbot/commands/template.ts +1 -6
- package/src/platforms/whatsappbot/commands/whoami.test.ts +5 -5
- package/src/platforms/whatsappbot/commands/whoami.ts +1 -6
- package/src/platforms/whatsappbot/credential-manager.test.ts +18 -18
- package/src/platforms/whatsappbot/index.test.ts +7 -7
- package/src/platforms/whatsappbot/types.test.ts +18 -18
- package/src/shared/chromium/browsers.test.ts +102 -22
- package/src/shared/chromium/browsers.ts +72 -3
- package/src/shared/chromium/cli-options.test.ts +22 -0
- package/src/shared/chromium/cli-options.ts +12 -0
- package/src/shared/chromium/cookie-reader.test.ts +13 -13
- package/src/shared/chromium/decryptor.test.ts +97 -32
- package/src/shared/chromium/decryptor.ts +27 -6
- package/src/shared/chromium/index.ts +3 -0
- package/src/shared/utils/cli-output.test.ts +57 -0
- package/src/shared/utils/cli-output.ts +8 -0
- package/src/shared/utils/concurrency.test.ts +6 -6
- package/src/shared/utils/derived-key-cache.test.ts +11 -11
- package/src/tui/app.ts +129 -20
- package/src/tui/utils.test.ts +31 -31
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, mock, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, mock, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
const originalConsoleLog = console.log
|
|
4
4
|
import type { Command } from 'commander'
|
|
@@ -55,7 +55,7 @@ describe('auth commands', () => {
|
|
|
55
55
|
})
|
|
56
56
|
|
|
57
57
|
describe('status', () => {
|
|
58
|
-
|
|
58
|
+
it('outputs error and exits when no account found', async () => {
|
|
59
59
|
mockGetAccount.mockImplementation(() => Promise.resolve(null))
|
|
60
60
|
|
|
61
61
|
await expect(authCommand.parseAsync(['status'], { from: 'user' })).rejects.toThrow('process.exit called')
|
|
@@ -65,7 +65,7 @@ describe('auth commands', () => {
|
|
|
65
65
|
expect(output.error).toContain('No Instagram account configured')
|
|
66
66
|
})
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
it('outputs account info when account exists', async () => {
|
|
69
69
|
mockGetAccount.mockImplementation(() =>
|
|
70
70
|
Promise.resolve({
|
|
71
71
|
account_id: 'user_testuser',
|
|
@@ -84,7 +84,7 @@ describe('auth commands', () => {
|
|
|
84
84
|
expect(output.pk).toBe('12345')
|
|
85
85
|
})
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
it('outputs error for specific account not found', async () => {
|
|
88
88
|
mockGetAccount.mockImplementation(() => Promise.resolve(null))
|
|
89
89
|
|
|
90
90
|
await expect(
|
|
@@ -97,7 +97,7 @@ describe('auth commands', () => {
|
|
|
97
97
|
})
|
|
98
98
|
|
|
99
99
|
describe('list', () => {
|
|
100
|
-
|
|
100
|
+
it('outputs empty array when no accounts', async () => {
|
|
101
101
|
mockListAccounts.mockImplementation(() => Promise.resolve([]))
|
|
102
102
|
|
|
103
103
|
await authCommand.parseAsync(['list'], { from: 'user' })
|
|
@@ -106,7 +106,7 @@ describe('auth commands', () => {
|
|
|
106
106
|
expect(output).toEqual([])
|
|
107
107
|
})
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
it('outputs accounts list', async () => {
|
|
110
110
|
mockListAccounts.mockImplementation(() =>
|
|
111
111
|
Promise.resolve([
|
|
112
112
|
{
|
|
@@ -140,7 +140,7 @@ describe('auth commands', () => {
|
|
|
140
140
|
})
|
|
141
141
|
|
|
142
142
|
describe('use', () => {
|
|
143
|
-
|
|
143
|
+
it('switches to specified account', async () => {
|
|
144
144
|
mockSetCurrent.mockImplementation(() => Promise.resolve(true))
|
|
145
145
|
mockGetAccount.mockImplementation(() =>
|
|
146
146
|
Promise.resolve({
|
|
@@ -160,7 +160,7 @@ describe('auth commands', () => {
|
|
|
160
160
|
expect(output.account_id).toBe('user_alice')
|
|
161
161
|
})
|
|
162
162
|
|
|
163
|
-
|
|
163
|
+
it('outputs error when account not found', async () => {
|
|
164
164
|
mockSetCurrent.mockImplementation(() => Promise.resolve(false))
|
|
165
165
|
|
|
166
166
|
await expect(authCommand.parseAsync(['use', 'missing_account'], { from: 'user' })).rejects.toThrow(
|
|
@@ -173,7 +173,7 @@ describe('auth commands', () => {
|
|
|
173
173
|
})
|
|
174
174
|
|
|
175
175
|
describe('logout', () => {
|
|
176
|
-
|
|
176
|
+
it('removes account and outputs success', async () => {
|
|
177
177
|
mockGetAccount.mockImplementation(() =>
|
|
178
178
|
Promise.resolve({
|
|
179
179
|
account_id: 'user_alice',
|
|
@@ -194,7 +194,7 @@ describe('auth commands', () => {
|
|
|
194
194
|
expect(output.account_id).toBe('user_alice')
|
|
195
195
|
})
|
|
196
196
|
|
|
197
|
-
|
|
197
|
+
it('outputs error when no account configured', async () => {
|
|
198
198
|
mockGetAccount.mockImplementation(() => Promise.resolve(null))
|
|
199
199
|
|
|
200
200
|
await expect(authCommand.parseAsync(['logout'], { from: 'user' })).rejects.toThrow('process.exit called')
|
|
@@ -203,7 +203,7 @@ describe('auth commands', () => {
|
|
|
203
203
|
expect(output.error).toContain('No Instagram account configured')
|
|
204
204
|
})
|
|
205
205
|
|
|
206
|
-
|
|
206
|
+
it('outputs error for specific account not found', async () => {
|
|
207
207
|
mockGetAccount.mockImplementation(() => Promise.resolve(null))
|
|
208
208
|
|
|
209
209
|
await expect(
|
|
@@ -4,6 +4,7 @@ import { Writable } from 'node:stream'
|
|
|
4
4
|
|
|
5
5
|
import { Command } from 'commander'
|
|
6
6
|
|
|
7
|
+
import { collectBrowserProfileOption } from '@/shared/chromium'
|
|
7
8
|
import { handleError } from '@/shared/utils/error-handler'
|
|
8
9
|
import { formatOutput } from '@/shared/utils/output'
|
|
9
10
|
import { info, warn, error as stderrError, debug } from '@/shared/utils/stderr'
|
|
@@ -385,11 +386,12 @@ async function useAction(accountId: string, options: { pretty?: boolean }): Prom
|
|
|
385
386
|
}
|
|
386
387
|
}
|
|
387
388
|
|
|
388
|
-
async function extractAction(options: { pretty?: boolean; debug?: boolean }): Promise<void> {
|
|
389
|
+
async function extractAction(options: { pretty?: boolean; debug?: boolean; browserProfile?: string[] }): Promise<void> {
|
|
389
390
|
try {
|
|
390
391
|
const extractor = new InstagramTokenExtractor(
|
|
391
392
|
undefined,
|
|
392
393
|
options.debug ? (msg) => debug(`[debug] ${msg}`) : undefined,
|
|
394
|
+
options.browserProfile,
|
|
393
395
|
)
|
|
394
396
|
|
|
395
397
|
if (options.debug) {
|
|
@@ -536,6 +538,12 @@ export const authCommand = new Command('auth')
|
|
|
536
538
|
.description('Extract Instagram cookies from browser (Chrome, Edge, Arc, Brave)')
|
|
537
539
|
.option('--pretty', 'Pretty print JSON output')
|
|
538
540
|
.option('--debug', 'Show debug output')
|
|
541
|
+
.option(
|
|
542
|
+
'--browser-profile <path>',
|
|
543
|
+
'Additional Chromium profile/user-data directory to scan (repeatable, comma-separated supported)',
|
|
544
|
+
collectBrowserProfileOption,
|
|
545
|
+
[],
|
|
546
|
+
)
|
|
539
547
|
.action(extractAction),
|
|
540
548
|
)
|
|
541
549
|
.addCommand(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, mock, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, mock, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
const originalConsoleLog = console.log
|
|
4
4
|
import type { Command } from 'commander'
|
|
@@ -67,7 +67,7 @@ describe('chat commands', () => {
|
|
|
67
67
|
})
|
|
68
68
|
|
|
69
69
|
describe('list', () => {
|
|
70
|
-
|
|
70
|
+
it('lists DM conversations', async () => {
|
|
71
71
|
await expect(chatCommand.parseAsync(['list'], { from: 'user' })).rejects.toThrow('process.exit called')
|
|
72
72
|
|
|
73
73
|
expect(processExitSpy).toHaveBeenCalledWith(0)
|
|
@@ -78,7 +78,7 @@ describe('chat commands', () => {
|
|
|
78
78
|
expect(output[1].id).toBe('thread-2')
|
|
79
79
|
})
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
it('passes custom limit', async () => {
|
|
82
82
|
await expect(chatCommand.parseAsync(['list', '--limit', '5'], { from: 'user' })).rejects.toThrow(
|
|
83
83
|
'process.exit called',
|
|
84
84
|
)
|
|
@@ -88,7 +88,7 @@ describe('chat commands', () => {
|
|
|
88
88
|
})
|
|
89
89
|
|
|
90
90
|
describe('search', () => {
|
|
91
|
-
|
|
91
|
+
it('searches DM conversations by query', async () => {
|
|
92
92
|
await expect(chatCommand.parseAsync(['search', 'Alice'], { from: 'user' })).rejects.toThrow('process.exit called')
|
|
93
93
|
|
|
94
94
|
expect(processExitSpy).toHaveBeenCalledWith(0)
|
|
@@ -98,7 +98,7 @@ describe('chat commands', () => {
|
|
|
98
98
|
expect(output[0].id).toBe('thread-1')
|
|
99
99
|
})
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
it('passes custom limit to search', async () => {
|
|
102
102
|
await expect(chatCommand.parseAsync(['search', 'Alice', '--limit', '10'], { from: 'user' })).rejects.toThrow(
|
|
103
103
|
'process.exit called',
|
|
104
104
|
)
|
|
@@ -106,7 +106,7 @@ describe('chat commands', () => {
|
|
|
106
106
|
expect(mockSearchChats).toHaveBeenCalledWith('Alice', 10)
|
|
107
107
|
})
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
it('returns empty array when no results', async () => {
|
|
110
110
|
mockSearchChats.mockImplementation(() => Promise.resolve([]))
|
|
111
111
|
|
|
112
112
|
await expect(chatCommand.parseAsync(['search', 'nobody'], { from: 'user' })).rejects.toThrow(
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, mock, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, mock, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
const originalConsoleLog = console.log
|
|
4
4
|
import type { Command } from 'commander'
|
|
@@ -68,7 +68,7 @@ describe('message commands', () => {
|
|
|
68
68
|
})
|
|
69
69
|
|
|
70
70
|
describe('list', () => {
|
|
71
|
-
|
|
71
|
+
it('lists messages from a thread', async () => {
|
|
72
72
|
await expect(messageCommand.parseAsync(['list', 'thread-123'], { from: 'user' })).rejects.toThrow(
|
|
73
73
|
'process.exit called',
|
|
74
74
|
)
|
|
@@ -79,7 +79,7 @@ describe('message commands', () => {
|
|
|
79
79
|
expect(output).toEqual([{ id: 'msg-1', text: 'Hello' }])
|
|
80
80
|
})
|
|
81
81
|
|
|
82
|
-
|
|
82
|
+
it('passes custom limit', async () => {
|
|
83
83
|
await expect(
|
|
84
84
|
messageCommand.parseAsync(['list', 'thread-123', '--limit', '10'], { from: 'user' }),
|
|
85
85
|
).rejects.toThrow('process.exit called')
|
|
@@ -89,7 +89,7 @@ describe('message commands', () => {
|
|
|
89
89
|
})
|
|
90
90
|
|
|
91
91
|
describe('send', () => {
|
|
92
|
-
|
|
92
|
+
it('sends a message to a thread', async () => {
|
|
93
93
|
await expect(messageCommand.parseAsync(['send', 'thread-123', 'Hello world'], { from: 'user' })).rejects.toThrow(
|
|
94
94
|
'process.exit called',
|
|
95
95
|
)
|
|
@@ -102,7 +102,7 @@ describe('message commands', () => {
|
|
|
102
102
|
})
|
|
103
103
|
|
|
104
104
|
describe('send-to', () => {
|
|
105
|
-
|
|
105
|
+
it('sends a message to a user by username', async () => {
|
|
106
106
|
await expect(messageCommand.parseAsync(['send-to', 'targetuser', 'Hi there'], { from: 'user' })).rejects.toThrow(
|
|
107
107
|
'process.exit called',
|
|
108
108
|
)
|
|
@@ -114,7 +114,7 @@ describe('message commands', () => {
|
|
|
114
114
|
expect(output).toEqual({ id: 'msg-3', text: 'Sent to user' })
|
|
115
115
|
})
|
|
116
116
|
|
|
117
|
-
|
|
117
|
+
it('strips @ prefix from username', async () => {
|
|
118
118
|
await expect(messageCommand.parseAsync(['send-to', '@targetuser', 'Hi there'], { from: 'user' })).rejects.toThrow(
|
|
119
119
|
'process.exit called',
|
|
120
120
|
)
|
|
@@ -122,7 +122,7 @@ describe('message commands', () => {
|
|
|
122
122
|
expect(mockSearchUsers).toHaveBeenCalledWith('targetuser')
|
|
123
123
|
})
|
|
124
124
|
|
|
125
|
-
|
|
125
|
+
it('handles user not found error', async () => {
|
|
126
126
|
mockSearchUsers.mockImplementation(() => Promise.resolve([]))
|
|
127
127
|
|
|
128
128
|
try {
|
|
@@ -136,7 +136,7 @@ describe('message commands', () => {
|
|
|
136
136
|
})
|
|
137
137
|
|
|
138
138
|
describe('search', () => {
|
|
139
|
-
|
|
139
|
+
it('searches messages by query', async () => {
|
|
140
140
|
await expect(messageCommand.parseAsync(['search', 'hello'], { from: 'user' })).rejects.toThrow(
|
|
141
141
|
'process.exit called',
|
|
142
142
|
)
|
|
@@ -147,7 +147,7 @@ describe('message commands', () => {
|
|
|
147
147
|
expect(output).toEqual([{ id: 'msg-4', text: 'Found' }])
|
|
148
148
|
})
|
|
149
149
|
|
|
150
|
-
|
|
150
|
+
it('passes thread option to search', async () => {
|
|
151
151
|
await expect(
|
|
152
152
|
messageCommand.parseAsync(['search', 'hello', '--thread', 'thread-456'], { from: 'user' }),
|
|
153
153
|
).rejects.toThrow('process.exit called')
|
|
@@ -155,7 +155,7 @@ describe('message commands', () => {
|
|
|
155
155
|
expect(mockSearchMessages).toHaveBeenCalledWith('hello', { threadId: 'thread-456', limit: 20 })
|
|
156
156
|
})
|
|
157
157
|
|
|
158
|
-
|
|
158
|
+
it('passes limit option to search', async () => {
|
|
159
159
|
await expect(messageCommand.parseAsync(['search', 'hello2', '--limit', '5'], { from: 'user' })).rejects.toThrow(
|
|
160
160
|
'process.exit called',
|
|
161
161
|
)
|
|
@@ -165,7 +165,7 @@ describe('message commands', () => {
|
|
|
165
165
|
})
|
|
166
166
|
|
|
167
167
|
describe('search-users', () => {
|
|
168
|
-
|
|
168
|
+
it('searches users by query', async () => {
|
|
169
169
|
await expect(messageCommand.parseAsync(['search-users', 'target'], { from: 'user' })).rejects.toThrow(
|
|
170
170
|
'process.exit called',
|
|
171
171
|
)
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import { describe, expect,
|
|
1
|
+
import { describe, expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { parseLimitOption } from '@/platforms/instagram/commands/shared'
|
|
4
4
|
import { InstagramError } from '@/platforms/instagram/types'
|
|
5
5
|
|
|
6
6
|
describe('parseLimitOption', () => {
|
|
7
|
-
|
|
7
|
+
it('returns parsed integer for valid input', () => {
|
|
8
8
|
expect(parseLimitOption('10', 20)).toBe(10)
|
|
9
9
|
})
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
it('returns default when undefined', () => {
|
|
12
12
|
expect(parseLimitOption(undefined, 20)).toBe(20)
|
|
13
13
|
})
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
it('trims whitespace', () => {
|
|
16
16
|
expect(parseLimitOption(' 15 ', 20)).toBe(15)
|
|
17
17
|
})
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
it('throws InstagramError for non-numeric input', () => {
|
|
20
20
|
expect(() => parseLimitOption('abc', 20)).toThrow(InstagramError)
|
|
21
21
|
})
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
it('throws for zero', () => {
|
|
24
24
|
expect(() => parseLimitOption('0', 20)).toThrow(InstagramError)
|
|
25
25
|
})
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
it('throws for negative numbers', () => {
|
|
28
28
|
expect(() => parseLimitOption('-5', 20)).toThrow(InstagramError)
|
|
29
29
|
})
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
it('throws for values exceeding default maxValue', () => {
|
|
32
32
|
expect(() => parseLimitOption('101', 20)).toThrow(InstagramError)
|
|
33
33
|
})
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
it('respects custom maxValue', () => {
|
|
36
36
|
expect(parseLimitOption('50', 20, 50)).toBe(50)
|
|
37
37
|
expect(() => parseLimitOption('51', 20, 50)).toThrow(InstagramError)
|
|
38
38
|
})
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
it('throws for decimal numbers', () => {
|
|
41
41
|
expect(() => parseLimitOption('10.5', 20)).toThrow(InstagramError)
|
|
42
42
|
})
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
it('accepts boundary value 1', () => {
|
|
45
45
|
expect(parseLimitOption('1', 20)).toBe(1)
|
|
46
46
|
})
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
it('accepts boundary value 100', () => {
|
|
49
49
|
expect(parseLimitOption('100', 20)).toBe(100)
|
|
50
50
|
})
|
|
51
51
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, spyOn, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { InstagramClient } from '../client'
|
|
4
4
|
import * as sharedModule from './shared'
|
|
@@ -29,7 +29,7 @@ describe('whoami command', () => {
|
|
|
29
29
|
consoleLogSpy?.mockRestore()
|
|
30
30
|
})
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
it('outputs profile information', async () => {
|
|
33
33
|
await whoamiAction({})
|
|
34
34
|
|
|
35
35
|
expect(consoleLogSpy).toHaveBeenCalledTimes(1)
|
|
@@ -40,7 +40,7 @@ describe('whoami command', () => {
|
|
|
40
40
|
expect(output.profile_pic_url).toBe('https://example.com/pic.jpg')
|
|
41
41
|
})
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
it('outputs profile with null optional fields', async () => {
|
|
44
44
|
getProfileSpy.mockResolvedValue({
|
|
45
45
|
user_id: '987654321',
|
|
46
46
|
username: 'testuser',
|
|
@@ -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
|
|
|
@@ -34,7 +34,7 @@ afterAll(() => {
|
|
|
34
34
|
|
|
35
35
|
describe('InstagramCredentialManager', () => {
|
|
36
36
|
describe('loadConfig', () => {
|
|
37
|
-
|
|
37
|
+
it('returns default config when file does not exist', async () => {
|
|
38
38
|
const manager = setup()
|
|
39
39
|
const config = await manager.loadConfig()
|
|
40
40
|
|
|
@@ -43,7 +43,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
43
43
|
})
|
|
44
44
|
|
|
45
45
|
describe('saveConfig', () => {
|
|
46
|
-
|
|
46
|
+
it('creates file and can be re-read via loadConfig', async () => {
|
|
47
47
|
const manager = setup()
|
|
48
48
|
const config = {
|
|
49
49
|
current: 'test-account',
|
|
@@ -60,14 +60,14 @@ describe('InstagramCredentialManager', () => {
|
|
|
60
60
|
})
|
|
61
61
|
|
|
62
62
|
describe('getAccount', () => {
|
|
63
|
-
|
|
63
|
+
it('returns null when no accounts exist', async () => {
|
|
64
64
|
const manager = setup()
|
|
65
65
|
const account = await manager.getAccount()
|
|
66
66
|
|
|
67
67
|
expect(account).toBeNull()
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
it('returns null for specific accountId when no accounts exist', async () => {
|
|
71
71
|
const manager = setup()
|
|
72
72
|
const account = await manager.getAccount('nonexistent')
|
|
73
73
|
|
|
@@ -76,7 +76,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
76
76
|
})
|
|
77
77
|
|
|
78
78
|
describe('setAccount', () => {
|
|
79
|
-
|
|
79
|
+
it('round-trips: set then get returns same account', async () => {
|
|
80
80
|
const manager = setup()
|
|
81
81
|
const account = makeAccount()
|
|
82
82
|
|
|
@@ -86,7 +86,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
86
86
|
expect(retrieved).toEqual(account)
|
|
87
87
|
})
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
it('sets first account as current automatically', async () => {
|
|
90
90
|
const manager = setup()
|
|
91
91
|
const account = makeAccount()
|
|
92
92
|
|
|
@@ -96,7 +96,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
96
96
|
expect(current).toEqual(account)
|
|
97
97
|
})
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
it('does not override current when it is already set', async () => {
|
|
100
100
|
const manager = setup()
|
|
101
101
|
const first = makeAccount({ account_id: 'first-account' })
|
|
102
102
|
const second = makeAccount({ account_id: 'second-account' })
|
|
@@ -108,7 +108,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
108
108
|
expect(current?.account_id).toBe('first-account')
|
|
109
109
|
})
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
it('getAccount looks up account by normalized ID via createAccountId', async () => {
|
|
112
112
|
const manager = setup()
|
|
113
113
|
const account = makeAccount({ account_id: 'my-username' })
|
|
114
114
|
|
|
@@ -120,14 +120,14 @@ describe('InstagramCredentialManager', () => {
|
|
|
120
120
|
})
|
|
121
121
|
|
|
122
122
|
describe('listAccounts', () => {
|
|
123
|
-
|
|
123
|
+
it('returns empty array when no accounts', async () => {
|
|
124
124
|
const manager = setup()
|
|
125
125
|
const accounts = await manager.listAccounts()
|
|
126
126
|
|
|
127
127
|
expect(accounts).toEqual([])
|
|
128
128
|
})
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
it('returns all accounts with is_current flag', async () => {
|
|
131
131
|
const manager = setup()
|
|
132
132
|
const first = makeAccount({ account_id: 'first-account' })
|
|
133
133
|
const second = makeAccount({ account_id: 'second-account' })
|
|
@@ -146,7 +146,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
146
146
|
})
|
|
147
147
|
|
|
148
148
|
describe('setCurrent', () => {
|
|
149
|
-
|
|
149
|
+
it('switches active account and returns true', async () => {
|
|
150
150
|
const manager = setup()
|
|
151
151
|
const first = makeAccount({ account_id: 'first-account' })
|
|
152
152
|
const second = makeAccount({ account_id: 'second-account' })
|
|
@@ -161,7 +161,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
161
161
|
expect(current?.account_id).toBe('second-account')
|
|
162
162
|
})
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
it('returns false for non-existent account', async () => {
|
|
165
165
|
const manager = setup()
|
|
166
166
|
|
|
167
167
|
const result = await manager.setCurrent('nonexistent')
|
|
@@ -171,7 +171,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
171
171
|
})
|
|
172
172
|
|
|
173
173
|
describe('removeAccount', () => {
|
|
174
|
-
|
|
174
|
+
it('removes account and adjusts current to next available', async () => {
|
|
175
175
|
const manager = setup()
|
|
176
176
|
const first = makeAccount({ account_id: 'first-account' })
|
|
177
177
|
const second = makeAccount({ account_id: 'second-account' })
|
|
@@ -190,7 +190,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
190
190
|
expect(current?.account_id).toBe('second-account')
|
|
191
191
|
})
|
|
192
192
|
|
|
193
|
-
|
|
193
|
+
it('returns false for non-existent account', async () => {
|
|
194
194
|
const manager = setup()
|
|
195
195
|
|
|
196
196
|
const result = await manager.removeAccount('nonexistent')
|
|
@@ -200,7 +200,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
200
200
|
})
|
|
201
201
|
|
|
202
202
|
describe('clearCredentials', () => {
|
|
203
|
-
|
|
203
|
+
it('removes credentials file when it exists', async () => {
|
|
204
204
|
const manager = setup()
|
|
205
205
|
const account = makeAccount()
|
|
206
206
|
await manager.setAccount(account)
|
|
@@ -214,7 +214,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
214
214
|
expect(existsSync(credentialsPath)).toBe(false)
|
|
215
215
|
})
|
|
216
216
|
|
|
217
|
-
|
|
217
|
+
it('does not throw when credentials file does not exist', async () => {
|
|
218
218
|
const manager = setup()
|
|
219
219
|
|
|
220
220
|
await expect(manager.clearCredentials()).resolves.toBeUndefined()
|
|
@@ -222,7 +222,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
222
222
|
})
|
|
223
223
|
|
|
224
224
|
describe('getAccountPaths', () => {
|
|
225
|
-
|
|
225
|
+
it('returns correct paths structure for account ID', async () => {
|
|
226
226
|
const testConfigDir = join(
|
|
227
227
|
import.meta.dir,
|
|
228
228
|
`.test-instagram-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
@@ -236,7 +236,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
236
236
|
expect(paths.session_path).toBe(join(testConfigDir, 'instagram', 'test-account', 'session.json'))
|
|
237
237
|
})
|
|
238
238
|
|
|
239
|
-
|
|
239
|
+
it('normalizes account ID via createAccountId', async () => {
|
|
240
240
|
const testConfigDir = join(
|
|
241
241
|
import.meta.dir,
|
|
242
242
|
`.test-instagram-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
@@ -252,7 +252,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
252
252
|
})
|
|
253
253
|
|
|
254
254
|
describe('ensureAccountPaths', () => {
|
|
255
|
-
|
|
255
|
+
it('creates directories', async () => {
|
|
256
256
|
const manager = setup()
|
|
257
257
|
|
|
258
258
|
const paths = await manager.ensureAccountPaths('test-account')
|
|
@@ -260,7 +260,7 @@ describe('InstagramCredentialManager', () => {
|
|
|
260
260
|
expect(existsSync(paths.account_dir)).toBe(true)
|
|
261
261
|
})
|
|
262
262
|
|
|
263
|
-
|
|
263
|
+
it('returns paths structure', async () => {
|
|
264
264
|
const testConfigDir = join(
|
|
265
265
|
import.meta.dir,
|
|
266
266
|
`.test-instagram-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, spyOn,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, spyOn, it } from 'bun:test'
|
|
2
2
|
import * as fs from 'node:fs'
|
|
3
3
|
|
|
4
4
|
import { InstagramCredentialManager } from '@/platforms/instagram/credential-manager'
|
|
@@ -46,7 +46,7 @@ afterEach(() => {
|
|
|
46
46
|
})
|
|
47
47
|
|
|
48
48
|
describe('ensureInstagramAuth', () => {
|
|
49
|
-
|
|
49
|
+
it('exits with error when no account configured', async () => {
|
|
50
50
|
// given
|
|
51
51
|
getAccountSpy.mockResolvedValue(null)
|
|
52
52
|
|
|
@@ -56,7 +56,7 @@ describe('ensureInstagramAuth', () => {
|
|
|
56
56
|
expect(consoleSpy).toHaveBeenCalled()
|
|
57
57
|
})
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
it('exits with error when session file missing', async () => {
|
|
60
60
|
// given
|
|
61
61
|
getAccountSpy.mockResolvedValue(validAccount)
|
|
62
62
|
existsSyncSpy.mockReturnValue(false)
|
|
@@ -67,7 +67,7 @@ describe('ensureInstagramAuth', () => {
|
|
|
67
67
|
expect(consoleSpy).toHaveBeenCalled()
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
it('succeeds when account and session file exist', async () => {
|
|
71
71
|
// given
|
|
72
72
|
getAccountSpy.mockResolvedValue(validAccount)
|
|
73
73
|
existsSyncSpy.mockReturnValue(true)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { expect,
|
|
1
|
+
import { expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
4
|
createAccountId,
|
|
@@ -11,34 +11,34 @@ import {
|
|
|
11
11
|
InstagramListener,
|
|
12
12
|
} from '@/platforms/instagram/index'
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
it('InstagramClient is exported from barrel', () => {
|
|
15
15
|
expect(typeof InstagramClient).toBe('function')
|
|
16
16
|
})
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
it('InstagramCredentialManager is exported from barrel', () => {
|
|
19
19
|
expect(typeof InstagramCredentialManager).toBe('function')
|
|
20
20
|
})
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
it('InstagramListener is exported from barrel', () => {
|
|
23
23
|
expect(typeof InstagramListener).toBe('function')
|
|
24
24
|
})
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
it('InstagramError is exported from barrel', () => {
|
|
27
27
|
expect(typeof InstagramError).toBe('function')
|
|
28
28
|
})
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
it('createAccountId is exported from barrel', () => {
|
|
31
31
|
expect(typeof createAccountId).toBe('function')
|
|
32
32
|
})
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
it('extractMediaUrl is exported from barrel', () => {
|
|
35
35
|
expect(typeof extractMediaUrl).toBe('function')
|
|
36
36
|
})
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
it('extractMessageText is exported from barrel', () => {
|
|
39
39
|
expect(typeof extractMessageText).toBe('function')
|
|
40
40
|
})
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
it('getMessageType is exported from barrel', () => {
|
|
43
43
|
expect(typeof getMessageType).toBe('function')
|
|
44
44
|
})
|