fix(prompt): treat post-dispatch failures as accepted

This commit is contained in:
YeonGyu-Kim
2026-05-20 11:42:32 +09:00
parent f540249838
commit d3e218f912
31 changed files with 503 additions and 76 deletions
+20 -4
View File
@@ -402,7 +402,7 @@ describe("promptWithModelSuggestionRetry", () => {
expect(promptMock).toHaveBeenCalledTimes(1)
})
it("#given promptAsync throws after dispatch was attempted #when caller observes the error #then the post-dispatch hold remains reserved", async () => {
it("#given promptAsync throws after dispatch was attempted #when caller observes ambiguous EOF #then it treats the prompt as accepted and keeps the hold", async () => {
// given
const promptMock = mock().mockRejectedValueOnce(new Error("JSON Parse error: Unexpected EOF"))
const client = { session: { promptAsync: promptMock } }
@@ -415,9 +415,7 @@ describe("promptWithModelSuggestionRetry", () => {
}
// when
await expect(
promptWithModelSuggestionRetry(unsafeTestValue(client), args)
).rejects.toThrow("Unexpected EOF")
await promptWithModelSuggestionRetry(unsafeTestValue(client), args)
const second = await dispatchInternalPrompt({
mode: "async",
client,
@@ -623,6 +621,24 @@ describe("promptSyncWithModelSuggestionRetry", () => {
expect(receivedSignal?.aborted).toBe(true)
})
it("#given sync prompt throws after dispatch was attempted #when caller observes ambiguous EOF #then it treats the prompt as accepted", async () => {
// given
const promptMock = mock().mockRejectedValueOnce(new Error("JSON Parse error: Unexpected EOF"))
const client = { session: { prompt: promptMock } }
// when
await promptSyncWithModelSuggestionRetry(unsafeTestValue(client), {
path: { id: "session-sync-ambiguous-eof" },
body: {
parts: [{ type: "text", text: "hello" }],
model: { providerID: "anthropic", modelID: "claude-sonnet-4" },
},
})
// then
expect(promptMock).toHaveBeenCalledTimes(1)
})
it("should retry with suggested model on ProviderModelNotFoundError", async () => {
// given a client that fails first with model-not-found, then succeeds
const promptMock = mock()