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.
- package/.claude-plugin/README.md +9 -0
- package/.claude-plugin/marketplace.json +13 -0
- package/.claude-plugin/plugin.json +2 -1
- package/.env.template +5 -0
- package/.github/workflows/ci.yml +26 -0
- package/.github/workflows/release.yml +23 -1
- package/AGENTS.md +8 -1
- package/README.md +94 -25
- package/dist/package.json +3 -2
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +3 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/platforms/discordbot/cli.d.ts +5 -0
- package/dist/src/platforms/discordbot/cli.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/cli.js +24 -0
- package/dist/src/platforms/discordbot/cli.js.map +1 -0
- package/dist/src/platforms/discordbot/client.d.ts +41 -0
- package/dist/src/platforms/discordbot/client.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/client.js +256 -0
- package/dist/src/platforms/discordbot/client.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/auth.d.ts +30 -0
- package/dist/src/platforms/discordbot/commands/auth.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/auth.js +180 -0
- package/dist/src/platforms/discordbot/commands/auth.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/channel.d.ts +21 -0
- package/dist/src/platforms/discordbot/commands/channel.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/channel.js +79 -0
- package/dist/src/platforms/discordbot/commands/channel.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/file.d.ts +24 -0
- package/dist/src/platforms/discordbot/commands/file.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/file.js +78 -0
- package/dist/src/platforms/discordbot/commands/file.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/index.d.ts +10 -0
- package/dist/src/platforms/discordbot/commands/index.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/index.js +10 -0
- package/dist/src/platforms/discordbot/commands/index.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/message.d.ts +38 -0
- package/dist/src/platforms/discordbot/commands/message.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/message.js +191 -0
- package/dist/src/platforms/discordbot/commands/message.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/reaction.d.ts +14 -0
- package/dist/src/platforms/discordbot/commands/reaction.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/reaction.js +65 -0
- package/dist/src/platforms/discordbot/commands/reaction.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/server.d.ts +22 -0
- package/dist/src/platforms/discordbot/commands/server.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/server.js +94 -0
- package/dist/src/platforms/discordbot/commands/server.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/shared.d.ts +11 -0
- package/dist/src/platforms/discordbot/commands/shared.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/shared.js +24 -0
- package/dist/src/platforms/discordbot/commands/shared.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/snapshot.d.ts +31 -0
- package/dist/src/platforms/discordbot/commands/snapshot.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/snapshot.js +79 -0
- package/dist/src/platforms/discordbot/commands/snapshot.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/thread.d.ts +25 -0
- package/dist/src/platforms/discordbot/commands/thread.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/thread.js +70 -0
- package/dist/src/platforms/discordbot/commands/thread.js.map +1 -0
- package/dist/src/platforms/discordbot/commands/user.d.ts +23 -0
- package/dist/src/platforms/discordbot/commands/user.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/commands/user.js +74 -0
- package/dist/src/platforms/discordbot/commands/user.js.map +1 -0
- package/dist/src/platforms/discordbot/credential-manager.d.ts +19 -0
- package/dist/src/platforms/discordbot/credential-manager.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/credential-manager.js +130 -0
- package/dist/src/platforms/discordbot/credential-manager.js.map +1 -0
- package/dist/src/platforms/discordbot/index.d.ts +4 -0
- package/dist/src/platforms/discordbot/index.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/index.js +4 -0
- package/dist/src/platforms/discordbot/index.js.map +1 -0
- package/dist/src/platforms/discordbot/types.d.ts +356 -0
- package/dist/src/platforms/discordbot/types.d.ts.map +1 -0
- package/dist/src/platforms/discordbot/types.js +93 -0
- package/dist/src/platforms/discordbot/types.js.map +1 -0
- package/dist/src/platforms/slack/client.d.ts.map +1 -1
- package/dist/src/platforms/slack/client.js +34 -0
- package/dist/src/platforms/slack/client.js.map +1 -1
- package/dist/src/platforms/slack/commands/message.d.ts.map +1 -1
- package/dist/src/platforms/slack/commands/message.js +6 -0
- package/dist/src/platforms/slack/commands/message.js.map +1 -1
- package/dist/src/platforms/slack/types.d.ts +106 -52
- package/dist/src/platforms/slack/types.d.ts.map +1 -1
- package/dist/src/platforms/slack/types.js +18 -23
- package/dist/src/platforms/slack/types.js.map +1 -1
- package/dist/src/platforms/slackbot/client.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/client.js +33 -0
- package/dist/src/platforms/slackbot/client.js.map +1 -1
- package/dist/src/platforms/slackbot/types.d.ts +27 -26
- package/dist/src/platforms/slackbot/types.d.ts.map +1 -1
- package/dist/src/platforms/slackbot/types.js.map +1 -1
- package/docs/content/docs/index.mdx +3 -2
- package/docs/content/docs/integrations/discordbot.mdx +267 -0
- package/docs/content/docs/integrations/meta.json +1 -1
- package/docs/content/docs/quick-start.mdx +5 -2
- package/docs/public/cover.png +0 -0
- package/docs/src/app/layout.tsx +15 -0
- package/e2e/config.ts +32 -0
- package/e2e/discordbot.e2e.test.ts +323 -0
- package/e2e/helpers.ts +15 -15
- package/e2e/slack.e2e.test.ts +67 -0
- package/package.json +3 -2
- package/skills/agent-discord/SKILL.md +10 -0
- package/skills/agent-discordbot/SKILL.md +431 -0
- package/skills/agent-discordbot/references/authentication.md +208 -0
- package/skills/agent-discordbot/references/common-patterns.md +229 -0
- package/skills/agent-discordbot/templates/monitor-channel.sh +104 -0
- package/skills/agent-discordbot/templates/post-message.sh +112 -0
- package/skills/agent-discordbot/templates/server-summary.sh +109 -0
- package/skills/agent-slack/SKILL.md +10 -0
- package/skills/agent-slackbot/SKILL.md +10 -0
- package/skills/agent-teams/SKILL.md +10 -0
- package/src/cli.ts +4 -0
- package/src/platforms/discordbot/cli.ts +39 -0
- package/src/platforms/discordbot/client.test.ts +501 -0
- package/src/platforms/discordbot/client.ts +341 -0
- package/src/platforms/discordbot/commands/auth.test.ts +311 -0
- package/src/platforms/discordbot/commands/auth.ts +225 -0
- package/src/platforms/discordbot/commands/channel.test.ts +237 -0
- package/src/platforms/discordbot/commands/channel.ts +103 -0
- package/src/platforms/discordbot/commands/file.test.ts +143 -0
- package/src/platforms/discordbot/commands/file.ts +108 -0
- package/src/platforms/discordbot/commands/index.ts +9 -0
- package/src/platforms/discordbot/commands/message.test.ts +313 -0
- package/src/platforms/discordbot/commands/message.ts +248 -0
- package/src/platforms/discordbot/commands/reaction.test.ts +79 -0
- package/src/platforms/discordbot/commands/reaction.ts +88 -0
- package/src/platforms/discordbot/commands/server.test.ts +249 -0
- package/src/platforms/discordbot/commands/server.ts +126 -0
- package/src/platforms/discordbot/commands/shared.ts +36 -0
- package/src/platforms/discordbot/commands/snapshot.test.ts +209 -0
- package/src/platforms/discordbot/commands/snapshot.ts +115 -0
- package/src/platforms/discordbot/commands/thread.test.ts +164 -0
- package/src/platforms/discordbot/commands/thread.ts +101 -0
- package/src/platforms/discordbot/commands/user.test.ts +205 -0
- package/src/platforms/discordbot/commands/user.ts +98 -0
- package/src/platforms/discordbot/credential-manager.test.ts +309 -0
- package/src/platforms/discordbot/credential-manager.ts +161 -0
- package/src/platforms/discordbot/index.ts +23 -0
- package/src/platforms/discordbot/types.test.ts +294 -0
- package/src/platforms/discordbot/types.ts +189 -0
- package/src/platforms/slack/client.ts +34 -0
- package/src/platforms/slack/commands/message.test.ts +49 -0
- package/src/platforms/slack/commands/message.ts +6 -0
- package/src/platforms/slack/types.test.ts +23 -0
- package/src/platforms/slack/types.ts +19 -29
- package/src/platforms/slackbot/client.ts +33 -0
- package/src/platforms/slackbot/types.ts +1 -0
- package/CLAUDE.md +0 -106
package/.claude-plugin/README.md
CHANGED
|
@@ -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.
|
|
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
|
package/.github/workflows/ci.yml
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
1
|
+
# Agent Messenger
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/agent-messenger) [](https://skillpad.dev/install/devxoul/agent-messenger/agent-slack) [](https://skillpad.dev/install/devxoul/agent-messenger/agent-slackbot) [](https://skillpad.dev/install/devxoul/agent-messenger/agent-discord) [](https://skillpad.dev/install/devxoul/agent-messenger/agent-discordbot) [](https://skillpad.dev/install/devxoul/agent-messenger/agent-teams)
|
|
4
|
+
|
|
5
|
+

|
|
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
|
-
##
|
|
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
|
-
|
|
73
|
+
[](https://skillpad.dev/install/devxoul/agent-messenger/agent-slack) [](https://skillpad.dev/install/devxoul/agent-messenger/agent-slackbot) [](https://skillpad.dev/install/devxoul/agent-messenger/agent-discord) [](https://skillpad.dev/install/devxoul/agent-messenger/agent-discordbot) [](https://skillpad.dev/install/devxoul/agent-messenger/agent-teams)
|
|
36
74
|
|
|
37
|
-
### Skills CLI
|
|
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
|
-
|
|
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
|
|
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](
|
|
110
|
-
- **[Slack Bot Guide](
|
|
111
|
-
- **[Discord Guide](
|
|
112
|
-
- **[
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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",
|
package/dist/src/cli.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
package/dist/src/cli.js.map
CHANGED
|
@@ -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 @@
|
|
|
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"}
|