{"version":3,"file":"plugin.cjs","names":["#options","#fetch","#decorateResponse","#getNormalizedOptions","#retryCount","#cancelResponseBody","#retry","#originalRequest","#cancelBody","#normalizeSearchParams","#input","#userProvidedAbortSignal","#abortController","#wrapRequestWithUploadProgress","#calculateRetryDelay","#calculateDelay","#assignRequest","#cachedNormalizedOptions","webcrypto","subtle","Buffer","spawn","promisify","exec","plugin","ResolutionError","webcrypto","plugin","createHash","Buffer","resolveCacheTtl","homedir","joinPath"],"sources":["../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/errors/HTTPError.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/errors/NonError.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/errors/ForceRetryError.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/core/constants.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/utils/body.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/utils/is.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/utils/merge.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/utils/normalize.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/errors/TimeoutError.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/utils/timeout.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/utils/delay.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/utils/options.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/utils/type-guards.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/core/Ky.js","../../../../node_modules/.bun/ky@1.14.3/node_modules/ky/distribution/index.js","../src/crypto-utils.ts","../../../utils/src/exec-helpers.ts","../src/bw-pm-cli-helper.ts","../src/plugin.ts"],"sourcesContent":["export class HTTPError extends Error {\n    response;\n    request;\n    options;\n    constructor(response, request, options) {\n        const code = (response.status || response.status === 0) ? response.status : '';\n        const title = response.statusText ?? '';\n        const status = `${code} ${title}`.trim();\n        const reason = status ? `status code ${status}` : 'an unknown error';\n        super(`Request failed with ${reason}: ${request.method} ${request.url}`);\n        this.name = 'HTTPError';\n        this.response = response;\n        this.request = request;\n        this.options = options;\n    }\n}\n//# sourceMappingURL=HTTPError.js.map","/**\nWrapper for non-Error values that were thrown.\n\nIn JavaScript, any value can be thrown (not just Error instances). This class wraps such values to ensure consistent error handling.\n*/\nexport class NonError extends Error {\n    name = 'NonError';\n    value;\n    constructor(value) {\n        let message = 'Non-error value was thrown';\n        // Intentionally minimal as this error is just an edge-case.\n        try {\n            if (typeof value === 'string') {\n                message = value;\n            }\n            else if (value && typeof value === 'object' && 'message' in value && typeof value.message === 'string') {\n                message = value.message;\n            }\n        }\n        catch {\n            // Use default message if accessing properties throws\n        }\n        super(message);\n        this.value = value;\n    }\n}\n//# sourceMappingURL=NonError.js.map","import { NonError } from './NonError.js';\n/**\nInternal error used to signal a forced retry from afterResponse hooks.\nThis is thrown when a user returns ky.retry() from an afterResponse hook.\n*/\nexport class ForceRetryError extends Error {\n    name = 'ForceRetryError';\n    customDelay;\n    code;\n    customRequest;\n    constructor(options) {\n        // Runtime protection: wrap non-Error causes in NonError\n        // TypeScript type is Error for guidance, but JS users can pass anything\n        const cause = options?.cause\n            ? (options.cause instanceof Error ? options.cause : new NonError(options.cause))\n            : undefined;\n        super(options?.code ? `Forced retry: ${options.code}` : 'Forced retry', cause ? { cause } : undefined);\n        this.customDelay = options?.delay;\n        this.code = options?.code;\n        this.customRequest = options?.request;\n    }\n}\n//# sourceMappingURL=ForceRetryError.js.map","export const supportsRequestStreams = (() => {\n    let duplexAccessed = false;\n    let hasContentType = false;\n    const supportsReadableStream = typeof globalThis.ReadableStream === 'function';\n    const supportsRequest = typeof globalThis.Request === 'function';\n    if (supportsReadableStream && supportsRequest) {\n        try {\n            hasContentType = new globalThis.Request('https://empty.invalid', {\n                body: new globalThis.ReadableStream(),\n                method: 'POST',\n                // @ts-expect-error - Types are outdated.\n                get duplex() {\n                    duplexAccessed = true;\n                    return 'half';\n                },\n            }).headers.has('Content-Type');\n        }\n        catch (error) {\n            // QQBrowser on iOS throws \"unsupported BodyInit type\" error (see issue #581)\n            if (error instanceof Error && error.message === 'unsupported BodyInit type') {\n                return false;\n            }\n            throw error;\n        }\n    }\n    return duplexAccessed && !hasContentType;\n})();\nexport const supportsAbortController = typeof globalThis.AbortController === 'function';\nexport const supportsAbortSignal = typeof globalThis.AbortSignal === 'function' && typeof globalThis.AbortSignal.any === 'function';\nexport const supportsResponseStreams = typeof globalThis.ReadableStream === 'function';\nexport const supportsFormData = typeof globalThis.FormData === 'function';\nexport const requestMethods = ['get', 'post', 'put', 'patch', 'head', 'delete'];\nconst validate = () => undefined;\nvalidate();\nexport const responseTypes = {\n    json: 'application/json',\n    text: 'text/*',\n    formData: 'multipart/form-data',\n    arrayBuffer: '*/*',\n    blob: '*/*',\n    // Supported in modern Fetch implementations (for example, browsers and recent Node.js/undici).\n    // We still feature-check at runtime before exposing the shortcut.\n    bytes: '*/*',\n};\n// The maximum value of a 32bit int (see issue #117)\nexport const maxSafeTimeout = 2_147_483_647;\n// Size in bytes of a typical form boundary, used to help estimate upload size\nexport const usualFormBoundarySize = new TextEncoder().encode('------WebKitFormBoundaryaxpyiPgbbPti10Rw').length;\nexport const stop = Symbol('stop');\n/**\nMarker returned by ky.retry() to signal a forced retry from afterResponse hooks.\n*/\nexport class RetryMarker {\n    options;\n    constructor(options) {\n        this.options = options;\n    }\n}\n/**\nForce a retry from an `afterResponse` hook.\n\nThis allows you to retry a request based on the response content, even if the response has a successful status code. The retry will respect the `retry.limit` option and skip the `shouldRetry` check. The forced retry is observable in `beforeRetry` hooks, where the error will be a `ForceRetryError`.\n\n@param options - Optional configuration for the retry.\n\n@example\n```\nimport ky, {isForceRetryError} from 'ky';\n\nconst api = ky.extend({\n    hooks: {\n        afterResponse: [\n            async (request, options, response) => {\n                // Retry based on response body content\n                if (response.status === 200) {\n                    const data = await response.clone().json();\n\n                    // Simple retry with default delay\n                    if (data.error?.code === 'TEMPORARY_ERROR') {\n                        return ky.retry();\n                    }\n\n                    // Retry with custom delay from API response\n                    if (data.error?.code === 'RATE_LIMIT') {\n                        return ky.retry({\n                            delay: data.error.retryAfter * 1000,\n                            code: 'RATE_LIMIT'\n                        });\n                    }\n\n                    // Retry with a modified request (e.g., fallback endpoint)\n                    if (data.error?.code === 'FALLBACK_TO_BACKUP') {\n                        return ky.retry({\n                            request: new Request('https://backup-api.com/endpoint', {\n                                method: request.method,\n                                headers: request.headers,\n                            }),\n                            code: 'BACKUP_ENDPOINT'\n                        });\n                    }\n\n                    // Retry with refreshed authentication\n                    if (data.error?.code === 'TOKEN_REFRESH' && data.newToken) {\n                        return ky.retry({\n                            request: new Request(request, {\n                                headers: {\n                                    ...Object.fromEntries(request.headers),\n                                    'Authorization': `Bearer ${data.newToken}`\n                                }\n                            }),\n                            code: 'TOKEN_REFRESHED'\n                        });\n                    }\n\n                    // Retry with cause to preserve error chain\n                    try {\n                        validateResponse(data);\n                    } catch (error) {\n                        return ky.retry({\n                            code: 'VALIDATION_FAILED',\n                            cause: error\n                        });\n                    }\n                }\n            }\n        ],\n        beforeRetry: [\n            ({error, retryCount}) => {\n                // Observable in beforeRetry hooks\n                if (isForceRetryError(error)) {\n                    console.log(`Forced retry #${retryCount}: ${error.message}`);\n                    // Example output: \"Forced retry #1: Forced retry: RATE_LIMIT\"\n                }\n            }\n        ]\n    }\n});\n\nconst response = await api.get('https://example.com/api');\n```\n*/\nexport const retry = (options) => new RetryMarker(options);\nexport const kyOptionKeys = {\n    json: true,\n    parseJson: true,\n    stringifyJson: true,\n    searchParams: true,\n    prefixUrl: true,\n    retry: true,\n    timeout: true,\n    hooks: true,\n    throwHttpErrors: true,\n    onDownloadProgress: true,\n    onUploadProgress: true,\n    fetch: true,\n    context: true,\n};\n// Vendor-specific fetch options that should always be passed to fetch()\n// even if they appear on the Request object due to vendor patching.\n// See: https://github.com/sindresorhus/ky/issues/541\nexport const vendorSpecificOptions = {\n    next: true, // Next.js cache revalidation (revalidate, tags)\n};\n// Standard RequestInit options that should NOT be passed separately to fetch()\n// because they're already applied to the Request object.\n// Note: `dispatcher` and `priority` are NOT included here - they're fetch-only\n// options that the Request constructor doesn't accept, so they need to be passed\n// separately to fetch().\nexport const requestOptionsRegistry = {\n    method: true,\n    headers: true,\n    body: true,\n    mode: true,\n    credentials: true,\n    cache: true,\n    redirect: true,\n    referrer: true,\n    referrerPolicy: true,\n    integrity: true,\n    keepalive: true,\n    signal: true,\n    window: true,\n    duplex: true,\n};\n//# sourceMappingURL=constants.js.map","import { usualFormBoundarySize } from '../core/constants.js';\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const getBodySize = (body) => {\n    if (!body) {\n        return 0;\n    }\n    if (body instanceof FormData) {\n        // This is an approximation, as FormData size calculation is not straightforward\n        let size = 0;\n        for (const [key, value] of body) {\n            size += usualFormBoundarySize;\n            size += new TextEncoder().encode(`Content-Disposition: form-data; name=\"${key}\"`).length;\n            size += typeof value === 'string'\n                ? new TextEncoder().encode(value).length\n                : value.size;\n        }\n        return size;\n    }\n    if (body instanceof Blob) {\n        return body.size;\n    }\n    if (body instanceof ArrayBuffer) {\n        return body.byteLength;\n    }\n    if (typeof body === 'string') {\n        return new TextEncoder().encode(body).length;\n    }\n    if (body instanceof URLSearchParams) {\n        return new TextEncoder().encode(body.toString()).length;\n    }\n    if ('byteLength' in body) {\n        return (body).byteLength;\n    }\n    if (typeof body === 'object' && body !== null) {\n        try {\n            const jsonString = JSON.stringify(body);\n            return new TextEncoder().encode(jsonString).length;\n        }\n        catch {\n            return 0;\n        }\n    }\n    return 0; // Default case, unable to determine size\n};\nconst withProgress = (stream, totalBytes, onProgress) => {\n    let previousChunk;\n    let transferredBytes = 0;\n    return stream.pipeThrough(new TransformStream({\n        transform(currentChunk, controller) {\n            controller.enqueue(currentChunk);\n            if (previousChunk) {\n                transferredBytes += previousChunk.byteLength;\n                let percent = totalBytes === 0 ? 0 : transferredBytes / totalBytes;\n                // Avoid reporting 100% progress before the stream is actually finished (in case totalBytes is inaccurate)\n                if (percent >= 1) {\n                    // Epsilon is used here to get as close as possible to 100% without reaching it.\n                    // If we were to use 0.99 here, percent could potentially go backwards.\n                    percent = 1 - Number.EPSILON;\n                }\n                onProgress?.({ percent, totalBytes: Math.max(totalBytes, transferredBytes), transferredBytes }, previousChunk);\n            }\n            previousChunk = currentChunk;\n        },\n        flush() {\n            if (previousChunk) {\n                transferredBytes += previousChunk.byteLength;\n                onProgress?.({ percent: 1, totalBytes: Math.max(totalBytes, transferredBytes), transferredBytes }, previousChunk);\n            }\n        },\n    }));\n};\nexport const streamResponse = (response, onDownloadProgress) => {\n    if (!response.body) {\n        return response;\n    }\n    if (response.status === 204) {\n        return new Response(null, {\n            status: response.status,\n            statusText: response.statusText,\n            headers: response.headers,\n        });\n    }\n    const totalBytes = Math.max(0, Number(response.headers.get('content-length')) || 0);\n    return new Response(withProgress(response.body, totalBytes, onDownloadProgress), {\n        status: response.status,\n        statusText: response.statusText,\n        headers: response.headers,\n    });\n};\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport const streamRequest = (request, onUploadProgress, originalBody) => {\n    if (!request.body) {\n        return request;\n    }\n    // Use original body for size calculation since request.body is already a stream\n    const totalBytes = getBodySize(originalBody ?? request.body);\n    return new Request(request, {\n        // @ts-expect-error - Types are outdated.\n        duplex: 'half',\n        body: withProgress(request.body, totalBytes, onUploadProgress),\n    });\n};\n//# sourceMappingURL=body.js.map","// eslint-disable-next-line @typescript-eslint/ban-types\nexport const isObject = (value) => value !== null && typeof value === 'object';\n//# sourceMappingURL=is.js.map","import { supportsAbortSignal } from '../core/constants.js';\nimport { isObject } from './is.js';\nexport const validateAndMerge = (...sources) => {\n    for (const source of sources) {\n        if ((!isObject(source) || Array.isArray(source)) && source !== undefined) {\n            throw new TypeError('The `options` argument must be an object');\n        }\n    }\n    return deepMerge({}, ...sources);\n};\nexport const mergeHeaders = (source1 = {}, source2 = {}) => {\n    const result = new globalThis.Headers(source1);\n    const isHeadersInstance = source2 instanceof globalThis.Headers;\n    const source = new globalThis.Headers(source2);\n    for (const [key, value] of source.entries()) {\n        if ((isHeadersInstance && value === 'undefined') || value === undefined) {\n            result.delete(key);\n        }\n        else {\n            result.set(key, value);\n        }\n    }\n    return result;\n};\nfunction newHookValue(original, incoming, property) {\n    return (Object.hasOwn(incoming, property) && incoming[property] === undefined)\n        ? []\n        : deepMerge(original[property] ?? [], incoming[property] ?? []);\n}\nexport const mergeHooks = (original = {}, incoming = {}) => ({\n    beforeRequest: newHookValue(original, incoming, 'beforeRequest'),\n    beforeRetry: newHookValue(original, incoming, 'beforeRetry'),\n    afterResponse: newHookValue(original, incoming, 'afterResponse'),\n    beforeError: newHookValue(original, incoming, 'beforeError'),\n});\nconst appendSearchParameters = (target, source) => {\n    const result = new URLSearchParams();\n    for (const input of [target, source]) {\n        if (input === undefined) {\n            continue;\n        }\n        if (input instanceof URLSearchParams) {\n            for (const [key, value] of input.entries()) {\n                result.append(key, value);\n            }\n        }\n        else if (Array.isArray(input)) {\n            for (const pair of input) {\n                if (!Array.isArray(pair) || pair.length !== 2) {\n                    throw new TypeError('Array search parameters must be provided in [[key, value], ...] format');\n                }\n                result.append(String(pair[0]), String(pair[1]));\n            }\n        }\n        else if (isObject(input)) {\n            for (const [key, value] of Object.entries(input)) {\n                if (value !== undefined) {\n                    result.append(key, String(value));\n                }\n            }\n        }\n        else {\n            // String\n            const parameters = new URLSearchParams(input);\n            for (const [key, value] of parameters.entries()) {\n                result.append(key, value);\n            }\n        }\n    }\n    return result;\n};\n// TODO: Make this strongly-typed (no `any`).\nexport const deepMerge = (...sources) => {\n    let returnValue = {};\n    let headers = {};\n    let hooks = {};\n    let searchParameters;\n    const signals = [];\n    for (const source of sources) {\n        if (Array.isArray(source)) {\n            if (!Array.isArray(returnValue)) {\n                returnValue = [];\n            }\n            returnValue = [...returnValue, ...source];\n        }\n        else if (isObject(source)) {\n            for (let [key, value] of Object.entries(source)) {\n                // Special handling for AbortSignal instances\n                if (key === 'signal' && value instanceof globalThis.AbortSignal) {\n                    signals.push(value);\n                    continue;\n                }\n                // Special handling for context - shallow merge only\n                if (key === 'context') {\n                    if (value !== undefined && value !== null && (!isObject(value) || Array.isArray(value))) {\n                        throw new TypeError('The `context` option must be an object');\n                    }\n                    // Shallow merge: always create a new object to prevent mutation bugs\n                    returnValue = {\n                        ...returnValue,\n                        context: (value === undefined || value === null)\n                            ? {}\n                            : { ...returnValue.context, ...value },\n                    };\n                    continue;\n                }\n                // Special handling for searchParams\n                if (key === 'searchParams') {\n                    if (value === undefined || value === null) {\n                        // Explicit undefined or null removes searchParams\n                        searchParameters = undefined;\n                    }\n                    else {\n                        // First source: keep as-is to preserve type (string/object/URLSearchParams)\n                        // Subsequent sources: merge and convert to URLSearchParams\n                        searchParameters = searchParameters === undefined ? value : appendSearchParameters(searchParameters, value);\n                    }\n                    continue;\n                }\n                if (isObject(value) && key in returnValue) {\n                    value = deepMerge(returnValue[key], value);\n                }\n                returnValue = { ...returnValue, [key]: value };\n            }\n            if (isObject(source.hooks)) {\n                hooks = mergeHooks(hooks, source.hooks);\n                returnValue.hooks = hooks;\n            }\n            if (isObject(source.headers)) {\n                headers = mergeHeaders(headers, source.headers);\n                returnValue.headers = headers;\n            }\n        }\n    }\n    if (searchParameters !== undefined) {\n        returnValue.searchParams = searchParameters;\n    }\n    if (signals.length > 0) {\n        if (signals.length === 1) {\n            returnValue.signal = signals[0];\n        }\n        else if (supportsAbortSignal) {\n            returnValue.signal = AbortSignal.any(signals);\n        }\n        else {\n            // When AbortSignal.any is not available, use the last signal\n            // This maintains the previous behavior before signal merging was added\n            // This can be remove when the `supportsAbortSignal` check is removed.`\n            returnValue.signal = signals.at(-1);\n        }\n    }\n    return returnValue;\n};\n//# sourceMappingURL=merge.js.map","import { requestMethods } from '../core/constants.js';\nexport const normalizeRequestMethod = (input) => requestMethods.includes(input) ? input.toUpperCase() : input;\nconst retryMethods = ['get', 'put', 'head', 'delete', 'options', 'trace'];\nconst retryStatusCodes = [408, 413, 429, 500, 502, 503, 504];\nconst retryAfterStatusCodes = [413, 429, 503];\nconst defaultRetryOptions = {\n    limit: 2,\n    methods: retryMethods,\n    statusCodes: retryStatusCodes,\n    afterStatusCodes: retryAfterStatusCodes,\n    maxRetryAfter: Number.POSITIVE_INFINITY,\n    backoffLimit: Number.POSITIVE_INFINITY,\n    delay: attemptCount => 0.3 * (2 ** (attemptCount - 1)) * 1000,\n    jitter: undefined,\n    retryOnTimeout: false,\n};\nexport const normalizeRetryOptions = (retry = {}) => {\n    if (typeof retry === 'number') {\n        return {\n            ...defaultRetryOptions,\n            limit: retry,\n        };\n    }\n    if (retry.methods && !Array.isArray(retry.methods)) {\n        throw new Error('retry.methods must be an array');\n    }\n    retry.methods &&= retry.methods.map(method => method.toLowerCase());\n    if (retry.statusCodes && !Array.isArray(retry.statusCodes)) {\n        throw new Error('retry.statusCodes must be an array');\n    }\n    const normalizedRetry = Object.fromEntries(Object.entries(retry).filter(([, value]) => value !== undefined));\n    return {\n        ...defaultRetryOptions,\n        ...normalizedRetry,\n    };\n};\n//# sourceMappingURL=normalize.js.map","export class TimeoutError extends Error {\n    request;\n    constructor(request) {\n        super(`Request timed out: ${request.method} ${request.url}`);\n        this.name = 'TimeoutError';\n        this.request = request;\n    }\n}\n//# sourceMappingURL=TimeoutError.js.map","import { TimeoutError } from '../errors/TimeoutError.js';\n// `Promise.race()` workaround (#91)\nexport default async function timeout(request, init, abortController, options) {\n    return new Promise((resolve, reject) => {\n        const timeoutId = setTimeout(() => {\n            if (abortController) {\n                abortController.abort();\n            }\n            reject(new TimeoutError(request));\n        }, options.timeout);\n        void options\n            .fetch(request, init)\n            .then(resolve)\n            .catch(reject)\n            .then(() => {\n            clearTimeout(timeoutId);\n        });\n    });\n}\n//# sourceMappingURL=timeout.js.map","// https://github.com/sindresorhus/delay/tree/ab98ae8dfcb38e1593286c94d934e70d14a4e111\nexport default async function delay(ms, { signal }) {\n    return new Promise((resolve, reject) => {\n        if (signal) {\n            signal.throwIfAborted();\n            signal.addEventListener('abort', abortHandler, { once: true });\n        }\n        function abortHandler() {\n            clearTimeout(timeoutId);\n            reject(signal.reason);\n        }\n        const timeoutId = setTimeout(() => {\n            signal?.removeEventListener('abort', abortHandler);\n            resolve();\n        }, ms);\n    });\n}\n//# sourceMappingURL=delay.js.map","import { kyOptionKeys, requestOptionsRegistry, vendorSpecificOptions } from '../core/constants.js';\nexport const findUnknownOptions = (request, options) => {\n    const unknownOptions = {};\n    for (const key in options) {\n        // Skip inherited properties\n        if (!Object.hasOwn(options, key)) {\n            continue;\n        }\n        // An option is passed to fetch() if:\n        // 1. It's not a standard RequestInit option (not in requestOptionsRegistry)\n        // 2. It's not a ky-specific option (not in kyOptionKeys)\n        // 3. Either:\n        //    a. It's not on the Request object, OR\n        //    b. It's a vendor-specific option that should always be passed (in vendorSpecificOptions)\n        if (!(key in requestOptionsRegistry) && !(key in kyOptionKeys) && (!(key in request) || key in vendorSpecificOptions)) {\n            unknownOptions[key] = options[key];\n        }\n    }\n    return unknownOptions;\n};\nexport const hasSearchParameters = (search) => {\n    if (search === undefined) {\n        return false;\n    }\n    // The `typeof array` still gives \"object\", so we need different checking for array.\n    if (Array.isArray(search)) {\n        return search.length > 0;\n    }\n    if (search instanceof URLSearchParams) {\n        return search.size > 0;\n    }\n    // Record\n    if (typeof search === 'object') {\n        return Object.keys(search).length > 0;\n    }\n    if (typeof search === 'string') {\n        return search.trim().length > 0;\n    }\n    return Boolean(search);\n};\n//# sourceMappingURL=options.js.map","import { HTTPError } from '../errors/HTTPError.js';\nimport { TimeoutError } from '../errors/TimeoutError.js';\nimport { ForceRetryError } from '../errors/ForceRetryError.js';\n/**\nType guard to check if an error is a Ky error.\n\n@param error - The error to check\n@returns `true` if the error is a Ky error, `false` otherwise\n\n@example\n```\nimport ky, {isKyError} from 'ky';\ntry {\n    const response = await ky.get('/api/data');\n} catch (error) {\n    if (isKyError(error)) {\n        // Handle Ky-specific errors\n        console.log('Ky error occurred:', error.message);\n    } else {\n        // Handle other errors\n        console.log('Unknown error:', error);\n    }\n}\n```\n*/\nexport function isKyError(error) {\n    return isHTTPError(error) || isTimeoutError(error) || isForceRetryError(error);\n}\n/**\nType guard to check if an error is an HTTPError.\n\n@param error - The error to check\n@returns `true` if the error is an HTTPError, `false` otherwise\n\n@example\n```\nimport ky, {isHTTPError} from 'ky';\ntry {\n    const response = await ky.get('/api/data');\n} catch (error) {\n    if (isHTTPError(error)) {\n        console.log('HTTP error status:', error.response.status);\n    }\n}\n```\n*/\nexport function isHTTPError(error) {\n    return error instanceof HTTPError || (error?.name === HTTPError.name);\n}\n/**\nType guard to check if an error is a TimeoutError.\n\n@param error - The error to check\n@returns `true` if the error is a TimeoutError, `false` otherwise\n\n@example\n```\nimport ky, {isTimeoutError} from 'ky';\ntry {\n    const response = await ky.get('/api/data', { timeout: 1000 });\n} catch (error) {\n    if (isTimeoutError(error)) {\n        console.log('Request timed out:', error.request.url);\n    }\n}\n```\n*/\nexport function isTimeoutError(error) {\n    return error instanceof TimeoutError || (error?.name === TimeoutError.name);\n}\n/**\nType guard to check if an error is a ForceRetryError.\n\n@param error - The error to check\n@returns `true` if the error is a ForceRetryError, `false` otherwise\n\n@example\n```\nimport ky, {isForceRetryError} from 'ky';\n\nconst api = ky.extend({\n    hooks: {\n        beforeRetry: [\n            ({error, retryCount}) => {\n                if (isForceRetryError(error)) {\n                    console.log(`Forced retry #${retryCount}: ${error.code}`);\n                }\n            }\n        ]\n    }\n});\n```\n*/\nexport function isForceRetryError(error) {\n    return error instanceof ForceRetryError || (error?.name === ForceRetryError.name);\n}\n//# sourceMappingURL=type-guards.js.map","import { HTTPError } from '../errors/HTTPError.js';\nimport { NonError } from '../errors/NonError.js';\nimport { ForceRetryError } from '../errors/ForceRetryError.js';\nimport { streamRequest, streamResponse } from '../utils/body.js';\nimport { mergeHeaders, mergeHooks } from '../utils/merge.js';\nimport { normalizeRequestMethod, normalizeRetryOptions } from '../utils/normalize.js';\nimport timeout from '../utils/timeout.js';\nimport delay from '../utils/delay.js';\nimport { findUnknownOptions, hasSearchParameters } from '../utils/options.js';\nimport { isHTTPError, isTimeoutError } from '../utils/type-guards.js';\nimport { maxSafeTimeout, responseTypes, stop, RetryMarker, supportsAbortController, supportsAbortSignal, supportsFormData, supportsResponseStreams, supportsRequestStreams, } from './constants.js';\nexport class Ky {\n    static create(input, options) {\n        const ky = new Ky(input, options);\n        const function_ = async () => {\n            if (typeof ky.#options.timeout === 'number' && ky.#options.timeout > maxSafeTimeout) {\n                throw new RangeError(`The \\`timeout\\` option cannot be greater than ${maxSafeTimeout}`);\n            }\n            // Delay the fetch so that body method shortcuts can set the Accept header\n            await Promise.resolve();\n            // Before using ky.request, _fetch clones it and saves the clone for future retries to use.\n            // If retry is not needed, close the cloned request's ReadableStream for memory safety.\n            let response = await ky.#fetch();\n            for (const hook of ky.#options.hooks.afterResponse) {\n                // Clone the response before passing to hook so we can cancel it if needed\n                const clonedResponse = ky.#decorateResponse(response.clone());\n                let modifiedResponse;\n                try {\n                    // eslint-disable-next-line no-await-in-loop\n                    modifiedResponse = await hook(ky.request, ky.#getNormalizedOptions(), clonedResponse, { retryCount: ky.#retryCount });\n                }\n                catch (error) {\n                    // Cancel both responses to prevent memory leaks when hook throws\n                    ky.#cancelResponseBody(clonedResponse);\n                    ky.#cancelResponseBody(response);\n                    throw error;\n                }\n                if (modifiedResponse instanceof RetryMarker) {\n                    // Cancel both the cloned response passed to the hook and the current response to prevent resource leaks (especially important in Deno/Bun).\n                    // Do not await cancellation since hooks can clone the response, leaving extra tee branches that keep cancel promises pending per the Streams spec.\n                    ky.#cancelResponseBody(clonedResponse);\n                    ky.#cancelResponseBody(response);\n                    throw new ForceRetryError(modifiedResponse.options);\n                }\n                // Determine which response to use going forward\n                const nextResponse = modifiedResponse instanceof globalThis.Response ? modifiedResponse : response;\n                // Cancel any response bodies we won't use to prevent memory leaks.\n                // Uses fire-and-forget since hooks may have cloned the response, creating tee branches that block cancellation.\n                if (clonedResponse !== nextResponse) {\n                    ky.#cancelResponseBody(clonedResponse);\n                }\n                if (response !== nextResponse) {\n                    ky.#cancelResponseBody(response);\n                }\n                response = nextResponse;\n            }\n            ky.#decorateResponse(response);\n            if (!response.ok && (typeof ky.#options.throwHttpErrors === 'function'\n                ? ky.#options.throwHttpErrors(response.status)\n                : ky.#options.throwHttpErrors)) {\n                let error = new HTTPError(response, ky.request, ky.#getNormalizedOptions());\n                for (const hook of ky.#options.hooks.beforeError) {\n                    // eslint-disable-next-line no-await-in-loop\n                    error = await hook(error, { retryCount: ky.#retryCount });\n                }\n                throw error;\n            }\n            // If `onDownloadProgress` is passed, it uses the stream API internally\n            if (ky.#options.onDownloadProgress) {\n                if (typeof ky.#options.onDownloadProgress !== 'function') {\n                    throw new TypeError('The `onDownloadProgress` option must be a function');\n                }\n                if (!supportsResponseStreams) {\n                    throw new Error('Streams are not supported in your environment. `ReadableStream` is missing.');\n                }\n                const progressResponse = response.clone();\n                ky.#cancelResponseBody(response);\n                return streamResponse(progressResponse, ky.#options.onDownloadProgress);\n            }\n            return response;\n        };\n        // Always wrap in #retry to catch forced retries from afterResponse hooks\n        // Method retriability is checked in #calculateRetryDelay for non-forced retries\n        const result = ky.#retry(function_)\n            .finally(() => {\n            const originalRequest = ky.#originalRequest;\n            // Ignore cancellation errors from already-locked or already-consumed streams.\n            ky.#cancelBody(originalRequest?.body ?? undefined);\n            ky.#cancelBody(ky.request.body ?? undefined);\n        });\n        for (const [type, mimeType] of Object.entries(responseTypes)) {\n            // Only expose `.bytes()` when the environment implements it.\n            if (type === 'bytes'\n                && typeof globalThis.Response?.prototype?.bytes !== 'function') {\n                continue;\n            }\n            result[type] = async () => {\n                // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n                ky.request.headers.set('accept', ky.request.headers.get('accept') || mimeType);\n                const response = await result;\n                if (type === 'json') {\n                    if (response.status === 204) {\n                        return '';\n                    }\n                    const text = await response.text();\n                    if (text === '') {\n                        return '';\n                    }\n                    if (options.parseJson) {\n                        return options.parseJson(text);\n                    }\n                    return JSON.parse(text);\n                }\n                return response[type]();\n            };\n        }\n        return result;\n    }\n    // eslint-disable-next-line unicorn/prevent-abbreviations\n    static #normalizeSearchParams(searchParams) {\n        // Filter out undefined values from plain objects\n        if (searchParams && typeof searchParams === 'object' && !Array.isArray(searchParams) && !(searchParams instanceof URLSearchParams)) {\n            return Object.fromEntries(Object.entries(searchParams).filter(([, value]) => value !== undefined));\n        }\n        return searchParams;\n    }\n    request;\n    #abortController;\n    #retryCount = 0;\n    // eslint-disable-next-line @typescript-eslint/prefer-readonly -- False positive: #input is reassigned on line 202\n    #input;\n    #options;\n    #originalRequest;\n    #userProvidedAbortSignal;\n    #cachedNormalizedOptions;\n    // eslint-disable-next-line complexity\n    constructor(input, options = {}) {\n        this.#input = input;\n        this.#options = {\n            ...options,\n            headers: mergeHeaders(this.#input.headers, options.headers),\n            hooks: mergeHooks({\n                beforeRequest: [],\n                beforeRetry: [],\n                beforeError: [],\n                afterResponse: [],\n            }, options.hooks),\n            method: normalizeRequestMethod(options.method ?? this.#input.method ?? 'GET'),\n            // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n            prefixUrl: String(options.prefixUrl || ''),\n            retry: normalizeRetryOptions(options.retry),\n            throwHttpErrors: options.throwHttpErrors ?? true,\n            timeout: options.timeout ?? 10_000,\n            fetch: options.fetch ?? globalThis.fetch.bind(globalThis),\n            context: options.context ?? {},\n        };\n        if (typeof this.#input !== 'string' && !(this.#input instanceof URL || this.#input instanceof globalThis.Request)) {\n            throw new TypeError('`input` must be a string, URL, or Request');\n        }\n        if (this.#options.prefixUrl && typeof this.#input === 'string') {\n            if (this.#input.startsWith('/')) {\n                throw new Error('`input` must not begin with a slash when using `prefixUrl`');\n            }\n            if (!this.#options.prefixUrl.endsWith('/')) {\n                this.#options.prefixUrl += '/';\n            }\n            this.#input = this.#options.prefixUrl + this.#input;\n        }\n        if (supportsAbortController && supportsAbortSignal) {\n            this.#userProvidedAbortSignal = this.#options.signal ?? this.#input.signal;\n            this.#abortController = new globalThis.AbortController();\n            this.#options.signal = this.#userProvidedAbortSignal ? AbortSignal.any([this.#userProvidedAbortSignal, this.#abortController.signal]) : this.#abortController.signal;\n        }\n        if (supportsRequestStreams) {\n            // @ts-expect-error - Types are outdated.\n            this.#options.duplex = 'half';\n        }\n        if (this.#options.json !== undefined) {\n            this.#options.body = this.#options.stringifyJson?.(this.#options.json) ?? JSON.stringify(this.#options.json);\n            this.#options.headers.set('content-type', this.#options.headers.get('content-type') ?? 'application/json');\n        }\n        // To provide correct form boundary, Content-Type header should be deleted when creating Request from another Request with FormData/URLSearchParams body\n        // Only delete if user didn't explicitly provide a custom content-type\n        const userProvidedContentType = options.headers && new globalThis.Headers(options.headers).has('content-type');\n        if (this.#input instanceof globalThis.Request\n            && ((supportsFormData && this.#options.body instanceof globalThis.FormData) || this.#options.body instanceof URLSearchParams)\n            && !userProvidedContentType) {\n            this.#options.headers.delete('content-type');\n        }\n        this.request = new globalThis.Request(this.#input, this.#options);\n        if (hasSearchParameters(this.#options.searchParams)) {\n            // eslint-disable-next-line unicorn/prevent-abbreviations\n            const textSearchParams = typeof this.#options.searchParams === 'string'\n                ? this.#options.searchParams.replace(/^\\?/, '')\n                : new URLSearchParams(Ky.#normalizeSearchParams(this.#options.searchParams)).toString();\n            // eslint-disable-next-line unicorn/prevent-abbreviations\n            const searchParams = '?' + textSearchParams;\n            const url = this.request.url.replace(/(?:\\?.*?)?(?=#|$)/, searchParams);\n            // Recreate request with the updated URL. We already have all options in this.#options, including duplex.\n            this.request = new globalThis.Request(url, this.#options);\n        }\n        // If `onUploadProgress` is passed, it uses the stream API internally\n        if (this.#options.onUploadProgress) {\n            if (typeof this.#options.onUploadProgress !== 'function') {\n                throw new TypeError('The `onUploadProgress` option must be a function');\n            }\n            if (!supportsRequestStreams) {\n                throw new Error('Request streams are not supported in your environment. The `duplex` option for `Request` is not available.');\n            }\n            this.request = this.#wrapRequestWithUploadProgress(this.request, this.#options.body ?? undefined);\n        }\n    }\n    #calculateDelay() {\n        const retryDelay = this.#options.retry.delay(this.#retryCount);\n        let jitteredDelay = retryDelay;\n        if (this.#options.retry.jitter === true) {\n            jitteredDelay = Math.random() * retryDelay;\n        }\n        else if (typeof this.#options.retry.jitter === 'function') {\n            jitteredDelay = this.#options.retry.jitter(retryDelay);\n            if (!Number.isFinite(jitteredDelay) || jitteredDelay < 0) {\n                jitteredDelay = retryDelay;\n            }\n        }\n        // Handle undefined backoffLimit by treating it as no limit (Infinity)\n        const backoffLimit = this.#options.retry.backoffLimit ?? Number.POSITIVE_INFINITY;\n        return Math.min(backoffLimit, jitteredDelay);\n    }\n    async #calculateRetryDelay(error) {\n        this.#retryCount++;\n        if (this.#retryCount > this.#options.retry.limit) {\n            throw error;\n        }\n        // Wrap non-Error throws to ensure consistent error handling\n        const errorObject = error instanceof Error ? error : new NonError(error);\n        // Handle forced retry from afterResponse hook - skip method check and shouldRetry\n        if (errorObject instanceof ForceRetryError) {\n            return errorObject.customDelay ?? this.#calculateDelay();\n        }\n        // Check if method is retriable for non-forced retries\n        if (!this.#options.retry.methods.includes(this.request.method.toLowerCase())) {\n            throw error;\n        }\n        // User-provided shouldRetry function takes precedence over all other checks\n        if (this.#options.retry.shouldRetry !== undefined) {\n            const result = await this.#options.retry.shouldRetry({ error: errorObject, retryCount: this.#retryCount });\n            // Strict boolean checking - only exact true/false are handled specially\n            if (result === false) {\n                throw error;\n            }\n            if (result === true) {\n                // Force retry - skip all other validation and return delay\n                return this.#calculateDelay();\n            }\n            // If undefined or any other value, fall through to default behavior\n        }\n        // Default timeout behavior\n        if (isTimeoutError(error) && !this.#options.retry.retryOnTimeout) {\n            throw error;\n        }\n        if (isHTTPError(error)) {\n            if (!this.#options.retry.statusCodes.includes(error.response.status)) {\n                throw error;\n            }\n            const retryAfter = error.response.headers.get('Retry-After')\n                ?? error.response.headers.get('RateLimit-Reset')\n                ?? error.response.headers.get('X-RateLimit-Retry-After') // Symfony-based services\n                ?? error.response.headers.get('X-RateLimit-Reset') // GitHub\n                ?? error.response.headers.get('X-Rate-Limit-Reset'); // Twitter\n            if (retryAfter && this.#options.retry.afterStatusCodes.includes(error.response.status)) {\n                let after = Number(retryAfter) * 1000;\n                if (Number.isNaN(after)) {\n                    after = Date.parse(retryAfter) - Date.now();\n                }\n                else if (after >= Date.parse('2024-01-01')) {\n                    // A large number is treated as a timestamp (fixed threshold protects against clock skew)\n                    after -= Date.now();\n                }\n                const max = this.#options.retry.maxRetryAfter ?? after;\n                // Don't apply jitter when server provides explicit retry timing\n                return after < max ? after : max;\n            }\n            if (error.response.status === 413) {\n                throw error;\n            }\n        }\n        return this.#calculateDelay();\n    }\n    #decorateResponse(response) {\n        if (this.#options.parseJson) {\n            response.json = async () => this.#options.parseJson(await response.text());\n        }\n        return response;\n    }\n    #cancelBody(body) {\n        if (!body) {\n            return;\n        }\n        // Ignore cancellation failures from already-locked or already-consumed streams.\n        void body.cancel().catch(() => undefined);\n    }\n    #cancelResponseBody(response) {\n        // Ignore cancellation failures from already-locked or already-consumed streams.\n        this.#cancelBody(response.body ?? undefined);\n    }\n    async #retry(function_) {\n        try {\n            return await function_();\n        }\n        catch (error) {\n            const ms = Math.min(await this.#calculateRetryDelay(error), maxSafeTimeout);\n            if (this.#retryCount < 1) {\n                throw error;\n            }\n            // Only use user-provided signal for delay, not our internal abortController\n            await delay(ms, this.#userProvidedAbortSignal ? { signal: this.#userProvidedAbortSignal } : {});\n            // Apply custom request from forced retry before beforeRetry hooks\n            // Ensure the custom request has the correct managed signal for timeouts and user aborts\n            if (error instanceof ForceRetryError && error.customRequest) {\n                const managedRequest = this.#options.signal\n                    ? new globalThis.Request(error.customRequest, { signal: this.#options.signal })\n                    : new globalThis.Request(error.customRequest);\n                this.#assignRequest(managedRequest);\n            }\n            for (const hook of this.#options.hooks.beforeRetry) {\n                // eslint-disable-next-line no-await-in-loop\n                const hookResult = await hook({\n                    request: this.request,\n                    options: this.#getNormalizedOptions(),\n                    error: error,\n                    retryCount: this.#retryCount,\n                });\n                if (hookResult instanceof globalThis.Request) {\n                    this.#assignRequest(hookResult);\n                    break;\n                }\n                // If a Response is returned, use it and skip the retry\n                if (hookResult instanceof globalThis.Response) {\n                    return hookResult;\n                }\n                // If `stop` is returned from the hook, the retry process is stopped\n                if (hookResult === stop) {\n                    return;\n                }\n            }\n            return this.#retry(function_);\n        }\n    }\n    async #fetch() {\n        // Reset abortController if it was aborted (happens on timeout retry)\n        if (this.#abortController?.signal.aborted) {\n            this.#abortController = new globalThis.AbortController();\n            this.#options.signal = this.#userProvidedAbortSignal ? AbortSignal.any([this.#userProvidedAbortSignal, this.#abortController.signal]) : this.#abortController.signal;\n            // Recreate request with new signal\n            this.request = new globalThis.Request(this.request, { signal: this.#options.signal });\n        }\n        for (const hook of this.#options.hooks.beforeRequest) {\n            // eslint-disable-next-line no-await-in-loop\n            const result = await hook(this.request, this.#getNormalizedOptions(), { retryCount: this.#retryCount });\n            if (result instanceof Response) {\n                return result;\n            }\n            if (result instanceof globalThis.Request) {\n                this.#assignRequest(result);\n                break;\n            }\n        }\n        const nonRequestOptions = findUnknownOptions(this.request, this.#options);\n        // Cloning is done here to prepare in advance for retries\n        this.#originalRequest = this.request;\n        this.request = this.#originalRequest.clone();\n        if (this.#options.timeout === false) {\n            return this.#options.fetch(this.#originalRequest, nonRequestOptions);\n        }\n        return timeout(this.#originalRequest, nonRequestOptions, this.#abortController, this.#options);\n    }\n    #getNormalizedOptions() {\n        if (!this.#cachedNormalizedOptions) {\n            const { hooks, ...normalizedOptions } = this.#options;\n            this.#cachedNormalizedOptions = Object.freeze(normalizedOptions);\n        }\n        return this.#cachedNormalizedOptions;\n    }\n    #assignRequest(request) {\n        this.#cachedNormalizedOptions = undefined;\n        this.request = this.#wrapRequestWithUploadProgress(request);\n    }\n    #wrapRequestWithUploadProgress(request, originalBody) {\n        if (!this.#options.onUploadProgress || !request.body) {\n            return request;\n        }\n        return streamRequest(request, this.#options.onUploadProgress, originalBody ?? this.#options.body ?? undefined);\n    }\n}\n//# sourceMappingURL=Ky.js.map","/*! MIT License © Sindre Sorhus */\nimport { Ky } from './core/Ky.js';\nimport { requestMethods, stop, retry } from './core/constants.js';\nimport { validateAndMerge } from './utils/merge.js';\nconst createInstance = (defaults) => {\n    // eslint-disable-next-line @typescript-eslint/promise-function-async\n    const ky = (input, options) => Ky.create(input, validateAndMerge(defaults, options));\n    for (const method of requestMethods) {\n        // eslint-disable-next-line @typescript-eslint/promise-function-async\n        ky[method] = (input, options) => Ky.create(input, validateAndMerge(defaults, options, { method }));\n    }\n    ky.create = (newDefaults) => createInstance(validateAndMerge(newDefaults));\n    ky.extend = (newDefaults) => {\n        if (typeof newDefaults === 'function') {\n            newDefaults = newDefaults(defaults ?? {});\n        }\n        return createInstance(validateAndMerge(defaults, newDefaults));\n    };\n    ky.stop = stop;\n    ky.retry = retry;\n    return ky;\n};\nconst ky = createInstance();\nexport default ky;\nexport { HTTPError } from './errors/HTTPError.js';\nexport { TimeoutError } from './errors/TimeoutError.js';\nexport { ForceRetryError } from './errors/ForceRetryError.js';\nexport { isKyError, isHTTPError, isTimeoutError, isForceRetryError, } from './utils/type-guards.js';\n// Intentionally not exporting this for now as it's just an implementation detail and we don't want to commit to a certain API yet at least.\n// export {NonError} from './errors/NonError.js';\n//# sourceMappingURL=index.js.map","import { Buffer } from 'node:buffer';\nimport { webcrypto } from 'node:crypto';\n\nconst { subtle } = webcrypto;\n\n/**\n * HKDF-Expand implementation (RFC 5869)\n * Expands a PRK (pseudo-random key) into output keying material\n */\nexport async function hkdfExpand(prk: Uint8Array, info: Uint8Array, length: number): Promise<Uint8Array> {\n  const hashLen = 32; // SHA-256 output length\n  const n = Math.ceil(length / hashLen);\n\n  if (n > 255) {\n    throw new Error('HKDF-Expand: output length too large');\n  }\n\n  // Convert to plain Uint8Array to avoid type issues\n  const prkBytes = new Uint8Array(prk);\n\n  const prkKey = await subtle.importKey(\n    'raw',\n    prkBytes,\n    { name: 'HMAC', hash: 'SHA-256' },\n    false,\n    ['sign'],\n  );\n\n  const output = new Uint8Array(length);\n  let t = new Uint8Array(0);\n  let pos = 0;\n\n  for (let i = 1; i <= n; i++) {\n    // T(i) = HMAC(PRK, T(i-1) | info | i)\n    const data = new Uint8Array(t.length + info.length + 1);\n    data.set(t, 0);\n    data.set(info, t.length);\n    data[data.length - 1] = i;\n\n    const hmacResult = await subtle.sign('HMAC', prkKey, data);\n    t = new Uint8Array(hmacResult);\n\n    const toCopy = Math.min(t.length, length - pos);\n    output.set(t.subarray(0, toCopy), pos);\n    pos += toCopy;\n  }\n\n  return output;\n}\n\n/**\n * Derive 64-byte key from 16-byte encryption key using Bitwarden's key derivation\n * Returns both encryption key (32 bytes) and MAC key (32 bytes)\n *\n * Process:\n * 1. HMAC-SHA256 with key=\"bitwarden-accesstoken\" and message=16-byte secret → 32 bytes\n * 2. HKDF-Expand with info=\"sm-access-token\" → 64 bytes\n * 3. Split into enc_key (32 bytes) + mac_key (32 bytes)\n */\nexport async function deriveKeyFromAccessToken(\n  encryptionKeyBase64: string,\n): Promise<{ encKey: webcrypto.CryptoKey; macKey: webcrypto.CryptoKey }> {\n  const encryptionKey = new Uint8Array(Buffer.from(encryptionKeyBase64, 'base64'));\n\n  // Step 1: HMAC-SHA256 with key=\"bitwarden-accesstoken\"\n  const hmacKeyString = 'bitwarden-accesstoken';\n  const hmacKeyBytes = new TextEncoder().encode(hmacKeyString);\n\n  const hmacKey = await subtle.importKey(\n    'raw',\n    hmacKeyBytes,\n    { name: 'HMAC', hash: 'SHA-256' },\n    false,\n    ['sign'],\n  );\n\n  const hmacResult = await subtle.sign('HMAC', hmacKey, encryptionKey);\n  const prk = new Uint8Array(hmacResult); // This is our 32-byte PRK for HKDF\n\n  // Step 2: HKDF-Expand to 64 bytes (manual implementation since Web Crypto does Extract+Expand)\n  const info = new TextEncoder().encode('sm-access-token');\n  const derivedBytes = await hkdfExpand(prk, info, 64);\n\n  // Step 3: Split into encryption key (first 32 bytes) and MAC key (last 32 bytes)\n  const encKeyBytes = derivedBytes.slice(0, 32);\n  const macKeyBytes = derivedBytes.slice(32, 64);\n\n  // Import the encryption key\n  const encKey = await subtle.importKey(\n    'raw',\n    encKeyBytes,\n    { name: 'AES-CBC' },\n    false,\n    ['decrypt'],\n  );\n\n  // Import the MAC key\n  const macKey = await subtle.importKey(\n    'raw',\n    macKeyBytes,\n    { name: 'HMAC', hash: 'SHA-256' },\n    false,\n    ['verify'],\n  );\n\n  return { encKey, macKey };\n}\n\n/**\n * Decrypt AES-256-CBC encrypted value with HMAC verification\n * Format: 2.<iv_base64>|<ciphertext_base64>|<mac_base64>\n */\nexport async function decryptAes256CbcHmac(\n  encryptedValue: string,\n  encKey: webcrypto.CryptoKey,\n  macKey: webcrypto.CryptoKey,\n): Promise<string> {\n  const parts = encryptedValue.split('.');\n  if (parts.length !== 2 || parts[0] !== '2') {\n    throw new Error(`Invalid encryption format: ${encryptedValue}`);\n  }\n\n  const [ivBase64, ciphertextBase64, macBase64] = parts[1].split('|');\n\n  const iv = new Uint8Array(Buffer.from(ivBase64, 'base64'));\n  const ciphertext = new Uint8Array(Buffer.from(ciphertextBase64, 'base64'));\n  const mac = new Uint8Array(Buffer.from(macBase64, 'base64'));\n\n  // MAC is computed over IV + ciphertext (per Bitwarden source code)\n  const dataToVerify = new Uint8Array(iv.length + ciphertext.length);\n  dataToVerify.set(iv, 0);\n  dataToVerify.set(ciphertext, iv.length);\n\n  const isValid = await subtle.verify(\n    'HMAC',\n    macKey,\n    mac,\n    dataToVerify,\n  );\n\n  if (!isValid) {\n    throw new Error('MAC verification failed - data may be corrupted or tampered with');\n  }\n\n  // Decrypt using AES-256-CBC\n  const decrypted = await subtle.decrypt(\n    {\n      name: 'AES-CBC',\n      iv,\n    },\n    encKey,\n    ciphertext,\n  );\n\n  return new TextDecoder().decode(decrypted);\n}\n","import { spawn, exec, type SpawnOptions } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nexport class ExecError extends Error {\n  constructor(\n    readonly exitCode: number,\n    readonly signal: NodeJS.Signals | null,\n    readonly data: string = 'command gave no output',\n  ) {\n    super(data);\n  }\n}\n\nexport function spawnAsyncHelper(\n  command: string,\n  args: Array<string>,\n  spawnOptions?: SpawnOptions,\n) {\n  const childProcess = spawn(command, args, spawnOptions || {});\n\n  const deferred = new Promise<string>((resolve, reject) => {\n    let stdoutData: string = '';\n    let stderrData: string = '';\n    childProcess.stdout?.on('data', (data) => {\n      stdoutData += data.toString();\n    });\n    childProcess.stderr?.on('data', (data) => {\n      stderrData += data.toString();\n    });\n    childProcess.stdout?.on('error', (err) => {\n      reject(err);\n    });\n    childProcess.stderr?.on('error', (err) => {\n      reject(err);\n    });\n    childProcess.on('error', (err) => {\n      reject(err);\n    });\n    childProcess.on('exit', (exitCode, signal) => {\n      if (!exitCode) {\n        resolve(stdoutData);\n      } else {\n        reject(\n          new ExecError(exitCode, signal, stderrData),\n        );\n      }\n    });\n  });\n\n  return { childProcess, execResult: deferred };\n}\n\nexport async function spawnAsync(\n  command: string,\n  args: Array<string>,\n  opts?: SpawnOptions & { input?: string },\n) {\n  const { input, ...spawnOpts } = opts ?? {};\n  const { childProcess, execResult } = spawnAsyncHelper(command, args, spawnOpts);\n  if (input !== undefined && childProcess.stdin) {\n    // A child that exits before reading its input (bad args, wrong cwd, ...) closes the pipe\n    // mid-write. Without a listener that EPIPE is an unhandled error event rather than a\n    // rejection, so it takes down the process. The exit code and stderr are the real signal\n    // here, and `execResult` already carries both.\n    childProcess.stdin.on('error', () => { /* swallowed on purpose - see above */ });\n    childProcess.stdin.write(input);\n    childProcess.stdin.end();\n  }\n  return execResult;\n}\n\nexport const asyncExec = promisify(exec);\n","import { ExecError, spawnAsync } from '@env-spec/utils/exec-helpers';\nimport { plugin } from 'varlock/plugin-lib';\n\nconst { debug } = plugin;\nconst { ResolutionError } = plugin.ERRORS;\n\nexport interface BwItem {\n  id: string;\n  name: string;\n  type: number;\n  notes?: string;\n  login?: {\n    username?: string;\n    password?: string;\n    totp?: string;\n    uris?: Array<{ uri: string; match?: number | null }>;\n  };\n  fields?: Array<{ name: string; value: string; type: number; linkedId?: string | null }>;\n}\n\n/**\n * Whether a `bw` CLI error message indicates the session token is unusable —\n * i.e. expired, locked (externally), invalid, or never established. Matched\n * against real CLI output: a stale session on `bw get` reports \"Vault is\n * locked.\", and a wrong master password on `bw unlock` reports a\n * \"Cryptography error, The decryption operation failed\".\n */\nexport function isInvalidSessionMessage(msg: string): boolean {\n  const m = msg.toLowerCase();\n  return m.includes('session')\n    || m.includes('not logged in')\n    || m.includes('is locked')\n    || m.includes('invalid master password')\n    || m.includes('decryption operation failed')\n    || m.includes('cryptography error');\n}\n\nfunction processBwCliError(err: unknown, args?: Array<string>): Error {\n  // CLI binary not found\n  if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n    return new ResolutionError('Bitwarden CLI `bw` not found', {\n      tip: [\n        'The Bitwarden CLI must be installed and available in PATH',\n        'Install via a trusted source - https://bitwarden.com/help/cli/',\n        'macOS:   brew install bitwarden-cli',\n        'Linux:   snap install bw',\n        'Windows: choco install bitwarden-cli',\n      ].join('\\n'),\n    });\n  }\n\n  if (err instanceof ExecError) {\n    const errMsg = err.data;\n    debug('bw cli error --', errMsg);\n\n    if (\n      errMsg.includes('You are not logged in')\n      || errMsg.includes('Not logged in')\n    ) {\n      return new ResolutionError('Not logged in to the Bitwarden CLI', {\n        tip: [\n          'Log in once with your account: bw login',\n          '(varlock will handle unlocking + caching the session token after that)',\n        ].join('\\n'),\n      });\n    }\n\n    if (isInvalidSessionMessage(errMsg)) {\n      return new ResolutionError('Bitwarden CLI unlock failed or session is invalid', {\n        tip: [\n          'The master password may be incorrect, or the cached session expired/locked',\n          'Try again, or run `bw unlock` manually to confirm your credentials',\n        ].join('\\n'),\n      });\n    }\n\n    if (errMsg.includes('Not found') || errMsg.includes('not found')) {\n      const itemArg = args ? args.filter((a) => !a.startsWith('--')).pop() ?? 'unknown' : 'unknown';\n      return new ResolutionError(`Bitwarden item \"${itemArg}\" not found`, {\n        tip: [\n          'Verify the item name or UUID is correct',\n          'Check that the item exists in your Bitwarden/Vaultwarden vault',\n        ].join('\\n'),\n      });\n    }\n\n    return new ResolutionError(`Bitwarden CLI error: ${errMsg || 'unknown'}`, {\n      tip: 'Run `bw` in your terminal to check whether the CLI is working correctly',\n    });\n  }\n\n  return new ResolutionError(\n    `Failed to run Bitwarden CLI: ${(err as Error)?.message || String(err)}`,\n  );\n}\n\n/**\n * Execute a Bitwarden CLI command using the provided session token.\n * The session token is passed via the BW_SESSION environment variable so it\n * never appears in the process argument list.\n *\n * `appDataDir` (optional) selects a specific bw CLI data directory via\n * BITWARDENCLI_APPDATA_DIR — used to target a distinct account/server.\n */\nexport async function execBwCliCommand(\n  args: Array<string>,\n  sessionToken: string,\n  opts: { appDataDir?: string } = {},\n): Promise<string> {\n  const startAt = Date.now();\n  try {\n    debug('bw cli args', args);\n    const result = await spawnAsync('bw', args, {\n      env: {\n        ...process.env,\n        BW_SESSION: sessionToken,\n        ...(opts.appDataDir ? { BITWARDENCLI_APPDATA_DIR: opts.appDataDir } : {}),\n      },\n    });\n    debug(`> took ${Date.now() - startAt}ms`);\n    return result.trim();\n  } catch (err) {\n    throw processBwCliError(err, args);\n  }\n}\n\n/**\n * Unlock the vault and return a fresh raw session token.\n *\n * IMPORTANT: each `bw unlock` invalidates any previously issued session keys,\n * so callers must cache the result rather than unlocking on every resolution.\n *\n * - When `masterPassword` is provided, unlock runs non-interactively (suitable\n *   for CI or composing with another resolver such as a keychain lookup).\n * - Otherwise the master-password prompt is shown on the TTY; stdout (the raw\n *   key) is captured while stdin/stderr are inherited. Requires an interactive\n *   terminal — callers should guard on `process.stdin.isTTY`.\n *\n * `appDataDir` (optional) selects a specific bw CLI data directory via\n * BITWARDENCLI_APPDATA_DIR — so the unlock targets the matching account/server.\n */\nexport async function unlockVault(opts: { masterPassword?: string; appDataDir?: string } = {}): Promise<string> {\n  const startAt = Date.now();\n  const appDataEnv = opts.appDataDir ? { BITWARDENCLI_APPDATA_DIR: opts.appDataDir } : {};\n  try {\n    let token: string;\n    if (opts.masterPassword !== undefined) {\n      debug('bw unlock (non-interactive)');\n      // pass the password via env (never in argv); --raw emits only the session key\n      token = await spawnAsync('bw', ['unlock', '--raw', '--passwordenv', 'BW_VARLOCK_MASTERPW'], {\n        env: { ...process.env, ...appDataEnv, BW_VARLOCK_MASTERPW: opts.masterPassword },\n      });\n    } else {\n      debug('bw unlock (interactive)');\n      // inherit stdin/stderr so the master-password prompt is shown and answered\n      // on the user's terminal; capture stdout, which (with --raw) is only the key\n      token = await spawnAsync('bw', ['unlock', '--raw'], {\n        env: { ...process.env, ...appDataEnv },\n        stdio: ['inherit', 'pipe', 'inherit'],\n      });\n    }\n    debug(`> unlock took ${Date.now() - startAt}ms`);\n    return token.trim();\n  } catch (err) {\n    throw processBwCliError(err, ['unlock']);\n  }\n}\n","import {\n  type Resolver, type PluginCacheAccessor, plugin, resolveCacheTtl,\n} from 'varlock/plugin-lib';\nimport ky from 'ky';\nimport { Buffer } from 'node:buffer';\nimport { createHash, webcrypto } from 'node:crypto';\nimport { homedir } from 'node:os';\nimport { join as joinPath } from 'node:path';\nimport { deriveKeyFromAccessToken, decryptAes256CbcHmac } from './crypto-utils.js';\nimport {\n  type BwItem, execBwCliCommand, unlockVault, isInvalidSessionMessage,\n} from './bw-pm-cli-helper.js';\n\nconst { subtle } = webcrypto;\n\nconst { ValidationError, SchemaError, ResolutionError } = plugin.ERRORS;\n\nconst BITWARDEN_ICON = 'simple-icons:bitwarden';\n\nconst BITWARDEN_CLOUD_API_URL = 'https://api.bitwarden.com';\nconst BITWARDEN_CLOUD_IDENTITY_URL = 'https://identity.bitwarden.com';\n\nplugin.name = 'bitwarden';\nconst { debug } = plugin;\ndebug('init - version =', plugin.version);\n\n// capture cache accessor while the plugin proxy context is active\n// (the `plugin` proxy is only valid during module initialization, not during resolve())\nlet pluginCache: PluginCacheAccessor | undefined;\ntry {\n  pluginCache = plugin.cache;\n} catch {\n  // cache not available (e.g., no encryption key)\n}\nplugin.icon = BITWARDEN_ICON;\nplugin.standardVars = {\n  initDecorator: '@initBitwarden',\n  params: {\n    accessToken: { key: 'BWS_ACCESS_TOKEN' },\n  },\n};\n\ninterface BitwardenSecretResponse {\n  id: string;\n  organizationId: string;\n  key: string;\n  value: string;\n  note: string;\n  creationDate: string;\n  revisionDate: string;\n}\n\ninterface IdentityTokenResponse {\n  access_token: string;\n  expires_in: number;\n  token_type: string;\n  encrypted_payload?: string;\n}\n\ninterface CachedAuth {\n  jwt: string;\n  orgEncKey: webcrypto.CryptoKey;\n  orgMacKey: webcrypto.CryptoKey;\n  expiresAt: number;\n}\n\nclass BitwardenPluginInstance {\n  /** Access token for Bitwarden Secrets Manager machine account */\n  private accessToken?: string;\n  /** API URL - defaults to https://api.bitwarden.com */\n  private apiUrl: string = BITWARDEN_CLOUD_API_URL;\n  /** Identity URL - defaults to https://identity.bitwarden.com */\n  private identityUrl: string = BITWARDEN_CLOUD_IDENTITY_URL;\n  /** Cached authentication */\n  private cachedAuth?: CachedAuth;\n  /** In-flight auth promise - prevents parallel resolution from triggering multiple auth requests (rate limit fix) */\n  private authInFlight?: Promise<CachedAuth>;\n\n  /** optional cache TTL - when set, resolved values are cached */\n  cacheTtl?: string | number;\n\n  constructor(\n    readonly id: string,\n  ) {}\n\n  private _cacheKeyIdentity?: string;\n  /** short hash identifying which Bitwarden server/machine account is being read, used to namespace cache keys */\n  get cacheKeyIdentity() {\n    // the access token identifies the machine account/organization (it is hashed, never stored raw)\n    this._cacheKeyIdentity ??= createHash('sha256')\n      .update(JSON.stringify([this.apiUrl, this.accessToken]))\n      .digest('hex')\n      .slice(0, 12);\n    return this._cacheKeyIdentity;\n  }\n\n  setAuth(\n    accessToken: any,\n    apiUrl?: string,\n    identityUrl?: string,\n  ) {\n    if (accessToken && typeof accessToken === 'string') this.accessToken = accessToken;\n    if (apiUrl) {\n      this.apiUrl = apiUrl;\n    }\n    if (identityUrl) {\n      this.identityUrl = identityUrl;\n    }\n    debug('bitwarden instance', this.id, 'set auth - apiUrl:', this.apiUrl);\n  }\n\n  /** @internal telemetry: whether a self-hosted server is configured (boolean only, never the URL) */\n  get telemetryUsesSelfHostedServer() {\n    return this.apiUrl !== BITWARDEN_CLOUD_API_URL || this.identityUrl !== BITWARDEN_CLOUD_IDENTITY_URL;\n  }\n\n  /**\n   * Parse the access token format: 0.<client_id>.<client_secret>:<encryption_key>\n   */\n  private parseAccessToken(token: string): { clientId: string; clientSecret: string; encryptionKey: string } {\n    const parts = token.split('.');\n    if (parts.length !== 3 || parts[0] !== '0') {\n      throw new SchemaError('Invalid access token format. Expected: 0.<client_id>.<client_secret>:<encryption_key>');\n    }\n\n    // Split the last part by colon to separate client_secret from encryption_key\n    const lastPart = parts[2];\n    const colonIndex = lastPart.indexOf(':');\n    if (colonIndex === -1) {\n      throw new SchemaError('Invalid access token format. Expected: 0.<client_id>.<client_secret>:<encryption_key>');\n    }\n\n    return {\n      clientId: parts[1],\n      clientSecret: lastPart.substring(0, colonIndex),\n      encryptionKey: lastPart.substring(colonIndex + 1),\n    };\n  }\n\n\n  /**\n   * Authenticate and get JWT + organization key\n   * Uses authInFlight to prevent parallel secret resolution\n   * from triggering multiple auth requests & getting rate limited\n   */\n  private async authenticate(): Promise<CachedAuth> {\n    if (!this.accessToken) {\n      throw new ResolutionError('Access token not configured');\n    }\n\n    // Check cache\n    if (this.cachedAuth && this.cachedAuth.expiresAt > Date.now()) {\n      debug('Using cached authentication');\n      return this.cachedAuth;\n    }\n\n    // If auth is already in progress, wait for it\n    if (this.authInFlight) {\n      await this.authInFlight;\n      if (this.cachedAuth && this.cachedAuth.expiresAt > Date.now()) {\n        return this.cachedAuth;\n      }\n    }\n\n    this.authInFlight = this._doAuthenticate();\n    try {\n      const result = await this.authInFlight;\n      this.cachedAuth = result;\n      return result;\n    } finally {\n      this.authInFlight = undefined;\n    }\n  }\n\n  private async _doAuthenticate(): Promise<CachedAuth> {\n    const { clientId, clientSecret, encryptionKey } = this.parseAccessToken(this.accessToken!);\n\n    // Step 1: Exchange access token for JWT\n    debug('Exchanging access token for JWT at:', this.identityUrl);\n    const tokenResponse = await ky.post(`${this.identityUrl}/connect/token`, {\n      body: new URLSearchParams({\n        grant_type: 'client_credentials',\n        scope: 'api.secrets',\n        client_id: clientId,\n        client_secret: clientSecret,\n      }),\n      headers: {\n        'Content-Type': 'application/x-www-form-urlencoded',\n      },\n    }).json<IdentityTokenResponse>();\n\n    const jwt = tokenResponse.access_token;\n    debug('Received JWT token');\n\n    if (!tokenResponse.encrypted_payload) {\n      throw new ResolutionError('No encrypted_payload in identity response');\n    }\n\n    // Step 2: Derive key from encryption key (produces 64 bytes: 32 for enc, 32 for mac)\n    debug('Deriving key from encryption key (length:', Buffer.from(encryptionKey, 'base64').length, 'bytes)');\n    const { encKey, macKey } = await deriveKeyFromAccessToken(encryptionKey);\n    debug('Derived encryption and MAC keys');\n\n    // Step 3: Decrypt the organization key\n    debug('Decrypting organization key from encrypted_payload');\n    const decryptedPayload = await decryptAes256CbcHmac(tokenResponse.encrypted_payload, encKey, macKey);\n    const payload = JSON.parse(decryptedPayload);\n    debug('Decrypted payload:', Object.keys(payload));\n\n    if (!payload.encryptionKey) {\n      throw new ResolutionError('No encryptionKey in decrypted payload');\n    }\n\n    // The organization key is 64 bytes (32 enc + 32 mac)\n    const orgKeyBytes = Buffer.from(payload.encryptionKey, 'base64');\n    debug('Organization key bytes:', orgKeyBytes.length);\n\n    if (orgKeyBytes.length !== 64) {\n      throw new ResolutionError(`Expected 64-byte organization key, got ${orgKeyBytes.length} bytes`);\n    }\n\n    // Split into encryption and MAC keys\n    const orgEncKey = await subtle.importKey(\n      'raw',\n      orgKeyBytes.subarray(0, 32),\n      { name: 'AES-CBC' },\n      false,\n      ['decrypt'],\n    );\n\n    const orgMacKey = await subtle.importKey(\n      'raw',\n      orgKeyBytes.subarray(32, 64),\n      { name: 'HMAC', hash: 'SHA-256' },\n      false,\n      ['verify'],\n    );\n\n    debug('Successfully authenticated and derived organization keys');\n\n    // Cache for reuse (subtract 60s for safety margin)\n    const authCache: CachedAuth = {\n      jwt,\n      orgEncKey,\n      orgMacKey,\n      expiresAt: Date.now() + (tokenResponse.expires_in - 60) * 1000,\n    };\n\n    return authCache;\n  }\n\n  async getSecret(secretId: string): Promise<string> {\n    const auth = await this.authenticate();\n\n    try {\n      const url = `${this.apiUrl}/secrets/${secretId}`;\n      debug('Fetching secret from:', url);\n\n      const response = await ky.get(url, {\n        headers: {\n          Authorization: `Bearer ${auth.jwt}`,\n        },\n        timeout: 30000,\n      }).json<BitwardenSecretResponse>();\n\n      debug('Successfully fetched encrypted secret:', secretId);\n\n      // Decrypt the secret value\n      if (!response?.value) {\n        throw new ResolutionError(`Secret \"${secretId}\" has no value`);\n      }\n\n      const decryptedValue = await decryptAes256CbcHmac(response.value, auth.orgEncKey, auth.orgMacKey);\n      debug('Successfully decrypted secret value');\n\n      return decryptedValue;\n    } catch (err: any) {\n      return this.handleBitwardenError(err, secretId);\n    }\n  }\n\n  private handleBitwardenError(err: any, secretId: string): never {\n    const statusCode = err?.response?.status;\n    const errorMsg = err?.message || String(err);\n\n    debug('Bitwarden API error:', {\n      statusCode,\n      errorMsg,\n      secretId,\n      apiUrl: this.apiUrl,\n    });\n\n    if (statusCode === 404 || errorMsg.includes('not found') || errorMsg.includes('NotFound')) {\n      throw new ResolutionError(`Secret \"${secretId}\" not found`, {\n        tip: [\n          'Verify the secret ID is correct (must be a valid UUID)',\n          'Check if the secret exists in your Bitwarden Secrets Manager',\n          'Ensure your machine account has access to this secret or its project',\n        ].join('\\n'),\n      });\n    }\n\n    if (statusCode === 401 || statusCode === 403 || errorMsg.includes('Unauthorized') || errorMsg.includes('Forbidden')) {\n      throw new ResolutionError(`Access denied for secret \"${secretId}\"`, {\n        tip: [\n          'Verify your machine account has \"Can read\" or \"Can read, write\" permissions',\n          'Check that the machine account has access to this secret or its project',\n          'Review the role assignments in Bitwarden Secrets Manager',\n        ].join('\\n'),\n      });\n    }\n\n    if (errorMsg.includes('auth') || errorMsg.includes('credential') || errorMsg.includes('token')) {\n      throw new ResolutionError(`Authentication failed: ${errorMsg}`, {\n        tip: [\n          'Verify accessToken is correct',\n          'Check if the access token has expired or been revoked',\n          'Ensure the machine account is not disabled',\n        ].join('\\n'),\n      });\n    }\n\n    // Generic error\n    throw new ResolutionError(`Failed to fetch secret \"${secretId}\": ${errorMsg}`, {\n      tip: 'Check Bitwarden service status and your network connection',\n    });\n  }\n}\n\nconst pluginInstances: Record<string, BitwardenPluginInstance> = {};\n\nplugin.registerRootDecorator({\n  name: 'initBitwarden',\n  description: 'Initialize a Bitwarden Secrets Manager plugin instance for bitwarden() resolver',\n  isFunction: true,\n  async process(argsVal) {\n    const objArgs = argsVal.objArgs;\n    if (!objArgs) throw new SchemaError('Expected configuration arguments');\n\n    // Validate id (must be static if provided)\n    if (objArgs.id && !objArgs.id.isStatic) {\n      throw new SchemaError('Expected id to be static');\n    }\n    const id = String(objArgs?.id?.staticValue || '_default');\n\n    if (pluginInstances[id]) {\n      throw new SchemaError(`Instance with id \"${id}\" already initialized`);\n    }\n\n    // Validate required fields\n    if (!objArgs.accessToken) {\n      throw new SchemaError('accessToken is required', {\n        tip: 'Add accessToken parameter: @initBitwarden(accessToken=$BWS_ACCESS_TOKEN)',\n      });\n    }\n\n    // Validate apiUrl is static if provided\n    if (objArgs.apiUrl && !objArgs.apiUrl.isStatic) {\n      throw new SchemaError('Expected apiUrl to be static');\n    }\n    const apiUrl: string | undefined = objArgs.apiUrl ? String(objArgs.apiUrl.staticValue) : undefined;\n\n    // Validate identityUrl is static if provided\n    if (objArgs.identityUrl && !objArgs.identityUrl.isStatic) {\n      throw new SchemaError('Expected identityUrl to be static');\n    }\n    const identityUrl: string | undefined = objArgs.identityUrl ? String(objArgs.identityUrl.staticValue) : undefined;\n\n    // Create instance\n    pluginInstances[id] = new BitwardenPluginInstance(id);\n\n    return {\n      id,\n      apiUrl,\n      identityUrl,\n      accessTokenResolver: objArgs.accessToken,\n      cacheTtlResolver: objArgs.cacheTtl,\n    };\n  },\n  async execute({\n    id,\n    apiUrl,\n    identityUrl,\n    accessTokenResolver,\n    cacheTtlResolver,\n  }) {\n    // even if the token is empty, we can't throw errors yet\n    // in case the instance is never actually used\n    const accessTokenValue = await accessTokenResolver?.resolve();\n\n    pluginInstances[id].setAuth(\n      accessTokenValue,\n      apiUrl,\n      identityUrl,\n    );\n\n    const cacheTtl = await resolveCacheTtl(cacheTtlResolver);\n    if (cacheTtl !== undefined) {\n      pluginInstances[id].cacheTtl = cacheTtl;\n    }\n  },\n});\n\nplugin.registerDataType({\n  name: 'bitwardenAccessToken',\n  sensitive: true,\n  internal: true,\n  typeDescription: 'Access token for a Bitwarden Secrets Manager machine account',\n  icon: BITWARDEN_ICON,\n  docs: [\n    {\n      description: 'Bitwarden Machine Accounts',\n      url: 'https://bitwarden.com/help/secrets-manager-machine-accounts/',\n    },\n  ],\n  async validate(val) {\n    // Validate format: 0.<client_id>.<client_secret>:<encryption_key>\n    const parts = val.split('.');\n    if (parts.length !== 3 || parts[0] !== '0') {\n      throw new ValidationError('Access token must be in format: 0.<client_id>.<client_secret>:<encryption_key>');\n    }\n    if (!parts[2].includes(':')) {\n      throw new ValidationError('Access token must be in format: 0.<client_id>.<client_secret>:<encryption_key>');\n    }\n  },\n});\n\nplugin.registerDataType({\n  name: 'bitwardenSecretId',\n  sensitive: false,\n  typeDescription: 'UUID that identifies a secret in Bitwarden Secrets Manager',\n  icon: BITWARDEN_ICON,\n  docs: [\n    {\n      description: 'Bitwarden Secrets Manager',\n      url: 'https://bitwarden.com/products/secrets-manager/',\n    },\n  ],\n  async validate(val) {\n    const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n    if (!uuidPattern.test(val)) {\n      throw new ValidationError('Secret ID must be a valid UUID');\n    }\n  },\n});\n\nplugin.registerDataType({\n  name: 'bitwardenOrganizationId',\n  sensitive: false,\n  typeDescription: 'UUID that identifies an organization in Bitwarden',\n  icon: BITWARDEN_ICON,\n  docs: [\n    {\n      description: 'Bitwarden Organizations',\n      url: 'https://bitwarden.com/help/about-organizations/',\n    },\n  ],\n  async validate(val) {\n    const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n    if (!uuidPattern.test(val)) {\n      throw new ValidationError('Organization ID must be a valid UUID');\n    }\n  },\n});\n\nplugin.registerResolverFunction({\n  name: 'bitwarden',\n  label: 'Fetch secret value from Bitwarden Secrets Manager',\n  icon: BITWARDEN_ICON,\n  argsSchema: {\n    type: 'array',\n    arrayMinLength: 1,\n    arrayMaxLength: 2,\n  },\n  process() {\n    let instanceId = '_default';\n    let secretIdResolver: Resolver | undefined;\n\n    if (this.arrArgs!.length === 1) {\n      secretIdResolver = this.arrArgs![0];\n    } else if (this.arrArgs!.length === 2) {\n      if (!this.arrArgs![0].isStatic) {\n        throw new SchemaError('Expected instance id (first argument) to be a static value');\n      }\n      instanceId = String(this.arrArgs![0].staticValue);\n      secretIdResolver = this.arrArgs![1];\n    } else {\n      throw new SchemaError('Expected 1-2 arguments');\n    }\n\n    // Validate instance exists\n    if (!Object.values(pluginInstances).length) {\n      throw new SchemaError('No Bitwarden plugin instances found', {\n        tip: 'Initialize at least one Bitwarden plugin instance using @initBitwarden() decorator',\n      });\n    }\n\n    const selectedInstance = pluginInstances[instanceId];\n    if (!selectedInstance) {\n      if (instanceId === '_default') {\n        throw new SchemaError('Bitwarden plugin instance (without id) not found', {\n          tip: [\n            'Either remove the `id` param from your @initBitwarden call',\n            'or use `bitwarden(id, secretId)` to select an instance by id',\n            `Available ids: ${Object.keys(pluginInstances).join(', ')}`,\n          ].join('\\n'),\n        });\n      } else {\n        throw new SchemaError(`Bitwarden plugin instance id \"${instanceId}\" not found`, {\n          tip: `Available ids: ${Object.keys(pluginInstances).join(', ')}`,\n        });\n      }\n    }\n\n    return { instanceId, secretIdResolver };\n  },\n  async resolve({ instanceId, secretIdResolver }) {\n    const selectedInstance = pluginInstances[instanceId];\n\n    // Resolve secret ID\n    const secretId = await secretIdResolver.resolve();\n    if (typeof secretId !== 'string') {\n      throw new SchemaError('Expected secret ID to resolve to a string');\n    }\n\n    // Validate UUID format\n    const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n    if (!uuidPattern.test(secretId)) {\n      throw new SchemaError(`Invalid secret ID format: \"${secretId}\"`, {\n        tip: 'Secret ID must be a valid UUID (e.g., \"12345678-1234-1234-1234-123456789abc\")',\n      });\n    }\n\n    // check cache if cacheTtl is configured and cache is available\n    if (selectedInstance.cacheTtl !== undefined && pluginCache) {\n      const cacheKey = `bw:${instanceId}:${selectedInstance.cacheKeyIdentity}:${secretId}`;\n      return await pluginCache.getOrSet(\n        cacheKey,\n        selectedInstance.cacheTtl,\n        async () => await selectedInstance.getSecret(secretId),\n      );\n    }\n\n    return await selectedInstance.getSecret(secretId);\n  },\n});\n\n// ──────────────────────────────────────────────────────────────\n// Bitwarden Password Manager / Vaultwarden  (bwp)\n//\n// Unlike Secrets Manager (above, HTTP API), the Password Manager is only\n// reachable via the `bw` CLI. varlock acquires a session token itself by\n// running `bw unlock` (interactively, or non-interactively with a master\n// password) and caches it — so the user no longer has to manually unlock and\n// paste a token. Each `bw unlock` invalidates prior session keys, so the cached\n// token is reused (sessionTtl, default `forever`) until the CLI session is\n// invalidated externally (bw lock/logout, an external bw unlock, or account\n// policy) — which the re-unlock retry in getSecret then heals. Note the CLI\n// session does not auto-lock on system sleep/lock; those are app-only settings.\n// ──────────────────────────────────────────────────────────────\n\n/**\n * Extract a named field from a Bitwarden vault item JSON object.\n * Standard fields: password, username, notes, totp, uri\n * Falls back to searching the `fields` array for custom fields.\n */\nfunction extractBwItemField(item: BwItem, field: string): string {\n  switch (field) {\n    case 'password':\n      if (item.login?.password != null) return item.login.password;\n      throw new ResolutionError(`Item \"${item.name}\" has no password field`);\n    case 'username':\n      if (item.login?.username != null) return item.login.username;\n      throw new ResolutionError(`Item \"${item.name}\" has no username field`);\n    case 'notes':\n      if (item.notes != null) return item.notes;\n      throw new ResolutionError(`Item \"${item.name}\" has no notes`);\n    case 'totp':\n      if (item.login?.totp != null) return item.login.totp;\n      throw new ResolutionError(`Item \"${item.name}\" has no TOTP field`);\n    case 'uri':\n      if (item.login?.uris?.[0]?.uri != null) return item.login.uris[0].uri;\n      throw new ResolutionError(`Item \"${item.name}\" has no URI field`);\n    default: {\n      // Try custom fields (case-insensitive match)\n      const customField = item.fields?.find(\n        (f) => f.name.toLowerCase() === field.toLowerCase(),\n      );\n      if (customField != null) return customField.value ?? '';\n      throw new ResolutionError(`Field \"${field}\" not found in item \"${item.name}\"`, {\n        tip: [\n          'Available standard fields: password, username, notes, totp, uri',\n          `Custom fields on this item: ${item.fields?.map((f) => f.name).join(', ') || 'none'}`,\n        ].join('\\n'),\n      });\n    }\n  }\n}\n\n/** an error indicating the session token is no longer valid (so a re-unlock may help) */\nfunction isInvalidSessionError(err: unknown): boolean {\n  return isInvalidSessionMessage((err as Error)?.message ?? '');\n}\n\n// Single-flight session tokens, keyed per bw account (its `appDataDir`). The `bw`\n// CLI has one logged-in account per data directory, so each `bw unlock` invalidates\n// prior session keys *for that account* — parallel resolutions for the same account\n// must therefore share one unlock rather than racing (racing unlocks would invalidate\n// each other's tokens). Distinct accounts (different appDataDir) get independent\n// entries. Held for the process lifetime so repeated resolutions reuse the token even\n// when the persistent cache is unavailable; an entry is cleared only when its unlock\n// attempt fails. The persistent cache key is namespaced per account the same way.\nconst sessionUnlockInFlight = new Map<string, Promise<string>>();\n\nclass BitwardenPasswordManagerInstance {\n  /** optional manually-supplied session token (e.g. sessionToken=$BWP_SESSION) */\n  sessionTokenResolver?: Resolver;\n  /** optional master password for non-interactive unlock (CI / keychain) */\n  masterPasswordResolver?: Resolver;\n  /**\n   * How long an auto-unlocked session token is cached before re-unlock.\n   * Defaults to `forever`: the token lives in varlock's encrypted cache (biometric-\n   * gated on platforms with a secure enclave) until the CLI session is invalidated\n   * externally (bw lock/logout, an external bw unlock, or account policy) — at which\n   * point `bw get` fails and the re-unlock retry in `getSecret` heals it. The `bw`\n   * CLI session does not auto-lock on system sleep/lock/restart (those are app-only\n   * vault-timeout settings), so the cached token is long-lived by default; set a\n   * shorter `sessionTtl` to force periodic master-password re-auth.\n   */\n  sessionTtl: string | number = 'forever';\n  /** optional TTL for caching resolved item field values */\n  cacheTtl?: string | number;\n  /**\n   * Optional bw CLI data directory (BITWARDENCLI_APPDATA_DIR). The `bw` CLI keeps one\n   * logged-in account/server per data dir, so pointing instances at different dirs is\n   * how you read from different accounts or servers (e.g. personal vs work). Each dir\n   * must be set up independently (`bw config server` + `bw login`).\n   */\n  appDataDir?: string;\n\n  constructor(readonly id: string) {}\n\n  /**\n   * Stable key identifying which bw account this instance reads — its `appDataDir`\n   * (or `default` when unset). Used to namespace the session cache and single-flight\n   * unlock so distinct accounts don't share/invalidate each other's session tokens.\n   */\n  get accountKey(): string {\n    return this.appDataDir\n      ? createHash('sha256').update(this.appDataDir).digest('hex').slice(0, 12)\n      : 'default';\n  }\n\n  /** persistent cache key for this account's session token */\n  private get sessionCacheKey(): string {\n    return `bwp-session:${this.accountKey}`;\n  }\n\n  /** resolve the manual session token, if one was configured and is non-empty */\n  private async resolveManualToken(): Promise<string | undefined> {\n    if (!this.sessionTokenResolver) return undefined;\n    const val = await this.sessionTokenResolver.resolve();\n    return (typeof val === 'string' && val) ? val : undefined;\n  }\n\n  /** Produce a brand-new session token by running `bw unlock`. */\n  private async unlock(): Promise<string> {\n    const masterPassword = await this.resolveMasterPassword();\n    if (masterPassword === undefined && !process.stdin.isTTY) {\n      throw new ResolutionError('Cannot unlock the Bitwarden vault without an interactive terminal', {\n        tip: [\n          'varlock is auto-unlocking the vault (no sessionToken/masterPassword configured) but stdin is not a TTY',\n          'For local dev: run `varlock load` once in an interactive terminal to unlock and cache the session,',\n          '  then your non-interactive command will reuse the cached token',\n          'For CI / headless: configure @initBwp with sessionToken=$BWP_SESSION (a pre-obtained token),',\n          '  or masterPassword=$BW_MASTER_PASSWORD to unlock non-interactively',\n        ].join('\\n'),\n      });\n    }\n    return await unlockVault({ masterPassword, appDataDir: this.appDataDir });\n  }\n\n  /**\n   * Acquire a session token, reusing the cached/in-flight one when available.\n   * `bw unlock` itself errors clearly when the user isn't logged in, and a stale\n   * cached token is self-healed by the re-unlock retry in `getSecret`, so no\n   * separate `bw status` / login probe is needed here.\n   */\n  async autoUnlock(): Promise<string> {\n    const key = this.accountKey;\n    let inFlight = sessionUnlockInFlight.get(key);\n    if (!inFlight) {\n      // create + register synchronously (no await between get and set) to keep single-flight\n      inFlight = (async () => {\n        if (pluginCache) {\n          return await pluginCache.getOrSet(this.sessionCacheKey, this.sessionTtl, () => this.unlock());\n        }\n        return await this.unlock();\n      })();\n      sessionUnlockInFlight.set(key, inFlight);\n    }\n\n    try {\n      return await inFlight;\n    } catch (err) {\n      // let a later resolution retry after a failed unlock\n      if (sessionUnlockInFlight.get(key) === inFlight) sessionUnlockInFlight.delete(key);\n      throw err;\n    }\n  }\n\n  /**\n   * Replace a known-stale session token with a fresh `bw unlock`, then return it.\n   *\n   * Idempotent for concurrent callers holding the same stale token: only the first\n   * triggers a new unlock and the rest reuse its result. This avoids a re-unlock\n   * storm — since each `bw unlock` invalidates prior session keys, racing unlocks\n   * would invalidate each other and cause spurious failures. We overwrite the cache\n   * via `set` (rather than `delete` + `getOrSet`) so the fresh token is never read\n   * back through a not-yet-completed delete.\n   */\n  async refreshUnlock(staleToken: string): Promise<string> {\n    const key = this.accountKey;\n    const current = sessionUnlockInFlight.get(key);\n    if (current) {\n      const resolved = await current.catch(() => undefined);\n      // a fresh unlock already happened past the stale token — reuse it\n      if (resolved !== undefined && resolved !== staleToken) return resolved;\n    }\n\n    // Compare-and-swap: only the caller still pointing at the stale unlock starts a\n    // new one. The check + assignment run synchronously with no `await` between them,\n    // so they are atomic across the continuations woken by awaiting `current` above.\n    if (sessionUnlockInFlight.get(key) === current) {\n      sessionUnlockInFlight.set(key, (async () => {\n        const token = await this.unlock();\n        await pluginCache?.set(this.sessionCacheKey, token, this.sessionTtl);\n        return token;\n      })());\n    }\n\n    const inFlight = sessionUnlockInFlight.get(key)!;\n    try {\n      return await inFlight;\n    } catch (err) {\n      if (sessionUnlockInFlight.get(key) === inFlight) sessionUnlockInFlight.delete(key);\n      throw err;\n    }\n  }\n\n  private async resolveMasterPassword(): Promise<string | undefined> {\n    if (!this.masterPasswordResolver) return undefined;\n    const val = await this.masterPasswordResolver.resolve();\n    if (typeof val !== 'string' || !val) {\n      throw new SchemaError('masterPassword resolved to an empty value');\n    }\n    return val;\n  }\n\n  async getSecret(itemQuery: string, field: string = 'password'): Promise<string> {\n    const manualToken = await this.resolveManualToken();\n    const token = manualToken ?? await this.autoUnlock();\n\n    try {\n      return await this.fetchField(itemQuery, field, token);\n    } catch (err) {\n      // if we manage the token ourselves and it went stale, re-unlock once and retry\n      if (!manualToken && isInvalidSessionError(err)) {\n        debug('cached bw session invalid — re-unlocking');\n        const freshToken = await this.refreshUnlock(token);\n        return await this.fetchField(itemQuery, field, freshToken);\n      }\n      throw err;\n    }\n  }\n\n  private async fetchField(itemQuery: string, field: string, token: string): Promise<string> {\n    const raw = await execBwCliCommand(\n      ['get', 'item', itemQuery, '--nointeraction'],\n      token,\n      { appDataDir: this.appDataDir },\n    );\n    let item: BwItem;\n    try {\n      item = JSON.parse(raw);\n    } catch {\n      throw new ResolutionError(`Failed to parse Bitwarden CLI response for item \"${itemQuery}\"`, {\n        tip: 'Make sure the `bw` CLI is working correctly and the item is a login/secure-note item',\n      });\n    }\n    return extractBwItemField(item, field);\n  }\n}\n\nconst bwpPluginInstances: Record<string, BitwardenPasswordManagerInstance> = {};\n\n/** resolve the optional appDataDir, expanding a leading `~` (spawn env does not) */\nasync function resolveAppDataDir(resolver?: Resolver): Promise<string | undefined> {\n  if (!resolver) return undefined;\n  const val = await resolver.resolve();\n  if (typeof val !== 'string' || !val) return undefined;\n  if (val === '~') return homedir();\n  if (val.startsWith('~/')) return joinPath(homedir(), val.slice(2));\n  return val;\n}\n\nplugin.registerRootDecorator({\n  name: 'initBwp',\n  description: 'Initialize a Bitwarden Password Manager (or Vaultwarden) plugin instance via the `bw` CLI',\n  isFunction: true,\n  async process(argsVal) {\n    // all args are optional — `@initBwp()` with no args is the primary (auto-unlock) form\n    const objArgs = argsVal.objArgs ?? {};\n\n    // id (optional, static)\n    if (objArgs.id && !objArgs.id.isStatic) {\n      throw new SchemaError('Expected id to be static');\n    }\n    const id = String(objArgs?.id?.staticValue || '_default');\n\n    if (bwpPluginInstances[id]) {\n      throw new SchemaError(`Bitwarden PM instance with id \"${id}\" already initialized`);\n    }\n\n    bwpPluginInstances[id] = new BitwardenPasswordManagerInstance(id);\n\n    return {\n      id,\n      sessionTokenResolver: objArgs.sessionToken,\n      masterPasswordResolver: objArgs.masterPassword,\n      sessionTtlResolver: objArgs.sessionTtl,\n      cacheTtlResolver: objArgs.cacheTtl,\n      appDataDirResolver: objArgs.appDataDir,\n    };\n  },\n  async execute({\n    id,\n    sessionTokenResolver,\n    masterPasswordResolver,\n    sessionTtlResolver,\n    cacheTtlResolver,\n    appDataDirResolver,\n  }) {\n    const instance = bwpPluginInstances[id];\n    // store resolvers (not resolved values) so auth is resolved lazily — a fully\n    // value-cached load never needs to unlock\n    instance.sessionTokenResolver = sessionTokenResolver;\n    instance.masterPasswordResolver = masterPasswordResolver;\n    instance.appDataDir = await resolveAppDataDir(appDataDirResolver);\n\n    const sessionTtl = await resolveCacheTtl(sessionTtlResolver);\n    if (sessionTtl !== undefined) instance.sessionTtl = sessionTtl;\n\n    const cacheTtl = await resolveCacheTtl(cacheTtlResolver);\n    if (cacheTtl !== undefined) instance.cacheTtl = cacheTtl;\n  },\n});\n\nplugin.registerDataType({\n  name: 'bwSessionToken',\n  sensitive: true,\n  internal: true,\n  typeDescription: 'Bitwarden CLI session token (output of `bw unlock`)',\n  icon: BITWARDEN_ICON,\n  docs: [\n    {\n      description: 'Bitwarden CLI authentication',\n      url: 'https://bitwarden.com/help/cli/#unlock',\n    },\n  ],\n  async validate(val) {\n    if (typeof val !== 'string' || val.length === 0) {\n      throw new ValidationError('Bitwarden session token must be a non-empty string');\n    }\n  },\n});\n\nplugin.registerResolverFunction({\n  name: 'bwp',\n  label: 'Fetch a field from a Bitwarden Password Manager / Vaultwarden vault item via the `bw` CLI',\n  icon: BITWARDEN_ICON,\n  argsSchema: {\n    type: 'mixed',\n    arrayMinLength: 1,\n    arrayMaxLength: 2,\n  },\n  process() {\n    let instanceId = '_default';\n    let itemQueryResolver: Resolver | undefined;\n    const fieldResolver = this.objArgs?.field;\n\n    const arrArgs = this.arrArgs ?? [];\n    const argCount = arrArgs.length;\n\n    if (argCount === 1) {\n      itemQueryResolver = arrArgs[0];\n    } else if (argCount === 2) {\n      if (!arrArgs[0].isStatic) {\n        throw new SchemaError('Expected instance id (first argument) to be a static value');\n      }\n      instanceId = String(arrArgs[0].staticValue);\n      itemQueryResolver = arrArgs[1];\n    } else {\n      throw new SchemaError('Expected 1 or 2 positional arguments: bwp(\"item\") or bwp(instanceId, \"item\")');\n    }\n\n    if (!Object.keys(bwpPluginInstances).length) {\n      throw new SchemaError('No Bitwarden PM plugin instances found', {\n        tip: 'Initialize at least one instance using the @initBwp() root decorator',\n      });\n    }\n\n    const selectedInstance = bwpPluginInstances[instanceId];\n    if (!selectedInstance) {\n      if (instanceId === '_default') {\n        throw new SchemaError('Bitwarden PM plugin instance (without id) not found', {\n          tip: [\n            'Either remove the `id` param from your @initBwp call',\n            'or use `bwp(id, \"item\")` to select an instance by id',\n            `Available ids: ${Object.keys(bwpPluginInstances).join(', ')}`,\n          ].join('\\n'),\n        });\n      } else {\n        throw new SchemaError(`Bitwarden PM plugin instance id \"${instanceId}\" not found`, {\n          tip: `Available ids: ${Object.keys(bwpPluginInstances).join(', ')}`,\n        });\n      }\n    }\n\n    return { instanceId, itemQueryResolver, fieldResolver };\n  },\n  async resolve({ instanceId, itemQueryResolver, fieldResolver }) {\n    const selectedInstance = bwpPluginInstances[instanceId];\n\n    const itemQuery = await itemQueryResolver.resolve();\n    if (typeof itemQuery !== 'string' || !itemQuery) {\n      throw new SchemaError('Expected item name/id to resolve to a non-empty string');\n    }\n\n    let field = 'password';\n    if (fieldResolver) {\n      const resolvedField = await fieldResolver.resolve();\n      if (typeof resolvedField === 'string' && resolvedField) field = resolvedField;\n    }\n\n    // cache resolved values too, if cacheTtl is configured and caching is available.\n    // key by account (appDataDir), not instance id, so instances on the same account\n    // share cached values and distinct accounts never collide.\n    if (selectedInstance.cacheTtl !== undefined && pluginCache) {\n      const cacheKey = `bwp:${selectedInstance.accountKey}:${itemQuery}:${field}`;\n      return await pluginCache.getOrSet(\n        cacheKey,\n        selectedInstance.cacheTtl,\n        async () => await selectedInstance.getSecret(itemQuery, field),\n      );\n    }\n\n    return await selectedInstance.getSecret(itemQuery, field);\n  },\n});\n\n// Anonymous, non-sensitive usage signals. Strictly sanitized before send.\nplugin.registerTelemetryAttributes(() => {\n  const smInstances = Object.values(pluginInstances);\n  const pmInstances = Object.values(bwpPluginInstances);\n  const instances = [...smInstances, ...pmInstances];\n  return {\n    // standard attributes\n    instance_count: instances.length,\n    cache_enabled: instances.some((i) => i.cacheTtl != null),\n    // custom attributes\n    uses_secrets_manager: smInstances.length > 0,\n    uses_password_manager: pmInstances.length > 0,\n    self_hosted_server: smInstances.some((i) => i.telemetryUsesSelfHostedServer),\n  };\n});\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],"mappings":"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"}