에이전트 라우팅
지능적인 변환으로 AI 에이전트 간에 출력을 자동으로 전달합니다.
에이전트 라우팅은 MadoHub의 핵심 기능입니다. 한 에이전트가 작업을 완료하면, MadoHub는 결과를 자동으로 추출하고, 실행 가능한 프롬프트로 변환한 후, 다른 에이전트에게 전달할 수 있습니다.
작동 방식
- 트리거 — 연결된 소스 타일이 설정된 트리거 유형(유휴 감지, 완료 감지, 키워드 매칭, 또는 연속 모드)에 따라 발동합니다.
- 추출 — MadoHub가 에이전트의 마지막 응답을 읽습니다. Claude Code의 경우 JSONL 세션 파일을 사용하여 깔끔하게 추출합니다. 다른 에이전트는 터미널 출력을 직접 읽습니다.
- 변환 — 추출된 출력이 대상 에이전트용 프롬프트로 변환됩니다. AI 기반 재작성, 템플릿 래핑, 또는 원시 전달을 사용할 수 있습니다.
- 전달 — 변환된 프롬프트가 인간과 유사한 지연(줄당 50–80ms)으로 대상 터미널에 한 줄씩 입력되고, 에이전트에 맞는 Enter 시퀀스로 제출됩니다.
JSONL 세션 해결
Claude Code의 경우, MadoHub는 세션 로그 파일을 읽어 깔끔한 응답을 추출합니다:
- 터미널의 tmux 페인을 찾은 후, 프로세스 트리(
ps -eo pid=,ppid=,comm=)를 너비 우선으로 탐색하여 명령 이름에 claude/codex/amp/opencode가 포함된 첫 번째 자손 프로세스를 찾습니다. 이 PID가 에이전트 프로세스입니다. ~/.claude/sessions/{PID}.json(session id가 아닌 에이전트의 PID로 키가 지정됨)을 읽어sessionId필드를 추출합니다.~/.claude/projects/의 모든 하위 디렉토리를 스캔하여{sessionId}.jsonl이라는 이름의 파일(트랜스크립트)을 찾습니다.- JSONL을 파싱하여 마지막 어시스턴트 메시지를 추출합니다.
이를 통해 ANSI 코드와 서식 아티팩트를 피하고 원시 터미널 스크래핑보다 훨씬 깔끔한 콘텐츠를 얻을 수 있습니다.
별도로, cwd_to_project_dir()는 타일의 작업 디렉토리를 프로젝트 디렉토리에 매핑합니다. /를 -로 치환하며, 정확히 일치하는 항목이 없으면 부분 문자열 검색으로 대체합니다.
트리거 유형
| 유형 | 동작 |
|---|---|
| on-idle | 완료 키워드 매칭(IDLE_DELAY_MS)을 기다린 후 8초간의 침묵을 기다립니다. 기본값이자 가장 안정적입니다. |
| on-complete | on-idle과 동일하게 처리됩니다: 동일한 완료 키워드 매칭을 기다린 후, 동일한 8초 침묵 지연이 지나야 발동합니다. |
| on-keyword | 출력에서 사용자 정의 정규식 패턴이 매칭될 때 발동합니다. |
| always | 모든 새 터미널 출력을 지속적으로 스트리밍합니다. |
변환 유형
| 유형 | 설명 |
|---|---|
| ai-routing | AI 모델을 사용하여 대상 에이전트에 맞는 컨텍스트 인식 프롬프트를 생성합니다. 설정에서 API 키가 필요합니다. 사용자 정의 템플릿을 지원합니다. |
| prompt-wrap | 사용자 제공 템플릿으로 출력을 감쌉니다. 변수: {output}, {round}, {maxRounds}, {source}. |
| full-output | 터미널 출력의 마지막 30줄을 그대로 전송합니다. |
| raw | 터미널 출력의 마지막 10줄을 전송합니다. |
| summary | AI가 생성한 출력 요약을 전송합니다. |
라우팅 디스패치는 기본적으로 madoagent 경로를 사용합니다(legacy, shadow도 선택 가능).
콘텐츠 전달
MadoHub는 50–80ms의 지연으로 대상 터미널에 한 줄씩 콘텐츠를 입력하여 인간의 입력을 시뮬레이션합니다. Enter 키 동작은 에이전트마다 다릅니다:
- Claude Code, Codex, Amp, OpenCode: 더블 캐리지 리턴(
\r\r)으로 제출합니다. Codex는 800ms의 사전 지연과 두 번의 입력 사이 200ms 간격을 가지며, 나머지 에이전트는 500ms의 사전 지연을 사용합니다. - Shell: 단일 개행(
\n)으로 제출합니다.
루프 보호
라우팅 연결에는 무한 루프를 방지하기 위한 내장 안전장치가 있습니다:
| 설정 | 기본값 | 범위 | 설명 |
|---|---|---|---|
| maxRounds | 5 | 1–20 | 자동 비활성화 전 최대 라우팅 사이클 수. |
| cooldownMs | 3s | 1–30s | 트리거 간 최소 지연. |
| stopKeyword | — | 임의의 문자열 | 감지 시 라우팅을 중지합니다 (예: "LGTM"). |
워크플로 예시
터미널 1 (Claude Code) 터미널 2 (Claude Code)
┌──────────────────────┐ → ┌──────────────────────┐
│ "Refactor auth module"│ │ Receives: │
│ │ │ "Review the refactor │
│ ✓ Done — 3 files │ │ in src/auth/..." │
└──────────────────────┘ └──────────────────────┘에이전트 1이 코드를 리팩토링합니다. 완료되면 MadoHub는 JSONL 응답을 읽고, AI 라우팅을 사용하여 구체적인 파일과 변경 사항이 담긴 리뷰 프롬프트를 생성하고, 에이전트 2에게 전달합니다.