authorgravatar for 154429365+Rishet11@users.noreply.github.comRishet11 <154429365+Rishet11@users.noreply.github.com> 2026-08-15 17:32:55+05:30
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-08-15 14:02:55+02:00
log51c6daa3bd1d65e809b5196bf63333013427338a
treefff55576c4a324e5df35a7aed5deb7d2b2d109db
parent135dc156e3f600a79a415b06e4c234677aa318d0
signature Signed by PGP key B5690EEEBB952194

fix(server): treat a missing Codex rollout as a recoverable resume error (#6671)


2 files changed, 13 insertions(+), 0 deletions(-)

apps/server/src/provider/Layers/CodexSessionRuntime.test.ts+12
...@@ -498,6 +498,18 @@ describe("isRecoverableThreadResumeError", () => {...@@ -498,6 +498,18 @@ describe("isRecoverableThreadResumeError", () => {
498 );498 );
499 });499 });
500500
501 it("matches a missing rollout for a known thread id", () => {
502 NodeAssert.equal(
503 isRecoverableThreadResumeError(
504 new CodexErrors.CodexAppServerRequestError({
505 code: -32603,
506 errorMessage: "no rollout found for thread id 019fdf74-aaa9-7950-b252-7cc7a8650470",
507 }),
508 ),
509 true,
510 );
511 });
512
501 it("ignores non-recoverable resume errors", () => {513 it("ignores non-recoverable resume errors", () => {
502 NodeAssert.equal(514 NodeAssert.equal(
503 isRecoverableThreadResumeError(515 isRecoverableThreadResumeError(
apps/server/src/provider/Layers/CodexSessionRuntime.ts+1
...@@ -58,6 +58,7 @@ const RECOVERABLE_THREAD_RESUME_ERROR_SNIPPETS = [...@@ -58,6 +58,7 @@ const RECOVERABLE_THREAD_RESUME_ERROR_SNIPPETS = [
58 "no such thread",58 "no such thread",
59 "unknown thread",59 "unknown thread",
60 "does not exist",60 "does not exist",
61 "no rollout found",
61];62];
6263
63export function hasConfiguredMcpServer(appServerArgs: ReadonlyArray<string> | undefined): boolean {64export function hasConfiguredMcpServer(appServerArgs: ReadonlyArray<string> | undefined): boolean {