Dashboard monitoring realtime buat ngawasin AI sub-agent yang jalan di server kamu.
Auto-detect agent dari Claude Code, OpenClaw, dan Copilot CLI β semua keliatan live di satu layar.
SubAgent Work View itu war room dashboard buat monitoring AI agent secara realtime. Jadi misal kamu lagi jalanin Claude Code, OpenClaw, atau Copilot CLI di server β semua agent, task, dan message mereka bakal muncul otomatis di dashboard ini lewat WebSocket.
Bayangin kayak mission control NASA, tapi buat AI agents π
| Fitur | Deskripsi |
|---|---|
| π Auto-detect Agents | Otomatis detect agent dari Claude Code, OpenClaw, dan Copilot CLI |
| π‘ Realtime Updates | WebSocket live updates via Soketi (Pusher-compatible) |
| πΊοΈ Agent Topology | Visualisasi koneksi antar agent dalam circular layout |
| π Task Tracker | Pantau progress task dengan timeline dan progress bar |
| π¬ Communication Log | Semua inter-agent message dalam satu panel |
| π Smart Notifications | Toast + drawer buat event penting (spawn, complete, error) |
| π Dark Glassmorphism | Design modern dengan backdrop blur yang keren |
| π± Mobile-first | Bottom nav di mobile, 12-column grid di desktop |
| β‘ PWA Ready | Bisa di-install sebagai app, offline-capable |
| π Auto-reconnect | WebSocket reconnect otomatis dengan exponential backoff |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β INTERNET β
β β β
β βββββββββΌββββββββ β
β β CLOUDFLARE β β
β β (DNS/CDN) β β
β βββββββββ¬ββββββββ β
ββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββ
β
ββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββ
β VPS SERVER β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β NGINX (:443 HTTPS + SSL/TLS) β β
β β Let's Encrypt Auto-Renewal Certificate β β
β βββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β FRONTEND β β BACKEND β β WEBSOCKET β β
β β (SPA) β β API β β PROXY β β
β β /dist/* β β /api/v1/* β β /app/* /apps β β
β ββββββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
β β β β
β βΌ βΌ β
β ββββββββββββββββββββ ββββββββββββββββββββ β
β β PHP-FPM 8.3 β β SOKETI β β
β β Laravel 11 ββββββ broadcast βββββ (Docker) β β
β β :8005 (TCP) β β :6001 (WS) β β
β ββββββββββ¬ββββββββββ ββββββββββββββββββββ β
β β β
β ββββββββββββββββΌβββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β MySQL 8 β β Redis β β Queue β β
β β :3306 β β :6379 β β Worker β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β² β² β²
β β β
ββββββ΄βββββ βββββββ΄ββββββ βββββββ΄βββββββ
β Claude β β OpenClaw β β Copilot β
β Code β β Gateway β β CLI β
β (hooks) β β (JSONL) β β (webhook) β
βββββββββββ βββββββββββββ ββββββββββββββ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DATA FLOW DIAGRAM β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββ β
β β Claude Code ββββ β
β β (hooks) β β β
β βββββββββββββββ β β
β β POST /api/v1/webhook/{source} β
β βββββββββββββββ β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β OpenClaw ββββΌβββββΆβ WEBHOOK CONTROLLER β β
β β (JSONL) β β β β’ Validate payload β β
β βββββββββββββββ β β β’ Normalize format (claude/openclaw/copilot) β β
β β β β’ Extract session_id, agent_id, event_type β β
β βββββββββββββββ β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββ β
β β Copilot CLI ββββ β β
β β (webhook) β βΌ β
β βββββββββββββββ βββββββββββββββββββββββ β
β β AGENT INGEST SVC β β
β β β’ upsertSession() β β
β β β’ upsertAgent() β β
β β β’ createMessage() β β
β ββββββββββββ¬βββββββββββ β
β β β
β ββββββββββββββββββββββΌβββββββββββββββββββββ β
β βΌ βΌ βΌ β
β ββββββββββββββ ββββββββββββββ ββββββββββββββ β
β β MySQL β β Broadcast β β Redis β β
β β (store) β β Event β β (cache) β β
β ββββββββββββββ βββββββ¬βββββββ ββββββββββββββ β
β β β
β βΌ β
β ββββββββββββββ β
β β SOKETI β β
β β WebSocket β β
β βββββββ¬βββββββ β
β β β
β βΌ β
β ββββββββββββββ β
β β FRONTEND β β
β β (React) β β
β β Realtime! β β
β ββββββββββββββ β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β User β β Session β β Agent β
βββββββββββββββββββ€ βββββββββββββββββββ€ βββββββββββββββββββ€
β id PK ββββ β id PK β ββββ id PK β
β name β β β uuid β β β uuid β
β email β β β external_id β β β name β
β password β βββββΆβ created_by FK β β β type (enum) β
β created_at β β status (enum) ββββββΌβββ session_id FK β
β updated_at β β command_source β β β status (enum) β
βββββββββββββββββββ β original_commandβ β β source β
β context (json) β β β capabilities β
β started_at β β β last_seen_at β
β ended_at β β ββββββββββ¬βββββββββ
ββββββββββ¬βββββββββ β β
β β β has many
has many β β βΌ
βΌ β βββββββββββββββββββ
βββββββββββββββββββ β β TaskLog β
β Task β β βββββββββββββββββββ€
βββββββββββββββββββ€ β β id PK β
β id PK βββββΌβββ task_id FK β
β uuid β β β agent_id FK ββββ
β session_id FK β β β action β β
β title β β β notes β β
β status (enum) β β β meta (json) β β
β agent_id FK βββββ β timestamp β β
β progress 0-100 β βββββββββββββββββββ β
β dependencies β β
β payload (json) β β
β result (json) β β
ββββββββββ¬βββββββββ β
β β
has many β β
βΌ β
βββββββββββββββββββ β
β Message β β
βββββββββββββββββββ€ β
β id PK β β
β session_id FK β β
β from_agent FK βββββββββββββββββββββββββββββ€
β to_agent FK βββββββββββββββββββββββββββββ
β content β
β message_type β
β channel β
β timestamp β
βββββββββββββββββββ
| Enum | Values |
|---|---|
| AgentStatus | idle, busy, communicating, error, offline |
| AgentType | planner, architect, coder, reviewer, tester, docs, devops |
| SessionStatus | queued, planning, running, completed, failed, cancelled |
| TaskStatus | pending, assigned, running, blocked, completed, failed, cancelled |
| MessageType | agent, system, user, broadcast |
| Channel | Scope | Events |
|---|---|---|
dashboard.global |
Global | All dashboard updates |
session.{id} |
Session-specific | Messages, task updates |
agent.{id} |
Agent-specific | Status changes |
| Event | Channel | Payload | Trigger |
|---|---|---|---|
agent.created |
dashboard.global | {agent: {...}} |
Agent spawned |
agent.status_changed |
dashboard.global, agent.{id} | {agent: {...}} |
Status update |
session.created |
dashboard.global | {session: {...}} |
New session |
session.completed |
dashboard.global, session.{id} | {session: {...}} |
Session finished |
task.created |
dashboard.global, session.{id} | {task: {...}} |
New task |
task.updated |
dashboard.global, session.{id} | {task: {...}} |
Progress update |
task.completed |
dashboard.global, session.{id} | {task: {...}} |
Task finished |
message.created |
session.{id} | {message: {...}} |
Inter-agent message |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/sessions |
List semua sessions (paginated) |
POST |
/api/v1/sessions |
Buat session baru |
GET |
/api/v1/sessions/{id} |
Detail session |
GET |
/api/v1/sessions/active |
Sessions yang lagi running |
POST |
/api/v1/sessions/{id}/start |
Start session |
POST |
/api/v1/sessions/{id}/cancel |
Cancel session |
GET |
/api/v1/sessions/{id}/timeline |
Timeline events |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/agents |
List semua agents |
POST |
/api/v1/agents |
Register agent baru |
PATCH |
/api/v1/agents/{id}/status |
Update status agent |
POST |
/api/v1/agents/{id}/heartbeat |
Heartbeat ping |
GET |
/api/v1/agents/overview/stats |
Statistik agents |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/tasks |
List tasks (filterable) |
POST |
/api/v1/tasks |
Buat task baru |
POST |
/api/v1/tasks/{id}/assign |
Assign ke agent |
POST |
/api/v1/tasks/{id}/retry |
Retry failed task |
| Method | Endpoint | Description |
|---|---|---|
POST |
/api/v1/webhook/claude |
Webhook dari Claude Code |
POST |
/api/v1/webhook/openclaw |
Webhook dari OpenClaw |
POST |
/api/v1/webhook/copilot-cli |
Webhook dari Copilot CLI |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/v1/dashboard/overview |
Overview stats |
GET |
/api/v1/dashboard/metrics |
Performance metrics |
GET |
/api/v1/health |
Health check |
subagent-work-view/
βββ π frontend/ # React 19 + Vite 8 + TypeScript
β βββ π src/
β β βββ π components/
β β β βββ π agents/ # AgentNode, AgentTopologyPanel, StatusRing
β β β βββ π command/ # CommandConsole, CommandPalette
β β β βββ π common/ # Badge, GlassPanel, Toast, Skeleton
β β β βββ π communication/ # MessageBubble, CommunicationLogPanel
β β β βββ π layout/ # WarRoomLayout, Header
β β β βββ π tasks/ # TaskCard, TaskTimeline, ProgressBar
β β βββ π hooks/ # useWebSocket, useDebounce, useMediaQuery
β β βββ π stores/ # Zustand: agent, task, session, notification
β β βββ π services/ # api.ts, websocket.ts (auto-reconnect)
β β βββ π lib/ # adapters, animations, utils
β β βββ π types/ # TypeScript definitions
β βββ π e2e/ # Playwright E2E tests
β βββ π dist/ # Production build
β
βββ π backend/ # Laravel 11 + PHP 8.3
β βββ π app/
β β βββ π Http/Controllers/Api/ # REST API controllers
β β βββ π Models/ # Agent, Session, Task, Message, TaskLog
β β βββ π Events/ # Broadcasting events
β β βββ π Jobs/ # Queue jobs
β β βββ π Services/
β β β βββ π Orchestration/ # TaskPlanner, TaskDistribution
β β β βββ π Webhook/ # AgentIngest, WebhookNormalizer
β β β βββ π Agent/ # AgentHealth, AgentRegistry
β β βββ π Enums/ # Status enums
β βββ π database/migrations/ # Schema definitions
β βββ π routes/api.php # API routes
β
βββ π docker/ # Docker configs
β βββ π nginx/ # Nginx config
β βββ π php/ # PHP-FPM Dockerfile
β βββ π supervisor/ # Queue worker config
β
βββ π claude-hooks/ # Claude Code integration
βββ π .github/workflows/ # CI/CD pipeline
βββ π docker-compose.yml # Development stack
βββ π README.md # You are here!
# App
APP_NAME="SubAgent Work View"
APP_ENV=production
APP_URL=https://live-agents.tams.codes
# Database
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=subagent_workview
DB_USERNAME=root
DB_PASSWORD=secret
# Broadcasting (Soketi)
BROADCAST_CONNECTION=pusher
PUSHER_APP_ID=subagent-app
PUSHER_APP_KEY=subagent-key
PUSHER_APP_SECRET=subagent-secret
PUSHER_HOST=127.0.0.1
PUSHER_PORT=6001
PUSHER_SCHEME=http
# Queue
QUEUE_CONNECTION=databaseVITE_API_URL=https://live-agents.tams.codes/api
VITE_PUSHER_APP_KEY=subagent-key
VITE_PUSHER_HOST=live-agents.tams.codes
VITE_PUSHER_PORT=443
VITE_PUSHER_SCHEME=https- Node.js 20+ LTS
- PHP 8.3+
- MySQL 8.0+
- Docker & Docker Compose (optional)
# Clone repo
git clone https://github.com/el-pablos/subagent-work-view.git
cd subagent-work-view
# Frontend
cd frontend
cp .env.example .env
npm install
npm run dev # http://localhost:5173
# Backend (terminal baru)
cd backend
cp .env.example .env
composer install
php artisan migrate
php artisan serve # http://localhost:8000
# Soketi WebSocket (terminal baru)
docker run -d --name soketi \
-p 6001:6001 \
-e SOKETI_DEFAULT_APP_ID=subagent-app \
-e SOKETI_DEFAULT_APP_KEY=subagent-key \
-e SOKETI_DEFAULT_APP_SECRET=subagent-secret \
quay.io/soketi/soketi:1.6-16-debian# Copy env dan jalankan semua services
cp .env.example .env
docker compose up -d
# Akses di http://localhostHook scripts di claude-hooks/ yang POST ke webhook setiap ada tool use:
# Install hooks
cp claude-hooks/* ~/.claude/hooks/
chmod +x ~/.claude/hooks/*.shEvents yang di-track:
agent_spawnβ ketika Task tool dipanggilagent_messageβ ketika SendMessage dipanggilagent_actionβ tool use lainnya
Daemon watcher yang tail JSONL session files:
# Start watcher
php artisan openclaw:watch
# Auto-detect session baru dan kirim ke webhookWebhook endpoint siap terima payload. Source auto-detect dari agent name/UUID.
# Frontend Unit Tests (Vitest)
cd frontend && npm test
# Frontend E2E Tests (Playwright)
cd frontend && npm run test:e2e
# Backend Tests (PHPUnit)
cd backend && php artisan test
# Type Check
cd frontend && npm run typecheck
# Lint
cd frontend && npm run lint
cd backend && ./vendor/bin/pint| Metric | Value |
|---|---|
| π’ Total Commits | 42+ |
| π₯ Contributors | 2 |
| π Source Files | 27K+ |
| π Lines of Code | 677K+ |
| π Latest Release | v1.0.0 |
| β Unit Tests | 39 passed |
| β E2E Tests | 5 passed |
| π± Responsive | Mobile-first |
| β‘ PWA | Service Worker + Manifest |
| π CI/CD | GitHub Actions + Auto Release |
| Layer | Technologies |
|---|---|
| Frontend | React 19, Vite 8, TypeScript 5.9, Tailwind CSS 4, Zustand 5, Framer Motion 12 |
| Backend | Laravel 11, PHP 8.3, MySQL 8, Redis |
| Realtime | Soketi (Pusher-compatible), Laravel Echo, Pusher.js |
| Testing | Vitest, Playwright, PHPUnit |
| DevOps | Docker, Nginx, GitHub Actions, Let's Encrypt |
el-pablos π§βπ» Creator & Lead Developer 41 commits (97.6%) |
Claude (Anthropic) π€ AI Pair Programmer Deep Analysis & Code Gen |
GitHub Copilot π€ AI Co-author 1 commit (2.4%) |
MIT License β bebas dipake, dimodif, dan didistribusi.
MIT License
Copyright (c) 2026 el-pablos
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Built with β€οΈ and π€ AI-powered development
War Room Dashboard β karena ngawasin AI agent harusnya gak ribet.