@go-to-k/cdkd 0.270.0 → 0.271.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { $ as WorkGraph, A as slowCcOperationTimeoutMs, At as warnDeprecatedNoPrefixCliFlag, B as applyRoleArnIfSet, Bt as resolveBucketRegion, C as yellow, Ct as resolveAutoAssetStorage, D as ProviderRegistry, Dt as resolveStateBucketWithDefaultAndSource, E as clearOnUpdateRemoval, Et as resolveStateBucketWithDefault, F as refStateLookupFromResource, Ft as uploadCfnTemplate, G as DagBuilder, H as describeTypeWithThrottleRetry, Ht as getAwsClients, I as WAFv2WebACLProvider, It as expectedOwnerParam, J as S3StateBackend, K as TemplateParser, Kt as CdkdError, L as normalizeAwsTagsToCfn, Lt as AssemblyReader, M as isTerminationProtectionPropagationError, Mt as CFN_TEMPLATE_URL_LIMIT, N as IntrinsicFunctionResolver, Nt as MIGRATE_TMP_PREFIX, O as findActionableSilentDrops, Ot as resolveUseCdkBootstrapAssets, P as cfnRefValueFromPhysicalId, Pt as findLargeInlineResources, Q as stringifyValue, Qt as LocalStartServiceError, R as resolveExplicitPhysicalId, Rt as processStackMessages, S as red, St as resolveApp, T as collectInlinePolicyNamesManagedBySiblings, Tt as resolveSkipPrefix, U as withRetry, Ut as resetAwsClients, V as DiffCalculator, Vt as AwsClients, W as isRetryableTransientError, Wt as setAwsClients, X as shouldRetainResource, Xt as LocalInvokeBuildError$1, Y as rebuildClientForBucketRegion, Yt as DeployCancelledError, Z as AssetPublisher, Zt as LocalMigrateError, _ as formatResourceLine, _t as getDockerImageBySourceHash, a as DeploymentEventsStore, an as ResourceUpdateNotSupportedError, at as BOOTSTRAP_MARKER_PREFIX, b as gray, bt as getDefaultStateBucketName, c as replayFailedOperations, ct as parseBootstrapMarker, d as IMPLICIT_DELETE_DEPENDENCIES, dt as buildDockerImage, en as MissingCdkCliError, et as buildAssetRedirectMap, f as computeImplicitDeleteEdges, fn as normalizeAwsError, ft as formatDockerLoginError, g as renderStatefulReason, gt as AssetManifestLoader, h as isStatefulRecreateTargetSync, ht as runDockerStreaming, i as DeploymentEventsReader, in as ResourceTimeoutError, it as AssetModeResolver, j as disableInstanceApiTermination, jt as CFN_TEMPLATE_BODY_LIMIT, k as CloudControlProvider, kt as stateBucketExistenceConfirmed, l as replayRollback, lt as validateAssetBucketName, m as MULTI_REGION_RECREATE_BLOCKED_TYPES, mt as runDockerForeground, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as PartialFailureError, nt as loadPublishableAssetManifest, o as planFailedOps, on as StackHasActiveImportsError, ot as ensureAssetStorage, p as extractDeploymentEventError, pn as withErrorHandling, pt as getDockerCmd, q as LockManager, r as DeployEngine, rn as ProvisioningError, rt as rewriteTemplateAssetReferences, s as planRollback, sn as StackTerminationProtectionError, st as getBootstrapMarkerKey, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as NestedStackChildDirectDestroyError, tt as createAssetRedirectResolver, u as withResourceDeadline, ut as validateContainerRepoName, v as bold, vt as Synthesizer, w as IAMRoleProvider, wt as resolveCaptureObservedState, x as green, xt as getLegacyStateBucketName, y as cyan, yt as synthesisStatusMessage, z as assertRegionMatch } from "./deploy-engine-D3tkYlnl.js";
2
+ import { $ as WorkGraph, A as slowCcOperationTimeoutMs, At as warnDeprecatedNoPrefixCliFlag, B as applyRoleArnIfSet, Bt as resolveBucketRegion, C as yellow, Ct as resolveAutoAssetStorage, D as ProviderRegistry, Dt as resolveStateBucketWithDefaultAndSource, E as clearOnUpdateRemoval, Et as resolveStateBucketWithDefault, F as refStateLookupFromResource, Ft as uploadCfnTemplate, G as DagBuilder, H as describeTypeWithThrottleRetry, Ht as getAwsClients, I as WAFv2WebACLProvider, It as expectedOwnerParam, J as S3StateBackend, K as TemplateParser, Kt as CdkdError, L as normalizeAwsTagsToCfn, Lt as AssemblyReader, M as isTerminationProtectionPropagationError, Mt as CFN_TEMPLATE_URL_LIMIT, N as IntrinsicFunctionResolver, Nt as MIGRATE_TMP_PREFIX, O as findActionableSilentDrops, Ot as resolveUseCdkBootstrapAssets, P as cfnRefValueFromPhysicalId, Pt as findLargeInlineResources, Q as stringifyValue, Qt as LocalStartServiceError, R as resolveExplicitPhysicalId, Rt as processStackMessages, S as red, St as resolveApp, T as collectInlinePolicyNamesManagedBySiblings, Tt as resolveSkipPrefix, U as withRetry, Ut as resetAwsClients, V as DiffCalculator, Vt as AwsClients, W as isRetryableTransientError, Wt as setAwsClients, X as shouldRetainResource, Xt as LocalInvokeBuildError$1, Y as rebuildClientForBucketRegion, Yt as DeployCancelledError, Z as AssetPublisher, Zt as LocalMigrateError, _ as formatResourceLine, _t as getDockerImageBySourceHash, a as DeploymentEventsStore, an as ResourceUpdateNotSupportedError, at as BOOTSTRAP_MARKER_PREFIX, b as gray, bt as getDefaultStateBucketName, c as replayFailedOperations, ct as parseBootstrapMarker, d as IMPLICIT_DELETE_DEPENDENCIES, dt as buildDockerImage, en as MissingCdkCliError, et as buildAssetRedirectMap, f as computeImplicitDeleteEdges, fn as normalizeAwsError, ft as formatDockerLoginError, g as renderStatefulReason, gt as AssetManifestLoader, h as isStatefulRecreateTargetSync, ht as runDockerStreaming, i as DeploymentEventsReader, in as ResourceTimeoutError, it as AssetModeResolver, j as disableInstanceApiTermination, jt as CFN_TEMPLATE_BODY_LIMIT, k as CloudControlProvider, kt as stateBucketExistenceConfirmed, l as replayRollback, lt as validateAssetBucketName, m as MULTI_REGION_RECREATE_BLOCKED_TYPES, mt as runDockerForeground, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as PartialFailureError, nt as loadPublishableAssetManifest, o as planFailedOps, on as StackHasActiveImportsError, ot as ensureAssetStorage, p as extractDeploymentEventError, pn as withErrorHandling, pt as getDockerCmd, q as LockManager, r as DeployEngine, rn as ProvisioningError, rt as rewriteTemplateAssetReferences, s as planRollback, sn as StackTerminationProtectionError, st as getBootstrapMarkerKey, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as NestedStackChildDirectDestroyError, tt as createAssetRedirectResolver, u as withResourceDeadline, ut as validateContainerRepoName, v as bold, vt as Synthesizer, w as IAMRoleProvider, wt as resolveCaptureObservedState, x as green, xt as getLegacyStateBucketName, y as cyan, yt as synthesisStatusMessage, z as assertRegionMatch } from "./deploy-engine-DlTH1ou6.js";
3
3
  import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, f as withSkipPrefix, i as runStackBuffered, n as getLogger, o as PATTERN_B_NAME_OPTIONS, p as withStackName, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-BYMEE-BS.js";
4
- import { t as ASGProvider } from "./asg-provider-D3Ioxi3j.js";
4
+ import { t as ASGProvider } from "./asg-provider-CpHXw10b.js";
5
5
  import { AsyncLocalStorage } from "node:async_hooks";
6
6
  import { createHash, randomBytes, randomUUID } from "node:crypto";
7
7
  import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchBucket, PutBucketAccelerateConfigurationCommand, PutBucketAnalyticsConfigurationCommand, PutBucketCorsCommand, PutBucketEncryptionCommand, PutBucketIntelligentTieringConfigurationCommand, PutBucketInventoryConfigurationCommand, PutBucketLifecycleConfigurationCommand, PutBucketLoggingCommand, PutBucketMetricsConfigurationCommand, PutBucketNotificationConfigurationCommand, PutBucketOwnershipControlsCommand, PutBucketPolicyCommand, PutBucketReplicationCommand, PutBucketTaggingCommand, PutBucketVersioningCommand, PutBucketWebsiteCommand, PutObjectCommand, PutObjectLockConfigurationCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -347,32 +347,41 @@ function ensureWarnAfter(opts) {
347
347
  return opts.resourceWarnAfter;
348
348
  }
349
349
  /**
350
- * Skip waiting for async-stabilization resources (CloudFront, RDS,
351
- * ElastiCache, NAT Gateway, EC2 Instance, ELBv2 LoadBalancer, Lambda
352
- * MicroVM Image) on deploy. Setting the flag mutates
350
+ * Skip waiting for async-stabilization resources (RDS, ElastiCache,
351
+ * NAT Gateway, EC2 Instance, ELBv2 LoadBalancer, Lambda MicroVM Image)
352
+ * on deploy. Setting the flag mutates
353
353
  * `process.env.CDKD_NO_WAIT='true'`; provider code checks that env
354
354
  * var, not the parsed CLI option (this lets nested call paths — e.g.
355
355
  * asset publish, lifecycle hooks — see the same setting without
356
356
  * threading the flag through every function signature).
357
357
  *
358
+ * CloudFront Distribution left this list with issue #1282: its
359
+ * `Deployed` wait is skipped by DEFAULT now, so under `--no-wait` it
360
+ * simply behaves the same as the default (`--full-wait` opts back in).
361
+ *
358
362
  * Deploy-only. NAT Gateway destroy always waits regardless (a
359
363
  * still-`deleting` gateway blocks downstream Subnet / IGW / VPC
360
- * delete with DependencyViolation), and CloudFront / RDS / ElastiCache
361
- * destroy paths don't wait to begin with so `destroy --no-wait`
362
- * would be a no-op flag.
364
+ * delete with DependencyViolation), RDS / ElastiCache destroy paths
365
+ * don't wait to begin with, and CloudFront's destroy-side
366
+ * disable-then-wait is an API requirement no flag may skip — so
367
+ * `destroy --no-wait` would be a no-op flag.
363
368
  */
364
- const noWaitOption = new Option("--no-wait", "Skip waiting for async resources to stabilize (CloudFront, RDS, ElastiCache, NAT Gateway, EC2 Instance, ELBv2 LoadBalancer, Lambda MicroVM Image)");
369
+ const noWaitOption = new Option("--no-wait", "Skip waiting for async resources to stabilize (RDS, ElastiCache, NAT Gateway, EC2 Instance, ELBv2 LoadBalancer, Lambda MicroVM Image)");
365
370
  /**
366
- * Opt in to the stabilization waits cdkd deliberately SKIPS by default:
367
- * the ones where CloudFormation waits and Terraform does not. Today that
368
- * is ECS Service steady state (create and update).
371
+ * Opt in to the stabilization waits cdkd deliberately SKIPS by default.
372
+ * Today that is ECS Service steady state (create and update; a
373
+ * "CloudFormation waits, Terraform does not" disagree-case) and
374
+ * CloudFront Distribution `Deployed` (create and update; both engines
375
+ * wait, but the wait has no in-deploy consumer and no failure signal —
376
+ * the fast-side clause, issue #1282).
369
377
  *
370
378
  * `--no-wait`, the default, and `--full-wait` are three points on one
371
379
  * axis, from least to most waiting:
372
380
  *
373
381
  * - `--no-wait` skip the stabilization waits cdkd performs by default
374
- * - (default) wait where CloudFormation and Terraform agree
375
- * - `--full-wait` also wait where only CloudFormation waits
382
+ * - (default) wait where the wait is load-bearing (in-deploy
383
+ * consumers / failure detection)
384
+ * - `--full-wait` also wait everywhere CloudFormation waits
376
385
  *
377
386
  * Which one is right depends on whether anything downstream needs the
378
387
  * resource to actually be serving, NOT on where the deploy runs: cutting
@@ -390,7 +399,7 @@ const noWaitOption = new Option("--no-wait", "Skip waiting for async resources t
390
399
  *
391
400
  * Deploy-only, like `--no-wait`.
392
401
  */
393
- const fullWaitOption = new Option("--full-wait", "Also wait for stabilizations cdkd skips by default, matching CloudFormation (ECS Service steady state)");
402
+ const fullWaitOption = new Option("--full-wait", "Also wait for stabilizations cdkd skips by default, matching CloudFormation (ECS Service steady state, CloudFront Distribution Deployed)");
394
403
  /**
395
404
  * Reject `--no-wait --full-wait`. They sit at opposite ends of one axis,
396
405
  * so a combination has no coherent meaning: the user is asking to both
@@ -20604,6 +20613,32 @@ var CloudFrontOACProvider = class {
20604
20613
  }
20605
20614
  };
20606
20615
 
20616
+ //#endregion
20617
+ //#region src/provisioning/resource-timeout-registry.ts
20618
+ let resolved;
20619
+ /**
20620
+ * Seed the registry with the validated `--resource-timeout` input. Call once
20621
+ * per CLI invocation, right after `validateResourceTimeouts`. Passing
20622
+ * `undefined` (flag not supplied) clears the registry, so consumers fall back
20623
+ * to their own compile-time floors.
20624
+ */
20625
+ function setResolvedResourceTimeouts(opt) {
20626
+ resolved = opt;
20627
+ }
20628
+ /**
20629
+ * The user's resolved timeout for `resourceType` in milliseconds, or
20630
+ * `undefined` when the user supplied nothing applicable. Resolution matches
20631
+ * the outer-deadline sites: per-type override wins, else the explicit global
20632
+ * value. The compile-time default (`DEFAULT_RESOURCE_TIMEOUT_MS`) is
20633
+ * deliberately NOT applied here — an inner waiter's own floor (e.g. ECS 600s)
20634
+ * must only be raised by an EXPLICIT user value, never by the generic 30m
20635
+ * default silently multiplying every `--full-wait` failure by 3x.
20636
+ */
20637
+ function resolvedResourceTimeoutMs(resourceType) {
20638
+ if (!resolved) return void 0;
20639
+ return resolved.perTypeMs?.[resourceType] ?? resolved.globalMs;
20640
+ }
20641
+
20607
20642
  //#endregion
20608
20643
  //#region src/provisioning/providers/cloudfront-distribution-provider.ts
20609
20644
  /**
@@ -20676,10 +20711,7 @@ var CloudFrontDistributionProvider = class {
20676
20711
  const distributionId = distribution.Id;
20677
20712
  const domainName = distribution.DomainName;
20678
20713
  this.logger.debug(`Created CloudFront Distribution: ${distributionId} (${domainName})`);
20679
- if (process.env["CDKD_NO_WAIT"] !== "true") {
20680
- this.logger.debug(`Waiting for Distribution ${distributionId} to reach Deployed status...`);
20681
- await this.waitForDistributionStable(distributionId);
20682
- }
20714
+ await this.settleDistribution(logicalId, distributionId);
20683
20715
  return {
20684
20716
  physicalId: distributionId,
20685
20717
  attributes: {
@@ -20719,6 +20751,7 @@ var CloudFrontDistributionProvider = class {
20719
20751
  const domainName = getResponse.Distribution?.DomainName ?? "";
20720
20752
  const arn = getResponse.Distribution?.ARN;
20721
20753
  await this.applyTagDiff(arn, previousProperties["Tags"], properties["Tags"], physicalId, logicalId, resourceType);
20754
+ await this.settleDistribution(logicalId, physicalId);
20722
20755
  this.logger.debug(`Updated CloudFront Distribution ${physicalId}`);
20723
20756
  return {
20724
20757
  physicalId,
@@ -20769,7 +20802,7 @@ var CloudFrontDistributionProvider = class {
20769
20802
  IfMatch: etag,
20770
20803
  DistributionConfig: config
20771
20804
  }))).ETag;
20772
- await this.waitForDistributionStable(physicalId, false);
20805
+ if (!await this.waitForDistributionStable(physicalId, false)) this.logger.warn(`Distribution ${physicalId} disable did not settle (Deployed + disabled) within the wait budget; attempting delete anyway. If it fails with DistributionNotDisabled, retry the destroy or raise the budget with --resource-timeout AWS::CloudFront::Distribution=<duration>.`);
20773
20806
  etag = (await this.cloudFrontClient.send(new GetDistributionConfigCommand({ Id: physicalId }))).ETag;
20774
20807
  }
20775
20808
  await this.cloudFrontClient.send(new DeleteDistributionCommand({
@@ -20869,17 +20902,39 @@ var CloudFrontDistributionProvider = class {
20869
20902
  throw new Error(`Unsupported attribute: ${attributeName} for AWS::CloudFront::Distribution`);
20870
20903
  }
20871
20904
  /**
20872
- * Wait for a distribution to reach a stable state.
20905
+ * Settle a CloudFront Distribution according to the run's wait mode.
20873
20906
  *
20874
- * "Stable" means Status === 'Deployed'. When `expectedEnabled` is provided,
20875
- * we additionally require DistributionConfig.Enabled === expectedEnabled
20876
- * this guards against CloudFront's eventually-consistent reads that can
20877
- * briefly return the pre-update snapshot after UpdateDistribution returns.
20907
+ * cdkd does NOT wait for `Deployed` by default (issue #1282). Both
20908
+ * CloudFormation and Terraform (`wait_for_deployment`, default `true`) wait
20909
+ * here, so this is a deliberate divergence under the wait-semantics policy's
20910
+ * fast-side clause: every `Fn::GetAtt` (Id / DomainName) is final in the
20911
+ * Create/Update response so nothing in-deploy consumes `Deployed`, the wait
20912
+ * carries no failure signal (a distribution deploy cannot fail — a long
20913
+ * wait means slow edge propagation, not brokenness), and Terraform's
20914
+ * `wait_for_deployment` toggle keeps the benchmark comparison measurable in
20915
+ * both modes. `--full-wait` opts back into the CloudFormation behavior.
20916
+ */
20917
+ async settleDistribution(logicalId, distributionId) {
20918
+ if (process.env["CDKD_FULL_WAIT"] === "true") {
20919
+ this.logger.debug(`Waiting for Distribution ${distributionId} to reach Deployed status...`);
20920
+ if (!await this.waitForDistributionStable(distributionId)) this.logger.warn(`CloudFront Distribution ${logicalId} (${distributionId}) did not reach Deployed within the wait budget; continuing (propagation finishes in the background). To wait manually: aws cloudfront wait distribution-deployed --id ${distributionId}. Raise the budget with --resource-timeout AWS::CloudFront::Distribution=<duration>.`);
20921
+ return;
20922
+ }
20923
+ const fullWaitHint = process.env["CDKD_WAIT_FLAGS_AVAILABLE"] === "true" ? "; pass --full-wait to wait" : "";
20924
+ this.logger.info(`CloudFront Distribution ${logicalId} accepted (not waiting for Deployed${fullWaitHint}). To wait manually: aws cloudfront wait distribution-deployed --id ${distributionId}`);
20925
+ }
20926
+ /**
20927
+ * Poll until the distribution reports `Status: Deployed` (and, when
20928
+ * `expectedEnabled` is given, the matching `Enabled` value — the delete
20929
+ * path's disable-then-delete requirement).
20878
20930
  *
20879
- * Uses exponential backoff polling.
20931
+ * Returns `true` when the stable state was observed (or the wait was
20932
+ * interrupted by SIGINT — the caller is shutting down, so no timeout
20933
+ * warning applies), `false` on budget exhaustion.
20880
20934
  */
20881
20935
  async waitForDistributionStable(distributionId, expectedEnabled) {
20882
- const maxAttempts = 120;
20936
+ const budgetMs = Math.max(1200 * 1e3, resolvedResourceTimeoutMs("AWS::CloudFront::Distribution") ?? 0);
20937
+ const deadline = Date.now() + budgetMs;
20883
20938
  let delay = 5e3;
20884
20939
  const maxDelay = 1e4;
20885
20940
  let interrupted = false;
@@ -20888,24 +20943,37 @@ var CloudFrontDistributionProvider = class {
20888
20943
  };
20889
20944
  process.on("SIGINT", sigintHandler);
20890
20945
  try {
20891
- for (let attempt = 1; attempt <= maxAttempts; attempt++) {
20946
+ while (Date.now() < deadline) {
20892
20947
  if (interrupted) {
20893
20948
  this.logger.debug(`Distribution ${distributionId} wait interrupted by SIGINT, proceeding`);
20894
- return;
20949
+ return true;
20895
20950
  }
20896
- const response = await this.cloudFrontClient.send(new GetDistributionCommand({ Id: distributionId }));
20897
- const status = response.Distribution?.Status;
20898
- const enabled = response.Distribution?.DistributionConfig?.Enabled;
20899
- if (status === "Deployed" && (expectedEnabled === void 0 || enabled === expectedEnabled)) {
20900
- this.logger.debug(`Distribution ${distributionId} is stable (Status=Deployed, Enabled=${enabled})`);
20901
- return;
20951
+ let response;
20952
+ try {
20953
+ response = await this.cloudFrontClient.send(new GetDistributionCommand({ Id: distributionId }));
20954
+ } catch (error) {
20955
+ if (error instanceof NoSuchDistribution) throw error;
20956
+ this.logger.debug(`Distribution ${distributionId} status read failed (${error instanceof Error ? error.message : String(error)}); retrying`);
20957
+ }
20958
+ if (response) {
20959
+ const status = response.Distribution?.Status;
20960
+ const enabled = response.Distribution?.DistributionConfig?.Enabled;
20961
+ if (status === "Deployed" && (expectedEnabled === void 0 || enabled === expectedEnabled)) {
20962
+ this.logger.debug(`Distribution ${distributionId} is stable (Status=Deployed, Enabled=${enabled})`);
20963
+ return true;
20964
+ }
20965
+ this.logger.debug(`Distribution ${distributionId} status: ${status}, enabled: ${enabled}` + (expectedEnabled === void 0 ? "" : ` (waiting for Enabled=${expectedEnabled})`));
20902
20966
  }
20903
- this.logger.debug(`Distribution ${distributionId} status: ${status}, enabled: ${enabled}` + (expectedEnabled === void 0 ? "" : ` (waiting for Enabled=${expectedEnabled})`) + ` (attempt ${attempt}/${maxAttempts})`);
20904
20967
  const sleepEnd = Date.now() + delay;
20905
20968
  while (Date.now() < sleepEnd && !interrupted) await new Promise((resolve) => setTimeout(resolve, 1e3));
20906
20969
  delay = Math.min(delay * 1.5, maxDelay);
20907
20970
  }
20971
+ if (interrupted) {
20972
+ this.logger.debug(`Distribution ${distributionId} wait interrupted by SIGINT, proceeding`);
20973
+ return true;
20974
+ }
20908
20975
  this.logger.debug(`Distribution ${distributionId} did not reach stable state within timeout, proceeding with next step`);
20976
+ return false;
20909
20977
  } finally {
20910
20978
  process.removeListener("SIGINT", sigintHandler);
20911
20979
  }
@@ -22531,32 +22599,6 @@ function wasMeaningfullyConfigured(value, discriminatorKey) {
22531
22599
  return value[discriminatorKey] !== void 0;
22532
22600
  }
22533
22601
 
22534
- //#endregion
22535
- //#region src/provisioning/resource-timeout-registry.ts
22536
- let resolved;
22537
- /**
22538
- * Seed the registry with the validated `--resource-timeout` input. Call once
22539
- * per CLI invocation, right after `validateResourceTimeouts`. Passing
22540
- * `undefined` (flag not supplied) clears the registry, so consumers fall back
22541
- * to their own compile-time floors.
22542
- */
22543
- function setResolvedResourceTimeouts(opt) {
22544
- resolved = opt;
22545
- }
22546
- /**
22547
- * The user's resolved timeout for `resourceType` in milliseconds, or
22548
- * `undefined` when the user supplied nothing applicable. Resolution matches
22549
- * the outer-deadline sites: per-type override wins, else the explicit global
22550
- * value. The compile-time default (`DEFAULT_RESOURCE_TIMEOUT_MS`) is
22551
- * deliberately NOT applied here — an inner waiter's own floor (e.g. ECS 600s)
22552
- * must only be raised by an EXPLICIT user value, never by the generic 30m
22553
- * default silently multiplying every `--full-wait` failure by 3x.
22554
- */
22555
- function resolvedResourceTimeoutMs(resourceType) {
22556
- if (!resolved) return void 0;
22557
- return resolved.perTypeMs?.[resourceType] ?? resolved.globalMs;
22558
- }
22559
-
22560
22602
  //#endregion
22561
22603
  //#region src/provisioning/providers/ecs-provider.ts
22562
22604
  /**
@@ -63162,7 +63204,7 @@ function createMigrateCommand() {
63162
63204
  */
63163
63205
  function buildProgram() {
63164
63206
  const program = new Command();
63165
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.270.0");
63207
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.271.0");
63166
63208
  program.hook("preAction", (_thisCommand, actionCommand) => {
63167
63209
  const { profile } = actionCommand.optsWithGlobals();
63168
63210
  if (profile !== void 0) process.env["AWS_PROFILE"] = profile;