Skip to content

playwolf719/funcode

Repository files navigation

FunCode

简体中文 | English

FunCode 是一个基于 Tauri 2 的桌面工作台。它通过由 Rust 管理的 Node.js Sidecar 集成官方 Cline SDK。WebView 不会直接获得 Shell 访问权限,命令与事件通过一套精简、带版本控制的 JSON Lines 协议传输。

界面预览

FunCode 任务工作台 FunCode 项目文件浏览器

架构

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

环境要求

常用命令

# 仅启动 Web UI
npm run dev

# 检查 WebView 与 Sidecar 的类型
npm run typecheck

# 生成当前目标平台的 Sidecar 二进制文件
npm run sidecar:build

# 启动完整桌面应用
npm run tauri dev

# 构建生产环境前端资源
npm run build

npm run tauri 包装脚本会在调用 Tauri 前准备好 Sidecar,因此当 Tauri 开始等待开发 URL 时,Vite 可以立即启动。若 Sidecar 源码没有变化,则会复用已有二进制文件。生成的文件遵循 Tauri 要求的目标三元组命名方式:

src-tauri/binaries/testcline-agent-<target-triple>[.exe]

通信协议

Host 命令包括:

  • system.ping
  • task.start
  • task.send
  • task.delete
  • task.list
  • task.config.save
  • workspace.files.list
  • task.abort
  • approval.resolve

Sidecar 事件包括:

  • system.ready and system.status
  • task.status for per-task running, idle, and failed state
  • command.result
  • agent.event
  • approval.requested
  • sidecar.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。

About

FunCode is a Tauri 2 desktop workbench that embeds the official Cline SDK in a Rust-managed Node.js sidecar. The WebView never receives direct shell access: commands and events cross a small, versioned JSON-lines protocol.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages