@openclaw/discord 2026.7.2-beta.7 → 2026.8.1-beta.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 (95) hide show
  1. package/dist/{account-inspect-SXiCBCgP.js → account-inspect-CqzrH14k.js} +48 -42
  2. package/dist/account-inspect-api.js +1 -1
  3. package/dist/action-runtime-api.js +1 -1
  4. package/dist/{active-turn-thread-route-MlKWp8RD.js → active-turn-thread-route-fmHl1HNd.js} +9 -11
  5. package/dist/{activities-api-DTKsuDxf.js → activities-api-DS7vpdtp.js} +4 -4
  6. package/dist/activities-api.js +1 -1
  7. package/dist/{allow-list-DzKrtfah.js → allow-list-DnxIlPP2.js} +2 -3
  8. package/dist/{api-DnrK9gML.js → api-DNVbJyEy.js} +7 -2
  9. package/dist/api.js +15 -15
  10. package/dist/{approval-handler.runtime-HymvFTYn.js → approval-handler.runtime-B6yEV79q.js} +5 -5
  11. package/dist/{approval-message-safety-DEyKVsAw.js → approval-message-safety-AcIxvrf3.js} +1 -1
  12. package/dist/{audit-CjsrabP8.js → audit-Db-rlntl.js} +4 -4
  13. package/dist/{channel-vKa-76xY.js → channel-CnnbJSt5.js} +46 -72
  14. package/dist/{channel-actions-uXFTJX3o.js → channel-actions-5s_hjYKd.js} +4 -4
  15. package/dist/{channel-actions.runtime-CIYU90sl.js → channel-actions.runtime-CLKrx6tr.js} +53 -36
  16. package/dist/channel-config-api.js +1 -1
  17. package/dist/channel-plugin-api.js +1 -1
  18. package/dist/{channel.setup-CmcwZ_qd.js → channel.setup-BFAO-V1P.js} +15 -53
  19. package/dist/{config-schema-WHRQcY19.js → config-schema-BgEskFAs.js} +9 -4
  20. package/dist/{directory-config-D_LojtCe.js → directory-config-BVX7Cflc.js} +1 -1
  21. package/dist/directory-contract-api.js +1 -1
  22. package/dist/{directory-live-Bw5Ephzv.js → directory-live-DGIGxpIo.js} +6 -3
  23. package/dist/{doctor-Bc4S1qyd.js → doctor-BzC-TLnB.js} +4 -4
  24. package/dist/{doctor-contract-CCFMIDk9.js → doctor-contract-DLa-BTiU.js} +2 -3
  25. package/dist/doctor-contract-api.js +147 -2
  26. package/dist/{handle-action.guild-admin-D6VRRW-C.js → handle-action.guild-admin-BNVTUISF.js} +4 -7
  27. package/dist/{inbound-event-delivery-CEPlt2uz.js → inbound-event-delivery-De2qxTrP.js} +4 -25
  28. package/dist/index.js +4 -2
  29. package/dist/{message-handler-CeiSulIw.js → message-handler-Unk_f10F.js} +41 -32
  30. package/dist/{message-handler.preflight-DibgQFf2.js → message-handler.preflight-C9zecxR9.js} +50 -26
  31. package/dist/{message-handler.process-Dnc_oz9y.js → message-handler.process-DWQ6UHHu.js} +130 -166
  32. package/dist/{message-utils-BgTwT_q7.js → message-utils-BSCPVgy0.js} +4 -4
  33. package/dist/{model-picker-preference-primitives-D25pnCOu.js → model-picker-preference-primitives-BHT1LkR_.js} +3 -3
  34. package/dist/{outbound-adapter-DtE-i2OJ.js → outbound-adapter-D9nRivT1.js} +91 -32
  35. package/dist/{outbound-components-C7GVyfPh.js → outbound-components-cTzwBJ60.js} +3 -3
  36. package/dist/{outbound-session-route-H-HoyH5U.js → outbound-session-route-DxLkrgKQ.js} +68 -95
  37. package/dist/{pluralkit-CD4B11JB.js → pluralkit-DdiJ9KMK.js} +1 -1
  38. package/dist/{preflight-audio-BjnQZ5yS.js → preflight-audio-DrnqFA8U.js} +22 -28
  39. package/dist/{probe-BeWKhjqX.js → probe-Bl-k5_Ku.js} +36 -12
  40. package/dist/probe.runtime-M9fREKvp.js +2 -0
  41. package/dist/{provider-DfQJX3z5.js → provider-DvSNb-2v.js} +969 -1248
  42. package/dist/{provider-session.runtime-Bo88k0pV.js → provider-session.runtime-BUEqD0rA.js} +3 -3
  43. package/dist/provider.runtime-C9PnJZbZ.js +2 -0
  44. package/dist/realtime-session.runtime-C7wen-aF.js +1340 -0
  45. package/dist/{resolve-allowlist-common-DHERApxi.js → resolve-allowlist-common-D04lpEzb.js} +2 -2
  46. package/dist/{resolve-channels-BjepAj8b.js → resolve-channels-Dm7jEeg6.js} +4 -4
  47. package/dist/{resolve-users-Bc28htgt.js → resolve-users-bktrCUUU.js} +3 -3
  48. package/dist/{chunk-DX4jpFQP.js → retry-CLpJcXXf.js} +291 -68
  49. package/dist/{runtime-_aRC6V2s.js → runtime-DGsSyDTS.js} +30 -25
  50. package/dist/{runtime-BmW_j_hl.js → runtime-DoHjckYm.js} +4 -6
  51. package/dist/runtime-api.actions.js +2 -2
  52. package/dist/runtime-api.js +22 -23
  53. package/dist/runtime-api.lookup.js +5 -5
  54. package/dist/runtime-api.monitor-CHxrFPnW.js +5 -0
  55. package/dist/runtime-api.monitor.js +5 -5
  56. package/dist/runtime-api.send.js +6 -6
  57. package/dist/runtime-api.threads.js +5 -6
  58. package/dist/sdk-runtime-QpY8PvCh.js +370 -0
  59. package/dist/{send-CdkZ6zeW.js → send-B7Q6Oc1I.js} +175 -86
  60. package/dist/{send.components-5uqwkjgE.js → send.components-iJyFXw9L.js} +24 -28
  61. package/dist/{send.outbound-D-80Ej-t.js → send.outbound-DS5tHwfR.js} +37 -24
  62. package/dist/{send.reactions-CtlmGd_o.js → send.reactions-BAn0iiVQ.js} +14 -21
  63. package/dist/{send.receipt-CuwRrpFz.js → send.receipt-IPI1p-SP.js} +19 -1
  64. package/dist/{send.shared-jpvAG_u6.js → send.shared-BmwFjW6T.js} +16 -85
  65. package/dist/{sender-identity-mG_zsdox.js → sender-identity-QtalnCYv.js} +1 -1
  66. package/dist/setup-entry.js +0 -5
  67. package/dist/setup-plugin-api.js +1 -1
  68. package/dist/{shared-CXF1tup1.js → shared-BIXIX6uJ.js} +16 -17
  69. package/dist/{subagent-hooks-Dxy7Fmnq.js → subagent-hooks-CTt5KCJr.js} +2 -2
  70. package/dist/subagent-hooks-api.js +2 -6
  71. package/dist/subagent-progress-DhaE_h8a.js +109 -0
  72. package/dist/{system-events-DdUqf91B.js → system-events-CTqDf6_s.js} +2 -2
  73. package/dist/{target-resolver-C3s_2m0t.js → target-resolver-maOKSqO0.js} +2 -2
  74. package/dist/targets-yUFTHoAx.js +3 -0
  75. package/dist/{thread-bindings-C-M-ly7P.js → thread-bindings-3L8p82GV.js} +5 -7
  76. package/dist/{thread-bindings.manager-DYvSlrva.js → thread-bindings.manager-DCIH6WDC.js} +257 -29
  77. package/dist/{thread-bindings.session-updates-DAIlp7Px.js → thread-bindings.session-updates-bJ2KQFY6.js} +1 -1
  78. package/dist/{thread-bindings.state-Cgi5uRn-.js → thread-bindings.state-aeV8HNgV.js} +2 -15
  79. package/dist/{transcripts-source-DIKGsTGT.js → transcripts-source-CfFMexGt.js} +1 -1
  80. package/dist/transcripts-source-api.js +1 -1
  81. package/dist/{typing--Mzo2kM7.js → typing-CS-nNVoe.js} +1 -1
  82. package/dist/voice-runtime-BEdqNcST.js +2459 -0
  83. package/openclaw.plugin.json +203 -19
  84. package/package.json +15 -9
  85. package/skills/discord/SKILL.md +22 -115
  86. package/dist/legacy-state-migrations-api.js +0 -138
  87. package/dist/manager.runtime-Bjav3pfC.js +0 -3655
  88. package/dist/preflight-audio.runtime-CoCXMM8r.js +0 -7
  89. package/dist/probe.runtime-DqFGFMbZ.js +0 -2
  90. package/dist/provider.runtime-Cy7XZmyh.js +0 -2
  91. package/dist/runtime-api.monitor-CCRubd3-.js +0 -5
  92. package/dist/session-binding-contract-api.js +0 -2
  93. package/dist/subagent-progress-DI3sYLLo.js +0 -664
  94. package/dist/targets-Dv_RN7vT.js +0 -3
  95. package/dist/thread-bindings.discord-api-BoDNqamb.js +0 -246
@@ -1,5 +1,9 @@
1
1
  {
2
2
  "id": "discord",
3
+ "doctorContract": {
4
+ "configRepair": true,
5
+ "stateMigrations": true
6
+ },
3
7
  "name": "Discord",
4
8
  "description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.",
5
9
  "icon": "https://cdn.simpleicons.org/discord",
@@ -256,13 +260,6 @@
256
260
  "exclusiveMinimum": 0,
257
261
  "maximum": 9007199254740991
258
262
  },
259
- "render": {
260
- "type": "string",
261
- "enum": [
262
- "text",
263
- "rich"
264
- ]
265
- },
266
263
  "toolProgress": {
267
264
  "type": "boolean"
268
265
  },
@@ -424,6 +421,29 @@
424
421
  ],
425
422
  "additionalProperties": false
426
423
  },
424
+ {
425
+ "type": "object",
426
+ "properties": {
427
+ "source": {
428
+ "type": "string",
429
+ "const": "store"
430
+ },
431
+ "provider": {
432
+ "type": "string",
433
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
434
+ },
435
+ "id": {
436
+ "type": "string",
437
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
438
+ }
439
+ },
440
+ "required": [
441
+ "source",
442
+ "provider",
443
+ "id"
444
+ ],
445
+ "additionalProperties": false
446
+ },
427
447
  {
428
448
  "type": "object",
429
449
  "properties": {
@@ -1009,6 +1029,9 @@
1009
1029
  "intents": {
1010
1030
  "type": "object",
1011
1031
  "properties": {
1032
+ "messageContent": {
1033
+ "type": "boolean"
1034
+ },
1012
1035
  "presence": {
1013
1036
  "type": "boolean"
1014
1037
  },
@@ -1365,6 +1388,29 @@
1365
1388
  "id"
1366
1389
  ],
1367
1390
  "additionalProperties": false
1391
+ },
1392
+ {
1393
+ "type": "object",
1394
+ "properties": {
1395
+ "source": {
1396
+ "type": "string",
1397
+ "const": "store"
1398
+ },
1399
+ "provider": {
1400
+ "type": "string",
1401
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
1402
+ },
1403
+ "id": {
1404
+ "type": "string",
1405
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
1406
+ }
1407
+ },
1408
+ "required": [
1409
+ "source",
1410
+ "provider",
1411
+ "id"
1412
+ ],
1413
+ "additionalProperties": false
1368
1414
  }
1369
1415
  ]
1370
1416
  }
@@ -1518,6 +1564,29 @@
1518
1564
  "id"
1519
1565
  ],
1520
1566
  "additionalProperties": false
1567
+ },
1568
+ {
1569
+ "type": "object",
1570
+ "properties": {
1571
+ "source": {
1572
+ "type": "string",
1573
+ "const": "store"
1574
+ },
1575
+ "provider": {
1576
+ "type": "string",
1577
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
1578
+ },
1579
+ "id": {
1580
+ "type": "string",
1581
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
1582
+ }
1583
+ },
1584
+ "required": [
1585
+ "source",
1586
+ "provider",
1587
+ "id"
1588
+ ],
1589
+ "additionalProperties": false
1521
1590
  }
1522
1591
  ]
1523
1592
  }
@@ -1605,6 +1674,29 @@
1605
1674
  ],
1606
1675
  "additionalProperties": false
1607
1676
  },
1677
+ {
1678
+ "type": "object",
1679
+ "properties": {
1680
+ "source": {
1681
+ "type": "string",
1682
+ "const": "store"
1683
+ },
1684
+ "provider": {
1685
+ "type": "string",
1686
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
1687
+ },
1688
+ "id": {
1689
+ "type": "string",
1690
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
1691
+ }
1692
+ },
1693
+ "required": [
1694
+ "source",
1695
+ "provider",
1696
+ "id"
1697
+ ],
1698
+ "additionalProperties": false
1699
+ },
1608
1700
  {
1609
1701
  "type": "object",
1610
1702
  "properties": {
@@ -1976,13 +2068,6 @@
1976
2068
  "exclusiveMinimum": 0,
1977
2069
  "maximum": 9007199254740991
1978
2070
  },
1979
- "render": {
1980
- "type": "string",
1981
- "enum": [
1982
- "text",
1983
- "rich"
1984
- ]
1985
- },
1986
2071
  "toolProgress": {
1987
2072
  "type": "boolean"
1988
2073
  },
@@ -2144,6 +2229,29 @@
2144
2229
  ],
2145
2230
  "additionalProperties": false
2146
2231
  },
2232
+ {
2233
+ "type": "object",
2234
+ "properties": {
2235
+ "source": {
2236
+ "type": "string",
2237
+ "const": "store"
2238
+ },
2239
+ "provider": {
2240
+ "type": "string",
2241
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
2242
+ },
2243
+ "id": {
2244
+ "type": "string",
2245
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
2246
+ }
2247
+ },
2248
+ "required": [
2249
+ "source",
2250
+ "provider",
2251
+ "id"
2252
+ ],
2253
+ "additionalProperties": false
2254
+ },
2147
2255
  {
2148
2256
  "type": "object",
2149
2257
  "properties": {
@@ -2729,6 +2837,9 @@
2729
2837
  "intents": {
2730
2838
  "type": "object",
2731
2839
  "properties": {
2840
+ "messageContent": {
2841
+ "type": "boolean"
2842
+ },
2732
2843
  "presence": {
2733
2844
  "type": "boolean"
2734
2845
  },
@@ -3085,6 +3196,29 @@
3085
3196
  "id"
3086
3197
  ],
3087
3198
  "additionalProperties": false
3199
+ },
3200
+ {
3201
+ "type": "object",
3202
+ "properties": {
3203
+ "source": {
3204
+ "type": "string",
3205
+ "const": "store"
3206
+ },
3207
+ "provider": {
3208
+ "type": "string",
3209
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
3210
+ },
3211
+ "id": {
3212
+ "type": "string",
3213
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
3214
+ }
3215
+ },
3216
+ "required": [
3217
+ "source",
3218
+ "provider",
3219
+ "id"
3220
+ ],
3221
+ "additionalProperties": false
3088
3222
  }
3089
3223
  ]
3090
3224
  }
@@ -3238,6 +3372,29 @@
3238
3372
  "id"
3239
3373
  ],
3240
3374
  "additionalProperties": false
3375
+ },
3376
+ {
3377
+ "type": "object",
3378
+ "properties": {
3379
+ "source": {
3380
+ "type": "string",
3381
+ "const": "store"
3382
+ },
3383
+ "provider": {
3384
+ "type": "string",
3385
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
3386
+ },
3387
+ "id": {
3388
+ "type": "string",
3389
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
3390
+ }
3391
+ },
3392
+ "required": [
3393
+ "source",
3394
+ "provider",
3395
+ "id"
3396
+ ],
3397
+ "additionalProperties": false
3241
3398
  }
3242
3399
  ]
3243
3400
  }
@@ -3325,6 +3482,29 @@
3325
3482
  ],
3326
3483
  "additionalProperties": false
3327
3484
  },
3485
+ {
3486
+ "type": "object",
3487
+ "properties": {
3488
+ "source": {
3489
+ "type": "string",
3490
+ "const": "store"
3491
+ },
3492
+ "provider": {
3493
+ "type": "string",
3494
+ "pattern": "^[a-z][a-z0-9_-]{0,63}$"
3495
+ },
3496
+ "id": {
3497
+ "type": "string",
3498
+ "pattern": "^[A-Z][A-Z0-9_]{0,127}$"
3499
+ }
3500
+ },
3501
+ "required": [
3502
+ "source",
3503
+ "provider",
3504
+ "id"
3505
+ ],
3506
+ "additionalProperties": false
3507
+ },
3328
3508
  {
3329
3509
  "type": "object",
3330
3510
  "properties": {
@@ -3521,11 +3701,11 @@
3521
3701
  },
3522
3702
  "streaming": {
3523
3703
  "label": "Discord Streaming Mode",
3524
- "help": "Unified Discord stream preview mode: \"off\" | \"partial\" | \"block\" | \"progress\". \"progress\" keeps a single editable progress draft until final delivery. Legacy boolean/streamMode keys are auto-mapped."
3704
+ "help": "Discord preview streaming is off by default. Set mode to \"partial\", \"block\", or \"progress\" to opt in. Run openclaw doctor --fix to migrate legacy keys."
3525
3705
  },
3526
3706
  "streaming.mode": {
3527
3707
  "label": "Discord Streaming Mode",
3528
- "help": "Canonical Discord preview mode: \"off\" | \"partial\" | \"block\" | \"progress\"."
3708
+ "help": "Discord preview mode: \"off\" | \"partial\" | \"block\" | \"progress\". Default: \"off\"."
3529
3709
  },
3530
3710
  "streaming.chunkMode": {
3531
3711
  "label": "Discord Chunk Mode",
@@ -3533,7 +3713,7 @@
3533
3713
  },
3534
3714
  "streaming.block.enabled": {
3535
3715
  "label": "Discord Block Streaming Enabled",
3536
- "help": "Enable chunked block-style Discord preview delivery when channels.discord.streaming.mode=\"block\"."
3716
+ "help": "Enable normal Discord block replies. This takes precedence over editable preview delivery."
3537
3717
  },
3538
3718
  "streaming.block.coalesce": {
3539
3719
  "label": "Discord Block Streaming Coalesce",
@@ -3557,7 +3737,7 @@
3557
3737
  },
3558
3738
  "streaming.preview.commandText": {
3559
3739
  "label": "Discord Draft Command Text",
3560
- "help": "Command/exec detail in preview tool-progress lines: \"raw\" preserves released behavior; \"status\" shows only the tool label."
3740
+ "help": "Command/exec detail in preview tool-progress lines: \"status\" is the safe default; \"raw\" opts into command text."
3561
3741
  },
3562
3742
  "streaming.progress.label": {
3563
3743
  "label": "Discord Progress Label",
@@ -3585,7 +3765,7 @@
3585
3765
  },
3586
3766
  "streaming.progress.commandText": {
3587
3767
  "label": "Discord Progress Command Text",
3588
- "help": "Command/exec detail in progress draft lines: \"raw\" preserves released behavior; \"status\" shows only the tool label."
3768
+ "help": "Command/exec detail in progress draft lines: \"status\" is the safe default; \"raw\" opts into command text."
3589
3769
  },
3590
3770
  "proxy": {
3591
3771
  "label": "Discord Proxy URL",
@@ -3627,6 +3807,10 @@
3627
3807
  "label": "Discord Component TTL (ms)",
3628
3808
  "help": "How long sent Discord component callbacks remain registered. Default is 1800000 (30 minutes); maximum is 86400000 (24 hours)."
3629
3809
  },
3810
+ "intents.messageContent": {
3811
+ "label": "Discord Message Content Intent",
3812
+ "help": "Request the privileged Message Content intent (default: true). Set false only for mention-only guild operation when Discord cannot grant the intent; DMs and explicit mentions still include message content."
3813
+ },
3630
3814
  "intents.presence": {
3631
3815
  "label": "Discord Presence Intent",
3632
3816
  "help": "Enable the Guild Presences privileged intent. Must also be enabled in the Discord Developer Portal. Allows tracking user activities (e.g. Spotify). Default: false."
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/discord",
3
- "version": "2026.7.2-beta.7",
3
+ "version": "2026.8.1-beta.2",
4
4
  "description": "OpenClaw Discord channel plugin for channels, DMs, commands, and app events.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,7 +20,7 @@
20
20
  "zod": "4.4.3"
21
21
  },
22
22
  "peerDependencies": {
23
- "openclaw": ">=2026.7.2-beta.7"
23
+ "openclaw": ">=2026.8.1-beta.2"
24
24
  },
25
25
  "peerDependenciesMeta": {
26
26
  "openclaw": {
@@ -32,9 +32,6 @@
32
32
  "./index.ts"
33
33
  ],
34
34
  "setupEntry": "./dist/setup-entry.js",
35
- "setupFeatures": {
36
- "legacyStateMigrations": true
37
- },
38
35
  "channel": {
39
36
  "id": "discord",
40
37
  "configuredState": {
@@ -73,13 +70,22 @@
73
70
  "cli": {
74
71
  "flags": "--use-env",
75
72
  "description": "Use DISCORD_BOT_TOKEN"
76
- }
73
+ },
74
+ "envVars": [
75
+ "DISCORD_BOT_TOKEN"
76
+ ]
77
77
  }
78
78
  ]
79
79
  },
80
80
  "commands": {
81
81
  "nativeCommandsAutoEnabled": true,
82
82
  "nativeSkillsAutoEnabled": true
83
+ },
84
+ "doctorCapabilities": {
85
+ "dmAllowFromMode": "topOnly",
86
+ "groupModel": "route",
87
+ "groupAllowFromFallbackToAllowFrom": false,
88
+ "warnOnEmptyGroupSenderAllowlist": false
83
89
  }
84
90
  },
85
91
  "install": {
@@ -89,10 +95,10 @@
89
95
  "allowInvalidConfigRecovery": true
90
96
  },
91
97
  "compat": {
92
- "pluginApi": ">=2026.7.2-beta.7"
98
+ "pluginApi": ">=2026.8.1-beta.2"
93
99
  },
94
100
  "build": {
95
- "openclawVersion": "2026.7.2-beta.7",
101
+ "openclawVersion": "2026.8.1-beta.2",
96
102
  "staticAssets": [
97
103
  {
98
104
  "source": "./assets/embedded-app-sdk.mjs",
@@ -101,7 +107,7 @@
101
107
  ]
102
108
  },
103
109
  "assetScripts": {
104
- "build": "node ../../scripts/build-discord-activity-sdk.mjs"
110
+ "build": "node --import tsx ../../scripts/build-discord-activity-sdk.mts"
105
111
  },
106
112
  "release": {
107
113
  "publishToClawHub": true,
@@ -1,136 +1,43 @@
1
1
  ---
2
2
  name: discord
3
- description: "Discord message-tool ops: send/read/edit/delete, react, poll, pin, thread, search, presence, media/components."
3
+ description: "Discord messaging workflows through OpenClaw's message tool."
4
4
  metadata: { "openclaw": { "emoji": "🎮", "requires": { "config": ["channels.discord.token"] } } }
5
5
  allowed-tools: ["message"]
6
6
  ---
7
7
 
8
8
  # Discord
9
9
 
10
- Use the `message` tool with `channel: "discord"`. No separate Discord tool.
10
+ Use the `message` tool with `channel: "discord"`. The tool schema lists the actions enabled by the current account's `channels.discord.actions.*` gates; do not assume unavailable actions.
11
11
 
12
- ## Rules
12
+ ## Workflow
13
13
 
14
- - Respect `channels.discord.actions.*` gates.
15
- - Prefer explicit `guildId`, `channelId`, `messageId`, `userId`.
16
- - Multi-account: pass `accountId` when needed.
17
- - Send targets: `to: "channel:<id>"` or `to: "user:<id>"`.
18
- - Mention users as `<@USER_ID>`.
19
- - Avoid Markdown tables in outbound Discord messages.
20
- - Prefer components v2 for rich UI; do not mix v2 `components` with legacy `embeds`.
14
+ - Prefer stable `guildId`, `channelId`, `messageId`, and `userId` values from context. Pass `accountId` when more than one Discord account could apply.
15
+ - Resolve the exact message before editing, deleting, pinning, moderating, or reacting when the user's reference is ambiguous.
16
+ - Keep thread replies in their existing thread. A forum parent cannot receive components; send components to the created forum thread instead.
17
+ - Confirm destructive or moderation actions unless the user already specified the exact target and action.
21
18
 
22
- ## Common actions
19
+ ## Interactive components
23
20
 
24
- Send:
25
-
26
- ```json
27
- { "action": "send", "channel": "discord", "to": "channel:123", "message": "hello", "silent": true }
28
- ```
29
-
30
- Send media:
31
-
32
- ```json
33
- {
34
- "action": "send",
35
- "channel": "discord",
36
- "to": "channel:123",
37
- "message": "see attachment",
38
- "media": "file:///tmp/example.png"
39
- }
40
- ```
41
-
42
- Components v2:
21
+ `components` must be a structured object or native component array, never a placeholder string. Do not combine components v2 with legacy `embeds`.
43
22
 
44
23
  ```json
45
24
  {
46
25
  "action": "send",
47
26
  "channel": "discord",
48
27
  "to": "channel:123",
49
- "message": "Status",
50
- "components": "[Carbon v2 components]"
51
- }
52
- ```
53
-
54
- React:
55
-
56
- ```json
57
- { "action": "react", "channel": "discord", "channelId": "123", "messageId": "456", "emoji": "👍" }
58
- ```
59
-
60
- Read:
61
-
62
- ```json
63
- { "action": "read", "channel": "discord", "to": "channel:123", "limit": 20 }
64
- ```
65
-
66
- Edit/delete:
67
-
68
- ```json
69
- {
70
- "action": "edit",
71
- "channel": "discord",
72
- "channelId": "123",
73
- "messageId": "456",
74
- "message": "fixed typo"
28
+ "message": "Choose an option",
29
+ "components": {
30
+ "blocks": [
31
+ {
32
+ "type": "actions",
33
+ "buttons": [
34
+ { "label": "Approve", "style": "success", "callbackData": "approve" },
35
+ { "label": "Decline", "style": "danger", "callbackData": "decline" }
36
+ ]
37
+ }
38
+ ]
39
+ }
75
40
  }
76
41
  ```
77
42
 
78
- ```json
79
- { "action": "delete", "channel": "discord", "channelId": "123", "messageId": "456" }
80
- ```
81
-
82
- Poll:
83
-
84
- ```json
85
- {
86
- "action": "poll",
87
- "channel": "discord",
88
- "to": "channel:123",
89
- "pollQuestion": "Lunch?",
90
- "pollOption": ["Pizza", "Sushi"],
91
- "pollDurationHours": 24
92
- }
93
- ```
94
-
95
- Pin:
96
-
97
- ```json
98
- { "action": "pin", "channel": "discord", "channelId": "123", "messageId": "456" }
99
- ```
100
-
101
- Thread:
102
-
103
- ```json
104
- {
105
- "action": "thread-create",
106
- "channel": "discord",
107
- "channelId": "123",
108
- "messageId": "456",
109
- "threadName": "bug triage"
110
- }
111
- ```
112
-
113
- Search:
114
-
115
- ```json
116
- {
117
- "action": "search",
118
- "channel": "discord",
119
- "guildId": "999",
120
- "query": "release notes",
121
- "channelIds": ["123"],
122
- "limit": 10
123
- }
124
- ```
125
-
126
- Presence, often gated:
127
-
128
- ```json
129
- {
130
- "action": "set-presence",
131
- "channel": "discord",
132
- "activityType": "playing",
133
- "activityName": "OpenClaw",
134
- "status": "online"
135
- }
136
- ```
43
+ Discord mention syntax, component availability, and form hints are injected automatically. Follow the current hints and tool schema rather than a duplicated action catalog.