agent-messenger 2.37.2 → 2.38.1

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 (95) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +6 -0
  3. package/dist/package.json +1 -1
  4. package/dist/src/platforms/discord/cli.d.ts.map +1 -1
  5. package/dist/src/platforms/discord/cli.js +3 -1
  6. package/dist/src/platforms/discord/cli.js.map +1 -1
  7. package/dist/src/platforms/discord/client.d.ts +17 -1
  8. package/dist/src/platforms/discord/client.d.ts.map +1 -1
  9. package/dist/src/platforms/discord/client.js +46 -0
  10. package/dist/src/platforms/discord/client.js.map +1 -1
  11. package/dist/src/platforms/discord/commands/emoji.d.ts +13 -0
  12. package/dist/src/platforms/discord/commands/emoji.d.ts.map +1 -0
  13. package/dist/src/platforms/discord/commands/emoji.js +93 -0
  14. package/dist/src/platforms/discord/commands/emoji.js.map +1 -0
  15. package/dist/src/platforms/discord/commands/index.d.ts +2 -0
  16. package/dist/src/platforms/discord/commands/index.d.ts.map +1 -1
  17. package/dist/src/platforms/discord/commands/index.js +2 -0
  18. package/dist/src/platforms/discord/commands/index.js.map +1 -1
  19. package/dist/src/platforms/discord/commands/server.d.ts.map +1 -1
  20. package/dist/src/platforms/discord/commands/server.js +16 -1
  21. package/dist/src/platforms/discord/commands/server.js.map +1 -1
  22. package/dist/src/platforms/discord/commands/sticker.d.ts +15 -0
  23. package/dist/src/platforms/discord/commands/sticker.d.ts.map +1 -0
  24. package/dist/src/platforms/discord/commands/sticker.js +97 -0
  25. package/dist/src/platforms/discord/commands/sticker.js.map +1 -0
  26. package/dist/src/platforms/discord/expression-format.d.ts +41 -0
  27. package/dist/src/platforms/discord/expression-format.d.ts.map +1 -0
  28. package/dist/src/platforms/discord/expression-format.js +107 -0
  29. package/dist/src/platforms/discord/expression-format.js.map +1 -0
  30. package/dist/src/platforms/discord/expression-names.d.ts +9 -0
  31. package/dist/src/platforms/discord/expression-names.d.ts.map +1 -0
  32. package/dist/src/platforms/discord/expression-names.js +33 -0
  33. package/dist/src/platforms/discord/expression-names.js.map +1 -0
  34. package/dist/src/platforms/discord/index.d.ts +1 -1
  35. package/dist/src/platforms/discord/index.d.ts.map +1 -1
  36. package/dist/src/platforms/discord/index.js.map +1 -1
  37. package/dist/src/platforms/discord/types.d.ts +29 -0
  38. package/dist/src/platforms/discord/types.d.ts.map +1 -1
  39. package/dist/src/platforms/discord/types.js.map +1 -1
  40. package/dist/src/platforms/slack/cli.d.ts.map +1 -1
  41. package/dist/src/platforms/slack/cli.js +5 -0
  42. package/dist/src/platforms/slack/cli.js.map +1 -1
  43. package/dist/src/platforms/slack/commands/auth.d.ts.map +1 -1
  44. package/dist/src/platforms/slack/commands/auth.js +9 -3
  45. package/dist/src/platforms/slack/commands/auth.js.map +1 -1
  46. package/dist/src/platforms/slack/credential-manager.d.ts +2 -0
  47. package/dist/src/platforms/slack/credential-manager.d.ts.map +1 -1
  48. package/dist/src/platforms/slack/credential-manager.js +17 -3
  49. package/dist/src/platforms/slack/credential-manager.js.map +1 -1
  50. package/docs/content/docs/cli/discord.mdx +73 -0
  51. package/docs/content/docs/cli/slack.mdx +8 -1
  52. package/docs/content/docs/sdk/discord.mdx +50 -0
  53. package/package.json +1 -1
  54. package/skills/agent-channeltalk/SKILL.md +1 -1
  55. package/skills/agent-channeltalkbot/SKILL.md +1 -1
  56. package/skills/agent-discord/SKILL.md +69 -1
  57. package/skills/agent-discord/references/common-patterns.md +77 -0
  58. package/skills/agent-discordbot/SKILL.md +1 -1
  59. package/skills/agent-imessage/SKILL.md +1 -1
  60. package/skills/agent-instagram/SKILL.md +1 -1
  61. package/skills/agent-kakaotalk/SKILL.md +1 -1
  62. package/skills/agent-line/SKILL.md +1 -1
  63. package/skills/agent-slack/SKILL.md +9 -2
  64. package/skills/agent-slack/references/authentication.md +12 -0
  65. package/skills/agent-slack/references/common-patterns.md +18 -0
  66. package/skills/agent-slackbot/SKILL.md +1 -1
  67. package/skills/agent-teams/SKILL.md +1 -1
  68. package/skills/agent-telegram/SKILL.md +1 -1
  69. package/skills/agent-telegrambot/SKILL.md +1 -1
  70. package/skills/agent-webex/SKILL.md +1 -1
  71. package/skills/agent-webexbot/SKILL.md +1 -1
  72. package/skills/agent-wechatbot/SKILL.md +1 -1
  73. package/skills/agent-whatsapp/SKILL.md +1 -1
  74. package/skills/agent-whatsappbot/SKILL.md +1 -1
  75. package/src/platforms/discord/cli.ts +4 -0
  76. package/src/platforms/discord/client.test.ts +133 -0
  77. package/src/platforms/discord/client.ts +72 -0
  78. package/src/platforms/discord/commands/emoji.test.ts +122 -0
  79. package/src/platforms/discord/commands/emoji.ts +124 -0
  80. package/src/platforms/discord/commands/index.ts +2 -0
  81. package/src/platforms/discord/commands/server.test.ts +45 -1
  82. package/src/platforms/discord/commands/server.ts +21 -1
  83. package/src/platforms/discord/commands/sticker.test.ts +118 -0
  84. package/src/platforms/discord/commands/sticker.ts +135 -0
  85. package/src/platforms/discord/expression-format.test.ts +107 -0
  86. package/src/platforms/discord/expression-format.ts +117 -0
  87. package/src/platforms/discord/expression-names.test.ts +41 -0
  88. package/src/platforms/discord/expression-names.ts +36 -0
  89. package/src/platforms/discord/index.ts +2 -0
  90. package/src/platforms/discord/types.ts +31 -0
  91. package/src/platforms/slack/cli.test.ts +111 -1
  92. package/src/platforms/slack/cli.ts +5 -0
  93. package/src/platforms/slack/commands/auth.ts +14 -3
  94. package/src/platforms/slack/credential-manager.ts +21 -3
  95. package/src/platforms/slack/credential-manager.workspace-select.test.ts +70 -0
@@ -1,4 +1,6 @@
1
1
  import type { Config, WorkspaceCredentials } from './types.js';
2
+ export declare function setSelectedWorkspaceId(id: string | null): void;
3
+ export declare function getSelectedWorkspaceId(): string | null;
2
4
  export declare class SlackCredentialManager {
3
5
  private configDir;
4
6
  private credentialsPath;
@@ -1 +1 @@
1
- {"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/credential-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAE3D,qBAAa,sBAAsB;IACjC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAQ;IAE/B,YAAY,SAAS,CAAC,EAAE,MAAM,EAG7B;IAEK,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAU5B;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxC;IAEK,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CA8BpE;IAEK,YAAY,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7D;IAEK,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/C;IAEK,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInD;CACF;AAED,OAAO,EAAE,sBAAsB,IAAI,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"credential-manager.d.ts","sourceRoot":"","sources":["../../../../src/platforms/slack/credential-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAQ3D,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE9D;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAEtD;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,eAAe,CAAQ;IAE/B,YAAY,SAAS,CAAC,EAAE,MAAM,EAG7B;IAEK,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAU5B;IAEK,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxC;IAEK,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAkCpE;IAEK,YAAY,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7D;IAEK,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS/C;IAEK,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAInD;CACF;AAED,OAAO,EAAE,sBAAsB,IAAI,iBAAiB,EAAE,CAAA"}
@@ -2,6 +2,17 @@ import { existsSync } from 'node:fs';
2
2
  import { chmod, mkdir, readFile, writeFile } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
4
  import { getConfigDir } from '../../shared/utils/config-dir.js';
5
+ // Process-wide workspace selection set from the CLI `--workspace <id>` global flag (see
6
+ // the preAction hook in cli.ts). When present it makes commands target that workspace for
7
+ // this single CLI invocation WITHOUT mutating the persisted current_workspace, so the
8
+ // default (no-flag) path and any long-lived watcher keep resolving to current_workspace.
9
+ let selectedWorkspaceId = null;
10
+ export function setSelectedWorkspaceId(id) {
11
+ selectedWorkspaceId = id;
12
+ }
13
+ export function getSelectedWorkspaceId() {
14
+ return selectedWorkspaceId;
15
+ }
5
16
  export class SlackCredentialManager {
6
17
  configDir;
7
18
  credentialsPath;
@@ -25,6 +36,9 @@ export class SlackCredentialManager {
25
36
  await chmod(this.credentialsPath, 0o600);
26
37
  }
27
38
  async getWorkspace(id) {
39
+ // An explicit id wins; otherwise fall back to the process-wide `--workspace` selection.
40
+ // When neither is set, behaviour is unchanged (resolves to current_workspace below).
41
+ const resolvedId = id ?? selectedWorkspaceId ?? undefined;
28
42
  // Check env vars first (take precedence over file-based credentials)
29
43
  // Only use env credentials if no specific id requested, or id matches env workspace
30
44
  const envToken = process.env.E2E_SLACK_TOKEN;
@@ -32,7 +46,7 @@ export class SlackCredentialManager {
32
46
  const envWorkspaceId = process.env.E2E_SLACK_WORKSPACE_ID;
33
47
  const envWorkspaceName = process.env.E2E_SLACK_WORKSPACE_NAME;
34
48
  if (envToken && envCookie && envWorkspaceId && envWorkspaceName) {
35
- if (!id || id === envWorkspaceId) {
49
+ if (!resolvedId || resolvedId === envWorkspaceId) {
36
50
  return {
37
51
  token: envToken,
38
52
  cookie: envCookie,
@@ -42,8 +56,8 @@ export class SlackCredentialManager {
42
56
  }
43
57
  }
44
58
  const config = await this.load();
45
- if (id) {
46
- return config.workspaces[id] ?? null;
59
+ if (resolvedId) {
60
+ return config.workspaces[resolvedId] ?? null;
47
61
  }
48
62
  if (!config.current_workspace) {
49
63
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../../../src/platforms/slack/credential-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credential-manager.js","sourceRoot":"","sources":["../../../../src/platforms/slack/credential-manager.ts"],"names":[],"mappings":"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"}
@@ -72,6 +72,9 @@ agent-discord server current
72
72
  agent-discord server info <server-id>
73
73
  ```
74
74
 
75
+ `server info` reports the server's boost tier alongside its custom emoji and
76
+ sticker counts and the slots still free at that tier.
77
+
75
78
  ## Commands
76
79
 
77
80
  ### Whoami Command
@@ -182,6 +185,76 @@ agent-discord file list <channel-id>
182
185
  agent-discord file info <channel-id> <file-id>
183
186
  ```
184
187
 
188
+ ### Emoji Commands
189
+
190
+ Manage a server's custom emoji.
191
+
192
+ Listing needs no special permission. Creating needs `CREATE_GUILD_EXPRESSIONS`.
193
+ Deleting an expression you created needs either `CREATE_GUILD_EXPRESSIONS` or
194
+ `MANAGE_GUILD_EXPRESSIONS`; deleting someone else's needs `MANAGE_GUILD_EXPRESSIONS`.
195
+
196
+ ```bash
197
+ # List custom emoji, with static and animated counts
198
+ agent-discord emoji list <server-id>
199
+
200
+ # Upload a custom emoji (name defaults to the filename without extension)
201
+ agent-discord emoji create <server-id> <path>
202
+ agent-discord emoji create 123456789 ./potato.png --name potato
203
+
204
+ # Delete a custom emoji
205
+ agent-discord emoji delete <server-id> <emoji-id>
206
+ ```
207
+
208
+ An emoji name may only contain letters, digits and underscores, and must be
209
+ 2–32 characters. The image must be at most 256KB.
210
+
211
+ The media type is read from the file's own bytes, not its extension, and each
212
+ command accepts only what its endpoint takes — emoji accepts PNG, GIF, JPEG and
213
+ WebP. Anything else is refused before the request, because Discord answers a
214
+ mismatched part with a bare `Invalid Asset`.
215
+
216
+ ### Sticker Commands
217
+
218
+ Manage a server's custom stickers.
219
+
220
+ Listing needs no special permission. Creating needs `CREATE_GUILD_EXPRESSIONS`.
221
+ Deleting an expression you created needs either `CREATE_GUILD_EXPRESSIONS` or
222
+ `MANAGE_GUILD_EXPRESSIONS`; deleting someone else's needs `MANAGE_GUILD_EXPRESSIONS`.
223
+
224
+ ```bash
225
+ # List custom stickers
226
+ agent-discord sticker list <server-id>
227
+
228
+ # Upload a custom sticker
229
+ agent-discord sticker create <server-id> <path> --tags <emoji>
230
+ agent-discord sticker create 123456789 ./potato.png --tags 🥔 --name potato --description "A potato"
231
+
232
+ # Delete a custom sticker
233
+ agent-discord sticker delete <server-id> <sticker-id>
234
+ ```
235
+
236
+ **Sticker Options:**
237
+
238
+ - `--tags <emoji>` - Unicode emoji this sticker relates to (required)
239
+ - `--name <name>` - Sticker name, 2–30 characters (defaults to the filename)
240
+ - `--description <text>` - Sticker description
241
+
242
+ A sticker image must be a PNG, APNG, GIF or a Lottie JSON document, at most
243
+ 512KB — a JPEG or WebP is refused locally, since the sticker endpoint does not
244
+ take them. A JSON sticker must carry a `layers` array, which every Lottie animation has;
245
+ whether it actually renders is Discord's call.
246
+ Animated stickers are capped at 5 seconds. Lottie stickers upload only on
247
+ guilds with the `VERIFIED` or `PARTNERED` feature.
248
+
249
+ Discord documents 320x320 for stickers, but does not appear to enforce it — a
250
+ 408x408 PNG uploaded and registered unchanged. The CLI therefore checks the
251
+ file's format, not its dimensions. Keep to 320x320 to be safe.
252
+
253
+ > **Note:** Discord raises both allowances with the server's boost level —
254
+ > static emoji 50/100/150/250 and stickers 5/15/30/60 for boost tiers 0–3.
255
+ > `agent-discord server info <server-id>` reports the tier and the remaining
256
+ > slots.
257
+
185
258
  ### Snapshot Command
186
259
 
187
260
  Get server overview for AI agents (brief by default):
@@ -85,11 +85,18 @@ agent-slack workspace remove <workspace-id>
85
85
  # Check auth status
86
86
  agent-slack auth status
87
87
 
88
- # Logout from a workspace (defaults to current)
88
+ # Logout from a workspace (defaults to the --workspace selection, then current)
89
89
  agent-slack auth logout
90
90
  agent-slack auth logout <workspace-id>
91
+
92
+ # Run one command against another workspace without switching
93
+ agent-slack --workspace <workspace-id> channel list
94
+ agent-slack --workspace <workspace-id> auth status
95
+ agent-slack --workspace <workspace-id> auth logout
91
96
  ```
92
97
 
98
+ The global `--workspace <id>` flag goes before the command and applies to every command that uses a stored workspace, including `auth status` and `auth logout`. It targets that workspace for this one invocation only and does not change the current workspace. If the id is not stored, `auth status` fails with `Workspace not found: <id>`. `auth extract` and `auth qr` discover workspaces instead of targeting one, so the flag does not affect them; they set the current workspace only when none is set yet.
99
+
93
100
  ## Commands
94
101
 
95
102
  ### Whoami Command
@@ -125,6 +125,54 @@ const files = await client.listFiles(channelId)
125
125
  // → DiscordFile[]
126
126
  ```
127
127
 
128
+ ### Expressions (Emoji and Stickers)
129
+
130
+ ```typescript
131
+ // List a guild's custom emoji
132
+ const emojis = await client.listEmojis(guildId)
133
+ // → DiscordEmoji[] { id, name, animated?, managed?, available?, roles?, user? }
134
+
135
+ // Upload a custom emoji. The media type is read from the bytes, not the filename.
136
+ const bytes = new Uint8Array(await readFile('./potato.png'))
137
+ const emoji = await client.createEmoji(guildId, 'potato', bytes, 'potato.png')
138
+
139
+ await client.deleteEmoji(guildId, emoji.id)
140
+
141
+ // List a guild's custom stickers
142
+ const stickers = await client.listStickers(guildId)
143
+ // → DiscordSticker[] { id, name, tags, type, format_type, description?, ... }
144
+ // type: STANDARD = 1, GUILD = 2. format_type: PNG = 1, APNG = 2, LOTTIE = 3, GIF = 4.
145
+
146
+ // Upload a custom sticker. `tags` is the unicode emoji it relates to.
147
+ const sticker = await client.createSticker(
148
+ guildId,
149
+ { name: 'potato', description: 'A potato', tags: '🥔' },
150
+ bytes,
151
+ 'potato.png',
152
+ )
153
+
154
+ await client.deleteSticker(guildId, sticker.id)
155
+ ```
156
+
157
+ These methods take image bytes rather than a path, so the caller decides how the
158
+ image is read. The media type the upload declares is read from the bytes
159
+ themselves — a filename is unverified input, and Discord refuses a part whose
160
+ declared type does not match its content with a bare `Invalid Asset`.
161
+
162
+ Each endpoint takes its own formats: emoji accepts PNG, GIF, JPEG and WebP;
163
+ stickers accept PNG (including APNG), GIF and a JSON document for Lottie.
164
+ Bytes that are not one of the target endpoint's formats throw a `DiscordError`
165
+ with code `unsupported_asset` before any request is made. A sticker's JSON must
166
+ carry the `layers` array every Lottie animation has — `{}` is otherwise sent and
167
+ refused as `Invalid Asset`. Whether the animation renders is Discord's call, and
168
+ Lottie uploads need a `VERIFIED` or `PARTNERED` guild.
169
+
170
+ Listing needs no special permission. Creating needs `CREATE_GUILD_EXPRESSIONS`.
171
+ Deleting an expression you created needs either `CREATE_GUILD_EXPRESSIONS` or
172
+ `MANAGE_GUILD_EXPRESSIONS`; deleting someone else's needs `MANAGE_GUILD_EXPRESSIONS`. `getServer(guildId)`
173
+ returns `premium_tier` with the guild's `emojis` and `stickers`, which is how
174
+ you find out how many slots remain.
175
+
128
176
  ### Direct Messages
129
177
 
130
178
  ```typescript
@@ -369,6 +417,8 @@ const credentials = await manager.getCredentials()
369
417
  import type {
370
418
  DiscordGuild,
371
419
  DiscordChannel,
420
+ DiscordEmoji,
421
+ DiscordSticker,
372
422
  DiscordMessage,
373
423
  DiscordUser,
374
424
  DiscordDMChannel,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-messenger",
3
- "version": "2.37.2",
3
+ "version": "2.38.1",
4
4
  "description": "Multi-platform messaging CLI for AI agents (Slack, Discord, Teams, Webex, Telegram, Telegram Bot, WhatsApp, LINE, iMessage, Instagram, KakaoTalk, Channel Talk)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-channeltalk
3
3
  description: Interact with Channel Talk using extracted desktop app or browser credentials - read chats, send messages, search messages, manage groups
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-channeltalk:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-channeltalkbot
3
3
  description: Interact with Channel Talk workspaces using API credentials - send messages, read chats, manage groups and bots
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-channeltalkbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-discord
3
3
  description: Interact with Discord servers - send messages, read channels, manage reactions
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-discord:*)
6
6
  metadata:
7
7
  openclaw:
@@ -241,6 +241,9 @@ agent-discord server switch <server-id>
241
241
  agent-discord server current
242
242
  ```
243
243
 
244
+ `server info` also reports the boost tier with the custom emoji and sticker
245
+ counts and the slots still free at that tier.
246
+
244
247
  ### User Commands
245
248
 
246
249
  ```bash
@@ -383,6 +386,54 @@ agent-discord file list <channel-id>
383
386
  agent-discord file info <channel-id> <file-id>
384
387
  ```
385
388
 
389
+ ### Emoji Commands
390
+
391
+ Creating needs `CREATE_GUILD_EXPRESSIONS`; deleting someone else's expression
392
+ needs `MANAGE_GUILD_EXPRESSIONS`; listing needs neither. Name: letters, digits
393
+ and underscores only, 2–32 characters. Image at most 256KB.
394
+
395
+ ```bash
396
+ # List custom emoji
397
+ agent-discord emoji list <server-id>
398
+
399
+ # Upload (name defaults to the filename without extension)
400
+ agent-discord emoji create <server-id> <path>
401
+ agent-discord emoji create 1234567890123456789 ./potato.png --name potato
402
+
403
+ # Delete
404
+ agent-discord emoji delete <server-id> <emoji-id>
405
+ ```
406
+
407
+ ### Sticker Commands
408
+
409
+ Same permissions as emoji. PNG, APNG, GIF or Lottie JSON, at most 512KB. Name
410
+ 2–30 characters. Lottie needs a `VERIFIED` or `PARTNERED` guild. Discord
411
+ documents 320x320 but accepted a 408x408 PNG, so the CLI does not enforce a
412
+ size — it checks the format from the file's bytes instead of its extension.
413
+
414
+ ```bash
415
+ # List custom stickers
416
+ agent-discord sticker list <server-id>
417
+
418
+ # Upload — --tags is the unicode emoji the sticker relates to
419
+ agent-discord sticker create <server-id> <path> --tags <emoji>
420
+ agent-discord sticker create 1234567890123456789 ./potato.png --tags 🥔 --name potato
421
+
422
+ # Delete
423
+ agent-discord sticker delete <server-id> <sticker-id>
424
+ ```
425
+
426
+ The media type is read from the file's bytes, not its extension, and each
427
+ command takes only its endpoint's formats — emoji accepts PNG, GIF, JPEG and
428
+ WebP; stickers accept PNG, APNG, GIF and a JSON document for Lottie. Anything
429
+ else fails locally with a named error before a request is sent, so a batch says
430
+ which file was wrong instead of returning a bare `Invalid Asset`.
431
+
432
+ Check the remaining slots before a batch upload — `agent-discord server info
433
+ <server-id>` reports the boost tier with the counts and free slots. Discord
434
+ raises both allowances with the boost level: static emoji 50/100/150/250 and
435
+ stickers 5/15/30/60 for tiers 0–3.
436
+
386
437
  ### Snapshot Command
387
438
 
388
439
  Get server overview for AI agents (brief by default):
@@ -480,6 +531,23 @@ Common errors:
480
531
  - `No current server set`: Run `server switch <id>` first
481
532
  - `Message not found`: Invalid message ID
482
533
  - `Unknown Channel`: Invalid channel ID
534
+ - `File is not one of ...`: The file's bytes match no format this endpoint
535
+ takes. Refused locally — the request was never sent, so retrying is pointless.
536
+ - `File is a <format>; this endpoint takes ...`: The file is a real image, but
537
+ not one this endpoint accepts — a JPEG or WebP sticker, or a JSON emoji.
538
+ Convert it; also refused locally.
539
+ - `Emoji name may only contain ...` / `... name must be at least 2 characters`:
540
+ The name broke Discord's rules and was refused locally. Names come from the
541
+ filename unless `--name` is given, so `potato-13.png` fails on the hyphen.
542
+ - `JSON file is not a Lottie animation (no layers array)` / `... is not valid
543
+ JSON` / `... is not valid UTF-8`: A JSON sticker that cannot be an animation.
544
+ Each names its own fault, because a file can carry a `layers` array and still
545
+ be broken. All three are refused locally; Discord answers such a file with a
546
+ bare `Invalid Asset`.
547
+ - `Invalid Asset` (from Discord): The format was accepted locally but Discord
548
+ refused the content itself — a truncated or corrupt image.
549
+ - `Maximum number of stickers reached (N)` (from Discord): No slots left. Check
550
+ `server info` for the tier's allowance before a batch.
483
551
 
484
552
  ## Configuration
485
553
 
@@ -333,6 +333,83 @@ agent-discord channel list
333
333
 
334
334
  **When to use**: Managing multiple servers, cross-server operations.
335
335
 
336
+ ## Pattern 11: Bulk Upload Custom Emoji
337
+
338
+ **Use case**: Register a folder of images as server emoji without running out of slots halfway through
339
+
340
+ ```bash
341
+ #!/bin/bash
342
+
343
+ SERVER_ID="123456789012345678"
344
+
345
+ # Check the allowance first — Discord raises it with the boost level,
346
+ # so the free slots depend on premium_tier, not a fixed number.
347
+ INFO=$(agent-discord server info "$SERVER_ID")
348
+ FREE=$(echo "$INFO" | jq -r '.static_emoji_slots_remaining')
349
+ echo "Free emoji slots: $FREE"
350
+
351
+ UPLOADED=0
352
+ for FILE in ./emoji/*.png; do
353
+ if [ "$UPLOADED" -ge "$FREE" ]; then
354
+ echo "Out of slots — stopping. Remaining files were not uploaded."
355
+ break
356
+ fi
357
+
358
+ # The name defaults to the filename without its extension, and Discord only
359
+ # accepts letters, digits and underscores. Rename potato-01.png beforehand,
360
+ # or pass --name.
361
+ RESULT=$(agent-discord emoji create "$SERVER_ID" "$FILE")
362
+
363
+ if echo "$RESULT" | jq -e '.success' > /dev/null 2>&1; then
364
+ UPLOADED=$((UPLOADED + 1))
365
+ else
366
+ echo "Failed on $FILE: $(echo "$RESULT" | jq -r '.error')"
367
+ fi
368
+ done
369
+
370
+ echo "Uploaded $UPLOADED emoji"
371
+ agent-discord emoji list "$SERVER_ID" | jq '{count, static_count}'
372
+ ```
373
+
374
+ **Notes**:
375
+
376
+ - `emoji create` rejects a name outside Discord's rules before the request, so a
377
+ bad filename names itself instead of returning `Invalid Form Body`.
378
+ - Roll back a mistake with `agent-discord emoji delete <server-id> <emoji-id>`.
379
+
380
+ ## Pattern 12: Upload a Server Sticker
381
+
382
+ **Use case**: Add a sticker, which has a stricter format than emoji
383
+
384
+ ```bash
385
+ #!/bin/bash
386
+
387
+ SERVER_ID="123456789012345678"
388
+
389
+ # Discord documents 320x320 for stickers (it accepted a larger PNG in
390
+ # practice, but stay on spec). Max 512KB.
391
+ sips -z 320 320 ./art/potato.png --out /tmp/potato_320.png
392
+
393
+ # --tags is the unicode emoji the sticker relates to, and is required.
394
+ RESULT=$(agent-discord sticker create "$SERVER_ID" /tmp/potato_320.png \
395
+ --tags 🥔 --name potato --description "A potato")
396
+
397
+ if echo "$RESULT" | jq -e '.success' > /dev/null 2>&1; then
398
+ echo "Sticker id: $(echo "$RESULT" | jq -r '.id')"
399
+ else
400
+ echo "Failed: $(echo "$RESULT" | jq -r '.error')"
401
+ fi
402
+
403
+ agent-discord sticker list "$SERVER_ID"
404
+ ```
405
+
406
+ **Notes**:
407
+
408
+ - Base sticker slots are 5, rising to 15/30/60 with boost tiers 1/2/3.
409
+ `agent-discord server info` reports `sticker_slots_remaining`.
410
+ - Sticker names are 2–30 characters. A one-character name is refused locally.
411
+ - Lottie JSON uploads only on `VERIFIED` or `PARTNERED` guilds.
412
+
336
413
  ## Best Practices
337
414
 
338
415
  ### 1. Always Get Channel IDs First
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-discordbot
3
3
  description: Interact with Discord servers using bot tokens - send messages, read channels, manage reactions
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-discordbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-imessage
3
3
  description: Interact with iMessage on a Mac via the imsg tool - send messages, read chats, watch for new messages
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-imessage:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-instagram
3
3
  description: Interact with Instagram DMs - send messages, read conversations, manage accounts
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-instagram:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-kakaotalk
3
3
  description: Interact with KakaoTalk - send messages, read chats, manage conversations
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-kakaotalk:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-line
3
3
  description: Interact with LINE - send messages, read chats, manage conversations
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-line:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-slack
3
3
  description: Interact with Slack workspaces - send messages, read channels, manage reactions
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-slack:*)
6
6
  metadata:
7
7
  openclaw:
@@ -74,8 +74,14 @@ agent-slack workspace remove <workspace-id>
74
74
 
75
75
  # Check auth status
76
76
  agent-slack auth status
77
+
78
+ # Run one command against another workspace without switching
79
+ agent-slack --workspace <workspace-id> channel list
80
+ agent-slack --workspace <workspace-id> auth status
77
81
  ```
78
82
 
83
+ The global `--workspace <id>` flag goes before the command and applies to every command that uses a stored workspace, including `auth status` and `auth logout`. It targets that workspace for this one invocation only and does not change the current workspace. If the id is not stored, `auth status` fails with `Workspace not found: <id>`. `auth extract` and `auth qr` discover workspaces instead of targeting one, so the flag does not affect them; they set the current workspace only when none is set yet.
84
+
79
85
  ## Memory
80
86
 
81
87
  The agent maintains a `~/.config/agent-messenger/MEMORY.md` file as persistent memory across sessions. This is agent-managed — the CLI does not read or write this file. Use the `Read` and `Write` tools to manage your memory file.
@@ -171,9 +177,10 @@ agent-slack auth qr --debug # show each redirect hop for troubleshooting
171
177
  # Check auth status
172
178
  agent-slack auth status
173
179
 
174
- # Logout from a workspace (defaults to current)
180
+ # Logout from a workspace (defaults to the --workspace selection, then current)
175
181
  agent-slack auth logout
176
182
  agent-slack auth logout <workspace-id>
183
+ agent-slack --workspace <workspace-id> auth logout
177
184
  ```
178
185
 
179
186
  ### Whoami Command
@@ -152,6 +152,18 @@ agent-slack workspace switch T789012
152
152
 
153
153
  All subsequent commands will use the selected workspace until you switch again.
154
154
 
155
+ ### Use a Workspace for One Command
156
+
157
+ Pass the global `--workspace <id>` flag before the command to target another workspace for a single invocation without switching:
158
+
159
+ ```bash
160
+ agent-slack --workspace T789012 channel list
161
+ agent-slack --workspace T789012 auth status
162
+ agent-slack --workspace T789012 auth logout
163
+ ```
164
+
165
+ The flag applies to every command that uses a stored workspace, including `auth status` and `auth logout`, and does not change `current_workspace`. `auth extract` and `auth qr` discover workspaces instead of targeting one, so the flag does not affect them; they set `current_workspace` only when none is set yet. `auth logout` removes the selected workspace when no positional id is given (a positional id still wins), and `auth status` fails with `Workspace not found: <id>` if the selected id is not stored.
166
+
155
167
  ### Current Workspace
156
168
 
157
169
  Check which workspace is active:
@@ -612,6 +612,24 @@ agent-slack reminder complete Rm001
612
612
  agent-slack reminder delete Rm002
613
613
  ```
614
614
 
615
+ ## Pattern: Work Across Workspaces
616
+
617
+ **Use case**: Read or act in a second workspace without changing the current one
618
+
619
+ ```bash
620
+ #!/bin/bash
621
+
622
+ # The global --workspace flag targets one workspace for a single command
623
+ agent-slack --workspace T789012 auth status
624
+ agent-slack --workspace T789012 channel list
625
+ agent-slack --workspace T789012 message send general "Cross-workspace update"
626
+
627
+ # The current workspace is unchanged afterwards
628
+ agent-slack workspace current
629
+ ```
630
+
631
+ **When to use**: Occasional commands in another workspace. Use `workspace switch` only when the default should change for every later command.
632
+
615
633
  ## See Also
616
634
 
617
635
  - [Authentication Guide](authentication.md) - Setting up credentials
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-slackbot
3
3
  description: Interact with Slack workspaces using bot tokens - send messages, read channels, manage reactions
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-slackbot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-teams
3
3
  description: Interact with Microsoft Teams - send messages, read channels, manage reactions
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-teams:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-telegram
3
3
  description: Interact with Telegram through TDLib - authenticate, inspect chats, and send messages
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-telegram:*)
6
6
  ---
7
7
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-telegrambot
3
3
  description: Interact with Telegram using bot tokens - send messages, read chats, manage reactions
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-telegrambot:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-webex
3
3
  description: Interact with Cisco Webex - send messages, read spaces, manage memberships
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-webex:*)
6
6
  metadata:
7
7
  openclaw:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agent-webexbot
3
3
  description: Interact with Cisco Webex using bot tokens - send messages, reply in threads, upload and download files, look up people, read spaces, manage memberships, stream real-time events
4
- version: 2.37.2
4
+ version: 2.38.1
5
5
  allowed-tools: Bash(agent-webexbot:*)
6
6
  metadata:
7
7
  openclaw: