Problem
Issue #25 / PR #27 已交付独立于 Agent 会话的 OPC App 控制平面,但当前产品入口仍是 Python 启动器 + loopback 浏览器页面。用户需要预装 Python、通过命令行启动,并在浏览器标签页中使用;它还不是一个可双击启动、带独立窗口和安装包的桌面应用。
ADR-0017 当时因缺少交互与分发证据而明确未采用 Tauri。现在用户已明确选择 Tauri 作为桌面产品方向,因此必须以新 ADR 记录边界变化,不能把桌面壳静默塞入既有 Python runtime,也不能复制 Snapshot、脱敏、Adapter 或治理规则形成第二实现。
Desired outcome
交付一个 Windows-first 的 Tauri v2 OPC 桌面 App MVP:
用户安装并双击 OPC App
→ Tauri 单实例启动
→ 启动随包、受管的 OPC Python sidecar
→ sidecar 仅绑定随机 loopback 端口
→ Tauri 窗口加载现有 OPC App UI
→ 退出窗口时可靠回收 sidecar
安装后的用户不需要系统 Python、Node、Codex、Claude 或 Kimi 会话即可打开控制台。现有 Python App、Dashboard、Plugin、Skills 和 CLI 入口继续兼容;File/Git knowledge 仍是唯一权威源。
Scope
- 新增 ADR,说明为何现在接受 Tauri、桌面壳与 Python sidecar 的责任边界、信任边界、失败恢复、升级/卸载和回滚策略。
- 在独立目录中新增 Tauri v2 工程,复用现有 HTML/CSS/JS 和
opc_app.py API,不复制 Snapshot、脱敏、项目清单或 Adapter 业务逻辑。
- 使用隔离、可重复的构建步骤把当前 Python App 与所需模块/静态资源打包为 Tauri external binary;生成的 sidecar 二进制和构建缓存不得提交仓库。
- Tauri Rust 层独占 sidecar 生命周期:
- 启动时使用
--no-open --port 0;
- 只接受 sidecar 输出的精确
http://127.0.0.1:<port>/;
- 等待健康可用后再展示主窗口;
- 启动失败、异常退出和 App 关闭时给出可解释状态并回收子进程。
- 启用单实例保护,避免两个桌面进程同时写同一
OPC_APP_HOME。
- 不向前端开放任意 shell、文件系统、网络、进程或命令执行能力;sidecar 只能由 Rust 层以固定程序和固定参数启动。
- 保持 loopback、Host、Origin、CSRF、CSP、no-CORS、无遥测和脱敏响应边界。
- 提供 Windows per-user NSIS 开发安装包和未签名状态说明;安装/卸载不能删除 App 状态、项目
.opc、File/Git knowledge、Git 历史、Agent 配置或可选 Mem0 数据。
- 提供开发、构建、运行、故障诊断、卸载和回滚文档,并更新中英文入口。
- 增加 Windows 自动化和独立安装态 QA;Linux/macOS 至少保证代码结构和边界文档不虚假宣称已支持。
Acceptance criteria
Non-goals
- 不把 Python Snapshot、治理、Memory 或 Adapter 逻辑重写为 Rust。
- 不加入聊天、模型循环、工具执行、Agent 编排或后台自治服务。
- 不在本 Issue 中实现自动更新服务器、远程访问、多用户、云同步或开机自启。
- 不在本 Issue 中交付 Microsoft Store、代码签名证书、正式发布通道或生产级自动更新。
- 不承诺 macOS/Linux 安装包;跨平台发行应在 Windows MVP 验证后另立 Issue。
- 不把系统 Python、Node、Cargo、Codex、Claude 或 Kimi 作为已安装 App 的运行依赖。
- 不提交生成二进制、私有签名材料、真实用户目录、项目数据、知识、日志或会话信息。
Dependencies and risks
Evidence
Problem
Issue #25 / PR #27 已交付独立于 Agent 会话的 OPC App 控制平面,但当前产品入口仍是 Python 启动器 + loopback 浏览器页面。用户需要预装 Python、通过命令行启动,并在浏览器标签页中使用;它还不是一个可双击启动、带独立窗口和安装包的桌面应用。
ADR-0017 当时因缺少交互与分发证据而明确未采用 Tauri。现在用户已明确选择 Tauri 作为桌面产品方向,因此必须以新 ADR 记录边界变化,不能把桌面壳静默塞入既有 Python runtime,也不能复制 Snapshot、脱敏、Adapter 或治理规则形成第二实现。
Desired outcome
交付一个 Windows-first 的 Tauri v2 OPC 桌面 App MVP:
安装后的用户不需要系统 Python、Node、Codex、Claude 或 Kimi 会话即可打开控制台。现有 Python App、Dashboard、Plugin、Skills 和 CLI 入口继续兼容;File/Git knowledge 仍是唯一权威源。
Scope
opc_app.pyAPI,不复制 Snapshot、脱敏、项目清单或 Adapter 业务逻辑。--no-open --port 0;http://127.0.0.1:<port>/;OPC_APP_HOME。.opc、File/Git knowledge、Git 历史、Agent 配置或可选 Mem0 数据。Acceptance criteria
npm/Cargo/Tauri 与 Python sidecar 构建依赖钉住版本并有 lockfile;构建产物、缓存、用户路径、签名材料和 runtime state 均被忽略且通过隐私扫描。opc_app.py/Snapshot/Adapter 契约;同一 synthetic fixture 下,桌面入口与 Python App 的 DTO、脱敏和状态语义一致。127.0.0.1的 OS 分配端口;远程 bind、非精确启动 URL、端口抢占和伪造 stdout 均 fail closed。.opc、File/Git knowledge、Git 历史、用户 Agent 配置或 Mem0 数据。python scripts/validate_repo.pypython -m unittest discover -s tests -p "test_*.py" -vpython scripts/privacy_scan.pyNon-goals
Dependencies and risks
Evidence
docs/adr/0017-independent-local-opc-app-control-plane.mdplugins/codex-opc-team/scripts/opc_app.pyplugins/codex-opc-team/scripts/opc_snapshot_service.pyplugins/codex-opc-team/assets/app/scripts/opc_app_admin.pydocs/opc-app.md