Chat Reply — Real-time Auto-Reply via SSE + Hermes CLI
Auto-reply comment, channel message, dan DM berdasarkan SSE events dari TaskGlory. Real-time: saat event masuk, listener langsung spawn Hermes → MCP tools → reply terkirim.
Arsitektur (v2.0)
User comment/message/mention
↓
TaskGlory backend → Redis pub/sub
↓
SSE stream (/api/mcp/sse)
↓
Python listener (taskglory_sse_listener.py) — bg process / launchd
↓
Spawn `hermes chat --cli` via PTY (MCP tools loaded)
↓
Hermes baca task/comments + generate reply via MCP tools
↓
task_comment_add / channel_send / dm_send → reply terkirim
TANPA queue file. TANPA cron. Real-time.
Prerequisites
- Hermes Agent installed (
hermesbinary di PATH atau full path) - MCP taskglory configured & tested:
hermes mcp test taskglory✓ - TaskGlory PAT token (
tgpat_xxx) — ada di~/.hermes/config.yamlsectionmcp_servers.taskglory.headers.Authorization
Cek token:
grep -o 'tgpat_[a-f0-9]*' ~/.hermes/config.yaml
Cek hermes path:
which hermes
Setup
Quick setup (recommended)
Jalankan setup script — otomatis cek prerequisites, copy listener, get token dari config, generate + load launchd/systemd service:
bash scripts/setup.sh
Script akan:
- Cek python3, hermes binary, MCP taskglory connection
- Copy
taskglory_sse_listener.pyke~/.hermes/scripts/ - Ambil token dari
~/.hermes/config.yaml(auto-detect) - Resolve hermes path (auto-detect, atau set
HERMES_BINenv var) - Generate launchd plist (macOS) atau systemd service (Linux) dengan token + path benar
- Load service + verify SSE connected
Manual setup
Jika prefer manual, ikut step-by-step:
Copy taskglory_sse_listener.py (dari scripts/ folder skill ini) ke ~/.hermes/scripts/:
mkdir -p ~/.hermes/scripts
cp scripts/taskglory_sse_listener.py ~/.hermes/scripts/
chmod +x ~/.hermes/scripts/taskglory_sse_listener.py
2. Update hermes path di listener
Edit ~/.hermes/scripts/taskglory_sse_listener.py, cari baris:
HERMES_BIN = os.environ.get("HERMES_BIN", "/Users/awan/.local/bin/hermes")
Ganti path sesuai output which hermes di mesin kamu.
3. Start listener
Manual (untuk test):
python3 ~/.hermes/scripts/taskglory_sse_listener.py "tgpat_xxx" &
Cek log:
tail -f ~/.hermes/scripts/sse_listener.log
Harus muncul:
[SSE] Connected. Status=200. Listening for events...
4. Setup persistent (launchd macOS)
Buat plist ~/Library/LaunchAgents/com.hermes.taskglory-sse.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.hermes.taskglory-sse</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/python3</string>
<string>/Users/YOUR_USERNAME/.hermes/scripts/taskglory_sse_listener.py</string>
<string>tgpat_YOUR_TOKEN</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/Users/YOUR_USERNAME/.hermes/scripts/sse_listener_stdout.log</string>
<key>StandardErrorPath</key>
<string>/Users/YOUR_USERNAME/.hermes/scripts/sse_listener_stderr.log</string>
<key>WorkingDirectory</key>
<string>/Users/YOUR_USERNAME/.hermes/scripts</string>
</dict>
</plist>
Ganti YOUR_USERNAME, YOUR_TOKEN, dan python path (/usr/bin/python3 atau path homebrew python).
Load:
launchctl load ~/Library/LaunchAgents/com.hermes.taskglory-sse.plist
Cek status:
launchctl list | grep taskglory-sse
Unload:
launchctl unload ~/Library/LaunchAgents/com.hermes.taskglory-sse.plist
5. Setup persistent (Linux systemd)
Buat ~/.config/systemd/user/taskglory-sse.service:
[Unit]
Description=TaskGlory SSE Auto-Reply Listener
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 %h/.hermes/scripts/taskglory_sse_listener.py tgpat_YOUR_TOKEN
Restart=always
RestartSec=3
Environment=HERMES_BIN=%h/.local/bin/hermes
[Install]
WantedBy=default.target
Enable:
systemctl --user enable --now taskglory-sse
SSE Event Types
| Event | Trigger | Data Fields |
|---|---|---|
comment_created |
Comment di task agent | task_id, task_code, comment_id, author_name, content_preview |
task_mention |
Agent di-mention di task comment | task_id, task_code, comment_id, author_name, content_preview |
channel_message |
Message di channel agent | channel_id, channel_name, message_id, author_name, content_preview |
mentioned |
Agent di-mention di channel | message_id, channel_name |
direct_message |
DM ke agent | conversation_id, message_id, sender_name, content_preview |
task_assigned |
Agent di-assign ke task | task_id, task_title |
Auto-Reply Workflow
Reply Comment di Task
- SSE event
comment_createdatautask_mentionmasuk - Listener parse: task_id, comment_id, author_name, content_preview
- Listener spawn Hermes CLI via PTY dengan prompt berisi event detail
- Hermes baca task detail:
task_get(task_id=...) - Hermes baca comments:
task_comments(task_id=...) - Hermes generate reply berdasarkan konten + agent persona
- Hermes kirim:
task_comment_add(task_id=..., body="...", mentions=[author_id])
Reply Channel Message
- SSE event
channel_messageataumentioned - Listener parse: channel_id, message_id, author_name, content_preview
- Hermes baca messages:
channel_messages(channel_id=...) - Hermes kirim reply:
channel_send(channel_id=..., content="...", parent_id=message_id)
Reply DM
- SSE event
direct_message - Listener parse: conversation_id, message_id, sender_name, content_preview
- Hermes kirim:
dm_send(conversation_id=..., content="...")
Agent Persona
Agent punya persona/instructions di AgentConfig TaskGlory (set via web/admin):
persona— karakter agent (mis. "Sarah, assistant yang ramah dan precise")jobdesk— tugas utama agentinstructions— aturan behavior
Hermes CLI akan baca persona ini dari system prompt + memory.
Access Control
- Agent hanya bisa di-mention oleh owner atau superadmin
- Comment dari agent sendiri TIDAK trigger SSE event (backend filter)
- Agent tetap bisa balas jika comment/message tidak mention tapi agent adalah assignee/channel member/DM participant
Files
| File | Fungsi |
|---|---|
scripts/taskglory_sse_listener.py |
Main listener script (generic, auto-detect hermes path) |
scripts/setup.sh |
Setup script — auto-detect token, copy listener, generate + load service |
~/.hermes/scripts/taskglory_sse_listener.py |
Installed listener (copy dari scripts/) |
~/.hermes/scripts/sse_listener.log |
Log output (auto-created) |
~/.hermes/scripts/sse_processed_ids.txt |
Dedupe: processed comment/message IDs (auto-created) |
~/Library/LaunchAgents/com.hermes.taskglory-sse.plist |
launchd plist (macOS, auto-generated by setup.sh) |
~/.config/systemd/user/taskglory-sse.service |
systemd service (Linux, auto-generated by setup.sh) |
Pitfalls
- One-shot mode tidak load MCP —
hermes -zhanya load built-in tools. WAJIB pakaihermes chat --clivia PTY. Listener handle ini otomatis. - Hermes path di launchd — launchd tidak load shell profile (
.zshrc/.bashrc), jadihermestidak ada di PATH. WAJIB pakai full path (mis./Users/awan/.local/bin/hermes). Listener cekHERMES_BINenv var, fallback ke hardcoded path — edit sesuai mesin kamu. - MCP connect time — butuh ~9s (4s Hermes boot + 5s MCP register) sebelum prompt dikirim. Listener handle ini otomatis.
- Token 401 — pastikan pakai token dari
~/.hermes/config.yaml. Token lama mungkin expired. Regenerate dari TaskGlory web jika perlu. - Agent self-comment tidak trigger SSE — backend filter event dari agent sendiri. Test harus pakai comment dari user lain.
- Dedupe —
comment_created+task_mentionbisa punyacomment_idsama. Listener skip duplicate viasse_processed_ids.txt. - PTY required —
hermes chat --clibutuh TTY. Tanpa PTY, MCP tools tidak load. Listener pakaipty.openpty(). - Python path di launchd — homebrew python path berbeda dari system python. Cek:
which python3di terminal, pakai path itu di plist. - Event timeout — listener max 180s per event. Jika Hermes lambat, event berikutnya menunggu. Untuk concurrency, bisa modifikasi listener untuk spawn thread per event (tapi hati-hati dengan resource).
Verify
- Listener running:
launchctl list | grep taskglory-sse(macOS) atausystemctl --user status taskglory-sse(Linux) - SSE connected:
tail ~/.hermes/scripts/sse_listener.log— harus ada "Connected. Status=200" - Test: minta user lain comment/mention agent di task → cek log muncul "Event received" → "Auto-reply completed"
- Cek reply: buka task di web TaskGlory, agent harus ada reply comment
Troubleshooting
| Masalah | Cek | Fix |
|---|---|---|
| 401 Unauthorized | Token expired | Regenerate PAT, update listener + config.yaml |
No such file or directory: 'hermes' |
Hermes path salah | Update HERMES_BIN di listener atau plist |
| MCP tools not loaded | Hermes one-shot mode | Pastikan pakai hermes chat --cli via PTY, bukan hermes -z |
| No events received | SSE connection | Cek network, cek agent punya akses ke task/channel |
| Duplicate replies | Dedupe file | Cek sse_processed_ids.txt, hapus jika perlu re-process |
| Listener crash | launchd log | Cek sse_listener_stderr.log, launchctl list untuk exit code |