
Cua Driver SDK 的 Rust 单一事实源与 UniFFI 评估一份完整的技术决策与落地复盘【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code导读本文以 Cua Driver 仓库中的 sdk-rust-source-of-truth-and-uniffi-evaluation-plan.md 为核心系统梳理这条贯穿契约单一事实源 → 类型化运行时 → 语言 SDK 生成 → UniFFI 绑定评估的完整技术决策链。你将看到为什么 Rust 被选为唯一的事实源、如何用可验证的子集检查关闭契约与运行时之间的漂移、MCP 与 UniFFI 分别解决哪两个正交问题以及 Python 与 TypeScript 为何最终各自保留类型化 MCP 客户端而非切换到 UniFFI。读完本文你可以复现这套先证明、后重构、再测量、最后分语言做决定的评估方法论。说明本文所述方案在 PR #2341 及后续落地中已执行并产生了最终绑定决策2026-07-21。文中保留了完整的评估证据链并标注哪些内容已被后续决策取代方便读者对照当前仓库代码理解。一、背景为什么要做Rust 单一事实源1.1 问题手动维护契约与运行时的双份账本在发布 Python 与 TypeScript SDK 之前Cua Driver 面临一个典型的跨语言工程问题同一份工具契约工具名称、输入/输出类型、能力声明、平台可用性需要在Rust 运行时、Python 包、TypeScript 包三个地方各自维护。任何一处的字段、枚举值或边界条件漂移都会导致客户端调用了运行时不接受的参数这类难以排查的线上故障。文档给出的首要目标非常明确在发布语言 SDK 之前消除手动维护的契约/运行时账本manual contract/runtime bookkeeping。1.2 决策前提Rust 是唯一的执行引擎方案有一组不可动摇的约束前提它们决定了后续所有架构选择的边界Rust 是 GUI 执行、权限、策略、会话状态与平台集成的唯一所有者Python 与 TypeScript不重新实现任何 OS 自动化行为每个对外发布的类型化方法都必须映射到被线上实现实际消费的 Rust 输入/结果类型MCP 始终可用无论绑定方案如何演进实验性与运行时专用工具仍可通过通用调用generic call触达传输层不得自动重发任何改变状态state-changing的工具调用生成文件必须确定性、所有权清晰、原子替换、并在 CI 中做漂移检查平台可用性必须显式声明到工具、变体与字段级别能力与风险元数据只有一个权威声明点混合 MCP 内容只是传输信封类型化结构化结果不能抹掉文本、图片、拒绝refusal、降级结果或诊断信息。这些不变量在源码中可以直接对应到契约 crate 的设计。例如 cua-driver-contract/src/lib.rs 的模块注释明确写道本 crate刻意不含任何传输或平台实现原生 driver 仍是唯一执行引擎本包只拥有类型化输入/结果与版本化声明。1.3 起点状态PR #2341 与十四工具契约面文档确认的起点事实对应当时的 PR #2341cua-driver-contract声明了14 个类型化工具4 个会话生命周期工具 10 个可移植桌面循环desktop-loop工具manifest、Python 的参数类/方法、TypeScript 的接口/方法均由该 Rust 契约 crate生成两个语言 SDK 通过 stdio 与cua-driver mcp通信两个 SDK 都保留通用调用与tools/list访问以覆盖运行时发现与平台专有工具生成文件有所有权清单ownership inventory和真实的--check漂移模式语言包的公开类为 Python 的CuaDriver/AsyncCuaDriver与 TypeScript 的CuaDriver。在当前仓库中可以看到这份契约的最终形态契约 crate 的CONTRACT_VERSION 0.7.0、TOOLS_LIST_SCHEMA_VERSION 1、CAPABILITY_VERSION 1、MCP_PROTOCOL_VERSION 2025-06-18见 lib.rs生成的 manifest 位于 contract/manifest.json其头部的generated_notice明确写着 Generated by cua-contract-gen; do not edit by hand.并带有experimental: true、transport: mcp_stdio等元数据会话契约在 session.rs 中定义桌面契约在 desktop.rs 中定义。1.4 当时的平价parity现状文档实事求是地指出当时存在两类平价元数据平价已成立4 个会话工具通过ToolDef::from_contract从规范契约构建线上ToolDef元数据。源码ToolDef::from_contract见 tool.rs断言只有CanonicalRuntime模式的契约才能替换线上运行时 schema可移植子集契约不能直接顶替。行为/输出平价未成立10 个桌面契约是单独编写的portable_subset声明平台 crate 并未消费这些输入类型而是各自持有更丰富的ToolDefschema 与逐字段ArgsExt解析。当时没有任何测试证明每个可移植输入 schema 都能被对应平台 schema 接受。能力声明当时也有两个声明点运行时能力映射 每个ToolContract。已有测试比较两者但并未消除重复所有权。1.5 平台名册与运行时形态文档给出了当时基于注册的近似工具数且强调必须在各 OS 上用线上tools/list核验后才能作为发布证据不得固化为全局断言平台注册工具数约平台专有例子macOS48——Windows49debug_window_infoLinux52四个额外的指针原语这些名册刻意不同且持续演进因此不能写死。运行时形态的关键约束daemon 通过一个共享注册表与工具状态服务并发连接核心会话钩子、活动、元素 token 等使用进程级全局单例macOS 上 AppKit 表面要求主线程、权限身份绑定可执行文件。这些约束正是传输层决策的核心变量——直接嵌入 GUI 引擎会破坏这些假设。二、Fleet 先例UniFFI 能做什么、不能做什么方案引入 Fleet 作为 UniFFI 的参照系但结论是审慎的Fleet 能证明官方 UniFFI 目标Python、Kotlin、Swift、Ruby有强先例——其签入的生成器使用钉死的 Rust 依赖并支持再生成检查。Fleet 的 TypeScript 路径只能证明可行而非生产可用存在 Node N-API 路径uniffi-bindgen-react-nativeubjs/coreubjs/node加载原生cdylib与浏览器/WASM 路径但在被检视的树中TypeScript 不在 Fleet 主生成/检查脚本内、React Native 生成器未钉死在工作区、示例ubjs/*依赖用的是latest、浏览器 WASM 胶水依赖未签入的配置与生成。由此导出三条纪律并被最终决策继承不得把 Fleet 的 TypeScript 路径描述为可复现模板Cua Driver 自己的确定性--check流程应作为 TypeScript UniFFI spike 必须达到的标准Python 与 TypeScript 的 UniFFI 采用必须独立评估。三、目标架构与公开面文档给出了清晰的最终目标架构摘要如下Transport-free Rust ToolSpec typed inputs/results | -- live ToolDef 与 tools/list 元数据 -- 运行时类型化输入解析 -- 结构化结果校验 -- 可移植与平台富化投影 -- 契约 manifest -- 可选类型化 MCP 客户端生成 -- 可选UniFFI 实现导出 Agent 面 Codex / Claude / 其他 agent ---- MCP stdio ---- 原生 daemon ---- OS APIs Shell 自动化 shell ---- CLI 调用 ---- 原生 daemon ---- OS APIs 导入型应用 SDK 面 Python/TS 类型化客户端 ---- MCP stdio ---- 原生 daemon ---- OS APIs 或 语言绑定 ---- UniFFI ---- Rust daemon client ---- daemon 或需另行设计宿主运行时后 语言绑定 ---- UniFFI ---- 内嵌 Rust 引擎 ---- OS APIs无传输规范应放在现有cua-driver-contractcrate 或一个窄范围的兄弟rlib中所有平台 crate 必须能依赖这些类型而不导入 MCP framing 或公开 SDK 运行时。类型化层必须区分四类东西类型化命令输入类型化成功structuredContent载荷存在时稳定的类型化拒绝/错误可包含文本、图片、诊断的 MCP 内容信封。关键约束不得用一把大而全的适配器假装所有工具结果都是一个可序列化的成功对象。Agent 示例必须直接用现有 agent SDK 的 MCP 客户端否则会掩盖本方案赖以成立的区分。四、Workstream A0先关闭 PR #2341 的即时平价缺口这是整个方案的第一步也是先决条件在更大规模重构之前为 10 个桌面契约增加一个机械式子集-存在性测试。对每个声明平台与可移植桌面工具测试必须证明线上注册表包含该工具每个可移植属性存在于线上输入 schema可移植必填字段在线上保持必填可移植的类型、枚举/const 值、边界、封闭对象行为不比线上 schema 允许的范围更宽可移植注解与能力 token 与线上工具兼容刻意引入一个不兼容字段变更时测试必须失败。实现策略为 10 个契约用到的 schema 构造写一个小的 schema 子集检查器不声称通用 JSON Schema 蕴含implication遇到不支持的 keyword 就显式失败防止测试静默接受未被证明的情况。A0 验收门10 个可移植契约在 macOS / Windows / Linux 三套注册表上全部通过契约、平台ToolDef、注册表或能力映射任一变化都会触发工作流PR #2341 的描述准确表述为证明可移植输入/元数据兼容而非完整运行时行为平价。这在当前仓库的测试中得到印证契约 crate 内有大量断言可移植子集语义的单元测试例如desktop_contracts_are_explicit_portable_subsets断言 click、drag、get_cursor_position、get_desktop_state、get_screen_size、hotkey、invoke_menu、move_cursor、press_key、scroll、set_window_frame、type_text 的schema_mode都是PortableSubset见 lib.rs 测试而 cua-driver-core/tests/contract_parity.rs 则把CanonicalRuntime会话契约与线上注册表逐项比对描述、inputSchema、readOnlyHint、destructiveHint、idempotentHint、openWorldHint、capabilities。五、Workstream A让 Rust 成为真正的单一事实源A1. 建立无传输规范模型ToolSpecToolSpec模型必须包含规范名称与描述类型化输入类型化成功结构化载荷如适用稳定拒绝/错误形态注解与风险元数据唯一的能力声明逐平台工具存在性可移植 vs 富化暴露元数据schema 与契约版本。随后给 macOS、Windows、Linux 平台 crate 增加指向规范 crate 的新依赖保持依赖方向无环且无传输。对 schema 方言文档明确不预先承诺schemars先在 1 个会话输入与 1 个复杂桌面输入上跑 schema 方言 spike必须复现现有 required/optional、封闭对象、enum/const、可空性、默认值与边界语义且覆盖范围受限若做不到保留现有 schema builder同时让类型化 Rust 输入保持权威。当前仓库中输入类型定义于 inputs.rsToolInputtrait 通过schemars的 draft2020_12 设置生成 schemainline_subschemas true并经过normalize_schema后处理移除 title、补齐 properties/required/additionalProperties确保输出形态与线上 wire shape 一致。这里可以看到契约 crate 在 Cargo.toml 中同时依赖schemars 1.2.1与uniffi正是契约即生成源的具体体现。A2. 增加类型化运行时适配适配器需要依次完成把 MCP 参数反序列化为共享类型化输入 → 用该输入调用平台实现 → 在声明了结构化输出时校验/序列化稳定输出 → 保留现有 MCP 文本/图片/诊断信封 → 规范化稳定错误而不抹掉平台诊断。对已迁移工具线上ToolDef必须由其 spec 派生平台实现不得保留第二个 schema 字面量或逐字段ArgsExt解析器。起点是 4 个会话工具——它们的线上元数据已经来自规范契约风险最低。A3. 一次建模平台存在性与富化变体模型必须同时覆盖字段级富化与工具集分叉可移植桌面坐标 vs 窗口/元素定位平台专有字段与枚举变体Windows 专有工具如debug_window_infoLinux 专有低层指针原语。可移植 SDK 输入必须是更丰富类型化声明的派生投影而不是平行的手写 schema。若一个公共 union 会产生误导就定义DesktopClickInput与WindowClickInput等独立类型化命令但路由到同一实现族。这一点在契约 crate 中有直接印证inputs.rs 导出ClickInput、WindowClickInput、DragInput、WindowDragInput、HotkeyInput、WindowHotkeyInput等成对类型而 desktop.rs 中paste与select_text明确标记为macOS onlyplatforms vec![Platform::Macos]、SchemaMode::CanonicalRuntimelist_windows的成功输出 schema 则刻意保持窄只承诺z_index的可移植语义additionalProperties: true允许平台富化字段。A4. 证明一条分叉垂直切片迁移目标集合五类代表性工具start_session/end_session生命周期与结构化输出get_desktop_state图片 结构化元数据click可移植 vs 富化定位 破坏性注解get_window_state窗口聚焦富化至少一个在部分平台缺失的工具以证明存在性建模。切片完成的判定标准所有参与平台实现消费共享输入线上tools/list元数据由 spec 派生代表性结构化结果按声明 schema 校验通过MCP 信封保留文本与图片生成的 Python / TypeScript 方法通过可执行 fixture 测试。A5. 迁移当前 14 工具 SDK 面切片稳定后迁移 PR #2341 当前生成的 14 个方法删除这些工具的重复 schema 与 ad hoc 解析兼容别名只保留在 dispatch 层对tools/list与 SDK 隐藏。A6. 按工具族扩展按可独立评审的族迁移稳定工具剩余感知与桌面输入 → 窗口与应用生命周期 → 浏览器 → 录制与回放 → 光标/配置/诊断 → 剩余平台专有稳定工具。每个运行时名册条目必须归类为稳定类型化、实验通用-only、兼容别名、内部/隐藏——不编码一个全局工具总数。六、Workstream B把 Agent 集成与 SDK 分发分开6.1 Agent 集成基线推荐直接 MCP/CLI用各 agent 运行时现有的 MCP 客户端配置cua-driver mcp或让 shell 类 agent 用cua-driver call。此路径不需要生成的 Cua 语言客户端但要维护可运行的 Python Claude Agent SDK 与 TypeScript Codex SDK 示例作为证明。这是 O(1) 的 agent 协议面一个 MCP 服务器可被 N 个 MCP 运行时消费生成的客户端只是为应用增加 ergonomics不增加这些 agent 的互操作性。6.2 SDK 选项 1薄生成的 MCP 客户端最终被采纳继续生成 Python / TypeScript 类型与方法小原生传输直连 MCP stdio。它保留daemon 的权限身份与主线程所有权、进程与崩溃隔离、通用tools/list/tools/call逃生口、无额外客户端cdylib的小语言包、以及已有的可复现 TypeScript 生成/检查流水线。剩余手写语言代码只是少量传输、结果与门面模块。这是类型化远程客户端 SDK不是原生实现绑定。6.3 SDK 选项 2UniFFI 门面覆盖 Rust daemon client门控 spike构建平台中立 Rust 客户端拥有 MCP framing 与结果规范化仍启动/连接原生 driver daemon只通过 UniFFI 导出垂直切片 API。跑两个独立实验Python 走官方 UniFFI 支持Node TypeScript 走uniffi-bindgen-react-nativeubjs/node。TypeScript 实验从绿地可复现假设出发不沿用 Fleet 手写产物必须补齐精确钉死的生成器与运行时版本仓库内生成命令确定性自有输出与--check模式lockfile 与可发布包定义从 Cargo 编译产物解析宿主cdylib每个受支持平台/架构的隔离包测试。此 spike 不做本地桌面自动化的浏览器/WASM 打包。本选项的意义判据在 Rust 中实现一次应用客户端行为并分发到 N 个运行时。仅仅把 JSON-RPC framing 挪进 Rust 收益不足spike 必须识别出它真正拥有的共享生命周期、规范化、策略或服务器组合行为。6.4 SDK 选项 3UniFFI 内嵌/服务器实现独立提案面向想创建或内嵌 Cua 服务器的应用开发者。不得当作传输层的回退方案。单独提案必须先消除或显式托管进程级会话与元素 token 状态单注册表假设与并发会话清理风险macOS AppKit 主线程所有权与权限身份Windows 交互式会话/UIAccess/前台/覆盖行为Linux 合成器、X11/Wayland 与会话总线集成宿主崩溃/运行时/取消耦合。6.5 B1测量 SDK 候选对选项 1 与每个选项 2 的语言 spike 记录生成与手写维护的源码行数按平台/架构的 wheel/npm 产物大小冷启动、首次调用与稳态只读调用延迟Python 同步/异步与 TypeScript 异步行为错误/拒绝/图片/结构化结果保真度通用运行时-only 工具访问安装与原生加载失败模式发布矩阵与 CI 时长变化当前超时/截止行为不暗示工具取消。6.6 B2分语言 SDK 决策门Python 与 TypeScript独立决策UniFFI 可能对 Python 通过、对 TypeScript 失败。采用选项 2 的条件实质性减少维护的 SDK 行为生成输出可复现且仓库内漂移检查所有生成器/运行时依赖钉死安装、启动、通用访问、错误保真不回归完整受支持产物矩阵通过MCP 仍作为公开边界可用。对 TypeScript 而言无法提供钉死的确定性生成与 CI 检查 自动拒绝无论运行时基准如何。否则保留选项 1。无论结果如何单一事实源工作都是完整且有价值的且两种结果都不改变直接 MCP/CLI 是推荐 Agent 集成这一结论。七、Workstream D取消与超时语义当时取消并非运行时能力dispatch 直接 await 工具serve 层截止时间不取消正在执行的动作单个工具各自含有限制重试/轮询行为。原则不要因发明取消而阻塞 A0 或初始类型化迁移。在宣称取消平价或采用 UniFFI 传输前做一个显式决策实现调用方取消——把 token/deadline 穿过Tooltrait 与类型化适配器定义安全中断点与动作完成语义或文档化 best-effort 客户端截止——停止等待但不取消进行中的工具。无论哪种传输层永不自动重发模糊的状态变更请求测试必须区分传输重发、调用方取消与单次工具调用内的受限重试。八、验证计划契约与源码测试A0 子集/存在性平价覆盖全部 10 个可移植桌面契约每个生成的稳定方法映射到恰好一个Rust spec每个已迁移平台工具消费共享输入类型已迁移工具无第二个ToolDefschema 或ArgsExt解析器能力只有一个声明点逐平台存在性与可移植投影机械派生生成的 manifest 与 SDK 输出确定性、零漂移。运行时行为测试最小合法输入走与 MCP 相同的类型化适配器非法类型、缺失字段、未知字段、边界、枚举产生稳定错误代表性结构化结果按成功 schema 校验文本、图片、拒绝、验证元数据、降级结果与平台诊断原样存活兼容别名调用规范实现但保持隐藏截止/取消测试只断言 Workstream D 实际实现的语义。平台测试三平台编译并跑注册表/schema 平价测试线上名册证据取自精确源码修订fixture 支撑的调用覆盖会话生命周期、桌面感知、指针、键盘、窗口状态不在 CI 中做失控操作平台专有工具与字段只出现在声明处会话捕获范围auto/window/desktop在通用调用与每种生成绑定选项下强制相同策略行为。包测试构建隔离 Python wheel 与 npm tarball安装进不含仓库相对导入的空消费者验证精确原生产物来源与加载路径每个候选跑同一套公共 MCP fixture 套件断言公共类名拒绝陈旧的Client导出断言包内容不含陈旧生成/平台产物。九、CI 与发布接线契约/SDK 工作流必须在以下变更时触发规范 crate 与生成 manifest平台ToolDef、注册表与迁移实现代码共享结果/内容信封与能力声明生成器与所有权清单Python、TypeScript、原生产物与打包代码。必需 jobRust 格式化 契约/单元测试三平台注册表的 A0 子集/存在性检查已迁移工具的类型化运行时与结构化输出测试确定性生成检查模式Python 同步/异步测试与隔离 wheel 消费TypeScript typecheck/测试与隔离 npm 消费UniFFI 生成/产物 job 仅在 spike 或被采纳绑定存在时运行。比较期间不发布任一绑定选项。十、交付序列保持提交可独立评审test(cua-driver): prove portable desktop contracts match live schemasrefactor(cua-driver): collapse tool capability ownershiprefactor(cua-driver): introduce transport-free typed tool specsrefactor(cua-driver): route session tools through typed runtime adapterrefactor(cua-driver): migrate divergent desktop vertical slicerefactor(cua-driver): migrate current portable desktop SDK toolstest(cua-driver): spike UniFFI Python Rust daemon clienttest(cua-driver): evaluate reproducible UniFFI Node bindings决策提交删除被拒 spike 或采纳其生产接线后续 PR按族迁移稳定工具PR #2341 合并前必须先落地 A0 并更新其描述以陈述精确保证完整类型化运行时迁移可随后进行不得把当前 manifest 表述为完整运行时平价。十一、完成标准PR #2341 平价缺口关闭每个可移植契约被证明存在于各声明线上平台 schema 且被接受CI 对每个相关契约/运行时变更重跑该证明PR 描述区分子集兼容与行为平价。当前 SDK 的类型化 Rust 单一事实源完成14 个生成方法全部使用被线上实现消费的 Rust 输入/结果迁移工具无重复 schema 或 ad hoc 字段解析线上元数据与代表性结构化输出通过平价测试能力单一所有者三注册表通过声明支持检查改一个 Rust 字段会在每个消费者处引起编译失败或确定性生成 diff。UniFFI 评估完成目标产品显式类型化 daemon client 或内嵌/服务器 SDK直接 Agent MCP 示例独立于每个生成客户端薄类型化客户端与各语言 UniFFI 原型对选定 SDK 目标通过等价行为与产物测试记录测量与平台矩阵Python 与 TypeScript 决策独立成档任何被采纳的 TypeScript 流水线钉死、可复现、CI 检查所有被拒 spike 代码删除。更广的类型化 SDK 覆盖完成每个公开运行时工具要么带显式平台支持的类型化要么有意归类为 generic-only任何受支持 OS 上不得存在未分类的tools/list条目。十二、主要风险与缓解风险缓解可移植声明在重构完成前漂移先落地 A0并在平台/运行时变更时触发派生 schema 方言与现有契约不同用方言复现 spike 门控schemars必要时保留有界显式 builder平台富化产生不可用的公共 union从同一 spec 族建模独立类型化命令与显式逐平台存在性混合 MCP 结果放不进单一类型化输出只类型化结构化载荷与稳定错误保留内容信封迁移范围膨胀到大平台文件从会话工具起步证明一条分叉切片再按族迁移TypeScript UniFFI 继承不成熟工具链当绿地处理全量钉死要求确定性生成与 CI 检查原生客户端库使分发复杂化测全矩阵收益不实质化就保留薄 MCP宣称取消但未实现完成 Workstream D 或文档化非取消截止语义直接内嵌破坏权限或全局状态假设排除在本方案外要求单独的 OS 特定证明非目标清单同样重要不在 Python/TypeScript 中重新实现 GUI 动作不删除 MCP 服务器或 CLI比较期间不发布实验包不承诺浏览器本地桌面自动化的 WASM不在 SDK 生成工作中直接内嵌 GUI 引擎不在类型化地基与决策门稳定前迁移每个运行时工具。十三、评审处置Review disposition文档记录了一次独立的第三方评审Claude Code Opus 对仓库、原计划、三平台注册表、当前 SDK 生成器与 Fleet UniFFI 产物并纳入其 must-fix 发现Fleet TypeScript 描述为可行但未可复现接线修正线上工具数与平价声明A0 关闭即时可移植子集缺口能力所有权与平台 crate 依赖显式化schema 推导门控而非假设类型化结构化输出与混合 MCP 内容分离取消视为缺失的运行时设计工作UniFFI 采用分语言进行直接 MCP/CLI 保持 Agent 基线薄 MCP 与 UniFFI 仅对导入型应用 SDK 比较。十四、最终落地与绑定决策2026-07-2114.1 实现结果实施保留 MCP/CLI 作为公开 Agent 边界并让类型化 Rust 成为当前 14 工具类型化客户端 SDK 面的来源Schemars 派生的 Rust 输入与结构化输出类型确定性生成签入的 manifest 与 Python/TypeScript 源码4 个会话工具直接消费这些类型每个 OS 桌面分支在动作前反序列化共享可移植投影其更丰富的 window/element 路径仍对通用 MCP 调用者开放SDK 路径的成功结构化载荷通过线上注册表中的共享 Rust 输出类型反序列化MCP 内容信封不变包括图片、文本、诊断与错误10 个可移植 schema 在 Linux、macOS、Windows 上被检查为各线上平台 schema 的逻辑子集未知 schema keyword 使蕴含检查器封闭失败14 个工具的能力 token 全部从契约解析遗留运行时能力映射现在只覆盖非 SDK 工具。14.2 实测类型化 MCP 客户端基线数据取自本次检出、版本0.10.0、包发布之前候选维护源码生成源码通用包Python MCP SDK676 行331 行10,666 字节纯 Python wheelTypeScript MCP SDK278 行275 行4,923 字节 npm tarball解压 19,506 字节两个客户端都保留通用call_tool访问与完整 MCP 内容/结果信封其可执行 fixture 套件覆盖初始化、类型化调用、错误、图片与通用运行时-only 调用。14.3 UniFFI 仓库 spike比较使用的是签入的 Fleet 先例commitc2ba0b5e94d0f2c06d0c7efb0913803ca0a616af而非再建一个相同工具链的一次性绑定实现Fleet 证明官方 UniFFI Python 绑定可以生成、漂移检查并在宿主原生 cdylib 上运行Fleet 也证明 Node 与浏览器 TypeScript 生成通过uniffi-bindgen-react-native技术可行——不限于 WASM签入的 Fleet TypeScript 根目录约 4,777 行生成代码220 KiB需要ubjs/core、ubjs/node与并置的原生 cdylib且不在 Fleet 钉死的四语言生成/检查脚本内可运行示例把运行时/构建依赖声明为latestFleet Python 生成根约 5,675 行228 KiB对应更大的 API。这些源码规模是工具链证据不是同类 API 规模基准。14.4 当前 PR 的包决策Python本 PR 保留类型化 MCP 客户端。UniFFI 本身通过可行性与可复现性门但 Cua Driver 还没有带实质应用行为的共享 Rust daemon client在今天传输上做门面会在 10.4 KiB 通用 wheel 上增加逐平台逐架构 cdylib 与原生加载失败模式而仍然只是与现有 daemon 对话。TypeScript本 PR 保留类型化 MCP 客户端。当前先例失败于自动采纳门生成在钉死的漂移检查脚本之外、运行时包未钉死、消费者必须定位宿主原生库。技术可行尚不构成可复现的 npm 发布流水线。此包决策不否定UniFFI 内嵌/服务器 SDK也不声称生成客户端提升 MCP 互操作性——MCP 能力 agent 应直接连接如 agent 示例所示。后续 SDK 提案必须首先决定其消费者需要共享 Rust daemon client 还是内嵌/服务器实现再针对该目标评估 UniFFI。不保留任何被拒 UniFFI spike 代码。冷启动与稳态对比有意不声称两个原生候选都未通过证明有必要做发布矩阵原型的打包/可复现预门。当存在可复用的 Rust daemon client 或受支持的内嵌宿主时再重新考虑 Python当钉死生成、确定性 CI 检查与原生包加载落地到仓库后再重新考虑 TypeScript。十五、与当前仓库代码的对照最终落地在当前仓库中有完整闭环证据可逐项验证方案要素仓库落点无传输契约 crate工具名、schema、能力、注解、平台cua-driver-contract/src/lib.rs类型化输入ToolInput schemars 生成 规范化cua-driver-contract/src/inputs.rs类型化输出ToolOutput、拒绝信封、广告输出 schemacua-driver-contract/src/outputs.rs会话契约start/get/list/get_state/escalate/endcua-driver-contract/src/session.rs桌面契约可移植子集 平台富化cua-driver-contract/src/desktop.rs生成 manifest勿手改contract/manifest.json契约→线上ToolDef桥from_contractcua-driver-core/src/tool.rs契约/注册表平价测试cua-driver-core/tests/contract_parity.rsUniFFI 绑定配置cdylib 名cua_driver_sdkcua-driver-contract/uniffi.toml、cua-driver-sdk/uniffi.tomlPython 包原生CuaDriver.connect/create等入口cua-driver/python/src/cua_driverTypeScript 包qwen-code/cua-sdkcua-driver/typescript/src版本说明文档正文与实测数据针对0.10.0阶段当前仓库中 TypeScript 包的版本号已演进package.json且why-cua-driver-uses-mcp-instead-of-uniffi.md提到后续 RFC 2447 会把 MCP 调整为下游 SDK 消费者——即SDK 仅是 daemon client的表述已被取代。阅读本文时请以最新代码为准本文聚焦的是决策方法与评估门这一可复用资产。结语可复用的工程方法论回顾这条决策链真正可迁移到其他项目的是这套纪律先证明再重构A0 子集测试先于一切大规模迁移把平价精确限定为元数据/输入子集兼容拒绝提前声称行为平价单一事实源 机械派生类型、schema、能力、存在性全部从 Rust 一处派生改一个字段要么编译失败要么产生确定性 diff传输与 SDK 面分离MCP/CLI 解决 agent 互操作UniFFI 只回答多语言如何调用同一 Rust 实现两者正交各司其职分语言决策不搞一刀切Python 与 TypeScript 各自按钉死依赖、确定性生成、漂移 CI 检查等硬门独立裁决不越界直接内嵌引擎、WASM 本地自动化、取消语义这些未成熟能力明确列入非目标或独立提案不强行打包进当前版本。这套方法论的产物是当前仓库中可编译、可测试、可生成、可漂移检查的完整闭环——它比任何单一技术选型结论都更有参考价值。【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考