agent-messenger 2.10.1 → 2.10.2
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/dist/package.json +1 -1
- package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
- package/dist/src/platforms/teams/token-extractor.js +9 -2
- package/dist/src/platforms/teams/token-extractor.js.map +1 -1
- package/dist/src/shared/chromium/decryptor.d.ts +6 -0
- package/dist/src/shared/chromium/decryptor.d.ts.map +1 -1
- package/dist/src/shared/chromium/decryptor.js +26 -6
- package/dist/src/shared/chromium/decryptor.js.map +1 -1
- package/e2e/channeltalk.e2e.test.ts +13 -13
- package/e2e/channeltalkbot.e2e.test.ts +13 -13
- package/e2e/discord.e2e.test.ts +24 -24
- package/e2e/discordbot.e2e.test.ts +16 -16
- package/e2e/instagram.e2e.test.ts +10 -10
- package/e2e/kakaotalk.e2e.test.ts +7 -7
- package/e2e/line.e2e.test.ts +8 -8
- package/e2e/slack.e2e.test.ts +34 -34
- package/e2e/slackbot.e2e.test.ts +14 -14
- package/e2e/teams.e2e.test.ts +23 -23
- package/e2e/telegram.e2e.test.ts +8 -8
- package/e2e/webex.e2e.test.ts +14 -14
- package/e2e/whatsapp.e2e.test.ts +8 -8
- package/e2e/whatsappbot.e2e.test.ts +6 -6
- package/package.json +1 -1
- 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 +26 -26
- package/src/platforms/channeltalk/commands/auth.test.ts +16 -16
- package/src/platforms/channeltalk/commands/bot.test.ts +2 -2
- package/src/platforms/channeltalk/commands/chat.test.ts +3 -3
- package/src/platforms/channeltalk/commands/group.test.ts +4 -4
- package/src/platforms/channeltalk/commands/manager.test.ts +2 -2
- package/src/platforms/channeltalk/commands/message.test.ts +17 -17
- package/src/platforms/channeltalk/commands/snapshot.test.ts +7 -7
- package/src/platforms/channeltalk/commands/whoami.test.ts +3 -3
- package/src/platforms/channeltalk/credential-manager.test.ts +18 -18
- package/src/platforms/channeltalk/ensure-auth.test.ts +5 -5
- package/src/platforms/channeltalk/index.test.ts +23 -23
- package/src/platforms/channeltalk/token-extractor.test.ts +21 -21
- package/src/platforms/channeltalk/types.test.ts +12 -12
- package/src/platforms/channeltalkbot/client.test.ts +14 -14
- package/src/platforms/channeltalkbot/commands/auth.test.ts +16 -16
- package/src/platforms/channeltalkbot/commands/bot.test.ts +6 -6
- package/src/platforms/channeltalkbot/commands/chat.test.ts +9 -9
- package/src/platforms/channeltalkbot/commands/group.test.ts +6 -6
- package/src/platforms/channeltalkbot/commands/manager.test.ts +3 -3
- package/src/platforms/channeltalkbot/commands/message.test.ts +10 -10
- package/src/platforms/channeltalkbot/commands/snapshot.test.ts +7 -7
- package/src/platforms/channeltalkbot/commands/whoami.test.ts +4 -4
- package/src/platforms/channeltalkbot/credential-manager.test.ts +27 -27
- package/src/platforms/channeltalkbot/index.test.ts +15 -15
- package/src/platforms/discord/client.test.ts +28 -28
- package/src/platforms/discord/commands/auth.test.ts +7 -7
- package/src/platforms/discord/commands/channel.test.ts +7 -7
- package/src/platforms/discord/commands/dm.test.ts +4 -4
- package/src/platforms/discord/commands/file.test.ts +4 -4
- package/src/platforms/discord/commands/friend.test.ts +6 -6
- package/src/platforms/discord/commands/member.test.ts +5 -5
- package/src/platforms/discord/commands/mention.test.ts +5 -5
- package/src/platforms/discord/commands/message.test.ts +9 -9
- package/src/platforms/discord/commands/note.test.ts +6 -6
- package/src/platforms/discord/commands/profile.test.ts +4 -4
- package/src/platforms/discord/commands/reaction.test.ts +5 -5
- package/src/platforms/discord/commands/server.test.ts +7 -7
- package/src/platforms/discord/commands/snapshot.test.ts +6 -6
- package/src/platforms/discord/commands/thread.test.ts +6 -6
- package/src/platforms/discord/commands/user.test.ts +5 -5
- package/src/platforms/discord/commands/whoami.test.ts +6 -6
- package/src/platforms/discord/credential-manager.test.ts +16 -16
- package/src/platforms/discord/ensure-auth.test.ts +8 -8
- package/src/platforms/discord/index.test.ts +17 -17
- package/src/platforms/discord/listener.test.ts +33 -33
- package/src/platforms/discord/token-extractor.test.ts +53 -53
- package/src/platforms/discord/types.test.ts +26 -26
- package/src/platforms/discordbot/client.test.ts +31 -31
- package/src/platforms/discordbot/commands/auth.test.ts +18 -18
- package/src/platforms/discordbot/commands/channel.test.ts +11 -11
- package/src/platforms/discordbot/commands/file.test.ts +7 -7
- package/src/platforms/discordbot/commands/message.test.ts +25 -25
- package/src/platforms/discordbot/commands/reaction.test.ts +6 -6
- package/src/platforms/discordbot/commands/server.test.ts +12 -12
- package/src/platforms/discordbot/commands/snapshot.test.ts +13 -13
- package/src/platforms/discordbot/commands/thread.test.ts +10 -10
- package/src/platforms/discordbot/commands/user.test.ts +9 -9
- package/src/platforms/discordbot/commands/whoami.test.ts +4 -4
- package/src/platforms/discordbot/credential-manager.test.ts +28 -28
- package/src/platforms/instagram/client.test.ts +18 -18
- package/src/platforms/instagram/commands/auth.test.ts +11 -11
- package/src/platforms/instagram/commands/chat.test.ts +6 -6
- package/src/platforms/instagram/commands/message.test.ts +11 -11
- package/src/platforms/instagram/commands/shared.test.ts +12 -12
- package/src/platforms/instagram/commands/whoami.test.ts +3 -3
- package/src/platforms/instagram/credential-manager.test.ts +21 -21
- package/src/platforms/instagram/ensure-auth.test.ts +4 -4
- package/src/platforms/instagram/index.test.ts +9 -9
- package/src/platforms/instagram/listener.test.ts +8 -8
- package/src/platforms/instagram/token-extractor.test.ts +35 -35
- package/src/platforms/kakaotalk/client.test.ts +33 -33
- package/src/platforms/kakaotalk/commands/auth.test.ts +11 -11
- package/src/platforms/kakaotalk/commands/chat.test.ts +6 -6
- package/src/platforms/kakaotalk/commands/message.test.ts +7 -7
- package/src/platforms/kakaotalk/commands/whoami.test.ts +5 -5
- package/src/platforms/kakaotalk/credential-manager.test.ts +15 -15
- package/src/platforms/kakaotalk/index.test.ts +15 -15
- package/src/platforms/kakaotalk/listener.test.ts +17 -17
- package/src/platforms/line/client.test.ts +17 -17
- package/src/platforms/line/commands/auth.test.ts +8 -8
- package/src/platforms/line/commands/chat.test.ts +7 -7
- package/src/platforms/line/commands/friend.test.ts +6 -6
- package/src/platforms/line/commands/message.test.ts +7 -7
- package/src/platforms/line/commands/whoami.test.ts +6 -6
- package/src/platforms/line/credential-manager.test.ts +17 -17
- package/src/platforms/line/index.test.ts +10 -10
- package/src/platforms/line/listener.test.ts +15 -15
- package/src/platforms/line/types.test.ts +14 -14
- package/src/platforms/slack/cli.test.ts +8 -8
- package/src/platforms/slack/client.test.ts +151 -151
- package/src/platforms/slack/commands/activity.test.ts +13 -13
- package/src/platforms/slack/commands/auth.test.ts +34 -34
- package/src/platforms/slack/commands/bookmark.test.ts +9 -9
- package/src/platforms/slack/commands/channel.test.ts +17 -17
- package/src/platforms/slack/commands/drafts.test.ts +7 -7
- package/src/platforms/slack/commands/emoji.test.ts +3 -3
- package/src/platforms/slack/commands/file.test.ts +12 -12
- package/src/platforms/slack/commands/message.test.ts +19 -19
- package/src/platforms/slack/commands/pin.test.ts +7 -7
- package/src/platforms/slack/commands/reaction.test.ts +10 -10
- package/src/platforms/slack/commands/reminder.test.ts +9 -9
- package/src/platforms/slack/commands/saved.test.ts +7 -7
- package/src/platforms/slack/commands/sections.test.ts +5 -5
- package/src/platforms/slack/commands/snapshot.test.ts +13 -13
- package/src/platforms/slack/commands/unread.test.ts +6 -6
- package/src/platforms/slack/commands/user.test.ts +10 -10
- package/src/platforms/slack/commands/usergroup.test.ts +15 -15
- package/src/platforms/slack/commands/whoami.test.ts +6 -6
- package/src/platforms/slack/commands/workspace.test.ts +26 -26
- package/src/platforms/slack/credential-manager.test.ts +14 -14
- package/src/platforms/slack/ensure-auth.test.ts +21 -21
- package/src/platforms/slack/index.test.ts +12 -12
- package/src/platforms/slack/listener.test.ts +17 -17
- package/src/platforms/slack/token-extractor-node.test.ts +2 -2
- package/src/platforms/slack/token-extractor.test.ts +37 -37
- package/src/platforms/slack/types.test.ts +21 -21
- package/src/platforms/slackbot/client.test.ts +22 -22
- package/src/platforms/slackbot/commands/auth.test.ts +14 -14
- package/src/platforms/slackbot/commands/channel.test.ts +7 -7
- package/src/platforms/slackbot/commands/message.test.ts +13 -13
- package/src/platforms/slackbot/commands/reaction.test.ts +6 -6
- package/src/platforms/slackbot/commands/user.test.ts +7 -7
- package/src/platforms/slackbot/commands/whoami.test.ts +4 -4
- package/src/platforms/slackbot/credential-manager.test.ts +22 -22
- package/src/platforms/slackbot/types.test.ts +7 -7
- package/src/platforms/teams/client.test.ts +30 -30
- package/src/platforms/teams/commands/auth.test.ts +8 -8
- package/src/platforms/teams/commands/channel.test.ts +7 -7
- package/src/platforms/teams/commands/file.test.ts +4 -4
- package/src/platforms/teams/commands/message.test.ts +5 -5
- package/src/platforms/teams/commands/reaction.test.ts +4 -4
- package/src/platforms/teams/commands/snapshot.test.ts +7 -7
- package/src/platforms/teams/commands/team.test.ts +8 -8
- package/src/platforms/teams/commands/user.test.ts +4 -4
- package/src/platforms/teams/commands/whoami.test.ts +6 -6
- package/src/platforms/teams/credential-manager.test.ts +17 -17
- package/src/platforms/teams/ensure-auth.test.ts +13 -13
- package/src/platforms/teams/index.test.ts +15 -15
- package/src/platforms/teams/token-extractor.test.ts +109 -49
- package/src/platforms/teams/token-extractor.ts +7 -2
- package/src/platforms/teams/types.test.ts +26 -26
- package/src/platforms/telegram/app-config.test.ts +4 -4
- package/src/platforms/telegram/chat-utils.test.ts +12 -12
- package/src/platforms/telegram/client.test.ts +4 -4
- package/src/platforms/telegram/commands/auth.test.ts +16 -16
- package/src/platforms/telegram/commands/chat.test.ts +9 -9
- package/src/platforms/telegram/commands/message.test.ts +6 -6
- package/src/platforms/telegram/commands/shared.test.ts +3 -3
- package/src/platforms/telegram/commands/whoami.test.ts +3 -3
- package/src/platforms/telegram/credential-manager.test.ts +10 -10
- package/src/platforms/telegram/types.test.ts +6 -6
- package/src/platforms/webex/app-config.test.ts +8 -8
- package/src/platforms/webex/cli.test.ts +5 -5
- package/src/platforms/webex/client.test.ts +65 -65
- package/src/platforms/webex/commands/auth.test.ts +18 -18
- package/src/platforms/webex/commands/member.test.ts +5 -5
- package/src/platforms/webex/commands/message.test.ts +12 -12
- package/src/platforms/webex/commands/snapshot.test.ts +5 -5
- package/src/platforms/webex/commands/space.test.ts +10 -10
- package/src/platforms/webex/commands/whoami.test.ts +6 -6
- package/src/platforms/webex/credential-manager.test.ts +22 -22
- package/src/platforms/webex/encryption.test.ts +4 -4
- package/src/platforms/webex/ensure-auth.test.ts +5 -5
- package/src/platforms/webex/index.test.ts +5 -5
- package/src/platforms/webex/markdown-to-html.test.ts +33 -33
- package/src/platforms/webex/token-extractor.test.ts +23 -23
- package/src/platforms/webex/types.test.ts +27 -27
- package/src/platforms/wechatbot/client.test.ts +27 -27
- package/src/platforms/wechatbot/commands/auth.test.ts +15 -15
- package/src/platforms/wechatbot/commands/message.test.ts +8 -8
- package/src/platforms/wechatbot/commands/template.test.ts +9 -9
- package/src/platforms/wechatbot/commands/user.test.ts +7 -7
- package/src/platforms/wechatbot/commands/whoami.test.ts +5 -5
- package/src/platforms/wechatbot/credential-manager.test.ts +18 -18
- package/src/platforms/wechatbot/index.test.ts +10 -10
- package/src/platforms/wechatbot/types.test.ts +25 -25
- package/src/platforms/whatsapp/commands/auth.test.ts +13 -13
- package/src/platforms/whatsapp/commands/chat.test.ts +8 -8
- package/src/platforms/whatsapp/commands/message.test.ts +10 -10
- package/src/platforms/whatsapp/commands/whoami.test.ts +3 -3
- package/src/platforms/whatsapp/credential-manager.test.ts +23 -23
- package/src/platforms/whatsapp/ensure-auth.test.ts +4 -4
- package/src/platforms/whatsapp/index.test.ts +8 -8
- package/src/platforms/whatsapp/types.test.ts +42 -42
- package/src/platforms/whatsappbot/client.test.ts +27 -27
- package/src/platforms/whatsappbot/commands/auth.test.ts +14 -14
- package/src/platforms/whatsappbot/commands/message.test.ts +16 -16
- package/src/platforms/whatsappbot/commands/template.test.ts +9 -9
- package/src/platforms/whatsappbot/commands/whoami.test.ts +5 -5
- package/src/platforms/whatsappbot/credential-manager.test.ts +18 -18
- package/src/platforms/whatsappbot/index.test.ts +7 -7
- package/src/platforms/whatsappbot/types.test.ts +18 -18
- package/src/shared/chromium/browsers.test.ts +22 -22
- package/src/shared/chromium/cookie-reader.test.ts +13 -13
- package/src/shared/chromium/decryptor.test.ts +97 -32
- package/src/shared/chromium/decryptor.ts +27 -6
- package/src/shared/utils/concurrency.test.ts +6 -6
- package/src/shared/utils/derived-key-cache.test.ts +11 -11
- package/src/tui/utils.test.ts +31 -31
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect,
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
import { ChannelClient } from './client'
|
|
4
4
|
import { ChannelError } from './types'
|
|
@@ -51,7 +51,7 @@ describe('ChannelClient', () => {
|
|
|
51
51
|
const getJsonBody = (callIndex = 0) =>
|
|
52
52
|
JSON.parse(String(fetchCalls[callIndex]?.options?.body)) as Record<string, unknown>
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
it('login() requires account cookie', async () => {
|
|
55
55
|
await expect(new ChannelClient().login({ accountCookie: '' })).rejects.toThrow(ChannelError)
|
|
56
56
|
await expect(new ChannelClient().login({ accountCookie: '', sessionCookie: 'session-cookie' })).rejects.toThrow(
|
|
57
57
|
ChannelError,
|
|
@@ -62,7 +62,7 @@ describe('ChannelClient', () => {
|
|
|
62
62
|
expect(client2).toBeInstanceOf(ChannelClient)
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
it('successful GET request returns unwrapped JSON', async () => {
|
|
66
66
|
mockResponse({
|
|
67
67
|
account: {
|
|
68
68
|
id: 'acc-1',
|
|
@@ -82,7 +82,7 @@ describe('ChannelClient', () => {
|
|
|
82
82
|
expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/account')
|
|
83
83
|
})
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
it('cookie auth headers are set on every request', async () => {
|
|
86
86
|
mockResponse({
|
|
87
87
|
account: {
|
|
88
88
|
id: 'acc-1',
|
|
@@ -108,7 +108,7 @@ describe('ChannelClient', () => {
|
|
|
108
108
|
}
|
|
109
109
|
})
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
it('429 response triggers retry with Retry-After wait', async () => {
|
|
112
112
|
mockResponse({ errors: [{ message: 'Rate limited' }] }, 429, { 'Retry-After': '0.05' })
|
|
113
113
|
mockResponse({
|
|
114
114
|
account: {
|
|
@@ -132,7 +132,7 @@ describe('ChannelClient', () => {
|
|
|
132
132
|
expect(elapsed).toBeGreaterThanOrEqual(40)
|
|
133
133
|
})
|
|
134
134
|
|
|
135
|
-
|
|
135
|
+
it('500 response triggers retry with exponential backoff for GET requests', async () => {
|
|
136
136
|
mockResponse({ errors: [{ message: 'Server error' }] }, 500)
|
|
137
137
|
mockResponse({ errors: [{ message: 'Server error' }] }, 500)
|
|
138
138
|
mockResponse({
|
|
@@ -157,7 +157,7 @@ describe('ChannelClient', () => {
|
|
|
157
157
|
expect(elapsed).toBeGreaterThanOrEqual(280)
|
|
158
158
|
})
|
|
159
159
|
|
|
160
|
-
|
|
160
|
+
it('4xx non-429 throws immediately without retry', async () => {
|
|
161
161
|
mockResponse({ type: 'forbidden', errors: [{ message: 'Forbidden' }] }, 403)
|
|
162
162
|
|
|
163
163
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -165,7 +165,7 @@ describe('ChannelClient', () => {
|
|
|
165
165
|
expect(fetchCalls).toHaveLength(1)
|
|
166
166
|
})
|
|
167
167
|
|
|
168
|
-
|
|
168
|
+
it('network error retries then throws ChannelError with code network_error', async () => {
|
|
169
169
|
;(globalThis as Record<string, unknown>).fetch = async (
|
|
170
170
|
url: string | URL | Request,
|
|
171
171
|
options?: RequestInit,
|
|
@@ -186,7 +186,7 @@ describe('ChannelClient', () => {
|
|
|
186
186
|
}
|
|
187
187
|
})
|
|
188
188
|
|
|
189
|
-
|
|
189
|
+
it('204 response returns undefined', async () => {
|
|
190
190
|
mockResponse(null, 204)
|
|
191
191
|
|
|
192
192
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -197,7 +197,7 @@ describe('ChannelClient', () => {
|
|
|
197
197
|
expect(result).toBeUndefined()
|
|
198
198
|
})
|
|
199
199
|
|
|
200
|
-
|
|
200
|
+
it('wrapTextInBlocks returns a single text block and extractText joins block and plain text', () => {
|
|
201
201
|
expect(ChannelClient.wrapTextInBlocks('Hello world')).toEqual([{ type: 'text', value: 'Hello world' }])
|
|
202
202
|
|
|
203
203
|
expect(
|
|
@@ -212,7 +212,7 @@ describe('ChannelClient', () => {
|
|
|
212
212
|
).toBe('hello\nworld\nfallback')
|
|
213
213
|
})
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
it('listChannels includes query params', async () => {
|
|
216
216
|
mockResponse({ channels: [{ id: 'ch-1', name: 'Support' }] })
|
|
217
217
|
|
|
218
218
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -222,7 +222,7 @@ describe('ChannelClient', () => {
|
|
|
222
222
|
expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels?limit=500')
|
|
223
223
|
})
|
|
224
224
|
|
|
225
|
-
|
|
225
|
+
it('getChannel uses the channel detail endpoint', async () => {
|
|
226
226
|
mockResponse({ channel: { id: 'ch-1', name: 'Support' } })
|
|
227
227
|
|
|
228
228
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -231,7 +231,7 @@ describe('ChannelClient', () => {
|
|
|
231
231
|
expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels/ch-1')
|
|
232
232
|
})
|
|
233
233
|
|
|
234
|
-
|
|
234
|
+
it('listManagers uses the managers endpoint', async () => {
|
|
235
235
|
mockResponse({ managers: [{ id: 'mgr-1', channelId: 'ch-1', accountId: 'acc-1', name: 'Alex' }] })
|
|
236
236
|
|
|
237
237
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -241,7 +241,7 @@ describe('ChannelClient', () => {
|
|
|
241
241
|
expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels/ch-1/managers?limit=200')
|
|
242
242
|
})
|
|
243
243
|
|
|
244
|
-
|
|
244
|
+
it('getManagerRole unwraps the role response', async () => {
|
|
245
245
|
mockResponse({ role: { permissions: ['read'] } })
|
|
246
246
|
|
|
247
247
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -251,7 +251,7 @@ describe('ChannelClient', () => {
|
|
|
251
251
|
expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels/ch-1/managers/me/role')
|
|
252
252
|
})
|
|
253
253
|
|
|
254
|
-
|
|
254
|
+
it('group endpoints build the expected URLs', async () => {
|
|
255
255
|
mockResponse({ groups: [{ id: 'grp-1', channelId: 'ch-1', name: 'ops' }] })
|
|
256
256
|
mockResponse({ group: { id: 'grp-1', channelId: 'ch-1', name: 'ops' } })
|
|
257
257
|
mockResponse({ messages: [{ id: 'msg-1' }] })
|
|
@@ -273,7 +273,7 @@ describe('ChannelClient', () => {
|
|
|
273
273
|
expect(messagesUrl.searchParams.get('since')).toBe('cursor-1')
|
|
274
274
|
})
|
|
275
275
|
|
|
276
|
-
|
|
276
|
+
it('sendGroupMessage includes requestId in the body', async () => {
|
|
277
277
|
mockResponse({ message: { id: 'msg-1', requestId: 'req-123' } })
|
|
278
278
|
|
|
279
279
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -285,7 +285,7 @@ describe('ChannelClient', () => {
|
|
|
285
285
|
expect(getJsonBody()).toEqual({ blocks, requestId: 'req-123' })
|
|
286
286
|
})
|
|
287
287
|
|
|
288
|
-
|
|
288
|
+
it('direct chat endpoints build the expected URLs', async () => {
|
|
289
289
|
mockResponse({ directChats: [{ id: 'dm-1', channelId: 'ch-1' }] })
|
|
290
290
|
mockResponse({ messages: [{ id: 'msg-1' }] })
|
|
291
291
|
mockResponse({ message: { id: 'msg-2', requestId: 'req-234' } })
|
|
@@ -305,7 +305,7 @@ describe('ChannelClient', () => {
|
|
|
305
305
|
expect(getJsonBody(2)).toEqual({ blocks, requestId: 'req-234' })
|
|
306
306
|
})
|
|
307
307
|
|
|
308
|
-
|
|
308
|
+
it('user chat endpoints build the expected URLs', async () => {
|
|
309
309
|
mockResponse({ userChats: [{ id: 'uc-1', channelId: 'ch-1', state: 'opened' }] })
|
|
310
310
|
mockResponse({ userChat: { id: 'uc-1', channelId: 'ch-1', state: 'opened' } })
|
|
311
311
|
mockResponse({ messages: [{ id: 'msg-1' }] })
|
|
@@ -330,7 +330,7 @@ describe('ChannelClient', () => {
|
|
|
330
330
|
expect(getJsonBody(3)).toEqual({ blocks, requestId: 'req-345' })
|
|
331
331
|
})
|
|
332
332
|
|
|
333
|
-
|
|
333
|
+
it('listBots uses the bots endpoint', async () => {
|
|
334
334
|
mockResponse({ bots: [{ id: 'bot-1', channelId: 'ch-1', name: 'DeskBot' }] })
|
|
335
335
|
|
|
336
336
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -340,7 +340,7 @@ describe('ChannelClient', () => {
|
|
|
340
340
|
expect(fetchCalls[0].url).toBe('https://desk-api.channel.io/desk/channels/ch-1/bots?limit=1000')
|
|
341
341
|
})
|
|
342
342
|
|
|
343
|
-
|
|
343
|
+
it('5xx on POST does not retry', async () => {
|
|
344
344
|
mockResponse({ type: 'server_error', errors: [{ message: 'Server error' }] }, 500)
|
|
345
345
|
|
|
346
346
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -350,7 +350,7 @@ describe('ChannelClient', () => {
|
|
|
350
350
|
expect(fetchCalls).toHaveLength(1)
|
|
351
351
|
})
|
|
352
352
|
|
|
353
|
-
|
|
353
|
+
it('error responses use desk API error fields', async () => {
|
|
354
354
|
mockResponse({ type: 'not_found', status: 404, errors: [{ message: 'Missing resource' }], language: 'en' }, 404)
|
|
355
355
|
|
|
356
356
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -365,7 +365,7 @@ describe('ChannelClient', () => {
|
|
|
365
365
|
}
|
|
366
366
|
})
|
|
367
367
|
|
|
368
|
-
|
|
368
|
+
it('rate limit headers delay the next request when remaining is zero', async () => {
|
|
369
369
|
mockResponse(
|
|
370
370
|
{
|
|
371
371
|
account: {
|
|
@@ -407,7 +407,7 @@ describe('ChannelClient', () => {
|
|
|
407
407
|
expect(fetchCalls).toHaveLength(2)
|
|
408
408
|
})
|
|
409
409
|
|
|
410
|
-
|
|
410
|
+
it('generated requests still include the cookie header on post endpoints', async () => {
|
|
411
411
|
mockResponse({ message: { id: 'msg-1' } })
|
|
412
412
|
|
|
413
413
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -416,7 +416,7 @@ describe('ChannelClient', () => {
|
|
|
416
416
|
expect(getHeaders().Cookie).toBe('x-account=account-cookie; ch-session-1=session-cookie')
|
|
417
417
|
})
|
|
418
418
|
|
|
419
|
-
|
|
419
|
+
it('searchTeamChatMessages builds correct URL with query and limit', async () => {
|
|
420
420
|
const searchResponse = {
|
|
421
421
|
hits: [
|
|
422
422
|
{
|
|
@@ -443,7 +443,7 @@ describe('ChannelClient', () => {
|
|
|
443
443
|
expect(result.hits).toHaveLength(1)
|
|
444
444
|
})
|
|
445
445
|
|
|
446
|
-
|
|
446
|
+
it('searchUserChatMessages builds correct URL with query', async () => {
|
|
447
447
|
const searchResponse = {
|
|
448
448
|
hits: [],
|
|
449
449
|
bots: [],
|
|
@@ -461,7 +461,7 @@ describe('ChannelClient', () => {
|
|
|
461
461
|
expect(result.hits).toHaveLength(0)
|
|
462
462
|
})
|
|
463
463
|
|
|
464
|
-
|
|
464
|
+
it('searchTeamChatMessages works without limit parameter', async () => {
|
|
465
465
|
mockResponse({ hits: [], bots: [], sessions: [] })
|
|
466
466
|
|
|
467
467
|
const client = await new ChannelClient().login({ accountCookie: 'account-cookie', sessionCookie: 'session-cookie' })
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterAll, beforeEach, describe, expect, mock,
|
|
1
|
+
import { afterAll, beforeEach, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
type WorkspaceEntry = {
|
|
4
4
|
workspace_id: string
|
|
@@ -119,7 +119,7 @@ describe('channel auth commands', () => {
|
|
|
119
119
|
})
|
|
120
120
|
|
|
121
121
|
describe('extractAction', () => {
|
|
122
|
-
|
|
122
|
+
it('extracts fresh cookies and saves all workspaces', async () => {
|
|
123
123
|
const result = await extractAction()
|
|
124
124
|
|
|
125
125
|
expect(mockExtract).toHaveBeenCalledTimes(1)
|
|
@@ -136,7 +136,7 @@ describe('channel auth commands', () => {
|
|
|
136
136
|
expect(workspaceStore.get('ws-2')?.account_cookie).toBe('fresh-account')
|
|
137
137
|
})
|
|
138
138
|
|
|
139
|
-
|
|
139
|
+
it('preserves current workspace if it still exists after re-extraction', async () => {
|
|
140
140
|
workspaceStore.set('ws-2', {
|
|
141
141
|
workspace_id: 'ws-2',
|
|
142
142
|
workspace_name: 'Workspace 2',
|
|
@@ -157,7 +157,7 @@ describe('channel auth commands', () => {
|
|
|
157
157
|
})
|
|
158
158
|
})
|
|
159
159
|
|
|
160
|
-
|
|
160
|
+
it('switches to first workspace when previous current no longer exists', async () => {
|
|
161
161
|
workspaceStore.set('ws-old', {
|
|
162
162
|
workspace_id: 'ws-old',
|
|
163
163
|
workspace_name: 'Old Workspace',
|
|
@@ -178,7 +178,7 @@ describe('channel auth commands', () => {
|
|
|
178
178
|
})
|
|
179
179
|
})
|
|
180
180
|
|
|
181
|
-
|
|
181
|
+
it('returns error when token extraction fails', async () => {
|
|
182
182
|
mockExtract.mockImplementation(() => Promise.resolve([]))
|
|
183
183
|
|
|
184
184
|
const result = await extractAction()
|
|
@@ -188,7 +188,7 @@ describe('channel auth commands', () => {
|
|
|
188
188
|
})
|
|
189
189
|
})
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
it('returns error when no workspaces found', async () => {
|
|
192
192
|
mockListChannels.mockImplementation(() => Promise.resolve([]))
|
|
193
193
|
|
|
194
194
|
const result = await extractAction()
|
|
@@ -200,14 +200,14 @@ describe('channel auth commands', () => {
|
|
|
200
200
|
})
|
|
201
201
|
|
|
202
202
|
describe('statusAction', () => {
|
|
203
|
-
|
|
203
|
+
it('returns an error when no credentials exist', async () => {
|
|
204
204
|
const result = await statusAction()
|
|
205
205
|
|
|
206
206
|
expect(result.valid).toBe(false)
|
|
207
207
|
expect(result.error).toBe('No credentials. Run "agent-channeltalk auth extract" first.')
|
|
208
208
|
})
|
|
209
209
|
|
|
210
|
-
|
|
210
|
+
it('returns valid status for current workspace', async () => {
|
|
211
211
|
workspaceStore.set('ws-1', {
|
|
212
212
|
workspace_id: 'ws-1',
|
|
213
213
|
workspace_name: 'Workspace 1',
|
|
@@ -228,7 +228,7 @@ describe('channel auth commands', () => {
|
|
|
228
228
|
})
|
|
229
229
|
})
|
|
230
230
|
|
|
231
|
-
|
|
231
|
+
it('returns invalid status with stored info when api validation fails', async () => {
|
|
232
232
|
workspaceStore.set('ws-1', {
|
|
233
233
|
workspace_id: 'ws-1',
|
|
234
234
|
workspace_name: 'Workspace 1',
|
|
@@ -251,7 +251,7 @@ describe('channel auth commands', () => {
|
|
|
251
251
|
})
|
|
252
252
|
})
|
|
253
253
|
|
|
254
|
-
|
|
254
|
+
it('returns workspace-specific error for unknown workspace', async () => {
|
|
255
255
|
const result = await statusAction({ workspace: 'missing' })
|
|
256
256
|
|
|
257
257
|
expect(result).toEqual({
|
|
@@ -262,7 +262,7 @@ describe('channel auth commands', () => {
|
|
|
262
262
|
})
|
|
263
263
|
|
|
264
264
|
describe('clearAction', () => {
|
|
265
|
-
|
|
265
|
+
it('removes all stored credentials', async () => {
|
|
266
266
|
workspaceStore.set('ws-1', {
|
|
267
267
|
workspace_id: 'ws-1',
|
|
268
268
|
workspace_name: 'Workspace 1',
|
|
@@ -280,7 +280,7 @@ describe('channel auth commands', () => {
|
|
|
280
280
|
})
|
|
281
281
|
|
|
282
282
|
describe('listAction', () => {
|
|
283
|
-
|
|
283
|
+
it('lists all workspaces with current flag', async () => {
|
|
284
284
|
workspaceStore.set('ws-1', {
|
|
285
285
|
workspace_id: 'ws-1',
|
|
286
286
|
workspace_name: 'Workspace 1',
|
|
@@ -305,7 +305,7 @@ describe('channel auth commands', () => {
|
|
|
305
305
|
})
|
|
306
306
|
|
|
307
307
|
describe('useAction', () => {
|
|
308
|
-
|
|
308
|
+
it('switches current workspace', async () => {
|
|
309
309
|
workspaceStore.set('ws-1', {
|
|
310
310
|
workspace_id: 'ws-1',
|
|
311
311
|
workspace_name: 'Workspace 1',
|
|
@@ -326,7 +326,7 @@ describe('channel auth commands', () => {
|
|
|
326
326
|
expect(currentWorkspaceId).toBe('ws-1')
|
|
327
327
|
})
|
|
328
328
|
|
|
329
|
-
|
|
329
|
+
it('returns error for unknown workspace', async () => {
|
|
330
330
|
const result = await useAction('missing')
|
|
331
331
|
|
|
332
332
|
expect(result).toEqual({
|
|
@@ -336,7 +336,7 @@ describe('channel auth commands', () => {
|
|
|
336
336
|
})
|
|
337
337
|
|
|
338
338
|
describe('removeAction', () => {
|
|
339
|
-
|
|
339
|
+
it('removes a stored workspace', async () => {
|
|
340
340
|
workspaceStore.set('ws-1', {
|
|
341
341
|
workspace_id: 'ws-1',
|
|
342
342
|
workspace_name: 'Workspace 1',
|
|
@@ -351,7 +351,7 @@ describe('channel auth commands', () => {
|
|
|
351
351
|
expect(workspaceStore.has('ws-1')).toBe(false)
|
|
352
352
|
})
|
|
353
353
|
|
|
354
|
-
|
|
354
|
+
it('returns error for unknown workspace', async () => {
|
|
355
355
|
const result = await removeAction('missing')
|
|
356
356
|
|
|
357
357
|
expect(result).toEqual({
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, mock,
|
|
1
|
+
import { beforeEach, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
const mockListBots = mock(() =>
|
|
4
4
|
Promise.resolve([
|
|
@@ -35,7 +35,7 @@ describe('bot commands', () => {
|
|
|
35
35
|
)
|
|
36
36
|
})
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
it('listAction lists bots', async () => {
|
|
39
39
|
const result = await listAction({ limit: '8' })
|
|
40
40
|
|
|
41
41
|
expect(mockListBots).toHaveBeenCalledWith('ws-1', { limit: 8 })
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, mock,
|
|
1
|
+
import { beforeEach, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
const mockListUserChats = mock(() =>
|
|
4
4
|
Promise.resolve([
|
|
@@ -62,7 +62,7 @@ describe('chat commands', () => {
|
|
|
62
62
|
)
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
-
|
|
65
|
+
it('listAction lists user chats with the requested state filter', async () => {
|
|
66
66
|
const result = await listAction({ state: 'closed', limit: '5' })
|
|
67
67
|
|
|
68
68
|
expect(mockListUserChats).toHaveBeenCalledWith('ws-1', { state: 'closed', limit: 5 })
|
|
@@ -78,7 +78,7 @@ describe('chat commands', () => {
|
|
|
78
78
|
])
|
|
79
79
|
})
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
it('getAction gets a specific user chat', async () => {
|
|
82
82
|
const result = await getAction('chat-1')
|
|
83
83
|
|
|
84
84
|
expect(mockGetUserChat).toHaveBeenCalledWith('ws-1', 'chat-1')
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, mock,
|
|
1
|
+
import { beforeEach, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
const mockListGroups = mock(() =>
|
|
4
4
|
Promise.resolve([
|
|
@@ -103,7 +103,7 @@ describe('group commands', () => {
|
|
|
103
103
|
)
|
|
104
104
|
})
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
it('listAction lists groups', async () => {
|
|
107
107
|
const result = await listAction({ limit: '3' })
|
|
108
108
|
|
|
109
109
|
expect(mockListGroups).toHaveBeenCalledWith('ws-1', { limit: 3 })
|
|
@@ -121,7 +121,7 @@ describe('group commands', () => {
|
|
|
121
121
|
])
|
|
122
122
|
})
|
|
123
123
|
|
|
124
|
-
|
|
124
|
+
it('getAction gets a specific group', async () => {
|
|
125
125
|
const result = await getAction('grp-1')
|
|
126
126
|
|
|
127
127
|
expect(mockGetGroup).toHaveBeenCalledWith('ws-1', 'grp-1')
|
|
@@ -137,7 +137,7 @@ describe('group commands', () => {
|
|
|
137
137
|
})
|
|
138
138
|
})
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
it('messagesAction gets group messages with limit and sort', async () => {
|
|
141
141
|
const result = await messagesAction('grp-1', { limit: '7', sort: 'asc' })
|
|
142
142
|
|
|
143
143
|
expect(mockGetGroupMessages).toHaveBeenCalledWith('ws-1', 'grp-1', { limit: 7, sortOrder: 'asc' })
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, mock,
|
|
1
|
+
import { beforeEach, describe, expect, mock, it } from 'bun:test'
|
|
2
2
|
|
|
3
3
|
const mockListManagers = mock(() =>
|
|
4
4
|
Promise.resolve([
|
|
@@ -43,7 +43,7 @@ describe('manager commands', () => {
|
|
|
43
43
|
)
|
|
44
44
|
})
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
it('listAction lists managers', async () => {
|
|
47
47
|
const result = await listAction({ limit: '12' })
|
|
48
48
|
|
|
49
49
|
expect(mockListManagers).toHaveBeenCalledWith('ws-1', { limit: 12 })
|