{"version":3,"file":"provider-retry-Cw6YJ4cr.mjs","names":[],"sources":["../node_modules/.pnpm/@earendil-works+pi-ai@0.84.1_ws@8.21.3_zod@4.4.3/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.js"],"sourcesContent":["const DEFAULT_MAX_RETRY_DELAY_MS = 60_000;\nfunction isProviderError(error) {\n    if (!(error instanceof Error) || !(\"status\" in error) || !(\"headers\" in error))\n        return false;\n    return ((error.status === undefined || typeof error.status === \"number\") &&\n        (error.headers === undefined || error.headers instanceof Headers));\n}\n/** Mirrors the pinned OpenAI/Anthropic SDK retry policy; review when either SDK is upgraded. */\nfunction isRetryableProviderError(error) {\n    const shouldRetry = error.headers?.get(\"x-should-retry\");\n    if (shouldRetry === \"true\")\n        return true;\n    if (shouldRetry === \"false\")\n        return false;\n    if (error.status === undefined)\n        return true;\n    return (error.status === 408 ||\n        error.status === 409 ||\n        error.status === 429 ||\n        (typeof error.status === \"number\" && error.status >= 500));\n}\nfunction validateServerRetryDelayMs(delayMs, maxRetryDelayMs, providerErrorMessage) {\n    const maxDelayMs = maxRetryDelayMs ?? DEFAULT_MAX_RETRY_DELAY_MS;\n    if (maxDelayMs > 0 && delayMs > maxDelayMs) {\n        throw new Error(`Server requested ${Math.ceil(delayMs / 1000)}s retry delay (max: ${Math.ceil(maxDelayMs / 1000)}s). ${providerErrorMessage}`);\n    }\n    return delayMs;\n}\nfunction getRetryDelayMs(error, retryIndex, maxRetryDelayMs) {\n    const retryAfterMs = error.headers?.get(\"retry-after-ms\");\n    if (retryAfterMs) {\n        const value = Number.parseFloat(retryAfterMs);\n        if (!Number.isNaN(value))\n            return validateServerRetryDelayMs(value, maxRetryDelayMs, error.message);\n    }\n    const retryAfter = error.headers?.get(\"retry-after\");\n    if (retryAfter) {\n        const seconds = Number.parseFloat(retryAfter);\n        const delayMs = Number.isNaN(seconds) ? Date.parse(retryAfter) - Date.now() : seconds * 1000;\n        return validateServerRetryDelayMs(delayMs, maxRetryDelayMs, error.message);\n    }\n    const exponentialDelay = Math.min(0.5 * 2 ** retryIndex, 8) * 1000;\n    return exponentialDelay * (1 - Math.random() * 0.25);\n}\nfunction createAbortError() {\n    const error = new Error(\"Request aborted\");\n    error.name = \"AbortError\";\n    return error;\n}\nfunction abortableSleep(ms, signal) {\n    return new Promise((resolve, reject) => {\n        if (signal?.aborted) {\n            reject(createAbortError());\n            return;\n        }\n        const onAbort = () => {\n            clearTimeout(timeout);\n            reject(createAbortError());\n        };\n        const timeout = setTimeout(() => {\n            signal?.removeEventListener(\"abort\", onAbort);\n            resolve();\n        }, Math.max(0, ms));\n        signal?.addEventListener(\"abort\", onAbort, { once: true });\n    });\n}\n/**\n * Reproduce the retry behavior used by the OpenAI and Anthropic SDKs while making\n * their backoff sleep interruptible. Their built-in retry timers ignore the\n * request AbortSignal, so callers must invoke the SDK with `maxRetries: 0` and\n * wrap the request with this helper. Provider-requested delays above\n * `maxRetryDelayMs` fail immediately (60 seconds by default); set it to zero to\n * disable the limit.\n */\nexport async function retryProviderRequest(request, options = {}) {\n    const maxRetries = options.maxRetries ?? 0;\n    let retriesRemaining = maxRetries;\n    for (;;) {\n        try {\n            // Each retry is a fresh SDK request, so X-Stainless-Retry-Count remains zero.\n            return await request();\n        }\n        catch (error) {\n            if (options.signal?.aborted)\n                throw createAbortError();\n            if (retriesRemaining <= 0 || !isProviderError(error) || !isRetryableProviderError(error))\n                throw error;\n            const retryIndex = maxRetries - retriesRemaining;\n            retriesRemaining--;\n            await abortableSleep(getRetryDelayMs(error, retryIndex, options.maxRetryDelayMs), options.signal);\n        }\n    }\n}\n//# sourceMappingURL=provider-retry.js.map"],"x_google_ignoreList":[0],"mappings":";;AAAA,MAAM,6BAA6B;AACnC,SAAS,gBAAgB,OAAO;CAC5B,IAAI,EAAE,iBAAiB,UAAU,EAAE,YAAY,UAAU,EAAE,aAAa,QACpE,OAAO;CACX,QAAS,MAAM,WAAW,KAAA,KAAa,OAAO,MAAM,WAAW,cAC1D,MAAM,YAAY,KAAA,KAAa,MAAM,mBAAmB;AACjE;;AAEA,SAAS,yBAAyB,OAAO;CACrC,MAAM,cAAc,MAAM,SAAS,IAAI,gBAAgB;CACvD,IAAI,gBAAgB,QAChB,OAAO;CACX,IAAI,gBAAgB,SAChB,OAAO;CACX,IAAI,MAAM,WAAW,KAAA,GACjB,OAAO;CACX,OAAQ,MAAM,WAAW,OACrB,MAAM,WAAW,OACjB,MAAM,WAAW,OAChB,OAAO,MAAM,WAAW,YAAY,MAAM,UAAU;AAC7D;AACA,SAAS,2BAA2B,SAAS,iBAAiB,sBAAsB;CAChF,MAAM,aAAa,mBAAmB;CACtC,IAAI,aAAa,KAAK,UAAU,YAC5B,MAAM,IAAI,MAAM,oBAAoB,KAAK,KAAK,UAAU,GAAI,EAAE,sBAAsB,KAAK,KAAK,aAAa,GAAI,EAAE,MAAM,sBAAsB;CAEjJ,OAAO;AACX;AACA,SAAS,gBAAgB,OAAO,YAAY,iBAAiB;CACzD,MAAM,eAAe,MAAM,SAAS,IAAI,gBAAgB;CACxD,IAAI,cAAc;EACd,MAAM,QAAQ,OAAO,WAAW,YAAY;EAC5C,IAAI,CAAC,OAAO,MAAM,KAAK,GACnB,OAAO,2BAA2B,OAAO,iBAAiB,MAAM,OAAO;CAC/E;CACA,MAAM,aAAa,MAAM,SAAS,IAAI,aAAa;CACnD,IAAI,YAAY;EACZ,MAAM,UAAU,OAAO,WAAW,UAAU;EAE5C,OAAO,2BADS,OAAO,MAAM,OAAO,IAAI,KAAK,MAAM,UAAU,IAAI,KAAK,IAAI,IAAI,UAAU,KAC7C,iBAAiB,MAAM,OAAO;CAC7E;CAEA,OADyB,KAAK,IAAI,KAAM,KAAK,YAAY,CAAC,IAAI,OACnC,IAAI,KAAK,OAAO,IAAI;AACnD;AACA,SAAS,mBAAmB;CACxB,MAAM,wBAAQ,IAAI,MAAM,iBAAiB;CACzC,MAAM,OAAO;CACb,OAAO;AACX;AACA,SAAS,eAAe,IAAI,QAAQ;CAChC,OAAO,IAAI,SAAS,SAAS,WAAW;EACpC,IAAI,QAAQ,SAAS;GACjB,OAAO,iBAAiB,CAAC;GACzB;EACJ;EACA,MAAM,gBAAgB;GAClB,aAAa,OAAO;GACpB,OAAO,iBAAiB,CAAC;EAC7B;EACA,MAAM,UAAU,iBAAiB;GAC7B,QAAQ,oBAAoB,SAAS,OAAO;GAC5C,QAAQ;EACZ,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;EAClB,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;CAC7D,CAAC;AACL;;;;;;;;;AASA,eAAsB,qBAAqB,SAAS,UAAU,CAAC,GAAG;CAC9D,MAAM,aAAa,QAAQ,cAAc;CACzC,IAAI,mBAAmB;CACvB,SACI,IAAI;EAEA,OAAO,MAAM,QAAQ;CACzB,SACO,OAAO;EACV,IAAI,QAAQ,QAAQ,SAChB,MAAM,iBAAiB;EAC3B,IAAI,oBAAoB,KAAK,CAAC,gBAAgB,KAAK,KAAK,CAAC,yBAAyB,KAAK,GACnF,MAAM;EACV,MAAM,aAAa,aAAa;EAChC;EACA,MAAM,eAAe,gBAAgB,OAAO,YAAY,QAAQ,eAAe,GAAG,QAAQ,MAAM;CACpG;AAER"}