架构
CLI-JAW 是一个 Node.js 服务器,包含 15 个路由模块中的 141 个 API 端点。四个接口(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 bot 轮询 |
| 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 记忆搜索、读取、保存、soul、刷新、反思 |
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/ | 三层记忆(结构化/情景/语义)、FTS5 索引、刷新、反思 |
| 提示词构建器 | src/prompt/ | 9 步提示词管道:A1、A2、记忆、编排、心跳、技能、委派 |
| 浏览器 | src/browser/ | Chrome CDP 控制、视觉点击、标签页生命周期、web-ai 自动化 |
| 消息传递 | src/messaging/ | 共享 Telegram/Discord 频道路由、目标追踪 |
安全模型
- 认证:所有 71 个变更路由都需要
requireAuth。回环请求绕过令牌;局域网绕过为可选启用。 - 速率限制:基于内存、按 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