補上遺漏的氣泡標題列

摘要:
整理記憶中、需要你授權、工具失敗、錯誤訊息、一般通知、掰掰這六個氣泡補上第一行標題。

根本原因:
上一版把氣泡改成兩行時,是以「原本帶(專案名)尾綴」為線索去改呼叫點,
但這六個訊息本來就沒有尾綴,所以整批漏掉,顯示出來只有單行、沒有專案或對話名稱。

影響:
壓縮記憶、等授權、出錯這些最需要知道是哪個 session 的時候,反而看不到來源。

修法:
- handleEvent 內六個 say() 補上 title 參數。
- 選單「動作測試」的氣泡給標題「動作測試」,才分得出是測試不是真的事件。
- first-awake 的「嗨,我是〈寵物名〉」維持沒有標題:它不屬於任何 session,
  訊息本身已含寵物名,CSS 的 :empty 會把空標題整行收起來,不會留空白。

驗證:
以 DOM stub 載入完整 renderer.js 驅動 handleEvent,11 項全過:
PreCompact 的標題與訊息、其餘五個補上的事件都帶標題、原本就有的「完成」仍正常、
對話名稱優先於專案名、無 cwd 也無對話名時標題為空字串、滑鼠停留提示為兩行。
另以靜態掃描確認 handleEvent 內全部 13 個 say() 都帶 title,
並在打包後的 app.asar 上重跑同一項掃描。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-24 14:06:50 +08:00
co-authored by Claude Fable 5
parent 42083acec5
commit cd4b618be0
3 changed files with 10 additions and 10 deletions
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "claude-pet", "name": "claude-pet",
"version": "2.0.6", "version": "2.0.7",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "claude-pet", "name": "claude-pet",
"version": "2.0.6", "version": "2.0.7",
"devDependencies": { "devDependencies": {
"electron": "^43.4.1", "electron": "^43.4.1",
"electron-builder": "^26.0.12" "electron-builder": "^26.0.12"
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "claude-pet", "name": "claude-pet",
"version": "2.0.6", "version": "2.0.7",
"description": "Codex Pets 相容的 Claude Code 桌面寵物(spriteVersionNumber 29 個動作列 + 16 方向追視)", "description": "Codex Pets 相容的 Claude Code 桌面寵物(spriteVersionNumber 29 個動作列 + 16 方向追視)",
"main": "main.js", "main": "main.js",
"private": true, "private": true,
+7 -7
View File
@@ -429,11 +429,11 @@ function handleEvent(p) {
case "PostToolUseFailure": case "PostToolUseFailure":
// Codex:單一工具失敗不會改變 turn 的狀態(turn 還在跑),寵物維持 running,只給個氣泡 // Codex:單一工具失敗不會改變 turn 的狀態(turn 還在跑),寵物維持 running,只給個氣泡
setState(s, "running"); setState(s, "running");
say(`😵 ${p.toolName || "工具"} 失敗了`, 4000); say(`😵 ${p.toolName || "工具"} 失敗了`, 4000, false, title);
break; break;
case "PermissionRequest": case "PermissionRequest":
setState(s, "waiting"); setState(s, "waiting");
say(`🔐 需要你授權${p.toolName ? `${p.toolName}` : ""}`, 0, true); say(`🔐 需要你授權${p.toolName ? `${p.toolName}` : ""}`, 0, true, title);
break; break;
case "Notification": { case "Notification": {
const t = p.notificationType; const t = p.notificationType;
@@ -447,7 +447,7 @@ function handleEvent(p) {
setState(s, "waiting"); setState(s, "waiting");
say("❓ 有問題想問你", 0, true, title); say("❓ 有問題想問你", 0, true, title);
} else if (p.message) { } else if (p.message) {
say(`💬 ${p.message}`, 4000); say(`💬 ${p.message}`, 4000, false, title);
} }
break; break;
} }
@@ -461,7 +461,7 @@ function handleEvent(p) {
case "StopFailure": case "StopFailure":
// Codexturn 失敗 → failed 狀態(播 failed 3 次後沉澱),維持到下一個 turn 或 1 小時到期 // Codexturn 失敗 → failed 狀態(播 failed 3 次後沉澱),維持到下一個 turn 或 1 小時到期
setState(s, "failed"); setState(s, "failed");
say(`${p.error || "出錯了"}`, 8000); say(`${p.error || "出錯了"}`, 8000, false, title);
break; break;
case "SubagentStart": case "SubagentStart":
case "SubagentStop": case "SubagentStop":
@@ -469,13 +469,13 @@ function handleEvent(p) {
break; break;
case "PreCompact": case "PreCompact":
setState(s, "running"); setState(s, "running");
say("🗜️ 整理記憶中…", 3000); say("🗜️ 整理記憶中…", 3000, false, title);
break; break;
case "SessionEnd": case "SessionEnd":
sessions.delete(p.sessionId || "default"); sessions.delete(p.sessionId || "default");
if (sessions.size === 0) { if (sessions.size === 0) {
hideBubble(); hideBubble();
say("👋 掰掰", 2000); say("👋 掰掰", 2000, false, title);
} }
break; break;
default: default:
@@ -495,7 +495,7 @@ function handleTest(p) {
} else if (anim in PRIORITY) { } else if (anim in PRIORITY) {
const s = session("test"); const s = session("test");
setState(s, anim); setState(s, anim);
if (anim === "waiting") say("🔐(測試)需要你授權", 0, true); if (anim === "waiting") say("🔐(測試)需要你授權", 0, true, "動作測試");
else if (anim === "idle") hideBubble(); else if (anim === "idle") hideBubble();
} }
report(); report();