Ta Desktop
Ta 的桌面应用:一个窗口,内容是 ta serve 自带的 Web 客户端。壳只做浏览器窗口做不到的事,其他都在 Web 客户端里。
text
Electron 主进程
├─ 单实例、菜单、外链与权限守卫、托盘、任务完成通知
├─ serve.json 里的 ta serve 还在响应 → 直接用它(比如终端里启动的)
├─ 否则以 Node 模式(ELECTRON_RUN_AS_NODE)启动内置的 ta serve:macOS 上用应用的 Helper(不进程序坞),其他平台用应用自身
└─ 每 5 秒检查一次,连续 3 次无响应或进程退出就重新找或重新启动
↓
ta serve(只听 127.0.0.1,端口和 token 跨重启不变)- 自己启动的
ta serve随应用退出;有任务在运行时先询问。终端里启动的不受影响。 - 从访达或程序坞打开时 PATH 很短,这里取登录 shell 的 PATH 传给
ta serve,Agent 才能找到 git、node 等命令。 - 关闭窗口时,macOS 和 Windows 继续在后台运行(程序坞或托盘唤回),Linux 退出(不少桌面环境不显示托盘)。
- 工作台的浏览器用
<webview>显示网站(src/embedded-browser.ts;preload 告诉 Web 客户端可以这样做):拒绝被嵌入的网站也能打开,登录可用并保留在独立分区(persist:ta-browser),与 Web 客户端隔离。只有 ta serve 的页面能放入 webview,且强制关闭 Node、preload 和嵌套 webview;网页只能去 http(s),除全屏和写剪贴板外没有任何权限,对网站自称 Chrome。带窗口特性的弹窗(需要window.opener的登录)在同一分区里开成窗口,新标签在当前视图打开,邮件交给邮件应用。右键菜单(链接、图片、编辑、后退前进、检查)和快捷键 Cmd/Ctrl+R、F5、Cmd+[ / ]、Alt+← / →、F12 作用于网页,而不是 Ta。 - Agent 经 preload 的
debugWebview用 DevTools 协议操作这个网页(EmbeddedBrowser.debug):只认 ta serve 页面在主框架里发来的请求,目标必须是该页面自己的 webview;只放行作用于网页本身的域(Accessibility、CSS、DOM、DOMSnapshot、Emulation、Input、Log、Overlay、Page、Runtime),拒绝 Network、Storage、Target、Browser 以及读文件、下载、绕开导航守卫的命令;附加调试器时开启焦点模拟,单条命令最多 30 秒。Agent 操作期间及之后 10 秒,窗口和网页不做后台节流,否则窗口在后台时每次等待都要拖到一秒以上。 - 导入登录状态(
src/browser-import.ts,macOS 和 Windows):从Local State列出 Chrome、Edge、Brave、Arc、Vivaldi、Chromium 有 Cookie 的个人资料(页面只拿到名字和 id,拿不到路径);用户选好后由应用弹出原生对话框确认,页面画不出这个对话框。确认后才读密钥:macOS 用security读钥匙串里的“… Safe Storage”,系统会再问一次是否允许;Windows 用 PowerShell 的 DPAPI 解开Local State里的密钥。复制一份 Cookies 数据库再用 Node 的node:sqlite只读打开,取最近使用的 2 万条,解密后写进persist:ta-browser;会话 Cookie 补 7 天有效期以便重启后仍在。不读密码和浏览记录,值不离开主进程。Chrome 127 起 Windows 上的应用绑定加密(v20)只有 Chrome 自己能解,计数后跳过,需在网站上重新登录。 - 日志在系统的应用日志目录下的
serve.log,菜单「帮助」里可以打开。 - 自带 Cua Driver(MIT,
scripts/cua-driver.ts里固定的版本和 SHA-256),启动ta serve时用TA_CUA_DRIVER指给它,内置扩展 ta-computer-use 就能在后台使用桌面应用,不需要另装。macOS 上保留 Cua 的签名和公证(signIgnore),授权属于 CuaDriver.app,Ta 更新后不用重新授权;macOS 用通用二进制的 CuaDriver.app(约 88 MB),Windows 带cua-driver.exe和光标主题程序(约 42 MB),Linux 带cua-driver、光标主题程序和 Wayland 辅助扩展(约 63 MB)。复用终端里启动的 ta serve 时,它不知道这份,用的是用户自己装的。
开发
bash
bun run build --filter=@celljs/ta # 先构建 apps/ta(在仓库根目录)
cd apps/ta-desktop
bun run setup # 下载 Electron(bun install 不运行它的安装脚本)和 Cua Driver(到 vendor/)
bun run start
bun run test
bun run package # 打包到 release/,不生成安装包
bun run package:mac # dmg 和 zip;没有 CSC_LINK 时是 ad hoc 签名性能
bash
bun run package
DIR=$(mktemp -d); bun bench/fake-model.ts $DIR &
bun bench/measure.ts $DIR release/mac-arm64/Ta.app/Contents/MacOS/Ta # 输出 JSON用独立的 agent 目录和假模型,测冷启动(ta serve 就绪、界面可输入)、空闲 15 秒后各进程的 RSS 与 macOS 物理内存(footprint)、空闲 30 秒的 CPU,以及一次约 8 秒的流式回答(1500 段增量)期间的 CPU 与内存峰值。2026-11-11 在 M4 Pro 上三次运行:
| 指标 | 结果 |
|---|---|
| 冷启动 | ta serve 就绪 0.86–0.96 s,界面可输入 1.14–1.40 s |
| 空闲内存(RSS 合计) | 590–660 MB:主进程约 172、渲染约 162、ta serve 124–142、GPU 约 90、网络约 43 |
| 空闲内存(footprint 合计) | 360–635 MB,波动主要在 GPU 进程的图形内存 |
| 空闲 CPU | 合计 0.6–0.8%(主进程的健康检查与任务轮询、ta serve 各占一半) |
| 流式回答 CPU | 合计约 11–12% 单核:ta serve 7%、渲染 2.3%、GPU 与主进程各约 1% |
已知限制
- 还没有自动更新:需要发布渠道和代码签名证书。
- 自带的 Cua Driver 不含
cua-driver-uia.exe:它的 uiAccess(操作以管理员身份运行的窗口)要求安装在 Program Files 下,而安装包是按用户安装的。Windows 和 Linux 的安装包还没有在真机上验证过。 - Electron 没有浏览器的语音识别服务,分身的语音输入在桌面应用里不可用;朗读可用。