Skip to content

fix(desktop): 移除附件启动扫描并增加缓存目录清理 - #3410

Open
DavidShenXD wants to merge 6 commits into
mainfrom
cindy/vibrant-babbage
Open

fix(desktop): 移除附件启动扫描并增加缓存目录清理#3410
DavidShenXD wants to merge 6 commits into
mainfrom
cindy/vibrant-babbage

Conversation

@DavidShenXD

Copy link
Copy Markdown
Collaborator

这次改了什么

摘要

移除 Desktop 启动时针对聊天附件旧缓存执行的消息历史扫描,避免 LIKE + json_tree 全表查询长期占用单一数据库 worker。设置页同时为图片缓存和消息附件缓存提供固定目录的“打开目录 / 一键清理”入口;清理动作只删除 Main 进程解析出的对应目录,不读取消息数据库或媒体账本。

变更类型

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

范围

  • 关联 Issue / 需求:本次确认的 Desktop 缓存目录治理需求
  • 本 PR 包含:移除聊天附件启动清扫及其消息表扫描 SQL;图片缓存与消息附件缓存的固定目录打开、二次确认和整目录清理;五语文案与相关单测
  • 明确不包含:其它数据库全表扫描、模糊查询或索引性能问题;媒体总仓回收策略调整
  • 用户可见变化:设置 → 关于 → 存储空间中,图片缓存和消息附件缓存均可打开目录或一键清理
  • 是否存在 breaking change:无

UI 变化

  • Desktop 设置页新增消息附件缓存目录行,并为两个固定缓存目录增加“清理”按钮和破坏性二次确认;未附截图,实机目检情况见“未执行的验证”
  • 引用的设计规范:docs/design-rules/DESIGN.md §4 Buttons / Dialog & Modal、§5 Border Radius Scale、§10 Light / Dark Dual-Mode Delivery Gate、§11 Voice & Content。按钮使用 pill 圆角,复用共享确认对话框和现有语义 token,五种语言同步提供文案;未新增硬编码颜色

怎么验证的

自动验证

pnpm --filter desktop exec vitest run <8 个本次相关测试文件>
结果:8 个测试文件、71 项测试全部通过

pnpm check:i18n
结果:通过,五种语言 key 一致

pnpm check:i18n-glossary
结果:通过,无新增术语违规

pnpm --filter desktop run --if-present typecheck
结果:通过

pnpm test:unit:related
结果:通过,apps/desktop 相关单测通过

pnpm check:dco
结果:通过,1 个提交已签名

手工验证

未执行 Desktop 实机点击与目录删除验证;固定目录边界、可信 Renderer 校验、无路径参数、无数据库读取及确认交互由定向单测和源码契约测试覆盖。

未执行的验证

  • 未进行 Light / Dark 实机目检,未声称双模式已视觉验证;实现复用现有语义 token 和共享组件
  • 未在本地执行全仓 pnpm test:unit;按仓库工作流仅运行 pnpm test:unit:related,完整单测由 GitHub CI 执行

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:用户主动清理缓存后,历史消息中的对应图片或附件可能失效

影响与回滚

  • 影响范围:仅 Desktop 本机 userData 下的图片缓存目录 cc-agent/images 与消息附件缓存目录 chat-attachment-cache。清理 IPC 不接收 Renderer 路径,只删除 Main 侧固定目录,不查询消息数据库或媒体账本;不涉及 SSH 工作目录、device-link 或 Mobile 入口
  • 数据风险:清理前会明确提示历史消息资源可能失效且无法恢复;已经删除的缓存文件无法通过回滚代码恢复
  • 移动端冷更:不会触发。本 PR 未修改 apps/mobile 原生配置、原生依赖、模块或任何 runtime fingerprint 输入
  • 存量插件影响:无
  • SQLite / migration:未修改 schema 或 migration,仅移除一条启动期消息历史扫描路径
  • 回滚 / 降级方式:回滚本提交可恢复旧启动行为和设置入口;已由用户清理的文件无法恢复

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档
  • 已确认测试结果或说明未执行原因

Signed-off-by: DavidShen <david@xd.com>
@DavidShenXD
DavidShenXD requested a review from a team as a code owner August 25, 2026 12:23
@greptile-apps

greptile-apps Bot commented Aug 25, 2026

Copy link
Copy Markdown

Greptile Summary

本次修改移除了聊天附件启动清扫及其消息历史全表扫描,并在 Desktop 设置页增加固定图片缓存和当前账号附件缓存的目录打开与确认清理能力。

  • Main 进程新增固定目录清理 IPC、原生确认对话框及当前 data owner 校验
  • Preload 与设置页接入图片缓存和附件缓存的打开、清理操作
  • 移除附件持久化路径扫描 SQL、启动清扫逻辑及对应测试
  • 补充五种语言文案和固定目录清理相关单元测试

Confidence Score: 5/5

当前 HEAD 已将附件缓存清理限制到稳定的当前 data owner,未发现仍需阻止合并的故障。

先前报告的跨账号清理问题已通过 owner 专属目录解析、账号 scope 复核和边界期间拒绝操作得到修复,当前没有阻塞性故障遗留。

Important Files Changed

Filename Overview
apps/desktop/src/main/bootstrap-electron.ts 移除启动期附件扫描,新增由 Main 解析固定目录、校验当前 owner 并执行确认清理的 IPC 接线。
apps/desktop/src/main/file-browser/remote-file-cache.ts 删除启动附件清扫实现,并将显式草稿丢弃清理限制在当前 owner 的直属 .bin 文件。
apps/desktop/src/main/cindy-media/storageIpc.ts 为两个固定缓存目录新增打开和清理处理器,并将底层错误转换为安全 IPC 错误。
apps/desktop/src/renderer/components/settings/StorageManagementCard.tsx 设置页新增图片与附件缓存目录的打开、清理按钮及操作状态处理。
apps/desktop/src/preload/preload.ts 暴露四个无路径参数的固定缓存目录 IPC 方法。

Sequence Diagram

sequenceDiagram
    participant U as 用户
    participant R as Renderer 设置页
    participant P as Preload
    participant M as Main 进程
    participant F as 当前 owner 缓存目录
    U->>R: 点击清理附件缓存
    R->>P: clearChatAttachmentsDir()
    P->>M: 固定 IPC(无路径参数)
    M->>M: 校验可信 Renderer 并捕获 owner scope
    M->>U: 显示原生破坏性确认框
    U-->>M: 确认
    M->>M: 再次校验 owner scope
    M->>F: 递归删除当前 owner 目录
    F-->>M: 完成
    M-->>P: "{ cleared: true }"
    P-->>R: 更新操作状态
Loading

Reviews (6): Last reviewed commit: "fix(desktop): 明确缓存清理按钮对象" | Re-trigger Greptile

Comment thread apps/desktop/src/main/bootstrap-electron.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 00616e0943

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/main/file-browser/remote-file-cache.ts
Comment thread apps/desktop/src/main/bootstrap-electron.ts Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@DavidShenXD 👋 这个 PR 还有 3 条 review conversation 没 resolve(apps/desktop/src/main/bootstrap-electron.ts / apps/desktop/src/main/file-browser/remote-file-cache.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added status:ci-failed CI 失败(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) labels Aug 25, 2026
Signed-off-by: DavidShen <david@xd.com>
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 已确认并修复 Greptile 指出的跨账号附件缓存清理问题:消息附件目录按 owner 分区,设置页不再删除总根目录。

变更:

  • 打开和清理消息附件缓存时,由 Main 获取当前稳定 owner,只操作该 owner 子目录。
  • 切号或 owner 边界进行中时拒绝操作;仍不读取消息数据库或媒体账本。
  • 增加回归测试,防止设置页重新接回总根目录。

验证:

  • pnpm --filter desktop exec vitest run ...:4 个文件、21 项测试通过。
  • pnpm --filter desktop run --if-present typecheck:通过。
  • pnpm test:unit:related:通过。
  • pnpm check:dco:通过。

备注:

  • 修复提交已推送;新的自动检查将由 GitHub 重新运行,本次未等待其完成。

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cdf4ca3d54

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/main/bootstrap-electron.ts
Comment thread apps/desktop/src/main/bootstrap-electron.ts
Signed-off-by: DavidShen <david@xd.com>
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 将两个固定缓存目录的删除确认移到 Main 进程原生对话框,取消或窗口失效时不会删除。
  • 将聊天附件目录的打开和清理限制到当前稳定账号,账号切换期间拒绝执行。
  • 保护从历史消息恢复到输入框的共享附件路径,草稿回收不再误删历史消息仍引用的 .bin 文件。

变更:

  • 推送 4c6cf0681:Main 特权边界确认、清理结果回传、历史附件共享路径标记及对应测试。
  • 保持清理只删除固定目录文件,不读取消息数据库或媒体账本;用户主动的一键整目录清理语义不变。

验证:

  • pnpm --filter desktop exec vitest run src/main/__tests__/imageCacheStartupSweepDisabled.test.ts src/renderer/components/settings/__tests__/StorageManagementCard.test.tsx src/renderer/__tests__/rewindDraftAttachments.test.ts src/renderer/__tests__/chatAttachmentStageCleanup.test.ts:4 个文件、24 项测试通过。
  • pnpm --filter desktop run --if-present typecheck:通过。
  • pnpm test:unit:related:apps/desktop related 单测通过。
  • pnpm check:dco:3 个提交均通过签名检查。

备注:

  • 修复已推送;后续自动检查可能仍在运行,本轮未等待。

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4c6cf06810

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/main/bootstrap-electron.ts Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@DavidShenXD 👋 这个 PR 还有 3 条 review conversation 没 resolve(apps/desktop/src/main/bootstrap-electron.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) and removed status:ci-failed CI 失败(review-pr 自动维护,仅展示) labels Aug 25, 2026
Signed-off-by: DavidShen <david@xd.com>
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 已确认删除授权位于 Main 原生确认框,默认取消,Renderer 不能绕过确认或传入任意路径。
  • 已评估 legacy 图片缓存的 owner 范围;该冻结目录没有 owner 元数据,本次按已确认的 profile 级整目录清理语义处理,不引入数据库读取或迁移。
  • 已评估未发送草稿附件保护;按产品决策不读取草稿状态,不因附件状态阻止整目录清理。
  • 已评估历史消息恢复附件保护;撤回路径共享标记,历史暂存附件缺失时由调用点处理空态或失效。

变更:

  • 提交 5d206f6cd 撤回 cachePathShared 及其快照、恢复标记和测试,保持缓存目录直接清理语义。
  • 保留 Main 原生确认、固定目录限制和当前账号聊天附件目录越界保护。
  • 未修改 Markdown 文档,未增加数据库、消息历史或媒体账本读取。

验证:

  • pnpm --filter desktop exec vitest run src/main/__tests__/imageCacheStartupSweepDisabled.test.ts src/renderer/components/settings/__tests__/StorageManagementCard.test.tsx src/renderer/__tests__/rewindDraftAttachments.test.ts:3 个文件、22 项测试通过。
  • pnpm --filter desktop run --if-present typecheck:通过。
  • pnpm test:unit:related:通过。
  • pnpm check:dco:4 个提交签署检查通过。
  • git diff --check:通过。

备注:

  • 清理确认后直接删除对应目录;不保证未发送或历史附件完好,附件缺失及删除异常由调用点处理,不作为清理前置条件。
  • 未执行全量 pnpm test:unit:按仓库约定由远端 CI 统一执行。

Signed-off-by: DavidShen <david@xd.com>
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 已采纳确认框、窗口和账号边界等异常必须使用统一 IPC 错误协议的反馈。
  • 已评估 legacy 图片缓存按账号隔离建议:现有 profile 级目录没有 owner 元数据,按已确认的产品语义保留整根清理。
  • 已评估保留草稿暂存附件建议:按已确认的产品语义不读取草稿、消息历史或媒体账本,不保证清理后附件完好,保持整目录清理。

变更:

  • 为两个固定缓存目录清理 handler 增加统一异常封装;已有 IpcError 原样透传,边界失效使用 PRECONDITION_FAILED,其他异常转换为 INTERNAL。
  • 新增回归测试,覆盖 Main 侧确认与清理异常必须走 IPC 错误协议。
  • 提交 85792ff 已推送到 PR 分支。

验证:

  • pnpm --filter desktop exec vitest run src/main/__tests__/imageCacheStartupSweepDisabled.test.ts:6/6 通过。
  • pnpm --filter desktop run --if-present typecheck:通过。
  • pnpm test:unit:related:通过(desktop unit)。
  • pnpm check:dco:通过,当前 PR 的 5 个提交均带 DCO 签名。
  • git diff --checkgit show --check --stat --oneline HEAD:通过。
  • 未执行 pnpm test:unit:按项目约定不在本地执行该全量命令,由远端 CI 统一运行。

备注:

  • 本次不增加数据库、消息历史、草稿或媒体账本读取;清理可能使缓存附件缺失,由具体调用点处理。
  • 新提交的自动检查由 GitHub 继续运行,本轮不等待检查完成。

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 85792ff3e3

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/renderer/i18n/locales/zh-CN/common.json Outdated
Signed-off-by: DavidShen <david@xd.com>
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 已采纳“清理”按钮缺少操作对象的反馈,并覆盖设置卡片与两个 Main 原生确认框。

变更:

  • 将 en / zh-CN / zh-TW / ja / ko 五种语言中的图片缓存和附件缓存清理按钮改为带明确对象的动作文案。
  • 新增五语言文案回归测试,锁定设置按钮与确认框主按钮的四组文案。
  • 提交 6f8c891 已推送到 PR 分支。

验证:

  • pnpm --filter desktop exec vitest run src/renderer/__tests__/storageCleanupCopy.test.ts:5/5 通过。
  • pnpm check:i18n-glossary:通过,无新增术语违规。
  • pnpm --filter desktop run --if-present typecheck:通过。
  • pnpm test:unit:related:通过(desktop unit)。
  • pnpm check:dco:通过,当前 PR 的 6 个提交均带 DCO 签名。
  • git diff --cached --checkgit show --check --stat --oneline HEAD:通过。
  • 未执行 pnpm test:unit:按项目约定不在本地执行该全量命令,由远端 CI 统一运行。

备注:

  • 本次仅修改文案,不改变缓存清理行为、权限边界或确认流程。
  • 本轮未重新进行 Light / Dark 实机目检;两种模式共用同一文案和既有主题样式。新提交的自动检查由 GitHub 继续运行,本轮不等待检查完成。

@MagicLizi MagicLizi removed the status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) label Aug 25, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/components/settings/StorageManagementCard.tsx)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(`html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范

@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 已补充改动后的 UI 效果证据,覆盖设置卡片中的两个缓存清理入口,以及两个 Main 原生确认框的最终动作文案。

变更:

  • 本轮未修改代码;在 PR 评论中补充可复制为单文件直接预览的自包含 HTML。当前 PR head 仍为 6f8c891e6

验证:

  • 已确认工作区位于 cindy/vibrant-babbage,本地 HEAD 与远端 PR head 均为 6f8c891e6,工作区干净。
  • 改后界面证据如下;页面同时提供 Light / Dark 配色,按钮文案与当前五语言实现中的简体中文界面一致:
<!doctype html>
<html lang="zh-CN">
<meta charset="utf-8" />
<meta name="color-scheme" content="light dark" />
<title>缓存目录清理入口 - 改后效果</title>
<style>
  :root {
    --page: #f4f4f2; --card: #ffffff; --text: #20201f; --muted: #70706c;
    --border: #deded9; --danger: #e33737; --danger-text: #ffffff;
  }
  @media (prefers-color-scheme: dark) {
    :root {
      --page: #1f1f1e; --card: #292927; --text: #f2f2ef; --muted: #aaa9a3;
      --border: #444440; --danger: #ef5b5b; --danger-text: #111111;
    }
  }
  * { box-sizing: border-box; }
  body { margin: 0; padding: 24px; background: var(--page); color: var(--text); font: 13px/1.45 system-ui, sans-serif; }
  main { max-width: 720px; margin: auto; display: grid; gap: 20px; }
  .card, .confirm { background: var(--card); border: 1px solid var(--border); border-radius: 14px; }
  h2 { margin: 0; padding: 16px 18px 10px; font-size: 14px; }
  .row { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 16px 18px; border-top: 1px solid var(--border); }
  .copy { min-width: 0; }
  .copy strong { display: block; font-weight: 500; }
  .copy p, .confirm p { margin: 4px 0 0; color: var(--muted); }
  .actions { display: flex; flex: none; gap: 8px; }
  button { border: 1px solid var(--border); border-radius: 999px; padding: 6px 11px; background: transparent; color: var(--text); font: inherit; font-weight: 500; }
  .confirm { padding: 18px; }
  .confirm strong { font-size: 14px; }
  .confirm .actions { justify-content: flex-end; margin-top: 16px; }
  .danger { border-color: transparent; background: var(--danger); color: var(--danger-text); }
</style>
<main>
  <section class="card" aria-label="存储空间">
    <h2>存储空间</h2>
    <div class="row">
      <div class="copy">
        <strong>图片缓存目录</strong>
        <p>Cindy 不会自动扫描或清理此目录。删除文件后,历史消息中的图片可能无法显示。</p>
      </div>
      <div class="actions"><button>打开目录</button><button>清理图片缓存</button></div>
    </div>
    <div class="row">
      <div class="copy">
        <strong>消息附件缓存目录</strong>
        <p>发送的部分附件会保存在这里。删除文件后,历史消息中的附件可能无法打开。</p>
      </div>
      <div class="actions"><button>打开目录</button><button>清理附件缓存</button></div>
    </div>
  </section>
  <section class="confirm" aria-label="图片缓存清理确认">
    <strong>清理图片缓存?</strong>
    <p>只会删除图片缓存目录中的文件,不会读取消息数据库。清理后,历史消息中的图片可能无法显示,且无法恢复。</p>
    <div class="actions"><button class="danger">清理图片缓存</button><button autofocus>取消</button></div>
  </section>
  <section class="confirm" aria-label="附件缓存清理确认">
    <strong>清理消息附件缓存?</strong>
    <p>只会删除消息附件缓存目录中的文件,不会读取消息数据库。清理后,历史消息中的部分附件可能无法打开,且无法恢复。</p>
    <div class="actions"><button class="danger">清理附件缓存</button><button>取消</button></div>
  </section>
</main>
</html>
  • 未重新执行测试:本轮仅补充 PR 界面证据,没有代码或资源改动;6f8c891e6 已在上一轮通过定向文案测试、相关单测、Desktop typecheck、术语门禁和 DCO 检查。

备注:

  • 未新增在线预览或公开部署;HTML 证据不依赖外部资源。没有待提交或待推送的代码改动。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants