From b27091beb61ea0acf673a9c42ec5b48d9f97da6c Mon Sep 17 00:00:00 2001 From: myftija Date: Wed, 19 Nov 2025 16:57:49 +0100 Subject: [PATCH 01/21] Support native build server for deployments with the cli --- apps/webapp/app/env.server.ts | 6 + apps/webapp/app/routes/api.v1.artifacts.ts | 73 + apps/webapp/app/routes/api.v1.deployments.ts | 3 +- .../webapp/app/services/platform.v3.server.ts | 25 + .../app/v3/services/artifacts.server.ts | 86 + .../app/v3/services/deployment.server.ts | 248 ++- .../services/deploymentIndexFailed.server.ts | 25 +- .../app/v3/services/failDeployment.server.ts | 16 + .../v3/services/finalizeDeployment.server.ts | 19 +- .../services/initializeDeployment.server.ts | 89 +- .../v3/services/timeoutDeployment.server.ts | 26 +- apps/webapp/package.json | 6 +- .../migration.sql | 1 + .../database/prisma/schema.prisma | 3 +- packages/cli-v3/package.json | 5 +- packages/cli-v3/src/apiClient.ts | 14 + packages/cli-v3/src/cli/common.ts | 1 + packages/cli-v3/src/commands/deploy.ts | 422 ++++- packages/cli-v3/src/commands/workers/build.ts | 1 + packages/cli-v3/src/deploy/archiveContext.ts | 154 ++ packages/cli-v3/src/utilities/windows.ts | 7 +- packages/core/src/v3/schemas/api.ts | 96 +- pnpm-lock.yaml | 1665 ++++++++++++----- 23 files changed, 2431 insertions(+), 560 deletions(-) create mode 100644 apps/webapp/app/routes/api.v1.artifacts.ts create mode 100644 apps/webapp/app/v3/services/artifacts.server.ts create mode 100644 internal-packages/database/prisma/migrations/20251120234635_add_deployment_build_server_meta/migration.sql create mode 100644 packages/cli-v3/src/deploy/archiveContext.ts diff --git a/apps/webapp/app/env.server.ts b/apps/webapp/app/env.server.ts index 207a2bcfab..d10b607245 100644 --- a/apps/webapp/app/env.server.ts +++ b/apps/webapp/app/env.server.ts @@ -345,6 +345,12 @@ const EnvironmentSchema = z OBJECT_STORE_SECRET_ACCESS_KEY: z.string().optional(), OBJECT_STORE_REGION: z.string().optional(), OBJECT_STORE_SERVICE: z.string().default("s3"), + + ARTIFACTS_OBJECT_STORE_BUCKET: z.string(), + ARTIFACTS_OBJECT_STORE_BASE_URL: z.string().optional(), + ARTIFACTS_OBJECT_STORE_ACCESS_KEY_ID: z.string().optional(), + ARTIFACTS_OBJECT_STORE_SECRET_ACCESS_KEY: z.string().optional(), + ARTIFACTS_OBJECT_STORE_REGION: z.string().optional(), EVENTS_BATCH_SIZE: z.coerce.number().int().default(100), EVENTS_BATCH_INTERVAL: z.coerce.number().int().default(1000), EVENTS_DEFAULT_LOG_RETENTION: z.coerce.number().int().default(7), diff --git a/apps/webapp/app/routes/api.v1.artifacts.ts b/apps/webapp/app/routes/api.v1.artifacts.ts new file mode 100644 index 0000000000..6d1ec46a54 --- /dev/null +++ b/apps/webapp/app/routes/api.v1.artifacts.ts @@ -0,0 +1,73 @@ +import { type ActionFunctionArgs, json } from "@remix-run/server-runtime"; +import { + type CreateArtifactResponseBody, + CreateArtifactRequestBody, + tryCatch, +} from "@trigger.dev/core/v3"; +import { authenticateRequest } from "~/services/apiAuth.server"; +import { logger } from "~/services/logger.server"; +import { ArtifactsService } from "~/v3/services/artifacts.server"; + +export async function action({ request }: ActionFunctionArgs) { + if (request.method.toUpperCase() !== "POST") { + return json({ error: "Method Not Allowed" }, { status: 405 }); + } + + const authenticationResult = await authenticateRequest(request, { + apiKey: true, + organizationAccessToken: false, + personalAccessToken: false, + }); + + if (!authenticationResult || !authenticationResult.result.ok) { + logger.info("Invalid or missing api key", { url: request.url }); + return json({ error: "Invalid or Missing API key" }, { status: 401 }); + } + + const [, rawBody] = await tryCatch(request.json()); + const body = CreateArtifactRequestBody.safeParse(rawBody ?? {}); + + if (!body.success) { + return json({ error: "Invalid request body", issues: body.error.issues }, { status: 400 }); + } + + const { environment: authenticatedEnv } = authenticationResult.result; + + const service = new ArtifactsService(); + return await service + .createArtifact(body.data.type, authenticatedEnv, body.data.contentLength) + .match( + (result) => { + return json( + { + artifactKey: result.artifactKey, + uploadUrl: result.uploadUrl, + uploadFields: result.uploadFields, + expiresAt: result.expiresAt.toISOString(), + } satisfies CreateArtifactResponseBody, + { status: 201 } + ); + }, + (error) => { + switch (error.type) { + case "artifact_size_exceeds_limit": { + logger.warn("Artifact size exceeds limit", { error }); + return json( + { + error: `Artifact size (${error.contentLength} bytes) exceeds the allowed limit of ${error.sizeLimit} bytes`, + }, + { status: 400 } + ); + } + case "failed_to_create_presigned_post": { + logger.error("Failed to create presigned POST", { error }); + return json({ error: "Failed to generate artifact upload URL" }, { status: 500 }); + } + default: + error satisfies never; + logger.error("Failed creating artifact", { error }); + return json({ error: "Internal server error" }, { status: 500 }); + } + } + ); +} diff --git a/apps/webapp/app/routes/api.v1.deployments.ts b/apps/webapp/app/routes/api.v1.deployments.ts index 8b3280cbb2..0190ba123d 100644 --- a/apps/webapp/app/routes/api.v1.deployments.ts +++ b/apps/webapp/app/routes/api.v1.deployments.ts @@ -37,7 +37,7 @@ export async function action({ request, params }: ActionFunctionArgs) { const service = new InitializeDeploymentService(); try { - const { deployment, imageRef } = await service.call(authenticatedEnv, body.data); + const { deployment, imageRef, eventStream } = await service.call(authenticatedEnv, body.data); const responseBody: InitializeDeploymentResponseBody = { id: deployment.friendlyId, @@ -48,6 +48,7 @@ export async function action({ request, params }: ActionFunctionArgs) { deployment.externalBuildData as InitializeDeploymentResponseBody["externalBuildData"], imageTag: imageRef, imagePlatform: deployment.imagePlatform, + eventStream, }; return json(responseBody, { status: 200 }); diff --git a/apps/webapp/app/services/platform.v3.server.ts b/apps/webapp/app/services/platform.v3.server.ts index f6dbcadafd..d83da275dc 100644 --- a/apps/webapp/app/services/platform.v3.server.ts +++ b/apps/webapp/app/services/platform.v3.server.ts @@ -591,6 +591,31 @@ export async function generateRegistryCredentials( return result; } +export async function enqueueBuild( + projectId: string, + deploymentId: string, + artifactKey: string, + options: { + skipPromotion?: boolean; + configFilePath?: string; + } +) { + if (!client) return undefined; + const result = await client.enqueueBuild(projectId, { deploymentId, artifactKey, options }); + if (!result.success) { + logger.error("Error enqueuing build", { + error: result.error, + projectId, + deploymentId, + artifactKey, + options, + }); + throw new Error("Failed to enqueue build"); + } + + return result; +} + function isCloud(): boolean { const acceptableHosts = [ "https://cloud.trigger.dev", diff --git a/apps/webapp/app/v3/services/artifacts.server.ts b/apps/webapp/app/v3/services/artifacts.server.ts new file mode 100644 index 0000000000..981618ae14 --- /dev/null +++ b/apps/webapp/app/v3/services/artifacts.server.ts @@ -0,0 +1,86 @@ +import type { AuthenticatedEnvironment } from "~/services/apiAuth.server"; +import { BaseService } from "./baseService.server"; +import { env } from "~/env.server"; +import { createPresignedPost } from "@aws-sdk/s3-presigned-post"; +import { S3Client } from "@aws-sdk/client-s3"; +import { customAlphabet } from "nanoid"; +import { errAsync, fromPromise } from "neverthrow"; + +const nanoid = customAlphabet("1234567890abcdefghijklmnopqrstuvwxyz", 24); +const objectStoreClient = + env.ARTIFACTS_OBJECT_STORE_ACCESS_KEY_ID && + env.ARTIFACTS_OBJECT_STORE_SECRET_ACCESS_KEY && + env.ARTIFACTS_OBJECT_STORE_BASE_URL + ? new S3Client({ + credentials: { + accessKeyId: env.ARTIFACTS_OBJECT_STORE_ACCESS_KEY_ID, + secretAccessKey: env.ARTIFACTS_OBJECT_STORE_SECRET_ACCESS_KEY, + }, + region: env.ARTIFACTS_OBJECT_STORE_REGION, + endpoint: env.ARTIFACTS_OBJECT_STORE_BASE_URL, + forcePathStyle: true, + }) + : new S3Client(); + +const artifactKeyPrefixByType = { + deployment_context: "deployments", +} as const; +const artifactBytesSizeLimitByType = { + deployment_context: 100 * 1024 * 1024, // 100MB +} as const; + +export class ArtifactsService extends BaseService { + private readonly bucket = env.ARTIFACTS_OBJECT_STORE_BUCKET; + + public createArtifact( + type: "deployment_context", + authenticatedEnv: AuthenticatedEnvironment, + contentLength?: number + ) { + const limit = artifactBytesSizeLimitByType[type]; + + // this is just a validation using client-side data + // the actual limit will be enforced by S3 + if (contentLength && contentLength > limit) { + return errAsync({ + type: "artifact_size_exceeds_limit" as const, + contentLength, + sizeLimit: limit, + }); + } + + const uniqueId = nanoid(); + const key = `${artifactKeyPrefixByType[type]}/${authenticatedEnv.project.externalRef}/${authenticatedEnv.slug}/${uniqueId}.tar.gz`; + + return this.createPresignedPost(key, limit, contentLength).map((result) => ({ + artifactKey: key, + uploadUrl: result.url, + uploadFields: result.fields, + expiresAt: result.expiresAt, + })); + } + + private createPresignedPost(key: string, sizeLimit: number, contentLength?: number) { + const ttlSeconds = 300; // 5 minutes + const expiresAt = new Date(Date.now() + ttlSeconds * 1000); + + return fromPromise( + createPresignedPost(objectStoreClient, { + Bucket: this.bucket, + Key: key, + Conditions: [["content-length-range", 0, sizeLimit]], + Fields: { + "Content-Type": "application/gzip", + }, + Expires: ttlSeconds, + }), + (error) => ({ + type: "failed_to_create_presigned_post" as const, + cause: error, + }) + ).map((result) => ({ + ...result, + expiresAt, + })); + } +} diff --git a/apps/webapp/app/v3/services/deployment.server.ts b/apps/webapp/app/v3/services/deployment.server.ts index 47bf3c04fc..ec9ea293af 100644 --- a/apps/webapp/app/v3/services/deployment.server.ts +++ b/apps/webapp/app/v3/services/deployment.server.ts @@ -1,13 +1,26 @@ import { type AuthenticatedEnvironment } from "~/services/apiAuth.server"; import { BaseService } from "./baseService.server"; -import { errAsync, fromPromise, okAsync } from "neverthrow"; -import { type WorkerDeployment } from "@trigger.dev/database"; -import { logger, type GitMeta } from "@trigger.dev/core/v3"; +import { errAsync, fromPromise, okAsync, type ResultAsync } from "neverthrow"; +import { type WorkerDeployment, type Project } from "@trigger.dev/database"; +import { logger, type GitMeta, type DeploymentEvent } from "@trigger.dev/core/v3"; import { TimeoutDeploymentService } from "./timeoutDeployment.server"; import { env } from "~/env.server"; import { createRemoteImageBuild } from "../remoteImageBuilder.server"; import { FINAL_DEPLOYMENT_STATUSES } from "./failDeployment.server"; -import { generateRegistryCredentials } from "~/services/platform.v3.server"; +import { enqueueBuild, generateRegistryCredentials } from "~/services/platform.v3.server"; +import { AppendRecord, S2 } from "@s2-dev/streamstore"; +import { createRedisClient } from "~/redis.server"; + +const S2_TOKEN_KEY_PREFIX = "s2-token:read:deployment-event-stream:project:"; +const s2TokenRedis = createRedisClient("s2-token-cache", { + host: env.CACHE_REDIS_HOST, + port: env.CACHE_REDIS_PORT, + username: env.CACHE_REDIS_USERNAME, + password: env.CACHE_REDIS_PASSWORD, + tlsDisabled: env.CACHE_REDIS_TLS_DISABLED === "true", + clusterMode: env.CACHE_REDIS_CLUSTER_MODE_ENABLED === "1", +}); +const s2 = env.S2_ENABLED === "1" ? new S2({ accessToken: env.S2_ACCESS_TOKEN }) : undefined; export class DeploymentService extends BaseService { /** @@ -22,35 +35,11 @@ export class DeploymentService extends BaseService { * @param friendlyId The friendly deployment ID. * @param updates Optional deployment details to persist. */ - public progressDeployment( authenticatedEnv: AuthenticatedEnvironment, friendlyId: string, updates: Partial & { git: GitMeta }> ) { - const getDeployment = () => - fromPromise( - this._prisma.workerDeployment.findFirst({ - where: { - friendlyId, - environmentId: authenticatedEnv.id, - }, - select: { - status: true, - id: true, - }, - }), - (error) => ({ - type: "other" as const, - cause: error, - }) - ).andThen((deployment) => { - if (!deployment) { - return errAsync({ type: "deployment_not_found" as const }); - } - return okAsync(deployment); - }); - const validateDeployment = (deployment: Pick) => { if (deployment.status !== "PENDING" && deployment.status !== "INSTALLING") { logger.warn( @@ -134,7 +123,7 @@ export class DeploymentService extends BaseService { }) ); - return getDeployment() + return this.getDeployment(authenticatedEnv.projectId, friendlyId) .andThen(validateDeployment) .andThen((deployment) => { if (deployment.status === "PENDING") { @@ -160,30 +149,11 @@ export class DeploymentService extends BaseService { friendlyId: string, data?: Partial> ) { - const getDeployment = () => - fromPromise( - this._prisma.workerDeployment.findFirst({ - where: { - friendlyId, - projectId: authenticatedEnv.projectId, - }, - select: { - status: true, - id: true, - }, - }), - (error) => ({ - type: "other" as const, - cause: error, - }) - ).andThen((deployment) => { - if (!deployment) { - return errAsync({ type: "deployment_not_found" as const }); - } - return okAsync(deployment); - }); - - const validateDeployment = (deployment: Pick) => { + const validateDeployment = ( + deployment: Pick & { + environment: { project: { externalRef: string } }; + } + ) => { if (FINAL_DEPLOYMENT_STATUSES.includes(deployment.status)) { logger.warn("Attempted cancelling deployment in a final state", { deployment, @@ -194,7 +164,11 @@ export class DeploymentService extends BaseService { return okAsync(deployment); }; - const cancelDeployment = (deployment: Pick) => + const cancelDeployment = ( + deployment: Pick & { + environment: { project: { externalRef: string } }; + } + ) => fromPromise( this._prisma.workerDeployment.updateMany({ where: { @@ -217,7 +191,7 @@ export class DeploymentService extends BaseService { if (result.count === 0) { return errAsync({ type: "deployment_cannot_be_cancelled" as const }); } - return okAsync({ id: deployment.id }); + return okAsync({ deployment }); }); const deleteTimeout = (deployment: Pick) => @@ -226,9 +200,25 @@ export class DeploymentService extends BaseService { cause: error, })); - return getDeployment() + return this.getDeployment(authenticatedEnv.projectId, friendlyId) .andThen(validateDeployment) .andThen(cancelDeployment) + .andThen(({ deployment }) => + this.appendToEventLog(deployment.environment.project, deployment, [ + { + type: "finalized", + data: { + result: "canceled", + message: data?.canceledReason ?? undefined, + }, + }, + ]) + .orElse((error) => { + logger.error("Failed to append event to deployment event log", { error }); + return okAsync(deployment); + }) + .map(() => deployment) + ) .andThen(deleteTimeout) .map(() => undefined); } @@ -296,6 +286,142 @@ export class DeploymentService extends BaseService { .andThen(generateCredentials); } + public enqueueBuild( + authenticatedEnv: Pick, + deployment: Pick, + artifactKey: string, + options: { + skipPromotion?: boolean; + configFilePath?: string; + } + ) { + return fromPromise( + enqueueBuild(authenticatedEnv.projectId, deployment.friendlyId, artifactKey, options), + (error) => ({ + type: "failed_to_enqueue_build" as const, + cause: error, + }) + ); + } + + public appendToEventLog( + project: Pick, + deployment: Pick, + events: DeploymentEvent[] + ): ResultAsync< + undefined, + { type: "s2_is_disabled" } | { type: "failed_to_append_to_event_log"; cause: unknown } + > { + if (env.S2_ENABLED !== "1" || !s2) { + return errAsync({ type: "s2_is_disabled" as const }); + } + + const basin = s2.basin(env.S2_DEPLOYMENT_LOGS_BASIN_NAME); + const stream = basin.stream( + `projects/${project.externalRef}/deployments/${deployment.shortCode}` + ); + + return fromPromise( + stream.append(events.map((event) => AppendRecord.make(JSON.stringify(event)))), + (error) => ({ + type: "failed_to_append_to_event_log" as const, + cause: error, + }) + ).map(() => undefined); + } + + public createEventStream( + project: Pick, + deployment: Pick + ): ResultAsync< + { basin: string; stream: string }, + { type: "s2_is_disabled" } | { type: "failed_to_create_event_stream"; cause: unknown } + > { + if (env.S2_ENABLED !== "1" || !s2) { + return errAsync({ type: "s2_is_disabled" as const }); + } + const basin = s2.basin(env.S2_DEPLOYMENT_LOGS_BASIN_NAME); + + return fromPromise( + basin.streams.create({ + stream: `projects/${project.externalRef}/deployments/${deployment.shortCode}`, + }), + (error) => ({ + type: "failed_to_create_event_stream" as const, + cause: error, + }) + ).map(({ name }) => ({ + basin: basin.name, + stream: name, + })); + } + + public getEventStreamAccessToken( + project: Pick + ): ResultAsync { + if (env.S2_ENABLED !== "1" || !s2) { + return errAsync({ type: "s2_is_disabled" as const }); + } + const basinName = env.S2_DEPLOYMENT_LOGS_BASIN_NAME; + const redisKey = `${S2_TOKEN_KEY_PREFIX}${project.externalRef}`; + + const getTokenFromCache = () => + fromPromise(s2TokenRedis.get(redisKey), (error) => ({ + type: "other" as const, + cause: error, + })).andThen((cachedToken) => { + if (!cachedToken) { + return errAsync({ type: "s2_token_cache_not_found" as const }); + } + return okAsync(cachedToken); + }); + + const issueS2Token = () => + fromPromise( + s2.accessTokens.issue({ + id: `${project.externalRef}-${new Date().getTime()}`, + expires_at: new Date(Date.now() + 60 * 60 * 1000).toISOString(), // 1 hour + scope: { + ops: ["read"], + basins: { + exact: basinName, + }, + streams: { + prefix: `projects/${project.externalRef}/deployments/`, + }, + }, + }), + (error) => ({ + type: "other" as const, + cause: error, + }) + ).map(({ access_token }) => access_token); + + const cacheToken = (token: string) => + fromPromise( + s2TokenRedis.setex( + redisKey, + 59 * 60, // slightly shorter than the token validity period + token + ), + (error) => ({ + type: "other" as const, + cause: error, + }) + ); + + return getTokenFromCache() + .orElse(issueS2Token) + .andThen((token) => + cacheToken(token) + .map(() => token) + .orElse((error) => { + logger.error("Failed to cache S2 token", { error }); + return okAsync(token); // ignore the cache error + }) + ); + } + private getDeployment(projectId: string, friendlyId: string) { return fromPromise( this._prisma.workerDeployment.findFirst({ @@ -307,6 +433,16 @@ export class DeploymentService extends BaseService { status: true, id: true, imageReference: true, + shortCode: true, + environment: { + include: { + project: { + select: { + externalRef: true, + }, + }, + }, + }, }, }), (error) => ({ diff --git a/apps/webapp/app/v3/services/deploymentIndexFailed.server.ts b/apps/webapp/app/v3/services/deploymentIndexFailed.server.ts index fffab0af03..ad1ff09726 100644 --- a/apps/webapp/app/v3/services/deploymentIndexFailed.server.ts +++ b/apps/webapp/app/v3/services/deploymentIndexFailed.server.ts @@ -1,7 +1,8 @@ import { PerformDeploymentAlertsService } from "./alerts/performDeploymentAlerts.server"; import { BaseService } from "./baseService.server"; import { logger } from "~/services/logger.server"; -import { WorkerDeploymentStatus } from "@trigger.dev/database"; +import { type WorkerDeploymentStatus } from "@trigger.dev/database"; +import { DeploymentService } from "./deployment.server"; const FINAL_DEPLOYMENT_STATUSES: WorkerDeploymentStatus[] = [ "CANCELED", @@ -31,6 +32,13 @@ export class DeploymentIndexFailed extends BaseService { : { id: maybeFriendlyId, }, + include: { + environment: { + include: { + project: true, + }, + }, + }, }); if (!deployment) { @@ -66,6 +74,21 @@ export class DeploymentIndexFailed extends BaseService { }, }); + const deploymentService = new DeploymentService(); + await deploymentService + .appendToEventLog(deployment.environment.project, failedDeployment, [ + { + type: "finalized", + data: { + result: "failed", + message: error.message, + }, + }, + ]) + .orTee((error) => { + logger.error("Failed to append failed deployment event to event log", { error }); + }); + await PerformDeploymentAlertsService.enqueue(failedDeployment.id); return failedDeployment; diff --git a/apps/webapp/app/v3/services/failDeployment.server.ts b/apps/webapp/app/v3/services/failDeployment.server.ts index 79234b8310..b26cc77d4d 100644 --- a/apps/webapp/app/v3/services/failDeployment.server.ts +++ b/apps/webapp/app/v3/services/failDeployment.server.ts @@ -4,6 +4,7 @@ import { logger } from "~/services/logger.server"; import { type WorkerDeploymentStatus } from "@trigger.dev/database"; import { type FailDeploymentRequestBody } from "@trigger.dev/core/v3/schemas"; import { type AuthenticatedEnvironment } from "~/services/apiAuth.server"; +import { DeploymentService } from "./deployment.server"; export const FINAL_DEPLOYMENT_STATUSES: WorkerDeploymentStatus[] = [ "CANCELED", @@ -50,6 +51,21 @@ export class FailDeploymentService extends BaseService { }, }); + const deploymentService = new DeploymentService(); + await deploymentService + .appendToEventLog(authenticatedEnv.project, failedDeployment, [ + { + type: "finalized", + data: { + result: "failed", + message: params.error.message, + }, + }, + ]) + .orTee((error) => { + logger.error("Failed to append failed deployment event to event log", { error }); + }); + await PerformDeploymentAlertsService.enqueue(failedDeployment.id); return failedDeployment; diff --git a/apps/webapp/app/v3/services/finalizeDeployment.server.ts b/apps/webapp/app/v3/services/finalizeDeployment.server.ts index 175986ae04..6cbfc323e7 100644 --- a/apps/webapp/app/v3/services/finalizeDeployment.server.ts +++ b/apps/webapp/app/v3/services/finalizeDeployment.server.ts @@ -1,5 +1,5 @@ -import { FinalizeDeploymentRequestBody } from "@trigger.dev/core/v3/schemas"; -import { AuthenticatedEnvironment } from "~/services/apiAuth.server"; +import type { FinalizeDeploymentRequestBody } from "@trigger.dev/core/v3/schemas"; +import type { AuthenticatedEnvironment } from "~/services/apiAuth.server"; import { logger } from "~/services/logger.server"; import { socketIo } from "../handleSocketIo.server"; import { updateEnvConcurrencyLimits } from "../runQueue.server"; @@ -9,6 +9,7 @@ import { ChangeCurrentDeploymentService } from "./changeCurrentDeployment.server import { projectPubSub } from "./projectPubSub.server"; import { FailDeploymentService } from "./failDeployment.server"; import { TimeoutDeploymentService } from "./timeoutDeployment.server"; +import { DeploymentService } from "./deployment.server"; import { engine } from "../runEngine.server"; import { tryCatch } from "@trigger.dev/core"; @@ -77,6 +78,20 @@ export class FinalizeDeploymentService extends BaseService { }, }); + const deploymentService = new DeploymentService(); + await deploymentService + .appendToEventLog(authenticatedEnv.project, finalizedDeployment, [ + { + type: "finalized", + data: { + result: "succeeded", + }, + }, + ]) + .orTee((error) => { + logger.error("Failed to append finalized deployment event to event log", { error }); + }); + await TimeoutDeploymentService.dequeue(deployment.id, this._prisma); if (typeof body.skipPromotion === "undefined" || !body.skipPromotion) { diff --git a/apps/webapp/app/v3/services/initializeDeployment.server.ts b/apps/webapp/app/v3/services/initializeDeployment.server.ts index 0758dc231e..e922a8cbac 100644 --- a/apps/webapp/app/v3/services/initializeDeployment.server.ts +++ b/apps/webapp/app/v3/services/initializeDeployment.server.ts @@ -11,6 +11,8 @@ import { TimeoutDeploymentService } from "./timeoutDeployment.server"; import { getDeploymentImageRef } from "../getDeploymentImageRef.server"; import { tryCatch } from "@trigger.dev/core"; import { getRegistryConfig } from "../registryConfig.server"; +import { DeploymentService } from "./deployment.server"; +import { errAsync } from "neverthrow"; const nanoid = customAlphabet("1234567890abcdefghijklmnopqrstuvwxyz", 8); @@ -90,7 +92,7 @@ export class InitializeDeploymentService extends BaseService { // For the `PENDING` initial status, defer the creation of the Depot build until the deployment is started. // This helps avoid Depot token expiration issues. const externalBuildData = - payload.initialStatus === "PENDING" + payload.initialStatus === "PENDING" || payload.isNativeBuild ? undefined : await createRemoteImageBuild(environment.project); @@ -136,9 +138,43 @@ export class InitializeDeploymentService extends BaseService { const { imageRef, isEcr, repoCreated } = imageRefResult; - // we keep using `BUILDING` as the initial status if not explicitly set - // to avoid changing the behavior for deployments not created in the build server - const initialStatus = payload.initialStatus ?? "BUILDING"; + // We keep using `BUILDING` as the initial status if not explicitly set + // to avoid changing the behavior for deployments not created in the build server. + // Native builds always start in the `PENDING` status. + const initialStatus = + payload.initialStatus ?? (payload.isNativeBuild ? "PENDING" : "BUILDING"); + + const deploymentService = new DeploymentService(); + const s2StreamOrFail = await deploymentService + .createEventStream(environment.project, { shortCode: deploymentShortCode }) + .andThen(({ basin, stream }) => + deploymentService.getEventStreamAccessToken(environment.project).map((accessToken) => ({ + basin, + stream, + accessToken, + })) + ); + + if (s2StreamOrFail.isErr()) { + logger.error( + "Failed to create S2 event stream on deployment initialization, continuing without logs stream", + { + environmentId: environment.id, + projectId: environment.projectId, + error: s2StreamOrFail.error, + } + ); + } + + const eventStream = s2StreamOrFail.isOk() + ? { + s2: { + basin: s2StreamOrFail.value.basin, + stream: s2StreamOrFail.value.stream, + accessToken: s2StreamOrFail.value.accessToken, + }, + } + : undefined; logger.debug("Creating deployment", { environmentId: environment.id, @@ -150,6 +186,8 @@ export class InitializeDeploymentService extends BaseService { isEcr, repoCreated, initialStatus, + artifactKey: payload.isNativeBuild ? payload.artifactKey : undefined, + isNativeBuild: payload.isNativeBuild, }); const deployment = await this._prisma.workerDeployment.create({ @@ -169,6 +207,13 @@ export class InitializeDeploymentService extends BaseService { git: payload.gitMeta ?? undefined, runtime: payload.runtime ?? undefined, startedAt: initialStatus === "BUILDING" ? new Date() : undefined, + buildServerMetadata: payload.isNativeBuild + ? { + artifactKey: payload.artifactKey, + skipPromotion: payload.skipPromotion, + isNativeBuild: true, + } + : undefined, }, }); @@ -182,9 +227,45 @@ export class InitializeDeploymentService extends BaseService { new Date(Date.now() + timeoutMs) ); + if (payload.isNativeBuild) { + const result = await deploymentService + .enqueueBuild(environment, deployment, payload.artifactKey, { + skipPromotion: payload.skipPromotion, + configFilePath: payload.configFilePath, + }) + .orElse((error) => { + logger.error("Failed to enqueue build", { + environmentId: environment.id, + projectId: environment.projectId, + deploymentId: deployment.id, + error: error.cause, + }); + + return deploymentService + .cancelDeployment(environment, deployment.friendlyId, { + canceledReason: "Failed to enqueue build, please try again shortly.", + }) + .orTee((cancelError) => + logger.error("Failed to cancel deployment after failed build enqueue", { + environmentId: environment.id, + projectId: environment.projectId, + deploymentId: deployment.id, + error: cancelError, + }) + ) + .andThen(() => errAsync(error)) + .orElse(() => errAsync(error)); + }); + + if (result.isErr()) { + throw Error("Failed to enqueue build"); + } + } + return { deployment, imageRef, + eventStream, }; }); } diff --git a/apps/webapp/app/v3/services/timeoutDeployment.server.ts b/apps/webapp/app/v3/services/timeoutDeployment.server.ts index 5cf69f76e4..efb2569a94 100644 --- a/apps/webapp/app/v3/services/timeoutDeployment.server.ts +++ b/apps/webapp/app/v3/services/timeoutDeployment.server.ts @@ -2,8 +2,9 @@ import { logger } from "~/services/logger.server"; import { BaseService } from "./baseService.server"; import { commonWorker } from "../commonWorker.server"; import { PerformDeploymentAlertsService } from "./alerts/performDeploymentAlerts.server"; -import { PrismaClientOrTransaction } from "~/db.server"; +import { type PrismaClientOrTransaction } from "~/db.server"; import { workerQueue } from "~/services/worker.server"; +import { DeploymentService } from "./deployment.server"; export class TimeoutDeploymentService extends BaseService { public async call(id: string, fromStatus: string, errorMessage: string) { @@ -12,7 +13,11 @@ export class TimeoutDeploymentService extends BaseService { id, }, include: { - environment: true, + environment: { + include: { + project: true, + }, + }, }, }); @@ -29,7 +34,7 @@ export class TimeoutDeploymentService extends BaseService { return; } - await this._prisma.workerDeployment.update({ + const timedOutDeployment = await this._prisma.workerDeployment.update({ where: { id: deployment.id, }, @@ -40,6 +45,21 @@ export class TimeoutDeploymentService extends BaseService { }, }); + const deploymentService = new DeploymentService(); + await deploymentService + .appendToEventLog(deployment.environment.project, timedOutDeployment, [ + { + type: "finalized", + data: { + result: "timed_out", + message: errorMessage, + }, + }, + ]) + .orTee((error) => { + logger.error("Failed to append timed out deployment event to event log", { error }); + }); + await PerformDeploymentAlertsService.enqueue(deployment.id); } diff --git a/apps/webapp/package.json b/apps/webapp/package.json index 5daffe8960..c4f2fb36ee 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -30,8 +30,12 @@ "@ariakit/react": "^0.4.6", "@ariakit/react-core": "^0.4.6", "@aws-sdk/client-ecr": "^3.931.0", + "@aws-sdk/client-s3": "^3.936.0", "@aws-sdk/client-sqs": "^3.445.0", "@aws-sdk/client-sts": "^3.840.0", + "@aws-sdk/credential-provider-node": "^3.936.0", + "@aws-sdk/s3-presigned-post": "^3.936.0", + "@aws-sdk/s3-request-presigner": "^3.936.0", "@better-auth/utils": "^0.2.6", "@codemirror/autocomplete": "^6.3.1", "@codemirror/commands": "^6.1.2", @@ -114,7 +118,7 @@ "@trigger.dev/core": "workspace:*", "@trigger.dev/database": "workspace:*", "@trigger.dev/otlp-importer": "workspace:*", - "@trigger.dev/platform": "1.0.20", + "@trigger.dev/platform": "0.0.0-prerelease-20251121183112", "@trigger.dev/redis-worker": "workspace:*", "@trigger.dev/sdk": "workspace:*", "@types/pg": "8.6.6", diff --git a/internal-packages/database/prisma/migrations/20251120234635_add_deployment_build_server_meta/migration.sql b/internal-packages/database/prisma/migrations/20251120234635_add_deployment_build_server_meta/migration.sql new file mode 100644 index 0000000000..1356966cc8 --- /dev/null +++ b/internal-packages/database/prisma/migrations/20251120234635_add_deployment_build_server_meta/migration.sql @@ -0,0 +1 @@ +ALTER TABLE "public"."WorkerDeployment" ADD COLUMN "buildServerMetadata" JSONB; \ No newline at end of file diff --git a/internal-packages/database/prisma/schema.prisma b/internal-packages/database/prisma/schema.prisma index eae19bc42b..401299d583 100644 --- a/internal-packages/database/prisma/schema.prisma +++ b/internal-packages/database/prisma/schema.prisma @@ -1748,7 +1748,8 @@ model WorkerDeployment { imageReference String? imagePlatform String @default("linux/amd64") - externalBuildData Json? + externalBuildData Json? + buildServerMetadata Json? status WorkerDeploymentStatus @default(PENDING) type WorkerDeploymentType @default(V1) diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index c14d284d0e..b65b93aa49 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -81,7 +81,7 @@ "inspector": "npx @modelcontextprotocol/inspector dist/esm/index.js mcp --log-file .mcp.log --api-url http://localhost:3030" }, "dependencies": { - "@clack/prompts": "0.11.0", + "@clack/prompts": "1.0.0-alpha.6", "@depot/cli": "0.0.1-cli.2.80.0", "@modelcontextprotocol/sdk": "^1.17.0", "@opentelemetry/api": "1.9.0", @@ -95,6 +95,7 @@ "@trigger.dev/build": "workspace:4.1.2", "@trigger.dev/core": "workspace:4.1.2", "@trigger.dev/schema-to-json": "workspace:4.1.2", + "@s2-dev/streamstore": "^0.17.6", "ansi-escapes": "^7.0.0", "braces": "^3.0.3", "c12": "^1.11.1", @@ -112,6 +113,7 @@ "git-last-commit": "^1.0.1", "gradient-string": "^2.0.2", "has-flag": "^5.0.1", + "ignore": "^7.0.5", "import-in-the-middle": "1.11.0", "import-meta-resolve": "^4.1.0", "ini": "^5.0.0", @@ -135,6 +137,7 @@ "std-env": "^3.7.0", "strip-ansi": "^7.1.0", "supports-color": "^10.0.0", + "tar": "^7.4.3", "tiny-invariant": "^1.2.0", "tinyexec": "^0.3.1", "tinyglobby": "^0.2.10", diff --git a/packages/cli-v3/src/apiClient.ts b/packages/cli-v3/src/apiClient.ts index 4a2f6232c0..e099260203 100644 --- a/packages/cli-v3/src/apiClient.ts +++ b/packages/cli-v3/src/apiClient.ts @@ -1,5 +1,7 @@ import { CreateAuthorizationCodeResponseSchema, + CreateArtifactRequestBody, + CreateArtifactResponseBody, CreateBackgroundWorkerRequestBody, CreateBackgroundWorkerResponse, DevConfigResponseBody, @@ -360,6 +362,18 @@ export class CliApiClient { ); } + async createArtifact(body: CreateArtifactRequestBody) { + if (!this.accessToken) { + throw new Error("createArtifact: No access token"); + } + + return wrapZodFetch(CreateArtifactResponseBody, `${this.apiURL}/api/v1/artifacts`, { + method: "POST", + headers: this.getHeaders(), + body: JSON.stringify(body), + }); + } + async initializeDeployment(body: InitializeDeploymentRequestBody) { if (!this.accessToken) { throw new Error("initializeDeployment: No access token"); diff --git a/packages/cli-v3/src/cli/common.ts b/packages/cli-v3/src/cli/common.ts index f1508c47b9..f251e4e5ef 100644 --- a/packages/cli-v3/src/cli/common.ts +++ b/packages/cli-v3/src/cli/common.ts @@ -69,6 +69,7 @@ export async function wrapCommandAction( // do nothing } else if (e instanceof OutroCommandError) { outro(e.message ?? "Operation cancelled"); + process.exit(1); } else if (e instanceof SkipCommandError) { // do nothing } else if (e instanceof BundleError) { diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 1e6e291113..53ab822379 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -1,21 +1,29 @@ -import { intro, log, outro } from "@clack/prompts"; +import { intro, log, outro, taskLog } from "@clack/prompts"; import { getBranch, prepareDeploymentError, tryCatch } from "@trigger.dev/core/v3"; import { InitializeDeploymentRequestBody, InitializeDeploymentResponseBody, + DeploymentEvent, + GitMeta, + DeploymentFinalizedEvent, } from "@trigger.dev/core/v3/schemas"; import { Command, Option as CommandOption } from "commander"; -import { resolve } from "node:path"; +import { join, resolve } from "node:path"; import { isCI } from "std-env"; import { x } from "tinyexec"; import { z } from "zod"; +import chalk from "chalk"; import { CliApiClient } from "../apiClient.js"; import { buildWorker } from "../build/buildWorker.js"; import { resolveAlwaysExternal } from "../build/externals.js"; +import { createContextArchive, getArchiveSize } from "../deploy/archiveContext.js"; +import { S2 } from "@s2-dev/streamstore"; +import { mkdir, readFile, unlink } from "node:fs/promises"; import { CommonCommandOptions, commonOptions, handleTelemetry, + OutroCommandError, SkipLoggingError, wrapCommandAction, } from "../cli/common.js"; @@ -30,6 +38,8 @@ import { } from "../deploy/logs.js"; import { chalkError, + chalkGrey, + chalkWarning, cliLink, isLinksSupported, prettyError, @@ -68,6 +78,7 @@ const DeployCommandOptions = CommonCommandOptions.extend({ network: z.enum(["default", "none", "host"]).optional(), push: z.boolean().optional(), builder: z.string().default("trigger"), + nativeBuildServer: z.boolean().default(false), }); type DeployCommandOptions = z.infer; @@ -160,6 +171,12 @@ export function configureDeployCommand(program: Command) { "The builder to use when building locally" ).hideHelp() ) + .addOption( + new CommandOption( + "--native-build-server", + "Use the native build server for building the image" + ) + ) .action(async (path, options) => { await handleTelemetry(async () => { await printStandloneInitialBanner(true); @@ -280,6 +297,18 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { throw new Error("Failed to get project client"); } + if (options.nativeBuildServer) { + await handleNativeBuildServerDeploy({ + apiClient: projectClient.client, + config: resolvedConfig, + dashboardUrl: authorization.dashboardUrl, + options, + userId: authorization.auth.tokenType === "personal" ? authorization.userId : undefined, + gitMeta, + }); + return; + } + const serverEnvVars = await projectClient.client.getEnvironmentVariables(resolvedConfig.project); loadDotEnvVars(resolvedConfig.workingDir, options.envFile); @@ -334,6 +363,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { gitMeta, type: features.run_engine_v2 ? "MANAGED" : "V1", runtime: buildManifest.runtime, + isNativeBuild: false, }, envVars.TRIGGER_EXISTING_DEPLOYMENT_ID ); @@ -827,6 +857,382 @@ async function initializeOrAttachDeployment( return newDeploymentOrError.data; } +async function handleNativeBuildServerDeploy({ + apiClient, + options, + config, + dashboardUrl, + userId, + gitMeta, +}: { + apiClient: CliApiClient; + config: Awaited>; + dashboardUrl: string; + options: DeployCommandOptions; + userId?: string; + gitMeta?: GitMeta; +}) { + const tmpDir = join(config.workingDir, ".trigger", "tmp"); + await mkdir(tmpDir, { recursive: true }); + + const archivePath = join(tmpDir, `deploy-${Date.now()}.tar.gz`); + + const $deploymentSpinner = spinner(); + $deploymentSpinner.start("Preparing deployment files"); + + await createContextArchive(config.workspaceDir, archivePath); + + const archiveSize = await getArchiveSize(archivePath); + const sizeMB = (archiveSize / 1024 / 1024).toFixed(2); + $deploymentSpinner.message(`Deployment files ready (${sizeMB} MB)`); + + const artifactResult = await apiClient.createArtifact({ + type: "deployment_context", + contentType: "application/gzip", + contentLength: archiveSize, + }); + + if (!artifactResult.success) { + $deploymentSpinner.stop("Failed to upload deployment files"); + throw new Error(`Failed to create deployment artifact: ${artifactResult.error}`); + } + + const { artifactKey, uploadUrl, uploadFields } = artifactResult.data; + + logger.debug("Artifact created", { artifactKey }); + + $deploymentSpinner.message("Uploading deployment files"); + + const [readError, fileBuffer] = await tryCatch(readFile(archivePath)); + + if (readError) { + $deploymentSpinner.stop("Failed to read deployment archive"); + throw new Error(`Failed to read archive: ${readError.message}`); + } + + const formData = new FormData(); + + for (const [key, value] of Object.entries(uploadFields)) { + formData.append(key, value); + } + + const blob = new Blob([new Uint8Array(fileBuffer)], { type: "application/gzip" }); + formData.append("file", blob, "deployment.tar.gz"); + + const [uploadError, uploadResponse] = await tryCatch( + fetch(uploadUrl, { + method: "POST", + body: formData, + }) + ); + + if (uploadError || !uploadResponse?.ok) { + $deploymentSpinner.stop("Failed to upload deployment files"); + throw new Error( + `Failed to upload archive: ${uploadError?.message} ${uploadResponse?.status} ${uploadResponse?.statusText}` + ); + } + + $deploymentSpinner.stop("Deployment files uploaded"); + + const [unlinkError] = await tryCatch(unlink(archivePath)); + if (unlinkError) { + logger.debug("Failed to delete deployment artifact file", { archivePath, error: unlinkError }); + } + + const initializeDeploymentResult = await apiClient.initializeDeployment({ + contentHash: "-", + userId, + gitMeta, + type: config.features.run_engine_v2 ? "MANAGED" : "V1", + runtime: config.runtime, + isNativeBuild: true, + artifactKey, + skipPromotion: options.skipPromotion, + }); + + if (!initializeDeploymentResult.success) { + throw new Error(`Failed to initialize deployment: ${initializeDeploymentResult.error}`); + } + + const deployment = initializeDeploymentResult.data; + + const rawDeploymentLink = `${dashboardUrl}/projects/v3/${config.project}/deployments/${deployment.shortCode}`; + const rawTestLink = `${dashboardUrl}/projects/v3/${config.project}/test?environment=${ + options.env === "prod" ? "prod" : "stg" + }`; + + setGithubActionsOutputAndEnvVars({ + envVars: { + TRIGGER_DEPLOYMENT_VERSION: deployment.version, + TRIGGER_VERSION: deployment.version, + TRIGGER_DEPLOYMENT_SHORT_CODE: deployment.shortCode, + TRIGGER_DEPLOYMENT_URL: rawDeploymentLink, + TRIGGER_TEST_URL: rawTestLink, + }, + outputs: { + deploymentVersion: deployment.version, + workerVersion: deployment.version, + deploymentShortCode: deployment.shortCode, + deploymentUrl: rawDeploymentLink, + testUrl: rawTestLink, + needsPromotion: options.skipPromotion ? "true" : "false", + }, + }); + + const { eventStream } = deployment; + + if (!eventStream) { + log.warn(`Failed streaming build logs, open the deployment in the dashboard to view the logs`); + + if (!isLinksSupported) { + log.info(`View deployment: ${rawDeploymentLink}`); + } + + outro( + `Version ${deployment.version} is being deployed ${ + isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" + }` + ); + + process.exit(0); + } + + const exposedDeploymentLink = isLinksSupported + ? cliLink(chalk.bold(rawDeploymentLink), rawDeploymentLink) + : chalk.bold(rawDeploymentLink); + log.info(`View deployment: ${exposedDeploymentLink}`); + + const $queuedSpinner = spinner({ + cancelMessage: + "Disconnecting from the build server log stream. If you intended to cancel the deployment instead, you can do that in the dashboard.", + }); + $queuedSpinner.start("Build queued"); + + const abortController = new AbortController(); + let deploymentLog: ReturnType | undefined; + + const s2 = new S2({ accessToken: eventStream.s2.accessToken }); + const basin = s2.basin(eventStream.s2.basin); + const stream = basin.stream(eventStream.s2.stream); + + const [readSessionError, readSession] = await tryCatch( + stream.readSession( + { + seq_num: 0, + wait: 60 * 20, // 20 minutes + as: "bytes", + }, + { signal: abortController.signal } + ) + ); + + if (readSessionError) { + $queuedSpinner.stop("Failed to query build progress"); + log.warn(`Failed streaming build logs, open the deployment in the dashboard to view the logs`); + + outro( + `Version ${deployment.version} is being deployed ${ + isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" + }` + ); + + return; + } + + const decoder = new TextDecoder(); + let finalDeploymentEvent: DeploymentFinalizedEvent["data"] | undefined; + let queuedSpinnerStopped = false; + + for await (const record of readSession) { + const decoded = decoder.decode(record.body); + const result = DeploymentEventFromString.safeParse(decoded); + if (!result.success) { + logger.debug("Failed to parse deployment event, skipping", { + error: result.error, + record: decoded, + }); + continue; + } + + const event = result.data; + + switch (event.type) { + case "log": { + if (record.seq_num === 0) { + $queuedSpinner.stop("Build started"); + queuedSpinnerStopped = true; + deploymentLog = taskLog({ + title: "Deployment in progress...", + retainLog: true, + limit: isCI ? undefined : 20, + }); + } + + const formattedTimestamp = chalkGrey( + new Date(record.timestamp).toLocaleTimeString("en-US", { + hour12: false, + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + fractionalSecondDigits: 3, + }) + ); + + const { level, message } = event.data; + const formattedMessage = + level === "error" + ? chalk.bold.hex("#B91C1C")(message) + : level === "warn" + ? chalkWarning(message) + : level === "debug" + ? chalkGrey(message) + : message; + + deploymentLog?.message(`${formattedTimestamp} ${formattedMessage}`); + break; + } + case "finalized": { + finalDeploymentEvent = event.data; + abortController.abort(); // stop the stream + break; + } + default: { + event satisfies never; + logger.debug("Unknown deployment event, skipping", { event }); + continue; + } + } + } + + if (!queuedSpinnerStopped && !finalDeploymentEvent) { + // unlikely that it happens in practice, only in rare corner cases + // the timeout would kick in earlier if the build server fails to dequeue the build + + $queuedSpinner.stop("Log stream stopped"); + + log.error("Failed dequeueing build, please try again shortly"); + + throw new OutroCommandError( + `Version ${deployment.version} ${ + isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" + }` + ); + } + + if (!finalDeploymentEvent) { + deploymentLog?.error( + "Stopped receiving updates from the build server, please check the deployment status in the dashboard" + ); + + if (!isLinksSupported) { + log.info(`View deployment: ${rawDeploymentLink}`); + } + + throw new OutroCommandError( + `Version ${deployment.version} ${ + isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" + }` + ); + } + + switch (finalDeploymentEvent.result) { + case "succeeded": { + queuedSpinnerStopped + ? deploymentLog?.success("Deployment completed successfully") + : $queuedSpinner.stop("Deployment completed successfully"); + + if (finalDeploymentEvent.message) { + log.success(finalDeploymentEvent.message); + } + + if (!isLinksSupported) { + log.info(`Test tasks: ${rawTestLink}`); + } + + outro( + `Version ${deployment.version} was deployed ${ + isLinksSupported + ? `| ${cliLink("Test tasks", rawTestLink)} | ${cliLink( + "View deployment", + rawDeploymentLink + )}` + : "" + }` + ); + process.exit(0); + } + case "failed": { + queuedSpinnerStopped + ? deploymentLog?.error("Deployment failed") + : $queuedSpinner.stop("Deployment failed"); + + if (finalDeploymentEvent.message) { + log.error(chalk.bold(chalkError(finalDeploymentEvent.message))); + } + throw new OutroCommandError( + `Version ${deployment.version} deployment failed ${ + isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" + }` + ); + } + case "timed_out": { + queuedSpinnerStopped + ? deploymentLog?.error("Deployment timed out") + : $queuedSpinner.stop("Deployment timed out"); + + if (finalDeploymentEvent.message) { + log.error(chalk.bold(chalkError(finalDeploymentEvent.message))); + } + throw new OutroCommandError( + `Version ${deployment.version} deployment timed out ${ + isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" + }` + ); + } + case "canceled": { + queuedSpinnerStopped + ? deploymentLog?.error("Deployment was canceled") + : $queuedSpinner.stop("Deployment was canceled"); + + if (finalDeploymentEvent.message) { + log.error(chalk.bold(chalkError(finalDeploymentEvent.message))); + } + throw new OutroCommandError( + `Version ${deployment.version} deployment canceled ${ + isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" + }` + ); + } + default: { + // This case is only relevant in case we extend the enum in the future. + // New enum values will not be treated as errors in older cli versions. + queuedSpinnerStopped + ? deploymentLog?.success("Log stream finished") + : $queuedSpinner.stop("Log stream finished"); + if (finalDeploymentEvent.message) { + log.message(finalDeploymentEvent.message); + } + + if (!isLinksSupported) { + log.info(`Test tasks: ${rawTestLink}`); + } + + outro( + `Version ${deployment.version} ${ + isLinksSupported + ? `| ${cliLink("Test tasks", rawTestLink)} | ${cliLink( + "View deployment", + rawDeploymentLink + )}` + : "" + }` + ); + process.exit(0); + } + } +} + export function verifyDirectory(dir: string, projectPath: string) { if (dir !== "." && !isDirectory(projectPath)) { if (dir === "staging" || dir === "prod" || dir === "preview") { @@ -844,3 +1250,15 @@ export function verifyDirectory(dir: string, projectPath: string) { throw new Error(`Directory "${dir}" not found at ${projectPath}`); } } + +const DeploymentEventFromString = z + .string() + .transform((s, ctx) => { + try { + return JSON.parse(s); + } catch { + ctx.addIssue({ code: z.ZodIssueCode.custom, message: "Invalid JSON" }); + return z.NEVER; + } + }) + .pipe(DeploymentEvent); diff --git a/packages/cli-v3/src/commands/workers/build.ts b/packages/cli-v3/src/commands/workers/build.ts index 17b5b19999..06498d4298 100644 --- a/packages/cli-v3/src/commands/workers/build.ts +++ b/packages/cli-v3/src/commands/workers/build.ts @@ -239,6 +239,7 @@ async function _workerBuildCommand(dir: string, options: WorkersBuildCommandOpti userId: authorization.userId, selfHosted: options.local, type: "UNMANAGED", + isNativeBuild: false, }); if (!deploymentResponse.success) { diff --git a/packages/cli-v3/src/deploy/archiveContext.ts b/packages/cli-v3/src/deploy/archiveContext.ts new file mode 100644 index 0000000000..d0000d22f9 --- /dev/null +++ b/packages/cli-v3/src/deploy/archiveContext.ts @@ -0,0 +1,154 @@ +import { existsSync } from "node:fs"; +import { readFile } from "node:fs/promises"; +import { join } from "node:path"; +import { glob } from "tinyglobby"; +import * as tar from "tar"; +import ignore from "ignore"; +import { tryCatch } from "@trigger.dev/core/v3"; +import { logger } from "../utilities/logger.js"; + +const DEFAULT_IGNORES = [ + ".git/**", + "node_modules/**", + "**/.DS_Store", + "**/.git", + "**/node_modules", + "**/*.log", + "**/npm-debug.log*", + "**/yarn-debug.log*", + "**/yarn-error.log*", + "**/.npm", + "**/.eslintcache", + "**/.node_repl_history", + "**/.yarn-integrity", + "**/coverage", + "**/.nyc_output", + "**/.cache", + "**/.parcel-cache", + "**/.next", + "**/.nuxt", + "**/dist", + "**/.turbo", + "**/.vercel", + "**/out", + "**/.temp", + "**/.tmp", + "**/.trigger", + "**/.env", + "**/.env.local", + "**/Thumbs.db", + "**/.idea", + "**/.vscode", + "**/.output", + "**/.yarn", + "**/build", + "**/__pycache__", + "**/*.pyc", + "**/.venv", + "**/venv", +]; + +async function getGitignoreContent(gitignorePath: string): Promise { + if (!existsSync(gitignorePath)) { + return ""; + } + + const [error, content] = await tryCatch(readFile(gitignorePath, "utf-8")); + + if (error) { + throw new Error(`Failed to read .gitignore at ${gitignorePath}: ${error.message}`); + } + + return content; +} + +function gitignoreToGlobs(content: string): string[] { + if (content.includes("!")) { + return []; + } + + return content + .split("\n") + .map((line) => line.trim()) + .filter((line) => line && !line.startsWith("#")) + .map((pattern) => { + if (pattern.endsWith("/")) { + const isAnchored = pattern.startsWith("/"); + const cleanPattern = pattern.replace(/^\//, ""); + + if (isAnchored) { + return `${cleanPattern}**`; + } + return `**/${cleanPattern}**`; + } + + // For files, we only pass exact root matches or simple patterns to help with root clutter + // complex wildcards are hard to map perfectly to fast-glob ignores without risk + return pattern; + }); +} + +export async function createContextArchive(workspaceDir: string, outputPath: string) { + logger.debug("Creating context archive", { workspaceDir, outputPath }); + + // read .gitignore if it exists + const gitignorePath = join(workspaceDir, ".gitignore"); + const gitignoreContent = await getGitignoreContent(gitignorePath); + + const ig = ignore(); + ig.add(DEFAULT_IGNORES); + if (gitignoreContent) { + ig.add(gitignoreContent); + } + + // performance optimization + const gitignoreGlobs = gitignoreToGlobs(gitignoreContent); + const globIgnorePatterns = [...DEFAULT_IGNORES, ...gitignoreGlobs]; + + logger.debug("Ignore patterns for glob", { count: globIgnorePatterns.length }); + + // find all files to include in the archive + const startTime = Date.now(); + const allFiles = await glob(["**/*"], { + cwd: workspaceDir, + ignore: globIgnorePatterns, + dot: true, + absolute: false, + onlyFiles: true, + followSymbolicLinks: false, // don't follow symlinks to avoid infinite loops or outside access + }); + + // filter using ignore package for correctness + const files = allFiles.filter((file) => !ig.ignores(file)); + + const scanDuration = Date.now() - startTime; + + logger.debug("Files to archive", { + count: files.length, + scanDurationMs: scanDuration, + ignoredCount: allFiles.length - files.length, + }); + + if (files.length === 0) { + throw new Error("No files found to archive. Check your .gitignore settings."); + } + + await tar.create( + { + gzip: true, + file: outputPath, + cwd: workspaceDir, + portable: true, + preservePaths: false, + mtime: new Date(0), + }, + files + ); + + logger.debug("Archive created", { outputPath, fileCount: files.length }); +} + +export async function getArchiveSize(archivePath: string): Promise { + const { statSync } = await import("node:fs"); + return statSync(archivePath).size; +} diff --git a/packages/cli-v3/src/utilities/windows.ts b/packages/cli-v3/src/utilities/windows.ts index e3363e9040..2e01121e3a 100644 --- a/packages/cli-v3/src/utilities/windows.ts +++ b/packages/cli-v3/src/utilities/windows.ts @@ -37,7 +37,7 @@ function truncateMessage(msg: string, maxLength?: number): string { return truncated + "..."; } -const wrappedClackSpinner = () => { +const wrappedClackSpinner = (options: { cancelMessage?: string }) => { let currentMessage = ""; let isActive = false; @@ -47,7 +47,7 @@ const wrappedClackSpinner = () => { } }; - const spinner = clackSpinner(); + const spinner = clackSpinner(options); return { start: (msg?: string): void => { @@ -100,4 +100,5 @@ const ballmerSpinner = () => ({ // This will become unecessary with the next clack release, the bug was fixed here: // https://github.com/natemoo-re/clack/pull/182 -export const spinner = () => (isWindows ? ballmerSpinner() : wrappedClackSpinner()); +export const spinner = (options: { cancelMessage?: string } = {}) => + isWindows ? ballmerSpinner() : wrappedClackSpinner(options); diff --git a/packages/core/src/v3/schemas/api.ts b/packages/core/src/v3/schemas/api.ts index 34e272276f..7a774e2acc 100644 --- a/packages/core/src/v3/schemas/api.ts +++ b/packages/core/src/v3/schemas/api.ts @@ -414,6 +414,23 @@ export const UpsertBranchResponseBody = z.object({ export type UpsertBranchResponseBody = z.infer; +export const CreateArtifactRequestBody = z.object({ + type: z.enum(["deployment_context"]).default("deployment_context"), + contentType: z.string().default("application/gzip"), + contentLength: z.number().optional(), +}); + +export type CreateArtifactRequestBody = z.infer; + +export const CreateArtifactResponseBody = z.object({ + artifactKey: z.string(), + uploadUrl: z.string(), + uploadFields: z.record(z.string()), + expiresAt: z.string().datetime(), +}); + +export type CreateArtifactResponseBody = z.infer; + export const InitializeDeploymentResponseBody = z.object({ id: z.string(), contentHash: z.string(), @@ -422,20 +439,52 @@ export const InitializeDeploymentResponseBody = z.object({ imageTag: z.string(), imagePlatform: z.string(), externalBuildData: ExternalBuildData.optional().nullable(), + eventStream: z + .object({ + s2: z.object({ + basin: z.string(), + stream: z.string(), + accessToken: z.string(), + }), + }) + .optional(), }); export type InitializeDeploymentResponseBody = z.infer; -export const InitializeDeploymentRequestBody = z.object({ - contentHash: z.string(), - userId: z.string().optional(), - /** @deprecated This is now determined by the webapp. This is only used to warn users with old CLI versions. */ - selfHosted: z.boolean().optional(), - gitMeta: GitMeta.optional(), - type: z.enum(["MANAGED", "UNMANAGED", "V1"]).optional(), - runtime: z.string().optional(), - initialStatus: z.enum(["PENDING", "BUILDING"]).optional(), -}); +export const InitializeDeploymentRequestBody = z + .object({ + contentHash: z.string(), + userId: z.string().optional(), + /** @deprecated This is now determined by the webapp. This is only used to warn users with old CLI versions. */ + selfHosted: z.boolean().optional(), + gitMeta: GitMeta.optional(), + type: z.enum(["MANAGED", "UNMANAGED", "V1"]).optional(), + runtime: z.string().optional(), + initialStatus: z.enum(["PENDING", "BUILDING"]).optional(), + }) + .and( + z.preprocess( + (val) => { + const obj = val as any; + if (!obj || !obj.isNativeBuild) { + return { ...obj, isNativeBuild: false }; + } + return obj; + }, + z.discriminatedUnion("isNativeBuild", [ + z.object({ + isNativeBuild: z.literal(true), + skipPromotion: z.boolean(), + artifactKey: z.string(), + configFilePath: z.string().optional(), + }), + z.object({ + isNativeBuild: z.literal(false), + }), + ]) + ) + ); export type InitializeDeploymentRequestBody = z.infer; @@ -530,6 +579,33 @@ export const GetLatestDeploymentResponseBody = GetDeploymentResponseBody.omit({ }); export type GetLatestDeploymentResponseBody = z.infer; +export const DeploymentLogEvent = z.object({ + type: z.literal("log"), + data: z.object({ + level: z.enum(["debug", "info", "warn", "error"]).optional().default("info"), + message: z.string(), + }), +}); + +const anyString = z.custom((v) => typeof v === "string"); + +export const DeploymentFinalizedEvent = z.object({ + type: z.literal("finalized"), + data: z.object({ + result: z.enum(["succeeded", "failed", "timed_out", "canceled"]).or(anyString), + message: z.string().optional(), + }), +}); + +export const DeploymentEvent = z.discriminatedUnion("type", [ + DeploymentLogEvent, + DeploymentFinalizedEvent, +]); + +export type DeploymentEvent = z.infer; +export type DeploymentLogEvent = z.infer; +export type DeploymentFinalizedEvent = z.infer; + export const CreateUploadPayloadUrlResponseBody = z.object({ presignedUrl: z.string(), }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee80ee382f..3829f7bab8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -210,12 +210,24 @@ importers: '@aws-sdk/client-ecr': specifier: ^3.931.0 version: 3.931.0 + '@aws-sdk/client-s3': + specifier: ^3.936.0 + version: 3.937.0 '@aws-sdk/client-sqs': specifier: ^3.445.0 version: 3.454.0 '@aws-sdk/client-sts': specifier: ^3.840.0 version: 3.840.0 + '@aws-sdk/credential-provider-node': + specifier: ^3.936.0 + version: 3.936.0 + '@aws-sdk/s3-presigned-post': + specifier: ^3.936.0 + version: 3.937.0 + '@aws-sdk/s3-request-presigner': + specifier: ^3.936.0 + version: 3.937.0 '@better-auth/utils': specifier: ^0.2.6 version: 0.2.6 @@ -463,8 +475,8 @@ importers: specifier: workspace:* version: link:../../internal-packages/otlp-importer '@trigger.dev/platform': - specifier: 1.0.20 - version: 1.0.20 + specifier: 0.0.0-prerelease-20251121183112 + version: 0.0.0-prerelease-20251121183112 '@trigger.dev/redis-worker': specifier: workspace:* version: link:../../packages/redis-worker @@ -1319,8 +1331,8 @@ importers: packages/cli-v3: dependencies: '@clack/prompts': - specifier: 0.11.0 - version: 0.11.0 + specifier: 1.0.0-alpha.6 + version: 1.0.0-alpha.6 '@depot/cli': specifier: 0.0.1-cli.2.80.0 version: 0.0.1-cli.2.80.0 @@ -1351,6 +1363,9 @@ importers: '@opentelemetry/semantic-conventions': specifier: 1.36.0 version: 1.36.0 + '@s2-dev/streamstore': + specifier: ^0.17.6 + version: 0.17.6 '@trigger.dev/build': specifier: workspace:4.1.2 version: link:../build @@ -1411,6 +1426,9 @@ importers: has-flag: specifier: ^5.0.1 version: 5.0.1 + ignore: + specifier: ^7.0.5 + version: 7.0.5 import-in-the-middle: specifier: 1.11.0 version: 1.11.0 @@ -1480,6 +1498,9 @@ importers: supports-color: specifier: ^10.0.0 version: 10.0.0 + tar: + specifier: ^7.4.3 + version: 7.4.3 tiny-invariant: specifier: ^1.2.0 version: 1.3.1 @@ -3164,16 +3185,44 @@ packages: resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.451.0 + '@aws-sdk/types': 3.930.0 tslib: 1.14.1 dev: false + /@aws-crypto/crc32@5.2.0: + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.936.0 + tslib: 2.8.1 + dev: false + + /@aws-crypto/crc32c@5.2.0: + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.936.0 + tslib: 2.8.1 + dev: false + /@aws-crypto/ie11-detection@3.0.0: resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==} dependencies: tslib: 1.14.1 dev: false + /@aws-crypto/sha1-browser@5.2.0: + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} + dependencies: + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-locate-window': 3.893.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + dev: false + /@aws-crypto/sha256-browser@3.0.0: resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==} dependencies: @@ -3181,7 +3230,7 @@ packages: '@aws-crypto/sha256-js': 3.0.0 '@aws-crypto/supports-web-crypto': 3.0.0 '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.451.0 + '@aws-sdk/types': 3.930.0 '@aws-sdk/util-locate-window': 3.310.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 @@ -3203,7 +3252,7 @@ packages: resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==} dependencies: '@aws-crypto/util': 3.0.0 - '@aws-sdk/types': 3.451.0 + '@aws-sdk/types': 3.930.0 tslib: 1.14.1 dev: false @@ -3231,7 +3280,7 @@ packages: /@aws-crypto/util@3.0.0: resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==} dependencies: - '@aws-sdk/types': 3.451.0 + '@aws-sdk/types': 3.930.0 '@aws-sdk/util-utf8-browser': 3.259.0 tslib: 1.14.1 dev: false @@ -3340,6 +3389,69 @@ packages: - aws-crt dev: false + /@aws-sdk/client-s3@3.937.0: + resolution: {integrity: sha512-ioeNe6HSc7PxjsUQY7foSHmgesxM5KwAeUtPhIHgKx99nrM+7xYCfW4FMvHypUzz7ZOvqlCdH7CEAZ8ParBvVg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/sha1-browser': 5.2.0 + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.936.0 + '@aws-sdk/credential-provider-node': 3.936.0 + '@aws-sdk/middleware-bucket-endpoint': 3.936.0 + '@aws-sdk/middleware-expect-continue': 3.936.0 + '@aws-sdk/middleware-flexible-checksums': 3.936.0 + '@aws-sdk/middleware-host-header': 3.936.0 + '@aws-sdk/middleware-location-constraint': 3.936.0 + '@aws-sdk/middleware-logger': 3.936.0 + '@aws-sdk/middleware-recursion-detection': 3.936.0 + '@aws-sdk/middleware-sdk-s3': 3.936.0 + '@aws-sdk/middleware-ssec': 3.936.0 + '@aws-sdk/middleware-user-agent': 3.936.0 + '@aws-sdk/region-config-resolver': 3.936.0 + '@aws-sdk/signature-v4-multi-region': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@aws-sdk/util-user-agent-browser': 3.936.0 + '@aws-sdk/util-user-agent-node': 3.936.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.5 + '@smithy/eventstream-serde-browser': 4.2.5 + '@smithy/eventstream-serde-config-resolver': 4.3.5 + '@smithy/eventstream-serde-node': 4.2.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-blob-browser': 4.2.6 + '@smithy/hash-node': 4.2.5 + '@smithy/hash-stream-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/md5-js': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.11 + '@smithy/util-defaults-mode-node': 4.2.14 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + '@smithy/util-waiter': 4.2.5 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/client-ses@3.716.0: resolution: {integrity: sha512-lYsg2x3Z6R5ngBX1EqFKR6jf77ewbGg+aZV6V4ucVCghaGGcGnGisRP4FAep3IgkrZuByEYeJaA6cTli98qaOQ==} engines: {node: '>=16.0.0'} @@ -3484,7 +3596,7 @@ packages: '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -3527,7 +3639,7 @@ packages: '@smithy/util-defaults-mode-node': 2.0.26 '@smithy/util-endpoints': 1.0.5 '@smithy/util-retry': 2.0.7 - '@smithy/util-utf8': 2.0.2 + '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -3595,31 +3707,31 @@ packages: '@aws-sdk/util-endpoints': 3.828.0 '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.839.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.6.0 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.13 - '@smithy/middleware-retry': 4.1.14 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.0.6 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.21 - '@smithy/util-defaults-mode-node': 4.0.21 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@smithy/util-utf8': 4.0.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.3 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.10 + '@smithy/middleware-retry': 4.4.10 + '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.9 + '@smithy/util-defaults-mode-node': 4.2.12 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -3641,31 +3753,31 @@ packages: '@aws-sdk/util-endpoints': 3.840.0 '@aws-sdk/util-user-agent-browser': 3.840.0 '@aws-sdk/util-user-agent-node': 3.840.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.6.0 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.13 - '@smithy/middleware-retry': 4.1.14 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.0.6 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.21 - '@smithy/util-defaults-mode-node': 4.0.21 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@smithy/util-utf8': 4.0.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.3 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.10 + '@smithy/middleware-retry': 4.4.10 + '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.9 + '@smithy/util-defaults-mode-node': 4.2.12 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -3717,6 +3829,52 @@ packages: - aws-crt dev: false + /@aws-sdk/client-sso@3.936.0: + resolution: {integrity: sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.936.0 + '@aws-sdk/middleware-host-header': 3.936.0 + '@aws-sdk/middleware-logger': 3.936.0 + '@aws-sdk/middleware-recursion-detection': 3.936.0 + '@aws-sdk/middleware-user-agent': 3.936.0 + '@aws-sdk/region-config-resolver': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@aws-sdk/util-user-agent-browser': 3.936.0 + '@aws-sdk/util-user-agent-node': 3.936.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.11 + '@smithy/util-defaults-mode-node': 4.2.14 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/client-sts@3.454.0: resolution: {integrity: sha512-0fDvr8WeB6IYO8BUCzcivWmahgGl/zDbaYfakzGnt4mrl5ztYaXE875WI6b7+oFcKMRvN+KLvwu5TtyFuNY+GQ==} engines: {node: '>=14.0.0'} @@ -3758,9 +3916,9 @@ packages: '@smithy/util-defaults-mode-node': 2.0.26 '@smithy/util-endpoints': 1.0.5 '@smithy/util-retry': 2.0.7 - '@smithy/util-utf8': 2.0.2 + '@smithy/util-utf8': 2.3.0 fast-xml-parser: 4.2.5 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -3808,7 +3966,7 @@ packages: '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -3865,7 +4023,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/smithy-client': 2.1.16 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/core@3.716.0: @@ -3882,7 +4040,7 @@ packages: '@smithy/types': 3.7.2 '@smithy/util-middleware': 3.0.11 fast-xml-parser: 4.4.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/core@3.839.0: @@ -3891,17 +4049,17 @@ packages: dependencies: '@aws-sdk/types': 3.821.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.6.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-utf8': 4.0.0 + '@smithy/core': 3.18.3 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-utf8': 4.2.0 fast-xml-parser: 4.4.1 tslib: 2.8.1 dev: false @@ -3912,17 +4070,17 @@ packages: dependencies: '@aws-sdk/types': 3.840.0 '@aws-sdk/xml-builder': 3.821.0 - '@smithy/core': 3.6.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/signature-v4': 5.1.2 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-utf8': 4.0.0 + '@smithy/core': 3.18.3 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-utf8': 4.2.0 fast-xml-parser: 4.4.1 tslib: 2.8.1 dev: false @@ -3946,6 +4104,25 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/core@3.936.0: + resolution: {integrity: sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@aws-sdk/xml-builder': 3.930.0 + '@smithy/core': 3.18.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/credential-provider-env@3.451.0: resolution: {integrity: sha512-9dAav7DcRgaF7xCJEQR5ER9ErXxnu/tdnVJ+UPmb1NPeIZdESv1A3lxFDEq1Fs8c4/lzAj9BpshGyJVIZwZDKg==} engines: {node: '>=14.0.0'} @@ -3973,9 +4150,9 @@ packages: dependencies: '@aws-sdk/core': 3.839.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 - tslib: 2.8.1 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 dev: false /@aws-sdk/credential-provider-env@3.840.0: @@ -3984,8 +4161,8 @@ packages: dependencies: '@aws-sdk/core': 3.840.0 '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4000,6 +4177,17 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/credential-provider-env@3.936.0: + resolution: {integrity: sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/credential-provider-http@3.716.0: resolution: {integrity: sha512-CZ04pl2z7igQPysQyH2xKZHM3fLwkemxQbKOlje3TmiS1NwXvcKvERhp9PE/H23kOL7beTM19NMRog/Fka/rlw==} engines: {node: '>=16.0.0'} @@ -4022,13 +4210,13 @@ packages: dependencies: '@aws-sdk/core': 3.839.0 '@aws-sdk/types': 3.821.0 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/node-http-handler': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 - '@smithy/util-stream': 4.2.2 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 tslib: 2.8.1 dev: false @@ -4038,13 +4226,13 @@ packages: dependencies: '@aws-sdk/core': 3.840.0 '@aws-sdk/types': 3.840.0 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/node-http-handler': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 - '@smithy/util-stream': 4.2.2 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 tslib: 2.8.1 dev: false @@ -4064,6 +4252,22 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/credential-provider-http@3.936.0: + resolution: {integrity: sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/node-http-handler': 4.4.5 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 + tslib: 2.8.1 + dev: false + /@aws-sdk/credential-provider-ini@3.451.0: resolution: {integrity: sha512-TySt64Ci5/ZbqFw1F9Z0FIGvYx5JSC9e6gqDnizIYd8eMnn8wFRUscRrD7pIHKfrhvVKN5h0GdYovmMO/FMCBw==} engines: {node: '>=14.0.0'} @@ -4118,10 +4322,10 @@ packages: '@aws-sdk/credential-provider-web-identity': 3.839.0 '@aws-sdk/nested-clients': 3.839.0 '@aws-sdk/types': 3.821.0 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4139,10 +4343,10 @@ packages: '@aws-sdk/credential-provider-web-identity': 3.840.0 '@aws-sdk/nested-clients': 3.840.0 '@aws-sdk/types': 3.840.0 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4169,6 +4373,44 @@ packages: - aws-crt dev: false + /@aws-sdk/credential-provider-ini@3.936.0: + resolution: {integrity: sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.936.0 + '@aws-sdk/credential-provider-env': 3.936.0 + '@aws-sdk/credential-provider-http': 3.936.0 + '@aws-sdk/credential-provider-login': 3.936.0 + '@aws-sdk/credential-provider-process': 3.936.0 + '@aws-sdk/credential-provider-sso': 3.936.0 + '@aws-sdk/credential-provider-web-identity': 3.936.0 + '@aws-sdk/nested-clients': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/credential-provider-login@3.936.0: + resolution: {integrity: sha512-8DVrdRqPyUU66gfV7VZNToh56ZuO5D6agWrkLQE/xbLJOm2RbeRgh6buz7CqV8ipRd6m+zCl9mM4F3osQLZn8Q==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.936.0 + '@aws-sdk/nested-clients': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/credential-provider-node@3.451.0: resolution: {integrity: sha512-AEwM1WPyxUdKrKyUsKyFqqRFGU70e4qlDyrtBxJnSU9NRLZI8tfEZ67bN7fHSxBUBODgDXpMSlSvJiBLh5/3pw==} engines: {node: '>=14.0.0'} @@ -4183,7 +4425,7 @@ packages: '@smithy/property-provider': 2.0.15 '@smithy/shared-ini-file-loader': 2.2.5 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - aws-crt dev: false @@ -4203,7 +4445,7 @@ packages: '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 transitivePeerDependencies: - '@aws-sdk/client-sso-oidc' - '@aws-sdk/client-sts' @@ -4221,10 +4463,10 @@ packages: '@aws-sdk/credential-provider-sso': 3.839.0 '@aws-sdk/credential-provider-web-identity': 3.839.0 '@aws-sdk/types': 3.821.0 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4241,10 +4483,10 @@ packages: '@aws-sdk/credential-provider-sso': 3.840.0 '@aws-sdk/credential-provider-web-identity': 3.840.0 '@aws-sdk/types': 3.840.0 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4270,6 +4512,26 @@ packages: - aws-crt dev: false + /@aws-sdk/credential-provider-node@3.936.0: + resolution: {integrity: sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/credential-provider-env': 3.936.0 + '@aws-sdk/credential-provider-http': 3.936.0 + '@aws-sdk/credential-provider-ini': 3.936.0 + '@aws-sdk/credential-provider-process': 3.936.0 + '@aws-sdk/credential-provider-sso': 3.936.0 + '@aws-sdk/credential-provider-web-identity': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/credential-provider-process@3.451.0: resolution: {integrity: sha512-HQywSdKeD5PErcLLnZfSyCJO+6T+ZyzF+Lm/QgscSC+CbSUSIPi//s15qhBRVely/3KBV6AywxwNH+5eYgt4lQ==} engines: {node: '>=14.0.0'} @@ -4299,9 +4561,9 @@ packages: dependencies: '@aws-sdk/core': 3.839.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4311,9 +4573,9 @@ packages: dependencies: '@aws-sdk/core': 3.840.0 '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4329,6 +4591,18 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/credential-provider-process@3.936.0: + resolution: {integrity: sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/credential-provider-sso@3.451.0: resolution: {integrity: sha512-Usm/N51+unOt8ID4HnQzxIjUJDrkAQ1vyTOC0gSEEJ7h64NSSPGD5yhN7il5WcErtRd3EEtT1a8/GTC5TdBctg==} engines: {node: '>=14.0.0'} @@ -4369,9 +4643,9 @@ packages: '@aws-sdk/core': 3.839.0 '@aws-sdk/token-providers': 3.839.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4385,9 +4659,9 @@ packages: '@aws-sdk/core': 3.840.0 '@aws-sdk/token-providers': 3.840.0 '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4409,6 +4683,22 @@ packages: - aws-crt dev: false + /@aws-sdk/credential-provider-sso@3.936.0: + resolution: {integrity: sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/client-sso': 3.936.0 + '@aws-sdk/core': 3.936.0 + '@aws-sdk/token-providers': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/credential-provider-web-identity@3.451.0: resolution: {integrity: sha512-Xtg3Qw65EfDjWNG7o2xD6sEmumPfsy3WDGjk2phEzVg8s7hcZGxf5wYwe6UY7RJvlEKrU0rFA+AMn6Hfj5oOzg==} engines: {node: '>=14.0.0'} @@ -4440,8 +4730,8 @@ packages: '@aws-sdk/core': 3.839.0 '@aws-sdk/nested-clients': 3.839.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4454,8 +4744,8 @@ packages: '@aws-sdk/core': 3.840.0 '@aws-sdk/nested-clients': 3.840.0 '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4476,6 +4766,63 @@ packages: - aws-crt dev: false + /@aws-sdk/credential-provider-web-identity@3.936.0: + resolution: {integrity: sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.936.0 + '@aws-sdk/nested-clients': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/middleware-bucket-endpoint@3.936.0: + resolution: {integrity: sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-config-provider': 4.2.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-expect-continue@3.936.0: + resolution: {integrity: sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-flexible-checksums@3.936.0: + resolution: {integrity: sha512-l3GG6CrSQtMCM6fWY7foV3JQv0WJWT+3G6PSP3Ceb/KEE/5Lz5PrYFXTBf+bVoYL1b0bGjGajcgAXpstBmtHtQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@aws-crypto/crc32c': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/core': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/is-array-buffer': 4.2.0 + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/middleware-host-header@3.451.0: resolution: {integrity: sha512-j8a5jAfhWmsK99i2k8oR8zzQgXrsJtgrLxc3js6U+525mcZytoiDndkWTmD5fjJ1byU1U2E5TaPq+QJeDip05Q==} engines: {node: '>=14.0.0'} @@ -4483,7 +4830,7 @@ packages: '@aws-sdk/types': 3.451.0 '@smithy/protocol-http': 3.0.10 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-host-header@3.714.0: @@ -4493,7 +4840,7 @@ packages: '@aws-sdk/types': 3.714.0 '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-host-header@3.821.0: @@ -4501,8 +4848,8 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4511,8 +4858,8 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.840.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4526,13 +4873,32 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/middleware-host-header@3.936.0: + resolution: {integrity: sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-location-constraint@3.936.0: + resolution: {integrity: sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/middleware-logger@3.451.0: resolution: {integrity: sha512-0kHrYEyVeB2QBfP6TfbI240aRtatLZtcErJbhpiNUb+CQPgEL3crIjgVE8yYiJumZ7f0jyjo8HLPkwD1/2APaw==} engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.451.0 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-logger@3.714.0: @@ -4541,7 +4907,7 @@ packages: dependencies: '@aws-sdk/types': 3.714.0 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-logger@3.821.0: @@ -4549,7 +4915,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4558,7 +4924,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.840.0 - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4571,6 +4937,15 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/middleware-logger@3.936.0: + resolution: {integrity: sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/middleware-recursion-detection@3.451.0: resolution: {integrity: sha512-J6jL6gJ7orjHGM70KDRcCP7so/J2SnkN4vZ9YRLTeeZY6zvBuHDjX8GCIgSqPn/nXFXckZO8XSnA7u6+3TAT0w==} engines: {node: '>=14.0.0'} @@ -4578,7 +4953,7 @@ packages: '@aws-sdk/types': 3.451.0 '@smithy/protocol-http': 3.0.10 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-recursion-detection@3.714.0: @@ -4588,7 +4963,7 @@ packages: '@aws-sdk/types': 3.714.0 '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-recursion-detection@3.821.0: @@ -4596,8 +4971,8 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4606,8 +4981,8 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.840.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4622,6 +4997,37 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/middleware-recursion-detection@3.936.0: + resolution: {integrity: sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@aws/lambda-invoke-store': 0.2.1 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-sdk-s3@3.936.0: + resolution: {integrity: sha512-UQs/pVq4cOygsnKON0pOdSKIWkfgY0dzq4h+fR+xHi/Ng3XzxPJhWeAE6tDsKrcyQc1X8UdSbS70XkfGYr5hng==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.18.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/middleware-sdk-sqs@3.451.0: resolution: {integrity: sha512-GXpFSc9Ji4IAT/OaTkmnDrxzZrrAsJctUAC9vihpgGDof79A1Oz4R+r2uBMTKGxCIFkqyYW5Se7y2ijjTNa3ZA==} engines: {node: '>=14.0.0'} @@ -4629,8 +5035,8 @@ packages: '@aws-sdk/types': 3.451.0 '@smithy/types': 2.6.0 '@smithy/util-hex-encoding': 2.0.0 - '@smithy/util-utf8': 2.0.2 - tslib: 2.6.2 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-sdk-sts@3.451.0: @@ -4653,7 +5059,16 @@ packages: '@smithy/signature-v4': 2.0.16 '@smithy/types': 2.6.0 '@smithy/util-middleware': 2.0.7 - tslib: 2.6.2 + tslib: 2.8.1 + dev: false + + /@aws-sdk/middleware-ssec@3.936.0: + resolution: {integrity: sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-user-agent@3.451.0: @@ -4664,7 +5079,7 @@ packages: '@aws-sdk/util-endpoints': 3.451.0 '@smithy/protocol-http': 3.0.10 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-user-agent@3.716.0: @@ -4677,7 +5092,7 @@ packages: '@smithy/core': 2.5.5 '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/middleware-user-agent@3.839.0: @@ -4687,9 +5102,9 @@ packages: '@aws-sdk/core': 3.839.0 '@aws-sdk/types': 3.821.0 '@aws-sdk/util-endpoints': 3.828.0 - '@smithy/core': 3.6.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/core': 3.18.3 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4700,9 +5115,9 @@ packages: '@aws-sdk/core': 3.840.0 '@aws-sdk/types': 3.840.0 '@aws-sdk/util-endpoints': 3.840.0 - '@smithy/core': 3.6.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/core': 3.18.3 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -4719,6 +5134,19 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/middleware-user-agent@3.936.0: + resolution: {integrity: sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@smithy/core': 3.18.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/nested-clients@3.839.0: resolution: {integrity: sha512-Glic0pg2THYP3aRhJORwJJBe1JLtJoEdWV/MFZNyzCklfMwEzpWtZAyxy+tQyFmMeW50uBAnh2R0jhMMcf257w==} engines: {node: '>=18.0.0'} @@ -4735,31 +5163,31 @@ packages: '@aws-sdk/util-endpoints': 3.828.0 '@aws-sdk/util-user-agent-browser': 3.821.0 '@aws-sdk/util-user-agent-node': 3.839.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.6.0 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.13 - '@smithy/middleware-retry': 4.1.14 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.0.6 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.21 - '@smithy/util-defaults-mode-node': 4.0.21 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@smithy/util-utf8': 4.0.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.3 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.10 + '@smithy/middleware-retry': 4.4.10 + '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.9 + '@smithy/util-defaults-mode-node': 4.2.12 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4781,31 +5209,31 @@ packages: '@aws-sdk/util-endpoints': 3.840.0 '@aws-sdk/util-user-agent-browser': 3.840.0 '@aws-sdk/util-user-agent-node': 3.840.0 - '@smithy/config-resolver': 4.1.4 - '@smithy/core': 3.6.0 - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/hash-node': 4.0.4 - '@smithy/invalid-dependency': 4.0.4 - '@smithy/middleware-content-length': 4.0.4 - '@smithy/middleware-endpoint': 4.1.13 - '@smithy/middleware-retry': 4.1.14 - '@smithy/middleware-serde': 4.0.8 - '@smithy/middleware-stack': 4.0.4 - '@smithy/node-config-provider': 4.1.3 - '@smithy/node-http-handler': 4.0.6 - '@smithy/protocol-http': 5.1.2 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-body-length-node': 4.0.0 - '@smithy/util-defaults-mode-browser': 4.0.21 - '@smithy/util-defaults-mode-node': 4.0.21 - '@smithy/util-endpoints': 3.0.6 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 - '@smithy/util-utf8': 4.0.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.3 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.10 + '@smithy/middleware-retry': 4.4.10 + '@smithy/middleware-serde': 4.2.5 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.9 + '@smithy/util-defaults-mode-node': 4.2.12 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4857,6 +5285,52 @@ packages: - aws-crt dev: false + /@aws-sdk/nested-clients@3.936.0: + resolution: {integrity: sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.936.0 + '@aws-sdk/middleware-host-header': 3.936.0 + '@aws-sdk/middleware-logger': 3.936.0 + '@aws-sdk/middleware-recursion-detection': 3.936.0 + '@aws-sdk/middleware-user-agent': 3.936.0 + '@aws-sdk/region-config-resolver': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-endpoints': 3.936.0 + '@aws-sdk/util-user-agent-browser': 3.936.0 + '@aws-sdk/util-user-agent-node': 3.936.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/core': 3.18.5 + '@smithy/fetch-http-handler': 5.3.6 + '@smithy/hash-node': 4.2.5 + '@smithy/invalid-dependency': 4.2.5 + '@smithy/middleware-content-length': 4.2.5 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/middleware-retry': 4.4.12 + '@smithy/middleware-serde': 4.2.6 + '@smithy/middleware-stack': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/node-http-handler': 4.4.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.11 + '@smithy/util-defaults-mode-node': 4.2.14 + '@smithy/util-endpoints': 3.2.5 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/region-config-resolver@3.451.0: resolution: {integrity: sha512-3iMf4OwzrFb4tAAmoROXaiORUk2FvSejnHIw/XHvf/jjR4EqGGF95NZP/n/MeFZMizJWVssrwS412GmoEyoqhg==} engines: {node: '>=14.0.0'} @@ -4865,7 +5339,7 @@ packages: '@smithy/types': 2.6.0 '@smithy/util-config-provider': 2.0.0 '@smithy/util-middleware': 2.0.7 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/region-config-resolver@3.714.0: @@ -4877,7 +5351,7 @@ packages: '@smithy/types': 3.7.2 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.11 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/region-config-resolver@3.821.0: @@ -4885,10 +5359,10 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 + '@smithy/util-middleware': 4.2.5 tslib: 2.8.1 dev: false @@ -4897,10 +5371,10 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.840.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 + '@smithy/util-middleware': 4.2.5 tslib: 2.8.1 dev: false @@ -4915,6 +5389,60 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/region-config-resolver@3.936.0: + resolution: {integrity: sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/config-resolver': 4.4.3 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/s3-presigned-post@3.937.0: + resolution: {integrity: sha512-6oFuuCur5y2L6FG0jNT94x07s/5gvJ4PzIYI91l9vcQfnx6v3WFkdyKTQ0rDN9KqIcMIavieTvx+wnHhvUpkMA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/client-s3': 3.937.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-format-url': 3.936.0 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/signature-v4': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + + /@aws-sdk/s3-request-presigner@3.937.0: + resolution: {integrity: sha512-AvsCt6FnnKTpkmzDA1pFzmXPyxbGBdtllOIY0mL1iNSVZ3d7SoJKZH4NaqlcgUtbYG9zVh6QfLWememj1yEAmw==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/signature-v4-multi-region': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@aws-sdk/util-format-url': 3.936.0 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/protocol-http': 5.3.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/signature-v4-multi-region@3.936.0: + resolution: {integrity: sha512-8qS0GFUqkmwO7JZ0P8tdluBmt1UTfYUah8qJXGzNh9n1Pcb0AIeT117cCSiCUtwk+gDbJvd4hhRIhJCNr5wgjg==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/protocol-http': 5.3.5 + '@smithy/signature-v4': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/token-providers@3.451.0: resolution: {integrity: sha512-ij1L5iUbn6CwxVOT1PG4NFjsrsKN9c4N1YEM0lkl6DwmaNOscjLKGSNyj9M118vSWsOs1ZDbTwtj++h0O/BWrQ==} engines: {node: '>=14.0.0'} @@ -4954,7 +5482,7 @@ packages: '@smithy/util-defaults-mode-node': 2.0.26 '@smithy/util-endpoints': 1.0.5 '@smithy/util-retry': 2.0.7 - '@smithy/util-utf8': 2.0.2 + '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4981,9 +5509,9 @@ packages: '@aws-sdk/core': 3.839.0 '@aws-sdk/nested-clients': 3.839.0 '@aws-sdk/types': 3.821.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -4996,9 +5524,9 @@ packages: '@aws-sdk/core': 3.840.0 '@aws-sdk/nested-clients': 3.840.0 '@aws-sdk/types': 3.840.0 - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt @@ -5019,12 +5547,27 @@ packages: - aws-crt dev: false + /@aws-sdk/token-providers@3.936.0: + resolution: {integrity: sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/core': 3.936.0 + '@aws-sdk/nested-clients': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + dev: false + /@aws-sdk/types@3.451.0: resolution: {integrity: sha512-rhK+qeYwCIs+laJfWCcrYEjay2FR/9VABZJ2NRM89jV/fKqGVQR52E5DQqrI+oEIL5JHMhhnr4N4fyECMS35lw==} engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/types@3.714.0: @@ -5032,14 +5575,14 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/types@3.821.0: resolution: {integrity: sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -5047,7 +5590,7 @@ packages: resolution: {integrity: sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -5059,13 +5602,28 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/types@3.936.0: + resolution: {integrity: sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@aws-sdk/util-arn-parser@3.893.0: + resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + /@aws-sdk/util-endpoints@3.451.0: resolution: {integrity: sha512-giqLGBTnRIcKkDqwU7+GQhKbtJ5Ku35cjGQIfMyOga6pwTBUbaK0xW1Sdd8sBQ1GhApscnChzI9o/R9x0368vw==} engines: {node: '>=14.0.0'} dependencies: '@aws-sdk/types': 3.451.0 '@smithy/util-endpoints': 1.0.5 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-endpoints@3.714.0: @@ -5075,7 +5633,7 @@ packages: '@aws-sdk/types': 3.714.0 '@smithy/types': 3.7.2 '@smithy/util-endpoints': 2.1.7 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-endpoints@3.828.0: @@ -5083,8 +5641,8 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 - '@smithy/util-endpoints': 3.0.6 + '@smithy/types': 4.9.0 + '@smithy/util-endpoints': 3.2.5 tslib: 2.8.1 dev: false @@ -5093,8 +5651,8 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@aws-sdk/types': 3.840.0 - '@smithy/types': 4.3.1 - '@smithy/util-endpoints': 3.0.6 + '@smithy/types': 4.9.0 + '@smithy/util-endpoints': 3.2.5 tslib: 2.8.1 dev: false @@ -5109,6 +5667,27 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/util-endpoints@3.936.0: + resolution: {integrity: sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-endpoints': 3.2.5 + tslib: 2.8.1 + dev: false + + /@aws-sdk/util-format-url@3.936.0: + resolution: {integrity: sha512-MS5eSEtDUFIAMHrJaMERiHAvDPdfxc/T869ZjDNFAIiZhyc037REw0aoTNeimNXDNy2txRNZJaAUn/kE4RwN+g==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/querystring-builder': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/util-locate-window@3.310.0: resolution: {integrity: sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==} engines: {node: '>=14.0.0'} @@ -5129,7 +5708,7 @@ packages: '@aws-sdk/types': 3.451.0 '@smithy/types': 2.6.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-user-agent-browser@3.714.0: @@ -5138,14 +5717,14 @@ packages: '@aws-sdk/types': 3.714.0 '@smithy/types': 3.7.2 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-user-agent-browser@3.821.0: resolution: {integrity: sha512-irWZHyM0Jr1xhC+38OuZ7JB6OXMLPZlj48thElpsO1ZSLRkLZx5+I7VV6k3sp2yZ7BYbKz/G2ojSv4wdm7XTLw==} dependencies: '@aws-sdk/types': 3.821.0 - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 bowser: 2.11.0 tslib: 2.8.1 dev: false @@ -5154,7 +5733,7 @@ packages: resolution: {integrity: sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==} dependencies: '@aws-sdk/types': 3.840.0 - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 bowser: 2.11.0 tslib: 2.8.1 dev: false @@ -5168,6 +5747,15 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/util-user-agent-browser@3.936.0: + resolution: {integrity: sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==} + dependencies: + '@aws-sdk/types': 3.936.0 + '@smithy/types': 4.9.0 + bowser: 2.12.1 + tslib: 2.8.1 + dev: false + /@aws-sdk/util-user-agent-node@3.451.0: resolution: {integrity: sha512-TBzm6P+ql4mkGFAjPlO1CI+w3yUT+NulaiALjl/jNX/nnUp6HsJsVxJf4nVFQTG5KRV0iqMypcs7I3KIhH+LmA==} engines: {node: '>=14.0.0'} @@ -5180,7 +5768,7 @@ packages: '@aws-sdk/types': 3.451.0 '@smithy/node-config-provider': 2.1.6 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-user-agent-node@3.716.0: @@ -5196,7 +5784,7 @@ packages: '@aws-sdk/types': 3.714.0 '@smithy/node-config-provider': 3.1.12 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@aws-sdk/util-user-agent-node@3.839.0: @@ -5210,8 +5798,8 @@ packages: dependencies: '@aws-sdk/middleware-user-agent': 3.839.0 '@aws-sdk/types': 3.821.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -5226,8 +5814,8 @@ packages: dependencies: '@aws-sdk/middleware-user-agent': 3.840.0 '@aws-sdk/types': 3.840.0 - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -5247,6 +5835,22 @@ packages: tslib: 2.8.1 dev: false + /@aws-sdk/util-user-agent-node@3.936.0: + resolution: {integrity: sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + dependencies: + '@aws-sdk/middleware-user-agent': 3.936.0 + '@aws-sdk/types': 3.936.0 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@aws-sdk/util-utf8-browser@3.259.0: resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==} dependencies: @@ -5257,7 +5861,7 @@ packages: resolution: {integrity: sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -5275,6 +5879,11 @@ packages: engines: {node: '>=18.0.0'} dev: false + /@aws/lambda-invoke-store@0.2.1: + resolution: {integrity: sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==} + engines: {node: '>=18.0.0'} + dev: false + /@babel/code-frame@7.22.13: resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} @@ -6099,17 +6708,17 @@ packages: resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} dev: false - /@clack/core@0.5.0: - resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} + /@clack/core@1.0.0-alpha.6: + resolution: {integrity: sha512-eG5P45+oShFG17u9I1DJzLkXYB1hpUgTLi32EfsMjSHLEqJUR8BOBCVFkdbUX2g08eh/HCi6UxNGpPhaac1LAA==} dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 dev: false - /@clack/prompts@0.11.0: - resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} + /@clack/prompts@1.0.0-alpha.6: + resolution: {integrity: sha512-75NCtYOgDHVBE2nLdKPTDYOaESxO0GLAKC7INREp5VbS988Xua1u+588VaGlcvXiLc/kSwc25Cd+4PeTSpY6QQ==} dependencies: - '@clack/core': 0.5.0 + '@clack/core': 1.0.0-alpha.6 picocolors: 1.1.1 sisteransi: 1.0.5 dev: false @@ -17073,6 +17682,12 @@ packages: typescript: 5.9.3 dev: false + /@s2-dev/streamstore@0.17.6: + resolution: {integrity: sha512-ocjZfKaPKmo2yhudM58zVNHv3rBLSbTKkabVoLFn9nAxU6iLrR2CO3QmSo7/waohI3EZHAWxF/Pw8kA8d6QH2g==} + dependencies: + '@protobuf-ts/runtime': 2.11.1 + dev: false + /@sec-ant/readable-stream@0.4.1: resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} dev: true @@ -17470,7 +18085,7 @@ packages: resolution: {integrity: sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -17482,6 +18097,21 @@ packages: tslib: 2.8.1 dev: false + /@smithy/chunked-blob-reader-native@4.2.1: + resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + dev: false + + /@smithy/chunked-blob-reader@5.2.0: + resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} + engines: {node: '>=18.0.0'} + dependencies: + tslib: 2.8.1 + dev: false + /@smithy/config-resolver@2.0.19: resolution: {integrity: sha512-JsghnQ5zjWmjEVY8TFOulLdEOCj09SjRLugrHlkPZTIBBm7PQitCFVLThbsKPZQOP7N3ME1DU1nKUc1UaVnBog==} engines: {node: '>=14.0.0'} @@ -17490,7 +18120,7 @@ packages: '@smithy/types': 2.6.0 '@smithy/util-config-provider': 2.0.0 '@smithy/util-middleware': 2.0.7 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/config-resolver@3.0.13: @@ -17501,17 +18131,17 @@ packages: '@smithy/types': 3.7.2 '@smithy/util-config-provider': 3.0.0 '@smithy/util-middleware': 3.0.11 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/config-resolver@4.1.4: resolution: {integrity: sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 '@smithy/util-config-provider': 4.0.0 - '@smithy/util-middleware': 4.0.4 + '@smithy/util-middleware': 4.2.5 tslib: 2.8.1 dev: false @@ -17538,7 +18168,7 @@ packages: '@smithy/util-middleware': 3.0.11 '@smithy/util-stream': 3.3.2 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/core@3.18.3: @@ -17557,18 +18187,34 @@ packages: tslib: 2.8.1 dev: false + /@smithy/core@3.18.5: + resolution: {integrity: sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/middleware-serde': 4.2.6 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + dev: false + /@smithy/core@3.6.0: resolution: {integrity: sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/middleware-serde': 4.0.8 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-body-length-browser': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-stream': 4.2.2 - '@smithy/util-utf8': 4.0.0 + '@smithy/middleware-serde': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-stream': 4.5.6 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 dev: false @@ -17594,17 +18240,6 @@ packages: tslib: 2.8.1 dev: false - /@smithy/credential-provider-imds@4.0.6: - resolution: {integrity: sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==} - engines: {node: '>=18.0.0'} - dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - tslib: 2.8.1 - dev: false - /@smithy/credential-provider-imds@4.2.5: resolution: {integrity: sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==} engines: {node: '>=18.0.0'} @@ -17625,6 +18260,51 @@ packages: tslib: 2.8.1 dev: false + /@smithy/eventstream-codec@4.2.5: + resolution: {integrity: sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==} + engines: {node: '>=18.0.0'} + dependencies: + '@aws-crypto/crc32': 5.2.0 + '@smithy/types': 4.9.0 + '@smithy/util-hex-encoding': 4.2.0 + tslib: 2.8.1 + dev: false + + /@smithy/eventstream-serde-browser@4.2.5: + resolution: {integrity: sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/eventstream-serde-config-resolver@4.3.5: + resolution: {integrity: sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/eventstream-serde-node@4.2.5: + resolution: {integrity: sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/eventstream-serde-universal': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + + /@smithy/eventstream-serde-universal@4.2.5: + resolution: {integrity: sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/eventstream-codec': 4.2.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@smithy/fetch-http-handler@2.2.7: resolution: {integrity: sha512-iSDBjxuH9TgrtMYAr7j5evjvkvgwLY3y+9D547uep+JNkZ1ZT+BaeU20j6I/bO/i26ilCWFImrlXTPsfQtZdIQ==} dependencies: @@ -17632,7 +18312,7 @@ packages: '@smithy/querystring-builder': 2.0.14 '@smithy/types': 2.6.0 '@smithy/util-base64': 2.0.1 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/fetch-http-handler@4.1.2: @@ -17642,17 +18322,17 @@ packages: '@smithy/querystring-builder': 3.0.11 '@smithy/types': 3.7.2 '@smithy/util-base64': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/fetch-http-handler@5.0.4: resolution: {integrity: sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/protocol-http': 5.1.2 + '@smithy/protocol-http': 5.3.5 '@smithy/querystring-builder': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 + '@smithy/types': 4.9.0 + '@smithy/util-base64': 4.3.0 tslib: 2.8.1 dev: false @@ -17667,14 +18347,24 @@ packages: tslib: 2.8.1 dev: false + /@smithy/hash-blob-browser@4.2.6: + resolution: {integrity: sha512-8P//tA8DVPk+3XURk2rwcKgYwFvwGwmJH/wJqQiSKwXZtf/LiZK+hbUZmPj/9KzM+OVSwe4o85KTp5x9DUZTjw==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/chunked-blob-reader': 5.2.0 + '@smithy/chunked-blob-reader-native': 4.2.1 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@smithy/hash-node@2.0.16: resolution: {integrity: sha512-Wbi9A0PacMYUOwjAulQP90Wl3mQ6NDwnyrZQzFjDz+UzjXOSyQMgBrTkUBz+pVoYVlX3DUu24gWMZBcit+wOGg==} engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 '@smithy/util-buffer-from': 2.0.0 - '@smithy/util-utf8': 2.0.2 - tslib: 2.6.2 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 dev: false /@smithy/hash-node@3.0.11: @@ -17684,16 +18374,16 @@ packages: '@smithy/types': 3.7.2 '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/hash-node@4.0.4: resolution: {integrity: sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 dev: false @@ -17707,25 +18397,34 @@ packages: tslib: 2.8.1 dev: false + /@smithy/hash-stream-node@4.2.5: + resolution: {integrity: sha512-6+do24VnEyvWcGdHXomlpd0m8bfZePpUKBy7m311n+JuRwug8J4dCanJdTymx//8mi0nlkflZBvJe+dEO/O12Q==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + dev: false + /@smithy/invalid-dependency@2.0.14: resolution: {integrity: sha512-d8ohpwZo9RzTpGlAfsWtfm1SHBSU7+N4iuZ6MzR10xDTujJJWtmXYHK1uzcr7rggbpUTaWyHpPFgnf91q0EFqQ==} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/invalid-dependency@3.0.11: resolution: {integrity: sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ==} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/invalid-dependency@4.0.4: resolution: {integrity: sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -17737,13 +18436,6 @@ packages: tslib: 2.8.1 dev: false - /@smithy/is-array-buffer@2.0.0: - resolution: {integrity: sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==} - engines: {node: '>=14.0.0'} - dependencies: - tslib: 2.8.1 - dev: false - /@smithy/is-array-buffer@2.2.0: resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} @@ -17758,13 +18450,6 @@ packages: tslib: 2.8.1 dev: false - /@smithy/is-array-buffer@4.0.0: - resolution: {integrity: sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.8.1 - dev: false - /@smithy/is-array-buffer@4.2.0: resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} @@ -17776,8 +18461,17 @@ packages: resolution: {integrity: sha512-YhWt9aKl+EMSNXyUTUo7I01WHf3HcCkPu/Hl2QmTNwrHT49eWaY7hptAMaERZuHFH0V5xHgPKgKZo2I93DFtgQ==} dependencies: '@smithy/types': 2.6.0 - '@smithy/util-utf8': 2.0.2 - tslib: 2.6.2 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + dev: false + + /@smithy/md5-js@4.2.5: + resolution: {integrity: sha512-Bt6jpSTMWfjCtC0s79gZ/WZ1w90grfmopVOWqkI2ovhjpD5Q2XRXuecIPB9689L2+cCySMbaXDhBPU56FKNDNg==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/types': 4.9.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 dev: false /@smithy/middleware-content-length@2.0.16: @@ -17786,7 +18480,7 @@ packages: dependencies: '@smithy/protocol-http': 3.0.10 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-content-length@3.0.13: @@ -17795,15 +18489,15 @@ packages: dependencies: '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-content-length@4.0.4: resolution: {integrity: sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -17826,7 +18520,7 @@ packages: '@smithy/types': 2.6.0 '@smithy/url-parser': 2.0.14 '@smithy/util-middleware': 2.0.7 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-endpoint@3.2.6: @@ -17840,29 +18534,43 @@ packages: '@smithy/types': 3.7.2 '@smithy/url-parser': 3.0.11 '@smithy/util-middleware': 3.0.11 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-endpoint@4.1.13: resolution: {integrity: sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/core': 3.6.0 - '@smithy/middleware-serde': 4.0.8 - '@smithy/node-config-provider': 4.1.3 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 - '@smithy/url-parser': 4.0.4 - '@smithy/util-middleware': 4.0.4 + '@smithy/core': 3.18.3 + '@smithy/middleware-serde': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-middleware': 4.2.5 + tslib: 2.8.1 + dev: false + + /@smithy/middleware-endpoint@4.3.10: + resolution: {integrity: sha512-SoAag3QnWBFoXjwa1jenEThkzJYClidZUyqsLKwWZ8kOlZBwehrLBp4ygVDjNEM2a2AamCQ2FBA/HuzKJ/LiTA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/core': 3.18.3 + '@smithy/middleware-serde': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 + '@smithy/url-parser': 4.2.5 + '@smithy/util-middleware': 4.2.5 tslib: 2.8.1 dev: false - /@smithy/middleware-endpoint@4.3.10: - resolution: {integrity: sha512-SoAag3QnWBFoXjwa1jenEThkzJYClidZUyqsLKwWZ8kOlZBwehrLBp4ygVDjNEM2a2AamCQ2FBA/HuzKJ/LiTA==} + /@smithy/middleware-endpoint@4.3.12: + resolution: {integrity: sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/core': 3.18.3 - '@smithy/middleware-serde': 4.2.5 + '@smithy/core': 3.18.5 + '@smithy/middleware-serde': 4.2.6 '@smithy/node-config-provider': 4.3.5 '@smithy/shared-ini-file-loader': 4.4.0 '@smithy/types': 4.9.0 @@ -17881,7 +18589,7 @@ packages: '@smithy/types': 2.6.0 '@smithy/util-middleware': 2.0.7 '@smithy/util-retry': 2.0.7 - tslib: 2.6.2 + tslib: 2.8.1 uuid: 8.3.2 dev: false @@ -17896,7 +18604,7 @@ packages: '@smithy/types': 3.7.2 '@smithy/util-middleware': 3.0.11 '@smithy/util-retry': 3.0.11 - tslib: 2.6.2 + tslib: 2.8.1 uuid: 9.0.1 dev: false @@ -17904,13 +18612,13 @@ packages: resolution: {integrity: sha512-eoXaLlDGpKvdmvt+YBfRXE7HmIEtFF+DJCbTPwuLunP0YUnrydl+C4tS+vEM0+nyxXrX3PSUFqC+lP1+EHB1Tw==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/protocol-http': 5.1.2 + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 '@smithy/service-error-classification': 4.0.6 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-retry': 4.0.6 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 tslib: 2.8.1 uuid: 9.0.1 dev: false @@ -17930,12 +18638,27 @@ packages: tslib: 2.8.1 dev: false + /@smithy/middleware-retry@4.4.12: + resolution: {integrity: sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/node-config-provider': 4.3.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/service-error-classification': 4.2.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + '@smithy/util-middleware': 4.2.5 + '@smithy/util-retry': 4.2.5 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + dev: false + /@smithy/middleware-serde@2.0.14: resolution: {integrity: sha512-hFi3FqoYWDntCYA2IGY6gJ6FKjq2gye+1tfxF2HnIJB5uW8y2DhpRNBSUMoqP+qvYzRqZ6ntv4kgbG+o3pX57g==} engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-serde@3.0.11: @@ -17943,15 +18666,15 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-serde@4.0.8: resolution: {integrity: sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -17964,12 +18687,21 @@ packages: tslib: 2.8.1 dev: false + /@smithy/middleware-serde@4.2.6: + resolution: {integrity: sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@smithy/middleware-stack@2.0.8: resolution: {integrity: sha512-7/N59j0zWqVEKExJcA14MrLDZ/IeN+d6nbkN8ucs+eURyaDUXWYlZrQmMOd/TyptcQv0+RDlgag/zSTTV62y/Q==} engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-stack@3.0.11: @@ -17977,14 +18709,14 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/middleware-stack@4.0.4: resolution: {integrity: sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18003,7 +18735,7 @@ packages: '@smithy/property-provider': 2.0.15 '@smithy/shared-ini-file-loader': 2.2.5 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/node-config-provider@3.1.12: @@ -18013,16 +18745,16 @@ packages: '@smithy/property-provider': 3.1.11 '@smithy/shared-ini-file-loader': 3.1.12 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/node-config-provider@4.1.3: resolution: {integrity: sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/property-provider': 4.0.4 - '@smithy/shared-ini-file-loader': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/shared-ini-file-loader': 4.4.0 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18044,7 +18776,7 @@ packages: '@smithy/protocol-http': 3.0.10 '@smithy/querystring-builder': 2.0.14 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/node-http-handler@3.3.2: @@ -18055,7 +18787,7 @@ packages: '@smithy/protocol-http': 4.1.8 '@smithy/querystring-builder': 3.0.11 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/node-http-handler@4.0.6: @@ -18063,9 +18795,9 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/abort-controller': 4.0.4 - '@smithy/protocol-http': 5.1.2 + '@smithy/protocol-http': 5.3.5 '@smithy/querystring-builder': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18096,14 +18828,6 @@ packages: tslib: 2.8.1 dev: false - /@smithy/property-provider@4.0.4: - resolution: {integrity: sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==} - engines: {node: '>=18.0.0'} - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - dev: false - /@smithy/property-provider@4.2.5: resolution: {integrity: sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==} engines: {node: '>=18.0.0'} @@ -18117,7 +18841,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/protocol-http@4.1.8: @@ -18125,14 +18849,14 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/protocol-http@5.1.2: resolution: {integrity: sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18166,8 +18890,8 @@ packages: resolution: {integrity: sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 - '@smithy/util-uri-escape': 4.0.0 + '@smithy/types': 4.9.0 + '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.1 dev: false @@ -18200,7 +18924,7 @@ packages: resolution: {integrity: sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18230,7 +18954,7 @@ packages: resolution: {integrity: sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 dev: false /@smithy/service-error-classification@4.2.5: @@ -18256,14 +18980,6 @@ packages: tslib: 2.8.1 dev: false - /@smithy/shared-ini-file-loader@4.0.4: - resolution: {integrity: sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==} - engines: {node: '>=18.0.0'} - dependencies: - '@smithy/types': 4.3.1 - tslib: 2.8.1 - dev: false - /@smithy/shared-ini-file-loader@4.4.0: resolution: {integrity: sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==} engines: {node: '>=18.0.0'} @@ -18277,12 +18993,12 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/eventstream-codec': 2.0.14 - '@smithy/is-array-buffer': 2.0.0 + '@smithy/is-array-buffer': 2.2.0 '@smithy/types': 2.6.0 '@smithy/util-hex-encoding': 2.0.0 '@smithy/util-middleware': 2.0.7 '@smithy/util-uri-escape': 2.0.0 - '@smithy/util-utf8': 2.0.2 + '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 dev: false @@ -18300,20 +19016,6 @@ packages: tslib: 2.8.1 dev: false - /@smithy/signature-v4@5.1.2: - resolution: {integrity: sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==} - engines: {node: '>=18.0.0'} - dependencies: - '@smithy/is-array-buffer': 4.0.0 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-middleware': 4.0.4 - '@smithy/util-uri-escape': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - dev: false - /@smithy/signature-v4@5.3.5: resolution: {integrity: sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==} engines: {node: '>=18.0.0'} @@ -18335,7 +19037,7 @@ packages: '@smithy/middleware-stack': 2.0.8 '@smithy/types': 2.6.0 '@smithy/util-stream': 2.0.21 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/smithy-client@3.5.1: @@ -18348,19 +19050,19 @@ packages: '@smithy/protocol-http': 4.1.8 '@smithy/types': 3.7.2 '@smithy/util-stream': 3.3.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/smithy-client@4.4.5: resolution: {integrity: sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/core': 3.6.0 - '@smithy/middleware-endpoint': 4.1.13 - '@smithy/middleware-stack': 4.0.4 - '@smithy/protocol-http': 5.1.2 - '@smithy/types': 4.3.1 - '@smithy/util-stream': 4.2.2 + '@smithy/core': 3.18.3 + '@smithy/middleware-endpoint': 4.3.10 + '@smithy/middleware-stack': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 tslib: 2.8.1 dev: false @@ -18377,18 +19079,31 @@ packages: tslib: 2.8.1 dev: false + /@smithy/smithy-client@4.9.8: + resolution: {integrity: sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/core': 3.18.5 + '@smithy/middleware-endpoint': 4.3.12 + '@smithy/middleware-stack': 4.2.5 + '@smithy/protocol-http': 5.3.5 + '@smithy/types': 4.9.0 + '@smithy/util-stream': 4.5.6 + tslib: 2.8.1 + dev: false + /@smithy/types@2.6.0: resolution: {integrity: sha512-PgqxJq2IcdMF9iAasxcqZqqoOXBHufEfmbEUdN1pmJrJltT42b0Sc8UiYSWWzKkciIp9/mZDpzYi4qYG1qqg6g==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/types@3.7.2: resolution: {integrity: sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/types@4.3.1: @@ -18410,7 +19125,7 @@ packages: dependencies: '@smithy/querystring-parser': 2.0.14 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/url-parser@3.0.11: @@ -18418,7 +19133,7 @@ packages: dependencies: '@smithy/querystring-parser': 3.0.11 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/url-parser@4.0.4: @@ -18426,7 +19141,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/querystring-parser': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18444,7 +19159,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/util-buffer-from': 2.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-base64@3.0.0: @@ -18453,7 +19168,7 @@ packages: dependencies: '@smithy/util-buffer-from': 3.0.0 '@smithy/util-utf8': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-base64@4.0.0: @@ -18461,7 +19176,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-utf8': 4.0.0 + '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 dev: false @@ -18477,13 +19192,13 @@ packages: /@smithy/util-body-length-browser@2.0.0: resolution: {integrity: sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-body-length-browser@3.0.0: resolution: {integrity: sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-body-length-browser@4.0.0: @@ -18504,14 +19219,14 @@ packages: resolution: {integrity: sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==} engines: {node: '>=14.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-body-length-node@3.0.0: resolution: {integrity: sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==} engines: {node: '>=16.0.0'} dependencies: - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-body-length-node@4.0.0: @@ -18532,7 +19247,7 @@ packages: resolution: {integrity: sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==} engines: {node: '>=14.0.0'} dependencies: - '@smithy/is-array-buffer': 2.0.0 + '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 dev: false @@ -18556,7 +19271,7 @@ packages: resolution: {integrity: sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/is-array-buffer': 4.0.0 + '@smithy/is-array-buffer': 4.2.0 tslib: 2.8.1 dev: false @@ -18604,7 +19319,7 @@ packages: '@smithy/smithy-client': 2.1.16 '@smithy/types': 2.6.0 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-defaults-mode-browser@3.0.31: @@ -18615,20 +19330,30 @@ packages: '@smithy/smithy-client': 3.5.1 '@smithy/types': 3.7.2 bowser: 2.11.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-defaults-mode-browser@4.0.21: resolution: {integrity: sha512-wM0jhTytgXu3wzJoIqpbBAG5U6BwiubZ6QKzSbP7/VbmF1v96xlAbX2Am/mz0Zep0NLvLh84JT0tuZnk3wmYQA==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 bowser: 2.11.0 tslib: 2.8.1 dev: false + /@smithy/util-defaults-mode-browser@4.3.11: + resolution: {integrity: sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@smithy/util-defaults-mode-browser@4.3.9: resolution: {integrity: sha512-Bh5bU40BgdkXE2BcaNazhNtEXi1TC0S+1d84vUwv5srWfvbeRNUKFzwKQgC6p6MXPvEgw+9+HdX3pOwT6ut5aw==} engines: {node: '>=18.0.0'} @@ -18649,7 +19374,7 @@ packages: '@smithy/property-provider': 2.0.15 '@smithy/smithy-client': 2.1.16 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-defaults-mode-node@3.0.31: @@ -18662,19 +19387,19 @@ packages: '@smithy/property-provider': 3.1.11 '@smithy/smithy-client': 3.5.1 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-defaults-mode-node@4.0.21: resolution: {integrity: sha512-/F34zkoU0GzpUgLJydHY8Rxu9lBn8xQC/s/0M0U9lLBkYbA1htaAFjWYJzpzsbXPuri5D1H8gjp2jBum05qBrA==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/config-resolver': 4.1.4 - '@smithy/credential-provider-imds': 4.0.6 - '@smithy/node-config-provider': 4.1.3 - '@smithy/property-provider': 4.0.4 - '@smithy/smithy-client': 4.4.5 - '@smithy/types': 4.3.1 + '@smithy/config-resolver': 4.4.3 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.6 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18691,13 +19416,26 @@ packages: tslib: 2.8.1 dev: false + /@smithy/util-defaults-mode-node@4.2.14: + resolution: {integrity: sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==} + engines: {node: '>=18.0.0'} + dependencies: + '@smithy/config-resolver': 4.4.3 + '@smithy/credential-provider-imds': 4.2.5 + '@smithy/node-config-provider': 4.3.5 + '@smithy/property-provider': 4.2.5 + '@smithy/smithy-client': 4.9.8 + '@smithy/types': 4.9.0 + tslib: 2.8.1 + dev: false + /@smithy/util-endpoints@1.0.5: resolution: {integrity: sha512-K7qNuCOD5K/90MjHvHm9kJldrfm40UxWYQxNEShMFxV/lCCCRIg8R4uu1PFAxRvPxNpIdcrh1uK6I1ISjDXZJw==} engines: {node: '>= 14.0.0'} dependencies: '@smithy/node-config-provider': 2.1.6 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-endpoints@2.1.7: @@ -18706,15 +19444,15 @@ packages: dependencies: '@smithy/node-config-provider': 3.1.12 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-endpoints@3.0.6: resolution: {integrity: sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/node-config-provider': 4.1.3 - '@smithy/types': 4.3.1 + '@smithy/node-config-provider': 4.3.5 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18741,13 +19479,6 @@ packages: tslib: 2.8.1 dev: false - /@smithy/util-hex-encoding@4.0.0: - resolution: {integrity: sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.8.1 - dev: false - /@smithy/util-hex-encoding@4.2.0: resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} @@ -18768,14 +19499,14 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-middleware@4.0.4: resolution: {integrity: sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==} engines: {node: '>=18.0.0'} dependencies: - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18793,7 +19524,7 @@ packages: dependencies: '@smithy/service-error-classification': 2.0.7 '@smithy/types': 2.6.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-retry@3.0.11: @@ -18802,7 +19533,7 @@ packages: dependencies: '@smithy/service-error-classification': 3.0.11 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-retry@4.0.6: @@ -18810,7 +19541,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/service-error-classification': 4.0.6 - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -18831,9 +19562,9 @@ packages: '@smithy/node-http-handler': 2.1.10 '@smithy/types': 2.6.0 '@smithy/util-base64': 2.0.1 - '@smithy/util-buffer-from': 2.0.0 + '@smithy/util-buffer-from': 2.2.0 '@smithy/util-hex-encoding': 2.0.0 - '@smithy/util-utf8': 2.0.2 + '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 dev: false @@ -18851,20 +19582,6 @@ packages: tslib: 2.8.1 dev: false - /@smithy/util-stream@4.2.2: - resolution: {integrity: sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==} - engines: {node: '>=18.0.0'} - dependencies: - '@smithy/fetch-http-handler': 5.0.4 - '@smithy/node-http-handler': 4.0.6 - '@smithy/types': 4.3.1 - '@smithy/util-base64': 4.0.0 - '@smithy/util-buffer-from': 4.0.0 - '@smithy/util-hex-encoding': 4.0.0 - '@smithy/util-utf8': 4.0.0 - tslib: 2.8.1 - dev: false - /@smithy/util-stream@4.5.6: resolution: {integrity: sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==} engines: {node: '>=18.0.0'} @@ -18893,13 +19610,6 @@ packages: tslib: 2.8.1 dev: false - /@smithy/util-uri-escape@4.0.0: - resolution: {integrity: sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==} - engines: {node: '>=18.0.0'} - dependencies: - tslib: 2.8.1 - dev: false - /@smithy/util-uri-escape@4.2.0: resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} engines: {node: '>=18.0.0'} @@ -18912,7 +19622,7 @@ packages: engines: {node: '>=14.0.0'} dependencies: '@smithy/util-buffer-from': 2.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-utf8@2.3.0: @@ -18928,7 +19638,7 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@smithy/util-buffer-from': 3.0.0 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-utf8@4.0.0: @@ -18953,7 +19663,7 @@ packages: dependencies: '@smithy/abort-controller': 3.1.9 '@smithy/types': 3.7.2 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@smithy/util-waiter@4.0.6: @@ -18961,7 +19671,7 @@ packages: engines: {node: '>=18.0.0'} dependencies: '@smithy/abort-controller': 4.0.4 - '@smithy/types': 4.3.1 + '@smithy/types': 4.9.0 tslib: 2.8.1 dev: false @@ -19604,8 +20314,8 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: false - /@trigger.dev/platform@1.0.20: - resolution: {integrity: sha512-KyFAJFuUFxsRo/tQ+N4R1yQutdZ7DBIyjzqgNKjee2hjvozu7jZmXkFPaqVDvmUCqeK7UvfBCvjO3gUV+mNGag==} + /@trigger.dev/platform@0.0.0-prerelease-20251121183112: + resolution: {integrity: sha512-pgnk4d13byYqmHYHuvsJoydOf7H/Eurj21FOm8FrLkeadnwxIEI61PD8ka3LY0fZ+iDwgFB29zafjt1WcnWDDg==} dependencies: zod: 3.23.8 dev: false @@ -21260,7 +21970,7 @@ packages: busboy: 1.6.0 fast-querystring: 1.1.2 fast-url-parser: 1.1.3 - tslib: 2.6.2 + tslib: 2.8.1 dev: false /@window-splitter/state@0.4.1: @@ -26824,7 +27534,7 @@ packages: debug: 4.4.0 interpret: 3.1.1 semver: 7.7.2 - tslib: 2.6.2 + tslib: 2.8.1 yargs: 17.7.2 transitivePeerDependencies: - supports-color @@ -27331,6 +28041,11 @@ packages: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} + /ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + dev: false + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} From 83bd51d12d521658270e78fddb2ec0191b0f6108 Mon Sep 17 00:00:00 2001 From: myftija Date: Fri, 21 Nov 2025 17:30:27 +0100 Subject: [PATCH 02/21] Add changeset --- .changeset/proud-birds-change.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/proud-birds-change.md diff --git a/.changeset/proud-birds-change.md b/.changeset/proud-birds-change.md new file mode 100644 index 0000000000..a0b5132075 --- /dev/null +++ b/.changeset/proud-birds-change.md @@ -0,0 +1,6 @@ +--- +"trigger.dev": patch +"@trigger.dev/core": patch +--- + +Added support for native build server builds in the deploy command From d645d715b3d37a2fcc8b2da7f1f5757ec2ff77c1 Mon Sep 17 00:00:00 2001 From: myftija Date: Fri, 21 Nov 2025 17:28:53 +0100 Subject: [PATCH 03/21] changelog --- .changeset/config.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.changeset/config.json b/.changeset/config.json index 115f54fefe..6d5af2eedd 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,11 +1,6 @@ { "$schema": "https://unpkg.com/@changesets/config@2.2.0/schema.json", - "changelog": [ - "@remix-run/changelog-github", - { - "repo": "triggerdotdev/trigger.dev" - } - ], + "changelog": "@changesets/cli/changelog", "commit": false, "fixed": [["@trigger.dev/*", "trigger.dev"]], "linked": [], From bf56f5ad3f625ccee756879fc9b9ee9785168800 Mon Sep 17 00:00:00 2001 From: myftija Date: Fri, 21 Nov 2025 20:21:23 +0100 Subject: [PATCH 04/21] Avoid doing a db migration for the deployment table for now --- apps/webapp/app/v3/services/initializeDeployment.server.ts | 7 ------- .../migration.sql | 1 - internal-packages/database/prisma/schema.prisma | 1 - 3 files changed, 9 deletions(-) delete mode 100644 internal-packages/database/prisma/migrations/20251120234635_add_deployment_build_server_meta/migration.sql diff --git a/apps/webapp/app/v3/services/initializeDeployment.server.ts b/apps/webapp/app/v3/services/initializeDeployment.server.ts index e922a8cbac..e88d8b9e8f 100644 --- a/apps/webapp/app/v3/services/initializeDeployment.server.ts +++ b/apps/webapp/app/v3/services/initializeDeployment.server.ts @@ -207,13 +207,6 @@ export class InitializeDeploymentService extends BaseService { git: payload.gitMeta ?? undefined, runtime: payload.runtime ?? undefined, startedAt: initialStatus === "BUILDING" ? new Date() : undefined, - buildServerMetadata: payload.isNativeBuild - ? { - artifactKey: payload.artifactKey, - skipPromotion: payload.skipPromotion, - isNativeBuild: true, - } - : undefined, }, }); diff --git a/internal-packages/database/prisma/migrations/20251120234635_add_deployment_build_server_meta/migration.sql b/internal-packages/database/prisma/migrations/20251120234635_add_deployment_build_server_meta/migration.sql deleted file mode 100644 index 1356966cc8..0000000000 --- a/internal-packages/database/prisma/migrations/20251120234635_add_deployment_build_server_meta/migration.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE "public"."WorkerDeployment" ADD COLUMN "buildServerMetadata" JSONB; \ No newline at end of file diff --git a/internal-packages/database/prisma/schema.prisma b/internal-packages/database/prisma/schema.prisma index 401299d583..140da0d710 100644 --- a/internal-packages/database/prisma/schema.prisma +++ b/internal-packages/database/prisma/schema.prisma @@ -1749,7 +1749,6 @@ model WorkerDeployment { imagePlatform String @default("linux/amd64") externalBuildData Json? - buildServerMetadata Json? status WorkerDeploymentStatus @default(PENDING) type WorkerDeploymentType @default(V1) From 7191e0deb3cb04e2a4a1a2251fbaaaddaa95518c Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 15:08:27 +0100 Subject: [PATCH 05/21] Get rid of clack's `taskLog`, not working reliably Spent a lot of time on it, but could not get it to work reliably. It clears lines that it should not clear when maininging the compact n-lines view during the log stream. Replaced it with a normal log instead for now. --- packages/cli-v3/src/commands/deploy.ts | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 53ab822379..9288aee377 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -1061,12 +1061,8 @@ async function handleNativeBuildServerDeploy({ case "log": { if (record.seq_num === 0) { $queuedSpinner.stop("Build started"); + log.message("", { symbol: undefined, spacing: 0 }); queuedSpinnerStopped = true; - deploymentLog = taskLog({ - title: "Deployment in progress...", - retainLog: true, - limit: isCI ? undefined : 20, - }); } const formattedTimestamp = chalkGrey( @@ -1082,14 +1078,14 @@ async function handleNativeBuildServerDeploy({ const { level, message } = event.data; const formattedMessage = level === "error" - ? chalk.bold.hex("#B91C1C")(message) + ? chalk.bold(chalkError(message)) : level === "warn" ? chalkWarning(message) : level === "debug" ? chalkGrey(message) : message; - deploymentLog?.message(`${formattedTimestamp} ${formattedMessage}`); + log.message(`${formattedTimestamp} ${formattedMessage}`, { symbol: undefined, spacing: 0 }); break; } case "finalized": { @@ -1121,7 +1117,7 @@ async function handleNativeBuildServerDeploy({ } if (!finalDeploymentEvent) { - deploymentLog?.error( + log.error( "Stopped receiving updates from the build server, please check the deployment status in the dashboard" ); @@ -1139,7 +1135,7 @@ async function handleNativeBuildServerDeploy({ switch (finalDeploymentEvent.result) { case "succeeded": { queuedSpinnerStopped - ? deploymentLog?.success("Deployment completed successfully") + ? log.success("Deployment completed successfully") : $queuedSpinner.stop("Deployment completed successfully"); if (finalDeploymentEvent.message) { @@ -1164,7 +1160,7 @@ async function handleNativeBuildServerDeploy({ } case "failed": { queuedSpinnerStopped - ? deploymentLog?.error("Deployment failed") + ? log.error("Deployment failed") : $queuedSpinner.stop("Deployment failed"); if (finalDeploymentEvent.message) { @@ -1178,7 +1174,7 @@ async function handleNativeBuildServerDeploy({ } case "timed_out": { queuedSpinnerStopped - ? deploymentLog?.error("Deployment timed out") + ? log.error("Deployment timed out") : $queuedSpinner.stop("Deployment timed out"); if (finalDeploymentEvent.message) { @@ -1192,7 +1188,7 @@ async function handleNativeBuildServerDeploy({ } case "canceled": { queuedSpinnerStopped - ? deploymentLog?.error("Deployment was canceled") + ? log.error("Deployment was canceled") : $queuedSpinner.stop("Deployment was canceled"); if (finalDeploymentEvent.message) { @@ -1208,7 +1204,7 @@ async function handleNativeBuildServerDeploy({ // This case is only relevant in case we extend the enum in the future. // New enum values will not be treated as errors in older cli versions. queuedSpinnerStopped - ? deploymentLog?.success("Log stream finished") + ? log.success("Log stream finished") : $queuedSpinner.stop("Log stream finished"); if (finalDeploymentEvent.message) { log.message(finalDeploymentEvent.message); From e2d5e8316e4dbabaf343d060f06618a3d60df153 Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 15:48:10 +0100 Subject: [PATCH 06/21] Show a separate spinner during deployment init --- packages/cli-v3/src/commands/deploy.ts | 30 ++++++++++-------------- packages/cli-v3/src/deploy/buildImage.ts | 2 +- 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 9288aee377..8d93e6d585 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -933,13 +933,13 @@ async function handleNativeBuildServerDeploy({ ); } - $deploymentSpinner.stop("Deployment files uploaded"); - const [unlinkError] = await tryCatch(unlink(archivePath)); if (unlinkError) { logger.debug("Failed to delete deployment artifact file", { archivePath, error: unlinkError }); } + $deploymentSpinner.message("Deployment files uploaded"); + const initializeDeploymentResult = await apiClient.initializeDeployment({ contentHash: "-", userId, @@ -952,7 +952,9 @@ async function handleNativeBuildServerDeploy({ }); if (!initializeDeploymentResult.success) { - throw new Error(`Failed to initialize deployment: ${initializeDeploymentResult.error}`); + $deploymentSpinner.stop("Failed to initialize deployment"); + log.error(chalk.bold(chalkError(initializeDeploymentResult.error))); + throw new OutroCommandError(`Deployment failed`); } const deployment = initializeDeploymentResult.data; @@ -962,6 +964,12 @@ async function handleNativeBuildServerDeploy({ options.env === "prod" ? "prod" : "stg" }`; + const exposedDeploymentLink = isLinksSupported + ? cliLink(chalk.bold(rawDeploymentLink), rawDeploymentLink) + : chalk.bold(rawDeploymentLink); + $deploymentSpinner.stop("Deployment initialized"); + log.info(`View deployment: ${exposedDeploymentLink}`); + setGithubActionsOutputAndEnvVars({ envVars: { TRIGGER_DEPLOYMENT_VERSION: deployment.version, @@ -985,24 +993,11 @@ async function handleNativeBuildServerDeploy({ if (!eventStream) { log.warn(`Failed streaming build logs, open the deployment in the dashboard to view the logs`); - if (!isLinksSupported) { - log.info(`View deployment: ${rawDeploymentLink}`); - } - - outro( - `Version ${deployment.version} is being deployed ${ - isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" - }` - ); + outro(`Version ${deployment.version} is being deployed`); process.exit(0); } - const exposedDeploymentLink = isLinksSupported - ? cliLink(chalk.bold(rawDeploymentLink), rawDeploymentLink) - : chalk.bold(rawDeploymentLink); - log.info(`View deployment: ${exposedDeploymentLink}`); - const $queuedSpinner = spinner({ cancelMessage: "Disconnecting from the build server log stream. If you intended to cancel the deployment instead, you can do that in the dashboard.", @@ -1010,7 +1005,6 @@ async function handleNativeBuildServerDeploy({ $queuedSpinner.start("Build queued"); const abortController = new AbortController(); - let deploymentLog: ReturnType | undefined; const s2 = new S2({ accessToken: eventStream.s2.accessToken }); const basin = s2.basin(eventStream.s2.basin); diff --git a/packages/cli-v3/src/deploy/buildImage.ts b/packages/cli-v3/src/deploy/buildImage.ts index 6f044c8a7d..de4205efa9 100644 --- a/packages/cli-v3/src/deploy/buildImage.ts +++ b/packages/cli-v3/src/deploy/buildImage.ts @@ -484,7 +484,7 @@ async function localBuildImage(options: SelfHostedBuildImageOptions): Promise Date: Mon, 24 Nov 2025 16:15:55 +0100 Subject: [PATCH 07/21] Return on process exit --- packages/cli-v3/src/commands/deploy.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 8d93e6d585..153b603f61 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -79,6 +79,7 @@ const DeployCommandOptions = CommonCommandOptions.extend({ push: z.boolean().optional(), builder: z.string().default("trigger"), nativeBuildServer: z.boolean().default(false), + detach: z.boolean().default(false), }); type DeployCommandOptions = z.infer; @@ -177,6 +178,12 @@ export function configureDeployCommand(program: Command) { "Use the native build server for building the image" ) ) + .addOption( + new CommandOption( + "--detach", + "Return immediately after the deployment is queued, do not wait for the build to complete. Implies using the native build server." + ).implies({ nativeBuildServer: true }) + ) .action(async (path, options) => { await handleTelemetry(async () => { await printStandloneInitialBanner(true); @@ -988,6 +995,11 @@ async function handleNativeBuildServerDeploy({ }, }); + if (options.detach) { + outro(`Version ${deployment.version} is being deployed`); + return; + } + const { eventStream } = deployment; if (!eventStream) { @@ -995,7 +1007,7 @@ async function handleNativeBuildServerDeploy({ outro(`Version ${deployment.version} is being deployed`); - process.exit(0); + return process.exit(0); } const $queuedSpinner = spinner({ @@ -1031,7 +1043,7 @@ async function handleNativeBuildServerDeploy({ }` ); - return; + return process.exit(0); } const decoder = new TextDecoder(); @@ -1150,7 +1162,7 @@ async function handleNativeBuildServerDeploy({ : "" }` ); - process.exit(0); + return process.exit(0); } case "failed": { queuedSpinnerStopped @@ -1218,7 +1230,7 @@ async function handleNativeBuildServerDeploy({ : "" }` ); - process.exit(0); + return process.exit(0); } } } From 81f63ba362c32e667e9a303b56d27d4c0aa44ba7 Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 16:27:07 +0100 Subject: [PATCH 08/21] Pass in config file path --- packages/cli-v3/src/commands/deploy.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 153b603f61..bfe5a48935 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -8,7 +8,7 @@ import { DeploymentFinalizedEvent, } from "@trigger.dev/core/v3/schemas"; import { Command, Option as CommandOption } from "commander"; -import { join, resolve } from "node:path"; +import { join, relative, resolve } from "node:path"; import { isCI } from "std-env"; import { x } from "tinyexec"; import { z } from "zod"; @@ -947,6 +947,11 @@ async function handleNativeBuildServerDeploy({ $deploymentSpinner.message("Deployment files uploaded"); + const configFilePath = + config.configFile !== undefined + ? relative(config.workspaceDir, config.configFile).replace(/\\/g, "/") + : undefined; + const initializeDeploymentResult = await apiClient.initializeDeployment({ contentHash: "-", userId, @@ -956,6 +961,7 @@ async function handleNativeBuildServerDeploy({ isNativeBuild: true, artifactKey, skipPromotion: options.skipPromotion, + configFilePath, }); if (!initializeDeploymentResult.success) { From 633761391ec3ad49a1e722bc60e67f633a5f7ef0 Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 16:37:03 +0100 Subject: [PATCH 09/21] Make ARTIFACTS_OBJECT_STORE_BUCKET optional Avoid confusion with self-hosters. --- apps/webapp/app/env.server.ts | 2 +- apps/webapp/app/routes/api.v1.artifacts.ts | 7 ++++++- apps/webapp/app/v3/services/artifacts.server.ts | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/apps/webapp/app/env.server.ts b/apps/webapp/app/env.server.ts index d10b607245..4c53445180 100644 --- a/apps/webapp/app/env.server.ts +++ b/apps/webapp/app/env.server.ts @@ -346,7 +346,7 @@ const EnvironmentSchema = z OBJECT_STORE_REGION: z.string().optional(), OBJECT_STORE_SERVICE: z.string().default("s3"), - ARTIFACTS_OBJECT_STORE_BUCKET: z.string(), + ARTIFACTS_OBJECT_STORE_BUCKET: z.string().optional(), ARTIFACTS_OBJECT_STORE_BASE_URL: z.string().optional(), ARTIFACTS_OBJECT_STORE_ACCESS_KEY_ID: z.string().optional(), ARTIFACTS_OBJECT_STORE_SECRET_ACCESS_KEY: z.string().optional(), diff --git a/apps/webapp/app/routes/api.v1.artifacts.ts b/apps/webapp/app/routes/api.v1.artifacts.ts index 6d1ec46a54..f0ff332812 100644 --- a/apps/webapp/app/routes/api.v1.artifacts.ts +++ b/apps/webapp/app/routes/api.v1.artifacts.ts @@ -63,10 +63,15 @@ export async function action({ request }: ActionFunctionArgs) { logger.error("Failed to create presigned POST", { error }); return json({ error: "Failed to generate artifact upload URL" }, { status: 500 }); } - default: + case "artifacts_bucket_not_configured": { + logger.error("Artifacts bucket not configured", { error }); + return json({ error: "Internal server error" }, { status: 500 }); + } + default: { error satisfies never; logger.error("Failed creating artifact", { error }); return json({ error: "Internal server error" }, { status: 500 }); + } } } ); diff --git a/apps/webapp/app/v3/services/artifacts.server.ts b/apps/webapp/app/v3/services/artifacts.server.ts index 981618ae14..9e82af5123 100644 --- a/apps/webapp/app/v3/services/artifacts.server.ts +++ b/apps/webapp/app/v3/services/artifacts.server.ts @@ -61,6 +61,12 @@ export class ArtifactsService extends BaseService { } private createPresignedPost(key: string, sizeLimit: number, contentLength?: number) { + if (!this.bucket) { + return errAsync({ + type: "artifacts_bucket_not_configured" as const, + }); + } + const ttlSeconds = 300; // 5 minutes const expiresAt = new Date(Date.now() + ttlSeconds * 1000); From 85fd901931040e26c24bb6d71f9b4f1142d0e243 Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 18:08:22 +0100 Subject: [PATCH 10/21] Revert @clack/prompts to old version, latest version causes spinner issues --- packages/cli-v3/package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/cli-v3/package.json b/packages/cli-v3/package.json index b65b93aa49..a4b9af11d5 100644 --- a/packages/cli-v3/package.json +++ b/packages/cli-v3/package.json @@ -81,7 +81,7 @@ "inspector": "npx @modelcontextprotocol/inspector dist/esm/index.js mcp --log-file .mcp.log --api-url http://localhost:3030" }, "dependencies": { - "@clack/prompts": "1.0.0-alpha.6", + "@clack/prompts": "0.11.0", "@depot/cli": "0.0.1-cli.2.80.0", "@modelcontextprotocol/sdk": "^1.17.0", "@opentelemetry/api": "1.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3829f7bab8..90649b7106 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1331,8 +1331,8 @@ importers: packages/cli-v3: dependencies: '@clack/prompts': - specifier: 1.0.0-alpha.6 - version: 1.0.0-alpha.6 + specifier: 0.11.0 + version: 0.11.0 '@depot/cli': specifier: 0.0.1-cli.2.80.0 version: 0.0.1-cli.2.80.0 @@ -6708,17 +6708,17 @@ packages: resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} dev: false - /@clack/core@1.0.0-alpha.6: - resolution: {integrity: sha512-eG5P45+oShFG17u9I1DJzLkXYB1hpUgTLi32EfsMjSHLEqJUR8BOBCVFkdbUX2g08eh/HCi6UxNGpPhaac1LAA==} + /@clack/core@0.5.0: + resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 dev: false - /@clack/prompts@1.0.0-alpha.6: - resolution: {integrity: sha512-75NCtYOgDHVBE2nLdKPTDYOaESxO0GLAKC7INREp5VbS988Xua1u+588VaGlcvXiLc/kSwc25Cd+4PeTSpY6QQ==} + /@clack/prompts@0.11.0: + resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} dependencies: - '@clack/core': 1.0.0-alpha.6 + '@clack/core': 0.5.0 picocolors: 1.1.1 sisteransi: 1.0.5 dev: false From d3cb09f1cd04d0d45cc834b757370f6516c7acc6 Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 18:11:45 +0100 Subject: [PATCH 11/21] Add --plain option for simpler build server logs --- packages/cli-v3/src/build/buildWorker.ts | 18 ++++++- packages/cli-v3/src/build/extensions.ts | 31 +++++++----- packages/cli-v3/src/commands/deploy.ts | 64 ++++++++++++++++-------- packages/cli-v3/src/utilities/windows.ts | 20 +++++++- references/hello-world/trigger.config.ts | 1 - 5 files changed, 96 insertions(+), 38 deletions(-) diff --git a/packages/cli-v3/src/build/buildWorker.ts b/packages/cli-v3/src/build/buildWorker.ts index 168fb31e86..6e818a0b1e 100644 --- a/packages/cli-v3/src/build/buildWorker.ts +++ b/packages/cli-v3/src/build/buildWorker.ts @@ -18,6 +18,7 @@ import { isWindows } from "std-env"; import { pathToFileURL } from "node:url"; import { logger } from "../utilities/logger.js"; import { SdkVersionExtractor } from "./plugins.js"; +import { spinner } from "../utilities/windows.js"; export type BuildWorkerEventListener = { onBundleStart?: () => void; @@ -34,6 +35,7 @@ export type BuildWorkerOptions = { envVars?: Record; rewritePaths?: boolean; forcedExternals?: string[]; + plain?: boolean; }; export async function buildWorker(options: BuildWorkerOptions) { @@ -48,7 +50,21 @@ export async function buildWorker(options: BuildWorkerOptions) { resolvedConfig, options.forcedExternals ); - const buildContext = createBuildContext(options.target, resolvedConfig); + const buildContext = createBuildContext(options.target, resolvedConfig, { + logger: options.plain + ? { + debug: (...args) => console.log(...args), + log: (...args) => console.log(...args), + warn: (...args) => console.log(...args), + progress: (message) => console.log(message), + spinner: (message) => { + const $spinner = spinner({ plain: true }); + $spinner.start(message); + return $spinner; + }, + } + : undefined, + }); buildContext.prependExtension(externalsExtension); await notifyExtensionOnBuildStart(buildContext); const pluginsFromExtensions = resolvePluginsForContext(buildContext); diff --git a/packages/cli-v3/src/build/extensions.ts b/packages/cli-v3/src/build/extensions.ts index 7114da03e3..e38fe903d8 100644 --- a/packages/cli-v3/src/build/extensions.ts +++ b/packages/cli-v3/src/build/extensions.ts @@ -1,4 +1,5 @@ import { + type BuildLogger, BuildContext, BuildExtension, BuildLayer, @@ -9,7 +10,8 @@ import { BuildManifest, BuildTarget } from "@trigger.dev/core/v3/schemas"; import * as esbuild from "esbuild"; import { logger } from "../utilities/logger.js"; import { resolveModule } from "./resolveModule.js"; -import { log, spinner } from "@clack/prompts"; +import { log } from "@clack/prompts"; +import { spinner } from "../utilities/windows.js"; export interface InternalBuildContext extends BuildContext { getLayers(): BuildLayer[]; @@ -54,12 +56,25 @@ export async function notifyExtensionOnBuildComplete( export function createBuildContext( target: BuildTarget, - config: ResolvedConfig + config: ResolvedConfig, + options?: { logger?: BuildLogger } ): InternalBuildContext { const layers: BuildLayer[] = []; const registeredPlugins: RegisteredPlugin[] = []; const extensions: BuildExtension[] = config.build.extensions ?? []; + const buildLogger = options?.logger ?? { + debug: (...args) => logger.debug(...args), + log: (...args) => logger.log(...args), + warn: (...args) => logger.warn(...args), + progress: (message) => log.message(message), + spinner: (message) => { + const $spinner = spinner(); + $spinner.start(message); + return $spinner; + }, + }; + return { target, config: config, @@ -99,17 +114,7 @@ export function createBuildContext( prependExtension(extension) { extensions.unshift(extension); }, - logger: { - debug: (...args) => logger.debug(...args), - log: (...args) => logger.log(...args), - warn: (...args) => logger.warn(...args), - progress: (message) => log.message(message), - spinner: (message) => { - const $spinner = spinner(); - $spinner.start(message); - return $spinner; - }, - }, + logger: buildLogger, }; } diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index bfe5a48935..bf8ee69fdf 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -80,6 +80,7 @@ const DeployCommandOptions = CommonCommandOptions.extend({ builder: z.string().default("trigger"), nativeBuildServer: z.boolean().default(false), detach: z.boolean().default(false), + plain: z.boolean().default(false), }); type DeployCommandOptions = z.infer; @@ -184,6 +185,7 @@ export function configureDeployCommand(program: Command) { "Return immediately after the deployment is queued, do not wait for the build to complete. Implies using the native build server." ).implies({ nativeBuildServer: true }) ) + .addOption(new CommandOption("--plain", "Plain output").hideHelp()) .action(async (path, options) => { await handleTelemetry(async () => { await printStandloneInitialBanner(true); @@ -200,7 +202,9 @@ export async function deployCommand(dir: string, options: unknown) { } async function _deployCommand(dir: string, options: DeployCommandOptions) { - intro(`Deploying project${options.skipPromotion ? " (without promotion)" : ""}`); + if (!options.plain) { + intro(`Deploying project${options.skipPromotion ? " (without promotion)" : ""}`); + } if (!options.skipUpdateCheck) { await updateTriggerPackages(dir, { ...options }, true, true); @@ -215,6 +219,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { embedded: true, defaultApiUrl: options.apiUrl, profile: options.profile, + silent: options.plain, }); if (!authorization.ok) { @@ -321,7 +326,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { const destination = getTmpDir(resolvedConfig.workingDir, "build", options.dryRun); - const $buildSpinner = spinner(); + const $buildSpinner = spinner({ plain: options.plain }); const forcedExternals = await resolveAlwaysExternal(projectClient.client); @@ -337,13 +342,13 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { rewritePaths: true, envVars: serverEnvVars.success ? serverEnvVars.data.variables : {}, forcedExternals, + plain: options.plain, listener: { onBundleStart() { $buildSpinner.start("Building trigger code"); }, onBundleComplete(result) { $buildSpinner.stop("Successfully built code"); - logger.debug("Bundle result", result); }, }, @@ -403,7 +408,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { const vars = numberOfEnvVars === 1 ? "var" : "vars"; if (!options.skipSyncEnvVars) { - const $spinner = spinner(); + const $spinner = spinner({ plain: options.plain }); $spinner.start(`Syncing ${numberOfEnvVars} env ${vars} with the server`); const uploadResult = await syncEnvVarsWithServer( @@ -445,14 +450,16 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { const deploymentLink = cliLink("View deployment", rawDeploymentLink); const testLink = cliLink("Test tasks", rawTestLink); - const $spinner = spinner(); + const $spinner = spinner({ plain: options.plain }); const buildSuffix = isLocalBuild && !process.env.TRIGGER_LOCAL_BUILD_LABEL_DISABLED ? " (local)" : ""; const deploySuffix = isLocalBuild && !process.env.TRIGGER_LOCAL_BUILD_LABEL_DISABLED ? " (local build)" : ""; - if (isCI) { + if (options.plain) { + $spinner.start(`Building version ${version}${buildSuffix}`); + } else if (isCI) { log.step(`Building version ${version}\n`); } else { if (isLinksSupported) { @@ -485,7 +492,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { compilationPath: destination.path, buildEnvVars: buildManifest.build.env, onLog: (logMessage) => { - if (isCI) { + if (options.plain || isCI) { console.log(logMessage); return; } @@ -582,7 +589,9 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { throw new SkipLoggingError(errorData?.message ?? "Failed to get deployment with worker"); } - if (isCI) { + if (options.plain) { + $spinner.message(`Deploying version ${version}${deploySuffix}`); + } else if (isCI) { log.step(`Deploying version ${version}${deploySuffix}\n`); } else { if (isLinksSupported) { @@ -600,7 +609,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { skipPushToRegistry: remoteBuildExplicitlySkipped, }, (logMessage) => { - if (isCI) { + if (options.plain || isCI) { console.log(logMessage); return; } @@ -627,7 +636,9 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { throw new SkipLoggingError("Failed to finalize deployment"); } - if (isCI) { + if (options.plain) { + console.log(`Successfully deployed version ${version}${deploySuffix}`); + } else if (isCI) { log.step(`Successfully deployed version ${version}${deploySuffix}`); } else { $spinner.stop(`Successfully deployed version ${version}${deploySuffix}`); @@ -635,18 +646,29 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { const taskCount = deploymentWithWorker.worker?.tasks.length ?? 0; - outro( - `Version ${version} deployed with ${taskCount} detected task${taskCount === 1 ? "" : "s"} ${ - isLinksSupported ? `| ${deploymentLink} | ${testLink}` : "" - }` - ); + if (options.plain) { + console.log( + `Version ${version} deployed with ${taskCount} detected task${taskCount === 1 ? "" : "s"}` + ); + + if (!process.env.TRIGGER_DEPLOYMENT_LINK_OUTPUT_DISABLED) { + console.log(`Deployment: ${rawDeploymentLink}`); + console.log(`Test: ${rawTestLink}`); + } + } else { + outro( + `Version ${version} deployed with ${taskCount} detected task${taskCount === 1 ? "" : "s"} ${ + isLinksSupported ? `| ${deploymentLink} | ${testLink}` : "" + }` + ); - if (!isLinksSupported) { - console.log("View deployment"); - console.log(rawDeploymentLink); - console.log(); // new line - console.log("Test tasks"); - console.log(rawTestLink); + if (!isLinksSupported) { + console.log("View deployment"); + console.log(rawDeploymentLink); + console.log(); // new line + console.log("Test tasks"); + console.log(rawTestLink); + } } if (options.saveLogs) { diff --git a/packages/cli-v3/src/utilities/windows.ts b/packages/cli-v3/src/utilities/windows.ts index 2e01121e3a..d37a56392b 100644 --- a/packages/cli-v3/src/utilities/windows.ts +++ b/packages/cli-v3/src/utilities/windows.ts @@ -98,7 +98,23 @@ const ballmerSpinner = () => ({ }, }); +const plainSpinner = () => ({ + start: (msg?: string): void => { + console.log(msg ?? ""); + }, + stop: (msg?: string, code?: number): void => { + if (msg) console.log(msg ?? ""); + }, + message: (msg?: string): void => { + if (msg) console.log(msg ?? ""); + }, +}); + // This will become unecessary with the next clack release, the bug was fixed here: // https://github.com/natemoo-re/clack/pull/182 -export const spinner = (options: { cancelMessage?: string } = {}) => - isWindows ? ballmerSpinner() : wrappedClackSpinner(options); +export const spinner = (options: { cancelMessage?: string; plain?: boolean } = {}) => + options.plain + ? plainSpinner() + : isWindows + ? ballmerSpinner() + : wrappedClackSpinner({ cancelMessage: options.cancelMessage }); diff --git a/references/hello-world/trigger.config.ts b/references/hello-world/trigger.config.ts index 7e0b3a3c9d..2c3751b041 100644 --- a/references/hello-world/trigger.config.ts +++ b/references/hello-world/trigger.config.ts @@ -26,7 +26,6 @@ export default defineConfig({ extensions: [ lightpanda(), syncEnvVars(async (ctx) => { - console.log("syncEnvVars", { environment: ctx.environment, branch: ctx.branch }); return [ { name: "SYNC_ENV", value: ctx.environment }, { name: "BRANCH", value: ctx.branch ?? "NO_BRANCH" }, From ec518ecddcd56de9e5482f723ae6081a93400bd6 Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 18:16:22 +0100 Subject: [PATCH 12/21] Remove snipper custom cancel message, not supported in old ver --- packages/cli-v3/src/commands/deploy.ts | 5 +---- packages/cli-v3/src/utilities/windows.ts | 12 ++++-------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index bf8ee69fdf..eec426a768 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -1038,10 +1038,7 @@ async function handleNativeBuildServerDeploy({ return process.exit(0); } - const $queuedSpinner = spinner({ - cancelMessage: - "Disconnecting from the build server log stream. If you intended to cancel the deployment instead, you can do that in the dashboard.", - }); + const $queuedSpinner = spinner(); $queuedSpinner.start("Build queued"); const abortController = new AbortController(); diff --git a/packages/cli-v3/src/utilities/windows.ts b/packages/cli-v3/src/utilities/windows.ts index d37a56392b..4c8f6e55a0 100644 --- a/packages/cli-v3/src/utilities/windows.ts +++ b/packages/cli-v3/src/utilities/windows.ts @@ -37,7 +37,7 @@ function truncateMessage(msg: string, maxLength?: number): string { return truncated + "..."; } -const wrappedClackSpinner = (options: { cancelMessage?: string }) => { +const wrappedClackSpinner = () => { let currentMessage = ""; let isActive = false; @@ -47,7 +47,7 @@ const wrappedClackSpinner = (options: { cancelMessage?: string }) => { } }; - const spinner = clackSpinner(options); + const spinner = clackSpinner(); return { start: (msg?: string): void => { @@ -112,9 +112,5 @@ const plainSpinner = () => ({ // This will become unecessary with the next clack release, the bug was fixed here: // https://github.com/natemoo-re/clack/pull/182 -export const spinner = (options: { cancelMessage?: string; plain?: boolean } = {}) => - options.plain - ? plainSpinner() - : isWindows - ? ballmerSpinner() - : wrappedClackSpinner({ cancelMessage: options.cancelMessage }); +export const spinner = (options?: { plain?: boolean } = {}) => + options.plain ? plainSpinner() : isWindows ? ballmerSpinner() : wrappedClackSpinner(); From ba4978302feae5562d66c4b875e0b56455350e77 Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 18:21:00 +0100 Subject: [PATCH 13/21] Remove custom spacing, also not supported n old ver --- packages/cli-v3/src/commands/deploy.ts | 6 +++--- packages/cli-v3/src/utilities/windows.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index eec426a768..c30fd48fc6 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -1,4 +1,4 @@ -import { intro, log, outro, taskLog } from "@clack/prompts"; +import { intro, log, outro } from "@clack/prompts"; import { getBranch, prepareDeploymentError, tryCatch } from "@trigger.dev/core/v3"; import { InitializeDeploymentRequestBody, @@ -1092,7 +1092,7 @@ async function handleNativeBuildServerDeploy({ case "log": { if (record.seq_num === 0) { $queuedSpinner.stop("Build started"); - log.message("", { symbol: undefined, spacing: 0 }); + log.message("", { symbol: undefined }); queuedSpinnerStopped = true; } @@ -1116,7 +1116,7 @@ async function handleNativeBuildServerDeploy({ ? chalkGrey(message) : message; - log.message(`${formattedTimestamp} ${formattedMessage}`, { symbol: undefined, spacing: 0 }); + log.message(`${formattedTimestamp} ${formattedMessage}`, { symbol: undefined }); break; } case "finalized": { diff --git a/packages/cli-v3/src/utilities/windows.ts b/packages/cli-v3/src/utilities/windows.ts index 4c8f6e55a0..3ebf403f43 100644 --- a/packages/cli-v3/src/utilities/windows.ts +++ b/packages/cli-v3/src/utilities/windows.ts @@ -112,5 +112,5 @@ const plainSpinner = () => ({ // This will become unecessary with the next clack release, the bug was fixed here: // https://github.com/natemoo-re/clack/pull/182 -export const spinner = (options?: { plain?: boolean } = {}) => +export const spinner = (options: { plain?: boolean } = { plain: false }) => options.plain ? plainSpinner() : isWindows ? ballmerSpinner() : wrappedClackSpinner(); From fc2b733a497c4809fccd0c1f08648a41907c1481 Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 20:41:26 +0100 Subject: [PATCH 14/21] Switch logs printing to a simple console log in favor of tighter line spacing --- packages/cli-v3/src/commands/deploy.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index c30fd48fc6..236b1fc476 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -1092,7 +1092,7 @@ async function handleNativeBuildServerDeploy({ case "log": { if (record.seq_num === 0) { $queuedSpinner.stop("Build started"); - log.message("", { symbol: undefined }); + console.log("│"); queuedSpinnerStopped = true; } @@ -1116,7 +1116,13 @@ async function handleNativeBuildServerDeploy({ ? chalkGrey(message) : message; - log.message(`${formattedTimestamp} ${formattedMessage}`, { symbol: undefined }); + // We use console.log here instead of clack's logger as the current version does not support changing the line spacing. + // And the logs look verbose with the default spacing. + // We cannot upgrade because the newer versions introduced some weird issues with the spinner. + // Ideally, we'd use clack's `taskLog` to only show the recent n lines of logs as they are streamed, but that also seems brittle + // and has some issues with cursor movements/clearing lines that it shouldn't clear. + // We can revisit this on future versions of `@clack/prompts`. + console.log(`│ ${formattedTimestamp} ${formattedMessage}`); break; } case "finalized": { From 91ab54952eed13fb4958102e4fd467a71a454f1e Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 21:12:29 +0100 Subject: [PATCH 15/21] Ignore SecretsUsedInArgOrEnv docker build warnings, often misleading output for users --- packages/cli-v3/src/deploy/buildImage.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/cli-v3/src/deploy/buildImage.ts b/packages/cli-v3/src/deploy/buildImage.ts index de4205efa9..91fbfced88 100644 --- a/packages/cli-v3/src/deploy/buildImage.ts +++ b/packages/cli-v3/src/deploy/buildImage.ts @@ -686,6 +686,7 @@ async function generateBunContainerfile(options: GenerateContainerfileOptions) { parseGenerateOptions(options); return `# syntax=docker/dockerfile:1 +# check=skip=SecretsUsedInArgOrEnv FROM ${baseImage} AS base ${baseInstructions} @@ -791,6 +792,7 @@ async function generateNodeContainerfile(options: GenerateContainerfileOptions) parseGenerateOptions(options); return `# syntax=docker/dockerfile:1 +# check=skip=SecretsUsedInArgOrEnv FROM ${baseImage} AS base ${baseInstructions} From 164a178b7d90ede9c0f4450dafbb8bb2c8aceb80 Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 21:38:07 +0100 Subject: [PATCH 16/21] Add hint about deployment promotion --- packages/cli-v3/src/commands/deploy.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 236b1fc476..3bfd75b898 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -453,9 +453,9 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { const $spinner = spinner({ plain: options.plain }); const buildSuffix = - isLocalBuild && !process.env.TRIGGER_LOCAL_BUILD_LABEL_DISABLED ? " (local)" : ""; + isLocalBuild && process.env.TRIGGER_LOCAL_BUILD_LABEL_DISABLED !== "1" ? " (local)" : ""; const deploySuffix = - isLocalBuild && !process.env.TRIGGER_LOCAL_BUILD_LABEL_DISABLED ? " (local build)" : ""; + isLocalBuild && process.env.TRIGGER_LOCAL_BUILD_LABEL_DISABLED !== "1" ? " (local build)" : ""; if (options.plain) { $spinner.start(`Building version ${version}${buildSuffix}`); @@ -516,7 +516,8 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { const warnings = checkLogsForWarnings(buildResult.logs); - const canShowLocalBuildHint = !isLocalBuild && !process.env.TRIGGER_LOCAL_BUILD_HINT_DISABLED; + const canShowLocalBuildHint = + !isLocalBuild && process.env.TRIGGER_LOCAL_BUILD_HINT_DISABLED !== "1"; const buildFailed = !warnings.ok || !buildResult.ok; if (buildFailed && canShowLocalBuildHint) { @@ -651,7 +652,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { `Version ${version} deployed with ${taskCount} detected task${taskCount === 1 ? "" : "s"}` ); - if (!process.env.TRIGGER_DEPLOYMENT_LINK_OUTPUT_DISABLED) { + if (process.env.TRIGGER_DEPLOYMENT_LINK_OUTPUT_DISABLED !== "1") { console.log(`Deployment: ${rawDeploymentLink}`); console.log(`Test: ${rawTestLink}`); } @@ -1179,6 +1180,12 @@ async function handleNativeBuildServerDeploy({ log.success(finalDeploymentEvent.message); } + if (options.skipPromotion) { + log.info( + `This deployment was not automatically promoted. You can promote in the dashboard or via the promote command, e.g, \`npx trigger.dev promote ${deployment.version}\`.` + ); + } + if (!isLinksSupported) { log.info(`Test tasks: ${rawTestLink}`); } From f0cd1772543dc03a911a44b5a60793bbe7d3464b Mon Sep 17 00:00:00 2001 From: myftija Date: Mon, 24 Nov 2025 21:48:26 +0100 Subject: [PATCH 17/21] Consolidate failed log messages --- packages/cli-v3/src/commands/deploy.ts | 54 +++++++++++++++++--------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 3bfd75b898..75a4dbd3b7 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -1203,13 +1203,19 @@ async function handleNativeBuildServerDeploy({ return process.exit(0); } case "failed": { - queuedSpinnerStopped - ? log.error("Deployment failed") - : $queuedSpinner.stop("Deployment failed"); - - if (finalDeploymentEvent.message) { - log.error(chalk.bold(chalkError(finalDeploymentEvent.message))); + if (!queuedSpinnerStopped) { + $queuedSpinner.stop("Deployment failed"); } + + log.error( + chalk.bold( + chalkError( + "Deployment failed" + + (finalDeploymentEvent.message ? `: ${finalDeploymentEvent.message}` : "") + ) + ) + ); + throw new OutroCommandError( `Version ${deployment.version} deployment failed ${ isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" @@ -1217,13 +1223,19 @@ async function handleNativeBuildServerDeploy({ ); } case "timed_out": { - queuedSpinnerStopped - ? log.error("Deployment timed out") - : $queuedSpinner.stop("Deployment timed out"); - - if (finalDeploymentEvent.message) { - log.error(chalk.bold(chalkError(finalDeploymentEvent.message))); + if (!queuedSpinnerStopped) { + $queuedSpinner.stop("Deployment timed out"); } + + log.error( + chalk.bold( + chalkError( + "Deployment timed out" + + (finalDeploymentEvent.message ? `: ${finalDeploymentEvent.message}` : "") + ) + ) + ); + throw new OutroCommandError( `Version ${deployment.version} deployment timed out ${ isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" @@ -1231,13 +1243,19 @@ async function handleNativeBuildServerDeploy({ ); } case "canceled": { - queuedSpinnerStopped - ? log.error("Deployment was canceled") - : $queuedSpinner.stop("Deployment was canceled"); - - if (finalDeploymentEvent.message) { - log.error(chalk.bold(chalkError(finalDeploymentEvent.message))); + if (!queuedSpinnerStopped) { + $queuedSpinner.stop("Deployment was canceled"); } + + log.error( + chalk.bold( + chalkError( + "Deployment was canceled" + + (finalDeploymentEvent.message ? `: ${finalDeploymentEvent.message}` : "") + ) + ) + ); + throw new OutroCommandError( `Version ${deployment.version} deployment canceled ${ isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : "" From be69de3a3e3a787b5e2d40fcb4cc004482fbb50b Mon Sep 17 00:00:00 2001 From: myftija Date: Tue, 25 Nov 2025 14:08:25 +0100 Subject: [PATCH 18/21] Drop the `force` from `--force-local-build` *It is cleaner that way* --- packages/cli-v3/src/commands/deploy.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/cli-v3/src/commands/deploy.ts b/packages/cli-v3/src/commands/deploy.ts index 75a4dbd3b7..7f03a814dc 100644 --- a/packages/cli-v3/src/commands/deploy.ts +++ b/packages/cli-v3/src/commands/deploy.ts @@ -74,6 +74,7 @@ const DeployCommandOptions = CommonCommandOptions.extend({ envFile: z.string().optional(), // Local build options forceLocalBuild: z.boolean().optional(), + localBuild: z.boolean().optional(), useRegistryCache: z.boolean().default(false), network: z.enum(["default", "none", "host"]).optional(), push: z.boolean().optional(), @@ -156,7 +157,12 @@ export function configureDeployCommand(program: Command) { ).hideHelp() ) // Local build options - .addOption(new CommandOption("--force-local-build", "Force a local build of the image")) + .addOption( + new CommandOption("--force-local-build", "Deprecated alias for --local-build").implies({ + localBuild: true, + }) + ) + .addOption(new CommandOption("--local-build", "Build the deployment image locally")) .addOption(new CommandOption("--push", "Push the image after local builds").hideHelp()) .addOption( new CommandOption("--no-push", "Do not push the image after local builds").hideHelp() @@ -379,9 +385,9 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) { }, envVars.TRIGGER_EXISTING_DEPLOYMENT_ID ); - const isLocalBuild = options.forceLocalBuild || !deployment.externalBuildData; + const isLocalBuild = options.localBuild || !deployment.externalBuildData; // Would be best to actually store this separately in the deployment object. This is an okay proxy for now. - const remoteBuildExplicitlySkipped = options.forceLocalBuild && !!deployment.externalBuildData; + const remoteBuildExplicitlySkipped = options.localBuild && !!deployment.externalBuildData; // Fail fast if we know local builds will fail if (isLocalBuild) { From 52282996cd01783a4a40a948c4ad5813cdc3975d Mon Sep 17 00:00:00 2001 From: myftija Date: Tue, 25 Nov 2025 14:11:59 +0100 Subject: [PATCH 19/21] Add changeset --- .changeset/calm-avocados-yawn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/calm-avocados-yawn.md diff --git a/.changeset/calm-avocados-yawn.md b/.changeset/calm-avocados-yawn.md new file mode 100644 index 0000000000..8db6aae339 --- /dev/null +++ b/.changeset/calm-avocados-yawn.md @@ -0,0 +1,5 @@ +--- +"trigger.dev": patch +--- + +The `--force-local-build` flag is now renamed to just `--local-build` From 4365889d09e02b420b84705ce5fdfe45abf4094f Mon Sep 17 00:00:00 2001 From: myftija Date: Tue, 25 Nov 2025 14:13:07 +0100 Subject: [PATCH 20/21] Update the original changeset to a minor release --- .changeset/proud-birds-change.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/proud-birds-change.md b/.changeset/proud-birds-change.md index a0b5132075..083a51b080 100644 --- a/.changeset/proud-birds-change.md +++ b/.changeset/proud-birds-change.md @@ -1,6 +1,6 @@ --- -"trigger.dev": patch -"@trigger.dev/core": patch +"trigger.dev": minor +"@trigger.dev/core": minor --- -Added support for native build server builds in the deploy command +Added support for native build server builds in the deploy command (`--native-build-server`) From 973a04d4dc42edfb74dba205febe8ddef7384f0a Mon Sep 17 00:00:00 2001 From: myftija Date: Tue, 25 Nov 2025 14:14:14 +0100 Subject: [PATCH 21/21] Revert prerelease changeset config change --- .changeset/config.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.changeset/config.json b/.changeset/config.json index 6d5af2eedd..115f54fefe 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -1,6 +1,11 @@ { "$schema": "https://unpkg.com/@changesets/config@2.2.0/schema.json", - "changelog": "@changesets/cli/changelog", + "changelog": [ + "@remix-run/changelog-github", + { + "repo": "triggerdotdev/trigger.dev" + } + ], "commit": false, "fixed": [["@trigger.dev/*", "trigger.dev"]], "linked": [],