evolclaw 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +191 -0
- package/bin/evolclaw +10 -0
- package/data/evolclaw.sample.json +39 -0
- package/dist/channels/aun.js +28 -0
- package/dist/channels/feishu.js +452 -0
- package/dist/cli.js +759 -0
- package/dist/config.js +81 -0
- package/dist/core/agent-runner.js +326 -0
- package/dist/core/command-handler.js +823 -0
- package/dist/core/message-cache.js +56 -0
- package/dist/core/message-processor.js +516 -0
- package/dist/core/message-queue.js +110 -0
- package/dist/core/message-stream.js +59 -0
- package/dist/core/session-manager.js +803 -0
- package/dist/index.js +239 -0
- package/dist/paths.js +45 -0
- package/dist/types.js +1 -0
- package/dist/utils/error-utils.js +54 -0
- package/dist/utils/init.js +352 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/markdown-to-feishu.js +38 -0
- package/dist/utils/permission.js +36 -0
- package/dist/utils/session-file-health.js +67 -0
- package/dist/utils/stream-flusher.js +151 -0
- package/dist/utils/stream-idle-monitor.js +103 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# EvolClaw
|
|
2
|
+
|
|
3
|
+
轻量级多终端接力开发工具,支持飞书和 AUN 双渠道接入,基于 Claude Agent SDK 构建。
|
|
4
|
+
|
|
5
|
+
## 核心特性
|
|
6
|
+
|
|
7
|
+
- 🔄 **多终端接力**:跨终端共享会话、环境、工具、skills,无缝切换开发体验
|
|
8
|
+
- 🚀 **轻量化设计**:进程模式运行,无容器依赖
|
|
9
|
+
- 🎯 **直接集成**:基于 Claude Agent SDK,无需协议转换层
|
|
10
|
+
- 📊 **统一消息处理**:Channel Adapter 模式,新增渠道只需 ~15 行代码
|
|
11
|
+
- 🌐 **双渠道接入**:飞书 WebSocket + AUN 协议
|
|
12
|
+
- 📁 **多项目支持**:每个项目独立会话,支持动态切换
|
|
13
|
+
- 💾 **会话持久化**:SQLite + JSONL 双重保障,服务重启不丢失会话
|
|
14
|
+
- ⚡ **任务中断**:新消息立即中断当前任务,响应更快
|
|
15
|
+
- 📦 **批量发送**:工具调用活动 3 秒批量发送,减少消息数量
|
|
16
|
+
- 🤖 **动态模型管理**:启动时自动获取可用模型列表,支持运行时切换
|
|
17
|
+
- 🔕 **后台任务静默**:切换项目后,后台任务输出自动静默,不干扰当前工作
|
|
18
|
+
- 📬 **消息缓存**:后台任务完成后缓存通知,切换回项目时统一展示
|
|
19
|
+
|
|
20
|
+
## 快速开始
|
|
21
|
+
|
|
22
|
+
### 1. 安装
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install
|
|
26
|
+
npm run build
|
|
27
|
+
npm link
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. 初始化
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
evolclaw init
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
交互式引导完成以下配置:
|
|
37
|
+
- 环境检查(Node.js >= 22、claude CLI、SDK 版本)
|
|
38
|
+
- 飞书 App ID / App Secret
|
|
39
|
+
- 默认项目路径
|
|
40
|
+
- 模型选择(sonnet/opus/haiku)
|
|
41
|
+
- 自动写入 `EVOLCLAW_HOME` 到 shell profile
|
|
42
|
+
|
|
43
|
+
配置文件生成在 `{EVOLCLAW_HOME}/data/evolclaw.json`(默认 `~/.evolclaw/data/evolclaw.json`)。
|
|
44
|
+
|
|
45
|
+
### 3. 运行
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# 服务管理
|
|
49
|
+
evolclaw start # 启动服务
|
|
50
|
+
evolclaw stop # 停止服务
|
|
51
|
+
evolclaw restart # 重启服务
|
|
52
|
+
evolclaw status # 查看状态
|
|
53
|
+
evolclaw logs # 查看日志(tail -f)
|
|
54
|
+
|
|
55
|
+
# 开发模式(热重载)
|
|
56
|
+
npm run dev
|
|
57
|
+
|
|
58
|
+
# 运行测试
|
|
59
|
+
npm test
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 系统架构
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
消息渠道层 → 消息队列层 → 命令处理层 → 消息处理层 → 会话管理层 → 存储层
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### 核心组件
|
|
69
|
+
|
|
70
|
+
1. **消息渠道层** (`src/channels/`) - Feishu WebSocket + AUN 协议
|
|
71
|
+
2. **消息队列层** (`src/core/message-queue.ts`) - 会话级串行处理 + 中断支持
|
|
72
|
+
3. **命令处理层** (`src/core/command-handler.ts`) - 斜杠命令处理(CommandHandler 类)
|
|
73
|
+
4. **消息处理层** (`src/core/message-processor.ts`) - 统一事件处理引擎
|
|
74
|
+
5. **会话管理层** (`src/core/session-manager.ts`) - 多项目会话管理
|
|
75
|
+
6. **存储层** - JSONL 文件(SDK 管理)+ SQLite 元数据
|
|
76
|
+
|
|
77
|
+
### 数据目录
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
{EVOLCLAW_HOME}/ # 默认: ~/.evolclaw
|
|
81
|
+
├── data/
|
|
82
|
+
│ ├── evolclaw.json # 配置文件(含密钥,不在 git)
|
|
83
|
+
│ ├── evolclaw.sample.json # 配置模板
|
|
84
|
+
│ └── sessions.db # 会话数据库
|
|
85
|
+
└── logs/
|
|
86
|
+
├── evolclaw.pid # PID 文件
|
|
87
|
+
├── evolclaw.log # 主日志
|
|
88
|
+
├── stdout.log # 标准输出
|
|
89
|
+
└── messages.log # 消息日志
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 消息流转
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
用户发送消息
|
|
96
|
+
↓
|
|
97
|
+
Channel.onMessage
|
|
98
|
+
↓
|
|
99
|
+
检查命令 → 是 → CommandHandler.handle() → 立即响应(绕过队列)
|
|
100
|
+
↓ 否
|
|
101
|
+
MessageQueue.enqueue(streamKey, message)
|
|
102
|
+
↓
|
|
103
|
+
检测正在处理 → 是 → 触发中断 → AgentRunner.interrupt()
|
|
104
|
+
↓ 否 ↓
|
|
105
|
+
MessageQueue.processNext() ←──────────────┘
|
|
106
|
+
↓
|
|
107
|
+
MessageProcessor.processMessage()
|
|
108
|
+
↓
|
|
109
|
+
├─ 解析会话和项目路径
|
|
110
|
+
├─ 创建 StreamFlusher(3 秒批量发送)
|
|
111
|
+
├─ AgentRunner.runQuery() → 事件流
|
|
112
|
+
├─ 处理事件(tool_use / text / result)
|
|
113
|
+
├─ 提取文件标记(Feishu)
|
|
114
|
+
└─ 发送最终响应
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## 项目结构
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
evolclaw/
|
|
121
|
+
├── bin/
|
|
122
|
+
│ └── evolclaw # CLI 入口(npm link)
|
|
123
|
+
├── src/
|
|
124
|
+
│ ├── core/
|
|
125
|
+
│ │ ├── command-handler.ts # 斜杠命令处理
|
|
126
|
+
│ │ ├── session-manager.ts # 会话管理(多项目支持)
|
|
127
|
+
│ │ ├── message-queue.ts # 消息队列(串行+中断)
|
|
128
|
+
│ │ ├── message-processor.ts # 统一消息处理引擎
|
|
129
|
+
│ │ ├── stream-flusher.ts # 批量发送(3秒窗口)
|
|
130
|
+
│ │ ├── agent-runner.ts # Claude Agent SDK 封装
|
|
131
|
+
│ │ └── message-cache.ts # 消息缓存
|
|
132
|
+
│ ├── channels/
|
|
133
|
+
│ │ ├── feishu.ts # 飞书 WebSocket 渠道
|
|
134
|
+
│ │ └── aun.ts # AUN 协议渠道
|
|
135
|
+
│ ├── utils/ # 工具函数
|
|
136
|
+
│ ├── types.ts # 类型定义
|
|
137
|
+
│ ├── config.ts # 配置加载
|
|
138
|
+
│ ├── paths.ts # 路径解析
|
|
139
|
+
│ ├── cli.ts # CLI 命令(init/start/stop/...)
|
|
140
|
+
│ └── index.ts # 主入口
|
|
141
|
+
└── data/
|
|
142
|
+
└── evolclaw.sample.json # 配置模板
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## 斜杠命令
|
|
146
|
+
|
|
147
|
+
**项目管理**:
|
|
148
|
+
- `/pwd` - 显示当前项目路径
|
|
149
|
+
- `/plist` - 列出所有项目(显示会话空闲时间)
|
|
150
|
+
- `/p <name|path>` - 切换项目(保留会话历史)
|
|
151
|
+
- `/bind <path>` - 绑定新项目目录
|
|
152
|
+
|
|
153
|
+
**会话管理**:
|
|
154
|
+
- `/new [名称]` - 创建新会话
|
|
155
|
+
- `/slist` - 列出当前项目的所有会话
|
|
156
|
+
- `/s <名称>` - 切换到指定会话
|
|
157
|
+
- `/name <新名称>` - 重命名当前会话
|
|
158
|
+
- `/status` - 显示会话状态
|
|
159
|
+
- `/clear` - 清空对话历史
|
|
160
|
+
- `/compact` - 压缩会话上下文
|
|
161
|
+
- `/stop` - 中断当前任务
|
|
162
|
+
- `/restart` - 重启服务
|
|
163
|
+
|
|
164
|
+
**模型管理**:
|
|
165
|
+
- `/model` - 显示当前模型和可用列表
|
|
166
|
+
- `/model <model-id>` - 切换模型
|
|
167
|
+
|
|
168
|
+
**其他**:
|
|
169
|
+
- `/repair` - 检查并修复会话
|
|
170
|
+
- `/safe` - 进入安全模式
|
|
171
|
+
- `/help` - 显示所有命令
|
|
172
|
+
|
|
173
|
+
## 技术栈
|
|
174
|
+
|
|
175
|
+
- **运行时**:Node.js >= 22 + TypeScript(ES modules)
|
|
176
|
+
- **AI SDK**:@anthropic-ai/claude-agent-sdk >= 0.2.75
|
|
177
|
+
- **消息渠道**:飞书(@larksuiteoapi/node-sdk)
|
|
178
|
+
- **数据存储**:node:sqlite(内置模块)
|
|
179
|
+
- **测试框架**:Vitest
|
|
180
|
+
|
|
181
|
+
## 文档
|
|
182
|
+
|
|
183
|
+
- [CLAUDE.md](./CLAUDE.md) - 开发指南
|
|
184
|
+
- [架构设计](./docs/architecture.md) - 系统架构和技术实现
|
|
185
|
+
- [多项目支持](./docs/multi-project-and-commands.md) - 多项目管理和命令
|
|
186
|
+
- [多会话设计](./docs/multi-session-design.md) - 多会话管理设计
|
|
187
|
+
- [设计文档 v2](./docs/DESIGN-v2.md) - 完整设计文档
|
|
188
|
+
|
|
189
|
+
## 许可证
|
|
190
|
+
|
|
191
|
+
MIT
|
package/bin/evolclaw
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname, join } from 'path';
|
|
5
|
+
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = dirname(__filename);
|
|
8
|
+
|
|
9
|
+
const { main } = await import(join(__dirname, '..', 'dist', 'cli.js'));
|
|
10
|
+
main(process.argv.slice(2));
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"anthropic": {
|
|
3
|
+
"baseUrl": "https://api.anthropic.com",
|
|
4
|
+
"apiKey": "your-api-key-here",
|
|
5
|
+
"model": "sonnet"
|
|
6
|
+
},
|
|
7
|
+
"feishu": {
|
|
8
|
+
"appId": "your-feishu-app-id",
|
|
9
|
+
"appSecret": "your-feishu-app-secret"
|
|
10
|
+
},
|
|
11
|
+
"aun": {
|
|
12
|
+
"domain": "your-aun-domain",
|
|
13
|
+
"agentName": "your-agent-name"
|
|
14
|
+
},
|
|
15
|
+
"projects": {
|
|
16
|
+
"defaultPath": "/path/to/default/project",
|
|
17
|
+
"autoCreate": true,
|
|
18
|
+
"list": {
|
|
19
|
+
"project1": "/path/to/project1",
|
|
20
|
+
"project2": "/path/to/project2"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"flushDelay": 4000,
|
|
24
|
+
"timeout": {
|
|
25
|
+
"idle": 120000
|
|
26
|
+
},
|
|
27
|
+
"idleMonitor": {
|
|
28
|
+
"enabled": true,
|
|
29
|
+
"safeModeThreshold": 3
|
|
30
|
+
},
|
|
31
|
+
"sdk": {
|
|
32
|
+
"useSettingSources": true,
|
|
33
|
+
"agentProgressSummaries": true
|
|
34
|
+
},
|
|
35
|
+
"owners": {
|
|
36
|
+
"feishu": "",
|
|
37
|
+
"aun": ""
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { logger } from '../utils/logger.js';
|
|
2
|
+
export class AUNChannel {
|
|
3
|
+
config;
|
|
4
|
+
messageHandler;
|
|
5
|
+
connected = false;
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
}
|
|
9
|
+
async connect() {
|
|
10
|
+
// TODO: 集成真实的 AUN SDK
|
|
11
|
+
// 当前为占位符实现,确保接口一致性
|
|
12
|
+
this.connected = true;
|
|
13
|
+
logger.info(`[AUN] Connected as ${this.config.agentName}@${this.config.domain}`);
|
|
14
|
+
}
|
|
15
|
+
onMessage(handler) {
|
|
16
|
+
this.messageHandler = handler;
|
|
17
|
+
}
|
|
18
|
+
async sendMessage(sessionId, content) {
|
|
19
|
+
if (!this.connected)
|
|
20
|
+
throw new Error('AUN not connected');
|
|
21
|
+
// TODO: 实现真实的消息发送
|
|
22
|
+
logger.debug(`[AUN] Send to ${sessionId}: ${content.slice(0, 50)}...`);
|
|
23
|
+
}
|
|
24
|
+
async disconnect() {
|
|
25
|
+
this.connected = false;
|
|
26
|
+
logger.info('[AUN] Disconnected');
|
|
27
|
+
}
|
|
28
|
+
}
|