Always-On Channel Daemon
Run VibeCody as a persistent bot that listens on Slack, Discord, or GitHub webhooks and autonomously handles tasks — like Claude Code Channels or Cursor Automations.
Prerequisites: VibeCody installed, a provider configured, and a platform bot token.
What Is the Channel Daemon?
The channel daemon is an always-on process that:
- Listens on messaging platforms (Slack, Discord, Telegram, GitHub webhooks)
- Routes incoming messages through automation rules
- Spawns agent tasks for matching messages
- Falls back to conversational chat when no rules match
- Maintains session affinity (multi-turn conversations per user)
Unlike the basic --gateway mode (which does simple chat), the channel daemon supports concurrent agent execution, automation rules, and session management.
Quick Start
Step 1: Get a Bot Token
Slack:
- Go to api.slack.com/apps → Create New App
- Under “OAuth & Permissions”, add scopes:
chat:write,app_mentions:read,channels:history - Install to workspace → copy Bot User OAuth Token
Discord:
- Go to discord.com/developers → New Application
- Under “Bot”, click “Add Bot” → copy token
- Under “OAuth2”, generate invite URL with
botscope
Telegram:
- Message @BotFather on Telegram
- Send
/newbot, follow prompts → copy token
Step 2: Set Environment Variable
# Choose one:
export SLACK_BOT_TOKEN="xoxb-your-token"
export DISCORD_BOT_TOKEN="your-token"
export TELEGRAM_BOT_TOKEN="123456:ABC-your-token"
Step 3: Start the Daemon
# Start with Slack
vibecli --channel-daemon slack
# Or Discord
vibecli --channel-daemon discord
# Or Telegram
vibecli --channel-daemon telegram
Output:
[channel-daemon] Starting enhanced daemon on slack
[channel-daemon] Automation rules: .vibecli/automations/
[channel-daemon] Max concurrent tasks: 4
[daemon] Starting enhanced channel daemon on slack
[daemon] Max concurrent tasks: 4
The daemon runs indefinitely, polling for messages every 2 seconds.
Automation Rules
Create .vibecli/automations/ with TOML rule files to auto-trigger agent tasks:
Example: Auto-Review PRs
# .vibecli/automations/pr-review.toml
[rule]
id = "auto-pr-review"
name = "Auto-Review Pull Requests"
enabled = true
[trigger]
source = "GitHub"
events = ["pull_request"]
[filter]
required_fields = ["pr_number", "pr_title"]
[action]
prompt_template = "Review PR #: . Read the diff, check for bugs, security issues, and style problems. Provide a concise review."
approval_policy = "full-auto"
max_steps = 15
Example: Bug Reports → Auto-Fix
# .vibecli/automations/bug-fix.toml
[rule]
id = "auto-bug-fix"
name = "Auto-Fix Bug Reports"
enabled = true
[trigger]
source = "Slack"
events = ["message"]
[filter]
keywords = ["bug", "error", "crash", "broken"]
[action]
prompt_template = "A user reported: <div class="page-header">
<h1 class="page-title">Demo 37: A2A (Agent-to-Agent) Protocol</h1>
</div>
<div class="page-content">
<h2 id="overview">Overview</h2>
<p>VibeCody implements the Agent-to-Agent (A2A) protocol, enabling VibeCLI instances and external AI agents to discover each other, exchange capabilities, and delegate tasks over a standardized JSON-RPC interface. You can expose your local agent as an A2A service, discover agents on your network or the internet, and call remote agents to handle specialized tasks such as code review, security scanning, or documentation generation.</p>
<p><strong>Time to complete:</strong> ~10 minutes</p>
<h2 id="prerequisites">Prerequisites</h2>
<ul>
<li>VibeCLI v0.5.1 installed and on your PATH</li>
<li>At least one AI provider configured</li>
<li>Network access between agents (localhost for local demos, or open ports for remote)</li>
<li>For VibeUI: the desktop app running with the <strong>A2A</strong> panel visible</li>
</ul>
<h2 id="a2a-concepts">A2A Concepts</h2>
<table>
<thead>
<tr>
<th>Concept</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Agent Card</strong></td>
<td>JSON manifest describing an agent’s name, skills, endpoint, auth</td>
</tr>
<tr>
<td><strong>A2A Server</strong></td>
<td>An agent exposing its capabilities over HTTP/JSON-RPC</td>
</tr>
<tr>
<td><strong>Discovery</strong></td>
<td>Finding agents via mDNS, a registry URL, or direct endpoint</td>
</tr>
<tr>
<td><strong>Task Call</strong></td>
<td>Sending a task to a remote agent and receiving a streamed result</td>
</tr>
</tbody>
</table>
<h2 id="step-by-step-walkthrough">Step-by-Step Walkthrough</h2>
<h3 id="1-generate-your-agent-card">1. Generate Your Agent Card</h3>
<p>An agent card describes what your VibeCLI instance can do. Generate one from your current configuration.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a card
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Agent Card Generated:
{
"name": "vibecody-alice",
"description": "VibeCody AI coding assistant",
"version": "0.5.1",
"url": "http://localhost:7860",
"capabilities": {
"streaming": true,
"push_notifications": false,
"state_transition_history": true
},
"skills": [
{
"id": "code-review",
"name": "Code Review",
"description": "Review code for bugs, style, and security issues",
"tags": ["review", "security", "quality"]
},
{
"id": "code-generation",
"name": "Code Generation",
"description": "Generate code from natural language descriptions",
"tags": ["generation", "scaffold"]
},
{
"id": "test-generation",
"name": "Test Generation",
"description": "Generate unit and integration tests",
"tags": ["testing", "quality"]
},
{
"id": "documentation",
"name": "Documentation",
"description": "Generate and update documentation",
"tags": ["docs", "markdown"]
}
],
"authentication": {
"schemes": ["bearer"]
}
}
Saved to: ~/.vibecli/a2a-card.json
</code></pre></div></div>
<p>You can edit <code class="language-plaintext highlighter-rouge">~/.vibecli/a2a-card.json</code> to customize the agent name, description, and skill list.</p>
<h3 id="2-start-an-a2a-server">2. Start an A2A Server</h3>
<p>Expose your VibeCLI instance as an A2A-compatible agent server.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a serve
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>A2A Server starting...
Endpoint: http://0.0.0.0:7860/.well-known/agent.json
Agent name: vibecody-alice
Skills: 4 registered
Auth: bearer token (set A2A_TOKEN env var or use --a2a-token)
mDNS: broadcasting on local network
A2A server is running. Press Ctrl+C to stop.
Waiting for incoming task requests...
</code></pre></div></div>
<p>The server exposes:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">GET /.well-known/agent.json</code> – returns the agent card</li>
<li><code class="language-plaintext highlighter-rouge">POST /a2a/tasks/send</code> – submit a task (JSON-RPC)</li>
<li><code class="language-plaintext highlighter-rouge">POST /a2a/tasks/sendSubscribe</code> – submit a task with streaming response</li>
</ul>
<p><strong>CLI (non-interactive):</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli <span class="nt">--serve</span> <span class="nt">--a2a</span> <span class="nt">--port</span> 7860
</code></pre></div></div>
<h3 id="3-discover-external-agents">3. Discover External Agents</h3>
<p>Find other A2A agents on your local network or via a registry URL.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a discover
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Discovering A2A agents...
Local Network (mDNS):
1. vibecody-bob http://192.168.1.42:7860 Skills: code-review, security-scan
2. vibecody-carol http://192.168.1.55:7860 Skills: documentation, translation
3. qa-agent http://192.168.1.70:8080 Skills: test-generation, coverage
Registry (https://a2a.vibecody.dev):
4. docgen-service https://docgen.example.com Skills: documentation, api-docs
5. security-scanner https://sec.example.com Skills: sast, dast, dependency-audit
Found 5 agents. Use /a2a call <name> "task" to delegate.
</code></pre></div></div>
<p>You can also discover a specific agent by URL:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a discover http://192.168.1.42:7860
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Agent: vibecody-bob
Version: 0.5.1
Skills: code-review, security-scan
Streaming: yes
Auth: bearer token required
</code></pre></div></div>
<h3 id="4-call-a-remote-agent">4. Call a Remote Agent</h3>
<p>Delegate a task to a discovered agent. The remote agent processes the task and streams results back.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a call vibecody-bob <span class="s2">"Review src/main.rs for security issues"</span>
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Calling agent: vibecody-bob
Endpoint: http://192.168.1.42:7860
Task: Review src/main.rs for security issues
Skill: code-review
Streaming response from vibecody-bob:
## Security Review: src/main.rs
### Findings
1. **[HIGH] Unsanitized user input on line 45**
The `user_query` variable is passed directly to `format!()` without
escaping. This could allow prompt injection if the input comes from
an external source.
Recommendation: Sanitize input before interpolation.
2. **[MEDIUM] Hardcoded timeout on line 78**
The HTTP client uses a 30-second timeout. Consider making this
configurable to prevent hanging in CI environments.
3. **[LOW] Unused import on line 3**
`std::fs::File` is imported but never used.
Summary: 1 high, 1 medium, 1 low severity finding.
Task completed. Duration: 4.2s
</code></pre></div></div>
<h3 id="5-call-with-authentication">5. Call with Authentication</h3>
<p>If the remote agent requires a bearer token, pass it inline or set it in your config.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a call security-scanner <span class="s2">"Scan this project for vulnerabilities"</span> <span class="nt">--token</span> sk-a2a-abc123
</code></pre></div></div>
<p>Or configure tokens persistently in <code class="language-plaintext highlighter-rouge">~/.vibecli/config.toml</code>:</p>
<div class="language-toml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">[</span><span class="n">a2a</span><span class="k">.</span><span class="n">agents</span><span class="k">.</span><span class="n">security-scanner</span><span class="k">]</span>
<span class="n">url</span> <span class="o">=</span><span class="w"> </span><span class="s">"https://sec.example.com"</span>
<span class="n">token</span> <span class="o">=</span><span class="w"> </span><span class="s">"sk-a2a-abc123"</span>
</code></pre></div></div>
<h3 id="6-chain-multiple-agents">6. Chain Multiple Agents</h3>
<p>Delegate a multi-step workflow across agents.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a call vibecody-bob <span class="s2">"Review src/auth.rs"</span> | /a2a call qa-agent <span class="s2">"Generate tests for these findings"</span>
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Step 1: vibecody-bob reviewing src/auth.rs...
Found 2 issues (1 high, 1 medium)
Step 2: qa-agent generating tests...
Generated 3 test cases covering the reported issues:
- test_auth_rejects_empty_token
- test_auth_handles_expired_jwt
- test_auth_rate_limits_failed_attempts
Tests written to: tests/auth_security_tests.rs
</code></pre></div></div>
<h3 id="7-monitor-a2a-activity-in-vibeui">7. Monitor A2A Activity in VibeUI</h3>
<p>Open the <strong>A2A</strong> panel in VibeUI to see:</p>
<ul>
<li><strong>Agent Card</strong> tab: edit your agent card, toggle skills on/off</li>
<li><strong>Server</strong> tab: view incoming requests, active tasks, connection log</li>
<li><strong>Discovery</strong> tab: browse discovered agents, test connectivity</li>
<li><strong>Tasks</strong> tab: history of sent and received tasks with status and duration</li>
</ul>
<h2 id="configuration-reference">Configuration Reference</h2>
<p>Add A2A settings to <code class="language-plaintext highlighter-rouge">~/.vibecli/config.toml</code>:</p>
<div class="language-toml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">[</span><span class="n">a2a</span><span class="k">]</span>
<span class="n">enabled</span> <span class="o">=</span><span class="w"> </span><span class="kc">true</span>
<span class="n">port</span> <span class="o">=</span><span class="w"> </span><span class="mi">7860</span>
<span class="n">agent_name</span> <span class="o">=</span><span class="w"> </span><span class="s">"vibecody-alice"</span>
<span class="n">mdns</span> <span class="o">=</span><span class="w"> </span><span class="kc">true</span>
<span class="n">registry_url</span> <span class="o">=</span><span class="w"> </span><span class="s">"https://a2a.vibecody.dev"</span>
<span class="k">[</span><span class="n">a2a</span><span class="k">.</span><span class="n">auth</span><span class="k">]</span>
<span class="n">scheme</span> <span class="o">=</span><span class="w"> </span><span class="s">"bearer"</span>
<span class="n">token</span> <span class="o">=</span><span class="w"> </span><span class="s">"your-server-token"</span>
</code></pre></div></div>
<h2 id="demo-recording-json">Demo Recording JSON</h2>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"title"</span><span class="p">:</span><span class="w"> </span><span class="s2">"A2A (Agent-to-Agent) Protocol"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Expose VibeCLI as an A2A agent, discover peers, and delegate tasks to remote agents."</span><span class="p">,</span><span class="w">
</span><span class="nl">"duration_seconds"</span><span class="p">:</span><span class="w"> </span><span class="mi">180</span><span class="p">,</span><span class="w">
</span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.5.1"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"steps"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"repl"</span><span class="p">,</span><span class="w">
</span><span class="nl">"commands"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/a2a card"</span><span class="p">,</span><span class="w"> </span><span class="nl">"delay_ms"</span><span class="p">:</span><span class="w"> </span><span class="mi">3000</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Generate an agent card from current configuration"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"repl"</span><span class="p">,</span><span class="w">
</span><span class="nl">"commands"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/a2a serve"</span><span class="p">,</span><span class="w"> </span><span class="nl">"delay_ms"</span><span class="p">:</span><span class="w"> </span><span class="mi">5000</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Start the A2A server"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"repl"</span><span class="p">,</span><span class="w">
</span><span class="nl">"commands"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/a2a discover"</span><span class="p">,</span><span class="w"> </span><span class="nl">"delay_ms"</span><span class="p">:</span><span class="w"> </span><span class="mi">4000</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Discover agents on the local network and registry"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"repl"</span><span class="p">,</span><span class="w">
</span><span class="nl">"commands"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/a2a call vibecody-bob </span><span class="se">\"</span><span class="s2">Review src/main.rs for security issues</span><span class="se">\"</span><span class="s2">"</span><span class="p">,</span><span class="w"> </span><span class="nl">"delay_ms"</span><span class="p">:</span><span class="w"> </span><span class="mi">8000</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Delegate a code review task to a remote agent"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"vibeui_interaction"</span><span class="p">,</span><span class="w">
</span><span class="nl">"panel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"A2A"</span><span class="p">,</span><span class="w">
</span><span class="nl">"tab"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Discovery"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Browse discovered agents and test connectivity in VibeUI"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"vibeui_interaction"</span><span class="p">,</span><span class="w">
</span><span class="nl">"panel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"A2A"</span><span class="p">,</span><span class="w">
</span><span class="nl">"tab"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Tasks"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"View task history with status and duration"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<h2 id="whats-next">What’s Next</h2>
<ul>
<li><a href="../20-agent-teams/">Demo 20: Agent Teams</a> – Coordinate multiple local agents with roles</li>
<li><a href="../38-parallel-worktrees/">Demo 38: Parallel Worktrees</a> – Run agents in isolated git worktrees</li>
<li><a href="../16-mcp-servers/">Demo 16: MCP Server Integration</a> – Connect external tool servers via MCP</li>
</ul>
</div>
. Investigate and fix the issue."
approval_policy = "auto-edit"
max_steps = 20
Example: Incident Response
# .vibecli/automations/incident.toml
[rule]
id = "incident-response"
name = "PagerDuty Incident Response"
enabled = true
[trigger]
source = "PagerDuty"
events = ["incident.trigger"]
[filter]
severity = ["critical", "high"]
[action]
prompt_template = "INCIDENT: <div class="page-header">
<h1 class="page-title">Demo 37: A2A (Agent-to-Agent) Protocol</h1>
</div>
<div class="page-content">
<h2 id="overview">Overview</h2>
<p>VibeCody implements the Agent-to-Agent (A2A) protocol, enabling VibeCLI instances and external AI agents to discover each other, exchange capabilities, and delegate tasks over a standardized JSON-RPC interface. You can expose your local agent as an A2A service, discover agents on your network or the internet, and call remote agents to handle specialized tasks such as code review, security scanning, or documentation generation.</p>
<p><strong>Time to complete:</strong> ~10 minutes</p>
<h2 id="prerequisites">Prerequisites</h2>
<ul>
<li>VibeCLI v0.5.1 installed and on your PATH</li>
<li>At least one AI provider configured</li>
<li>Network access between agents (localhost for local demos, or open ports for remote)</li>
<li>For VibeUI: the desktop app running with the <strong>A2A</strong> panel visible</li>
</ul>
<h2 id="a2a-concepts">A2A Concepts</h2>
<table>
<thead>
<tr>
<th>Concept</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Agent Card</strong></td>
<td>JSON manifest describing an agent’s name, skills, endpoint, auth</td>
</tr>
<tr>
<td><strong>A2A Server</strong></td>
<td>An agent exposing its capabilities over HTTP/JSON-RPC</td>
</tr>
<tr>
<td><strong>Discovery</strong></td>
<td>Finding agents via mDNS, a registry URL, or direct endpoint</td>
</tr>
<tr>
<td><strong>Task Call</strong></td>
<td>Sending a task to a remote agent and receiving a streamed result</td>
</tr>
</tbody>
</table>
<h2 id="step-by-step-walkthrough">Step-by-Step Walkthrough</h2>
<h3 id="1-generate-your-agent-card">1. Generate Your Agent Card</h3>
<p>An agent card describes what your VibeCLI instance can do. Generate one from your current configuration.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a card
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Agent Card Generated:
{
"name": "vibecody-alice",
"description": "VibeCody AI coding assistant",
"version": "0.5.1",
"url": "http://localhost:7860",
"capabilities": {
"streaming": true,
"push_notifications": false,
"state_transition_history": true
},
"skills": [
{
"id": "code-review",
"name": "Code Review",
"description": "Review code for bugs, style, and security issues",
"tags": ["review", "security", "quality"]
},
{
"id": "code-generation",
"name": "Code Generation",
"description": "Generate code from natural language descriptions",
"tags": ["generation", "scaffold"]
},
{
"id": "test-generation",
"name": "Test Generation",
"description": "Generate unit and integration tests",
"tags": ["testing", "quality"]
},
{
"id": "documentation",
"name": "Documentation",
"description": "Generate and update documentation",
"tags": ["docs", "markdown"]
}
],
"authentication": {
"schemes": ["bearer"]
}
}
Saved to: ~/.vibecli/a2a-card.json
</code></pre></div></div>
<p>You can edit <code class="language-plaintext highlighter-rouge">~/.vibecli/a2a-card.json</code> to customize the agent name, description, and skill list.</p>
<h3 id="2-start-an-a2a-server">2. Start an A2A Server</h3>
<p>Expose your VibeCLI instance as an A2A-compatible agent server.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a serve
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>A2A Server starting...
Endpoint: http://0.0.0.0:7860/.well-known/agent.json
Agent name: vibecody-alice
Skills: 4 registered
Auth: bearer token (set A2A_TOKEN env var or use --a2a-token)
mDNS: broadcasting on local network
A2A server is running. Press Ctrl+C to stop.
Waiting for incoming task requests...
</code></pre></div></div>
<p>The server exposes:</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">GET /.well-known/agent.json</code> – returns the agent card</li>
<li><code class="language-plaintext highlighter-rouge">POST /a2a/tasks/send</code> – submit a task (JSON-RPC)</li>
<li><code class="language-plaintext highlighter-rouge">POST /a2a/tasks/sendSubscribe</code> – submit a task with streaming response</li>
</ul>
<p><strong>CLI (non-interactive):</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli <span class="nt">--serve</span> <span class="nt">--a2a</span> <span class="nt">--port</span> 7860
</code></pre></div></div>
<h3 id="3-discover-external-agents">3. Discover External Agents</h3>
<p>Find other A2A agents on your local network or via a registry URL.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a discover
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Discovering A2A agents...
Local Network (mDNS):
1. vibecody-bob http://192.168.1.42:7860 Skills: code-review, security-scan
2. vibecody-carol http://192.168.1.55:7860 Skills: documentation, translation
3. qa-agent http://192.168.1.70:8080 Skills: test-generation, coverage
Registry (https://a2a.vibecody.dev):
4. docgen-service https://docgen.example.com Skills: documentation, api-docs
5. security-scanner https://sec.example.com Skills: sast, dast, dependency-audit
Found 5 agents. Use /a2a call <name> "task" to delegate.
</code></pre></div></div>
<p>You can also discover a specific agent by URL:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a discover http://192.168.1.42:7860
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Agent: vibecody-bob
Version: 0.5.1
Skills: code-review, security-scan
Streaming: yes
Auth: bearer token required
</code></pre></div></div>
<h3 id="4-call-a-remote-agent">4. Call a Remote Agent</h3>
<p>Delegate a task to a discovered agent. The remote agent processes the task and streams results back.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a call vibecody-bob <span class="s2">"Review src/main.rs for security issues"</span>
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Calling agent: vibecody-bob
Endpoint: http://192.168.1.42:7860
Task: Review src/main.rs for security issues
Skill: code-review
Streaming response from vibecody-bob:
## Security Review: src/main.rs
### Findings
1. **[HIGH] Unsanitized user input on line 45**
The `user_query` variable is passed directly to `format!()` without
escaping. This could allow prompt injection if the input comes from
an external source.
Recommendation: Sanitize input before interpolation.
2. **[MEDIUM] Hardcoded timeout on line 78**
The HTTP client uses a 30-second timeout. Consider making this
configurable to prevent hanging in CI environments.
3. **[LOW] Unused import on line 3**
`std::fs::File` is imported but never used.
Summary: 1 high, 1 medium, 1 low severity finding.
Task completed. Duration: 4.2s
</code></pre></div></div>
<h3 id="5-call-with-authentication">5. Call with Authentication</h3>
<p>If the remote agent requires a bearer token, pass it inline or set it in your config.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a call security-scanner <span class="s2">"Scan this project for vulnerabilities"</span> <span class="nt">--token</span> sk-a2a-abc123
</code></pre></div></div>
<p>Or configure tokens persistently in <code class="language-plaintext highlighter-rouge">~/.vibecli/config.toml</code>:</p>
<div class="language-toml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">[</span><span class="n">a2a</span><span class="k">.</span><span class="n">agents</span><span class="k">.</span><span class="n">security-scanner</span><span class="k">]</span>
<span class="n">url</span> <span class="o">=</span><span class="w"> </span><span class="s">"https://sec.example.com"</span>
<span class="n">token</span> <span class="o">=</span><span class="w"> </span><span class="s">"sk-a2a-abc123"</span>
</code></pre></div></div>
<h3 id="6-chain-multiple-agents">6. Chain Multiple Agents</h3>
<p>Delegate a multi-step workflow across agents.</p>
<p><strong>REPL:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vibecli
<span class="o">></span> /a2a call vibecody-bob <span class="s2">"Review src/auth.rs"</span> | /a2a call qa-agent <span class="s2">"Generate tests for these findings"</span>
</code></pre></div></div>
<p>Example output:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Step 1: vibecody-bob reviewing src/auth.rs...
Found 2 issues (1 high, 1 medium)
Step 2: qa-agent generating tests...
Generated 3 test cases covering the reported issues:
- test_auth_rejects_empty_token
- test_auth_handles_expired_jwt
- test_auth_rate_limits_failed_attempts
Tests written to: tests/auth_security_tests.rs
</code></pre></div></div>
<h3 id="7-monitor-a2a-activity-in-vibeui">7. Monitor A2A Activity in VibeUI</h3>
<p>Open the <strong>A2A</strong> panel in VibeUI to see:</p>
<ul>
<li><strong>Agent Card</strong> tab: edit your agent card, toggle skills on/off</li>
<li><strong>Server</strong> tab: view incoming requests, active tasks, connection log</li>
<li><strong>Discovery</strong> tab: browse discovered agents, test connectivity</li>
<li><strong>Tasks</strong> tab: history of sent and received tasks with status and duration</li>
</ul>
<h2 id="configuration-reference">Configuration Reference</h2>
<p>Add A2A settings to <code class="language-plaintext highlighter-rouge">~/.vibecli/config.toml</code>:</p>
<div class="language-toml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">[</span><span class="n">a2a</span><span class="k">]</span>
<span class="n">enabled</span> <span class="o">=</span><span class="w"> </span><span class="kc">true</span>
<span class="n">port</span> <span class="o">=</span><span class="w"> </span><span class="mi">7860</span>
<span class="n">agent_name</span> <span class="o">=</span><span class="w"> </span><span class="s">"vibecody-alice"</span>
<span class="n">mdns</span> <span class="o">=</span><span class="w"> </span><span class="kc">true</span>
<span class="n">registry_url</span> <span class="o">=</span><span class="w"> </span><span class="s">"https://a2a.vibecody.dev"</span>
<span class="k">[</span><span class="n">a2a</span><span class="k">.</span><span class="n">auth</span><span class="k">]</span>
<span class="n">scheme</span> <span class="o">=</span><span class="w"> </span><span class="s">"bearer"</span>
<span class="n">token</span> <span class="o">=</span><span class="w"> </span><span class="s">"your-server-token"</span>
</code></pre></div></div>
<h2 id="demo-recording-json">Demo Recording JSON</h2>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"meta"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"title"</span><span class="p">:</span><span class="w"> </span><span class="s2">"A2A (Agent-to-Agent) Protocol"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Expose VibeCLI as an A2A agent, discover peers, and delegate tasks to remote agents."</span><span class="p">,</span><span class="w">
</span><span class="nl">"duration_seconds"</span><span class="p">:</span><span class="w"> </span><span class="mi">180</span><span class="p">,</span><span class="w">
</span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.5.1"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"steps"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"repl"</span><span class="p">,</span><span class="w">
</span><span class="nl">"commands"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/a2a card"</span><span class="p">,</span><span class="w"> </span><span class="nl">"delay_ms"</span><span class="p">:</span><span class="w"> </span><span class="mi">3000</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Generate an agent card from current configuration"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"repl"</span><span class="p">,</span><span class="w">
</span><span class="nl">"commands"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/a2a serve"</span><span class="p">,</span><span class="w"> </span><span class="nl">"delay_ms"</span><span class="p">:</span><span class="w"> </span><span class="mi">5000</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Start the A2A server"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"repl"</span><span class="p">,</span><span class="w">
</span><span class="nl">"commands"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/a2a discover"</span><span class="p">,</span><span class="w"> </span><span class="nl">"delay_ms"</span><span class="p">:</span><span class="w"> </span><span class="mi">4000</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Discover agents on the local network and registry"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"repl"</span><span class="p">,</span><span class="w">
</span><span class="nl">"commands"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
</span><span class="p">{</span><span class="w"> </span><span class="nl">"input"</span><span class="p">:</span><span class="w"> </span><span class="s2">"/a2a call vibecody-bob </span><span class="se">\"</span><span class="s2">Review src/main.rs for security issues</span><span class="se">\"</span><span class="s2">"</span><span class="p">,</span><span class="w"> </span><span class="nl">"delay_ms"</span><span class="p">:</span><span class="w"> </span><span class="mi">8000</span><span class="w"> </span><span class="p">}</span><span class="w">
</span><span class="p">],</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Delegate a code review task to a remote agent"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"vibeui_interaction"</span><span class="p">,</span><span class="w">
</span><span class="nl">"panel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"A2A"</span><span class="p">,</span><span class="w">
</span><span class="nl">"tab"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Discovery"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Browse discovered agents and test connectivity in VibeUI"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">6</span><span class="p">,</span><span class="w">
</span><span class="nl">"action"</span><span class="p">:</span><span class="w"> </span><span class="s2">"vibeui_interaction"</span><span class="p">,</span><span class="w">
</span><span class="nl">"panel"</span><span class="p">:</span><span class="w"> </span><span class="s2">"A2A"</span><span class="p">,</span><span class="w">
</span><span class="nl">"tab"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Tasks"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"View task history with status and duration"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<h2 id="whats-next">What’s Next</h2>
<ul>
<li><a href="../20-agent-teams/">Demo 20: Agent Teams</a> – Coordinate multiple local agents with roles</li>
<li><a href="../38-parallel-worktrees/">Demo 38: Parallel Worktrees</a> – Run agents in isolated git worktrees</li>
<li><a href="../16-mcp-servers/">Demo 16: MCP Server Integration</a> – Connect external tool servers via MCP</li>
</ul>
</div>
. Check logs, identify root cause, and prepare a fix."
approval_policy = "suggest"
max_steps = 30
Session Management
The daemon maintains per-user sessions with conversation history:
- Each
channel:userpair gets its own session - Sessions persist across multiple messages (multi-turn)
- Sessions timeout after 30 minutes of inactivity (configurable)
- History is capped at 50 messages to prevent unbounded growth
Managing the Daemon from REPL
You can also manage the daemon from the interactive REPL:
vibecli
> /daemon status # Show daemon state
> /daemon start # Start listening
> /daemon stop # Stop the daemon
> /daemon channels # List supported platforms
> /daemon logs # Show recent event log
Configuration
Full daemon configuration in ~/.vibecli/config.toml:
[channel_daemon]
port = 7879 # Webhook server port
max_concurrent_sessions = 8 # Max parallel agent tasks
rate_limit_per_channel = 60 # Messages per minute per channel
health_check_interval_secs = 30 # Health log interval
auto_restart = true # Restart on crash
[[channel_daemon.channels]]
platform = "slack"
auto_respond = true # Respond to all messages (not just @mentions)
max_concurrent = 3 # Per-channel concurrency limit
approval_policy = "auto-edit" # Agent approval mode
session_timeout_secs = 1800 # 30 minute session timeout
Security
- Allowed users — whitelist specific users via
allowed_usersin gateway config - Command blocklist — dangerous commands are blocked (same as interactive mode)
- SSRF protection — agent URL fetching blocks internal IPs
- Rate limiting — configurable per-channel rate limits prevent abuse
- Session isolation — each user’s session is independent