Skip to content

Commit 9cfd72d

Browse files
committed
fix: guard against empty messages slice in SendUserMessage path
Assisted-By: docker-agent
1 parent b4894c8 commit 9cfd72d

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

pkg/runtime/loop.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func (r *LocalRuntime) RunStream(ctx context.Context, sess *session.Session) <-c
110110
events <- ToolsetInfo(len(agentTools), false, a.Name())
111111

112112
messages := sess.GetMessages(a)
113-
if sess.SendUserMessage {
113+
if sess.SendUserMessage && len(messages) > 0 {
114114
lastMsg := messages[len(messages)-1]
115115
events <- UserMessage(lastMsg.Content, sess.ID, lastMsg.MultiContent, len(sess.Messages)-1)
116116
}

pkg/runtime/runtime_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1950,3 +1950,34 @@ func TestMergeExcludedTools(t *testing.T) {
19501950
assert.ElementsMatch(t, []string{"run_skill", "shell", "read_skill"}, result)
19511951
})
19521952
}
1953+
1954+
func TestRunStream_EmptyMessages_SendUserMessage(t *testing.T) {
1955+
t.Parallel()
1956+
1957+
// session.New() defaults to SendUserMessage=true with no messages.
1958+
// With an empty instruction the system prompt is also empty, so
1959+
// GetMessages returns an empty slice.
1960+
// Before the fix, messages[len(messages)-1] panicked with index -1.
1961+
stream := newStreamBuilder().
1962+
AddContent("hello").
1963+
AddStopWithUsage(5, 5).
1964+
Build()
1965+
1966+
prov := &mockProvider{id: "test/mock-model", stream: stream}
1967+
root := agent.New("root", "", agent.WithModel(prov))
1968+
tm := team.New(team.WithAgents(root))
1969+
1970+
rt, err := NewLocalRuntime(tm, WithSessionCompaction(false), WithModelStore(mockModelStore{}))
1971+
require.NoError(t, err)
1972+
1973+
sess := session.New() // SendUserMessage=true, no messages
1974+
sess.Title = "Unit Test"
1975+
1976+
// Must not panic.
1977+
evCh := rt.RunStream(t.Context(), sess)
1978+
var events []Event
1979+
for ev := range evCh {
1980+
events = append(events, ev)
1981+
}
1982+
require.NotEmpty(t, events)
1983+
}

0 commit comments

Comments
 (0)