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.
@@ -1,509 +0,0 @@
1
- # CiCy Desktop 当前执行桥接架构说明
2
-
3
- ## 一句话结论
4
-
5
- `cicy-desktop` 现在已经不是一个简单的 Electron 壳子,而是一个已经可工作的本地自动化执行节点:
6
-
7
- - 它已经有本地认证
8
- - 已经有 REST RPC / MCP SSE 服务
9
- - 已经有工具注册中心
10
- - 已经有 BrowserWindow / 账户隔离
11
- - 已经有 Chrome CDP 控制
12
- - 已经有页面 JS 执行和部分页面注入
13
- - 已经有系统窗口控制能力
14
-
15
- 但它现在**还没有真正打通云端 worker agent 调度链路**。也就是说,`Desktop 本地执行能力` 已经有了,缺的是 `云端任务下发 / 回传 / 心跳 / 状态机` 这一层。
16
-
17
- ---
18
-
19
- ## 1. 当前代码里已经存在的核心能力
20
-
21
- ### 1.1 本地 Desktop Daemon 已存在
22
-
23
- `src/main.js` 已经启动了一个本地服务进程,而不是只打开一个 Electron 窗口。
24
-
25
- 它现在提供:
26
-
27
- - `GET /mcp` + `POST /messages`:MCP SSE 通道
28
- - `POST /rpc/tools/call`:统一 RPC 调用入口
29
- - `GET /rpc/tools`:工具列表
30
- - `POST /rpc/<tool>`:每个工具的直接调用入口
31
- - `POST /rpc/upload/*`:上传文件
32
- - `POST /rpc/exec/:type`:远程提交脚本执行
33
-
34
- 所以从架构上说,`cicy-desktop` 现在已经具备“本地 agent server”形态。
35
-
36
- ### 1.2 本地鉴权已存在
37
-
38
- `src/utils/auth.js` 已实现:
39
-
40
- - 从 `~/global.json` 读取 `api_token`
41
- - 不存在时自动生成
42
- - 支持 `Bearer` 和 `Basic Auth`
43
-
44
- 这说明它已经能作为受保护的本地 worker 服务存在。
45
-
46
- ### 1.3 工具注册中心已存在
47
-
48
- `src/tools/index.js` + `src/main.js` 已经形成统一工具注册机制。
49
-
50
- 现在工具并不是散的,而是统一挂在 tool registry 下,外部和内部最终都走同一套 handler:
51
-
52
- - window tools
53
- - cdp tools
54
- - exec js
55
- - automation tools
56
- - system tools
57
- - account tools
58
- - clipboard tools
59
- - download tools
60
- - hook tools
61
-
62
- 这点很关键,因为后面无论你是走 HTTP、MCP、IPC,最终都可以复用这一层,不需要重写执行器。
63
-
64
- ### 1.4 BrowserWindow + 账户隔离已存在
65
-
66
- `src/utils/window-utils.js` 已经做了:
67
-
68
- - `partition: persist:sandbox-${accountIdx}`
69
- - 多账户 Cookie / Storage 隔离
70
- - 单窗口复用模式
71
- - URL 级窗口状态恢复
72
- - 每个窗口自动挂 debugger
73
- - 代理设置
74
- - 权限处理
75
-
76
- 这意味着“一个桌面节点服务多个账户 / 多个 worker 页面”的基础已经有了。
77
-
78
- ### 1.5 Chrome CDP 控制已存在
79
-
80
- `src/main.js` 设置了:
81
-
82
- - `remote-debugging-port = 9221`
83
-
84
- `src/utils/cdp-utils.js` 和 `src/tools/cdp-tools.js` 已经做了:
85
-
86
- - `webContents.debugger.attach("1.3")`
87
- - `webContents.debugger.sendCommand(...)`
88
- - 鼠标点击/双击
89
- - 键盘按键
90
- - 文本输入
91
- - 滚动
92
- - 任意 CDP command
93
-
94
- 所以你现在真正可依赖的主执行层,确实应该是 `Chrome CDP`。
95
-
96
- ### 1.6 页面执行层已存在
97
-
98
- `src/tools/exec-js.js` 和 `src/tools/automation-tools.js` 已经提供:
99
-
100
- - `exec_js`
101
- - `exec_js_file`
102
- - `electron_click`
103
- - `electron_type`
104
- - `electron_wait_for`
105
- - `electron_evaluate`
106
- - 读取页面内容/属性
107
-
108
- 这层适合补 DOM 级逻辑,或者做站点定制化流程。
109
-
110
- ### 1.7 系统层能力已存在
111
-
112
- `src/tools/system-tools.js` 已经做了:
113
-
114
- - 枚举系统窗口
115
- - 聚焦窗口
116
- - 读取系统信息
117
- - 系统截图
118
- - Linux 下通过 `wmctrl` / `xdotool` 做系统窗口控制
119
-
120
- 这说明 `cicy-desktop` 已经不只是“浏览器自动化”,而是“浏览器优先、桌面兜底”的本地执行桥。
121
-
122
- ### 1.8 页面注入与站点 Hook 能力已存在
123
-
124
- `src/utils/window-utils.js` 会在 `dom-ready` 后:
125
-
126
- - 为受信任页面注入 `window.electronRPC`
127
- - 为每个域名加载 `~/data/electron/extension/inject/<domain>.js`
128
- - 默认脚本来自 `src/extension/inject.js`
129
-
130
- 另外 `src/tools/hook-chatgpt.js`、`src/tools/hook-gemini.js` 已经证明:
131
-
132
- - 可以做站点专属 hook
133
- - 可以读 IndexedDB
134
- - 可以走剪贴板桥接
135
- - 可以在指定页面做定制增强
136
-
137
- ---
138
-
139
- ## 2. 当前真实可用的执行链路
140
-
141
- ### 2.1 外部控制面 -> Desktop
142
-
143
- 这是当前已经成立的链路:
144
-
145
- ```text
146
- Remote Controller / CLI / Agent
147
- -> HTTP RPC or MCP SSE
148
- -> cicy-desktop local server
149
- -> tool registry
150
- -> tool handler
151
- -> BrowserWindow / CDP / system command
152
- ```
153
-
154
- 这是目前最稳的链路。
155
-
156
- ### 2.2 页面内 JS -> Electron IPC -> Tool Registry
157
-
158
- 当前代码也已经部分成立这条链:
159
-
160
- ```text
161
- Page JS
162
- -> window.electronRPC(...) / window._g.rpc(...)
163
- -> ipcRenderer.invoke("rpc", toolName, args)
164
- -> ipcMain.handle("rpc", ...)
165
- -> tool registry
166
- -> tool handler
167
- ```
168
-
169
- 这条链在 `src/main.js` 的 `ipcMain.handle("rpc")` 已经做通了。
170
-
171
- ### 2.3 Tool -> Chrome CDP
172
-
173
- 当前核心浏览器执行链:
174
-
175
- ```text
176
- tool handler
177
- -> sendCDP(...)
178
- -> webContents.debugger.sendCommand(...)
179
- -> Chromium
180
- ```
181
-
182
- 这条链现在是最应该作为虚拟员工主执行层的能力。
183
-
184
- ---
185
-
186
- ## 3. 一个非常关键的现实边界
187
-
188
- ### 3.1 `preload-rpc.js` 存在,但当前没有接到 BrowserWindow
189
-
190
- 仓库里有:
191
-
192
- - `src/preload-rpc.js`
193
-
194
- 它暴露了:
195
-
196
- - `window.electronRPC.invoke(...)`
197
-
198
- 但是当前 `createWindow()` 里**没有把这个 preload 挂进 `webPreferences.preload`**。
199
-
200
- 这意味着:
201
-
202
- - 这个 preload bridge 文件是存在的
203
- - 但当前不是主链路
204
- - 当前真正生效的是运行时注入,而不是稳定 preload
205
-
206
- ### 3.2 当前 `window.electronRPC` 不是对所有站点都稳定可用
207
-
208
- `src/utils/window-utils.js` 当前策略是:
209
-
210
- - 受信任 URL:`localhost` 或 `*.de5.net`
211
- - 这些页面会启用 `nodeIntegration`
212
- - 并额外注入 `window.electronRPC`
213
-
214
- 对于普通公网站点:
215
-
216
- - `nodeIntegration` 默认是关的
217
- - `contextIsolation` 默认是开的
218
- - `src/extension/inject.js` 里 `require("electron")` 很可能拿不到
219
-
220
- 也就是说:
221
-
222
- - 对任意公网网站,`页面自己调用 ipcRenderer` 这件事目前**不是稳定能力**
223
- - 现在最稳的是:`主进程/工具层直接控制页面`
224
- - 如果要走你说的 `ws -> client js -> electron ipcRenderer -> rpc`,需要先把 preload 这层正式接上
225
-
226
- 这个点很重要,不然会把“某些域名能用的注入”误判成“所有页面都能稳定走 renderer bridge”。
227
-
228
- ---
229
-
230
- ## 4. 当前没有真正落地的部分
231
-
232
- 我直接按代码说结论。
233
-
234
- ### 4.1 没找到真实的云端 worker 调度实现
235
-
236
- 我在 `src/` 里没有找到已落地的:
237
-
238
- - WebSocket 长连接 worker client
239
- - 向 master 注册 worker
240
- - 心跳上报
241
- - 任务拉取 / ACK / 重试
242
- - 任务状态机
243
- - 云端 agent session 绑定
244
-
245
- ### 4.2 `feature-distributed-multi-agent.md` 目前是设计稿,不是现状
246
-
247
- `docs/feature-distributed-multi-agent.md` 里写了:
248
-
249
- - master node
250
- - worker node
251
- - Redis
252
- - Bull
253
- - 心跳
254
- - 调度
255
- - 任务队列
256
-
257
- 但从当前 `src/` 代码来看,这些还没有真正落地。
258
-
259
- 所以这份文档应该被视为:
260
-
261
- - 方向设计稿
262
- - 不是当前已完成实现
263
-
264
- ### 4.3 当前没有云端到本地的“常驻任务循环”
265
-
266
- 现在 `cicy-desktop` 更像是:
267
-
268
- - 一个被动等待调用的本地执行服务
269
-
270
- 而不是:
271
-
272
- - 一个主动连接云端、持续领取任务、持续回传结果的 worker client
273
-
274
- 这就是“能力有了,但没打通”的核心原因。
275
-
276
- ---
277
-
278
- ## 5. 结合当前代码,Desktop 在整个虚拟员工系统中的正确角色
279
-
280
- 你前面说得对,应该定成下面这个角色:
281
-
282
- ### 5.1 Chrome CDP 是主执行层
283
-
284
- 真正干活的主能力应该是:
285
-
286
- - 页面打开
287
- - 元素交互
288
- - 输入
289
- - 滚动
290
- - 网络监听
291
- - 页面状态读取
292
-
293
- 这些都应该优先走:
294
-
295
- - `webContents.debugger.sendCommand`
296
- - `executeJavaScript`
297
-
298
- 也就是 `CDP first, DOM/JS second`。
299
-
300
- ### 5.2 Electron Desktop 是本地特权桥
301
-
302
- Desktop 的职责不应该定义成“大脑”,而应该定义成:
303
-
304
- - 本地 worker 宿主
305
- - 本地认证和安全边界
306
- - Chromium / BrowserWindow 宿主
307
- - CDP 和系统能力桥
308
- - 多账户和本地缓存宿主
309
- - 必要时的系统级兜底执行器
310
-
311
- ### 5.3 页面内 client JS 只能是补充层,不该是唯一主链路
312
-
313
- 页面 JS 适合做:
314
-
315
- - 某站点 DOM helper
316
- - 某站点页面内状态抽取
317
- - 某站点 IndexedDB 读取
318
- - 某站点专用组件点击和观察
319
-
320
- 页面 JS 不适合单独承担:
321
-
322
- - 全局任务调度
323
- - 可靠心跳
324
- - 跨站统一 agent runtime
325
-
326
- 因为页面会跳转、站点脚本会变、权限模型也不稳定。
327
-
328
- ---
329
-
330
- ## 6. 基于现有代码,最小打通方案
331
-
332
- 这里不写空想,只写最贴近当前代码的最短路径。
333
-
334
- ### 方案 A:推荐方案
335
-
336
- ```text
337
- Cloud Agent / Scheduler
338
- -> WebSocket / SSE / HTTP task stream
339
- -> cicy-desktop main process worker client
340
- -> tool registry
341
- -> CDP / JS / system tools
342
- ```
343
-
344
- 这个方案的特点:
345
-
346
- - 不依赖页面是否支持 `ipcRenderer`
347
- - 不依赖特定域名注入
348
- - 直接复用现在的 tool registry
349
- - 结构最稳
350
-
351
- 这个方案下,Electron renderer 只是浏览器页面本身,不承担云端调度职责。
352
-
353
- ### 方案 B:按你说的桥接方案来做
354
-
355
- ```text
356
- Cloud Agent
357
- -> WS
358
- -> client js
359
- -> ipcRenderer
360
- -> ipcMain.handle("rpc")
361
- -> tool registry
362
- ```
363
-
364
- 这个方案并非不能做,但要先补齐两个前提:
365
-
366
- - 把 `src/preload-rpc.js` 正式接到 BrowserWindow
367
- - 把 WS client 放到 preload / isolated world,而不是普通页面脚本
368
-
369
- 否则现在这种基于页面注入的 `require("electron")`,在公网站点上不稳定。
370
-
371
- ### 我建议的落地方向
372
-
373
- 如果你的目标是“虚拟员工长期稳定打工”,推荐:
374
-
375
- - 调度链放主进程
376
- - 页面 hook 只做站点增强
377
- - preload 只做最薄 IPC 桥
378
-
379
- 这更贴近你现有代码,也更稳。
380
-
381
- ---
382
-
383
- ## 7. 要真正“打通”到 worker agent,还缺什么
384
-
385
- 按现有代码,最少还要补这几块:
386
-
387
- ### 7.1 Worker 身份与注册
388
-
389
- - worker_id
390
- - device_id
391
- - token / secret
392
- - 当前版本
393
- - 当前机器资源
394
-
395
- ### 7.2 长连接任务通道
396
-
397
- - WebSocket 或长轮询
398
- - 领取任务
399
- - ACK
400
- - 心跳
401
- - cancel
402
- - reconnect
403
-
404
- ### 7.3 任务执行器
405
-
406
- 把云端任务格式映射到现有 tool registry,例如:
407
-
408
- - open window
409
- - wait dom ready
410
- - cdp click
411
- - exec js
412
- - system fallback
413
-
414
- ### 7.4 任务结果与观测
415
-
416
- - stdout / step log
417
- - screenshot
418
- - request log
419
- - last url / title
420
- - success / fail
421
- - retryable / non-retryable
422
-
423
- ### 7.5 账户和窗口复用策略
424
-
425
- 要明确:
426
-
427
- - 一个任务对应哪个 `accountIdx`
428
- - 一个 worker 是否复用已有窗口
429
- - 同站点是否复用 session
430
- - 哪些任务必须新开隔离窗口
431
-
432
- ### 7.6 稳定的 renderer bridge
433
-
434
- 如果你坚持让 client JS 参与调度,需要:
435
-
436
- - 正式启用 preload
437
- - 固定暴露 `window.electronRPC`
438
- - 不再依赖普通页面里 `require("electron")`
439
-
440
- ---
441
-
442
- ## 8. 现阶段我对这套系统的定稿判断
443
-
444
- ### 已经做成的
445
-
446
- - Desktop 本地执行节点
447
- - 本地 RPC/MCP 服务
448
- - BrowserWindow 多账户隔离
449
- - CDP 主控能力
450
- - 页面 JS 执行能力
451
- - 系统级兜底能力
452
- - 页面注入与 hook 扩展点
453
-
454
- ### 还没做成的
455
-
456
- - 云端调度到本地 worker 的真实闭环
457
- - 稳定的跨站 renderer/preload bridge
458
- - 任务状态机和结果回传链路
459
- - 真正的多 worker / 多 agent 分布式运行面
460
-
461
- ### 正确理解
462
-
463
- 现在不是“`cicy-desktop` 没能力”。
464
-
465
- 而是:
466
-
467
- - `执行器` 已经基本成形
468
- - `调度层` 还没接上
469
-
470
- ---
471
-
472
- ## 9. 建议你后面把文档和实现统一成下面这句话
473
-
474
- > `cicy-desktop` 是虚拟员工的本地执行宿主,主执行层使用 Chrome CDP,Electron 负责本地权限桥接、窗口宿主、多账户隔离和系统级兜底;云端调度层后续通过 worker 长连接接入,而不是把 Electron 本身当成调度中心。
475
-
476
- ---
477
-
478
- ## 10. 如果按当前代码继续推进,我建议的实施顺序
479
-
480
- ### 第一阶段
481
-
482
- - 先补 worker 长连接
483
- - 先让云端能给 desktop 发 task
484
- - 直接在 main process 调用现有 tool registry
485
-
486
- ### 第二阶段
487
-
488
- - 把 `preload-rpc.js` 正式挂上
489
- - 固化 renderer bridge
490
- - 把页面内 hook 变成站点增强层
491
-
492
- ### 第三阶段
493
-
494
- - 再做多 worker / 多 agent / 队列 / 调度
495
- - 再把 `feature-distributed-multi-agent.md` 里的设计逐步落地
496
-
497
- ---
498
-
499
- ## 11. 当前最重要的非空想结论
500
-
501
- 你现在最该复用的,不是重新发明一个浏览器自动化壳子。
502
-
503
- 你最该做的是:
504
-
505
- - 承认 `cicy-desktop` 已经是本地执行器
506
- - 以 `tool registry + CDP + BrowserWindow isolation` 为基础
507
- - 把云端任务调度接到它上面
508
-
509
- 这才是“结合已经做的继续往前推”,而不是重写一遍。