Skip to content

Commit 5b97b4b

Browse files
committed
fix: repair message sequence
1 parent fcb966b commit 5b97b4b

File tree

4 files changed

+69
-17
lines changed

4 files changed

+69
-17
lines changed

internal/bootstrap/boot_assembly.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,25 +36,25 @@ type bootInput struct {
3636
}
3737

3838
type bootSpec struct {
39-
settings config.Resolved
40-
activeProvider string
41-
activeModel string
42-
chatModel agentcore.ChatModel
43-
tools []agentcore.Tool
44-
baseTools []agentcore.Tool
39+
settings config.Resolved
40+
activeProvider string
41+
activeModel string
42+
chatModel agentcore.ChatModel
43+
tools []agentcore.Tool
44+
baseTools []agentcore.Tool
4545
systemBlocks []agentcore.SystemBlock
4646
deferredToolsPreamble string
4747
reminders []string
48-
contextFiles config.ContextFiles
49-
skills []config.Skill
50-
mcpManager *mcpclient.Manager
51-
mcpServers map[string]mcpclient.ServerConfig
52-
subagentTool *agentcore.SubAgentTool
53-
bashTool *agentcoretools.BashTool
54-
permission func(context.Context, agentcore.ToolCall) error
55-
policyEngine *policy.Engine
56-
hookMiddleware agentcore.ToolMiddleware // nil = no hooks configured
57-
hookRunner *hooks.Runner
48+
contextFiles config.ContextFiles
49+
skills []config.Skill
50+
mcpManager *mcpclient.Manager
51+
mcpServers map[string]mcpclient.ServerConfig
52+
subagentTool *agentcore.SubAgentTool
53+
bashTool *agentcoretools.BashTool
54+
permission func(context.Context, agentcore.ToolCall) error
55+
policyEngine *policy.Engine
56+
hookMiddleware agentcore.ToolMiddleware // nil = no hooks configured
57+
hookRunner *hooks.Runner
5858
}
5959

6060
func resolveBootInput(opts Options) (*bootInput, error) {

internal/storage/session_context.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,10 @@ func (s *Store) BuildSnapshot() (ContextSnapshot, error) {
131131
}
132132
}
133133

134+
repaired := agentcore.RepairMessageSequence(agentcore.CollectMessages(msgs))
135+
134136
return ContextSnapshot{
135-
Messages: msgs,
137+
Messages: agentcore.ToAgentMessages(repaired),
136138
Provider: lastProvider,
137139
Model: lastModel,
138140
Thinking: lastThinking,

internal/storage/session_context_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,53 @@ func TestBuildContextSnapshotIncludesModelProviderAndThinking(t *testing.T) {
4444
t.Fatalf("messages len = %d, want 1", len(snapshot.Messages))
4545
}
4646
}
47+
48+
func TestBuildSnapshotRepairsMissingToolResult(t *testing.T) {
49+
t.Parallel()
50+
51+
dir := t.TempDir()
52+
store, err := create(dir, "/workspace/project")
53+
if err != nil {
54+
t.Fatalf("create store: %v", err)
55+
}
56+
defer store.Close()
57+
58+
assistant := agentcore.Message{
59+
Role: agentcore.RoleAssistant,
60+
Content: []agentcore.ContentBlock{
61+
agentcore.ToolCallBlock(agentcore.ToolCall{
62+
ID: "toolu_123",
63+
Name: "read",
64+
Args: []byte(`{"path":"README.md"}`),
65+
}),
66+
},
67+
}
68+
if err := store.AppendMessage(assistant); err != nil {
69+
t.Fatalf("append assistant message: %v", err)
70+
}
71+
if err := store.AppendMessage(agentcore.UserMsg("继续")); err != nil {
72+
t.Fatalf("append user message: %v", err)
73+
}
74+
75+
snapshot, err := store.BuildSnapshot()
76+
if err != nil {
77+
t.Fatalf("build context: %v", err)
78+
}
79+
if len(snapshot.Messages) != 3 {
80+
t.Fatalf("messages len = %d, want 3", len(snapshot.Messages))
81+
}
82+
83+
toolMsg, ok := snapshot.Messages[1].(agentcore.Message)
84+
if !ok {
85+
t.Fatalf("snapshot message[1] type = %T, want agentcore.Message", snapshot.Messages[1])
86+
}
87+
if toolMsg.Role != agentcore.RoleTool {
88+
t.Fatalf("message[1] role = %s, want %s", toolMsg.Role, agentcore.RoleTool)
89+
}
90+
if got := toolMsg.Metadata["tool_call_id"]; got != "toolu_123" {
91+
t.Fatalf("tool_call_id = %v, want toolu_123", got)
92+
}
93+
if got := toolMsg.Metadata["is_error"]; got != true {
94+
t.Fatalf("is_error = %v, want true", got)
95+
}
96+
}

scripts/sample.gif

1.95 MB
Loading

0 commit comments

Comments
 (0)