agent-messenger 2.6.3 → 2.8.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 -1
- 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.map +1 -1
- 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/discord/commands/auth.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/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/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/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 +19 -15
- 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.map +1 -1
- 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.d.ts +3 -0
- package/dist/src/platforms/webex/markdown-to-html.d.ts.map +1 -0
- package/dist/src/platforms/webex/markdown-to-html.js +161 -0
- package/dist/src/platforms/webex/markdown-to-html.js.map +1 -0
- 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/cli/channeltalk.mdx +24 -22
- package/docs/content/docs/cli/channeltalkbot.mdx +7 -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/webex.mdx +19 -19
- 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 +1 -1
- package/skills/agent-channeltalkbot/SKILL.md +1 -1
- package/skills/agent-discord/SKILL.md +1 -1
- package/skills/agent-discordbot/SKILL.md +1 -1
- 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 +1 -1
- package/skills/agent-slackbot/SKILL.md +1 -1
- package/skills/agent-teams/SKILL.md +1 -1
- package/skills/agent-telegram/SKILL.md +1 -1
- package/skills/agent-webex/SKILL.md +1 -1
- 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 +19 -4
- package/src/platforms/channeltalk/commands/snapshot.ts +5 -1
- 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 +17 -5
- 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/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 +3 -1
- 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/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/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 +39 -12
- package/src/platforms/webex/client.ts +30 -61
- 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 +28 -3
- package/src/platforms/webex/commands/snapshot.ts +3 -3
- 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 +141 -0
- package/src/platforms/webex/markdown-to-html.ts +194 -0
- package/src/platforms/webex/token-extractor.ts +6 -29
- package/src/platforms/wechatbot/cli.ts +0 -0
- 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
|
@@ -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
|
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { Long } from 'bson'
|
|
2
1
|
import { existsSync } from 'node:fs'
|
|
3
2
|
import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises'
|
|
4
3
|
import { homedir } from 'node:os'
|
|
5
4
|
import { join } from 'node:path'
|
|
6
5
|
|
|
6
|
+
import { Long } from 'bson'
|
|
7
|
+
|
|
7
8
|
import { warn } from '@/shared/utils/stderr'
|
|
8
9
|
|
|
9
10
|
import { LANG, PC_OS_NAME, getLocoDeviceConfig } from './protocol/config'
|
|
@@ -312,7 +313,9 @@ export class KakaoTalkClient {
|
|
|
312
313
|
// where a concurrent call already reconnected and replaced this.state.
|
|
313
314
|
if (this.state?.session === state.session) throw error
|
|
314
315
|
|
|
315
|
-
try {
|
|
316
|
+
try {
|
|
317
|
+
state.session.close()
|
|
318
|
+
} catch {}
|
|
316
319
|
this.initPromise = null
|
|
317
320
|
state = await this.ensureSession()
|
|
318
321
|
return operation(state)
|
|
@@ -323,7 +326,13 @@ export class KakaoTalkClient {
|
|
|
323
326
|
const session = new LocoSession()
|
|
324
327
|
try {
|
|
325
328
|
const syncState = await loadSyncState(this.deviceUuid!)
|
|
326
|
-
const loginResult = await session.login(
|
|
329
|
+
const loginResult = await session.login(
|
|
330
|
+
this.oauthToken!,
|
|
331
|
+
this.userId!,
|
|
332
|
+
this.deviceUuid!,
|
|
333
|
+
syncState,
|
|
334
|
+
this.deviceType,
|
|
335
|
+
)
|
|
327
336
|
|
|
328
337
|
const newSyncState = mergeSyncState(syncState, loginResult)
|
|
329
338
|
await saveSyncState(this.deviceUuid!, newSyncState)
|
|
@@ -338,11 +347,7 @@ export class KakaoTalkClient {
|
|
|
338
347
|
return { session, loginResult }
|
|
339
348
|
} catch (error) {
|
|
340
349
|
session.close()
|
|
341
|
-
throw new KakaoTalkError(
|
|
342
|
-
error instanceof Error ? error.message : String(error),
|
|
343
|
-
'login_failed',
|
|
344
|
-
{ cause: error },
|
|
345
|
-
)
|
|
350
|
+
throw new KakaoTalkError(error instanceof Error ? error.message : String(error), 'login_failed', { cause: error })
|
|
346
351
|
}
|
|
347
352
|
}
|
|
348
353
|
|
|
@@ -461,7 +466,10 @@ export class KakaoTalkClient {
|
|
|
461
466
|
for (let page = 0; page < MAX_PAGES; page++) {
|
|
462
467
|
const response = await session.syncMessages(cid, 80, cur, maxLogId)
|
|
463
468
|
const batch = (response.body.chatLogs ?? []) as Array<Record<string, unknown>>
|
|
464
|
-
if (batch.length === 0) {
|
|
469
|
+
if (batch.length === 0) {
|
|
470
|
+
reachedEnd = true
|
|
471
|
+
break
|
|
472
|
+
}
|
|
465
473
|
|
|
466
474
|
for (const log of batch) {
|
|
467
475
|
const lid = longToString(log.logId)
|
|
@@ -473,7 +481,10 @@ export class KakaoTalkClient {
|
|
|
473
481
|
|
|
474
482
|
const maxLog = findMaxLogId(batch, 'logId')
|
|
475
483
|
|
|
476
|
-
if (!maxLog || maxLog.equals(cur) || response.body.isOK) {
|
|
484
|
+
if (!maxLog || maxLog.equals(cur) || response.body.isOK) {
|
|
485
|
+
reachedEnd = true
|
|
486
|
+
break
|
|
487
|
+
}
|
|
477
488
|
cur = maxLog
|
|
478
489
|
}
|
|
479
490
|
if (!reachedEnd) {
|
|
@@ -532,7 +543,7 @@ export class KakaoTalkClient {
|
|
|
532
543
|
throw new KakaoTalkError(`Profile request failed: ${profileRes.status}`, 'profile_request_failed')
|
|
533
544
|
}
|
|
534
545
|
|
|
535
|
-
const profileData = await profileRes.json() as Record<string, unknown>
|
|
546
|
+
const profileData = (await profileRes.json()) as Record<string, unknown>
|
|
536
547
|
const profile = profileData.profile as Record<string, unknown> | undefined
|
|
537
548
|
|
|
538
549
|
let accountDisplayId: string | null = null
|
|
@@ -540,7 +551,7 @@ export class KakaoTalkClient {
|
|
|
540
551
|
let pstnNumber: string | null = null
|
|
541
552
|
let emailVerified: boolean | null = null
|
|
542
553
|
if (settingsRes.ok) {
|
|
543
|
-
const settingsData = await settingsRes.json() as Record<string, unknown>
|
|
554
|
+
const settingsData = (await settingsRes.json()) as Record<string, unknown>
|
|
544
555
|
accountDisplayId = (settingsData.accountDisplayId as string) || null
|
|
545
556
|
accountEmail = (settingsData.accountEmail as string) || null
|
|
546
557
|
pstnNumber = (settingsData.pstnNumber as string) || null
|
|
@@ -2,9 +2,7 @@ import { afterEach, beforeEach, describe, expect, mock, spyOn, test } from 'bun:
|
|
|
2
2
|
|
|
3
3
|
const originalConsoleLog = console.log
|
|
4
4
|
|
|
5
|
-
const mockLoad = mock(() =>
|
|
6
|
-
Promise.resolve({ current_account: null, accounts: {} }),
|
|
7
|
-
)
|
|
5
|
+
const mockLoad = mock(() => Promise.resolve({ current_account: null, accounts: {} }))
|
|
8
6
|
const mockGetAccount = mock(() => Promise.resolve(null))
|
|
9
7
|
const mockListAccounts = mock(() => Promise.resolve([]))
|
|
10
8
|
const mockSetAccount = mock(() => Promise.resolve())
|
|
@@ -48,9 +46,7 @@ describe('auth commands', () => {
|
|
|
48
46
|
mockRemoveAccount.mockReset()
|
|
49
47
|
mockLoadPendingLogin.mockReset()
|
|
50
48
|
|
|
51
|
-
mockLoad.mockImplementation(() =>
|
|
52
|
-
Promise.resolve({ current_account: null, accounts: {} }),
|
|
53
|
-
)
|
|
49
|
+
mockLoad.mockImplementation(() => Promise.resolve({ current_account: null, accounts: {} }))
|
|
54
50
|
mockGetAccount.mockImplementation(() => Promise.resolve(null))
|
|
55
51
|
mockListAccounts.mockImplementation(() => Promise.resolve([]))
|
|
56
52
|
mockSetAccount.mockImplementation(() => Promise.resolve())
|
|
@@ -145,9 +141,7 @@ describe('auth commands', () => {
|
|
|
145
141
|
test('outputs error and exits when account not found', async () => {
|
|
146
142
|
mockGetAccount.mockImplementation(() => Promise.resolve(null))
|
|
147
143
|
|
|
148
|
-
await expect(
|
|
149
|
-
authCommand.parseAsync(['use', 'nonexistent'], { from: 'user' }),
|
|
150
|
-
).rejects.toThrow('process.exit')
|
|
144
|
+
await expect(authCommand.parseAsync(['use', 'nonexistent'], { from: 'user' })).rejects.toThrow('process.exit')
|
|
151
145
|
|
|
152
146
|
expect(processExitSpy).toHaveBeenCalledWith(1)
|
|
153
147
|
const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
|
|
@@ -159,9 +153,7 @@ describe('auth commands', () => {
|
|
|
159
153
|
test('outputs error and exits when no account configured', async () => {
|
|
160
154
|
mockGetAccount.mockImplementation(() => Promise.resolve(null))
|
|
161
155
|
|
|
162
|
-
await expect(
|
|
163
|
-
authCommand.parseAsync(['status'], { from: 'user' }),
|
|
164
|
-
).rejects.toThrow('process.exit')
|
|
156
|
+
await expect(authCommand.parseAsync(['status'], { from: 'user' })).rejects.toThrow('process.exit')
|
|
165
157
|
|
|
166
158
|
expect(processExitSpy).toHaveBeenCalledWith(1)
|
|
167
159
|
const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
|
|
@@ -283,13 +275,9 @@ describe('auth commands', () => {
|
|
|
283
275
|
})
|
|
284
276
|
|
|
285
277
|
test('outputs error and exits when no account configured', async () => {
|
|
286
|
-
mockLoad.mockImplementation(() =>
|
|
287
|
-
Promise.resolve({ current_account: null, accounts: {} }),
|
|
288
|
-
)
|
|
278
|
+
mockLoad.mockImplementation(() => Promise.resolve({ current_account: null, accounts: {} }))
|
|
289
279
|
|
|
290
|
-
await expect(
|
|
291
|
-
authCommand.parseAsync(['logout'], { from: 'user' }),
|
|
292
|
-
).rejects.toThrow('process.exit')
|
|
280
|
+
await expect(authCommand.parseAsync(['logout'], { from: 'user' })).rejects.toThrow('process.exit')
|
|
293
281
|
|
|
294
282
|
expect(processExitSpy).toHaveBeenCalledWith(1)
|
|
295
283
|
const output = JSON.parse(consoleLogSpy.mock.calls[0][0])
|
|
@@ -9,12 +9,7 @@ import { info, error, debug } from '@/shared/utils/stderr'
|
|
|
9
9
|
import { loginFlow } from '../auth/kakao-login'
|
|
10
10
|
import { CredentialManager } from '../credential-manager'
|
|
11
11
|
import { KakaoTokenExtractor } from '../token-extractor'
|
|
12
|
-
import {
|
|
13
|
-
KAKAO_NEXT_ACTIONS,
|
|
14
|
-
type KakaoAuthOptions,
|
|
15
|
-
type KakaoDeviceType,
|
|
16
|
-
type KakaoLoginResult,
|
|
17
|
-
} from '../types'
|
|
12
|
+
import { KAKAO_NEXT_ACTIONS, type KakaoAuthOptions, type KakaoDeviceType, type KakaoLoginResult } from '../types'
|
|
18
13
|
|
|
19
14
|
function isInteractiveSession(): boolean {
|
|
20
15
|
return Boolean(process.stdin.isTTY && process.stdout.isTTY)
|
|
@@ -28,14 +23,13 @@ function hasTTY(): boolean {
|
|
|
28
23
|
const fd = openSync(ttyDevice, 'r')
|
|
29
24
|
closeSync(fd)
|
|
30
25
|
return true
|
|
31
|
-
} catch {
|
|
26
|
+
} catch {
|
|
27
|
+
return false
|
|
28
|
+
}
|
|
32
29
|
}
|
|
33
30
|
|
|
34
31
|
async function promptPasswordGUI(email?: string): Promise<string | undefined> {
|
|
35
32
|
const { execSync } = require('node:child_process') as typeof import('node:child_process')
|
|
36
|
-
const label = email
|
|
37
|
-
? `agent-messenger wants to log in to KakaoTalk as ${email}.\\n\\nEnter your password:`
|
|
38
|
-
: 'agent-messenger wants to log in to KakaoTalk.\\n\\nEnter your password:'
|
|
39
33
|
|
|
40
34
|
if (process.platform === 'darwin') {
|
|
41
35
|
try {
|
|
@@ -43,9 +37,10 @@ async function promptPasswordGUI(email?: string): Promise<string | undefined> {
|
|
|
43
37
|
const { tmpdir } = require('node:os') as typeof import('node:os')
|
|
44
38
|
const { join } = require('node:path') as typeof import('node:path')
|
|
45
39
|
const scriptPath = join(tmpdir(), `kakao-pw-${Date.now()}.swift`)
|
|
46
|
-
const infoText = email ? `Enter password for ${email}` : 'Enter your KakaoTalk password'
|
|
47
40
|
const escapedEmail = (email ?? '').replace(/\\/g, '\\\\').replace(/"/g, '\\"')
|
|
48
|
-
writeFileSync(
|
|
41
|
+
writeFileSync(
|
|
42
|
+
scriptPath,
|
|
43
|
+
`
|
|
49
44
|
import AppKit
|
|
50
45
|
let app = NSApplication.shared
|
|
51
46
|
app.setActivationPolicy(.accessory)
|
|
@@ -88,14 +83,23 @@ if response == .alertFirstButtonReturn {
|
|
|
88
83
|
} else {
|
|
89
84
|
exit(1)
|
|
90
85
|
}
|
|
91
|
-
|
|
86
|
+
`,
|
|
87
|
+
)
|
|
92
88
|
try {
|
|
93
|
-
const result = execSync(`swift ${scriptPath}`, {
|
|
89
|
+
const result = execSync(`swift ${scriptPath}`, {
|
|
90
|
+
encoding: 'utf-8',
|
|
91
|
+
timeout: 120_000,
|
|
92
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
93
|
+
})
|
|
94
94
|
return result.trim() || undefined
|
|
95
95
|
} finally {
|
|
96
|
-
try {
|
|
96
|
+
try {
|
|
97
|
+
unlinkSync(scriptPath)
|
|
98
|
+
} catch {}
|
|
97
99
|
}
|
|
98
|
-
} catch {
|
|
100
|
+
} catch {
|
|
101
|
+
return undefined
|
|
102
|
+
}
|
|
99
103
|
}
|
|
100
104
|
|
|
101
105
|
if (process.platform === 'win32') {
|
|
@@ -118,7 +122,9 @@ if response == .alertFirstButtonReturn {
|
|
|
118
122
|
].join(' ')
|
|
119
123
|
const result = execSync(`powershell -Command "${ps}"`, { encoding: 'utf-8', timeout: 120_000 })
|
|
120
124
|
return result.trim() || undefined
|
|
121
|
-
} catch {
|
|
125
|
+
} catch {
|
|
126
|
+
return undefined
|
|
127
|
+
}
|
|
122
128
|
}
|
|
123
129
|
|
|
124
130
|
if (process.platform === 'linux') {
|
|
@@ -129,14 +135,18 @@ if response == .alertFirstButtonReturn {
|
|
|
129
135
|
{ encoding: 'utf-8', timeout: 120_000 },
|
|
130
136
|
)
|
|
131
137
|
return result.trim() || undefined
|
|
132
|
-
} catch {
|
|
138
|
+
} catch {
|
|
139
|
+
/* zenity not available or cancelled */
|
|
140
|
+
}
|
|
133
141
|
try {
|
|
134
142
|
const result = execSync(
|
|
135
143
|
`kdialog --password "agent-messenger · KakaoTalk\\n${escapedEmail}" --title "KakaoTalk Login" 2>/dev/null`,
|
|
136
144
|
{ encoding: 'utf-8', timeout: 120_000 },
|
|
137
145
|
)
|
|
138
146
|
return result.trim() || undefined
|
|
139
|
-
} catch {
|
|
147
|
+
} catch {
|
|
148
|
+
/* kdialog not available or cancelled */
|
|
149
|
+
}
|
|
140
150
|
}
|
|
141
151
|
|
|
142
152
|
return undefined
|
|
@@ -191,7 +201,9 @@ async function promptHiddenTTY(message: string): Promise<string | undefined> {
|
|
|
191
201
|
stdio: ['inherit', 'pipe', 'inherit'],
|
|
192
202
|
})
|
|
193
203
|
return result.trim() || undefined
|
|
194
|
-
} catch {
|
|
204
|
+
} catch {
|
|
205
|
+
return undefined
|
|
206
|
+
}
|
|
195
207
|
}
|
|
196
208
|
|
|
197
209
|
const { createReadStream } = await import('node:fs')
|
|
@@ -257,16 +269,26 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
|
|
|
257
269
|
password = await promptHidden(passwordPrompt)
|
|
258
270
|
} else if (hasTTY()) {
|
|
259
271
|
info(` One-time setup: password is needed to register this device.`)
|
|
260
|
-
try {
|
|
272
|
+
try {
|
|
273
|
+
password = await promptHiddenTTY(passwordPrompt)
|
|
274
|
+
} catch {
|
|
275
|
+
/* /dev/tty open failed */
|
|
276
|
+
}
|
|
261
277
|
}
|
|
262
278
|
if (!password) {
|
|
263
279
|
password = await promptPasswordGUI(email)
|
|
264
280
|
}
|
|
265
281
|
if (!password) {
|
|
266
|
-
console.log(
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
282
|
+
console.log(
|
|
283
|
+
formatOutput(
|
|
284
|
+
{
|
|
285
|
+
next_action: 'run_interactive',
|
|
286
|
+
message:
|
|
287
|
+
'One-time device registration required. Run `agent-kakaotalk auth login` in a terminal so the user can enter their password securely.',
|
|
288
|
+
},
|
|
289
|
+
options.pretty,
|
|
290
|
+
),
|
|
291
|
+
)
|
|
270
292
|
return
|
|
271
293
|
}
|
|
272
294
|
}
|
|
@@ -279,7 +301,10 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
|
|
|
279
301
|
return
|
|
280
302
|
}
|
|
281
303
|
email = await promptText('KakaoTalk email')
|
|
282
|
-
if (!email) {
|
|
304
|
+
if (!email) {
|
|
305
|
+
error('Email is required.')
|
|
306
|
+
process.exit(1)
|
|
307
|
+
}
|
|
283
308
|
}
|
|
284
309
|
|
|
285
310
|
if (!password) {
|
|
@@ -288,7 +313,10 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
|
|
|
288
313
|
return
|
|
289
314
|
}
|
|
290
315
|
password = await promptHidden('Password')
|
|
291
|
-
if (!password) {
|
|
316
|
+
if (!password) {
|
|
317
|
+
error('Password is required.')
|
|
318
|
+
process.exit(1)
|
|
319
|
+
}
|
|
292
320
|
}
|
|
293
321
|
|
|
294
322
|
const existing = await credManager.getAccount()
|
|
@@ -319,10 +347,15 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
|
|
|
319
347
|
|
|
320
348
|
if (result.next_action === 'choose_device') {
|
|
321
349
|
if (!interactive) {
|
|
322
|
-
console.log(
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
350
|
+
console.log(
|
|
351
|
+
formatOutput(
|
|
352
|
+
{
|
|
353
|
+
...KAKAO_NEXT_ACTIONS.choose_device,
|
|
354
|
+
warning: result.warning,
|
|
355
|
+
},
|
|
356
|
+
options.pretty,
|
|
357
|
+
),
|
|
358
|
+
)
|
|
326
359
|
return
|
|
327
360
|
}
|
|
328
361
|
|
|
@@ -336,7 +369,10 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
|
|
|
336
369
|
console.log('')
|
|
337
370
|
|
|
338
371
|
const choice = await promptText('Choice (1/2/3)')
|
|
339
|
-
if (choice !== '1' && choice !== '2') {
|
|
372
|
+
if (choice !== '1' && choice !== '2') {
|
|
373
|
+
console.log('Cancelled.')
|
|
374
|
+
return
|
|
375
|
+
}
|
|
340
376
|
|
|
341
377
|
const chosenType: KakaoDeviceType = choice === '1' ? 'pc' : 'tablet'
|
|
342
378
|
const forceResult = await loginFlow({
|
|
@@ -359,7 +395,15 @@ async function loginAction(options: KakaoAuthOptions): Promise<void> {
|
|
|
359
395
|
}
|
|
360
396
|
|
|
361
397
|
async function handleLoginResult(
|
|
362
|
-
result: KakaoLoginResult & {
|
|
398
|
+
result: KakaoLoginResult & {
|
|
399
|
+
credentials?: {
|
|
400
|
+
access_token: string
|
|
401
|
+
refresh_token: string
|
|
402
|
+
user_id: string
|
|
403
|
+
device_uuid: string
|
|
404
|
+
device_type: KakaoDeviceType
|
|
405
|
+
}
|
|
406
|
+
},
|
|
363
407
|
credManager: CredentialManager,
|
|
364
408
|
options: KakaoAuthOptions,
|
|
365
409
|
): Promise<void> {
|
|
@@ -379,11 +423,16 @@ async function handleLoginResult(
|
|
|
379
423
|
await credManager.setCurrentAccount(result.credentials.user_id || 'default')
|
|
380
424
|
await credManager.clearPendingLogin()
|
|
381
425
|
|
|
382
|
-
console.log(
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
426
|
+
console.log(
|
|
427
|
+
formatOutput(
|
|
428
|
+
{
|
|
429
|
+
authenticated: true,
|
|
430
|
+
account_id: result.credentials.user_id,
|
|
431
|
+
device_type: result.credentials.device_type,
|
|
432
|
+
},
|
|
433
|
+
options.pretty,
|
|
434
|
+
),
|
|
435
|
+
)
|
|
387
436
|
} else {
|
|
388
437
|
console.log(formatOutput(result, options.pretty))
|
|
389
438
|
if (result.error) process.exit(1)
|
|
@@ -444,15 +493,20 @@ async function statusAction(options: { account?: string; pretty?: boolean }): Pr
|
|
|
444
493
|
process.exit(1)
|
|
445
494
|
}
|
|
446
495
|
|
|
447
|
-
console.log(
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
496
|
+
console.log(
|
|
497
|
+
formatOutput(
|
|
498
|
+
{
|
|
499
|
+
account_id: account.account_id,
|
|
500
|
+
user_id: account.user_id,
|
|
501
|
+
device_type: account.device_type,
|
|
502
|
+
has_refresh_token: !!account.refresh_token,
|
|
503
|
+
has_device_uuid: !!account.device_uuid,
|
|
504
|
+
created_at: account.created_at,
|
|
505
|
+
updated_at: account.updated_at,
|
|
506
|
+
},
|
|
507
|
+
options.pretty,
|
|
508
|
+
),
|
|
509
|
+
)
|
|
456
510
|
} catch (error) {
|
|
457
511
|
handleError(error as Error)
|
|
458
512
|
}
|
|
@@ -2,11 +2,9 @@ import { afterEach, beforeEach, describe, expect, mock, test } from 'bun:test'
|
|
|
2
2
|
|
|
3
3
|
const originalConsoleLog = console.log
|
|
4
4
|
|
|
5
|
-
const mockWithKakaoClient = mock(
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
},
|
|
9
|
-
)
|
|
5
|
+
const mockWithKakaoClient = mock(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
|
|
6
|
+
return fn(mockClient)
|
|
7
|
+
})
|
|
10
8
|
|
|
11
9
|
const mockGetChats = mock(() =>
|
|
12
10
|
Promise.resolve([
|
|
@@ -32,11 +30,9 @@ describe('chat commands', () => {
|
|
|
32
30
|
mockWithKakaoClient.mockReset()
|
|
33
31
|
mockGetChats.mockReset()
|
|
34
32
|
|
|
35
|
-
mockWithKakaoClient.mockImplementation(
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
},
|
|
39
|
-
)
|
|
33
|
+
mockWithKakaoClient.mockImplementation(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
|
|
34
|
+
return fn(mockClient)
|
|
35
|
+
})
|
|
40
36
|
mockGetChats.mockImplementation(() =>
|
|
41
37
|
Promise.resolve([
|
|
42
38
|
{ chat_id: 'chat-1', name: 'General', type: 'group', member_count: 5 },
|
|
@@ -44,7 +40,8 @@ describe('chat commands', () => {
|
|
|
44
40
|
]),
|
|
45
41
|
)
|
|
46
42
|
|
|
47
|
-
consoleLogSpy = mock((..._args: unknown[]) => {})
|
|
43
|
+
consoleLogSpy = mock((..._args: unknown[]) => {})
|
|
44
|
+
console.log = consoleLogSpy
|
|
48
45
|
})
|
|
49
46
|
|
|
50
47
|
afterEach(() => {
|