Skip to content

fix(desktop): show marker after archived history cleanup - #3758

Open
PeaceMaker-best wants to merge 1 commit into
makecindy:mainfrom
PeaceMaker-best:fix/archived-cleanup-marker
Open

fix(desktop): show marker after archived history cleanup#3758
PeaceMaker-best wants to merge 1 commit into
makecindy:mainfrom
PeaceMaker-best:fix/archived-cleanup-marker

Conversation

@PeaceMaker-best

Copy link
Copy Markdown

这次改了什么

摘要

数据库瘦身会物理删除过期归档任务的消息,但此前没有留下可供会话界面识别的维护标记,用户重新打开任务时会看到一片空白。本 PR 新增独立的 maintenance_cleared_at 标记:维护任务实际清理历史后写入该字段,列表投影将其传到渲染层,并复用现有“历史内容已清除”提示。

变更类型

  • Bug 修复
  • 新功能
  • 重构
  • 文档

Fixes #3709

包含范围

  • 新增可空的 maintenance_cleared_at 列与幂等迁移。
  • 数据库瘦身清理目标任务后记录维护时间,不改变用户主动执行 /clearcleared_at 语义。
  • 会话列表投影输出该字段,消息流在任一清理标记存在时显示已有提示。
  • 覆盖归档任务、包含活跃任务、投影格式与迁移回放测试。

不包含

  • 不修改 /clear 的行为。
  • 不自动回填过去已经被清理的历史数据库。
  • 不新增视觉样式、交互或文案。

用户可见行为

打开被数据库瘦身清理过的归档任务时,不再只显示空白消息区,而会显示现有的“历史内容已清除”分隔提示。

UI 变化与效果证据

没有新增 UI 设计;仅扩大现有 HistoryClearedMarker 的触发条件。改动后仍使用原有结构、设计 token 和 i18n 文案:

<div class="flex items-center gap-4 py-3" role="status">
  <div class="h-px flex-1 bg-[var(--border-default)]"></div>
  <span class="shrink-0 text-12 text-[var(--text-tertiary)]">
    历史内容已清除
  </span>
  <div class="h-px flex-1 bg-[var(--border-default)]"></div>
</div>

DESIGN.md 说明:不涉及新的视觉决策,复用已有组件及 --border-default--text-tertiary 设计变量。

验证

已通过

  • pnpm --filter desktop db:validate:全部 6 个迁移校验步骤通过。
  • pnpm --filter desktop exec vitest run src/main/localDb/__tests__/migrationReplay.test.ts:6/6 通过。
  • 数据库瘦身目标用例:2/2 通过。
  • sessionListProjection.test.ts:9/9 通过。
  • pnpm --filter desktop typecheck:通过。

环境限制 / 未完整通过

  • pnpm --filter desktop test:migration-replay 的包装脚本在测试前下载无关 Pi 0.84.4 runtime 时失败;同一迁移回放测试已直接执行并 6/6 通过。
  • pnpm test:unit:related 因当前 fork 基线较旧而扩大到全仓:脚本 runner、mobile 和其他 package 通过;desktop 有 30,516 个通过、97 个跳过,并出现 2 个与本改动无关的 Windows 环境失败(真实命令执行超时、创建 symlink 时 EPERM)。
  • 未重复做桌面截图/录屏;本 PR 没有新增视觉实现,上方 HTML 是改动后实际复用的现有提示结构。

风险与回滚

  • SQLite / 数据库迁移
  • Breaking change

影响:只增加一个可空时间字段;旧数据和旧投影均通过可选字段兼容。维护逻辑在迁移列尚不存在时会安全跳过写入。

回滚:可以回退读写和展示逻辑;已应用的追加式迁移会留下未使用的可空列,不需要破坏性删除列。

提交检查

  • 分支基于最新 upstream/main
  • PR 为非 Draft
  • 提交包含 DCO sign-off
  • 自动验证与已知环境限制均已如实记录

Signed-off-by: PeaceMaker-best <221849497+PeaceMaker-best@users.noreply.github.com>
@PeaceMaker-best
PeaceMaker-best requested a review from a team as a code owner September 2, 2026 00:59
@greptile-apps

greptile-apps Bot commented Sep 2, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 为数据库瘦身新增独立的历史清理标记,并将该标记从 SQLite 会话记录投影到桌面会话界面。

  • 新增可幂等执行的 maintenance_cleared_at 数据库迁移与 schema 定义。
  • 在瘦身事务实际删除目标会话历史时原子写入维护标记,同时保持 /clearcleared_at 语义不变。
  • 扩展本地及远端兼容的会话投影,并复用现有历史清理提示。
  • 补充迁移回放、清理范围及会话投影测试。

Confidence Score: 5/5

本 PR 看起来可以安全合并,未发现由本次变更引入的具体阻塞问题。

数据库列会由生产迁移路径正确安装,历史删除与维护标记写入保持事务原子性,启动期 writer lease 排除了并发写入,而本地及远端会话投影均能保留并展示该字段。

Important Files Changed

Filename Overview
apps/desktop/drizzle/scripts/0101_furry_garia.ts 通过 PRAGMA 检查后幂等添加可空整数列,符合仓库现有脚本迁移执行方式。
apps/desktop/src/main/localDb/dbSlimmingMaintenance.ts 在消息删除所在事务内为同一目标集写入单调递增的维护清理时间,失败时不会产生部分提交。
apps/desktop/src/main/localDb/mapper.ts 将数据库毫秒时间安全转换为可选 ISO 会话字段,同时兼容旧式或手工投影。
apps/desktop/src/main/localDb/schema.ts 为 sessions schema 增加与迁移一致的可空 maintenance_cleared_at 字段。
apps/desktop/src/renderer/features/cc-agent/CCAgentSessionView.tsx 在用户清理或维护清理任一标记存在时复用现有历史清理提示。
apps/desktop/src/renderer/lib/ccAgent.types.ts 将维护清理时间声明为可选字段,以兼容旧版桌面端会话载荷。

Sequence Diagram

sequenceDiagram
  participant Startup as 桌面启动流程
  participant Migration as 迁移运行器
  participant Slimming as 数据库瘦身
  participant DB as SQLite 会话库
  participant Projection as 会话投影
  participant UI as 会话消息流
  Startup->>Migration: 执行 0101 SQL 与同名脚本
  Migration->>DB: 添加 maintenance_cleared_at
  Startup->>Slimming: 在打开正常 DbClient 前恢复维护请求
  Slimming->>DB: 事务内删除目标历史
  Slimming->>DB: 写入 maintenance_cleared_at
  DB-->>Projection: 返回会话行
  Projection-->>UI: maintenanceClearedAt
  UI->>UI: 显示既有“历史内容已清除”提示
Loading

Reviews (1): Last reviewed commit: "fix(desktop): show marker for maintenanc..." | Re-trigger Greptile

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:redline 改动碰到红线路径(updater / DB schema 等,review-pr 自动维护,仅展示) labels Sep 2, 2026

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

格式门未通过,请按仓库 PR 模板补全缺失段落后再请求审查。

当前 description 缺少模板要求的段落:

  • 怎么验证的

「这次改了什么」和风险信息已有,但门禁按一级标题识别。请把验证命令改挂到 ## 怎么验证的 下(已通过的 db:validate / migration replay / 投影测试 / typecheck,以及包装脚本失败、Windows 环境失败等未执行或无关失败)。现有「## 验证」请改成这个标题,或把内容挪过去。

另外本 PR 含 drizzle 迁移,风险段请继续保留 SQLite / migration 分类。

@MagicLizi MagicLizi added status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Sep 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:large-diff 改动量较大(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:redline 改动碰到红线路径(updater / DB schema 等,review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

数据库清理后已归档任务右侧内容区空白,未显示「历史内容已清除」提示

2 participants