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.
Files changed (239) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/dist/package.json +1 -1
  3. package/dist/src/platforms/teams/token-extractor.d.ts.map +1 -1
  4. package/dist/src/platforms/teams/token-extractor.js +9 -2
  5. package/dist/src/platforms/teams/token-extractor.js.map +1 -1
  6. package/dist/src/shared/chromium/decryptor.d.ts +6 -0
  7. package/dist/src/shared/chromium/decryptor.d.ts.map +1 -1
  8. package/dist/src/shared/chromium/decryptor.js +26 -6
  9. package/dist/src/shared/chromium/decryptor.js.map +1 -1
  10. package/e2e/channeltalk.e2e.test.ts +13 -13
  11. package/e2e/channeltalkbot.e2e.test.ts +13 -13
  12. package/e2e/discord.e2e.test.ts +24 -24
  13. package/e2e/discordbot.e2e.test.ts +16 -16
  14. package/e2e/instagram.e2e.test.ts +10 -10
  15. package/e2e/kakaotalk.e2e.test.ts +7 -7
  16. package/e2e/line.e2e.test.ts +8 -8
  17. package/e2e/slack.e2e.test.ts +34 -34
  18. package/e2e/slackbot.e2e.test.ts +14 -14
  19. package/e2e/teams.e2e.test.ts +23 -23
  20. package/e2e/telegram.e2e.test.ts +8 -8
  21. package/e2e/webex.e2e.test.ts +14 -14
  22. package/e2e/whatsapp.e2e.test.ts +8 -8
  23. package/e2e/whatsappbot.e2e.test.ts +6 -6
  24. package/package.json +1 -1
  25. package/skills/agent-channeltalk/SKILL.md +1 -1
  26. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  27. package/skills/agent-discord/SKILL.md +1 -1
  28. package/skills/agent-discordbot/SKILL.md +1 -1
  29. package/skills/agent-instagram/SKILL.md +1 -1
  30. package/skills/agent-kakaotalk/SKILL.md +1 -1
  31. package/skills/agent-line/SKILL.md +1 -1
  32. package/skills/agent-slack/SKILL.md +1 -1
  33. package/skills/agent-slackbot/SKILL.md +1 -1
  34. package/skills/agent-teams/SKILL.md +1 -1
  35. package/skills/agent-telegram/SKILL.md +1 -1
  36. package/skills/agent-webex/SKILL.md +1 -1
  37. package/skills/agent-wechatbot/SKILL.md +1 -1
  38. package/skills/agent-whatsapp/SKILL.md +1 -1
  39. package/skills/agent-whatsappbot/SKILL.md +1 -1
  40. package/src/platforms/channeltalk/client.test.ts +26 -26
  41. package/src/platforms/channeltalk/commands/auth.test.ts +16 -16
  42. package/src/platforms/channeltalk/commands/bot.test.ts +2 -2
  43. package/src/platforms/channeltalk/commands/chat.test.ts +3 -3
  44. package/src/platforms/channeltalk/commands/group.test.ts +4 -4
  45. package/src/platforms/channeltalk/commands/manager.test.ts +2 -2
  46. package/src/platforms/channeltalk/commands/message.test.ts +17 -17
  47. package/src/platforms/channeltalk/commands/snapshot.test.ts +7 -7
  48. package/src/platforms/channeltalk/commands/whoami.test.ts +3 -3
  49. package/src/platforms/channeltalk/credential-manager.test.ts +18 -18
  50. package/src/platforms/channeltalk/ensure-auth.test.ts +5 -5
  51. package/src/platforms/channeltalk/index.test.ts +23 -23
  52. package/src/platforms/channeltalk/token-extractor.test.ts +21 -21
  53. package/src/platforms/channeltalk/types.test.ts +12 -12
  54. package/src/platforms/channeltalkbot/client.test.ts +14 -14
  55. package/src/platforms/channeltalkbot/commands/auth.test.ts +16 -16
  56. package/src/platforms/channeltalkbot/commands/bot.test.ts +6 -6
  57. package/src/platforms/channeltalkbot/commands/chat.test.ts +9 -9
  58. package/src/platforms/channeltalkbot/commands/group.test.ts +6 -6
  59. package/src/platforms/channeltalkbot/commands/manager.test.ts +3 -3
  60. package/src/platforms/channeltalkbot/commands/message.test.ts +10 -10
  61. package/src/platforms/channeltalkbot/commands/snapshot.test.ts +7 -7
  62. package/src/platforms/channeltalkbot/commands/whoami.test.ts +4 -4
  63. package/src/platforms/channeltalkbot/credential-manager.test.ts +27 -27
  64. package/src/platforms/channeltalkbot/index.test.ts +15 -15
  65. package/src/platforms/discord/client.test.ts +28 -28
  66. package/src/platforms/discord/commands/auth.test.ts +7 -7
  67. package/src/platforms/discord/commands/channel.test.ts +7 -7
  68. package/src/platforms/discord/commands/dm.test.ts +4 -4
  69. package/src/platforms/discord/commands/file.test.ts +4 -4
  70. package/src/platforms/discord/commands/friend.test.ts +6 -6
  71. package/src/platforms/discord/commands/member.test.ts +5 -5
  72. package/src/platforms/discord/commands/mention.test.ts +5 -5
  73. package/src/platforms/discord/commands/message.test.ts +9 -9
  74. package/src/platforms/discord/commands/note.test.ts +6 -6
  75. package/src/platforms/discord/commands/profile.test.ts +4 -4
  76. package/src/platforms/discord/commands/reaction.test.ts +5 -5
  77. package/src/platforms/discord/commands/server.test.ts +7 -7
  78. package/src/platforms/discord/commands/snapshot.test.ts +6 -6
  79. package/src/platforms/discord/commands/thread.test.ts +6 -6
  80. package/src/platforms/discord/commands/user.test.ts +5 -5
  81. package/src/platforms/discord/commands/whoami.test.ts +6 -6
  82. package/src/platforms/discord/credential-manager.test.ts +16 -16
  83. package/src/platforms/discord/ensure-auth.test.ts +8 -8
  84. package/src/platforms/discord/index.test.ts +17 -17
  85. package/src/platforms/discord/listener.test.ts +33 -33
  86. package/src/platforms/discord/token-extractor.test.ts +53 -53
  87. package/src/platforms/discord/types.test.ts +26 -26
  88. package/src/platforms/discordbot/client.test.ts +31 -31
  89. package/src/platforms/discordbot/commands/auth.test.ts +18 -18
  90. package/src/platforms/discordbot/commands/channel.test.ts +11 -11
  91. package/src/platforms/discordbot/commands/file.test.ts +7 -7
  92. package/src/platforms/discordbot/commands/message.test.ts +25 -25
  93. package/src/platforms/discordbot/commands/reaction.test.ts +6 -6
  94. package/src/platforms/discordbot/commands/server.test.ts +12 -12
  95. package/src/platforms/discordbot/commands/snapshot.test.ts +13 -13
  96. package/src/platforms/discordbot/commands/thread.test.ts +10 -10
  97. package/src/platforms/discordbot/commands/user.test.ts +9 -9
  98. package/src/platforms/discordbot/commands/whoami.test.ts +4 -4
  99. package/src/platforms/discordbot/credential-manager.test.ts +28 -28
  100. package/src/platforms/instagram/client.test.ts +18 -18
  101. package/src/platforms/instagram/commands/auth.test.ts +11 -11
  102. package/src/platforms/instagram/commands/chat.test.ts +6 -6
  103. package/src/platforms/instagram/commands/message.test.ts +11 -11
  104. package/src/platforms/instagram/commands/shared.test.ts +12 -12
  105. package/src/platforms/instagram/commands/whoami.test.ts +3 -3
  106. package/src/platforms/instagram/credential-manager.test.ts +21 -21
  107. package/src/platforms/instagram/ensure-auth.test.ts +4 -4
  108. package/src/platforms/instagram/index.test.ts +9 -9
  109. package/src/platforms/instagram/listener.test.ts +8 -8
  110. package/src/platforms/instagram/token-extractor.test.ts +35 -35
  111. package/src/platforms/kakaotalk/client.test.ts +33 -33
  112. package/src/platforms/kakaotalk/commands/auth.test.ts +11 -11
  113. package/src/platforms/kakaotalk/commands/chat.test.ts +6 -6
  114. package/src/platforms/kakaotalk/commands/message.test.ts +7 -7
  115. package/src/platforms/kakaotalk/commands/whoami.test.ts +5 -5
  116. package/src/platforms/kakaotalk/credential-manager.test.ts +15 -15
  117. package/src/platforms/kakaotalk/index.test.ts +15 -15
  118. package/src/platforms/kakaotalk/listener.test.ts +17 -17
  119. package/src/platforms/line/client.test.ts +17 -17
  120. package/src/platforms/line/commands/auth.test.ts +8 -8
  121. package/src/platforms/line/commands/chat.test.ts +7 -7
  122. package/src/platforms/line/commands/friend.test.ts +6 -6
  123. package/src/platforms/line/commands/message.test.ts +7 -7
  124. package/src/platforms/line/commands/whoami.test.ts +6 -6
  125. package/src/platforms/line/credential-manager.test.ts +17 -17
  126. package/src/platforms/line/index.test.ts +10 -10
  127. package/src/platforms/line/listener.test.ts +15 -15
  128. package/src/platforms/line/types.test.ts +14 -14
  129. package/src/platforms/slack/cli.test.ts +8 -8
  130. package/src/platforms/slack/client.test.ts +151 -151
  131. package/src/platforms/slack/commands/activity.test.ts +13 -13
  132. package/src/platforms/slack/commands/auth.test.ts +34 -34
  133. package/src/platforms/slack/commands/bookmark.test.ts +9 -9
  134. package/src/platforms/slack/commands/channel.test.ts +17 -17
  135. package/src/platforms/slack/commands/drafts.test.ts +7 -7
  136. package/src/platforms/slack/commands/emoji.test.ts +3 -3
  137. package/src/platforms/slack/commands/file.test.ts +12 -12
  138. package/src/platforms/slack/commands/message.test.ts +19 -19
  139. package/src/platforms/slack/commands/pin.test.ts +7 -7
  140. package/src/platforms/slack/commands/reaction.test.ts +10 -10
  141. package/src/platforms/slack/commands/reminder.test.ts +9 -9
  142. package/src/platforms/slack/commands/saved.test.ts +7 -7
  143. package/src/platforms/slack/commands/sections.test.ts +5 -5
  144. package/src/platforms/slack/commands/snapshot.test.ts +13 -13
  145. package/src/platforms/slack/commands/unread.test.ts +6 -6
  146. package/src/platforms/slack/commands/user.test.ts +10 -10
  147. package/src/platforms/slack/commands/usergroup.test.ts +15 -15
  148. package/src/platforms/slack/commands/whoami.test.ts +6 -6
  149. package/src/platforms/slack/commands/workspace.test.ts +26 -26
  150. package/src/platforms/slack/credential-manager.test.ts +14 -14
  151. package/src/platforms/slack/ensure-auth.test.ts +21 -21
  152. package/src/platforms/slack/index.test.ts +12 -12
  153. package/src/platforms/slack/listener.test.ts +17 -17
  154. package/src/platforms/slack/token-extractor-node.test.ts +2 -2
  155. package/src/platforms/slack/token-extractor.test.ts +37 -37
  156. package/src/platforms/slack/types.test.ts +21 -21
  157. package/src/platforms/slackbot/client.test.ts +22 -22
  158. package/src/platforms/slackbot/commands/auth.test.ts +14 -14
  159. package/src/platforms/slackbot/commands/channel.test.ts +7 -7
  160. package/src/platforms/slackbot/commands/message.test.ts +13 -13
  161. package/src/platforms/slackbot/commands/reaction.test.ts +6 -6
  162. package/src/platforms/slackbot/commands/user.test.ts +7 -7
  163. package/src/platforms/slackbot/commands/whoami.test.ts +4 -4
  164. package/src/platforms/slackbot/credential-manager.test.ts +22 -22
  165. package/src/platforms/slackbot/types.test.ts +7 -7
  166. package/src/platforms/teams/client.test.ts +30 -30
  167. package/src/platforms/teams/commands/auth.test.ts +8 -8
  168. package/src/platforms/teams/commands/channel.test.ts +7 -7
  169. package/src/platforms/teams/commands/file.test.ts +4 -4
  170. package/src/platforms/teams/commands/message.test.ts +5 -5
  171. package/src/platforms/teams/commands/reaction.test.ts +4 -4
  172. package/src/platforms/teams/commands/snapshot.test.ts +7 -7
  173. package/src/platforms/teams/commands/team.test.ts +8 -8
  174. package/src/platforms/teams/commands/user.test.ts +4 -4
  175. package/src/platforms/teams/commands/whoami.test.ts +6 -6
  176. package/src/platforms/teams/credential-manager.test.ts +17 -17
  177. package/src/platforms/teams/ensure-auth.test.ts +13 -13
  178. package/src/platforms/teams/index.test.ts +15 -15
  179. package/src/platforms/teams/token-extractor.test.ts +109 -49
  180. package/src/platforms/teams/token-extractor.ts +7 -2
  181. package/src/platforms/teams/types.test.ts +26 -26
  182. package/src/platforms/telegram/app-config.test.ts +4 -4
  183. package/src/platforms/telegram/chat-utils.test.ts +12 -12
  184. package/src/platforms/telegram/client.test.ts +4 -4
  185. package/src/platforms/telegram/commands/auth.test.ts +16 -16
  186. package/src/platforms/telegram/commands/chat.test.ts +9 -9
  187. package/src/platforms/telegram/commands/message.test.ts +6 -6
  188. package/src/platforms/telegram/commands/shared.test.ts +3 -3
  189. package/src/platforms/telegram/commands/whoami.test.ts +3 -3
  190. package/src/platforms/telegram/credential-manager.test.ts +10 -10
  191. package/src/platforms/telegram/types.test.ts +6 -6
  192. package/src/platforms/webex/app-config.test.ts +8 -8
  193. package/src/platforms/webex/cli.test.ts +5 -5
  194. package/src/platforms/webex/client.test.ts +65 -65
  195. package/src/platforms/webex/commands/auth.test.ts +18 -18
  196. package/src/platforms/webex/commands/member.test.ts +5 -5
  197. package/src/platforms/webex/commands/message.test.ts +12 -12
  198. package/src/platforms/webex/commands/snapshot.test.ts +5 -5
  199. package/src/platforms/webex/commands/space.test.ts +10 -10
  200. package/src/platforms/webex/commands/whoami.test.ts +6 -6
  201. package/src/platforms/webex/credential-manager.test.ts +22 -22
  202. package/src/platforms/webex/encryption.test.ts +4 -4
  203. package/src/platforms/webex/ensure-auth.test.ts +5 -5
  204. package/src/platforms/webex/index.test.ts +5 -5
  205. package/src/platforms/webex/markdown-to-html.test.ts +33 -33
  206. package/src/platforms/webex/token-extractor.test.ts +23 -23
  207. package/src/platforms/webex/types.test.ts +27 -27
  208. package/src/platforms/wechatbot/client.test.ts +27 -27
  209. package/src/platforms/wechatbot/commands/auth.test.ts +15 -15
  210. package/src/platforms/wechatbot/commands/message.test.ts +8 -8
  211. package/src/platforms/wechatbot/commands/template.test.ts +9 -9
  212. package/src/platforms/wechatbot/commands/user.test.ts +7 -7
  213. package/src/platforms/wechatbot/commands/whoami.test.ts +5 -5
  214. package/src/platforms/wechatbot/credential-manager.test.ts +18 -18
  215. package/src/platforms/wechatbot/index.test.ts +10 -10
  216. package/src/platforms/wechatbot/types.test.ts +25 -25
  217. package/src/platforms/whatsapp/commands/auth.test.ts +13 -13
  218. package/src/platforms/whatsapp/commands/chat.test.ts +8 -8
  219. package/src/platforms/whatsapp/commands/message.test.ts +10 -10
  220. package/src/platforms/whatsapp/commands/whoami.test.ts +3 -3
  221. package/src/platforms/whatsapp/credential-manager.test.ts +23 -23
  222. package/src/platforms/whatsapp/ensure-auth.test.ts +4 -4
  223. package/src/platforms/whatsapp/index.test.ts +8 -8
  224. package/src/platforms/whatsapp/types.test.ts +42 -42
  225. package/src/platforms/whatsappbot/client.test.ts +27 -27
  226. package/src/platforms/whatsappbot/commands/auth.test.ts +14 -14
  227. package/src/platforms/whatsappbot/commands/message.test.ts +16 -16
  228. package/src/platforms/whatsappbot/commands/template.test.ts +9 -9
  229. package/src/platforms/whatsappbot/commands/whoami.test.ts +5 -5
  230. package/src/platforms/whatsappbot/credential-manager.test.ts +18 -18
  231. package/src/platforms/whatsappbot/index.test.ts +7 -7
  232. package/src/platforms/whatsappbot/types.test.ts +18 -18
  233. package/src/shared/chromium/browsers.test.ts +22 -22
  234. package/src/shared/chromium/cookie-reader.test.ts +13 -13
  235. package/src/shared/chromium/decryptor.test.ts +97 -32
  236. package/src/shared/chromium/decryptor.ts +27 -6
  237. package/src/shared/utils/concurrency.test.ts +6 -6
  238. package/src/shared/utils/derived-key-cache.test.ts +11 -11
  239. package/src/tui/utils.test.ts +31 -31
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -55,7 +55,7 @@ afterEach(() => {
55
55
  console.log = originalConsoleLog
56
56
  })
57
57
 
58
- test('status: outputs account info when account exists', async () => {
58
+ it('status: outputs account info when account exists', async () => {
59
59
  // when
60
60
  await authCommand.parseAsync(['node', 'auth', 'status'])
61
61
 
@@ -68,7 +68,7 @@ test('status: outputs account info when account exists', async () => {
68
68
  expect(output.device).toBe('ANDROIDSECONDARY')
69
69
  })
70
70
 
71
- test('status: outputs error when no account configured', async () => {
71
+ it('status: outputs error when no account configured', async () => {
72
72
  // given
73
73
  getAccountSpy.mockResolvedValue(null)
74
74
 
@@ -81,7 +81,7 @@ test('status: outputs error when no account configured', async () => {
81
81
  expect(output.error).toBe('No LINE account configured')
82
82
  })
83
83
 
84
- test('list: outputs all accounts', async () => {
84
+ it('list: outputs all accounts', async () => {
85
85
  // when
86
86
  await authCommand.parseAsync(['node', 'auth', 'list'])
87
87
 
@@ -94,7 +94,7 @@ test('list: outputs all accounts', async () => {
94
94
  expect(output[1].account_id).toBe('u456')
95
95
  })
96
96
 
97
- test('list: outputs empty array when no accounts', async () => {
97
+ it('list: outputs empty array when no accounts', async () => {
98
98
  // given
99
99
  listAccountsSpy.mockResolvedValue([])
100
100
 
@@ -106,7 +106,7 @@ test('list: outputs empty array when no accounts', async () => {
106
106
  expect(output).toHaveLength(0)
107
107
  })
108
108
 
109
- test('use: sets current account and outputs result', async () => {
109
+ it('use: sets current account and outputs result', async () => {
110
110
  // when
111
111
  await authCommand.parseAsync(['node', 'auth', 'use', 'u456'])
112
112
 
@@ -117,7 +117,7 @@ test('use: sets current account and outputs result', async () => {
117
117
  expect(output.current_account).toBe('u456')
118
118
  })
119
119
 
120
- test('logout: removes specific account when account-id provided', async () => {
120
+ it('logout: removes specific account when account-id provided', async () => {
121
121
  // when
122
122
  await authCommand.parseAsync(['node', 'auth', 'logout', 'u123'])
123
123
 
@@ -129,7 +129,7 @@ test('logout: removes specific account when account-id provided', async () => {
129
129
  expect(output.message).toContain('u123')
130
130
  })
131
131
 
132
- test('logout: clears all accounts when no account-id provided', async () => {
132
+ it('logout: clears all accounts when no account-id provided', async () => {
133
133
  // when
134
134
  await authCommand.parseAsync(['node', 'auth', 'logout'])
135
135
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -48,7 +48,7 @@ afterEach(() => {
48
48
  console.log = originalConsoleLog
49
49
  })
50
50
 
51
- test('list: fetches and outputs chats', async () => {
51
+ it('list: fetches and outputs chats', async () => {
52
52
  // when
53
53
  await chatCommand.parseAsync(['node', 'chat', 'list'])
54
54
 
@@ -62,7 +62,7 @@ test('list: fetches and outputs chats', async () => {
62
62
  expect(output[1].chat_id).toBe('c222')
63
63
  })
64
64
 
65
- test('list: uses default limit of 50 when no limit provided', async () => {
65
+ it('list: uses default limit of 50 when no limit provided', async () => {
66
66
  // when
67
67
  await chatCommand.parseAsync(['node', 'chat', 'list'])
68
68
 
@@ -70,7 +70,7 @@ test('list: uses default limit of 50 when no limit provided', async () => {
70
70
  expect(getChatsSpy).toHaveBeenCalledWith({ limit: 50 })
71
71
  })
72
72
 
73
- test('list: uses custom limit when --limit option provided', async () => {
73
+ it('list: uses custom limit when --limit option provided', async () => {
74
74
  // when
75
75
  await chatCommand.parseAsync(['node', 'chat', 'list', '--limit', '10'])
76
76
 
@@ -78,7 +78,7 @@ test('list: uses custom limit when --limit option provided', async () => {
78
78
  expect(getChatsSpy).toHaveBeenCalledWith({ limit: 10 })
79
79
  })
80
80
 
81
- test('list: closes client after fetching chats', async () => {
81
+ it('list: closes client after fetching chats', async () => {
82
82
  // when
83
83
  await chatCommand.parseAsync(['node', 'chat', 'list'])
84
84
 
@@ -86,7 +86,7 @@ test('list: closes client after fetching chats', async () => {
86
86
  expect(closeSpy).toHaveBeenCalledTimes(1)
87
87
  })
88
88
 
89
- test('list: outputs chat metadata', async () => {
89
+ it('list: outputs chat metadata', async () => {
90
90
  // when
91
91
  await chatCommand.parseAsync(['node', 'chat', 'list'])
92
92
 
@@ -98,7 +98,7 @@ test('list: outputs chat metadata', async () => {
98
98
  expect(chat.display_name).toBeDefined()
99
99
  })
100
100
 
101
- test('list: includes different chat types', async () => {
101
+ it('list: includes different chat types', async () => {
102
102
  // when
103
103
  await chatCommand.parseAsync(['node', 'chat', 'list'])
104
104
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -42,7 +42,7 @@ afterEach(() => {
42
42
  console.log = originalConsoleLog
43
43
  })
44
44
 
45
- test('list: fetches and outputs friends', async () => {
45
+ it('list: fetches and outputs friends', async () => {
46
46
  // when
47
47
  await friendCommand.parseAsync(['node', 'friend', 'list'])
48
48
 
@@ -56,7 +56,7 @@ test('list: fetches and outputs friends', async () => {
56
56
  expect(output[0].display_name).toBe('Alice')
57
57
  })
58
58
 
59
- test('list: outputs friends with metadata', async () => {
59
+ it('list: outputs friends with metadata', async () => {
60
60
  // when
61
61
  await friendCommand.parseAsync(['node', 'friend', 'list'])
62
62
 
@@ -67,7 +67,7 @@ test('list: outputs friends with metadata', async () => {
67
67
  expect(friend.display_name).toBeDefined()
68
68
  })
69
69
 
70
- test('list: closes client after fetching friends', async () => {
70
+ it('list: closes client after fetching friends', async () => {
71
71
  // when
72
72
  await friendCommand.parseAsync(['node', 'friend', 'list'])
73
73
 
@@ -75,7 +75,7 @@ test('list: closes client after fetching friends', async () => {
75
75
  expect(closeSpy).toHaveBeenCalledTimes(1)
76
76
  })
77
77
 
78
- test('list: outputs empty array when no friends', async () => {
78
+ it('list: outputs empty array when no friends', async () => {
79
79
  // given
80
80
  getFriendsSpy.mockResolvedValue([])
81
81
 
@@ -87,7 +87,7 @@ test('list: outputs empty array when no friends', async () => {
87
87
  expect(output).toHaveLength(0)
88
88
  })
89
89
 
90
- test('list: includes all friend fields', async () => {
90
+ it('list: includes all friend fields', async () => {
91
91
  // when
92
92
  await friendCommand.parseAsync(['node', 'friend', 'list'])
93
93
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -55,7 +55,7 @@ afterEach(() => {
55
55
  console.log = originalConsoleLog
56
56
  })
57
57
 
58
- test('list: fetches and outputs messages for a chat', async () => {
58
+ it('list: fetches and outputs messages for a chat', async () => {
59
59
  // when
60
60
  await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1'])
61
61
 
@@ -69,7 +69,7 @@ test('list: fetches and outputs messages for a chat', async () => {
69
69
  expect(output[0].text).toBe('Hello world')
70
70
  })
71
71
 
72
- test('list: uses custom count when --count option provided', async () => {
72
+ it('list: uses custom count when --count option provided', async () => {
73
73
  // when
74
74
  await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1', '--count', '5'])
75
75
 
@@ -77,7 +77,7 @@ test('list: uses custom count when --count option provided', async () => {
77
77
  expect(getMessagesSpy).toHaveBeenCalledWith('chat-1', { count: 5 })
78
78
  })
79
79
 
80
- test('list: closes client after fetching messages', async () => {
80
+ it('list: closes client after fetching messages', async () => {
81
81
  // when
82
82
  await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1'])
83
83
 
@@ -85,7 +85,7 @@ test('list: closes client after fetching messages', async () => {
85
85
  expect(closeSpy).toHaveBeenCalledTimes(1)
86
86
  })
87
87
 
88
- test('send: sends message and outputs result', async () => {
88
+ it('send: sends message and outputs result', async () => {
89
89
  // when
90
90
  await messageCommand.parseAsync(['node', 'message', 'send', 'chat-1', 'Hello!'])
91
91
 
@@ -98,7 +98,7 @@ test('send: sends message and outputs result', async () => {
98
98
  expect(output.message_id).toBe('msg-new')
99
99
  })
100
100
 
101
- test('send: closes client after sending message', async () => {
101
+ it('send: closes client after sending message', async () => {
102
102
  // when
103
103
  await messageCommand.parseAsync(['node', 'message', 'send', 'chat-1', 'Hello!'])
104
104
 
@@ -106,7 +106,7 @@ test('send: closes client after sending message', async () => {
106
106
  expect(closeSpy).toHaveBeenCalledTimes(1)
107
107
  })
108
108
 
109
- test('list: outputs messages with metadata', async () => {
109
+ it('list: outputs messages with metadata', async () => {
110
110
  // when
111
111
  await messageCommand.parseAsync(['node', 'message', 'list', 'chat-1'])
112
112
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, expect, mock, spyOn, test } from 'bun:test'
1
+ import { afterEach, beforeEach, expect, mock, spyOn, it } from 'bun:test'
2
2
 
3
3
  const originalConsoleLog = console.log
4
4
 
@@ -34,7 +34,7 @@ afterEach(() => {
34
34
  console.log = originalConsoleLog
35
35
  })
36
36
 
37
- test('whoami: fetches and outputs profile', async () => {
37
+ it('whoami: fetches and outputs profile', async () => {
38
38
  // when
39
39
  await whoamiCommand.parseAsync(['node', 'whoami'])
40
40
 
@@ -47,7 +47,7 @@ test('whoami: fetches and outputs profile', async () => {
47
47
  expect(output.display_name).toBe('Test User')
48
48
  })
49
49
 
50
- test('whoami: outputs profile with all fields', async () => {
50
+ it('whoami: outputs profile with all fields', async () => {
51
51
  // when
52
52
  await whoamiCommand.parseAsync(['node', 'whoami'])
53
53
 
@@ -59,7 +59,7 @@ test('whoami: outputs profile with all fields', async () => {
59
59
  expect(output.status_message).toBeDefined()
60
60
  })
61
61
 
62
- test('whoami: closes client after fetching profile', async () => {
62
+ it('whoami: closes client after fetching profile', async () => {
63
63
  // when
64
64
  await whoamiCommand.parseAsync(['node', 'whoami'])
65
65
 
@@ -67,7 +67,7 @@ test('whoami: closes client after fetching profile', async () => {
67
67
  expect(closeSpy).toHaveBeenCalledTimes(1)
68
68
  })
69
69
 
70
- test('whoami: outputs profile with picture_url', async () => {
70
+ it('whoami: outputs profile with picture_url', async () => {
71
71
  // when
72
72
  await whoamiCommand.parseAsync(['node', 'whoami'])
73
73
 
@@ -76,7 +76,7 @@ test('whoami: outputs profile with picture_url', async () => {
76
76
  expect(output.picture_url).toBe('https://example.com/pic.jpg')
77
77
  })
78
78
 
79
- test('whoami: outputs profile with status_message', async () => {
79
+ it('whoami: outputs profile with status_message', async () => {
80
80
  // when
81
81
  await whoamiCommand.parseAsync(['node', 'whoami'])
82
82
 
@@ -1,4 +1,4 @@
1
- import { afterEach, beforeEach, describe, expect, test } from 'bun:test'
1
+ import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
2
2
  import { mkdir, rm, stat } from 'node:fs/promises'
3
3
  import { tmpdir } from 'node:os'
4
4
  import { join } from 'node:path'
@@ -29,12 +29,12 @@ afterEach(async () => {
29
29
  })
30
30
 
31
31
  describe('LineCredentialManager', () => {
32
- test('load returns default config when file does not exist', async () => {
32
+ it('load returns default config when file does not exist', async () => {
33
33
  const config = await manager.load()
34
34
  expect(config).toEqual({ current_account: null, accounts: {} })
35
35
  })
36
36
 
37
- test('save and load round trip', async () => {
37
+ it('saves and loads in a round trip', async () => {
38
38
  const account = makeAccount('alice')
39
39
  const config = { current_account: 'alice', accounts: { alice: account } }
40
40
 
@@ -44,14 +44,14 @@ describe('LineCredentialManager', () => {
44
44
  expect(loaded).toEqual(config)
45
45
  })
46
46
 
47
- test('file is created with 0o600 permissions', async () => {
47
+ it('file is created with 0o600 permissions', async () => {
48
48
  await manager.save({ current_account: null, accounts: {} })
49
49
  const fileStat = await stat(join(tempDir, 'line-credentials.json'))
50
50
  // Check owner read/write only (0o600)
51
51
  expect(fileStat.mode & 0o777).toBe(0o600)
52
52
  })
53
53
 
54
- test('setAccount adds account and sets as current if first', async () => {
54
+ it('setAccount adds account and sets as current if first', async () => {
55
55
  const account = makeAccount('alice')
56
56
  await manager.setAccount(account)
57
57
 
@@ -60,7 +60,7 @@ describe('LineCredentialManager', () => {
60
60
  expect(loaded.current_account).toBe('alice')
61
61
  })
62
62
 
63
- test('setAccount does not change current if already set', async () => {
63
+ it('setAccount does not change current if already set', async () => {
64
64
  await manager.setAccount(makeAccount('alice'))
65
65
  await manager.setAccount(makeAccount('bob'))
66
66
 
@@ -68,12 +68,12 @@ describe('LineCredentialManager', () => {
68
68
  expect(loaded.current_account).toBe('alice')
69
69
  })
70
70
 
71
- test('getAccount returns null when no accounts', async () => {
71
+ it('getAccount returns null when no accounts', async () => {
72
72
  const result = await manager.getAccount()
73
73
  expect(result).toBeNull()
74
74
  })
75
75
 
76
- test('getAccount returns current account when no id given', async () => {
76
+ it('getAccount returns current account when no id given', async () => {
77
77
  const account = makeAccount('alice')
78
78
  await manager.setAccount(account)
79
79
 
@@ -81,7 +81,7 @@ describe('LineCredentialManager', () => {
81
81
  expect(result).toEqual(account)
82
82
  })
83
83
 
84
- test('getAccount returns account by id', async () => {
84
+ it('getAccount returns account by id', async () => {
85
85
  await manager.setAccount(makeAccount('alice'))
86
86
  const bob = makeAccount('bob')
87
87
  await manager.setAccount(bob)
@@ -90,13 +90,13 @@ describe('LineCredentialManager', () => {
90
90
  expect(result).toEqual(bob)
91
91
  })
92
92
 
93
- test('getAccount returns null for unknown id', async () => {
93
+ it('getAccount returns null for unknown id', async () => {
94
94
  await manager.setAccount(makeAccount('alice'))
95
95
  const result = await manager.getAccount('unknown')
96
96
  expect(result).toBeNull()
97
97
  })
98
98
 
99
- test('removeAccount removes the account', async () => {
99
+ it('removeAccount removes the account', async () => {
100
100
  await manager.setAccount(makeAccount('alice'))
101
101
  await manager.removeAccount('alice')
102
102
 
@@ -104,7 +104,7 @@ describe('LineCredentialManager', () => {
104
104
  expect(loaded.accounts['alice']).toBeUndefined()
105
105
  })
106
106
 
107
- test('removeAccount clears current if it was active', async () => {
107
+ it('removeAccount clears current if it was active', async () => {
108
108
  await manager.setAccount(makeAccount('alice'))
109
109
  await manager.removeAccount('alice')
110
110
 
@@ -112,7 +112,7 @@ describe('LineCredentialManager', () => {
112
112
  expect(loaded.current_account).toBeNull()
113
113
  })
114
114
 
115
- test('removeAccount sets next account as current when active is removed', async () => {
115
+ it('removeAccount sets next account as current when active is removed', async () => {
116
116
  await manager.setAccount(makeAccount('alice'))
117
117
  await manager.setAccount(makeAccount('bob'))
118
118
  await manager.removeAccount('alice')
@@ -121,7 +121,7 @@ describe('LineCredentialManager', () => {
121
121
  expect(loaded.current_account).toBe('bob')
122
122
  })
123
123
 
124
- test('setCurrentAccount updates current account', async () => {
124
+ it('setCurrentAccount updates current account', async () => {
125
125
  await manager.setAccount(makeAccount('alice'))
126
126
  await manager.setAccount(makeAccount('bob'))
127
127
  await manager.setCurrentAccount('bob')
@@ -130,7 +130,7 @@ describe('LineCredentialManager', () => {
130
130
  expect(loaded.current_account).toBe('bob')
131
131
  })
132
132
 
133
- test('listAccounts returns correct format', async () => {
133
+ it('listAccounts returns correct format', async () => {
134
134
  await manager.setAccount(makeAccount('alice'))
135
135
  await manager.setAccount(makeAccount('bob'))
136
136
 
@@ -148,7 +148,7 @@ describe('LineCredentialManager', () => {
148
148
  expect(bob?.is_current).toBe(false)
149
149
  })
150
150
 
151
- test('clearAll removes the credentials file', async () => {
151
+ it('clearAll removes the credentials file', async () => {
152
152
  await manager.setAccount(makeAccount('alice'))
153
153
  await manager.clearAll()
154
154
 
@@ -156,7 +156,7 @@ describe('LineCredentialManager', () => {
156
156
  expect(config).toEqual({ current_account: null, accounts: {} })
157
157
  })
158
158
 
159
- test('clearAll does not throw if file does not exist', async () => {
159
+ it('clearAll does not throw if file does not exist', async () => {
160
160
  await expect(manager.clearAll()).resolves.toBeUndefined()
161
161
  })
162
162
  })
@@ -1,4 +1,4 @@
1
- import { expect, test } from 'bun:test'
1
+ import { expect, it } from 'bun:test'
2
2
 
3
3
  import {
4
4
  CredentialManager,
@@ -12,38 +12,38 @@ import {
12
12
  LineSendResultSchema,
13
13
  } from '@/platforms/line/index'
14
14
 
15
- test('LineClient is exported from barrel', () => {
15
+ it('LineClient is exported from barrel', () => {
16
16
  expect(typeof LineClient).toBe('function')
17
17
  })
18
18
 
19
- test('LineError is exported from barrel', () => {
19
+ it('LineError is exported from barrel', () => {
20
20
  expect(typeof LineError).toBe('function')
21
21
  })
22
22
 
23
- test('CredentialManager is exported from barrel', () => {
23
+ it('CredentialManager is exported from barrel', () => {
24
24
  expect(typeof CredentialManager).toBe('function')
25
25
  })
26
26
 
27
- test('LineCredentialManager is exported from barrel', () => {
27
+ it('LineCredentialManager is exported from barrel', () => {
28
28
  expect(typeof LineCredentialManager).toBe('function')
29
29
  })
30
30
 
31
- test('LineChatSchema is exported from barrel', () => {
31
+ it('LineChatSchema is exported from barrel', () => {
32
32
  expect(typeof LineChatSchema.parse).toBe('function')
33
33
  })
34
34
 
35
- test('LineMessageSchema is exported from barrel', () => {
35
+ it('LineMessageSchema is exported from barrel', () => {
36
36
  expect(typeof LineMessageSchema.parse).toBe('function')
37
37
  })
38
38
 
39
- test('LineSendResultSchema is exported from barrel', () => {
39
+ it('LineSendResultSchema is exported from barrel', () => {
40
40
  expect(typeof LineSendResultSchema.parse).toBe('function')
41
41
  })
42
42
 
43
- test('LineAccountCredentialsSchema is exported from barrel', () => {
43
+ it('LineAccountCredentialsSchema is exported from barrel', () => {
44
44
  expect(typeof LineAccountCredentialsSchema.parse).toBe('function')
45
45
  })
46
46
 
47
- test('LineConfigSchema is exported from barrel', () => {
47
+ it('LineConfigSchema is exported from barrel', () => {
48
48
  expect(typeof LineConfigSchema.parse).toBe('function')
49
49
  })
@@ -1,4 +1,4 @@
1
- import { afterEach, describe, expect, mock, test } from 'bun:test'
1
+ import { afterEach, describe, expect, mock, it } from 'bun:test'
2
2
 
3
3
  import { LineListener } from '@/platforms/line/listener'
4
4
  import type { LinePushGenericEvent, LinePushMessageEvent } from '@/platforms/line/types'
@@ -73,7 +73,7 @@ describe('LineListener', () => {
73
73
  })
74
74
 
75
75
  describe('start', () => {
76
- test('calls login on LineClient', async () => {
76
+ it('calls login on LineClient', async () => {
77
77
  const client = createMockLineClient()
78
78
  listener = new LineListener(client)
79
79
 
@@ -82,7 +82,7 @@ describe('LineListener', () => {
82
82
  expect(mockLogin).toHaveBeenCalledTimes(1)
83
83
  })
84
84
 
85
- test('is idempotent', async () => {
85
+ it('is idempotent', async () => {
86
86
  const client = createMockLineClient()
87
87
  listener = new LineListener(client)
88
88
 
@@ -94,7 +94,7 @@ describe('LineListener', () => {
94
94
  })
95
95
 
96
96
  describe('connected event', () => {
97
- test('emits connected with account_id after successful login', async () => {
97
+ it('emits connected with account_id after successful login', async () => {
98
98
  const client = createMockLineClient()
99
99
  listener = new LineListener(client)
100
100
 
@@ -109,7 +109,7 @@ describe('LineListener', () => {
109
109
  })
110
110
 
111
111
  describe('message events', () => {
112
- test('emits message with parsed fields on incoming message', async () => {
112
+ it('emits message with parsed fields on incoming message', async () => {
113
113
  const client = createMockLineClient()
114
114
  listener = new LineListener(client)
115
115
 
@@ -138,7 +138,7 @@ describe('LineListener', () => {
138
138
  expect(messages[0].content_type).toBe('NONE')
139
139
  })
140
140
 
141
- test('uses to.id as chat_id for own messages', async () => {
141
+ it('uses to.id as chat_id for own messages', async () => {
142
142
  const client = createMockLineClient()
143
143
  listener = new LineListener(client)
144
144
 
@@ -160,7 +160,7 @@ describe('LineListener', () => {
160
160
  })
161
161
 
162
162
  describe('line_event catch-all', () => {
163
- test('emits line_event for every message', async () => {
163
+ it('emits line_event for every message', async () => {
164
164
  const client = createMockLineClient()
165
165
  listener = new LineListener(client)
166
166
 
@@ -180,7 +180,7 @@ describe('LineListener', () => {
180
180
  expect(events[0].type).toBe('message')
181
181
  })
182
182
 
183
- test('emits line_event for raw operation events', async () => {
183
+ it('emits line_event for raw operation events', async () => {
184
184
  const client = createMockLineClient()
185
185
  listener = new LineListener(client)
186
186
 
@@ -197,7 +197,7 @@ describe('LineListener', () => {
197
197
  })
198
198
 
199
199
  describe('stop', () => {
200
- test('aborts and prevents reconnection', async () => {
200
+ it('aborts and prevents reconnection', async () => {
201
201
  const client = createMockLineClient()
202
202
  listener = new LineListener(client)
203
203
 
@@ -210,7 +210,7 @@ describe('LineListener', () => {
210
210
  })
211
211
 
212
212
  describe('reconnection', () => {
213
- test('reconnects on listen error when still running', async () => {
213
+ it('reconnects on listen error when still running', async () => {
214
214
  const client = createMockLineClient()
215
215
  listener = new LineListener(client)
216
216
 
@@ -228,7 +228,7 @@ describe('LineListener', () => {
228
228
  expect(mockLogin.mock.calls.length).toBeGreaterThanOrEqual(2)
229
229
  })
230
230
 
231
- test('emits error and reconnects on login failure', async () => {
231
+ it('emits error and reconnects on login failure', async () => {
232
232
  let callCount = 0
233
233
  mockLogin.mockImplementation((): Promise<void> => {
234
234
  callCount++
@@ -252,7 +252,7 @@ describe('LineListener', () => {
252
252
  expect(mockLogin.mock.calls.length).toBeGreaterThanOrEqual(2)
253
253
  })
254
254
 
255
- test('does not reconnect after stop', async () => {
255
+ it('does not reconnect after stop', async () => {
256
256
  const client = createMockLineClient()
257
257
  listener = new LineListener(client)
258
258
 
@@ -267,7 +267,7 @@ describe('LineListener', () => {
267
267
  })
268
268
 
269
269
  describe('on/off/once', () => {
270
- test('off removes listener', async () => {
270
+ it('off removes listener', async () => {
271
271
  const client = createMockLineClient()
272
272
  listener = new LineListener(client)
273
273
 
@@ -297,7 +297,7 @@ describe('LineListener', () => {
297
297
  expect(messages[0].text).toBe('first')
298
298
  })
299
299
 
300
- test('once fires only once', async () => {
300
+ it('once fires only once', async () => {
301
301
  const client = createMockLineClient()
302
302
  listener = new LineListener(client)
303
303
 
@@ -326,7 +326,7 @@ describe('LineListener', () => {
326
326
  })
327
327
 
328
328
  describe('start after stop', () => {
329
- test('resets reconnect attempts on fresh start', async () => {
329
+ it('resets reconnect attempts on fresh start', async () => {
330
330
  const client = createMockLineClient()
331
331
  listener = new LineListener(client)
332
332