diff --git a/server/internal/logic/lovart_agent_mapper.go b/server/internal/logic/lovart_agent_mapper.go index f4324f4..7835bd8 100644 --- a/server/internal/logic/lovart_agent_mapper.go +++ b/server/internal/logic/lovart_agent_mapper.go @@ -8,20 +8,24 @@ import ( "img_infinite_canvas/internal/types" ) -func latestLovartThreadID(project design.Project) string { - if threadID := strings.TrimSpace(project.LastThreadID); threadID != "" { - return threadID - } - for index := len(project.Messages) - 1; index >= 0; index-- { - message := project.Messages[index] - if isHiddenAgentMessage(message) { +func latestLovartThreadID(currentThreadID string, threads []design.AgentThreadSummary) string { + currentThreadID = strings.TrimSpace(currentThreadID) + latestThreadID := "" + var latestTimestamp int64 + for _, thread := range threads { + threadID := strings.TrimSpace(thread.AgentThreadID) + if threadID == "" { continue } - if threadID := strings.TrimSpace(message.ThreadID); threadID != "" { + if threadID == currentThreadID { return threadID } + if latestThreadID == "" || thread.UpdateTimestamp >= latestTimestamp { + latestThreadID = threadID + latestTimestamp = thread.UpdateTimestamp + } } - return "" + return latestThreadID } func toCandaChatHistoryItem(message design.Message, projectID string, threadID string) types.CandaChatHistoryItem { diff --git a/server/internal/logic/lovart_agent_mapper_test.go b/server/internal/logic/lovart_agent_mapper_test.go new file mode 100644 index 0000000..275c637 --- /dev/null +++ b/server/internal/logic/lovart_agent_mapper_test.go @@ -0,0 +1,36 @@ +package logic + +import ( + "testing" + + "img_infinite_canvas/internal/domain/design" +) + +func TestLatestLovartThreadIDKeepsCurrentNonEmptyThread(t *testing.T) { + threads := []design.AgentThreadSummary{ + {AgentThreadID: "thread-current", UpdateTimestamp: 100}, + {AgentThreadID: "thread-latest", UpdateTimestamp: 200}, + } + + if got := latestLovartThreadID("thread-current", threads); got != "thread-current" { + t.Fatalf("expected current non-empty thread, got %q", got) + } +} + +func TestLatestLovartThreadIDFallsBackToLatestNonEmptyThread(t *testing.T) { + threads := []design.AgentThreadSummary{ + {AgentThreadID: "thread-older", UpdateTimestamp: 100}, + {AgentThreadID: "thread-latest", UpdateTimestamp: 300}, + {AgentThreadID: "thread-middle", UpdateTimestamp: 200}, + } + + if got := latestLovartThreadID("thread-empty", threads); got != "thread-latest" { + t.Fatalf("expected latest non-empty thread, got %q", got) + } +} + +func TestLatestLovartThreadIDStaysEmptyWithoutHistory(t *testing.T) { + if got := latestLovartThreadID("thread-empty", nil); got != "" { + t.Fatalf("expected empty thread ID, got %q", got) + } +} diff --git a/server/internal/logic/query_agent_last_thread_logic.go b/server/internal/logic/query_agent_last_thread_logic.go index 0c32e3e..d3fe99d 100644 --- a/server/internal/logic/query_agent_last_thread_logic.go +++ b/server/internal/logic/query_agent_last_thread_logic.go @@ -31,10 +31,14 @@ func (l *QueryAgentLastThreadLogic) QueryAgentLastThread(req *types.QueryAgentLa if err != nil { return nil, err } + threads, err := l.svcCtx.DesignService.AgentThreads(l.ctx, req.ProjectId) + if err != nil { + return nil, err + } return &types.QueryAgentLastThreadResponse{ Code: 0, Msg: nil, - Data: latestLovartThreadID(project), + Data: latestLovartThreadID(project.LastThreadID, threads), }, nil }