Apply live session titles as soon as the agent sends them - #526
Conversation
Honor session_info_update.title immediately instead of waiting for the next conversation fetch. Seed an unlocked first-prompt title so a live chat is not Untitled while the agent is still working.
|
Thanks for this — the underlying complaint is real and worth fixing, and the way you've wired it up is mostly the way I'd have wired it up too. A few notes below: one thing I think has to change before this can land, and then some smaller stuff. I checked out the branch and ran the suites, so the mechanical side is fine:
What I likeRouting the write through the lifecycle worker rather than doing it inline in The first-prompt seed also reuses Blocking: the chat-channel title sync gets silently switched offA conversation can be bound to a Telegram forum topic, and the topic's name is only ever updated by The two ordinary automatic triggers for that sync both key off "the conditional UPDATE actually wrote a row":
The new To be fair to the PR: it's not unrecoverable — an import scan ( There's precedent for the fix: Worth fixing: CodeBuddy will ping-pong the title on every turnThis one I only found by going and reading the pinned adapter bundle, so it's not obvious from the diff. The write is intentionally left unlocked, which means the next detail load re-parses the session file and overwrites it via
So for a CodeBuddy session with a first message longer than 80 chars and no generated title yet: turn ends → we write the 80-unit title → ~1.5s later I don't think this means "don't do it" — just that the unlocked-write contract deserves to be stated in a comment, and that some guard is needed (normalise both sides, or don't let the live title replace a value the parser just wrote, or make the write authoritative). Smaller stuff (non-blocking)A per-connection dedupe would pay for itself. Related and more of a design question: does this need to be a client-visible
The seed isn't byte-identical for every parser. The invariant holds for agents that use Unbound connections drop the title silently. No Version nit, in your favour. The new comment says "Claude ACP 0.71+ generated titles", but we pin Scope. The first-prompt seed is a second feature under a title about live ACP titles. It's small and well-tested so I don't feel strongly, but note that for Codex the sidebar already picks up thread names on every Summary: approach ✅, layering ✅, tests ✅. The chat-channel sync needs to come along for the ride before this can merge, and I'd want the CodeBuddy ping-pong addressed or at least explicitly bounded. Everything under "smaller stuff" is genuinely optional. Happy to look again once the sync is threaded through — thanks again for digging into this corner, the "running thread sits there untitled" thing has been annoying for a while. |
Push ACP and first-prompt titles through the detached chat-channel sync so bound forum topics follow the sidebar. Skip identical live title events so CodeBuddy cannot flip the name every turn.
|
Wired the title through to the chat-channel sync, detached the same way as the fetch path. Identical live titles are skipped so CodeBuddy does not flip the sidebar every turn. |
The skip-cache decides whether a live ACP title ever reaches the lifecycle worker, and nothing exercised that path — the `conversation_id` guard could have swallowed the feature whole and every suite would still be green. Cover it end to end through the wire: a changed title emits, an identical repeat does not, a title published before the row binds is dropped without poisoning the cache, and a title-less `session_info_update` stays off the path. Pin the two invariants the skip rests on: `ConversationLinked` forgets the cache, and the installed chat-channel handle survives `clone_ref`. Pin the soft-delete predicate on both auto-title primitives. Also fold the skip's test-and-set into one write lock. Split across two acquisitions, the `ConversationLinked` emitted by a concurrent `send_prompt_linked` can land in the gap and clear the cache entry we just wrote, re-admitting the repeat it was recorded to suppress.
|
Re-reviewed I checked the two things the fix depends on and they hold:
I found five things worth changing and, since I couldn't push to the branch, I've fixed them on my side — see the bottom. What I changed1. The skip's test-and-set wasn't atomic. It was a read-lock check, then a separate write-lock set, then To be straight about this one: I first justified it with a 2. No test coverage at all. This was the one that actually worried me. Nothing anywhere drove a
Each was verified load-bearing rather than decorative: I removed each guard in turn and confirmed the matching test goes red, then restored.
3. Documented the 4. "Recovered on the next detail load" isn't true for every agent. 5. Desktop install-ordering window. One thing I looked at and decided not to changeThe detached VerificationOn the final state, with my changes applied:
LandingYour branch is on a fork with Really nice work on this one. The layering was right from the first commit, and the |
|
Thanks for the thorough pass! Landing it from task/84 works for me. I have turned on maintainer edits across my open PRs here too. |
|
Thanks for opening up edit access — the follow-up is now in the PR itself as PR head is now
From my side this is good to merge. 🚀 |
Google Antigravity joins the built-in agents. Sub-agent transcripts and task details slide in from the right instead of opening as a dialog you have to close. ## New - **Google Antigravity is a built-in agent.** Install and launch it from the agent list — history, resume, skills, experts, Office tools, MCP and delegation all wired up — with a settings page for its four sign-in methods. Apple Silicon, Linux and Windows; Google publishes no Intel Mac build. - **Panels slide in beside your work instead of covering it.** The mobile sidebar, aux panel, terminal, settings navigation, skill details and task details are inset drawers now, with nothing dimmed behind them. - **Session viewers stack.** Sub-agent, work-task and grok child transcripts nest inside one another rather than burying each other, and no longer close when their card scrolls away or you switch tabs. - **Repository items open in a side panel.** The full description, every label and the same Start action — without leaving for the forge and losing your filters, page and scroll position. - **Choose which navigation rows the sidebar shows.** Automations, To-dos and the Repository panel each switch off in the view options and stay reachable from quick actions. - **A session takes its title as soon as the agent picks one**, along with any forum topic bound to it. (#526, @Adam-Dalloul) - **Workspace backgrounds accept GIF**, and animated ones play through the blur and the frosted panels. - **Reclaim a finished task's leftover worktree.** One button in the task drawer removes the checkout and its work branch; the task stays on the board. ## Improved - **Updated bundled agents.** DeepSeek Harness 0.6.0, OpenCode 1.18.21, Cline 3.0.57. - **DeepSeek Harness 0.6.0 support.** Image prompts keep their pictures, compaction reports tokens and elapsed time, and forking, image upload and multi-provider models turn on when the agent advertises them. - **The sidebar's view options are sorted out.** Toggles move into submenus so Sort by and Section order come first, and expand/collapse-all becomes its own header button that folds the flat sections too. - **System messages show a preview.** Claude Code's post-`/compact` summary was a shut accordion; it renders clamped now, with a toggle only when there is more to see. ## Fixed - **Codex sessions created by other tools display properly.** One recorded without Codex's usual event channel came back as a bare "Used 25 tools". (#452) - **pi keeps its status lines out of its answers**, and routes retries to the shared banner. (#525) - **A proxy typed without `http://` no longer breaks agent installs**, which used to abort with an unexplained `ERR_INVALID_URL`; `socks5://` addresses are left alone. - **Claude's model picker no longer lists `null`.** Binding a provider with no model wrote literal nulls into `~/.claude/settings.json`. - **Office lock files stop previewing themselves**, each costing a tab and a watcher over a `~$` file that can never render. - **A GitLab account shows its initials when its avatar can't load**, instead of an empty circle. - **The comment written back on an issue stops linking to the wrong page**, and a locally merged task no longer reads as work that shipped. - **A repository row keeps its task badge.** A stale lookup blanked it, so an issue already being worked on offered Start — and got a second task. - **A finished task's worktree removal isn't refused.** Merge recovery left a dead connection behind that read as an agent still working in there. - **A task in review survives a cancelled session.** (#546, @lizzjin) - **An agent home written as `~/…` resolves to the right place.** Hermes built a literal `~` directory beside its launch directory; Antigravity and DeepSeek were refused write access to the tree they actually use. Thanks to @Adam-Dalloul and @lizzjin for contributing to this release. ----------------------------- # 发布版本 0.28.0 Google Antigravity 加入内置智能体。 子会话、任务详情改从右侧滑出,不再是看完必须关掉的弹窗。 ## 新增 - **Google Antigravity 成为内置智能体。** 可从智能体列表安装启动,历史会话、恢复、技能、专家、Office 工具、MCP 与委托均已接通,并有独立设置页配置它的四种登录方式。支持 Apple 芯片 Mac、Linux 与 Windows;Google 未发布 Intel Mac 版本。 - **面板改从侧边滑出,不再盖住整个界面。** 移动端侧边栏、辅助面板、终端、设置导航、技能详情、任务详情都换成留边抽屉,背后不再压一层灰罩。 - **会话查看器可以层叠。** 子智能体、看板任务、grok 子会话的转写层层嵌套而不互相盖掉,卡片滚出屏幕或切换标签页时也不会自己关掉。 - **仓库条目在侧边面板里打开。** 完整描述、全部标签和同一个「开始」操作都在,不必跳去网页再回来重找筛选、页码和滚动位置。 - **侧边栏显示哪些导航入口可以自己选。** 自动化、待办任务、仓库面板都能单独关掉,关掉后仍可从快捷操作进入。 - **智能体刚定下标题,会话就立刻改名**,绑定的论坛话题同步跟上。(#526,@Adam-Dalloul) - **工作区背景支持 GIF**,动图在磨砂与模糊图层下照常播放。 - **已结束任务残留的工作树可单独回收。** 任务抽屉里一个按钮删掉检出目录与工作分支,任务仍留在看板上。 ## 改进 - **内置智能体版本更新。** DeepSeek Harness 0.6.0、OpenCode 1.18.21、Cline 3.0.57。 - **适配 DeepSeek Harness 0.6.0。** 带图提问不再丢图,上下文压缩会显示 token 数与耗时;会话分叉、图片上传、多供应商模型在智能体自报支持时自动开启。 - **侧边栏显示选项重新归置。** 各类开关收进子菜单,排序方式与分区顺序回到最上;全部展开/折叠独立成标题栏按钮,也能折叠聊天、最近这类扁平分区。 - **系统消息直接显示预览。** Claude Code 执行 `/compact` 后的续写摘要此前只是个折叠条,现在限高显示,内容超出时才出现展开按钮。 ## 修复 - **其他工具创建的 Codex 会话能正常显示了。** 缺少 Codex 常规事件通道的记录打开后只剩一句「使用了 25 个工具」。(#452) - **pi 不再把自己的状态提示混进回答**,重试改走统一提示条。(#525) - **代理地址没写 `http://` 不再让智能体装不上**,此前会以一句没头没尾的 `ERR_INVALID_URL` 失败;`socks5://` 等已带协议的地址保持原样。 - **Claude 的模型选择器不再列出一排 `null`。** 绑定没有配置模型的供应商时,会往 `~/.claude/settings.json` 里写入 null。 - **Office 锁文件不再自动预览**,此前每个 `~$` 文件都白占一个标签页和一个监听进程。 - **头像加载不出来时 GitLab 账号显示名称首字母**,不再是个空白圆圈。 - **回写到议题下的评论不再链到无关页面**,就地合并的任务也不再宣称成果已经推送。 - **仓库条目的任务标记不会莫名消失。** 过期查询会把它抹掉,于是已在处理的议题又显示「开始」,再点一次就多一个重复任务。 - **已完成任务的工作树不再拒绝删除。** 合并恢复留下的死连接被当成「还有智能体在里面干活」。 - **进入评审的任务不会被会话取消顶掉。**(#546,@lizzjin) - **写成 `~/…` 的智能体主目录能正确解析。** Hermes 会在启动目录旁建出真名为 `~` 的文件夹;Antigravity 与 DeepSeek 则反被挡在真正所在的目录之外。 感谢 @Adam-Dalloul 与 @lizzjin 为本次发布做出的贡献。
Google Antigravity joins the built-in agents. Sub-agent transcripts and task details slide in from the right instead of opening as a dialog you have to close. ## New - **Google Antigravity is a built-in agent.** Install and launch it from the agent list — history, resume, skills, experts, Office tools, MCP and delegation all wired up — with a settings page for its four sign-in methods. Apple Silicon, Linux and Windows; Google publishes no Intel Mac build. - **Panels slide in beside your work instead of covering it.** The mobile sidebar, aux panel, terminal, settings navigation, skill details and task details are inset drawers now, with nothing dimmed behind them. - **Session viewers stack.** Sub-agent, work-task and grok child transcripts nest inside one another rather than burying each other, and no longer close when their card scrolls away or you switch tabs. - **Repository items open in a side panel.** The full description, every label and the same Start action — without leaving for the forge and losing your filters, page and scroll position. - **Choose which navigation rows the sidebar shows.** Automations, To-dos and the Repository panel each switch off in the view options and stay reachable from quick actions. - **A session takes its title as soon as the agent picks one**, along with any forum topic bound to it. (#526, @Adam-Dalloul) - **Workspace backgrounds accept GIF**, and animated ones play through the blur and the frosted panels. - **Reclaim a finished task's leftover worktree.** One button in the task drawer removes the checkout and its work branch; the task stays on the board. - **Tell the agent how to land the merge.** The merge dialog gains an optional instructions box — "prefer this branch's side on any conflict", "update the changelog on the way" — and a merge waiting in the queue lands under the instructions it was queued with. (0.28.1) ## Improved - **Updated bundled agents.** DeepSeek Harness 0.6.0, OpenCode 1.18.21, Cline 3.0.57. - **DeepSeek Harness 0.6.0 support.** Image prompts keep their pictures, compaction reports tokens and elapsed time, and forking, image upload and multi-provider models turn on when the agent advertises them. - **The sidebar's view options are sorted out.** Toggles move into submenus so Sort by and Section order come first, and expand/collapse-all becomes its own header button that folds the flat sections too. - **System messages show a preview.** Claude Code's post-`/compact` summary was a shut accordion; it renders clamped now, with a toggle only when there is more to see. ## Fixed - **Codex sessions created by other tools display properly.** One recorded without Codex's usual event channel came back as a bare "Used 25 tools". (#452) - **pi keeps its status lines out of its answers**, and routes retries to the shared banner. (#525) - **A proxy typed without `http://` no longer breaks agent installs**, which used to abort with an unexplained `ERR_INVALID_URL`; `socks5://` addresses are left alone. - **Claude's model picker no longer lists `null`.** Binding a provider with no model wrote literal nulls into `~/.claude/settings.json`. - **Office lock files stop previewing themselves**, each costing a tab and a watcher over a `~$` file that can never render. - **A GitLab account shows its initials when its avatar can't load**, instead of an empty circle. - **The comment written back on an issue stops linking to the wrong page**, and a locally merged task no longer reads as work that shipped. - **A repository row keeps its task badge.** A stale lookup blanked it, so an issue already being worked on offered Start — and got a second task. - **A finished task's worktree removal isn't refused.** Merge recovery left a dead connection behind that read as an agent still working in there. - **A task in review survives a cancelled session.** (#546, @lizzjin) - **An agent home written as `~/…` resolves to the right place.** Hermes built a literal `~` directory beside its launch directory; Antigravity and DeepSeek were refused write access to the tree they actually use. - **A merged task shows "worktree removed" right away**, instead of keeping the old badge until the board is refetched. (0.28.1) Thanks to @Adam-Dalloul and @lizzjin for contributing to this release. ----------------------------- # 发布版本 0.28.0 && 0.28.1 Google Antigravity 加入内置智能体。 子会话、任务详情改从右侧滑出,不再是看完必须关掉的弹窗。 ## 新增 - **Google Antigravity 成为内置智能体。** 可从智能体列表安装启动,历史会话、恢复、技能、专家、Office 工具、MCP 与委托均已接通,并有独立设置页配置它的四种登录方式。支持 Apple 芯片 Mac、Linux 与 Windows;Google 未发布 Intel Mac 版本。 - **面板改从侧边滑出,不再盖住整个界面。** 移动端侧边栏、辅助面板、终端、设置导航、技能详情、任务详情都换成留边抽屉,背后不再压一层灰罩。 - **会话查看器可以层叠。** 子智能体、看板任务、grok 子会话的转写层层嵌套而不互相盖掉,卡片滚出屏幕或切换标签页时也不会自己关掉。 - **仓库条目在侧边面板里打开。** 完整描述、全部标签和同一个「开始」操作都在,不必跳去网页再回来重找筛选、页码和滚动位置。 - **侧边栏显示哪些导航入口可以自己选。** 自动化、待办任务、仓库面板都能单独关掉,关掉后仍可从快捷操作进入。 - **智能体刚定下标题,会话就立刻改名**,绑定的论坛话题同步跟上。(#526,@Adam-Dalloul) - **工作区背景支持 GIF**,动图在磨砂与模糊图层下照常播放。 - **已结束任务残留的工作树可单独回收。** 任务抽屉里一个按钮删掉检出目录与工作分支,任务仍留在看板上。 - **合并时可以给智能体补充说明。** 合并对话框新增可选的说明框——「冲突时以本分支为准」「顺手更新一下 changelog」——排队等待的合并也沿用入队时填的说明。(0.28.1) ## 改进 - **内置智能体版本更新。** DeepSeek Harness 0.6.0、OpenCode 1.18.21、Cline 3.0.57。 - **适配 DeepSeek Harness 0.6.0。** 带图提问不再丢图,上下文压缩会显示 token 数与耗时;会话分叉、图片上传、多供应商模型在智能体自报支持时自动开启。 - **侧边栏显示选项重新归置。** 各类开关收进子菜单,排序方式与分区顺序回到最上;全部展开/折叠独立成标题栏按钮,也能折叠聊天、最近这类扁平分区。 - **系统消息直接显示预览。** Claude Code 执行 `/compact` 后的续写摘要此前只是个折叠条,现在限高显示,内容超出时才出现展开按钮。 ## 修复 - **其他工具创建的 Codex 会话能正常显示了。** 缺少 Codex 常规事件通道的记录打开后只剩一句「使用了 25 个工具」。(#452) - **pi 不再把自己的状态提示混进回答**,重试改走统一提示条。(#525) - **代理地址没写 `http://` 不再让智能体装不上**,此前会以一句没头没尾的 `ERR_INVALID_URL` 失败;`socks5://` 等已带协议的地址保持原样。 - **Claude 的模型选择器不再列出一排 `null`。** 绑定没有配置模型的供应商时,会往 `~/.claude/settings.json` 里写入 null。 - **Office 锁文件不再自动预览**,此前每个 `~$` 文件都白占一个标签页和一个监听进程。 - **头像加载不出来时 GitLab 账号显示名称首字母**,不再是个空白圆圈。 - **回写到议题下的评论不再链到无关页面**,就地合并的任务也不再宣称成果已经推送。 - **仓库条目的任务标记不会莫名消失。** 过期查询会把它抹掉,于是已在处理的议题又显示「开始」,再点一次就多一个重复任务。 - **已完成任务的工作树不再拒绝删除。** 合并恢复留下的死连接被当成「还有智能体在里面干活」。 - **进入评审的任务不会被会话取消顶掉。**(#546,@lizzjin) - **写成 `~/…` 的智能体主目录能正确解析。** Hermes 会在启动目录旁建出真名为 `~` 的文件夹;Antigravity 与 DeepSeek 则反被挡在真正所在的目录之外。 - **合并完成的任务立刻显示「工作树已删除」**,不必等整页刷新才更新徽章。(0.28.1) 感谢 @Adam-Dalloul 与 @lizzjin 为本次发布做出的贡献。
The sidebar was waiting until you reopened a chat before it used the agent's own session name. That's why a running thread often sat there untitled even though the name already existed.
This listens for the ACP session title update and writes it as soon as it shows up. Nothing extra is polled. If the agent hasn't sent a name yet, the first prompt is used so the row isn't blank, and a rename you made yourself is left alone.
Agents that never send a live title keep the first-prompt name until they do.