AI Teams

人类 Leader 指挥多 AI Agent 协作的开源调度平台

TypeScript Fastify + WebSocket React Claude CLI E2E 加密

AI Teams 是一个三方协作系统:人类 Leader 通过 Web 控制台或 REST API 向 Server 提交任务,Server 将任务智能调度给多个 AI Agent(运行 Claude CLI)执行。支持任务队列、负载均衡、标签路由、优先级调度、端到端加密和实时监控。

🚀

智能调度

优先级队列 + 标签匹配 + 最小负载优先,三种调度模式灵活适配。

📊

实时监控

Web 控制台实时展示 Agent 状态、任务输出、统计分析,支持移动端。

🔒

安全加密

可选 AES-256-GCM 端到端加密,WebSocket 消息全链路保护。

🔄

高可用

守护进程自动重启、Agent 断线任务恢复(最多重试 3 次)、心跳检测、Webhook 回调。

快速开始

1. 安装依赖

需要 Node.js ≥ 22pnpm ≥ 9

git clone <your-repo> ai-teams
cd ai-teams
pnpm install

2. 一键启动(开发模式)

pnpm dev:all

这将同时启动 Server(:3789)、Agent Alice 和 Web 控制台(:5173),使用 dev-token 自动认证。

提示:开发模式下 Agent 需要 claude CLI 已安装且登录。如无 Claude CLI,可使用 RUNNER_MODE=fake 模拟。

3. 访问控制台

浏览器打开 http://localhost:5173,输入 token dev-token 即可进入。

架构概览

  ┌──────────────┐     WebSocket      ┌──────────────┐     WebSocket     ┌──────────────┐
  │   Web 控制台   │ ◄──────────────► │    Server     │ ◄─────────────► │  Agent (N)   │
  │  (Leader)     │    /ws/leader     │   Fastify     │    /ws/agent    │  Claude CLI  │
  │  React SPA    │                   │  SQLite / PG  │                 │  Heartbeat   │
  └──────────────┘                    └──────┬───────┘                 └──────────────┘
        │                                    │
        │         REST API (/api/*)          │
        └────────────────────────────────────┘

核心组件

组件技术栈职责
ServerFastify 5 + WebSocket + SQLite/PostgreSQL中央调度枢纽:任务队列、Agent 管理、持久化、API 网关
AgentNode.js + WebSocket连接 Server、接收任务、启动 claude -p 子进程执行
WebReact 19 + ViteLeader 控制台:监控、命令分发、日志查看、统计分析
SharedTypeScript共享协议类型、消息解析、加密工具

任务生命周期

queued dispatched accepted running completed failed cancelled timeout

终态(completed / failed / cancelled / timeout)不可变更,后续事件将被忽略。

调度模式

模式参数行为
Queue atAgents: "queue" 进入共享优先级队列,按负载和标签匹配分发给空闲 Agent。每个队列任务使用独立 Claude 会话。
Direct atAgents: ["alice"] 直接分发给指定 Agent,使用其持久化会话(支持 --resume 连续对话)。
Broadcast atAgents: "all" 同时发送给所有在线 Agent,共享同一 leaderCommandId

部署指南

环境要求

构建

# 构建顺序:shared → server → agent
pnpm build

# Web 独立构建
cd apps/web && pnpm build

生产启动

# 设置认证 Token(必填)
export AI_TEAMS_AUTH_TOKEN="your-secret-token"

# 启动 Server(守护进程模式)
ai-teams-server start --token "your-secret-token" --port 3789

# 启动 Agent(守护进程模式)
ai-teams-agent start --server ws://localhost:3789 --token "your-secret-token" \
  --id alice --name "Alice"

# 或使用 pnpm(开发模式)
pnpm start:server
pnpm start:agent:alice

# 启动 Web 控制台
pnpm start:web

一键全部启动

AI_TEAMS_AUTH_TOKEN="your-secret-token" pnpm start:all

Agent 交互式配置

首次运行 Agent 会自动进入配置向导:

node apps/agent/dist/index.js

也可使用 --config 重新配置。配置保存在 ~/.ai-teams/config.json

通过 npm 安装

Server 和 Agent 已发布到 npm,无需克隆仓库即可使用。

全局安装

# 安装 Server
npm install -g @csdwd/ai-teams-server

# 安装 Agent
npm install -g @csdwd/ai-teams-agent

安装后即可直接使用 CLI 命令:

# 以守护进程方式启动 Server(推荐)
ai-teams-server start --token "your-secret-token" --port 3789

# 以守护进程方式启动 Agent(首次运行自动进入配置向导)
ai-teams-agent start

使用 npx(无需安装)

# 直接运行 Server
npx @csdwd/ai-teams-server start --token "your-secret-token"

# 直接运行 Agent
npx @csdwd/ai-teams-agent start

CLI 命令

ai-teams-server

子命令说明
start [选项]以守护进程方式启动
stop停止守护进程
restart [选项]重启守护进程
status查看运行状态和 PID
update从 npm 更新到最新版本
参数说明
--token <token>认证 Token(必填)
--port <port>服务端口(默认 3789)
--host <host>绑定地址(默认 0.0.0.0)
--data-dir <dir>数据目录
--db-path <path>数据库路径
--log-level <level>日志级别(默认 info)
--log-dir <dir>日志文件目录
-v, --version显示版本号
-h, --help显示帮助

ai-teams-agent

子命令说明
start [选项]以守护进程方式启动
stop停止守护进程
restart [选项]重启守护进程
status查看运行状态和 PID
update从 npm 更新到最新版本
参数说明
--server <url>Server WebSocket 地址
--token <token>认证 Token
--id <id>Agent 唯一标识
--name <name>显示名称
--workspace <dir>默认工作目录
--runner <mode>执行模式(claude / fake)
--config重新运行配置向导
-v, --version显示版本号
-h, --help显示帮助

配置持久化:首次使用 start 时传入的参数(token、server、id 等)会自动保存到配置文件。后续使用 startrestart 无需重复指定。

  • Server 配置:~/.ai-teams/server-config.json
  • Agent 配置:~/.ai-teams/config.json

多 Agent 部署示例

# 启动 Server(后台守护进程)
ai-teams-server start --token "my-secret"

# 启动 Agent Alice(后台守护进程)
ai-teams-agent start --server ws://localhost:3789 --token "my-secret" \
  --id alice --name "Alice" --workspace ~/projects/project-a

# 启动 Agent Bob
ai-teams-agent start --server ws://localhost:3789 --token "my-secret" \
  --id bob --name "Bob" --workspace ~/projects/project-b \
  --labels "backend,python"

# 查看运行状态
ai-teams-server status
ai-teams-agent status

# 更新到最新版本
ai-teams-agent update
ai-teams-agent restart  # 应用更新

包说明:

  • @csdwd/ai-teams-server — 服务端,依赖 Fastify / WebSocket / SQLite
  • @csdwd/ai-teams-agent — Agent 端,依赖 ws,需要系统安装 claude CLI
  • 共享协议包 @ai-teams/shared 在构建时已内联,无需单独安装

环境变量

Server

变量默认值说明
AI_TEAMS_AUTH_TOKEN必填共享认证 Token
AI_TEAMS_SERVER_PORT / PORT3789服务端口
HOST0.0.0.0绑定地址
DATA_DIR./data数据目录
DB_PATH<DATA_DIR>/ai-teams.dbSQLite 数据库路径
DATABASE_URL-PostgreSQL 连接串(设置后使用 PG 替代 SQLite)
DEFAULT_TIMEOUT_SEC1800默认任务超时(秒)
DISCONNECT_GRACE_MS15000断线宽限期(ms)
MAX_LOG_CHUNKS_PER_TASK400每任务最大日志块数
LOG_LEVELinfo日志级别:trace / debug / info / warn / error
LOG_DIR-日志文件目录(不设则仅 stdout)
AI_TEAMS_ENCRYPTION_KEY-E2E 加密密钥(64 位 hex = 32 字节)

Agent

变量默认值说明
AI_TEAMS_AUTH_TOKEN必填认证 Token(需与 Server 一致)
SERVER_URLws://localhost:3789Server WebSocket 地址
EMPLOYEE_IDemp_localAgent 唯一标识
EMPLOYEE_NAMELocal Agent显示名称
EMPLOYEE_LABELS-逗号分隔的标签(如 backend,python
RUNNER_MODEclaude执行模式:claudefake
DEFAULT_WORKSPACE当前目录默认工作目录
RECONNECT_MS5000重连间隔(ms)
AI_TEAMS_ENCRYPTION_KEY-E2E 加密密钥(需与 Server 一致)

Web

变量默认值说明
VITE_AI_TEAMS_AUTH_TOKEN-开发模式默认 Token
AI_TEAMS_SERVER_PORT3789Vite 代理目标端口
VITE_AI_TEAMS_ENCRYPTION_KEY-Web 端 E2E 加密密钥

REST API

所有 API 需要认证(Authorization: Bearer <token>?token=<token>)。Swagger UI:/docs

GET /health

健康检查,返回服务器状态摘要。

{
  "status": "ok",
  "timestamp": "2026-05-12T10:00:00.000Z",
  "dbPath": "./data/ai-teams.db",
  "employees": 2,
  "leaders": 1,
  "tasks": 42
}
GET /api/snapshot

获取完整状态快照(员工列表、所有任务、日志)。

{
  "employees": [{ "id": "alice", "name": "Alice", "status": "online", ... }],
  "tasks": [{ "id": "...", "prompt": "...", "status": "completed", ... }],
  "logs": { "task-id": [{ "content": "...", "seq": 1 }] }
}
POST /api/tasks

提交任务。支持三种目标模式、优先级、标签筛选和 Webhook 回调。

请求体

{
  "prompt": "分析这段代码的性能问题",
  "atAgents": "queue",
  "workspace": "/path/to/project",
  "timeoutSec": 600,
  "priority": 2,
  "requiredLabels": ["backend"],
  "cliConfig": {
    "model": "claude-sonnet-4-6",
    "maxTurns": 10,
    "systemPrompt": "你是一个代码审查专家",
    "allowedTools": ["Read", "Grep", "Bash"]
  },
  "webhook": "https://your-server.com/callback"
}

响应 202 Accepted

{
  "status": "accepted",
  "leaderCommandId": "cmd_xxx",
  "tasks": [{ "id": "task_xxx", "status": "queued", ... }]
}
GET /api/tasks

查询任务列表,支持分页和过滤。

查询参数

参数类型说明
statusstring过滤状态:queued / dispatched / accepted / running / completed / failed / cancelled / timeout
employeeIdstring按 Agent ID 过滤
limitnumber每页数量(1-100,默认 50)
offsetnumber偏移量(默认 0)
{ "tasks": [...] }
GET /api/tasks/:taskId

获取单个任务详情。

PATCH /api/tasks/:taskId

更新任务。仅允许修改 status(设为 cancelled)、timeoutSeccliConfig

POST /api/tasks/:taskId/cancel

取消任务。运行中的任务会通知 Agent 终止 Claude 进程。

DELETE /api/tasks/:taskId

删除任务。仅终态任务可删除(completed / failed / cancelled / timeout)。

GET /api/sessions/:sessionId/history

按 Session ID 获取对话历史(包含 prompt、输出、最终结果)。

GET /api/employees/:employeeId/claude-sessions

列出指定 Agent 工作区下的 Claude Code 会话列表。

定时任务 API

完整的 CRUD + 手动触发接口,详见定时任务章节。

方法路径说明
GET/api/schedules列出所有定时任务
GET/api/schedules/:id获取单个定时任务
POST/api/schedules创建定时任务
PATCH/api/schedules/:id更新定时任务
DELETE/api/schedules/:id删除定时任务
POST/api/schedules/:id/trigger手动触发一次执行

WebSocket 协议

两个 WebSocket 通道均需要 Token 认证(Header 或 ?token= 参数)。未授权连接将被关闭(code 1008)。

/ws/agent — Agent 通道

Agent 连接此通道,双向通信:接收任务、上报状态。

Server → Agent 消息

类型字段说明
task.dispatchtaskId, leaderCommandId, employeeId, targetMode, prompt, workspace, timeoutSec, cliConfig下发任务给 Agent
task.canceltaskId要求 Agent 取消任务

Agent → Server 消息

类型字段说明
agent.registeremployeeId, name, machineId, hostname, labels, activeMainTaskId?, activeQueueTaskId?, lastOutputSeq?注册 Agent(连接后立即发送)
agent.heartbeatemployeeId心跳(每 10s)
agent.request_taskemployeeId请求分配队列任务
task.acceptedtaskIdAgent 接受任务
task.startedtaskId, pid, sessionId?Claude 进程已启动
task.outputtaskId, stream (stdout|stderr), seq, content实时输出流
task.completedtaskId, exitCode, summary?, durationMs?, totalCostUsd?, usageInputTokens?, ...任务完成
task.failedtaskId, error任务失败
task.cancelledtaskId任务已取消

/ws/leader — Leader 通道

Web 控制台连接此通道。连接后 Server 立即推送完整 snapshot

Server → Leader 消息

类型字段说明
snapshotsnapshot (StateSnapshot)完整状态快照(连接时推送)
employee.upsertemployee (EmployeeSnapshot)Agent 状态变更
task.upserttask (TaskRecord)任务状态变更
task.outputchunk (TaskOutputChunk)任务实时输出
server.errorcode, message服务端错误
command.errorcode, message, leaderCommandId?命令执行错误

Leader → Server 消息

类型字段说明
command.dispatchatAgents, prompt, workspace?, timeoutSec?, priority?, requiredLabels?通过 atAgents 调度任务
command.sendemployeeId, prompt, workspace?, timeoutSec?直接发送给指定 Agent
command.broadcastprompt, workspace?, timeoutSec?广播给所有 Agent
task.canceltaskId取消任务

数据模型

TaskRecord

字段类型说明
idstring任务 ID
leaderCommandIdstring命令批次 ID(同一命令产生的多个任务共享)
employeeIdstring | null分配的 Agent ID
sessionIdstring | nullClaude 会话 ID
targetMode"queue" | "direct" | "broadcast"调度模式
promptstring任务指令
workspacestring | null工作目录
timeoutSecnumber超时时间(秒)
cliConfigTaskCliConfig | nullClaude CLI 配置
prioritynumber (0-3)优先级(0=低, 1=普通, 2=高, 3=紧急)
requiredLabelsstring[] | null要求的 Agent 标签
statusTaskStatus当前状态
createdAt / startedAt / finishedAtstring | null时间戳(ISO 8601)
exitCodenumber | null退出码
summarystring | null任务摘要
errorstring | null错误信息
durationMs / durationApiMsnumber | null耗时(ms)
numTurnsnumber | null对话轮次
totalCostUsdnumber | null总费用(USD)
usageInputTokens / usageOutputTokensnumber | nullToken 用量
usageCacheReadTokens / usageCacheCreationTokensnumber | null缓存 Token 用量
retryCountnumber断线重试次数(上限 3 次)

EmployeeSnapshot

字段类型说明
idstringAgent 唯一标识
namestring显示名称
machineId / hostnamestring机器信息
labelsstring[]标签列表
status"online" | "offline"在线状态
mainTaskId / mainTaskPromptstring | null主槽任务
queueTaskId / queueTaskPromptstring | null队列槽任务
lastSeenAtstring最后心跳时间

TaskCliConfig

字段类型说明
modelstring?模型名称(如 claude-sonnet-4-6
maxTurnsnumber?最大对话轮次
systemPromptstring?系统提示词
appendSystemPromptstring?追加系统提示词
allowedToolsstring[]?允许的工具列表
disallowedToolsstring[]?禁止的工具列表
extraArgsstring[]?额外 CLI 参数

Agent 使用

守护进程命令

ai-teams-agent <command> [选项]

命令:
  start [选项]          后台启动守护进程
  stop                  停止守护进程
  restart [选项]        重启守护进程
  status                查看运行状态
  update                更新到最新版本

选项:
  --server <url>       Server WebSocket 地址
  --token <token>      认证 Token
  --id <id>            Agent 唯一标识
  --name <name>        显示名称
  --workspace <dir>    默认工作目录
  --runner <mode>      执行模式 (claude | fake)
  --config             重新运行配置向导
  -h, --help           显示帮助

标签系统

通过 EMPLOYEE_LABELS 环境变量为 Agent 设置标签(逗号分隔):

EMPLOYEE_LABELS="backend,python,review" node dist/index.js

提交任务时可通过 requiredLabels 筛选匹配的 Agent:

{ "prompt": "审查 Python 代码", "atAgents": "queue", "requiredLabels": ["python"] }

双槽位并行

每个 Agent 有两个任务槽位:

两个槽位可以同时运行,实现并行执行。

Fake Runner 模式

用于测试,无需安装 Claude CLI:

RUNNER_MODE=fake node dist/index.js

模拟 Agent 会定时输出步骤信息,最终返回成功结果。

Agent 文件结构

.ai-teams/agents/<EMPLOYEE_ID>/
├── session-state.json      # 持久化会话 ID
├── daily/
│   └── 2026-05-12.md       # 每日活动日志
└── hooks/
    └── claude-hooks.settings.json  # Claude hooks 配置

Web 控制台

六个功能页面

💻

实时监控

Agent 卡片展示在线状态、活跃任务、终端输出。支持取消运行中任务。

📋

员工管理

所有已注册 Agent 列表,显示标签、主机名、完成/失败任务统计。

📝

任务日志

按状态筛选、分页加载。显示任务指令、执行者、时间、错误信息。

⚠️

异常记录

筛选失败/超时/取消的任务,显示错误原因,支持一键重试。

📊

统计分析

总任务、完成率、费用汇总、平均耗时。按 Agent 维度展示详细统计。

定时任务

创建和管理 cron 定时任务,启用/禁用、手动触发、查看执行历史。

命令面板

右侧命令面板支持:

移动端适配

Web 控制台完全适配移动端:

高级功能

任务优先级

任务支持 4 级优先级(默认 1 = 普通):

级别说明
0低于普通优先级
1普通(默认)标准 FIFO
2插队到普通任务前
3紧急最优先执行
{ "prompt": "紧急修复线上 Bug", "priority": 3 }

标签调度

结合 Agent 标签和任务 requiredLabels 实现精准路由:

# Agent 端设置标签
EMPLOYEE_LABELS="frontend,react" node dist/index.js

# 任务端要求标签
{ "prompt": "重构组件", "requiredLabels": ["frontend"] }

调度逻辑:在匹配标签的 Agent 中选择负载最低的,同等负载时 round-robin 轮转。

端到端加密

设置 AI_TEAMS_ENCRYPTION_KEY(64 位 hex = 32 字节 AES 密钥)后,所有 WebSocket 消息使用 AES-256-GCM 加密。

# 生成随机密钥
openssl rand -hex 32

# 三端设置相同密钥
export AI_TEAMS_ENCRYPTION_KEY="生成的密钥"

注意:Web 端需使用 VITE_AI_TEAMS_ENCRYPTION_KEY 环境变量,在构建时嵌入。修改密钥后需重新构建 Web 应用。

不设置密钥时,所有通信为明文 JSON(向后兼容)。

Webhook 回调

提交任务时可指定 Webhook URL,Server 会在任务生命周期事件时向该 URL 发送 POST 请求。支持三种字段名:webhookwebhookUrlwebHook

{ "prompt": "部署到生产环境", "webhook": "https://your-server.com/hooks/ai-teams" }

事件类型

事件触发时机附加字段
queue.updated任务入队或出队时,通知队列中所有注册了 webhook 的任务queuePosition(从 0 开始), queueLength
task.startedAgent 开始执行任务-
task.output消息级别的输出(tool 调用、文本回复、result 结果)
不包含 token 级别的流式 delta
chunk(TaskOutputChunk)
task.completed任务执行成功-
task.failed任务执行失败-
task.cancelled任务被取消-
task.timeout任务超时-

回调示例

queue.updated — 队列位置通知

{
  "event": "queue.updated",
  "timestamp": "2026-05-19T03:37:07.000Z",
  "task": { "id": "task_xxx", "status": "queued", ... },
  "queuePosition": 2,
  "queueLength": 5
}

task.started — 任务开始

{
  "event": "task.started",
  "timestamp": "2026-05-19T03:38:01.132Z",
  "task": {
    "id": "task_xxx",
    "status": "running",
    "employeeId": "alice",
    "startedAt": "2026-05-19T03:38:01.132Z",
    ...
  }
}

task.output — 工具调用

{
  "event": "task.output",
  "timestamp": "2026-05-19T03:40:14.572Z",
  "task": { "id": "task_xxx", "status": "running", ... },
  "chunk": {
    "taskId": "task_xxx",
    "employeeId": "alice",
    "stream": "stdout",
    "seq": 1,
    "content": "[tool] WebSearch\n",
    "createdAt": "2026-05-19T03:40:14.571Z"
  }
}

task.output — 最终结果

{
  "event": "task.output",
  "timestamp": "2026-05-19T03:40:39.611Z",
  "task": { "id": "task_xxx", "status": "running", ... },
  "chunk": {
    "taskId": "task_xxx",
    "employeeId": "alice",
    "stream": "stdout",
    "seq": 109,
    "content": "\n[done] Claude result\n[done] subtype: success\n[done] session_id: xxx\n[done] duration_ms: 30139\n[done] duration_api_ms: 29859\n[done] num_turns: 2\n[done] total_cost_usd: 0.0767\n[done] result: 天津今天阴天,气温17~24℃...",
    "createdAt": "2026-05-19T03:40:39.611Z"
  }
}

task.completed — 任务完成

{
  "event": "task.completed",
  "timestamp": "2026-05-19T03:40:39.705Z",
  "task": {
    "id": "task_xxx",
    "status": "completed",
    "employeeId": "alice",
    "exitCode": 0,
    "summary": "天津今天阴天,气温17~24℃...",
    "finishedAt": "2026-05-19T03:40:39.704Z",
    ...
  }
}

安全验证

每个回调请求包含签名头,用于验证请求来源:

x-ai-teams-signature: sha256=<HMAC-SHA256>

签名密钥为 AI_TEAMS_AUTH_TOKEN,对请求 body 做 HMAC-SHA256 签名。验证示例:

import hmac, hashlib

def verify_signature(body: bytes, signature: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)

投递保证

数据库

默认使用 SQLite(node:sqlite),设置 DATABASE_URL 可切换到 PostgreSQL。

说明
employeesAgent 注册信息(JSON 快照)
tasks任务记录(完整字段)
task_logs任务输出日志(按 task_id + seq)
task_webhooks任务 Webhook URL
schedules定时任务配置(cron 表达式、目标、提示词)
schema_metaSchema 元信息(版本号、游标等)

Server 启动时从数据库恢复状态,标记所有 Agent 为 offline,重新入队未完成任务。

守护进程

Server 和 Agent 均支持守护进程模式,使用三阶段进程模型确保稳定性:

  用户执行 start
       │
       ▼
  ┌──────────┐   fork (detached)   ┌──────────┐   fork (env: WORKER=1)   ┌──────────┐
  │ Launcher │ ──────────────────► │ Watchdog │ ───────────────────────► │  Worker  │
  │ (退出)    │                    │ 写 PID    │                         │ 业务逻辑  │
  └──────────┘                    │ 监控存活  │                         │ connect()│
                                  │ 自动重启  │                         └──────────┘
                                  └──────────┘

常用命令

# 启动(后台运行)
ai-teams-server start --token "your-token"
ai-teams-agent start --server ws://localhost:3789 --token "your-token"

# 查看状态
ai-teams-server status    # → running (PID 12345)
ai-teams-agent status

# 重启
ai-teams-server restart
ai-teams-agent restart

# 停止
ai-teams-server stop
ai-teams-agent stop

# 更新版本
ai-teams-server update    # npm 全局更新
ai-teams-agent update     # 更新后提示 restart

自动恢复

Watchdog 进程监控 Worker,异常退出时自动重启(每分钟最多 10 次)。PID 文件位于工作目录下:

日志输出到各守护进程的 logs/ 目录,可用 status 命令查看路径。

配置持久化:CLI 参数在首次 start 时保存到配置文件(Server: ~/.ai-teams/server-config.json,Agent: ~/.ai-teams/config.json)。后续 startrestart 自动加载已保存配置,无需重复指定。不带子命令运行仍为前台模式。

容错机制

断线任务恢复

当 Agent 意外断开连接时,Server 执行以下恢复流程:

  1. 宽限期等待(默认 15 秒)— 如果 Agent 在宽限期内重连,任务继续执行
  2. 自动重新入队 — 宽限期过后,未完成任务重新进入队列
  3. 重试次数限制 — 每个任务最多重试 3 次,超过后标记为 failed
running Agent 断线 宽限期 15s queued 重新分发 retry > 3 → failed

重试策略

重试次数行为调度延迟
第 1 次 (retryCount=1)重新入队并立即调度无延迟
第 2 次 (retryCount=2)重新入队,延迟后调度5 秒
第 3 次 (retryCount=3)重新入队,延迟后调度10 秒
第 4 次 (retryCount>3)标记为 failed-

心跳检测

Server 为每个在线 Agent 维护 30 秒心跳超时:

Server 重启恢复

Server 重启时从数据库恢复全部状态:

定时任务

通过 REST API 创建 cron 定时任务,Server 会按计划自动执行。支持所有任务调度模式(queue / direct / broadcast)。

创建定时任务

POST /api/schedules
{
  "name": "每日代码审查",
  "cron": "0 9 * * 1-5",
  "enabled": true,
  "targetMode": "queue",
  "prompt": "检查最近的代码变更并生成审查报告",
  "workspace": "/path/to/project",
  "priority": 1,
  "requiredLabels": ["backend"]
}

返回包含 nextRunAt 字段,表示下次执行时间。

Schedule REST API

GET /api/schedules

列出所有定时任务。

GET /api/schedules/:scheduleId

获取单个定时任务详情。

POST /api/schedules

创建定时任务。必填:namecron(cron 表达式)、prompt

PATCH /api/schedules/:scheduleId

更新定时任务。可修改 enabledcronprompt 等字段。

DELETE /api/schedules/:scheduleId

删除定时任务。

POST /api/schedules/:scheduleId/trigger

手动触发一次定时任务执行(不受 cron 计划限制)。

Schedule 数据模型

字段类型说明
idstring定时任务 ID
namestring名称
cronExprstringCron 表达式(如 0 9 * * 1-5 = 工作日 9 点)
enabledboolean是否启用
targetMode"queue" | "direct" | "broadcast"调度模式
targetAgentsstring[]direct 模式的目标 Agent 列表
promptstring任务提示词
workspacestring | null工作目录
timeoutSecnumber | null超时时间
prioritynumber (0-3)优先级
requiredLabelsstring[] | null标签筛选
lastRunAtstring | null上次执行时间
nextRunAtstring | null下次计划执行时间
createdAt / updatedAtstring创建 / 更新时间

提示:修改 enabledcron 等字段后,Server 自动重启定时器,无需手动重启服务。更新和删除操作立即生效。