# Multi-Agent Chat System — PLAN.md

## สถานะปัจจุบัน (Current Status)

### ทำเสร็จแล้ว ✅

| # | Component | Status | File |
|---|-----------|--------|------|
| 1 | IPC `inject` type ใน supervisor | ✅ เสร็จ | `src/services/Supervisor/supervisor.ts` |
| 2 | `handleInject()` handler | ✅ เสร็จ | `src/services/Supervisor/supervisor.ts` |
| 3 | Session input pipe helper | ✅ เสร็จ | `src/services/Supervisor/supervisor.ts` |
| 4 | Spawn ด้วย stdin pipe (ไม่ ignore) | ✅ เสร็จ | `src/services/Supervisor/supervisor.ts` |
| 5 | `injectMessage()` ใน ipcClient | ✅ เสร็จ | `src/services/Supervisor/ipcClient.ts` |
| 6 | Chat CLI command | ✅ เสร็จ | `src/commands/chat.tsx` |
| 7 | TUI Chat Input | ✅ เสร็จ | `src/commands/chat.tsx` |
| 8 | `/team` command - ดู sessions พร้อมบทบาท | ✅ เสร็จ | `src/commands/team.tsx` |
| 9 | `/send` command - ส่งข้อความระหว่าง session | ✅ เสร็จ | `src/commands/send.tsx` |
| 10 | Register commands ใน commands.ts | ✅ เสร็จ | `src/commands.ts` |
| 11 | CLI argument parsing ใน main.tsx | ✅ เสร็จ | `src/main.tsx` |

### ยังไม่ได้ทำ ❌

| # | Component | Status | File |
|---|-----------|--------|------|
| 12 | Test end-to-end | ❌ | — |
| 13 | Auto-forward messages จาก worker ไป lead | ❌ | — |

---

## Multi-Agent Chat Architecture

```
┌─────────────────────────────────────────────────────────────────┐
│                     Multi-Agent Chat System                      │
├─────────────────────────────────────────────────────────────────┤
│                                                                  │
│   Lead Session                         Worker Sessions           │
│   ┌─────────────┐                    ┌─────────────┐           │
│   │  /team      │ ◄──────inject─────▶│  Worker 1   │           │
│   │  /send      │                    │  (code)     │           │
│   │  (coordinator)│                   └─────────────┘           │
│   └──────┬──────┘                    ┌─────────────┐           │
│          │                           │  Worker 2   │           │
│          │                           │  (test)     │           │
│          │                           └─────────────┘           │
│          │                           ┌─────────────┐           │
│          └──────────inject──────────▶│  Worker 3   │           │
│                                      │  (review)   │           │
│                                      └─────────────┘           │
│                                                                  │
│   Communication: IPC inject messages via Supervisor              │
│                                                                  │
└─────────────────────────────────────────────────────────────────┘
```

---

## Commands

### `/team` - ดู Sessions และกำหนดบทบาท

```bash
# ดู sessions ทั้งหมดพร้อมบทบาท
/team

# กำหนดบทบาท
/team role <sessionId> lead     # ตั้งเป็น lead
/team role <sessionId> worker   # ตั้งเป็น worker
/team role <sessionId> idle     # ลบบทบาท
```

**Output ตัวอย่าง:**
```
📋 Running Sessions:

👑 Leaders:
  abc12345  Main Session  [running]

⚙️  Workers:
  def67890  Code Writer   [running]
  ghi23456  Test Runner   [running]

💤 Idle:
  jkl78901  Reviewer      [stopped]
```

---

### `/send` - ส่งข้อความระหว่าง Session

```bash
# ส่งไปยัง session เฉพาะ
/send <sessionId> "ข้อความที่ต้องการ"

# ส่งไปยัง lead session ทั้งหมด
/send lead "งานเสร็จแล้ว"

# ส่งไปยัง worker session ทั้งหมด
/send worker "กรุณาตรวจสอบโค้ด"

# Broadcast ไปยังทุก session
/send all "ประชุมใน 5 นาที"
```

---

## IPC Protocol

### Request Type: `inject`

```json
{
  "type": "inject",
  "sessionId": "abc12345",
  "prompt": "What is the current status?"
}
```

### Response

```json
{
  "ok": true,
  "data": {
    "sessionId": "abc12345",
    "injected": "What is the current status?",
    "timestamp": 1717000000000
  }
}
```

---

## Named Pipe Per Session

### Windows
```
\\.\pipe\claude-session-input-{sessionId}
```

### Unix
```
/tmp/claude-session-input-{sessionId}.sock
```

### Behavior
- สร้างเมื่อ session เริ่มทำงาน (`spawnSessionProcess`)
- ลบเมื่อ session หยุด (`child.on('exit')`)
- Supervisor listens สำหรับ connection
- Messages ที่เขียนไป pipe จะถูก forward ไปยัง session's stdin

---

## Session stdin Behavior

**Before:** `stdio: ['ignore', 'pipe', 'pipe']`
**After:**  `stdio: ['pipe', 'pipe', 'pipe']`

อนุญาตให้ส่ง external input ไปยัง session process ผ่าน stdin

---

## Role System

### Roles

| Role | Description |
|------|-------------|
| `lead` | ผู้ประสานงาน - สั่งงานและดูแล worker |
| `worker` | ผู้ทำงาน - รับคำสั่งจาก lead |
| `idle` | ไม่มีบทบาทเฉพาะ |

### Auto-forward (Future)

Worker sessions สามารถ auto-forward messages ไปยัง lead session ได้:
- เมื่อ worker ทำงานเสร็จ → ส่งรายงานไป lead
- เมื่อ worker มีคำถาม → ส่งไป lead
- เมื่อ worker พบปัญหา → ส่งไป lead

Roles are persisted in `~/.claude/daemon/team-roles.json`, so role assignments survive separate CLI processes and can be used by `/send lead` or `/send worker` from any active session.

---

## วิธีใช้งาน

### 1. เริ่ม Multi-Agent Session

```bash
# Terminal 1: Start lead session
bun run src/main.tsx

# Terminal 2: Start worker session 1
bun run src/main.tsx --name "Code Writer"

# Terminal 3: Start worker session 2
bun run src/main.tsx --name "Test Runner"
```

### 2. กำหนดบทบาท

```bash
# ใน lead session
/team role abc12345 lead
/team role def67890 worker
/team role ghi23456 worker
```

### 3. ส่งข้อความ

```bash
# Lead สั่งงาน worker
/send def67890 "Please implement the user authentication module"

# Worker รายงาน lead
/send lead "I've completed the authentication module"

# Broadcast ไปทุก session
/send all "Meeting in 5 minutes"
```

หรือสั่งด้วยภาษาปกติใน TUI ได้โดยไม่ต้องใช้ slash command:

```text
lead ไปสั่งงาน session 3 ให้รัน test หน่อย
บอก worker ทุกตัวให้ review diff
ตั้ง abc12345 เป็น lead
โชว์ team sessions ทั้งหมด
```

โมเดลจะใช้ `MultiAgent` tool เพื่อ list sessions, assign role, หรือส่งข้อความให้ session เป้าหมายเอง

### 4. ดูสถานะ

```bash
# ดู sessions ทั้งหมด
/team
```

### 5. ใช้ผ่าน CLI โดยตรง

```bash
clew team
clew team role abc12345 worker
clew send worker "Please run the test suite"
clew chat abc12345
clew chat abc12345 "status update?"
```

---

## Files Modified/Created

### Modified ✅
- `src/services/Supervisor/supervisor.ts` — Added `inject` IPC type, `handleInject()`, `setupSessionInputPipe()`, `forwardInputToSession()`, `cleanupSessionInputPipe()`, changed spawn to `['pipe', 'pipe', 'pipe']`
- `src/services/Supervisor/ipcClient.ts` — Added `injectMessage()` function
- `src/commands.ts` — Added imports and registered `team`, `send`, `chat` commands
- `src/main.tsx` — Added CLI parsing for `team`, `send`, and `chat` commands

### Created ✅
- `src/commands/chat.tsx` — Chat CLI command handler
- `src/commands/team.tsx` — `/team` command for session management
- `src/commands/send.tsx` — `/send` command for inter-session messaging
- `src/tools/MultiAgentTool/MultiAgentTool.ts` — Model-callable natural-language team coordination tool
- `docs/PLAN.md` — This file

---

## Validation Workflow

### End-to-End Test

```bash
# Start supervisor daemon
bun run src/main.tsx daemon start

# Spawn background sessions
bun run src/main.tsx --bg "Task 1"
bun run src/main.tsx --bg "Task 2"

# Open lead session
bun run src/main.tsx

# In lead session:
/team                          # See all sessions
/team role <id> worker         # Assign roles
/send <id> "Do this task"     # Send commands
```

### Future: Auto-Forward

Add auto-forward logic in session message handler:
- When session receives response → check if it's a worker
- If worker → forward summary to lead session
- Use `injectMessage()` to send

---

## Notes

- ใช้ IPC inject สำหรับส่งข้อความระหว่าง sessions
- ไม่ต้องมี Web UI สำหรับ basic usage (ใช้ CLI commands ได้เลย)
- Web UI เป็น optional สำหรับ visual overview
- Role system persist ข้าม process ผ่าน `~/.claude/daemon/team-roles.json`
- Auto-forward ยังเป็น future work
