{"record":{"id":"b8e7c66fa84c3730","repo":"github/copilot-sdk","slug":"invalid-auto-mode-switch-request-payload","errorCode":null,"errorMessage":"Invalid auto mode switch request payload","messagePattern":"Invalid auto mode switch request payload","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"nodejs/src/client.ts","lineNumber":3215,"sourceCode":"\n        const session = this.sessions.get(params.sessionId);\n        if (!session) {\n            throw new Error(`Session not found: ${params.sessionId}`);\n        }\n\n        return await session._handleExitPlanModeRequest({\n            summary: params.summary,\n            planContent: params.planContent,\n            actions: params.actions,\n            recommendedAction: params.recommendedAction,\n        });\n    }\n\n    private async handleAutoModeSwitchRequest(\n        params: AutoModeSwitchRequest & { sessionId: string }\n    ): Promise<{ response: AutoModeSwitchResponse }> {\n        if (!params || typeof params.sessionId !== \"string\") {\n            throw new Error(\"Invalid auto mode switch request payload\");\n        }\n\n        const session = this.sessions.get(params.sessionId);\n        if (!session) {\n            throw new Error(`Session not found: ${params.sessionId}`);\n        }\n\n        const response = await session._handleAutoModeSwitchRequest({\n            errorCode: params.errorCode,\n            retryAfterSeconds: params.retryAfterSeconds,\n        });\n        return { response };\n    }\n\n    private async handleHooksInvoke(params: {\n        sessionId: string;\n        hookType: string;\n        input: unknown;","sourceCodeStart":3197,"sourceCodeEnd":3233,"githubUrl":"https://github.com/github/copilot-sdk/blob/cd8cf15dc3f9e762615790aaed0a771a0f392755/nodejs/src/client.ts#L3197-L3233","documentation":"The auto-mode-switch handler validates only that params exists and params.sessionId is a string; otherwise it throws. This is the minimal gate before resolving the session and forwarding errorCode/retryAfterSeconds.","triggerScenarios":"Invoking the auto-mode-switch request path with params null/undefined, or with sessionId missing/undefined/non-string (number, object, empty via wrong field).","commonSituations":"Event payload flattened incorrectly so the id sits at params.data.sessionId; retry plumbing built before sessionId was assigned; automated retry loop passing a rate-limit error object as params instead of a structured request.","solutions":["Pass a plain object with a string sessionId field alongside errorCode/retryAfterSeconds.","Unwrap nested payload levels before calling (params = event.data).","Coerce numeric/string ids to string explicitly before invocation.","Add a pre-call assertion for the payload shape."],"exampleFix":"// before\nawait client.handleAutoModeSwitchRequest(err); // err has no sessionId\n// after\nawait client.handleAutoModeSwitchRequest({\n  sessionId: String(ctx.sessionId),\n  errorCode: err.code,\n  retryAfterSeconds: err.retryAfter\n});","handlingStrategy":"validation","validationCode":"if (!params || typeof params.sessionId !== \"string\") {\n  throw new TypeError(\"auto mode switch requires string sessionId\");\n}","typeGuard":"function isAutoModeSwitchParams(p): p is { sessionId: string; errorCode?: unknown; retryAfterSeconds?: number } {\n  return typeof p === \"object\" && p !== null && typeof (p as any).sessionId === \"string\";\n}","tryCatchPattern":"try {\n  await client.handleAutoModeSwitchRequest(params);\n} catch (e) {\n  if (e instanceof Error && e.message === \"Invalid auto mode switch request payload\") {\n    // unwrap nested payload and retry once\n  }\n}","preventionTips":["Build the request via a helper that takes sessionId as its first required argument.","Unwrap event envelopes (event.data) before invoking.","Add unit tests asserting the retry path always carries a string sessionId."],"tags":["validation","payload","auto-mode","typescript"],"backgroundTag":"missing-required-argument","analyzedSha":"cd8cf15dc3f9e762615790aaed0a771a0f392755","analyzedAt":"2026-09-09T18:32:31.973Z","contentChangedAt":"2026-09-09T18:32:31.973Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}