FunCode 是一个基于 Tauri 2 的桌面工作台。它通过由 Rust 管理的 Node.js Sidecar 集成官方 Cline SDK。WebView 不会直接获得 Shell 访问权限,命令与事件通过一套精简、带版本控制的 JSON Lines 协议传输。
Tauri WebView
└─ invoke / events
└─ Rust host (process lifecycle and native boundary)
└─ stdin / stdout JSONL
└─ Node sidecar
└─ @cline/sdk / ClineCore
当前实现以本地模式运行 ClineCore。每个任务都是一个独立对话,并拥有自己的工作区和审批模式:Ask first 会在每次调用工具前请求确认;Auto 会自动批准内置工作区工具,但对未知或外部工具仍会请求确认;Full access 则无需确认即可运行所有工具。
.
├── packages/
│ └── protocol/ Host 与 Sidecar 共享的消息协议
├── sidecar/
│ ├── scripts/ 打包及平台二进制构建脚本
│ └── src/
│ ├── cline/ ClineCore 任务运行时与审批桥接
│ ├── ipc/ JSONL 输出与序列化
│ └── main.ts Sidecar 进程入口
├── storage/ 运行时任务和对话持久化
├── src/
│ ├── features/
│ │ ├── approvals/ 工具审批界面
│ │ └── chat/ Agent 事件渲染
│ ├── services/ Tauri IPC 客户端
│ ├── main.ts 桌面端 UI 协调器
│ └── styles.css
└── src-tauri/
├── binaries/ 生成的目标平台 Sidecar 二进制文件
├── capabilities/
├── src/
│ ├── lib.rs Tauri 应用初始化
│ └── sidecar.rs Sidecar 生命周期与事件桥接
└── tauri.conf.json
- Node.js 22 LTS(
.nvmrc已锁定开发运行时版本) - Rust stable 与 Cargo
- Tauri 对应平台的依赖环境
# 仅启动 Web UI
npm run dev
# 检查 WebView 与 Sidecar 的类型
npm run typecheck
# 生成当前目标平台的 Sidecar 二进制文件
npm run sidecar:build
# 启动完整桌面应用
npm run tauri dev
# 构建生产环境前端资源
npm run buildnpm run tauri 包装脚本会在调用 Tauri 前准备好 Sidecar,因此当 Tauri 开始等待开发 URL 时,Vite 可以立即启动。若 Sidecar 源码没有变化,则会复用已有二进制文件。生成的文件遵循 Tauri 要求的目标三元组命名方式:
src-tauri/binaries/testcline-agent-<target-triple>[.exe]
Host 命令包括:
system.pingtask.starttask.sendtask.deletetask.listtask.config.saveworkspace.files.listtask.abortapproval.resolve
Sidecar 事件包括:
system.readyandsystem.statustask.statusfor per-task running, idle, and failed statecommand.resultagent.eventapproval.requestedsidecar.log
Sidecar 将标准输出保留给 JSONL 协议消息。运行日志写入标准错误,并以结构化日志事件的形式桥接至桌面端。
开发环境中,FunCode 会在项目根目录创建被 Git 忽略的 storage/ 目录。打包后的应用会使用操作系统的应用数据目录。设置 TESTCLINE_STORAGE=/absolute/path 可覆盖默认位置。
storage/
├── tasks/
│ └── <task-id>/
│ ├── task.json 任务工作区与模型配置
│ └── events.jsonl FunCode 专属通知与生命周期事件
└── cline/
├── db/sessions.db Cline 会话元数据与查询索引
└── sessions/<session-id>/
└── <session-id>.messages.json
模型对话的权威数据源
FunCode 不会重复保存用户或助手消息。应用启动时,任务历史会从 Cline 持久化的会话消息中映射;events.jsonl 仅记录取消、失败通知等应用专属事件。旧版 conversation.jsonl 文件不会再被读写。tasks/ 索引还会保存在首次 Cline 会话开始前写入的配置;若要移除该索引,需要将这些草稿改为临时数据,或将草稿及 FunCode 专属通知迁移到由 Cline 管理的元数据中。
API Key 会按模型连接以明文形式存储在 Cline 的 db/sessions.db 数据库中的 funcode_connection_credentials 表里。使用相同供应商、模型与 Base URL 的新任务可以复用已保存的凭据。任务元数据、任务列表响应及恢复后的前端状态都不包含该凭据。Sidecar 确认存在匹配凭据后,API Key 输入框会显示为已保存的掩码状态。
- 前端不具备 Tauri Shell 插件权限。
- Sidecar 的启动、写入、停止及事件转发均由 Rust 管理。
- 持久化的 API Key 不会返回给 WebView,也不会写入任务元数据或 Cline 会话清单。但它们会以明文形式存储在本地 Cline SQLite 数据库中,因此能够访问该数据库文件的人也能获取这些凭据。
- 每个任务都限定在配置的绝对工作区路径内。
- 每个任务可独立选择 Ask first、Auto 或 Full access 审批模式。
若用于生产环境,还应补充原生工作区选择、工作区路径规范化、签名发布二进制文件以及各平台 CI。

