fix(server): resolve latest available agent thread
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user