ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ClawX 会话标题修复:让 ACP 截断的工作目录信封不再成为主会话标题

ClawX 会话标题修复:让 ACP 截断的工作目录信封不再成为主会话标题 人工智能AI 应用桌面应用交互助手【免费下载链接】ClawXClawX is a desktop app that provides a graphical interface for OpenClaw AI agents. It turns CLI-based AI orchestration into a desktop experience without using the terminal. China website is https://clawx.com.cn.项目地址https://gitcode.com/gh_mirrors/cl/ClawX点击查看免费下载ClawX 作为 OpenClaw AI Agent 的桌面图形界面其会话列表与聊天头部的标题来自 OpenClaw ACP 协议的自动标题。当自动标题被截断为只剩[Working directory: …]…这样的工作目录信封时用户看到的就是一串路径元数据而不是真正的对话内容。本篇基于仓库中的任务规格 fix-default-main-cwd-title.md 及其关联的源码、测试完整剖析 ClawX 如何识别、剥离并修复这类合成标题包括对 canonicalagent:main:main会话的特殊处理以及配套的补全生命周期、验证命令与边界规则。问题背景ACP 协议中的工作目录信封OpenClaw 的 ACPAgent Client Protocol会话在消息内容前注入工作目录标记以让 Agent 感知当前cwd。ClawX 依赖这一点因此必须在 ACP 载荷中保持_meta.prefixCwd: true见规则 session-workspace-authority.md关闭该注入会直接破坏 OpenClaw 的上下文。参考文档 chat-workspace-and-navigation.md 明确说明ACP keeps_meta.prefixCwd: true; disabling cwd injection would break OpenClaw context.代价是自动标题中会混入[Working directory: …]信封。正常情况下自动标题形如[Working directory: ~/.openclaw/workspace] 给我写一个脚本而当标题被长度限制截断、恰好只剩下信封本身时就会出现[Working directory: ~/.openclaw/workspace]…这串内容没有任何用户提示信息若直接作为侧边栏或聊天头部标题显示就是截断的 cwd 标题泄漏到用户可见标题的问题——这正是任务 fix-default-main-cwd-title.md 要修复的核心场景。任务规格解读修复目标与验收标准任务规格定义的行为目标是expectedUserBehaviorcanonicalagent:main:main会话的自动标题若只有[Working directory: …]…应改用其第一条真实用户提示作为标题在 transcript-summary 标题补全完成之前合成 cwd 信封不应显示为可见标题用户显式设置的、恰好长得像工作目录信封的标签必须原样保留、不被剥离Renderer 继续使用 Main 主进程持有的会话摘要summary路由不另起炉灶。对应的验收标准acceptance合成的截断 cwd 标题被排除在自动标题显示来源之外canonical main 会话的自动标题为截断 cwd 信封时即使其 workspace 已经解析仍然参与摘要补全会话记录的第一条用户提示替换合成自动标题显式用户标签不会被当作 cwd 元数据剥离或拒绝。规格还圈定了改动范围touchedAreas核心实现集中在 session-title.ts 与 session-label-hydration.ts并挂接了对应的单测、集成测试与 e2e 测试。核心判定逻辑shared/chat/session-title.ts标题处理的唯一事实来源是共享模块 shared/chat/session-title.ts它被 Renderer 各页面、store 与测试共同引用保证同一会话在侧边栏、聊天头部等处显示一致的标题。三类合成标题的识别模块顶部定义了三条正则session-title.ts正则用途ACP_WORKING_DIRECTORY_PREFIX匹配行首的一个完整工作目录信封及其后至多两个换行用于从自动标题中剥离元数据ACP_WORKING_DIRECTORY_TRUNCATED_TITLE匹配仅剩信封 省略号的截断形态判定标题缺失OPENCLAW_SESSION_ID_FALLBACK_TITLE匹配 OpenClaw 生成的UUID 前 8 位 (YYYY-MM-DD)回退标题对应的判定函数stripAcpWorkingDirectoryPrefix(text)只剥离首个行首信封并顺带清除其后的空白行isAcpWorkingDirectoryTruncatedTitle(text)判定是否截断信封要求文本 trim 后精确匹配^\[Working directory: [^\r\n]*\]…$isGatewayAcpPlaceholderDisplayName(text)判定是否 Gateway 的传输占位符ACPisOpenClawSessionIdFallbackTitle(text, sessionId)只有当日期标题的 UUID 前缀与该行记录的完整 sessionId 前缀一致时才判为合成标题。这些判定有一个共同的严谨点识别范围刻意收窄。例如 tests/unit/session-title.test.ts 验证了[Working directory: …]\n\n…信封后还有省略号正文不算截断标题…单独出现也不算——只有信封直接结尾这一种形态才被当作缺失标题。显示标题的解析优先级getSessionDisplayTitle(session, sessionLabels)session-title.ts按如下顺序解析显式标签来自sessionLabels[key]或session.label只要非空且不是 UUID 回退标题即优先采用——即使它长得像 cwd 信封也原样返回自动候选依次尝试derivedTitle非 displayName 来源与displayName逐一对候选做四重过滤占位符ACP仅 displayName 来源、截断 cwd 信封、UUID 回退标题、剥离前缀后为空最终回退返回session.key。对自动候选剥离信封的动作是stripAcpWorkingDirectoryPrefix(candidate).trim()因此[Working directory: ~/.openclaw/workspace]\n\nExplain this repository会显示为Explain this repository。单测 session-title.test.ts 覆盖了移除自动标题中的 cwd 元数据跳过截断信封转而使用 displayName保留长得像信封的显式标签跳过启动期 Gateway 占位符 ACP等关键路径。补全生命周期src/stores/chat/session-label-hydration.ts仅靠解析逻辑不足以修复问题——当自动标题只剩截断信封时需要从 Main 的 transcript summary 中取得第一条用户提示来回填。这由 session-label-hydration.ts 驱动。补全候选判定canonical main 的例外getSessionLabelHydrationCandidatesession-label-hydration.ts决定某个会话是否值得发起摘要补全。它的关键分支本地创建或幽灵形态的默认主会话createdLocally或updatedAt缺失且 displayName 缺失/等于 key直接返回null默认 main 会话agent:main:main在 workspace 已知且无需合成标题修复时跳过补全——这正是原问题的诱因workspace 解析一旦完成之前的实现会抑制标题补全但只要derivedTitle命中isAcpWorkingDirectoryTruncatedTitle或 UUID 回退标题needsSyntheticTitleRepair就会置真此时即使 workspace 已解析仍发起补全。集成测试 chat-store-session-label-fetch.test.ts 精确验证了这个例外canonicalagent:main:main的derivedTitle为[Working directory: ~/.openclaw/workspace]…且workspacePath已知时候选人仍然返回随后经/api/sessions/summaries把标题补全为摘要中的给我写一个脚本。版本号与防重入为避免补全结果被陈旧的目录/摘要刷新覆盖模块为每个会话维护了一个版本字符串${incarnation}|${activityVersion}|${backendLabel}其中incarnation在clearSessionLabelHydrationTracking时自增用于作废旧跟踪activityVersion来自updatedAt或最近活动时间backendLabel为规范化后的后端标签。beginSessionLabelHydration只有在版本号仍最新且既非 in-flight 也非已处理时才放行finishSessionLabelHydration记录结果并登记 outcomelabeled/empty/error/backend-labelabandonSessionLabelHydration用于失败时释放 in-flight 标记。这套机制保证同一版本只补全一次且显式标签outcome 为backend-label不会在后续刷新中被摘要覆盖。并发与重试参数模块导出两个可供引用的常量session-label-hydration.tsLABEL_FETCH_CONCURRENCY 5摘要拉取的并发上限LABEL_FETCH_RETRY_DELAYS_MS [2000, 5000, 10000]失败重试的三级退避间隔。服务端摘要来源electron/services/sessions-api.ts补全所需的第一条用户提示由 Main 主进程提供。sessions.summariessessions-api.ts接收一批sessionKeys仅接受agent:前缀的 key通过readOpenClawAcpSessionCwds读取各会话的 ACP cwd再对每个会话调用loadSessionSummary。summarizeTranscriptMessagessessions-api.ts逐条扫描 transcript记录最后一条时间戳作为lastTimestamp找到第一条 role 为user且非内部文本的消息文本作为firstUserText内部摘要文本如 OpenClaw heartbeat 轮询文本会被识别并跳过若整个 transcript 只有 heartbeat 轮询则标记heartbeatOnly且firstUserText保持null。这意味着补全标题取自真实用户提示而 heartbeat 会话永远不会被错误地用于生成标题——与规格中以第一条真实用户提示命名的要求一一对应。边界行为显式标签与传输占位符用户显式标签绝不剥离任务规格特别强调显式用户标签不被当作 cwd 元数据剥离或拒绝。即使显式标签全文就是[Working directory: /user-chosen]…getSessionDisplayTitle也会原样返回集成测试 chat-store-session-label-fetch.test.ts 验证了显式后端标签 自动标题带 cwd 元数据时显式标签获胜且标签中的空白、元数据样式文本均被保留仅做显示级格式化。与之对称stripAcpWorkingDirectoryPrefix只作用于自动来源非前置的信封用户正文中出现[Working directory: …]以及后续连续信封中的第二个信封都不会被误删session-title.test.ts。Gateway 占位符与 UUID 回退标题启动期 Gateway 的 ACP bridge 显示名ACP是传输来源transport provenance不是会话标题规则 session-workspace-authority.md 明令其不得在摘要补全完成前短暂可见getSessionDisplayTitle会跳过它仅限 displayName 来源用户显式命名为ACP仍保留。OpenClaw 的UUID 前 8 位 (YYYY-MM-DD)回退标题只有在前缀与该行完整 sessionId 匹配时才判为合成并触发补全chat-store-session-label-fetch.test.ts 验证72e4b28b (2026-07-22)被替换为用浏览器打开B站且打开重命名模式但不修改内容不会把回退标题持久化为显式标签。测试与验证体系任务规格的requiredTests给出了完整的验证命令可直接在仓库根目录执行# 校验任务规格本身的文档一致性 pnpm harness validate --spec harness/specs/tasks/fix-default-main-cwd-title.md # 单元 集成测试标题解析与补全生命周期 pnpm exec vitest run tests/unit/session-title.test.ts tests/unit/chat-store-session-label-fetch.test.ts # 类型检查 pnpm run typecheck # e2ecanonical main 会话的截断标题替换 pnpm exec playwright test tests/e2e/chat-workspace-context.spec.ts # 通信回归replay / compare pnpm run comms:replay pnpm run comms:compare测试矩阵覆盖的典型场景包括单测session-title.test.ts信封剥离的 Unix/Windows 路径、仅剥离首个信封、保留缩进与正文、截断形态判定、占位符与 UUID 回退判定、显示标题优先级集成测试chat-store-session-label-fetch.test.tscanonical main 会话在 workspace 已知时仍补全截断标题超长信封剥离后按 50 字符显示截断末尾追加…用户手写的连续信封行与后续正文一起保留transport 信封经元数据清理后移除显式后端标签在重复目录/摘要刷新中保持稳定e2e 测试chat-workspace-context.spec.tscanonical main session replaces a truncated cwd title with the first user prompt模拟derivedTitle [Working directory: ~/.openclaw/workspace]…与摘要首条用户文本[Working directory: …]\n\n给我写一个脚本最终断言侧边栏默认分组显示给我写一个脚本且不出现[Working directory:。在规范体系中的定位该任务属于gateway-backend-communication场景并挂在更大的 chat-workspace-and-navigation.md 用户可见流程之下其行为约束由 session-workspace-authority.md 规则统摄完整行为设计见参考文档 chat-workspace-and-navigation.md。从任务 → 场景 → 规则 → 参考的层级看本次修复的本质是把截断 cwd 信封从可显示的自动标题降级为缺失标题再借由 Main 的 transcript summary 用第一条真实用户提示回填同时确保显式标签、传输占位符与 UUID 回退标题三类边界行为互不干扰。这套识别—排除—补全的三段式设计正是 ClawX 在标题层面保持 ACP 元数据与用户可见内容分离的落点。赞分享人工智能AI 应用桌面应用交互助手【免费下载链接】ClawXClawX is a desktop app that provides a graphical interface for OpenClaw AI agents. It turns CLI-based AI orchestration into a desktop experience without using the terminal. China website is https://clawx.com.cn.项目地址https://gitcode.com/gh_mirrors/cl/ClawX点击查看免费下载相关推荐ClawX 修复 ACP 侧边栏标题竞态让本地新建会话在首条提示词就绪前保持隐藏ClawX 修复 ACP 侧边栏标题竞态让本地新建会话在首条提示词就绪前保持隐藏 导读 本篇文章围绕 ClawX 中一项名为 fix acp sidebar人工智能AI 应用桌面应用交互助手告别会话中断shpool让你的终端会话持久化不再依赖tmux告别会话中断shpool让你的终端会话持久化不再依赖tmux 你是否经历过SSH连接突然断开几小时的工作进度瞬间丢失是否厌烦了tmux复杂的快捷键和非原生ClawX 聊天工作空间上下文以 OpenClaw ACP cwd 为唯一权威的会话绑定、标题规范与导航实战指南ClawX 聊天工作空间上下文以 OpenClaw ACP cwd 为唯一权威的会话绑定、标题规范与导航实战指南 本篇技术指南围绕 ClawX 桌面端的聊天人工智能AI 应用桌面应用交互助手上一篇BISE编码技术解析ASTC如何用分数比特实现高效纹理压缩下一篇CleanRL 完整教程快速跑通第一个单文件强化学习实验创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表