diff --git a/CLAUDE.md b/CLAUDE.md index 8d3758e..88e573d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -58,6 +58,7 @@ Synology NAS 기반의 개인 웹 플랫폼 백엔드 모노레포. | `music-lab` | 18600 | AI 음악 생성·라이브러리 관리 API | | `blog-lab` | 18700 | 블로그 마케팅 수익화 API | | `realestate-lab` | 18800 | 부동산 청약 자동 수집·매칭 API | +| `agent-office` | 18900 | AI 에이전트 오피스 (실시간 WebSocket + 텔레그램 연동) | | `travel-proxy` | 19000 | 여행 사진 API + 썸네일 생성 | | `lotto-frontend` (nginx) | 8080 | 정적 SPA 서빙 + API 리버스 프록시 | | `webpage-deployer` | 19010 | Gitea Webhook 수신 → 자동 배포 | @@ -76,6 +77,7 @@ Synology NAS 기반의 개인 웹 플랫폼 백엔드 모노레포. | `/api/music/` | `music-lab:8000` | AI 음악 생성·라이브러리 API | | `/api/blog-marketing/` | `blog-lab:8000` | 블로그 마케팅 수익화 API | | `/api/realestate/` | `realestate-lab:8000` | 부동산 청약 API | +| `/api/agent-office/` | `agent-office:8000` | AI 에이전트 오피스 API + WebSocket | | `/webhook`, `/webhook/` | `deployer:9000` | Gitea Webhook | | `/media/music/` | `/data/music/` (파일 직접 서빙) | 생성된 오디오 파일 | | `/media/travel/.thumb/` | `/data/thumbs/` (파일 직접 서빙) | 썸네일 캐시 | @@ -407,6 +409,44 @@ docker compose up -d - `NAVER_CLIENT_SECRET`: 네이버 검색 API 시크릿 - `BLOG_DATA_PATH`: SQLite DB 저장 경로 (기본 `./data/blog`) +### agent-office (agent-office/) +- AI 에이전트 가상 오피스 — 2D 픽셀아트 사무실에서 에이전트가 실제 작업 수행 +- stock-lab/music-lab 기존 API를 서비스 프록시로 호출 (직접 DB 접근 없음) +- 실시간 상태 동기화: WebSocket (`/api/agent-office/ws`) +- 텔레그램 봇: 양방향 알림 + 승인 (인라인 키보드) +- DB: `/app/data/agent_office.db` (agent_config, agent_tasks, agent_logs, telegram_state 테이블) +- 파일 구조: `main.py`, `db.py`, `config.py`, `models.py`, `websocket_manager.py`, `service_proxy.py`, `telegram_bot.py`, `scheduler.py`, `agents/base.py`, `agents/stock.py`, `agents/music.py` + +**에이전트 FSM 상태**: idle → working → waiting (승인 대기) → reporting → break (휴식) + +**환경변수** +- `STOCK_LAB_URL`: stock-lab 내부 URL (기본 `http://stock-lab:8000`) +- `MUSIC_LAB_URL`: music-lab 내부 URL (기본 `http://music-lab:8000`) +- `TELEGRAM_BOT_TOKEN`: 텔레그램 봇 토큰 (미설정 시 알림 비활성화) +- `TELEGRAM_CHAT_ID`: 텔레그램 채팅 ID +- `TELEGRAM_WEBHOOK_URL`: 텔레그램 Webhook URL + +**스케줄러 job** +- 08:00 매일 — 주식 뉴스 요약 (`stock_news_job`) +- 60초 간격 — 유휴 에이전트 휴식 체크 (`idle_check_job`) + +**agent-office API 목록** + +| 메서드 | 경로 | 설명 | +|--------|------|------| +| WS | `/api/agent-office/ws` | WebSocket (init, agent_state, task_complete, command_result) | +| GET | `/api/agent-office/agents` | 에이전트 목록 | +| GET | `/api/agent-office/agents/{id}` | 에이전트 상세 (설정 + 상태) | +| PUT | `/api/agent-office/agents/{id}` | 에이전트 설정 수정 | +| GET | `/api/agent-office/agents/{id}/tasks` | 에이전트 작업 이력 | +| GET | `/api/agent-office/agents/{id}/logs` | 에이전트 로그 | +| GET | `/api/agent-office/tasks/pending` | 승인 대기 작업 목록 | +| GET | `/api/agent-office/tasks/{id}` | 작업 상세 | +| POST | `/api/agent-office/command` | 에이전트에 명령 전송 | +| POST | `/api/agent-office/approve` | 작업 승인/거부 | +| POST | `/api/agent-office/telegram/webhook` | 텔레그램 Webhook 수신 | +| GET | `/api/agent-office/states` | 전체 에이전트 상태 조회 | + ### deployer (deployer/) - Webhook 검증: `X-Gitea-Signature` (HMAC SHA256, `compare_digest` 사용) - `WEBHOOK_SECRET` 환경변수로 시크릿 관리