Skip to content

feat(chat): 支持展开思考后的手动翻译 - #7451

Open
Liuliuuu0710 wants to merge 5 commits into
makecindy:mainfrom
Liuliuuu0710:feat/manual-thinking-translation
Open

Liuliuuu0710 wants to merge 5 commits into
makecindy:mainfrom
Liuliuuu0710:feat/manual-thinking-translation

Conversation

@Liuliuuu0710

@Liuliuuu0710 Liuliuuu0710 commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

用户展开已结束的思考块后可手动点击「翻译」,在原文和译文之间切换;译文标注「机器翻译」。点击前显示原文发送至设置中辅助模型服务、产生额外用量的说明。Refs #7334。

这是拟提交维护者确认的首版范围:不增加全局自动翻译开关,不在展开或流式生成时自动请求。Desktop 与 Mobile 的独立思考块、工作过程内入口一起适配;译文只保留在组件临时状态,不改写原文、历史或引擎上下文。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

UI 变化

  • 引用的设计规范:docs/design-rules/DESIGN.md §3、§4、§5、§10、§11;沿用思考正文排版、标准 pill 按钮、语义颜色与 Light/Dark 主题。Mobile 文字遵循 apps/mobile/docs/mobile-design-guide.md §3,沿用卡片按钮并预留 44pt 点击空间。
  • macOS Electron 42.11.12 / Chromium 148 真实组件窗口目检通过:原文说明、译文标注、两处入口、切换,以及 360px 窄窗换行。使用合成内容和固定模型回包,没有调用真实翻译服务。
  • 完整截图与运行记录。
Light Dark
Light Dark

怎么验证的

评审后修复(b5630d61f1)

  • 修复 Desktop / Mobile 的语言 A → B → A 往返切换:每次绑定变化使用独立身份,旧的 loading 和迟到响应都不能重新生效,也不会自动重发请求。
  • 两端各补 2 个回归:旧响应在切回前完成、切回并重新手动请求后才完成。4 个新增用例在原实现上均失败,修复后全部通过;确认旧请求不会解除新请求的等待状态。
  • 本轮 Desktop 37 项、Mobile 65 项定向测试,以及两端 typecheck 通过。
  • 同步新增 Hook 的设计入口台账;CI 日志中的 runner / Git integration 直接失败均来自同一 GENERATED 区块未同步。重新生成后,设计台账 52 项自测通过,开发文档 10 项与 DCO 检查通过。
  • 本轮补跑专用 Electron 验证 node apps/desktop/scripts/fixtures/thinking-translation/verify.cjs <output>:THINKING_VISUAL_PASSED;Light / Dark 各 2 次手动请求,360px 窄窗无横向溢出,errors=[]。使用合成原文和固定模型回包,已回读译文与窄窗截图。
  • 常规 pnpm ui:check --changed --theme all 为 888 / 904 通过,整体未通过:4 个视频菜单场景超时,12 个 nightly-learning 场景缺少 Router 上下文;该工具将翻译组件列为 UNCOVERED,因此另跑上面的专用验证。针对两个视频菜单用例及 nightly-learning/default 执行 --compare origin/main,基线与当前分支均复现相同超时 / Router 错误。本 PR 不修改这些独立场景,也不把失败记为通过。
  • 本轮未修改 UI 样式或产品范围。Mobile 原生双主题截图、真实辅助模型翻译、原文切换、失败重试、旧主机提示的端到端验收仍待补齐;已有单测和桌面截图不能替代这些验收。内置翻译的产品范围仍待维护方确认。

GitHub CI(b5630d61f1)

本提交的 client-ci 已全部通过:Linux / Windows 各 4 个单测分片、两端汇总、runner / database checks、Desktop Git integration 与 verify-checks。DCO 和 PR 设计依据检查也已通过。此结果不替代下方仍待补齐的 Mobile 原生与真实服务验收,也不代表产品范围获批。

自动验证

首个提交基于 origin/main(4dcc5fa699)验证,共 234 项定向测试通过:

  • Desktop:89 项,覆盖辅助请求边界、重复点击、失败保留原文、过期响应、工作过程与远程路由。
  • Mobile:77 项,覆盖翻译切换、旧主机提示、账号/行复用隔离、传输和文字规范。
  • device-link:55 项;maker-shared:13 项。

实际执行:

pnpm --filter desktop exec vitest run src/main/maker-ipc/__tests__/thinkingTranslation.test.ts src/renderer/__tests__/thinkingTranslation.test.tsx src/renderer/__tests__/thinkingTextRendering.test.tsx src/renderer/__tests__/workGroupBlockLivePreview.test.tsx src/renderer/__tests__/makerTransportRouting.test.ts src/renderer/__tests__/emptyThinkingPlaceholder.test.ts --maxWorkers=2
pnpm --filter mobile exec vitest run src/__tests__/thinkingTranslation.test.tsx src/__tests__/mobileMakerTransport.test.ts src/__tests__/invokeTimeouts.test.ts src/__tests__/typographyTokenDiscipline.test.ts --maxWorkers=2
pnpm --filter @cindy/device-link exec vitest run src/__tests__/allowlist.test.ts --maxWorkers=2
pnpm --filter @cindy/maker-shared exec vitest run src/__tests__/thinkingText.test.ts src/__tests__/deviceLinkContract.test.ts --maxWorkers=2
pnpm --filter desktop run typecheck
pnpm --filter mobile run typecheck
pnpm --filter @cindy/maker-shared run build
pnpm --filter @cindy/device-link run build
pnpm check:i18n
pnpm check:i18n-glossary
pnpm check:dev-docs
pnpm check:dco
结果:全部通过。共享包 build 为 tsc --noEmit;i18n 保留存量非阻断告警。

手工验证

在 macOS 独立 Electron 测试窗口中加载当前分支真实组件、正式主题和字体。回读 Light/Dark 原文、译文、窄窗截图;无新增遮挡、截断、横向溢出或页面异常。切换译文不重复调用,展开不自动翻译。验收脚本随 PR 提交,可复跑:

node apps/desktop/scripts/fixtures/thinking-translation/verify.cjs /tmp/cindy-thinking-translation-visual
结果:THINKING_VISUAL_PASSED;两种模式各 2 次手动请求,errors=[]。

完整应用隔离启动返回 DESKTOP_DEV_VERDICT=ready,停留在登录页;没有代用户接受协议或改动账号。

未执行的验证

真实翻译服务、设备互联双机、Windows、Mobile 原生 Light/Dark 实机与完整 CI 未在本地验证。Mobile 本轮为同一 PR worktree 的类型检查和定向单测,没有启动 Metro,因此没有原生 build label 或手机实机验证结论。桌面窄窗截图不作为手机原生截图。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 只为辅助模型翻译请求增加专用指令;不修改主任务 Agent 的 system prompt 或原始 reasoning。
  • 新增同账号 maker:translate-thinking,复用辅助模型配置与账号代次保护。严格限制输入长度、并发与请求预算;不开放给共享访客、供应商分享或插件。
  • 旧主机拒绝新 channel 时保留原文并提示更新;不回落到控制端服务,不自动重放,不改变连接恢复。
  • 译文不落库;无数据库、服务端或 Mobile 原生 fingerprint 改动。存量插件影响:无。
  • 回滚本提交即可恢复原展示;无需数据迁移。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s)
  • UI 改动已在「UI 变化」注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已核对受影响的文档,行为变化涉及的旧结论已同步修订
  • 已确认测试结果或说明未执行原因

原工作区中其他功能的未提交改动已保留,本 PR 不包含它们。

2026-10-27:主干冲突与语言往返评审闭环

  • 已合入 main@7be4c57d7bdbed3e115685a5fb1aba61772497c7,本轮合并提交 68f05f032d19c307d7b008ae327ea9d4bea87198 已签名并推送;GitHub 回读 mergeable=true,工作区干净。
  • 唯一冲突位于设计台账的 GENERATED 区,通过仓库生成器重建54个 surface;人工维护区前后SHA-256一致。翻译绑定与过期响应保护代码未发生冲突或额外改写。
  • 复验现有语言往返修复:A→B→A 不复用旧 loading/回复,旧请求 finally 不清除新请求 pending。Desktop 6文件91项通过(4.58s),Mobile 4文件79项通过(1.39s)。
  • Desktop typecheck通过(140.88s),Mobile typecheck通过(19.94s);设计台账、dev-docs、test-hygiene、暂存diff空白检查及DCO全部通过。检查串行运行;未新增、跳过或放宽测试。
  • 加载评审回复 已闭环。新 client-ci 及设计检查已创建,回读时排队中;不沿用旧head全绿作为本轮CI结论。
  • 本轮为主干合并与生成区冲突处理,未重做实机视觉验收;原截图仅代表其标注的验证版本。PR尚未合并,当前head正式评审仍待完成。

2026-10-28:再次同步主干

  • 合入 main 2cb955395960b076ca60d0bc4e3e60474c230bbc,签名merge 8d1863f3df176ed731233696ef222c3867690128 已推送;GitHub回读 mergeable=true。
  • 唯一冲突是 design-inventory 的 GENERATED 区。用官方生成器重建58个surface;人工区前后SHA256完全相同(c980493cc79acc26d560b1ea5b39836b13d43dae6ea0c3a2fba392c453176d43)。两端语言绑定Hook与翻译服务实现和此前修复逐字一致,主干新增行为保留。
  • Desktop 6文件91项、Mobile 4文件79项、device-link allowlist55项、maker-shared thinking/contract13项:238项全部通过。保留语言往返、旧响应与pending保护断言;无新增或放宽测试。
  • Desktop完整类型检查通过(121.51秒),Mobile类型通过(18.51秒),maker-shared/device-link正式build(tsc --noEmit)通过。设计台账检查及52项生成器自测、文档10项、hygiene、i18n/glossary、相对main暂存diff空白与DCO均通过。i18n与待裁决术语的非阻断告警保留。
  • 原worktree依赖存在缺损,增量安装未修复;已可逆保留本worktree旧依赖,按frozen lockfile独立重装后才运行以上检查。未复制其他checkout依赖,未改锁文件或仓库规则。
  • 新client-ci 已运行;新设计检查 已通过。不沿用旧head绿灯。
  • 本轮仅主干合并与台账生成区冲突处理,未重做界面截图或真实服务验收。首版产品方向确认、Mobile原生Light/Dark截图与真实辅助模型端到端验收仍待完成;旧截图不冒充本次实机结果。未合并。

2026-10-28:最新主干冲突处理(第二次)

  • 合入 main 2ef024d78443011b2fbf7e4b601d3c703a5b3ceb,签名合并提交 b7f5e474793a74b4d39ddb002fe4d2b1d123f041 已普通推送;GitHub回读 mergeable=true。
  • 唯一冲突仍位于设计台账 GENERATED 区,官方生成器重建58个surface。人工区逐字保留;两端语言绑定Hook与main侧翻译实现逐字未变,主干新增功能保留,未新增规则或修改CI。验证树 6bac067cede0c021da5483f6e4a37c481ff422fe 与提交树一致。
  • Desktop 91、Mobile 79、device-link 55、maker-shared 13:238项定向回归全部通过。Desktop类型391.91秒、Mobile类型37.13秒,共享两包正式build(tsc --noEmit)均通过;设计生成器52项、dev-docs10项、设计台账、test-hygiene及相对main空白检查和DCO通过。
  • 如实记录首轮:Desktop两worker运行90项通过、1项路由用例在5秒预算内超时;该用例与main逐字一致。单worker同6文件91项通过(35秒),未改断言、超时或生产代码。观察到其他编译负载及约19.7GB swap,但首轮超时的精确原因未确定,不把它定性为已修复的程序缺陷。
  • 新client-ci 已创建,初始queued;设计检查初始in_progress。本节不沿用旧head的17项绿灯。
  • 本轮没有重做界面截图或真实翻译服务验收;产品方向确认、Mobile原生与真实辅助模型端到端验收继续保留为未完成,不将冲突解除当作可以合并。

@Liuliuuu0710
Liuliuuu0710 requested a review from a team as a code owner October 27, 2026 07:53
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-27T07:56:48.489618Z
We couldn’t complete this review. Comment @codex review to try again.
d9888eb PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 4/5

[Medium impact] The PR adds an opt-in path for thinking text to reach an auxiliary model service.

可以合并,但建议修复语言往返切换后翻译按钮无法重试的问题。

Findings

  1. P2 翻译按钮一直等待 ▶
Fix with agent prompt
### Issue 1
apps/desktop/src/renderer/components/chat/useThinkingTranslation.tsx:53-57
两端的 `useThinkingTranslation` 都会留下失效请求的加载状态。例如,在中文界面发起翻译,切到英文,等请求返回后再切回中文:返回结果因 `binding` 不同而被丢弃,但 `state` 仍保留中文对应的 `loading: true`。切回中文后,旧状态重新生效,按钮无法再次点击。

建议在请求失效时清除加载状态,或为每次绑定变化增加不会复用的代次,并补上这个往返切换用例。手机端的同名实现也需要一起修复。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

为桌面和手机的思考块增加展开后手动翻译,支持原文与译文切换,并显示额外用量说明。

  • The task's Desktop translates thinking text when a user requests it.
  • Desktop thinking blocks let users view a translation or the original.
  • Mobile thinking blocks let users view a translation or the original.

Diagram

sequenceDiagram
  participant U as 用户
  participant C as 桌面或手机思考块
  participant H as 任务所在桌面
  participant M as 辅助模型
  U->>C: 展开思考
  Note over C: 不自动请求
  U->>C: 点击翻译
  C->>H: maker:translate-thinking
  H->>H: 检查权限、输入、并发和账号
  H->>M: 原文与目标语言
  M-->>H: 译文
  H->>H: 再次检查账号和模型配置
  H-->>C: 译文或固定错误
  Note over C: 仅保留临时展示状态
  U->>C: 切换原文与译文
Loading

Reviews (1) · Last reviewed commit: "feat(chat): 支持展开思考后的手动翻译" · Reviewed by Greptile

@zqchris

zqchris commented Oct 27, 2026

Copy link
Copy Markdown
Contributor

已下载查看本 PR 的桌面浅色/深色窄窗截图,并独立核对两端 useThinkingTranslation 的状态路径,当前先不批准:

  1. 在语言 A 点击翻译后切到 B,等 A 请求返回被 current !== binding 丢弃,再切回 A,state 仍是 A 的 loading:true;finally 只清 pending,不清 loading,按钮会一直等待。这是从当前代码状态转换确认的问题,现有测试只覆盖切换后不显示旧译文,没有覆盖切回原绑定。请两端一起清理失效的加载状态并补该回归,仍保留不自动重发请求的边界。
  2. 本 PR 同时改了手机入口,正文明确尚无 Mobile 原生截图或实机联调。请补当前分支的手机浅色/深色原文和译文截图,以及真实辅助模型翻译、原文切换、失败重试和旧主机提示的适用验收;桌面窄窗组件截图不能代替手机验收。

新增内置翻译的产品范围另行确认;以上是实现与验收缺口,不代表已认可产品方向。

@Liuliuuu0710

Copy link
Copy Markdown
Contributor Author

已核实状态问题,修复已推送:b5630d61f1。

Desktop / Mobile 现在为每次绑定变化使用独立身份,语言 A → B → A 不会复用原来的 loading,旧响应也不能覆盖切回后新发起的请求;仍然只在手动点击时翻译。两端各补了「旧响应在切回前完成」「切回并重新请求后旧响应才完成」两个回归,用例在旧实现上均失败,修复后通过。

本轮 Desktop 37 项、Mobile 65 项定向测试及两端类型检查通过。另补了新增 Hook 的设计入口台账:初次 CI 的 runner / Git integration 直接失败都指向 GENERATED 未同步,重新生成后的 52 项台账自测通过;新一轮 Desktop Git integration 与 DCO 已通过,其余 CI 仍在运行。PR 正文已补上这些记录。

第 2 点的 Mobile 原生 Light / Dark 截图和真实辅助模型端到端验收仍未补齐,目前不申请将这部分视为完成。原文切换、失败重试及旧主机提示已有定向单测,但不能代替所要求的原生实机与真实服务验收;桌面窄窗截图也不会作为手机证据。内置翻译的首版产品范围仍待维护方确认。

@MagicLizi

Copy link
Copy Markdown
Contributor

维护者确认请求(自动流程)

PR #7451(head b5630d61f1)命中维护者确认门,需要维护者确认后才能进入自动审查与合并:

  • product:feat + 生产 UI 路径(Desktop / Mobile 思考块手动翻译入口)。
  • security:验证脚本危险写法 2 处(navigation-escape / permission-bypass)。
  • rules:修改规则文档 design-inventory / protocol-compatibility / thinking-translation。
  • arch:核心路径 209 行 + diff 1545 行。

改动概述:展开已结束的思考块后可手动点击「翻译」在原文/译文间切换,译文标注「机器翻译」,点击前展示原文发送至辅助模型服务、产生额外用量的说明;新增同账号 maker:translate-thinking,译文不落库;Desktop 与 Mobile 一起适配。详细确认材料见关联讨论 issue。

另注:维护者 zqchris 此前评论的两项要求(往返切换加载状态回归、Mobile 原生截图与真实验收)中,作者称状态回归已在 b5630d61f1 修复,Mobile 原生验收按 PR 正文仍待补齐;对应说明只是信息位,不构成放行。

请维护者直接在本 PR 上 Approve 表示确认通过;如需修改请 Request Changes,作者改完后维护者再 Approve。

讨论 issue:#7473

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) touches:security 改动碰到安全边界(review-pr 自动维护,仅展示) labels Oct 27, 2026
Liuliuuu0710 added a commit to Liuliuuu0710/cindy that referenced this pull request Oct 27, 2026
Signed-off-by: ylliuuu66 <y11iu66666@gmail.com>
Liuliuuu0710 added a commit to Liuliuuu0710/cindy that referenced this pull request Oct 27, 2026
Signed-off-by: ylliuuu66 <y11iu66666@gmail.com>
@Liuliuuu0710

Copy link
Copy Markdown
Contributor Author

@zqchris 想先请你明确 #7334 → 本 PR 的首版产品取舍,关联维护者确认单 #7473。

原需求包含实验性全局开关及双语并排;本 PR 拟先收窄为:

  • 仅对有可见原文、已结束且由用户展开的思考块,手动点击「翻译」;覆盖 Desktop / Mobile 的独立思考块与工作过程入口。
  • 翻译为当前界面语言,复用设置中的辅助模型;点击前说明原文会发给该服务、产生额外用量。原文上限16,000字符,超长明确提示,不静默截断。
  • 译文标注「机器翻译」,支持原文/译文切换,切换不再次调用;失败保留原文,仅由用户手动重试。
  • 译文仅作当前组件临时展示,不落库、不改写原始思考/历史/后续上下文,不新增插件读取思考正文的权限。
  • 首版暂不包含全局自动翻译开关、流式翻译、展开即翻译及双语并排。

请确认是否接受这个收窄范围作为首版。 若不接受,烦请指出必须纳入的具体交互,或是否应先暂停宿主内置翻译;我会据此调整后续实现和验收。

实现状态已更新:语言 A→B→A 持续加载问题已修复并补两端回归,对应代码线程已解决;当前 head 8d1863f3df176ed731233696ef222c3867690128 的 client-ci 13/13 和 设计检查 均通过,主干冲突已解除。

Mobile 原生 Light/Dark 截图、真实辅助模型翻译/原文切换/失败重试/旧主机提示的适用端到端验收仍待补齐;#7473 提到的验证脚本安全告警也需按当前代码和规则单独复核。本次只请求明确产品方向,不请求豁免上述事项或直接合并;最终仍按维护者确认门完成审阅与批准。PR 正文已把「经确认」更正为「拟提交维护者确认」,避免将作者取舍或机器人建议写成维护者批准。

Signed-off-by: ylliuuu66 <y11iu66666@gmail.com>
… trips

Signed-off-by: ylliuuu66 <y11iu66666@gmail.com>
@Liuliuuu0710
Liuliuuu0710 force-pushed the feat/manual-thinking-translation branch from b7f5e47 to 43aecd8 Compare October 29, 2026 10:36
同步 main 727afb1,解除与主干的冲突。

- 唯一冲突位于 `docs/design-rules/design-inventory.md` 的 GENERATED 区;用仓库生成器 `pnpm design:inventory` 重建 59 个 surface,`--check` 通过。
- 人工决策区(owner / 迁移状态 / protected / 目标道路 / 下一动作)逐字取自 main,包含 2026-10-29 伙伴输入框双按钮裁决;两端语言绑定 Hook 与翻译服务实现未改动,main 新增行为保留。
- 相对 main 本文件仅剩本 PR 的 6 行组件清单差异,未新增规则或修改 CI。

验证:
- Desktop 6 文件 91 项、Mobile 4 文件 79 项、device-link allowlist 55 项、maker-shared thinking/contract 13 项:238 项通过。
- Desktop typecheck 通过(309s),Mobile typecheck 通过(42s)。
- design-inventory 自测 52 项、dev-docs 10 项、设计台账 --check、test-hygiene、i18n/glossary、相对 main 空白检查与 DCO 均通过。
- 本 worktree 旧依赖缺损(picomatch/vite 文件缺失)已按 frozen lockfile 独立重装后运行上述检查;未改锁文件与仓库规则。

本轮仅主干同步与冲突处理,未重做界面截图或真实翻译服务验收;产品方向确认、Mobile 原生 Light/Dark 截图与真实辅助模型端到端验收仍待完成。未合并。

Signed-off-by: ylliuuu66 <y11iu66666@gmail.com>
…translation

# Conflicts:
#	docs/design-rules/design-inventory.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) touches:security 改动碰到安全边界(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants