diff --git a/internal/app.go b/internal/app.go index 30ba2eb..ef43b65 100644 --- a/internal/app.go +++ b/internal/app.go @@ -191,10 +191,15 @@ func (m *Model) setUserTitle(sessionID, title string) tea.Cmd { } } if m.history.Cache != nil { - if entry, ok := m.history.Cache[sessionID]; ok { - entry.UserTitle = title - m.cacheDirty = true + entry, ok := m.history.Cache[sessionID] + if !ok { + // 缓存缺 entry(如缓存文件损坏/新会话未入缓存)时补建, + // 否则标题只改内存不落盘,重启后丢失 + entry = &cacheEntry{} + m.history.Cache[sessionID] = entry } + entry.UserTitle = title + m.cacheDirty = true } // 调度落盘,避免改名只存在内存、被磁盘旧缓存覆盖 return cacheFlushTick() diff --git a/internal/edit_title_test.go b/internal/edit_title_test.go index 19aa043..154a4fe 100644 --- a/internal/edit_title_test.go +++ b/internal/edit_title_test.go @@ -98,4 +98,4 @@ func TestEditTitleInput(t *testing.T) { if m.editTitleCursor != 0 { t.Fatalf("esc 应重置光标, got %d", m.editTitleCursor) } -} \ No newline at end of file +} diff --git a/internal/rename_persist_test.go b/internal/rename_persist_test.go index 6d95b0b..2a12704 100644 --- a/internal/rename_persist_test.go +++ b/internal/rename_persist_test.go @@ -53,3 +53,23 @@ func TestRenameSurvivesStaleScan(t *testing.T) { t.Fatalf("扫描后 session UserTitle 丢失: = %q, 期望 \"我的新名\"", s.UserTitle) } } + +// TestSetUserTitleBackfillCacheEntry 验证缓存缺 entry 时(缓存文件损坏/ +// 新会话未入缓存)重命名会补建 entry,保证标题落盘而非只改内存 +func TestSetUserTitleBackfillCacheEntry(t *testing.T) { + m := NewModel() + m.history.Cache = map[string]*cacheEntry{} + + m.setUserTitle("missing-session", "新标题") + + e, ok := m.history.Cache["missing-session"] + if !ok { + t.Fatal("缓存缺 entry 时应补建") + } + if e.UserTitle != "新标题" { + t.Fatalf("补建 entry 应写入标题, got %q", e.UserTitle) + } + if !m.cacheDirty { + t.Fatal("应置 cacheDirty 调度落盘") + } +}