feat(desktop): add opt-in dynamic task titles - #3866
Conversation
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>
|
| 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: 跳过生成与写入
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
|
@lengjingxu 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/maker-ipc/dynamicSessionTitle.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
|
这个 PR 会改用户看得见的任务标题和设置页,已按维护者确认门挂起,等维护者在 PR 上 Approve。讨论 issue:#3868 需要改的话请维护者 Request Changes;作者改完后重新 Approve 即可放行。 |
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>
|
@lengjingxu 👋 这个 PR 目前与 请在本地 merge 最新的 |
|
命中 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
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> |
|
@lengjingxu 👋 这个 PR 目前与 请在本地 merge 最新的 |
这次改了什么
摘要
任务列表标题现在默认等于用户的第一句话,开着绿灯/红灯也很难一眼看出任务实质和进度。这次在设置里加了一个默认关闭的开关:打开后,任务每轮收尾会自动把标题更新成全中文的「MMDD|类型|主题」(日期取创建时间的上海时区,类型为功能/设计/修复/优化/发布/探索/文档/研究之一,主题概括当前实质)。手动改过的名字永不覆盖。
这是核心功能,不是插件:任务标题属于任务生命周期,桌面/移动/远程侧边栏共用同一份数据。
变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
UI 变化
怎么验证的
自动验证
手工验证
未在运行中的 Desktop 实机打开设置页拨动开关。双模式实机目检未做(组件复用 themed token,不把这当成已验证)。
未执行的验证
风险
风险分类
影响与回滚
提交前检查
git commit -s,见 DCO)UI 证据
见评论中的自包含 HTML(明暗双模式):开关位于「设置 → 个性化」,紧挨「任务自动命名」模型选择。链接:#3866 (comment)