Repository navigation
feat(preview): 统一三端任务与伙伴附件预览 - #8356
Conversation
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
…unified Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com> # Conflicts: # apps/mobile/src/session/MessageRenderer.tsx # docs/design-rules/design-inventory.md
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
[High impact] The PR changes attachment previews across Desktop, iOS, and Android entry points. 建议先修复标注原图、直接音频和图表关闭这三处问题,再合并。 FindingsFix with agent prompt### Issue 1
apps/desktop/src/renderer/components/chat/MessageStream.tsx:4119-4123
打开同一消息里的另一附件,再切到已标注图片时,集合中的 `source` 和 `annotationFallbackSrc` 都指向烧录图,但 `initialStrokes` 仍会叠加绘制。撤销笔迹去不掉底图里的旧标注,再次保存也会保留它们。
请保留 `annotationSourceUrl`,显示原图,仅在读取失败时退回烧录图。
### Issue 2
apps/mobile/src/session/MessageRenderer.tsx:7795-7799
消息中的 HTTPS 音频或 `data:audio/` 原本可以直接播放。新入口忽略了 `payload.media.previewable`,强制调用 `onResolveRemoteMedia`,而 `resolveMobileRemoteMedia` 会拒绝这些地址。用户打开音频后只会看到读取失败。
请保留直接播放地址,仅对电脑上的资源调用取件函数。
### Issue 3
apps/desktop/src/renderer/components/chat/TextLightbox.tsx:459-460
`.mmd` 或 `.mermaid` 文件读取完成后,这个提前返回会卸载带关闭按钮的外壳。但 `MarkdownMermaidBlock` 只有生成 `svg` 后才显示全屏查看器;加载期间或语法错误时,它只返回普通代码块。此时 `overlayRef.current` 为空,Esc 也无法关闭。
请让加载和渲染失败状态继续留在公共外壳内,并保留关闭入口。
### Issue 4
apps/desktop/src/renderer/components/chat/TextLightbox.tsx:115-117
多附件入口只传递集合和关闭回调,丢掉了 `initialLine` 与 `triggerRef`。从带行号的文件引用打开集合内文件时,查看器会从顶部开始;关闭后也不会回到触发按钮。现有 `MarkdownRenderer` 和文件菜单仍会传入这些参数。
请把首次打开的参数传给起始查看器,并保留关闭时的焦点归还。
### Issue 5
apps/mobile/src/session/pdfWebViewHtml.ts:30-31
手机 PDF 的缩放只按可用宽度计算,没有考虑高度;“适配”按钮也只是把 `zoom` 设回 `1`。横屏打开竖版 PDF 时,页面高度会远超阅读区域,点击“适配”仍看不到完整页面。
请同时按宽度和高度计算适配比例,让首次打开和“适配”按钮使用同一计算。
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.
|
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
本轮已推送 c49c27d,5 条审查意见已修复并增加最小回归。 两个 client-ci 失败 job(Desktop Git integration / verify-checks)均定位到同一个设计台账测试:它固定了旧 ImageLightbox 的圆角数量,界面调整后得到 4 而不是旧值 5。现改为经生产生成器扫描独立 JSX 样本,分别覆盖 class、camelCase 内联圆角和注释排除;定向用例通过(0.046 秒),没有修改统计器或测试基线。 本轮 Desktop 56 条 / Mobile 34 条回归、两端类型检查、测试卫生和设计台账检查通过;Desktop 的行定位/错误图表关闭/焦点,以及 iOS/Android 横屏 PDF 放大后适配已实测。新的 CI 尚待结果,原来列出的真实来源与平台补充验收边界继续保留。 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
已合批修复并推送 98d47cc。 旧 run 的附件相关失败已按当前统一预览合同修正,保留复制原件、来源授权、键盘/焦点、草稿及缓存索引的回归检查;同时补回文本预算、修复图表第一次 Esc、长文档查找定位和缺地址群附件提示。 定向通过:Desktop 287 / Mobile 450 用例、两个包类型检查与相关设计/测试门禁。Desktop 图表单次 Esc,iOS/Android 截断与第 10,000 行查找均实际操作通过,截图与逐文件测试记录已提交。 Windows agent-island 的三个独立 60 秒超时属于范围外,另开 #8361,未改该服务或弱化测试;该项尚未解决。新 head 等 CI,合并仍由仓库管理负责,既有补充验收缺口不变。 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
已按 c49c27d 的 verify-checks 日志定向复现并修复,推送 aceaa39。
定向验证 Desktop 3 / Mobile 50 用例通过,两端类型检查、测试卫生、设计台账检查通过。没有跑无关全量;新增的仅为 testID 元数据,沿用 98d47cc 的两端实测,未启动测试实例。新提交等 CI;原有范围外 issue #8361 和补充验收缺口保留,合并交仓库管理。 |
|
保留这两份直接关联测试,无需回退或再次申请授权。 2026-11-01 本轮用户已明确:“范围内源文件的测试/快照、CI 校验的生成台账(如 design-inventory)与随清单变动的锁文件自动视为范围内,直接改。”
两项的精确路径、上述当次授权原文和对应理由,已分别登记到 |
|
保留 2026-11-01 本轮用户已明确授权:“范围内源文件的测试/快照、CI 校验的生成台账(如 design-inventory)与随清单变动的锁文件自动视为范围内,直接改。”该精确路径、授权原文和上述理由已经登记在 因此本项按已授权关联测试处理,无需回退或重复申请授权。本轮仅回复已有证据,不新增代码或重复运行测试,继续等待 CI。 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
已处理当前 aceaa39 的 verify-checks 失败,修复提交 Run 41322360581 / job 124895184630 仅 3 个 Mobile guard 用例失败;本地复现后确认是精确源码格式匹配。恢复三处原有等价写法,保留正文可选择条件、同步退避、后续消息及附件回收逻辑,未修改测试或门禁。
证据更新在 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
已处理 Run 41323484318 / job 124898531519 的 5 例失败已本地复现:
定向 35 例、Mobile typecheck、test-hygiene、design-inventory、diff 与 DCO 通过;未跑无关全量。iOS 浅色、Android 深色实测公共输入、1/1 匹配、第10000行跳转和关闭返回,截图与测试价值记录已补入证据 README。测试实例已退出。 等待新 head CI;原补充验收缺口保持明确,不据此宣称整体可合并。合并由仓库管理负责。 |
|
本次
已定位到设计颜色扫描处理约 9.5 MB 的离线文档引擎生成源码时耗时过长。本机生产扫描入口在有界 10 秒内未完成。扫描器 本轮未修改业务、门禁、超时或测试,没有空提交/重复推送。需独立修复扫描性能后重跑 verify-checks 及依赖汇总;当前阻塞未解除,不将此描述为 CI 通过。原补充验收缺口保持明确。 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
合并冲突已处理并推送 唯一冲突在 生成器定向 52 例、连续两次生成一致、design-inventory、12 语言14766key检查、Desktop/Mobile类型检查、diff和DCO通过。本轮不重启测试App或模拟器,没有运行无关全量。证据README已更新。 此前独立的颜色扫描超时 #8369 保持未解决,不将解冲突当作CI通过。等待新head检查;最终合并由仓库管理负责。 |
|
已核对当前
独立 issue #8369 当前仍 OPEN。本轮沿用已记录的范围外处置,不重开代码修复、不重复本地测试、不造提交或再次推送,也不删除资源、降低门禁或延长超时。需先修复独立扫描性能问题,再重跑检查;阻塞未解除。原补充验收缺口与最终合并归属不变。 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
本次新增主干冲突已处理并推送 唯一冲突仍在设计台账 GENERATED 区,按合并树正式生成,人工区与两侧逐字一致,连续两次生成字节相同。主干群聊引用对齐、登录翻译和附件预览功能均保留;自动合并的群聊缺源反馈/取消引用不丢草稿断言保留,没有手工改业务源码或新增功能。 验证:群聊146例、台账2项定向用例、设计台账与翻译结构、两端typecheck、diff和DCO均通过。无新增测试、无无关全量、无测试App/模拟器重启。证据README已更新。 此前颜色扫描性能 #8369 单独跟踪,本轮不将它计为解决;等待新head CI,最终合并仍由仓库管理负责。 |
|
已核对 同一 head 的后续 run 41342534696 已完成并 success:https://github.com/makecindy/cindy/actions/runs/41342534696 。该工作流按 PR 设置 没有新的设计依据缺项或源码缺陷;本轮无需改码、测试、重跑或推送,也不重复修改 PR 正文触发检查。其它 CI 状态与原验收缺口不据此自动视为通过。 |
|
已核对当前
独立 issue #8369 当前仍 OPEN。没有新测试断言或类型错误证据;按已记录处置,不重开改码/本地测试/推送,不空提交或重复重跑同一耗时链路。需修复范围外扫描性能后重跑检查,当前门禁保持未通过,原验收缺口不变。 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
本次冲突已逐段处理并推送 唯一源码冲突是 MessageRenderer 的三处普通文本/强调/删除线分支;保留主干 StaticSpan、原生 UITextView 与缩放限幅,保留附件预览分派和交互入口,没有回退统一集合或直接音频读取。 验证:180个相关用例、Mobile类型检查、设计台账、测试卫生、diff/DCO通过。两端旧原生包均先更新到匹配当前指纹的产物并核对安装内容;iOS浅色、Android深色实际验证强调/代码/表格、消息打开code.json4/7、切到已加载PDF3/7、关闭回到来源。截图和过程已补证据README;测试App、模拟器与本任务Metro已退出。 没有新增测试或无关全量。原完整验收矩阵缺口和独立CI扫描问题#8369继续明确,不据此宣称整体可合并;最终合并由仓库管理负责。 |
|
已核对当前 head
已更新 PR 当前交接状态,等待仓库审核;最终合并由仓库管理负责。本轮没有代码修改、重复测试或推送,也未代为批准/合并。原公开补充验收缺口继续保留,不将 CI 通过等同于全部环境已验收。 |
xd-bobo
left a comment
There was a problem hiding this comment.
Approved by compliance check: CI passed and no blocking reviews.
PR #8356 独立审查报告(heavy 档)— passhead Findings没有可证实的 P0/P1。逐项定性记录(非阻断):
Rule coverage — 读取的规则文件及逐项结论
Verification — 实际运行的命令、结果、未执行项及原因(worktree
Intent alignment
后续 7 个 commit 全部为审查修复(5 条 thread 修复 + CI 分片/守卫/排版修复)与 3 次 upstream 合并解冲突(生成台账重建、保留主干 StaticSpan/UITextView 优化),未见删除/削弱核心功能、无关扩范围或以禁用/绕过方式消错。结论:一致,无原意偏离。 Overallpass —— 没有 P0/P1。0 未解决 thread、维护者确认门已由 xd-bobo 的 Approve 放行(product/security/rules/arch 四类触发全部 released)、CI 全绿、stale-rebase 与受保护路径均不构成阻断。bot 静默期超时放行的两个机器人(copilot-pull-request-reviewer、chatgpt-codex-connector)意见可能合并后到达,建议合并后按 post-merge sweep 惯例关注。 |
这次改了什么
摘要
附件从任务、伙伴、群聊或输入区打开时,过去存在关闭/缩放按钮缺失、同类文件分散在不同弹层、Android PDF 跳出应用的问题。现在三端共用预览操作合同:文件名、常显关闭、原件操作、明确的附件集合,以及各类型的阅读/播放工具。
变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
UI 变化
docs/design-rules/DESIGN.md§2 语义颜色、§3 字体、§4 Buttons / Dialog & Modal、§5 布局;design-governance.md§13 点击目标。Desktop 使用 32px 热区/16px 图标,手机使用 48px 热区/20px 图标,标题和关闭独立于内容缩放,支持 Light / Dark。以下单页检查只验证真实公共外壳的布局/主题,完整媒体运行由上面的隔离客户端与模拟器截图证明。
pnpm ui:check --entry outputs/attachment-preview/ui-fixture.tsx --theme light,dark --locale zh-CN,en,de --viewport 800x600 --engine chromium --output outputs/attachment-preview/ui-check,macOS · Chromium 156.0.8078.79;真实组件与主题,场景数据,不是登录账号下的完整 Cindya6103784b416(含未提交改动)entry:light / dark · zh-CN / en / de · 800×600default:Ad-hoc entry怎么验证的
自动验证
pnpm --filter desktop run typecheck、pnpm --filter mobile run typecheck:通过。pnpm check:i18n-glossary、pnpm check:test-hygiene、pnpm check:design-inventory、git diff --check:通过。设计台账已用正式生成器同步,没有修改测试基线。手工验证
attachment-preview-unified;Metro 8081 归属于同名独立工作树,__DEV__source 与提交对应。iOS native fingerprint 匹配,Android 使用本次 assembleDebug 输出。只操作本任务测试实例。未执行的验证
Windows、平板/横屏/大字/读屏全矩阵、真实另一台电脑/SSH/Chat Server/插件账号来源闭环,以及所有格式的损坏/密码/超大样本未完成设备验收。核心三端已实际运行;上述补充缺项仍约束整体发布/结案,不能将本 PR 送审解释为全来源全部验收通过。完整自动套件交 CI。
风险
风险分类
影响与回滚
提交前检查
PR 审查修复 · c49c27d
本轮已推送 c49c27d,5 条审查意见已修复并增加最小回归。
两个 client-ci 失败 job(Desktop Git integration / verify-checks)均定位到同一个设计台账测试:它固定了旧 ImageLightbox 的圆角数量,界面调整后得到 4 而不是旧值 5。现改为经生产生成器扫描独立 JSX 样本,分别覆盖 class、camelCase 内联圆角和注释排除;定向用例通过(0.046 秒),没有修改统计器或测试基线。
本轮 Desktop 56 条 / Mobile 34 条回归、两端类型检查、测试卫生和设计台账检查通过;Desktop 的行定位/错误图表关闭/焦点,以及 iOS/Android 横屏 PDF 放大后适配已实测。新的 CI 尚待结果,原来列出的真实来源与平台补充验收边界继续保留。
实际截图、测试价值和各文件耗时见验收记录的「PR #8356 审查修复」。
2026-11-01 CI 修复补充(98d47ccc76)
核对 e57cc5e 的 Linux/Windows 四个分片,处理附件预览相关的 20 个失败测试文件。保留已批准的应用内 PDF、更多菜单、主题背板与焦点约束,更新旧断言和 Node 环境的原生替身;原件复制、标注烧录顺序、来源授权、群聊草稿与缓存索引检查仍保留。
另修复四处实质回归:图表初始焦点导致第一次 Esc 被 Tooltip 消耗;公共文本阅读器丢失原 JSON 渲染预算;大文档查找跳转被 RN FlatList 已测量范围钳制(复用已有 LegendList);电脑群附件缺少 url/path 时无反馈。图标 20px 改用既有 token,数值不变。
verify-checks 守卫补充(aceaa390a9)
c49c27d 的 verify-checks 还包含三个旧守卫文件失败,本批已定向复现并处理:补回可见且已加载文本页的
filePreview.sourceReady;将非文本分派/PDF 稳定性守卫对齐实际公共阅读器;恢复历史补齐等价表达式格式,保留手势、取消、互斥和权限条件。Desktop 3 / Mobile 50 用例、两个包 typecheck、test-hygiene、design-inventory、DCO 通过。只有 testID 元数据发生运行时改动,无布局/操作/读取变化,沿用 98d47cc 的设备验收,本轮未启动测试实例。详见验证记录“verify-checks 守卫补充”。新 head 等 CI;范围外 #8361 与原补充验收缺口保留。
当前 verify-checks 修复(8a7c11aed5)
Run 41322360581 / job 124895184630 的 3 个失败已本地复现,均为 Mobile 旧守卫精确匹配源码格式。恢复正文选择表达式的外层括号、同步恢复状态单行类型、草稿回收单参数回调的原写法,逻辑与断言均不变。
验证:两个相关文件 29 例通过(修前 3 失败 / 26 通过),运行 0.591 秒;Mobile typecheck、diff 与 DCO 检查通过。仅等价格式,不重开测试实例,沿用原实测;原补充验收缺口保留。此次未跑无关全量,未改测试或门禁。
Linux 分片 1 修复(10fc0b06ff,2026-11-02)
Run 41323484318 / job 124898531519 的 Mobile 5 例失败已复现并修复:任务页三处等价 JSX 恢复旧写法;文本公共阅读器使用 AppText.TextInput 与等宽代码 bodySmall 15/20;排版扫描仅排除准确路径的生成第三方 WebView 引擎 JS 字符串,业务阅读器和 HTML 生成器仍受扫描,不改基线。群聊阅读器原生替身补公共 TextInput 导出,原断言全保留,无新增用例。
验证:三个相关文件 35 例通过(1.48 秒,测试执行 0.969 秒),Mobile typecheck、test-hygiene、design-inventory、diff 和 DCO 通过。测试价值与扫描边界理由已写证据 README。iOS 浅色 / Android 深色在当前 worktree Metro 上实际打开 large.json、输入9999、匹配1/1、跳第10000行、关闭返回;截图在 ci-typography-*-search.jpg。两端 App、模拟器与本任务 Metro 已退出,保留数据。未跑无关全量,原补充验收缺口保留。
当前 CI 阻塞:颜色扫描超时(2026-11-02,10fc0b06ff)
Run 41325347406:四个 Linux unit 分片均 success;verify-checks 的新增颜色检查耗时约 31 分 19 秒,整个 job 达 40 分钟上限后在 Desktop typecheck 阶段取消。汇总 verify 因
VERIFY_CHECKS_RESULT=cancelled返回失败,日志没有新测试/类型错误;未执行完的类型检查仍不能算通过。已按本 PR 范围外只开 issue 的约定立案 8369,附实际日志时间、约 9.5 MB 生成资源输入、生产扫描入口与有界复现。扫描器位于授权范围外,未修改或降低门禁、未延长超时、未删除文档能力。本轮无代码变更/推送。需独立修复扫描耗时后重跑 verify-checks 及依赖汇总,CI 阻塞保持明确;其余原补充验收缺口不变。
合并冲突已处理(dc420ea380,2026-11-02)
纳入 upstream/main
19dad9c22542eb36b10ca31d14b61ad934068502。唯一冲突为设计台账的 GENERATED 区,用正式生成器按合并树重建;两侧人工维护区逐字保留,业务源码无手工冲突修改。验证:生成器原文件 52 例通过(85.44 秒);连续两次生成字节一致、59 surfaces 最新、12 语言14766key结构一致、Desktop/Mobile类型检查及diff/DCO通过。本轮无新测试,无App/模拟器启动;原实测与补充缺口保留。此前颜色扫描超时 issue #8369 不因解冲突而视为已解决,新 head 的 CI 仍需真实通过。
新主干冲突处理(2283e8b9dc,2026-11-02)
纳入 upstream/main
156152364a38dfe172a1df50fca157485191b768的群聊引用对齐与登录翻译。仅生成台账冲突,正式重建后两次字节一致、人工维护区与两parent完全一致。群聊新旧断言自动合并,未手工修改业务逻辑/样式/文案。验证:群聊146例(4.73秒/测试1.511秒)、台账2例(0.047秒)、59surfaces台账与12语言14766key检查、Desktop/Mobile类型检查及diff/DCO通过。本轮不重复上次52例生成器全集,无新测试、无测试App/模拟器启动。原运行证据与补充缺口保留,#8369单独跟踪,新headCI仍待真实结果。
正文渲染冲突处理(84c18824ed,2026-11-02)
纳入 upstream/main
db723ff786c9b5e8c9e628fab277ff01f38dc185。三处 MessageRenderer 正文冲突逐段保留主干 StaticSpan / UITextView 优化与显式字号限幅,保留本 PR 链接、文件、图片/视频及统一附件集合入口;未改变功能取舍。180 个直接相关用例(3.64秒)、Mobile typecheck、设计台账、test-hygiene、diff/DCO通过。未新增/改写测试,无全量测试。验收前发现旧原生包不匹配,已按正式 iOS 构建入口与 Android Expo/Gradle 环境更新;整包内容与原生指纹校验通过,Metro 为本工作树 target-fresh。
iOS 浅色 / Android 深色实见正文强调、表格、行内代码;从消息打开 code.json4/7,切换到已实际加载的PDF3/7,再关闭返回来源。六张 merge3-* 截图及原生准备过程已入证据README。两端测试App、模拟器及本任务Metro已退出,保留数据。
原未完成的完整来源/环境矩阵继续保留;此前 CI 扫描性能 #8369 独立跟踪,新headCI仍需真实通过。最终合并由仓库管理负责。
当前交接状态(2026-11-02,84c18824ed)
实时回读:当前 head 的 verify-checks、verify、Linux/Windows 全部分片、Windows runner/database、Desktop Git integration、设计依据检查与 DCO 均通过;返回检查无失败或待运行项。5 条 review threads 全部 resolved,无未解决讨论。
PR 仍 OPEN / 非 Draft / MERGEABLE,GitHub 的正式审核状态为 REVIEW_REQUIRED(已有 review 均为 COMMENTED,尚无 APPROVED),mergeStateStatus 为 BLOCKED。等待仓库审核人批准,由仓库管理负责最终合并;开发 Agent 不代签或合并。
本轮仅核对状态,无新增代码、测试或推送。此前明确的补充验收缺口继续保留,CI 通过不替代完整运行验收结论;独立扫描性能 issue 不因一次 CI 通过自动标为修复。