Skip to content

feat(google-gmail): 通过构建期依赖打包接入 gog - #129

Merged
GaoWeiLiuXD merged 4 commits into
makecindy:mainfrom
GaoWeiLiuXD:feature/gmail-gog-build-dependencies
Sep 21, 2026
Merged

GaoWeiLiuXD merged 4 commits into
makecindy:mainfrom
GaoWeiLiuXD:feature/gmail-gog-build-dependencies

Conversation

@GaoWeiLiuXD

@GaoWeiLiuXD GaoWeiLiuXD commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

What changed / 改了什么

仅修改 google-gmail 及 Gmail 专属测试,版本 1.2.0 → 1.3.1,最低 Cindy 0.1.82

  • 使用 gmail_accountsgmail_schemagmail_run 替换旧 gmail 业务实现;固定上游 gog v0.39.1,不修改 gog 源码。
  • 新增 binary-dependencies.json:构建时下载并校验六平台官方产物,再以固定 Brotli 编码收集到同一个完整 .cindy 包。Git 只包含源码、声明、哈希和许可证,不包含 gog 二进制。终端用户无运行时下载或工具链依赖。
  • Host 沿既有 OAuth 路径保管账号和刷新令牌,只向指定 Node run 请求注入所选账号的短期 access token。原 network 配置完全保留,包括 clientId、clientSecret、secret key、scope;不迁移或清空存量账号。
  • 插件内支持多个账号、逐账号失效提示、重连/断开、昵称;昵称只存插件 KV,无默认账号。多个账号必须明确选择;昵称只辅助模型选择,执行仍使用稳定账号 ID。
  • 不支持所需运行接口的旧客户端明确提示升级,账号列表保留。没有客户端、服务端、其他 Google 插件或公共构建流程改动。

Why / 为什么

复用成熟 CLI 的 Gmail 能力与参数发现,避免插件反复实现邮件和附件 API;同时实际验证已合并的声明式二进制依赖打包流程,避免向源码仓提交大二进制。

Checklist

  • Reviewed the complete diff — no credentials, tokens, authorization codes, real user data, unrelated generated files, or node_modules. OAuth 应用身份声明与主线完全相同,无新增凭证值。
  • ghost.json declares only capabilities actually used (direct capability fields / autonomous network hosts / secrets / Node runtime); any new capability is justified in this PR description.
  • Tools with irreversible external side effects handle failures as not executed / executed / unknown; unknown results require checking before retrying.
  • Tool descriptions, Manual and settings copy match the implementation.
  • Bumped ghost.json.version above main.
  • Cindy device verification / Cindy 实机验证 — 已在 Cindy 0.1.85 Beta 实际设备上完成 Gmail 1.3.1 安装包验收,满足最低版本 0.1.82;实测包标识、校验和及验收后的文案修正范围见下文。
  • minCindyVersion 没有降低或删除;使用已包含 OAuth Node 注入和账号选择能力的 0.1.82
  • 非新插件,provisioning.json 与 audience 不变。
  • Ran localization checks.
  • src/ 构建产物;node/gog.cjs 是手写薄适配器,不是生成的 vendor 代码。
  • Updated THIRD-PARTY-LICENSES.txt for gog and Lucide icons.
  • Every commit is signed off (git commit -s).

Tool declaration changes / 工具声明改动

移除旧 gmail 工具及其 action 参数,不保留旧 API 适配分支。模型先调用 gmail_accounts 匹配邮箱/昵称,存在歧义则询问,再通过 gmail_schema 获取规范命令路径与参数,最后调用 gmail_run。附件输出需明确本地任务目录路径;只读会话禁止落盘,且向 gog 传递 --readonly

CLI 可发现的部分命令需要比既有 OAuth scope 更大的权限;本 PR 不扩大 scope,这类操作仍由 Google 拒绝,不能静默更换账号或自动扩权。

Verification / 验证

  • 已完成实机验证的包:google-gmail-1.3.1-pr129-0b5c03e.cindy,61,687,751 bytes;SHA-256 edd635ec328099cab57e616f1102d9843f8c7cee6df56596af45f5c83343535c。此证据对应下方的 0b5c03e 包,不冒充后续提交的包哈希。
  • 实机验收后的修正仅涉及 settings.js 的连接结果未知提示与专属回归测试:异常和未知错误要求先核对账号状态,补齐四语言文案及英文回退。没有修改 gog、依赖、OAuth 配置、凭据读写、网络请求、账号选择或升级路径。新增 VM 执行测试覆盖响应丢失、HTTP 503、JSON 损坏、空响应、未知错误、正常成功及取消;没有声称这些故障在真实账号上逐项注入测试。
  • 验证包来源:CI run 35569684437,PR head 0b5c03ef94a09940cabc46ddcb9906c7a4593374,buildCommit a68f28f70cf06f0133d5a7c37831c7d33d3931ab。下载及桌面副本 SHA-256 均与 CI 校验文件一致;该 run 的测试、打包和上传步骤均已通过。
  • 仓库最终门禁:localization、provisioning、publish-workflows、binary-dependencies 与 Gmail 回归通过。
  • Manifest/package source 契约会读取 Git HEAD,因此在完整暂存内容的隔离 Git fixture 中验证:6/6 通过,基线 94f489a59cffb6a14f7b7f117eec51620c0483f5。其余门禁和 Gmail 回归34项通过;可选真实下载用例单独显式执行。
  • 六个 archive SHA-256 均与上游 GitHub release asset digest 一致。
  • check-source-size.mjsgit diff --check 通过;无 gog payload 进入 Git。
  • CINDY_GMAIL_BINARY_SMOKE=1 node --test .tests/google-gmail-packaging.test.mjs:2/2 通过,真实下载六平台官方 archive,调用仓库统一打包器;逐个校验压缩及解压哈希,本机 darwin-arm64 启动随包 worker 并取得 Gmail schema(含 attachment/send)。未读取真实账号、安装插件或操作用户 Beta。
  • 本地首轮流程验证包:61,687,370 bytes(58.83 MiB),42 项,解包61,743,055 bytes;SHA-256 070ea2b6c288994e45e77f50bc5840e1fc234a29b26cc4ec6596a73ebc6d4753。包内24个插件源码/资源文件逐字节匹配提交 5ed44f038869d4647120533a5408eb375da338c7。随后仅恢复主线已有的账号查询错误分类,并补回归;最终实机验收应使用最新 head 的 CI 验证包,不使用这个首轮包。
  • Review 修正后重新运行 Gmail/本地化回归:20通过、1个可选下载用例跳过;Manifest 契约6/6通过。依赖声明、worker和六平台固定字节未变化。
  • Review 修正:断开账号及连接账号结果未知时均要求先核对账号状态再决定是否重试;连接路径中的既有提示也已一并修正,不再仅关闭讨论而保留该提示。该批最终门禁42项通过、1项可选下载测试跳过,Manifest 契约6/6通过(包含在前述42项内);未重复下载不变的六平台依赖。
  • PR CI 的下载包与实机门禁分开;本次最终包实机验收已完成,补齐勾选后重新运行门禁。

Sensitive changes / 敏感变更

需要维护者人工 review。

  • 第三方可执行依赖:openclaw/gogcli v0.39.1,MIT;六平台 URL/原始 archive SHA 在依赖声明,压缩/解压 SHA 在 vendor/gog/binaries.json。上游二进制不改动。Lucide 六枚 SVG 附 ISC 条款。
  • 新增固定 node/gog.cjs 入口和 oauthSecret: gmail_accountrun 方法绑定。Worker 不是 OS sandbox;仅执行校验后的固定 gog 路径、使用 argv 数组而非 shell、过滤全局配置/账号/token 覆盖参数与外部 hooks/常驻命令;会话审批继续由 Cindy 负责。
  • access token 仅进入本次 gog 子进程环境,独立临时 home/config;不继承用户 gog/Google 凭证,不落盘、不回传、不记录日志。输出脱敏,超时/截断/进程失败保守返回 unknown。
  • 插件适配源码没有 evalnew Function、shell exec 或可执行 base64;唯一 spawn 为固定 gog。自主网络声明与原版完全相同;Gmail 数据面使用上游 Google Gmail API,tracking/watch 等外部服务路径不开放。
  • 跨平台只验证产物覆盖与字节,实际执行 smoke 仅覆盖本机平台;不能据此声称六平台已实机运行。
  • 发布前仍需核对分发链路体积限制。仓库允许 Node 包压缩128 MiB/解包256 MiB,但依赖指南仍记录旧 Server 64 MiB、客户端市场下载8 MiB限制的对齐事项;本 PR 不修改或绕过它们,CI 打包成功不等同于全渠道可分发。

仅迁移 Gmail 到 schema/run/accounts 工具,保留原 OAuth 配置并支持插件内多账号昵称。声明六平台固定版本与校验值,由仓库打包器收集 gog,不向 Git 提交二进制。

Signed-off-by: liugaowei <liugaowei@xd.com>
@greptile-apps

greptile-apps Bot commented Sep 21, 2026

Copy link
Copy Markdown

RetriggerConfidence Score: 5/5

未发现需要代码修改的阻断问题,但由于引入第三方可执行依赖、Node 子进程和凭证注入边界,仍必须由维护者完成人工敏感审查。

Summary

敏感变更,需要维护者人工 review:本 PR 引入固定版本的第三方 gog 可执行依赖、Node 子进程、OAuth access-token 注入以及新的 Gmail 工具契约。

  • 将旧 gmail 实现替换为 gmail_accountsgmail_schemagmail_run,支持明确的多账号选择与插件本地昵称。
  • 构建期下载并校验 gogcli v0.39.1 六平台官方产物,运行时再次校验压缩及解压哈希后启动固定可执行文件。
  • 凭证路径核查:ghost.json 通过 node.secretBindings 将所选账号的短期 token 仅注入 run;worker 使用隔离 HOME、过滤继承凭证与加载器环境,并在输出中脱敏 token。
  • 子进程边界核查:唯一生产 spawn 指向校验后的固定 gog 路径,使用 argv 数组而非 shell;命令和 flags 必须来自清洗后的 gog schema,并阻止账号、token、配置、外部 hook、tracking 和常驻服务入口。
  • 外联与 vendor 核查:声明的下载来源仅为 github.com/openclaw/gogcli 的固定 release;运行网络主机和 OAuth scope 未扩大。源码搜索未发现 evalnew Function、shell exec 或可执行 base64 blob。
  • 自上轮 review 后,连接请求的响应丢失、HTTP 错误、JSON 损坏、空响应和未知错误均改为提示用户先核对账号状态,再决定是否重试;对应回归测试覆盖四语言及英文回退。
  • 两条历史评论均已解决:账号服务错误现已分类并提供恢复操作;连接与断开操作的未知结果不再提示盲目重试。
Diagram
sequenceDiagram
  participant A as Agent
  participant P as Gmail main.js
  participant H as Cindy Host
  participant W as gog worker
  participant G as gog / Gmail API
  A->>P: gmail_accounts
  P->>H: Read OAuth account metadata
  H-->>P: Stable account IDs and status
  A->>P: gmail_schema(command path)
  P->>W: schema request (no token)
  W->>G: Inspect bundled gog schema
  G-->>W: Command schema
  W-->>P: Filtered commands and flags
  A->>P: gmail_run(account ID, command)
  P->>H: Node request with authAccount
  H->>W: Inject selected short-lived access token
  W->>W: Validate command, flags, workspace and binary hashes
  W->>G: Spawn fixed gog binary with argv
  G-->>W: Gmail result
  W-->>P: executed / not_executed / unknown
  P-->>A: Tool result
Loading

Reviews (4) · Last reviewed commit: "fix(google-gmail): 连接结果未知时先核对账号状态"

Comment thread google-gmail/main.js
Signed-off-by: liugaowei <liugaowei@xd.com>
Comment thread google-gmail/settings.js Outdated
Signed-off-by: liugaowei <liugaowei@xd.com>
Signed-off-by: liugaowei <liugaowei@xd.com>
@GaoWeiLiuXD
GaoWeiLiuXD merged commit 0b42e32 into makecindy:main Sep 21, 2026
6 checks passed
@GaoWeiLiuXD
GaoWeiLiuXD deleted the feature/gmail-gog-build-dependencies branch September 21, 2026 09:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant