diff --git a/src/lib/oauth/kiroSocialPoll.ts b/src/lib/oauth/kiroSocialPoll.ts index e6c332f79b..70cbfec7e2 100644 --- a/src/lib/oauth/kiroSocialPoll.ts +++ b/src/lib/oauth/kiroSocialPoll.ts @@ -1,5 +1,7 @@ export type KiroSocialPollData = { error?: unknown; + /** Kiro reports poll progress here (e.g. "authorization_pending"), not in `error`. */ + status?: unknown; accessToken?: unknown; refreshToken?: unknown; }; @@ -26,8 +28,9 @@ export function classifyKiroSocialPoll( responseStatus: number, data: KiroSocialPollData ): KiroSocialPollOutcome { - if (data.error === "authorization_pending" || data.error === "slow_down") { - return { kind: "pending", error: data.error }; + const progress = data.error ?? data.status; + if (progress === "authorization_pending" || progress === "slow_down") { + return { kind: "pending", error: progress as "authorization_pending" | "slow_down" }; } if (!responseOk || data.error) { diff --git a/tests/unit/kiro-social-poll.test.ts b/tests/unit/kiro-social-poll.test.ts index 359cfa6d0a..35d2acf136 100644 --- a/tests/unit/kiro-social-poll.test.ts +++ b/tests/unit/kiro-social-poll.test.ts @@ -21,6 +21,26 @@ test("classifyKiroSocialPoll keeps only documented pending states retryable", () }); }); +test("classifyKiroSocialPoll treats status as alias of error for pending states", () => { + // Kiro upstream returns progress in `status`, not `error` + assert.deepEqual(classifyKiroSocialPoll(true, 200, { status: "authorization_pending" }), { + kind: "pending", + error: "authorization_pending", + }); + assert.deepEqual(classifyKiroSocialPoll(true, 200, { status: "slow_down" }), { + kind: "pending", + error: "slow_down", + }); + // error takes precedence over status if both present + assert.deepEqual( + classifyKiroSocialPoll(true, 200, { error: "slow_down", status: "authorization_pending" }), + { + kind: "pending", + error: "slow_down", + } + ); +}); + test("classifyKiroSocialPoll stops on denied, expired and malformed responses", () => { assert.deepEqual(classifyKiroSocialPoll(false, 403, { error: "access_denied" }), { kind: "error",