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,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(() => {
|
|
@@ -2,21 +2,15 @@ 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 mockGetMessages = mock(() =>
|
|
12
|
-
Promise.resolve([
|
|
13
|
-
{ log_id: '1', message: 'Hello', sender_id: 'user-1', created_at: 1000 },
|
|
14
|
-
]),
|
|
10
|
+
Promise.resolve([{ log_id: '1', message: 'Hello', sender_id: 'user-1', created_at: 1000 }]),
|
|
15
11
|
)
|
|
16
12
|
|
|
17
|
-
const mockSendMessage = mock(() =>
|
|
18
|
-
Promise.resolve({ log_id: '2', message: 'Hi there', created_at: 2000 }),
|
|
19
|
-
)
|
|
13
|
+
const mockSendMessage = mock(() => Promise.resolve({ log_id: '2', message: 'Hi there', created_at: 2000 }))
|
|
20
14
|
|
|
21
15
|
const mockClient = {
|
|
22
16
|
getMessages: mockGetMessages,
|
|
@@ -37,21 +31,16 @@ describe('message commands', () => {
|
|
|
37
31
|
mockGetMessages.mockReset()
|
|
38
32
|
mockSendMessage.mockReset()
|
|
39
33
|
|
|
40
|
-
mockWithKakaoClient.mockImplementation(
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
},
|
|
44
|
-
)
|
|
34
|
+
mockWithKakaoClient.mockImplementation(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
|
|
35
|
+
return fn(mockClient)
|
|
36
|
+
})
|
|
45
37
|
mockGetMessages.mockImplementation(() =>
|
|
46
|
-
Promise.resolve([
|
|
47
|
-
{ log_id: '1', message: 'Hello', sender_id: 'user-1', created_at: 1000 },
|
|
48
|
-
]),
|
|
49
|
-
)
|
|
50
|
-
mockSendMessage.mockImplementation(() =>
|
|
51
|
-
Promise.resolve({ log_id: '2', message: 'Hi there', created_at: 2000 }),
|
|
38
|
+
Promise.resolve([{ log_id: '1', message: 'Hello', sender_id: 'user-1', created_at: 1000 }]),
|
|
52
39
|
)
|
|
40
|
+
mockSendMessage.mockImplementation(() => Promise.resolve({ log_id: '2', message: 'Hi there', created_at: 2000 }))
|
|
53
41
|
|
|
54
|
-
consoleLogSpy = mock((..._args: unknown[]) => {})
|
|
42
|
+
consoleLogSpy = mock((..._args: unknown[]) => {})
|
|
43
|
+
console.log = consoleLogSpy
|
|
55
44
|
})
|
|
56
45
|
|
|
57
46
|
afterEach(() => {
|
|
@@ -82,7 +71,9 @@ describe('message commands', () => {
|
|
|
82
71
|
})
|
|
83
72
|
|
|
84
73
|
test('passes account option to withKakaoClient', async () => {
|
|
85
|
-
await messageCommand.parseAsync(['list', 'chat-123', '--count', '20', '--account', 'my-account'], {
|
|
74
|
+
await messageCommand.parseAsync(['list', 'chat-123', '--count', '20', '--account', 'my-account'], {
|
|
75
|
+
from: 'user',
|
|
76
|
+
})
|
|
86
77
|
|
|
87
78
|
expect(mockWithKakaoClient).toHaveBeenCalledWith(
|
|
88
79
|
expect.objectContaining({ account: 'my-account' }),
|
|
@@ -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 mockGetProfile = mock(() =>
|
|
12
10
|
Promise.resolve({
|
|
@@ -42,11 +40,9 @@ describe('whoami command', () => {
|
|
|
42
40
|
mockWithKakaoClient.mockReset()
|
|
43
41
|
mockGetProfile.mockReset()
|
|
44
42
|
|
|
45
|
-
mockWithKakaoClient.mockImplementation(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
},
|
|
49
|
-
)
|
|
43
|
+
mockWithKakaoClient.mockImplementation(async (_options: unknown, fn: (client: unknown) => Promise<unknown>) => {
|
|
44
|
+
return fn(mockClient)
|
|
45
|
+
})
|
|
50
46
|
mockGetProfile.mockImplementation(() =>
|
|
51
47
|
Promise.resolve({
|
|
52
48
|
user_id: 'user-1',
|
|
@@ -8,10 +8,7 @@ import type { KakaoAccountCredentials } from './types'
|
|
|
8
8
|
const testDirs: string[] = []
|
|
9
9
|
|
|
10
10
|
function setup(): KakaoCredentialManager {
|
|
11
|
-
const testConfigDir = join(
|
|
12
|
-
import.meta.dir,
|
|
13
|
-
`.test-kakao-config-${Date.now()}-${Math.random().toString(36).slice(2)}`,
|
|
14
|
-
)
|
|
11
|
+
const testConfigDir = join(import.meta.dir, `.test-kakao-config-${Date.now()}-${Math.random().toString(36).slice(2)}`)
|
|
15
12
|
testDirs.push(testConfigDir)
|
|
16
13
|
return new KakaoCredentialManager(testConfigDir)
|
|
17
14
|
}
|
|
@@ -21,6 +21,7 @@ class MockLocoSession {
|
|
|
21
21
|
close = mockSessionClose
|
|
22
22
|
|
|
23
23
|
constructor() {
|
|
24
|
+
// oxlint-disable-next-line typescript-eslint/no-this-alias
|
|
24
25
|
mockSessionInstance = this
|
|
25
26
|
}
|
|
26
27
|
|
|
@@ -45,7 +46,12 @@ mock.module('./protocol/session', () => ({ LocoSession: MockLocoSession }))
|
|
|
45
46
|
|
|
46
47
|
function createMockClient(overrides: Record<string, unknown> = {}) {
|
|
47
48
|
return {
|
|
48
|
-
getCredentials: mock(() => ({
|
|
49
|
+
getCredentials: mock(() => ({
|
|
50
|
+
oauthToken: 'token',
|
|
51
|
+
userId: 'user1',
|
|
52
|
+
deviceUuid: 'device1',
|
|
53
|
+
deviceType: 'tablet' as const,
|
|
54
|
+
})),
|
|
49
55
|
...overrides,
|
|
50
56
|
} as any
|
|
51
57
|
}
|
|
@@ -15,7 +15,10 @@ export class LocoConnection {
|
|
|
15
15
|
private buffer = Buffer.alloc(0)
|
|
16
16
|
private decryptedBuffer = Buffer.alloc(0)
|
|
17
17
|
private packetIdCounter = 0
|
|
18
|
-
private pendingResolvers = new Map<
|
|
18
|
+
private pendingResolvers = new Map<
|
|
19
|
+
number,
|
|
20
|
+
{ resolve: (packet: LocoPacket) => void; timer: ReturnType<typeof setTimeout> }
|
|
21
|
+
>()
|
|
19
22
|
private timedOutIds = new Set<number>()
|
|
20
23
|
private pushHandler: ((packet: LocoPacket) => void) | null = null
|
|
21
24
|
private closeHandler: (() => void) | null = null
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { constants, createCipheriv, createDecipheriv, createPublicKey, publicEncrypt, randomBytes } from 'node:crypto'
|
|
2
2
|
|
|
3
|
+
import { LOCO_RSA_PUBLIC_KEY_DER_B64 } from './config'
|
|
3
4
|
import {
|
|
4
5
|
GCM_NONCE_SIZE,
|
|
5
6
|
GCM_TAG_SIZE,
|
|
@@ -7,7 +8,6 @@ import {
|
|
|
7
8
|
HANDSHAKE_KEY_ENCRYPT_TYPE,
|
|
8
9
|
HANDSHAKE_KEY_SIZE,
|
|
9
10
|
} from './types'
|
|
10
|
-
import { LOCO_RSA_PUBLIC_KEY_DER_B64 } from './config'
|
|
11
11
|
|
|
12
12
|
export class LocoCrypto {
|
|
13
13
|
private aesKey: Buffer
|