From 3e52af35e2eaca2513c151a4f3305e4953fd9d48 Mon Sep 17 00:00:00 2001 From: NoxzRCW <115419063+NoxzRCW@users.noreply.github.com> Date: Mon, 18 May 2026 15:14:10 +0700 Subject: [PATCH] feat(gemini-cli): wrap CloudCode payload and surface 429 retryDelay - Send { project, model, request } envelope expected by Cloud Code Assist - Parse google.rpc.RetryInfo from 429 responses to expose retry hint Co-authored-by: Cursor --- open-sse/executors/gemini-cli.js | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/open-sse/executors/gemini-cli.js b/open-sse/executors/gemini-cli.js index 45470c8..02b33bf 100644 --- a/open-sse/executors/gemini-cli.js +++ b/open-sse/executors/gemini-cli.js @@ -25,10 +25,32 @@ export class GeminiCLIExecutor extends BaseExecutor { transformRequest(model, body, stream, credentials) { // Store model for use in buildHeaders (called by base.execute after transformRequest) this._currentModel = model; - if (!body.project && credentials?.projectId) { - body.project = credentials.projectId; - } - return body; + // Cloud Code Assist wraps the Gemini payload: { project, model, request: } + if (body && body.request && body.model) return body; + return { + project: credentials?.projectId || body?.project, + model, + request: body + }; + } + + // Parse RetryInfo.retryDelay from Google API 429 body to surface upstream retry hint + parseError(response, bodyText) { + const base = super.parseError(response, bodyText); + if (response.status !== 429 || !bodyText) return base; + try { + const parsed = JSON.parse(bodyText); + const details = parsed?.error?.details; + if (Array.isArray(details)) { + for (const d of details) { + if (d?.["@type"] === "type.googleapis.com/google.rpc.RetryInfo" && d?.retryDelay) { + base.retryAfter = d.retryDelay; + break; + } + } + } + } catch {} + return base; } async refreshCredentials(credentials, log) {