@go-to-k/cdkd 0.302.0 → 0.302.1

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 (28) hide show
  1. package/dist/{asg-provider-BRr_hsky.js → asg-provider-BpRcm_UB.js} +4 -4
  2. package/dist/{asg-provider-BRr_hsky.js.map → asg-provider-BpRcm_UB.js.map} +1 -1
  3. package/dist/{aws-failure-text-BDZdavf4.js → aws-failure-text-e_ddrDDo.js} +5 -2
  4. package/dist/{aws-failure-text-BDZdavf4.js.map → aws-failure-text-e_ddrDDo.js.map} +1 -1
  5. package/dist/cli.js +2 -2
  6. package/dist/{deploy-engine-DU0BoQqo.js → deploy-engine-CYVt2NQR.js} +500 -437
  7. package/dist/deploy-engine-CYVt2NQR.js.map +1 -0
  8. package/dist/{iam-policy-targets-Dnk6FCsr.js → iam-policy-targets-CmHNH1DY.js} +17 -4
  9. package/dist/iam-policy-targets-CmHNH1DY.js.map +1 -0
  10. package/dist/{iam-role-provider-WGsb9RxZ.js → iam-role-provider-R1GC6KcT.js} +4 -4
  11. package/dist/{iam-role-provider-WGsb9RxZ.js.map → iam-role-provider-R1GC6KcT.js.map} +1 -1
  12. package/dist/index.d.ts +1 -0
  13. package/dist/index.d.ts.map +1 -1
  14. package/dist/index.js +4 -4
  15. package/dist/{neptune-provider-WE1O3kXY.js → neptune-provider-DzTl6-74.js} +4 -4
  16. package/dist/{neptune-provider-WE1O3kXY.js.map → neptune-provider-DzTl6-74.js.map} +1 -1
  17. package/dist/{program-BVLiidXb.js → program-CvRs5pV_.js} +6 -6
  18. package/dist/{program-BVLiidXb.js.map → program-CvRs5pV_.js.map} +1 -1
  19. package/dist/{provider-classes-CXSiWJVn.js → provider-classes-B2_u4Fg0.js} +181 -70
  20. package/dist/provider-classes-B2_u4Fg0.js.map +1 -0
  21. package/dist/{rds-provider-6RgDTDCV.js → rds-provider-CmKbYAvr.js} +4 -4
  22. package/dist/{rds-provider-6RgDTDCV.js.map → rds-provider-CmKbYAvr.js.map} +1 -1
  23. package/dist/{version-C2XBsD-i.js → version-CaejipV3.js} +2 -2
  24. package/dist/{version-C2XBsD-i.js.map → version-CaejipV3.js.map} +1 -1
  25. package/package.json +1 -1
  26. package/dist/deploy-engine-DU0BoQqo.js.map +0 -1
  27. package/dist/iam-policy-targets-Dnk6FCsr.js.map +0 -1
  28. package/dist/provider-classes-CXSiWJVn.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { r as getAwsClients, s as __exportAll } from "./aws-clients-B_CEQGE1.js";
2
- import { $ as terminalSafe, A as looksLikeCdkdGeneratedName, B as STACK_REF_MAX_CODE_POINTS, D as getCurrentStackInstanceId, E as getCurrentSkipPrefix, F as withStackScope, G as displayIdent, H as asIsMessage, I as withStackScopeBeforeStateRead, J as isPasteableIdent, K as displaySafe, L as withoutGeneratedFallbackName, M as stackInstanceNameSuffix, N as withNameGeneration, O as getCurrentStackName, P as withSkipPrefix, R as SAFE_MSG_ALTERED_CHAR, S as fallbackNamePropertyFor, T as generatedNameFor, V as UNRENDERABLE, W as displayAwsMessage, X as plainIdentOr, Z as safeMsg, a as safeStringify$1, c as isStdoutReservedForPayload, et as truncateCodePoints, f as currentLogLineMasker, k as isNameGeneration, m as getLiveRenderer, n as describeAwsFailure, p as installLogLineMaskerSource, q as displayStackName, s as getLogger, t as VERBOSE_POINTER, v as applyDefaultNameForFallback, w as generateResourceNameWithFallback, x as explicitNamePropertyFor, y as currentNameGeneration, z as SECRET_REF_MAX_CODE_POINTS } from "./aws-failure-text-BDZdavf4.js";
3
- import { $ as protectedReplacementAdvice, $n as markReplayMayCollide, $t as ambientCredentialConfig, A as isQuotableImportValue, An as SHELL_ACTIVE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as shellBoundedDisplay, Bt as formatLockOperation, Cn as StateError, Ct as RETRY_AUXILIARY_OWNER, Dn as normalizeAwsError, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as isInertUnquoted, Ft as UNREPRODUCIBLE_LOCK_CLAUSE, G as runDeleteAttempt, Gn as isUpdateUnsupportedError, Gt as DEFAULT_STATE_PREFIX, H as observeThenDisableProtection, Hn as withheldTargetClause, Ht as recoveryCommandFlags, In as pasteableCommand, It as buildForceUnlockCommand, J as DELETION_PROTECTION_DOC_POINTER, Jn as isNameCollisionErrorFrom, Kn as hasReplayMayCollide, Kt as injectiveKey, L as ProtectionFlipRegistry, Ln as physicalIdShownBesideCommand, M as quotedRemedyLogicalId, Mn as UNSHOWABLE_VALUE, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as commandHole, Ot as hasCreatedBeforeFailure, Pt as replayMadeAnotherResource, Q as pasteableAwsCommand, Qt as ambientClientDefaults, R as compensateProtectionFlip, Rn as plainOrDescribed, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, U as protectionFlipKey, Ut as sanitizeRecoveryValue, Vn as shellQuote, Vt as formatLockOwner, Wt as CUSTOM_RESOURCE_RESPONSE_PREFIX, Xn as isRecreateRetryableError, Yn as isNameCooldownError, Yt as producerRecordKey, Zn as isReplayedNameCollisionFrom, Zt as withPasteableAwsProfile, _r as markRedactedCause, _t as createMaskedLogSinks, ar as formatRetryClassificationSignals, at as startInterruptWatch, bn as ResourceUpdateNotSupportedError, bt as maskDeep, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dr as isTransientServerError, en as clientDefaultsFor, er as relayedNameCollision, f as removalWarning, fr as retryClassificationText, ft as logicalIdShown, gr as markNonRetryable, gt as stateOrphanRecordRemedy, hn as MalformedProducerRecordRefusalError, hr as isThrottlingError, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CdkdError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as SHELL_ACTIVE_WHY, jt as markAuxiliaryFailure, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, ln as DynamicReferenceRegionAmbiguousError, lr as isIamPropagationError, m as withoutInjectedRemovals, mn as MacroExpansionError, mr as isMarkedNonRetryable, mt as resourceTypeShown, nn as AccountIdUnavailableError, nr as stripControlChars, on as CrossAccountSecretRefusalError, or as isAmbiguousCcHandlerErrorCode, ot as ElapsedBudgetRegistry, pn as LockError, rn as AssetError, sn as DependencyError, sr as isAmbiguousOutcomeError, st as monotonicNowMs, tn as credentialFingerprint, tr as escapeRegExp$3, un as IntrinsicResolutionRefusalError, ur as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ProvisioningError, vr as wrapMaskedAwsError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wn as SynthesisError, wt as carryCreatedBeforeFailure, xt as maskerOrIdentity, yn as ResourceTimeoutError, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as quotedOrDescribed, zt as formatLockExpiry } from "./iam-policy-targets-Dnk6FCsr.js";
2
+ import { A as isNameGeneration, B as SECRET_REF_MAX_CODE_POINTS, D as getCurrentStackInstanceId, E as getCurrentSkipPrefix, F as withSkipPrefix, G as displayAwsMessage, H as UNRENDERABLE, I as withStackScope, J as displayStackName, K as displayIdent, L as withStackScopeBeforeStateRead, N as stackInstanceNameSuffix, O as getCurrentStackName, P as withNameGeneration, Q as safeMsg, R as withoutGeneratedFallbackName, S as fallbackNamePropertyFor, T as generatedNameFor, U as asIsMessage, V as STACK_REF_MAX_CODE_POINTS, Y as isPasteableIdent, Z as plainIdentOr, a as safeStringify$1, c as isStdoutReservedForPayload, et as terminalSafe, f as currentLogLineMasker, j as looksLikeCdkdGeneratedName, m as getLiveRenderer, n as describeAwsFailure, p as installLogLineMaskerSource, q as displaySafe, s as getLogger, t as VERBOSE_POINTER, tt as truncateCodePoints, v as applyDefaultNameForFallback, w as generateResourceNameWithFallback, x as explicitNamePropertyFor, y as currentNameGeneration, z as SAFE_MSG_ALTERED_CHAR } from "./aws-failure-text-e_ddrDDo.js";
3
+ import { $ as protectedReplacementAdvice, $n as isReplayedNameCollisionFrom, $t as ambientCredentialConfig, A as isQuotableImportValue, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as plainOrDescribed, Bt as formatLockOperation, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as commandHole, Ft as UNREPRODUCIBLE_LOCK_CLAUSE, G as runDeleteAttempt, Gt as DEFAULT_STATE_PREFIX, H as observeThenDisableProtection, Hn as shellBoundedDisplay, Ht as recoveryCommandFlags, It as buildForceUnlockCommand, J as DELETION_PROTECTION_DOC_POINTER, Jn as hasReplayMayCollide, Kt as injectiveKey, L as ProtectionFlipRegistry, Ln as isInertUnquoted, M as quotedRemedyLogicalId, Mn as SHELL_ACTIVE, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as SHELL_ACTIVE_WHY, On as isSoftAbort, Ot as hasCreatedBeforeFailure, Pn as UNSHOWABLE_VALUE, Pt as replayMadeAnotherResource, Q as pasteableAwsCommand, Qn as isRecreateRetryableError, Qt as ambientClientDefaults, R as compensateProtectionFlip, Rn as pasteableCommand, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as SynthesisError, U as protectionFlipKey, Un as shellQuote, Ut as sanitizeRecoveryValue, Vn as quotedOrDescribed, Vt as formatLockOwner, Wn as withheldTargetClause, Wt as CUSTOM_RESOURCE_RESPONSE_PREFIX, Xn as isNameCollisionErrorFrom, Yt as producerRecordKey, Zn as isNameCooldownError, Zt as withPasteableAwsProfile, _r as isThrottlingError, _t as createMaskedLogSinks, at as startInterruptWatch, bn as ResourceTimeoutError, br as wrapMaskedAwsError, bt as maskDeep, cr as isAmbiguousCcHandlerErrorCode, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as IntrinsicResolutionRefusalError, dr as isIamPropagationError, en as clientDefaultsFor, f as removalWarning, fr as isRetryableTransientError, ft as logicalIdShown, gn as MalformedProducerRecordRefusalError, gr as isMarkedNonRetryable, gt as stateOrphanRecordRemedy, hn as MacroExpansionError, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CdkdError, ir as stripControlChars, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jt as markAuxiliaryFailure, kn as normalizeAwsError, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, ln as DeploymentNotApprovedError, lr as isAmbiguousOutcomeError, m as withoutInjectedRemovals, mn as LockError, mr as retryClassificationText, mt as resourceTypeShown, nn as AccountIdUnavailableError, nr as relayedNameCollision, on as CrossAccountSecretRefusalError, ot as ElapsedBudgetRegistry, pr as isTransientServerError, qn as isUpdateUnsupportedError, rn as AssetError, rr as escapeRegExp$3, sn as DependencyError, sr as formatRetryClassificationSignals, st as monotonicNowMs, tn as credentialFingerprint, tr as markReplayMayCollide, un as DynamicReferenceRegionAmbiguousError, ut as compositeIdSeparatorRefusal, vr as markNonRetryable, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wn as StateError, wt as carryCreatedBeforeFailure, xn as ResourceUpdateNotSupportedError, xt as maskerOrIdentity, yn as ProvisioningError, yr as markRedactedCause, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as physicalIdShownBesideCommand, zt as formatLockExpiry } from "./iam-policy-targets-CmHNH1DY.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-C2XBsD-i.js";
5
+ import { t as getCdkdVersion } from "./version-CaejipV3.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";
@@ -4577,7 +4577,8 @@ var WorkGraph = class {
4577
4577
  nodeId: node.id,
4578
4578
  error
4579
4579
  });
4580
- this.logger.error(`Failed: ${node.id}: ${describeAwsFailure(error).detail}`);
4580
+ if (isSoftAbort(error)) this.logger.debug(safeMsg`Not approved: ${node.id}`);
4581
+ else this.logger.error(`Failed: ${node.id}: ${describeAwsFailure(error).detail}`);
4581
4582
  }).finally(() => {
4582
4583
  active[node.type]--;
4583
4584
  dispatch();
@@ -4591,6 +4592,12 @@ var WorkGraph = class {
4591
4592
  }
4592
4593
  if (errors.length > 0) {
4593
4594
  const skippedCount = [...this.nodes.values()].filter((n) => n.state === "skipped").length;
4595
+ if (errors.every((e) => isSoftAbort(e.error))) {
4596
+ const lines = errors.map((e) => e.error.message);
4597
+ if (skippedCount > 0) lines.push(`${skippedCount} node(s) depending on a declined stack were skipped.`);
4598
+ reject(errors.length === 1 && skippedCount === 0 ? errors[0].error : new DeploymentNotApprovedError(lines.join("\n")));
4599
+ return;
4600
+ }
4594
4601
  const msg = errors.map((e) => ` - ${e.nodeId}: ${describeAwsFailure(e.error).detail}`).join("\n");
4595
4602
  reject(/* @__PURE__ */ new Error(`${errors.length} node(s) failed${skippedCount > 0 ? `, ${skippedCount} skipped` : ""}:\n${msg}`));
4596
4603
  return;
@@ -27421,7 +27428,7 @@ var CloudControlProvider = class {
27421
27428
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
27422
27429
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
27423
27430
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
27424
- const { ASGProvider } = await import("./asg-provider-BRr_hsky.js");
27431
+ const { ASGProvider } = await import("./asg-provider-BpRcm_UB.js");
27425
27432
  const delegateRegion = ambientRegion();
27426
27433
  let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
27427
27434
  if (asgProvider === void 0) {
@@ -27527,7 +27534,7 @@ var CloudControlProvider = class {
27527
27534
  const family = SDK_DELETE_FAMILIES.get(resourceType);
27528
27535
  const cached = this.sdkDeleteDelegates.get(family);
27529
27536
  if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
27530
- const provider = family === "rds" ? new (await (import("./rds-provider-6RgDTDCV.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-WE1O3kXY.js"))).NeptuneProvider({ region: ccRegion });
27537
+ const provider = family === "rds" ? new (await (import("./rds-provider-CmKbYAvr.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-DzTl6-74.js"))).NeptuneProvider({ region: ccRegion });
27531
27538
  this.sdkDeleteDelegates.set(family, {
27532
27539
  region: ccRegion,
27533
27540
  provider
@@ -32223,6 +32230,443 @@ function isRefusedByName(error) {
32223
32230
  return false;
32224
32231
  }
32225
32232
 
32233
+ //#endregion
32234
+ //#region src/types/deployment-events.ts
32235
+ function extractDeploymentEventError(err) {
32236
+ if (!(err instanceof Error)) return {
32237
+ name: "UnknownError",
32238
+ message: safeStringify$1(err)
32239
+ };
32240
+ const result = {
32241
+ name: err.name || "Error",
32242
+ message: err.message
32243
+ };
32244
+ let current = err;
32245
+ for (let depth = 0; depth < 10 && current instanceof Error; depth++) {
32246
+ const maybeAws = current;
32247
+ if (maybeAws.$metadata !== void 0) {
32248
+ const code = maybeAws.Code ?? maybeAws.name;
32249
+ if (code) result.awsErrorCode = code;
32250
+ if (maybeAws.$metadata.requestId) result.requestId = maybeAws.$metadata.requestId;
32251
+ }
32252
+ current = current.cause;
32253
+ }
32254
+ return result;
32255
+ }
32256
+
32257
+ //#endregion
32258
+ //#region src/state/deployment-events-store.ts
32259
+ const DEPLOYMENT_EVENTS_MAX_INDEX_RUNS = 20;
32260
+ const FLUSH_INTERVAL_MS = 2e3;
32261
+ const FLUSH_EVENT_THRESHOLD = 50;
32262
+ function newDeploymentRunId(now = /* @__PURE__ */ new Date()) {
32263
+ return `${now.toISOString().replace(/[-:.]/g, "")}-${randomUUID().slice(0, 8)}`;
32264
+ }
32265
+ function deploymentEventsKey(prefix, stackName, region, runId) {
32266
+ return `${prefix}/${stackName}/${region}/deployments/${runId}.jsonl`;
32267
+ }
32268
+ function deploymentEventsIndexKey(prefix, stackName, region) {
32269
+ return `${prefix}/${stackName}/${region}/deployments/index.json`;
32270
+ }
32271
+ function deploymentsDirPrefix(prefix, stackName, region) {
32272
+ return `${prefix}/${stackName}/${region}/deployments/`;
32273
+ }
32274
+ const DEPLOYMENT_EVENTS_OBJECT_DESCRIPTION = "deployment-event streams and their index, whose recorded error messages can quote values the secret mask does not catch";
32275
+ async function deleteAndPurgeEventObjects(backend, keys, dirPrefix, scope = "deleted-keys") {
32276
+ if (keys.length === 0) return void 0;
32277
+ let swept;
32278
+ try {
32279
+ await backend.deleteRawObjects(keys);
32280
+ } finally {
32281
+ if (scope === "whole-dir") swept = await backend.purgeNoncurrentVersionsUnderPrefix(dirPrefix, { objectDescription: DEPLOYMENT_EVENTS_OBJECT_DESCRIPTION });
32282
+ else await backend.purgeNoncurrentVersions(keys, {
32283
+ ...keys.length > 1 && { listPrefix: dirPrefix },
32284
+ objectDescription: DEPLOYMENT_EVENTS_OBJECT_DESCRIPTION
32285
+ });
32286
+ }
32287
+ return swept;
32288
+ }
32289
+ function runIdTimestampMs(runId) {
32290
+ const m = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(\d{3})Z/.exec(runId);
32291
+ if (!m) return null;
32292
+ const iso = `${m[1]}-${m[2]}-${m[3]}T${m[4]}:${m[5]}:${m[6]}.${m[7]}Z`;
32293
+ const ms = Date.parse(iso);
32294
+ return Number.isNaN(ms) ? null : ms;
32295
+ }
32296
+ function runIdFromJsonlKey(key, dirPrefix) {
32297
+ if (!key.startsWith(dirPrefix) || !key.endsWith(".jsonl")) return null;
32298
+ return key.slice(dirPrefix.length, -6);
32299
+ }
32300
+ var DeploymentEventsStore = class {
32301
+ logger = getLogger().child("DeploymentEvents");
32302
+ backend;
32303
+ stackName;
32304
+ region;
32305
+ command;
32306
+ runId;
32307
+ cdkdVersion;
32308
+ startedAt;
32309
+ events = [];
32310
+ persistedCount = 0;
32311
+ flushTimer;
32312
+ writeChain = Promise.resolve();
32313
+ warnedOnce = false;
32314
+ finalized = false;
32315
+ constructor(backend, options) {
32316
+ this.backend = backend;
32317
+ this.stackName = options.stackName;
32318
+ this.region = options.region;
32319
+ this.command = options.command;
32320
+ this.runId = options.runId ?? newDeploymentRunId();
32321
+ this.cdkdVersion = options.cdkdVersion ?? getCdkdVersion();
32322
+ this.startedAt = (/* @__PURE__ */ new Date()).toISOString();
32323
+ }
32324
+ record(event) {
32325
+ try {
32326
+ if (this.finalized) return;
32327
+ this.events.push({
32328
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
32329
+ ...event
32330
+ });
32331
+ if (this.events.length - this.persistedCount >= FLUSH_EVENT_THRESHOLD) this.scheduleFlush(0);
32332
+ else this.scheduleFlush(FLUSH_INTERVAL_MS);
32333
+ } catch {}
32334
+ }
32335
+ async finalize(result) {
32336
+ if (this.finalized) return;
32337
+ this.finalized = true;
32338
+ if (this.flushTimer) {
32339
+ clearTimeout(this.flushTimer);
32340
+ this.flushTimer = void 0;
32341
+ }
32342
+ if (this.events.length === 0) return;
32343
+ await this.enqueueWrite(async () => {
32344
+ const indexRead = this.readIndexRuns();
32345
+ indexRead.catch(() => {});
32346
+ await this.doFlush();
32347
+ await this.writeIndexAndPrune(result, await indexRead);
32348
+ });
32349
+ }
32350
+ async writeIndexAndPrune(result, existingRuns) {
32351
+ const { key, file, runs } = this.buildIndexUpdate(result, existingRuns);
32352
+ const keptRunIds = runs.map((r) => r.runId);
32353
+ const willPrune = keptRunIds.length >= 20;
32354
+ const dirPrefix = deploymentsDirPrefix(this.backend.prefix, this.stackName, this.region);
32355
+ const staleKeysRead = willPrune ? this.backend.listRawKeys(dirPrefix) : void 0;
32356
+ staleKeysRead?.catch(() => {});
32357
+ await this.backend.putRawObject(key, JSON.stringify(file, null, 2));
32358
+ if (!staleKeysRead) return;
32359
+ await this.pruneSupersededRunFiles(keptRunIds, dirPrefix, await staleKeysRead);
32360
+ }
32361
+ async drain() {
32362
+ await this.writeChain;
32363
+ }
32364
+ scheduleFlush(delayMs) {
32365
+ if (this.flushTimer) {
32366
+ if (delayMs > 0) return;
32367
+ clearTimeout(this.flushTimer);
32368
+ }
32369
+ this.flushTimer = setTimeout(() => {
32370
+ this.flushTimer = void 0;
32371
+ this.enqueueWrite(() => this.doFlush());
32372
+ }, delayMs);
32373
+ this.flushTimer.unref?.();
32374
+ }
32375
+ enqueueWrite(op) {
32376
+ const next = this.writeChain.then(op).catch((err) => {
32377
+ this.warnOnce(`Failed to persist deployment events for run ${this.runId}: ${describeAwsFailure(err).detail}`);
32378
+ });
32379
+ this.writeChain = next;
32380
+ return next;
32381
+ }
32382
+ async doFlush() {
32383
+ if (this.events.length === 0 || this.events.length === this.persistedCount) return;
32384
+ const snapshotCount = this.events.length;
32385
+ const body = this.events.slice(0, snapshotCount).map((e) => JSON.stringify(e)).join("\n");
32386
+ await this.backend.putRawObject(deploymentEventsKey(this.backend.prefix, this.stackName, this.region, this.runId), body + "\n", "application/x-ndjson");
32387
+ this.persistedCount = snapshotCount;
32388
+ }
32389
+ async readIndexRuns() {
32390
+ const key = deploymentEventsIndexKey(this.backend.prefix, this.stackName, this.region);
32391
+ try {
32392
+ const raw = await this.backend.getRawObject(key);
32393
+ if (raw !== null) {
32394
+ const parsed = JSON.parse(raw);
32395
+ if (Array.isArray(parsed.runs)) return parsed.runs;
32396
+ }
32397
+ } catch (err) {
32398
+ this.logger.debug(`Deployment-events index unreadable, rewriting: ${describeAwsFailure(err).detail}`);
32399
+ }
32400
+ return [];
32401
+ }
32402
+ buildIndexUpdate(result, existingRuns) {
32403
+ const key = deploymentEventsIndexKey(this.backend.prefix, this.stackName, this.region);
32404
+ const runs = [{
32405
+ runId: this.runId,
32406
+ command: this.command,
32407
+ cdkdVersion: this.cdkdVersion,
32408
+ startedAt: this.startedAt,
32409
+ finishedAt: (/* @__PURE__ */ new Date()).toISOString(),
32410
+ result,
32411
+ eventCount: this.persistedCount
32412
+ }, ...existingRuns.filter((r) => r.runId !== this.runId)].slice(0, 20);
32413
+ return {
32414
+ key,
32415
+ file: {
32416
+ indexVersion: 1,
32417
+ stackName: this.stackName,
32418
+ region: this.region,
32419
+ runs,
32420
+ lastModified: Date.now()
32421
+ },
32422
+ runs
32423
+ };
32424
+ }
32425
+ async pruneSupersededRunFiles(keptRunIds, dirPrefix, keys) {
32426
+ if (keptRunIds.length < 20) return;
32427
+ const cutoff = keptRunIds.reduce((min, id) => id < min ? id : min, keptRunIds[0]);
32428
+ const stale = keys.filter((k) => {
32429
+ const runId = runIdFromJsonlKey(k, dirPrefix);
32430
+ return runId !== null && runId < cutoff;
32431
+ });
32432
+ if (stale.length === 0) return;
32433
+ await deleteAndPurgeEventObjects(this.backend, stale, dirPrefix);
32434
+ this.logger.debug(`Pruned ${stale.length} superseded deployment-event stream(s) for ${this.stackName} (${this.region})`);
32435
+ }
32436
+ warnOnce(message) {
32437
+ if (this.warnedOnce) {
32438
+ this.logger.debug(message);
32439
+ return;
32440
+ }
32441
+ this.warnedOnce = true;
32442
+ this.logger.warn(`${message} — continuing; deployment events are best-effort and never block the run.`);
32443
+ }
32444
+ };
32445
+ var DeploymentEventsReader = class {
32446
+ backend;
32447
+ constructor(backend) {
32448
+ this.backend = backend;
32449
+ }
32450
+ async listRegions(stackName) {
32451
+ const prefix = `${this.backend.prefix}/${stackName}/`;
32452
+ const keys = await this.backend.listRawKeys(prefix);
32453
+ const regions = /* @__PURE__ */ new Set();
32454
+ for (const key of keys) {
32455
+ const segments = key.slice(prefix.length).split("/");
32456
+ if (segments.length === 3 && segments[1] === "deployments" && segments[0]) regions.add(segments[0]);
32457
+ }
32458
+ return [...regions].sort();
32459
+ }
32460
+ async listRuns(stackName, region) {
32461
+ const key = deploymentEventsIndexKey(this.backend.prefix, stackName, region);
32462
+ try {
32463
+ const raw = await this.backend.getRawObject(key);
32464
+ if (raw !== null) {
32465
+ const parsed = JSON.parse(raw);
32466
+ if (Array.isArray(parsed.runs)) return parsed.runs;
32467
+ }
32468
+ } catch {}
32469
+ const dirPrefix = `${this.backend.prefix}/${stackName}/${region}/deployments/`;
32470
+ const runIds = (await this.backend.listRawKeys(dirPrefix)).filter((k) => k.endsWith(".jsonl")).map((k) => k.slice(dirPrefix.length, -6)).sort().reverse();
32471
+ return Promise.all(runIds.map((runId) => this.summarizeRunFromJsonl(stackName, region, runId)));
32472
+ }
32473
+ async summarizeRunFromJsonl(stackName, region, runId) {
32474
+ const fallback = {
32475
+ runId,
32476
+ command: "deploy",
32477
+ cdkdVersion: "unknown",
32478
+ startedAt: "",
32479
+ finishedAt: "",
32480
+ result: "UNKNOWN",
32481
+ eventCount: 0
32482
+ };
32483
+ let events = null;
32484
+ try {
32485
+ events = await this.readRunEvents(stackName, region, runId);
32486
+ } catch {
32487
+ return fallback;
32488
+ }
32489
+ if (events === null || events.length === 0) return fallback;
32490
+ const started = events.find((e) => e.eventType === "RUN_STARTED");
32491
+ let finished;
32492
+ for (const e of events) if (e.eventType === "RUN_FINISHED") finished = e;
32493
+ return {
32494
+ runId,
32495
+ command: started?.command ?? fallback.command,
32496
+ cdkdVersion: started?.cdkdVersion ?? fallback.cdkdVersion,
32497
+ startedAt: started?.timestamp ?? fallback.startedAt,
32498
+ finishedAt: finished?.timestamp ?? fallback.finishedAt,
32499
+ result: finished?.result ?? "UNKNOWN",
32500
+ eventCount: events.length
32501
+ };
32502
+ }
32503
+ async readRunEvents(stackName, region, runId) {
32504
+ const key = deploymentEventsKey(this.backend.prefix, stackName, region, runId);
32505
+ const raw = await this.backend.getRawObject(key);
32506
+ if (raw === null) return null;
32507
+ const events = [];
32508
+ for (const line of raw.split("\n")) {
32509
+ const trimmed = line.trim();
32510
+ if (!trimmed) continue;
32511
+ try {
32512
+ events.push(JSON.parse(trimmed));
32513
+ } catch {}
32514
+ }
32515
+ return events;
32516
+ }
32517
+ async pruneRuns(stackName, region, opts = {}) {
32518
+ const dirPrefix = deploymentsDirPrefix(this.backend.prefix, stackName, region);
32519
+ const keys = await this.backend.listRawKeys(dirPrefix);
32520
+ const runIdsDesc = keys.map((k) => runIdFromJsonlKey(k, dirPrefix)).filter((id) => id !== null).sort().reverse();
32521
+ const indexKey = deploymentEventsIndexKey(this.backend.prefix, stackName, region);
32522
+ const indexExisted = keys.includes(indexKey);
32523
+ if (opts.all === true) {
32524
+ const toDelete = runIdsDesc.map((id) => deploymentEventsKey(this.backend.prefix, stackName, region, id));
32525
+ const earlierVersions = await deleteAndPurgeEventObjects(this.backend, [...toDelete, indexKey], dirPrefix, "whole-dir");
32526
+ return {
32527
+ deletedRunIds: runIdsDesc,
32528
+ remainingRunIds: [],
32529
+ indexDeleted: indexExisted,
32530
+ ...earlierVersions !== void 0 && { earlierVersions }
32531
+ };
32532
+ }
32533
+ const noGuards = opts.keep === void 0 && opts.olderThanMs === void 0;
32534
+ const keep = opts.keep ?? (noGuards ? 20 : void 0);
32535
+ const protectedByCount = keep === void 0 ? /* @__PURE__ */ new Set() : new Set(runIdsDesc.slice(0, keep));
32536
+ let candidates = runIdsDesc.filter((id) => !protectedByCount.has(id));
32537
+ if (opts.olderThanMs !== void 0) {
32538
+ const cutoff = (opts.now ?? /* @__PURE__ */ new Date()).getTime() - opts.olderThanMs;
32539
+ candidates = candidates.filter((id) => {
32540
+ const t = runIdTimestampMs(id);
32541
+ return t !== null && t < cutoff;
32542
+ });
32543
+ }
32544
+ if (candidates.length === 0) return {
32545
+ deletedRunIds: [],
32546
+ remainingRunIds: runIdsDesc,
32547
+ indexDeleted: false
32548
+ };
32549
+ const deletedSet = new Set(candidates);
32550
+ const deleteKeys = candidates.map((id) => deploymentEventsKey(this.backend.prefix, stackName, region, id));
32551
+ const remainingRunIds = runIdsDesc.filter((id) => !deletedSet.has(id));
32552
+ if (remainingRunIds.length === 0) {
32553
+ await deleteAndPurgeEventObjects(this.backend, [...deleteKeys, indexKey], dirPrefix);
32554
+ return {
32555
+ deletedRunIds: candidates,
32556
+ remainingRunIds,
32557
+ indexDeleted: indexExisted
32558
+ };
32559
+ }
32560
+ await this.rewriteIndexAfterPrune(indexKey, stackName, region, deletedSet);
32561
+ await deleteAndPurgeEventObjects(this.backend, deleteKeys, dirPrefix);
32562
+ return {
32563
+ deletedRunIds: candidates,
32564
+ remainingRunIds,
32565
+ indexDeleted: false
32566
+ };
32567
+ }
32568
+ async rewriteIndexAfterPrune(indexKey, stackName, region, deletedRunIds) {
32569
+ let raw;
32570
+ try {
32571
+ raw = await this.backend.getRawObject(indexKey);
32572
+ } catch {
32573
+ return;
32574
+ }
32575
+ if (raw === null) return;
32576
+ let parsed;
32577
+ try {
32578
+ parsed = JSON.parse(raw);
32579
+ } catch {
32580
+ return;
32581
+ }
32582
+ if (!Array.isArray(parsed.runs)) return;
32583
+ const remaining = parsed.runs.filter((r) => !deletedRunIds.has(r.runId));
32584
+ if (remaining.length === parsed.runs.length) return;
32585
+ const file = {
32586
+ indexVersion: 1,
32587
+ stackName,
32588
+ region,
32589
+ runs: remaining,
32590
+ lastModified: Date.now()
32591
+ };
32592
+ await this.backend.putRawObject(indexKey, JSON.stringify(file, null, 2));
32593
+ }
32594
+ };
32595
+
32596
+ //#endregion
32597
+ //#region src/deployment/kept-in-history.ts
32598
+ function keptInEarlierRecords(records) {
32599
+ const out = [];
32600
+ for (const record of records) for (const [logicalId, raw] of Object.entries(record.resources)) {
32601
+ if (raw === null || typeof raw !== "object") continue;
32602
+ const r = raw;
32603
+ if (typeof r.resourceType !== "string" || typeof r.physicalId !== "string") continue;
32604
+ if (r.physicalId === "") continue;
32605
+ if (!shouldRetainResource(r.deletionPolicy)) continue;
32606
+ out.push({
32607
+ logicalId,
32608
+ resourceType: r.resourceType,
32609
+ physicalId: r.physicalId,
32610
+ ...record.writtenAt !== void 0 && { keptAt: record.writtenAt }
32611
+ });
32612
+ }
32613
+ return out;
32614
+ }
32615
+ function keptInEventHistory(runs, stackName) {
32616
+ const made = /* @__PURE__ */ new Map();
32617
+ const out = [];
32618
+ for (const events of runs) for (const e of events) {
32619
+ if (e.stackName !== stackName || typeof e.logicalId !== "string") continue;
32620
+ if (typeof e.resourceType !== "string") continue;
32621
+ if (e.eventType === "RESOURCE_SUCCEEDED" && (e.operation === "CREATE" || e.operation === "UPDATE") && typeof e.physicalId === "string" && e.physicalId !== "") made.set(e.logicalId, {
32622
+ resourceType: e.resourceType,
32623
+ physicalId: e.physicalId
32624
+ });
32625
+ else if (e.eventType === "RESOURCE_RETAINED") {
32626
+ const m = made.get(e.logicalId);
32627
+ if (m !== void 0 && m.resourceType === e.resourceType) {
32628
+ const keptAt = Date.parse(e.timestamp);
32629
+ out.push({
32630
+ logicalId: e.logicalId,
32631
+ ...m,
32632
+ ...Number.isFinite(keptAt) && { keptAt }
32633
+ });
32634
+ }
32635
+ }
32636
+ }
32637
+ return out;
32638
+ }
32639
+ async function loadKeptInHistory(sources, stackName, region) {
32640
+ const [records, runs] = await Promise.all([sources.earlierStateResources(stackName, region).catch(() => []), readRecentRuns(sources, stackName, region)]);
32641
+ return [...keptInEarlierRecords(records), ...keptInEventHistory(runs, stackName)];
32642
+ }
32643
+ async function readRecentRuns(sources, stackName, region) {
32644
+ const runsOf = stackName.split("~")[0];
32645
+ return (async () => {
32646
+ const listed = (await sources.listRuns(runsOf, region)).slice(0, 20);
32647
+ return (await Promise.all(listed.map((r) => sources.readRunEvents(runsOf, region, r.runId).catch(() => null)))).filter((e) => e !== null).reverse();
32648
+ })().catch(() => []);
32649
+ }
32650
+ const RETAINED_SURVIVOR_REASON_PREFIX = "UpdateReplacePolicy: Retain kept the replacement's new";
32651
+ function rollbackRetainedInEventHistory(runs, stackName) {
32652
+ const out = [];
32653
+ for (const events of runs) for (const e of events) {
32654
+ if (e.stackName !== stackName || e.eventType !== "ROLLBACK_RESOURCE_SUCCEEDED") continue;
32655
+ if (typeof e.logicalId !== "string" || typeof e.resourceType !== "string") continue;
32656
+ if (typeof e.physicalId !== "string" || e.physicalId === "") continue;
32657
+ if (typeof e.reason !== "string" || !e.reason.startsWith("UpdateReplacePolicy: Retain kept the replacement's new")) continue;
32658
+ out.push({
32659
+ logicalId: e.logicalId,
32660
+ resourceType: e.resourceType,
32661
+ physicalId: e.physicalId
32662
+ });
32663
+ }
32664
+ return out;
32665
+ }
32666
+ async function loadRollbackRetainedCopies(sources, stackName, region) {
32667
+ return rollbackRetainedInEventHistory(await readRecentRuns(sources, stackName, region), stackName);
32668
+ }
32669
+
32226
32670
  //#endregion
32227
32671
  //#region src/provisioning/providers/idempotency-token.ts
32228
32672
  const PROCESS_NONCE = randomUUID();
@@ -33088,30 +33532,6 @@ async function createReplicationGroupFinalSnapshot(client, replicationGroupId, l
33088
33532
  });
33089
33533
  }
33090
33534
 
33091
- //#endregion
33092
- //#region src/types/deployment-events.ts
33093
- function extractDeploymentEventError(err) {
33094
- if (!(err instanceof Error)) return {
33095
- name: "UnknownError",
33096
- message: safeStringify$1(err)
33097
- };
33098
- const result = {
33099
- name: err.name || "Error",
33100
- message: err.message
33101
- };
33102
- let current = err;
33103
- for (let depth = 0; depth < 10 && current instanceof Error; depth++) {
33104
- const maybeAws = current;
33105
- if (maybeAws.$metadata !== void 0) {
33106
- const code = maybeAws.Code ?? maybeAws.name;
33107
- if (code) result.awsErrorCode = code;
33108
- if (maybeAws.$metadata.requestId) result.requestId = maybeAws.$metadata.requestId;
33109
- }
33110
- current = current.cause;
33111
- }
33112
- return result;
33113
- }
33114
-
33115
33535
  //#endregion
33116
33536
  //#region src/deployment/rollback-executor/types.ts
33117
33537
  const NESTED_STACK_RESOURCE_TYPE$1 = "AWS::CloudFormation::Stack";
@@ -33307,7 +33727,7 @@ function retainedSurvivorMessages(logicalId, resourceType, survivorPhysicalId, s
33307
33727
  const clause = mask(stateClause);
33308
33728
  return {
33309
33729
  warn: ` ⚠ ${safe(logicalId)} (${safe(resourceType)}) has UpdateReplacePolicy: Retain — the replacement's new physical resource (${displaySafe(survivorId)}) is RETAINED by this rollback and is no longer tracked by cdkd: it keeps running and incurring cost, and destroying the stack will not remove it. Delete it yourself once you no longer need it. ${displaySafe(clause)}`,
33310
- reason: `UpdateReplacePolicy: Retain kept the replacement's new ${resourceType} (${survivorId}); it is live, still billing, and no longer tracked by cdkd. ${clause}`
33730
+ reason: `${RETAINED_SURVIVOR_REASON_PREFIX} ${resourceType} (${survivorId}); it is live, still billing, and no longer tracked by cdkd. ${clause}`
33311
33731
  };
33312
33732
  }
33313
33733
 
@@ -34944,7 +35364,8 @@ async function checkedReplacementNameChange(deps, input) {
34944
35364
  }
34945
35365
  if (found === null) return change;
34946
35366
  if (!typeChanged && probeFoundSameId(resourceType, found.physicalId, currentResource.physicalId)) return;
34947
- throw markNonRetryable(new CdkdError(maskName(`${subject} requires replacement, and another existing resource (${displaySafe(found.physicalId)}) already holds the name it asks for. ${renderReplacementNameChange(change, input.createProps)}. Since ${adoptsText}, creating the replacement would take that resource over and record it as this stack's. Nothing was created or deleted. Choose a name no other resource holds, or delete the resource holding it if it is yours.`), "NAMED_REPLACEMENT_COLLISION"));
35367
+ const remedy = (await deps.rollbackRetainedCopies?.(input.stackName).catch(() => []) ?? []).some((copy) => copy.logicalId === logicalId && copy.resourceType === resourceType && probeFoundSameId(resourceType, copy.physicalId, found.physicalId)) ? `This stack's event history records that a rolled-back deploy kept ${displaySafe(logicalId)}'s replacement under this name because of UpdateReplacePolicy: Retain, as CloudFormation also does, untracked by cdkd. If the holder is that copy and you no longer need it, delete it; otherwise choose another name.` : `Choose a name no other resource holds, or delete the resource holding it if it is yours.`;
35368
+ throw markNonRetryable(new CdkdError(maskName(`${subject} requires replacement, and another existing resource (${displaySafe(found.physicalId)}) already holds the name it asks for. ${renderReplacementNameChange(change, input.createProps)}. Since ${adoptsText}, creating the replacement would take that resource over and record it as this stack's. Nothing was created or deleted. ${remedy}`), "NAMED_REPLACEMENT_COLLISION"));
34948
35369
  }
34949
35370
  async function createFirstThenDeleteOld(run, deps, input) {
34950
35371
  const { logicalId, resourceType, currentResource, secrets } = input;
@@ -36392,6 +36813,7 @@ function isPlainRecord$1(value) {
36392
36813
  //#endregion
36393
36814
  //#region src/deployment/type-change-guard.ts
36394
36815
  function equalIdNamesDifferentResources(input) {
36816
+ if (input.resourceType === "AWS::Lambda::Permission") return permissionsOnDifferentFunctions(input.oldProperties, input.newProperties);
36395
36817
  if (input.resourceType !== "AWS::Glue::Table" || input.physicalId === void 0) return false;
36396
36818
  const oldDb = input.oldProperties?.["DatabaseName"];
36397
36819
  const newDb = input.newProperties?.["DatabaseName"];
@@ -36400,6 +36822,15 @@ function equalIdNamesDifferentResources(input) {
36400
36822
  if (segmentAfterAnchor(input.physicalId, oldDb) === void 0 || segmentAfterAnchor(input.physicalId, newDb) === void 0) return false;
36401
36823
  return oldDb !== newDb;
36402
36824
  }
36825
+ function permissionsOnDifferentFunctions(oldProperties, newProperties) {
36826
+ const oldFn = oldProperties?.["FunctionName"];
36827
+ const newFn = newProperties?.["FunctionName"];
36828
+ if (typeof oldFn !== "string" || typeof newFn !== "string") return false;
36829
+ if (carriesSecretMask(oldFn) || carriesSecretMask(newFn)) return false;
36830
+ const oldName = parseLambdaFunctionAddress(oldFn)?.name;
36831
+ const newName = parseLambdaFunctionAddress(newFn)?.name;
36832
+ return oldName !== void 0 && newName !== void 0 && oldName !== newName;
36833
+ }
36403
36834
  function equalIdNamesSameResource(input) {
36404
36835
  if (input.oldType === input.newType) return !equalIdNamesDifferentResources({
36405
36836
  resourceType: input.oldType,
@@ -40786,345 +41217,6 @@ function withoutPendingRequest(op) {
40786
41217
  return rest;
40787
41218
  }
40788
41219
 
40789
- //#endregion
40790
- //#region src/state/deployment-events-store.ts
40791
- const DEPLOYMENT_EVENTS_MAX_INDEX_RUNS = 20;
40792
- const FLUSH_INTERVAL_MS = 2e3;
40793
- const FLUSH_EVENT_THRESHOLD = 50;
40794
- function newDeploymentRunId(now = /* @__PURE__ */ new Date()) {
40795
- return `${now.toISOString().replace(/[-:.]/g, "")}-${randomUUID().slice(0, 8)}`;
40796
- }
40797
- function deploymentEventsKey(prefix, stackName, region, runId) {
40798
- return `${prefix}/${stackName}/${region}/deployments/${runId}.jsonl`;
40799
- }
40800
- function deploymentEventsIndexKey(prefix, stackName, region) {
40801
- return `${prefix}/${stackName}/${region}/deployments/index.json`;
40802
- }
40803
- function deploymentsDirPrefix(prefix, stackName, region) {
40804
- return `${prefix}/${stackName}/${region}/deployments/`;
40805
- }
40806
- const DEPLOYMENT_EVENTS_OBJECT_DESCRIPTION = "deployment-event streams and their index, whose recorded error messages can quote values the secret mask does not catch";
40807
- async function deleteAndPurgeEventObjects(backend, keys, dirPrefix, scope = "deleted-keys") {
40808
- if (keys.length === 0) return void 0;
40809
- let swept;
40810
- try {
40811
- await backend.deleteRawObjects(keys);
40812
- } finally {
40813
- if (scope === "whole-dir") swept = await backend.purgeNoncurrentVersionsUnderPrefix(dirPrefix, { objectDescription: DEPLOYMENT_EVENTS_OBJECT_DESCRIPTION });
40814
- else await backend.purgeNoncurrentVersions(keys, {
40815
- ...keys.length > 1 && { listPrefix: dirPrefix },
40816
- objectDescription: DEPLOYMENT_EVENTS_OBJECT_DESCRIPTION
40817
- });
40818
- }
40819
- return swept;
40820
- }
40821
- function runIdTimestampMs(runId) {
40822
- const m = /^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(\d{3})Z/.exec(runId);
40823
- if (!m) return null;
40824
- const iso = `${m[1]}-${m[2]}-${m[3]}T${m[4]}:${m[5]}:${m[6]}.${m[7]}Z`;
40825
- const ms = Date.parse(iso);
40826
- return Number.isNaN(ms) ? null : ms;
40827
- }
40828
- function runIdFromJsonlKey(key, dirPrefix) {
40829
- if (!key.startsWith(dirPrefix) || !key.endsWith(".jsonl")) return null;
40830
- return key.slice(dirPrefix.length, -6);
40831
- }
40832
- var DeploymentEventsStore = class {
40833
- logger = getLogger().child("DeploymentEvents");
40834
- backend;
40835
- stackName;
40836
- region;
40837
- command;
40838
- runId;
40839
- cdkdVersion;
40840
- startedAt;
40841
- events = [];
40842
- persistedCount = 0;
40843
- flushTimer;
40844
- writeChain = Promise.resolve();
40845
- warnedOnce = false;
40846
- finalized = false;
40847
- constructor(backend, options) {
40848
- this.backend = backend;
40849
- this.stackName = options.stackName;
40850
- this.region = options.region;
40851
- this.command = options.command;
40852
- this.runId = options.runId ?? newDeploymentRunId();
40853
- this.cdkdVersion = options.cdkdVersion ?? getCdkdVersion();
40854
- this.startedAt = (/* @__PURE__ */ new Date()).toISOString();
40855
- }
40856
- record(event) {
40857
- try {
40858
- if (this.finalized) return;
40859
- this.events.push({
40860
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
40861
- ...event
40862
- });
40863
- if (this.events.length - this.persistedCount >= FLUSH_EVENT_THRESHOLD) this.scheduleFlush(0);
40864
- else this.scheduleFlush(FLUSH_INTERVAL_MS);
40865
- } catch {}
40866
- }
40867
- async finalize(result) {
40868
- if (this.finalized) return;
40869
- this.finalized = true;
40870
- if (this.flushTimer) {
40871
- clearTimeout(this.flushTimer);
40872
- this.flushTimer = void 0;
40873
- }
40874
- if (this.events.length === 0) return;
40875
- await this.enqueueWrite(async () => {
40876
- const indexRead = this.readIndexRuns();
40877
- indexRead.catch(() => {});
40878
- await this.doFlush();
40879
- await this.writeIndexAndPrune(result, await indexRead);
40880
- });
40881
- }
40882
- async writeIndexAndPrune(result, existingRuns) {
40883
- const { key, file, runs } = this.buildIndexUpdate(result, existingRuns);
40884
- const keptRunIds = runs.map((r) => r.runId);
40885
- const willPrune = keptRunIds.length >= 20;
40886
- const dirPrefix = deploymentsDirPrefix(this.backend.prefix, this.stackName, this.region);
40887
- const staleKeysRead = willPrune ? this.backend.listRawKeys(dirPrefix) : void 0;
40888
- staleKeysRead?.catch(() => {});
40889
- await this.backend.putRawObject(key, JSON.stringify(file, null, 2));
40890
- if (!staleKeysRead) return;
40891
- await this.pruneSupersededRunFiles(keptRunIds, dirPrefix, await staleKeysRead);
40892
- }
40893
- async drain() {
40894
- await this.writeChain;
40895
- }
40896
- scheduleFlush(delayMs) {
40897
- if (this.flushTimer) {
40898
- if (delayMs > 0) return;
40899
- clearTimeout(this.flushTimer);
40900
- }
40901
- this.flushTimer = setTimeout(() => {
40902
- this.flushTimer = void 0;
40903
- this.enqueueWrite(() => this.doFlush());
40904
- }, delayMs);
40905
- this.flushTimer.unref?.();
40906
- }
40907
- enqueueWrite(op) {
40908
- const next = this.writeChain.then(op).catch((err) => {
40909
- this.warnOnce(`Failed to persist deployment events for run ${this.runId}: ${describeAwsFailure(err).detail}`);
40910
- });
40911
- this.writeChain = next;
40912
- return next;
40913
- }
40914
- async doFlush() {
40915
- if (this.events.length === 0 || this.events.length === this.persistedCount) return;
40916
- const snapshotCount = this.events.length;
40917
- const body = this.events.slice(0, snapshotCount).map((e) => JSON.stringify(e)).join("\n");
40918
- await this.backend.putRawObject(deploymentEventsKey(this.backend.prefix, this.stackName, this.region, this.runId), body + "\n", "application/x-ndjson");
40919
- this.persistedCount = snapshotCount;
40920
- }
40921
- async readIndexRuns() {
40922
- const key = deploymentEventsIndexKey(this.backend.prefix, this.stackName, this.region);
40923
- try {
40924
- const raw = await this.backend.getRawObject(key);
40925
- if (raw !== null) {
40926
- const parsed = JSON.parse(raw);
40927
- if (Array.isArray(parsed.runs)) return parsed.runs;
40928
- }
40929
- } catch (err) {
40930
- this.logger.debug(`Deployment-events index unreadable, rewriting: ${describeAwsFailure(err).detail}`);
40931
- }
40932
- return [];
40933
- }
40934
- buildIndexUpdate(result, existingRuns) {
40935
- const key = deploymentEventsIndexKey(this.backend.prefix, this.stackName, this.region);
40936
- const runs = [{
40937
- runId: this.runId,
40938
- command: this.command,
40939
- cdkdVersion: this.cdkdVersion,
40940
- startedAt: this.startedAt,
40941
- finishedAt: (/* @__PURE__ */ new Date()).toISOString(),
40942
- result,
40943
- eventCount: this.persistedCount
40944
- }, ...existingRuns.filter((r) => r.runId !== this.runId)].slice(0, 20);
40945
- return {
40946
- key,
40947
- file: {
40948
- indexVersion: 1,
40949
- stackName: this.stackName,
40950
- region: this.region,
40951
- runs,
40952
- lastModified: Date.now()
40953
- },
40954
- runs
40955
- };
40956
- }
40957
- async pruneSupersededRunFiles(keptRunIds, dirPrefix, keys) {
40958
- if (keptRunIds.length < 20) return;
40959
- const cutoff = keptRunIds.reduce((min, id) => id < min ? id : min, keptRunIds[0]);
40960
- const stale = keys.filter((k) => {
40961
- const runId = runIdFromJsonlKey(k, dirPrefix);
40962
- return runId !== null && runId < cutoff;
40963
- });
40964
- if (stale.length === 0) return;
40965
- await deleteAndPurgeEventObjects(this.backend, stale, dirPrefix);
40966
- this.logger.debug(`Pruned ${stale.length} superseded deployment-event stream(s) for ${this.stackName} (${this.region})`);
40967
- }
40968
- warnOnce(message) {
40969
- if (this.warnedOnce) {
40970
- this.logger.debug(message);
40971
- return;
40972
- }
40973
- this.warnedOnce = true;
40974
- this.logger.warn(`${message} — continuing; deployment events are best-effort and never block the run.`);
40975
- }
40976
- };
40977
- var DeploymentEventsReader = class {
40978
- backend;
40979
- constructor(backend) {
40980
- this.backend = backend;
40981
- }
40982
- async listRegions(stackName) {
40983
- const prefix = `${this.backend.prefix}/${stackName}/`;
40984
- const keys = await this.backend.listRawKeys(prefix);
40985
- const regions = /* @__PURE__ */ new Set();
40986
- for (const key of keys) {
40987
- const segments = key.slice(prefix.length).split("/");
40988
- if (segments.length === 3 && segments[1] === "deployments" && segments[0]) regions.add(segments[0]);
40989
- }
40990
- return [...regions].sort();
40991
- }
40992
- async listRuns(stackName, region) {
40993
- const key = deploymentEventsIndexKey(this.backend.prefix, stackName, region);
40994
- try {
40995
- const raw = await this.backend.getRawObject(key);
40996
- if (raw !== null) {
40997
- const parsed = JSON.parse(raw);
40998
- if (Array.isArray(parsed.runs)) return parsed.runs;
40999
- }
41000
- } catch {}
41001
- const dirPrefix = `${this.backend.prefix}/${stackName}/${region}/deployments/`;
41002
- const runIds = (await this.backend.listRawKeys(dirPrefix)).filter((k) => k.endsWith(".jsonl")).map((k) => k.slice(dirPrefix.length, -6)).sort().reverse();
41003
- return Promise.all(runIds.map((runId) => this.summarizeRunFromJsonl(stackName, region, runId)));
41004
- }
41005
- async summarizeRunFromJsonl(stackName, region, runId) {
41006
- const fallback = {
41007
- runId,
41008
- command: "deploy",
41009
- cdkdVersion: "unknown",
41010
- startedAt: "",
41011
- finishedAt: "",
41012
- result: "UNKNOWN",
41013
- eventCount: 0
41014
- };
41015
- let events = null;
41016
- try {
41017
- events = await this.readRunEvents(stackName, region, runId);
41018
- } catch {
41019
- return fallback;
41020
- }
41021
- if (events === null || events.length === 0) return fallback;
41022
- const started = events.find((e) => e.eventType === "RUN_STARTED");
41023
- let finished;
41024
- for (const e of events) if (e.eventType === "RUN_FINISHED") finished = e;
41025
- return {
41026
- runId,
41027
- command: started?.command ?? fallback.command,
41028
- cdkdVersion: started?.cdkdVersion ?? fallback.cdkdVersion,
41029
- startedAt: started?.timestamp ?? fallback.startedAt,
41030
- finishedAt: finished?.timestamp ?? fallback.finishedAt,
41031
- result: finished?.result ?? "UNKNOWN",
41032
- eventCount: events.length
41033
- };
41034
- }
41035
- async readRunEvents(stackName, region, runId) {
41036
- const key = deploymentEventsKey(this.backend.prefix, stackName, region, runId);
41037
- const raw = await this.backend.getRawObject(key);
41038
- if (raw === null) return null;
41039
- const events = [];
41040
- for (const line of raw.split("\n")) {
41041
- const trimmed = line.trim();
41042
- if (!trimmed) continue;
41043
- try {
41044
- events.push(JSON.parse(trimmed));
41045
- } catch {}
41046
- }
41047
- return events;
41048
- }
41049
- async pruneRuns(stackName, region, opts = {}) {
41050
- const dirPrefix = deploymentsDirPrefix(this.backend.prefix, stackName, region);
41051
- const keys = await this.backend.listRawKeys(dirPrefix);
41052
- const runIdsDesc = keys.map((k) => runIdFromJsonlKey(k, dirPrefix)).filter((id) => id !== null).sort().reverse();
41053
- const indexKey = deploymentEventsIndexKey(this.backend.prefix, stackName, region);
41054
- const indexExisted = keys.includes(indexKey);
41055
- if (opts.all === true) {
41056
- const toDelete = runIdsDesc.map((id) => deploymentEventsKey(this.backend.prefix, stackName, region, id));
41057
- const earlierVersions = await deleteAndPurgeEventObjects(this.backend, [...toDelete, indexKey], dirPrefix, "whole-dir");
41058
- return {
41059
- deletedRunIds: runIdsDesc,
41060
- remainingRunIds: [],
41061
- indexDeleted: indexExisted,
41062
- ...earlierVersions !== void 0 && { earlierVersions }
41063
- };
41064
- }
41065
- const noGuards = opts.keep === void 0 && opts.olderThanMs === void 0;
41066
- const keep = opts.keep ?? (noGuards ? 20 : void 0);
41067
- const protectedByCount = keep === void 0 ? /* @__PURE__ */ new Set() : new Set(runIdsDesc.slice(0, keep));
41068
- let candidates = runIdsDesc.filter((id) => !protectedByCount.has(id));
41069
- if (opts.olderThanMs !== void 0) {
41070
- const cutoff = (opts.now ?? /* @__PURE__ */ new Date()).getTime() - opts.olderThanMs;
41071
- candidates = candidates.filter((id) => {
41072
- const t = runIdTimestampMs(id);
41073
- return t !== null && t < cutoff;
41074
- });
41075
- }
41076
- if (candidates.length === 0) return {
41077
- deletedRunIds: [],
41078
- remainingRunIds: runIdsDesc,
41079
- indexDeleted: false
41080
- };
41081
- const deletedSet = new Set(candidates);
41082
- const deleteKeys = candidates.map((id) => deploymentEventsKey(this.backend.prefix, stackName, region, id));
41083
- const remainingRunIds = runIdsDesc.filter((id) => !deletedSet.has(id));
41084
- if (remainingRunIds.length === 0) {
41085
- await deleteAndPurgeEventObjects(this.backend, [...deleteKeys, indexKey], dirPrefix);
41086
- return {
41087
- deletedRunIds: candidates,
41088
- remainingRunIds,
41089
- indexDeleted: indexExisted
41090
- };
41091
- }
41092
- await this.rewriteIndexAfterPrune(indexKey, stackName, region, deletedSet);
41093
- await deleteAndPurgeEventObjects(this.backend, deleteKeys, dirPrefix);
41094
- return {
41095
- deletedRunIds: candidates,
41096
- remainingRunIds,
41097
- indexDeleted: false
41098
- };
41099
- }
41100
- async rewriteIndexAfterPrune(indexKey, stackName, region, deletedRunIds) {
41101
- let raw;
41102
- try {
41103
- raw = await this.backend.getRawObject(indexKey);
41104
- } catch {
41105
- return;
41106
- }
41107
- if (raw === null) return;
41108
- let parsed;
41109
- try {
41110
- parsed = JSON.parse(raw);
41111
- } catch {
41112
- return;
41113
- }
41114
- if (!Array.isArray(parsed.runs)) return;
41115
- const remaining = parsed.runs.filter((r) => !deletedRunIds.has(r.runId));
41116
- if (remaining.length === parsed.runs.length) return;
41117
- const file = {
41118
- indexVersion: 1,
41119
- stackName,
41120
- region,
41121
- runs: remaining,
41122
- lastModified: Date.now()
41123
- };
41124
- await this.backend.putRawObject(indexKey, JSON.stringify(file, null, 2));
41125
- }
41126
- };
41127
-
41128
41220
  //#endregion
41129
41221
  //#region src/deployment/orphan-adoption.ts
41130
41222
  function templateStillDeclares(template, record, nameProperties) {
@@ -41668,58 +41760,6 @@ async function orphanUntakenResumes(deps, stackName, finalResources) {
41668
41760
  }
41669
41761
  }
41670
41762
 
41671
- //#endregion
41672
- //#region src/deployment/kept-in-history.ts
41673
- function keptInEarlierRecords(records) {
41674
- const out = [];
41675
- for (const record of records) for (const [logicalId, raw] of Object.entries(record.resources)) {
41676
- if (raw === null || typeof raw !== "object") continue;
41677
- const r = raw;
41678
- if (typeof r.resourceType !== "string" || typeof r.physicalId !== "string") continue;
41679
- if (r.physicalId === "") continue;
41680
- if (!shouldRetainResource(r.deletionPolicy)) continue;
41681
- out.push({
41682
- logicalId,
41683
- resourceType: r.resourceType,
41684
- physicalId: r.physicalId,
41685
- ...record.writtenAt !== void 0 && { keptAt: record.writtenAt }
41686
- });
41687
- }
41688
- return out;
41689
- }
41690
- function keptInEventHistory(runs, stackName) {
41691
- const made = /* @__PURE__ */ new Map();
41692
- const out = [];
41693
- for (const events of runs) for (const e of events) {
41694
- if (e.stackName !== stackName || typeof e.logicalId !== "string") continue;
41695
- if (typeof e.resourceType !== "string") continue;
41696
- if (e.eventType === "RESOURCE_SUCCEEDED" && (e.operation === "CREATE" || e.operation === "UPDATE") && typeof e.physicalId === "string" && e.physicalId !== "") made.set(e.logicalId, {
41697
- resourceType: e.resourceType,
41698
- physicalId: e.physicalId
41699
- });
41700
- else if (e.eventType === "RESOURCE_RETAINED") {
41701
- const m = made.get(e.logicalId);
41702
- if (m !== void 0 && m.resourceType === e.resourceType) {
41703
- const keptAt = Date.parse(e.timestamp);
41704
- out.push({
41705
- logicalId: e.logicalId,
41706
- ...m,
41707
- ...Number.isFinite(keptAt) && { keptAt }
41708
- });
41709
- }
41710
- }
41711
- }
41712
- return out;
41713
- }
41714
- async function loadKeptInHistory(sources, stackName, region) {
41715
- const runsOf = stackName.split("~")[0];
41716
- const [records, runs] = await Promise.all([sources.earlierStateResources(stackName, region).catch(() => []), (async () => {
41717
- const listed = (await sources.listRuns(runsOf, region)).slice(0, 20);
41718
- return (await Promise.all(listed.map((r) => sources.readRunEvents(runsOf, region, r.runId).catch(() => null)))).filter((e) => e !== null).reverse();
41719
- })().catch(() => [])]);
41720
- return [...keptInEarlierRecords(records), ...keptInEventHistory(runs, stackName)];
41721
- }
41722
-
41723
41763
  //#endregion
41724
41764
  //#region src/provisioning/canonicalize-properties.ts
41725
41765
  function makeCanonicalizePropertiesFn(registry) {
@@ -43101,7 +43141,7 @@ async function requireDeploymentApproval(args) {
43101
43141
  } catch (error) {
43102
43142
  throw error instanceof Error ? markNonRetryable(error) : error;
43103
43143
  }
43104
- if (!approved) throw markNonRetryable(new CdkdError(safeMsg`Deployment of stack ${args.stackName} was not approved (--require-approval=${level}). Nothing was changed.`, "DEPLOY_NOT_APPROVED"));
43144
+ if (!approved) throw markNonRetryable(new DeploymentNotApprovedError(safeMsg`Deployment of stack ${args.stackName} was not approved (--require-approval=${level}). Nothing was changed.`));
43105
43145
  return approve.autoApproves !== true;
43106
43146
  }
43107
43147
  async function checkDestructivePlan(args) {
@@ -43158,7 +43198,7 @@ async function requireOutputsOnlyApproval(args) {
43158
43198
  } catch (error) {
43159
43199
  throw error instanceof Error ? markNonRetryable(error) : error;
43160
43200
  }
43161
- if (!approved) throw markNonRetryable(new CdkdError(safeMsg`Deployment of stack ${args.stackName} was not approved (--require-approval=any-change). Nothing was changed.`, "DEPLOY_NOT_APPROVED"));
43201
+ if (!approved) throw markNonRetryable(new DeploymentNotApprovedError(safeMsg`Deployment of stack ${args.stackName} was not approved (--require-approval=any-change). Nothing was changed.`));
43162
43202
  }
43163
43203
  function isNoEchoPromotionOnly(change) {
43164
43204
  return change.changeType === "UPDATE" && (change.attributeChanges?.length ?? 0) === 0 && (change.propertyChanges?.length ?? 0) > 0 && change.propertyChanges.every((pc) => pc.noEchoPromoted === true);
@@ -47599,7 +47639,7 @@ function ccAutoRouteUpdateFailureRemedy(logicalId, resourceType, autoRoutedPrope
47599
47639
 
47600
47640
  //#endregion
47601
47641
  //#region src/deployment/deploy-engine/update-in-place.ts
47602
- async function updateInPlace(engine, { conditions, counts, currentProps, currentPropsAsWritten, currentResource, dependencies, desiredForSkipCheckAsWritten, logicalId, noEchoHeldPaths, parameterValues, progress, renderer, resolvedProps, resourceType, stackName, stateResources, template, updateReplacePolicy, updateSecrets, reattach }) {
47642
+ async function updateInPlace(engine, { changedProperties, conditions, counts, currentProps, currentPropsAsWritten, currentResource, dependencies, desiredForSkipCheckAsWritten, logicalId, noEchoHeldPaths, parameterValues, progress, renderer, resolvedProps, resourceType, stackName, stateResources, template, updateReplacePolicy, updateSecrets, reattach }) {
47603
47643
  engine.logger.debug(safeMsg`Updating ${logicalId} (${resourceType})`);
47604
47644
  const updateDecision = engine.providerRegistry.getProviderFor({
47605
47645
  resourceType,
@@ -47625,10 +47665,11 @@ async function updateInPlace(engine, { conditions, counts, currentProps, current
47625
47665
  }
47626
47666
  const updateProvider = updateDecision.provider;
47627
47667
  const updateProps = updateDecision.provisionedBy === "cc-api" ? withoutGeneratedFallbackName(resourceType, resolvedProps, preparePropertiesForCcApi(engine.providerRegistry, resourceType, resolvedProps, logicalId, "omit")) : resolvedProps;
47628
- const { previous: previousWithSecretsDropped, dropped: droppedPrincipalKinds } = withUnchangedSecretPrincipalLists(resourceType, currentResource.physicalId, noEchoHeldPaths.size === 0 ? currentPropsAsWritten : {
47668
+ const previousWithNoEchoHeld = noEchoHeldPaths.size === 0 ? currentPropsAsWritten : {
47629
47669
  ...currentPropsAsWritten,
47630
47670
  ...Object.fromEntries([...noEchoHeldPaths].filter((path) => Object.prototype.hasOwnProperty.call(updateProps, path)).map((path) => [path, updateProps[path]]))
47631
- }, desiredForSkipCheckAsWritten);
47671
+ };
47672
+ const { previous: previousWithSecretsDropped, dropped: droppedPrincipalKinds } = withUnchangedSecretPrincipalLists(resourceType, currentResource.physicalId, previousWithNoEchoHeld, desiredForSkipCheckAsWritten);
47632
47673
  const reattached = reattach === true ? withRecreatedAttachmentsDropped({
47633
47674
  resourceType,
47634
47675
  templateProperties: template?.Resources?.[logicalId]?.Properties,
@@ -47638,6 +47679,9 @@ async function updateInPlace(engine, { conditions, counts, currentProps, current
47638
47679
  conditions
47639
47680
  }) : void 0;
47640
47681
  const previousForUpdate = reattached?.previous ?? previousWithSecretsDropped;
47682
+ const changedForProvider = new Set(changedProperties);
47683
+ for (const key of /* @__PURE__ */ new Set([...Object.keys(previousWithNoEchoHeld), ...Object.keys(previousForUpdate)])) if (keyOrderFreeJson(previousForUpdate[key]) !== keyOrderFreeJson(previousWithNoEchoHeld[key])) changedForProvider.add(key);
47684
+ if (changedForProvider.size === 0) for (const key of /* @__PURE__ */ new Set([...Object.keys(updateProps), ...Object.keys(previousForUpdate)])) changedForProvider.add(key);
47641
47685
  if (reattached !== void 0) engine.logger.info(safeMsg` ${logicalId} (${resourceType}) lost its attachment to ${reattached.parents.join(", ")}, which this deploy re-created under the same name: attaching it again`);
47642
47686
  if (droppedPrincipalKinds.length > 0) {
47643
47687
  const kinds = droppedPrincipalKinds.join(" / ");
@@ -47655,7 +47699,8 @@ async function updateInPlace(engine, { conditions, counts, currentProps, current
47655
47699
  expectedRegion: engine.stackRegion,
47656
47700
  recordedAttributes: currentResource.attributes,
47657
47701
  ...inlinePolicyClaimed && { inlinePolicyClaimed },
47658
- ...removal.context
47702
+ ...removal.context,
47703
+ changedProperties: changedForProvider
47659
47704
  })), logicalId, void 0, void 0, updateProvider);
47660
47705
  if (result.sentNothing === true) engine.replacementRun.updatesThatSentNothing.add(logicalId);
47661
47706
  if (result.wasReplaced === true && result.outcome === "partial") engine.replacementRun.replacedOldMaySurvive.set(logicalId, result.oldResourceSurvivor === "kept" ? "kept" : "unconfirmed");
@@ -47915,6 +47960,10 @@ async function updateInPlace(engine, { conditions, counts, currentProps, current
47915
47960
  engine.logger.info(safeMsg`${updatePrefix}${formatResourceLine("updated", logicalId, resourceType)}`);
47916
47961
  }
47917
47962
 
47963
+ //#endregion
47964
+ //#region src/provisioning/changed-properties-consumers.ts
47965
+ const CHANGED_PROPERTIES_CONSUMER_TYPES = /* @__PURE__ */ new Set(["AWS::ServiceDiscovery::Service"]);
47966
+
47918
47967
  //#endregion
47919
47968
  //#region src/deployment/deploy-engine/read-provenance-moved.ts
47920
47969
  function occurrences(value, token) {
@@ -48285,6 +48334,7 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
48285
48334
  for (const path of provenanceMoved.paths) rewrittenPaths.add(path);
48286
48335
  if (provenanceMoved.paths.size > 0) engine.logger.info(safeMsg`${logicalId} is sent: ${[...provenanceMoved.paths].sort().join(", ")} read a secret-derived value at a newer version than ${logicalId} was deployed with (its upstream changed since then)`);
48287
48336
  const recordMatchesDesired = movedMasked.size === 0 && rewrittenPaths.size === 0 && keyOrderFreeJson(desiredForSkipCheckAsWritten) === keyOrderFreeJson(currentPropsAsWritten);
48337
+ const movedAsWritten = (key) => movedMasked.has(key) || rewrittenPaths.has(key) || keyOrderFreeJson(desiredForSkipCheckAsWritten[key]) !== keyOrderFreeJson(currentPropsAsWritten[key]);
48288
48338
  const applyAttributeOnlyUpdate = (attributeChanges) => {
48289
48339
  const attrSummary = attributeChanges.map((a) => `${a.attribute}: ${a.oldValue ?? "(unset)"} → ${a.newValue ?? "(unset)"}`).join(", ");
48290
48340
  engine.logger.info(safeMsg` ↻ ${logicalId} (${resourceType}) attribute update: ${attrSummary}`);
@@ -48389,7 +48439,7 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
48389
48439
  lowered.push(pc);
48390
48440
  continue;
48391
48441
  }
48392
- const moved = movedMasked.has(pc.path) || rewrittenPaths.has(pc.path) || keyOrderFreeJson(desiredForSkipCheckAsWritten[pc.path]) !== keyOrderFreeJson(currentPropsAsWritten[pc.path]);
48442
+ const moved = movedAsWritten(pc.path);
48393
48443
  const conditionalVerdict = moved && !typeChanged && isReplacementCeiling(pc) ? engine.diffCalculator.conditionalReplacementVerdict?.(resourceType, pc.path, currentPropsAsWritten[pc.path], desiredForSkipCheckAsWritten[pc.path]) : void 0;
48394
48444
  if (moved && conditionalVerdict !== false) {
48395
48445
  warnWitnessReplacement(pc.path);
@@ -48435,7 +48485,8 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
48435
48485
  const parameterHeldKeys = /* @__PURE__ */ new Set();
48436
48486
  const parameterUnreadablePaths = [];
48437
48487
  if (pendingParameterLeaves.size > 0 && !typeChanged) {
48438
- const read = parameterCreateOnlyPaths.size > 0 || recordMatchesDesired ? await readOnce() : void 0;
48488
+ const consumerReadsBack = CHANGED_PROPERTIES_CONSUMER_TYPES.has(resourceType) && currentResource.provisionedBy !== "cc-api" && [...pendingParameterLeaves.keys()].some((key) => !parameterCreateOnlyPaths.has(key) && otherFreshAt(key).length === 0);
48489
+ const read = parameterCreateOnlyPaths.size > 0 || recordMatchesDesired || consumerReadsBack ? await readOnce() : void 0;
48439
48490
  const verdictAt = (key) => {
48440
48491
  if (read === void 0) return "not-readable";
48441
48492
  if ("failure" in read) return read.failure;
@@ -48443,14 +48494,13 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
48443
48494
  return liveHoldsFreshLeaves(read.live[key], pendingParameterLeaves.get(key) ?? []) ? "held" : "differs";
48444
48495
  };
48445
48496
  const lowered = [];
48446
- const movedAt = (path) => movedMasked.has(path) || rewrittenPaths.has(path) || keyOrderFreeJson(desiredForSkipCheckAsWritten[path]) !== keyOrderFreeJson(currentPropsAsWritten[path]);
48447
- replacedAnyway = recreateDirectionFor(engine.options, stackName, logicalId) !== void 0 || lostWithParent !== void 0 || (change.propertyChanges ?? []).some((other) => other.requiresReplacement && (!parameterCreateOnlyPaths.has(other.path) || movedAt(other.path)));
48497
+ replacedAnyway = recreateDirectionFor(engine.options, stackName, logicalId) !== void 0 || lostWithParent !== void 0 || (change.propertyChanges ?? []).some((other) => other.requiresReplacement && (!parameterCreateOnlyPaths.has(other.path) || movedAsWritten(other.path)));
48448
48498
  for (const pc of change.propertyChanges ?? []) {
48449
48499
  if (!parameterCreateOnlyPaths.has(pc.path)) {
48450
48500
  lowered.push(pc);
48451
48501
  continue;
48452
48502
  }
48453
- if (movedAt(pc.path)) {
48503
+ if (movedAsWritten(pc.path)) {
48454
48504
  if (pc.requiresReplacement) warnWitnessReplacement(pc.path);
48455
48505
  lowered.push(pc);
48456
48506
  continue;
@@ -48603,6 +48653,11 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
48603
48653
  diffSawTokenChange: diffMovedServiceToken(change)
48604
48654
  });
48605
48655
  if (serviceTokenRefusal !== void 0) throw markRefusedBeforeApplying(markNonRetryable(new CdkdError(renderServiceTokenRefusal([serviceTokenRefusal], stackName, createSecretMasker(updateSecrets)), SERVICE_TOKEN_CHANGE_REFUSED)));
48656
+ const changedProperties = new Set([.../* @__PURE__ */ new Set([
48657
+ ...Object.keys(desiredForSkipCheckAsWritten),
48658
+ ...Object.keys(currentPropsAsWritten),
48659
+ ...Object.keys(resolvedProps)
48660
+ ])].filter((key) => movedAsWritten(key) || !confirmedPaths.has(key) && (pendingParameterLeaves.has(key) || otherFreshAt(key).length > 0)));
48606
48661
  let previousForProvider = currentPropsAsWritten;
48607
48662
  for (const coordinate of witness?.confirmed ?? []) {
48608
48663
  const value = valueAtCoordinate(resolvedProps, coordinate);
@@ -48613,6 +48668,7 @@ async function provisionUpdate(engine, logicalId, change, stateResources, stackN
48613
48668
  counts,
48614
48669
  currentProps,
48615
48670
  currentPropsAsWritten: previousForProvider,
48671
+ changedProperties,
48616
48672
  currentResource,
48617
48673
  dependencies,
48618
48674
  desiredForSkipCheckAsWritten,
@@ -50120,7 +50176,14 @@ var DeployEngine = class {
50120
50176
  inlinePolicyClaimedFor: (...args) => this.inlinePolicyClaimedFor(...args),
50121
50177
  recordEvent: (...args) => this.recordEvent(...args),
50122
50178
  guardedReplacementCreate: (input, create) => guardedReplacementCreate(this, input, create),
50123
- generatedNameGuarded: (logicalId) => this.generatedNameGuard?.candidate(logicalId) !== void 0
50179
+ generatedNameGuarded: (logicalId) => this.generatedNameGuard?.candidate(logicalId) !== void 0,
50180
+ rollbackRetainedCopies: (stackName) => {
50181
+ const reader = new DeploymentEventsReader(this.stateBackend);
50182
+ return loadRollbackRetainedCopies({
50183
+ listRuns: (s, r) => reader.listRuns(s, r),
50184
+ readRunEvents: (s, r, id) => reader.readRunEvents(s, r, id)
50185
+ }, stackName, this.stackRegion);
50186
+ }
50124
50187
  };
50125
50188
  }
50126
50189
  resolverContextDeps() {
@@ -50389,5 +50452,5 @@ function sameGenerationClaimsOf(record) {
50389
50452
  }
50390
50453
 
50391
50454
  //#endregion
50392
- export { DeploymentEventsStore as $, refuseMalformedOutputsForDestroy as $a, validateAssetBucketName as $c, carriesDynamicReference as $i, hasPlainPrototype$1 as $l, noEchoComparisonForTemplate as $n, templateResourceTypes as $o, customResourceResponseExpirationWarning as $r, recordPhysicalNameCopy as $s, updatePartialReason as $t, inheritedProvenanceForChildDiff as A, malformedLocalResourcesWarning as Aa, importableOutputKeys as Ac, keepHeldTokenProvenance as Ai, resolveSkipPrefix as Al, formatDestructiveChange as An, hasNoCloudControlHandlers as Ao, markDeleteStarted as Ar, logOnlyValueCount as As, replayFailedOperations as At, conditionFingerprint as B, malformedResourcePropertiesWarning as Ba, WorkGraph as Bc, AWS_CREDENTIAL_ENV_KEYS as Bi, findLargeInlineResources as Bl, red as Bn, toCfnInteger as Bo, CC_BROKEN_REASON as Br, scrubResourceRecord as Bs, recordUnderIdIsNotOwn as Bt, hasCdkAutoDeleteTag as C, isReadableOrphanRecord as Ca, splitImportedOps as Cc, s3BucketDomainName as Ci, synthesisStatusMessage as Cl, isExportAliasCollision as Cn, unreadableResourceEntries as Co, unsupportedFinalSnapshotError as Cr, redactForState as Cs, makeForeignHolderScan as Ct, IMPLICIT_DELETE_DEPENDENCIES as D, malformedExportSourceWarning as Da, hasReadableExportSet as Dc, resolveDynamicReferences as Di, resolveApp as Dl, maskingRetryLogger as Dn, unwrittenCreateOnlyReplacement as Do, withCreateTokenLedger as Dr, createUnionSecretMasker as Ds, isAccessDeniedError as Dt, markRefusedBeforeApplying as E, malformedExportNamesWarning as Ea, exportNamesCarriedFrom as Ec, s3BucketWebsiteUrl as Ei, loadCdkJson as El, DEFAULT_RESOURCE_WARN_AFTER_MS as En, findSilentDropProperties as Eo, reserveStackCreateToken as Er, carryLogOnlyValues as Es, chunks as Et, findNestedTemplateTreeDefect as F, malformedOrphansWarning as Fa, shouldRetainResource as Fc, assertFlagRoleArn as Fi, warnDeprecatedNoPrefixCliFlag as Fl, replacedDeleteFailureVerdict as Fn, isStatefulRecreateTargetSync as Fo, refuseMalformedDesiredTags as Fr, unionOfSecretBags as Fs, isJournaledOrphan as Ft, diffSecurity as G, refuseDivergentRecordRegionForDestroy as Ga, AssetModeResolver as Gc, classifyReplaySecretRegion as Gi, PARTITION_TABLE as Gl, isSupersededResourceRecord as Gn, configIntegerRefusal as Go, waitForLambdaFunctionActive as Gr, isUncertifiedBaselineMaskPosition as Gs, findNestedStackTypeChanges as Gt, parentSuppliedValues as H, malformedScrubResourceEntriesRefusalMessage as Ha, createAssetRedirectResolver as Hc, callerEnvCredentials as Hi, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Hl, addSuperseded as Hn, coerceCfnBoolean as Ho, ccBrokenReason as Hr, withoutPhysicalNameCopies as Hs, resolveReplacementOldType as Ht, isAbsoluteAssetPath as I, malformedOutputsRefusalMessage as Ia, stackInstanceIdCarriedFrom as Ic, assertSendableRoleArn as Ii, ssmResolvedValueType as Il, bold as In, renderStatefulReason as Io, tagMapAsList as Ir, createSecretMasker as Is, isReplacementOrphan as It, mergeNoChangeOutputs as J, refuseMalformedOrphanRecordsForDestroy as Ja, ensureAssetStorage as Jc, coerceParameterTypedValue as Ji, AssemblyReader as Jl, supersededHeldByOtherTypeWarning as Jn, replayWarn as Jo, isCustomResourceType as Jr, inheritNestedStackParameterAssociations as Js, REDACTED_DELETE_ADDRESS_SKIP_REASON as Jt, isSecretBearingReferenceString as K, refuseMalformedNestedChildOutputs as Ka, BOOTSTRAP_MARKER_PREFIX as Kc, producerRegionsFromState as Ki, canonicalizeRegion as Kl, removeSuperseded as Kn, configStringRefusal as Ko, TemplateNoEchoReresolver as Kr, pathCrossesDottedKey as Ks, getCurrentProducerRegions as Kt, listNestedTemplateRows as L, malformedOutputsWarning as La, AssetPublisher as Lc, explicitRoleArnOrThrow as Li, CFN_TEMPLATE_BODY_LIMIT as Ll, cyan as Ln, WARM_THROUGHPUT_MEMBERS as Lo, tagPlanWarning as Lr, errorCauseChain as Ls, planFailedOps as Lt, findServiceTokenRefusals as M, malformedOrphanRecordsWarning as Ma, isReadableBag as Mc, recordedOutputReferenceRegions as Mi, resolveStateBucketWithDefaultAndSource as Ml, destroyStackRecordsView as Mn, shownType as Mo, DBPROXY_TAG_OPTIONS as Mr, recordLogOnlyParameterValue as Ms, removeProtectionTypeList as Mt, serviceTokenBlockingReason as N, malformedOrphanRowsKeptWarning as Na, orphansAfterRollback as Nc, recordedReferenceRegions as Ni, resolveUseCdkBootstrapAssets as Nl, getStackRecords as Nn, MULTI_REGION_RECREATE_BLOCKED_TYPES as No, planTagDiff as Nr, recordLogOnlyValue as Ns, recordAfterRollbackUpdate as Nt, computeImplicitDeleteEdges as O, malformedLocalOutputsWarning as Oa, hasReasonlessBaselineRefusal as Oc, producerLookupOver as Oi, resolveAutoAssetStorage as Ol, constructPathOf as On, withoutSilentDropProperties as Oo, acquireIdempotencyToken as Or, hasMaskableValues as Os, lookupEachName as Ot, childTemplateLoader as P, malformedOrphansRefusalMessage as Pa, orphansCarriedFrom as Pc, applyRoleArnIfSet as Pi, stateBucketExistenceConfirmed as Pl, withStackRecords as Pn, isStatefulRecreateTargetForReplace as Po, readTagList as Pr, shareLogOnlyValues as Ps, demoteSupersededOrphans as Pt, DeploymentEventsReader as Q, refuseMalformedOutputs as Qa, readBootstrapMarkerBody as Qc, isImpossibleEmptyStoredAttribute as Qi, hasOwnKey as Ql, noEchoAttributeNamesOf as Qn, prefetchCreateOnlyPropertyPaths as Qo, applyCustomResourceResponseExpiration as Qr, recordAttributeIdCopy as Qs, updatePartialMessage as Qt, renderNestedTemplateTreeDefect as R, malformedRenderedContainersWarning as Ra, isSensitiveAttributeName as Rc, isIamRoleArn as Ri, CFN_TEMPLATE_URL_LIMIT as Rl, gray as Rn, coerceWarmThroughput as Ro, definedAttributes as Rr, maskSecretsInError as Rs, planRollback as Rt, S3_AUTO_DELETE_OBJECTS_TAG as S, hasReadableResources as Sa, withStackInstanceIdWithheld as Sc, s3BucketArn as Si, Synthesizer as Sl, collectPublishedOutputNames as Sn, unreadableOrphanRecords as So, refusesFinalSnapshot as Sr, markSameGenerationBag as Ss, loadJournaledOrphans as St, getPriorAttempts as T, malformedDriftResourcePropertiesWarning as Ta, describeRegionValueKind as Tc, s3BucketRegionalDomainName as Ti, getLegacyStateBucketName as Tl, DEFAULT_RESOURCE_TIMEOUT_MS as Tn, findActionableSilentDrops as To, ledgerForStack as Tr, snapshotPassProvenance as Ts, formatResourceLine as Tt, readRecordedConditionVerdicts as U, malformedStateRefusalMessage as Ua, loadPublishableAssetManifest as Uc, envCredentialsAreAssumedRole as Ui, decodeListingKey as Ul, deleteSupersededEntry as Un, coerceCfnInteger as Uo, isCustomResource as Ur, DYNAMIC_REFERENCE_TOKEN_SCAN as Us, seedsDeleteFirstGuard as Ut, conditionInputsFrom as V, malformedResourcesWarning as Va, buildAssetRedirectMap as Vc, applyCallerIdentityCredentials as Vi, uploadCfnTemplate as Vl, yellow as Vn, toFiniteNumber as Vo, ProviderRegistry as Vr, withPhysicalNameCopies as Vs, replacementNeverSwapped as Vt, withResourceDeadline as W, previewableOrphanRecords as Wa, rewriteTemplateAssetReferences as Wc, classifyRecordedSecretRegion as Wi, expectedOwnerParam as Wl, holdsSupersededResources as Wn, configBooleanRefusal as Wo, wouldReturnToSdkProvider as Wr, dynamicReferenceTokens as Ws, orphanNeedsIdentity as Wt, makeSiblingClaimReader as X, refuseMalformedOrphansForDestroy as Xa, isCrossRegionRedirect as Xc, parameterTypeMayLoseSecretIdentity as Xi, processStackMessages as Xl, supersededResourcesOf as Xn, requireConfigObject as Xo, withPrintingSecrets as Xr, recoverMaskedOutput as Xs, redactedDeleteAddressFields as Xt, makeCanonicalizePropertiesFn as Y, refuseMalformedOrphans as Ya, getBootstrapMarkerKey as Yc, isUnboundTemplateParameter as Yi, StageLoadError as Yl, supersededHolderOf as Yn, requireConfigArray as Yo, getCurrentResourceSecrets as Yr, recordNestedStackParameterExpressions as Ys, isRedactedRecordedValue as Yt, planOrphanAdoption as Z, refuseMalformedOrphansForOrphan as Za, parseBootstrapMarker as Zc, getAccountInfo as Zi, defineOwnKey as Zl, withoutSuperseded as Zn, requireConfigString as Zo, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Zr, physicalNameCopiesOf as Zs, redactedDeleteAddressSkip as Zt, deleteTableWithIndexBusyRetry as _, accountArgs as _a, applyCrossPrefixScan as _c, DiffCalculator as _i, runDockerForeground as _l, exportNameNoEchoParameters as _n, repairMalformedOutputsForReadOnly as _o, buildFinalSnapshotIdentifier as _r, readbackPathFor as _s, deleteJournaledOrphans as _t, isProtectionValueActive as a, isStalePlaceholderArnAttribute as aa, recordNoEchoAttributeValues as ac, deleteIndeterminateGuards as ai, describeDockerExecFailure as al, retiredNameGenerationsLeaving as an, refuseMalformedResourceEntriesForImportSave as ao, maskEventTextWithBoundBags as ar, DagBuilder as as, displacedOpClause as at, renderAssemblyPathEscape as au, waitForIndexesSettled as b, hasReadableOrphans as ba, isNotImplemented as bc, poisonRenderedSpellingsCollidingIn as bi, AssetManifestLoader as bl, noEchoParameterValueSeed as bn, repairMalformedResourcesForReadOnly as bo, effectiveDeletionPolicy as br, valueAtCoordinate as bs, isHandledOrphan as bt, DynamoDBGlobalTableProvider as c, withSharedDrainBudget as ca, wholeStringLeavesOf as cc, withIndeterminateGuard as ci, finchSecretArgvRefusal as cl, reachableDivergentParameters as cn, refuseMalformedResourcePropertiesForDrift as co, secretNamePrintingBag as cr, isMarkedCoordinate as cs, getNestedRevertRun as ct, injectedAwsRegionValue as cu, compensateRemovedDeletionProtection as d, declaresNoEcho as da, LockManager as dc, disableInstanceApiTermination as di, isDockerClientEnvKey as dl, displayTextOrWithheld as dn, refuseMalformedResourcesForDeploy as do, secretNamedRecordNeedles as dr, maskWholeValue as ds, revertNestedChildFromJournal as dt, carriesFetchableDynamicReference as ea, splitGetAttStringForm as ec, CloudControlProvider as ei, validateContainerRepoName as el, nameGenerationCarriedFrom as en, refuseMalformedResourceAttributesForOrphan as eo, noEchoExactEchoLeavesOf as er, describeTypeWithThrottleRetry as es, pendingRequestCount as et, nullPrototypeRecord as eu, deleteBudgetKey as f, JSON_LISTING_HOLE_VALUE as fa, isLockInfoExpired as fc, ec2InstanceProtectionSite as fi, isMalformedEnvKey as fl, exportAliasCollisionScrubWarning as fn, refuseMalformedResourcesForDestroy as fo, stateSecretNameNeedles as fr, maskedLeafCoordinatesOf as fs, revertedNestedRowIds as ft, INDEX_SETTLE_POLL_INTERVAL_MS as g, UNREADABLE_RESOURCES_MAP_ROW as ga, CrossPrefixScanCache as gc, reEnableInstanceApiTermination as gi, redactedDockerCause as gl, carriedExportAliasExposure as gn, repairMalformedOrphansForReadOnly as go, PRE_DELETE_SNAPSHOT_TYPES as gr, passedNoEchoParametersOf as gs, withNestedStackContext as gt, DELETE_INDEX_WAIT_PROCEED_NOTE as h, UNREADABLE_ORPHANS_CONTAINER_ROW as ha, CrossPrefixReadError as hc, reDisableInstanceApiTermination as hi, redactedCause as hl, secretSafeKeyDisplay as hn, repairMalformedOrphanRecordsForReadOnly as ho, ATOMIC_FINAL_SNAPSHOT_TYPES as hr, noEchoOutputsComparison as hs, getCurrentNestedStackContext as ht, PROTECTION_PROPERTY_BY_TYPE as i, cfnRefValueFromPhysicalId as ia, recordMaskOnlyValuesIn as ic, UNSPECIFIED_SKIP_REASON as ii, describeDockerCapturedOutput as il, retiredNameGenerationsAfter as in, refuseMalformedResourceEntriesForImport as io, journaledOrphanPrintingBag as ir, sameLambdaFunctionAddress as is, NESTED_PENDING_PARENT_REASON as it, displayAssemblyPath as iu, deferredServiceTokenWarning as j, malformedOrphanRecordsRefusalMessage as ja, importableOutputs as jc, outputReferenceProvenanceOf as ji, resolveStateBucketWithDefault as jl, awaitInFlightSibling as jn, findReplacedReadersOfRecreateTargets as jo, DBPROXY_TAGS_WHAT as jr, printingCorpusOf as js, replayRollback as jt, crossStackOutputProvenanceSource as k, malformedLocalResourceEntriesWarning as ka, hasUnverifiableParameterRefusal as kc, refuseUnreadableCdkCrossAccountRefs as ki, resolveCaptureObservedState as kl, findDestructiveChanges as kn, NO_CC_HANDLERS_REASON as ko, isRefusedByName as kr, literalSplitDelimitersOf as ks, withApiLimit as kt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as l, parameterInputsFor as la, WHOLE_DYNAMIC_REFERENCE_PATTERN as lc, isWaitAbandonedError as li, formatDockerLoginError as ll, resourcesNamingDeclaredParameter as ln, refuseMalformedResourcePropertiesForExport as lo, secretNamePrintingBags as lr, maskAtCoordinates as ls, nestedChildStackName as lt, clearBucketRegionCache as lu, resolveDynamoDbDeleteBudgetMs as m, STATE_RESOURCES_MALFORMED as ma, rebuildClientForBucketRegion as mc, observeThenDisableInstanceApiTermination as mi, redactDockerArgvValues as ml, secretBearingStateKeyWarning as mn, refuseMalformedState as mo, extractDeploymentEventError as mr, noEchoLeavesOf as ms, collectNestedChildUnaddressed as mt, recordedProtectionEvidence as n, keepsSecretReferenceToken as na, provenPublicValue as nc, unchangedBehindSecretReference as ni, buildDockerImage as nl, nameScopeOf as nn, refuseMalformedResourceEntriesForDeploy as no, createReadOnlyAttributeHealerFactory as nr, canonicalLambdaFunctionName as ns, keptForRetainedRecord as nt, absoluteAssemblyPathEscape as nu, perType as o, refStateLookupFromResource as oa, recordNoEchoParameterFreshValue as oc, deleteLeftInPlace as oi, describeDockerFailure as ol, computeParameterTaint as on, refuseMalformedResourceEntriesForOrphan as oo, namingSecretsWithRecordedNoEcho as or, TemplateParser as os, displacedPhysicalIdShown as ot, resolveAssemblyPath as ou, resolveDynamoDbDeleteBudgetClock as p, STATE_REGION_DIVERGED as pa, S3StateBackend as pc, isTerminationProtectionPropagationError as pi, partitionSensitiveEnv as pl, secretBearing as pn, refuseMalformedResourcesForExport as po, storedSecretNameNeedles as pr, noEchoCoordinatesOf as ps, withNestedRevertRun as pt, keptWholeReasonText as q, refuseMalformedOrphanRecords as qa, assertAssetBucketRegion as qc, regionLessSecretName as qi, derivePartitionAndUrlSuffix as ql, supersededAfterRollback as qn, readConfigString as qo, readsNoEchoDeleteValues as qr, identityKeyFor as qs, inheritProducerRegions as qt, recordedProtectionNote as r, AWS_NO_VALUE as ra, recordMaskOnlyValue as rc, RollbackInlinePolicyWriters as ri, resolveDockerContextDirectory as rl, retiredAfterRollback as rn, refuseMalformedResourceEntriesForDestroy as ro, completedReplayEntries as rr, lambdaFunctionNameForMask as rs, recordRetainedForReadoption as rt, describeFileReadFailure as ru, readProtection as s, parseWebACLArn as sa, recordProvenPublicExpression as sc, deleteSkipReason as si, dockerSpawnEnvWithSensitive as sl, namesAnyDeclaredParameter as sn, refuseMalformedResourcePropertiesForDestroy as so, orphanRecordsPrintingBag as sr, canonicalCoordinates as ss, dropSettledNestedJournals as st, injectAwsRegion as su, DeployEngine as t, isNamelessDynamicReferenceError as ta, carriesSecretMask as tc, slowCcOperationTimeoutMs as ti, buildDenyExternalAccessPolicy as tl, nameGenerationHighWaterOf as tn, refuseMalformedResourceEntries as to, noEchoParameterNamesOf as tr, withRetry as ts, resolvePendingCloudControlRequests as tt, ownValue as tu, beginDeleteWait as u, passedParameterClassesOf as ua, isSingleDynamicReferenceToken as uc, markWaitAbandoned as ui, getDockerCmd as ul, WITHHELD_NAME_DISPLAY as un, refuseMalformedResourcePropertiesForOrphan as uo, secretNamedAttributeNamesOf as ur, maskReadbackAtCoordinates as us, recordDisplacedSkips as ut, resolveBucketRegion as uu, maskedLogger as v, deployRefusesOrphanRowsReason as va, crossPrefixDeniedWarning as vc, INTRINSIC_KEYS as vi, runDockerStreaming as vl, exportNameSecretExposure as vn, repairMalformedResourceEntriesForReadOnly as vo, ccRoutedFinalSnapshotError as vr, readsNoEchoSource as vs, dropFailedCommands as vt, isTruthyCfnBoolean as w, isReadableResourceEntry as wa, acceptedCreateOnlyDropsOf as wc, s3BucketDualStackDomainName as wi, getDefaultStateBucketName as wl, bindingSkippedOutputs as wn, withheldAccountClause as wo, earliestDefined as wr, recordReferenceProvenanceEntry as ws, sameJournaledOrphans as wt, ECR_AUTO_DELETE_IMAGES_TAG as x, hasReadableOutputs as xa, stackInstanceIdOf as xc, isSettledInstanceState as xi, getDockerImageBySourceHash as xl, collectDeclaredOutputNames as xn, unpreviewableOrphanRecords as xo, isFinalSnapshotError as xr, liveMatchesUnresolvedTokenFrame as xs, journaledOrphanLines as xt, relayedIndexBusyDelete as y, displayLogicalId as ya, isAccessDenied$1 as yc, IntrinsicFunctionResolver as yi, warnFinchArgvExposure as yl, isWholeDynamicReferenceValue as yn, repairMalformedResourcePropertiesForReadOnly as yo, createPreDeleteFinalSnapshot as yr, recordedNoEchoValuesOf as ys, dropFailedHint as yt, templateIdentity as z, malformedResourceEntriesWarning as za, stringifyValue as zc, sendableAssumeRoleCommand as zi, MIGRATE_TMP_PREFIX as zl, green as zn, isWarmThroughputDecrease as zo, stringifyIfAssigned as zr, maskSecretsInText as zs, recheckFailedPlan as zt };
50393
- //# sourceMappingURL=deploy-engine-DU0BoQqo.js.map
50455
+ export { resolvePendingCloudControlRequests as $, refuseMalformedOutputsForDestroy as $a, validateAssetBucketName as $c, carriesDynamicReference as $i, hasPlainPrototype$1 as $l, noEchoParameterNamesOf as $n, templateResourceTypes as $o, customResourceResponseExpirationWarning as $r, recordPhysicalNameCopy as $s, nameGenerationHighWaterOf as $t, inheritedProvenanceForChildDiff as A, malformedLocalResourcesWarning as Aa, importableOutputKeys as Ac, keepHeldTokenProvenance as Ai, resolveSkipPrefix as Al, destroyStackRecordsView as An, hasNoCloudControlHandlers as Ao, markDeleteStarted as Ar, logOnlyValueCount as As, removeProtectionTypeList as At, conditionFingerprint as B, malformedResourcePropertiesWarning as Ba, WorkGraph as Bc, AWS_CREDENTIAL_ENV_KEYS as Bi, findLargeInlineResources as Bl, addSuperseded as Bn, toCfnInteger as Bo, CC_BROKEN_REASON as Br, scrubResourceRecord as Bs, resolveReplacementOldType as Bt, hasCdkAutoDeleteTag as C, isReadableOrphanRecord as Ca, splitImportedOps as Cc, s3BucketDomainName as Ci, synthesisStatusMessage as Cl, DEFAULT_RESOURCE_TIMEOUT_MS as Cn, unreadableResourceEntries as Co, reserveStackCreateToken as Cr, redactForState as Cs, formatResourceLine as Ct, IMPLICIT_DELETE_DEPENDENCIES as D, malformedExportSourceWarning as Da, hasReadableExportSet as Dc, resolveDynamicReferences as Di, resolveApp as Dl, findDestructiveChanges as Dn, unwrittenCreateOnlyReplacement as Do, DeploymentEventsStore as Dr, createUnionSecretMasker as Ds, withApiLimit as Dt, markRefusedBeforeApplying as E, malformedExportNamesWarning as Ea, exportNamesCarriedFrom as Ec, s3BucketWebsiteUrl as Ei, loadCdkJson as El, constructPathOf as En, findSilentDropProperties as Eo, DeploymentEventsReader as Er, carryLogOnlyValues as Es, lookupEachName as Et, findNestedTemplateTreeDefect as F, malformedOrphansWarning as Fa, shouldRetainResource as Fc, assertFlagRoleArn as Fi, warnDeprecatedNoPrefixCliFlag as Fl, cyan as Fn, isStatefulRecreateTargetSync as Fo, refuseMalformedDesiredTags as Fr, unionOfSecretBags as Fs, planFailedOps as Ft, diffSecurity as G, refuseDivergentRecordRegionForDestroy as Ga, AssetModeResolver as Gc, classifyReplaySecretRegion as Gi, PARTITION_TABLE as Gl, supersededAfterRollback as Gn, configIntegerRefusal as Go, waitForLambdaFunctionActive as Gr, isUncertifiedBaselineMaskPosition as Gs, inheritProducerRegions as Gt, parentSuppliedValues as H, malformedScrubResourceEntriesRefusalMessage as Ha, createAssetRedirectResolver as Hc, callerEnvCredentials as Hi, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Hl, holdsSupersededResources as Hn, coerceCfnBoolean as Ho, ccBrokenReason as Hr, withoutPhysicalNameCopies as Hs, orphanNeedsIdentity as Ht, isAbsoluteAssetPath as I, malformedOutputsRefusalMessage as Ia, stackInstanceIdCarriedFrom as Ic, assertSendableRoleArn as Ii, ssmResolvedValueType as Il, gray as In, renderStatefulReason as Io, tagMapAsList as Ir, createSecretMasker as Is, planRollback as It, mergeNoChangeOutputs as J, refuseMalformedOrphanRecordsForDestroy as Ja, ensureAssetStorage as Jc, coerceParameterTypedValue as Ji, AssemblyReader as Jl, supersededResourcesOf as Jn, replayWarn as Jo, isCustomResourceType as Jr, inheritNestedStackParameterAssociations as Js, redactedDeleteAddressFields as Jt, isSecretBearingReferenceString as K, refuseMalformedNestedChildOutputs as Ka, BOOTSTRAP_MARKER_PREFIX as Kc, producerRegionsFromState as Ki, canonicalizeRegion as Kl, supersededHeldByOtherTypeWarning as Kn, configStringRefusal as Ko, TemplateNoEchoReresolver as Kr, pathCrossesDottedKey as Ks, REDACTED_DELETE_ADDRESS_SKIP_REASON as Kt, listNestedTemplateRows as L, malformedOutputsWarning as La, AssetPublisher as Lc, explicitRoleArnOrThrow as Li, CFN_TEMPLATE_BODY_LIMIT as Ll, green as Ln, WARM_THROUGHPUT_MEMBERS as Lo, tagPlanWarning as Lr, errorCauseChain as Ls, recheckFailedPlan as Lt, findServiceTokenRefusals as M, malformedOrphanRecordsWarning as Ma, isReadableBag as Mc, recordedOutputReferenceRegions as Mi, resolveStateBucketWithDefaultAndSource as Ml, withStackRecords as Mn, shownType as Mo, DBPROXY_TAG_OPTIONS as Mr, recordLogOnlyParameterValue as Ms, demoteSupersededOrphans as Mt, serviceTokenBlockingReason as N, malformedOrphanRowsKeptWarning as Na, orphansAfterRollback as Nc, recordedReferenceRegions as Ni, resolveUseCdkBootstrapAssets as Nl, replacedDeleteFailureVerdict as Nn, MULTI_REGION_RECREATE_BLOCKED_TYPES as No, planTagDiff as Nr, recordLogOnlyValue as Ns, isJournaledOrphan as Nt, computeImplicitDeleteEdges as O, malformedLocalOutputsWarning as Oa, hasReasonlessBaselineRefusal as Oc, producerLookupOver as Oi, resolveAutoAssetStorage as Ol, formatDestructiveChange as On, withoutSilentDropProperties as Oo, extractDeploymentEventError as Or, hasMaskableValues as Os, replayFailedOperations as Ot, childTemplateLoader as P, malformedOrphansRefusalMessage as Pa, orphansCarriedFrom as Pc, applyRoleArnIfSet as Pi, stateBucketExistenceConfirmed as Pl, bold as Pn, isStatefulRecreateTargetForReplace as Po, readTagList as Pr, shareLogOnlyValues as Ps, isReplacementOrphan as Pt, pendingRequestCount as Q, refuseMalformedOutputs as Qa, readBootstrapMarkerBody as Qc, isImpossibleEmptyStoredAttribute as Qi, hasOwnKey as Ql, noEchoExactEchoLeavesOf as Qn, prefetchCreateOnlyPropertyPaths as Qo, applyCustomResourceResponseExpiration as Qr, recordAttributeIdCopy as Qs, nameGenerationCarriedFrom as Qt, renderNestedTemplateTreeDefect as R, malformedRenderedContainersWarning as Ra, isSensitiveAttributeName as Rc, isIamRoleArn as Ri, CFN_TEMPLATE_URL_LIMIT as Rl, red as Rn, coerceWarmThroughput as Ro, definedAttributes as Rr, maskSecretsInError as Rs, recordUnderIdIsNotOwn as Rt, S3_AUTO_DELETE_OBJECTS_TAG as S, hasReadableResources as Sa, withStackInstanceIdWithheld as Sc, s3BucketArn as Si, Synthesizer as Sl, bindingSkippedOutputs as Sn, unreadableOrphanRecords as So, ledgerForStack as Sr, markSameGenerationBag as Ss, sameJournaledOrphans as St, getPriorAttempts as T, malformedDriftResourcePropertiesWarning as Ta, describeRegionValueKind as Tc, s3BucketRegionalDomainName as Ti, getLegacyStateBucketName as Tl, maskingRetryLogger as Tn, findActionableSilentDrops as To, acquireIdempotencyToken as Tr, snapshotPassProvenance as Ts, isAccessDeniedError as Tt, readRecordedConditionVerdicts as U, malformedStateRefusalMessage as Ua, loadPublishableAssetManifest as Uc, envCredentialsAreAssumedRole as Ui, decodeListingKey as Ul, isSupersededResourceRecord as Un, coerceCfnInteger as Uo, isCustomResource as Ur, DYNAMIC_REFERENCE_TOKEN_SCAN as Us, findNestedStackTypeChanges as Ut, conditionInputsFrom as V, malformedResourcesWarning as Va, buildAssetRedirectMap as Vc, applyCallerIdentityCredentials as Vi, uploadCfnTemplate as Vl, deleteSupersededEntry as Vn, toFiniteNumber as Vo, ProviderRegistry as Vr, withPhysicalNameCopies as Vs, seedsDeleteFirstGuard as Vt, withResourceDeadline as W, previewableOrphanRecords as Wa, rewriteTemplateAssetReferences as Wc, classifyRecordedSecretRegion as Wi, expectedOwnerParam as Wl, removeSuperseded as Wn, configBooleanRefusal as Wo, wouldReturnToSdkProvider as Wr, dynamicReferenceTokens as Ws, getCurrentProducerRegions as Wt, makeSiblingClaimReader as X, refuseMalformedOrphansForDestroy as Xa, isCrossRegionRedirect as Xc, parameterTypeMayLoseSecretIdentity as Xi, processStackMessages as Xl, noEchoAttributeNamesOf as Xn, requireConfigObject as Xo, withPrintingSecrets as Xr, recoverMaskedOutput as Xs, updatePartialMessage as Xt, makeCanonicalizePropertiesFn as Y, refuseMalformedOrphans as Ya, getBootstrapMarkerKey as Yc, isUnboundTemplateParameter as Yi, StageLoadError as Yl, withoutSuperseded as Yn, requireConfigArray as Yo, getCurrentResourceSecrets as Yr, recordNestedStackParameterExpressions as Ys, redactedDeleteAddressSkip as Yt, planOrphanAdoption as Z, refuseMalformedOrphansForOrphan as Za, parseBootstrapMarker as Zc, getAccountInfo as Zi, defineOwnKey as Zl, noEchoComparisonForTemplate as Zn, requireConfigString as Zo, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Zr, physicalNameCopiesOf as Zs, updatePartialReason as Zt, deleteTableWithIndexBusyRetry as _, accountArgs as _a, applyCrossPrefixScan as _c, DiffCalculator as _i, runDockerForeground as _l, isWholeDynamicReferenceValue as _n, repairMalformedOutputsForReadOnly as _o, effectiveDeletionPolicy as _r, readbackPathFor as _s, dropFailedHint as _t, isProtectionValueActive as a, isStalePlaceholderArnAttribute as aa, recordNoEchoAttributeValues as ac, deleteIndeterminateGuards as ai, describeDockerExecFailure as al, namesAnyDeclaredParameter as an, refuseMalformedResourceEntriesForImportSave as ao, orphanRecordsPrintingBag as ar, DagBuilder as as, dropSettledNestedJournals as at, renderAssemblyPathEscape as au, waitForIndexesSettled as b, hasReadableOrphans as ba, isNotImplemented as bc, poisonRenderedSpellingsCollidingIn as bi, AssetManifestLoader as bl, collectPublishedOutputNames as bn, repairMalformedResourcesForReadOnly as bo, unsupportedFinalSnapshotError as br, valueAtCoordinate as bs, loadJournaledOrphans as bt, DynamoDBGlobalTableProvider as c, withSharedDrainBudget as ca, wholeStringLeavesOf as cc, withIndeterminateGuard as ci, finchSecretArgvRefusal as cl, WITHHELD_NAME_DISPLAY as cn, refuseMalformedResourcePropertiesForDrift as co, secretNamedAttributeNamesOf as cr, isMarkedCoordinate as cs, recordDisplacedSkips as ct, injectedAwsRegionValue as cu, compensateRemovedDeletionProtection as d, declaresNoEcho as da, LockManager as dc, disableInstanceApiTermination as di, isDockerClientEnvKey as dl, secretBearing as dn, refuseMalformedResourcesForDeploy as do, storedSecretNameNeedles as dr, maskWholeValue as ds, withNestedRevertRun as dt, carriesFetchableDynamicReference as ea, splitGetAttStringForm as ec, CloudControlProvider as ei, validateContainerRepoName as el, nameScopeOf as en, refuseMalformedResourceAttributesForOrphan as eo, createReadOnlyAttributeHealerFactory as er, describeTypeWithThrottleRetry as es, keptForRetainedRecord as et, nullPrototypeRecord as eu, deleteBudgetKey as f, JSON_LISTING_HOLE_VALUE as fa, isLockInfoExpired as fc, ec2InstanceProtectionSite as fi, isMalformedEnvKey as fl, secretBearingStateKeyWarning as fn, refuseMalformedResourcesForDestroy as fo, ATOMIC_FINAL_SNAPSHOT_TYPES as fr, maskedLeafCoordinatesOf as fs, collectNestedChildUnaddressed as ft, INDEX_SETTLE_POLL_INTERVAL_MS as g, UNREADABLE_RESOURCES_MAP_ROW as ga, CrossPrefixScanCache as gc, reEnableInstanceApiTermination as gi, redactedDockerCause as gl, exportNameSecretExposure as gn, repairMalformedOrphansForReadOnly as go, createPreDeleteFinalSnapshot as gr, passedNoEchoParametersOf as gs, dropFailedCommands as gt, DELETE_INDEX_WAIT_PROCEED_NOTE as h, UNREADABLE_ORPHANS_CONTAINER_ROW as ha, CrossPrefixReadError as hc, reDisableInstanceApiTermination as hi, redactedCause as hl, exportNameNoEchoParameters as hn, repairMalformedOrphanRecordsForReadOnly as ho, ccRoutedFinalSnapshotError as hr, noEchoOutputsComparison as hs, deleteJournaledOrphans as ht, PROTECTION_PROPERTY_BY_TYPE as i, cfnRefValueFromPhysicalId as ia, recordMaskOnlyValuesIn as ic, UNSPECIFIED_SKIP_REASON as ii, describeDockerCapturedOutput as il, computeParameterTaint as in, refuseMalformedResourceEntriesForImport as io, namingSecretsWithRecordedNoEcho as ir, sameLambdaFunctionAddress as is, displacedPhysicalIdShown as it, displayAssemblyPath as iu, deferredServiceTokenWarning as j, malformedOrphanRecordsRefusalMessage as ja, importableOutputs as jc, outputReferenceProvenanceOf as ji, resolveStateBucketWithDefault as jl, getStackRecords as jn, findReplacedReadersOfRecreateTargets as jo, DBPROXY_TAGS_WHAT as jr, printingCorpusOf as js, recordAfterRollbackUpdate as jt, crossStackOutputProvenanceSource as k, malformedLocalResourceEntriesWarning as ka, hasUnverifiableParameterRefusal as kc, refuseUnreadableCdkCrossAccountRefs as ki, resolveCaptureObservedState as kl, awaitInFlightSibling as kn, NO_CC_HANDLERS_REASON as ko, isRefusedByName as kr, literalSplitDelimitersOf as ks, replayRollback as kt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as l, parameterInputsFor as la, WHOLE_DYNAMIC_REFERENCE_PATTERN as lc, isWaitAbandonedError as li, formatDockerLoginError as ll, displayTextOrWithheld as ln, refuseMalformedResourcePropertiesForExport as lo, secretNamedRecordNeedles as lr, maskAtCoordinates as ls, revertNestedChildFromJournal as lt, clearBucketRegionCache as lu, resolveDynamoDbDeleteBudgetMs as m, STATE_RESOURCES_MALFORMED as ma, rebuildClientForBucketRegion as mc, observeThenDisableInstanceApiTermination as mi, redactDockerArgvValues as ml, carriedExportAliasExposure as mn, refuseMalformedState as mo, buildFinalSnapshotIdentifier as mr, noEchoLeavesOf as ms, withNestedStackContext as mt, recordedProtectionEvidence as n, keepsSecretReferenceToken as na, provenPublicValue as nc, unchangedBehindSecretReference as ni, buildDockerImage as nl, retiredNameGenerationsAfter as nn, refuseMalformedResourceEntriesForDeploy as no, journaledOrphanPrintingBag as nr, canonicalLambdaFunctionName as ns, NESTED_PENDING_PARENT_REASON as nt, absoluteAssemblyPathEscape as nu, perType as o, refStateLookupFromResource as oa, recordNoEchoParameterFreshValue as oc, deleteLeftInPlace as oi, describeDockerFailure as ol, reachableDivergentParameters as on, refuseMalformedResourceEntriesForOrphan as oo, secretNamePrintingBag as or, TemplateParser as os, getNestedRevertRun as ot, resolveAssemblyPath as ou, resolveDynamoDbDeleteBudgetClock as p, STATE_REGION_DIVERGED as pa, S3StateBackend as pc, isTerminationProtectionPropagationError as pi, partitionSensitiveEnv as pl, secretSafeKeyDisplay as pn, refuseMalformedResourcesForExport as po, PRE_DELETE_SNAPSHOT_TYPES as pr, noEchoCoordinatesOf as ps, getCurrentNestedStackContext as pt, keptWholeReasonText as q, refuseMalformedOrphanRecords as qa, assertAssetBucketRegion as qc, regionLessSecretName as qi, derivePartitionAndUrlSuffix as ql, supersededHolderOf as qn, readConfigString as qo, readsNoEchoDeleteValues as qr, identityKeyFor as qs, isRedactedRecordedValue as qt, recordedProtectionNote as r, AWS_NO_VALUE as ra, recordMaskOnlyValue as rc, RollbackInlinePolicyWriters as ri, resolveDockerContextDirectory as rl, retiredNameGenerationsLeaving as rn, refuseMalformedResourceEntriesForDestroy as ro, maskEventTextWithBoundBags as rr, lambdaFunctionNameForMask as rs, displacedOpClause as rt, describeFileReadFailure as ru, readProtection as s, parseWebACLArn as sa, recordProvenPublicExpression as sc, deleteSkipReason as si, dockerSpawnEnvWithSensitive as sl, resourcesNamingDeclaredParameter as sn, refuseMalformedResourcePropertiesForDestroy as so, secretNamePrintingBags as sr, canonicalCoordinates as ss, nestedChildStackName as st, injectAwsRegion as su, DeployEngine as t, isNamelessDynamicReferenceError as ta, carriesSecretMask as tc, slowCcOperationTimeoutMs as ti, buildDenyExternalAccessPolicy as tl, retiredAfterRollback as tn, refuseMalformedResourceEntries as to, completedReplayEntries as tr, withRetry as ts, recordRetainedForReadoption as tt, ownValue as tu, beginDeleteWait as u, passedParameterClassesOf as ua, isSingleDynamicReferenceToken as uc, markWaitAbandoned as ui, getDockerCmd as ul, exportAliasCollisionScrubWarning as un, refuseMalformedResourcePropertiesForOrphan as uo, stateSecretNameNeedles as ur, maskReadbackAtCoordinates as us, revertedNestedRowIds as ut, resolveBucketRegion as uu, maskedLogger as v, deployRefusesOrphanRowsReason as va, crossPrefixDeniedWarning as vc, INTRINSIC_KEYS as vi, runDockerStreaming as vl, noEchoParameterValueSeed as vn, repairMalformedResourceEntriesForReadOnly as vo, isFinalSnapshotError as vr, readsNoEchoSource as vs, isHandledOrphan as vt, isTruthyCfnBoolean as w, isReadableResourceEntry as wa, acceptedCreateOnlyDropsOf as wc, s3BucketDualStackDomainName as wi, getDefaultStateBucketName as wl, DEFAULT_RESOURCE_WARN_AFTER_MS as wn, withheldAccountClause as wo, withCreateTokenLedger as wr, recordReferenceProvenanceEntry as ws, chunks as wt, ECR_AUTO_DELETE_IMAGES_TAG as x, hasReadableOutputs as xa, stackInstanceIdOf as xc, isSettledInstanceState as xi, getDockerImageBySourceHash as xl, isExportAliasCollision as xn, unpreviewableOrphanRecords as xo, earliestDefined as xr, liveMatchesUnresolvedTokenFrame as xs, makeForeignHolderScan as xt, relayedIndexBusyDelete as y, displayLogicalId as ya, isAccessDenied$1 as yc, IntrinsicFunctionResolver as yi, warnFinchArgvExposure as yl, collectDeclaredOutputNames as yn, repairMalformedResourcePropertiesForReadOnly as yo, refusesFinalSnapshot as yr, recordedNoEchoValuesOf as ys, journaledOrphanLines as yt, templateIdentity as z, malformedResourceEntriesWarning as za, stringifyValue as zc, sendableAssumeRoleCommand as zi, MIGRATE_TMP_PREFIX as zl, yellow as zn, isWarmThroughputDecrease as zo, stringifyIfAssigned as zr, maskSecretsInText as zs, replacementNeverSwapped as zt };
50456
+ //# sourceMappingURL=deploy-engine-CYVt2NQR.js.map