@go-to-k/cdkd 0.299.4 → 0.299.6

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.
Files changed (29) hide show
  1. package/dist/{asg-provider-BtUUjRnI.js → asg-provider-SsXASjNc.js} +4 -4
  2. package/dist/{asg-provider-BtUUjRnI.js.map → asg-provider-SsXASjNc.js.map} +1 -1
  3. package/dist/{aws-failure-text-DtvlUugx.js → aws-failure-text-BEQfs6za.js} +12 -3
  4. package/dist/aws-failure-text-BEQfs6za.js.map +1 -0
  5. package/dist/cli.js +2 -2
  6. package/dist/{deploy-engine-DWIbDQdg.js → deploy-engine-DZhdwU1d.js} +261 -127
  7. package/dist/deploy-engine-DZhdwU1d.js.map +1 -0
  8. package/dist/{iam-policy-targets-Pn2m0R67.js → iam-policy-targets-dAY3-gXJ.js} +2 -2
  9. package/dist/{iam-policy-targets-Pn2m0R67.js.map → iam-policy-targets-dAY3-gXJ.js.map} +1 -1
  10. package/dist/{iam-role-provider-DTQlG8qe.js → iam-role-provider-DIo2_z0s.js} +4 -4
  11. package/dist/{iam-role-provider-DTQlG8qe.js.map → iam-role-provider-DIo2_z0s.js.map} +1 -1
  12. package/dist/index.d.ts +6 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +4 -4
  15. package/dist/{neptune-provider-Bkrw65eO.js → neptune-provider-eZd5MtAD.js} +4 -4
  16. package/dist/{neptune-provider-Bkrw65eO.js.map → neptune-provider-eZd5MtAD.js.map} +1 -1
  17. package/dist/{program-B4_qJpAO.js → program-CvyqGZ2h.js} +40 -16
  18. package/dist/program-CvyqGZ2h.js.map +1 -0
  19. package/dist/{provider-classes-SNKb1al7.js → provider-classes-Dnof5qun.js} +29 -19
  20. package/dist/provider-classes-Dnof5qun.js.map +1 -0
  21. package/dist/{rds-provider-B9gz-giS.js → rds-provider--_cLSeij.js} +4 -4
  22. package/dist/{rds-provider-B9gz-giS.js.map → rds-provider--_cLSeij.js.map} +1 -1
  23. package/dist/{version-B-AQELPJ.js → version--k430Kj8.js} +2 -2
  24. package/dist/{version-B-AQELPJ.js.map → version--k430Kj8.js.map} +1 -1
  25. package/package.json +1 -1
  26. package/dist/aws-failure-text-DtvlUugx.js.map +0 -1
  27. package/dist/deploy-engine-DWIbDQdg.js.map +0 -1
  28. package/dist/program-B4_qJpAO.js.map +0 -1
  29. package/dist/provider-classes-SNKb1al7.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { r as getAwsClients, s as __exportAll } from "./aws-clients-Bj7qH5Ph.js";
2
- import { A as UNRENDERABLE, C as looksLikeCdkdGeneratedName, E as withoutGeneratedFallbackName, F as displayStackName, H as truncateCodePoints, I as isPasteableIdent, M as displayAwsMessage, N as displayIdent, O as SECRET_REF_MAX_CODE_POINTS, P as displaySafe, R as plainIdentOr, S as getCurrentStackName, T as withStackName, V as terminalSafe, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as safeMsg } from "./aws-failure-text-DtvlUugx.js";
3
- import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-Pn2m0R67.js";
2
+ import { A as UNRENDERABLE, B as safeMsg, C as looksLikeCdkdGeneratedName, D as SAFE_MSG_ALTERED_CHAR, E as withoutGeneratedFallbackName, F as displaySafe, H as terminalSafe, I as displayStackName, L as isPasteableIdent, N as displayAwsMessage, O as SECRET_REF_MAX_CODE_POINTS, P as displayIdent, S as getCurrentStackName, T as withStackName, U as truncateCodePoints, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, j as asIsMessage, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as plainIdentOr } from "./aws-failure-text-BEQfs6za.js";
3
+ import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-dAY3-gXJ.js";
4
4
  import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-DBXBcg0J.js";
5
- import { t as getCdkdVersion } from "./version-B-AQELPJ.js";
5
+ import { t as getCdkdVersion } from "./version--k430Kj8.js";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
8
8
  import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketLifecycleConfigurationCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -7206,6 +7206,28 @@ function nanIfUncoercible(value) {
7206
7206
  //#endregion
7207
7207
  //#region src/deployment/secret-redaction/rules.ts
7208
7208
  const MIN_NEEDLE_LENGTH = 4;
7209
+ function printingNeedles(values) {
7210
+ const out = /* @__PURE__ */ new Set();
7211
+ for (const value of values) {
7212
+ if (value.length < 4) continue;
7213
+ out.add(value);
7214
+ const flat = flattenedSpelling(value);
7215
+ if (flat !== void 0 && flat.trim().length >= 4) out.add(flat);
7216
+ }
7217
+ return [...out];
7218
+ }
7219
+ const FLATTENED_MEMO_CAP = 4096;
7220
+ const flattenedMemo = /* @__PURE__ */ new Map();
7221
+ function flattenedSpelling(value) {
7222
+ if (!SAFE_MSG_ALTERED_CHAR.test(value)) return void 0;
7223
+ let flat = flattenedMemo.get(value);
7224
+ if (flat === void 0) {
7225
+ flat = safeMsg`${value}`;
7226
+ if (flattenedMemo.size >= FLATTENED_MEMO_CAP) flattenedMemo.clear();
7227
+ flattenedMemo.set(value, flat);
7228
+ }
7229
+ return flat === value ? void 0 : flat;
7230
+ }
7209
7231
  function escapeRegExp$2(value) {
7210
7232
  return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
7211
7233
  }
@@ -9260,9 +9282,10 @@ function isSameGenerationBag(bag) {
9260
9282
  //#region src/deployment/secret-redaction/mask-errors.ts
9261
9283
  function maskSecretsInText(text, secrets) {
9262
9284
  const logOnly = logOnlyValuesOf.get(secrets);
9263
- if (logOnly === void 0 || logOnly.size === 0) return maskRecordedSecretsInText(text, secrets);
9264
- if (text !== "" && (secrets.has(text) || logOnly.has(text))) return "***";
9265
- return maskMatchSpans(text, substringNeedles([...secrets.keys(), ...logOnly]), "***");
9285
+ const noLogOnly = logOnly === void 0 || logOnly.size === 0;
9286
+ if (secrets.size === 0 && noLogOnly) return text;
9287
+ if (text !== "" && (secrets.has(text) || logOnly?.has(text) === true)) return "***";
9288
+ return maskMatchSpans(text, printingNeedles(noLogOnly ? secrets.keys() : [...secrets.keys(), ...logOnly]), "***");
9266
9289
  }
9267
9290
  function maskRecordedSecretsInText(text, secrets) {
9268
9291
  if (secrets.size === 0) return text;
@@ -9626,7 +9649,7 @@ function createUnionSecretMasker(bags) {
9626
9649
  for (const plaintext of bag.keys()) needles.add(plaintext);
9627
9650
  for (const plaintext of logOnlyValuesOf.get(bag) ?? []) needles.add(plaintext);
9628
9651
  }
9629
- scanned = [...needles].filter((needle) => needle.length >= 4);
9652
+ scanned = printingNeedles(needles);
9630
9653
  stamp = now;
9631
9654
  }
9632
9655
  if (text !== "" && needles.has(text)) return "***";
@@ -11446,7 +11469,7 @@ const CREATE_ONLY_PATHS_SNAPSHOT = /* @__PURE__ */ new Map([
11446
11469
  ["AWS::AppSync::ApiKey", [["ApiId"]]],
11447
11470
  ["AWS::AppSync::DataSource", [["ApiId"], ["Name"]]],
11448
11471
  ["AWS::AppSync::GraphQLApi", []],
11449
- ["AWS::AppSync::GraphQLSchema", [["ApiId"]]],
11472
+ ["AWS::AppSync::GraphQLSchema", []],
11450
11473
  ["AWS::AppSync::Resolver", [
11451
11474
  ["ApiId"],
11452
11475
  ["FieldName"],
@@ -11461,7 +11484,7 @@ const CREATE_ONLY_PATHS_SNAPSHOT = /* @__PURE__ */ new Map([
11461
11484
  "BaseEvaluatorId"
11462
11485
  ], ["EvaluatorName"]]],
11463
11486
  ["AWS::BedrockAgentCore::Runtime", [["AgentRuntimeName"]]],
11464
- ["AWS::Budgets::Budget", [["NotificationsWithSubscribers"]]],
11487
+ ["AWS::Budgets::Budget", [["Budget", "BudgetName"], ["NotificationsWithSubscribers"]]],
11465
11488
  ["AWS::CertificateManager::Certificate", [
11466
11489
  ["CertificateAuthorityArn"],
11467
11490
  ["CertificateExport"],
@@ -11952,7 +11975,7 @@ const CREATE_ONLY_PATHS_SNAPSHOT = /* @__PURE__ */ new Map([
11952
11975
  ]],
11953
11976
  ["AWS::RDS::DBProxyTargetGroup", [["DBProxyName"], ["TargetGroupName"]]],
11954
11977
  ["AWS::RDS::DBSubnetGroup", [["DBSubnetGroupName"]]],
11955
- ["AWS::Route53::HostedZone", [["Name"]]],
11978
+ ["AWS::Route53::HostedZone", [["DelegationSetId"], ["Name"]]],
11956
11979
  ["AWS::Route53::RecordSet", [["HostedZoneId"], ["HostedZoneName"]]],
11957
11980
  ["AWS::S3::Bucket", [
11958
11981
  ["BucketName"],
@@ -14412,7 +14435,7 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
14412
14435
  ]),
14413
14436
  silentDrop: /* @__PURE__ */ new Map(),
14414
14437
  createOnlyDrops: /* @__PURE__ */ new Set(),
14415
- readOnly: /* @__PURE__ */ new Set(["AnomalyDetectorId"]),
14438
+ readOnly: /* @__PURE__ */ new Set(["Id"]),
14416
14439
  ccRouteUnavailable: true
14417
14440
  }],
14418
14441
  ["AWS::CodeBuild::Project", {
@@ -16275,8 +16298,8 @@ const PROPERTY_COVERAGE_BY_TYPE = /* @__PURE__ */ new Map([
16275
16298
  "QueryLoggingConfig",
16276
16299
  "VPCs"
16277
16300
  ]),
16278
- silentDrop: /* @__PURE__ */ new Map(),
16279
- createOnlyDrops: /* @__PURE__ */ new Set(),
16301
+ silentDrop: /* @__PURE__ */ new Map([["DelegationSetId", "not yet implemented by cdkd"]]),
16302
+ createOnlyDrops: /* @__PURE__ */ new Set(["DelegationSetId"]),
16280
16303
  readOnly: /* @__PURE__ */ new Set(["Id", "NameServers"]),
16281
16304
  ccRouteUnavailable: false
16282
16305
  }],
@@ -25929,7 +25952,7 @@ var CloudControlProvider = class {
25929
25952
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
25930
25953
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
25931
25954
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
25932
- const { ASGProvider } = await import("./asg-provider-BtUUjRnI.js");
25955
+ const { ASGProvider } = await import("./asg-provider-SsXASjNc.js");
25933
25956
  const delegateRegion = ambientRegion();
25934
25957
  let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
25935
25958
  if (asgProvider === void 0) {
@@ -26035,7 +26058,7 @@ var CloudControlProvider = class {
26035
26058
  const family = SDK_DELETE_FAMILIES.get(resourceType);
26036
26059
  const cached = this.sdkDeleteDelegates.get(family);
26037
26060
  if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
26038
- const provider = family === "rds" ? new (await (import("./rds-provider-B9gz-giS.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-Bkrw65eO.js"))).NeptuneProvider({ region: ccRegion });
26061
+ const provider = family === "rds" ? new (await (import("./rds-provider--_cLSeij.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-eZd5MtAD.js"))).NeptuneProvider({ region: ccRegion });
26039
26062
  this.sdkDeleteDelegates.set(family, {
26040
26063
  region: ccRegion,
26041
26064
  provider
@@ -26263,7 +26286,8 @@ var CloudControlProvider = class {
26263
26286
  const causeText = safeDisplay === "" ? "" : `: ${safeDisplay}`;
26264
26287
  if (described.detail !== "") this.logger.debug(`${operation} ${logicalId}: the abandoned operation's underlying failure was: ${displaySafe(described.detail)}`);
26265
26288
  const identifierClause = lastSeenIdentifier === void 0 ? "" : ` The last status cdkd read named the resource ${displaySafe(lastSeenIdentifier, { asciiOnly: true })}.`;
26266
- const error = new CloudControlWaitAbandonedError(`${operation} of ${logicalId} was accepted by Cloud Control API, but cdkd stopped waiting for it (${reason}${causeText}). The operation may still be running in AWS, and ${operation === "CREATE" ? "cdkd has NO state record for it, so any resource it creates is untracked by rollback and by cdkd destroy" : operation === "DELETE" ? "the resource may or may not have been removed; its state record is kept so a re-run can finish the delete" : "its state record still holds the PREVIOUS properties, so the record may no longer describe the live resource"}.${identifierClause} Check what it did with:\n ${await this.buildResumeCommand(requestToken)}`, resourceType, logicalId, requestToken, operation, lastSeenIdentifier, cause instanceof Error ? cause : void 0);
26289
+ const consequence = operation === "CREATE" ? "cdkd has NO state record for it, so any resource it creates is untracked by rollback and by cdkd destroy" : operation === "DELETE" ? "the resource may or may not have been removed; its state record is kept so a re-run can finish the delete" : "its state record still holds the PREVIOUS properties, so the record may no longer describe the live resource";
26290
+ const error = new CloudControlWaitAbandonedError(safeMsg`${operation} of ${logicalId} was accepted by Cloud Control API, but cdkd stopped waiting for it ` + safeMsg`(${reason}${causeText}). The operation may still be running in AWS, and ${consequence}.` + `${identifierClause} Check what it did with:\n ${await this.buildResumeCommand(requestToken)}`, resourceType, logicalId, requestToken, operation, lastSeenIdentifier, cause instanceof Error ? cause : void 0);
26267
26291
  if (described.marker) markRedactedCause(error);
26268
26292
  return operation === "CREATE" ? markNonRetryable(error) : error;
26269
26293
  }
@@ -29847,6 +29871,7 @@ const PROPERTY_SHAPES = /* @__PURE__ */ new Map([
29847
29871
  ["AWS::AutoScaling::AutoScalingGroup", "{\"AvailabilityZoneDistribution\":\"object\",\"AvailabilityZoneIds\":\"array\",\"AvailabilityZoneImpairmentPolicy\":\"object\",\"AvailabilityZones\":\"array\",\"CapacityReservationSpecification\":\"object\",\"CapacityReservationSpecification.CapacityReservationTarget\":\"object\",\"CapacityReservationSpecification.CapacityReservationTarget.CapacityReservationIds\":\"array\",\"CapacityReservationSpecification.CapacityReservationTarget.CapacityReservationResourceGroupArns\":\"array\",\"InstanceLifecyclePolicy\":\"object\",\"InstanceLifecyclePolicy.RetentionTriggers\":\"object\",\"InstanceMaintenancePolicy\":\"object\",\"LaunchTemplate\":\"object\",\"LifecycleHookSpecificationList\":\"array\",\"LifecycleHookSpecificationList[]\":\"object\",\"LoadBalancerNames\":\"array\",\"MetricsCollection\":\"array\",\"MetricsCollection[]\":\"object\",\"MetricsCollection[].Metrics\":\"array\",\"MixedInstancesPolicy\":\"object\",\"MixedInstancesPolicy.InstancesDistribution\":\"object\",\"MixedInstancesPolicy.InstancesDistribution.DistributionSegments\":\"array\",\"MixedInstancesPolicy.InstancesDistribution.DistributionSegments[]\":\"object\",\"MixedInstancesPolicy.InstancesDistribution.DistributionSegments[].TargetCapacityTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.LaunchTemplateSpecification\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[]\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorCount\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorManufacturers\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorNames\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorTotalMemoryMiB\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AcceleratorTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.AllowedInstanceTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselineEbsBandwidthMbps\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselinePerformanceFactors\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselinePerformanceFactors.Cpu\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselinePerformanceFactors.Cpu.References\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.BaselinePerformanceFactors.Cpu.References[]\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.CpuManufacturers\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.ExcludedInstanceTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.InstanceGenerations\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.LocalStorageTypes\":\"array\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.MemoryGiBPerVCpu\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.MemoryMiB\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.NetworkBandwidthGbps\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.NetworkInterfaceCount\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.TotalLocalStorageGB\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].InstanceRequirements.VCpuCount\":\"object\",\"MixedInstancesPolicy.LaunchTemplate.Overrides[].LaunchTemplateSpecification\":\"object\",\"NotificationConfiguration\":\"object\",\"NotificationConfiguration.NotificationTypes\":\"array\",\"NotificationConfigurations\":\"array\",\"NotificationConfigurations[]\":\"object\",\"NotificationConfigurations[].NotificationTypes\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"TargetGroupARNs\":\"array\",\"TerminationPolicies\":\"array\",\"TrafficSources\":\"array\",\"TrafficSources[]\":\"object\",\"VPCZoneIdentifier\":\"array\"}"],
29848
29872
  ["AWS::BedrockAgentCore::Evaluator", "{\"EvaluatorConfig\":\"object\",\"EvaluatorConfig.CodeBased\":\"object\",\"EvaluatorConfig.CodeBased.LambdaConfig\":\"object\",\"EvaluatorConfig.Derived\":\"object\",\"EvaluatorConfig.Derived.ModelConfig\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.BedrockEvaluatorModelConfig\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.BedrockEvaluatorModelConfig.AdditionalModelRequestFields\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.BedrockEvaluatorModelConfig.InferenceConfig\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.BedrockEvaluatorModelConfig.InferenceConfig.StopSequences\":\"array\",\"EvaluatorConfig.Derived.ModelConfig.ResponsesEvaluatorModelConfig\":\"object\",\"EvaluatorConfig.Derived.ModelConfig.ResponsesEvaluatorModelConfig.Reasoning\":\"object\",\"EvaluatorConfig.LlmAsAJudge\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig.AdditionalModelRequestFields\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig.InferenceConfig\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.BedrockEvaluatorModelConfig.InferenceConfig.StopSequences\":\"array\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.ResponsesEvaluatorModelConfig\":\"object\",\"EvaluatorConfig.LlmAsAJudge.ModelConfig.ResponsesEvaluatorModelConfig.Reasoning\":\"object\",\"EvaluatorConfig.LlmAsAJudge.RatingScale\":\"object\",\"EvaluatorConfig.LlmAsAJudge.RatingScale.Categorical\":\"array\",\"EvaluatorConfig.LlmAsAJudge.RatingScale.Categorical[]\":\"object\",\"EvaluatorConfig.LlmAsAJudge.RatingScale.Numerical\":\"array\",\"EvaluatorConfig.LlmAsAJudge.RatingScale.Numerical[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
29849
29873
  ["AWS::BedrockAgentCore::Runtime", "{\"AgentRuntimeArtifact\":\"object\",\"AgentRuntimeArtifact.CodeConfiguration\":\"object\",\"AgentRuntimeArtifact.CodeConfiguration.Code\":\"object\",\"AgentRuntimeArtifact.CodeConfiguration.Code.S3\":\"object\",\"AgentRuntimeArtifact.CodeConfiguration.EntryPoint\":\"array\",\"AgentRuntimeArtifact.ContainerConfiguration\":\"object\",\"AuthorizerConfiguration\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedAudience\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedClients\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedScopes\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration.HostingEnvironments\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration.HostingEnvironments[]\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.AllowedWorkloadConfiguration.WorkloadIdentities\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims[]\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims[].AuthorizingClaimMatchValue\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims[].AuthorizingClaimMatchValue.ClaimMatchValue\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.CustomClaims[].AuthorizingClaimMatchValue.ClaimMatchValue.MatchValueStringList\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.ManagedVpcResource\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.ManagedVpcResource.SecurityGroupIds\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.ManagedVpcResource.SubnetIds\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.ManagedVpcResource.Tags\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpoint.SelfManagedLatticeResource\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[]\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.ManagedVpcResource\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.ManagedVpcResource.SecurityGroupIds\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.ManagedVpcResource.SubnetIds\":\"array\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.ManagedVpcResource.Tags\":\"object\",\"AuthorizerConfiguration.CustomJWTAuthorizer.PrivateEndpointOverrides[].PrivateEndpoint.SelfManagedLatticeResource\":\"object\",\"CapacityProviderConfiguration\":\"object\",\"EnvironmentVariables\":\"object\",\"FilesystemConfigurations\":\"array\",\"FilesystemConfigurations[]\":\"object\",\"FilesystemConfigurations[].CapacityProviderVolume\":\"object\",\"FilesystemConfigurations[].EfsAccessPoint\":\"object\",\"FilesystemConfigurations[].S3FilesAccessPoint\":\"object\",\"FilesystemConfigurations[].SessionStorage\":\"object\",\"LifecycleConfiguration\":\"object\",\"NetworkConfiguration\":\"object\",\"NetworkConfiguration.NetworkModeConfig\":\"object\",\"NetworkConfiguration.NetworkModeConfig.SecurityGroups\":\"array\",\"NetworkConfiguration.NetworkModeConfig.Subnets\":\"array\",\"RequestHeaderConfiguration\":\"object\",\"RequestHeaderConfiguration.RequestHeaderAllowlist\":\"array\",\"Tags\":\"object\",\"WorkloadIdentityDetails\":\"object\"}"],
29874
+ ["AWS::Budgets::Budget", "{\"Budget\":\"object\",\"Budget.AutoAdjustData\":\"object\",\"Budget.AutoAdjustData.HistoricalOptions\":\"object\",\"Budget.BudgetLimit\":\"object\",\"Budget.CostFilters\":\"object\",\"Budget.CostTypes\":\"object\",\"Budget.FilterExpression\":\"object\",\"Budget.FilterExpression.And\":\"array\",\"Budget.FilterExpression.CostCategories\":\"object\",\"Budget.FilterExpression.CostCategories.MatchOptions\":\"array\",\"Budget.FilterExpression.CostCategories.Values\":\"array\",\"Budget.FilterExpression.Dimensions\":\"object\",\"Budget.FilterExpression.Dimensions.MatchOptions\":\"array\",\"Budget.FilterExpression.Dimensions.Values\":\"array\",\"Budget.FilterExpression.Or\":\"array\",\"Budget.FilterExpression.Tags\":\"object\",\"Budget.FilterExpression.Tags.MatchOptions\":\"array\",\"Budget.FilterExpression.Tags.Values\":\"array\",\"Budget.Metrics\":\"array\",\"Budget.PlannedBudgetLimits\":\"object\",\"Budget.TimePeriod\":\"object\",\"NotificationsWithSubscribers\":\"array\",\"NotificationsWithSubscribers[]\":\"object\",\"NotificationsWithSubscribers[].Notification\":\"object\",\"NotificationsWithSubscribers[].Subscribers\":\"array\",\"NotificationsWithSubscribers[].Subscribers[]\":\"object\",\"ResourceTags\":\"array\",\"ResourceTags[]\":\"object\"}"],
29850
29875
  ["AWS::CertificateManager::Certificate", "{\"DomainValidationOptions\":\"array\",\"DomainValidationOptions[]\":\"object\",\"SubjectAlternativeNames\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
29851
29876
  ["AWS::CloudFormation::Stack", "{\"Capabilities\":\"array\",\"NotificationARNs\":\"array\",\"Outputs\":\"array\",\"Outputs[]\":\"object\",\"Parameters\":\"object\",\"StackPolicyBody\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
29852
29877
  ["AWS::CloudFront::CloudFrontOriginAccessIdentity", "{\"CloudFrontOriginAccessIdentityConfig\":\"object\"}"],
@@ -29854,7 +29879,6 @@ const PROPERTY_SHAPES = /* @__PURE__ */ new Map([
29854
29879
  ["AWS::CloudFront::OriginAccessControl", "{\"OriginAccessControlConfig\":\"object\"}"],
29855
29880
  ["AWS::CloudTrail::Trail", "{\"AdvancedEventSelectors\":\"array\",\"AdvancedEventSelectors[]\":\"object\",\"AdvancedEventSelectors[].FieldSelectors\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[]\":\"object\",\"AdvancedEventSelectors[].FieldSelectors[].EndsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].Equals\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotEndsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotEquals\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].NotStartsWith\":\"array\",\"AdvancedEventSelectors[].FieldSelectors[].StartsWith\":\"array\",\"AggregationConfigurations\":\"array\",\"AggregationConfigurations[]\":\"object\",\"AggregationConfigurations[].Templates\":\"array\",\"EventSelectors\":\"array\",\"EventSelectors[]\":\"object\",\"EventSelectors[].DataResources\":\"array\",\"EventSelectors[].DataResources[]\":\"object\",\"EventSelectors[].DataResources[].Values\":\"array\",\"EventSelectors[].ExcludeManagementEventSources\":\"array\",\"InsightSelectors\":\"array\",\"InsightSelectors[]\":\"object\",\"InsightSelectors[].EventCategories\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
29856
29881
  ["AWS::CloudWatch::Alarm", "{\"AlarmActions\":\"array\",\"Dimensions\":\"array\",\"Dimensions[]\":\"object\",\"EvaluationCriteria\":\"object\",\"EvaluationCriteria.PromQLCriteria\":\"object\",\"EvaluationWindow\":\"object\",\"EvaluationWindow.SlidingWindow\":\"object\",\"EvaluationWindow.WallClockWindow\":\"object\",\"InsufficientDataActions\":\"array\",\"Metrics\":\"array\",\"Metrics[]\":\"object\",\"Metrics[].MetricStat\":\"object\",\"Metrics[].MetricStat.Metric\":\"object\",\"Metrics[].MetricStat.Metric.Dimensions\":\"array\",\"Metrics[].MetricStat.Metric.Dimensions[]\":\"object\",\"OKActions\":\"array\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"WarmUpConfiguration\":\"object\"}"],
29857
- ["AWS::CloudWatch::AnomalyDetector", "{\"Configuration\":\"object\",\"Configuration.ExcludedTimeRanges\":\"array\",\"Configuration.ExcludedTimeRanges[]\":\"object\",\"Dimensions\":\"array\",\"Dimensions[]\":\"object\",\"MetricCharacteristics\":\"object\",\"MetricMathAnomalyDetector\":\"object\",\"MetricMathAnomalyDetector.MetricDataQueries\":\"array\",\"MetricMathAnomalyDetector.MetricDataQueries[]\":\"object\",\"MetricMathAnomalyDetector.MetricDataQueries[].MetricStat\":\"object\",\"MetricMathAnomalyDetector.MetricDataQueries[].MetricStat.Metric\":\"object\",\"MetricMathAnomalyDetector.MetricDataQueries[].MetricStat.Metric.Dimensions\":\"array\",\"MetricMathAnomalyDetector.MetricDataQueries[].MetricStat.Metric.Dimensions[]\":\"object\",\"SingleMetricAnomalyDetector\":\"object\",\"SingleMetricAnomalyDetector.Dimensions\":\"array\",\"SingleMetricAnomalyDetector.Dimensions[]\":\"object\"}"],
29858
29882
  ["AWS::CodeCommit::Repository", "{\"Code\":\"object\",\"Code.S3\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\",\"Triggers\":\"array\",\"Triggers[]\":\"object\",\"Triggers[].Branches\":\"array\",\"Triggers[].Events\":\"array\"}"],
29859
29883
  ["AWS::Cognito::UserPool", "{\"AccountRecoverySetting\":\"object\",\"AccountRecoverySetting.RecoveryMechanisms\":\"array\",\"AccountRecoverySetting.RecoveryMechanisms[]\":\"object\",\"AdminCreateUserConfig\":\"object\",\"AdminCreateUserConfig.InviteMessageTemplate\":\"object\",\"AliasAttributes\":\"array\",\"AutoVerifiedAttributes\":\"array\",\"DeviceConfiguration\":\"object\",\"EmailConfiguration\":\"object\",\"EnabledMfas\":\"array\",\"IssuerConfiguration\":\"object\",\"KeyConfiguration\":\"object\",\"LambdaConfig\":\"object\",\"LambdaConfig.CustomEmailSender\":\"object\",\"LambdaConfig.CustomSMSSender\":\"object\",\"LambdaConfig.InboundFederation\":\"object\",\"LambdaConfig.PreTokenGenerationConfig\":\"object\",\"Policies\":\"object\",\"Policies.PasswordPolicy\":\"object\",\"Policies.SignInPolicy\":\"object\",\"Policies.SignInPolicy.AllowedFirstAuthFactors\":\"array\",\"Schema\":\"array\",\"Schema[]\":\"object\",\"Schema[].NumberAttributeConstraints\":\"object\",\"Schema[].StringAttributeConstraints\":\"object\",\"SmsConfiguration\":\"object\",\"SmsConfiguration.EumsSms\":\"object\",\"UserAttributeUpdateSettings\":\"object\",\"UserAttributeUpdateSettings.AttributesRequireVerificationBeforeUpdate\":\"array\",\"UserPoolAddOns\":\"object\",\"UserPoolAddOns.AdvancedSecurityAdditionalFlows\":\"object\",\"UserPoolTags\":\"object\",\"UsernameAttributes\":\"array\",\"UsernameConfiguration\":\"object\",\"VerificationMessageTemplate\":\"object\"}"],
29860
29884
  ["AWS::DLM::LifecyclePolicy", "{\"CrossRegionCopyTargets\":\"array\",\"CrossRegionCopyTargets[]\":\"object\",\"Exclusions\":\"object\",\"Exclusions.ExcludeTags\":\"array\",\"Exclusions.ExcludeTags[]\":\"object\",\"Exclusions.ExcludeVolumeTypes\":\"array\",\"PolicyDetails\":\"object\",\"PolicyDetails.Actions\":\"array\",\"PolicyDetails.Actions[]\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy\":\"array\",\"PolicyDetails.Actions[].CrossRegionCopy[]\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy[].EncryptionConfiguration\":\"object\",\"PolicyDetails.Actions[].CrossRegionCopy[].RetainRule\":\"object\",\"PolicyDetails.CrossRegionCopyTargets\":\"array\",\"PolicyDetails.CrossRegionCopyTargets[]\":\"object\",\"PolicyDetails.EventSource\":\"object\",\"PolicyDetails.EventSource.Parameters\":\"object\",\"PolicyDetails.EventSource.Parameters.SnapshotOwner\":\"array\",\"PolicyDetails.Exclusions\":\"object\",\"PolicyDetails.Exclusions.ExcludeTags\":\"array\",\"PolicyDetails.Exclusions.ExcludeTags[]\":\"object\",\"PolicyDetails.Exclusions.ExcludeVolumeTypes\":\"array\",\"PolicyDetails.Parameters\":\"object\",\"PolicyDetails.Parameters.ExcludeDataVolumeTags\":\"array\",\"PolicyDetails.Parameters.ExcludeDataVolumeTags[]\":\"object\",\"PolicyDetails.ResourceLocations\":\"array\",\"PolicyDetails.ResourceTypes\":\"array\",\"PolicyDetails.Schedules\":\"array\",\"PolicyDetails.Schedules[]\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule.RetainRule\":\"object\",\"PolicyDetails.Schedules[].ArchiveRule.RetainRule.RetentionArchiveTier\":\"object\",\"PolicyDetails.Schedules[].CreateRule\":\"object\",\"PolicyDetails.Schedules[].CreateRule.Scripts\":\"array\",\"PolicyDetails.Schedules[].CreateRule.Scripts[]\":\"object\",\"PolicyDetails.Schedules[].CreateRule.Scripts[].Stages\":\"array\",\"PolicyDetails.Schedules[].CreateRule.Times\":\"array\",\"PolicyDetails.Schedules[].CrossRegionCopyRules\":\"array\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[]\":\"object\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[].DeprecateRule\":\"object\",\"PolicyDetails.Schedules[].CrossRegionCopyRules[].RetainRule\":\"object\",\"PolicyDetails.Schedules[].DeprecateRule\":\"object\",\"PolicyDetails.Schedules[].FastRestoreRule\":\"object\",\"PolicyDetails.Schedules[].FastRestoreRule.AvailabilityZoneIds\":\"array\",\"PolicyDetails.Schedules[].FastRestoreRule.AvailabilityZones\":\"array\",\"PolicyDetails.Schedules[].RetainRule\":\"object\",\"PolicyDetails.Schedules[].ShareRules\":\"array\",\"PolicyDetails.Schedules[].ShareRules[]\":\"object\",\"PolicyDetails.Schedules[].ShareRules[].TargetAccounts\":\"array\",\"PolicyDetails.Schedules[].TagsToAdd\":\"array\",\"PolicyDetails.Schedules[].TagsToAdd[]\":\"object\",\"PolicyDetails.Schedules[].VariableTags\":\"array\",\"PolicyDetails.Schedules[].VariableTags[]\":\"object\",\"PolicyDetails.TargetTags\":\"array\",\"PolicyDetails.TargetTags[]\":\"object\",\"Tags\":\"array\",\"Tags[]\":\"object\"}"],
@@ -30213,7 +30237,9 @@ var ProviderRegistry = class {
30213
30237
  if (this.providers.get(resourceType)?.disableCcApiFallback === true) return "the type's SDK provider opts out of the Cloud Control fallback (disableCcApiFallback)";
30214
30238
  }
30215
30239
  buildUnroutableSilentDropMessage(resourceType, drops, reason) {
30216
- return `${resourceType} uses properties cdkd's SDK Provider does not handle, and this type cannot fall back to Cloud Control API (${reason}):\n${drops.map((d) => ` - ${d.property}: ${d.rationale}`).join("\n")}\nRemove the properties, or force the SDK provider path and accept the drop via --prefer-sdk-route ${drops.map((d) => `${resourceType}:${d.property}`).join(",")} (the provider may still reject the resource if the property is required).`;
30240
+ const details = drops.map((d) => safeMsg` - ${d.property}: ${d.rationale}`).join("\n");
30241
+ const overrideHint = drops.map((d) => safeMsg`${resourceType}:${d.property}`).join(",");
30242
+ return safeMsg`${resourceType} uses properties cdkd's SDK Provider does not handle, and ` + safeMsg`this type cannot fall back to Cloud Control API (${reason}):\n` + `${details}\nRemove the properties, or force the SDK provider path and accept the drop via --prefer-sdk-route ${overrideHint} (the provider may still reject the resource if the property is required).`;
30217
30243
  }
30218
30244
  getProvider(resourceType) {
30219
30245
  return this.getProviderFor({ resourceType }).provider;
@@ -30287,7 +30313,7 @@ var ProviderRegistry = class {
30287
30313
  const autoRouted = [...drops.map(({ property }) => property).filter((property) => !this.allowedUnsupportedProperties.has(`${resourceType}:${property}`)), ...unrecognizedRoute].sort((a, b) => a.localeCompare(b));
30288
30314
  if (autoRouted.length > 0) {
30289
30315
  const unroutable = this.ccRouteUnavailableReason(resourceType);
30290
- if (unroutable !== void 0) throw new Error(`${logicalId}: ${this.buildUnroutableSilentDropMessage(resourceType, drops.filter((d) => autoRouted.includes(d.property)), unroutable)}`);
30316
+ if (unroutable !== void 0) throw new Error(safeMsg`${logicalId}: ` + this.buildUnroutableSilentDropMessage(resourceType, drops.filter((d) => autoRouted.includes(d.property)), unroutable));
30291
30317
  const propList = autoRouted.join(", ");
30292
30318
  const overrideHint = autoRouted.map((p) => `${resourceType}:${p}`).join(",");
30293
30319
  const message = `${logicalId} (${resourceType}): routing via Cloud Control API (cdkd's SDK Provider does not yet wire ${propList} — CC API will forward the full property map.${unrecognizedRoute.length === 0 ? "" : ` ${unrecognizedRoute.join(", ")} ${unrecognizedRoute.length === 1 ? "is" : "are"} not in cdkd's CFn schema snapshot: Cloud Control applies a property AWS published since, and rejects a misspelled one as CloudFormation does.`} Override via --prefer-sdk-route ${overrideHint}.)`;
@@ -32437,9 +32463,9 @@ function handleOutputResolutionFailure(error, outputKey, outputs, secrets, inher
32437
32463
  const detail = maskSecretsInText(error instanceof Error ? error.message || error.name : String(error), union);
32438
32464
  if (this.options.strictGetAtt) {
32439
32465
  const cause = typeof error === "string" ? maskSecretsInText(error, union) : maskSecretsInError(error, union);
32440
- throw new Error(`Failed to resolve output ${outputKey}: ${detail} (--strict-getatt promotes output resolution failures to deploy errors; drop the flag to skip the output instead)`, cause instanceof Error || typeof cause === "string" ? { cause } : {});
32466
+ throw new Error(safeMsg`Failed to resolve output ${outputKey} ` + `(--strict-getatt promotes output resolution failures to deploy errors; ` + safeMsg`drop the flag to skip the output instead): ${asIsMessage(detail)}`, cause instanceof Error || typeof cause === "string" ? { cause } : {});
32441
32467
  }
32442
- this.logger.warn(`Failed to resolve output ${outputKey}: ${detail}`);
32468
+ this.logger.warn(safeMsg`Failed to resolve output ${outputKey}: ${asIsMessage(detail)}`);
32443
32469
  outputs[outputKey] = void 0;
32444
32470
  }
32445
32471
  async function resolveOutputs(template, resources, stackName, digestSource, parameterValues, conditions) {
@@ -32460,7 +32486,7 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
32460
32486
  const refuseMaskedOutputReads = (outputKey, ownReads) => {
32461
32487
  const added = ownReads.filter((read) => read.kind === "ref-state-key");
32462
32488
  if (added.length === 0) return;
32463
- throw markNonRetryable(/* @__PURE__ */ new Error(`Cannot resolve ${added.map((read) => read.display).join(", ")} for output ${outputKey}: cdkd's recorded state holds only the redaction mask there, so this output would publish a value cdkd cannot confirm (for most such types the resource's raw physical id) instead of the value CloudFormation's Ref returns — a possibly wrong value that a consuming stack's Fn::ImportValue would accept and send to AWS. The output is not published. ${DeployEngine.maskedRecordRemedyFor(added, context.resources)}`));
32489
+ throw markNonRetryable(/* @__PURE__ */ new Error(safeMsg`Cannot resolve ${added.map((read) => read.display).join(", ")} for output ${outputKey}: cdkd's recorded state ` + `holds only the redaction mask there, so this output would publish a value cdkd cannot confirm (for most such types the resource's raw physical id) instead of the value CloudFormation's Ref returns — a possibly wrong value that a consuming stack's Fn::ImportValue would accept and send to AWS. The output is not published. ${DeployEngine.maskedRecordRemedyFor(added, context.resources)}`));
32464
32490
  };
32465
32491
  const outputsPassSecrets = context.recordedSecretValues ?? EMPTY_SECRETS;
32466
32492
  const outputsPassInherited = context.inheritedSecrets ?? EMPTY_SECRETS;
@@ -32470,7 +32496,7 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
32470
32496
  try {
32471
32497
  for (const [outputKey, output] of Object.entries(template.Outputs)) {
32472
32498
  if (isOutputSuppressedByCondition(output, conditions)) {
32473
- this.logger.debug(`Skipping output ${outputKey} — condition ${output.Condition} is false`);
32499
+ this.logger.debug(safeMsg`Skipping output ${outputKey} — condition ${output.Condition} is false`);
32474
32500
  continue;
32475
32501
  }
32476
32502
  const ownReads = [];
@@ -36064,11 +36090,11 @@ async function adoptRollbackOrphans(currentState, effectiveTemplate) {
36064
36090
  for (const notice of plan.notices) this.logger.info(maskSecretsInText(notice, named));
36065
36091
  const adoptedFrom = /* @__PURE__ */ new Map();
36066
36092
  adoptedOrphanRecords.set(this, adoptedFrom);
36067
- if (plan.refusals.length > 0) throw new Error(`Deploy refused — cdkd left ${plan.refusals.length} resource(s) in AWS that it cannot safely re-adopt:\n ${plan.refusals.map((r) => maskSecretsInText(r, named)).join("\n ")}`);
36093
+ if (plan.refusals.length > 0) throw new Error(safeMsg`Deploy refused — cdkd left ${plan.refusals.length} resource(s) in AWS that it cannot ` + "safely re-adopt:" + plan.refusals.map((r) => safeMsg`\n ${maskSecretsInText(r, named)}`).join(""));
36068
36094
  for (const [logicalId, record] of Object.entries(plan.adopted)) {
36069
36095
  adoptedFrom.set(logicalId, records.findLast((r) => r.logicalId === logicalId)?.state);
36070
36096
  currentState.resources[logicalId] = record;
36071
- this.logger.info(`Adopting ${displayIdent(logicalId)} (${displayIdent(record.resourceType)}) left in AWS by an earlier rollback as ${displaySafe(maskSecretsInText(record.physicalId, named))}`);
36097
+ this.logger.info(safeMsg`Adopting ${displayIdent(logicalId)} (${displayIdent(record.resourceType)}) left in AWS ` + safeMsg`by an earlier rollback as ${displaySafe(maskSecretsInText(record.physicalId, named))}`);
36072
36098
  }
36073
36099
  if (records.length > 0) currentState.orphans = plan.remaining;
36074
36100
  return plan;
@@ -36245,7 +36271,7 @@ async function deleteRollbackJournalBestEffort(stackName, supersededLogicalIds =
36245
36271
  try {
36246
36272
  deleted = await this.stateBackend.deleteRollbackJournal(stackName, this.stackRegion);
36247
36273
  } catch (err) {
36248
- this.logger.debug(safeMsg`Failed to delete rollback journal for ${stackName}: ${err instanceof Error ? err.message : String(err)}`);
36274
+ this.logger.debug(safeMsg`Failed to delete rollback journal for ${displayStackName(stackName)}: ${err instanceof Error ? err.message : String(err)}`);
36249
36275
  deleted = false;
36250
36276
  }
36251
36277
  if (deleted !== false) return true;
@@ -36253,7 +36279,7 @@ async function deleteRollbackJournalBestEffort(stackName, supersededLogicalIds =
36253
36279
  try {
36254
36280
  await this.stateBackend.markRollbackJournalSuperseded(stackName, this.stackRegion, supersededLogicalIds);
36255
36281
  } catch (markErr) {
36256
- this.logger.debug(safeMsg`Failed to record superseded logical ids on the rollback journal for ${stackName}: ${markErr instanceof Error ? markErr.message : String(markErr)}`);
36282
+ this.logger.debug(safeMsg`Failed to record superseded logical ids on the rollback journal for ${displayStackName(stackName)}: ${markErr instanceof Error ? markErr.message : String(markErr)}`);
36257
36283
  }
36258
36284
  return false;
36259
36285
  }
@@ -36262,7 +36288,7 @@ async function settleJournalAfterCleanRollback(stackName, failedOperations, init
36262
36288
  try {
36263
36289
  await this.stateBackend.popRollbackJournalSegment(stackName, this.stackRegion);
36264
36290
  } catch (err) {
36265
- this.logger.debug(`Failed to pop the rollback journal segment after the clean rollback: ${err instanceof Error ? err.message : String(err)}`);
36291
+ this.logger.debug(safeMsg`Failed to pop the rollback journal segment after the clean rollback: ${asIsMessage(err instanceof Error ? err.message : String(err))}`);
36266
36292
  return false;
36267
36293
  }
36268
36294
  return true;
@@ -36274,7 +36300,7 @@ async function settleJournalAfterCleanRollback(stackName, failedOperations, init
36274
36300
  return false;
36275
36301
  }
36276
36302
  if (!await this.writeRollbackJournalSegment(stackName, [], failedOperations, "auto-rollback-clean", initialDeploy)) return true;
36277
- this.logger.info(`The automatic rollback restored the pre-deploy state. The failed resource's pre-failure record was kept — if it was left partially applied, revert it.\nRevert it with: ${pasteableCommand("cdkd rollback", [{
36303
+ this.logger.info("The automatic rollback restored the pre-deploy state. The failed resource's pre-failure record was kept — if it was left partially applied, revert it." + safeMsg`\nRevert it with: ${pasteableCommand("cdkd rollback", [{
36278
36304
  value: stackName,
36279
36305
  hole: "stack"
36280
36306
  }, { literal: "--revert-failed" }]).command}`);
@@ -36342,10 +36368,10 @@ async function writeRollbackJournalSegment(stackName, completedOperations, faile
36342
36368
  ...nestedPending?.previousCrossStackReads && { previousCrossStackReads: nestedPending.previousCrossStackReads }
36343
36369
  };
36344
36370
  await this.stateBackend.appendRollbackJournalSegment(stackName, this.stackRegion, segment);
36345
- this.logger.debug(`Rollback journal segment written (${reason})`);
36371
+ this.logger.debug(safeMsg`Rollback journal segment written (${reason})`);
36346
36372
  return true;
36347
36373
  } catch (journalError) {
36348
- this.logger.warn(`Failed to write rollback journal: ${journalError instanceof Error ? journalError.message : String(journalError)}. 'cdkd rollback' will NOT be able to revert this deploy — use 'cdkd deploy' to resume or 'cdkd destroy' to clean up.`);
36374
+ this.logger.warn(safeMsg`Failed to write rollback journal: ${asIsMessage(journalError instanceof Error ? journalError.message : String(journalError))}. ` + `'cdkd rollback' will NOT be able to revert this deploy — use 'cdkd deploy' to resume or 'cdkd destroy' to clean up.`);
36349
36375
  return false;
36350
36376
  }
36351
36377
  }
@@ -36660,7 +36686,7 @@ function kickOffObservedCapture(provider, logicalId, physicalId, resourceType, r
36660
36686
  this.printingSecretsFor(logicalId),
36661
36687
  this.fingerprintNoEchoValues
36662
36688
  ]);
36663
- this.logger.debug(mask(`observedProperties capture for ${logicalId} (${resourceType}) failed: ${err instanceof Error ? err.message : String(err)} — drift will fall back to template properties for this resource until the next successful deploy.`));
36689
+ this.logger.debug(safeMsg`observedProperties capture for ${mask(logicalId)} (${mask(resourceType)}) failed: ${asIsMessage(mask(err instanceof Error ? err.message : String(err)))} — drift will fall back to template properties for this resource until the next successful deploy.`);
36664
36690
  });
36665
36691
  const promise = secrets === void 0 ? read() : withCurrentResourceSecrets(secrets, read);
36666
36692
  this.observedCaptureTasks.set(logicalId, promise);
@@ -36754,8 +36780,8 @@ function stampReasonlessParameterRefusals(stateResources, template) {
36754
36780
  };
36755
36781
  stamped++;
36756
36782
  }
36757
- if (namesParameter?.failedClosed !== void 0) this.logger.debug(`The template's parameter dependence could not be judged (${namesParameter.failedClosed}): every observed-baseline refusal recorded without a reason is treated as an unverifiable-parameter refusal (${stamped} stamped).`);
36758
- if (stamped > 0) this.logger.debug(`${stamped} resource(s) carry an observed-baseline refusal recorded without a reason by an older cdkd, and their template definition reads a template parameter: treated as an unverifiable-parameter refusal (kept until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter).`);
36783
+ if (namesParameter?.failedClosed !== void 0) this.logger.debug(safeMsg`The template's parameter dependence could not be judged (${namesParameter.failedClosed}): every observed-baseline refusal recorded without a reason is treated as an unverifiable-parameter refusal (${stamped} stamped).`);
36784
+ if (stamped > 0) this.logger.debug(safeMsg`${stamped} resource(s) carry an observed-baseline refusal recorded without a reason by an older cdkd, and their template definition reads a template parameter: treated as an unverifiable-parameter refusal (kept until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter).`);
36759
36785
  }
36760
36786
  function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
36761
36787
  if (this.options.captureObservedState !== true) return;
@@ -36782,7 +36808,7 @@ function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
36782
36808
  resource
36783
36809
  });
36784
36810
  }
36785
- if (refused > 0) this.logger.debug(`observed-properties auto-refresh SKIPPED for ${refused} resource(s) whose baseline a 'cdkd import' run refused: their recorded properties cannot position the redaction, so capturing an AWS readback against them could persist a resolved secret in plaintext. A deploy that actually CHANGES one of them restores its baseline, unless the refusal is an unverifiable-parameter one (only a replacement or a proving re-import discharges that); a NO_CHANGE deploy never does.`);
36811
+ if (refused > 0) this.logger.debug(safeMsg`observed-properties auto-refresh SKIPPED for ${refused} resource(s) whose baseline a 'cdkd import' run refused: their recorded properties cannot position the redaction, so capturing an AWS readback against them could persist a resolved secret in plaintext. A deploy that actually CHANGES one of them restores its baseline, unless the refusal is an unverifiable-parameter one (only a replacement or a proving re-import discharges that); a NO_CHANGE deploy never does.`);
36786
36812
  if (candidates.length === 0 && masked.length === 0) return;
36787
36813
  const allSiblings = {};
36788
36814
  for (const [lid, res] of Object.entries(stateResources)) allSiblings[lid] = {
@@ -36810,7 +36836,7 @@ function kickOffAutoRefreshObservedProperties(stateResources, crossStackReads) {
36810
36836
  } : void 0);
36811
36837
  toRefresh++;
36812
36838
  }
36813
- if (toRefresh > 0) this.logger.warn(`cdkd state schema upgrade detected — refreshing observed-properties baseline for ${toRefresh} resource(s) (one-time, runs in parallel with deploy)`);
36839
+ if (toRefresh > 0) this.logger.warn(safeMsg`cdkd state schema upgrade detected — refreshing observed-properties baseline for ${toRefresh} resource(s) (one-time, runs in parallel with deploy)`);
36814
36840
  let producerRegions = [];
36815
36841
  if (masked.length > 0) try {
36816
36842
  producerRegions = producerRegionsFromState(crossStackReads);
@@ -36974,9 +37000,9 @@ function refuseRedactedAttributeReads(logicalId, resourceType, context) {
36974
37000
  if (reads === void 0 || reads.length === 0) return;
36975
37001
  if (reads.every((read) => read.kind === "attribute" && read.declaredNoEcho === true)) {
36976
37002
  const producers = [...new Set(reads.map((read) => read.logicalId).filter((id) => !!id))];
36977
- throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: ${producers.map((id) => displayIdent(id)).join(", ")} declared ${reads.length === 1 ? "that attribute" : "those attributes"} NoEcho, so cdkd's recorded state holds only the redaction mask for ${reads.length === 1 ? "it" : "them"}, and cdkd does not re-run a producer to recover a value. Remedy: deploy a change to the producer in the SAME run as ${logicalId} (for a custom resource, change one of its properties, e.g. a nonce / version property, so its handler runs again and supplies the value), or stop declaring the value NoEcho.`, resourceType, logicalId);
37003
+ throw new ProvisioningError(safeMsg`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: ` + safeMsg`${producers.map((id) => displayIdent(id)).join(", ")} declared ${reads.length === 1 ? "that attribute" : "those attributes"} NoEcho, ` + safeMsg`so cdkd's recorded state holds only the redaction mask for ${reads.length === 1 ? "it" : "them"}, ` + `and cdkd does not re-run a producer to recover a value. Remedy: deploy a change to the ` + safeMsg`producer in the SAME run as ${logicalId} (for a custom resource, change one of its ` + "properties, e.g. a nonce / version property, so its handler runs again and supplies the value), or stop declaring the value NoEcho.", resourceType, logicalId);
36978
37004
  }
36979
- throw new ProvisioningError(`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: cdkd's recorded state holds only the redaction mask there, and the value is not recoverable from state. There are three ways a record comes to hold the mask. (1) A custom resource handler declared its response NoEcho: true — the value is generated by the handler, so cdkd has nothing to re-derive it from and must not write the literal mask to AWS. Remedies: force that custom resource to update (change one of its properties, e.g. a nonce / version property) so its handler runs again and supplies the value in this same run; or stop setting NoEcho on that response. If the value comes from ANOTHER stack, the producer and this stack must deploy in ONE run (cdkd deploy --all, or cdkd deploy '**' when either is inside a CDK Stage) with the producer's custom resource actually running — re-deploying the producer by itself does not help, because it re-masks the value on the way into its own state. (2) The value holds the Fn::Base64 encoding of a secret value (a {{resolve:...}} dynamic reference under Fn::Base64, such as EC2 UserData), which cdkd never records — so a deploy that leaves the resource or output holding it unchanged reads the mask again, and a re-import does not recover it. Remedy: have this resource build the value itself from the SECRET's own reference (the {{resolve:secretsmanager:...}} or {{resolve:ssm-secure:...}} reference, or a {{resolve:ssm:...}} of a SecureString parameter, that the encoding was made from) under its own Fn::Base64, instead of reading it from another resource's attribute or another stack's output — not by a {{resolve:ssm:...}} read of a String parameter holding the encoding, which cdkd treats as public and would record in state in the clear. (3) The resource is recorded through the Cloud Control fallback (by a deploy or by 'cdkd import'), which keeps in the clear only the Fn::GetAtt attributes it can vouch for and masks the rest. If the name above is not an Fn::GetAtt attribute CloudFormation accepts for that resource type, no record will ever hold it: stop reading it. If it is one, 'cdkd import' masked it because it could not vouch for the value, or could not read the schema and warned about it when it happened (if that warning named a missing cloudformation:DescribeType permission, grant it first); a deploy that creates or updates the resource records it, unless its value came from a secret. See https://github.com/go-to-k/cdkd/issues/2449. ${DeployEngine.maskedRecordRemedyFor(reads, context.resources, true)}`, resourceType, logicalId);
37005
+ throw new ProvisioningError(safeMsg`Cannot resolve ${reads.map((read) => read.display).join(", ")} for ${logicalId}: cdkd's recorded state holds only the ` + `redaction mask there, and the value is not recoverable from state. There are three ways a record comes to hold the mask. (1) A custom resource handler declared its response NoEcho: true — the value is generated by the handler, so cdkd has nothing to re-derive it from and must not write the literal mask to AWS. Remedies: force that custom resource to update (change one of its properties, e.g. a nonce / version property) so its handler runs again and supplies the value in this same run; or stop setting NoEcho on that response. If the value comes from ANOTHER stack, the producer and this stack must deploy in ONE run (cdkd deploy --all, or cdkd deploy '**' when either is inside a CDK Stage) with the producer's custom resource actually running — re-deploying the producer by itself does not help, because it re-masks the value on the way into its own state. (2) The value holds the Fn::Base64 encoding of a secret value (a {{resolve:...}} dynamic reference under Fn::Base64, such as EC2 UserData), which cdkd never records — so a deploy that leaves the resource or output holding it unchanged reads the mask again, and a re-import does not recover it. Remedy: have this resource build the value itself from the SECRET's own reference (the {{resolve:secretsmanager:...}} or {{resolve:ssm-secure:...}} reference, or a {{resolve:ssm:...}} of a SecureString parameter, that the encoding was made from) under its own Fn::Base64, instead of reading it from another resource's attribute or another stack's output — not by a {{resolve:ssm:...}} read of a String parameter holding the encoding, which cdkd treats as public and would record in state in the clear. (3) The resource is recorded through the Cloud Control fallback (by a deploy or by 'cdkd import'), which keeps in the clear only the Fn::GetAtt attributes it can vouch for and masks the rest. If the name above is not an Fn::GetAtt attribute CloudFormation accepts for that resource type, no record will ever hold it: stop reading it. If it is one, 'cdkd import' masked it because it could not vouch for the value, or could not read the schema and warned about it when it happened (if that warning named a missing cloudformation:DescribeType permission, grant it first); a deploy that creates or updates the resource records it, unless its value came from a secret. See https://github.com/go-to-k/cdkd/issues/2449. ${DeployEngine.maskedRecordRemedyFor(reads, context.resources, true)}`, resourceType, logicalId);
36980
37006
  }
36981
37007
  function allRecordedSecrets() {
36982
37008
  const all = /* @__PURE__ */ new Map();
@@ -37168,7 +37194,8 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
37168
37194
  maskSecrets: createUnionSecretMasker([secrets, this.secretNameBagFor(logicalId)])
37169
37195
  }));
37170
37196
  } catch (deleteError) {
37171
- throw new Error(maskSecretsInText(`Failed to delete old resource ${logicalId} (${currentResource.physicalId}) during the --replace delete-first fallback: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`, secrets), { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, secrets) : void 0 });
37197
+ const shownSecrets = unionOfSecretBags([secrets, this.printingSecretsFor(logicalId)]);
37198
+ throw new Error(safeMsg`Failed to delete old resource ${maskSecretsInText(logicalId, shownSecrets)} ` + safeMsg`(${maskSecretsInText(currentResource.physicalId, shownSecrets)}) ` + `during the --replace delete-first fallback: ` + safeMsg`${asIsMessage(maskSecretsInText(deleteError instanceof Error ? deleteError.message : String(deleteError), shownSecrets))}`, { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, secrets) : void 0 });
37172
37199
  }
37173
37200
  reportDeleteGuards(deleteResult, {
37174
37201
  physicalId: currentResource.physicalId,
@@ -37177,9 +37204,9 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
37177
37204
  });
37178
37205
  const replaceSkipReason = deleteSkipReason(deleteResult);
37179
37206
  if (replaceSkipReason !== void 0) throw new Error(deleteSkippedMessage(logicalId, currentResource.physicalId, replaceSkipReason, "during the --replace delete-first fallback"));
37180
- this.logger.info(` ${green("✓")} Old resource deleted`);
37207
+ this.logger.info(safeMsg` ${green("✓")} Old resource deleted`);
37181
37208
  this.oldDeletedBeforeCreate.add(logicalId);
37182
- this.logger.info(` Re-creating ${logicalId}...`);
37209
+ this.logger.info(safeMsg` Re-creating ${logicalId}...`);
37183
37210
  try {
37184
37211
  return await withRetry(() => this.withRetry(() => withCurrentResourceSecrets(secrets, () => replaceProvider.create(logicalId, resourceType, replaceProps, createContext)), logicalId, void 0, void 0, replaceProvider), logicalId, {
37185
37212
  maxRetries: 8,
@@ -37191,7 +37218,8 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
37191
37218
  isRetryable: isRecreateRetryableError
37192
37219
  });
37193
37220
  } catch (recreateError) {
37194
- throw new Error(maskSecretsInText(`Failed to re-create ${logicalId} after the --replace delete-first fallback already deleted the old resource (${currentResource.physicalId}): ${recreateError instanceof Error ? recreateError.message : String(recreateError)}. Re-run the deploy to create it fresh.`, secrets), { cause: recreateError instanceof Error ? maskSecretsInError(recreateError, secrets) : void 0 });
37221
+ const shownSecrets = unionOfSecretBags([secrets, this.printingSecretsFor(logicalId)]);
37222
+ throw new Error(safeMsg`Failed to re-create ${maskSecretsInText(logicalId, shownSecrets)} after the ` + safeMsg`--replace delete-first fallback already deleted the old resource (${maskSecretsInText(currentResource.physicalId, shownSecrets)}). ` + safeMsg`Re-run the deploy to create it fresh. Cause: ${asIsMessage(maskSecretsInText(recreateError instanceof Error ? recreateError.message : String(recreateError), shownSecrets))}`, { cause: recreateError instanceof Error ? maskSecretsInError(recreateError, secrets) : void 0 });
37195
37223
  }
37196
37224
  }
37197
37225
  function typeChangeNameQuestion(resourceType, input) {
@@ -37283,7 +37311,7 @@ async function createFirstThenDeleteOld(input) {
37283
37311
  await this.deleteReplacedAfterCreate(logicalId, input.oldResourceType, currentResource, input.deleteProvider, input.deleteProperties, finalSnapshotIdentifier, input.deletePolicy, secrets, input.deleteProvisionedBy, input.noEchoDeleteValues);
37284
37312
  return createResult;
37285
37313
  }
37286
- async function deleteReplacedAfterCreate(logicalId, oldResourceType, currentResource, deleteProvider, deleteProperties, finalSnapshotIdentifier, updateReplacePolicy, secrets, deleteProvisionedBy, noEchoDeleteValues) {
37314
+ async function deleteReplacedAfterCreate(logicalId, oldResourceType, currentResource, deleteProvider, deleteProperties, finalSnapshotIdentifier, updateReplacePolicy, secrets, deleteProvisionedBy, noEchoDeleteValues, isRetry = false) {
37287
37315
  let deleteResult = void 0;
37288
37316
  let deleteFailed = false;
37289
37317
  const inlinePolicyClaimed = isStandaloneInlinePolicyType(oldResourceType) ? this.inlinePolicyClaimedFor(oldResourceType, logicalId, this.deployStateResources) : void 0;
@@ -37302,6 +37330,18 @@ async function deleteReplacedAfterCreate(logicalId, oldResourceType, currentReso
37302
37330
  } catch (deleteError) {
37303
37331
  const deleteMsg = maskSecretsInText(deleteError instanceof Error ? deleteError.message : String(deleteError), secrets);
37304
37332
  deleteFailed = true;
37333
+ const deferred = this.deferredReplacedDeletes;
37334
+ if (!isRetry && deferred !== void 0) {
37335
+ this.logger.info(safeMsg` Could not delete old ${logicalId} (${currentResource.physicalId}) yet: ${deleteMsg}. Retrying after the rest of the deploy.`);
37336
+ deferred.set(logicalId, {
37337
+ physicalId: currentResource.physicalId,
37338
+ resourceType: oldResourceType,
37339
+ provisionedBy: deleteProvisionedBy,
37340
+ failureMessage: deleteMsg,
37341
+ retry: () => this.deleteReplacedAfterCreate(logicalId, oldResourceType, currentResource, deleteProvider, deleteProperties, finalSnapshotIdentifier, updateReplacePolicy, secrets, deleteProvisionedBy, noEchoDeleteValues, true)
37342
+ });
37343
+ return;
37344
+ }
37305
37345
  this.logger.warn(safeMsg` ⚠ Failed to delete old resource ${logicalId} (${currentResource.physicalId}): ${deleteMsg}`);
37306
37346
  }
37307
37347
  reportDeleteGuards(deleteResult, {
@@ -37312,8 +37352,67 @@ async function deleteReplacedAfterCreate(logicalId, oldResourceType, currentReso
37312
37352
  const skipReason = deleteSkipReason(deleteResult);
37313
37353
  if (skipReason !== void 0) {
37314
37354
  this.replacedDeleteSkips.set(logicalId, `the replaced ${oldResourceType} (${currentResource.physicalId}) was not deleted (${skipReason}) and is no longer tracked by cdkd`);
37315
- this.logger.warn(` ⚠ ${deleteSkippedMessage(logicalId, currentResource.physicalId, skipReason, "while cleaning up the replaced resource", { commandFreeLine: true })}. Delete it manually — it is no longer tracked in state.`);
37316
- } else if (!deleteFailed) this.logger.info(` ${green("✓")} Old resource deleted`);
37355
+ this.logger.warn(safeMsg` ⚠ ${deleteSkippedMessage(logicalId, currentResource.physicalId, skipReason, "while cleaning up the replaced resource", { commandFreeLine: true })}. Delete it manually — it is no longer tracked in state.`);
37356
+ } else if (!deleteFailed) this.logger.info(isRetry ? safeMsg` ${green("✓")} Old ${logicalId} (${currentResource.physicalId}) deleted` : safeMsg` ${green("✓")} Old resource deleted`);
37357
+ }
37358
+ async function retryDeferredReplacedDeletes(stackName, counts) {
37359
+ const deferred = this.deferredReplacedDeletes;
37360
+ this.deferredReplacedDeletes = void 0;
37361
+ if (deferred === void 0 || deferred.size === 0) return;
37362
+ this.logger.info(safeMsg`Retrying the delete of ${deferred.size} replaced resource(s)`);
37363
+ const retryOne = async (logicalId, entry) => {
37364
+ const guards = [];
37365
+ try {
37366
+ await withPrintingSecrets(this.secretNameBagFor(logicalId), () => withStackRecords(this.stackRecordsView, () => collectDeleteGuards(guards, async () => {
37367
+ this.logger.info(safeMsg` Deleting old ${logicalId} (${entry.physicalId})...`);
37368
+ try {
37369
+ await entry.retry();
37370
+ } catch {
37371
+ this.logger.warn(safeMsg` ⚠ Failed to delete old resource ${logicalId} (${entry.physicalId}): the retry failed unexpectedly`);
37372
+ }
37373
+ })));
37374
+ } finally {
37375
+ for (const guard of guards) this.recordEvent({
37376
+ eventType: "RESOURCE_GUARD_INDETERMINATE",
37377
+ stackName,
37378
+ operation: "DELETE",
37379
+ logicalId,
37380
+ resourceType: guard.resourceType,
37381
+ ...guard.provisionedBy && { provisionedBy: guard.provisionedBy },
37382
+ ...guard.physicalId && { physicalId: maskSecretsInText(guard.physicalId, this.perResourceSecrets.get(logicalId) ?? EMPTY_SECRETS) },
37383
+ guard: guard.guard,
37384
+ reason: guard.reason
37385
+ });
37386
+ }
37387
+ const skip = this.replacedDeleteSkips.get(logicalId);
37388
+ if (skip === void 0) return;
37389
+ this.replacedDeleteSkips.delete(logicalId);
37390
+ if (entry.rowPartial !== true) {
37391
+ counts.updated = Math.max(0, counts.updated - 1);
37392
+ counts.updatePartial++;
37393
+ }
37394
+ this.recordEvent({
37395
+ eventType: "RESOURCE_SKIPPED",
37396
+ stackName,
37397
+ operation: "UPDATE",
37398
+ logicalId,
37399
+ resourceType: entry.resourceType,
37400
+ ...entry.provisionedBy && { provisionedBy: entry.provisionedBy },
37401
+ physicalId: entry.physicalId,
37402
+ reason: skip
37403
+ });
37404
+ };
37405
+ const queue = [...deferred];
37406
+ const workers = Math.max(1, Math.min(this.options.concurrency ?? 1, queue.length));
37407
+ await Promise.all(Array.from({ length: workers }, async () => {
37408
+ for (let next = queue.shift(); next !== void 0; next = queue.shift()) await retryOne(...next);
37409
+ }));
37410
+ }
37411
+ function warnUnretriedReplacedDeletes(why) {
37412
+ const deferred = this.deferredReplacedDeletes;
37413
+ this.deferredReplacedDeletes = void 0;
37414
+ const note = why === "failed" ? "not retried: the deploy failed first" : "not retried: the deploy was interrupted";
37415
+ for (const [logicalId, entry] of deferred ?? []) withPrintingSecrets(this.secretNameBagFor(logicalId), () => this.logger.warn(safeMsg` ⚠ Failed to delete old resource ${logicalId} (${entry.physicalId}): ${entry.failureMessage} (${note})`));
37317
37416
  }
37318
37417
 
37319
37418
  //#endregion
@@ -37417,7 +37516,7 @@ async function readStaleAttributes(logicalId, resource, stackName) {
37417
37516
  resourceType: resource.resourceType,
37418
37517
  attributes
37419
37518
  });
37420
- this.logger.debug(`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS — its state record lacked one a Fn::GetAtt asked for: ${Object.keys(attributes).length} attribute(s) read`);
37519
+ this.logger.debug(safeMsg`Re-read the attributes of ${displaySafe(logicalId)} (${displaySafe(resource.resourceType)}) from AWS — its state record lacked one a Fn::GetAtt asked for: ${Object.keys(attributes).length} attribute(s) read`);
37421
37520
  return outcome;
37422
37521
  }
37423
37522
  function withHealedAttributes(logicalId, record) {
@@ -37444,8 +37543,8 @@ function auditResolvedAssetReferences(logicalId, resourceType, resolvedProps) {
37444
37543
  if (!redirect) return;
37445
37544
  const findings = findUnrewrittenAssetReferences(resolvedProps, redirect);
37446
37545
  if (findings.length === 0) return;
37447
- const detail = findings.map((f) => ` - ${f.path}: still references '${f.source}'`).join("\n");
37448
- throw new ProvisioningError(`Unrewritten asset reference on '${logicalId}' (${resourceType}): this region uses cdkd-owned asset storage, but the following resolved properties still point at the CDK bootstrap storage that 'cdk gc' may garbage-collect:\n${detail}\nThis is a template shape cdkd's asset-reference rewrite did not cover — deploying it would split-brain the stack (assets in cdkd storage, properties reading the CDK bucket). Please report this at https://github.com/go-to-k/cdkd/issues with the property shape. Workaround: deploy with --use-cdk-bootstrap-assets to pin the legacy destinations for this app.`, resourceType, logicalId);
37546
+ const detail = findings.map((f) => safeMsg` - ${f.path}: still references '${f.source}'`).join("\n");
37547
+ throw new ProvisioningError(safeMsg`Unrewritten asset reference on '${logicalId}' (${resourceType}): this region uses ` + `cdkd-owned asset storage, but the following resolved properties still point at the CDK bootstrap storage that 'cdk gc' may garbage-collect:\n${detail}\nThis is a template shape cdkd's asset-reference rewrite did not cover — deploying it would split-brain the stack (assets in cdkd storage, properties reading the CDK bucket). Please report this at https://github.com/go-to-k/cdkd/issues with the property shape. Workaround: deploy with --use-cdk-bootstrap-assets to pin the legacy destinations for this app.`, resourceType, logicalId);
37449
37548
  }
37450
37549
  function extractAllDependencies(template, logicalId) {
37451
37550
  const resource = template?.Resources?.[logicalId];
@@ -37735,7 +37834,7 @@ async function provisionCreate(logicalId, change, stateResources, stackName, tem
37735
37834
  if (progress) progress.current++;
37736
37835
  const createPrefix = progress ? `[${progress.current}/${progress.total}] ` : " ";
37737
37836
  renderer.removeTask(logicalId);
37738
- this.logger.info(`${createPrefix}${formatResourceLine("created", logicalId, resourceType)}`);
37837
+ this.logger.info(safeMsg`${createPrefix}${formatResourceLine("created", logicalId, resourceType)}`);
37739
37838
  }
37740
37839
  async function refuseUnlicensedGeneratedName(input) {
37741
37840
  const { logicalId, resourceType } = input;
@@ -43082,20 +43181,20 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
43082
43181
  if (statefulReason && this.options.forceStatefulRecreation !== true) {
43083
43182
  const immutableProps = change.propertyChanges?.filter((pc) => pc.requiresReplacement).map((pc) => pc.path).join(", ") || "Type";
43084
43183
  const protection = recordedProtectionEvidence(oldResourceType, currentProps, currentResource.observedProperties, this.stackRegion);
43085
- throw markNonRetryable(new CdkdError(`${logicalId} (${oldResourceType}) requires replacement (immutable property changed: ${immutableProps}${typeChanged ? `, to ${resourceType}` : ""}) but it is a stateful resource — ${renderStatefulReason(statefulReason)}. ` + (protection ? `${recordedProtectionNote(protection, "--force-stateful-recreation")} Or change the resource's definition to avoid the immutable-property change.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the immutable-property change."), "STATEFUL_REPLACE_BLOCKED"));
43184
+ throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${oldResourceType}) requires replacement (immutable property changed: ${immutableProps}${typeChanged ? `, to ${resourceType}` : ""}) but it is a stateful resource — ` + safeMsg`${renderStatefulReason(statefulReason)}. ` + (protection ? safeMsg`${recordedProtectionNote(protection, "--force-stateful-recreation")} Or change ` + `the resource's definition to avoid the immutable-property change.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the immutable-property change."), "STATEFUL_REPLACE_BLOCKED"));
43086
43185
  }
43087
43186
  }
43088
43187
  if (recreateViaCcApi) {
43089
43188
  const noCcRoute = this.providerRegistry.ccRouteUnavailableReason(resourceType);
43090
- if (noCcRoute !== void 0) throw markNonRetryable(new CdkdError(`--recreate-via-cc-api cannot recreate ${logicalId} (${resourceType}): Cloud Control API cannot create this type (${noCcRoute}). Nothing was deleted. Drop ${logicalId} from --recreate-via-cc-api.`, "RECREATE_TARGETS_INVALID"));
43189
+ if (noCcRoute !== void 0) throw markNonRetryable(new CdkdError(safeMsg`--recreate-via-cc-api cannot recreate ${logicalId} (${resourceType}): Cloud ` + safeMsg`Control API cannot create this type (${noCcRoute}). Nothing was deleted. ` + safeMsg`Drop ${logicalId} from --recreate-via-cc-api.`, "RECREATE_TARGETS_INVALID"));
43091
43190
  const ccBroken = ccBrokenReason(resourceType);
43092
- if (ccBroken !== void 0) throw markNonRetryable(new CdkdError(`--recreate-via-cc-api cannot move ${logicalId} (${resourceType}) to Cloud Control: ${ccBroken}, so cdkd keeps it on its SDK provider. Nothing was deleted. Drop ${logicalId} from --recreate-via-cc-api.`, "RECREATE_TARGETS_INVALID"));
43191
+ if (ccBroken !== void 0) throw markNonRetryable(new CdkdError(safeMsg`--recreate-via-cc-api cannot move ${logicalId} (${resourceType}) to Cloud ` + safeMsg`Control: ${ccBroken}, so cdkd keeps it on its SDK provider. Nothing was ` + safeMsg`deleted. Drop ${logicalId} from --recreate-via-cc-api.`, "RECREATE_TARGETS_INVALID"));
43093
43192
  }
43094
43193
  let replacementReason;
43095
43194
  if (recreateViaCcApi) replacementReason = "--recreate-via-cc-api flag (mid-life SDK→CC migration)";
43096
43195
  else if (recreateViaSdkProvider) replacementReason = "--recreate-via-sdk-provider flag (mid-life CC→SDK migration)";
43097
43196
  else replacementReason = `immutable properties changed: ${change.propertyChanges?.filter((pc) => pc.requiresReplacement).map((pc) => pc.path).join(", ")}`;
43098
- this.logger.info(`Replacing ${logicalId} (${typeChanged ? `${oldResourceType} -> ${resourceType}` : resourceType}) - ${replacementReason}`);
43197
+ this.logger.info(safeMsg`Replacing ${logicalId} (${typeChanged ? `${oldResourceType} -> ${resourceType}` : resourceType}) - ${replacementReason}`);
43099
43198
  const recreateDirectionHint = recreateViaCcApi ? "cc-api" : recreateViaSdkProvider ? "sdk" : void 0;
43100
43199
  const replaceDecision = this.providerRegistry.getProviderFor({
43101
43200
  resourceType,
@@ -43164,9 +43263,9 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
43164
43263
  if (updateReplacePolicy === "Retain") {
43165
43264
  this.retainedOldOnReplacement.add(logicalId);
43166
43265
  await noteRetainedResource(oldResourceType, logicalId);
43167
- this.logger.warn(` ⚠ ${logicalId} has UpdateReplacePolicy: Retain — ${recreateFlagName} will leak the old physical resource (${currentResource.physicalId}). The new resource shares the same name where applicable; if the type has user-supplied names (e.g. functionName, bucketName), the create will deterministically collide with the retained orphan.`);
43266
+ this.logger.warn(safeMsg` ⚠ ${logicalId} has UpdateReplacePolicy: Retain — ${recreateFlagName} will ` + safeMsg`leak the old physical resource (${currentResource.physicalId}). The new ` + "resource shares the same name where applicable; if the type has user-supplied names (e.g. functionName, bucketName), the create will deterministically collide with the retained orphan.");
43168
43267
  } else {
43169
- this.logger.info(` Destroying old ${logicalId} (${currentResource.physicalId}) before recreate...`);
43268
+ this.logger.info(safeMsg` Destroying old ${logicalId} (${currentResource.physicalId}) before recreate...`);
43170
43269
  const recreateFinalSnapshotId = await this.prepareFinalSnapshotForDelete(logicalId, oldResourceType, currentResource, updateReplacePolicy);
43171
43270
  let recreateDeleteResult;
43172
43271
  try {
@@ -43181,7 +43280,8 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
43181
43280
  maskSecrets: createUnionSecretMasker([updateSecrets, this.secretNameBagFor(logicalId)])
43182
43281
  }));
43183
43282
  } catch (deleteError) {
43184
- throw new Error(maskSecretsInText(`Failed to destroy old resource ${logicalId} (${currentResource.physicalId}) during ${recreateFlagName}: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`, updateSecrets), { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, updateSecrets) : void 0 });
43283
+ const shownSecrets = unionOfSecretBags([updateSecrets, this.printingSecretsFor(logicalId)]);
43284
+ throw new Error(safeMsg`Failed to destroy old resource ${maskSecretsInText(logicalId, shownSecrets)} ` + safeMsg`(${maskSecretsInText(currentResource.physicalId, shownSecrets)}) during ${recreateFlagName}: ` + safeMsg`${asIsMessage(maskSecretsInText(deleteError instanceof Error ? deleteError.message : String(deleteError), shownSecrets))}`, { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, updateSecrets) : void 0 });
43185
43285
  }
43186
43286
  reportDeleteGuards(recreateDeleteResult, {
43187
43287
  physicalId: currentResource.physicalId,
@@ -43190,10 +43290,10 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
43190
43290
  });
43191
43291
  const recreateSkipReason = deleteSkipReason(recreateDeleteResult);
43192
43292
  if (recreateSkipReason !== void 0) throw new Error(deleteSkippedMessage(logicalId, currentResource.physicalId, recreateSkipReason, `during ${recreateFlagName}`));
43193
- this.logger.info(` ${green("✓")} Old resource deleted`);
43293
+ this.logger.info(safeMsg` ${green("✓")} Old resource deleted`);
43194
43294
  this.oldDeletedBeforeCreate.add(logicalId);
43195
43295
  }
43196
- this.logger.info(` Creating new ${logicalId}...`);
43296
+ this.logger.info(safeMsg` Creating new ${logicalId}...`);
43197
43297
  createResult = await withRetry(() => this.withRetry(() => withCurrentResourceSecrets(updateSecrets, () => replaceProvider.create(logicalId, resourceType, replaceProps, { maskSecrets: createSecretMasker(updateSecrets) })), logicalId, void 0, void 0, replaceProvider), logicalId, {
43198
43298
  maxRetries: 8,
43199
43299
  initialDelayMs: 2e3,
@@ -43203,9 +43303,9 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
43203
43303
  onInterrupted: () => new InterruptedError(this.interruptCause ?? "user"),
43204
43304
  isRetryable: isRecreateRetryableError
43205
43305
  });
43206
- if (equalIdIsSameResource && updateReplacePolicy === "Retain" && createResult.physicalId === currentResource.physicalId) throw new CdkdError(`${logicalId} (${resourceType}) recreate returned the existing resource (${currentResource.physicalId}) instead of creating a new one — its Create API is name-idempotent — and UpdateReplacePolicy: Retain means the old resource was never destroyed, so the new properties were not applied. Rename the resource in your CDK code (or remove the explicit physical name) so the recreate can produce a genuinely new resource.`, "NAMED_REPLACEMENT_IDEMPOTENT_CREATE");
43306
+ if (equalIdIsSameResource && updateReplacePolicy === "Retain" && createResult.physicalId === currentResource.physicalId) throw new CdkdError(safeMsg`${logicalId} (${resourceType}) recreate returned the existing resource ` + safeMsg`(${currentResource.physicalId}) instead of creating a new one — its Create ` + "API is name-idempotent — and UpdateReplacePolicy: Retain means the old resource was never destroyed, so the new properties were not applied. Rename the resource in your CDK code (or remove the explicit physical name) so the recreate can produce a genuinely new resource.", "NAMED_REPLACEMENT_IDEMPOTENT_CREATE");
43207
43307
  } else {
43208
- this.logger.info(` Creating new ${logicalId}...`);
43308
+ this.logger.info(safeMsg` Creating new ${logicalId}...`);
43209
43309
  let deletedOldFirst = lostWithParent !== void 0;
43210
43310
  if (lostWithParent !== void 0) {
43211
43311
  this.oldDeletedBeforeCreate.add(logicalId);
@@ -43225,7 +43325,7 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
43225
43325
  observed: currentResource.observedProperties,
43226
43326
  physicalId: currentResource.physicalId
43227
43327
  });
43228
- if (nameHeldElsewhere !== void 0) throw markNonRetryable(new CdkdError(`${logicalId} (${resourceType}) requires replacement, but the create-first attempt collided: ${createMsg}. ${renderNameHeldElsewhere(nameHeldElsewhere)}` + (this.options.replace === true ? ` — so --replace was NOT applied and nothing was deleted.` : updateReplacePolicy === "Retain" ? " — so removing UpdateReplacePolicy: Retain and re-running with `cdkd deploy --replace` would delete this resource and still collide." : " — so `cdkd deploy --replace` would delete this resource and still collide.") + " Choose a name no other resource holds, or delete the resource holding it if it is yours.", "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
43328
+ if (nameHeldElsewhere !== void 0) throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but the create-first ` + safeMsg`attempt collided: ${createMsg}. ${renderNameHeldElsewhere(nameHeldElsewhere)}` + (this.options.replace === true ? ` — so --replace was NOT applied and nothing was deleted.` : updateReplacePolicy === "Retain" ? " — so removing UpdateReplacePolicy: Retain and re-running with `cdkd deploy --replace` would delete this resource and still collide." : " — so `cdkd deploy --replace` would delete this resource and still collide.") + " Choose a name no other resource holds, or delete the resource holding it if it is yours.", "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
43229
43329
  const holder = replacementOldHoldsSentName({
43230
43330
  createType: resourceType,
43231
43331
  holderType: oldResourceType,
@@ -43243,26 +43343,26 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
43243
43343
  const flagClause = this.options.replace === true ? ` --replace was NOT applied and nothing was deleted.` : updateReplacePolicy === "Retain" ? " Nothing was deleted. UpdateReplacePolicy: Retain keeps the resource being replaced in place; removing it and re-running with `cdkd deploy --replace` would refuse the same way rather than delete it." : " Nothing was deleted, and `cdkd deploy --replace` would refuse the same way rather than delete it.";
43244
43344
  throw markNonRetryable(new CdkdError(maskSecretsInText(`${displaySafe(logicalId)} (${displaySafe(resourceType)}) requires replacement, but the create-first attempt collided: ${holder.diagnosis} — ` + (holder.known ? "so another resource holds the colliding name (an orphan of an earlier attempt, or one made outside this stack), and deleting the resource being replaced would destroy it and collide again." + flagClause + " Remove or rename the resource holding that name if it is yours, then re-run the deploy." : "so if another resource holds it (an orphan of an earlier attempt, or one made outside this stack), deleting the resource being replaced would destroy it and collide again." + flagClause + " Remove or rename whatever holds that name if it is yours — if that is the resource being replaced itself, delete it by hand — then re-run the deploy.") + ` Underlying collision: ${createMsg}`, updateSecrets), "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
43245
43345
  }
43246
- if (updateReplacePolicy === "Retain") throw new CdkdError(`${logicalId} (${resourceType}) requires replacement, but its physical name is still held by the existing resource AND UpdateReplacePolicy: Retain pins that resource in place. ${nameOrigin.descriptor}. ${nameOrigin.remedy} — with Retain, the old resource keeps the name, so a same-name replacement can never proceed.`, "NAMED_REPLACEMENT_COLLISION");
43247
- if (this.options.replace !== true) throw new CdkdError(`${logicalId} (${resourceType}) requires replacement, but the create-first attempt collided with the existing resource: ${createMsg}. ${nameOrigin.descriptor}, so the CloudFormation-style safe replacement order (create the new resource before deleting the old) cannot reuse the occupied name — CloudFormation refuses this shape with "cannot update a stack when a custom-named resource requires replacing". ${nameOrigin.remedy}, or re-run with \`cdkd deploy --replace\` to delete the old resource FIRST and recreate it under the same name (the resource is briefly unavailable while it is recreated).`, "NAMED_REPLACEMENT_COLLISION");
43248
- this.logger.info(` Create-first collided with the existing resource's name and --replace is set — deleting old ${logicalId} (${currentResource.physicalId}) first...`);
43346
+ if (updateReplacePolicy === "Retain") throw new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but its physical name ` + `is still held by the existing resource AND UpdateReplacePolicy: Retain ` + safeMsg`pins that resource in place. ${nameOrigin.descriptor}. ` + safeMsg`${nameOrigin.remedy} — with Retain, the old resource keeps the name, so a ` + `same-name replacement can never proceed.`, "NAMED_REPLACEMENT_COLLISION");
43347
+ if (this.options.replace !== true) throw new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but the create-first ` + safeMsg`attempt collided with the existing resource: ${createMsg}. ` + safeMsg`${nameOrigin.descriptor}, so the CloudFormation-style safe replacement ` + "order (create the new resource before deleting the old) cannot reuse the occupied name — CloudFormation refuses this shape with \"cannot update a stack when a custom-named resource requires replacing\". " + safeMsg`${nameOrigin.remedy}, or re-run with \`cdkd deploy --replace\` to delete ` + "the old resource FIRST and recreate it under the same name (the resource is briefly unavailable while it is recreated).", "NAMED_REPLACEMENT_COLLISION");
43348
+ this.logger.info(` Create-first collided with the existing resource's name and --replace is ` + safeMsg`set — deleting old ${logicalId} (${currentResource.physicalId}) first...`);
43249
43349
  deletedOldFirst = true;
43250
43350
  createResult = await this.replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourceType, currentResource, oldDeleteProvider, replaceProvider, replaceProps, updateSecrets, updateReplacePolicy, oldDeleteRoute.provisionedBy, noEchoDeleteValues);
43251
43351
  }
43252
43352
  if (equalIdIsSameResource && !deletedOldFirst && createResult.physicalId === currentResource.physicalId) {
43253
43353
  const idempotentNameOrigin = this.replacementNameOrigin(logicalId, currentResource.physicalId);
43254
- if (updateReplacePolicy === "Retain") throw new CdkdError(`${logicalId} (${resourceType}) requires replacement, but its Create API is name-idempotent: the create-first attempt returned the existing resource (${currentResource.physicalId}) instead of creating a new one, and UpdateReplacePolicy: Retain pins that resource in place. ${idempotentNameOrigin.descriptor}. ${idempotentNameOrigin.remedy} — with Retain, the old resource keeps the name, so a same-name replacement can never proceed.`, "NAMED_REPLACEMENT_IDEMPOTENT_CREATE");
43255
- if (this.options.replace !== true) throw new CdkdError(`${logicalId} (${resourceType}) requires replacement, but its Create API is name-idempotent: the create-first attempt returned the EXISTING resource (${currentResource.physicalId}) instead of creating a new one, so deleting the "old" resource would silently destroy the resource the deploy just reported as created. ${idempotentNameOrigin.descriptor}; ${idempotentNameOrigin.remedy}, or re-run with \`cdkd deploy --replace\` to delete the old resource FIRST and recreate it under the same name (the resource is briefly unavailable while it is recreated). Note: this branch is also reached when the old resource was deleted out-of-band and the physical id is name-derived — there the create was a genuine fresh create; \`--replace\` converges that case too.`, "NAMED_REPLACEMENT_IDEMPOTENT_CREATE");
43256
- this.logger.info(` Create-first returned the existing resource (name-idempotent Create API) and --replace is set — deleting old ${logicalId} (${currentResource.physicalId}) first...`);
43354
+ if (updateReplacePolicy === "Retain") throw new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but its Create API is ` + `name-idempotent: the create-first attempt returned the existing resource ` + safeMsg`(${currentResource.physicalId}) instead of creating a new one, and ` + `UpdateReplacePolicy: Retain pins that resource in place. ` + safeMsg`${idempotentNameOrigin.descriptor}. ${idempotentNameOrigin.remedy} — with ` + "Retain, the old resource keeps the name, so a same-name replacement can never proceed.", "NAMED_REPLACEMENT_IDEMPOTENT_CREATE");
43355
+ if (this.options.replace !== true) throw new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but its Create API is ` + `name-idempotent: the create-first attempt returned the EXISTING resource ` + safeMsg`(${currentResource.physicalId}) instead of creating a new one, so deleting ` + `the "old" resource would silently destroy the resource the deploy just ` + safeMsg`reported as created. ${idempotentNameOrigin.descriptor}; ` + safeMsg`${idempotentNameOrigin.remedy}, or re-run with ` + "`cdkd deploy --replace` to delete the old resource FIRST and recreate it under the same name (the resource is briefly unavailable while it is recreated). Note: this branch is also reached when the old resource was deleted out-of-band and the physical id is name-derived — there the create was a genuine fresh create; `--replace` converges that case too.", "NAMED_REPLACEMENT_IDEMPOTENT_CREATE");
43356
+ this.logger.info(` Create-first returned the existing resource (name-idempotent Create API) ` + safeMsg`and --replace is set — deleting old ${logicalId} ` + safeMsg`(${currentResource.physicalId}) first...`);
43257
43357
  deletedOldFirst = true;
43258
43358
  createResult = await this.replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourceType, currentResource, oldDeleteProvider, replaceProvider, replaceProps, updateSecrets, updateReplacePolicy, oldDeleteRoute.provisionedBy, noEchoDeleteValues);
43259
43359
  }
43260
43360
  if (deletedOldFirst) {} else if (updateReplacePolicy === "Retain") {
43261
43361
  this.retainedOldOnReplacement.add(logicalId);
43262
43362
  await noteRetainedResource(oldResourceType, logicalId);
43263
- this.logger.info(` Retaining old ${logicalId} (${currentResource.physicalId}) - UpdateReplacePolicy: Retain`);
43363
+ this.logger.info(safeMsg` Retaining old ${logicalId} (${currentResource.physicalId}) - UpdateReplacePolicy: Retain`);
43264
43364
  } else {
43265
- this.logger.info(` Deleting old ${logicalId} (${currentResource.physicalId})...`);
43365
+ this.logger.info(safeMsg` Deleting old ${logicalId} (${currentResource.physicalId})...`);
43266
43366
  let cleanupFinalSnapshotId;
43267
43367
  let snapshotBlockedDelete = false;
43268
43368
  try {
@@ -43270,7 +43370,7 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
43270
43370
  } catch (snapshotError) {
43271
43371
  if (snapshotError instanceof CdkdError && snapshotError.code === "FINAL_SNAPSHOT_UNSUPPORTED") throw snapshotError;
43272
43372
  snapshotBlockedDelete = true;
43273
- this.logger.warn(` ⚠ Final snapshot for old ${logicalId} (${currentResource.physicalId}) failed: ${snapshotError instanceof Error ? snapshotError.message : String(snapshotError)}. The old resource was NOT deleted (UpdateReplacePolicy: Snapshot) — delete it manually once you have a snapshot; it is no longer tracked in state.`);
43373
+ this.logger.warn(safeMsg` ⚠ Final snapshot for old ${logicalId} (${currentResource.physicalId}) ` + safeMsg`failed: ${asIsMessage(snapshotError instanceof Error ? snapshotError.message : String(snapshotError))}. ` + "The old resource was NOT deleted (UpdateReplacePolicy: Snapshot) — delete it manually once you have a snapshot; it is no longer tracked in state.");
43274
43374
  }
43275
43375
  if (!snapshotBlockedDelete) await this.deleteReplacedAfterCreate(logicalId, oldResourceType, currentResource, oldDeleteProvider, currentResource.properties, cleanupFinalSnapshotId, updateReplacePolicy, updateSecrets, oldDeleteRoute.provisionedBy, noEchoDeleteValues);
43276
43376
  }
@@ -43296,18 +43396,34 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
43296
43396
  const replacePrefix = progress ? `[${progress.current}/${progress.total}] ` : " ";
43297
43397
  renderer.removeTask(logicalId);
43298
43398
  const replacedSkip = this.replacedDeleteSkips.get(logicalId);
43299
- const replacedLine = `${replacePrefix}${yellow("↻")} ${bold(logicalId)} ${gray(`(${resourceType})`)} ${yellow("replaced")}`;
43399
+ const replacedLine = safeMsg`${replacePrefix}${yellow("↻")} ${bold(logicalId)} ${gray(`(${resourceType})`)} ${yellow("replaced")}`;
43300
43400
  if (replacedSkip !== void 0) {
43301
- this.logger.warn(replacedLine + " " + updatePartialMessage(replacedSkip));
43401
+ this.logger.warn(safeMsg`${replacedLine} ${updatePartialMessage(replacedSkip)}`);
43302
43402
  return;
43303
43403
  }
43304
43404
  this.logger.info(replacedLine);
43305
43405
  }
43306
43406
 
43407
+ //#endregion
43408
+ //#region src/provisioning/cc-autoroute-update-remedy.ts
43409
+ const TYPE_FORMAT = /^[A-Z][A-Za-z0-9]+(::[A-Z][A-Za-z0-9]+)+$/;
43410
+ const PROPERTY_FORMAT = /^[A-Z][A-Za-z0-9]*$/;
43411
+ const LOGICAL_ID_FORMAT = /^[A-Za-z][A-Za-z0-9]{0,254}$/;
43412
+ function ccAutoRouteUpdateFailureRemedy(logicalId, resourceType, autoRoutedProperties, nestedChild = false) {
43413
+ const id = LOGICAL_ID_FORMAT.test(logicalId) ? logicalId : "<logicalId>";
43414
+ const type = TYPE_FORMAT.test(resourceType) ? resourceType : "<Type>";
43415
+ const props = autoRoutedProperties.map((p) => PROPERTY_FORMAT.test(p) ? p : "<Property>");
43416
+ const shown = props.length > 0 ? props.join(", ") : "a property";
43417
+ const override = props.length > 0 ? props.map((p) => `${type}:${p}`).join(",") : `${type}:<Property>`;
43418
+ const them = props.length === 1 ? "that property" : "those properties";
43419
+ const preferSdk = `keep it on the SDK provider without sending ${them} with --prefer-sdk-route ${override}`;
43420
+ return `\nThis update moved the resource from its SDK provider to Cloud Control API, because the SDK provider does not handle ${shown}. Cloud Control addresses it by the physical id the SDK provider recorded, and for some types that is not an identifier Cloud Control accepts. ` + (nestedChild ? `It is in a nested stack, which --recreate-via-cc-api cannot address: ${preferSdk}, or remove ${them} from the template.` : `Two ways through: re-create the resource on Cloud Control with --recreate-via-cc-api ${id} (destroys and re-creates it), or ${preferSdk}.`);
43421
+ }
43422
+
43307
43423
  //#endregion
43308
43424
  //#region src/deployment/deploy-engine/update-in-place.ts
43309
43425
  async function updateInPlace({ conditions, counts, currentProps, currentPropsAsWritten, currentResource, dependencies, desiredForSkipCheckAsWritten, logicalId, noEchoHeldPaths, parameterValues, progress, renderer, resolvedProps, resourceType, stackName, stateResources, template, updateReplacePolicy, updateSecrets, reattach }) {
43310
- this.logger.debug(`Updating ${logicalId} (${resourceType})`);
43426
+ this.logger.debug(safeMsg`Updating ${logicalId} (${resourceType})`);
43311
43427
  const updateDecision = this.providerRegistry.getProviderFor({
43312
43428
  resourceType,
43313
43429
  properties: resolvedProps,
@@ -43321,12 +43437,12 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43321
43437
  let message;
43322
43438
  switch (exemptMode) {
43323
43439
  case "cc-broken":
43324
- message = `${logicalId} (${resourceType}): moving to the SDK provider — Cloud Control cannot manage this type correctly. ${preserved}, and this routing is not optional.`;
43440
+ message = safeMsg`${logicalId} (${resourceType}): moving to the SDK provider — Cloud ` + `Control cannot manage this type correctly. ${preserved}, and this routing is not optional.`;
43325
43441
  break;
43326
43442
  case "sdk-coverage":
43327
- message = `${logicalId} (${resourceType}): returning to the SDK provider — cdkd now covers every property this resource uses. ${preserved}; pass --pin-cc-api ${logicalId} to decline this for a deploy.`;
43443
+ message = safeMsg`${logicalId} (${resourceType}): returning to the SDK provider — cdkd now ` + `covers every property this resource uses. ${preserved}; pass ` + safeMsg`--pin-cc-api ${logicalId} to decline this for a deploy.`;
43328
43444
  break;
43329
- default: message = `${logicalId} (${resourceType}): moving to the SDK provider. ${preserved}.`;
43445
+ default: message = safeMsg`${logicalId} (${resourceType}): moving to the SDK provider. ${preserved}.`;
43330
43446
  }
43331
43447
  this.logger.info(message);
43332
43448
  }
@@ -43374,7 +43490,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43374
43490
  const statefulReason = retainOldOnReplace ? null : isStatefulRecreateTargetForReplace(resourceType, currentProps, currentResource.observedProperties);
43375
43491
  if (statefulReason && this.options.forceStatefulRecreation !== true) {
43376
43492
  const protection = recordedProtectionEvidence(resourceType, currentProps, currentResource.observedProperties, this.stackRegion);
43377
- throw markNonRetryable(new CdkdError(replaceOptIn ? `--replace would DELETE + CREATE the stateful resource ${logicalId} (${resourceType}) — ${renderStatefulReason(statefulReason)}. ` + (protection ? `${recordedProtectionNote(protection, "--replace --force-stateful-recreation")} Or change the resource's definition to avoid the immutable-property change.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the immutable-property change.") : `${logicalId} (${resourceType}) cannot be updated in place by the provisioning layer it routes through, so applying this change would DELETE + CREATE it — but it is a stateful resource: ${renderStatefulReason(statefulReason)}. ` + (protection ? `${recordedProtectionNote(protection, "--force-stateful-recreation")} Or change the resource's definition to avoid the update.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the update."), "STATEFUL_REPLACE_BLOCKED", updateError instanceof Error ? updateError : void 0));
43493
+ throw markNonRetryable(new CdkdError(replaceOptIn ? safeMsg`--replace would DELETE + CREATE the stateful resource ${logicalId} ` + safeMsg`(${resourceType}) — ${renderStatefulReason(statefulReason)}. ` + (protection ? safeMsg`${recordedProtectionNote(protection, "--replace --force-stateful-recreation")} ` + `Or change the resource's definition to avoid the immutable-property change.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the immutable-property change.") : safeMsg`${logicalId} (${resourceType}) cannot be updated in place by the ` + "provisioning layer it routes through, so applying this change would DELETE + CREATE it — but it is a stateful resource: " + safeMsg`${renderStatefulReason(statefulReason)}. ` + (protection ? safeMsg`${recordedProtectionNote(protection, "--force-stateful-recreation")} ` + `Or change the resource's definition to avoid the update.` : "Re-run with --force-stateful-recreation to confirm the data loss, or change the resource definition to avoid the update."), "STATEFUL_REPLACE_BLOCKED", updateError instanceof Error ? updateError : void 0));
43378
43494
  }
43379
43495
  const replDecision = this.providerRegistry.getProviderFor({
43380
43496
  resourceType,
@@ -43405,7 +43521,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43405
43521
  secrets: updateSecrets,
43406
43522
  inputSources: template && this.maskedInputSources(template, stateResources, this.noEchoConditions, stackName)
43407
43523
  });
43408
- this.logger.info(retainOldOnReplace ? `UPDATE not supported for ${logicalId} (${resourceType}), replacing (CREATE only — UpdateReplacePolicy: Retain keeps the old resource)` : createFirst ? safeMsg`UPDATE not supported for ${logicalId} (${resourceType}), replacing (CREATE → DELETE — the new name differs from the old resource's)` : `UPDATE not supported for ${logicalId} (${resourceType}), replacing (DELETE → CREATE)`);
43524
+ this.logger.info(retainOldOnReplace ? safeMsg`UPDATE not supported for ${logicalId} (${resourceType}), replacing ` + `(CREATE only — UpdateReplacePolicy: Retain keeps the old resource)` : createFirst ? safeMsg`UPDATE not supported for ${logicalId} (${resourceType}), replacing (CREATE → DELETE — the new name differs from the old resource's)` : safeMsg`UPDATE not supported for ${logicalId} (${resourceType}), replacing (DELETE → CREATE)`);
43409
43525
  if (retainOldOnReplace) await noteRetainedResource(resourceType, logicalId);
43410
43526
  if (!retainOldOnReplace && !createFirst) {
43411
43527
  const fallbackUpdateReplacePolicy = template?.Resources?.[logicalId]?.UpdateReplacePolicy ?? currentResource.updateReplacePolicy;
@@ -43424,7 +43540,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43424
43540
  }));
43425
43541
  } catch (deleteError) {
43426
43542
  const deleteMsg = deleteError instanceof Error ? deleteError.message : String(deleteError);
43427
- if (!isWaitAbandonedError(deleteError) && !isInterruptedWaitError(deleteError) && !isMarkedNonRetryable(deleteError) && (deleteMsg.includes("does not exist") || deleteMsg.includes("not found") || deleteMsg.includes("NotFound"))) this.logger.debug(`Old resource ${logicalId} already gone, proceeding with CREATE`);
43543
+ if (!isWaitAbandonedError(deleteError) && !isInterruptedWaitError(deleteError) && !isMarkedNonRetryable(deleteError) && (deleteMsg.includes("does not exist") || deleteMsg.includes("not found") || deleteMsg.includes("NotFound"))) this.logger.debug(safeMsg`Old resource ${logicalId} already gone, proceeding with CREATE`);
43428
43544
  else throw deleteError;
43429
43545
  }
43430
43546
  reportDeleteGuards(fallbackDeleteResult, {
@@ -43464,7 +43580,10 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43464
43580
  }) : await this.withRetry(() => withCurrentResourceSecrets(updateSecrets, () => replProvider.create(logicalId, resourceType, replProps, { maskSecrets: createSecretMasker(updateSecrets) })), logicalId, void 0, void 0, replProvider);
43465
43581
  } catch (createError) {
43466
43582
  if (createFirst) throw createError;
43467
- if (!retainOldOnReplace) throw new Error(maskSecretsInText(`Failed to create ${logicalId} after the UPDATE-not-supported replacement: the old resource (${currentResource.physicalId}) is now gone. Cause: ${createError instanceof Error ? createError.message : String(createError)}. Re-run the deploy to create it fresh.`, updateSecrets), { cause: createError instanceof Error ? createError : void 0 });
43583
+ if (!retainOldOnReplace) {
43584
+ const shownSecrets = unionOfSecretBags([updateSecrets, this.printingSecretsFor(logicalId)]);
43585
+ throw new Error(safeMsg`Failed to create ${maskSecretsInText(logicalId, shownSecrets)} after the ` + safeMsg`UPDATE-not-supported replacement: the old resource (${maskSecretsInText(currentResource.physicalId, shownSecrets)}) ` + safeMsg`is now gone. Re-run the deploy to create it fresh. Cause: ${asIsMessage(maskSecretsInText(createError instanceof Error ? createError.message : String(createError), shownSecrets))}`, { cause: createError instanceof Error ? createError : void 0 });
43586
+ }
43468
43587
  if (!isNameCollisionErrorFrom(createError, logicalId)) throw createError;
43469
43588
  const nameHeldElsewhere = replacementRequestsDifferentName({
43470
43589
  oldResourceType: resourceType,
@@ -43474,9 +43593,9 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43474
43593
  observed: currentResource.observedProperties,
43475
43594
  physicalId: currentResource.physicalId
43476
43595
  });
43477
- if (nameHeldElsewhere !== void 0) throw markNonRetryable(new CdkdError(`${logicalId} (${resourceType}) requires replacement because the provisioning layer cannot update it in place, but the create collided. ${renderNameHeldElsewhere(nameHeldElsewhere)} — so removing UpdateReplacePolicy: Retain would delete this resource and still collide. Choose a name no other resource holds, or delete the resource holding it if it is yours.`, "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
43596
+ if (nameHeldElsewhere !== void 0) throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement because the ` + `provisioning layer cannot update it in place, but the create collided. ` + safeMsg`${renderNameHeldElsewhere(nameHeldElsewhere)} — so removing ` + "UpdateReplacePolicy: Retain would delete this resource and still collide. Choose a name no other resource holds, or delete the resource holding it if it is yours.", "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
43478
43597
  const nameOrigin = this.replacementNameOrigin(logicalId, currentResource.physicalId);
43479
- throw markNonRetryable(new CdkdError(`${logicalId} (${resourceType}) requires replacement because the provisioning layer cannot update it in place — but its physical name is still held by the existing resource AND UpdateReplacePolicy: Retain pins that resource in place. ${nameOrigin.descriptor}. ${nameOrigin.remedy} — with Retain, the old resource keeps the name, so a same-name replacement can never proceed. Removing UpdateReplacePolicy: Retain lets cdkd delete the old resource first, which destroys it and any data it holds.`, "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
43598
+ throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement because the ` + "provisioning layer cannot update it in place — but its physical name is still held by the existing resource AND UpdateReplacePolicy: Retain pins that resource in place. " + safeMsg`${nameOrigin.descriptor}. ${nameOrigin.remedy} — with Retain, the old ` + "resource keeps the name, so a same-name replacement can never proceed. Removing UpdateReplacePolicy: Retain lets cdkd delete the old resource first, which destroys it and any data it holds.", "NAMED_REPLACEMENT_COLLISION", createError instanceof Error ? createError : void 0));
43480
43599
  }
43481
43600
  if (!retainOldOnReplace && !createFirst && createResult.physicalId === currentResource.physicalId && !equalIdNamesDifferentResources({
43482
43601
  resourceType,
@@ -43492,10 +43611,10 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43492
43611
  newProperties: resolvedProps
43493
43612
  })) {
43494
43613
  const idempotentNameOrigin = this.replacementNameOrigin(logicalId, currentResource.physicalId);
43495
- throw markNonRetryable(new CdkdError(`${logicalId} (${resourceType}) requires replacement, but its Create API is name-idempotent: the create returned the existing resource (${currentResource.physicalId}) instead of creating a new one, and UpdateReplacePolicy: Retain pins that resource in place, so the new properties were not applied. ${idempotentNameOrigin.descriptor}. ${idempotentNameOrigin.remedy} — with Retain, the old resource keeps the name, so a same-name replacement can never proceed.`, "NAMED_REPLACEMENT_IDEMPOTENT_CREATE"));
43614
+ throw markNonRetryable(new CdkdError(safeMsg`${logicalId} (${resourceType}) requires replacement, but its Create ` + `API is name-idempotent: the create returned the existing resource ` + safeMsg`(${currentResource.physicalId}) instead of creating a new one, and ` + `UpdateReplacePolicy: Retain pins that resource in place, so the new ` + safeMsg`properties were not applied. ${idempotentNameOrigin.descriptor}. ` + safeMsg`${idempotentNameOrigin.remedy} — with Retain, the old resource keeps ` + `the name, so a same-name replacement can never proceed.`, "NAMED_REPLACEMENT_IDEMPOTENT_CREATE"));
43496
43615
  }
43497
43616
  this.retainedOldOnReplacement.add(logicalId);
43498
- this.logger.warn(` ⚠ ${logicalId} has UpdateReplacePolicy: Retain — the old physical resource (${currentResource.physicalId}) is RETAINED and is no longer tracked by cdkd: it keeps running and incurring cost, and \`cdkd destroy\` will not remove it. Delete it yourself once you no longer need its data.`);
43617
+ this.logger.warn(safeMsg` ⚠ ${logicalId} has UpdateReplacePolicy: Retain — the old physical ` + safeMsg`resource (${currentResource.physicalId}) is RETAINED and is no longer ` + "tracked by cdkd: it keeps running and incurring cost, and `cdkd destroy` will not remove it. Delete it yourself once you no longer need its data.");
43499
43618
  retainedSurvivorReason = `UpdateReplacePolicy: Retain kept the old ${resourceType} (${currentResource.physicalId}), now untracked by cdkd`;
43500
43619
  }
43501
43620
  const replacementResult = {
@@ -43513,7 +43632,10 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43513
43632
  result = replacementResult;
43514
43633
  resultProvisionedBy = replDecision.provisionedBy;
43515
43634
  captureProvider = replProvider;
43516
- } else throw updateError;
43635
+ } else {
43636
+ if (currentResource.provisionedBy !== "cc-api" && updateDecision.ccRouteReason !== void 0 && updateError instanceof Error && !isInterruptedWaitError(updateError) && !isWaitAbandonedError(updateError)) updateError.message += ccAutoRouteUpdateFailureRemedy(logicalId, resourceType, updateDecision.ccRouteReason.properties, this.options.parentStackInfo !== void 0);
43637
+ throw updateError;
43638
+ }
43517
43639
  }
43518
43640
  this.updateWasReplaced.set(logicalId, result.wasReplaced === true);
43519
43641
  if (result.wasReplaced !== true && (hasPassProvenance(updateSecrets) || referenceProvenanceOf(currentResource) !== void 0)) {
@@ -43526,7 +43648,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43526
43648
  physicalId: result.physicalId,
43527
43649
  properties: resolvedProps
43528
43650
  });
43529
- this.logger.info(`Resource ${logicalId} was replaced: ${currentResource.physicalId} -> ${result.physicalId}`);
43651
+ this.logger.info(safeMsg`Resource ${logicalId} was replaced: ${currentResource.physicalId} -> ${result.physicalId}`);
43530
43652
  }
43531
43653
  const dischargedByReplacement = result.wasReplaced === true && result.physicalId !== currentResource.physicalId;
43532
43654
  const keepsParameterRefusal = !dischargedByReplacement && hasUnverifiableParameterRefusal(currentResource);
@@ -43555,7 +43677,7 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43555
43677
  }
43556
43678
  };
43557
43679
  if (updatePartialReason(result) === void 0) this.recordInlinePolicyWrite(logicalId, "update");
43558
- if (keepsParameterRefusal) this.logger.debug(`observedProperties capture SKIPPED for updated ${logicalId} (${resourceType}): 'cdkd import' refused its baseline because a template parameter was not provably deployed at its 'Default', and this deploy bound the same 'Default' — an in-place update cannot show that AWS no longer holds the deployed value. The refusal stands until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter.`);
43680
+ if (keepsParameterRefusal) this.logger.debug(safeMsg`observedProperties capture SKIPPED for updated ${logicalId} (${resourceType}): 'cdkd import' refused its baseline because a template parameter was not provably deployed at its 'Default', and this deploy bound the same 'Default' — an in-place update cannot show that AWS no longer holds the deployed value. The refusal stands until the resource is replaced or re-imported against a CloudFormation stack that proves the parameter.`);
43559
43681
  const updateCaptureSiblings = keepsParameterRefusal ? void 0 : await this.buildObservedCaptureSiblings(resourceType, logicalId, result.physicalId, template, stateResources, stackName, parameterValues, conditions);
43560
43682
  if (!keepsParameterRefusal) this.kickOffObservedCapture(captureProvider, logicalId, result.physicalId, resourceType, resolvedProps, {
43561
43683
  ...updateCaptureSiblings,
@@ -43572,11 +43694,11 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
43572
43694
  const replacedSkip = this.replacedDeleteSkips.get(logicalId);
43573
43695
  const shownPartial = updatePartial !== void 0 && replacedSkip !== void 0 ? `${updatePartial}; ${replacedSkip}` : updatePartial ?? replacedSkip;
43574
43696
  if (shownPartial !== void 0) {
43575
- this.logger.warn(`${updatePrefix}${formatResourceLine("updated", logicalId, resourceType)} ` + updatePartialMessage(shownPartial));
43697
+ this.logger.warn(safeMsg`${updatePrefix}${formatResourceLine("updated", logicalId, resourceType)} ` + safeMsg`${updatePartialMessage(shownPartial)}`);
43576
43698
  if (updatePartial !== void 0) return { updatePartial };
43577
43699
  return;
43578
43700
  }
43579
- this.logger.info(`${updatePrefix}${formatResourceLine("updated", logicalId, resourceType)}`);
43701
+ this.logger.info(safeMsg`${updatePrefix}${formatResourceLine("updated", logicalId, resourceType)}`);
43580
43702
  }
43581
43703
 
43582
43704
  //#endregion
@@ -43661,10 +43783,10 @@ async function provisionDelete(logicalId, change, stateResources, stackName, tem
43661
43783
  const existingState = stateResources[logicalId];
43662
43784
  const renderer = getLiveRenderer();
43663
43785
  const currentResource = existingState;
43664
- if (!currentResource) throw new Error(`Cannot delete ${logicalId}: resource not found in state`);
43786
+ if (!currentResource) throw new Error(safeMsg`Cannot delete ${logicalId}: resource not found in state`);
43665
43787
  const deletionPolicy = currentResource.deletionPolicy ?? template?.Resources?.[logicalId]?.DeletionPolicy;
43666
43788
  if (shouldRetainResource(deletionPolicy)) {
43667
- this.logger.info(`Retaining ${logicalId} (${resourceType}) - DeletionPolicy: ${deletionPolicy}`);
43789
+ this.logger.info(safeMsg`Retaining ${logicalId} (${resourceType}) - DeletionPolicy: ${deletionPolicy}`);
43668
43790
  delete stateResources[logicalId];
43669
43791
  await noteRetainedResource(resourceType, logicalId);
43670
43792
  if (keptForReadoption(currentResource)) {
@@ -43736,7 +43858,7 @@ Drop the record with: ${dropCommand}`);
43736
43858
  provisionedBy: currentResource.provisionedBy
43737
43859
  });
43738
43860
  const deleteProvider = deleteRoute.provider;
43739
- this.logger.debug(`Deleting ${logicalId} (${resourceType})`);
43861
+ this.logger.debug(safeMsg`Deleting ${logicalId} (${resourceType})`);
43740
43862
  let deleteResult = void 0;
43741
43863
  const inlinePolicyClaimed = this.inlinePolicyClaimedFor(resourceType, logicalId, stateResources);
43742
43864
  try {
@@ -43752,7 +43874,7 @@ Drop the record with: ${dropCommand}`);
43752
43874
  }), logicalId, 3, 5e3, deleteProvider);
43753
43875
  } catch (deleteError) {
43754
43876
  const msg = deleteError instanceof Error ? deleteError.message : String(deleteError);
43755
- if (!isInterruptedWaitError(deleteError) && !isMarkedNonRetryable(deleteError) && !isWaitAbandonedError(deleteError) && (msg.includes("does not exist") || msg.includes("was not found") || msg.includes("not found") || msg.includes("No policy found") || msg.includes("NoSuchEntity") || msg.includes("NotFoundException") || msg.includes("ResourceNotFoundException"))) this.logger.debug(`Resource ${logicalId} already deleted (${msg}), removing from state`);
43877
+ if (!isInterruptedWaitError(deleteError) && !isMarkedNonRetryable(deleteError) && !isWaitAbandonedError(deleteError) && (msg.includes("does not exist") || msg.includes("was not found") || msg.includes("not found") || msg.includes("No policy found") || msg.includes("NoSuchEntity") || msg.includes("NotFoundException") || msg.includes("ResourceNotFoundException"))) this.logger.debug(safeMsg`Resource ${logicalId} already deleted (${asIsMessage(msg)}), removing from state`);
43756
43878
  else throw deleteError;
43757
43879
  }
43758
43880
  reportDeleteGuards(deleteResult, {
@@ -43765,7 +43887,7 @@ Drop the record with: ${dropCommand}`);
43765
43887
  if (progress) progress.current++;
43766
43888
  const skipPrefix = progress ? `[${progress.current}/${progress.total}] ` : " ";
43767
43889
  renderer.removeTask(logicalId);
43768
- this.logger.info(`${skipPrefix}${formatResourceLine("skipped", logicalId, resourceType, `skipped (${deleteSkipped})`)}`);
43890
+ this.logger.info(safeMsg`${skipPrefix}${formatResourceLine("skipped", logicalId, resourceType, `skipped (${deleteSkipped})`)}`);
43769
43891
  const nested = resourceType === "AWS::CloudFormation::Stack";
43770
43892
  const recordStack = nested ? nestedChildStackName(stackName, logicalId) : stackName;
43771
43893
  const interrupted = nested && deleteSkipped.endsWith(" was interrupted");
@@ -43777,7 +43899,7 @@ Drop the record with: ${dropCommand}`);
43777
43899
  hole: nested ? "child-stack" : "stack",
43778
43900
  opts: { plainIdent: true }
43779
43901
  };
43780
- this.logger.warn(deleteSkippedMessage(logicalId, currentResource.physicalId, deleteSkipped, "while removing it from the template") + ". Its cdkd state record was KEPT, so the next 'cdkd deploy' re-attempts the delete. Repair the record first (for a nested stack it is the CHILD's own state, whose other resources may already be gone), or delete the resource by hand and drop the record." + (interrupted ? " The commands name the child stack record. Its destroy was interrupted: re-run 'cdkd deploy' to resume it, and drop the child record only if that cannot finish, after deleting by hand what the child still holds (the inspect command with --show-nested lists every level; a child with nested stacks of its own has records under '<child>~<logicalId>' too, each needing the same drop)." : nested ? " The commands name the child stack record. Dropping it drops every record the child still has and nothing reaches those resources again, so first delete by hand what the child still holds (the inspect command with --show-nested lists every level; a child with nested stacks of its own has records under '<child>~<logicalId>' too, each needing the same drop). The next 'cdkd deploy' then removes this row." : " Keep '--resource' on the drop: without it the command drops the record of every resource in this still-deployed stack.") + (accountClause === "" ? "" : ` ${accountClause}`) + `\nInspect it with: ${pasteableCommand("cdkd state show", [
43902
+ this.logger.warn(safeMsg`${deleteSkippedMessage(logicalId, currentResource.physicalId, deleteSkipped, "while removing it from the template")}` + ". Its cdkd state record was KEPT, so the next 'cdkd deploy' re-attempts the delete. Repair the record first (for a nested stack it is the CHILD's own state, whose other resources may already be gone), or delete the resource by hand and drop the record." + (interrupted ? " The commands name the child stack record. Its destroy was interrupted: re-run 'cdkd deploy' to resume it, and drop the child record only if that cannot finish, after deleting by hand what the child still holds (the inspect command with --show-nested lists every level; a child with nested stacks of its own has records under '<child>~<logicalId>' too, each needing the same drop)." : nested ? " The commands name the child stack record. Dropping it drops every record the child still has and nothing reaches those resources again, so first delete by hand what the child still holds (the inspect command with --show-nested lists every level; a child with nested stacks of its own has records under '<child>~<logicalId>' too, each needing the same drop). The next 'cdkd deploy' then removes this row." : " Keep '--resource' on the drop: without it the command drops the record of every resource in this still-deployed stack.") + (accountClause === "" ? "" : safeMsg` ${accountClause}`) + safeMsg`\nInspect it with: ${pasteableCommand("cdkd state show", [
43781
43903
  stackArg,
43782
43904
  {
43783
43905
  flag: "--stack-region",
@@ -43785,7 +43907,7 @@ Drop the record with: ${dropCommand}`);
43785
43907
  hole: "region"
43786
43908
  },
43787
43909
  ...account
43788
- ]).command}\nDrop the record with: ${pasteableCommand("cdkd state orphan", [
43910
+ ]).command}` + safeMsg`\nDrop the record with: ${pasteableCommand("cdkd state orphan", [
43789
43911
  stackArg,
43790
43912
  {
43791
43913
  flag: "--stack-region",
@@ -43808,7 +43930,7 @@ Drop the record with: ${dropCommand}`);
43808
43930
  if (progress) progress.current++;
43809
43931
  const deletePrefix = progress ? `[${progress.current}/${progress.total}] ` : " ";
43810
43932
  renderer.removeTask(logicalId);
43811
- this.logger.info(`${deletePrefix}${formatResourceLine("deleted", logicalId, resourceType)}`);
43933
+ this.logger.info(safeMsg`${deletePrefix}${formatResourceLine("deleted", logicalId, resourceType)}`);
43812
43934
  }
43813
43935
 
43814
43936
  //#endregion
@@ -43876,6 +43998,8 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
43876
43998
  }
43877
43999
  } else updatePartial = `${updatePartial}; ${replacedSkip}`;
43878
44000
  }
44001
+ const deferred = this.deferredReplacedDeletes?.get(logicalId);
44002
+ if (deferred !== void 0 && updatePartial !== void 0) deferred.rowPartial = true;
43879
44003
  nestedChildUnaddressed = unaddressed;
43880
44004
  } finally {
43881
44005
  for (const guard of deleteGuards.splice(0)) this.recordEvent({
@@ -43900,7 +44024,7 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
43900
44024
  if (current !== void 0) current.warnSuffix = warnSuffix;
43901
44025
  renderer.updateTaskLabel(logicalId, `${current?.label ?? baseLabel}${warnSuffix}`);
43902
44026
  renderer.printAbove(() => {
43903
- this.logger.warn(`${logicalId} (${resourceType}) has been ${operationKind === "CREATE" ? "creating" : operationKind === "DELETE" ? "deleting" : "updating"} for ${minutes}m — still waiting`);
44027
+ this.logger.warn(safeMsg`${logicalId} (${resourceType}) has been ${operationKind === "CREATE" ? "creating" : operationKind === "DELETE" ? "deleting" : "updating"} for ${minutes}m — still waiting`);
43904
44028
  });
43905
44029
  },
43906
44030
  onTimeout: (elapsedMs) => new ResourceTimeoutError(logicalId, resourceType, this.stackRegion, elapsedMs, operationKind, timeoutMs)
@@ -43948,7 +44072,9 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
43948
44072
  } catch (error) {
43949
44073
  renderer.removeTask(logicalId);
43950
44074
  const message = error instanceof Error ? error.message : String(error);
43951
- this.logger.error(this.maskForResource(logicalId, `Failed to ${change.changeType.toLowerCase()} ${logicalId}: ${message}`));
44075
+ const shownMessage = this.maskForResource(logicalId, message);
44076
+ const shownId = safeMsg`${logicalId}`;
44077
+ this.logger.error(this.maskForResource(logicalId, `Failed to ${change.changeType.toLowerCase()} ${shownId}: ${shownMessage}`));
43952
44078
  const orphanAdvice = this.orphanedNameCollisionAdvice(change.changeType, logicalId, error);
43953
44079
  if (orphanAdvice) this.logger.error(this.maskForResource(logicalId, orphanAdvice));
43954
44080
  this.recordEvent({
@@ -43961,7 +44087,7 @@ async function provisionResource(logicalId, change, stateResources, stackName, t
43961
44087
  durationMs: Date.now() - resourceStartedAt,
43962
44088
  error: extractDeploymentEventError(error)
43963
44089
  });
43964
- throw new ProvisioningError(`Failed to ${change.changeType.toLowerCase()} resource ${logicalId}`, resourceType, logicalId, stateResources[logicalId]?.physicalId, error instanceof Error ? maskSecretsInError(error, this.printingSecretsFor(logicalId) ?? EMPTY_SECRETS) : void 0);
44090
+ throw new ProvisioningError(safeMsg`Failed to ${change.changeType.toLowerCase()} resource ${logicalId}`, resourceType, logicalId, stateResources[logicalId]?.physicalId, error instanceof Error ? maskSecretsInError(error, this.printingSecretsFor(logicalId) ?? EMPTY_SECRETS) : void 0);
43965
44091
  } finally {
43966
44092
  renderer.removeTask(logicalId);
43967
44093
  }
@@ -44141,9 +44267,9 @@ async function executeDeployment(template, currentState, changes, dag, execution
44141
44267
  migrateLegacy: migrate
44142
44268
  });
44143
44269
  if (migrate) pendingMigration = false;
44144
- this.logger.debug(`State saved after ${logicalId}`);
44270
+ this.logger.debug(safeMsg`State saved after ${logicalId}`);
44145
44271
  } catch (error) {
44146
- this.logger.warn(`Failed to save state after ${logicalId}: ${error instanceof Error ? error.message : String(error)}`);
44272
+ this.logger.warn(safeMsg`Failed to save state after ${logicalId}: ${asIsMessage(error instanceof Error ? error.message : String(error))}`);
44147
44273
  }
44148
44274
  });
44149
44275
  };
@@ -44152,6 +44278,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
44152
44278
  const settledUpdates = /* @__PURE__ */ new Set();
44153
44279
  const inFlightWrites = /* @__PURE__ */ new Map();
44154
44280
  this.stackRecordsView = deployStackRecordsView(newResources, currentState.resources, deleteChanges, (logicalId) => startedUpdates.has(logicalId) && !settledUpdates.has(logicalId), () => [...inFlightWrites.values()].map(({ write }) => write));
44281
+ this.deferredReplacedDeletes = /* @__PURE__ */ new Map();
44155
44282
  try {
44156
44283
  const createUpdateIds = [];
44157
44284
  for (const [id, change] of changes.entries()) {
@@ -44160,7 +44287,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
44160
44287
  createUpdateIds.push(id);
44161
44288
  }
44162
44289
  if (createUpdateIds.length > 0) {
44163
- this.logger.info(`${cyan("Deploying")} ${cyan(createUpdateIds.length)} resource(s) (DAG: ${executionLevels.length} levels, max parallel: ${concurrency})`);
44290
+ this.logger.info(safeMsg`${cyan("Deploying")} ${cyan(createUpdateIds.length)} resource(s) (DAG: ${executionLevels.length} levels, max parallel: ${concurrency})`);
44164
44291
  const createUpdateExecutor = new DagExecutor();
44165
44292
  const provisionable = new Set(createUpdateIds);
44166
44293
  const createUpdateDeps = /* @__PURE__ */ new Map();
@@ -44329,7 +44456,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
44329
44456
  if (this.interrupted && this.hasPending(createUpdateExecutor)) throw new InterruptedError(this.interruptCause ?? "user");
44330
44457
  }
44331
44458
  if (deleteChanges.size > 0) {
44332
- this.logger.info(`${red("Deleting")} ${red(deleteChanges.size)} resource(s)`);
44459
+ this.logger.info(safeMsg`${red("Deleting")} ${red(deleteChanges.size)} resource(s)`);
44333
44460
  const deleteDeps = this.buildDeletionDependencies(deleteChanges, currentState);
44334
44461
  const deleteExecutor = new DagExecutor();
44335
44462
  for (const id of deleteChanges) deleteExecutor.add({
@@ -44374,7 +44501,10 @@ async function executeDeployment(template, currentState, changes, dag, execution
44374
44501
  }
44375
44502
  if (this.interrupted && this.hasPending(deleteExecutor)) throw new InterruptedError(this.interruptCause ?? "user");
44376
44503
  }
44504
+ if (this.interrupted) this.warnUnretriedReplacedDeletes("interrupted");
44505
+ else await this.retryDeferredReplacedDeletes(stackName, actualCounts);
44377
44506
  } catch (error) {
44507
+ this.warnUnretriedReplacedDeletes(this.interruptCause === "user" ? "interrupted" : "failed");
44378
44508
  const initialDeploy = currentEtag === void 0;
44379
44509
  const written = /* @__PURE__ */ new Set([...this.restoredLostChildren, ...completedOperations.map((op) => op.logicalId)]);
44380
44510
  for (const logicalId of this.updatesThatSentNothing) written.delete(logicalId);
@@ -44450,7 +44580,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
44450
44580
  if (migrate) pendingMigration = false;
44451
44581
  this.logger.debug("Partial state saved before rollback (orphaned resource tracking)");
44452
44582
  } catch (saveError) {
44453
- this.logger.warn(`Failed to save partial state before rollback: ${saveError instanceof Error ? saveError.message : String(saveError)}`);
44583
+ this.logger.warn(safeMsg`Failed to save partial state before rollback: ${asIsMessage(saveError instanceof Error ? saveError.message : String(saveError))}`);
44454
44584
  }
44455
44585
  let autoRollbackClean = false;
44456
44586
  let autoRollbackJournaled = false;
@@ -44459,7 +44589,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
44459
44589
  let rollbackRemainingFailedOps = failedOperations;
44460
44590
  if (error instanceof InterruptedError || isInterruptedWaitError(error) || this.interruptCause === "user") {
44461
44591
  await this.writeRollbackJournalSegment(stackName, completedOperations, failedOperations, "interrupted", initialDeploy);
44462
- this.logger.info(`Partial state saved (${Object.keys(newResources).length} resources). Run deploy again to resume, 'cdkd rollback' to revert, or destroy to clean up.`);
44592
+ this.logger.info(safeMsg`Partial state saved (${Object.keys(newResources).length} resources). ` + "Run deploy again to resume, 'cdkd rollback' to revert, or destroy to clean up.");
44463
44593
  throw error;
44464
44594
  }
44465
44595
  if (this.options.noRollback) {
@@ -44498,7 +44628,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
44498
44628
  this.logger.debug("State saved after deployment failure");
44499
44629
  if (autoRollbackClean) await this.settleNestedChildrenAfterCleanRollback(stackName, rollbackSettledNested, await this.settleJournalAfterCleanRollback(stackName, rollbackRemainingFailedOps, initialDeploy));
44500
44630
  } catch (saveError) {
44501
- this.logger.debug(`Retrying state save after rollback (ETag mismatch): ${saveError instanceof Error ? saveError.message : String(saveError)}`);
44631
+ this.logger.debug(safeMsg`Retrying state save after rollback (ETag mismatch): ${asIsMessage(saveError instanceof Error ? saveError.message : String(saveError))}`);
44502
44632
  try {
44503
44633
  const freshEtag = (await this.stateBackend.getState(stackName, this.stackRegion))?.etag;
44504
44634
  const postRollbackState = {
@@ -44517,7 +44647,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
44517
44647
  this.logger.debug("State saved after deployment failure (retry succeeded)");
44518
44648
  if (autoRollbackClean) await this.settleNestedChildrenAfterCleanRollback(stackName, rollbackSettledNested, await this.settleJournalAfterCleanRollback(stackName, rollbackRemainingFailedOps, initialDeploy));
44519
44649
  } catch (retryError) {
44520
- this.logger.warn(`Failed to save state after rollback: ${retryError instanceof Error ? retryError.message : String(retryError)}`);
44650
+ this.logger.warn(safeMsg`Failed to save state after rollback: ${asIsMessage(retryError instanceof Error ? retryError.message : String(retryError))}`);
44521
44651
  }
44522
44652
  }
44523
44653
  throw error;
@@ -44572,13 +44702,13 @@ async function persistStateAfterOutputFailure(stackName, currentState, newResour
44572
44702
  });
44573
44703
  this.logger.debug("State saved after output resolution failure");
44574
44704
  } catch (saveError) {
44575
- this.logger.debug(`Retrying state save after output resolution failure (ETag mismatch): ${saveError instanceof Error ? saveError.message : String(saveError)}`);
44705
+ this.logger.debug(safeMsg`Retrying state save after output resolution failure (ETag mismatch): ${asIsMessage(saveError instanceof Error ? saveError.message : String(saveError))}`);
44576
44706
  try {
44577
44707
  const freshEtag = (await this.stateBackend.getState(stackName, this.stackRegion))?.etag;
44578
44708
  await this.stateBackend.saveState(stackName, this.stackRegion, this.withParentInfo(buildState()), { ...freshEtag !== void 0 && { expectedEtag: freshEtag } });
44579
44709
  this.logger.debug("State saved after output resolution failure (retry succeeded)");
44580
44710
  } catch (retryError) {
44581
- this.logger.warn(`Failed to save state after output resolution failure: ${retryError instanceof Error ? retryError.message : String(retryError)} — resources were provisioned but not recorded; run deploy again to reconcile.`);
44711
+ this.logger.warn(safeMsg`Failed to save state after output resolution failure: ${asIsMessage(retryError instanceof Error ? retryError.message : String(retryError))} — resources were provisioned but not recorded; run deploy again to reconcile.`);
44582
44712
  }
44583
44713
  }
44584
44714
  }
@@ -45892,7 +46022,7 @@ function inheritedProvenanceForChildDiff(args) {
45892
46022
  const TAIL_WARM_CONNECTIONS = 3;
45893
46023
  async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
45894
46024
  const startTime = Date.now();
45895
- this.logger.debug(`Starting deployment for stack: ${stackName}`);
46025
+ this.logger.debug(safeMsg`Starting deployment for stack: ${displayStackName(stackName)}`);
45896
46026
  const renderer = getLiveRenderer();
45897
46027
  this.interrupted = false;
45898
46028
  this.interruptCause = null;
@@ -45938,7 +46068,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
45938
46068
  refuseMalformedOrphanRecords(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
45939
46069
  this.provenanceBaseline = provenanceBaselineOf(currentState, isKnownTokenFreeState(currentStateData?.state));
45940
46070
  const migrationPending = currentStateData?.migrationPending ?? false;
45941
- this.logger.debug(`Loaded current state: ${Object.keys(currentState.resources).length} resources`);
46071
+ this.logger.debug(safeMsg`Loaded current state: ${Object.keys(currentState.resources).length} resources`);
45942
46072
  if (this.options.onCurrentStateLoaded) {
45943
46073
  const gate = this.options.onCurrentStateLoaded(stackName, currentStateData?.state);
45944
46074
  if (currentStateData === null || currentStateData === void 0) {
@@ -45964,10 +46094,10 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
45964
46094
  };
45965
46095
  if (journal && journal.segments.length > 0) {
45966
46096
  const failedOnly = journal.segments.every((s) => s.operations.length === 0) && journal.segments.some((s) => (s.failedOperations?.length ?? 0) > 0);
45967
- this.logger.info(failedOnly ? `A previous deploy of ${displayStackName(stackName)} failed and was automatically rolled back. The failed resource may be partially applied — revert it, or continue deploying to fix forward (${this.options.parentStackInfo ? "a successful deploy of the top-level stack clears this note" : "a successful deploy clears this note"}).\nRevert it with: ${pasteableCommand("cdkd rollback", [{
46097
+ this.logger.info(failedOnly ? safeMsg`A previous deploy of ${displayStackName(stackName)} failed and was automatically rolled back. ` + `The failed resource may be partially applied — revert it, or continue ` + safeMsg`deploying to fix forward (${this.options.parentStackInfo ? "a successful deploy of the top-level stack clears this note" : "a successful deploy clears this note"}).` + safeMsg`\nRevert it with: ${pasteableCommand("cdkd rollback", [{
45968
46098
  value: stackName,
45969
46099
  hole: "stack"
45970
- }, { literal: "--revert-failed" }]).command}` : `A previous deploy of ${displayStackName(stackName)} failed or was interrupted. Revert it, or continue deploying to fix forward.\nRevert it with: ${pasteableCommand("cdkd rollback", [{
46100
+ }, { literal: "--revert-failed" }]).command}` : safeMsg`A previous deploy of ${displayStackName(stackName)} failed or was interrupted. Revert it, ` + `or continue deploying to fix forward.` + safeMsg`\nRevert it with: ${pasteableCommand("cdkd rollback", [{
45971
46101
  value: stackName,
45972
46102
  hole: "stack"
45973
46103
  }]).command}`);
@@ -45975,13 +46105,13 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
45975
46105
  } catch {}
45976
46106
  this.stampReasonlessParameterRefusals(currentState.resources, template);
45977
46107
  this.kickOffAutoRefreshObservedProperties(currentState.resources, currentState);
45978
- this.logger.debug(`Template has ${Object.keys(template.Resources || {}).length} resources`);
46108
+ this.logger.debug(safeMsg`Template has ${Object.keys(template.Resources || {}).length} resources`);
45979
46109
  const outputsDigestSource = structuredClone({
45980
46110
  ...template,
45981
46111
  Resources: {}
45982
46112
  });
45983
46113
  const parameterValues = await this.resolver.resolveParameters(template, this.options.parameters, { ...this.options.inheritedSecrets && hasMaskableValues(this.options.inheritedSecrets) && { inheritedSecrets: this.options.inheritedSecrets } });
45984
- this.logger.debug(`Resolved ${Object.keys(parameterValues).length} parameters: ${Object.keys(parameterValues).join(", ")}`);
46114
+ this.logger.debug(safeMsg`Resolved ${Object.keys(parameterValues).length} parameters: ${Object.keys(parameterValues).join(", ")}`);
45985
46115
  poisonRenderedSpellingsCollidingIn(template, parameterValues, this.options.inheritedSecrets);
45986
46116
  this.inheritedNoEchoParameters = /* @__PURE__ */ new Set([...this.freshNoEchoParameters(parameterValues) ?? [], ...this.options.passedNoEchoParameters ?? []]);
45987
46117
  const backfillNoEchoValues = noEchoParameterValueSeed(template.Parameters, parameterValues, this.options.inheritedSecrets, this.options.parameters);
@@ -46001,7 +46131,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
46001
46131
  parameters: parameterValues
46002
46132
  }, stackName);
46003
46133
  const conditions = await this.resolver.evaluateConditions(context);
46004
- this.logger.debug(`Evaluated ${Object.keys(conditions).length} conditions: ${Object.keys(conditions).join(", ")}`);
46134
+ this.logger.debug(safeMsg`Evaluated ${Object.keys(conditions).length} conditions: ${Object.keys(conditions).join(", ")}`);
46005
46135
  refuseNoValueOutputs(template.Outputs, conditions);
46006
46136
  let conditionVerdicts;
46007
46137
  if (conditionsReadByDiff(template, conditions).size > 0) {
@@ -46039,7 +46169,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
46039
46169
  this.logger.debug(`All resource properties validated`);
46040
46170
  const dag = this.dagBuilder.buildGraph(effectiveTemplate);
46041
46171
  const executionLevels = this.dagBuilder.getExecutionLevels(dag);
46042
- this.logger.debug(`Dependency graph: ${executionLevels.length} execution levels`);
46172
+ this.logger.debug(safeMsg`Dependency graph: ${executionLevels.length} execution levels`);
46043
46173
  const diffResolverContext = this.buildResolverContext({
46044
46174
  template: effectiveTemplate,
46045
46175
  resources: currentState.resources,
@@ -46139,8 +46269,8 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
46139
46269
  const outputsChanged = !outputMapsEqual(persistedOutputs, outputsToPersist);
46140
46270
  const persistExportSet = new Set(exportNamesToPersist ?? []);
46141
46271
  const exportSetChanged = exportNamesToPersist !== void 0 && (currentEffectiveExports.size !== persistExportSet.size || [...persistExportSet].some((k) => !currentEffectiveExports.has(k)));
46142
- if (merge?.kind === "kept" && !outputMapsEqual(persistedOutputs, resolvedOutputs)) this.logger.warn(`Outputs changed but one or more could not be resolved; keeping the previously persisted outputs. ${keptWholeReasonText(merge.reason)} A downstream Fn::ImportValue may fail until the next deploy.`);
46143
- else if (merge?.kind === "merged" && merge.carriedKeys.length > 0) this.logger.debug(`Kept the previously persisted value of ${merge.carriedKeys.length} output key(s), carried export aliases included, that could not be resolved (no-change path)`);
46272
+ if (merge?.kind === "kept" && !outputMapsEqual(persistedOutputs, resolvedOutputs)) this.logger.warn(safeMsg`Outputs changed but one or more could not be resolved; keeping the previously persisted outputs. ${keptWholeReasonText(merge.reason)} ` + "A downstream Fn::ImportValue may fail until the next deploy.");
46273
+ else if (merge?.kind === "merged" && merge.carriedKeys.length > 0) this.logger.debug(safeMsg`Kept the previously persisted value of ${merge.carriedKeys.length} output key(s), ` + "carried export aliases included, that could not be resolved (no-change path)");
46144
46274
  const skippedOutputsChanged = !skippedOutputsEqual(currentState.skippedOutputs, this.skippedOutputs);
46145
46275
  const healedAttributesPending = this.hasUnpersistedHeals(currentState.resources);
46146
46276
  const conditionVerdictsChanged = !conditionVerdictRecordsEqual(readRecordedConditionVerdicts(currentState), conditionVerdicts);
@@ -46179,7 +46309,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
46179
46309
  else if (healedAttributesPending) this.logger.debug("Persisted attributes re-read from AWS for a stale record (no-change path)");
46180
46310
  else this.logger.debug("Persisted skipped-outputs record (no outputs-value diff, no-change path)");
46181
46311
  } catch (saveError) {
46182
- this.logger.warn(`Failed to persist no-change state update: ${saveError instanceof Error ? saveError.message : String(saveError)} — drift baseline / outputs will be re-resolved on next deploy.`);
46312
+ this.logger.warn(safeMsg`Failed to persist no-change state update: ${asIsMessage(saveError instanceof Error ? saveError.message : String(saveError))} — drift baseline / outputs will be re-resolved on next deploy.`);
46183
46313
  }
46184
46314
  }
46185
46315
  return {
@@ -46198,7 +46328,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
46198
46328
  const createChanges = this.diffCalculator.filterByType(changes, "CREATE");
46199
46329
  const updateChanges = this.diffCalculator.filterByType(changes, "UPDATE");
46200
46330
  const deleteChanges = this.diffCalculator.filterByType(changes, "DELETE");
46201
- this.logger.info(`Changes: ${green(createChanges.length)} to create, ${yellow(updateChanges.length)} to update, ${red(deleteChanges.length)} to delete`);
46331
+ this.logger.info(safeMsg`Changes: ${green(createChanges.length)} to create, ${yellow(updateChanges.length)} to update, ${red(deleteChanges.length)} to delete`);
46202
46332
  if (this.options.dryRun) {
46203
46333
  this.logger.info("Dry run mode - skipping actual deployment");
46204
46334
  return {
@@ -46277,7 +46407,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
46277
46407
  ...newState,
46278
46408
  conditionVerdicts
46279
46409
  } : newState)), flushKeptForReadoption(this)]);
46280
- this.logger.debug(`State saved (ETag: ${newEtag})`);
46410
+ this.logger.debug(safeMsg`State saved (ETag: ${newEtag})`);
46281
46411
  const ledgerAndKeptCleanup = (async () => {
46282
46412
  await forgetRecordedCreateTokens(Object.keys(newState.resources));
46283
46413
  const readopted = await this.generatedNameGuard?.readoptedFromRetained() ?? [];
@@ -46338,7 +46468,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
46338
46468
  await this.lockManager.releaseLock(stackName, this.stackRegion);
46339
46469
  this.logger.debug("Lock released");
46340
46470
  } catch (lockError) {
46341
- this.logger.warn(`Failed to release lock: ${lockError instanceof Error ? lockError.message : String(lockError)}`);
46471
+ this.logger.warn(safeMsg`Failed to release lock: ${asIsMessage(lockError instanceof Error ? lockError.message : String(lockError))}`);
46342
46472
  }
46343
46473
  }
46344
46474
  }
@@ -46493,7 +46623,7 @@ function addImplicitDeleteDependencies(deleteIds, state, dependedBy) {
46493
46623
  if (!dependedBy.has(id)) dependedBy.set(id, /* @__PURE__ */ new Set());
46494
46624
  if (!dependedBy.get(id).has(depId)) {
46495
46625
  dependedBy.get(id).add(depId);
46496
- this.logger.debug(`Implicit delete dependency: ${depId} (${depType}) must be deleted before ${id} (${resource.resourceType})`);
46626
+ this.logger.debug(safeMsg`Implicit delete dependency: ${depId} (${depType}) must be deleted before ${id} (${resource.resourceType})`);
46497
46627
  }
46498
46628
  }
46499
46629
  }
@@ -46507,7 +46637,7 @@ function addImplicitDeleteDependencies(deleteIds, state, dependedBy) {
46507
46637
  if (!dependedBy.has(after)) dependedBy.set(after, /* @__PURE__ */ new Set());
46508
46638
  if (!dependedBy.get(after).has(before)) {
46509
46639
  dependedBy.get(after).add(before);
46510
- this.logger.debug(`Implicit delete dependency: ${before} (${scoped[before]?.resourceType}) must be deleted before ${after} (${scoped[after]?.resourceType})`);
46640
+ this.logger.debug(safeMsg`Implicit delete dependency: ${before} (${scoped[before]?.resourceType}) must be deleted before ${after} (${scoped[after]?.resourceType})`);
46511
46641
  }
46512
46642
  }
46513
46643
  }
@@ -46572,6 +46702,7 @@ var DeployEngine = class {
46572
46702
  noEchoExactEchoes = /* @__PURE__ */ new Map();
46573
46703
  noEchoAttributeReads = /* @__PURE__ */ new Map();
46574
46704
  replacedDeleteSkips = /* @__PURE__ */ new Map();
46705
+ deferredReplacedDeletes = void 0;
46575
46706
  secretNameNeedles = /* @__PURE__ */ new Map();
46576
46707
  perResourceTemplateProps = /* @__PURE__ */ new Map();
46577
46708
  perResourceResolvedType = /* @__PURE__ */ new Map();
@@ -46649,6 +46780,7 @@ var DeployEngine = class {
46649
46780
  this.noEchoExactEchoes = /* @__PURE__ */ new Map();
46650
46781
  this.noEchoAttributeReads = /* @__PURE__ */ new Map();
46651
46782
  this.replacedDeleteSkips = /* @__PURE__ */ new Map();
46783
+ this.deferredReplacedDeletes = void 0;
46652
46784
  this.secretNameNeedles = /* @__PURE__ */ new Map();
46653
46785
  this.perResourceTemplateProps = /* @__PURE__ */ new Map();
46654
46786
  this.constructPathTemplate = void 0;
@@ -46885,6 +47017,8 @@ DeployEngine.prototype.typeChangeNameQuestion = typeChangeNameQuestion;
46885
47017
  DeployEngine.prototype.checkedReplacementNameChange = checkedReplacementNameChange;
46886
47018
  DeployEngine.prototype.createFirstThenDeleteOld = createFirstThenDeleteOld;
46887
47019
  DeployEngine.prototype.deleteReplacedAfterCreate = deleteReplacedAfterCreate;
47020
+ DeployEngine.prototype.retryDeferredReplacedDeletes = retryDeferredReplacedDeletes;
47021
+ DeployEngine.prototype.warnUnretriedReplacedDeletes = warnUnretriedReplacedDeletes;
46888
47022
  DeployEngine.prototype.diffLogMasker = diffLogMasker;
46889
47023
  DeployEngine.prototype.freshNoEchoParameters = freshNoEchoParameters;
46890
47024
  DeployEngine.prototype.redactParametersForDiff = redactParametersForDiff;
@@ -46939,4 +47073,4 @@ DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice
46939
47073
 
46940
47074
  //#endregion
46941
47075
  export { S3_AUTO_DELETE_OBJECTS_TAG as $, unwrittenCreateOnlyReplacement as $a, getLegacyStateBucketName as $c, malformedExportSourceWarning as $i, formatDestructiveChange as $n, recordLogOnlyParameterValue as $o, explicitRoleArnOrThrow as $r, hasReadableExportSet as $s, replacementNeverSwapped as $t, diffSecurity as A, refuseMalformedResourceEntriesForImport as Aa, describeDockerExecFailure as Ac, cfnRefValueFromPhysicalId as Ai, absoluteAssemblyPathEscape as Al, DEFAULT_RESOURCE_WARN_AFTER_MS as An, sameLambdaFunctionAddress as Ao, RollbackInlinePolicyWriters as Ar, recordNoEchoParameterFreshValue as As, withNestedStackContext as At, readProtection as B, refuseMalformedState as Ba, redactedCause as Bc, STATE_RESOURCES_MALFORMED as Bi, extractDeploymentEventError as Bn, noEchoLeavesOf as Bo, isTerminationProtectionPropagationError as Br, isLockInfoExpired as Bs, awaitInFlightSibling as Bt, withApiLimit as C, refuseMalformedOrphansForOrphan as Ca, readBootstrapMarkerBody as Cc, getAccountInfo as Ci, StageLoadError as Cl, isWholeDynamicReferenceValue as Cn, requireConfigString as Co, withPrintingSecrets as Cr, recordPhysicalNameCopy as Cs, nestedChildStackName as Ct, findServiceTokenRefusals as D, refuseMalformedResourceEntries as Da, buildDockerImage as Dc, isNamelessDynamicReferenceError as Di, hasPlainPrototype$1 as Dl, isExportAliasCollision as Dn, withRetry as Do, CloudControlProvider as Dr, recordMaskOnlyValue as Ds, withNestedRevertRun as Dt, deferredServiceTokenWarning as E, refuseMalformedResourceAttributesForOrphan as Ea, buildDenyExternalAccessPolicy as Ec, carriesFetchableDynamicReference as Ei, hasOwnKey as El, collectPublishedOutputNames as En, describeTypeWithThrottleRetry as Eo, customResourceResponseExpirationWarning as Er, provenPublicValue as Es, revertedNestedRowIds as Et, recordedProtectionEvidence as F, refuseMalformedResourcePropertiesForExport as Fa, getDockerCmd as Fc, parameterInputsFor as Fi, injectAwsRegion as Fl, secretNamePrintingBag as Fn, maskAtCoordinates as Fo, withIndeterminateGuard as Fr, STATE_SOURCED_READBACK_RULES as Fs, loadJournaledOrphans as Ft, deleteBudgetKey as G, repairMalformedResourcePropertiesForReadOnly as Ga, escapeRegExp$3 as Gc, displayLogicalId as Gi, createPreDeleteFinalSnapshot as Gn, valueAtCoordinate as Go, INTRINSIC_KEYS as Gr, applyCrossPrefixScan as Gs, recordAfterRollbackUpdate as Gt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as H, repairMalformedOrphansForReadOnly as Ha, runDockerForeground as Hc, UNREADABLE_RESOURCES_MAP_ROW as Hi, PRE_DELETE_SNAPSHOT_TYPES as Hn, passedNoEchoParametersOf as Ho, reDisableInstanceApiTermination as Hr, rebuildClientForBucketRegion as Hs, getStackRecords as Ht, recordedProtectionNote as I, refuseMalformedResourcePropertiesForOrphan as Ia, isDockerClientEnvKey as Ic, passedParameterClassesOf as Ii, injectedAwsRegionValue as Il, secretNamePrintingBags as In, maskReadbackAtCoordinates as Io, isWaitAbandonedError as Ir, TEMPLATE_SOURCED_RULES as Is, makeForeignHolderScan as It, DELETE_INDEX_WAIT_PROCEED_NOTE as J, unreadableOrphanRecords as Ja, AssetManifestLoader as Jc, hasReadableResources as Ji, refusesFinalSnapshot as Jn, createUnionSecretMasker as Jo, producerLookupOver as Jr, isNotImplemented as Js, isReplacementOrphan as Jt, resolveDynamoDbDeleteBudgetClock as K, repairMalformedResourcesForReadOnly as Ka, stripControlChars as Kc, hasReadableOrphans as Ki, effectiveDeletionPolicy as Kn, liveMatchesUnresolvedTokenFrame as Ko, IntrinsicFunctionResolver as Kr, crossPrefixDeniedWarning as Ks, demoteSupersededOrphans as Kt, PROTECTION_PROPERTY_BY_TYPE as L, refuseMalformedResourcesForDeploy as La, isMalformedEnvKey as Lc, declaresNoEcho as Li, clearBucketRegionCache as Ll, secretNamedRecordNeedles as Ln, maskWholeValue as Lo, markWaitAbandoned as Lr, WHOLE_DYNAMIC_REFERENCE_PATTERN as Ls, sameJournaledOrphans as Lt, noEchoComparisonForTemplate as M, refuseMalformedResourceEntriesForOrphan as Ma, dockerSpawnEnvWithSensitive as Mc, refStateLookupFromResource as Mi, displayAssemblyPath as Ml, journaledOrphanPrintingBag as Mn, TemplateParser as Mo, deleteIndeterminateGuards as Mr, wholeStringLeavesOf as Ms, dropFailedHint as Mt, noEchoExactEchoLeavesOf as N, refuseMalformedResourcePropertiesForDestroy as Na, finchSecretArgvRefusal as Nc, parseWebACLArn as Ni, renderAssemblyPathEscape as Nl, maskEventTextWithBoundBags as Nn, canonicalCoordinates as No, deleteLeftInPlace as Nr, STATE_SOURCED_BASELINE_RULES as Ns, isHandledOrphan as Nt, serviceTokenBlockingReason as O, refuseMalformedResourceEntriesForDeploy as Oa, resolveDockerContextDirectory as Oc, keepsSecretReferenceToken as Oi, nullPrototypeRecord as Ol, bindingSkippedOutputs as On, canonicalLambdaFunctionName as Oo, slowCcOperationTimeoutMs as Or, recordMaskOnlyValuesIn as Os, collectNestedChildUnaddressed as Ot, noEchoParameterNamesOf as P, refuseMalformedResourcePropertiesForDrift as Pa, formatDockerLoginError as Pc, withSharedDrainBudget as Pi, resolveAssemblyPath as Pl, orphanRecordsPrintingBag as Pn, isMarkedCoordinate as Po, deleteSkipReason as Pr, STATE_SOURCED_CROSS_GENERATION_RULES as Ps, journaledOrphanLines as Pt, ECR_AUTO_DELETE_IMAGES_TAG as Q, findSilentDropProperties as Qa, getDefaultStateBucketName as Qc, malformedExportNamesWarning as Qi, findDestructiveChanges as Qn, printingCorpusOf as Qo, assertSendableRoleArn as Qr, exportNamesCarriedFrom as Qs, recordUnderIdIsNotOwn as Qt, isProtectionValueActive as R, refuseMalformedResourcesForDestroy as Ra, partitionSensitiveEnv as Rc, JSON_LISTING_HOLE_VALUE as Ri, resolveBucketRegion as Rl, stateSecretNameNeedles as Rn, maskedLeafCoordinatesOf as Ro, disableInstanceApiTermination as Rr, isSingleDynamicReferenceToken as Rs, replayFailedOperations as Rt, lookupEachName as S, refuseMalformedOrphansForDestroy as Sa, parseBootstrapMarker as Sc, parameterTypeMayLoseSecretIdentity as Si, AssemblyReader as Sl, exportNameSecretExposure as Sn, requireConfigObject as So, getCurrentResourceSecrets as Sr, recordAttributeIdCopy as Ss, getNestedRevertRun as St, recordRetainedForReadoption as T, refuseMalformedOutputsForDestroy as Ta, validateContainerRepoName as Tc, carriesDynamicReference as Ti, defineOwnKey as Tl, collectDeclaredOutputNames as Tn, templateResourceTypes as To, applyCustomResourceResponseExpiration as Tr, carriesSecretMask as Ts, revertNestedChildFromJournal as Tt, beginDeleteWait as U, repairMalformedOutputsForReadOnly as Ua, runDockerStreaming as Uc, accountArgs as Ui, buildFinalSnapshotIdentifier as Un, readbackPathFor as Uo, reEnableInstanceApiTermination as Ur, CrossPrefixReadError as Us, withStackRecords as Ut, DynamoDBGlobalTableProvider as V, repairMalformedOrphanRecordsForReadOnly as Va, redactedDockerCause as Vc, UNREADABLE_ORPHANS_CONTAINER_ROW as Vi, ATOMIC_FINAL_SNAPSHOT_TYPES as Vn, noEchoOutputsComparison as Vo, observeThenDisableInstanceApiTermination as Vr, S3StateBackend as Vs, destroyStackRecordsView as Vt, compensateRemovedDeletionProtection as W, repairMalformedResourceEntriesForReadOnly as Wa, warnFinchArgvExposure as Wc, deployRefusesOrphanRowsReason as Wi, ccRoutedFinalSnapshotError as Wn, readsNoEchoSource as Wo, DiffCalculator as Wr, CrossPrefixScanCache as Ws, removeProtectionTypeList as Wt, deleteTableWithIndexBusyRetry as X, withheldAccountClause as Xa, Synthesizer as Xc, isReadableResourceEntry as Xi, maskingRetryLogger as Xn, literalSplitDelimitersOf as Xo, applyRoleArnIfSet as Xr, acceptedCreateOnlyDropsOf as Xs, planRollback as Xt, INDEX_SETTLE_POLL_INTERVAL_MS as Y, unreadableResourceEntries as Ya, getDockerImageBySourceHash as Yc, isReadableOrphanRecord as Yi, unsupportedFinalSnapshotError as Yn, hasMaskableValues as Yo, refuseUnreadableCdkCrossAccountRefs as Yr, splitImportedOps as Ys, planFailedOps as Yt, waitForIndexesSettled as Z, findActionableSilentDrops as Za, synthesisStatusMessage as Zc, malformedDriftResourcePropertiesWarning as Zi, constructPathOf as Zn, logOnlyValueCount as Zo, assertFlagRoleArn as Zr, describeRegionValueKind as Zs, recheckFailedPlan as Zt, keptWholeReasonText as _, refuseDivergentRecordRegionForDestroy as _a, BOOTSTRAP_MARKER_PREFIX as _c, classifyReplaySecretRegion as _i, decodeListingKey as _l, secretBearing as _n, configIntegerRefusal as _o, isCustomResource as _r, identityKeyFor as _s, planOrphanAdoption as _t, inheritedProvenanceForChildDiff as a, malformedOrphanRowsKeptWarning as aa, orphansAfterRollback as ac, envCredentialsAreAssumedRole as ai, resolveStateBucketWithDefault as al, inheritProducerRegions as an, MULTI_REGION_RECREATE_BLOCKED_TYPES as ao, DBPROXY_TAGS_WHAT as ar, maskSecretsInText as as, createReadOnlyAttributeHealerFactory as at, chunks as b, refuseMalformedOrphanRecordsForDestroy as ba, getBootstrapMarkerKey as bc, coerceParameterTypedValue as bi, canonicalizeRegion as bl, carriedExportAliasExposure as bn, replayWarn as bo, readsNoEchoDeleteValues as br, recoverMaskedOutput as bs, displacedPhysicalIdShown as bt, isAbsoluteAssetPath as c, malformedOutputsRefusalMessage as ca, AssetPublisher as cc, outputReferenceProvenanceOf as ci, stateBucketExistenceConfirmed as cl, redactedDeleteAddressFields as cn, renderStatefulReason as co, readTagList as cr, snapshotPassProvenance as cs, gray as ct, templateIdentity as d, malformedResourceEntriesWarning as da, WorkGraph as dc, s3BucketArn as di, CFN_TEMPLATE_BODY_LIMIT as dl, updatePartialReason as dn, isWarmThroughputDecrease as do, tagPlanWarning as dr, withPhysicalNameCopies as ds, yellow as dt, malformedLocalOutputsWarning as ea, hasReasonlessBaselineRefusal as ec, isIamRoleArn as ei, loadCdkJson as el, resolveReplacementOldType as en, withoutSilentDropProperties as eo, earliestDefined as er, recordLogOnlyValue as es, hasCdkAutoDeleteTag as et, conditionFingerprint as f, malformedResourcePropertiesWarning as fa, buildAssetRedirectMap as fc, s3BucketDomainName as fi, CFN_TEMPLATE_URL_LIMIT as fl, DeploymentEventsReader as fn, toCfnInteger as fo, definedAttributes as fr, withoutPhysicalNameCopies as fs, computeParameterTaint as ft, isSecretBearingReferenceString as g, previewableOrphanRecords as ga, AssetModeResolver as gc, classifyRecordedSecretRegion as gi, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as gl, exportAliasCollisionScrubWarning as gn, configBooleanRefusal as go, ccBrokenReason as gr, pathCrossesDottedKey as gs, makeSiblingClaimReader as gt, readRecordedConditionVerdicts as h, malformedStateRefusalMessage as ha, rewriteTemplateAssetReferences as hc, s3BucketWebsiteUrl as hi, uploadCfnTemplate as hl, displayTextOrWithheld as hn, coerceCfnInteger as ho, ProviderRegistry as hr, isUncertifiedBaselineMaskPosition as hs, resourcesNamingDeclaredParameter as ht, crossStackOutputProvenanceSource as i, malformedOrphanRecordsWarning as ia, isReadableBag as ic, callerEnvCredentials as ii, resolveSkipPrefix as il, getCurrentProducerRegions as in, shownType as io, acquireIdempotencyToken as ir, maskSecretsInError as is, formatResourceLine as it, noEchoAttributeNamesOf as j, refuseMalformedResourceEntriesForImportSave as ja, describeDockerFailure as jc, isStalePlaceholderArnAttribute as ji, describeFileReadFailure as jl, completedReplayEntries as jn, DagBuilder as jo, UNSPECIFIED_SKIP_REASON as jr, recordProvenPublicExpression as js, deleteJournaledOrphans as jt, withResourceDeadline as k, refuseMalformedResourceEntriesForDestroy as ka, describeDockerCapturedOutput as kc, AWS_NO_VALUE as ki, ownValue as kl, DEFAULT_RESOURCE_TIMEOUT_MS as kn, lambdaFunctionNameForMask as ko, unchangedBehindSecretReference as kr, recordNoEchoAttributeValues as ks, getCurrentNestedStackContext as kt, listNestedTemplateRows as l, malformedOutputsWarning as la, isSensitiveAttributeName as lc, recordedOutputReferenceRegions as li, warnDeprecatedNoPrefixCliFlag as ll, redactedDeleteAddressSkip as ln, WARM_THROUGHPUT_MEMBERS as lo, refuseMalformedDesiredTags as lr, redactSecretsForState as ls, green as lt, parentSuppliedValues as m, malformedScrubResourceEntriesRefusalMessage as ma, loadPublishableAssetManifest as mc, s3BucketRegionalDomainName as mi, findLargeInlineResources as ml, WITHHELD_NAME_DISPLAY as mn, coerceCfnBoolean as mo, CC_BROKEN_REASON as mr, dynamicReferenceTokens as ms, reachableDivergentParameters as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedLocalResourcesWarning as na, importableOutputKeys as nc, AWS_CREDENTIAL_ENV_KEYS as ni, resolveAutoAssetStorage as nl, orphanDeleteNeedsIdentity as nn, hasNoCloudControlHandlers as no, reserveStackCreateToken as nr, createSecretMasker as ns, getPriorAttempts as nt, childTemplateLoader as o, malformedOrphansRefusalMessage as oa, orphansCarriedFrom as oc, isSettledInstanceState as oi, resolveStateBucketWithDefaultAndSource as ol, REDACTED_DELETE_ADDRESS_SKIP_REASON as on, isStatefulRecreateTargetForReplace as oo, DBPROXY_TAG_OPTIONS as or, markSameGenerationBag as os, bold as ot, conditionInputsFrom as p, malformedResourcesWarning as pa, createAssetRedirectResolver as pc, s3BucketDualStackDomainName as pi, MIGRATE_TMP_PREFIX as pl, DeploymentEventsStore as pn, toFiniteNumber as po, stringifyIfAssigned as pr, DYNAMIC_REFERENCE_TOKEN_SCAN as ps, namesAnyDeclaredParameter as pt, resolveDynamoDbDeleteBudgetMs as q, unpreviewableOrphanRecords as qa, stripForDisplay as qc, hasReadableOutputs as qi, isFinalSnapshotError as qn, carryLogOnlyValues as qo, poisonRenderedSpellingsCollidingIn as qr, isAccessDenied$1 as qs, isJournaledOrphan as qt, computeImplicitDeleteEdges as r, malformedOrphanRecordsRefusalMessage as ra, importableOutputs as rc, applyCallerIdentityCredentials as ri, resolveCaptureObservedState as rl, findNestedStackTypeChanges as rn, findReplacedReadersOfRecreateTargets as ro, withCreateTokenLedger as rr, errorCauseChain as rs, markRefusedBeforeApplying as rt, findNestedTemplateTreeDefect as s, malformedOrphansWarning as sa, shouldRetainResource as sc, keepHeldTokenProvenance as si, resolveUseCdkBootstrapAssets as sl, isRedactedRecordedValue as sn, isStatefulRecreateTargetSync as so, planTagDiff as sr, recordReferenceProvenanceEntry as ss, cyan as st, DeployEngine as t, malformedLocalResourceEntriesWarning as ta, hasUnverifiableParameterRefusal as tc, sendableAssumeRoleCommand as ti, resolveApp as tl, seedsDeleteFirstGuard as tn, NO_CC_HANDLERS_REASON as to, ledgerForStack as tr, shareLogOnlyValues as ts, isTruthyCfnBoolean as tt, renderNestedTemplateTreeDefect as u, malformedRenderedContainersWarning as ua, stringifyValue as uc, recordedReferenceRegions as ui, ssmResolvedValueType as ul, updatePartialMessage as un, coerceWarmThroughput as uo, tagMapAsList as ur, scrubResourceRecord as us, red as ut, mergeNoChangeOutputs as v, refuseMalformedNestedChildOutputs as va, assertAssetBucketRegion as vc, producerRegionsFromState as vi, expectedOwnerParam as vl, secretBearingStateKeyWarning as vn, configStringRefusal as vo, wouldReturnToSdkProvider as vr, inheritNestedStackParameterAssociations as vs, NESTED_PENDING_PARENT_REASON as vt, keptForReadoption as w, refuseMalformedOutputs as wa, validateAssetBucketName as wc, isImpossibleEmptyStoredAttribute as wi, processStackMessages as wl, noEchoParameterValueSeed as wn, prefetchCreateOnlyPropertyPaths as wo, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as wr, splitGetAttStringForm as ws, recordDisplacedSkips as wt, isAccessDeniedError as x, refuseMalformedOrphans as xa, isCrossRegionRedirect as xc, isUnboundTemplateParameter as xi, derivePartitionAndUrlSuffix as xl, exportNameNoEchoParameters as xn, requireConfigArray as xo, isCustomResourceType as xr, physicalNameCopiesOf as xs, dropSettledNestedJournals as xt, makeCanonicalizePropertiesFn as y, refuseMalformedOrphanRecords as ya, ensureAssetStorage as yc, regionLessSecretName as yi, PARTITION_TABLE as yl, secretSafeKeyDisplay as yn, readConfigString as yo, TemplateNoEchoReresolver as yr, recordNestedStackParameterExpressions as ys, displacedOpClause as yt, perType as z, refuseMalformedResourcesForExport as za, redactDockerArgvValues as zc, STATE_REGION_DIVERGED as zi, storedSecretNameNeedles as zn, noEchoCoordinatesOf as zo, ec2InstanceProtectionSite as zr, LockManager as zs, replayRollback as zt };
46942
- //# sourceMappingURL=deploy-engine-DWIbDQdg.js.map
47076
+ //# sourceMappingURL=deploy-engine-DZhdwU1d.js.map