agent-messenger 2.7.0 → 2.9.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/.github/workflows/ci.yml +6 -0
- package/.oxfmtrc.json +13 -1
- package/.oxlintrc.json +10 -1
- package/README.md +1 -12
- package/dist/package.json +59 -58
- package/dist/src/platforms/channeltalk/client.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/client.js +2 -2
- package/dist/src/platforms/channeltalk/client.js.map +1 -1
- package/dist/src/platforms/channeltalk/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/commands/auth.js.map +1 -1
- package/dist/src/platforms/channeltalk/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/commands/message.js.map +1 -1
- package/dist/src/platforms/channeltalk/commands/snapshot.d.ts +4 -2
- package/dist/src/platforms/channeltalk/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/commands/snapshot.js +86 -31
- package/dist/src/platforms/channeltalk/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/channeltalk/ensure-auth.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/ensure-auth.js.map +1 -1
- package/dist/src/platforms/channeltalk/token-extractor.d.ts +9 -23
- package/dist/src/platforms/channeltalk/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/channeltalk/token-extractor.js +109 -341
- package/dist/src/platforms/channeltalk/token-extractor.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/client.d.ts +1 -1
- package/dist/src/platforms/channeltalkbot/client.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/client.js +4 -4
- package/dist/src/platforms/channeltalkbot/client.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/auth.js +4 -1
- package/dist/src/platforms/channeltalkbot/commands/auth.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/shared.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/shared.js.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/snapshot.d.ts +3 -1
- package/dist/src/platforms/channeltalkbot/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/channeltalkbot/commands/snapshot.js +110 -60
- package/dist/src/platforms/channeltalkbot/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/discord/commands/auth.js.map +1 -1
- package/dist/src/platforms/discord/commands/snapshot.d.ts +1 -0
- package/dist/src/platforms/discord/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/snapshot.js +48 -34
- package/dist/src/platforms/discord/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/discord/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/discord/commands/whoami.js.map +1 -1
- package/dist/src/platforms/discord/token-extractor.d.ts +2 -10
- package/dist/src/platforms/discord/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/discord/token-extractor.js +38 -172
- package/dist/src/platforms/discord/token-extractor.js.map +1 -1
- package/dist/src/platforms/discordbot/client.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/client.js.map +1 -1
- package/dist/src/platforms/discordbot/commands/snapshot.d.ts +2 -0
- package/dist/src/platforms/discordbot/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/discordbot/commands/snapshot.js +46 -34
- package/dist/src/platforms/discordbot/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/instagram/cli.d.ts.map +1 -1
- package/dist/src/platforms/instagram/cli.js +1 -4
- package/dist/src/platforms/instagram/cli.js.map +1 -1
- package/dist/src/platforms/instagram/client.d.ts.map +1 -1
- package/dist/src/platforms/instagram/client.js +8 -7
- package/dist/src/platforms/instagram/client.js.map +1 -1
- package/dist/src/platforms/instagram/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/instagram/commands/auth.js.map +1 -1
- package/dist/src/platforms/instagram/commands/chat.d.ts.map +1 -1
- package/dist/src/platforms/instagram/commands/chat.js.map +1 -1
- package/dist/src/platforms/instagram/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/instagram/commands/message.js.map +1 -1
- package/dist/src/platforms/instagram/commands/shared.d.ts.map +1 -1
- package/dist/src/platforms/instagram/commands/shared.js.map +1 -1
- package/dist/src/platforms/instagram/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/instagram/credential-manager.js +1 -1
- package/dist/src/platforms/instagram/credential-manager.js.map +1 -1
- package/dist/src/platforms/instagram/ensure-auth.d.ts.map +1 -1
- package/dist/src/platforms/instagram/ensure-auth.js.map +1 -1
- package/dist/src/platforms/instagram/token-extractor.d.ts +7 -19
- package/dist/src/platforms/instagram/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/instagram/token-extractor.js +44 -270
- package/dist/src/platforms/instagram/token-extractor.js.map +1 -1
- package/dist/src/platforms/instagram/types.d.ts.map +1 -1
- package/dist/src/platforms/instagram/types.js +4 -2
- package/dist/src/platforms/instagram/types.js.map +1 -1
- package/dist/src/platforms/kakaotalk/auth/kakao-login.d.ts.map +1 -1
- package/dist/src/platforms/kakaotalk/auth/kakao-login.js +18 -4
- package/dist/src/platforms/kakaotalk/auth/kakao-login.js.map +1 -1
- package/dist/src/platforms/kakaotalk/client.d.ts.map +1 -1
- package/dist/src/platforms/kakaotalk/client.js +3 -3
- package/dist/src/platforms/kakaotalk/client.js.map +1 -1
- package/dist/src/platforms/kakaotalk/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/kakaotalk/commands/auth.js +15 -9
- package/dist/src/platforms/kakaotalk/commands/auth.js.map +1 -1
- package/dist/src/platforms/kakaotalk/commands/shared.d.ts.map +1 -1
- package/dist/src/platforms/kakaotalk/commands/shared.js.map +1 -1
- package/dist/src/platforms/kakaotalk/protocol/connection.d.ts.map +1 -1
- package/dist/src/platforms/kakaotalk/protocol/connection.js.map +1 -1
- package/dist/src/platforms/kakaotalk/protocol/crypto.js +1 -1
- package/dist/src/platforms/kakaotalk/protocol/crypto.js.map +1 -1
- package/dist/src/platforms/kakaotalk/protocol/session.d.ts.map +1 -1
- package/dist/src/platforms/kakaotalk/protocol/session.js +1 -3
- package/dist/src/platforms/kakaotalk/protocol/session.js.map +1 -1
- package/dist/src/platforms/kakaotalk/token-extractor.js +5 -2
- package/dist/src/platforms/kakaotalk/token-extractor.js.map +1 -1
- package/dist/src/platforms/kakaotalk/types.d.ts.map +1 -1
- package/dist/src/platforms/kakaotalk/types.js +4 -2
- package/dist/src/platforms/kakaotalk/types.js.map +1 -1
- package/dist/src/platforms/line/cli.d.ts.map +1 -1
- package/dist/src/platforms/line/cli.js +1 -4
- package/dist/src/platforms/line/cli.js.map +1 -1
- package/dist/src/platforms/line/client.d.ts.map +1 -1
- package/dist/src/platforms/line/client.js +5 -13
- package/dist/src/platforms/line/client.js.map +1 -1
- package/dist/src/platforms/line/commands/chat.d.ts.map +1 -1
- package/dist/src/platforms/line/commands/chat.js.map +1 -1
- package/dist/src/platforms/line/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/line/commands/message.js.map +1 -1
- package/dist/src/platforms/line/listener.js +1 -1
- package/dist/src/platforms/line/listener.js.map +1 -1
- package/dist/src/platforms/slack/cli.d.ts.map +1 -1
- package/dist/src/platforms/slack/cli.js.map +1 -1
- package/dist/src/platforms/slack/client-mappers.d.ts +14 -0
- package/dist/src/platforms/slack/client-mappers.d.ts.map +1 -0
- package/dist/src/platforms/slack/client-mappers.js +245 -0
- package/dist/src/platforms/slack/client-mappers.js.map +1 -0
- package/dist/src/platforms/slack/client.d.ts +0 -1
- package/dist/src/platforms/slack/client.d.ts.map +1 -1
- package/dist/src/platforms/slack/client.js +41 -455
- package/dist/src/platforms/slack/client.js.map +1 -1
- package/dist/src/platforms/slack/commands/channel.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/channel.js.map +1 -1
- package/dist/src/platforms/slack/commands/emoji.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/emoji.js +1 -3
- package/dist/src/platforms/slack/commands/emoji.js.map +1 -1
- package/dist/src/platforms/slack/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/message.js.map +1 -1
- package/dist/src/platforms/slack/commands/reminder.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/reminder.js.map +1 -1
- package/dist/src/platforms/slack/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/snapshot.js +75 -55
- package/dist/src/platforms/slack/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/slack/commands/user.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/user.js.map +1 -1
- package/dist/src/platforms/slack/commands/usergroup.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/usergroup.js.map +1 -1
- package/dist/src/platforms/slack/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/whoami.js.map +1 -1
- package/dist/src/platforms/slack/token-extractor.d.ts +2 -6
- package/dist/src/platforms/slack/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/slack/token-extractor.js +35 -229
- 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 +1 -1
- package/dist/src/platforms/slackbot/cli.js.map +1 -1
- package/dist/src/platforms/teams/client.d.ts.map +1 -1
- package/dist/src/platforms/teams/client.js +1 -1
- package/dist/src/platforms/teams/client.js.map +1 -1
- package/dist/src/platforms/teams/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/auth.js +4 -1
- package/dist/src/platforms/teams/commands/auth.js.map +1 -1
- package/dist/src/platforms/teams/commands/snapshot.d.ts +1 -0
- package/dist/src/platforms/teams/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/snapshot.js +44 -31
- package/dist/src/platforms/teams/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/teams/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/teams/commands/whoami.js.map +1 -1
- package/dist/src/platforms/teams/token-extractor.d.ts +6 -18
- package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/teams/token-extractor.js +71 -324
- package/dist/src/platforms/teams/token-extractor.js.map +1 -1
- package/dist/src/platforms/telegram/cli.d.ts.map +1 -1
- package/dist/src/platforms/telegram/cli.js +1 -4
- package/dist/src/platforms/telegram/cli.js.map +1 -1
- package/dist/src/platforms/telegram/client.d.ts.map +1 -1
- package/dist/src/platforms/telegram/client.js.map +1 -1
- package/dist/src/platforms/telegram/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/telegram/commands/auth.js +1 -1
- package/dist/src/platforms/telegram/commands/auth.js.map +1 -1
- package/dist/src/platforms/telegram/commands/chat.d.ts.map +1 -1
- package/dist/src/platforms/telegram/commands/chat.js.map +1 -1
- package/dist/src/platforms/telegram/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/telegram/commands/message.js.map +1 -1
- package/dist/src/platforms/telegram/commands/whoami.js +1 -1
- package/dist/src/platforms/telegram/commands/whoami.js.map +1 -1
- package/dist/src/platforms/telegram/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/telegram/credential-manager.js +6 -2
- package/dist/src/platforms/telegram/credential-manager.js.map +1 -1
- package/dist/src/platforms/telegram/my-telegram-org.js.map +1 -1
- package/dist/src/platforms/webex/cli.d.ts.map +1 -1
- package/dist/src/platforms/webex/cli.js +1 -4
- package/dist/src/platforms/webex/cli.js.map +1 -1
- package/dist/src/platforms/webex/client.d.ts.map +1 -1
- package/dist/src/platforms/webex/client.js +3 -7
- package/dist/src/platforms/webex/client.js.map +1 -1
- package/dist/src/platforms/webex/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/webex/commands/auth.js +1 -3
- package/dist/src/platforms/webex/commands/auth.js.map +1 -1
- package/dist/src/platforms/webex/commands/member.d.ts.map +1 -1
- package/dist/src/platforms/webex/commands/member.js +1 -3
- package/dist/src/platforms/webex/commands/member.js.map +1 -1
- package/dist/src/platforms/webex/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/webex/commands/message.js.map +1 -1
- package/dist/src/platforms/webex/commands/snapshot.d.ts +1 -0
- package/dist/src/platforms/webex/commands/snapshot.d.ts.map +1 -1
- package/dist/src/platforms/webex/commands/snapshot.js +14 -7
- package/dist/src/platforms/webex/commands/snapshot.js.map +1 -1
- package/dist/src/platforms/webex/commands/space.d.ts.map +1 -1
- package/dist/src/platforms/webex/commands/space.js.map +1 -1
- package/dist/src/platforms/webex/commands/whoami.d.ts.map +1 -1
- package/dist/src/platforms/webex/commands/whoami.js.map +1 -1
- package/dist/src/platforms/webex/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/webex/credential-manager.js.map +1 -1
- package/dist/src/platforms/webex/ensure-auth.d.ts.map +1 -1
- package/dist/src/platforms/webex/ensure-auth.js +1 -3
- package/dist/src/platforms/webex/ensure-auth.js.map +1 -1
- package/dist/src/platforms/webex/index.d.ts +1 -1
- package/dist/src/platforms/webex/index.d.ts.map +1 -1
- package/dist/src/platforms/webex/index.js.map +1 -1
- package/dist/src/platforms/webex/markdown-to-html.js.map +1 -1
- package/dist/src/platforms/webex/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/webex/token-extractor.js +5 -14
- package/dist/src/platforms/webex/token-extractor.js.map +1 -1
- package/dist/src/platforms/wechatbot/client.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/client.js.map +1 -1
- package/dist/src/platforms/wechatbot/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/wechatbot/commands/message.js.map +1 -1
- package/dist/src/platforms/whatsapp/cli.d.ts.map +1 -1
- package/dist/src/platforms/whatsapp/cli.js +1 -4
- package/dist/src/platforms/whatsapp/cli.js.map +1 -1
- package/dist/src/platforms/whatsapp/commands/chat.d.ts.map +1 -1
- package/dist/src/platforms/whatsapp/commands/chat.js.map +1 -1
- package/dist/src/platforms/whatsapp/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/whatsapp/commands/message.js.map +1 -1
- package/dist/src/platforms/whatsapp/commands/shared.d.ts.map +1 -1
- package/dist/src/platforms/whatsapp/commands/shared.js.map +1 -1
- package/dist/src/platforms/whatsapp/credential-manager.d.ts.map +1 -1
- package/dist/src/platforms/whatsapp/credential-manager.js +1 -1
- package/dist/src/platforms/whatsapp/credential-manager.js.map +1 -1
- package/dist/src/platforms/whatsapp/ensure-auth.d.ts.map +1 -1
- package/dist/src/platforms/whatsapp/ensure-auth.js.map +1 -1
- package/dist/src/platforms/whatsappbot/client.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/client.js +2 -2
- package/dist/src/platforms/whatsappbot/client.js.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/auth.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/auth.js +4 -1
- 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.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/shared.d.ts.map +1 -1
- package/dist/src/platforms/whatsappbot/commands/shared.js.map +1 -1
- package/dist/src/shared/chromium/browsers.d.ts +7 -0
- package/dist/src/shared/chromium/browsers.d.ts.map +1 -0
- package/dist/src/shared/chromium/browsers.js +89 -0
- package/dist/src/shared/chromium/browsers.js.map +1 -0
- package/dist/src/shared/chromium/cookie-reader.d.ts +20 -0
- package/dist/src/shared/chromium/cookie-reader.d.ts.map +1 -0
- package/dist/src/shared/chromium/cookie-reader.js +99 -0
- package/dist/src/shared/chromium/cookie-reader.js.map +1 -0
- package/dist/src/shared/chromium/decryptor.d.ts +42 -0
- package/dist/src/shared/chromium/decryptor.d.ts.map +1 -0
- package/dist/src/shared/chromium/decryptor.js +205 -0
- package/dist/src/shared/chromium/decryptor.js.map +1 -0
- package/dist/src/shared/chromium/index.d.ts +6 -0
- package/dist/src/shared/chromium/index.d.ts.map +1 -0
- package/dist/src/shared/chromium/index.js +4 -0
- package/dist/src/shared/chromium/index.js.map +1 -0
- package/dist/src/shared/chromium/types.d.ts +11 -0
- package/dist/src/shared/chromium/types.d.ts.map +1 -0
- package/dist/src/shared/chromium/types.js +2 -0
- package/dist/src/shared/chromium/types.js.map +1 -0
- package/dist/src/shared/utils/derived-key-cache.d.ts +1 -1
- package/dist/src/shared/utils/derived-key-cache.d.ts.map +1 -1
- package/dist/src/shared/utils/linux-keyring.js +4 -1
- package/dist/src/shared/utils/linux-keyring.js.map +1 -1
- package/dist/src/tui/adapters/kakaotalk-adapter.d.ts.map +1 -1
- package/dist/src/tui/adapters/kakaotalk-adapter.js +6 -1
- package/dist/src/tui/adapters/kakaotalk-adapter.js.map +1 -1
- package/dist/src/tui/adapters/telegram-adapter.js +1 -1
- package/dist/src/tui/adapters/telegram-adapter.js.map +1 -1
- package/dist/src/tui/adapters/webex-adapter.js +1 -1
- package/dist/src/tui/adapters/webex-adapter.js.map +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +112 -23
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/utils.d.ts.map +1 -1
- package/dist/src/tui/utils.js +11 -13
- package/dist/src/tui/utils.js.map +1 -1
- package/dist/src/tui/views/channel-picker.d.ts.map +1 -1
- package/dist/src/tui/views/channel-picker.js.map +1 -1
- package/dist/src/tui/views/workspace-picker.d.ts.map +1 -1
- package/dist/src/tui/views/workspace-picker.js.map +1 -1
- package/docs/content/docs/agent-skills.mdx +0 -10
- package/docs/content/docs/cli/channeltalk.mdx +42 -30
- package/docs/content/docs/cli/channeltalkbot.mdx +23 -13
- package/docs/content/docs/cli/discord.mdx +23 -7
- package/docs/content/docs/cli/discordbot.mdx +23 -7
- package/docs/content/docs/cli/instagram.mdx +4 -4
- package/docs/content/docs/cli/kakaotalk.mdx +9 -8
- package/docs/content/docs/cli/line.mdx +14 -14
- package/docs/content/docs/cli/slack.mdx +24 -7
- package/docs/content/docs/cli/teams.mdx +24 -8
- package/docs/content/docs/cli/webex.mdx +34 -21
- package/docs/content/docs/cli/wechatbot.mdx +12 -11
- package/docs/content/docs/cli/whatsapp.mdx +5 -4
- package/docs/content/docs/cli/whatsappbot.mdx +11 -11
- package/docs/content/docs/index.mdx +7 -7
- package/docs/content/docs/meta.json +1 -9
- package/docs/content/docs/sdk/channeltalk.mdx +5 -6
- package/docs/content/docs/sdk/channeltalkbot.mdx +6 -12
- package/docs/content/docs/sdk/discord.mdx +36 -43
- package/docs/content/docs/sdk/instagram.mdx +18 -18
- package/docs/content/docs/sdk/kakaotalk.mdx +27 -18
- package/docs/content/docs/sdk/line.mdx +8 -13
- package/docs/content/docs/sdk/meta.json +14 -1
- package/docs/content/docs/sdk/slack.mdx +36 -42
- package/docs/content/docs/sdk/teams.mdx +2 -8
- package/docs/content/docs/sdk/webex.mdx +2 -12
- package/docs/content/docs/sdk/wechatbot.mdx +1 -5
- package/docs/content/docs/sdk/whatsapp.mdx +10 -19
- package/docs/content/docs/sdk/whatsappbot.mdx +2 -10
- package/docs/content/docs/tui.mdx +23 -23
- package/docs/src/app/page.tsx +353 -108
- package/e2e/channeltalkbot.e2e.test.ts +1 -5
- package/e2e/config.ts +6 -2
- package/package.json +59 -58
- package/scripts/prepublish.ts +1 -3
- package/skills/agent-channeltalk/SKILL.md +19 -9
- package/skills/agent-channeltalk/references/common-patterns.md +10 -9
- package/skills/agent-channeltalkbot/SKILL.md +19 -9
- package/skills/agent-channeltalkbot/references/common-patterns.md +10 -9
- package/skills/agent-discord/SKILL.md +18 -9
- package/skills/agent-discord/references/common-patterns.md +8 -7
- package/skills/agent-discordbot/SKILL.md +18 -9
- package/skills/agent-instagram/SKILL.md +1 -1
- package/skills/agent-kakaotalk/SKILL.md +1 -1
- package/skills/agent-line/SKILL.md +1 -1
- package/skills/agent-slack/SKILL.md +19 -10
- package/skills/agent-slack/references/common-patterns.md +4 -7
- package/skills/agent-slackbot/SKILL.md +1 -1
- package/skills/agent-teams/SKILL.md +18 -9
- package/skills/agent-teams/references/common-patterns.md +9 -7
- package/skills/agent-telegram/SKILL.md +1 -1
- package/skills/agent-webex/SKILL.md +13 -4
- package/skills/agent-webex/references/common-patterns.md +8 -2
- package/skills/agent-wechatbot/SKILL.md +1 -1
- package/skills/agent-whatsapp/SKILL.md +1 -1
- package/skills/agent-whatsappbot/SKILL.md +1 -1
- package/src/platforms/channeltalk/client.test.ts +116 -29
- package/src/platforms/channeltalk/client.ts +26 -6
- package/src/platforms/channeltalk/commands/auth.test.ts +5 -5
- package/src/platforms/channeltalk/commands/auth.ts +19 -5
- package/src/platforms/channeltalk/commands/message.test.ts +2 -6
- package/src/platforms/channeltalk/commands/message.ts +5 -1
- package/src/platforms/channeltalk/commands/snapshot.test.ts +77 -30
- package/src/platforms/channeltalk/commands/snapshot.ts +112 -34
- package/src/platforms/channeltalk/ensure-auth.test.ts +20 -17
- package/src/platforms/channeltalk/ensure-auth.ts +6 -7
- package/src/platforms/channeltalk/index.ts +0 -1
- package/src/platforms/channeltalk/token-extractor.test.ts +33 -25
- package/src/platforms/channeltalk/token-extractor.ts +120 -372
- package/src/platforms/channeltalkbot/client.test.ts +1 -3
- package/src/platforms/channeltalkbot/client.ts +39 -13
- package/src/platforms/channeltalkbot/commands/auth.test.ts +3 -1
- package/src/platforms/channeltalkbot/commands/auth.ts +4 -1
- package/src/platforms/channeltalkbot/commands/bot.test.ts +13 -5
- package/src/platforms/channeltalkbot/commands/message.test.ts +12 -6
- package/src/platforms/channeltalkbot/commands/shared.ts +6 -2
- package/src/platforms/channeltalkbot/commands/snapshot.test.ts +43 -13
- package/src/platforms/channeltalkbot/commands/snapshot.ts +131 -64
- package/src/platforms/channeltalkbot/credential-manager.test.ts +1 -1
- package/src/platforms/channeltalkbot/index.test.ts +0 -2
- package/src/platforms/channeltalkbot/index.ts +0 -1
- package/src/platforms/discord/commands/auth.test.ts +6 -4
- package/src/platforms/discord/commands/auth.ts +14 -14
- package/src/platforms/discord/commands/snapshot.test.ts +1 -1
- package/src/platforms/discord/commands/snapshot.ts +58 -42
- package/src/platforms/discord/commands/whoami.test.ts +2 -4
- package/src/platforms/discord/commands/whoami.ts +2 -0
- package/src/platforms/discord/ensure-auth.test.ts +5 -3
- package/src/platforms/discord/index.ts +0 -1
- package/src/platforms/discord/listener.test.ts +7 -1
- package/src/platforms/discord/token-extractor.test.ts +18 -12
- package/src/platforms/discord/token-extractor.ts +46 -190
- package/src/platforms/discordbot/client.ts +1 -4
- package/src/platforms/discordbot/commands/auth.test.ts +3 -1
- package/src/platforms/discordbot/commands/channel.test.ts +3 -1
- package/src/platforms/discordbot/commands/message.test.ts +3 -1
- package/src/platforms/discordbot/commands/server.test.ts +3 -1
- package/src/platforms/discordbot/commands/snapshot.test.ts +43 -19
- package/src/platforms/discordbot/commands/snapshot.ts +54 -37
- package/src/platforms/discordbot/commands/thread.test.ts +3 -1
- package/src/platforms/discordbot/commands/user.test.ts +3 -1
- package/src/platforms/instagram/cli.ts +1 -4
- package/src/platforms/instagram/client.test.ts +3 -8
- package/src/platforms/instagram/client.ts +39 -34
- package/src/platforms/instagram/commands/auth.test.ts +13 -12
- package/src/platforms/instagram/commands/auth.ts +136 -71
- package/src/platforms/instagram/commands/chat.test.ts +21 -24
- package/src/platforms/instagram/commands/chat.ts +2 -0
- package/src/platforms/instagram/commands/message.test.ts +29 -24
- package/src/platforms/instagram/commands/message.ts +3 -4
- package/src/platforms/instagram/commands/shared.ts +2 -5
- package/src/platforms/instagram/commands/whoami.test.ts +4 -6
- package/src/platforms/instagram/credential-manager.ts +2 -6
- package/src/platforms/instagram/ensure-auth.test.ts +1 -4
- package/src/platforms/instagram/ensure-auth.ts +6 -3
- package/src/platforms/instagram/listener.test.ts +7 -3
- package/src/platforms/instagram/token-extractor.test.ts +4 -16
- package/src/platforms/instagram/token-extractor.ts +55 -309
- package/src/platforms/instagram/types.test.ts +2 -6
- package/src/platforms/instagram/types.ts +4 -2
- package/src/platforms/kakaotalk/auth/kakao-login.ts +30 -8
- package/src/platforms/kakaotalk/client.test.ts +37 -25
- package/src/platforms/kakaotalk/client.ts +23 -12
- package/src/platforms/kakaotalk/commands/auth.test.ts +6 -18
- package/src/platforms/kakaotalk/commands/auth.ts +101 -47
- package/src/platforms/kakaotalk/commands/chat.test.ts +8 -11
- package/src/platforms/kakaotalk/commands/message.test.ts +15 -24
- package/src/platforms/kakaotalk/commands/shared.ts +1 -0
- package/src/platforms/kakaotalk/commands/whoami.test.ts +6 -10
- package/src/platforms/kakaotalk/credential-manager.test.ts +1 -4
- package/src/platforms/kakaotalk/index.test.ts +1 -0
- package/src/platforms/kakaotalk/index.ts +0 -2
- package/src/platforms/kakaotalk/listener.test.ts +7 -1
- package/src/platforms/kakaotalk/protocol/connection.ts +4 -1
- package/src/platforms/kakaotalk/protocol/crypto.ts +1 -1
- package/src/platforms/kakaotalk/protocol/session.ts +12 -6
- package/src/platforms/kakaotalk/token-extractor.ts +5 -5
- package/src/platforms/kakaotalk/types.ts +8 -7
- package/src/platforms/line/cli.ts +1 -4
- package/src/platforms/line/client.ts +12 -20
- package/src/platforms/line/commands/auth.test.ts +2 -1
- package/src/platforms/line/commands/chat.test.ts +2 -1
- package/src/platforms/line/commands/chat.ts +1 -4
- package/src/platforms/line/commands/friend.test.ts +2 -1
- package/src/platforms/line/commands/message.test.ts +2 -1
- package/src/platforms/line/commands/message.ts +2 -9
- package/src/platforms/line/commands/whoami.test.ts +2 -1
- package/src/platforms/line/credential-manager.test.ts +1 -2
- package/src/platforms/line/index.test.ts +1 -0
- package/src/platforms/line/listener.ts +1 -1
- package/src/platforms/line/types.test.ts +1 -0
- package/src/platforms/slack/cli.ts +3 -1
- package/src/platforms/slack/client-mappers.ts +297 -0
- package/src/platforms/slack/client.test.ts +532 -17
- package/src/platforms/slack/client.ts +69 -458
- package/src/platforms/slack/commands/channel.ts +1 -4
- package/src/platforms/slack/commands/emoji.test.ts +6 -4
- package/src/platforms/slack/commands/emoji.ts +20 -22
- package/src/platforms/slack/commands/message.ts +6 -1
- package/src/platforms/slack/commands/pin.test.ts +14 -12
- package/src/platforms/slack/commands/reminder.ts +7 -6
- package/src/platforms/slack/commands/snapshot.test.ts +63 -8
- package/src/platforms/slack/commands/snapshot.ts +98 -66
- package/src/platforms/slack/commands/user.ts +6 -1
- package/src/platforms/slack/commands/usergroup.test.ts +3 -3
- package/src/platforms/slack/commands/usergroup.ts +10 -7
- package/src/platforms/slack/commands/whoami.test.ts +1 -1
- package/src/platforms/slack/commands/whoami.ts +2 -0
- package/src/platforms/slack/index.ts +0 -2
- package/src/platforms/slack/listener.test.ts +1 -0
- package/src/platforms/slack/token-extractor.test.ts +7 -12
- package/src/platforms/slack/token-extractor.ts +47 -255
- package/src/platforms/slackbot/cli.ts +8 -1
- package/src/platforms/slackbot/commands/auth.test.ts +3 -1
- package/src/platforms/teams/client.ts +1 -1
- package/src/platforms/teams/commands/auth.test.ts +1 -1
- package/src/platforms/teams/commands/auth.ts +4 -1
- package/src/platforms/teams/commands/snapshot.test.ts +1 -1
- package/src/platforms/teams/commands/snapshot.ts +53 -38
- package/src/platforms/teams/commands/whoami.test.ts +2 -4
- package/src/platforms/teams/commands/whoami.ts +2 -0
- package/src/platforms/teams/index.ts +0 -1
- package/src/platforms/teams/token-extractor.ts +82 -350
- package/src/platforms/telegram/app-config.test.ts +1 -0
- package/src/platforms/telegram/chat-utils.test.ts +5 -1
- package/src/platforms/telegram/cli.ts +2 -4
- package/src/platforms/telegram/client.test.ts +16 -3
- package/src/platforms/telegram/client.ts +14 -4
- package/src/platforms/telegram/commands/auth.test.ts +1 -0
- package/src/platforms/telegram/commands/auth.ts +3 -4
- package/src/platforms/telegram/commands/chat.test.ts +2 -5
- package/src/platforms/telegram/commands/chat.ts +1 -0
- package/src/platforms/telegram/commands/message.test.ts +2 -5
- package/src/platforms/telegram/commands/message.ts +1 -0
- package/src/platforms/telegram/commands/shared.test.ts +1 -0
- package/src/platforms/telegram/commands/whoami.test.ts +5 -7
- package/src/platforms/telegram/commands/whoami.ts +1 -1
- package/src/platforms/telegram/credential-manager.test.ts +1 -0
- package/src/platforms/telegram/credential-manager.ts +11 -2
- package/src/platforms/telegram/my-telegram-org.ts +6 -2
- package/src/platforms/telegram/types.test.ts +1 -0
- package/src/platforms/webex/app-config.test.ts +1 -0
- package/src/platforms/webex/cli.ts +1 -4
- package/src/platforms/webex/client.test.ts +4 -12
- package/src/platforms/webex/client.ts +14 -52
- package/src/platforms/webex/commands/auth.test.ts +7 -1
- package/src/platforms/webex/commands/auth.ts +12 -15
- package/src/platforms/webex/commands/member.test.ts +1 -3
- package/src/platforms/webex/commands/member.ts +14 -19
- package/src/platforms/webex/commands/message.ts +4 -15
- package/src/platforms/webex/commands/snapshot.test.ts +42 -4
- package/src/platforms/webex/commands/snapshot.ts +19 -11
- package/src/platforms/webex/commands/space.test.ts +3 -3
- package/src/platforms/webex/commands/space.ts +2 -9
- package/src/platforms/webex/commands/whoami.test.ts +12 -5
- package/src/platforms/webex/commands/whoami.ts +2 -0
- package/src/platforms/webex/credential-manager.ts +11 -2
- package/src/platforms/webex/ensure-auth.ts +1 -3
- package/src/platforms/webex/index.ts +1 -7
- package/src/platforms/webex/markdown-to-html.test.ts +6 -18
- package/src/platforms/webex/markdown-to-html.ts +8 -8
- package/src/platforms/webex/token-extractor.ts +6 -29
- package/src/platforms/wechatbot/client.test.ts +6 -2
- package/src/platforms/wechatbot/client.ts +6 -1
- package/src/platforms/wechatbot/commands/auth.test.ts +3 -7
- package/src/platforms/wechatbot/commands/message.test.ts +1 -4
- package/src/platforms/wechatbot/commands/message.ts +5 -1
- package/src/platforms/wechatbot/commands/template.test.ts +1 -4
- package/src/platforms/wechatbot/commands/user.test.ts +2 -7
- package/src/platforms/whatsapp/cli.ts +1 -4
- package/src/platforms/whatsapp/commands/auth.test.ts +19 -22
- package/src/platforms/whatsapp/commands/chat.test.ts +21 -24
- package/src/platforms/whatsapp/commands/chat.ts +2 -0
- package/src/platforms/whatsapp/commands/message.test.ts +22 -24
- package/src/platforms/whatsapp/commands/message.ts +3 -5
- package/src/platforms/whatsapp/commands/shared.ts +2 -5
- package/src/platforms/whatsapp/commands/whoami.test.ts +2 -2
- package/src/platforms/whatsapp/credential-manager.ts +2 -6
- package/src/platforms/whatsapp/ensure-auth.test.ts +1 -4
- package/src/platforms/whatsapp/ensure-auth.ts +14 -6
- package/src/platforms/whatsapp/index.ts +0 -2
- package/src/platforms/whatsappbot/client.test.ts +13 -7
- package/src/platforms/whatsappbot/client.ts +18 -4
- package/src/platforms/whatsappbot/commands/auth.ts +4 -1
- package/src/platforms/whatsappbot/commands/message.test.ts +12 -2
- package/src/platforms/whatsappbot/commands/message.ts +16 -3
- package/src/platforms/whatsappbot/commands/shared.ts +3 -1
- package/src/platforms/whatsappbot/commands/whoami.test.ts +1 -3
- package/src/platforms/whatsappbot/index.ts +0 -2
- package/src/shared/chromium/browsers.test.ts +274 -0
- package/src/shared/chromium/browsers.ts +86 -0
- package/src/shared/chromium/cookie-reader.test.ts +274 -0
- package/src/shared/chromium/cookie-reader.ts +111 -0
- package/src/shared/chromium/decryptor.test.ts +449 -0
- package/src/shared/chromium/decryptor.ts +227 -0
- package/src/shared/chromium/index.ts +11 -0
- package/src/shared/chromium/types.ts +11 -0
- package/src/shared/utils/derived-key-cache.ts +1 -1
- package/src/shared/utils/linux-keyring.ts +4 -4
- package/src/tui/adapters/kakaotalk-adapter.ts +6 -1
- package/src/tui/adapters/telegram-adapter.ts +1 -1
- package/src/tui/adapters/webex-adapter.ts +1 -1
- package/src/tui/app.ts +149 -59
- package/src/tui/utils.test.ts +144 -145
- package/src/tui/utils.ts +27 -29
- package/src/tui/views/channel-picker.ts +1 -1
- package/src/tui/views/workspace-picker.ts +1 -1
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { execSync } from 'node:child_process'
|
|
2
|
-
import {
|
|
3
|
-
import { copyFileSync, existsSync, readFileSync, readdirSync, unlinkSync } from 'node:fs'
|
|
4
|
-
import { createRequire } from 'node:module'
|
|
5
|
-
import { homedir, tmpdir } from 'node:os'
|
|
2
|
+
import { existsSync } from 'node:fs'
|
|
6
3
|
import { join } from 'node:path'
|
|
7
4
|
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
import {
|
|
6
|
+
BROWSER_KEYCHAIN_VARIANTS,
|
|
7
|
+
CHROMIUM_BROWSERS,
|
|
8
|
+
ChromiumCookieDecryptor,
|
|
9
|
+
ChromiumCookieReader,
|
|
10
|
+
discoverBrowserProfileDirs,
|
|
11
|
+
findLocalStatePath,
|
|
12
|
+
getBrowserBasePath,
|
|
13
|
+
} from '@/shared/chromium'
|
|
14
|
+
import type { KeychainVariant } from '@/shared/chromium'
|
|
11
15
|
|
|
12
16
|
export interface ExtractedInstagramCookies {
|
|
13
17
|
sessionid: string
|
|
@@ -18,95 +22,30 @@ export interface ExtractedInstagramCookies {
|
|
|
18
22
|
rur?: string
|
|
19
23
|
}
|
|
20
24
|
|
|
21
|
-
interface BrowserConfig {
|
|
22
|
-
name: string
|
|
23
|
-
darwin: string
|
|
24
|
-
linux: string
|
|
25
|
-
win32: string
|
|
26
|
-
localStateDarwin?: string
|
|
27
|
-
localStateLinux?: string
|
|
28
|
-
localStateWin32?: string
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
interface KeychainVariant {
|
|
32
|
-
service: string
|
|
33
|
-
account: string
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const BROWSERS: BrowserConfig[] = [
|
|
37
|
-
{
|
|
38
|
-
name: 'Chrome',
|
|
39
|
-
darwin: join('Google', 'Chrome'),
|
|
40
|
-
linux: 'google-chrome',
|
|
41
|
-
win32: join('Google', 'Chrome', 'User Data'),
|
|
42
|
-
},
|
|
43
|
-
{
|
|
44
|
-
name: 'Chrome Canary',
|
|
45
|
-
darwin: join('Google', 'Chrome Canary'),
|
|
46
|
-
linux: 'google-chrome-unstable',
|
|
47
|
-
win32: join('Google', 'Chrome SxS', 'User Data'),
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
name: 'Edge',
|
|
51
|
-
darwin: 'Microsoft Edge',
|
|
52
|
-
linux: 'microsoft-edge',
|
|
53
|
-
win32: join('Microsoft', 'Edge', 'User Data'),
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
name: 'Arc',
|
|
57
|
-
darwin: join('Arc', 'User Data'),
|
|
58
|
-
linux: '',
|
|
59
|
-
win32: join('Arc', 'User Data'),
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
name: 'Brave',
|
|
63
|
-
darwin: join('BraveSoftware', 'Brave-Browser'),
|
|
64
|
-
linux: join('BraveSoftware', 'Brave-Browser'),
|
|
65
|
-
win32: join('BraveSoftware', 'Brave-Browser', 'User Data'),
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
name: 'Vivaldi',
|
|
69
|
-
darwin: 'Vivaldi',
|
|
70
|
-
linux: 'vivaldi',
|
|
71
|
-
win32: join('Vivaldi', 'User Data'),
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
name: 'Chromium',
|
|
75
|
-
darwin: 'Chromium',
|
|
76
|
-
linux: 'chromium',
|
|
77
|
-
win32: join('Chromium', 'User Data'),
|
|
78
|
-
},
|
|
79
|
-
]
|
|
80
|
-
|
|
81
25
|
const INSTAGRAM_HOST_KEYS = ['.instagram.com', 'www.instagram.com', 'i.instagram.com']
|
|
82
26
|
const INSTAGRAM_COOKIE_NAMES = ['sessionid', 'ds_user_id', 'csrftoken', 'mid', 'ig_did', 'rur']
|
|
83
27
|
|
|
84
28
|
export class InstagramTokenExtractor {
|
|
85
29
|
private platform: NodeJS.Platform
|
|
86
30
|
private debugLog: ((message: string) => void) | null
|
|
87
|
-
private
|
|
31
|
+
private decryptor: ChromiumCookieDecryptor
|
|
32
|
+
private cookieReader: ChromiumCookieReader
|
|
88
33
|
|
|
89
|
-
constructor(
|
|
90
|
-
platform?: NodeJS.Platform,
|
|
91
|
-
debugLog?: (message: string) => void,
|
|
92
|
-
_keyCache?: DerivedKeyCache,
|
|
93
|
-
) {
|
|
34
|
+
constructor(platform?: NodeJS.Platform, debugLog?: (message: string) => void) {
|
|
94
35
|
this.platform = platform ?? process.platform
|
|
95
36
|
this.debugLog = debugLog ?? null
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
private debug(message: string): void {
|
|
99
|
-
this.debugLog?.(message)
|
|
37
|
+
this.decryptor = new ChromiumCookieDecryptor({ platform: this.platform })
|
|
38
|
+
this.cookieReader = new ChromiumCookieReader()
|
|
100
39
|
}
|
|
101
40
|
|
|
102
41
|
getBrowserCookiesPaths(): string[] {
|
|
103
42
|
const paths: string[] = []
|
|
104
43
|
|
|
105
|
-
for (const browser of
|
|
106
|
-
const browserBase =
|
|
44
|
+
for (const browser of CHROMIUM_BROWSERS) {
|
|
45
|
+
const browserBase = getBrowserBasePath(browser, this.platform)
|
|
107
46
|
if (!browserBase) continue
|
|
108
47
|
|
|
109
|
-
const profileDirs =
|
|
48
|
+
const profileDirs = discoverBrowserProfileDirs(browserBase)
|
|
110
49
|
for (const profileDir of profileDirs) {
|
|
111
50
|
paths.push(join(profileDir, 'Cookies'))
|
|
112
51
|
paths.push(join(profileDir, 'Network', 'Cookies'))
|
|
@@ -119,8 +58,8 @@ export class InstagramTokenExtractor {
|
|
|
119
58
|
getLocalStatePaths(): string[] {
|
|
120
59
|
const paths: string[] = []
|
|
121
60
|
|
|
122
|
-
for (const browser of
|
|
123
|
-
const browserBase =
|
|
61
|
+
for (const browser of CHROMIUM_BROWSERS) {
|
|
62
|
+
const browserBase = getBrowserBasePath(browser, this.platform)
|
|
124
63
|
if (!browserBase) continue
|
|
125
64
|
|
|
126
65
|
paths.push(join(browserBase, 'Local State'))
|
|
@@ -129,65 +68,12 @@ export class InstagramTokenExtractor {
|
|
|
129
68
|
return paths
|
|
130
69
|
}
|
|
131
70
|
|
|
132
|
-
private getBrowserBasePath(browser: BrowserConfig): string | null {
|
|
133
|
-
let relative: string
|
|
134
|
-
|
|
135
|
-
switch (this.platform) {
|
|
136
|
-
case 'darwin':
|
|
137
|
-
relative = browser.darwin
|
|
138
|
-
if (!relative) return null
|
|
139
|
-
return join(homedir(), 'Library', 'Application Support', relative)
|
|
140
|
-
case 'linux':
|
|
141
|
-
relative = browser.linux
|
|
142
|
-
if (!relative) return null
|
|
143
|
-
return join(homedir(), '.config', relative)
|
|
144
|
-
case 'win32':
|
|
145
|
-
relative = browser.win32
|
|
146
|
-
if (!relative) return null
|
|
147
|
-
return join(
|
|
148
|
-
process.env.LOCALAPPDATA || join(homedir(), 'AppData', 'Local'),
|
|
149
|
-
relative,
|
|
150
|
-
)
|
|
151
|
-
default:
|
|
152
|
-
return null
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
private discoverProfileDirs(browserBase: string): string[] {
|
|
157
|
-
const dirs: string[] = []
|
|
158
|
-
|
|
159
|
-
dirs.push(join(browserBase, 'Default'))
|
|
160
|
-
|
|
161
|
-
if (!existsSync(browserBase)) return dirs
|
|
162
|
-
|
|
163
|
-
try {
|
|
164
|
-
const entries = readdirSync(browserBase, { withFileTypes: true })
|
|
165
|
-
for (const entry of entries) {
|
|
166
|
-
if (!entry.isDirectory()) continue
|
|
167
|
-
if (!/^Profile \d+$/i.test(entry.name)) continue
|
|
168
|
-
dirs.push(join(browserBase, entry.name))
|
|
169
|
-
}
|
|
170
|
-
} catch {}
|
|
171
|
-
|
|
172
|
-
return dirs
|
|
173
|
-
}
|
|
174
|
-
|
|
175
71
|
getKeychainVariants(): KeychainVariant[] {
|
|
176
|
-
return
|
|
177
|
-
{ service: 'Chrome Safe Storage', account: 'Chrome' },
|
|
178
|
-
{ service: 'Chrome Canary Safe Storage', account: 'Chrome Canary' },
|
|
179
|
-
{ service: 'Microsoft Edge Safe Storage', account: 'Microsoft Edge' },
|
|
180
|
-
{ service: 'Arc Safe Storage', account: 'Arc' },
|
|
181
|
-
{ service: 'Brave Safe Storage', account: 'Brave' },
|
|
182
|
-
{ service: 'Vivaldi Safe Storage', account: 'Vivaldi' },
|
|
183
|
-
{ service: 'Chromium Safe Storage', account: 'Chromium' },
|
|
184
|
-
]
|
|
72
|
+
return BROWSER_KEYCHAIN_VARIANTS
|
|
185
73
|
}
|
|
186
74
|
|
|
187
75
|
isEncryptedValue(value: Buffer): boolean {
|
|
188
|
-
|
|
189
|
-
const prefix = value.subarray(0, 3).toString('utf8')
|
|
190
|
-
return prefix === 'v10' || prefix === 'v11'
|
|
76
|
+
return this.decryptor.isEncryptedValue(value)
|
|
191
77
|
}
|
|
192
78
|
|
|
193
79
|
isValidSessionId(sessionid: string): boolean {
|
|
@@ -219,39 +105,30 @@ export class InstagramTokenExtractor {
|
|
|
219
105
|
return results
|
|
220
106
|
}
|
|
221
107
|
|
|
108
|
+
private debug(message: string): void {
|
|
109
|
+
this.debugLog?.(message)
|
|
110
|
+
}
|
|
111
|
+
|
|
222
112
|
private async copyAndExtract(dbPath: string): Promise<ExtractedInstagramCookies | null> {
|
|
223
|
-
|
|
113
|
+
let tempPath = dbPath
|
|
224
114
|
|
|
225
115
|
try {
|
|
226
|
-
this.copyDatabaseToTemp(dbPath,
|
|
227
|
-
|
|
228
|
-
this.cleanupTempFile(tempPath)
|
|
229
|
-
return cookies
|
|
116
|
+
tempPath = this.copyDatabaseToTemp(dbPath, dbPath)
|
|
117
|
+
return await this.extractFromSQLite(tempPath, dbPath)
|
|
230
118
|
} catch {
|
|
231
|
-
this.cleanupTempFile(tempPath)
|
|
232
119
|
return null
|
|
120
|
+
} finally {
|
|
121
|
+
this.cleanupTempFile(tempPath)
|
|
233
122
|
}
|
|
234
123
|
}
|
|
235
124
|
|
|
236
|
-
private copyDatabaseToTemp(sourcePath: string,
|
|
237
|
-
|
|
238
|
-
return destPath
|
|
125
|
+
private copyDatabaseToTemp(sourcePath: string, _destPath: string): string {
|
|
126
|
+
return sourcePath
|
|
239
127
|
}
|
|
240
128
|
|
|
241
|
-
private cleanupTempFile(
|
|
242
|
-
try {
|
|
243
|
-
if (existsSync(tempPath)) {
|
|
244
|
-
unlinkSync(tempPath)
|
|
245
|
-
}
|
|
246
|
-
} catch {
|
|
247
|
-
// Ignore cleanup errors
|
|
248
|
-
}
|
|
249
|
-
}
|
|
129
|
+
private cleanupTempFile(_tempPath: string): void {}
|
|
250
130
|
|
|
251
|
-
private async extractFromSQLite(
|
|
252
|
-
dbPath: string,
|
|
253
|
-
originalPath: string,
|
|
254
|
-
): Promise<ExtractedInstagramCookies | null> {
|
|
131
|
+
private async extractFromSQLite(dbPath: string, originalPath: string): Promise<ExtractedInstagramCookies | null> {
|
|
255
132
|
try {
|
|
256
133
|
const placeholders = INSTAGRAM_HOST_KEYS.map(() => '?').join(', ')
|
|
257
134
|
const sql = `
|
|
@@ -262,18 +139,8 @@ export class InstagramTokenExtractor {
|
|
|
262
139
|
|
|
263
140
|
type CookieRow = { name: string; value?: string; encrypted_value?: Uint8Array | Buffer }
|
|
264
141
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const { Database } = require('bun:sqlite')
|
|
268
|
-
const db = new Database(dbPath, { readonly: true })
|
|
269
|
-
rows = db.query(sql).all(...INSTAGRAM_HOST_KEYS) as CookieRow[]
|
|
270
|
-
db.close()
|
|
271
|
-
} else {
|
|
272
|
-
const Database = require('better-sqlite3')
|
|
273
|
-
const db = new Database(dbPath, { readonly: true })
|
|
274
|
-
rows = db.prepare(sql).all(...INSTAGRAM_HOST_KEYS) as CookieRow[]
|
|
275
|
-
db.close()
|
|
276
|
-
}
|
|
142
|
+
const rows = await this.cookieReader.queryAll<CookieRow>(dbPath, sql, INSTAGRAM_HOST_KEYS)
|
|
143
|
+
const localStatePath = findLocalStatePath(originalPath) ?? undefined
|
|
277
144
|
|
|
278
145
|
const cookieMap: Record<string, string> = {}
|
|
279
146
|
for (const row of rows) {
|
|
@@ -281,14 +148,14 @@ export class InstagramTokenExtractor {
|
|
|
281
148
|
|
|
282
149
|
let value = ''
|
|
283
150
|
if (row.encrypted_value && row.encrypted_value.length > 0) {
|
|
284
|
-
const
|
|
285
|
-
if (this.isEncryptedValue(
|
|
286
|
-
const
|
|
287
|
-
if (
|
|
288
|
-
value =
|
|
151
|
+
const encryptedValue = Buffer.from(row.encrypted_value)
|
|
152
|
+
if (this.decryptor.isEncryptedValue(encryptedValue)) {
|
|
153
|
+
const decryptedBuf = this.decryptor.decryptCookieRaw(encryptedValue, localStatePath)
|
|
154
|
+
if (decryptedBuf) {
|
|
155
|
+
value = ChromiumCookieDecryptor.stripIntegrityHash(decryptedBuf).toString('utf8')
|
|
289
156
|
}
|
|
290
157
|
} else {
|
|
291
|
-
value =
|
|
158
|
+
value = encryptedValue.toString('utf8')
|
|
292
159
|
}
|
|
293
160
|
} else if (row.value) {
|
|
294
161
|
value = row.value
|
|
@@ -323,91 +190,14 @@ export class InstagramTokenExtractor {
|
|
|
323
190
|
}
|
|
324
191
|
}
|
|
325
192
|
|
|
326
|
-
private
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
if (this.platform === 'win32') {
|
|
332
|
-
return this.decryptWindowsCookie(encryptedValue, dbPath)
|
|
333
|
-
} else if (this.platform === 'darwin') {
|
|
334
|
-
return this.decryptMacCookie(encryptedValue)
|
|
335
|
-
} else if (this.platform === 'linux') {
|
|
336
|
-
return this.decryptLinuxCookie(encryptedValue)
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
return null
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
private decryptWindowsCookie(encryptedData: Buffer, dbPath: string): string | null {
|
|
343
|
-
try {
|
|
344
|
-
const localStatePath = this.findLocalStateForCookiePath(dbPath)
|
|
345
|
-
if (!localStatePath || !existsSync(localStatePath)) return null
|
|
346
|
-
|
|
347
|
-
const localState = JSON.parse(readFileSync(localStatePath, 'utf8'))
|
|
348
|
-
const encryptedKey = Buffer.from(localState.os_crypt.encrypted_key, 'base64')
|
|
349
|
-
const dpapiBlobKey = encryptedKey.subarray(5)
|
|
350
|
-
const masterKey = this.decryptDPAPI(dpapiBlobKey)
|
|
351
|
-
if (!masterKey) return null
|
|
352
|
-
|
|
353
|
-
return this.decryptAESGCM(encryptedData, masterKey)
|
|
354
|
-
} catch {
|
|
355
|
-
return null
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
private findLocalStateForCookiePath(cookiePath: string): string | null {
|
|
360
|
-
const parts = cookiePath.split(/[/\\]/)
|
|
361
|
-
for (let levels = 2; levels <= 4; levels++) {
|
|
362
|
-
if (parts.length < levels) break
|
|
363
|
-
const base = parts.slice(0, parts.length - levels).join('/')
|
|
364
|
-
const candidate = join(base, 'Local State')
|
|
365
|
-
if (existsSync(candidate)) return candidate
|
|
366
|
-
}
|
|
367
|
-
return null
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
private decryptDPAPI(encryptedBlob: Buffer): Buffer | null {
|
|
371
|
-
try {
|
|
372
|
-
const b64 = encryptedBlob.toString('base64')
|
|
373
|
-
const psScript = `
|
|
374
|
-
Add-Type -AssemblyName System.Security
|
|
375
|
-
$bytes = [Convert]::FromBase64String('${b64}')
|
|
376
|
-
$decrypted = [Security.Cryptography.ProtectedData]::Unprotect($bytes, $null, 'CurrentUser')
|
|
377
|
-
[Convert]::ToBase64String($decrypted)
|
|
378
|
-
`.replace(/\n/g, ' ')
|
|
379
|
-
|
|
380
|
-
const result = execSync(`powershell -Command "${psScript}"`, { encoding: 'utf8' })
|
|
381
|
-
return Buffer.from(result.trim(), 'base64')
|
|
382
|
-
} catch {
|
|
383
|
-
return null
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
private decryptMacCookie(encryptedData: Buffer): string | null {
|
|
388
|
-
if (this.cachedKey) {
|
|
389
|
-
const decrypted = this.decryptAESCBC(encryptedData, this.cachedKey)
|
|
390
|
-
if (decrypted) return decrypted
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
for (const variant of this.getKeychainVariants()) {
|
|
394
|
-
const password = this.execSecurityCommand(variant.service, variant.account)
|
|
395
|
-
if (!password) continue
|
|
396
|
-
|
|
397
|
-
const key = pbkdf2Sync(password, 'saltysalt', 1003, 16, 'sha1')
|
|
398
|
-
const decrypted = this.decryptAESCBC(encryptedData, key)
|
|
399
|
-
if (decrypted) {
|
|
400
|
-
this.cachedKey = key
|
|
401
|
-
return decrypted
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
return null
|
|
193
|
+
private decryptAESCBC(encryptedData: Buffer, key: Buffer): string | null {
|
|
194
|
+
const buf = this.decryptor.decryptAESCBCRaw(encryptedData, key)
|
|
195
|
+
if (!buf) return null
|
|
196
|
+
return ChromiumCookieDecryptor.stripIntegrityHash(buf).toString('utf8')
|
|
406
197
|
}
|
|
407
198
|
|
|
408
|
-
private
|
|
409
|
-
|
|
410
|
-
return this.decryptAESCBC(encryptedData, key)
|
|
199
|
+
private decryptAESGCM(encryptedData: Buffer, key: Buffer): string | null {
|
|
200
|
+
return this.decryptor.decryptAESGCM(encryptedData, key)
|
|
411
201
|
}
|
|
412
202
|
|
|
413
203
|
private getKeychainPassword(): string | null {
|
|
@@ -415,6 +205,7 @@ export class InstagramTokenExtractor {
|
|
|
415
205
|
const password = this.execSecurityCommand(variant.service, variant.account)
|
|
416
206
|
if (password) return password
|
|
417
207
|
}
|
|
208
|
+
|
|
418
209
|
return null
|
|
419
210
|
}
|
|
420
211
|
|
|
@@ -422,55 +213,10 @@ export class InstagramTokenExtractor {
|
|
|
422
213
|
try {
|
|
423
214
|
const safeService = service.replace(/"/g, '\\"')
|
|
424
215
|
const safeAccount = account.replace(/"/g, '\\"')
|
|
425
|
-
const result = execSync(
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
)
|
|
429
|
-
return result.trim()
|
|
430
|
-
} catch {
|
|
431
|
-
return null
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
private decryptAESCBC(encryptedData: Buffer, key: Buffer): string | null {
|
|
436
|
-
try {
|
|
437
|
-
const ciphertext = encryptedData.subarray(3)
|
|
438
|
-
const iv = Buffer.alloc(16, 0x20)
|
|
439
|
-
|
|
440
|
-
const decipher = createDecipheriv('aes-128-cbc', key, iv)
|
|
441
|
-
decipher.setAutoPadding(true)
|
|
442
|
-
|
|
443
|
-
const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()])
|
|
444
|
-
|
|
445
|
-
// Chromium v130+ prepends a 32-byte integrity hash before the actual cookie value.
|
|
446
|
-
// Detect by checking if the first bytes contain non-printable characters.
|
|
447
|
-
if (decrypted.length > 32) {
|
|
448
|
-
const hasNonPrintablePrefix = decrypted.subarray(0, 32).some((b) => b < 0x20 || b > 0x7e)
|
|
449
|
-
if (hasNonPrintablePrefix) {
|
|
450
|
-
return decrypted.subarray(32).toString('utf8')
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
return decrypted.toString('utf8')
|
|
455
|
-
} catch {
|
|
456
|
-
return null
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
private decryptAESGCM(encryptedData: Buffer, key: Buffer): string | null {
|
|
461
|
-
try {
|
|
462
|
-
// Format: v10 (3 bytes) + IV (12 bytes) + ciphertext + auth tag (16 bytes)
|
|
463
|
-
if (encryptedData.length < 3 + 12 + 16) return null
|
|
464
|
-
|
|
465
|
-
const iv = encryptedData.subarray(3, 15)
|
|
466
|
-
const authTag = encryptedData.subarray(-16)
|
|
467
|
-
const ciphertext = encryptedData.subarray(15, -16)
|
|
468
|
-
|
|
469
|
-
const decipher = createDecipheriv('aes-256-gcm', key, iv)
|
|
470
|
-
decipher.setAuthTag(authTag)
|
|
471
|
-
|
|
472
|
-
const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()])
|
|
473
|
-
return decrypted.toString('utf8')
|
|
216
|
+
const result = execSync(`security find-generic-password -s "${safeService}" -a "${safeAccount}" -w 2>/dev/null`, {
|
|
217
|
+
encoding: 'utf8',
|
|
218
|
+
})
|
|
219
|
+
return result.trim() || null
|
|
474
220
|
} catch {
|
|
475
221
|
return null
|
|
476
222
|
}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { describe, expect, it } from 'bun:test'
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
createAccountId,
|
|
5
|
-
extractMessageText,
|
|
6
|
-
getMessageType,
|
|
7
|
-
} from './types'
|
|
2
|
+
|
|
3
|
+
import { InstagramError, createAccountId, extractMessageText, getMessageType } from './types'
|
|
8
4
|
|
|
9
5
|
describe('createAccountId', () => {
|
|
10
6
|
it('normalizes plain username', () => {
|
|
@@ -83,8 +83,10 @@ export function getMessageType(item: Record<string, unknown>): string {
|
|
|
83
83
|
switch (itemType) {
|
|
84
84
|
case 'clip':
|
|
85
85
|
case 'felix_share':
|
|
86
|
-
case 'reel_share':
|
|
87
|
-
|
|
86
|
+
case 'reel_share':
|
|
87
|
+
return 'reel_share'
|
|
88
|
+
default:
|
|
89
|
+
return itemType
|
|
88
90
|
}
|
|
89
91
|
}
|
|
90
92
|
|
|
@@ -28,7 +28,7 @@ function computeXVC(email: string): string {
|
|
|
28
28
|
function buildHeaders(email: string): Record<string, string> {
|
|
29
29
|
return {
|
|
30
30
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
31
|
-
|
|
31
|
+
A: ANDROID_AGENT,
|
|
32
32
|
'User-Agent': ANDROID_USER_AGENT,
|
|
33
33
|
'Accept-Language': 'ko',
|
|
34
34
|
'X-VC': computeXVC(email),
|
|
@@ -112,9 +112,10 @@ export async function attemptLogin(
|
|
|
112
112
|
return {
|
|
113
113
|
authenticated: false,
|
|
114
114
|
error: 'bad_credentials',
|
|
115
|
-
message:
|
|
116
|
-
|
|
117
|
-
|
|
115
|
+
message:
|
|
116
|
+
typeof data.message === 'string'
|
|
117
|
+
? `Login failed: ${data.message}`
|
|
118
|
+
: 'Login failed: incorrect email or password.',
|
|
118
119
|
}
|
|
119
120
|
}
|
|
120
121
|
|
|
@@ -155,7 +156,11 @@ export async function requestPasscode(email: string, password: string, deviceUui
|
|
|
155
156
|
})
|
|
156
157
|
|
|
157
158
|
if (!response.ok) {
|
|
158
|
-
return {
|
|
159
|
+
return {
|
|
160
|
+
authenticated: false,
|
|
161
|
+
error: 'passcode_request_failed',
|
|
162
|
+
message: `HTTP ${response.status} from passcode endpoint`,
|
|
163
|
+
}
|
|
159
164
|
}
|
|
160
165
|
|
|
161
166
|
const data = (await response.json()) as { status?: number; passcode?: string; remainingSeconds?: number }
|
|
@@ -202,7 +207,11 @@ export async function registerDevice(
|
|
|
202
207
|
})
|
|
203
208
|
|
|
204
209
|
if (!response.ok) {
|
|
205
|
-
return {
|
|
210
|
+
return {
|
|
211
|
+
authenticated: false,
|
|
212
|
+
error: 'registration_failed',
|
|
213
|
+
message: `HTTP ${response.status} from register endpoint`,
|
|
214
|
+
}
|
|
206
215
|
}
|
|
207
216
|
|
|
208
217
|
const data = (await response.json()) as {
|
|
@@ -248,7 +257,14 @@ export async function loginFlow(options: {
|
|
|
248
257
|
const forced = options.force ?? false
|
|
249
258
|
|
|
250
259
|
// Step 1: Try login (forced:false for tablet-first safe attempt)
|
|
251
|
-
const loginResult = await attemptLogin(
|
|
260
|
+
const loginResult = await attemptLogin(
|
|
261
|
+
options.email,
|
|
262
|
+
options.password,
|
|
263
|
+
deviceUuid,
|
|
264
|
+
deviceType,
|
|
265
|
+
forced,
|
|
266
|
+
options.debugLog,
|
|
267
|
+
)
|
|
252
268
|
|
|
253
269
|
if (loginResult.authenticated) {
|
|
254
270
|
return loginResult
|
|
@@ -261,7 +277,13 @@ export async function loginFlow(options: {
|
|
|
261
277
|
if (passcodeResult.error) {
|
|
262
278
|
return {
|
|
263
279
|
...passcodeResult,
|
|
264
|
-
credentials: {
|
|
280
|
+
credentials: {
|
|
281
|
+
access_token: '',
|
|
282
|
+
refresh_token: '',
|
|
283
|
+
user_id: '',
|
|
284
|
+
device_uuid: deviceUuid,
|
|
285
|
+
device_type: deviceType,
|
|
286
|
+
},
|
|
265
287
|
}
|
|
266
288
|
}
|
|
267
289
|
|
|
@@ -478,17 +478,23 @@ describe('KakaoTalkClient', () => {
|
|
|
478
478
|
|
|
479
479
|
test('returns profile data on success', async () => {
|
|
480
480
|
mockFetch
|
|
481
|
-
.mockResolvedValueOnce(
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
481
|
+
.mockResolvedValueOnce(
|
|
482
|
+
makeJsonResponse({
|
|
483
|
+
profile: {
|
|
484
|
+
nickName: 'Test User',
|
|
485
|
+
profileImageUrl: 'https://example.com/profile.jpg',
|
|
486
|
+
originalProfileImageUrl: 'https://example.com/original.jpg',
|
|
487
|
+
statusMessage: 'Hello world',
|
|
488
|
+
},
|
|
489
|
+
}),
|
|
490
|
+
)
|
|
489
491
|
.mockResolvedValueOnce(makeJsonResponse({ accountDisplayId: 'testuser123' }))
|
|
490
492
|
|
|
491
|
-
const client = await new KakaoTalkClient().login({
|
|
493
|
+
const client = await new KakaoTalkClient().login({
|
|
494
|
+
oauthToken: 'mytoken',
|
|
495
|
+
userId: 'user42',
|
|
496
|
+
deviceUuid: 'device1',
|
|
497
|
+
})
|
|
492
498
|
const profile = await client.getProfile()
|
|
493
499
|
|
|
494
500
|
expect(profile.user_id).toBe('user42')
|
|
@@ -517,7 +523,11 @@ describe('KakaoTalkClient', () => {
|
|
|
517
523
|
.mockResolvedValueOnce(makeJsonResponse({}, 401))
|
|
518
524
|
.mockResolvedValueOnce(makeJsonResponse({ accountDisplayId: null }))
|
|
519
525
|
|
|
520
|
-
const client = await new KakaoTalkClient().login({
|
|
526
|
+
const client = await new KakaoTalkClient().login({
|
|
527
|
+
oauthToken: 'mytoken',
|
|
528
|
+
userId: 'user42',
|
|
529
|
+
deviceUuid: 'device1',
|
|
530
|
+
})
|
|
521
531
|
try {
|
|
522
532
|
await client.getProfile()
|
|
523
533
|
expect.unreachable('should have thrown')
|
|
@@ -531,17 +541,23 @@ describe('KakaoTalkClient', () => {
|
|
|
531
541
|
|
|
532
542
|
test('returns null account_display_id when more_settings request fails', async () => {
|
|
533
543
|
mockFetch
|
|
534
|
-
.mockResolvedValueOnce(
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
544
|
+
.mockResolvedValueOnce(
|
|
545
|
+
makeJsonResponse({
|
|
546
|
+
profile: {
|
|
547
|
+
nickName: 'Test User',
|
|
548
|
+
profileImageUrl: null,
|
|
549
|
+
originalProfileImageUrl: null,
|
|
550
|
+
statusMessage: null,
|
|
551
|
+
},
|
|
552
|
+
}),
|
|
553
|
+
)
|
|
542
554
|
.mockResolvedValueOnce(makeJsonResponse({}, 500))
|
|
543
555
|
|
|
544
|
-
const client = await new KakaoTalkClient().login({
|
|
556
|
+
const client = await new KakaoTalkClient().login({
|
|
557
|
+
oauthToken: 'mytoken',
|
|
558
|
+
userId: 'user42',
|
|
559
|
+
deviceUuid: 'device1',
|
|
560
|
+
})
|
|
545
561
|
const profile = await client.getProfile()
|
|
546
562
|
|
|
547
563
|
expect(profile.user_id).toBe('user42')
|
|
@@ -582,9 +598,7 @@ describe('KakaoTalkClient', () => {
|
|
|
582
598
|
|
|
583
599
|
test('concurrent calls share a single login', async () => {
|
|
584
600
|
// Make login take some time
|
|
585
|
-
mockLogin.mockImplementation(
|
|
586
|
-
() => new Promise((resolve) => setTimeout(() => resolve(DEFAULT_LOGIN_RESULT), 50)),
|
|
587
|
-
)
|
|
601
|
+
mockLogin.mockImplementation(() => new Promise((resolve) => setTimeout(() => resolve(DEFAULT_LOGIN_RESULT), 50)))
|
|
588
602
|
mockGetChatLogs.mockResolvedValue({
|
|
589
603
|
body: { status: 0, chatLogs: [], eof: true },
|
|
590
604
|
})
|
|
@@ -598,9 +612,7 @@ describe('KakaoTalkClient', () => {
|
|
|
598
612
|
})
|
|
599
613
|
|
|
600
614
|
test('retries login after failure', async () => {
|
|
601
|
-
mockLogin
|
|
602
|
-
.mockRejectedValueOnce(new Error('Connection refused'))
|
|
603
|
-
.mockResolvedValueOnce(DEFAULT_LOGIN_RESULT)
|
|
615
|
+
mockLogin.mockRejectedValueOnce(new Error('Connection refused')).mockResolvedValueOnce(DEFAULT_LOGIN_RESULT)
|
|
604
616
|
|
|
605
617
|
const client = await new KakaoTalkClient().login({ oauthToken: 'token', userId: 'user1', deviceUuid: 'device1' })
|
|
606
618
|
|