Skip to content

feat(desktop-pet): 用原气泡显示工作状态,对话优先 - #82

Merged
Phantivia merged 3 commits into
mainfrom
feat/pet-status-bubble
Oct 7, 2026
Merged

Phantivia merged 3 commits into
mainfrom
feat/pet-status-bubble

Conversation

@leafliber

@leafliber leafliber commented Oct 6, 2026 •

Copy link
Copy Markdown
Member

Coo 干活时原来只剩一个思考表情,读文件、搜索、操作电脑都看不出在做什么;现在默认用原来的气泡显示工作状态,对话始终优先,可在「习惯」里关闭。

信号从哪来

  • 只读主 session 的 outputTap,包括其他 World 和 Persona 的工具调用,不改 Cortico 和 core/companion.ts。
  • 新增 src/activity.ts:用 item.id / item_id 和到达顺序跟踪调用,避开重复的 output_index;参数里的字符串一闭合就能显示细节,不等完整正文或 done。
  • 连续同类调用显示第一个调用的细节和「等 N 个」,中间跳过不显示的工具。onRoundEnd 保留状态,下一轮首个事件才切回思考;onAbort、onTurnEnded 或 120 秒无流事件时清空。
  • World 只在状态变化时发送 { t: 'status', status },init / prefs 带当前状态和开关,状态变化不会触发偏好广播。

每类长什么样

kind 工具 文案与细节 图标与动画
think 一轮开始、尚无工作调用 不写字,无障碍文本「在想」 三点依次起伏
read read_file 在看 · 文件名 纸上的扫描线往下走
browse list_files / glob_files 在翻 · 目录末段加 /(未给目录时为「记忆」)/ 在找 · 匹配模式 文件夹开合
search grep_files 在搜 · 「关键词」 放大镜绕小圈
write write_file / edit_file / append_file 在写 / 在改 / 在补记 · 文件名 铅笔来回划
delete delete_file 在删 · 文件名 桶盖抖动
save save_blob 在存 · 文件名 箭头落进托盘
look cua_screenshot / cua_windows 在看屏幕 / 在看开着的窗口 眼睛左右扫
click cua_click / cua_move / cua_drag / cua_scroll / cua_focus 在点(双击 / 右键有对应文案)/ 在挪鼠标 / 在拖 / 在滚动 / 在切窗口 指针与点击波纹,滚动时换成滚轮动画
type cua_type / cua_key 在打字 / 在按 · 按键;绝不展示打字内容 键帽起落
wait cua_wait 等 · N 秒 沙漏翻转
alarm alarm_set / alarm_list / alarm_cancel 在定闹钟 · 时间或 N 分钟后 / 在看闹钟 / 在取消闹钟 闹钟摇动
work 其他扩展工具 在忙,不显示工具名和参数 完整八齿齿轮旋转
null pet_* / terminal_send / end_turn 不显示 沿用已有的说话、身体动作和收尾

路径只露出最后一段,细节最多 20 字再加省略号;打字内容、闹钟备注、窗口标题和坐标不会出现在状态中。图标沿用 24 单位描边和主题变量,不加声音,并遵循减少动态效果设置。

节奏与位置

  • 状态与对话共用原来的头顶气泡,保留实线轮廓和尖角。说话、提问、确认、引导对话、打字框和聆听出现时立即让位,对话结束后再显示仍在进行的状态,不叠加第二个气泡。
  • 身体的思考表情立即更新;自动思考保留眼神,去掉另一组重复的小圆泡。显式的思考动作仍沿用原有表现。
  • 工作状态直接显示,思考持续 0.6 秒才显示。每条至少停留 1.2 秒(对话可立即打断),只改细节或数量时原地更新,换类别时轻弹,结束时约 0.2 秒淡出。
  • 显示状态时 pointer-events: none,并从交互气泡命中选择器中排除,避免接管那块屏幕的点击。显示对话时恢复原来的交互。

设置

  • 「习惯」新增「显示 Coo 在忙什么」,提供中英文说明,并明确会显示文件名。
  • worlds.desktop-pet.statusBubble 默认开启,支持热更新。关闭时 World 仍发送状态,身体的思考表情照常。
  • 不加入 pet_set,不加入统计。同步更新中英文首页和桌宠包 README,包括页面协议。

这次不做的

  • 不改 Cortico、子模块指针和 core/companion.ts。
  • 不改 ENV_PROMPT。
  • 不扩展形象包接口;按不同工作动作切换身体表情留待后续。
  • 请求已发出、首个流事件尚未到达的空档留待后续。

验证

  • 子模块已同步到仓库锁定的 f180d2f,执行过 pnpm install --frozen-lockfile;本 PR 不含子模块变更。
  • pnpm run test:57 项通过,包含默认开启、开关即时生效、思考去重、延迟与停留时间、对话优先和同一气泡复用。
  • pnpm run test:worlds:148 项通过,1 项真实 Windows 语音识别测试在 macOS 按平台跳过。覆盖工具映射、参数增量、隐私、调用合并、迟到的 done、无 created 的下一轮、中止、结束、超时、状态消息及重连。
  • pnpm run typecheck 通过。
  • pnpm run build:cortico 后执行 pnpm run typecheck:web,均通过。
  • pnpm run typecheck:worlds 通过。
  • 用临时 window.enabled=false 的 DesktopPetWorld 在内置浏览器演示并截图检查了各类图标和动画、连续读文件计数、慢速写文件的文件名提前出现、深浅两套主题、完整齿轮、思考不重复、对话和输入框优先、关闭气泡保留思考表情,以及 180 毫秒秒回时思考气泡不闪。最终页面只有一个气泡;状态区域的 DOM 命中落到下方 stage。临时演示文件已删除,截图不提交。
  • 执行了 pnpm run dev 并启动应用,但原生 Electron 窗口的界面自动化持续超时。未验证真实透明窗口跨应用的点击穿透,也未用真实模型读记忆文件跑一轮;没有读取、打印或填写密钥。

leafliber and others added 3 commits October 6, 2026 12:47
- 合入 main:outputTap 保留 main 的 externalizes: () => false(桌宠可被打断依赖它);
  main 上对话页已占用的 activity 字段不动,状态追踪器改名为 src/status.ts 的 StatusTracker。
- 开始与结束交给 Core 的 RunPhase(onRunPhase):请求模型、重试、交接时是思考,新一轮从思考开始,
  idle 收起。去掉 120 秒无流事件清空的计时器和 onRoundEnd/onAbort/onTurnEnded 的推断。
  outputTap 只读工具调用的名字和参数。
- 工具名到文案的表从 World 包移到 Coopanion 的 core/pet-status.ts,经 desktopPetDefinition({ describeTool })
  传入;World 只保留 pet_* 不显示、其余未描述的工具显示「在忙」。依赖参数的文案(在点/在双击/在右键)
  等参数写完再定。
- 状态气泡关闭时,自动思考照常画思考小圆泡:kit 的身体新收 set({ thoughtShown })。
- 测试随之改写:描述表的用例移到 tests/pet-status-tools.test.ts,追踪器按运行阶段测;去掉 120 秒用例。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Phantivia
Phantivia merged commit 58826ad into main Oct 7, 2026
4 checks passed
@Phantivia

Copy link
Copy Markdown
Member

谢谢 @leafliber!气泡的样子、图标动画、对话优先和显示节奏都照原样保留。合并前追加了一个提交 15c28a7,改的是数据层:

  • 合入 main:对话页已经占用了 activity 这个字段,状态追踪器改名为 src/status.ts 的 StatusTracker;outputTap 保留 main 的 externalizes: () => false,否则新消息打断不了这一轮。
  • 什么时候显示、什么时候收起改由 Core 的运行阶段 onRunPhase 决定:请求模型、重试、交接时是思考,新一轮从思考开始,一批结束时收起。去掉了 120 秒没有流事件就清空的计时器。工具执行期间(比如等你点确认)流里没有事件,计时器会把状态误清掉。
  • 工具名对应文案的表移到 Coopanion 的 core/pet-status.ts,通过 desktopPetDefinition({ describeTool }) 传给 World。World 包不再写死 Persona 和其他 World 的工具名。
  • 「在点」「在双击」「在右键」等参数写完再定,不先说一个之后可能改掉的。
  • 关掉状态气泡时,自动思考照常画思考小圆泡。

会随下一个版本发布。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants