agent-messenger 1.6.0 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/.claude-plugin/README.md +9 -0
  2. package/.claude-plugin/marketplace.json +13 -0
  3. package/.claude-plugin/plugin.json +2 -1
  4. package/.env.template +5 -0
  5. package/.github/workflows/ci.yml +26 -0
  6. package/.github/workflows/release.yml +23 -1
  7. package/AGENTS.md +8 -1
  8. package/README.md +94 -25
  9. package/dist/package.json +3 -2
  10. package/dist/src/cli.d.ts.map +1 -1
  11. package/dist/src/cli.js +3 -0
  12. package/dist/src/cli.js.map +1 -1
  13. package/dist/src/platforms/discordbot/cli.d.ts +5 -0
  14. package/dist/src/platforms/discordbot/cli.d.ts.map +1 -0
  15. package/dist/src/platforms/discordbot/cli.js +24 -0
  16. package/dist/src/platforms/discordbot/cli.js.map +1 -0
  17. package/dist/src/platforms/discordbot/client.d.ts +41 -0
  18. package/dist/src/platforms/discordbot/client.d.ts.map +1 -0
  19. package/dist/src/platforms/discordbot/client.js +256 -0
  20. package/dist/src/platforms/discordbot/client.js.map +1 -0
  21. package/dist/src/platforms/discordbot/commands/auth.d.ts +30 -0
  22. package/dist/src/platforms/discordbot/commands/auth.d.ts.map +1 -0
  23. package/dist/src/platforms/discordbot/commands/auth.js +180 -0
  24. package/dist/src/platforms/discordbot/commands/auth.js.map +1 -0
  25. package/dist/src/platforms/discordbot/commands/channel.d.ts +21 -0
  26. package/dist/src/platforms/discordbot/commands/channel.d.ts.map +1 -0
  27. package/dist/src/platforms/discordbot/commands/channel.js +79 -0
  28. package/dist/src/platforms/discordbot/commands/channel.js.map +1 -0
  29. package/dist/src/platforms/discordbot/commands/file.d.ts +24 -0
  30. package/dist/src/platforms/discordbot/commands/file.d.ts.map +1 -0
  31. package/dist/src/platforms/discordbot/commands/file.js +78 -0
  32. package/dist/src/platforms/discordbot/commands/file.js.map +1 -0
  33. package/dist/src/platforms/discordbot/commands/index.d.ts +10 -0
  34. package/dist/src/platforms/discordbot/commands/index.d.ts.map +1 -0
  35. package/dist/src/platforms/discordbot/commands/index.js +10 -0
  36. package/dist/src/platforms/discordbot/commands/index.js.map +1 -0
  37. package/dist/src/platforms/discordbot/commands/message.d.ts +38 -0
  38. package/dist/src/platforms/discordbot/commands/message.d.ts.map +1 -0
  39. package/dist/src/platforms/discordbot/commands/message.js +191 -0
  40. package/dist/src/platforms/discordbot/commands/message.js.map +1 -0
  41. package/dist/src/platforms/discordbot/commands/reaction.d.ts +14 -0
  42. package/dist/src/platforms/discordbot/commands/reaction.d.ts.map +1 -0
  43. package/dist/src/platforms/discordbot/commands/reaction.js +65 -0
  44. package/dist/src/platforms/discordbot/commands/reaction.js.map +1 -0
  45. package/dist/src/platforms/discordbot/commands/server.d.ts +22 -0
  46. package/dist/src/platforms/discordbot/commands/server.d.ts.map +1 -0
  47. package/dist/src/platforms/discordbot/commands/server.js +94 -0
  48. package/dist/src/platforms/discordbot/commands/server.js.map +1 -0
  49. package/dist/src/platforms/discordbot/commands/shared.d.ts +11 -0
  50. package/dist/src/platforms/discordbot/commands/shared.d.ts.map +1 -0
  51. package/dist/src/platforms/discordbot/commands/shared.js +24 -0
  52. package/dist/src/platforms/discordbot/commands/shared.js.map +1 -0
  53. package/dist/src/platforms/discordbot/commands/snapshot.d.ts +31 -0
  54. package/dist/src/platforms/discordbot/commands/snapshot.d.ts.map +1 -0
  55. package/dist/src/platforms/discordbot/commands/snapshot.js +79 -0
  56. package/dist/src/platforms/discordbot/commands/snapshot.js.map +1 -0
  57. package/dist/src/platforms/discordbot/commands/thread.d.ts +25 -0
  58. package/dist/src/platforms/discordbot/commands/thread.d.ts.map +1 -0
  59. package/dist/src/platforms/discordbot/commands/thread.js +70 -0
  60. package/dist/src/platforms/discordbot/commands/thread.js.map +1 -0
  61. package/dist/src/platforms/discordbot/commands/user.d.ts +23 -0
  62. package/dist/src/platforms/discordbot/commands/user.d.ts.map +1 -0
  63. package/dist/src/platforms/discordbot/commands/user.js +74 -0
  64. package/dist/src/platforms/discordbot/commands/user.js.map +1 -0
  65. package/dist/src/platforms/discordbot/credential-manager.d.ts +19 -0
  66. package/dist/src/platforms/discordbot/credential-manager.d.ts.map +1 -0
  67. package/dist/src/platforms/discordbot/credential-manager.js +130 -0
  68. package/dist/src/platforms/discordbot/credential-manager.js.map +1 -0
  69. package/dist/src/platforms/discordbot/index.d.ts +4 -0
  70. package/dist/src/platforms/discordbot/index.d.ts.map +1 -0
  71. package/dist/src/platforms/discordbot/index.js +4 -0
  72. package/dist/src/platforms/discordbot/index.js.map +1 -0
  73. package/dist/src/platforms/discordbot/types.d.ts +356 -0
  74. package/dist/src/platforms/discordbot/types.d.ts.map +1 -0
  75. package/dist/src/platforms/discordbot/types.js +93 -0
  76. package/dist/src/platforms/discordbot/types.js.map +1 -0
  77. package/dist/src/platforms/slack/client.d.ts.map +1 -1
  78. package/dist/src/platforms/slack/client.js +34 -0
  79. package/dist/src/platforms/slack/client.js.map +1 -1
  80. package/dist/src/platforms/slack/commands/message.d.ts.map +1 -1
  81. package/dist/src/platforms/slack/commands/message.js +6 -0
  82. package/dist/src/platforms/slack/commands/message.js.map +1 -1
  83. package/dist/src/platforms/slack/types.d.ts +106 -52
  84. package/dist/src/platforms/slack/types.d.ts.map +1 -1
  85. package/dist/src/platforms/slack/types.js +18 -23
  86. package/dist/src/platforms/slack/types.js.map +1 -1
  87. package/dist/src/platforms/slackbot/client.d.ts.map +1 -1
  88. package/dist/src/platforms/slackbot/client.js +33 -0
  89. package/dist/src/platforms/slackbot/client.js.map +1 -1
  90. package/dist/src/platforms/slackbot/types.d.ts +27 -26
  91. package/dist/src/platforms/slackbot/types.d.ts.map +1 -1
  92. package/dist/src/platforms/slackbot/types.js.map +1 -1
  93. package/docs/content/docs/index.mdx +3 -2
  94. package/docs/content/docs/integrations/discordbot.mdx +267 -0
  95. package/docs/content/docs/integrations/meta.json +1 -1
  96. package/docs/content/docs/quick-start.mdx +5 -2
  97. package/docs/public/cover.png +0 -0
  98. package/docs/src/app/layout.tsx +15 -0
  99. package/e2e/config.ts +32 -0
  100. package/e2e/discordbot.e2e.test.ts +323 -0
  101. package/e2e/helpers.ts +15 -15
  102. package/e2e/slack.e2e.test.ts +67 -0
  103. package/package.json +3 -2
  104. package/skills/agent-discord/SKILL.md +10 -0
  105. package/skills/agent-discordbot/SKILL.md +431 -0
  106. package/skills/agent-discordbot/references/authentication.md +208 -0
  107. package/skills/agent-discordbot/references/common-patterns.md +229 -0
  108. package/skills/agent-discordbot/templates/monitor-channel.sh +104 -0
  109. package/skills/agent-discordbot/templates/post-message.sh +112 -0
  110. package/skills/agent-discordbot/templates/server-summary.sh +109 -0
  111. package/skills/agent-slack/SKILL.md +10 -0
  112. package/skills/agent-slackbot/SKILL.md +10 -0
  113. package/skills/agent-teams/SKILL.md +10 -0
  114. package/src/cli.ts +4 -0
  115. package/src/platforms/discordbot/cli.ts +39 -0
  116. package/src/platforms/discordbot/client.test.ts +501 -0
  117. package/src/platforms/discordbot/client.ts +341 -0
  118. package/src/platforms/discordbot/commands/auth.test.ts +311 -0
  119. package/src/platforms/discordbot/commands/auth.ts +225 -0
  120. package/src/platforms/discordbot/commands/channel.test.ts +237 -0
  121. package/src/platforms/discordbot/commands/channel.ts +103 -0
  122. package/src/platforms/discordbot/commands/file.test.ts +143 -0
  123. package/src/platforms/discordbot/commands/file.ts +108 -0
  124. package/src/platforms/discordbot/commands/index.ts +9 -0
  125. package/src/platforms/discordbot/commands/message.test.ts +313 -0
  126. package/src/platforms/discordbot/commands/message.ts +248 -0
  127. package/src/platforms/discordbot/commands/reaction.test.ts +79 -0
  128. package/src/platforms/discordbot/commands/reaction.ts +88 -0
  129. package/src/platforms/discordbot/commands/server.test.ts +249 -0
  130. package/src/platforms/discordbot/commands/server.ts +126 -0
  131. package/src/platforms/discordbot/commands/shared.ts +36 -0
  132. package/src/platforms/discordbot/commands/snapshot.test.ts +209 -0
  133. package/src/platforms/discordbot/commands/snapshot.ts +115 -0
  134. package/src/platforms/discordbot/commands/thread.test.ts +164 -0
  135. package/src/platforms/discordbot/commands/thread.ts +101 -0
  136. package/src/platforms/discordbot/commands/user.test.ts +205 -0
  137. package/src/platforms/discordbot/commands/user.ts +98 -0
  138. package/src/platforms/discordbot/credential-manager.test.ts +309 -0
  139. package/src/platforms/discordbot/credential-manager.ts +161 -0
  140. package/src/platforms/discordbot/index.ts +23 -0
  141. package/src/platforms/discordbot/types.test.ts +294 -0
  142. package/src/platforms/discordbot/types.ts +189 -0
  143. package/src/platforms/slack/client.ts +34 -0
  144. package/src/platforms/slack/commands/message.test.ts +49 -0
  145. package/src/platforms/slack/commands/message.ts +6 -0
  146. package/src/platforms/slack/types.test.ts +23 -0
  147. package/src/platforms/slack/types.ts +19 -29
  148. package/src/platforms/slackbot/client.ts +33 -0
  149. package/src/platforms/slackbot/types.ts +1 -0
  150. package/CLAUDE.md +0 -106
@@ -53,6 +53,14 @@ Enables AI agents to interact with messaging platforms through CLI interfaces:
53
53
  - **Manage reactions** (add/remove/list)
54
54
  - Designed for **server-side and CI/CD** use cases
55
55
 
56
+ ### Discord Bot (`agent-discordbot`)
57
+ - **Send messages** using bot tokens
58
+ - **Read channels** and message history
59
+ - **Manage reactions** (add/remove)
60
+ - **Upload files** to channels
61
+ - **Multi-bot management** with easy switching
62
+ - Designed for **server-side and CI/CD** use cases
63
+
56
64
  ## Key Features
57
65
 
58
66
  ### Zero-Config Authentication
@@ -165,4 +173,5 @@ agent-discord file upload <channel-id> ./report.pdf
165
173
  - [Slack Skill Documentation](https://github.com/devxoul/agent-messenger/blob/main/skills/agent-slack/SKILL.md)
166
174
  - [Slack Bot Skill Documentation](https://github.com/devxoul/agent-messenger/blob/main/skills/agent-slackbot/SKILL.md)
167
175
  - [Discord Skill Documentation](https://github.com/devxoul/agent-messenger/blob/main/skills/agent-discord/SKILL.md)
176
+ - [Discord Bot Skill Documentation](https://github.com/devxoul/agent-messenger/blob/main/skills/agent-discordbot/SKILL.md)
168
177
  - [Teams Skill Documentation](https://github.com/devxoul/agent-messenger/blob/main/skills/agent-teams/SKILL.md)
@@ -46,6 +46,19 @@
46
46
  "homepage": "https://github.com/devxoul/agent-messenger",
47
47
  "keywords": ["slack", "slackbot", "bot", "messaging", "ai-agent", "cli", "ci-cd"]
48
48
  },
49
+ {
50
+ "name": "agent-discordbot",
51
+ "description": "Interact with Discord servers using bot tokens. Designed for server-side and CI/CD integrations. Supports message operations, channel management, reactions, and multi-bot/multi-guild credential management.",
52
+ "version": "0.1.0",
53
+ "author": {
54
+ "name": "devxoul",
55
+ "url": "https://github.com/devxoul"
56
+ },
57
+ "source": "./",
58
+ "category": "productivity",
59
+ "homepage": "https://github.com/devxoul/agent-messenger",
60
+ "keywords": ["discord", "discordbot", "bot", "messaging", "ai-agent", "cli", "ci-cd"]
61
+ },
49
62
  {
50
63
  "name": "agent-teams",
51
64
  "description": "Interact with Microsoft Teams through a CLI interface. Features credential extraction from Teams desktop app and browser, multi-team support, message operations, channel management, reactions, and file uploads.",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-messenger",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "description": "Messaging platform interaction skills for AI agents. Interact with Slack, Discord, and Microsoft Teams - send messages, read channels, manage reactions, upload files, and more through simple CLI interfaces.",
5
5
  "author": {
6
6
  "name": "devxoul",
@@ -25,6 +25,7 @@
25
25
  "./skills/agent-slack",
26
26
  "./skills/agent-slackbot",
27
27
  "./skills/agent-discord",
28
+ "./skills/agent-discordbot",
28
29
  "./skills/agent-teams"
29
30
  ]
30
31
  }
package/.env.template CHANGED
@@ -13,6 +13,11 @@ E2E_SLACKBOT_WORKSPACE_NAME=Agent Messenger
13
13
  E2E_DISCORD_TOKEN=
14
14
  E2E_DISCORD_SERVER_ID=1467039439770357844
15
15
 
16
+ # DiscordBot (bot token)
17
+ E2E_DISCORDBOT_TOKEN=
18
+ E2E_DISCORDBOT_SERVER_ID=1467039439770357844
19
+ E2E_DISCORDBOT_SERVER_NAME=Agent Messenger
20
+
16
21
  # Teams
17
22
  E2E_TEAMS_TEAM_ID=
18
23
  E2E_TEAMS_TEAM_NAME=Agent Messenger
@@ -29,5 +29,31 @@ jobs:
29
29
  - name: Test
30
30
  run: bun run test
31
31
 
32
+ build:
33
+ runs-on: ubuntu-latest
34
+
35
+ steps:
36
+ - uses: actions/checkout@v4
37
+
38
+ - uses: oven-sh/setup-bun@v2
39
+ with:
40
+ bun-version: latest
41
+
42
+ - uses: actions/setup-node@v4
43
+ with:
44
+ node-version: "22"
45
+
46
+ - name: Install dependencies
47
+ run: bun install --frozen-lockfile
48
+
32
49
  - name: Build
33
50
  run: bun run build
51
+
52
+ - name: Verify built CLI runs on Node
53
+ run: |
54
+ node dist/src/cli.js --help
55
+ node dist/src/cli.js slack --help
56
+ node dist/src/cli.js slackbot --help
57
+ node dist/src/cli.js discord --help
58
+ node dist/src/cli.js discordbot --help
59
+ node dist/src/cli.js teams --help
@@ -60,13 +60,21 @@ jobs:
60
60
  let readme = fs.readFileSync('README.md', 'utf8');
61
61
  readme = readme.replace(/agent-messenger@[\d.]+/g, 'agent-messenger@' + v);
62
62
  fs.writeFileSync('README.md', readme);
63
+ for (const dir of fs.readdirSync('skills')) {
64
+ const p = 'skills/' + dir + '/SKILL.md';
65
+ if (fs.existsSync(p)) {
66
+ let s = fs.readFileSync(p, 'utf8');
67
+ s = s.replace(/^version: .+$/m, 'version: ' + v);
68
+ fs.writeFileSync(p, s);
69
+ }
70
+ }
63
71
  "
64
72
 
65
73
  - name: Commit and tag
66
74
  run: |
67
75
  git config user.name "github-actions[bot]"
68
76
  git config user.email "github-actions[bot]@users.noreply.github.com"
69
- git add package.json .claude-plugin/plugin.json README.md
77
+ git add package.json .claude-plugin/plugin.json README.md skills/*/SKILL.md
70
78
  git diff --staged --quiet || git commit -m "${{ inputs.version }}"
71
79
  git tag "${{ inputs.version }}"
72
80
  git push origin HEAD --tags
@@ -78,3 +86,17 @@ jobs:
78
86
  run: gh release create "${{ inputs.version }}" --generate-notes
79
87
  env:
80
88
  GH_TOKEN: ${{ github.token }}
89
+
90
+ - name: Publish to ClawHub
91
+ run: |
92
+ npx clawhub@latest login --token "$CLAWHUB_TOKEN" --no-browser
93
+ for skill_dir in skills/*/; do
94
+ slug=$(basename "$skill_dir")
95
+ npx clawhub@latest publish "$skill_dir" \
96
+ --slug "$slug" \
97
+ --version "${{ inputs.version }}" \
98
+ --tags latest \
99
+ --no-input
100
+ done
101
+ env:
102
+ CLAWHUB_TOKEN: ${{ secrets.CLAWHUB_TOKEN }}
package/AGENTS.md CHANGED
@@ -47,5 +47,12 @@ bun format # Format with Biome
47
47
  ```
48
48
 
49
49
  ## Release
50
+ Use the **Release** GitHub Actions workflow (`workflow_dispatch`). It typechecks, lints, tests, bumps version in `package.json` / `.claude-plugin/plugin.json` / `README.md` / `skills/*/SKILL.md`, commits, tags, publishes to npm, and creates a GitHub Release. Tags have no `v` prefix.
50
51
 
51
- Use the **Release** GitHub Actions workflow (`workflow_dispatch`). Enter the version (e.g., `1.4.0`) — it typechecks, lints, tests, bumps version in `package.json` / `.claude-plugin/plugin.json` / `README.md`, commits, tags, publishes to npm, and creates a GitHub Release. Tags have no `v` prefix.
52
+ ### Version Decision
53
+
54
+ - If the user specifies an exact version (e.g., `1.5.0`), use it as-is.
55
+ Otherwise, the agent decides the bump level based on the changes since the last release (never bump major unless user explicitly asks):
56
+ - **minor** — New features, new commands, new platform support, breaking changes
57
+ - **patch** — Bug fixes, refactors, docs, dependency updates, minor improvements
58
+ - Never ask the user which version to bump. Decide and proceed.
package/README.md CHANGED
@@ -1,9 +1,34 @@
1
- ![Agent Messenger](https://github.com/user-attachments/assets/ab21caf0-441a-40f6-8cda-4e969ae2395a)
1
+ # Agent Messenger
2
+
3
+ [![npm version](https://img.shields.io/npm/v/agent-messenger)](https://www.npmjs.com/package/agent-messenger) [![SkillPad - agent-slack](https://img.shields.io/badge/SkillPad-agent--slack-1a1a1a)](https://skillpad.dev/install/devxoul/agent-messenger/agent-slack) [![SkillPad - agent-slackbot](https://img.shields.io/badge/SkillPad-agent--slackbot-1a1a1a)](https://skillpad.dev/install/devxoul/agent-messenger/agent-slackbot) [![SkillPad - agent-discord](https://img.shields.io/badge/SkillPad-agent--discord-1a1a1a)](https://skillpad.dev/install/devxoul/agent-messenger/agent-discord) [![SkillPad - agent-discordbot](https://img.shields.io/badge/SkillPad-agent--discordbot-1a1a1a)](https://skillpad.dev/install/devxoul/agent-messenger/agent-discordbot) [![SkillPad - agent-teams](https://img.shields.io/badge/SkillPad-agent--teams-1a1a1a)](https://skillpad.dev/install/devxoul/agent-messenger/agent-teams)
4
+
5
+ ![Agent Messenger](./docs/public/cover.png)
2
6
 
3
7
  **Give your AI agent the power to read and send messages across Slack, Discord, Teams and more**
4
8
 
5
9
  A unified, agent-friendly CLI for messaging platforms. Zero-config credential extraction from your desktop apps—no OAuth flows, no API keys, no admin approval needed. Works out of the box.
6
10
 
11
+ ## Table of Contents
12
+
13
+ - [Why Agent Messenger?](#-why-agent-messenger)
14
+ - [Installation](#-installation)
15
+ - [Agent Skills](#-agent-skills)
16
+ - [SkillPad](#skillpad)
17
+ - [Skills CLI](#skills-cli)
18
+ - [Claude Code Plugin](#claude-code-plugin)
19
+ - [OpenCode Plugin](#opencode-plugin)
20
+ - [Quick Start](#-quick-start)
21
+ - [Supported Platforms](#-supported-platforms)
22
+ - [Platform Guides](#-platform-guides)
23
+ - [Use Cases](#-use-cases)
24
+ - [Gathering Context](#gathering-context)
25
+ - [Communicating & Reporting](#communicating--reporting)
26
+ - [Automation & Pipelines](#automation--pipelines)
27
+ - [...and More](#and-more)
28
+ - [Philosophy](#-philosophy)
29
+ - [Contributing](#-contributing)
30
+ - [License](#-license)
31
+
7
32
  ## 🤔 Why Agent Messenger?
8
33
 
9
34
  Messaging platforms only offer Bot tokens for API access—your AI agent can never act **as you**. Agent Messenger extracts user credentials directly from your installed desktop apps, letting your agent operate on your behalf. Bot tokens are fully supported too for server-side and CI/CD use cases.
@@ -28,21 +53,34 @@ This installs:
28
53
  - `agent-slack` — Slack CLI (user token, zero-config)
29
54
  - `agent-slackbot` — Slack Bot CLI (bot token, for server-side/CI/CD)
30
55
  - `agent-discord` — Discord CLI
56
+ - `agent-discordbot` — Discord Bot CLI (bot token, for server-side/CI/CD)
31
57
  - `agent-teams` — Microsoft Teams CLI
32
58
 
33
- ## 🧠 Agent Skills
59
+ ## 🧩 Agent Skills
60
+
61
+ Agent Messenger includes [Agent Skills](https://agentskills.io/) that teach your AI agent how to use these CLIs effectively. Five skills are available:
62
+
63
+ - **`agent-slack`** — Slack (user token, zero-config)
64
+ - **`agent-slackbot`** — Slack Bot (bot token, for server-side/CI/CD)
65
+ - **`agent-discord`** — Discord
66
+ - **`agent-discordbot`** — Discord Bot (bot token, for server-side/CI/CD)
67
+ - **`agent-teams`** — Microsoft Teams
68
+
69
+ ### SkillPad
70
+
71
+ SkillPad is a GUI app for Agent Skills. See [skillpad.dev](https://skillpad.dev/) for more details.
34
72
 
35
- Agent Messenger includes [Agent Skills](https://agentskills.io/) that teach your AI agent how to use these CLIs effectively. Install the skill for your platform:
73
+ [![Available on SkillPad](https://badge.skillpad.dev/agent-slack/dark.svg)](https://skillpad.dev/install/devxoul/agent-messenger/agent-slack) [![Available on SkillPad](https://badge.skillpad.dev/agent-slackbot/dark.svg)](https://skillpad.dev/install/devxoul/agent-messenger/agent-slackbot) [![Available on SkillPad](https://badge.skillpad.dev/agent-discord/dark.svg)](https://skillpad.dev/install/devxoul/agent-messenger/agent-discord) [![Available on SkillPad](https://badge.skillpad.dev/agent-discordbot/dark.svg)](https://skillpad.dev/install/devxoul/agent-messenger/agent-discordbot) [![Available on SkillPad](https://badge.skillpad.dev/agent-teams/dark.svg)](https://skillpad.dev/install/devxoul/agent-messenger/agent-teams)
36
74
 
37
- ### Skills CLI (OpenCode, Cline, etc.)
75
+ ### Skills CLI
76
+
77
+ Skills CLI is a CLI tool for Agent Skills. See [skills.sh](https://skills.sh/) for more details.
38
78
 
39
79
  ```bash
40
80
  npx skills add devxoul/agent-messenger
41
81
  ```
42
82
 
43
- See [skills.sh](https://skills.sh/) for more details.
44
-
45
- ### Claude Code
83
+ ### Claude Code Plugin
46
84
 
47
85
  ```bash
48
86
  claude plugin marketplace add devxoul/agent-messenger
@@ -56,7 +94,7 @@ Or within Claude Code:
56
94
  /plugin install agent-messenger
57
95
  ```
58
96
 
59
- ### OpenCode (via plugin)
97
+ ### OpenCode Plugin
60
98
 
61
99
  Add to your `opencode.jsonc`:
62
100
 
@@ -100,34 +138,65 @@ That's it. Credentials are extracted automatically from your Slack desktop app o
100
138
  | Saved items | ✅ | — | — |
101
139
  | Unread messages | ✅ | — | — |
102
140
  | Sidebar sections | ✅ | — | — |
103
- | Bot support | ✅ | | — |
141
+ | Bot support | ✅ | | — |
104
142
 
105
143
  > ⚠️ **Teams tokens expire in 60-90 minutes.** Re-run `agent-teams auth extract` to refresh. See [Teams Guide](skills/agent-teams/SKILL.md) for details.
106
144
 
107
145
  ## 📖 Platform Guides
108
146
 
109
- - **[Slack Guide](skills/agent-slack/SKILL.md)** — Full command reference for Slack
110
- - **[Slack Bot Guide](skills/agent-slackbot/SKILL.md)** — Bot token integration for server-side and CI/CD
111
- - **[Discord Guide](skills/agent-discord/SKILL.md)** — Full command reference for Discord
112
- - **[Teams Guide](skills/agent-teams/SKILL.md)** — Full command reference for Microsoft Teams
147
+ - **[Slack Guide](https://agent-messenger.dev/docs/integrations/slack)** — Full command reference for Slack
148
+ - **[Slack Bot Guide](https://agent-messenger.dev/docs/integrations/slackbot)** — Bot token integration for server-side and CI/CD
149
+ - **[Discord Guide](https://agent-messenger.dev/docs/integrations/discord)** — Full command reference for Discord
150
+ - **[Discord Bot Guide](https://agent-messenger.dev/docs/integrations/discordbot)** — Bot token integration for server-side and CI/CD
151
+ - **[Teams Guide](https://agent-messenger.dev/docs/integrations/teams)** — Full command reference for Microsoft Teams
113
152
 
114
153
  ## 💡 Use Cases
115
154
 
116
- **For AI Agents**
117
- - Give Claude, GPT, or your custom agent the ability to read and send messages
118
- - Automate Slack/Discord/Teams workflows with simple CLI commands
119
- - Build integrations without OAuth complexity
155
+ ### Gathering Context
156
+
157
+ Pull context from conversations before you start working — no tab-switching, no skimming.
158
+
159
+ > "Read the #incident-api-outage thread in Slack and summarize the root cause, timeline, and action items so I can write the postmortem."
160
+
161
+ > "Search our Discord #architecture channel for any previous discussion about event sourcing before I write a proposal."
162
+
163
+ > "Check my unread messages across all Slack channels and tell me if anything needs my attention."
164
+
165
+ > "Look through #frontend in Slack for messages about the login page redesign from the past two weeks and summarize the decisions made."
166
+
167
+ > "Search Teams for any messages mentioning 'API deprecation' so I know if this was discussed before."
168
+
169
+ ### Communicating & Reporting
170
+
171
+ Send updates, file reports, and notify your team — all from a prompt.
172
+
173
+ > "Post a deployment summary to #releases in Slack with the commit hash, changelog, and deploy status."
174
+
175
+ > "Send a message to the #standup channel with what I worked on yesterday, what I'm doing today, and any blockers."
176
+
177
+ > "Cross-post this announcement to #general in Slack, the announcements channel in Discord, and the General channel in Teams."
178
+
179
+ > "Upload the latest test coverage report to #ci-results in Slack."
180
+
181
+ > "React with ✅ to the last message in #deploy-requests to confirm I've handled it."
182
+
183
+ ### Automation & Pipelines
184
+
185
+ Wire messaging into your CI, scripts, or agent workflows.
186
+
187
+ > "After every CI run, post the build status and test results to #builds in Slack — include the branch name and commit link."
188
+
189
+ > "When a long-running migration finishes, notify me in Discord with the final row count and elapsed time."
190
+
191
+ > "Every morning at 9am, snapshot my Slack workspace and post a summary of active channels to #team-pulse."
192
+
193
+ > "Send an alert to #oncall in Slack whenever the error rate exceeds 1% — include the service name and a link to the dashboard."
120
194
 
121
- **For Developers**
122
- - Quick message sending from terminal
123
- - Scripted notifications and alerts
124
- - Workspace snapshots for debugging
195
+ > "Read the latest message in #releases, then cross-post it to our Discord announcements channel."
125
196
 
126
- **For Teams**
127
- - Automate standups and reminders
128
- - Cross-post announcements to multiple platforms
129
- - Build custom notification pipelines
197
+ ### ...and More
130
198
 
199
+ These are just starting points. Your agent has full read/write access to Slack, Discord, and Teams — anything you'd do manually in a chat app, it can handle for you. If you build something cool with Agent Messenger, [let me know](https://x.com/devxoul)!
131
200
  ## 💭 Philosophy
132
201
 
133
202
  **Why not MCP?** MCP servers expose all tools at once, bloating context and confusing agents. **[Agent Skills](https://agentskills.io/) + agent-friendly CLI** offer a better approach—load what you need, when you need it. Fewer tokens, cleaner context, better output.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-messenger",
3
- "version": "1.6.0",
3
+ "version": "1.8.0",
4
4
  "description": "Multi-platform messaging CLI for AI agents (Slack, Discord, Teams)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,7 +15,8 @@
15
15
  "agent-slack": "./src/platforms/slack/cli.ts",
16
16
  "agent-discord": "./src/platforms/discord/cli.ts",
17
17
  "agent-teams": "./src/platforms/teams/cli.ts",
18
- "agent-slackbot": "./src/platforms/slackbot/cli.ts"
18
+ "agent-slackbot": "./src/platforms/slackbot/cli.ts",
19
+ "agent-discordbot": "./src/platforms/discordbot/cli.ts"
19
20
  },
20
21
  "scripts": {
21
22
  "build": "tsc && tsc-alias --resolve-full-paths",
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOnC,QAAA,MAAM,OAAO,SAAgB,CAAA;AAuB7B,eAAe,OAAO,CAAA"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOnC,QAAA,MAAM,OAAO,SAAgB,CAAA;AA2B7B,eAAe,OAAO,CAAA"}
package/dist/src/cli.js CHANGED
@@ -21,6 +21,9 @@ program.command('teams', 'Interact with Microsoft Teams', {
21
21
  program.command('slackbot', 'Interact with Slack using bot tokens', {
22
22
  executableFile: join(__dirname, 'platforms', 'slackbot', `cli${ext}`),
23
23
  });
24
+ program.command('discordbot', 'Interact with Discord using bot tokens', {
25
+ executableFile: join(__dirname, 'platforms', 'discordbot', `cli${ext}`),
26
+ });
24
27
  program.parse(process.argv);
25
28
  export default program;
26
29
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAEvD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AACrC,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;AAEtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAE9G,0CAA0C;AAC1C,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,gCAAgC,EAAE;IACzD,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACnE,CAAC,CAAA;AAEF,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,8BAA8B,EAAE;IACzD,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC;CACrE,CAAC,CAAA;AAEF,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,+BAA+B,EAAE;IACxD,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACnE,CAAC,CAAA;AAEF,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,sCAAsC,EAAE;IAClE,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,CAAC;CACtE,CAAC,CAAA;AAEF,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAE3B,eAAe,OAAO,CAAA"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAEvD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AACrC,MAAM,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;AAEtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;AAE9G,0CAA0C;AAC1C,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,gCAAgC,EAAE;IACzD,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACnE,CAAC,CAAA;AAEF,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,8BAA8B,EAAE;IACzD,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC;CACrE,CAAC,CAAA;AAEF,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,+BAA+B,EAAE;IACxD,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC;CACnE,CAAC,CAAA;AAEF,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,sCAAsC,EAAE;IAClE,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,EAAE,CAAC;CACtE,CAAC,CAAA;AAEF,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,wCAAwC,EAAE;IACtE,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;CACxE,CAAC,CAAA;AAEF,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAE3B,eAAe,OAAO,CAAA"}
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ declare const program: Command;
4
+ export default program;
5
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../../src/platforms/discordbot/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcnC,QAAA,MAAM,OAAO,SAAgB,CAAA;AAsB7B,eAAe,OAAO,CAAA"}
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env bun
2
+ import { Command } from 'commander';
3
+ import pkg from '../../../package.json' with { type: 'json' };
4
+ import { authCommand, channelCommand, fileCommand, messageCommand, reactionCommand, serverCommand, snapshotCommand, threadCommand, userCommand, } from './commands/index.js';
5
+ const program = new Command();
6
+ program
7
+ .name('agent-discordbot')
8
+ .description('CLI tool for Discord bot integration using bot tokens')
9
+ .version(pkg.version)
10
+ .option('--pretty', 'Pretty-print JSON output')
11
+ .option('--bot <id>', 'Bot ID to use')
12
+ .option('--server <id>', 'Server ID to use');
13
+ program.addCommand(authCommand);
14
+ program.addCommand(serverCommand);
15
+ program.addCommand(messageCommand);
16
+ program.addCommand(channelCommand);
17
+ program.addCommand(userCommand);
18
+ program.addCommand(reactionCommand);
19
+ program.addCommand(fileCommand);
20
+ program.addCommand(threadCommand);
21
+ program.addCommand(snapshotCommand);
22
+ program.parseAsync(process.argv);
23
+ export default program;
24
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../../src/platforms/discordbot/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,GAAG,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAA;AAC7D,OAAO,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,cAAc,EACd,eAAe,EACf,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAA;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,uDAAuD,CAAC;KACpE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAC9C,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC;KACrC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAA;AAE9C,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;AACjC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;AAClC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;AACnC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;AAC/B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;AACjC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;AAEnC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAEhC,eAAe,OAAO,CAAA"}
@@ -0,0 +1,41 @@
1
+ import type { DiscordChannel, DiscordFile, DiscordGuild, DiscordMessage, DiscordUser } from './types.js';
2
+ export declare class DiscordBotClient {
3
+ private token;
4
+ private buckets;
5
+ private globalRateLimitUntil;
6
+ constructor(token: string);
7
+ private getHeaders;
8
+ private getBucketKey;
9
+ private waitForRateLimit;
10
+ private updateBucket;
11
+ private handleRateLimitResponse;
12
+ private sleep;
13
+ private handleErrorResponse;
14
+ private request;
15
+ private requestFormData;
16
+ testAuth(): Promise<DiscordUser>;
17
+ listGuilds(): Promise<DiscordGuild[]>;
18
+ getGuild(guildId: string): Promise<DiscordGuild>;
19
+ listChannels(guildId: string): Promise<DiscordChannel[]>;
20
+ getChannel(channelId: string): Promise<DiscordChannel>;
21
+ sendMessage(channelId: string, content: string, options?: {
22
+ thread_id?: string;
23
+ }): Promise<DiscordMessage>;
24
+ getMessages(channelId: string, limit?: number): Promise<DiscordMessage[]>;
25
+ getMessage(channelId: string, messageId: string): Promise<DiscordMessage>;
26
+ editMessage(channelId: string, messageId: string, content: string): Promise<DiscordMessage>;
27
+ deleteMessage(channelId: string, messageId: string): Promise<void>;
28
+ addReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
29
+ removeReaction(channelId: string, messageId: string, emoji: string): Promise<void>;
30
+ listUsers(guildId: string): Promise<DiscordUser[]>;
31
+ getUser(userId: string): Promise<DiscordUser>;
32
+ uploadFile(channelId: string, filePath: string): Promise<DiscordFile>;
33
+ listFiles(channelId: string): Promise<DiscordFile[]>;
34
+ createThread(channelId: string, name: string, options?: {
35
+ auto_archive_duration?: number;
36
+ rate_limit_per_user?: number;
37
+ }): Promise<DiscordChannel>;
38
+ archiveThread(threadId: string, archived?: boolean): Promise<DiscordChannel>;
39
+ resolveChannel(guildId: string, channel: string): Promise<string>;
40
+ }
41
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/platforms/discordbot/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAarG,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,OAAO,CAA0C;IACzD,OAAO,CAAC,oBAAoB,CAAY;gBAE5B,KAAK,EAAE,MAAM;IAOzB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,YAAY;YASN,gBAAgB;IAa9B,OAAO,CAAC,YAAY;YAcN,uBAAuB;IAarC,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,mBAAmB;YAOb,OAAO;YA8DP,eAAe;IAwDvB,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAIhC,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAIrC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAIxD,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAItD,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAQ1G,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAI7E,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAIzE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAI3F,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/E,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlF,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAQlD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAI7C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAmBrE,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAepD,YAAY,CAChB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACR,qBAAqB,CAAC,EAAE,MAAM,CAAA;QAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAC7B,GACA,OAAO,CAAC,cAAc,CAAC;IAOpB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,OAAc,GAAG,OAAO,CAAC,cAAc,CAAC;IAIlF,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAUxE"}