导读:有“好事”开发者对阿里的“悟空”进行了分析,使用AI进行分析的效率确是要高。
钉钉团队开发的 AI Agent 桌面客户端,内部代号 "Real",对外品牌 "悟空(Wukong)"。
由某位开发者网友用AI对其进行了“逆向分析”与跟踪,可从结构上看与OpenClaw很像,只是没有开源罢了。
这位网友并没有反编译,亦未对原应用做任何破坏,仅做为启发设计、学习思想之用,此外一些文字因微信编辑器原因,查看时感觉会乱,请理解。
操作方法:逆向分析 App Bundle 结构、二进制符号、动态库依赖、资源文件
1. 基本身份
| 属性 | 值 | |------|-----| | 显示名称 | Wukong(悟空) | | Bundle ID | `com.dingtalk.real` | | 可执行文件 | `DingTalkReal` | | 版本 | 0.9.0 | | 最低系统 | macOS 14.0 | | 架构 | arm64 (Apple Silicon) | | 开发团队 | 钉钉 (DingTalk / 阿里巴巴) | | 构建环境 | Jenkins CI (`real-wukong-release`),构建用户 `yuanzhan` | | 自定义 URL Scheme | `wukong://` |
2. 技术栈总览
核心框架:Tauri 2.x + Rust + WRY/WebKit
主程序:纯 Rust 编写,使用 Tauri 框架(非 Electron)
前端 UI:运行在 WebView 内的 Web 应用(Tauri 生态通常用 React/Vue/Svelte)
IPC 机制:Tauri 自定义协议 `tauriipc://`,带 Isolation Pattern 安全隔离模式
系统级原生框架依赖
通过 `otool -L` 分析动态库链接:
| 框架 | 用途 | |------|------| | WebKit + JavaScriptCore | WebView 渲染与 JS 执行 | | AVFoundation + AVFAudio + CoreMedia | 音视频处理 | | ScreenCaptureKit | 屏幕截图/录制 | | CoreLocation | 地理定位 | | UserNotifications | 系统通知 | | OSAKit | AppleScript 自动化 | | Metal + QuartzCore | GPU 渲染 | | CloudKit | iCloud 数据同步 | | CoreData | 本地数据持久化 | | Security | 密钥链/加密 | | IOKit | 硬件交互 | | SystemConfiguration | 网络配置 | | CoreImage + ImageIO + ColorSync | 图像处理 | | CoreText | 文本渲染 | | CoreVideo + IOSurface | 视频/Surface 管理 |
3. App Bundle 目录结构
Wukong.app/Contents/
├── Info.plist # 应用元数据
├── _CodeSignature/ # 代码签名
├── MacOS/
│ ├── DingTalkReal # 主可执行文件 (122MB, arm64, Rust)
│ └── real-cli # CLI 工具 (2.8MB, arm64)
├── Frameworks/ # (空 — 无第三方 framework)
└── Resources/
├── icon.icns # 应用图标
├── zh-Hans-CN.lproj/ # 简体中文本地化
├── zh-Hans.lproj/ # 简体中文本地化
├── python/ # (预留 Python 目录)
└── resources/
├── browser-runtime/ # 浏览器自动化运行时 (TypeScript)
├── bundled-skills/ # 内置技能包 (zip)
├── dws/ # DWS 内部服务
├── environment/ # 运行环境管理
├── mbb-skills/ # 浏览器增强技能
└── real_networking/ # 网络层 (含 GaeaMac.framework)4. Agent 运行时架构(从 Rust 源码路径反推)
src/
├── main.rs # 入口
├── agent/ # ===== AI Agent 核心 =====
│ ├── agent_client/
│ │ ├── connection/processes.rs # ACP (Agent Communication Protocol) 进程管理
│ │ └── session/builder.rs # 会话构建器
│ ├── runtime/
│ │ ├── real_loop/ # "Real Loop" — 主 Agent 循环引擎
│ │ │ ├── loop_engine.rs # 核心循环
│ │ │ ├── commands.rs # 命令处理
│ │ │ ├── types.rs # 工具定义(内置工具声明)
│ │ │ ├── message_converter.rs # 消息格式转换
│ │ │ ├── memory_summarizer.rs # 对话记忆摘要
│ │ │ ├── sensitive_paths.rs # 敏感路径过滤 (~/.real/.acp)
│ │ │ ├── session_approval_memory.rs # 权限审批记忆 (HITL)
│ │ │ ├── skill_snapshot.rs # 技能发现与注入
│ │ │ └── sandbox_policy_loader.rs # 沙箱安全策略加载
│ │ ├── spark_loop/ # "Spark Loop" — 自研 Agent 引擎
│ │ │ └── allspark/crates/ # 内嵌独立 Rust workspace (DDD 架构)
│ │ │ ├── application/ # 应用层
│ │ │ │ └── agent/
│ │ │ │ ├── stream/service_impl.rs
│ │ │ │ └── session_memory_flusher.rs
│ │ │ ├── domain/ # 领域层
│ │ │ │ ├── agent/compaction.rs
│ │ │ │ ├── common/llm.rs
│ │ │ │ └── session/entity.rs
│ │ │ └── infrastructure/ # 基础设施层
│ │ │ ├── shared/llm/
│ │ │ │ ├── maas.rs # 阿里云 MaaS API
│ │ │ │ ├── qwen.rs # 通义千问 (OpenAI 兼容)
│ │ │ │ └── openai.rs # OpenAI API
│ │ │ ├── sandbox/gateway_impl.rs
│ │ │ ├── soul/ # "Soul" — Agent 人格/记忆
│ │ │ └── agent/system_prompt_template.rs
│ │ ├── real_tools/ # ===== 内置工具集 =====
│ │ │ ├── infrastructure/
│ │ │ │ ├── browser/
│ │ │ │ │ ├── control_plane.rs # 浏览器生命周期管理
│ │ │ │ │ └── embedded/
│ │ │ │ │ ├── page_actor.rs # 页面操作 Actor
│ │ │ │ │ ├── session_port.rs # 会话端口
│ │ │ │ │ └── artifact_port.rs # 文件下载
│ │ │ │ └── proxy.rs # Sidecar 代理
│ │ │ └── tools/
│ │ │ ├── cron/shared.rs # 定时任务
│ │ │ ├── text2image.rs # 文生图
│ │ │ ├── text2video.rs # 文生视频
│ │ │ └── web/
│ │ │ ├── core/robots.rs # robots.txt 解析
│ │ │ └── search/aggregator.rs # 搜索聚合
│ │ ├── dingtalk_supports/cloud/ # 钉钉云端工具
│ │ └── path_codec.rs
│ ├── memory/ # ===== 持久化记忆 =====
│ │ ├── service.rs # 记忆服务
│ │ └── sqlite.rs # SQLite 存储
│ ├── persistence/
│ │ ├── consumer/mod.rs # 消息块消费者
│ │ └── db_store/spark_agui_message.rs
│ ├── session/session_manager/ # 会话管理
│ ├── attachments/mod.rs # 附件管理
│ └── agui_stream.rs # Agent GUI 流
│
├── gateway/ # ===== API 网关层 =====
│ ├── commands.rs # Tauri 命令
│ ├── service.rs # 路由分发引擎
│ ├── models.rs # 请求/响应模型
│ └── draft.rs # 草稿系统
│
├── channels/ # ===== 多渠道接入 =====
│ ├── dingtalk/
│ │ ├── ai_card.rs # AI 卡片消息 (流式)
│ │ ├── stream.rs # 钉钉 Stream
│ │ └── commands.rs
│ ├── slack.rs # Slack 集成
│ ├── whatsapp.rs # WhatsApp 集成
│ ├── agent_support.rs
│ └── types.rs # 设备注册 RPC
│
├── mcp/ # ===== MCP 协议 =====
│ ├── runtime.rs # MCP 服务器运行时
│ ├── cli.rs
│ └── config.rs # mcpServerConfig.json
│
├── model_provider/ # ===== LLM 提供商管理 =====
│ ├── commands.rs # API Key / 凭证管理
│ ├── cli.rs # 技能 markdown 加载
│ └── dingtalk_runtime.rs
│
├── cron/ # ===== 定时任务系统 =====
│ ├── commands/job_commands.rs
│ ├── mod.rs
│ └── store/
│ ├── job_store.rs
│ ├── run_store.rs
│ └── delivery_store.rs
│
├── skills/ # ===== 技能系统 =====
│ ├── commands.rs # 安装/启用/禁用/删除
│ └── health.rs # 技能健康检查
│
├── hooks/commands.rs # ===== Hook 系统 =====
│
├── environment/mod.rs # ===== 运行环境管理 =====
│
├── real_cli/router.rs # ===== CLI 路由 =====
│
├── rpc/ # ===== RPC 接口 =====
│ ├── agent_device.rs
│ ├── browser_runtime.rs
│ ├── gateway.rs
│ ├── kinto_chat.rs
│ └── model_provider.rs
│
├── dingtalk_core/ # ===== 钉钉核心 =====
│ ├── login/
│ │ ├── mod.rs # 登录状态机 (Unlogin → LoggingIn → Logged)
│ │ ├── models.rs
│ │ ├── agentbay_auth.rs # AgentBay 认证
│ │ └── global_llm.rs # LLM 凭证管理 (加密存储)
│ ├── heartbeat/manager.rs # 心跳
│ ├── file_upload.rs # 文件上传
│ └── mod.rs
│
├── lwp/debug_workbench.rs # ===== LWP 调试工作台 =====
│
├── system/ # ===== 系统能力 =====
│ ├── screen_capture.rs # 屏幕截图 (ScreenCaptureKit)
│ ├── audio_capture.rs # 音频捕获
│ ├── ui_automation.rs # UI 自动化
│ ├── app_scanner.rs # 应用扫描
│ └── power_management.rs # 电源管理 (阻止休眠)
│
├── base/process_manager/ # ===== 进程管理器 =====
│ ├── manager.rs # 子进程生命周期
│ ├── lifecycle.rs # 状态机 (Running/Exited/Crashed/Restarting)
│ └── monitor.rs
│
├── types/generated/acp_message.rs # ===== 自动生成的 ACP 消息协议 =====
│
└── ui_cli_command/theme.rs # ===== UI 主题 =====
5. 支持的 Agent 类型
从 `src/main.rs` 二进制符号提取的 Agent 类型枚举:
| Agent 类型 | 标识 | 说明 |
|-----------|------|------|
| Spark | `spark` | 钉钉自研 Agent 引擎 |
| Native | `native` | 原生驱动 |
| Wukong | — | 内部品牌统称 |
| Claude | `claude` | Claude Code 集成 |
| Gemini | `gemini` | Gemini CLI 集成 |
| Codex | `codex` | Codex CLI 集成 |
| iFlow | `iflow` | 工作流引擎 |
| Builtin | `builtin` | 内置 Agent |
| Local | `local` | 本地模型 Agent |
| Discovered | — | 自动发现的 Agent |
Wukong 是一个多 Agent 宿主平台,可以同时运行多种 AI Agent 引擎。
6. LLM 多后端支持
从 `allspark/crates/infrastructure/src/shared/llm/` 反推出三个 LLM 适配器:
6.1 MaaS (maas.rs) — 阿里云模型服务
MaasRequest { model, max_tokens, tools, stream, stream_options, enable_thinking, tool_choice, parallel_tool_calls, temperature, top_p, top_k, min_p, extra_body, cache_control }
支持 `prompt_cache_hit_tokens` — 提示缓存命中统计
支持 `enable_thinking` — 思考模式
6.2 Qwen (qwen.rs) — 通义千问
OpenAI 兼容格式,支持 `enable_thinking`。
6.3 OpenAI (openai.rs) — 标准 OpenAI API
标准 OpenAI Chat Completions 格式。
全部适配器支持:streaming、tool_choice、parallel_tool_calls、usage tracking。
7. 内嵌运行时环境
应用内置了完整的开发/执行环境:
| 组件 | 版本 | 用途 | |------|------|------| | Bun | 1.2.17 | 主 JS/TS 运行时(运行 browser-runtime) | | Node.js | 22.19.0 | 备用 JS 运行时 | | Python | 3.12 (CPython) | Python 脚本执行 | | uv | 0.7.13 | Python 包管理器 | | Chromium | 145.0.7632.160 | 内嵌浏览器(自动化用) | | Qwen | 0.10.0 | 本地通义千问模型(离线推理) | | DWS | 0.2.19 | 内部服务守护进程 |
运行时通过 `resource_manifest.json` 管理,支持按平台/profile 差异化分发。
8. 浏览器自动化系统
`resources/browser-runtime/` 是一个独立的 TypeScript 微服务:
技术栈
Playwright (`playwright-core 1.58.2`) — 浏览器自动化引擎
Express 5 — HTTP API 服务
WebSocket (`ws 8.19.0`) — 实时通信
Bun — 运行时
模块结构
browser-runtime/src/
├── main.ts # 入口
├── browser/ # 浏览器控制
│ ├── cdp.ts # Chrome DevTools Protocol 客户端
│ ├── chrome.ts # Chrome 启动管理
│ ├── client.ts # 浏览器客户端
│ ├── client-actions.ts # 页面操作 (点击/输入/观察等)
│ ├── control-api.ts # 控制 API
│ ├── control-auth.ts # 认证
│ ├── bridge-server.ts # Bridge 服务
│ ├── extension-relay.ts # Chrome 扩展中继
│ ├── navigation-guard.ts # 导航守卫
│ ├── profiles.ts # 浏览器 Profile 管理
│ ├── form-fields.ts # 表单字段处理
│ └── pw-ai-module.ts # Playwright AI 模块
├── cli/ # CLI 接口
├── config/ # 配置
├── gateway/ # 网关
├── infra/ # 基础设施
├── logging/ # 日志
├── media/ # 媒体处理
├── process/ # 进程管理
├── security/ # 安全 (CSRF 等)
└── utils/ # 工具函数
安全模型
Bridge Auth Registry — 桥接认证注册
CSRF 防护
Control Auth (含 auto-token)
HTTP Auth
Extension Relay Auth
9. 技能系统 (Skills)
9.1 Bundled Skills(内置技能包)
| 技能包 | 用途 | |--------|------| | `
dingtalk-workspace.zip
` | 钉钉工作台 | | `
docx.zip
` | Word 文档处理 | | `
pptx-presentation-handler.zip
` | PPT 演示文稿处理 | | `
xlsx-spreadsheet-handler.zip
` | Excel 电子表格处理 | | `
pdf-document-handler.zip
` | PDF 文档处理 | | `pdf_convert_to_word.zip` | PDF 转 Word | | `
skill-creator.zip
` | 技能创建器(元技能) |
9.2 MBB Skills(浏览器增强技能)
针对特定网站的自动化操作技能:
| 技能 ID | 名称 | 目标域名 | |---------|------|----------| | `12306-train-query` | 12306 火车票查询 |
12306.cn
| | `ctrip-flight-search` | 携程航班查询 |
ctrip.com
| | `dianping-info-query` | 大众点评信息查询 |
dianping.com|
9.3 技能发现机制
从 `skill_snapshot.rs` 反推的技能管理 API:
`search_skills` — 搜索可用技能
`use_skill(skill_name, level="preview"|"full")` — 激活技能
`cli_skills_install_local` / `cli_skills_install_url` — 安装本地/远程技能
`cli_skills_toggle_enabled` — 启用/禁用
`cli_skills_delete` — 删除
支持 渐进式披露 (Progressive Disclosure) — 先展示常用技能,按需搜索更多
支持 `skill_injection_policy` — 技能注入策略 (explicit/auto)
10. 内置工具 (Built-in Tools)
从 `src/agent/runtime/real_loop/types.rs` 提取:
| 工具名 | 功能 | |--------|------| | `understand_image_content` | 图像内容分析(本地 Vision 模型/云端回退) | | `parse_file` | 文件解析(PDF 本地处理,其他格式云端) | | `text2image` | 文生图(文本描述 → 图像) | | `image2image` | 图生图(基于已有图像变换) | | `text2video` | 文生视频 | | `read_url_v2` | 网页内容读取 | | `reader_html_content` | HTML 内容解析 | | `internet-search` | 互联网搜索 | | `browser_start` | 启动浏览器 | | `browser_stop` | 停止浏览器 | | `browser_screenshot` | 浏览器截图 | | `browser_wait_for_download` | 等待文件下载 | | `browser_status` | 浏览器状态查询 | | `execute_shell` | Shell 命令执行(沙箱内) | | `cron_*` | 定时任务管理 |
11. 多渠道通信架构
| 渠道 | 实现方式 | 关键细节 | |------|----------|----------| | 钉钉 | AI Card (流式卡片) + Stream 长连接 | 使用 `dtv1.card` 模板,支持 IM_ROBOT 和 IM_GROUP | | Slack | OAuth API (`auth.test`) | 支持 thread_ts 线程回复 | | WhatsApp | 集成 | 独立模块 | | Agent Device | RPC API | 设备注册/更新/列表/删除/启用 |
消息事件流
TaskStart → PreToolUse → PostToolUse → PermissionRequest → TaskComplete/TaskError
12. 安全架构
12.1 沙箱系统
`SandboxV2Config` — 沙箱配置
支持 sandbox level / profile / authorized roots
沙箱快照保存/恢复
12.2 权限审批 (Human-in-the-Loop)
`session_approval_memory` — 记录用户的允许/拒绝决策
`is_always_allowed` / `is_always_denied` — 持久化权限
`EvalAutoAllow` — 评估模式自动允许
12.3 敏感路径过滤
屏蔽 `~/.real/.acp` 等内部目录
Allowlist 机制
12.4 Prompt 安全
`PromptGuardrailsConfig` — 提示词安全护栏
12.5 Tauri 安全
Isolation Pattern — 前端 IPC 隔离
CSP 保护
12.6 凭证安全
`PreferenceCrypto` — 偏好设置加密
自动从明文迁移到加密存储
LLM 凭证过期/刷新机制
13. 辅助二进制与网络层
| 文件 | 大小 | 架构 | 说明 | |------|------|------|------| | `DingTalkReal` | 122MB | arm64 | 主可执行文件 (Rust/Tauri) | | `real-cli` | 2.8MB | arm64 | 独立 CLI 工具 | | `real_networking` | — | universal (x86_64 + arm64) | 网络层二进制 | | `dws` | — | arm64 | DWS 服务守护进程 |
网络层
`GaeaMac.framework` — 阿里内部网络框架 (Gaea)
- 包含 AI、Aladdin、Base、Bridge 等子模块 - 支持 Wukong 专用头文件
`libdtfbase.dylib` — 钉钉基础库
14. 数据存储
| 存储方式 | 用途 | |----------|------| | SQLite | Agent 记忆、消息持久化、定时任务 | | CoreData | 本地数据管理 | | CloudKit | 云端数据同步 | | JSON 配置文件 | MCP 服务器配置、环境清单 | | 加密偏好设置 | LLM API Key、登录凭证 |
15. 系统权限声明
| 权限 | 用途描述 | |------|----------| | AppleEvents | 控制 Terminal 和其他应用执行任务 | | Camera | 拍照和视频录制 | | Location (Always) | 天气、导航等任务 | | Microphone | 语音输入和音频捕获 | | Screen Capture | 分析界面内容和执行自动化操作 | | Notifications | 提醒任务执行状态和重要事件 |
16. 架构总结图
17. 核心结论
Wukong 是阿里钉钉团队打造的下一代 AI Agent 桌面操作系统,核心特征:
Tauri + Rust 原生架构 — 非 Electron,性能优异,主二进制 122MB 包含所有逻辑
多 Agent 引擎共存 — 同时支持自研 Spark、Claude Code、Gemini CLI、Codex CLI 等
全栈 Agent 能力 — 代码执行、浏览器自动化、屏幕截图、UI 自动化、文件处理、文生图/视频
MCP 协议原生支持 — 可连接外部 MCP 服务器扩展工具能力
完善的技能系统 — 内置技能 + 浏览器增强技能 + 用户自装技能,渐进式发现
多渠道分发 — 同一 Agent 可通过钉钉 AI Card、Slack、WhatsApp 等渠道交互
本地 LLM 能力 — 内置 Qwen 模型,支持离线推理
企业级安全 — 沙箱隔离、HITL 权限审批、敏感路径过滤、Prompt Guardrails、凭证加密
自包含运行时 — 内嵌 Bun/Node/Python/Chromium,无需用户额外安装
DDD 架构 — AllSpark 内核采用领域驱动设计,Application/Domain/Infrastructure 分层清晰
可见,悟空不只是聊天窗口,而是能控制电脑、操作浏览器、执行代码、管理定时任务、跨平台分发的智能体平台。
其实逆向工程并不是新鲜事,并且也只是前端的App,后端服务器代码才是重头戏,且不是很好突破,仅博各位开发者一笑。
编辑:手扶拖拉斯基
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。