@qawolf/ci-sdk 1.2.0 → 1.3.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.
package/README.md CHANGED
@@ -15,6 +15,7 @@ to determine the status of your CI/CD step/job/action.
15
15
  - [Notify Preview Deployment (Pull Request / Merge Request Testing)](#notify-preview)
16
16
  - [Poll for CI Greenlight Status](#ci-greenlight)
17
17
  - [Advanced: Poll with Custom Control (Iterator)](#ci-greenlight-iterator)
18
+ - [Notify a Terminated Ephemeral Environment](#notify-terminated-ephemeral-environment)
18
19
  - [Upload Run Input Artifacts](#upload-artifacts)
19
20
  - [Requirements](#requirements)
20
21
  - [Versioning](#versioning)
@@ -302,6 +303,53 @@ The iterator yields a discriminated union that can be either a status update or
302
303
 
303
304
  **Important**: Always check `iteration.isAborted` to determine which type of result you received. When `isAborted === true`, you should handle the abort reason and exit appropriately.
304
305
 
306
+ <a id="notify-terminated-ephemeral-environment"></a>
307
+
308
+ ## Notify a Terminated Ephemeral Environment
309
+
310
+ > ℹ️ [See the API documentation page for this endpoint](https://qawolf.notion.site/2c45b2a994fb8096a42af8d41c811ae2).
311
+
312
+ After you terminate an ephemeral environment or release it for something else to be installed in it, you should notify QA Wolf of that fact. When you notify us, we will stop all runs targeting that environment and check whether there are any changes to flows that need to be promoted to the static base environment. This eventually results in the environment showing as "closed" in QA Wolf.
313
+
314
+ > ⚠️ **Note**: If you have the QA Wolf GitHub integration enabled for your preview testing, GitHub will notify us of PRs being merged or closed, and we use that notification to stop runs and trigger flow promotion. In this case, it is typically redundant and unnecessary to call this..
315
+
316
+ > ⚠️ **Important**: PR/MR testing functionality must be activated by QA Wolf. Please reach out to your QA Wolf representative to enable this feature and help with the setup.
317
+
318
+ ```ts
319
+ import {
320
+ type NotifyTerminatedEphemeralEnvironmentInput,
321
+ makeQaWolfSdk,
322
+ } from "@qawolf/ci-sdk";
323
+
324
+ // Example for environmentId
325
+ const terminateConfig: NotifyTerminatedEphemeralEnvironmentInput = {
326
+ environmentId: "test-environment-id",
327
+ };
328
+
329
+ // Example for environmentAlias
330
+ const terminateConfig: NotifyTerminatedEphemeralEnvironmentInput = {
331
+ environmentAlias: "test-environment",
332
+ };
333
+
334
+ // Example for deploymentUrl
335
+ const terminateConfig: NotifyTerminatedEphemeralEnvironmentInput = {
336
+ deploymentUrl: "https://test-environment",
337
+ };
338
+
339
+ const { notifyTerminatedEphemeralEnvironment } = makeQaWolfSdk({
340
+ apiKey: "qawolf_xxxxx",
341
+ });
342
+
343
+ (async () => {
344
+ const result = await notifyTerminatedEphemeralEnvironment(terminateConfig);
345
+ if (result.outcome !== "success") {
346
+ // Fail the job.
347
+ process.exit(1);
348
+ }
349
+ const environmentId = result.environmentId;
350
+ })();
351
+ ```
352
+
305
353
  <a id="upload-artifacts"></a>
306
354
 
307
355
  ## Upload Run Input Artifacts
@@ -416,6 +464,10 @@ This package follows the [SemVer](https://semver.org/) versioning scheme. Additi
416
464
 
417
465
  # Changelog
418
466
 
467
+ ## v1.3.0
468
+
469
+ - New `notifyTerminatedEphemeralEnvironment` method
470
+
419
471
  ## v1.2.0
420
472
 
421
473
  - New `makePollCiGreenlightStatusIterator` async generator function for advanced polling control with custom early-exit logic
package/dist/index.cjs CHANGED
@@ -38,7 +38,7 @@ var defaultServiceBase = "https://app.qawolf.com/";
38
38
 
39
39
  // package.json
40
40
  var package_default = {
41
- version: "1.2.0"};
41
+ version: "1.3.0"};
42
42
 
43
43
  // src/lib/sdk/defaults/userAgent.ts
44
44
  var defaultUserAgent = `ci-sdk/${package_default.version}`;
@@ -105,7 +105,7 @@ async function attemptNotifyDeploy(deps, apiConfig, config) {
105
105
  if (!response.ok) return handleErrorResponse(response, log);
106
106
  const data = await response.json();
107
107
  return handleSuccessResponse(data, log);
108
- } catch (error) {
108
+ } catch {
109
109
  log.error(`\u{1F6AB} Network error from deploy_success, aborting.`);
110
110
  return {
111
111
  abortReason: "network-error",
@@ -229,7 +229,7 @@ async function callGenerateSignedUrlForRunInputsExecutablesStorage({ apiKey, ser
229
229
  httpStatus: response.status,
230
230
  success: false
231
231
  };
232
- } catch (e) {
232
+ } catch {
233
233
  return {
234
234
  errorMessage: "Network error, aborting request to generate signed URL",
235
235
  httpStatus: 0,
@@ -309,7 +309,7 @@ async function callGenerateSignedUrlForTempTeamStorage({ apiKey, serviceBase, us
309
309
  httpStatus: response.status,
310
310
  success: false
311
311
  };
312
- } catch (e) {
312
+ } catch {
313
313
  return {
314
314
  errorMessage: "Network error, aborting request to generate signed URL",
315
315
  httpStatus: 0,
@@ -358,6 +358,55 @@ async function generateSignedUrlForTempTeamStorage(deps, apiConfig, config) {
358
358
  }
359
359
  __name(generateSignedUrlForTempTeamStorage, "generateSignedUrlForTempTeamStorage");
360
360
 
361
+ // src/lib/sdk/domain/notifyTerminatedEphemeralEnvironment/index.ts
362
+ var notifyTerminatedEphemeralEnvironment = /* @__PURE__ */ __name(async (deps, apiConfig, config) => {
363
+ const { fetch: localFetch, log } = deps;
364
+ try {
365
+ const response = await localFetch(new URL("/api/webhooks/environment_terminated", apiConfig.serviceBase), {
366
+ body: JSON.stringify(config),
367
+ headers: {
368
+ Authorization: `Bearer ${apiConfig.apiKey}`,
369
+ "Content-Type": "application/json",
370
+ "User-Agent": apiConfig.userAgent
371
+ },
372
+ method: "POST"
373
+ });
374
+ if (!response.ok) return handleErrorResponse2(response, log);
375
+ const { environmentId } = await response.json();
376
+ return {
377
+ environmentId,
378
+ outcome: "success"
379
+ };
380
+ } catch {
381
+ log.error(`\u{1F6AB} Network error from terminate_preview_environment, aborting.`);
382
+ return {
383
+ abortReason: "network-error",
384
+ outcome: "aborted"
385
+ };
386
+ }
387
+ }, "notifyTerminatedEphemeralEnvironment");
388
+ async function handleErrorResponse2(response, log) {
389
+ const status = response.status;
390
+ let abortReason;
391
+ if (status === void 0) abortReason = "network-error";
392
+ else if (status === 401) abortReason = "401-unauthorized";
393
+ else if (status === 403) abortReason = "403-forbidden";
394
+ else if (status === 409) abortReason = "409-conflict";
395
+ else if (status >= 500) abortReason = "5XX-server-error";
396
+ else abortReason = "4XX-client-error";
397
+ await logFetchError({
398
+ log,
399
+ methodName: "notifyTerminatedEphemeralEnvironment",
400
+ response
401
+ });
402
+ return {
403
+ abortReason,
404
+ httpStatus: status,
405
+ outcome: "aborted"
406
+ };
407
+ }
408
+ __name(handleErrorResponse2, "handleErrorResponse");
409
+
361
410
  // src/lib/sdk/domain/pollCiGreenlight/buildCompletedRunResult.ts
362
411
  function buildCompletedRunResult(status) {
363
412
  if (status.greenlight) return {
@@ -425,7 +474,7 @@ async function fetchCiGreenlightStatus({ apiKey, serviceBase, userAgent }, { run
425
474
  httpStatus: resp.status,
426
475
  ok: false
427
476
  };
428
- } catch (e) {
477
+ } catch {
429
478
  return {
430
479
  canRetry: true,
431
480
  errorType: "network",
@@ -751,6 +800,7 @@ We recommend 'undici' package for that purpose. See the Requirement section of o
751
800
  generateSignedUrlForRunInputsExecutablesStorage: generateSignedUrlForRunInputsExecutablesStorage.bind(null, deps, apiConfig),
752
801
  generateSignedUrlForTempTeamStorage: generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),
753
802
  makePollCiGreenlightStatusIterator: makePollCiGreenlightStatusIterator.bind(null, deps, apiConfig),
803
+ notifyTerminatedEphemeralEnvironment: notifyTerminatedEphemeralEnvironment.bind(null, deps, apiConfig),
754
804
  pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig)
755
805
  };
756
806
  }
@@ -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/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","timeout","args","signal","AbortSignal","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","e","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","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","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, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\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.2.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\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx\",\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.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.3.5\"\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 },\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 (error) {\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 (e) {\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 (e) {\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 { 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 (e) {\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 { 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 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/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/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","timeout","args","signal","AbortSignal","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":";;;;;;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,2BACVC,KAAAA,EAAoBC,OAAAA,KACrB,UAAUC,IAAAA,KACRF,KAAAA,CAAME,IAAAA,CAAK,CAAA,CAAA,EAAI;AAAE,EAAA,GAAGA,KAAK,CAAA,CAAA;EAAIC,MAAAA,EAAQC,WAAAA,CAAYH,QAAQA,OAAAA;AAAS,CAAA,CAAA,EAFpE,uBAAA,CAAA;;;ACnBK,IAAMI,eAAeC,UAAAA,CAAWN,KAAAA;;;ACEhC,IAAMO,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,OAyCb,CAAA;;;ACzCO,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;;;ACStB,eAAsBe,mBAAAA,CACpBC,IAAAA,EACAC,SAAAA,EACAC,MAAAA,EAA6B;AAE7B,EAAA,MAAM,EAAEpC,KAAAA,EAAOqC,UAAAA,EAAYzB,GAAAA,EAAG,GAAKsB,IAAAA;AACnC,EAAA,IAAI;AACF,IAAA,MAAMd,QAAAA,GAAW,MAAMiB,UAAAA,CACrB,IAAIC,IAAI,8BAAA,EAAgCH,SAAAA,CAAUI,WAAW,CAAA,EAC7D;AACEf,MAAAA,IAAAA,EAAMgB,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,GACP5B,KAAAA,CAAAA;AACN6B,UAAAA,mBAAAA,EACErB,MAAAA,CAAOkB,cAAAA,KAAmB,QAAA,GACtBlB,MAAAA,CAAOsB,iBAAAA,GACP9B,KAAAA,CAAAA;AACN+B,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;KACV,CAAA;AAGF,IAAA,IAAI,CAAC9C,QAAAA,CAASC,EAAAA,EAAI,OAAO8C,mBAAAA,CAAoB/C,UAAUR,GAAAA,CAAAA;AACvD,IAAA,MAAMwD,IAAAA,GAAQ,MAAMhD,QAAAA,CAASK,IAAAA,EAAI;AACjC,IAAA,OAAO4C,qBAAAA,CAAsBD,MAAMxD,GAAAA,CAAAA;EACrC,CAAA,CAAA,MAAQ;AACNA,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,sDAAA,CAAiD,CAAA;AAC3D,IAAA,OAAO;MACL8D,WAAAA,EAAa,eAAA;MACbC,UAAAA,EAAY3C,MAAAA;MACZ4C,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AACF;AAvDsBvC,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAyDtB,eAAekC,mBAAAA,CACb/C,UACAR,GAAAA,EAAc;AAEd,EAAA,MAAMoB,SAASZ,QAAAA,CAASY,MAAAA;AACxB,EAAA,IAAIsC,WAAAA;AACJ,EAAA,IAAItC,MAAAA,KAAWJ,QAAW0C,WAAAA,GAAc,eAAA;AAC/BtC,OAAAA,IAAAA,MAAAA,KAAW,KAAKsC,WAAAA,GAAc,kBAAA;AAC9BtC,OAAAA,IAAAA,MAAAA,KAAW,KAAKsC,WAAAA,GAAc,eAAA;AAC9BtC,OAAAA,IAAAA,MAAAA,IAAU,KAAKsC,WAAAA,GAAc,kBAAA;OACjCA,WAAAA,GAAc,kBAAA;AACnB,EAAA,MAAMpD,aAAAA,CAAc;AAClBN,IAAAA,GAAAA;IACAO,UAAAA,EAAY,qBAAA;AACZC,IAAAA;GACF,CAAA;AACA,EAAA,OAAO;AACLkD,IAAAA,WAAAA;IACAC,UAAAA,EAAYvC,MAAAA;IACZwC,OAAAA,EAAS;AACX,GAAA;AACF;AArBeL,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAuBf,eAAeE,qBAAAA,CACbD,MACAxD,GAAAA,EAAc;AAEd,EAAA,MAAM,EAAE6D,WAAAA,EAAaC,OAAAA,EAAO,GAAKN,IAAAA;AACjC,EAAA,MAAMO,mBAAAA,GAAsBF,WAAAA,IAAe,CAACA,WAAAA,CAAYG,QAAAA;AAExD,EAAA,IAAIH,WAAAA,EAAa;AACf,IAAA,MAAMI,SAAAA,GAAYJ,WAAAA,CAAYG,QAAAA,GAC1B,oBAAA,GACA,qBAAA;AACJhE,IAAAA,GAAAA,CAAID,IAAAA,CAAK,GAAGkE,SAAAA,CAAAA,EAAAA,EAAcJ,YAAYK,KAAK,CAAA,MAAA,EAASL,WAAAA,CAAYM,EAAE,CAAA,CAAA,CAAG,CAAA;AACvE,EAAA;AAGA,EAAA,IAAIL,OAAAA,CAAQM,WAAW,CAAA,EAAG;AACxB,IAAA,IAAIL,mBAAAA,EAAqB;AACvB/D,MAAAA,GAAAA,CAAID,KACF,CAAA,sFAAA,CAAmF,CAAA;AAErF,MAAA,OAAO;AACLsE,QAAAA,aAAAA,EAAeR,WAAAA,CAAYM,EAAAA;QAC3BP,OAAAA,EAAS,SAAA;QACTU,KAAAA,EAAOtD;AACT,OAAA;AACF,IAAA;AACAhB,IAAAA,GAAAA,CAAIJ,MACF,CAAA,4IAAA,CAAuI,CAAA;AAEzI,IAAA,OAAO;MAAE2E,UAAAA,EAAY,oBAAA;MAAsBX,OAAAA,EAAS;AAAS,KAAA;AAC/D,EAAA;AAGA,EAAA,IAAI,CAACC,WAAAA,EAAa;AAChB7D,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,qEAAA,CAAgE,CAAA;AAC1E,IAAA,OAAO;MAAE2E,UAAAA,EAAY,gBAAA;MAAkBX,OAAAA,EAAS;AAAS,KAAA;AAC3D,EAAA;AAEA,EAAA,MAAMY,gBAAgBV,OAAAA,CAAQW,IAAAA,CAAK,CAACC,CAAAA,KAAM,oBAAoBA,CAAAA,CAAAA;AAC9D,EAAA,IAAIF,aAAAA,EAAe;AACjBxE,IAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,6CAAA,EAAyC4E,aAAAA,CAAcG,cAAc,CAAA,0BAAA,CAA4B,CAAA;AAEnG,IAAA,OAAO;MAAEJ,UAAAA,EAAY,0BAAA;MAA4BX,OAAAA,EAAS;AAAS,KAAA;AACrE,EAAA;AAEA,EAAA,MAAMgB,iBAAiBd,OAAAA,CAAQW,IAAAA,CAAK,CAACC,CAAAA,KAAM,wBAAwBA,CAAAA,CAAAA;AACnE,EAAA,IAAIE,cAAAA,EAAgB;AAClB5E,IAAAA,GAAAA,CAAID,IAAAA,CACF,CAAA,gEAAA,EAA8D6E,cAAAA,CAAeC,kBAAkB,CAAA,oCAAA,CAAsC,CAAA;AAEvI,IAAA,OAAO;AACLR,MAAAA,aAAAA,EAAeR,WAAAA,CAAYM,EAAAA;MAC3BP,OAAAA,EAAS,SAAA;AACTU,MAAAA,KAAAA,EAAOM,cAAAA,CAAeC;AACxB,KAAA;AACF,EAAA;AAEA,EAAA,MAAMC,oBAAoBhB,OAAAA,CAAQW,IAAAA,CAAK,CAACC,CAAAA,KAAM,sBAAsBA,CAAAA,CAAAA;AACpE,EAAA,IAAI,CAACI,iBAAAA,EAAmB;AACtB9E,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,iEAAA,CAA4D,CAAA;AACtE,IAAA,OAAO;MAAE2E,UAAAA,EAAY,oBAAA;MAAsBX,OAAAA,EAAS;AAAS,KAAA;AAC/D,EAAA;AACA5D,EAAAA,GAAAA,CAAID,IAAAA,CACF,CAAA,oEAAA,EAAkE+E,iBAAAA,CAAkBC,gBAAgB,CAAA,CAAE,CAAA;AAExG,EAAA,OAAO;AACLV,IAAAA,aAAAA,EAAeR,WAAAA,CAAYM,EAAAA;IAC3BP,OAAAA,EAAS,SAAA;AACTU,IAAAA,KAAAA,EAAOQ,iBAAAA,CAAkBC;AAC3B,GAAA;AACF;AAvEetB,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;;;AClFf,eAAsBuB,mDAAAA,CACpB,EAAE5B,MAAAA,EAAQzB,WAAAA,EAAa0B,SAAAA,EAAS,EAChC,EAAE4B,mBAAAA,EAAmB,EACrB,EAAE7F,KAAAA,EAAOqC,UAAAA,EAAYzB,KAAG,EAAmB;AAE3C,EAAA,IAAI;AACF,IAAA,MAAMQ,QAAAA,GAAW,MAAMiB,UAAAA,CACrB,IAAIC,GAAAA,CACF,CAAA,EAAGC,WAAAA,CAAAA,gDAAAA,EAA8DuD,kBAAAA,CAAmBD,mBAAAA,CAAAA,CAAAA,CAAsB,CAAA,EAE5G;MACE/B,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,IAAI9C,QAAAA,CAASY,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAMP,IAAAA,GACH,MAAML,QAAAA,CAASK,IAAAA,EAAI;AACtB,MAAA,OAAO;AACLsE,QAAAA,YAAAA,EAActE,IAAAA,CAAKsE,YAAAA;AACnBxB,QAAAA,UAAAA,EAAYnD,QAAAA,CAASY,MAAAA;AACrBgE,QAAAA,sBAAAA,EAAwBvE,IAAAA,CAAKuE,sBAAAA;AAC7BC,QAAAA,SAAAA,EAAWxE,IAAAA,CAAKwE,SAAAA;QAChBC,OAAAA,EAAS;AACX,OAAA;AACF,IAAA;AACA,IAAA,MAAMhF,aAAAA,CAAc;AAClBN,MAAAA,GAAAA;MACAO,UAAAA,EAAY,qDAAA;AACZC,MAAAA;KACF,CAAA;AACA,IAAA,OAAO;MACL+E,YAAAA,EAAc,MAAM/E,SAASO,IAAAA,EAAI;AACjC4C,MAAAA,UAAAA,EAAYnD,QAAAA,CAASY,MAAAA;MACrBkE,OAAAA,EAAS;AACX,KAAA;EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;MACLC,YAAAA,EAAc,wDAAA;MACd5B,UAAAA,EAAY,CAAA;MACZ2B,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AACF;AAhDsBN,MAAAA,CAAAA,mDAAAA,EAAAA,qDAAAA,CAAAA;;;ACCtB,eAAsBQ,+CAAAA,CACpBlE,IAAAA,EACAC,SAAAA,EACAC,MAAAA,EAA+B;AAE/B,EAAA,MAAM,EAAExB,KAAG,GAAKsB,IAAAA;AAEhB,EAAA,IAAI,CAACE,OAAOyD,mBAAAA,EAAqB;AAC/BjF,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,4DAAA,CAAuD,CAAA;AACjE,IAAA,OAAO;MACL8D,WAAAA,EAAa,gCAAA;MACb4B,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AAEA,EAAA,MAAMG,aAAAA,GACJ,MAAMT,mDAAAA,CACJzD,SAAAA,EACAC,QACAF,IAAAA,CAAAA;AAEJ,EAAA,IAAI,CAACmE,cAAcH,OAAAA,EAAS;AAC1B,IAAA,IAAI5B,WAAAA,GAA4C,qBAAA;AAEhD,IAAA,IAAI+B,aAAAA,CAAc9B,cAAc,GAAA,EAAK;AACnCD,MAAAA,WAAAA,GAAc,kBAAA;AACd1D,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkC6F,aAAAA,CAAc9B,UAAU,CAAA,8CAAA,CAAgD,CAAA;IAE9G,CAAA,MAAO;AACL,MAAA,IAAI8B,aAAAA,CAAc9B,UAAAA,KAAe,GAAA,EAAKD,WAAAA,GAAc,qBAAA;eAC3C+B,aAAAA,CAAc9B,UAAAA,KAAe,KACpCD,WAAAA,GAAc,yBAAA;eACP+B,aAAAA,CAAc9B,UAAAA,KAAe,KAAKD,WAAAA,GAAc,eAAA;eAChD+B,aAAAA,CAAc9B,UAAAA,KAAe,GACpCD,WAAAA,GAAc,sBAAA;AAEhB1D,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkC6F,aAAAA,CAAc9B,UAAU,CAAA,qCAAA,EAAwC8B,aAAAA,CAAcF,YAAAA,GAAe,CAAA,EAAGE,aAAAA,CAAcF,YAAY,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA,UAAA,CAAc,CAAA;AAEpL,IAAA;AAEA,IAAA,OAAO;AACL7B,MAAAA,WAAAA;AACAC,MAAAA,UAAAA,EAAY8B,aAAAA,CAAc9B,UAAAA;MAC1B2B,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AAEAtF,EAAAA,GAAAA,CAAID,IAAAA,CAAK,CAAA,oCAAA,EAAkC0F,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,EAAEvC,MAAAA,EAAQzB,WAAAA,EAAa0B,SAAAA,EAAS,EAChC,EAAE4B,mBAAAA,EAAmB,EACrB,EAAE7F,KAAAA,EAAOqC,UAAAA,EAAYzB,KAAG,EAAmB;AAE3C,EAAA,IAAI;AACF,IAAA,MAAMQ,QAAAA,GAAW,MAAMiB,UAAAA,CACrB,IAAIC,GAAAA,CACF,GAAGC,WAAAA,CAAAA,qCAAAA,EAAmDsD,mBAAAA,CAAAA,CAAqB,CAAA,EAE7E;MACE/B,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,IAAI9C,QAAAA,CAASY,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAMP,IAAAA,GACH,MAAML,QAAAA,CAASK,IAAAA,EAAI;AACtB,MAAA,OAAO;AACLsE,QAAAA,YAAAA,EAActE,IAAAA,CAAKsE,YAAAA;AACnBxB,QAAAA,UAAAA,EAAYnD,QAAAA,CAASY,MAAAA;AACrBgE,QAAAA,sBAAAA,EAAwBvE,IAAAA,CAAKuE,sBAAAA;AAC7BC,QAAAA,SAAAA,EAAWxE,IAAAA,CAAKwE,SAAAA;QAChBC,OAAAA,EAAS;AACX,OAAA;AACF,IAAA;AACA,IAAA,MAAMhF,aAAAA,CAAc;AAClBN,MAAAA,GAAAA;MACAO,UAAAA,EAAY,yCAAA;AACZC,MAAAA;KACF,CAAA;AACA,IAAA,OAAO;MACL+E,YAAAA,EAAc,MAAM/E,SAASO,IAAAA,EAAI;AACjC4C,MAAAA,UAAAA,EAAYnD,QAAAA,CAASY,MAAAA;MACrBkE,OAAAA,EAAS;AACX,KAAA;EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;MACLC,YAAAA,EAAc,wDAAA;MACd5B,UAAAA,EAAY,CAAA;MACZ2B,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AACF;AAhDsBK,MAAAA,CAAAA,uCAAAA,EAAAA,yCAAAA,CAAAA;;;ACmBtB,eAAsBC,mCAAAA,CACpBtE,IAAAA,EACAC,SAAAA,EACAC,MAAAA,EAA+B;AAE/B,EAAA,MAAM,EAAExB,KAAG,GAAKsB,IAAAA;AAEhB,EAAA,IAAI,CAACE,OAAOyD,mBAAAA,EAAqB;AAC/BjF,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,4DAAA,CAAuD,CAAA;AACjE,IAAA,OAAO;MACL8D,WAAAA,EAAa,gCAAA;MACb4B,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AAEA,EAAA,MAAMG,aAAAA,GAAgB,MAAME,uCAAAA,CAC1BpE,SAAAA,EACAC,QACAF,IAAAA,CAAAA;AAEF,EAAA,IAAI,CAACmE,cAAcH,OAAAA,EAAS;AAC1B,IAAA,IAAI5B,WAAAA,GAA4C,qBAAA;AAEhD,IAAA,IAAI+B,aAAAA,CAAc9B,cAAc,GAAA,EAAK;AACnCD,MAAAA,WAAAA,GAAc,kBAAA;AACd1D,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkC6F,aAAAA,CAAc9B,UAAU,CAAA,8CAAA,CAAgD,CAAA;IAE9G,CAAA,MAAO;AACL,MAAA,IAAI8B,aAAAA,CAAc9B,UAAAA,KAAe,GAAA,EAAKD,WAAAA,GAAc,qBAAA;eAC3C+B,aAAAA,CAAc9B,UAAAA,KAAe,KACpCD,WAAAA,GAAc,yBAAA;eACP+B,aAAAA,CAAc9B,UAAAA,KAAe,KAAKD,WAAAA,GAAc,eAAA;eAChD+B,aAAAA,CAAc9B,UAAAA,KAAe,GACpCD,WAAAA,GAAc,sBAAA;AAEhB1D,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkC6F,aAAAA,CAAc9B,UAAU,CAAA,qCAAA,EAAwC8B,aAAAA,CAAcF,YAAAA,GAAe,CAAA,EAAGE,aAAAA,CAAcF,YAAY,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA,UAAA,CAAc,CAAA;AAEpL,IAAA;AAEA,IAAA,OAAO;AACL7B,MAAAA,WAAAA;AACAC,MAAAA,UAAAA,EAAY8B,aAAAA,CAAc9B,UAAAA;MAC1B2B,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AAEAtF,EAAAA,GAAAA,CAAID,IAAAA,CAAK,CAAA,oCAAA,EAAkC0F,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,OAClDvE,IAAAA,EACAC,SAAAA,EACAC,MAAAA,KAAAA;AAEA,EAAA,MAAM,EAAEpC,KAAAA,EAAOqC,UAAAA,EAAYzB,GAAAA,EAAG,GAAKsB,IAAAA;AACnC,EAAA,IAAI;AACF,IAAA,MAAMd,QAAAA,GAAW,MAAMiB,UAAAA,CACrB,IAAIC,IAAI,sCAAA,EAAwCH,SAAAA,CAAUI,WAAW,CAAA,EACrE;MACEf,IAAAA,EAAMgB,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,CAAC9C,QAAAA,CAASC,EAAAA,EAAI,OAAO8C,oBAAAA,CAAoB/C,UAAUR,GAAAA,CAAAA;AACvD,IAAA,MAAM,EAAEqE,aAAAA,EAAa,GAClB,MAAM7D,SAASK,IAAAA,EAAI;AACtB,IAAA,OAAO;AAAEwD,MAAAA,aAAAA;MAAeT,OAAAA,EAAS;AAAU,KAAA;EAC7C,CAAA,CAAA,MAAQ;AACN5D,IAAAA,GAAAA,CAAIJ,MAAM,CAAA,qEAAA,CAAgE,CAAA;AAC1E,IAAA,OAAO;MACL8D,WAAAA,EAAa,eAAA;MACbE,OAAAA,EAAS;AACX,KAAA;AACF,EAAA;AACF,CAAA,EA9BoD,sCAAA,CAAA;AAgCpD,eAAeL,oBAAAA,CACb/C,UACAR,GAAAA,EAAc;AAEd,EAAA,MAAMoB,SAASZ,QAAAA,CAASY,MAAAA;AACxB,EAAA,IAAIsC,WAAAA;AACJ,EAAA,IAAItC,MAAAA,KAAWJ,QAAW0C,WAAAA,GAAc,eAAA;AAC/BtC,OAAAA,IAAAA,MAAAA,KAAW,KAAKsC,WAAAA,GAAc,kBAAA;AAC9BtC,OAAAA,IAAAA,MAAAA,KAAW,KAAKsC,WAAAA,GAAc,eAAA;AAC9BtC,OAAAA,IAAAA,MAAAA,KAAW,KAAKsC,WAAAA,GAAc,cAAA;AAC9BtC,OAAAA,IAAAA,MAAAA,IAAU,KAAKsC,WAAAA,GAAc,kBAAA;OACjCA,WAAAA,GAAc,kBAAA;AACnB,EAAA,MAAMpD,aAAAA,CAAc;AAClBN,IAAAA,GAAAA;IACAO,UAAAA,EAAY,sCAAA;AACZC,IAAAA;GACF,CAAA;AACA,EAAA,OAAO;AACLkD,IAAAA,WAAAA;IACAC,UAAAA,EAAYvC,MAAAA;IACZwC,OAAAA,EAAS;AACX,GAAA;AACF;AAtBeL,MAAAA,CAAAA,oBAAAA,EAAAA,qBAAAA,CAAAA;;;ACpCR,SAASuC,wBACd1E,MAAAA,EAA8D;AAE9D,EAAA,IAAIA,MAAAA,CAAO2E,YACT,OAAO;IAAEC,gBAAAA,EAAkB5E,MAAAA;IAAQwC,OAAAA,EAAS;AAAU,GAAA;OACnD,OAAO;IAAEoC,gBAAAA,EAAkB5E,MAAAA;IAAQwC,OAAAA,EAAS;AAAS,GAAA;AAC5D;AANgBkC,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;;;ACgHA,eAAsBC,uBAAAA,CACpB,EAAEpD,MAAAA,EAAQzB,WAAAA,EAAa0B,SAAAA,EAAS,EAChC,EACEiB,KAAAA,EAAK,EAIP,EAAElF,KAAAA,EAAOqC,UAAAA,EAAYzB,KAAG,EAAmB;AAE3C,EAAA,IAAI;AACF,IAAA,MAAMyG,IAAAA,GAAO,MAAMhF,UAAAA,CACjB,IAAIC,GAAAA,CACF,CAAA,sBAAA,EAAyBwD,kBAAAA,CAAmBZ,KAAAA,CAAAA,CAAAA,CAAAA,EAC5C3C,WAAAA,CAAAA,EAEF;MACEuB,OAAAA,EAAS;AACPC,QAAAA,aAAAA,EAAe,UAAUC,MAAAA,CAAAA,CAAAA;QACzB,YAAA,EAAcC;AAChB;KACF,CAAA;AAGF,IAAA,IAAIoD,KAAKhG,EAAAA,EAAI;AACX,MAAA,MAAMuF,gBAAAA,GAAoB,MAAMS,IAAAA,CAAK5F,IAAAA,EAAI;AACzC,MAAA,OAAO;AACLmF,QAAAA,gBAAAA;AACArC,QAAAA,UAAAA,EAAY8C,IAAAA,CAAKrF,MAAAA;QACjBX,EAAAA,EAAI;AACN,OAAA;AACF,IAAA;AACA,IAAA,MAAMH,aAAAA,CAAc;AAClBN,MAAAA,GAAAA;MACAO,UAAAA,EAAY,yBAAA;MACZC,QAAAA,EAAUiG;KACZ,CAAA;AACA,IAAA,IAAIA,IAAAA,CAAKrF,WAAW,GAAA,EAAK;AACvB,MAAA,OAAO;QACLsF,QAAAA,EAAU,IAAA;QACVC,SAAAA,EAAW,WAAA;AACXhD,QAAAA,UAAAA,EAAY8C,IAAAA,CAAKrF,MAAAA;QACjBX,EAAAA,EAAI;AACN,OAAA;AACF,IAAA;AACA,IAAA,IAAIgG,IAAAA,CAAKrF,UAAU,GAAA,EAAK;AACtB,MAAA,OAAO;QACLsF,QAAAA,EAAU,IAAA;QACVC,SAAAA,EAAW,QAAA;AACXhD,QAAAA,UAAAA,EAAY8C,IAAAA,CAAKrF,MAAAA;QACjBX,EAAAA,EAAI;AACN,OAAA;AACF,IAAA;AACA,IAAA,OAAO;MACLiG,QAAAA,EAAU,KAAA;MACVC,SAAAA,EAAW,QAAA;AACXhD,MAAAA,UAAAA,EAAY8C,IAAAA,CAAKrF,MAAAA;MACjBX,EAAAA,EAAI;AACN,KAAA;EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;MACLiG,QAAAA,EAAU,IAAA;MACVC,SAAAA,EAAW,SAAA;MACXhD,UAAAA,EAAY,CAAA;MACZlD,EAAAA,EAAI;AACN,KAAA;AACF,EAAA;AACF;AAlEsB+F,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;;;AC3EtB,gBAAuBI,mCACrBtF,IAAAA,EACAC,SAAAA,EACA,EAAE+C,KAAAA,EAAO,GAAGuC,YAAAA,EAAsD;AAElE,EAAA,MAAM,EAAE7G,KAAG,GAAKsB,IAAAA;AAEhB,EAAA,MAAM,EACJ6E,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,GAAiD/F,MAAAA;AACrD,EAAA,MAAMgG,SAAAA,GAAYC,KAAKC,GAAAA,EAAG;AAE1B,EAAA,OAAOD,IAAAA,CAAKC,GAAAA,EAAG,GAAKF,SAAAA,IAAaZ,WAAAA,EAAa;AAC5C,IAAA,MAAMX,aAAAA,GAAgB,MAAMe,uBAAAA,CAC1BjF,SAAAA,EACA;AAAE+C,MAAAA;AAAM,KAAA,EACRhD,IAAAA,CAAAA;AAGF,IAAA,MAAM6F,SAAAA,GAAYF,IAAAA,CAAKC,GAAAA,EAAG,GAAKF,SAAAA;AAE/B,IAAA,IAAI,CAACvB,aAAAA,CAAchF,EAAAA,IAAM,CAACgF,cAAciB,QAAAA,EAAU;AAChD,MAAA,MAAM;QACJhD,WAAAA,EAAa,kBAAA;AACbyD,QAAAA,SAAAA;AACAxD,QAAAA,UAAAA,EAAY8B,aAAAA,CAAc9B,UAAAA;QAC1ByD,SAAAA,EAAW;AACb,OAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA,IAAI,CAAC3B,cAAchF,EAAAA,EAAI;AACrBqG,MAAAA,OAAAA,IAAW,CAAA;AACX,MAAA,MAAM,EAAEH,SAAAA,EAAWhD,UAAAA,EAAU,GAAK8B,aAAAA;AAClC,MAAA,IAAIqB,UAAUX,UAAAA,EAAY;AACxB,QAAA,QAAQQ,SAAAA;UACN,KAAK,SAAA;AACH,YAAA,MAAM;cACJjD,WAAAA,EAAa,eAAA;AACbyD,cAAAA,SAAAA;cACAxD,UAAAA,EAAY3C,MAAAA;cACZoG,SAAAA,EAAW;AACb,aAAA;AACA,YAAA;UACF,KAAK,WAAA;AACH,YAAA,MAAM;cACJ1D,WAAAA,EAAa,mBAAA;AACbyD,cAAAA,SAAAA;AACAxD,cAAAA,UAAAA,EAAYA,UAAAA,IAAc,GAAA;cAC1ByD,SAAAA,EAAW;AACb,aAAA;AACA,YAAA;UACF,KAAK,QAAA;AACH,YAAA,MAAM;cACJ1D,WAAAA,EAAa,kBAAA;AACbyD,cAAAA,SAAAA;AACAxD,cAAAA,UAAAA,EAAYA,UAAAA,IAAc,GAAA;cAC1ByD,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,EACjB3D,UAAAA,GAAa,CAAA,SAAA,EAAYA,UAAAA,MAAgB,EAAA,CAAA,qBAAA,EACnBmD,OAAAA,CAAAA,CAAAA,EAAWX,UAAAA,CAAAA,CAAAA,CAAAA;AAEnC,MAAA,IAAIQ,cAAc,SAAA,EAAW3G,GAAAA,CAAIC,IAAAA,CAAK,CAAA,oBAAA,EAAkBqH,UAAAA,CAAAA,CAAY,CAAA;AAC3DX,WAAAA,IAAAA,SAAAA,KAAc,WAAA,EACrB3G,GAAAA,CAAID,IAAAA,CAAK,CAAA,oBAAA,EAAkBuH,UAAAA,CAAAA,CAAY,CAAA;AAChCX,WAAAA,IAAAA,SAAAA,KAAc,QAAA,EAAU3G,GAAAA,CAAIC,IAAAA,CAAK,CAAA,mBAAA,EAAiBqH,UAAAA,CAAAA,CAAY,CAAA;AAEvE,MAAA,MAAM1I,MAAMyH,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;MACAnG,MAAAA,EAAQ4E;AACV,KAAA;AAGAe,IAAAA,cAAAA,GAAiBf,gBAAAA;AAEjB,IAAA,QAAQA,iBAAiBwB,QAAAA;AACvB,MAAA,KAAK,UAAA,EAAY;AACf,QAAA,MAAM;UACJ9D,WAAAA,EAAa,cAAA;AACbyD,UAAAA,SAAAA;UACAxD,UAAAA,EAAY3C,MAAAA;UACZoG,SAAAA,EAAW;AACb,SAAA;AACA,QAAA;AACF,MAAA;MACA,KAAK,WAAA;AACH,QAAA;MACF,KAAK,cAAA;AACH,QAAA,MAAMxI,MAAM0H,qBAAAA,CAAAA;AACZ,QAAA;MACF,KAAK,aAAA;AACH,QAAA,MAAM1H,MAAM2H,sBAAAA,CAAAA;AACZ,QAAA;AACF,MAAA;AACE,QAAA,MAAMc,KAAAA,CACJ,CAAA,sBAAA,EAAyBrB,gBAAAA,CAAAA,CAAkC,CAAA;AAEjE;AACF,EAAA;AAGA,EAAA,MAAM;IACJtC,WAAAA,EAAa,gBAAA;IACbyD,SAAAA,EAAWF,IAAAA,CAAKC,KAAG,GAAKF,SAAAA;IACxBrD,UAAAA,EAAY3C,MAAAA;IACZoG,SAAAA,EAAW;AACb,GAAA;AACA,EAAA;AACF;AA/IuBR,MAAAA,CAAAA,kCAAAA,EAAAA,oCAAAA,CAAAA;;;AC7ChB,SAASc,uBACdtG,MAAAA,EAA8D;AAE9D,EAAA,MAAM,EAAEuG,oBAAAA,EAAsBC,cAAAA,EAAc,GAAKxG,MAAAA;AACjD,EAAA,MAAMyG,OAAAA,GAAU,OAAOD,cAAAA,CAAAA,CAAAA;AAEvB,EAAA,OAAO,CAAA,4CAAA,EACLD,oBAAAA,GAAuB,CAAA,GACnB,CAAA,KAAA,EAAQA,oBAAAA,oBAAwC1I,SAAAA,CAC9C0I,oBAAAA,CAAAA,CAAAA,MAAAA,CAAAA,GAEF,EAAA,CAAA;EACAE,OAAAA,CAAAA,CAAAA;AACR;AAbgBH,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;AAkBT,SAASI,sBACd1G,MAAAA,EAA8D;AAE9D,EAAA,MAAM,EACJ2G,iBAAAA,EACAC,eAAAA,GAAkB,EAAA,EAClBL,sBACAM,kBAAAA,GAAqB,EAAA,EACrBC,sBAAAA,EAAsB,GACpB9G,MAAAA;AAEJ,EAAA,MAAM+G,eAAAA,GAAkBH,eAAAA,CAAgBI,GAAAA,CAAI,CAACC,GAAAA,KAAQ;SAAOA,GAAAA,CAAAA,CAAK,CAAA,CAAEC,IAAAA,CAAK,EAAA,CAAA;AACxE,EAAA,MAAMC,kBAAAA,GAAqBN,kBAAAA,CACxBG,GAAAA,CAAI,CAACC,GAAAA,KAAQ;SAAOA,GAAAA,CAAAA,CAAK,CAAA,CACzBC,IAAAA,CAAK,EAAA,CAAA;AACR,EAAA,MAAME,cAAAA,GAAiB,CAAA,EACrBR,eAAAA,CAAgB5D,MAAAA,GAAS,CAAA,GAAI;AAAmB+D,cAAAA,EAAAA,eAAAA,CAAAA,CAAAA,GAAoB,EAAA,CAAA,EAEpEF,kBAAAA,CAAmB7D,SAAS,CAAA,GACxB;AAAuBmE,kBAAAA,EAAAA,kBAAAA,KACvB,EAAA,CAAA,CAAA;AAGN,EAAA,OACE,CAAA,sBAAA,EAAoBR,iBAAAA,CAAAA,aAAAA,EAAiC9I,SAAAA,CACnD8I,iBAAAA,CAAAA,CAAAA,MAAAA,EAEAJ,oBAAAA,GACI,CAAA,KAAA,EAAQA,oBAAAA,CAAAA,iBAAAA,EAAwC1I,SAAAA,CAC9C0I,oBAAAA,CAAAA,KAEF,EAAA,CAAA;MACIO,sBAAAA;;AAEVM,CAAAA,GAAAA,cAAAA;AAEJ;AApCgBV,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AAyCT,SAASW,8BAAAA,CACdC,YACAd,cAAAA,EAAsB;AAEtB,EAAA,MAAMe,kBAAAA,GAAqB;YACjBD,UAAAA;mBACOd,cAAAA,CAAAA,CAAAA;AAEjB,EAAA,OAAO,iFAA4Ee,kBAAAA,CAAAA,CAAAA;AACrF;AATgBF,MAAAA,CAAAA,8BAAAA,EAAAA,gCAAAA,CAAAA;AAcT,SAASG,iCAAAA,CACdF,YACAd,cAAAA,EAAsB;AAEtB,EAAA,MAAMe,kBAAAA,GAAqB;YACjBD,UAAAA;mBACOd,cAAAA,CAAAA,CAAAA;AAEjB,EAAA,OAAO,2BAA2Be,kBAAAA,CAAAA,CAAAA;AACpC;AATgBC,MAAAA,CAAAA,iCAAAA,EAAAA,mCAAAA,CAAAA;AAcT,SAASC,uBAAAA,CACdrB,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;AArBgBqB,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;;;ACjFT,SAASC,kCAAAA,CACdC,SAAAA,EAGA3C,WAAAA,EACA9E,IAAAA,EAAqB;AAErB,EAAA,MAAM,EAAEtB,KAAG,GAAKsB,IAAAA;AAChB,EAAA,MAAM,EAAEoC,WAAAA,EAAaC,UAAAA,EAAU,GAAKoF,SAAAA;AAEpC,EAAA,QAAQrF,WAAAA;IACN,KAAK,kBAAA;AACH1D,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkC+D,UAAAA,CAAAA,+BAAAA,CAA2C,CAAA;AAE/E,MAAA,OAAO;AACLD,QAAAA,WAAAA;AACAC,QAAAA,UAAAA;QACAC,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,kBAAA;AACH5D,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkC+D,UAAAA,CAAAA,+BAAAA,CAA2C,CAAA;AAE/E,MAAA,OAAO;AACLD,QAAAA,WAAAA;AACAC,QAAAA,UAAAA;QACAC,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,mBAAA;AACH5D,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkC+D,UAAAA,CAAAA,+BAAAA,CAA2C,CAAA;AAE/E,MAAA,OAAO;AACLD,QAAAA,WAAAA;AACAC,QAAAA,UAAAA;QACAC,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,eAAA;AACH5D,MAAAA,GAAAA,CAAIJ,MAAM,CAAA,mEAAA,CAA8D,CAAA;AACxE,MAAA,OAAO;AACL8D,QAAAA,WAAAA;QACAC,UAAAA,EAAY3C,MAAAA;QACZ4C,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,gBAAA;AACH5D,MAAAA,GAAAA,CAAIC,IAAAA,CAAK,CAAA,4BAAA,EAA0BmG,WAAAA,GAAc,GAAA,CAAA,CAAA,CAAO,CAAA;AACxD,MAAA,OAAO;AACL1C,QAAAA,WAAAA;QACAC,UAAAA,EAAY3C,MAAAA;QACZ4C,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,cAAA;AACH5D,MAAAA,GAAAA,CAAID,KAAK,CAAA,gBAAA,CAAkB,CAAA;AAC3B,MAAA,OAAO;AACL2D,QAAAA,WAAAA;QACAC,UAAAA,EAAY3C,MAAAA;QACZ4C,OAAAA,EAAS;AACX,OAAA;IACF,KAAK,qBAAA;AACH5D,MAAAA,GAAAA,CAAIJ,KAAAA,CACF,CAAA,sCAAA,EAAkC+D,UAAAA,CAAAA,+BAAAA,CAA2C,CAAA;AAE/E,MAAA,OAAO;AACLD,QAAAA,WAAAA;AACAC,QAAAA,UAAAA;QACAC,OAAAA,EAAS;AACX,OAAA;AACF,IAAA;AACE,MAAA,MAAMyD,KAAAA,CAAM,CAAA,yBAAA,EAA4B3D,WAAAA,CAAAA,CAA6B,CAAA;AACzE;AACF;AAvEgBoF,MAAAA,CAAAA,kCAAAA,EAAAA,oCAAAA,CAAAA;;;ACOhB,eAAsBE,sBAAAA,CACpB1H,IAAAA,EACAC,SAAAA,EACA,EACE0H,iBAAAA,mBAAuC,MAAA,CAAA,MAAMjI,MAAAA,EAAN,mBAAA,CAAA,EACvCsD,KAAAA,EACA,GAAGuC,UAAAA,EAAAA,EACoB;AAEzB,EAAA,MAAM,EAAE7G,KAAG,GAAKsB,IAAAA;AAChB,EAAA,MAAM,EACJ4E,iBAAAA,GAAoBD,wBAAAA,CAAyBC,mBAC7CE,WAAAA,GAAcH,wBAAAA,CAAyBG,aAAW,GAChDS,UAAAA;AAEJ,EAAA,MAAMqC,QAAAA,GAAWtC,kCAAAA,CAAmCtF,IAAAA,EAAMC,SAAAA,EAAW;AACnE+C,IAAAA,KAAAA;IACA,GAAGuC;GACL,CAAA;AAEA,EAAA,WAAA,MAAiBsC,YAAYD,QAAAA,EAAU;AACrC,IAAA,IAAIC,SAAS/B,SAAAA,EACX,OAAO0B,kCAAAA,CAAmCK,QAAAA,EAAU/C,aAAa9E,IAAAA,CAAAA;AAGnE,IAAA,MAAM,EAAEyF,cAAAA,EAAgBQ,YAAAA,EAAcnG,MAAAA,EAAM,GAAK+H,QAAAA;AAGjD,IAAA,IAAI5B,YAAAA,EAAc;AAChB,MAAA,IAAI;AACF,QAAA,MAAM0B,iBAAAA,CAAkB7H,QAAQ2F,cAAAA,CAAAA;AAClC,MAAA,CAAA,CAAA,OAASqC,CAAAA,EAAG;AACVpJ,QAAAA,GAAAA,CAAIJ,KAAAA,CAAM,uCAAuCwJ,CAAAA,CAAAA;AACnD,MAAA;AACF,IAAA;AAEA,IAAA,MAAM,EAAEC,aAAAA,EAAezB,cAAAA,EAAgB0B,SAAAA,EAAWZ,UAAAA,EAAYlB,UAAQ,GACpEpG,MAAAA;AAGF,IAAA,MAAMmI,eAAeD,SAAAA,KAAcD,aAAAA;AACnC,IAAA,MAAMG,0BAA0BD,YAAAA,IAAgBrD,iBAAAA;AAChD,IAAA,IAAIsD,uBAAAA,EAAyB;AAC3B,MAAA,MAAM3J,OAAAA,GAAU4I,8BAAAA,CACdC,UAAAA,EACAd,cAAAA,CAAAA;AAEF5H,MAAAA,GAAAA,CAAIC,KAAKJ,OAAAA,CAAAA;AACT,MAAA,OAAO;QACL6D,WAAAA,EAAa,gBAAA;QACbC,UAAAA,EAAY3C,MAAAA;QACZ4C,OAAAA,EAAS;AACX,OAAA;AACF,IAAA;AACA,IAAA,IAAI2F,YAAAA,EAAc;AAChB,MAAA,MAAM1J,OAAAA,GAAU+I,iCAAAA,CACdF,UAAAA,EACAd,cAAAA,CAAAA;AAEF5H,MAAAA,GAAAA,CAAID,KAAKF,OAAAA,CAAAA;AACX,IAAA;AAEA,IAAA,QAAQ2H,QAAAA;MACN,KAAK,UAAA;MACL,KAAK,cAAA;AACL,MAAA,KAAK,aAAA,EAAe;AAClBxH,QAAAA,GAAAA,CAAID,IAAAA,CAAK8I,uBAAAA,CAAwBrB,QAAAA,EAAUI,cAAAA,CAAAA,CAAAA;AAC3C,QAAA;AACF,MAAA;AACA,MAAA,KAAK,WAAA,EAAa;AAChB,QAAA,MAAM6B,MAAAA,GAAS3D,wBAAwB1E,MAAAA,CAAAA;AACvC,QAAA,QAAQqI,OAAO7F,OAAAA;AACb,UAAA,KAAK,SAAA,EAAW;AACd,YAAA;AACF,UAAA;AACA,UAAA,KAAK,QAAA,EAAU;AACb,YAAA,MAAM/D,OAAAA,GAAUiI,sBAAsB1G,MAAAA,CAAAA;AACtCpB,YAAAA,GAAAA,CAAIC,KAAKJ,OAAAA,CAAAA;AACT,YAAA;AACF,UAAA;AACA,UAAA,KAAK,SAAA,EAAW;AACd,YAAA,MAAMA,OAAAA,GAAU6H,uBAAuBtG,MAAAA,CAAAA;AACvCpB,YAAAA,GAAAA,CAAID,KAAKF,OAAAA,CAAAA;AACT,YAAA;AACF,UAAA;AACA,UAAA;AACE,YAAA,MAAMwH,KAAAA,CAAM,CAAA,oBAAA,EAAuBoC,MAAAA,CAAAA,CAAwB,CAAA;AAC/D;AACA,QAAA,OAAOA,MAAAA;AACT,MAAA;AACA,MAAA;AACE,QAAA,MAAMpC,KAAAA,CAAM,CAAA,sBAAA,EAAyBG,QAAAA,CAAAA,CAA0B,CAAA;AACnE;AACF,EAAA;AAGA,EAAA,MAAMH,MAAM,6BAAA,CAAA;AACd;AAjGsB2B,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;;;ACJf,SAASU,aAAAA,CACd,EACEtG,MAAAA,EACAzB,WAAAA,GAAczB,oBACdmD,SAAAA,GAAYlD,gBAAAA,EAAgB,EAM9B,EACEf,QAAQK,YAAAA,EACRO,GAAAA,GAAML,gBAAAA,EAAgB,GACM,EAAC,EAAC;AAEhC,EAAA,IAAI,OAAOP,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAMiI,KAAAA,CACJ,CAAA;AACuG,4GAAA,CAAA,CAAA;AAE3G,EAAA;AAEA,EAAA,MAAM/F,IAAAA,GAAwB;;;;IAI5BlC,KAAAA,EAAOD,qBAAAA,CAAsBC,OAAO,IAAA,CAAA;AACpCY,IAAAA;AACF,GAAA;AACA,EAAA,MAAMuB,SAAAA,GAAuB;AAAE6B,IAAAA,MAAAA;AAAQzB,IAAAA,WAAAA;AAAa0B,IAAAA;AAAU,GAAA;AAC9D,EAAA,OAAO;AACLhC,IAAAA,mBAAAA,EAAqBA,mBAAAA,CAAoBsI,IAAAA,CAAK,IAAA,EAAMrI,IAAAA,EAAMC,SAAAA,CAAAA;AAC1DiE,IAAAA,+CAAAA,EACEA,+CAAAA,CAAgDmE,IAAAA,CAC9C,IAAA,EACArI,IAAAA,EACAC,SAAAA,CAAAA;AAEJqE,IAAAA,mCAAAA,EACEA,mCAAAA,CAAoC+D,IAAAA,CAAK,IAAA,EAAMrI,IAAAA,EAAMC,SAAAA,CAAAA;AACvDqF,IAAAA,kCAAAA,EAAoCA,kCAAAA,CAAmC+C,IAAAA,CACrE,IAAA,EACArI,IAAAA,EACAC,SAAAA,CAAAA;AAEFsE,IAAAA,oCAAAA,EACEA,oCAAAA,CAAqC8D,IAAAA,CAAK,IAAA,EAAMrI,IAAAA,EAAMC,SAAAA,CAAAA;AACxDyH,IAAAA,sBAAAA,EAAwBA,sBAAAA,CAAuBW,IAAAA,CAAK,IAAA,EAAMrI,IAAAA,EAAMC,SAAAA;AAClE,GAAA;AACF;AAjDgBmI,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, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\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.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\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx\",\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.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.3.5\"\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 },\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"]}
package/dist/index.d.cts CHANGED
@@ -248,6 +248,42 @@ type NotifyDeployStatus = {
248
248
  outcome: "aborted";
249
249
  };
250
250
 
251
+ type NotifyTerminatedEphemeralEnvironmentInput = {
252
+ environmentId: string;
253
+ } | {
254
+ deploymentUrl: string;
255
+ } | {
256
+ environmentAlias: string;
257
+ };
258
+ type NotifyTerminatedEphemeralEnvironmentFailedReason = "environmentNotFound" | "missingLookup" | "alreadyTerminated";
259
+ type NotifyTerminatedEphemeralEnvironmentHttpAbortReason = "4XX-client-error" | "401-unauthorized" | "403-forbidden" | "409-conflict" | "5XX-server-error" | "network-error";
260
+ type NotifyTerminatedEphemeralEnvironmentNonHttpAbortReason = "network-error";
261
+ type NotifyTerminatedEphemeralEnvironmentAbortReason = NotifyTerminatedEphemeralEnvironmentHttpAbortReason | NotifyTerminatedEphemeralEnvironmentNonHttpAbortReason;
262
+ type TerminatedEphemeralEnvironmentSuccessResult = {
263
+ environmentId: string;
264
+ };
265
+ type NotifyTerminatedEphemeralEnvironmentResult = {
266
+ environmentId: string;
267
+ /**
268
+ * Environment termination successful.
269
+ */
270
+ outcome: "success";
271
+ } | {
272
+ abortReason: NotifyTerminatedEphemeralEnvironmentAbortReason;
273
+ httpStatus?: never;
274
+ /**
275
+ * An unrecoverable error occurred.
276
+ */
277
+ outcome: "aborted";
278
+ } | {
279
+ abortReason: NotifyTerminatedEphemeralEnvironmentHttpAbortReason;
280
+ httpStatus: number | undefined;
281
+ /**
282
+ * An unrecoverable HTTP error occurred.
283
+ */
284
+ outcome: "aborted";
285
+ };
286
+
251
287
  type PollCiGreenlightPollConfig = {
252
288
  /**
253
289
  * If true, the job will be aborted when a superseding run is detected.
@@ -415,7 +451,8 @@ declare function makeQaWolfSdk({ apiKey, serviceBase, userAgent, }: {
415
451
  success: false;
416
452
  }>;
417
453
  makePollCiGreenlightStatusIterator: (args_0: MakePollCiGreenlightStatusIteratorParams) => AsyncGenerator<PollCiGreenlightIteration, void, unknown>;
454
+ notifyTerminatedEphemeralEnvironment: (config: NotifyTerminatedEphemeralEnvironmentInput) => Promise<NotifyTerminatedEphemeralEnvironmentResult>;
418
455
  pollCiGreenlightStatus: (args_0: PollCiGreenlightParams) => Promise<PollCiGreenlightStatus>;
419
456
  };
420
457
 
421
- 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 PollCiGreenlightAbortReason, type PollCiGreenlightHttpAbortReason, type PollCiGreenlightIteration, type PollCiGreenlightIteratorHttpAborted, type PollCiGreenlightIteratorNonHttpAborted, type PollCiGreenlightNonHttpAbortReason, type PollCiGreenlightParams, type PollCiGreenlightPollConfig, type PollCiGreenlightStatus, type PollCiGreenlightStatusIteration, type SdkDependencies, attemptNotifyDeploy, makeQaWolfSdk };
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 };
package/dist/index.d.ts CHANGED
@@ -248,6 +248,42 @@ type NotifyDeployStatus = {
248
248
  outcome: "aborted";
249
249
  };
250
250
 
251
+ type NotifyTerminatedEphemeralEnvironmentInput = {
252
+ environmentId: string;
253
+ } | {
254
+ deploymentUrl: string;
255
+ } | {
256
+ environmentAlias: string;
257
+ };
258
+ type NotifyTerminatedEphemeralEnvironmentFailedReason = "environmentNotFound" | "missingLookup" | "alreadyTerminated";
259
+ type NotifyTerminatedEphemeralEnvironmentHttpAbortReason = "4XX-client-error" | "401-unauthorized" | "403-forbidden" | "409-conflict" | "5XX-server-error" | "network-error";
260
+ type NotifyTerminatedEphemeralEnvironmentNonHttpAbortReason = "network-error";
261
+ type NotifyTerminatedEphemeralEnvironmentAbortReason = NotifyTerminatedEphemeralEnvironmentHttpAbortReason | NotifyTerminatedEphemeralEnvironmentNonHttpAbortReason;
262
+ type TerminatedEphemeralEnvironmentSuccessResult = {
263
+ environmentId: string;
264
+ };
265
+ type NotifyTerminatedEphemeralEnvironmentResult = {
266
+ environmentId: string;
267
+ /**
268
+ * Environment termination successful.
269
+ */
270
+ outcome: "success";
271
+ } | {
272
+ abortReason: NotifyTerminatedEphemeralEnvironmentAbortReason;
273
+ httpStatus?: never;
274
+ /**
275
+ * An unrecoverable error occurred.
276
+ */
277
+ outcome: "aborted";
278
+ } | {
279
+ abortReason: NotifyTerminatedEphemeralEnvironmentHttpAbortReason;
280
+ httpStatus: number | undefined;
281
+ /**
282
+ * An unrecoverable HTTP error occurred.
283
+ */
284
+ outcome: "aborted";
285
+ };
286
+
251
287
  type PollCiGreenlightPollConfig = {
252
288
  /**
253
289
  * If true, the job will be aborted when a superseding run is detected.
@@ -415,7 +451,8 @@ declare function makeQaWolfSdk({ apiKey, serviceBase, userAgent, }: {
415
451
  success: false;
416
452
  }>;
417
453
  makePollCiGreenlightStatusIterator: (args_0: MakePollCiGreenlightStatusIteratorParams) => AsyncGenerator<PollCiGreenlightIteration, void, unknown>;
454
+ notifyTerminatedEphemeralEnvironment: (config: NotifyTerminatedEphemeralEnvironmentInput) => Promise<NotifyTerminatedEphemeralEnvironmentResult>;
418
455
  pollCiGreenlightStatus: (args_0: PollCiGreenlightParams) => Promise<PollCiGreenlightStatus>;
419
456
  };
420
457
 
421
- 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 PollCiGreenlightAbortReason, type PollCiGreenlightHttpAbortReason, type PollCiGreenlightIteration, type PollCiGreenlightIteratorHttpAborted, type PollCiGreenlightIteratorNonHttpAborted, type PollCiGreenlightNonHttpAbortReason, type PollCiGreenlightParams, type PollCiGreenlightPollConfig, type PollCiGreenlightStatus, type PollCiGreenlightStatusIteration, type SdkDependencies, attemptNotifyDeploy, makeQaWolfSdk };
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 };
package/dist/index.js CHANGED
@@ -36,7 +36,7 @@ var defaultServiceBase = "https://app.qawolf.com/";
36
36
 
37
37
  // package.json
38
38
  var package_default = {
39
- version: "1.2.0"};
39
+ version: "1.3.0"};
40
40
 
41
41
  // src/lib/sdk/defaults/userAgent.ts
42
42
  var defaultUserAgent = `ci-sdk/${package_default.version}`;
@@ -103,7 +103,7 @@ async function attemptNotifyDeploy(deps, apiConfig, config) {
103
103
  if (!response.ok) return handleErrorResponse(response, log);
104
104
  const data = await response.json();
105
105
  return handleSuccessResponse(data, log);
106
- } catch (error) {
106
+ } catch {
107
107
  log.error(`\u{1F6AB} Network error from deploy_success, aborting.`);
108
108
  return {
109
109
  abortReason: "network-error",
@@ -227,7 +227,7 @@ async function callGenerateSignedUrlForRunInputsExecutablesStorage({ apiKey, ser
227
227
  httpStatus: response.status,
228
228
  success: false
229
229
  };
230
- } catch (e) {
230
+ } catch {
231
231
  return {
232
232
  errorMessage: "Network error, aborting request to generate signed URL",
233
233
  httpStatus: 0,
@@ -307,7 +307,7 @@ async function callGenerateSignedUrlForTempTeamStorage({ apiKey, serviceBase, us
307
307
  httpStatus: response.status,
308
308
  success: false
309
309
  };
310
- } catch (e) {
310
+ } catch {
311
311
  return {
312
312
  errorMessage: "Network error, aborting request to generate signed URL",
313
313
  httpStatus: 0,
@@ -356,6 +356,55 @@ async function generateSignedUrlForTempTeamStorage(deps, apiConfig, config) {
356
356
  }
357
357
  __name(generateSignedUrlForTempTeamStorage, "generateSignedUrlForTempTeamStorage");
358
358
 
359
+ // src/lib/sdk/domain/notifyTerminatedEphemeralEnvironment/index.ts
360
+ var notifyTerminatedEphemeralEnvironment = /* @__PURE__ */ __name(async (deps, apiConfig, config) => {
361
+ const { fetch: localFetch, log } = deps;
362
+ try {
363
+ const response = await localFetch(new URL("/api/webhooks/environment_terminated", apiConfig.serviceBase), {
364
+ body: JSON.stringify(config),
365
+ headers: {
366
+ Authorization: `Bearer ${apiConfig.apiKey}`,
367
+ "Content-Type": "application/json",
368
+ "User-Agent": apiConfig.userAgent
369
+ },
370
+ method: "POST"
371
+ });
372
+ if (!response.ok) return handleErrorResponse2(response, log);
373
+ const { environmentId } = await response.json();
374
+ return {
375
+ environmentId,
376
+ outcome: "success"
377
+ };
378
+ } catch {
379
+ log.error(`\u{1F6AB} Network error from terminate_preview_environment, aborting.`);
380
+ return {
381
+ abortReason: "network-error",
382
+ outcome: "aborted"
383
+ };
384
+ }
385
+ }, "notifyTerminatedEphemeralEnvironment");
386
+ async function handleErrorResponse2(response, log) {
387
+ const status = response.status;
388
+ let abortReason;
389
+ if (status === void 0) abortReason = "network-error";
390
+ else if (status === 401) abortReason = "401-unauthorized";
391
+ else if (status === 403) abortReason = "403-forbidden";
392
+ else if (status === 409) abortReason = "409-conflict";
393
+ else if (status >= 500) abortReason = "5XX-server-error";
394
+ else abortReason = "4XX-client-error";
395
+ await logFetchError({
396
+ log,
397
+ methodName: "notifyTerminatedEphemeralEnvironment",
398
+ response
399
+ });
400
+ return {
401
+ abortReason,
402
+ httpStatus: status,
403
+ outcome: "aborted"
404
+ };
405
+ }
406
+ __name(handleErrorResponse2, "handleErrorResponse");
407
+
359
408
  // src/lib/sdk/domain/pollCiGreenlight/buildCompletedRunResult.ts
360
409
  function buildCompletedRunResult(status) {
361
410
  if (status.greenlight) return {
@@ -423,7 +472,7 @@ async function fetchCiGreenlightStatus({ apiKey, serviceBase, userAgent }, { run
423
472
  httpStatus: resp.status,
424
473
  ok: false
425
474
  };
426
- } catch (e) {
475
+ } catch {
427
476
  return {
428
477
  canRetry: true,
429
478
  errorType: "network",
@@ -749,6 +798,7 @@ We recommend 'undici' package for that purpose. See the Requirement section of o
749
798
  generateSignedUrlForRunInputsExecutablesStorage: generateSignedUrlForRunInputsExecutablesStorage.bind(null, deps, apiConfig),
750
799
  generateSignedUrlForTempTeamStorage: generateSignedUrlForTempTeamStorage.bind(null, deps, apiConfig),
751
800
  makePollCiGreenlightStatusIterator: makePollCiGreenlightStatusIterator.bind(null, deps, apiConfig),
801
+ notifyTerminatedEphemeralEnvironment: notifyTerminatedEphemeralEnvironment.bind(null, deps, apiConfig),
752
802
  pollCiGreenlightStatus: pollCiGreenlightStatus.bind(null, deps, apiConfig)
753
803
  };
754
804
  }
package/dist/index.js.map CHANGED
@@ -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/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","timeout","args","signal","AbortSignal","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","e","generateSignedUrlForRunInputsExecutablesStorage","responseState","uploadUrl","callGenerateSignedUrlForTempTeamStorage","generateSignedUrlForTempTeamStorage","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","relevantRunId","rootRunId","isSuperseded","shouldAbortOnSuperseded","result","makeQaWolfSdk","bind"],"mappings":"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","file":"index.js","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, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\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.2.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\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx\",\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.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.3.5\"\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 },\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 (error) {\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 (e) {\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 (e) {\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 { 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 (e) {\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 { 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 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/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/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","timeout","args","signal","AbortSignal","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.js","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, timeout: number) =>\n async (...args: Parameters<FetchDriver>) =>\n fetch(args[0], { ...args[1], signal: AbortSignal.timeout(timeout) });\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.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\": \"dpdm --exit-code circular:1 --no-tree --no-warning --transform --include='.*' --exclude='/(dist|node_modules)/' '**/*' && eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --quiet && prettier --check .\",\n \"lint:fix\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx --fix --quiet && prettier --log-level=warn --write .\",\n \"lint:warnings\": \"eslint . --ext cjs,cts,js,jsx,mjs,ts,tsx\",\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.0.0\",\n \"@sinonjs/fake-timers\": \"^10.3.0\",\n \"slugify\": \"^1.6.6\",\n \"tslib\": \"^2.6.2\"\n },\n \"devDependencies\": {\n \"tsup\": \"^8.3.5\"\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 },\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qawolf/ci-sdk",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "private": false,
5
5
  "description": "A simple SDK for interacting with QAWolf in CI scripts.",
6
6
  "keywords": [],