cicy-desktop 2.1.237 → 2.1.239
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/package.json +9 -16
- package/src/sidecar/cicy-code.js +32 -9
- package/src/sidecar/container-scripts/cicy-code-update.sh +6 -1
- package/src/sidecar/host-mihomo.js +40 -10
- package/src/sidecar/runtime.js +144 -64
- package/src/tabbrowser/tab-shell.html +5 -1
- package/.kiro/steering/dev-workflow.md +0 -166
- package/AGENTS.md +0 -275
- package/CLAUDE_HANDOFF.md +0 -168
- package/DESIGN.md +0 -66
- package/DOCKER.md +0 -85
- package/Dockerfile +0 -46
- package/TODO-anti-detection.md +0 -326
- package/copy-to-desktop.sh +0 -26
- package/docs/AUTOMATION-API.md +0 -342
- package/docs/REQUEST_MONITORING.md +0 -435
- package/docs/REST-API-FEATURE.md +0 -155
- package/docs/REST-API.md +0 -276
- package/docs/backend-selector-design.md +0 -204
- package/docs/chrome-proxy.md +0 -142
- package/docs/cicy-desktop-current-execution-bridge.md +0 -509
- package/docs/feature-distributed-multi-agent.md +0 -555
- package/docs/worklog-2026-03-27.md +0 -108
- package/docs/yaml.md +0 -255
- package/generate-openapi.js +0 -162
- package/jest.config.js +0 -13
- package/jest.setup.global.js +0 -16
- package/jest.teardown.global.js +0 -10
- package/service.sh +0 -164
- package/update-desktop.sh +0 -33
|
@@ -1,555 +0,0 @@
|
|
|
1
|
-
# Feature: Distributed Multi-Agent Cluster
|
|
2
|
-
|
|
3
|
-
## 概述
|
|
4
|
-
|
|
5
|
-
将 CiCy Desktop Server 升级为分布式 Multi-Agent 集群系统,支持大规模并行自动化任务。
|
|
6
|
-
|
|
7
|
-
## 目标
|
|
8
|
-
|
|
9
|
-
- 支持 100+ Agent 并行工作
|
|
10
|
-
- 分布式部署,弹性扩容
|
|
11
|
-
- 统一的任务调度和监控
|
|
12
|
-
- 高可用、容错设计
|
|
13
|
-
|
|
14
|
-
## 架构设计
|
|
15
|
-
|
|
16
|
-
### 1. Master Node(调度中心)
|
|
17
|
-
|
|
18
|
-
**职责:**
|
|
19
|
-
- 任务分发和调度
|
|
20
|
-
- 负载均衡
|
|
21
|
-
- Worker 健康检查
|
|
22
|
-
- Agent Hub 管理界面
|
|
23
|
-
- 全局状态监控
|
|
24
|
-
|
|
25
|
-
**技术栈:**
|
|
26
|
-
- Express.js (HTTP API)
|
|
27
|
-
- Socket.IO (实时通信)
|
|
28
|
-
- Redis (任务队列 + 状态存储)
|
|
29
|
-
- Bull (任务队列管理)
|
|
30
|
-
|
|
31
|
-
**核心 API:**
|
|
32
|
-
```javascript
|
|
33
|
-
POST /api/tasks // 创建任务
|
|
34
|
-
GET /api/tasks/:id // 查询任务状态
|
|
35
|
-
GET /api/workers // 获取 Worker 列表
|
|
36
|
-
GET /api/agents // 获取所有 Agent 列表
|
|
37
|
-
POST /api/agents/create // 创建新 Agent
|
|
38
|
-
DELETE /api/agents/:id // 关闭 Agent
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### 2. Worker Node(执行节点)
|
|
42
|
-
|
|
43
|
-
**职责:**
|
|
44
|
-
- 运行多个 Electron 窗口(Agent)
|
|
45
|
-
- 从队列拉取任务
|
|
46
|
-
- 执行自动化操作
|
|
47
|
-
- 上报状态和结果
|
|
48
|
-
|
|
49
|
-
**配置:**
|
|
50
|
-
```javascript
|
|
51
|
-
{
|
|
52
|
-
"workerId": "worker-1",
|
|
53
|
-
"masterUrl": "http://master:8100",
|
|
54
|
-
"maxAgents": 10, // 最大 Agent 数量
|
|
55
|
-
"port": 8101,
|
|
56
|
-
"resources": {
|
|
57
|
-
"cpu": 4,
|
|
58
|
-
"memory": "8GB"
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**心跳机制:**
|
|
64
|
-
- 每 5 秒向 Master 发送心跳
|
|
65
|
-
- 上报 CPU、内存、Agent 状态
|
|
66
|
-
- 超过 30 秒无心跳视为离线
|
|
67
|
-
|
|
68
|
-
### 3. Agent(窗口实例)
|
|
69
|
-
|
|
70
|
-
**属性:**
|
|
71
|
-
```javascript
|
|
72
|
-
{
|
|
73
|
-
"agentId": "agent-1",
|
|
74
|
-
"workerId": "worker-1",
|
|
75
|
-
"windowId": 1,
|
|
76
|
-
"accountIdx": 0,
|
|
77
|
-
"status": "idle|busy|error",
|
|
78
|
-
"currentTask": "task-123",
|
|
79
|
-
"createdAt": "2026-02-09T05:00:00Z"
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**状态流转:**
|
|
84
|
-
```
|
|
85
|
-
idle → busy → idle
|
|
86
|
-
↓ ↓
|
|
87
|
-
error ← error
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## 核心功能
|
|
91
|
-
|
|
92
|
-
### 1. 任务队列系统
|
|
93
|
-
|
|
94
|
-
**任务结构:**
|
|
95
|
-
```javascript
|
|
96
|
-
{
|
|
97
|
-
"taskId": "task-123",
|
|
98
|
-
"type": "scrape|test|automation",
|
|
99
|
-
"priority": 1-10,
|
|
100
|
-
"payload": {
|
|
101
|
-
"url": "https://example.com",
|
|
102
|
-
"actions": [
|
|
103
|
-
{ "tool": "open_window", "args": {...} },
|
|
104
|
-
{ "tool": "cdp_click", "args": {...} },
|
|
105
|
-
{ "tool": "exec_js", "args": {...} }
|
|
106
|
-
]
|
|
107
|
-
},
|
|
108
|
-
"requirements": {
|
|
109
|
-
"accountIdx": 0, // 指定账户
|
|
110
|
-
"workerId": null, // 指定 Worker(可选)
|
|
111
|
-
"timeout": 300000 // 超时时间(ms)
|
|
112
|
-
},
|
|
113
|
-
"status": "pending|running|completed|failed",
|
|
114
|
-
"result": {...},
|
|
115
|
-
"createdAt": "2026-02-09T05:00:00Z",
|
|
116
|
-
"startedAt": null,
|
|
117
|
-
"completedAt": null
|
|
118
|
-
}
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
**队列优先级:**
|
|
122
|
-
- High Priority Queue (priority 8-10)
|
|
123
|
-
- Normal Queue (priority 4-7)
|
|
124
|
-
- Low Priority Queue (priority 1-3)
|
|
125
|
-
|
|
126
|
-
### 2. 负载均衡策略
|
|
127
|
-
|
|
128
|
-
**策略选择:**
|
|
129
|
-
1. **Round Robin**:轮询分配
|
|
130
|
-
2. **Least Connections**:分配给最空闲的 Worker
|
|
131
|
-
3. **Resource Based**:根据 CPU/内存负载分配
|
|
132
|
-
4. **Affinity**:相同账户的任务分配到同一 Worker
|
|
133
|
-
|
|
134
|
-
**实现:**
|
|
135
|
-
```javascript
|
|
136
|
-
class LoadBalancer {
|
|
137
|
-
selectWorker(task, workers) {
|
|
138
|
-
// 过滤健康的 Worker
|
|
139
|
-
const healthy = workers.filter(w => w.status === 'online');
|
|
140
|
-
|
|
141
|
-
// 根据策略选择
|
|
142
|
-
switch (this.strategy) {
|
|
143
|
-
case 'least-connections':
|
|
144
|
-
return healthy.sort((a, b) => a.busyAgents - b.busyAgents)[0];
|
|
145
|
-
case 'resource-based':
|
|
146
|
-
return healthy.sort((a, b) => a.cpuUsage - b.cpuUsage)[0];
|
|
147
|
-
default:
|
|
148
|
-
return healthy[this.roundRobinIndex++ % healthy.length];
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### 3. Agent Hub 管理界面
|
|
155
|
-
|
|
156
|
-
**页面结构:**
|
|
157
|
-
```
|
|
158
|
-
/agent-hub
|
|
159
|
-
├── Dashboard
|
|
160
|
-
│ ├── 总览统计(Worker/Agent/Task 数量)
|
|
161
|
-
│ ├── 实时监控图表(CPU/内存/任务吞吐)
|
|
162
|
-
│ └── 告警信息
|
|
163
|
-
├── Workers
|
|
164
|
-
│ ├── Worker 列表(状态、资源、Agent 数量)
|
|
165
|
-
│ ├── 添加 Worker
|
|
166
|
-
│ └── Worker 详情(Agent 列表、日志)
|
|
167
|
-
├── Agents
|
|
168
|
-
│ ├── Agent 列表(带缩略图)
|
|
169
|
-
│ ├── 创建 Agent
|
|
170
|
-
│ ├── Agent 详情(当前任务、历史记录)
|
|
171
|
-
│ └── 批量操作
|
|
172
|
-
├── Tasks
|
|
173
|
-
│ ├── 任务列表(状态、进度)
|
|
174
|
-
│ ├── 创建任务
|
|
175
|
-
│ ├── 任务详情(执行日志、结果)
|
|
176
|
-
│ └── 任务模板
|
|
177
|
-
└── Settings
|
|
178
|
-
├── 负载均衡策略
|
|
179
|
-
├── 资源限制
|
|
180
|
-
└── 告警配置
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
**技术栈:**
|
|
184
|
-
- React + TypeScript
|
|
185
|
-
- Ant Design / Material-UI
|
|
186
|
-
- Socket.IO Client (实时更新)
|
|
187
|
-
- ECharts (监控图表)
|
|
188
|
-
|
|
189
|
-
### 4. 健康检查与容错
|
|
190
|
-
|
|
191
|
-
**健康检查:**
|
|
192
|
-
```javascript
|
|
193
|
-
// Worker 心跳
|
|
194
|
-
setInterval(() => {
|
|
195
|
-
axios.post(`${masterUrl}/api/heartbeat`, {
|
|
196
|
-
workerId: this.workerId,
|
|
197
|
-
status: 'online',
|
|
198
|
-
agents: this.getAgentStatus(),
|
|
199
|
-
resources: {
|
|
200
|
-
cpuUsage: os.loadavg()[0],
|
|
201
|
-
memoryUsage: process.memoryUsage(),
|
|
202
|
-
diskUsage: getDiskUsage()
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
}, 5000);
|
|
206
|
-
```
|
|
207
|
-
|
|
208
|
-
**容错机制:**
|
|
209
|
-
1. **Worker 离线**:
|
|
210
|
-
- 将其任务重新分配到其他 Worker
|
|
211
|
-
- 标记 Agent 为 offline
|
|
212
|
-
- 发送告警通知
|
|
213
|
-
|
|
214
|
-
2. **任务超时**:
|
|
215
|
-
- 自动重试(最多 3 次)
|
|
216
|
-
- 标记为 failed
|
|
217
|
-
- 记录错误日志
|
|
218
|
-
|
|
219
|
-
3. **Agent 崩溃**:
|
|
220
|
-
- 自动重启 Agent
|
|
221
|
-
- 恢复任务执行
|
|
222
|
-
- 上报异常
|
|
223
|
-
|
|
224
|
-
### 5. 服务发现与注册
|
|
225
|
-
|
|
226
|
-
**使用 Redis 作为注册中心:**
|
|
227
|
-
```javascript
|
|
228
|
-
// Worker 注册
|
|
229
|
-
redis.hset('workers', workerId, JSON.stringify({
|
|
230
|
-
workerId,
|
|
231
|
-
url: `http://${ip}:${port}`,
|
|
232
|
-
status: 'online',
|
|
233
|
-
maxAgents: 10,
|
|
234
|
-
registeredAt: Date.now()
|
|
235
|
-
}));
|
|
236
|
-
|
|
237
|
-
// 设置 TTL(30 秒)
|
|
238
|
-
redis.expire(`worker:${workerId}`, 30);
|
|
239
|
-
|
|
240
|
-
// Master 发现 Worker
|
|
241
|
-
const workers = await redis.hgetall('workers');
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
## 数据模型
|
|
245
|
-
|
|
246
|
-
### Redis 数据结构
|
|
247
|
-
|
|
248
|
-
```
|
|
249
|
-
# Worker 注册表
|
|
250
|
-
workers:{workerId} → {workerId, url, status, maxAgents, ...}
|
|
251
|
-
|
|
252
|
-
# Agent 状态
|
|
253
|
-
agents:{agentId} → {agentId, workerId, windowId, status, ...}
|
|
254
|
-
|
|
255
|
-
# 任务队列
|
|
256
|
-
queue:high → [taskId1, taskId2, ...]
|
|
257
|
-
queue:normal → [taskId3, taskId4, ...]
|
|
258
|
-
queue:low → [taskId5, taskId6, ...]
|
|
259
|
-
|
|
260
|
-
# 任务状态
|
|
261
|
-
tasks:{taskId} → {taskId, status, result, ...}
|
|
262
|
-
|
|
263
|
-
# Worker 心跳
|
|
264
|
-
heartbeat:{workerId} → timestamp (TTL: 30s)
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
## API 设计
|
|
268
|
-
|
|
269
|
-
### Master API
|
|
270
|
-
|
|
271
|
-
```javascript
|
|
272
|
-
// 任务管理
|
|
273
|
-
POST /api/tasks // 创建任务
|
|
274
|
-
GET /api/tasks // 任务列表
|
|
275
|
-
GET /api/tasks/:id // 任务详情
|
|
276
|
-
DELETE /api/tasks/:id // 取消任务
|
|
277
|
-
|
|
278
|
-
// Worker 管理
|
|
279
|
-
GET /api/workers // Worker 列表
|
|
280
|
-
GET /api/workers/:id // Worker 详情
|
|
281
|
-
POST /api/workers/:id/restart // 重启 Worker
|
|
282
|
-
|
|
283
|
-
// Agent 管理
|
|
284
|
-
GET /api/agents // Agent 列表
|
|
285
|
-
POST /api/agents // 创建 Agent
|
|
286
|
-
DELETE /api/agents/:id // 关闭 Agent
|
|
287
|
-
GET /api/agents/:id/screenshot // Agent 截图
|
|
288
|
-
|
|
289
|
-
// 监控
|
|
290
|
-
GET /api/stats // 统计信息
|
|
291
|
-
GET /api/metrics // Prometheus 指标
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
### Worker API
|
|
295
|
-
|
|
296
|
-
```javascript
|
|
297
|
-
// 保持现有 MCP 工具 API
|
|
298
|
-
POST /rpc/{tool_name} // 执行工具
|
|
299
|
-
|
|
300
|
-
// 新增集群相关
|
|
301
|
-
POST /api/heartbeat // 心跳上报
|
|
302
|
-
POST /api/tasks/:id/result // 任务结果上报
|
|
303
|
-
GET /api/agents // 本地 Agent 列表
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
## 部署方案
|
|
307
|
-
|
|
308
|
-
### 单机部署(开发/测试)
|
|
309
|
-
|
|
310
|
-
```bash
|
|
311
|
-
# 启动 Master
|
|
312
|
-
npm run start:master
|
|
313
|
-
|
|
314
|
-
# 启动 Worker
|
|
315
|
-
npm run start:worker -- --master=http://localhost:8100
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### 分布式部署(生产)
|
|
319
|
-
|
|
320
|
-
```yaml
|
|
321
|
-
# docker-compose.yml
|
|
322
|
-
version: '3.8'
|
|
323
|
-
services:
|
|
324
|
-
redis:
|
|
325
|
-
image: redis:7-alpine
|
|
326
|
-
ports:
|
|
327
|
-
- "6379:6379"
|
|
328
|
-
|
|
329
|
-
master:
|
|
330
|
-
build: .
|
|
331
|
-
command: npm run start:master
|
|
332
|
-
ports:
|
|
333
|
-
- "8100:8100"
|
|
334
|
-
environment:
|
|
335
|
-
- REDIS_URL=redis://redis:6379
|
|
336
|
-
- NODE_ENV=production
|
|
337
|
-
|
|
338
|
-
worker:
|
|
339
|
-
build: .
|
|
340
|
-
command: npm run start:worker
|
|
341
|
-
environment:
|
|
342
|
-
- MASTER_URL=http://master:8100
|
|
343
|
-
- REDIS_URL=redis://redis:6379
|
|
344
|
-
- DISPLAY=:99
|
|
345
|
-
deploy:
|
|
346
|
-
replicas: 3
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
### Kubernetes 部署
|
|
350
|
-
|
|
351
|
-
```yaml
|
|
352
|
-
# k8s/master-deployment.yaml
|
|
353
|
-
apiVersion: apps/v1
|
|
354
|
-
kind: Deployment
|
|
355
|
-
metadata:
|
|
356
|
-
name: cicy-desktop-master
|
|
357
|
-
spec:
|
|
358
|
-
replicas: 1
|
|
359
|
-
selector:
|
|
360
|
-
matchLabels:
|
|
361
|
-
app: cicy-desktop-master
|
|
362
|
-
template:
|
|
363
|
-
metadata:
|
|
364
|
-
labels:
|
|
365
|
-
app: cicy-desktop-master
|
|
366
|
-
spec:
|
|
367
|
-
containers:
|
|
368
|
-
- name: master
|
|
369
|
-
image: cicy-desktop:latest
|
|
370
|
-
command: ["npm", "run", "start:master"]
|
|
371
|
-
ports:
|
|
372
|
-
- containerPort: 8100
|
|
373
|
-
env:
|
|
374
|
-
- name: REDIS_URL
|
|
375
|
-
value: "redis://redis-service:6379"
|
|
376
|
-
|
|
377
|
-
---
|
|
378
|
-
# k8s/worker-deployment.yaml
|
|
379
|
-
apiVersion: apps/v1
|
|
380
|
-
kind: Deployment
|
|
381
|
-
metadata:
|
|
382
|
-
name: cicy-desktop-worker
|
|
383
|
-
spec:
|
|
384
|
-
replicas: 5
|
|
385
|
-
selector:
|
|
386
|
-
matchLabels:
|
|
387
|
-
app: cicy-desktop-worker
|
|
388
|
-
template:
|
|
389
|
-
metadata:
|
|
390
|
-
labels:
|
|
391
|
-
app: cicy-desktop-worker
|
|
392
|
-
spec:
|
|
393
|
-
containers:
|
|
394
|
-
- name: worker
|
|
395
|
-
image: cicy-desktop:latest
|
|
396
|
-
command: ["npm", "run", "start:worker"]
|
|
397
|
-
env:
|
|
398
|
-
- name: MASTER_URL
|
|
399
|
-
value: "http://master-service:8100"
|
|
400
|
-
- name: DISPLAY
|
|
401
|
-
value: ":99"
|
|
402
|
-
resources:
|
|
403
|
-
limits:
|
|
404
|
-
memory: "4Gi"
|
|
405
|
-
cpu: "2"
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
## 监控与告警
|
|
409
|
-
|
|
410
|
-
### Prometheus 指标
|
|
411
|
-
|
|
412
|
-
```javascript
|
|
413
|
-
// 指标定义
|
|
414
|
-
const metrics = {
|
|
415
|
-
workers_total: new Gauge({ name: 'workers_total', help: 'Total workers' }),
|
|
416
|
-
agents_total: new Gauge({ name: 'agents_total', help: 'Total agents' }),
|
|
417
|
-
tasks_total: new Counter({ name: 'tasks_total', help: 'Total tasks' }),
|
|
418
|
-
tasks_duration: new Histogram({ name: 'tasks_duration_seconds', help: 'Task duration' }),
|
|
419
|
-
worker_cpu_usage: new Gauge({ name: 'worker_cpu_usage', help: 'Worker CPU usage' }),
|
|
420
|
-
worker_memory_usage: new Gauge({ name: 'worker_memory_usage', help: 'Worker memory usage' })
|
|
421
|
-
};
|
|
422
|
-
|
|
423
|
-
// 暴露指标
|
|
424
|
-
app.get('/metrics', async (req, res) => {
|
|
425
|
-
res.set('Content-Type', register.contentType);
|
|
426
|
-
res.end(await register.metrics());
|
|
427
|
-
});
|
|
428
|
-
```
|
|
429
|
-
|
|
430
|
-
### Grafana Dashboard
|
|
431
|
-
|
|
432
|
-
- Worker 状态面板
|
|
433
|
-
- Agent 数量趋势
|
|
434
|
-
- 任务吞吐量
|
|
435
|
-
- 资源使用率
|
|
436
|
-
- 错误率统计
|
|
437
|
-
|
|
438
|
-
### 告警规则
|
|
439
|
-
|
|
440
|
-
```yaml
|
|
441
|
-
# alerts.yml
|
|
442
|
-
groups:
|
|
443
|
-
- name: cicy-desktop
|
|
444
|
-
rules:
|
|
445
|
-
- alert: WorkerDown
|
|
446
|
-
expr: up{job="cicy-desktop-worker"} == 0
|
|
447
|
-
for: 1m
|
|
448
|
-
annotations:
|
|
449
|
-
summary: "Worker {{ $labels.instance }} is down"
|
|
450
|
-
|
|
451
|
-
- alert: HighCPUUsage
|
|
452
|
-
expr: worker_cpu_usage > 0.8
|
|
453
|
-
for: 5m
|
|
454
|
-
annotations:
|
|
455
|
-
summary: "Worker {{ $labels.worker_id }} CPU usage > 80%"
|
|
456
|
-
|
|
457
|
-
- alert: TaskQueueBacklog
|
|
458
|
-
expr: tasks_pending > 100
|
|
459
|
-
for: 10m
|
|
460
|
-
annotations:
|
|
461
|
-
summary: "Task queue has {{ $value }} pending tasks"
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
## 安全考虑
|
|
465
|
-
|
|
466
|
-
1. **认证授权**:
|
|
467
|
-
- Master API 需要 Bearer Token
|
|
468
|
-
- Worker 注册需要预共享密钥
|
|
469
|
-
- Agent Hub 需要登录
|
|
470
|
-
|
|
471
|
-
2. **网络隔离**:
|
|
472
|
-
- Worker 只能访问 Master
|
|
473
|
-
- Agent 网络流量可限制
|
|
474
|
-
|
|
475
|
-
3. **资源限制**:
|
|
476
|
-
- 每个 Worker 最大 Agent 数量
|
|
477
|
-
- 任务超时自动终止
|
|
478
|
-
- 内存/CPU 限制
|
|
479
|
-
|
|
480
|
-
## 性能优化
|
|
481
|
-
|
|
482
|
-
1. **连接池**:
|
|
483
|
-
- Redis 连接池
|
|
484
|
-
- HTTP 连接复用
|
|
485
|
-
|
|
486
|
-
2. **批量操作**:
|
|
487
|
-
- 批量创建 Agent
|
|
488
|
-
- 批量查询状态
|
|
489
|
-
|
|
490
|
-
3. **缓存策略**:
|
|
491
|
-
- Worker 列表缓存(5 秒)
|
|
492
|
-
- Agent 状态缓存(1 秒)
|
|
493
|
-
|
|
494
|
-
4. **异步处理**:
|
|
495
|
-
- 任务结果异步上报
|
|
496
|
-
- 日志异步写入
|
|
497
|
-
|
|
498
|
-
## 实施计划
|
|
499
|
-
|
|
500
|
-
### Phase 1: 基础架构(2 周)
|
|
501
|
-
- [ ] Master Node 基础框架
|
|
502
|
-
- [ ] Worker 注册与心跳
|
|
503
|
-
- [ ] Redis 任务队列
|
|
504
|
-
- [ ] 基础 API 实现
|
|
505
|
-
|
|
506
|
-
### Phase 2: 任务调度(2 周)
|
|
507
|
-
- [ ] 任务分发逻辑
|
|
508
|
-
- [ ] 负载均衡实现
|
|
509
|
-
- [ ] 任务执行与结果上报
|
|
510
|
-
- [ ] 容错机制
|
|
511
|
-
|
|
512
|
-
### Phase 3: 管理界面(2 周)
|
|
513
|
-
- [ ] Agent Hub 前端开发
|
|
514
|
-
- [ ] Dashboard 实时监控
|
|
515
|
-
- [ ] Worker/Agent 管理
|
|
516
|
-
- [ ] 任务管理界面
|
|
517
|
-
|
|
518
|
-
### Phase 4: 监控告警(1 周)
|
|
519
|
-
- [ ] Prometheus 集成
|
|
520
|
-
- [ ] Grafana Dashboard
|
|
521
|
-
- [ ] 告警规则配置
|
|
522
|
-
- [ ] 日志收集
|
|
523
|
-
|
|
524
|
-
### Phase 5: 部署优化(1 周)
|
|
525
|
-
- [ ] Docker 镜像优化
|
|
526
|
-
- [ ] Kubernetes 配置
|
|
527
|
-
- [ ] 性能测试
|
|
528
|
-
- [ ] 文档完善
|
|
529
|
-
|
|
530
|
-
## 验收标准
|
|
531
|
-
|
|
532
|
-
1. **功能完整性**:
|
|
533
|
-
- ✅ 支持 100+ Agent 并行
|
|
534
|
-
- ✅ 任务自动分发和执行
|
|
535
|
-
- ✅ Worker 动态扩容
|
|
536
|
-
- ✅ 完整的管理界面
|
|
537
|
-
|
|
538
|
-
2. **性能指标**:
|
|
539
|
-
- 任务分发延迟 < 100ms
|
|
540
|
-
- 单 Worker 支持 10+ Agent
|
|
541
|
-
- 任务吞吐量 > 1000/分钟
|
|
542
|
-
- 系统可用性 > 99.9%
|
|
543
|
-
|
|
544
|
-
3. **可维护性**:
|
|
545
|
-
- 完整的监控指标
|
|
546
|
-
- 详细的日志记录
|
|
547
|
-
- 清晰的错误提示
|
|
548
|
-
- 完善的文档
|
|
549
|
-
|
|
550
|
-
## 参考资料
|
|
551
|
-
|
|
552
|
-
- [Bull Queue Documentation](https://github.com/OptimalBits/bull)
|
|
553
|
-
- [Socket.IO Documentation](https://socket.io/docs/)
|
|
554
|
-
- [Prometheus Best Practices](https://prometheus.io/docs/practices/)
|
|
555
|
-
- [Kubernetes Patterns](https://kubernetes.io/docs/concepts/)
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
# 2026-03-27 Worklog
|
|
2
|
-
|
|
3
|
-
## 1. 实现 worker 侧 Chrome HTTP 代理路由
|
|
4
|
-
|
|
5
|
-
为 worker 新增了一组统一的 Chrome HTTP 代理入口,按 `accountIdx` 路由到对应 profile 的 debugger port:
|
|
6
|
-
|
|
7
|
-
- `GET /chrome/:accountIdx/json/version`
|
|
8
|
-
- `GET /chrome/:accountIdx/json/list`
|
|
9
|
-
- `POST /chrome/:accountIdx/json/activate/:targetId`
|
|
10
|
-
- `POST /chrome/:accountIdx/cdp/call`
|
|
11
|
-
|
|
12
|
-
特点:
|
|
13
|
-
- 挂在 worker HTTP 服务下
|
|
14
|
-
- 复用现有 `authMiddleware`
|
|
15
|
-
- 不影响现有 `/rpc/:toolName` 调用方式
|
|
16
|
-
- 首版只支持 HTTP,不支持 websocket upgrade
|
|
17
|
-
|
|
18
|
-
## 2. 抽出共享端口解析逻辑
|
|
19
|
-
|
|
20
|
-
新增共享 resolver,统一 `accountIdx -> debuggerPort` 的解析优先级:
|
|
21
|
-
|
|
22
|
-
1. 优先取 `~/Private/chrome.json` 中 `account_<idx>.port`
|
|
23
|
-
2. 否则回退到 `runtime-registry` 中的 `debuggerPort`
|
|
24
|
-
3. 都没有则报错
|
|
25
|
-
|
|
26
|
-
这样保证:
|
|
27
|
-
- `/chrome/*` 路由
|
|
28
|
-
- `/rpc/chrome_get_targets`
|
|
29
|
-
- `/rpc/chrome_cdp_call`
|
|
30
|
-
|
|
31
|
-
三者对同一账号使用同一套端口解析规则。
|
|
32
|
-
|
|
33
|
-
## 3. 复用现有 CDP helper
|
|
34
|
-
|
|
35
|
-
没有新造协议层,直接复用已有 helper:
|
|
36
|
-
|
|
37
|
-
- `getVersion`
|
|
38
|
-
- `getTargets`
|
|
39
|
-
- `activateTarget`
|
|
40
|
-
- `callCdp`
|
|
41
|
-
|
|
42
|
-
本次实现本质上是对现有 CDP helper 的 HTTP facade。
|
|
43
|
-
|
|
44
|
-
## 4. 保持首版边界清晰
|
|
45
|
-
|
|
46
|
-
本次明确没有做:
|
|
47
|
-
|
|
48
|
-
- websocket 代理
|
|
49
|
-
- `server.on("upgrade")`
|
|
50
|
-
- 双向 websocket 转发
|
|
51
|
-
- `webSocketDebuggerUrl` 改写
|
|
52
|
-
|
|
53
|
-
原因:当前 worker 代码里没有 websocket proxy 基础设施,先完成 HTTP 最小闭环更稳妥。
|
|
54
|
-
|
|
55
|
-
## 5. 新增测试
|
|
56
|
-
|
|
57
|
-
新增了路由测试,覆盖:
|
|
58
|
-
|
|
59
|
-
- `/json/version`
|
|
60
|
-
- `/json/list`
|
|
61
|
-
- `/json/activate/:targetId`
|
|
62
|
-
- `/cdp/call`
|
|
63
|
-
- 非法 `accountIdx`
|
|
64
|
-
- 缺失 debugger port
|
|
65
|
-
- 缺失 method
|
|
66
|
-
- debugger port 不可达
|
|
67
|
-
|
|
68
|
-
结果:
|
|
69
|
-
- `tests/rpc/chrome-proxy-routes.test.js` 已通过(单独运行)
|
|
70
|
-
|
|
71
|
-
## 6. 文档产出
|
|
72
|
-
|
|
73
|
-
已写入专门文档:
|
|
74
|
-
|
|
75
|
-
- `docs/chrome-proxy.md`
|
|
76
|
-
|
|
77
|
-
内容包括:
|
|
78
|
-
- 背景和目标
|
|
79
|
-
- 路由定义
|
|
80
|
-
- 端口解析规则
|
|
81
|
-
- 认证方式
|
|
82
|
-
- 示例请求
|
|
83
|
-
- 错误语义
|
|
84
|
-
- 非目标说明
|
|
85
|
-
- 关键代码变更点
|
|
86
|
-
- 测试验证方式
|
|
87
|
-
|
|
88
|
-
## 7. 关键修改文件
|
|
89
|
-
|
|
90
|
-
- `src/server/chrome-proxy-routes.js`
|
|
91
|
-
- `src/chrome/debugger-port-resolver.js`
|
|
92
|
-
- `src/main.js`
|
|
93
|
-
- `src/tools/chrome-tools.js`
|
|
94
|
-
- `tests/rpc/chrome-proxy-routes.test.js`
|
|
95
|
-
- `docs/chrome-proxy.md`
|
|
96
|
-
|
|
97
|
-
## 8. 当前状态
|
|
98
|
-
|
|
99
|
-
已完成:
|
|
100
|
-
- 代码实现
|
|
101
|
-
- 路由接入
|
|
102
|
-
- 共享 resolver
|
|
103
|
-
- 单测
|
|
104
|
-
- 文档
|
|
105
|
-
|
|
106
|
-
已确认:
|
|
107
|
-
- 新增测试通过
|
|
108
|
-
- 全量 `npm test` 仍有仓库内既有失败(例如部分 RPC suite 报 `sleep is not a function`),与本次改动无关
|