@qawolf/ci-sdk 1.3.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/other.ts","../src/lib/sdk/defaults/fetch.ts","../src/lib/sdk/defaults/log.ts","../src/lib/sdk/defaults/serviceBase.ts","../package.json","../src/lib/sdk/defaults/userAgent.ts","../src/lib/api/log.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/generate-signed-url-for-run-inputs-executables.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.ts","../src/lib/api/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/notifyTerminatedEphemeralEnvironment/index.ts","../src/lib/sdk/domain/pollCiGreenlight/buildCompletedRunResult.ts","../src/lib/sdk/domain/pollCiGreenlight/consts.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/pollCiGreenlight/iterator.ts","../src/lib/sdk/domain/pollCiGreenlight/logging.ts","../src/lib/sdk/domain/pollCiGreenlight/mapIteratorAbortToGreenlightStatus.ts","../src/lib/sdk/domain/pollCiGreenlight/index.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","defaultTimeoutMs","args","signal","AbortSignal","timeout","defaultFetch","globalThis","defaultLogDriver","error","message","console","info","log","warn","defaultServiceBase","defaultUserAgent","packageJson","version","logFetchError","methodName","response","ok","eventId","failureMessage","body","json","catch","text","undefined","eventIdSuffix","messageSuffix","statusText","status","attemptNotifyDeploy","deps","apiConfig","config","localFetch","URL","serviceBase","JSON","stringify","branch","commit_url","commitUrl","deduplication_key","deduplicationKey","deployment_type","deploymentType","deployment_url","deploymentUrl","ephemeral_environment","ephemeralEnvironment","hosting_service","hostingService","merge_request_number","mergeRequestNumber","pull_request_number","pullRequestNumber","repository","sha","variables","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","data","handleSuccessResponse","abortReason","httpStatus","outcome","environment","results","isPreviewDeployment","isStatic","logPrefix","alias","id","length","environmentId","runId","failReason","failedTrigger","find","t","failure_reason","duplicateSuite","duplicate_suite_id","successfulTrigger","created_suite_id","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","notifyTerminatedEphemeralEnvironment","buildCompletedRunResult","greenlight","greenlightStatus","pollCiGreenlightDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","fetchCiGreenlightStatus","resp","canRetry","errorType","makePollCiGreenlightStatusIterator","pollConfig","retries","previousStatus","startedAt","Date","now","elapsedMs","isAborted","Error","retryLabel","stageChanged","runStage","isFailedTerminalStage","buildSuccessLogMessage","nonBlockingBugsCount","relevantRunUrl","urlInfo","buildFailedLogMessage","blockingBugsCount","blockingBugUrls","nonBlockingBugUrls","relevantRunWithBugsUrl","blockingBugList","map","url","join","nonBlockingBugList","bugsListInText","buildSupersededAbortLogMessage","rootRunUrl","supersedingDetails","buildSupersededContinueLogMessage","buildRunStageLogMessage","mapIteratorAbortToGreenlightStatus","iteration","pollCiGreenlightStatus","onRunStageChanged","iterator","lastPoll","e","relevantRunId","rootRunId","isSuperseded","shouldAbortOnSuperseded","result","makeQaWolfSdk","bind"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { FetchDriver } from \"./sdk/dependencies.js\";\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function pluralize(count: number) {\n return count === 1 ? \"\" : \"s\";\n}\n\nexport function getBackoffMs(\n attemptNumber: number,\n minWaitMs = 1000,\n maxWaitMs = 10000,\n): number {\n return Math.min(maxWaitMs, minWaitMs * 1.2 ** attemptNumber);\n}\n\nexport const buildFetchWithTimeout =\n (fetch: FetchDriver, defaultTimeoutMs: number) =>\n async (...args: Parameters<FetchDriver>) => {\n // Allow signal to be overridden by the caller\n const signal = args[1]?.signal ?? AbortSignal.timeout(defaultTimeoutMs);\n\n return fetch(args[0], { ...args[1], signal });\n };\n","export const defaultFetch = globalThis.fetch;\n","import type { LogDriver } from \"../dependencies.js\";\n\nexport const defaultLogDriver: LogDriver = {\n error(message, error) {\n console.error(message, error);\n },\n info(message) {\n console.log(message);\n },\n warn(message) {\n console.warn(message);\n },\n};\n","export const defaultServiceBase = \"https://app.qawolf.com/\";\n","{\n \"name\": \"@qawolf/ci-sdk\",\n \"version\": \"1.3.2\",\n \"private\": false,\n \"description\": \"A simple SDK for interacting with QAWolf in CI scripts.\",\n \"keywords\": [],\n \"license\": \"MIT\",\n \"author\": \"Jules Sam. Randolph<jules@qawolf.com>\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"/dist\",\n \"/README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint:ci\": \"npm run lint:non-fixable; NON_FIXABLE_EXIT=$?; npm run lint:fixable && exit $NON_FIXABLE_EXIT\",\n \"lint:dev\": \"npm run lint:fixable\",\n \"lint:fixable\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:non-fixable\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*'\",\n \"prepublishOnly\": \"nx run ci-sdk:build\",\n \"test\": \"NODE_OPTIONS=\\\"--experimental-vm-modules\\\" NODE_NO_WARNINGS=1 jest\",\n \"tsc:check\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@qawolf/ci-utils\": \"^1.1.2\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.2\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n","import packageJson from \"../../../../package.json\" with { type: \"json\" };\n\nexport const defaultUserAgent = `ci-sdk/${packageJson.version}`;\n","import type { LogDriver } from \"@qawolf/ci-utils\";\n\nexport async function logFetchError({\n log,\n methodName,\n response,\n}: {\n log: LogDriver;\n methodName: string;\n response: Response;\n}) {\n if (response.ok) return;\n\n const { eventId, failureMessage } = await (async () => {\n try {\n const body = (await response.json().catch(() => response.text())) as\n | Record<string, unknown>\n | string;\n if (typeof body === \"object\" && body !== null) {\n return {\n eventId: body.eventId,\n failureMessage: body.failureMessage,\n };\n }\n // If body is not an object (i.e., it's the text from catch)\n return {\n eventId: undefined,\n failureMessage: body,\n };\n } catch {\n // If both parsing attempts somehow fail\n return {\n eventId: undefined,\n failureMessage: undefined,\n };\n }\n })();\n\n const eventIdSuffix = eventId ? ` (Event ID: ${eventId})` : \"\";\n const messageSuffix = failureMessage ? `: ${failureMessage}` : \"\";\n\n const statusText =\n response.status >= 500\n ? \"Server Error\"\n : response.statusText || \"Unknown Error\";\n\n log.error(\n `❌ [${methodName}] ${response.status} ${statusText}${eventIdSuffix}${messageSuffix}`,\n );\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\n DeployStatus,\n NotifyDeployStatus,\n} from \"./types.js\";\n\nexport async function attemptNotifyDeploy(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: Partial<DeployConfig>,\n): Promise<NotifyDeployStatus> {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/deploy_success\", apiConfig.serviceBase),\n {\n body: JSON.stringify({\n branch: config.branch,\n commit_url: config.commitUrl,\n deduplication_key: config.deduplicationKey,\n deployment_type: config.deploymentType,\n deployment_url: config.deploymentUrl,\n ...(\"ephemeralEnvironment\" in config\n ? {\n ephemeral_environment: config.ephemeralEnvironment,\n }\n : \"hostingService\" in config && {\n hosting_service: config.hostingService,\n merge_request_number:\n config.hostingService === \"GitLab\"\n ? config.mergeRequestNumber\n : undefined,\n pull_request_number:\n config.hostingService === \"GitHub\"\n ? config.pullRequestNumber\n : undefined,\n repository: config.repository,\n }),\n sha: config.sha,\n variables: config.variables,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n // Override default timeout to 5 minutes. This gives extra room\n // for both (1) waiting for reconciliation (2) creating the run.\n signal: AbortSignal.timeout(5 * 60 * 1000),\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n const data = (await response.json()) as DeployStatus;\n return handleSuccessResponse(data, log);\n } catch {\n log.error(`🚫 Network error from deploy_success, aborting.`);\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n}\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const status = response.status;\n let abortReason: AttemptDeployHttpAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"attemptNotifyDeploy\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n\nasync function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const isPreviewDeployment = environment && !environment.isStatic;\n\n if (environment) {\n const logPrefix = environment.isStatic\n ? \"Static environment\"\n : \"Preview environment\";\n log.info(`${logPrefix}: ${environment.alias} (id: ${environment.id})`);\n }\n\n // No triggers were matched\n if (results.length === 0) {\n if (isPreviewDeployment) {\n log.info(\n `✅ Deployment notification was successful. No run was created for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n log.error(\n `🚫 No trigger matched the request. Please make sure there is at least one active test in the QA Wolf environment, or contact support.`,\n );\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n\n // If there are results, environment must be defined\n if (!environment) {\n log.error(`🚫 No environment matched the request. Please contact support.`);\n return { failReason: \"no-environment\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((t) => \"failure_reason\" in t);\n if (failedTrigger) {\n log.error(\n `🚫 Run could not be created. Reason: \"${failedTrigger.failure_reason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((t) => \"duplicate_suite_id\" in t);\n if (duplicateSuite) {\n log.info(\n `✅ Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicate_suite_id} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicate_suite_id,\n };\n }\n\n const successfulTrigger = results.find((t) => \"created_suite_id\" in t);\n if (!successfulTrigger) {\n log.error(`🚫 No trigger matched the request. Please contact support.`);\n return { failReason: \"no-matched-trigger\", outcome: \"failed\" };\n }\n log.info(\n `✅ Deployment notification was successful. Run created with ID: ${successfulTrigger.created_suite_id}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.created_suite_id,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/run-inputs-executables-signed-urls?file=${encodeURIComponent(destinationFilePath)}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForRunInputsExecutablesStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForRunInputsExecutablesStorage } from \"../../../api/generate-signed-url-for-run-inputs-executables.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n GenerateSignedUrlAbortReason,\n GenerateSignedUrlConfig,\n GenerateSignedUrlStatus,\n} from \"./types.js\";\n\nexport async function generateSignedUrlForRunInputsExecutablesStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`🚫 destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState =\n await callGenerateSignedUrlForRunInputsExecutablesStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`✅ Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/team-storage-signed-url?file=${destinationFilePath}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForTempTeamStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForTempTeamStorage } from \"../../../api/generate-signed-url-for-team-storage.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type { GenerateSignedUrlConfig } from \"./types.js\";\n\ntype GenerateSignedUrlStatus =\n | {\n fileLocation?: string;\n playgroundFileLocation?: string;\n success: true;\n uploadUrl?: string;\n }\n | {\n abortReason: GenerateSignedUrlAbortReason;\n httpStatus?: number;\n success: false;\n };\n\nexport type GenerateSignedUrlAbortReason =\n | \"client-network-error\"\n | \"sdk-argument-validation-failed\"\n | \"400-invalid-request\"\n | \"401-invalid-credentials\"\n | \"403-forbidden\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport async function generateSignedUrlForTempTeamStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`🚫 destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState = await callGenerateSignedUrlForTempTeamStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`✅ Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n NotifyTerminatedEphemeralEnvironmentAbortReason,\n NotifyTerminatedEphemeralEnvironmentInput,\n NotifyTerminatedEphemeralEnvironmentResult,\n TerminatedEphemeralEnvironmentSuccessResult,\n} from \"./types.js\";\n\nexport const notifyTerminatedEphemeralEnvironment = async (\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: NotifyTerminatedEphemeralEnvironmentInput,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> => {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/environment_terminated\", apiConfig.serviceBase),\n {\n body: JSON.stringify(config),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n if (!response.ok) return handleErrorResponse(response, log);\n const { environmentId } =\n (await response.json()) as TerminatedEphemeralEnvironmentSuccessResult;\n return { environmentId, outcome: \"success\" };\n } catch {\n log.error(`🚫 Network error from terminate_preview_environment, aborting.`);\n return {\n abortReason: \"network-error\",\n outcome: \"aborted\",\n };\n }\n};\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> {\n const status = response.status;\n let abortReason: NotifyTerminatedEphemeralEnvironmentAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status === 409) abortReason = \"409-conflict\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"notifyTerminatedEphemeralEnvironment\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\n\nimport type { PollCiGreenlightStatus } from \"./types.js\";\n\n/**\n * Build the result for a completed run\n */\nexport function buildCompletedRunResult(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): PollCiGreenlightStatus {\n if (status.greenlight)\n return { greenlightStatus: status, outcome: \"success\" };\n else return { greenlightStatus: status, outcome: \"failed\" };\n}\n","import type { PollCiGreenlightPollConfig } from \"./types.js\";\n\n/**\n * Safe default values for polling configuration.\n * If you change these values, make sure you update the JSDoc\n * comments in the PollCiGreenlightPollConfig type.\n */\nexport const pollCiGreenlightDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000, // 2 hours\n retryInterval: 10 * 1000, // 10 seconds\n runInProgressInterval: 30 * 1000, // 30 seconds\n runUnderReviewInterval: 60 * 1000, // 60 seconds\n};\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport type CiGreenlightBugDetails = {\n /**\n * The URL of this BR in the QAWolf application.\n */\n applicationUrl: string;\n /**\n * If this bug report is linked to an external issue, it will\n * show up here.\n */\n externalIssue:\n | {\n /**\n * The URL of the external issue in the external platform\n * application.\n */\n applicationUrl: string;\n /**\n * The ID of this issue in the external platform.\n */\n externalIssueId: string;\n /**\n * Lowercase platform name (e.g. \"jira\").\n */\n platform: string;\n }\n | undefined;\n /**\n * True if the bug is blocking.\n */\n isBlocking: boolean;\n /**\n * True if the bug has been found in this run.\n */\n isNew: boolean;\n /**\n * The name of this bug.\n */\n name: string;\n /**\n * The bug number.\n */\n number: number;\n /**\n * The priority of this bug.\n */\n priority: \"medium\" | \"unprioritized\" | \"low\" | \"high\" | \"urgent\";\n};\n\nexport type CiGreenlightBugData = {\n /**\n * The count of blocking bugs reproduced in the run.\n */\n blockingBugsCount: number;\n /**\n * The URLs of the blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: true`, reading\n * the `applicationUrl` field.\n */\n blockingBugUrls: string[];\n /**\n * The count of non-blocking bugs reproduced in the run.\n */\n nonBlockingBugsCount: number;\n /**\n * The URLs of the non-blocking bugs.\n *\n * @deprecated This field will be removed in the next major version.\n * Prefer using `reproducedBugs` filtered by `isBlocking: false`, reading\n * the `applicationUrl` field.\n */\n nonBlockingBugUrls: string[];\n /**\n * Blocking bugs that were not reproduced in this run, but are still\n * opened in the run environment. This may happen when the run only covers a\n * subset of the workflows in environment.\n */\n otherBlockingBugsInEnvironment: CiGreenlightBugDetails[];\n /**\n * Bugs that were reproduced in this run. This includes newly found bugs.\n */\n reproducedBugs: CiGreenlightBugDetails[];\n};\n\n/**\n * @deprecated This type will be removed in the next major version. Use `CiGreenlightBugData` instead.\n */\nexport type CiGreenlightCompletedSuiteDetails = CiGreenlightBugData;\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n relevantRunWithBugsUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n workflowsDisabledAfterRunCount: number;\n workflowsInRunCount: number;\n workflowsUnderInvestigationCount: number;\n};\n\n/**\n * The status of a CI greenlight run. See the API documentation here for\n * more details: https://qawolf.notion.site/1b170576efea411fa785842a71e7c99e\n */\nexport type CiGreenlightStatus = CiGreenlightStatusBase &\n (\n | ({\n greenlight: boolean;\n runStage: \"completed\";\n } & CiGreenlightBugData)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData)\n | {\n greenlight: false;\n runStage: \"initializing\" | \"underReview\" | \"canceled\";\n }\n );\n\nexport async function fetchCiGreenlightStatus(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n {\n runId,\n }: {\n runId: string;\n },\n { fetch: localFetch, log }: SdkDependencies,\n) {\n try {\n const resp = await localFetch(\n new URL(\n `/api/v0/ci-greenlight/${encodeURIComponent(runId)}`,\n serviceBase,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": userAgent,\n },\n },\n );\n\n if (resp.ok) {\n const greenlightStatus = (await resp.json()) as CiGreenlightStatus;\n return {\n greenlightStatus,\n httpStatus: resp.status,\n ok: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"fetchCiGreenlightStatus\",\n response: resp,\n });\n if (resp.status === 404) {\n return {\n canRetry: true,\n errorType: \"not-found\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n if (resp.status >= 500) {\n return {\n canRetry: true,\n errorType: \"server\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n return {\n canRetry: false,\n errorType: \"client\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n } catch {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { fetchCiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { sleep } from \"../../../other.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport type {\n MakePollCiGreenlightStatusIteratorParams,\n PollCiGreenlightIteration,\n} from \"./types.js\";\n\n/**\n * Creates an async generator that yields CI greenlight status updates or abort notifications.\n *\n * This low-level API gives you full control over the polling loop, allowing you to:\n * - Inspect status after each fetch\n * - Break out of the loop based on custom criteria\n * - Add custom logging or side effects\n * - Handle abort conditions without exceptions\n *\n * The iterator yields a discriminated union with `isAborted` property:\n * - `isAborted: false` - Normal status update with run information\n * - `isAborted: true` - Terminal condition (timeout, error, canceled, etc.)\n *\n * Note: This function does not throw errors. All error conditions are yielded as\n * abort results that you must check and handle.\n *\n * @example\n * ```typescript\n * const greenlightIterator = makePollCiGreenlightStatusIterator({ runId: \"my-run-id\" });\n *\n * for await (const lastPoll of greenlightIterator) {\n * // Check for abort conditions first\n * if (lastPoll.isAborted) {\n * console.error(`Aborted: ${lastPoll.abortReason}`);\n * process.exit(1);\n * }\n *\n * // Handle normal status updates\n * const { status } = lastPoll;\n * console.log(`Current stage: ${status.runStage}`);\n *\n * // Exit with error if run reached a terminal stage without greenlight\n * if (lastPoll.isFailedTerminalStage) {\n * process.exit(1);\n * }\n * }\n * ```\n *\n */\nexport async function* makePollCiGreenlightStatusIterator(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n { runId, ...pollConfig }: MakePollCiGreenlightStatusIteratorParams,\n): AsyncGenerator<PollCiGreenlightIteration, void, unknown> {\n const { log } = deps;\n\n const {\n maxRetries = pollCiGreenlightDefaults.maxRetries,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n retryInterval = pollCiGreenlightDefaults.retryInterval,\n runInProgressInterval = pollCiGreenlightDefaults.runInProgressInterval,\n runUnderReviewInterval = pollCiGreenlightDefaults.runUnderReviewInterval,\n } = pollConfig;\n\n let retries = 0;\n let previousStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= pollTimeout) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n { runId },\n deps,\n );\n\n const elapsedMs = Date.now() - startedAt;\n\n if (!responseState.ok && !responseState.canRetry) {\n yield {\n abortReason: \"4XX-client-error\",\n elapsedMs,\n httpStatus: responseState.httpStatus,\n isAborted: true,\n };\n return;\n }\n\n if (!responseState.ok) {\n retries += 1;\n const { errorType, httpStatus } = responseState;\n if (retries > maxRetries) {\n switch (errorType) {\n case \"network\":\n yield {\n abortReason: \"network-error\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n break;\n case \"not-found\":\n yield {\n abortReason: \"404-run-not-found\",\n elapsedMs,\n httpStatus: httpStatus ?? 404,\n isAborted: true,\n };\n break;\n case \"server\":\n yield {\n abortReason: \"5XX-server-error\",\n elapsedMs,\n httpStatus: httpStatus ?? 500,\n isAborted: true,\n };\n break;\n default:\n throw Error(`Unexpected error type: ${errorType satisfies never}`);\n }\n return;\n }\n\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n\n if (errorType === \"network\") log.warn(`❌ Network error${retryLabel}`);\n else if (errorType === \"not-found\")\n log.info(`⏳ Run not found${retryLabel}`);\n else if (errorType === \"server\") log.warn(`❌ Server error${retryLabel}`);\n\n await sleep(retryInterval);\n continue;\n }\n\n // Success - reset retry counter\n retries = 0;\n const { greenlightStatus } = responseState;\n const stageChanged =\n !previousStatus || previousStatus.runStage !== greenlightStatus.runStage;\n\n // Determine if this is a failed terminal stage\n const isFailedTerminalStage =\n greenlightStatus.runStage === \"canceled\" ||\n (greenlightStatus.runStage === \"completed\" &&\n greenlightStatus.greenlight === false);\n\n yield {\n elapsedMs,\n isAborted: false,\n isFailedTerminalStage,\n previousStatus,\n stageChanged,\n status: greenlightStatus,\n };\n\n // Update previous status for next iteration\n previousStatus = greenlightStatus;\n\n switch (greenlightStatus.runStage) {\n case \"canceled\": {\n yield {\n abortReason: \"run-canceled\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n }\n case \"completed\":\n return;\n case \"initializing\":\n await sleep(runInProgressInterval);\n break;\n case \"underReview\":\n await sleep(runUnderReviewInterval);\n break;\n default:\n throw Error(\n `Unexpected run stage: ${greenlightStatus satisfies never}`,\n );\n }\n }\n\n // Timeout\n yield {\n abortReason: \"poll-timed-out\",\n elapsedMs: Date.now() - startedAt,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { pluralize } from \"../../../other.js\";\n\n/**\n * Build log message for successful completed run\n */\nexport function buildSuccessLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const { nonBlockingBugsCount, relevantRunUrl } = status;\n const urlInfo = `See ${relevantRunUrl}`;\n\n return `✅ Run passed and no blocking bugs found${\n nonBlockingBugsCount > 0\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )} found`\n : \"\"\n }.\\n${urlInfo}`;\n}\n\n/**\n * Build log message for failed completed run\n */\nexport function buildFailedLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const {\n blockingBugsCount,\n blockingBugUrls = [],\n nonBlockingBugsCount,\n nonBlockingBugUrls = [],\n relevantRunWithBugsUrl,\n } = status;\n\n const blockingBugList = blockingBugUrls.map((url) => `\\n• ${url}`).join(\"\");\n const nonBlockingBugList = nonBlockingBugUrls\n .map((url) => `\\n• ${url}`)\n .join(\"\");\n const bugsListInText = `${\n blockingBugUrls.length > 0 ? `\\nBLOCKING BUGS:${blockingBugList}` : \"\"\n }${\n nonBlockingBugUrls.length > 0\n ? `\\nNON BLOCKING BUGS:${nonBlockingBugList}`\n : \"\"\n }`;\n\n return (\n `❌ Run failed and ${blockingBugsCount} blocking bug${pluralize(\n blockingBugsCount,\n )} found${\n nonBlockingBugsCount\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )}`\n : \"\"\n }.\\nSee ${relevantRunWithBugsUrl}\\n` +\n \"You may review the priority of certain bugs to mark these non-blocking and retry the job.\\n\" +\n bugsListInText\n );\n}\n\n/**\n * Build log message for superseded run (aborting)\n */\nexport function buildSupersededAbortLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `❌ Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`;\n}\n\n/**\n * Build log message for superseded run (continuing)\n */\nexport function buildSupersededContinueLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `Root run was superseded:${supersedingDetails}`;\n}\n\n/**\n * Build log messages for different run stages\n */\nexport function buildRunStageLogMessage(\n runStage: CiGreenlightStatus[\"runStage\"],\n relevantRunUrl: string,\n): string {\n const urlInfo = `See ${relevantRunUrl}`;\n\n switch (runStage) {\n case \"canceled\":\n return `🚫 Run was canceled. Aborting... Please contact support.\\n${urlInfo}`;\n case \"initializing\":\n return `⏳ Run is in progress... ${urlInfo}`;\n case \"underReview\":\n return `🕵️ Run is under review... ${urlInfo}`;\n case \"completed\":\n // Completed is handled separately by buildSuccessLogMessage/buildFailedLogMessage\n throw Error(\n \"buildRunStageLogMessage should not be called for completed stage\",\n );\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n}\n","import type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n PollCiGreenlightIteratorHttpAborted,\n PollCiGreenlightIteratorNonHttpAborted,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\n/**\n * Handles aborted iterations from the CI greenlight poll iterator\n * and converts them to appropriate result objects with logging\n */\nexport function mapIteratorAbortToGreenlightStatus(\n iteration:\n | PollCiGreenlightIteratorHttpAborted\n | PollCiGreenlightIteratorNonHttpAborted,\n pollTimeout: number,\n deps: SdkDependencies,\n): PollCiGreenlightStatus {\n const { log } = deps;\n const { abortReason, httpStatus } = iteration;\n\n switch (abortReason) {\n case \"4XX-client-error\":\n log.error(\n `🚫 Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"5XX-server-error\":\n log.error(\n `🚫 Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"404-run-not-found\":\n log.error(\n `🚫 Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"network-error\":\n log.error(`🚫 Unrecoverable network error from CI greenlight, aborting.`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"poll-timed-out\":\n log.warn(`❌ Poll timed out after ${pollTimeout / 1000}s`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"run-canceled\":\n log.info(`Run was canceled`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"XXX-other-http-code\":\n log.error(\n `🚫 Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n default:\n throw Error(`Unexpected abort reason: ${abortReason satisfies never}`);\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { buildCompletedRunResult } from \"./buildCompletedRunResult.js\";\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./iterator.js\";\nimport {\n buildFailedLogMessage,\n buildRunStageLogMessage,\n buildSuccessLogMessage,\n buildSupersededAbortLogMessage,\n buildSupersededContinueLogMessage,\n} from \"./logging.js\";\nimport { mapIteratorAbortToGreenlightStatus } from \"./mapIteratorAbortToGreenlightStatus.js\";\nimport type {\n PollCiGreenlightParams,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged: onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n const { log } = deps;\n const {\n abortOnSuperseded = pollCiGreenlightDefaults.abortOnSuperseded,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n } = pollConfig;\n\n const iterator = makePollCiGreenlightStatusIterator(deps, apiConfig, {\n runId,\n ...pollConfig,\n });\n\n for await (const lastPoll of iterator) {\n if (lastPoll.isAborted)\n return mapIteratorAbortToGreenlightStatus(lastPoll, pollTimeout, deps);\n\n // Handle status iterations\n const { previousStatus, stageChanged, status } = lastPoll;\n\n // Call onRunStageChanged callback when stage changes\n if (stageChanged) {\n try {\n await onRunStageChanged(status, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n\n const { relevantRunId, relevantRunUrl, rootRunId, rootRunUrl, runStage } =\n status;\n\n // Superseded run handling\n const isSuperseded = rootRunId !== relevantRunId;\n const shouldAbortOnSuperseded = isSuperseded && abortOnSuperseded;\n if (shouldAbortOnSuperseded) {\n const message = buildSupersededAbortLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.warn(message);\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (isSuperseded) {\n const message = buildSupersededContinueLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.info(message);\n }\n\n switch (runStage) {\n case \"canceled\":\n case \"initializing\":\n case \"underReview\": {\n log.info(buildRunStageLogMessage(runStage, relevantRunUrl));\n break;\n }\n case \"completed\": {\n const result = buildCompletedRunResult(status);\n switch (result.outcome) {\n case \"aborted\": {\n break;\n }\n case \"failed\": {\n const message = buildFailedLogMessage(status);\n log.warn(message);\n break;\n }\n case \"success\": {\n const message = buildSuccessLogMessage(status);\n log.info(message);\n break;\n }\n default:\n throw Error(`Unexpected outcome: ${result satisfies never}`);\n }\n return result;\n }\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n }\n\n // This should never be reached as the iterator handles timeout\n throw Error(\"Iterator ended unexpectedly\");\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport { buildFetchWithTimeout } from \"../other.js\";\n\nimport { defaultFetch } from \"./defaults/fetch.js\";\nimport { defaultLogDriver } from \"./defaults/log.js\";\nimport { defaultServiceBase } from \"./defaults/serviceBase.js\";\nimport { defaultUserAgent } from \"./defaults/userAgent.js\";\nimport type { SdkDependencies } from \"./dependencies.js\";\nimport { attemptNotifyDeploy } from \"./domain/attemptDeploy/index.js\";\nimport { generateSignedUrlForRunInputsExecutablesStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.js\";\nimport { generateSignedUrlForTempTeamStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-team-storage.js\";\nimport { notifyTerminatedEphemeralEnvironment } from \"./domain/notifyTerminatedEphemeralEnvironment/index.js\";\nimport { pollCiGreenlightStatus } from \"./domain/pollCiGreenlight/index.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./domain/pollCiGreenlight/iterator.js\";\n\nexport function makeQaWolfSdk(\n {\n apiKey,\n serviceBase = defaultServiceBase,\n userAgent = defaultUserAgent,\n }: {\n apiKey: string;\n serviceBase?: string;\n userAgent?: string;\n },\n {\n fetch = defaultFetch,\n log = defaultLogDriver,\n }: Partial<SdkDependencies> = {},\n) {\n if (typeof fetch !== \"function\") {\n throw Error(\n `QA Wolf CI-SDK requires fetch to be defined. Make sure you are using NodeJS 18+, OR pass a fetch polyfill to the makeQaWolfSdk function.\nWe recommend 'undici' package for that purpose. See the Requirement section of our README for more guidance.`,\n );\n }\n\n const deps: SdkDependencies = {\n // Versions of fetch may have different default timeouts. For consistency, we explicitly set it to 2 minutes here.\n // The increased timeout helps avoid edge cases where we need to search for a commit against multiple\n // code hosting service repositories as a fallback when not finding the repository based on organization/name.\n fetch: buildFetchWithTimeout(fetch, 120000),\n log,\n };\n const apiConfig: ApiConfig = { apiKey, serviceBase, userAgent };\n return {\n attemptNotifyDeploy: attemptNotifyDeploy.bind(null, deps, apiConfig),\n generateSignedUrlForRunInputsExecutablesStorage:\n generateSignedUrlForRunInputsExecutablesStorage.bind(\n null,\n deps,\n apiConfig,\n ),\n generateSignedUrlForTempTeamStorage:\n generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),\n makePollCiGreenlightStatusIterator: makePollCiGreenlightStatusIterator.bind(\n null,\n deps,\n apiConfig,\n ),\n notifyTerminatedEphemeralEnvironment:\n notifyTerminatedEphemeralEnvironment.bind(null, deps, apiConfig),\n pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig),\n };\n}\n\nexport type * from \"./domain/attemptDeploy/index.js\";\nexport type * from \"./domain/generateSignedUrls/types.js\";\nexport type * from \"./domain/notifyTerminatedEphemeralEnvironment/types.js\";\nexport type * from \"./domain/pollCiGreenlight/types.js\";\n"]}
1
+ {"version":3,"sources":["../src/lib/other.ts","../src/lib/sdk/defaults/fetch.ts","../src/lib/sdk/defaults/log.ts","../src/lib/sdk/defaults/serviceBase.ts","../package.json","../src/lib/sdk/defaults/userAgent.ts","../src/lib/api/log.ts","../src/lib/sdk/domain/attemptDeploy/handleSuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/mapDeploySuccessResponse.ts","../src/lib/sdk/domain/attemptDeploy/index.ts","../src/lib/api/generate-signed-url-for-run-inputs-executables.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.ts","../src/lib/api/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/generateSignedUrls/generate-signed-url-for-team-storage.ts","../src/lib/sdk/domain/notifyTerminatedEphemeralEnvironment/index.ts","../src/lib/sdk/domain/pollCiGreenlight/buildCompletedRunResult.ts","../src/lib/sdk/domain/pollCiGreenlight/consts.ts","../src/lib/api/ci-greenlight.ts","../src/lib/sdk/domain/pollCiGreenlight/iterator.ts","../src/lib/sdk/domain/pollCiGreenlight/logging.ts","../src/lib/sdk/domain/pollCiGreenlight/mapIteratorAbortToGreenlightStatus.ts","../src/lib/sdk/domain/pollCiGreenlight/index.ts","../src/lib/sdk/index.ts"],"names":["sleep","ms","Promise","resolve","setTimeout","pluralize","count","buildFetchWithTimeout","fetch","defaultTimeoutMs","args","signal","AbortSignal","timeout","defaultFetch","globalThis","defaultLogDriver","error","message","console","info","log","warn","defaultServiceBase","defaultUserAgent","packageJson","version","logFetchError","methodName","response","ok","eventId","failureMessage","body","json","catch","text","undefined","eventIdSuffix","messageSuffix","statusText","status","handleSuccessResponse","data","environment","results","skippedTriggers","skippedDeployment","isPreviewDeployment","isStatic","logPrefix","alias","id","length","skipMessages","map","trigger","skipDetail","join","environmentId","outcome","runId","failReason","failedTrigger","find","result","failureReason","duplicateSuite","duplicateSuiteId","successfulTrigger","createdSuiteId","mapSuiteResult","created_suite_id","triggerId","trigger_id","failure_reason","duplicate_suite_id","skipReason","skip_reason","mapDeploySuccessResponse","wire","skipped_deployment","reason","skipped_triggers","environment_id","attemptNotifyDeploy","deps","apiConfig","config","localFetch","URL","serviceBase","JSON","stringify","branch","commit_url","commitUrl","deduplication_key","deduplicationKey","deployment_type","deploymentType","deployment_url","deploymentUrl","ephemeral_environment","ephemeralEnvironment","hosting_service","hostingService","merge_request_number","mergeRequestNumber","pull_request_number","pullRequestNumber","repository","sha","variables","headers","Authorization","apiKey","userAgent","method","handleErrorResponse","abortReason","httpStatus","callGenerateSignedUrlForRunInputsExecutablesStorage","destinationFilePath","encodeURIComponent","fileLocation","playgroundFileLocation","signedUrl","success","errorMessage","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","notifyTerminatedEphemeralEnvironment","buildCompletedRunResult","greenlight","greenlightStatus","pollCiGreenlightDefaults","abortOnSuperseded","maxRetries","pollTimeout","retryInterval","runInProgressInterval","runUnderReviewInterval","fetchCiGreenlightStatus","resp","canRetry","errorType","makePollCiGreenlightStatusIterator","pollConfig","retries","previousStatus","startedAt","Date","now","elapsedMs","isAborted","Error","retryLabel","stageChanged","runStage","isFailedTerminalStage","buildSuccessLogMessage","nonBlockingBugsCount","relevantRunUrl","urlInfo","buildFailedLogMessage","blockingBugsCount","relevantRunWithBugsUrl","reproducedBugs","blockingBugUrls","filter","bug","isBlocking","applicationUrl","nonBlockingBugUrls","blockingBugList","url","nonBlockingBugList","bugsListInText","buildSupersededAbortLogMessage","rootRunUrl","supersedingDetails","buildSupersededContinueLogMessage","buildRunStageLogMessage","mapIteratorAbortToGreenlightStatus","iteration","pollCiGreenlightStatus","onRunStageChanged","iterator","lastPoll","e","relevantRunId","rootRunId","isSuperseded","shouldAbortOnSuperseded","makeQaWolfSdk","bind"],"mappings":";;;;;;AAEO,SAASA,MAAMC,EAAAA,EAAU;AAC9B,EAAA,OAAO,IAAIC,OAAAA,CAAQ,CAACC,YAAYC,UAAAA,CAAWD,OAAAA,EAASF,EAAAA,CAAAA,CAAAA;AACtD;AAFgBD,MAAAA,CAAAA,KAAAA,EAAAA,OAAAA,CAAAA;AAIT,SAASK,UAAUC,KAAAA,EAAa;AACrC,EAAA,OAAOA,KAAAA,KAAU,IAAI,EAAA,GAAK,GAAA;AAC5B;AAFgBD,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AAYT,IAAME,qBAAAA,mBACX,MAAA,CAAA,CAACC,KAAAA,EAAoBC,gBAAAA,KACrB,UAAUC,IAAAA,KAAAA;AAER,EAAA,MAAMC,SAASD,IAAAA,CAAK,CAAA,GAAIC,MAAAA,IAAUC,WAAAA,CAAYC,QAAQJ,gBAAAA,CAAAA;AAEtD,EAAA,OAAOD,KAAAA,CAAME,IAAAA,CAAK,CAAA,CAAA,EAAI;AAAE,IAAA,GAAGA,KAAK,CAAA,CAAA;AAAIC,IAAAA;GAAO,CAAA;AAC7C,CAAA,EANA,uBAAA,CAAA;;;ACnBK,IAAMG,eAAeC,UAAAA,CAAWP,KAAAA;;;ACEhC,IAAMQ,gBAAAA,GAA8B;AACzCC,EAAAA,KAAAA,CAAMC,SAASD,KAAAA,EAAK;AAClBE,IAAAA,OAAAA,CAAQF,KAAAA,CAAMC,SAASD,KAAAA,CAAAA;AACzB,EAAA,CAAA;AACAG,EAAAA,IAAAA,CAAKF,OAAAA,EAAO;AACVC,IAAAA,OAAAA,CAAQE,IAAIH,OAAAA,CAAAA;AACd,EAAA,CAAA;AACAI,EAAAA,IAAAA,CAAKJ,OAAAA,EAAO;AACVC,IAAAA,OAAAA,CAAQG,KAAKJ,OAAAA,CAAAA;AACf,EAAA;AACF,CAAA;;;ACZO,IAAMK,kBAAAA,GAAqB,yBAAA;;;ACAlC,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OA0Cb,CAAA;;;AC1CO,IAAMC,gBAAAA,GAAmB,CAAA,OAAA,EAAUC,eAAAA,CAAYC,OAAO,CAAA,CAAA;;;ACA7D,eAAsBC,aAAAA,CAAc,EAClCN,GAAAA,EACAO,UAAAA,EACAC,UAAQ,EAKT;AACC,EAAA,IAAIA,SAASC,EAAAA,EAAI;AAEjB,EAAA,MAAM,EAAEC,OAAAA,EAASC,cAAAA,EAAc,GAAK,OAAO,YAAA;AACzC,IAAA,IAAI;AACF,MAAA,MAAMC,IAAAA,GAAQ,MAAMJ,QAAAA,CAASK,IAAAA,GAAOC,KAAAA,CAAM,MAAMN,QAAAA,CAASO,IAAAA,EAAI,CAAA;AAG7D,MAAA,IAAI,OAAOH,IAAAA,KAAS,QAAA,IAAYA,IAAAA,KAAS,IAAA,EAAM;AAC7C,QAAA,OAAO;AACLF,UAAAA,OAAAA,EAASE,IAAAA,CAAKF,OAAAA;AACdC,UAAAA,cAAAA,EAAgBC,IAAAA,CAAKD;AACvB,SAAA;AACF,MAAA;AAEA,MAAA,OAAO;QACLD,OAAAA,EAASM,KAAAA,CAAAA;QACTL,cAAAA,EAAgBC;AAClB,OAAA;IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO;QACLF,OAAAA,EAASM,MAAAA;QACTL,cAAAA,EAAgBK;AAClB,OAAA;AACF,IAAA;EACF,CAAA,GAAA;AAEA,EAAA,MAAMC,aAAAA,GAAgBP,OAAAA,GAAU,CAAA,YAAA,EAAeA,OAAAA,CAAAA,CAAAA,CAAAA,GAAa,EAAA;AAC5D,EAAA,MAAMQ,aAAAA,GAAgBP,cAAAA,GAAiB,CAAA,EAAA,EAAKA,cAAAA,CAAAA,CAAAA,GAAmB,EAAA;AAE/D,EAAA,MAAMQ,aACJX,QAAAA,CAASY,MAAAA,IAAU,GAAA,GACf,cAAA,GACAZ,SAASW,UAAAA,IAAc,eAAA;AAE7BnB,EAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,QAAA,EAAMW,UAAAA,CAAAA,EAAAA,EAAeC,QAAAA,CAASY,MAAM,CAAA,CAAA,EAAID,UAAAA,CAAAA,EAAaF,aAAAA,CAAAA,EAAgBC,aAAAA,CAAAA,CAAe,CAAA;AAExF;AA/CsBZ,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;;;ACEtB,eAAsBe,qBAAAA,CACpBC,MACAtB,GAAAA,EAAc;AAEd,EAAA,MAAM,EAAEuB,WAAAA,EAAaC,OAAAA,EAAO,GAAKF,IAAAA;AACjC,EAAA,MAAMG,eAAAA,GAAkBH,IAAAA,CAAKG,eAAAA,IAAmB,EAAA;AAChD,EAAA,MAAMC,oBAAoBJ,IAAAA,CAAKI,iBAAAA;AAC/B,EAAA,MAAMC,mBAAAA,GAAsBJ,WAAAA,IAAe,CAACA,WAAAA,CAAYK,QAAAA;AAExD,EAAA,IAAIL,WAAAA,EAAa;AACf,IAAA,MAAMM,SAAAA,GAAYN,WAAAA,CAAYK,QAAAA,GAC1B,oBAAA,GACA,qBAAA;AACJ5B,IAAAA,GAAAA,CAAID,IAAAA,CAAK,GAAG8B,SAAAA,CAAAA,EAAAA,EAAcN,YAAYO,KAAK,CAAA,MAAA,EAASP,WAAAA,CAAYQ,EAAE,CAAA,CAAA,CAAG,CAAA;AACvE,EAAA;AAGA,EAAA,IAAIP,OAAAA,CAAQQ,WAAW,CAAA,EAAG;AACxB,IAAA,MAAMC,YAAAA,GAAe;AAChBR,MAAAA,GAAAA,eAAAA,CAAgBS,GAAAA,CAAI,CAACC,OAAAA,KAAYA,OAAAA,CAAQtC,OAAO,CAAA;SAC/C6B,iBAAAA,GAAoB;QAACA,iBAAAA,CAAkB7B;UAAW;;AAExD,IAAA,MAAMuC,UAAAA,GACJH,aAAaD,MAAAA,GAAS,CAAA,GAAI,IAAIC,YAAAA,CAAaI,IAAAA,CAAK,GAAA,CAAA,CAAA,CAAA,GAAS,EAAA;AAI3D,IAAA,IAAIV,mBAAAA,EAAqB;AACvB3B,MAAAA,GAAAA,CAAID,IAAAA,CACF,CAAA,sFAAA,EAAoFqC,UAAAA,CAAAA,CAAY,CAAA;AAElG,MAAA,OAAO;AACLE,QAAAA,aAAAA,EAAef,WAAAA,CAAYQ,EAAAA;QAC3BQ,OAAAA,EAAS,SAAA;QACTC,KAAAA,EAAOxB;AACT,OAAA;AACF,IAAA;AAKA,IAAA,IAAIS,eAAAA,CAAgBO,SAAS,CAAA,EAAG;AAC9BhC,MAAAA,GAAAA,CAAIJ,KAAAA,CAAM,CAAA,iDAAA,EAA6CwC,UAAAA,CAAAA,CAAY,CAAA;AACnE,MAAA,OAAO;QACLK,UAAAA,EAAY,iBAAA;QACZF,OAAAA,EAAS,QAAA;AACTd,QAAAA;AACF,OAAA;AACF,IAAA;AAEAzB,IAAAA,GAAAA,CAAIC,IAAAA,CACFyB,iBAAAA,GACI,CAAA,oDAAA,EAA6CU,UAAAA,KAC7C,CAAA,+IAAA,CAAuI,CAAA;AAE7I,IAAA,OAAO;MACLG,OAAAA,EAAS,SAAA;AACTb,MAAAA;AACF,KAAA;AACF,EAAA;AAGA,EAAA,IAAI,CAACH,WAAAA,EAAa;AAChBvB,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,qEAAA,CAAgE,CAAA;AAC1E,IAAA,OAAO;MAAE6C,UAAAA,EAAY,gBAAA;MAAkBF,OAAAA,EAAS;AAAS,KAAA;AAC3D,EAAA;AAEA,EAAA,MAAMG,gBAAgBlB,OAAAA,CAAQmB,IAAAA,CAAK,CAACC,MAAAA,KAAW,mBAAmBA,MAAAA,CAAAA;AAClE,EAAA,IAAIF,aAAAA,EAAe;AACjB1C,IAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,6CAAA,EAAyC8C,aAAAA,CAAcG,aAAa,CAAA,0BAAA,CAA4B,CAAA;AAElG,IAAA,OAAO;MAAEJ,UAAAA,EAAY,0BAAA;MAA4BF,OAAAA,EAAS;AAAS,KAAA;AACrE,EAAA;AAEA,EAAA,MAAMO,iBAAiBtB,OAAAA,CAAQmB,IAAAA,CAAK,CAACC,MAAAA,KAAW,sBAAsBA,MAAAA,CAAAA;AACtE,EAAA,IAAIE,cAAAA,EAAgB;AAClB9C,IAAAA,GAAAA,CAAID,IAAAA,CACF,CAAA,gEAAA,EAA8D+C,cAAAA,CAAeC,gBAAgB,CAAA,oCAAA,CAAsC,CAAA;AAErI,IAAA,OAAO;AACLT,MAAAA,aAAAA,EAAef,WAAAA,CAAYQ,EAAAA;MAC3BQ,OAAAA,EAAS,SAAA;AACTC,MAAAA,KAAAA,EAAOM,cAAAA,CAAeC;AACxB,KAAA;AACF,EAAA;AAEA,EAAA,MAAMC,oBAAoBxB,OAAAA,CAAQmB,IAAAA,CAChC,CAACC,MAAAA,KAAW,oBAAoBA,MAAAA,CAAAA;AAElC,EAAA,IAAI,CAACI,iBAAAA,EAAmB;AAKtBhD,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,2DAAA,CAAsD,CAAA;AAChE,IAAA,OAAO;MAAE6C,UAAAA,EAAY,0BAAA;MAA4BF,OAAAA,EAAS;AAAS,KAAA;AACrE,EAAA;AACAvC,EAAAA,GAAAA,CAAID,IAAAA,CACF,CAAA,oEAAA,EAAkEiD,iBAAAA,CAAkBC,cAAc,CAAA,CAAE,CAAA;AAEtG,EAAA,OAAO;AACLX,IAAAA,aAAAA,EAAef,WAAAA,CAAYQ,EAAAA;IAC3BQ,OAAAA,EAAS,SAAA;AACTC,IAAAA,KAAAA,EAAOQ,iBAAAA,CAAkBC;AAC3B,GAAA;AACF;AA1GsB5B,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;;;ACDtB,SAAS6B,eACPN,MAAAA,EAAoD;AAEpD,EAAA,IAAI,sBAAsBA,MAAAA,EAAQ;AAChC,IAAA,OAAO;AACLK,MAAAA,cAAAA,EAAgBL,MAAAA,CAAOO,gBAAAA;AACvBC,MAAAA,SAAAA,EAAWR,MAAAA,CAAOS;AACpB,KAAA;AACF,EAAA;AACA,EAAA,IAAI,oBAAoBT,MAAAA,EAAQ;AAC9B,IAAA,OAAO;AACLC,MAAAA,aAAAA,EAAeD,MAAAA,CAAOU,cAAAA;AACtBF,MAAAA,SAAAA,EAAWR,MAAAA,CAAOS;AACpB,KAAA;AACF,EAAA;AACA,EAAA,OAAO;AACLN,IAAAA,gBAAAA,EAAkBH,MAAAA,CAAOW,kBAAAA;AACzBC,IAAAA,UAAAA,EAAYZ,MAAAA,CAAOa,WAAAA;AACnBL,IAAAA,SAAAA,EAAWR,MAAAA,CAAOS;AACpB,GAAA;AACF;AApBSH,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAyBF,SAASQ,yBACdC,IAAAA,EAA+B;AAE/B,EAAA,OAAO;AACLpC,IAAAA,WAAAA,EAAaoC,IAAAA,CAAKpC,WAAAA;IAClBC,OAAAA,EAASmC,IAAAA,CAAKnC,OAAAA,CAAQU,GAAAA,CAAIgB,cAAAA,CAAAA;AAC1BxB,IAAAA,iBAAAA,EAAmBiC,KAAKC,kBAAAA,IAAsB;AAC5C/D,MAAAA,OAAAA,EAAS8D,KAAKC,kBAAAA,CAAmB/D,OAAAA;AACjCgE,MAAAA,MAAAA,EAAQF,KAAKC,kBAAAA,CAAmBC;AAClC,KAAA;AACApC,IAAAA,eAAAA,EAAiBkC,IAAAA,CAAKG,gBAAAA,EAAkB5B,GAAAA,CAAI,CAACC,OAAAA,MAAa;AACxDG,MAAAA,aAAAA,EAAeH,OAAAA,CAAQ4B,cAAAA;AACvBlE,MAAAA,OAAAA,EAASsC,OAAAA,CAAQtC,OAAAA;AACjBgE,MAAAA,MAAAA,EAAQ1B,OAAAA,CAAQ0B,MAAAA;AAChBT,MAAAA,SAAAA,EAAWjB,OAAAA,CAAQkB;KACrB,CAAA;AACF,GAAA;AACF;AAjBgBK,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;;;ACfhB,eAAsBM,mBAAAA,CACpBC,IAAAA,EACAC,SAAAA,EACAC,MAAAA,EAA6B;AAE7B,EAAA,MAAM,EAAEhF,KAAAA,EAAOiF,UAAAA,EAAYpE,GAAAA,EAAG,GAAKiE,IAAAA;AACnC,EAAA,IAAI;AACF,IAAA,MAAMzD,QAAAA,GAAW,MAAM4D,UAAAA,CACrB,IAAIC,IAAI,8BAAA,EAAgCH,SAAAA,CAAUI,WAAW,CAAA,EAC7D;AACE1D,MAAAA,IAAAA,EAAM2D,KAAKC,SAAAA,CAAU;AACnBC,QAAAA,MAAAA,EAAQN,MAAAA,CAAOM,MAAAA;AACfC,QAAAA,UAAAA,EAAYP,MAAAA,CAAOQ,SAAAA;AACnBC,QAAAA,iBAAAA,EAAmBT,MAAAA,CAAOU,gBAAAA;AAC1BC,QAAAA,eAAAA,EAAiBX,MAAAA,CAAOY,cAAAA;AACxBC,QAAAA,cAAAA,EAAgBb,MAAAA,CAAOc,aAAAA;AACvB,QAAA,GAAI,0BAA0Bd,MAAAA,GAC1B;AACEe,UAAAA,qBAAAA,EAAuBf,MAAAA,CAAOgB;AAChC,SAAA,GACA,oBAAoBhB,MAAAA,IAAU;AAC5BiB,UAAAA,eAAAA,EAAiBjB,MAAAA,CAAOkB,cAAAA;AACxBC,UAAAA,oBAAAA,EACEnB,MAAAA,CAAOkB,cAAAA,KAAmB,QAAA,GACtBlB,MAAAA,CAAOoB,kBAAAA,GACPvE,KAAAA,CAAAA;AACNwE,UAAAA,mBAAAA,EACErB,MAAAA,CAAOkB,cAAAA,KAAmB,QAAA,GACtBlB,MAAAA,CAAOsB,iBAAAA,GACPzE,KAAAA,CAAAA;AACN0E,UAAAA,UAAAA,EAAYvB,MAAAA,CAAOuB;AACrB,SAAA;AACJC,QAAAA,GAAAA,EAAKxB,MAAAA,CAAOwB,GAAAA;AACZC,QAAAA,SAAAA,EAAWzB,MAAAA,CAAOyB;OACpB,CAAA;MACAC,OAAAA,EAAS;QACPC,aAAAA,EAAe,CAAA,OAAA,EAAU5B,UAAU6B,MAAM,CAAA,CAAA;QACzC,cAAA,EAAgB,kBAAA;AAChB,QAAA,YAAA,EAAc7B,SAAAA,CAAU8B;AAC1B,OAAA;MACAC,MAAAA,EAAQ,MAAA;;;AAGR3G,MAAAA,MAAAA,EAAQC,WAAAA,CAAYC,OAAAA,CAAQ,CAAA,GAAI,EAAA,GAAK,GAAA;KACvC,CAAA;AAGF,IAAA,IAAI,CAACgB,QAAAA,CAASC,EAAAA,EAAI,OAAOyF,mBAAAA,CAAoB1F,UAAUR,GAAAA,CAAAA;AACvD,IAAA,MAAM2D,IAAAA,GAAQ,MAAMnD,QAAAA,CAASK,IAAAA,EAAI;AACjC,IAAA,MAAMS,IAAAA,GAAOoC,yBAAyBC,IAAAA,CAAAA;AACtC,IAAA,OAAOtC,qBAAAA,CAAsBC,MAAMtB,GAAAA,CAAAA;EACrC,CAAA,CAAA,MAAQ;AACNA,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,sDAAA,CAAiD,CAAA;AAC3D,IAAA,OAAO;MACLuG,WAAAA,EAAa,eAAA;MACbC,UAAAA,EAAYpF,MAAAA;MACZuB,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AACF;AA3DsByB,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AA6DtB,eAAekC,mBAAAA,CACb1F,UACAR,GAAAA,EAAc;AAEd,EAAA,MAAMoB,SAASZ,QAAAA,CAASY,MAAAA;AACxB,EAAA,IAAI+E,WAAAA;AACJ,EAAA,IAAI/E,MAAAA,KAAWJ,QAAWmF,WAAAA,GAAc,eAAA;AAC/B/E,OAAAA,IAAAA,MAAAA,KAAW,KAAK+E,WAAAA,GAAc,kBAAA;AAC9B/E,OAAAA,IAAAA,MAAAA,KAAW,KAAK+E,WAAAA,GAAc,eAAA;AAC9B/E,OAAAA,IAAAA,MAAAA,IAAU,KAAK+E,WAAAA,GAAc,kBAAA;OACjCA,WAAAA,GAAc,kBAAA;AACnB,EAAA,MAAM7F,aAAAA,CAAc;AAClBN,IAAAA,GAAAA;IACAO,UAAAA,EAAY,qBAAA;AACZC,IAAAA;GACF,CAAA;AACA,EAAA,OAAO;AACL2F,IAAAA,WAAAA;IACAC,UAAAA,EAAYhF,MAAAA;IACZmB,OAAAA,EAAS;AACX,GAAA;AACF;AArBe2D,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;;;ACjEf,eAAsBG,mDAAAA,CACpB,EAAEN,MAAAA,EAAQzB,WAAAA,EAAa0B,SAAAA,EAAS,EAChC,EAAEM,mBAAAA,EAAmB,EACrB,EAAEnH,KAAAA,EAAOiF,UAAAA,EAAYpE,KAAG,EAAmB;AAE3C,EAAA,IAAI;AACF,IAAA,MAAMQ,QAAAA,GAAW,MAAM4D,UAAAA,CACrB,IAAIC,GAAAA,CACF,CAAA,EAAGC,WAAAA,CAAAA,gDAAAA,EAA8DiC,kBAAAA,CAAmBD,mBAAAA,CAAAA,CAAAA,CAAsB,CAAA,EAE5G;MACET,OAAAA,EAAS;AACPC,QAAAA,aAAAA,EAAe,UAAUC,MAAAA,CAAAA,CAAAA;QACzB,cAAA,EAAgB,kBAAA;QAChB,YAAA,EAAcC;AAChB,OAAA;MACAC,MAAAA,EAAQ;KACV,CAAA;AAGF,IAAA,IAAIzF,QAAAA,CAASY,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAMP,IAAAA,GACH,MAAML,QAAAA,CAASK,IAAAA,EAAI;AACtB,MAAA,OAAO;AACL2F,QAAAA,YAAAA,EAAc3F,IAAAA,CAAK2F,YAAAA;AACnBJ,QAAAA,UAAAA,EAAY5F,QAAAA,CAASY,MAAAA;AACrBqF,QAAAA,sBAAAA,EAAwB5F,IAAAA,CAAK4F,sBAAAA;AAC7BC,QAAAA,SAAAA,EAAW7F,IAAAA,CAAK6F,SAAAA;QAChBC,OAAAA,EAAS;AACX,OAAA;AACF,IAAA;AACA,IAAA,MAAMrG,aAAAA,CAAc;AAClBN,MAAAA,GAAAA;MACAO,UAAAA,EAAY,qDAAA;AACZC,MAAAA;KACF,CAAA;AACA,IAAA,OAAO;MACLoG,YAAAA,EAAc,MAAMpG,SAASO,IAAAA,EAAI;AACjCqF,MAAAA,UAAAA,EAAY5F,QAAAA,CAASY,MAAAA;MACrBuF,OAAAA,EAAS;AACX,KAAA;EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;MACLC,YAAAA,EAAc,wDAAA;MACdR,UAAAA,EAAY,CAAA;MACZO,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AACF;AAhDsBN,MAAAA,CAAAA,mDAAAA,EAAAA,qDAAAA,CAAAA;;;ACCtB,eAAsBQ,+CAAAA,CACpB5C,IAAAA,EACAC,SAAAA,EACAC,MAAAA,EAA+B;AAE/B,EAAA,MAAM,EAAEnE,KAAG,GAAKiE,IAAAA;AAEhB,EAAA,IAAI,CAACE,OAAOmC,mBAAAA,EAAqB;AAC/BtG,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,4DAAA,CAAuD,CAAA;AACjE,IAAA,OAAO;MACLuG,WAAAA,EAAa,gCAAA;MACbQ,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AAEA,EAAA,MAAMG,aAAAA,GACJ,MAAMT,mDAAAA,CACJnC,SAAAA,EACAC,QACAF,IAAAA,CAAAA;AAEJ,EAAA,IAAI,CAAC6C,cAAcH,OAAAA,EAAS;AAC1B,IAAA,IAAIR,WAAAA,GAA4C,qBAAA;AAEhD,IAAA,IAAIW,aAAAA,CAAcV,cAAc,GAAA,EAAK;AACnCD,MAAAA,WAAAA,GAAc,kBAAA;AACdnG,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkCkH,aAAAA,CAAcV,UAAU,CAAA,8CAAA,CAAgD,CAAA;IAE9G,CAAA,MAAO;AACL,MAAA,IAAIU,aAAAA,CAAcV,UAAAA,KAAe,GAAA,EAAKD,WAAAA,GAAc,qBAAA;eAC3CW,aAAAA,CAAcV,UAAAA,KAAe,KACpCD,WAAAA,GAAc,yBAAA;eACPW,aAAAA,CAAcV,UAAAA,KAAe,KAAKD,WAAAA,GAAc,eAAA;eAChDW,aAAAA,CAAcV,UAAAA,KAAe,GACpCD,WAAAA,GAAc,sBAAA;AAEhBnG,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkCkH,aAAAA,CAAcV,UAAU,CAAA,qCAAA,EAAwCU,aAAAA,CAAcF,YAAAA,GAAe,CAAA,EAAGE,aAAAA,CAAcF,YAAY,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA,UAAA,CAAc,CAAA;AAEpL,IAAA;AAEA,IAAA,OAAO;AACLT,MAAAA,WAAAA;AACAC,MAAAA,UAAAA,EAAYU,aAAAA,CAAcV,UAAAA;MAC1BO,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AAEA3G,EAAAA,GAAAA,CAAID,IAAAA,CAAK,CAAA,oCAAA,EAAkC+G,aAAAA,CAAcJ,SAAS,CAAA,CAAA,CAAG,CAAA;AACrE,EAAA,OAAO;AACLF,IAAAA,YAAAA,EAAcM,aAAAA,CAAcN,YAAAA;AAC5BC,IAAAA,sBAAAA,EAAwBK,aAAAA,CAAcL,sBAAAA;IACtCE,OAAAA,EAAS,IAAA;AACTI,IAAAA,SAAAA,EAAWD,aAAAA,CAAcJ;AAC3B,GAAA;AACF;AAxDsBG,MAAAA,CAAAA,+CAAAA,EAAAA,iDAAAA,CAAAA;;;ACDtB,eAAsBG,uCAAAA,CACpB,EAAEjB,MAAAA,EAAQzB,WAAAA,EAAa0B,SAAAA,EAAS,EAChC,EAAEM,mBAAAA,EAAmB,EACrB,EAAEnH,KAAAA,EAAOiF,UAAAA,EAAYpE,KAAG,EAAmB;AAE3C,EAAA,IAAI;AACF,IAAA,MAAMQ,QAAAA,GAAW,MAAM4D,UAAAA,CACrB,IAAIC,GAAAA,CACF,GAAGC,WAAAA,CAAAA,qCAAAA,EAAmDgC,mBAAAA,CAAAA,CAAqB,CAAA,EAE7E;MACET,OAAAA,EAAS;AACPC,QAAAA,aAAAA,EAAe,UAAUC,MAAAA,CAAAA,CAAAA;QACzB,cAAA,EAAgB,kBAAA;QAChB,YAAA,EAAcC;AAChB,OAAA;MACAC,MAAAA,EAAQ;KACV,CAAA;AAGF,IAAA,IAAIzF,QAAAA,CAASY,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAMP,IAAAA,GACH,MAAML,QAAAA,CAASK,IAAAA,EAAI;AACtB,MAAA,OAAO;AACL2F,QAAAA,YAAAA,EAAc3F,IAAAA,CAAK2F,YAAAA;AACnBJ,QAAAA,UAAAA,EAAY5F,QAAAA,CAASY,MAAAA;AACrBqF,QAAAA,sBAAAA,EAAwB5F,IAAAA,CAAK4F,sBAAAA;AAC7BC,QAAAA,SAAAA,EAAW7F,IAAAA,CAAK6F,SAAAA;QAChBC,OAAAA,EAAS;AACX,OAAA;AACF,IAAA;AACA,IAAA,MAAMrG,aAAAA,CAAc;AAClBN,MAAAA,GAAAA;MACAO,UAAAA,EAAY,yCAAA;AACZC,MAAAA;KACF,CAAA;AACA,IAAA,OAAO;MACLoG,YAAAA,EAAc,MAAMpG,SAASO,IAAAA,EAAI;AACjCqF,MAAAA,UAAAA,EAAY5F,QAAAA,CAASY,MAAAA;MACrBuF,OAAAA,EAAS;AACX,KAAA;EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;MACLC,YAAAA,EAAc,wDAAA;MACdR,UAAAA,EAAY,CAAA;MACZO,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AACF;AAhDsBK,MAAAA,CAAAA,uCAAAA,EAAAA,yCAAAA,CAAAA;;;ACmBtB,eAAsBC,mCAAAA,CACpBhD,IAAAA,EACAC,SAAAA,EACAC,MAAAA,EAA+B;AAE/B,EAAA,MAAM,EAAEnE,KAAG,GAAKiE,IAAAA;AAEhB,EAAA,IAAI,CAACE,OAAOmC,mBAAAA,EAAqB;AAC/BtG,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,4DAAA,CAAuD,CAAA;AACjE,IAAA,OAAO;MACLuG,WAAAA,EAAa,gCAAA;MACbQ,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AAEA,EAAA,MAAMG,aAAAA,GAAgB,MAAME,uCAAAA,CAC1B9C,SAAAA,EACAC,QACAF,IAAAA,CAAAA;AAEF,EAAA,IAAI,CAAC6C,cAAcH,OAAAA,EAAS;AAC1B,IAAA,IAAIR,WAAAA,GAA4C,qBAAA;AAEhD,IAAA,IAAIW,aAAAA,CAAcV,cAAc,GAAA,EAAK;AACnCD,MAAAA,WAAAA,GAAc,kBAAA;AACdnG,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkCkH,aAAAA,CAAcV,UAAU,CAAA,8CAAA,CAAgD,CAAA;IAE9G,CAAA,MAAO;AACL,MAAA,IAAIU,aAAAA,CAAcV,UAAAA,KAAe,GAAA,EAAKD,WAAAA,GAAc,qBAAA;eAC3CW,aAAAA,CAAcV,UAAAA,KAAe,KACpCD,WAAAA,GAAc,yBAAA;eACPW,aAAAA,CAAcV,UAAAA,KAAe,KAAKD,WAAAA,GAAc,eAAA;eAChDW,aAAAA,CAAcV,UAAAA,KAAe,GACpCD,WAAAA,GAAc,sBAAA;AAEhBnG,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkCkH,aAAAA,CAAcV,UAAU,CAAA,qCAAA,EAAwCU,aAAAA,CAAcF,YAAAA,GAAe,CAAA,EAAGE,aAAAA,CAAcF,YAAY,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA,UAAA,CAAc,CAAA;AAEpL,IAAA;AAEA,IAAA,OAAO;AACLT,MAAAA,WAAAA;AACAC,MAAAA,UAAAA,EAAYU,aAAAA,CAAcV,UAAAA;MAC1BO,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AAEA3G,EAAAA,GAAAA,CAAID,IAAAA,CAAK,CAAA,oCAAA,EAAkC+G,aAAAA,CAAcJ,SAAS,CAAA,CAAA,CAAG,CAAA;AACrE,EAAA,OAAO;AACLF,IAAAA,YAAAA,EAAcM,aAAAA,CAAcN,YAAAA;AAC5BC,IAAAA,sBAAAA,EAAwBK,aAAAA,CAAcL,sBAAAA;IACtCE,OAAAA,EAAS,IAAA;AACTI,IAAAA,SAAAA,EAAWD,aAAAA,CAAcJ;AAC3B,GAAA;AACF;AAvDsBO,MAAAA,CAAAA,mCAAAA,EAAAA,qCAAAA,CAAAA;;;ACjBf,IAAMC,oCAAAA,mBAAuC,MAAA,CAAA,OAClDjD,IAAAA,EACAC,SAAAA,EACAC,MAAAA,KAAAA;AAEA,EAAA,MAAM,EAAEhF,KAAAA,EAAOiF,UAAAA,EAAYpE,GAAAA,EAAG,GAAKiE,IAAAA;AACnC,EAAA,IAAI;AACF,IAAA,MAAMzD,QAAAA,GAAW,MAAM4D,UAAAA,CACrB,IAAIC,IAAI,sCAAA,EAAwCH,SAAAA,CAAUI,WAAW,CAAA,EACrE;MACE1D,IAAAA,EAAM2D,IAAAA,CAAKC,UAAUL,MAAAA,CAAAA;MACrB0B,OAAAA,EAAS;QACPC,aAAAA,EAAe,CAAA,OAAA,EAAU5B,UAAU6B,MAAM,CAAA,CAAA;QACzC,cAAA,EAAgB,kBAAA;AAChB,QAAA,YAAA,EAAc7B,SAAAA,CAAU8B;AAC1B,OAAA;MACAC,MAAAA,EAAQ;KACV,CAAA;AAEF,IAAA,IAAI,CAACzF,QAAAA,CAASC,EAAAA,EAAI,OAAOyF,oBAAAA,CAAoB1F,UAAUR,GAAAA,CAAAA;AACvD,IAAA,MAAM,EAAEsC,aAAAA,EAAa,GAClB,MAAM9B,SAASK,IAAAA,EAAI;AACtB,IAAA,OAAO;AAAEyB,MAAAA,aAAAA;MAAeC,OAAAA,EAAS;AAAU,KAAA;EAC7C,CAAA,CAAA,MAAQ;AACNvC,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,qEAAA,CAAgE,CAAA;AAC1E,IAAA,OAAO;MACLuG,WAAAA,EAAa,eAAA;MACb5D,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AACF,CAAA,EA9BoD,sCAAA,CAAA;AAgCpD,eAAe2D,oBAAAA,CACb1F,UACAR,GAAAA,EAAc;AAEd,EAAA,MAAMoB,SAASZ,QAAAA,CAASY,MAAAA;AACxB,EAAA,IAAI+E,WAAAA;AACJ,EAAA,IAAI/E,MAAAA,KAAWJ,QAAWmF,WAAAA,GAAc,eAAA;AAC/B/E,OAAAA,IAAAA,MAAAA,KAAW,KAAK+E,WAAAA,GAAc,kBAAA;AAC9B/E,OAAAA,IAAAA,MAAAA,KAAW,KAAK+E,WAAAA,GAAc,eAAA;AAC9B/E,OAAAA,IAAAA,MAAAA,KAAW,KAAK+E,WAAAA,GAAc,cAAA;AAC9B/E,OAAAA,IAAAA,MAAAA,IAAU,KAAK+E,WAAAA,GAAc,kBAAA;OACjCA,WAAAA,GAAc,kBAAA;AACnB,EAAA,MAAM7F,aAAAA,CAAc;AAClBN,IAAAA,GAAAA;IACAO,UAAAA,EAAY,sCAAA;AACZC,IAAAA;GACF,CAAA;AACA,EAAA,OAAO;AACL2F,IAAAA,WAAAA;IACAC,UAAAA,EAAYhF,MAAAA;IACZmB,OAAAA,EAAS;AACX,GAAA;AACF;AAtBe2D,MAAAA,CAAAA,oBAAAA,EAAAA,qBAAAA,CAAAA;;;ACpCR,SAASiB,wBACd/F,MAAAA,EAA8D;AAE9D,EAAA,IAAIA,MAAAA,CAAOgG,YACT,OAAO;IAAEC,gBAAAA,EAAkBjG,MAAAA;IAAQmB,OAAAA,EAAS;AAAU,GAAA;OACnD,OAAO;IAAE8E,gBAAAA,EAAkBjG,MAAAA;IAAQmB,OAAAA,EAAS;AAAS,GAAA;AAC5D;AANgB4E,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;;;ACAT,IAAMG,wBAAAA,GAAuD;EAClEC,iBAAAA,EAAmB,KAAA;EACnBC,UAAAA,EAAY,EAAA;AACZC,EAAAA,WAAAA,EAAa,MAAM,EAAA,GAAK,GAAA;AACxBC,EAAAA,aAAAA,EAAe,EAAA,GAAK,GAAA;AACpBC,EAAAA,qBAAAA,EAAuB,EAAA,GAAK,GAAA;AAC5BC,EAAAA,sBAAAA,EAAwB,EAAA,GAAK;AAC/B,CAAA;;;AC+CA,eAAsBC,uBAAAA,CACpB,EAAE9B,MAAAA,EAAQzB,WAAAA,EAAa0B,SAAAA,EAAS,EAChC,EACExD,KAAAA,EAAK,EAIP,EAAErD,KAAAA,EAAOiF,UAAAA,EAAYpE,KAAG,EAAmB;AAE3C,EAAA,IAAI;AACF,IAAA,MAAM8H,IAAAA,GAAO,MAAM1D,UAAAA,CACjB,IAAIC,GAAAA,CACF,CAAA,sBAAA,EAAyBkC,kBAAAA,CAAmB/D,KAAAA,CAAAA,CAAAA,CAAAA,EAC5C8B,WAAAA,CAAAA,EAEF;MACEuB,OAAAA,EAAS;AACPC,QAAAA,aAAAA,EAAe,UAAUC,MAAAA,CAAAA,CAAAA;QACzB,YAAA,EAAcC;AAChB;KACF,CAAA;AAGF,IAAA,IAAI8B,KAAKrH,EAAAA,EAAI;AACX,MAAA,MAAM4G,gBAAAA,GAAoB,MAAMS,IAAAA,CAAKjH,IAAAA,EAAI;AACzC,MAAA,OAAO;AACLwG,QAAAA,gBAAAA;AACAjB,QAAAA,UAAAA,EAAY0B,IAAAA,CAAK1G,MAAAA;QACjBX,EAAAA,EAAI;AACN,OAAA;AACF,IAAA;AACA,IAAA,MAAMH,aAAAA,CAAc;AAClBN,MAAAA,GAAAA;MACAO,UAAAA,EAAY,yBAAA;MACZC,QAAAA,EAAUsH;KACZ,CAAA;AACA,IAAA,IAAIA,IAAAA,CAAK1G,WAAW,GAAA,EAAK;AACvB,MAAA,OAAO;QACL2G,QAAAA,EAAU,IAAA;QACVC,SAAAA,EAAW,WAAA;AACX5B,QAAAA,UAAAA,EAAY0B,IAAAA,CAAK1G,MAAAA;QACjBX,EAAAA,EAAI;AACN,OAAA;AACF,IAAA;AACA,IAAA,IAAIqH,IAAAA,CAAK1G,UAAU,GAAA,EAAK;AACtB,MAAA,OAAO;QACL2G,QAAAA,EAAU,IAAA;QACVC,SAAAA,EAAW,QAAA;AACX5B,QAAAA,UAAAA,EAAY0B,IAAAA,CAAK1G,MAAAA;QACjBX,EAAAA,EAAI;AACN,OAAA;AACF,IAAA;AACA,IAAA,OAAO;MACLsH,QAAAA,EAAU,KAAA;MACVC,SAAAA,EAAW,QAAA;AACX5B,MAAAA,UAAAA,EAAY0B,IAAAA,CAAK1G,MAAAA;MACjBX,EAAAA,EAAI;AACN,KAAA;EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;MACLsH,QAAAA,EAAU,IAAA;MACVC,SAAAA,EAAW,SAAA;MACX5B,UAAAA,EAAY,CAAA;MACZ3F,EAAAA,EAAI;AACN,KAAA;AACF,EAAA;AACF;AAlEsBoH,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;;;ACVtB,gBAAuBI,mCACrBhE,IAAAA,EACAC,SAAAA,EACA,EAAE1B,KAAAA,EAAO,GAAG0F,YAAAA,EAAsD;AAElE,EAAA,MAAM,EAAElI,KAAG,GAAKiE,IAAAA;AAEhB,EAAA,MAAM,EACJuD,UAAAA,GAAaF,wBAAAA,CAAyBE,UAAAA,EACtCC,WAAAA,GAAcH,yBAAyBG,WAAAA,EACvCC,aAAAA,GAAgBJ,wBAAAA,CAAyBI,aAAAA,EACzCC,wBAAwBL,wBAAAA,CAAyBK,qBAAAA,EACjDC,sBAAAA,GAAyBN,wBAAAA,CAAyBM,wBAAsB,GACtEM,UAAAA;AAEJ,EAAA,IAAIC,OAAAA,GAAU,CAAA;AACd,EAAA,IAAIC,cAAAA,GAAiDpH,MAAAA;AACrD,EAAA,MAAMqH,SAAAA,GAAYC,KAAKC,GAAAA,EAAG;AAE1B,EAAA,OAAOD,IAAAA,CAAKC,GAAAA,EAAG,GAAKF,SAAAA,IAAaZ,WAAAA,EAAa;AAC5C,IAAA,MAAMX,aAAAA,GAAgB,MAAMe,uBAAAA,CAC1B3D,SAAAA,EACA;AAAE1B,MAAAA;AAAM,KAAA,EACRyB,IAAAA,CAAAA;AAGF,IAAA,MAAMuE,SAAAA,GAAYF,IAAAA,CAAKC,GAAAA,EAAG,GAAKF,SAAAA;AAE/B,IAAA,IAAI,CAACvB,aAAAA,CAAcrG,EAAAA,IAAM,CAACqG,cAAciB,QAAAA,EAAU;AAChD,MAAA,MAAM;QACJ5B,WAAAA,EAAa,kBAAA;AACbqC,QAAAA,SAAAA;AACApC,QAAAA,UAAAA,EAAYU,aAAAA,CAAcV,UAAAA;QAC1BqC,SAAAA,EAAW;AACb,OAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAAC3B,cAAcrG,EAAAA,EAAI;AACrB0H,MAAAA,OAAAA,IAAW,CAAA;AACX,MAAA,MAAM,EAAEH,SAAAA,EAAW5B,UAAAA,EAAU,GAAKU,aAAAA;AAClC,MAAA,IAAIqB,UAAUX,UAAAA,EAAY;AACxB,QAAA,QAAQQ,SAAAA;UACN,KAAK,SAAA;AACH,YAAA,MAAM;cACJ7B,WAAAA,EAAa,eAAA;AACbqC,cAAAA,SAAAA;cACApC,UAAAA,EAAYpF,MAAAA;cACZyH,SAAAA,EAAW;AACb,aAAA;AACA,YAAA;UACF,KAAK,WAAA;AACH,YAAA,MAAM;cACJtC,WAAAA,EAAa,mBAAA;AACbqC,cAAAA,SAAAA;AACApC,cAAAA,UAAAA,EAAYA,UAAAA,IAAc,GAAA;cAC1BqC,SAAAA,EAAW;AACb,aAAA;AACA,YAAA;UACF,KAAK,QAAA;AACH,YAAA,MAAM;cACJtC,WAAAA,EAAa,kBAAA;AACbqC,cAAAA,SAAAA;AACApC,cAAAA,UAAAA,EAAYA,UAAAA,IAAc,GAAA;cAC1BqC,SAAAA,EAAW;AACb,aAAA;AACA,YAAA;AACF,UAAA;AACE,YAAA,MAAMC,KAAAA,CAAM,CAAA,uBAAA,EAA0BV,SAAAA,CAAAA,CAA2B,CAAA;AACrE;AACA,QAAA;AACF,MAAA;AAEA,MAAA,MAAMW,UAAAA,GAAa,CAAA,EACjBvC,UAAAA,GAAa,CAAA,SAAA,EAAYA,UAAAA,MAAgB,EAAA,CAAA,qBAAA,EACnB+B,OAAAA,CAAAA,CAAAA,EAAWX,UAAAA,CAAAA,CAAAA,CAAAA;AAEnC,MAAA,IAAIQ,cAAc,SAAA,EAAWhI,GAAAA,CAAIC,IAAAA,CAAK,CAAA,oBAAA,EAAkB0I,UAAAA,CAAAA,CAAY,CAAA;AAC3DX,WAAAA,IAAAA,SAAAA,KAAc,WAAA,EACrBhI,GAAAA,CAAID,IAAAA,CAAK,CAAA,oBAAA,EAAkB4I,UAAAA,CAAAA,CAAY,CAAA;AAChCX,WAAAA,IAAAA,SAAAA,KAAc,QAAA,EAAUhI,GAAAA,CAAIC,IAAAA,CAAK,CAAA,mBAAA,EAAiB0I,UAAAA,CAAAA,CAAY,CAAA;AAEvE,MAAA,MAAMhK,MAAM+I,aAAAA,CAAAA;AACZ,MAAA;AACF,IAAA;AAGAS,IAAAA,OAAAA,GAAU,CAAA;AACV,IAAA,MAAM,EAAEd,kBAAgB,GAAKP,aAAAA;AAC7B,IAAA,MAAM8B,YAAAA,GACJ,CAACR,cAAAA,IAAkBA,cAAAA,CAAeS,aAAaxB,gBAAAA,CAAiBwB,QAAAA;AAGlE,IAAA,MAAMC,qBAAAA,GACJzB,iBAAiBwB,QAAAA,KAAa,UAAA,IAC7BxB,iBAAiBwB,QAAAA,KAAa,WAAA,IAC7BxB,iBAAiBD,UAAAA,KAAe,KAAA;AAEpC,IAAA,MAAM;AACJoB,MAAAA,SAAAA;MACAC,SAAAA,EAAW,KAAA;AACXK,MAAAA,qBAAAA;AACAV,MAAAA,cAAAA;AACAQ,MAAAA,YAAAA;MACAxH,MAAAA,EAAQiG;AACV,KAAA;AAGAe,IAAAA,cAAAA,GAAiBf,gBAAAA;AAEjB,IAAA,QAAQA,iBAAiBwB,QAAAA;AACvB,MAAA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM;UACJ1C,WAAAA,EAAa,cAAA;AACbqC,UAAAA,SAAAA;UACApC,UAAAA,EAAYpF,MAAAA;UACZyH,SAAAA,EAAW;AACb,SAAA;AACA,QAAA;AACF,MAAA;MACA,KAAK,WAAA;AACH,QAAA;MACF,KAAK,cAAA;AACH,QAAA,MAAM9J,MAAMgJ,qBAAAA,CAAAA;AACZ,QAAA;MACF,KAAK,aAAA;AACH,QAAA,MAAMhJ,MAAMiJ,sBAAAA,CAAAA;AACZ,QAAA;AACF,MAAA;AACE,QAAA,MAAMc,KAAAA,CACJ,CAAA,sBAAA,EAAyBrB,gBAAAA,CAAAA,CAAkC,CAAA;AAEjE;AACF,EAAA;AAGA,EAAA,MAAM;IACJlB,WAAAA,EAAa,gBAAA;IACbqC,SAAAA,EAAWF,IAAAA,CAAKC,KAAG,GAAKF,SAAAA;IACxBjC,UAAAA,EAAYpF,MAAAA;IACZyH,SAAAA,EAAW;AACb,GAAA;AACA,EAAA;AACF;AA/IuBR,MAAAA,CAAAA,kCAAAA,EAAAA,oCAAAA,CAAAA;;;AC7ChB,SAASc,uBACd3H,MAAAA,EAA8D;AAE9D,EAAA,MAAM,EAAE4H,oBAAAA,EAAsBC,cAAAA,EAAc,GAAK7H,MAAAA;AACjD,EAAA,MAAM8H,OAAAA,GAAU,OAAOD,cAAAA,CAAAA,CAAAA;AAEvB,EAAA,OAAO,CAAA,4CAAA,EACLD,oBAAAA,GAAuB,CAAA,GACnB,CAAA,KAAA,EAAQA,oBAAAA,oBAAwChK,SAAAA,CAC9CgK,oBAAAA,CAAAA,CAAAA,MAAAA,CAAAA,GAEF,EAAA,CAAA;EACAE,OAAAA,CAAAA,CAAAA;AACR;AAbgBH,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;AAkBT,SAASI,sBACd/H,MAAAA,EAA8D;AAE9D,EAAA,MAAM,EACJgI,iBAAAA,EACAJ,oBAAAA,EACAK,sBAAAA,EACAC,gBAAc,GACZlI,MAAAA;AAEJ,EAAA,MAAMmI,eAAAA,GAAkBD,cAAAA,CACrBE,MAAAA,CAAO,CAACC,GAAAA,KAAQA,GAAAA,CAAIC,UAAU,CAAA,CAC9BxH,GAAAA,CAAI,CAACuH,GAAAA,KAAQA,GAAAA,CAAIE,cAAc,CAAA;AAClC,EAAA,MAAMC,kBAAAA,GAAqBN,cAAAA,CACxBE,MAAAA,CAAO,CAACC,GAAAA,KAAQ,CAACA,GAAAA,CAAIC,UAAU,CAAA,CAC/BxH,GAAAA,CAAI,CAACuH,GAAAA,KAAQA,IAAIE,cAAc,CAAA;AAElC,EAAA,MAAME,eAAAA,GAAkBN,eAAAA,CAAgBrH,GAAAA,CAAI,CAAC4H,GAAAA,KAAQ;SAAOA,GAAAA,CAAAA,CAAK,CAAA,CAAEzH,IAAAA,CAAK,EAAA,CAAA;AACxE,EAAA,MAAM0H,kBAAAA,GAAqBH,kBAAAA,CACxB1H,GAAAA,CAAI,CAAC4H,GAAAA,KAAQ;SAAOA,GAAAA,CAAAA,CAAK,CAAA,CACzBzH,IAAAA,CAAK,EAAA,CAAA;AACR,EAAA,MAAM2H,cAAAA,GAAiB,CAAA,EACrBT,eAAAA,CAAgBvH,MAAAA,GAAS,CAAA,GAAI;AAAmB6H,cAAAA,EAAAA,eAAAA,CAAAA,CAAAA,GAAoB,EAAA,CAAA,EAEpED,kBAAAA,CAAmB5H,SAAS,CAAA,GACxB;AAAuB+H,kBAAAA,EAAAA,kBAAAA,KACvB,EAAA,CAAA,CAAA;AAGN,EAAA,OACE,CAAA,sBAAA,EAAoBX,iBAAAA,CAAAA,aAAAA,EAAiCpK,SAAAA,CACnDoK,iBAAAA,CAAAA,CAAAA,MAAAA,EAEAJ,oBAAAA,GACI,CAAA,KAAA,EAAQA,oBAAAA,CAAAA,iBAAAA,EAAwChK,SAAAA,CAC9CgK,oBAAAA,CAAAA,KAEF,EAAA,CAAA;MACIK,sBAAAA;;AAEVW,CAAAA,GAAAA,cAAAA;AAEJ;AA1CgBb,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AA+CT,SAASc,8BAAAA,CACdC,YACAjB,cAAAA,EAAsB;AAEtB,EAAA,MAAMkB,kBAAAA,GAAqB;YACjBD,UAAAA;mBACOjB,cAAAA,CAAAA,CAAAA;AAEjB,EAAA,OAAO,iFAA4EkB,kBAAAA,CAAAA,CAAAA;AACrF;AATgBF,MAAAA,CAAAA,8BAAAA,EAAAA,gCAAAA,CAAAA;AAcT,SAASG,iCAAAA,CACdF,YACAjB,cAAAA,EAAsB;AAEtB,EAAA,MAAMkB,kBAAAA,GAAqB;YACjBD,UAAAA;mBACOjB,cAAAA,CAAAA,CAAAA;AAEjB,EAAA,OAAO,2BAA2BkB,kBAAAA,CAAAA,CAAAA;AACpC;AATgBC,MAAAA,CAAAA,iCAAAA,EAAAA,mCAAAA,CAAAA;AAcT,SAASC,uBAAAA,CACdxB,UACAI,cAAAA,EAAsB;AAEtB,EAAA,MAAMC,OAAAA,GAAU,OAAOD,cAAAA,CAAAA,CAAAA;AAEvB,EAAA,QAAQJ,QAAAA;IACN,KAAK,UAAA;AACH,MAAA,OAAO,CAAA;EAA6DK,OAAAA,CAAAA,CAAAA;IACtE,KAAK,cAAA;AACH,MAAA,OAAO,gCAA2BA,OAAAA,CAAAA,CAAAA;IACpC,KAAK,aAAA;AACH,MAAA,OAAO,2CAA+BA,OAAAA,CAAAA,CAAAA;IACxC,KAAK,WAAA;AAEH,MAAA,MAAMR,MACJ,kEAAA,CAAA;AAEJ,IAAA;AACE,MAAA,MAAMA,KAAAA,CAAM,CAAA,sBAAA,EAAyBG,QAAAA,CAAAA,CAA0B,CAAA;AACnE;AACF;AArBgBwB,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;;;ACvFT,SAASC,kCAAAA,CACdC,SAAAA,EAGA9C,WAAAA,EACAxD,IAAAA,EAAqB;AAErB,EAAA,MAAM,EAAEjE,KAAG,GAAKiE,IAAAA;AAChB,EAAA,MAAM,EAAEkC,WAAAA,EAAaC,UAAAA,EAAU,GAAKmE,SAAAA;AAEpC,EAAA,QAAQpE,WAAAA;IACN,KAAK,kBAAA;AACHnG,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkCwG,UAAAA,CAAAA,+BAAAA,CAA2C,CAAA;AAE/E,MAAA,OAAO;AACLD,QAAAA,WAAAA;AACAC,QAAAA,UAAAA;QACA7D,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,kBAAA;AACHvC,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkCwG,UAAAA,CAAAA,+BAAAA,CAA2C,CAAA;AAE/E,MAAA,OAAO;AACLD,QAAAA,WAAAA;AACAC,QAAAA,UAAAA;QACA7D,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,mBAAA;AACHvC,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkCwG,UAAAA,CAAAA,+BAAAA,CAA2C,CAAA;AAE/E,MAAA,OAAO;AACLD,QAAAA,WAAAA;AACAC,QAAAA,UAAAA;QACA7D,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,eAAA;AACHvC,MAAAA,GAAAA,CAAIJ,MAAM,CAAA,mEAAA,CAA8D,CAAA;AACxE,MAAA,OAAO;AACLuG,QAAAA,WAAAA;QACAC,UAAAA,EAAYpF,MAAAA;QACZuB,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,gBAAA;AACHvC,MAAAA,GAAAA,CAAIC,IAAAA,CAAK,CAAA,4BAAA,EAA0BwH,WAAAA,GAAc,GAAA,CAAA,CAAA,CAAO,CAAA;AACxD,MAAA,OAAO;AACLtB,QAAAA,WAAAA;QACAC,UAAAA,EAAYpF,MAAAA;QACZuB,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,cAAA;AACHvC,MAAAA,GAAAA,CAAID,KAAK,CAAA,gBAAA,CAAkB,CAAA;AAC3B,MAAA,OAAO;AACLoG,QAAAA,WAAAA;QACAC,UAAAA,EAAYpF,MAAAA;QACZuB,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,qBAAA;AACHvC,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkCwG,UAAAA,CAAAA,+BAAAA,CAA2C,CAAA;AAE/E,MAAA,OAAO;AACLD,QAAAA,WAAAA;AACAC,QAAAA,UAAAA;QACA7D,OAAAA,EAAS;AACX,OAAA;AACF,IAAA;AACE,MAAA,MAAMmG,KAAAA,CAAM,CAAA,yBAAA,EAA4BvC,WAAAA,CAAAA,CAA6B,CAAA;AACzE;AACF;AAvEgBmE,MAAAA,CAAAA,kCAAAA,EAAAA,oCAAAA,CAAAA;;;ACOhB,eAAsBE,sBAAAA,CACpBvG,IAAAA,EACAC,SAAAA,EACA,EACEuG,iBAAAA,mBAAuC,MAAA,CAAA,MAAMzJ,MAAAA,EAAN,mBAAA,CAAA,EACvCwB,KAAAA,EACA,GAAG0F,UAAAA,EAAAA,EACoB;AAEzB,EAAA,MAAM,EAAElI,KAAG,GAAKiE,IAAAA;AAChB,EAAA,MAAM,EACJsD,iBAAAA,GAAoBD,wBAAAA,CAAyBC,mBAC7CE,WAAAA,GAAcH,wBAAAA,CAAyBG,aAAW,GAChDS,UAAAA;AAEJ,EAAA,MAAMwC,QAAAA,GAAWzC,kCAAAA,CAAmChE,IAAAA,EAAMC,SAAAA,EAAW;AACnE1B,IAAAA,KAAAA;IACA,GAAG0F;GACL,CAAA;AAEA,EAAA,WAAA,MAAiByC,YAAYD,QAAAA,EAAU;AACrC,IAAA,IAAIC,SAASlC,SAAAA,EACX,OAAO6B,kCAAAA,CAAmCK,QAAAA,EAAUlD,aAAaxD,IAAAA,CAAAA;AAGnE,IAAA,MAAM,EAAEmE,cAAAA,EAAgBQ,YAAAA,EAAcxH,MAAAA,EAAM,GAAKuJ,QAAAA;AAGjD,IAAA,IAAI/B,YAAAA,EAAc;AAChB,MAAA,IAAI;AACF,QAAA,MAAM6B,iBAAAA,CAAkBrJ,QAAQgH,cAAAA,CAAAA;AAClC,MAAA,CAAA,CAAA,OAASwC,CAAAA,EAAG;AACV5K,QAAAA,GAAAA,CAAIJ,KAAAA,CAAM,uCAAuCgL,CAAAA,CAAAA;AACnD,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,EAAEC,aAAAA,EAAe5B,cAAAA,EAAgB6B,SAAAA,EAAWZ,UAAAA,EAAYrB,UAAQ,GACpEzH,MAAAA;AAGF,IAAA,MAAM2J,eAAeD,SAAAA,KAAcD,aAAAA;AACnC,IAAA,MAAMG,0BAA0BD,YAAAA,IAAgBxD,iBAAAA;AAChD,IAAA,IAAIyD,uBAAAA,EAAyB;AAC3B,MAAA,MAAMnL,OAAAA,GAAUoK,8BAAAA,CACdC,UAAAA,EACAjB,cAAAA,CAAAA;AAEFjJ,MAAAA,GAAAA,CAAIC,KAAKJ,OAAAA,CAAAA;AACT,MAAA,OAAO;QACLsG,WAAAA,EAAa,gBAAA;QACbC,UAAAA,EAAYpF,MAAAA;QACZuB,OAAAA,EAAS;AACX,OAAA;AACF,IAAA;AACA,IAAA,IAAIwI,YAAAA,EAAc;AAChB,MAAA,MAAMlL,OAAAA,GAAUuK,iCAAAA,CACdF,UAAAA,EACAjB,cAAAA,CAAAA;AAEFjJ,MAAAA,GAAAA,CAAID,KAAKF,OAAAA,CAAAA;AACX,IAAA;AAEA,IAAA,QAAQgJ,QAAAA;MACN,KAAK,UAAA;MACL,KAAK,cAAA;AACL,MAAA,KAAK,aAAA,EAAe;AAClB7I,QAAAA,GAAAA,CAAID,IAAAA,CAAKsK,uBAAAA,CAAwBxB,QAAAA,EAAUI,cAAAA,CAAAA,CAAAA;AAC3C,QAAA;AACF,MAAA;AACA,MAAA,KAAK,WAAA,EAAa;AAChB,QAAA,MAAMrG,MAAAA,GAASuE,wBAAwB/F,MAAAA,CAAAA;AACvC,QAAA,QAAQwB,OAAOL,OAAAA;AACb,UAAA,KAAK,SAAA,EAAW;AACd,YAAA;AACF,UAAA;AACA,UAAA,KAAK,QAAA,EAAU;AACb,YAAA,MAAM1C,OAAAA,GAAUsJ,sBAAsB/H,MAAAA,CAAAA;AACtCpB,YAAAA,GAAAA,CAAIC,KAAKJ,OAAAA,CAAAA;AACT,YAAA;AACF,UAAA;AACA,UAAA,KAAK,SAAA,EAAW;AACd,YAAA,MAAMA,OAAAA,GAAUkJ,uBAAuB3H,MAAAA,CAAAA;AACvCpB,YAAAA,GAAAA,CAAID,KAAKF,OAAAA,CAAAA;AACT,YAAA;AACF,UAAA;AACA,UAAA;AACE,YAAA,MAAM6I,KAAAA,CAAM,CAAA,oBAAA,EAAuB9F,MAAAA,CAAAA,CAAwB,CAAA;AAC/D;AACA,QAAA,OAAOA,MAAAA;AACT,MAAA;AACA,MAAA;AACE,QAAA,MAAM8F,KAAAA,CAAM,CAAA,sBAAA,EAAyBG,QAAAA,CAAAA,CAA0B,CAAA;AACnE;AACF,EAAA;AAGA,EAAA,MAAMH,MAAM,6BAAA,CAAA;AACd;AAjGsB8B,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;;;ACJf,SAASS,aAAAA,CACd,EACElF,MAAAA,EACAzB,WAAAA,GAAcpE,oBACd8F,SAAAA,GAAY7F,gBAAAA,EAAgB,EAM9B,EACEhB,QAAQM,YAAAA,EACRO,GAAAA,GAAML,gBAAAA,EAAgB,GACM,EAAC,EAAC;AAEhC,EAAA,IAAI,OAAOR,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAMuJ,KAAAA,CACJ,CAAA;AACuG,4GAAA,CAAA,CAAA;AAE3G,EAAA;AAEA,EAAA,MAAMzE,IAAAA,GAAwB;;;;IAI5B9E,KAAAA,EAAOD,qBAAAA,CAAsBC,OAAO,IAAA,CAAA;AACpCa,IAAAA;AACF,GAAA;AACA,EAAA,MAAMkE,SAAAA,GAAuB;AAAE6B,IAAAA,MAAAA;AAAQzB,IAAAA,WAAAA;AAAa0B,IAAAA;AAAU,GAAA;AAC9D,EAAA,OAAO;AACLhC,IAAAA,mBAAAA,EAAqBA,mBAAAA,CAAoBkH,IAAAA,CAAK,IAAA,EAAMjH,IAAAA,EAAMC,SAAAA,CAAAA;AAC1D2C,IAAAA,+CAAAA,EACEA,+CAAAA,CAAgDqE,IAAAA,CAC9C,IAAA,EACAjH,IAAAA,EACAC,SAAAA,CAAAA;AAEJ+C,IAAAA,mCAAAA,EACEA,mCAAAA,CAAoCiE,IAAAA,CAAK,IAAA,EAAMjH,IAAAA,EAAMC,SAAAA,CAAAA;AACvD+D,IAAAA,kCAAAA,EAAoCA,kCAAAA,CAAmCiD,IAAAA,CACrE,IAAA,EACAjH,IAAAA,EACAC,SAAAA,CAAAA;AAEFgD,IAAAA,oCAAAA,EACEA,oCAAAA,CAAqCgE,IAAAA,CAAK,IAAA,EAAMjH,IAAAA,EAAMC,SAAAA,CAAAA;AACxDsG,IAAAA,sBAAAA,EAAwBA,sBAAAA,CAAuBU,IAAAA,CAAK,IAAA,EAAMjH,IAAAA,EAAMC,SAAAA;AAClE,GAAA;AACF;AAjDgB+G,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA","file":"index.cjs","sourcesContent":["import type { FetchDriver } from \"./sdk/dependencies.js\";\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function pluralize(count: number) {\n return count === 1 ? \"\" : \"s\";\n}\n\nexport function getBackoffMs(\n attemptNumber: number,\n minWaitMs = 1000,\n maxWaitMs = 10000,\n): number {\n return Math.min(maxWaitMs, minWaitMs * 1.2 ** attemptNumber);\n}\n\nexport const buildFetchWithTimeout =\n (fetch: FetchDriver, defaultTimeoutMs: number) =>\n async (...args: Parameters<FetchDriver>) => {\n // Allow signal to be overridden by the caller\n const signal = args[1]?.signal ?? AbortSignal.timeout(defaultTimeoutMs);\n\n return fetch(args[0], { ...args[1], signal });\n };\n","export const defaultFetch = globalThis.fetch;\n","import type { LogDriver } from \"../dependencies.js\";\n\nexport const defaultLogDriver: LogDriver = {\n error(message, error) {\n console.error(message, error);\n },\n info(message) {\n console.log(message);\n },\n warn(message) {\n console.warn(message);\n },\n};\n","export const defaultServiceBase = \"https://app.qawolf.com/\";\n","{\n \"name\": \"@qawolf/ci-sdk\",\n \"version\": \"2.0.0\",\n \"private\": false,\n \"description\": \"A simple SDK for interacting with QAWolf in CI scripts.\",\n \"keywords\": [],\n \"license\": \"MIT\",\n \"author\": \"Jules Sam. Randolph<jules@qawolf.com>\",\n \"sideEffects\": false,\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"require\": \"./dist/index.cjs\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"files\": [\n \"/dist\",\n \"/README.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --clean --splitting --treeshake --sourcemap --outDir dist --target es2022\",\n \"lint:ci\": \"npm run lint:non-fixable; NON_FIXABLE_EXIT=$?; npm run lint:fixable && exit $NON_FIXABLE_EXIT\",\n \"lint:dev\": \"npm run lint:fixable\",\n \"lint:fixable\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:non-fixable\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*'\",\n \"prepublishOnly\": \"nx run ci-sdk:build\",\n \"test\": \"NODE_OPTIONS=\\\"--experimental-vm-modules\\\" NODE_NO_WARNINGS=1 jest\",\n \"tsc:check\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@qawolf/ci-utils\": \"^1.1.2\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n","import packageJson from \"../../../../package.json\" with { type: \"json\" };\n\nexport const defaultUserAgent = `ci-sdk/${packageJson.version}`;\n","import type { LogDriver } from \"@qawolf/ci-utils\";\n\nexport async function logFetchError({\n log,\n methodName,\n response,\n}: {\n log: LogDriver;\n methodName: string;\n response: Response;\n}) {\n if (response.ok) return;\n\n const { eventId, failureMessage } = await (async () => {\n try {\n const body = (await response.json().catch(() => response.text())) as\n | Record<string, unknown>\n | string;\n if (typeof body === \"object\" && body !== null) {\n return {\n eventId: body.eventId,\n failureMessage: body.failureMessage,\n };\n }\n // If body is not an object (i.e., it's the text from catch)\n return {\n eventId: undefined,\n failureMessage: body,\n };\n } catch {\n // If both parsing attempts somehow fail\n return {\n eventId: undefined,\n failureMessage: undefined,\n };\n }\n })();\n\n const eventIdSuffix = eventId ? ` (Event ID: ${eventId})` : \"\";\n const messageSuffix = failureMessage ? `: ${failureMessage}` : \"\";\n\n const statusText =\n response.status >= 500\n ? \"Server Error\"\n : response.statusText || \"Unknown Error\";\n\n log.error(\n `❌ [${methodName}] ${response.status} ${statusText}${eventIdSuffix}${messageSuffix}`,\n );\n}\n","import type { LogDriver } from \"../../dependencies.js\";\n\nimport type { DeployStatus, NotifyDeployStatus } from \"./types.js\";\n\nexport async function handleSuccessResponse(\n data: DeployStatus,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const { environment, results } = data;\n const skippedTriggers = data.skippedTriggers ?? [];\n const skippedDeployment = data.skippedDeployment;\n const isPreviewDeployment = environment && !environment.isStatic;\n\n if (environment) {\n const logPrefix = environment.isStatic\n ? \"Static environment\"\n : \"Preview environment\";\n log.info(`${logPrefix}: ${environment.alias} (id: ${environment.id})`);\n }\n\n // No suites were created for this deployment.\n if (results.length === 0) {\n const skipMessages = [\n ...skippedTriggers.map((trigger) => trigger.message),\n ...(skippedDeployment ? [skippedDeployment.message] : []),\n ];\n const skipDetail =\n skipMessages.length > 0 ? ` ${skipMessages.join(\" \")}` : \"\";\n\n // Preview deployments legitimately often produce no run; keep the success\n // outcome but surface any skip reason so it is not silently dropped.\n if (isPreviewDeployment) {\n log.info(\n `✅ Deployment notification was successful. No run was created for this deployment.${skipDetail}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: undefined,\n };\n }\n\n // A trigger matched but could not run (e.g. environment still syncing).\n // Distinct from \"no trigger matched\": the generic text would mislabel it,\n // and the skip reason is what tells the caller whether to retry.\n if (skippedTriggers.length > 0) {\n log.error(`🚫 No run was created for this deployment.${skipDetail}`);\n return {\n failReason: \"trigger-skipped\",\n outcome: \"failed\",\n skippedTriggers,\n };\n }\n\n log.warn(\n skippedDeployment\n ? `⚠️ No run was created for this deployment.${skipDetail}`\n : `⚠️ No trigger matched the request. Please make sure there is at least one active test in the QA Wolf environment, or contact support.`,\n );\n return {\n outcome: \"skipped\",\n skippedDeployment,\n };\n }\n\n // If there are results, environment must be defined\n if (!environment) {\n log.error(`🚫 No environment matched the request. Please contact support.`);\n return { failReason: \"no-environment\", outcome: \"failed\" };\n }\n\n const failedTrigger = results.find((result) => \"failureReason\" in result);\n if (failedTrigger) {\n log.error(\n `🚫 Run could not be created. Reason: \"${failedTrigger.failureReason}\". Please contact support.`,\n );\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n\n const duplicateSuite = results.find((result) => \"duplicateSuiteId\" in result);\n if (duplicateSuite) {\n log.info(\n `✅ Deployment notification was successful. Previous run ID: ${duplicateSuite.duplicateSuiteId} already exists for this deployment.`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: duplicateSuite.duplicateSuiteId,\n };\n }\n\n const successfulTrigger = results.find(\n (result) => \"createdSuiteId\" in result,\n );\n if (!successfulTrigger) {\n // results is non-empty here, so triggers did match — this is not the\n // deterministic no-trigger-match skip. Reaching this point means the\n // response carried results we could not turn into a run, so it is an\n // unexpected failure rather than a skip.\n log.error(`🚫 Run could not be created. Please contact support.`);\n return { failReason: \"run-could-not-be-created\", outcome: \"failed\" };\n }\n log.info(\n `✅ Deployment notification was successful. Run created with ID: ${successfulTrigger.createdSuiteId}`,\n );\n return {\n environmentId: environment.id,\n outcome: \"success\",\n runId: successfulTrigger.createdSuiteId,\n };\n}\n","import type { DeploySuccessWireResponse } from \"./deploySuccessWireResponse.js\";\nimport type { DeployStatus, DeploySuccessSuiteResult } from \"./types.js\";\n\nfunction mapSuiteResult(\n result: DeploySuccessWireResponse[\"results\"][number],\n): DeploySuccessSuiteResult {\n if (\"created_suite_id\" in result) {\n return {\n createdSuiteId: result.created_suite_id,\n triggerId: result.trigger_id,\n };\n }\n if (\"failure_reason\" in result) {\n return {\n failureReason: result.failure_reason,\n triggerId: result.trigger_id,\n };\n }\n return {\n duplicateSuiteId: result.duplicate_suite_id,\n skipReason: result.skip_reason,\n triggerId: result.trigger_id,\n };\n}\n\n// The deploy_success success body is the SDK's only snake_case wire shape; this\n// is the single place that renames it to the camelCase `DeployStatus` used\n// everywhere downstream.\nexport function mapDeploySuccessResponse(\n wire: DeploySuccessWireResponse,\n): DeployStatus {\n return {\n environment: wire.environment,\n results: wire.results.map(mapSuiteResult),\n skippedDeployment: wire.skipped_deployment && {\n message: wire.skipped_deployment.message,\n reason: wire.skipped_deployment.reason,\n },\n skippedTriggers: wire.skipped_triggers?.map((trigger) => ({\n environmentId: trigger.environment_id,\n message: trigger.message,\n reason: trigger.reason,\n triggerId: trigger.trigger_id,\n })),\n };\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport { handleSuccessResponse } from \"./handleSuccessResponse.js\";\nimport { mapDeploySuccessResponse } from \"./mapDeploySuccessResponse.js\";\nimport type {\n AttemptDeployHttpAbortReason,\n DeployConfig,\n DeploySuccessWireResponse,\n NotifyDeployStatus,\n} from \"./types.js\";\n\nexport async function attemptNotifyDeploy(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: Partial<DeployConfig>,\n): Promise<NotifyDeployStatus> {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/deploy_success\", apiConfig.serviceBase),\n {\n body: JSON.stringify({\n branch: config.branch,\n commit_url: config.commitUrl,\n deduplication_key: config.deduplicationKey,\n deployment_type: config.deploymentType,\n deployment_url: config.deploymentUrl,\n ...(\"ephemeralEnvironment\" in config\n ? {\n ephemeral_environment: config.ephemeralEnvironment,\n }\n : \"hostingService\" in config && {\n hosting_service: config.hostingService,\n merge_request_number:\n config.hostingService === \"GitLab\"\n ? config.mergeRequestNumber\n : undefined,\n pull_request_number:\n config.hostingService === \"GitHub\"\n ? config.pullRequestNumber\n : undefined,\n repository: config.repository,\n }),\n sha: config.sha,\n variables: config.variables,\n }),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n // Override default timeout to 5 minutes. This gives extra room\n // for both (1) waiting for reconciliation (2) creating the run.\n signal: AbortSignal.timeout(5 * 60 * 1000),\n },\n );\n\n if (!response.ok) return handleErrorResponse(response, log);\n const wire = (await response.json()) as DeploySuccessWireResponse;\n const data = mapDeploySuccessResponse(wire);\n return handleSuccessResponse(data, log);\n } catch {\n log.error(`🚫 Network error from deploy_success, aborting.`);\n return {\n abortReason: \"network-error\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n}\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyDeployStatus> {\n const status = response.status;\n let abortReason: AttemptDeployHttpAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"attemptNotifyDeploy\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForRunInputsExecutablesStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: GenerateSignedUrlConfig,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/run-inputs-executables-signed-urls?file=${encodeURIComponent(destinationFilePath)}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForRunInputsExecutablesStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForRunInputsExecutablesStorage } from \"../../../api/generate-signed-url-for-run-inputs-executables.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n GenerateSignedUrlAbortReason,\n GenerateSignedUrlConfig,\n GenerateSignedUrlStatus,\n} from \"./types.js\";\n\nexport async function generateSignedUrlForRunInputsExecutablesStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`🚫 destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState =\n await callGenerateSignedUrlForRunInputsExecutablesStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`✅ Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\nimport type {\n GenerateSignedUrlConfig,\n GenerateSignedUrlResponse,\n} from \"../sdk/domain/generateSignedUrls/types.js\";\n\nimport { logFetchError } from \"./log.js\";\n\nexport async function callGenerateSignedUrlForTempTeamStorage(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n { destinationFilePath }: Partial<GenerateSignedUrlConfig>,\n { fetch: localFetch, log }: SdkDependencies,\n): Promise<GenerateSignedUrlResponse> {\n try {\n const response = await localFetch(\n new URL(\n `${serviceBase}/api/v0/team-storage-signed-url?file=${destinationFilePath}`,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": userAgent,\n },\n method: \"GET\",\n },\n );\n\n if (response.status === 200) {\n const json =\n (await response.json()) as Partial<GenerateSignedUrlResponse>;\n return {\n fileLocation: json.fileLocation,\n httpStatus: response.status,\n playgroundFileLocation: json.playgroundFileLocation,\n signedUrl: json.signedUrl,\n success: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"callGenerateSignedUrlForTempTeamStorage\",\n response,\n });\n return {\n errorMessage: await response.text(),\n httpStatus: response.status,\n success: false,\n } as const;\n } catch {\n return {\n errorMessage: \"Network error, aborting request to generate signed URL\",\n httpStatus: 0,\n success: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { callGenerateSignedUrlForTempTeamStorage } from \"../../../api/generate-signed-url-for-team-storage.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type { GenerateSignedUrlConfig } from \"./types.js\";\n\ntype GenerateSignedUrlStatus =\n | {\n fileLocation?: string;\n playgroundFileLocation?: string;\n success: true;\n uploadUrl?: string;\n }\n | {\n abortReason: GenerateSignedUrlAbortReason;\n httpStatus?: number;\n success: false;\n };\n\nexport type GenerateSignedUrlAbortReason =\n | \"client-network-error\"\n | \"sdk-argument-validation-failed\"\n | \"400-invalid-request\"\n | \"401-invalid-credentials\"\n | \"403-forbidden\"\n | \"5XX-server-error\"\n | \"XXX-other-http-code\";\n\nexport async function generateSignedUrlForTempTeamStorage(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: GenerateSignedUrlConfig,\n): Promise<GenerateSignedUrlStatus> {\n const { log } = deps;\n\n if (!config.destinationFilePath) {\n log.error(`🚫 destinationFilePath is a required config parameter`);\n return {\n abortReason: \"sdk-argument-validation-failed\",\n success: false,\n };\n }\n\n const responseState = await callGenerateSignedUrlForTempTeamStorage(\n apiConfig,\n config,\n deps,\n );\n if (!responseState.success) {\n let abortReason: GenerateSignedUrlAbortReason = \"XXX-other-http-code\";\n\n if (responseState.httpStatus >= 500) {\n abortReason = \"5XX-server-error\";\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: aborting.`,\n );\n } else {\n if (responseState.httpStatus === 400) abortReason = \"400-invalid-request\";\n else if (responseState.httpStatus === 401)\n abortReason = \"401-invalid-credentials\";\n else if (responseState.httpStatus === 403) abortReason = \"403-forbidden\";\n else if (responseState.httpStatus === 0)\n abortReason = \"client-network-error\";\n\n log.error(\n `🚫 Unrecoverable error (status ${responseState.httpStatus}) when generating signed upload url: ${responseState.errorMessage ? `${responseState.errorMessage}.` : \"\"} aborting.`,\n );\n }\n\n return {\n abortReason,\n httpStatus: responseState.httpStatus,\n success: false,\n };\n }\n\n log.info(`✅ Generated Signed Upload URL: ${responseState.signedUrl}.`);\n return {\n fileLocation: responseState.fileLocation,\n playgroundFileLocation: responseState.playgroundFileLocation,\n success: true,\n uploadUrl: responseState.signedUrl,\n };\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport { logFetchError } from \"../../../api/log.js\";\nimport type { LogDriver, SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n NotifyTerminatedEphemeralEnvironmentAbortReason,\n NotifyTerminatedEphemeralEnvironmentInput,\n NotifyTerminatedEphemeralEnvironmentResult,\n TerminatedEphemeralEnvironmentSuccessResult,\n} from \"./types.js\";\n\nexport const notifyTerminatedEphemeralEnvironment = async (\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n config: NotifyTerminatedEphemeralEnvironmentInput,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> => {\n const { fetch: localFetch, log } = deps;\n try {\n const response = await localFetch(\n new URL(\"/api/webhooks/environment_terminated\", apiConfig.serviceBase),\n {\n body: JSON.stringify(config),\n headers: {\n Authorization: `Bearer ${apiConfig.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": apiConfig.userAgent,\n },\n method: \"POST\",\n },\n );\n if (!response.ok) return handleErrorResponse(response, log);\n const { environmentId } =\n (await response.json()) as TerminatedEphemeralEnvironmentSuccessResult;\n return { environmentId, outcome: \"success\" };\n } catch {\n log.error(`🚫 Network error from terminate_preview_environment, aborting.`);\n return {\n abortReason: \"network-error\",\n outcome: \"aborted\",\n };\n }\n};\n\nasync function handleErrorResponse(\n response: Response,\n log: LogDriver,\n): Promise<NotifyTerminatedEphemeralEnvironmentResult> {\n const status = response.status;\n let abortReason: NotifyTerminatedEphemeralEnvironmentAbortReason;\n if (status === undefined) abortReason = \"network-error\";\n else if (status === 401) abortReason = \"401-unauthorized\";\n else if (status === 403) abortReason = \"403-forbidden\";\n else if (status === 409) abortReason = \"409-conflict\";\n else if (status >= 500) abortReason = \"5XX-server-error\";\n else abortReason = \"4XX-client-error\";\n await logFetchError({\n log,\n methodName: \"notifyTerminatedEphemeralEnvironment\",\n response,\n });\n return {\n abortReason,\n httpStatus: status,\n outcome: \"aborted\",\n };\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\n\nimport type { PollCiGreenlightStatus } from \"./types.js\";\n\n/**\n * Build the result for a completed run\n */\nexport function buildCompletedRunResult(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): PollCiGreenlightStatus {\n if (status.greenlight)\n return { greenlightStatus: status, outcome: \"success\" };\n else return { greenlightStatus: status, outcome: \"failed\" };\n}\n","import type { PollCiGreenlightPollConfig } from \"./types.js\";\n\n/**\n * Safe default values for polling configuration.\n * If you change these values, make sure you update the JSDoc\n * comments in the PollCiGreenlightPollConfig type.\n */\nexport const pollCiGreenlightDefaults: PollCiGreenlightPollConfig = {\n abortOnSuperseded: false,\n maxRetries: 10,\n pollTimeout: 120 * 60 * 1000, // 2 hours\n retryInterval: 10 * 1000, // 10 seconds\n runInProgressInterval: 30 * 1000, // 30 seconds\n runUnderReviewInterval: 60 * 1000, // 60 seconds\n};\n","import type { ApiConfig } from \"../api-types.js\";\nimport type { SdkDependencies } from \"../sdk/dependencies.js\";\n\nimport type { CiGreenlightBugData } from \"./ci-greenlight-bug-data.js\";\nimport { logFetchError } from \"./log.js\";\n\nexport type {\n CiGreenlightBugData,\n CiGreenlightBugDetails,\n} from \"./ci-greenlight-bug-data.js\";\n\nexport type CiGreenlightStatusBase = {\n relevantRunId: string;\n relevantRunUrl: string;\n rootRunId: string;\n rootRunUrl: string;\n};\n\nexport type CiGreenlightStatusExtended = {\n relevantRunWithBugsUrl: string;\n workflowsDisabledAfterRunCount: number;\n workflowsInRunCount: number;\n workflowsUnderInvestigationCount: number;\n};\n\n/**\n * The status of a CI greenlight run. See the API documentation here for\n * more details: https://qawolf.notion.site/1b170576efea411fa785842a71e7c99e\n */\nexport type CiGreenlightStatus = CiGreenlightStatusBase &\n (\n | ({\n greenlight: boolean;\n runStage: \"completed\";\n } & CiGreenlightBugData &\n CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"underReview\";\n } & CiGreenlightBugData &\n CiGreenlightStatusExtended)\n | ({\n greenlight: false;\n runStage: \"initializing\";\n } & Partial<CiGreenlightStatusExtended>)\n | ({\n greenlight: false;\n /**\n * Human-readable copy explaining why the run was canceled, when the\n * server provides it.\n */\n message?: string;\n /**\n * Stable, machine-readable code for why the run was canceled, when the\n * server provides it. Treat as an open set of values.\n */\n reason?: string;\n runStage: \"canceled\";\n } & Partial<CiGreenlightStatusExtended>)\n );\n\nexport async function fetchCiGreenlightStatus(\n { apiKey, serviceBase, userAgent }: ApiConfig,\n {\n runId,\n }: {\n runId: string;\n },\n { fetch: localFetch, log }: SdkDependencies,\n) {\n try {\n const resp = await localFetch(\n new URL(\n `/api/v0/ci-greenlight/${encodeURIComponent(runId)}`,\n serviceBase,\n ),\n {\n headers: {\n Authorization: `Bearer ${apiKey}`,\n \"User-Agent\": userAgent,\n },\n },\n );\n\n if (resp.ok) {\n const greenlightStatus = (await resp.json()) as CiGreenlightStatus;\n return {\n greenlightStatus,\n httpStatus: resp.status,\n ok: true,\n } as const;\n }\n await logFetchError({\n log,\n methodName: \"fetchCiGreenlightStatus\",\n response: resp,\n });\n if (resp.status === 404) {\n return {\n canRetry: true,\n errorType: \"not-found\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n if (resp.status >= 500) {\n return {\n canRetry: true,\n errorType: \"server\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n }\n return {\n canRetry: false,\n errorType: \"client\",\n httpStatus: resp.status,\n ok: false,\n } as const;\n } catch {\n return {\n canRetry: true,\n errorType: \"network\",\n httpStatus: 0,\n ok: false,\n } as const;\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { fetchCiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { sleep } from \"../../../other.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport type {\n MakePollCiGreenlightStatusIteratorParams,\n PollCiGreenlightIteration,\n} from \"./types.js\";\n\n/**\n * Creates an async generator that yields CI greenlight status updates or abort notifications.\n *\n * This low-level API gives you full control over the polling loop, allowing you to:\n * - Inspect status after each fetch\n * - Break out of the loop based on custom criteria\n * - Add custom logging or side effects\n * - Handle abort conditions without exceptions\n *\n * The iterator yields a discriminated union with `isAborted` property:\n * - `isAborted: false` - Normal status update with run information\n * - `isAborted: true` - Terminal condition (timeout, error, canceled, etc.)\n *\n * Note: This function does not throw errors. All error conditions are yielded as\n * abort results that you must check and handle.\n *\n * @example\n * ```typescript\n * const greenlightIterator = makePollCiGreenlightStatusIterator({ runId: \"my-run-id\" });\n *\n * for await (const lastPoll of greenlightIterator) {\n * // Check for abort conditions first\n * if (lastPoll.isAborted) {\n * console.error(`Aborted: ${lastPoll.abortReason}`);\n * process.exit(1);\n * }\n *\n * // Handle normal status updates\n * const { status } = lastPoll;\n * console.log(`Current stage: ${status.runStage}`);\n *\n * // Exit with error if run reached a terminal stage without greenlight\n * if (lastPoll.isFailedTerminalStage) {\n * process.exit(1);\n * }\n * }\n * ```\n *\n */\nexport async function* makePollCiGreenlightStatusIterator(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n { runId, ...pollConfig }: MakePollCiGreenlightStatusIteratorParams,\n): AsyncGenerator<PollCiGreenlightIteration, void, unknown> {\n const { log } = deps;\n\n const {\n maxRetries = pollCiGreenlightDefaults.maxRetries,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n retryInterval = pollCiGreenlightDefaults.retryInterval,\n runInProgressInterval = pollCiGreenlightDefaults.runInProgressInterval,\n runUnderReviewInterval = pollCiGreenlightDefaults.runUnderReviewInterval,\n } = pollConfig;\n\n let retries = 0;\n let previousStatus: CiGreenlightStatus | undefined = undefined;\n const startedAt = Date.now();\n\n while (Date.now() - startedAt <= pollTimeout) {\n const responseState = await fetchCiGreenlightStatus(\n apiConfig,\n { runId },\n deps,\n );\n\n const elapsedMs = Date.now() - startedAt;\n\n if (!responseState.ok && !responseState.canRetry) {\n yield {\n abortReason: \"4XX-client-error\",\n elapsedMs,\n httpStatus: responseState.httpStatus,\n isAborted: true,\n };\n return;\n }\n\n if (!responseState.ok) {\n retries += 1;\n const { errorType, httpStatus } = responseState;\n if (retries > maxRetries) {\n switch (errorType) {\n case \"network\":\n yield {\n abortReason: \"network-error\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n break;\n case \"not-found\":\n yield {\n abortReason: \"404-run-not-found\",\n elapsedMs,\n httpStatus: httpStatus ?? 404,\n isAborted: true,\n };\n break;\n case \"server\":\n yield {\n abortReason: \"5XX-server-error\",\n elapsedMs,\n httpStatus: httpStatus ?? 500,\n isAborted: true,\n };\n break;\n default:\n throw Error(`Unexpected error type: ${errorType satisfies never}`);\n }\n return;\n }\n\n const retryLabel = `${\n httpStatus ? ` (status ${httpStatus})` : \"\"\n }, will try again... (${retries}/${maxRetries})`;\n\n if (errorType === \"network\") log.warn(`❌ Network error${retryLabel}`);\n else if (errorType === \"not-found\")\n log.info(`⏳ Run not found${retryLabel}`);\n else if (errorType === \"server\") log.warn(`❌ Server error${retryLabel}`);\n\n await sleep(retryInterval);\n continue;\n }\n\n // Success - reset retry counter\n retries = 0;\n const { greenlightStatus } = responseState;\n const stageChanged =\n !previousStatus || previousStatus.runStage !== greenlightStatus.runStage;\n\n // Determine if this is a failed terminal stage\n const isFailedTerminalStage =\n greenlightStatus.runStage === \"canceled\" ||\n (greenlightStatus.runStage === \"completed\" &&\n greenlightStatus.greenlight === false);\n\n yield {\n elapsedMs,\n isAborted: false,\n isFailedTerminalStage,\n previousStatus,\n stageChanged,\n status: greenlightStatus,\n };\n\n // Update previous status for next iteration\n previousStatus = greenlightStatus;\n\n switch (greenlightStatus.runStage) {\n case \"canceled\": {\n yield {\n abortReason: \"run-canceled\",\n elapsedMs,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n }\n case \"completed\":\n return;\n case \"initializing\":\n await sleep(runInProgressInterval);\n break;\n case \"underReview\":\n await sleep(runUnderReviewInterval);\n break;\n default:\n throw Error(\n `Unexpected run stage: ${greenlightStatus satisfies never}`,\n );\n }\n }\n\n // Timeout\n yield {\n abortReason: \"poll-timed-out\",\n elapsedMs: Date.now() - startedAt,\n httpStatus: undefined,\n isAborted: true,\n };\n return;\n}\n","import type { CiGreenlightStatus } from \"../../../api/ci-greenlight.js\";\nimport { pluralize } from \"../../../other.js\";\n\n/**\n * Build log message for successful completed run\n */\nexport function buildSuccessLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const { nonBlockingBugsCount, relevantRunUrl } = status;\n const urlInfo = `See ${relevantRunUrl}`;\n\n return `✅ Run passed and no blocking bugs found${\n nonBlockingBugsCount > 0\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )} found`\n : \"\"\n }.\\n${urlInfo}`;\n}\n\n/**\n * Build log message for failed completed run\n */\nexport function buildFailedLogMessage(\n status: Extract<CiGreenlightStatus, { runStage: \"completed\" }>,\n): string {\n const {\n blockingBugsCount,\n nonBlockingBugsCount,\n relevantRunWithBugsUrl,\n reproducedBugs,\n } = status;\n\n const blockingBugUrls = reproducedBugs\n .filter((bug) => bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n const nonBlockingBugUrls = reproducedBugs\n .filter((bug) => !bug.isBlocking)\n .map((bug) => bug.applicationUrl);\n\n const blockingBugList = blockingBugUrls.map((url) => `\\n• ${url}`).join(\"\");\n const nonBlockingBugList = nonBlockingBugUrls\n .map((url) => `\\n• ${url}`)\n .join(\"\");\n const bugsListInText = `${\n blockingBugUrls.length > 0 ? `\\nBLOCKING BUGS:${blockingBugList}` : \"\"\n }${\n nonBlockingBugUrls.length > 0\n ? `\\nNON BLOCKING BUGS:${nonBlockingBugList}`\n : \"\"\n }`;\n\n return (\n `❌ Run failed and ${blockingBugsCount} blocking bug${pluralize(\n blockingBugsCount,\n )} found${\n nonBlockingBugsCount\n ? ` and ${nonBlockingBugsCount} non-blocking bug${pluralize(\n nonBlockingBugsCount,\n )}`\n : \"\"\n }.\\nSee ${relevantRunWithBugsUrl}\\n` +\n \"You may review the priority of certain bugs to mark these non-blocking and retry the job.\\n\" +\n bugsListInText\n );\n}\n\n/**\n * Build log message for superseded run (aborting)\n */\nexport function buildSupersededAbortLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `❌ Aborting due to superseded run (option 'abortOnSuperseded' is enabled).${supersedingDetails}`;\n}\n\n/**\n * Build log message for superseded run (continuing)\n */\nexport function buildSupersededContinueLogMessage(\n rootRunUrl: string,\n relevantRunUrl: string,\n): string {\n const supersedingDetails = `\n - Root: ${rootRunUrl}\n - Superseding: ${relevantRunUrl}`;\n\n return `Root run was superseded:${supersedingDetails}`;\n}\n\n/**\n * Build log messages for different run stages\n */\nexport function buildRunStageLogMessage(\n runStage: CiGreenlightStatus[\"runStage\"],\n relevantRunUrl: string,\n): string {\n const urlInfo = `See ${relevantRunUrl}`;\n\n switch (runStage) {\n case \"canceled\":\n return `🚫 Run was canceled. Aborting... Please contact support.\\n${urlInfo}`;\n case \"initializing\":\n return `⏳ Run is in progress... ${urlInfo}`;\n case \"underReview\":\n return `🕵️ Run is under review... ${urlInfo}`;\n case \"completed\":\n // Completed is handled separately by buildSuccessLogMessage/buildFailedLogMessage\n throw Error(\n \"buildRunStageLogMessage should not be called for completed stage\",\n );\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n}\n","import type { SdkDependencies } from \"../../dependencies.js\";\n\nimport type {\n PollCiGreenlightIteratorHttpAborted,\n PollCiGreenlightIteratorNonHttpAborted,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\n/**\n * Handles aborted iterations from the CI greenlight poll iterator\n * and converts them to appropriate result objects with logging\n */\nexport function mapIteratorAbortToGreenlightStatus(\n iteration:\n | PollCiGreenlightIteratorHttpAborted\n | PollCiGreenlightIteratorNonHttpAborted,\n pollTimeout: number,\n deps: SdkDependencies,\n): PollCiGreenlightStatus {\n const { log } = deps;\n const { abortReason, httpStatus } = iteration;\n\n switch (abortReason) {\n case \"4XX-client-error\":\n log.error(\n `🚫 Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"5XX-server-error\":\n log.error(\n `🚫 Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"404-run-not-found\":\n log.error(\n `🚫 Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n case \"network-error\":\n log.error(`🚫 Unrecoverable network error from CI greenlight, aborting.`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"poll-timed-out\":\n log.warn(`❌ Poll timed out after ${pollTimeout / 1000}s`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"run-canceled\":\n log.info(`Run was canceled`);\n return {\n abortReason,\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n case \"XXX-other-http-code\":\n log.error(\n `🚫 Unrecoverable error (status ${httpStatus}) from CI greenlight, aborting.`,\n );\n return {\n abortReason,\n httpStatus,\n outcome: \"aborted\",\n };\n default:\n throw Error(`Unexpected abort reason: ${abortReason satisfies never}`);\n }\n}\n","import type { ApiConfig } from \"../../../api-types.js\";\nimport type { SdkDependencies } from \"../../dependencies.js\";\n\nimport { buildCompletedRunResult } from \"./buildCompletedRunResult.js\";\nimport { pollCiGreenlightDefaults } from \"./consts.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./iterator.js\";\nimport {\n buildFailedLogMessage,\n buildRunStageLogMessage,\n buildSuccessLogMessage,\n buildSupersededAbortLogMessage,\n buildSupersededContinueLogMessage,\n} from \"./logging.js\";\nimport { mapIteratorAbortToGreenlightStatus } from \"./mapIteratorAbortToGreenlightStatus.js\";\nimport type {\n PollCiGreenlightParams,\n PollCiGreenlightStatus,\n} from \"./types.js\";\n\nexport async function pollCiGreenlightStatus(\n deps: SdkDependencies,\n apiConfig: ApiConfig,\n {\n onRunStageChanged: onRunStageChanged = () => undefined,\n runId,\n ...pollConfig\n }: PollCiGreenlightParams,\n): Promise<PollCiGreenlightStatus> {\n const { log } = deps;\n const {\n abortOnSuperseded = pollCiGreenlightDefaults.abortOnSuperseded,\n pollTimeout = pollCiGreenlightDefaults.pollTimeout,\n } = pollConfig;\n\n const iterator = makePollCiGreenlightStatusIterator(deps, apiConfig, {\n runId,\n ...pollConfig,\n });\n\n for await (const lastPoll of iterator) {\n if (lastPoll.isAborted)\n return mapIteratorAbortToGreenlightStatus(lastPoll, pollTimeout, deps);\n\n // Handle status iterations\n const { previousStatus, stageChanged, status } = lastPoll;\n\n // Call onRunStageChanged callback when stage changes\n if (stageChanged) {\n try {\n await onRunStageChanged(status, previousStatus);\n } catch (e) {\n log.error(`Error in onRunStageChanged callback`, e);\n }\n }\n\n const { relevantRunId, relevantRunUrl, rootRunId, rootRunUrl, runStage } =\n status;\n\n // Superseded run handling\n const isSuperseded = rootRunId !== relevantRunId;\n const shouldAbortOnSuperseded = isSuperseded && abortOnSuperseded;\n if (shouldAbortOnSuperseded) {\n const message = buildSupersededAbortLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.warn(message);\n return {\n abortReason: \"superseded-run\",\n httpStatus: undefined,\n outcome: \"aborted\",\n };\n }\n if (isSuperseded) {\n const message = buildSupersededContinueLogMessage(\n rootRunUrl,\n relevantRunUrl,\n );\n log.info(message);\n }\n\n switch (runStage) {\n case \"canceled\":\n case \"initializing\":\n case \"underReview\": {\n log.info(buildRunStageLogMessage(runStage, relevantRunUrl));\n break;\n }\n case \"completed\": {\n const result = buildCompletedRunResult(status);\n switch (result.outcome) {\n case \"aborted\": {\n break;\n }\n case \"failed\": {\n const message = buildFailedLogMessage(status);\n log.warn(message);\n break;\n }\n case \"success\": {\n const message = buildSuccessLogMessage(status);\n log.info(message);\n break;\n }\n default:\n throw Error(`Unexpected outcome: ${result satisfies never}`);\n }\n return result;\n }\n default:\n throw Error(`Unexpected run stage: ${runStage satisfies never}`);\n }\n }\n\n // This should never be reached as the iterator handles timeout\n throw Error(\"Iterator ended unexpectedly\");\n}\n","import type { ApiConfig } from \"../api-types.js\";\nimport { buildFetchWithTimeout } from \"../other.js\";\n\nimport { defaultFetch } from \"./defaults/fetch.js\";\nimport { defaultLogDriver } from \"./defaults/log.js\";\nimport { defaultServiceBase } from \"./defaults/serviceBase.js\";\nimport { defaultUserAgent } from \"./defaults/userAgent.js\";\nimport type { SdkDependencies } from \"./dependencies.js\";\nimport { attemptNotifyDeploy } from \"./domain/attemptDeploy/index.js\";\nimport { generateSignedUrlForRunInputsExecutablesStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-run-inputs-executables.js\";\nimport { generateSignedUrlForTempTeamStorage } from \"./domain/generateSignedUrls/generate-signed-url-for-team-storage.js\";\nimport { notifyTerminatedEphemeralEnvironment } from \"./domain/notifyTerminatedEphemeralEnvironment/index.js\";\nimport { pollCiGreenlightStatus } from \"./domain/pollCiGreenlight/index.js\";\nimport { makePollCiGreenlightStatusIterator } from \"./domain/pollCiGreenlight/iterator.js\";\n\nexport function makeQaWolfSdk(\n {\n apiKey,\n serviceBase = defaultServiceBase,\n userAgent = defaultUserAgent,\n }: {\n apiKey: string;\n serviceBase?: string;\n userAgent?: string;\n },\n {\n fetch = defaultFetch,\n log = defaultLogDriver,\n }: Partial<SdkDependencies> = {},\n) {\n if (typeof fetch !== \"function\") {\n throw Error(\n `QA Wolf CI-SDK requires fetch to be defined. Make sure you are using NodeJS 18+, OR pass a fetch polyfill to the makeQaWolfSdk function.\nWe recommend 'undici' package for that purpose. See the Requirement section of our README for more guidance.`,\n );\n }\n\n const deps: SdkDependencies = {\n // Versions of fetch may have different default timeouts. For consistency, we explicitly set it to 2 minutes here.\n // The increased timeout helps avoid edge cases where we need to search for a commit against multiple\n // code hosting service repositories as a fallback when not finding the repository based on organization/name.\n fetch: buildFetchWithTimeout(fetch, 120000),\n log,\n };\n const apiConfig: ApiConfig = { apiKey, serviceBase, userAgent };\n return {\n attemptNotifyDeploy: attemptNotifyDeploy.bind(null, deps, apiConfig),\n generateSignedUrlForRunInputsExecutablesStorage:\n generateSignedUrlForRunInputsExecutablesStorage.bind(\n null,\n deps,\n apiConfig,\n ),\n generateSignedUrlForTempTeamStorage:\n generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),\n makePollCiGreenlightStatusIterator: makePollCiGreenlightStatusIterator.bind(\n null,\n deps,\n apiConfig,\n ),\n notifyTerminatedEphemeralEnvironment:\n notifyTerminatedEphemeralEnvironment.bind(null, deps, apiConfig),\n pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig),\n };\n}\n\nexport type * from \"./domain/attemptDeploy/index.js\";\nexport type * from \"./domain/generateSignedUrls/types.js\";\nexport type * from \"./domain/notifyTerminatedEphemeralEnvironment/types.js\";\nexport type * from \"./domain/pollCiGreenlight/types.js\";\n"]}
package/dist/index.d.cts CHANGED
@@ -63,26 +63,10 @@ type CiGreenlightBugData = {
63
63
  * The count of blocking bugs reproduced in the run.
64
64
  */
65
65
  blockingBugsCount: number;
66
- /**
67
- * The URLs of the blocking bugs.
68
- *
69
- * @deprecated This field will be removed in the next major version.
70
- * Prefer using `reproducedBugs` filtered by `isBlocking: true`, reading
71
- * the `applicationUrl` field.
72
- */
73
- blockingBugUrls: string[];
74
66
  /**
75
67
  * The count of non-blocking bugs reproduced in the run.
76
68
  */
77
69
  nonBlockingBugsCount: number;
78
- /**
79
- * The URLs of the non-blocking bugs.
80
- *
81
- * @deprecated This field will be removed in the next major version.
82
- * Prefer using `reproducedBugs` filtered by `isBlocking: false`, reading
83
- * the `applicationUrl` field.
84
- */
85
- nonBlockingBugUrls: string[];
86
70
  /**
87
71
  * Blocking bugs that were not reproduced in this run, but are still
88
72
  * opened in the run environment. This may happen when the run only covers a
@@ -91,15 +75,20 @@ type CiGreenlightBugData = {
91
75
  otherBlockingBugsInEnvironment: CiGreenlightBugDetails[];
92
76
  /**
93
77
  * Bugs that were reproduced in this run. This includes newly found bugs.
78
+ * Filter by `isBlocking` and read `applicationUrl` for blocking /
79
+ * non-blocking bug URLs.
94
80
  */
95
81
  reproducedBugs: CiGreenlightBugDetails[];
96
82
  };
83
+
97
84
  type CiGreenlightStatusBase = {
98
85
  relevantRunId: string;
99
86
  relevantRunUrl: string;
100
- relevantRunWithBugsUrl: string;
101
87
  rootRunId: string;
102
88
  rootRunUrl: string;
89
+ };
90
+ type CiGreenlightStatusExtended = {
91
+ relevantRunWithBugsUrl: string;
103
92
  workflowsDisabledAfterRunCount: number;
104
93
  workflowsInRunCount: number;
105
94
  workflowsUnderInvestigationCount: number;
@@ -111,13 +100,26 @@ type CiGreenlightStatusBase = {
111
100
  type CiGreenlightStatus = CiGreenlightStatusBase & (({
112
101
  greenlight: boolean;
113
102
  runStage: "completed";
114
- } & CiGreenlightBugData) | ({
103
+ } & CiGreenlightBugData & CiGreenlightStatusExtended) | ({
115
104
  greenlight: false;
116
105
  runStage: "underReview";
117
- } & CiGreenlightBugData) | {
106
+ } & CiGreenlightBugData & CiGreenlightStatusExtended) | ({
118
107
  greenlight: false;
119
- runStage: "initializing" | "underReview" | "canceled";
120
- });
108
+ runStage: "initializing";
109
+ } & Partial<CiGreenlightStatusExtended>) | ({
110
+ greenlight: false;
111
+ /**
112
+ * Human-readable copy explaining why the run was canceled, when the
113
+ * server provides it.
114
+ */
115
+ message?: string;
116
+ /**
117
+ * Stable, machine-readable code for why the run was canceled, when the
118
+ * server provides it. Treat as an open set of values.
119
+ */
120
+ reason?: string;
121
+ runStage: "canceled";
122
+ } & Partial<CiGreenlightStatusExtended>));
121
123
 
122
124
  type GenerateSignedUrlStatus = {
123
125
  fileLocation?: string;
@@ -142,10 +144,41 @@ type GenerateSignedUrlResponse = {
142
144
  success: boolean;
143
145
  };
144
146
 
147
+ type WireSuiteResult = {
148
+ created_suite_id: string;
149
+ trigger_id: string;
150
+ } | {
151
+ failure_reason: string;
152
+ trigger_id: string;
153
+ } | {
154
+ duplicate_suite_id: string;
155
+ skip_reason: string;
156
+ trigger_id: string;
157
+ };
158
+ type DeploySuccessWireResponse = {
159
+ environment: {
160
+ alias?: string;
161
+ id: string;
162
+ isStatic: boolean;
163
+ } | undefined;
164
+ results: WireSuiteResult[];
165
+ skipped_deployment?: {
166
+ message: string;
167
+ reason: string;
168
+ };
169
+ skipped_triggers?: {
170
+ environment_id: string;
171
+ message: string;
172
+ reason: string;
173
+ trigger_id: string;
174
+ }[];
175
+ };
176
+
145
177
  /**
146
178
  * Refer to our official documentation for more information:
147
179
  * https://qawolf.notion.site/dd72e46ceb7f451dae4e9ef06f64a2cc
148
180
  */
181
+
149
182
  type BaseDeployConfig = {
150
183
  branch: string | undefined;
151
184
  commitUrl: string | undefined;
@@ -177,19 +210,29 @@ type EphemeralDeployConfig = BaseDeployConfig & {
177
210
  };
178
211
  type DeployConfig = GitHubDeployConfig | GitLabDeployConfig | EphemeralDeployConfig;
179
212
  type DeploySuccessSuiteCreatedResult = {
180
- created_suite_id: string;
181
- trigger_id: string;
213
+ createdSuiteId: string;
214
+ triggerId: string;
182
215
  };
183
216
  type DeploySuccessSuiteCreationFailureResult = {
184
- failure_reason: string;
185
- trigger_id: string;
217
+ failureReason: string;
218
+ triggerId: string;
186
219
  };
187
220
  type DeploySuccessSuiteAlreadyExistsResult = {
188
- duplicate_suite_id: string;
189
- skip_reason: string;
190
- trigger_id: string;
221
+ duplicateSuiteId: string;
222
+ skipReason: string;
223
+ triggerId: string;
191
224
  };
192
225
  type DeploySuccessSuiteResult = DeploySuccessSuiteCreatedResult | DeploySuccessSuiteCreationFailureResult | DeploySuccessSuiteAlreadyExistsResult;
226
+ type DeploySuccessSkippedTrigger = {
227
+ environmentId: string;
228
+ message: string;
229
+ reason: string;
230
+ triggerId: string;
231
+ };
232
+ type DeploySuccessDeploymentSkipped = {
233
+ message: string;
234
+ reason: string;
235
+ };
193
236
  type DeployStatus = {
194
237
  environment: {
195
238
  alias?: string;
@@ -197,6 +240,8 @@ type DeployStatus = {
197
240
  isStatic: boolean;
198
241
  } | undefined;
199
242
  results: Array<DeploySuccessSuiteResult>;
243
+ skippedDeployment?: DeploySuccessDeploymentSkipped;
244
+ skippedTriggers?: DeploySuccessSkippedTrigger[];
200
245
  };
201
246
  type DeployStatusSuccessResponse = {
202
247
  data: DeployStatus;
@@ -209,7 +254,6 @@ type DeployStatusErrorResponse = {
209
254
  status: number | undefined;
210
255
  };
211
256
  type DeployStatusResponse = DeployStatusSuccessResponse | DeployStatusErrorResponse;
212
- type AttemptDeployFailedReason = "no-matched-trigger" | "no-environment" | "run-could-not-be-created" | "duplicate-suite";
213
257
  type AttemptDeployHttpAbortReason = "4XX-client-error" | "401-unauthorized" | "403-forbidden" | "5XX-server-error" | "network-error";
214
258
  type AttemptDeployNonHttpAbortReason = "network-error";
215
259
  type AttemptDeployAbortReason = AttemptDeployHttpAbortReason | AttemptDeployNonHttpAbortReason;
@@ -227,7 +271,29 @@ type NotifyDeployStatus = {
227
271
  */
228
272
  runId: string | undefined;
229
273
  } | {
230
- failReason: AttemptDeployFailedReason;
274
+ /**
275
+ * One or more triggers matched the deployment but could not run (e.g. the
276
+ * environment was still syncing). A precondition was not met, so this is a
277
+ * failure rather than a skip: retrying once the environment is ready may
278
+ * create a run.
279
+ */
280
+ failReason: "trigger-skipped";
281
+ outcome: "failed";
282
+ skippedTriggers: DeploySuccessSkippedTrigger[];
283
+ } | {
284
+ /**
285
+ * No trigger matched the deployment. This is deterministic given the
286
+ * current configuration (repeating the request with the same config
287
+ * yields the same result), so it is a skip rather than a failure, and the
288
+ * caller should not treat it as an error. `skippedDeployment` carries the
289
+ * server's reason when it provided one (undefined on older servers or the
290
+ * legacy arm); there is no separate SDK-level reason code, since
291
+ * `outcome: "skipped"` only ever means no trigger matched.
292
+ */
293
+ outcome: "skipped";
294
+ skippedDeployment: DeploySuccessDeploymentSkipped | undefined;
295
+ } | {
296
+ failReason: "no-environment" | "run-could-not-be-created";
231
297
  /**
232
298
  * A run could not be created.
233
299
  */
@@ -247,6 +313,9 @@ type NotifyDeployStatus = {
247
313
  */
248
314
  outcome: "aborted";
249
315
  };
316
+ type AttemptDeployFailedReason = Extract<NotifyDeployStatus, {
317
+ outcome: "failed";
318
+ }>["failReason"];
250
319
 
251
320
  type NotifyTerminatedEphemeralEnvironmentInput = {
252
321
  environmentId: string;
@@ -455,4 +524,4 @@ declare function makeQaWolfSdk({ apiKey, serviceBase, userAgent, }: {
455
524
  pollCiGreenlightStatus: (args_0: PollCiGreenlightParams) => Promise<PollCiGreenlightStatus>;
456
525
  };
457
526
 
458
- export { type AttemptDeployAbortReason, type AttemptDeployFailedReason, type AttemptDeployHttpAbortReason, type AttemptDeployNonHttpAbortReason, type CiGreenlightStatus, type CiGreenlightStatusBase, type DeployConfig, type DeployStatus, type DeployStatusErrorResponse, type DeployStatusResponse, type DeployStatusSuccessResponse, type DeploySuccessSuiteAlreadyExistsResult, type DeploySuccessSuiteCreatedResult, type DeploySuccessSuiteCreationFailureResult, type DeploySuccessSuiteResult, type EphemeralDeployConfig, type FetchDriver, type GenerateSignedUrlAbortReason$1 as GenerateSignedUrlAbortReason, type GenerateSignedUrlConfig, type GenerateSignedUrlResponse, type GenerateSignedUrlStatus, type GitHubDeployConfig, type GitLabDeployConfig, type MakePollCiGreenlightStatusIteratorParams, type NotifyDeployStatus, type NotifyTerminatedEphemeralEnvironmentAbortReason, type NotifyTerminatedEphemeralEnvironmentFailedReason, type NotifyTerminatedEphemeralEnvironmentHttpAbortReason, type NotifyTerminatedEphemeralEnvironmentInput, type NotifyTerminatedEphemeralEnvironmentNonHttpAbortReason, type NotifyTerminatedEphemeralEnvironmentResult, type PollCiGreenlightAbortReason, type PollCiGreenlightHttpAbortReason, type PollCiGreenlightIteration, type PollCiGreenlightIteratorHttpAborted, type PollCiGreenlightIteratorNonHttpAborted, type PollCiGreenlightNonHttpAbortReason, type PollCiGreenlightParams, type PollCiGreenlightPollConfig, type PollCiGreenlightStatus, type PollCiGreenlightStatusIteration, type SdkDependencies, type TerminatedEphemeralEnvironmentSuccessResult, attemptNotifyDeploy, makeQaWolfSdk };
527
+ export { type AttemptDeployAbortReason, type AttemptDeployFailedReason, type AttemptDeployHttpAbortReason, type AttemptDeployNonHttpAbortReason, type CiGreenlightStatus, type CiGreenlightStatusBase, type DeployConfig, type DeployStatus, type DeployStatusErrorResponse, type DeployStatusResponse, type DeployStatusSuccessResponse, type DeploySuccessDeploymentSkipped, type DeploySuccessSkippedTrigger, type DeploySuccessSuiteAlreadyExistsResult, type DeploySuccessSuiteCreatedResult, type DeploySuccessSuiteCreationFailureResult, type DeploySuccessSuiteResult, type DeploySuccessWireResponse, type EphemeralDeployConfig, type FetchDriver, type GenerateSignedUrlAbortReason$1 as GenerateSignedUrlAbortReason, type GenerateSignedUrlConfig, type GenerateSignedUrlResponse, type GenerateSignedUrlStatus, type GitHubDeployConfig, type GitLabDeployConfig, type MakePollCiGreenlightStatusIteratorParams, type NotifyDeployStatus, type NotifyTerminatedEphemeralEnvironmentAbortReason, type NotifyTerminatedEphemeralEnvironmentFailedReason, type NotifyTerminatedEphemeralEnvironmentHttpAbortReason, type NotifyTerminatedEphemeralEnvironmentInput, type NotifyTerminatedEphemeralEnvironmentNonHttpAbortReason, type NotifyTerminatedEphemeralEnvironmentResult, type PollCiGreenlightAbortReason, type PollCiGreenlightHttpAbortReason, type PollCiGreenlightIteration, type PollCiGreenlightIteratorHttpAborted, type PollCiGreenlightIteratorNonHttpAborted, type PollCiGreenlightNonHttpAbortReason, type PollCiGreenlightParams, type PollCiGreenlightPollConfig, type PollCiGreenlightStatus, type PollCiGreenlightStatusIteration, type SdkDependencies, type TerminatedEphemeralEnvironmentSuccessResult, attemptNotifyDeploy, makeQaWolfSdk };