@@ -193,6 +193,52 @@ describe("sanitizeToolUseResultPairing", () => {
|
193 | 193 | expect(result.moved).toBe(true); |
194 | 194 | }); |
195 | 195 | |
| 196 | +it("moves late real results ahead of newer assistant tool calls instead of synthesizing", () => { |
| 197 | +const input = castAgentMessages([ |
| 198 | +{ |
| 199 | +role: "assistant", |
| 200 | +content: [{ type: "toolCall", id: "call_read", name: "read", arguments: {} }], |
| 201 | +}, |
| 202 | +{ |
| 203 | +role: "assistant", |
| 204 | +content: [{ type: "toolCall", id: "call_exec", name: "exec", arguments: {} }], |
| 205 | +}, |
| 206 | +{ |
| 207 | +role: "toolResult", |
| 208 | +toolCallId: "call_read", |
| 209 | +toolName: "read", |
| 210 | +content: [{ type: "text", text: "real read output" }], |
| 211 | +isError: false, |
| 212 | +}, |
| 213 | +{ |
| 214 | +role: "toolResult", |
| 215 | +toolCallId: "call_exec", |
| 216 | +toolName: "exec", |
| 217 | +content: [{ type: "text", text: "real exec output" }], |
| 218 | +isError: false, |
| 219 | +}, |
| 220 | +]); |
| 221 | + |
| 222 | +const result = repairToolUseResultPairing(input); |
| 223 | + |
| 224 | +expect(result.added).toHaveLength(0); |
| 225 | +expect(result.messages.map((message) => message.role)).toEqual([ |
| 226 | +"assistant", |
| 227 | +"toolResult", |
| 228 | +"assistant", |
| 229 | +"toolResult", |
| 230 | +]); |
| 231 | +expect((result.messages[1] as { toolCallId?: string; isError?: boolean }).toolCallId).toBe( |
| 232 | +"call_read", |
| 233 | +); |
| 234 | +expect((result.messages[1] as { isError?: boolean }).isError).toBe(false); |
| 235 | +expect((result.messages[3] as { toolCallId?: string; isError?: boolean }).toolCallId).toBe( |
| 236 | +"call_exec", |
| 237 | +); |
| 238 | +expect(JSON.stringify(result.messages)).not.toContain("missing tool result"); |
| 239 | +expect(result.moved).toBe(true); |
| 240 | +}); |
| 241 | + |
196 | 242 | it("repairs blank tool result names from matching tool calls", () => { |
197 | 243 | const input = castAgentMessages([ |
198 | 244 | { |
|