fix(server): resolve latest available agent thread

This commit is contained in:
2026-07-10 14:46:30 +08:00
parent 9d47cb9bbd
commit f288eb1365
3 changed files with 54 additions and 10 deletions
+13 -9
View File
@@ -8,20 +8,24 @@ import (
"img_infinite_canvas/internal/types" "img_infinite_canvas/internal/types"
) )
func latestLovartThreadID(project design.Project) string { func latestLovartThreadID(currentThreadID string, threads []design.AgentThreadSummary) string {
if threadID := strings.TrimSpace(project.LastThreadID); threadID != "" { currentThreadID = strings.TrimSpace(currentThreadID)
return threadID latestThreadID := ""
} var latestTimestamp int64
for index := len(project.Messages) - 1; index >= 0; index-- { for _, thread := range threads {
message := project.Messages[index] threadID := strings.TrimSpace(thread.AgentThreadID)
if isHiddenAgentMessage(message) { if threadID == "" {
continue continue
} }
if threadID := strings.TrimSpace(message.ThreadID); threadID != "" { if threadID == currentThreadID {
return threadID 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 { func toCandaChatHistoryItem(message design.Message, projectID string, threadID string) types.CandaChatHistoryItem {
@@ -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)
}
}
@@ -31,10 +31,14 @@ func (l *QueryAgentLastThreadLogic) QueryAgentLastThread(req *types.QueryAgentLa
if err != nil { if err != nil {
return nil, err return nil, err
} }
threads, err := l.svcCtx.DesignService.AgentThreads(l.ctx, req.ProjectId)
if err != nil {
return nil, err
}
return &types.QueryAgentLastThreadResponse{ return &types.QueryAgentLastThreadResponse{
Code: 0, Code: 0,
Msg: nil, Msg: nil,
Data: latestLovartThreadID(project), Data: latestLovartThreadID(project.LastThreadID, threads),
}, nil }, nil
} }