Skip to content

feat(desktop): add opt-in dynamic task titles - #3866

Open
lengjingxu wants to merge 4 commits into
makecindy:mainfrom
lengjingxu:feat/dynamic-session-title
Open

feat(desktop): add opt-in dynamic task titles#3866
lengjingxu wants to merge 4 commits into
makecindy:mainfrom
lengjingxu:feat/dynamic-session-title

Conversation

@lengjingxu

@lengjingxu lengjingxu commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

任务列表标题现在默认等于用户的第一句话,开着绿灯/红灯也很难一眼看出任务实质和进度。这次在设置里加了一个默认关闭的开关:打开后,任务每轮收尾会自动把标题更新成全中文的「MMDD|类型|主题」(日期取创建时间的上海时区,类型为功能/设计/修复/优化/发布/探索/文档/研究之一,主题概括当前实质)。手动改过的名字永不覆盖。

这是核心功能,不是插件:任务标题属于任务生命周期,桌面/移动/远程侧边栏共用同一份数据。

变更类型

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

范围

  • 关联 Issue / 需求:无
  • 本 PR 包含:动态任务标题开关、turn 收尾触发、中文标题生成/解析/保护、设置页与五语言文案
  • 明确不包含:存量任务一次性批量改名、中英 TYPE 混用、改项目名
  • 用户可见变化:设置新增「自动更新任务标题」开关;打开后侧边栏标题会随任务推进更新
  • 是否存在 breaking change:无

UI 变化

  • 引用的设计规范:
    • docs/design-rules/DESIGN.md 双模式:卡片颜色走 --settings-theme-card-bg / --settings-theme-card-border / --settings-section-sublabel 语义 token,Light/Dark 共用同一套组件
    • 与 WindowBehaviorSection 同规格:rounded-xl / p-5 / 1px Board 边框
    • docs/dev-rules/configuration-and-overrides.md:默认关闭、只持久化 override、「恢复默认」删除 override
    • docs/product-rules/task-and-conversation-naming.md:面向用户用「任务」而不是「会话」

怎么验证的

自动验证

pnpm vitest run apps/desktop/src/main/maker-ipc/__tests__/dynamicSessionTitle.test.ts apps/desktop/src/main/maker-ipc/__tests__/titlePrompt.test.ts apps/desktop/src/main/maker-ipc/__tests__/sessionAutoTitle.test.ts
结果:45 passed

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

pnpm check:i18n-glossary
结果:无新增违规

pnpm check:design-inventory
结果:GENERATED 区块最新

手工验证

未在运行中的 Desktop 实机打开设置页拨动开关。双模式实机目检未做(组件复用 themed token,不把这当成已验证)。

未执行的验证

  • Desktop 实机:打开开关后跑完一轮,确认侧边栏标题变成「MMDD|类型|主题」,手动改名后不再被覆盖
  • Dark 模式目检设置页新开关
  • 原因:当前环境没有拉起完整 Electron 会话做 UI 目检

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:标题模型调用(默认关闭;开启后每任务 3 分钟冷却;失败静默保留原标题)

影响与回滚

  • 影响范围:仅 Desktop 本机任务标题;默认关闭时零行为变化。开启后走现有标题辅助模型通路,条件写库,用户改名窗口内写入自然落空。
  • 回滚 / 降级方式:关掉开关立即停止刷新;已有标题保留。代码回滚不影响 schema(无 migration)。

提交前检查

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

UI 证据

见评论中的自包含 HTML(明暗双模式):开关位于「设置 → 个性化」,紧挨「任务自动命名」模型选择。链接:#3866 (comment)

After each turn, an optional setting rewrites task titles as
MMDD|类型|主题 so the sidebar shows substance and progress instead
of the first message. Manual renames are never overwritten.

Signed-off-by: Leng <Lengjingxu@gmail.com>
@lengjingxu
lengjingxu requested a review from a team as a code owner September 3, 2026 10:38
@greptile-apps

greptile-apps Bot commented Sep 3, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 为 Desktop 增加默认关闭的动态任务标题功能,在每轮结束后通过辅助模型生成中文“日期|类型|主题”标题,并新增持久化设置、IPC、Preload 接口、设置 UI 和五语言文案。

  • 将 turn-ended 持久化事件接入动态标题刷新流程
  • 增加标题生成、解析、格式化、冷却和条件写入逻辑
  • 增加设置存储、可信 Renderer IPC 及设置页开关
  • 补充动态标题与 Prompt 的单元测试和设计台账

Confidence Score: 4/5

合并前需要修复普通任务被资格判断直接排除的问题,否则用户开启开关后核心动态标题功能仍不会生效。

现有自动标题会在 turn 结束前替换默认占位符,而新增刷新逻辑只允许覆盖默认占位符或既有动态格式标题,因此正常文字任务在进入模型生成前就被跳过。

Files Needing Attention: apps/desktop/src/main/maker-ipc/dynamicSessionTitle.ts

Important Files Changed

Filename Overview
apps/desktop/src/main/maker-ipc/dynamicSessionTitle.ts 实现动态标题编排与资格判断,但资格条件会排除正常发送流程已生成的普通自动标题,导致核心功能不生效。
apps/desktop/src/main/localDb/ipc/sessions.ts 在 turn-ended 持久化后注入动态标题通知,并保留原有 session patch 广播结果。
apps/desktop/src/main/session-title-settings-ipc.ts 新增带可信 Renderer 校验和参数验证的设置读写、重置 IPC。
apps/desktop/src/main/session-title-settings-store.ts 使用 override-settings 模式持久化默认关闭的动态标题开关。
apps/desktop/src/renderer/components/settings/SessionTitleSection.tsx 新增动态标题开关、恢复默认控件和保存结果提示。
apps/desktop/src/renderer/hooks/useSessionTitleSettings.ts 封装设置加载、修改和重置状态,接口与 Preload 返回形状一致。

Sequence Diagram

sequenceDiagram
  participant U as 用户
  participant R as Renderer
  participant A as 现有自动标题
  participant T as Turn 生命周期
  participant D as 动态标题刷新
  participant DB as SQLite
  U->>R: 发送首条消息
  R->>A: maker:auto-title
  A->>DB: 写入首句或普通智能标题
  T->>DB: 持久化 turn ended
  T->>D: 通知刷新 sessionId
  D->>DB: 读取当前标题
  D-->>D: 标题不属于占位符或动态格式
  D-->>T: 跳过生成与写入
Loading
Prompt To Fix All With AI
### Issue 1
apps/desktop/src/main/maker-ipc/dynamicSessionTitle.ts:89-91
**普通自动标题被错误排除**

用户开启动态标题并发送首条文字消息时,现有 `sessionAutoTitle` 会在 turn 结束前把 `New Maker` 替换为用户首句或普通智能标题;这里却只允许覆盖默认占位标题和既有动态格式标题,因此正常任务会以 `title-not-system-owned` 被跳过,模型不会被调用,标题也不会按“日期|类型|主题”更新。

---

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

Reviews (1): Last reviewed commit: "feat(desktop): add opt-in dynamic task t..." | Re-trigger Greptile

Comment thread apps/desktop/src/main/maker-ipc/dynamicSessionTitle.ts Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

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

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

@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Sep 3, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这个 PR 会改用户看得见的任务标题和设置页,已按维护者确认门挂起,等维护者在 PR 上 Approve。讨论 issue:#3868

需要改的话请维护者 Request Changes;作者改完后重新 Approve 即可放行。

@MagicLizi MagicLizi added the awaiting-discussion 等待维护者讨论(review-pr) label Sep 3, 2026
The first-message auto-title (e.g. 你好) was treated as user-owned, so
the new setting never updated real tasks. Opt-in now overwrites those
titles and persists manual renames across restarts.

Signed-off-by: Leng <Lengjingxu@gmail.com>
@MagicLizi

Copy link
Copy Markdown
Contributor

@lengjingxu 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

@MagicLizi

Copy link
Copy Markdown
Contributor

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

Group the dynamic-title switch with the task auto-naming model picker so both halves of the feature live in one place.

Signed-off-by: Leng <Lengjingxu@gmail.com>
…n-title

Signed-off-by: Leng <Lengjingxu@gmail.com>

# Conflicts:
#	docs/design-rules/design-inventory.md
@lengjingxu

Copy link
Copy Markdown
Contributor Author

UI 证据(review-pr:ui-evidence-notice)

开关已从「设置 → 通用 → 应用行为」移到「设置 → 个性化」,紧挨「辅助模型 · 任务自动命名」。以下自包含 HTML 为明暗双模式效果(浏览器直接打开即可预览,也可另存为 .html 文件):

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>设置 → 个性化 · 动态任务标题</title>
<style>
:root{
  --bg:#F5F5F4;--panel:#FFFFFF;--border:#E3E3E1;--text:#3C3F43;--text2:#7A7E83;
  --accent:#4F7CFF;--track:#D9DCE1;--knob:#FFFFFF;--card-shadow:0 1px 2px rgba(0,0,0,.04);
}
.dark{
  --bg:#1C1D1F;--panel:#26282B;--border:#3A3D41;--text:#D4D4D4;--text2:#9A9EA3;
  --accent:#6E93FF;--track:#4A4E53;--knob:#E8E9EA;--card-shadow:0 1px 2px rgba(0,0,0,.3);
}
*{margin:0;padding:0;box-sizing:border-box;font-family:-apple-system,'PingFang SC','Segoe UI',sans-serif}
body{background:#ECEDEE;display:flex;gap:32px;padding:40px;justify-content:center}
.frame{width:560px}
.frame h3{font-size:13px;color:var(--text2);margin-bottom:10px;font-weight:500}
.panel{background:var(--bg);border:1px solid var(--border);border-radius:14px;padding:22px;box-shadow:var(--card-shadow)}
.crumb{font-size:12px;color:var(--text2);margin-bottom:16px}
.crumb b{color:var(--text);font-weight:600}
.cell{background:var(--panel);border:1px solid var(--border);border-radius:12px;padding:16px 18px;display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:12px}
.cell:last-child{margin-bottom:0}
.cell .t{font-size:14px;font-weight:500;color:var(--text)}
.cell .d{font-size:12px;color:var(--text2);margin-top:4px;line-height:1.5}
.sw{width:40px;height:24px;border-radius:12px;background:var(--track);position:relative;flex:none;transition:.2s}
.sw.on{background:var(--accent)}
.sw::after{content:'';position:absolute;top:2px;left:2px;width:20px;height:20px;border-radius:50%;background:var(--knob);transition:.2s;box-shadow:0 1px 2px rgba(0,0,0,.2)}
.sw.on::after{left:18px}
.picker{flex:none;display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text2);border:1px solid var(--border);border-radius:8px;padding:6px 10px;background:var(--bg)}
.tag{display:inline-block;font-size:11px;color:var(--accent);border:1px solid var(--accent);border-radius:6px;padding:1px 6px;margin-left:8px;vertical-align:1px}
.note{font-size:12px;color:var(--text2);margin-top:14px;line-height:1.6}
</style>
</head>
<body>
  <div class="frame">
    <h3>Light · 设置 → 个性化</h3>
    <div class="panel">
      <div class="crumb">设置 / <b>个性化</b></div>
      <div class="cell">
        <div>
          <div class="t">自动更新任务标题<span class="tag"></span></div>
          <div class="d">任务每轮收尾后自动按「日期|类型|主题」更新标题,让任务列表一眼可读。手动改过的名字不会被覆盖。</div>
        </div>
        <div class="sw on" role="switch" aria-checked="true" aria-label="自动更新任务标题"></div>
      </div>
      <div class="cell">
        <div>
          <div class="t">任务自动命名</div>
          <div class="d">适用于 Claude Code、Codex、Pi 任务,以及手动 AI 重命名。</div>
        </div>
        <div class="picker">自动选择(跟随当前任务)▾</div>
      </div>
      <div class="cell">
        <div>
          <div class="t">输入框推荐指令</div>
          <div class="d">仅在"小技巧"中启用输入框推荐后调用。</div>
        </div>
        <div class="picker">自动选择(保持当前规则)▾</div>
      </div>
      <div class="note">开关与「任务自动命名」模型选择相邻,两半同属一处;卡片样式沿用设置页既有开关卡规格。</div>
    </div>
  </div>
  <div class="frame dark">
    <h3>Dark · 设置 → 个性化</h3>
    <div class="panel">
      <div class="crumb">设置 / <b>个性化</b></div>
      <div class="cell">
        <div>
          <div class="t">自动更新任务标题<span class="tag"></span></div>
          <div class="d">任务每轮收尾后自动按「日期|类型|主题」更新标题,让任务列表一眼可读。手动改过的名字不会被覆盖。</div>
        </div>
        <div class="sw on" role="switch" aria-checked="true" aria-label="自动更新任务标题"></div>
      </div>
      <div class="cell">
        <div>
          <div class="t">任务自动命名</div>
          <div class="d">适用于 Claude Code、Codex、Pi 任务,以及手动 AI 重命名。</div>
        </div>
        <div class="picker">自动选择(跟随当前任务)▾</div>
      </div>
      <div class="cell">
        <div>
          <div class="t">输入框推荐指令</div>
          <div class="d">仅在"小技巧"中启用输入框推荐后调用。</div>
        </div>
        <div class="picker">自动选择(保持当前规则)▾</div>
      </div>
      <div class="note">开关与「任务自动命名」模型选择相邻,两半同属一处;卡片样式沿用设置页既有开关卡规格。</div>
    </div>
  </div>
</body>
</html>

@MagicLizi

Copy link
Copy Markdown
Contributor

@lengjingxu 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

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 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants