아키텍처
CLI-JAW는 15개 라우트 모듈에 걸쳐 141개의 API 엔드포인트를 갖춘 Node.js 서버입니다. 네 가지 인터페이스(CLI, Web, Telegram, Discord)가 중앙 서버에 연결되며, 서버는 에이전트, 오케스트레이션, 메모리, 브라우저 하위 시스템으로 요청을 분배합니다.
시스템 개요
네 가지 인터페이스 모두 server.ts를 거치며, 이 파일은 인증, 보안, WebSocket, 부트스트랩을 처리한 후 src/routes/의 라우트 모듈로 위임합니다.
CLI (bin/commands/*) ──HTTP──→ server.ts (glue)
Web (public/) ──HTTP+WS→ │
Telegram Bot ──HTTP──→ │
Discord Bot ──HTTP──→ │
↓
Dashboard (port 24576) ─scan/proxy→ src/manager/
│
src/routes/* ──┤──→ src/core/
├──→ src/agent/
├──→ src/orchestrator/
├──→ src/prompt/
├──→ src/memory/
├──→ src/messaging/
├──→ src/telegram/
├──→ src/discord/
└──→ src/browser/
네 가지 인터페이스
| 인터페이스 | 진입점 | 전송 방식 |
|---|---|---|
| CLI | bin/cli-jaw.ts + bin/commands/*.ts | 서버로의 HTTP |
| Web UI | public/index.html | HTTP + WebSocket |
| Telegram | src/telegram/bot.ts | Grammy 봇 폴링 |
| Discord | src/discord/bot.ts | discord.js 게이트웨이 |
라우트 모듈
서버는 15개의 라우트 모듈을 등록합니다. 각 모듈은 Express 앱과 인증 미들웨어를 받는 독립적인 등록 함수입니다.
| 모듈 | 라우트 수 | 역할 |
|---|---|---|
server.ts (기본) | 14 | 헬스체크, 세션, 메시지, 인증, 명령, 중지, 초기화 |
settings.ts | 18 | 설정, 프롬프트, heartbeat-md, MCP, CLI 레지스트리, 쿼터 |
browser.ts | 41 | 브라우저 기본 동작, 탭 관리, web-ai 자동화 |
memory.ts | 13 | 메모리 런타임, KV 저장소, 메모리 파일 |
jaw-memory.ts | 11 | Jaw 메모리 검색, 읽기, 저장, 소울, 플러시, 리플렉션 |
orchestrate.ts | 11 | PABCD 상태, 워커, 디스패치, 큐 관리 |
goal.ts | 3 | 지속적 목표 상태, 이력 |
goal-run.ts | 3 | 범위 제한 목표 실행 생명주기 |
messaging.ts | 6 | 업로드, 파일 열기, 음성, 채널 전송 |
employees.ts | 5 | 직원 CRUD 및 초기화 |
skills.ts | 5 | 스킬 목록, 활성화, 비활성화, 초기화 |
avatar.ts | 4 | 에이전트/사용자 아바타 이미지 관리 |
traces.ts | 3 | 공개 트레이스 요약 및 이벤트 조회 |
heartbeat.ts | 2 | 하트비트 GET 및 검증된 PUT |
i18n.ts | 2 | 언어 목록 및 로케일 번들 |
파일 트리 개요
cli-jaw/
├── bin/ # CLI entry + 23 command files
│ ├── cli-jaw.ts # Root CLI router
│ └── commands/ # serve, init, doctor, chat, browser, ...
├── server.ts # Express/WS bootstrap (882L)
├── src/
│ ├── core/ # 21 files — config, DB, bus, i18n, employees
│ ├── agent/ # 37 files — spawn, events, lifecycle, ACP
│ ├── orchestrator/ # 10 files — PABCD pipeline, state machine
│ ├── prompt/ # builder + templates
│ ├── memory/ # 13 files — runtime, indexing, flush, identity
│ ├── cli/ # registry, commands, handlers, ACP client
│ ├── messaging/ # shared Telegram/Discord runtime
│ ├── telegram/ # Telegram bot transport
│ ├── discord/ # Discord bot transport
│ ├── browser/ # CDP control + web-ai automation
│ ├── routes/ # 15 route registrars
│ ├── manager/ # Dashboard server (77 TS/TSX files)
│ ├── security/ # Path guards, input validation
│ └── shared/ # Tool-log sanitization
├── public/ # Web UI (Vanilla TS + Vite 8)
│ ├── js/ # 80 TypeScript modules
│ ├── css/ # 11 CSS files
│ ├── manager/ # React 19 dashboard app (286 files)
│ └── dist/ # Build output
├── native/ # jaw-claude-i Rust helper
│ └── jaw-claude-i/ # 15 Rust source files
└── tests/ # 447 test files
핵심 하위 시스템
| 하위 시스템 | 위치 | 역할 |
|---|---|---|
| 에이전트 런타임 | src/agent/ | CLI 프로세스 생성, NDJSON 이벤트 스트리밍, 세션 관리, 큐, 폴백, 재시도 |
| 오케스트레이터 | src/orchestrator/ | PABCD 상태 머신, 직원 디스패치, 워커 모니터링 |
| 메모리 | src/memory/ | 3계층 메모리(구조화/에피소드/시맨틱), FTS5 인덱싱, 플러시, 리플렉션 |
| 프롬프트 빌더 | src/prompt/ | 9단계 프롬프트 파이프라인: A1, A2, 메모리, 오케스트레이션, 하트비트, 스킬, 위임 |
| 브라우저 | src/browser/ | Chrome CDP 제어, 비전 클릭, 탭 생명주기, web-ai 자동화 |
| 메시징 | src/messaging/ | 공유 Telegram/Discord 채널 라우팅, 대상 추적 |
보안 모델
- 인증: 71개의 변경 라우트 모두
requireAuth를 요구합니다. 루프백 요청은 토큰을 우회하며, LAN 우회는 선택적 설정입니다. - 속도 제한: 인메모리, IP 기반, 분당 120개 요청.
- 경로 가드:
assertMemoryRelPath(),assertSkillId(),safeResolveUnder()가 경로 탐색 공격을 방지합니다. - 토큰 부트스트랩:
GET /api/auth/token은Sec-Fetch-Site를 확인하여 교차 출처 토큰 탈취를 방지합니다.
데이터 저장소
CLI-JAW는 better-sqlite3를 통해 SQLite를 사용하여 세션, 메시지, 메모리, 직원, 오케스트레이션 상태, 대기 중인 메시지를 저장합니다. 데이터베이스 스키마는 src/core/db.ts에 정의되어 있습니다.
session # active CLI, session ID, model, working directory
messages # conversation history with trace and tool log
memory # key-value memory store
employees # registered employee agents
employee_sessions # per-employee session tracking
orc_state # PABCD orchestration state
queued_messages # pending message queue