@go-to-k/cdkd 0.296.6 → 0.296.8

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 (25) hide show
  1. package/dist/{asg-provider-C1TlpooI.js → asg-provider-BDJ1qN0J.js} +2 -2
  2. package/dist/{asg-provider-C1TlpooI.js.map → asg-provider-BDJ1qN0J.js.map} +1 -1
  3. package/dist/cli.js +2 -2
  4. package/dist/{deploy-engine-BPcBCyUE.js → deploy-engine-iXgQFHYR.js} +594 -408
  5. package/dist/deploy-engine-iXgQFHYR.js.map +1 -0
  6. package/dist/{iam-role-provider-CVIClaZV.js → iam-role-provider-B1Ma2zVK.js} +117 -6
  7. package/dist/iam-role-provider-B1Ma2zVK.js.map +1 -0
  8. package/dist/index.d.ts +19 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +2 -2
  11. package/dist/{neptune-provider-CvY6ekmg.js → neptune-provider-C-WMp2hQ.js} +2 -2
  12. package/dist/{neptune-provider-CvY6ekmg.js.map → neptune-provider-C-WMp2hQ.js.map} +1 -1
  13. package/dist/{program-CAlg2KEF.js → program-CPziYRDp.js} +130 -78
  14. package/dist/program-CPziYRDp.js.map +1 -0
  15. package/dist/{provider-classes-oRTqcSCp.js → provider-classes-CxXTKgEM.js} +177 -117
  16. package/dist/provider-classes-CxXTKgEM.js.map +1 -0
  17. package/dist/{rds-provider-DeGFzOUc.js → rds-provider-C193wAF8.js} +2 -2
  18. package/dist/{rds-provider-DeGFzOUc.js.map → rds-provider-C193wAF8.js.map} +1 -1
  19. package/dist/{version-BgqcIKdb.js → version-Br6yDF8t.js} +2 -2
  20. package/dist/{version-BgqcIKdb.js.map → version-Br6yDF8t.js.map} +1 -1
  21. package/package.json +1 -1
  22. package/dist/deploy-engine-BPcBCyUE.js.map +0 -1
  23. package/dist/iam-role-provider-CVIClaZV.js.map +0 -1
  24. package/dist/program-CAlg2KEF.js.map +0 -1
  25. package/dist/provider-classes-oRTqcSCp.js.map +0 -1
@@ -2,7 +2,7 @@ import { r as getAwsClients, s as __exportAll } from "./aws-clients-CnmtbrxD.js"
2
2
  import { A as displayIdent, C as withoutGeneratedFallbackName, D as UNRENDERABLE, E as STACK_REF_MAX_CODE_POINTS, F as plainIdentOr, I as safeMsg, M as displayStackName, N as isPasteableIdent, R as truncateCodePoints, S as withStackName, T as SECRET_REF_MAX_CODE_POINTS, _ as generateResourceNameWithFallback, b as looksLikeCdkdGeneratedName, c as installLogLineMaskerSource, g as generateResourceName, h as explicitNamePropertyFor, j as displaySafe, k as displayAwsMessage, l as getLiveRenderer, n as getLogger, p as applyDefaultNameForFallback, r as isStdoutReservedForPayload, s as currentLogLineMasker, v as getCurrentSkipPrefix, x as withSkipPrefix, y as getCurrentStackName } from "./logger-DAaB7GFO.js";
3
3
  import { $n as markRedactedCause, $t as LockError, A as isTerminalDeleteFailure, At as CUSTOM_RESOURCE_RESPONSE_PREFIX, Bn as isAmbiguousCcHandlerErrorCode, Bt as clientDefaultsFor, C as refusalTypeShown, Cn as physicalIdShownBesideCommand, Ct as buildForceUnlockCommand, D as ProtectionFlipRegistry, Dn as shellQuote, Dt as formatLockOperation, En as shellBoundedDisplay, Et as formatLockExpiry, Fn as isRecreateRetryableError, Ft as producerRecordKey, Gn as retryClassificationText, H as pasteableAwsCommand, Hn as isIamPropagationError, Ht as AccountIdUnavailableError, In as isReplayedNameCollisionFrom, J as isInterruptedWaitError, Jn as safeStringify$1, Kn as describeAwsFailure, Kt as CrossAccountSecretRefusalError, Lt as withPasteableAwsProfile, M as observeThenDisableProtection, Mn as hasReplayMayCollide, Mt as injectiveKey, N as protectionFlipKey, Nn as isNameCollisionErrorFrom, O as compensateProtectionFlip, On as withheldTargetClause, Ot as formatLockOwner, Pn as isNameCooldownError, Q as canonicalizeRoute53QueryName, Qn as markNonRetryable, R as DELETION_PROTECTION_DOC_POINTER, Rn as markReplayMayCollide, Rt as ambientClientDefaults, S as quotedRemedyLogicalId, Sn as pasteableCommand, St as UNREPRODUCIBLE_LOCK_CLAUSE, T as resolveExplicitPhysicalId, Tn as quotedOrDescribed, U as protectedReplacementAdvice, Un as isRetryableTransientError, Ut as AssetError, Vn as isAmbiguousOutcomeError, Vt as credentialFingerprint, Wn as isTransientServerError, Wt as CdkdError, X as ElapsedBudgetRegistry, Xn as isMarkedNonRetryable, Xt as IntrinsicResolutionRefusalError, Y as startInterruptWatch, Yt as DynamicReferenceRegionAmbiguousError, Z as monotonicNowMs, Zn as isThrottlingError, _n as SHELL_ACTIVE_WHY, _t as hasCreatedBeforeFailure, an as ResourceTimeoutError, at as segmentAfterAnchor, b as isQuotableImportValue, bt as markAuxiliaryFailure, ct as createMaskedRetryLogger, d as prepareRemovalForUpdate, dt as maskerOrIdentity, en as MacroExpansionError, er as wrapMaskedAwsError, et as compositeIdSeparatorRefusal, f as removalWarning, ft as withDerivedNameMasks, g as assertRegionMatch, gn as SHELL_ACTIVE, gt as createdBeforeFailure, h as RESOURCE_NOT_FOUND, i as holdsSecretDerivedEntry, in as ProvisioningError, it as resourceTypeShown, jn as isUpdateUnsupportedError, jt as DEFAULT_STATE_PREFIX, k as deleteWithProtectionCompensation, kt as sanitizeRecoveryValue, l as withUnchangedSecretPrincipalLists, ln as StateError, lt as isSecretDerivedValue, m as withoutInjectedRemovals, mt as carryCreatedBeforeFailure, nt as logicalIdShown, on as ResourceUpdateNotSupportedError, ot as stateOrphanRecordRemedy, pn as normalizeAwsError, pt as RETRY_AUXILIARY_OWNER, qt as DependencyError, st as createMaskedLogSinks, tn as MalformedProducerRecordRefusalError, un as SynthesisError, ut as maskDeep, vn as UNSHOWABLE_VALUE, vt as isAuxiliaryFailure, wn as plainOrDescribed, x as normalizeAwsTagsToCfn, xn as isInertUnquoted, xt as markCreatedBeforeFailure, yn as commandHole, yt as isAuxiliaryMarkOf, zn as formatRetryClassificationSignals, zt as ambientCredentialConfig } from "./iam-policy-targets-td1X_kKN.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-D0q0z4dG.js";
5
- import { t as getCdkdVersion } from "./version-BgqcIKdb.js";
5
+ import { t as getCdkdVersion } from "./version-Br6yDF8t.js";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
8
8
  import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -6822,6 +6822,330 @@ function positionListByCrossStackSource(bag, source, secrets) {
6822
6822
  return certifiedListForLeaf(secrets, association, bag);
6823
6823
  }
6824
6824
 
6825
+ //#endregion
6826
+ //#region src/deployment/secret-redaction/fresh-noecho.ts
6827
+ function embedsFreshNoEchoValue(text, secrets) {
6828
+ const fresh = freshNoEchoValuesOf.get(secrets);
6829
+ if (fresh === void 0) return false;
6830
+ for (const value of fresh) if (isMaskOnlyPlaintext(secrets, value) && text.includes(value)) return true;
6831
+ return false;
6832
+ }
6833
+ function carriesFreshNoEchoValue(value, secrets) {
6834
+ const isFresh = freshNoEchoLeafTest(secrets);
6835
+ if (isFresh === void 0) return false;
6836
+ const seen = /* @__PURE__ */ new Set();
6837
+ const walk = (node) => {
6838
+ if (typeof node === "string") return isFresh(node);
6839
+ if (node === null || typeof node !== "object") return false;
6840
+ if (seen.has(node)) return false;
6841
+ seen.add(node);
6842
+ if (Array.isArray(node)) return node.some((item) => walk(item));
6843
+ return Object.values(node).some((child) => walk(child));
6844
+ };
6845
+ return walk(value);
6846
+ }
6847
+ function freshNoEchoLeafPositions(value, secrets) {
6848
+ const isFresh = freshNoEchoLeafTest(secrets);
6849
+ if (isFresh === void 0) return [];
6850
+ const leaves = [];
6851
+ const ancestors = /* @__PURE__ */ new Set();
6852
+ const walk = (node, path) => {
6853
+ if (typeof node === "string") {
6854
+ if (isFresh(node)) leaves.push({
6855
+ path,
6856
+ plaintext: node
6857
+ });
6858
+ return;
6859
+ }
6860
+ if (node === null || typeof node !== "object") return;
6861
+ if (ancestors.has(node)) return;
6862
+ ancestors.add(node);
6863
+ if (Array.isArray(node)) node.forEach((item, index) => walk(item, [...path, index]));
6864
+ else for (const [key, child] of Object.entries(node)) walk(child, [...path, key]);
6865
+ ancestors.delete(node);
6866
+ };
6867
+ walk(value, []);
6868
+ return leaves;
6869
+ }
6870
+ function freshNoEchoLeafTest(secrets) {
6871
+ const fresh = freshNoEchoValuesOf.get(secrets);
6872
+ if (fresh === void 0 || fresh.size === 0) return void 0;
6873
+ const needles = containmentNeedlesOf(secrets).filter((needle) => fresh.has(needle));
6874
+ return (leaf) => fresh.has(leaf) && isMaskOnlyPlaintext(secrets, leaf) || leaf !== "***" && embedsNeedleOutsideReferences(leaf, needles, secrets);
6875
+ }
6876
+ function containmentNeedlesOf(secrets) {
6877
+ const values = containmentValuesOf.get(secrets);
6878
+ if (values === void 0 || values.size === 0) return [];
6879
+ const needles = [];
6880
+ for (const value of values) if (value.length >= 4 && isMaskOnlyPlaintext(secrets, value)) needles.push(value);
6881
+ return needles;
6882
+ }
6883
+ function isStrictlyInsideASpan(spans, start, end) {
6884
+ return spans.some((span) => span.start <= start && end <= span.end && (span.start !== start || span.end !== end));
6885
+ }
6886
+ function embedsNeedleOutsideReferences(leaf, needles, secrets) {
6887
+ let spans;
6888
+ for (const needle of needles) for (let at = leaf.indexOf(needle); at >= 0; at = leaf.indexOf(needle, at + 1)) {
6889
+ spans ??= isDynamicReferenceString(leaf) ? resolvableReferenceSpans(leaf, new Set(secrets.values())) : [];
6890
+ if (!isStrictlyInsideASpan(spans, at, at + needle.length)) return true;
6891
+ }
6892
+ return false;
6893
+ }
6894
+ function flattenEmbeddedNoEchoLeaves(value, secrets) {
6895
+ const needles = containmentNeedlesOf(secrets);
6896
+ if (needles.length === 0) return value;
6897
+ const flattens = (leaf) => leaf !== "***" && embedsNeedleOutsideReferences(leaf, needles, secrets);
6898
+ const walk = (node) => {
6899
+ if (typeof node === "string") return flattens(node) ? "***" : node;
6900
+ if (node === null || typeof node !== "object") return node;
6901
+ if (Array.isArray(node)) {
6902
+ let changed = false;
6903
+ const out = node.map((item) => {
6904
+ const next = walk(item);
6905
+ if (next !== item) changed = true;
6906
+ return next;
6907
+ });
6908
+ return changed ? out : node;
6909
+ }
6910
+ if (isOrdinaryDate(node)) {
6911
+ const persisted = node.toJSON();
6912
+ return typeof persisted === "string" && flattens(persisted) ? "***" : node;
6913
+ }
6914
+ let out;
6915
+ for (const [key, child] of Object.entries(node)) {
6916
+ const next = walk(child);
6917
+ if (next === child) continue;
6918
+ out ??= Object.assign(Object.create(null), node);
6919
+ out[key] = next;
6920
+ }
6921
+ return out ?? node;
6922
+ };
6923
+ return walk(value);
6924
+ }
6925
+ function substringNeedlesOf(secrets) {
6926
+ const needles = [];
6927
+ for (const plaintext of secrets.keys()) if (!isMaskOnlyPlaintext(secrets, plaintext)) needles.push(plaintext);
6928
+ return needles;
6929
+ }
6930
+ function recordedExpressionsOf(secrets) {
6931
+ const expressions = /* @__PURE__ */ new Set();
6932
+ for (const [plaintext, expression] of secrets) if (!isMaskOnlyPlaintext(secrets, plaintext)) expressions.add(expression);
6933
+ return expressions;
6934
+ }
6935
+ const recoverableMaskedOutputs = /* @__PURE__ */ new Map();
6936
+ function maskedOutputKey(identity, stackName, region, outputKey) {
6937
+ return `${identity}\u0000${stackName}\u0000${region}\u0000${outputKey}`;
6938
+ }
6939
+ function recordRecoverableMaskedOutput(identity, stackName, region, outputKey, plaintext) {
6940
+ recoverableMaskedOutputs.set(maskedOutputKey(identity, stackName, region, outputKey), plaintext);
6941
+ }
6942
+ function recoverMaskedOutput(identity, stackName, region, outputKey) {
6943
+ return recoverableMaskedOutputs.get(maskedOutputKey(identity, stackName, region, outputKey));
6944
+ }
6945
+
6946
+ //#endregion
6947
+ //#region src/deployment/secret-redaction/nested-stack.ts
6948
+ const NESTED_STACK_RESOURCE_TYPE$4 = "AWS::CloudFormation::Stack";
6949
+ const nestedStackParameterExpressions = /* @__PURE__ */ new WeakMap();
6950
+ const UNFRAMED_SPELLING = Symbol("cdkd.nested-parameter.unframed-spelling");
6951
+ function recordNestedStackParameterExpressions(secrets, resourceType, resolvedProperties, sourceProperties, rules = TEMPLATE_DERIVED_RULES) {
6952
+ if (resourceType !== NESTED_STACK_RESOURCE_TYPE$4) return;
6953
+ if (secrets.size === 0) return;
6954
+ if (!isPlainObject$4(resolvedProperties) || !isPlainObject$4(sourceProperties)) return;
6955
+ if (!Object.hasOwn(resolvedProperties, "Parameters")) return;
6956
+ if (!Object.hasOwn(sourceProperties, "Parameters")) return;
6957
+ const resolvedParameters = resolvedProperties["Parameters"];
6958
+ const sourceParameters = sourceProperties["Parameters"];
6959
+ if (!isPlainObject$4(resolvedParameters) || !isPlainObject$4(sourceParameters)) return;
6960
+ const positioned = redactSecretsForState(markSameGenerationBag({ ...resolvedParameters }), secrets, sourceParameters, rules);
6961
+ let table = nestedStackParameterExpressions.get(secrets);
6962
+ for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
6963
+ if (typeof resolvedValue !== "string" || !secrets.has(resolvedValue)) continue;
6964
+ const expression = positioned[name];
6965
+ if (typeof expression !== "string") continue;
6966
+ if (!isSingleDynamicReferenceToken(expression)) continue;
6967
+ const sourceLeaf = sourceParameters[name];
6968
+ if (typeof sourceLeaf === "string" && expression !== sourceLeaf) continue;
6969
+ if (expression === resolvedValue) continue;
6970
+ const seenResolvingTo = plaintextIndexOf(secrets).get(expression);
6971
+ if (seenResolvingTo !== void 0 && seenResolvingTo !== resolvedValue) continue;
6972
+ if (typeof sourceLeaf === "string" && resolvedPlaintextOf(secrets, expression) !== resolvedValue) continue;
6973
+ if (table === void 0) {
6974
+ table = /* @__PURE__ */ new Map();
6975
+ nestedStackParameterExpressions.set(secrets, table);
6976
+ }
6977
+ storeAssociation(table, name, expression, resolvedValue);
6978
+ }
6979
+ const framesByValue = /* @__PURE__ */ new Map();
6980
+ const tokensOf = /* @__PURE__ */ new Map();
6981
+ const frameSpellings = /* @__PURE__ */ new Map();
6982
+ const frameSpellingOf = (name) => {
6983
+ if (!frameSpellings.has(name)) frameSpellings.set(name, computeFrameSpelling(name));
6984
+ return frameSpellings.get(name);
6985
+ };
6986
+ const computeFrameSpelling = (name) => {
6987
+ const resolvedValue = resolvedParameters[name];
6988
+ if (typeof resolvedValue !== "string") return void 0;
6989
+ const sourceLeaf = sourceParameters[name];
6990
+ if (typeof sourceLeaf === "string") return sourceLeaf;
6991
+ if (!isPlainObject$4(sourceLeaf)) return void 0;
6992
+ const written = positioned[name];
6993
+ if (typeof written !== "string") return void 0;
6994
+ const rendered = intrinsicSkeletonSegments(sourceLeaf)?.map((s) => s === UNKNOWN_PART ? "\0" : s).join("");
6995
+ const spans = rendered === void 0 ? [] : dynamicReferenceSpans(rendered);
6996
+ if (rendered !== void 0 && spans.length === 1) {
6997
+ const [span] = spans;
6998
+ const ownToken = rendered.slice(span.start, span.end);
6999
+ if (written !== resolvedValue && SPELLED_SECRET_REFERENCE_PREFIXES.some((prefix) => ownToken.startsWith(prefix))) return written;
7000
+ }
7001
+ const substituted = substitutedSpellingOf(secrets, sourceLeaf, resolvedValue);
7002
+ if (substituted === void 0) return void 0;
7003
+ return written === resolvedValue || written === substituted ? substituted : void 0;
7004
+ };
7005
+ const certifiedSpellingOf = (name) => {
7006
+ const sourceLeaf = sourceParameters[name];
7007
+ if (typeof sourceLeaf === "string") return positioned[name] === sourceLeaf ? sourceLeaf : void 0;
7008
+ return frameSpellingOf(name);
7009
+ };
7010
+ const unwrittenValues = /* @__PURE__ */ new Set();
7011
+ for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
7012
+ if (typeof resolvedValue !== "string") continue;
7013
+ const spelling = frameSpellingOf(name);
7014
+ const frame = spelling === void 0 ? void 0 : singleSpanFrame(resolvedValue, spelling);
7015
+ const frames = framesByValue.get(resolvedValue) ?? /* @__PURE__ */ new Set();
7016
+ const unframed = frame === void 0 || resolvedPlaintextOf(secrets, frame.token) !== frame.middle;
7017
+ frames.add(unframed ? UNFRAMED_SPELLING : `${frame.prefix.length}:${frame.prefix}${frame.suffix}`);
7018
+ framesByValue.set(resolvedValue, frames);
7019
+ if (!unframed) {
7020
+ const tokens = tokensOf.get(resolvedValue) ?? /* @__PURE__ */ new Set();
7021
+ tokens.add(frame.token);
7022
+ tokensOf.set(resolvedValue, tokens);
7023
+ if (typeof sourceParameters[name] !== "string" && positioned[name] !== spelling) unwrittenValues.add(resolvedValue);
7024
+ }
7025
+ }
7026
+ for (const value of unwrittenValues) if (tokensOf.get(value)?.size !== 1) framesByValue.get(value)?.add(UNFRAMED_SPELLING);
7027
+ const rowWithoutParameters = {};
7028
+ for (const [key, value] of Object.entries(resolvedProperties)) if (key !== "Parameters") rowWithoutParameters[key] = value;
7029
+ const outsideLeaves = wholeStringLeavesOf(rowWithoutParameters);
7030
+ const framed = /* @__PURE__ */ new Map();
7031
+ const framedByName = [];
7032
+ for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
7033
+ if (typeof resolvedValue !== "string") continue;
7034
+ const spelling = certifiedSpellingOf(name);
7035
+ if (spelling === void 0) continue;
7036
+ if (redactSecretsForState(resolvedValue, secrets) !== resolvedValue) continue;
7037
+ const frame = singleSpanFrame(resolvedValue, spelling);
7038
+ if (frame === void 0 || resolvedPlaintextOf(secrets, frame.token) !== frame.middle) continue;
7039
+ if (framesByValue.get(resolvedValue)?.size !== 1) continue;
7040
+ const isNeedle = resolvedValue.length >= 4;
7041
+ const rewrites = (leaf) => leaf === resolvedValue || isNeedle && leaf.includes(resolvedValue);
7042
+ let embedded = false;
7043
+ for (const leaf of outsideLeaves) if (rewrites(leaf)) {
7044
+ embedded = true;
7045
+ break;
7046
+ }
7047
+ for (const other of Object.values(resolvedParameters)) {
7048
+ if (embedded) break;
7049
+ if (typeof other === "string") {
7050
+ if (other !== resolvedValue && rewrites(other)) embedded = true;
7051
+ continue;
7052
+ }
7053
+ for (const leaf of wholeStringLeavesOf(other)) if (rewrites(leaf)) {
7054
+ embedded = true;
7055
+ break;
7056
+ }
7057
+ }
7058
+ if (embedded) continue;
7059
+ framedByName.push([
7060
+ name,
7061
+ spelling,
7062
+ resolvedValue
7063
+ ]);
7064
+ if (secrets.get(frame.middle) !== frame.token && tokensOf.get(resolvedValue)?.size !== 1) continue;
7065
+ framed.set(resolvedValue, spelling);
7066
+ }
7067
+ for (const [plaintext, expression] of framed) secrets.set(plaintext, expression);
7068
+ for (const [name, expression, plaintext] of framedByName) {
7069
+ if (table === void 0) {
7070
+ table = /* @__PURE__ */ new Map();
7071
+ nestedStackParameterExpressions.set(secrets, table);
7072
+ }
7073
+ storeAssociation(table, name, expression, plaintext);
7074
+ }
7075
+ }
7076
+ function inheritNestedStackParameterAssociations(childSecrets, parentSecrets) {
7077
+ const table = nestedStackParameterExpressions.get(parentSecrets);
7078
+ if (table === void 0 || table.size === 0) return;
7079
+ let associations = crossStackAssociations.get(childSecrets);
7080
+ for (const [name, association] of table) {
7081
+ const key = crossStackSourceKey({ Ref: name });
7082
+ if (key === void 0) continue;
7083
+ if (associations === void 0) {
7084
+ associations = /* @__PURE__ */ new Map();
7085
+ crossStackAssociations.set(childSecrets, associations);
7086
+ }
7087
+ if (typeof association === "symbol") {
7088
+ associations.set(key, association);
7089
+ continue;
7090
+ }
7091
+ storeAssociation(associations, key, association.expression, association.plaintext);
7092
+ }
7093
+ }
7094
+ function inheritedParameterExpression(parentSecrets, parameterName, resolvedValue) {
7095
+ const association = nestedStackParameterExpressions.get(parentSecrets)?.get(parameterName);
7096
+ if (association === void 0 || typeof association === "symbol") return void 0;
7097
+ if (Array.isArray(resolvedValue)) return certifiedListForLeaf(parentSecrets, association, resolvedValue);
7098
+ return certifiedExpressionForLeaf(parentSecrets, association, resolvedValue);
7099
+ }
7100
+ const inheritedParameterReads = /* @__PURE__ */ new WeakMap();
7101
+ const POISONED_PARAMETER_READS = Symbol("cdkd.inherited-parameter-reads.poisoned");
7102
+ function recordInheritedParameterRead(childSecrets, parentSecrets, parameterName) {
7103
+ const reads = inheritedParameterReads.get(childSecrets);
7104
+ if (reads === void 0) {
7105
+ inheritedParameterReads.set(childSecrets, {
7106
+ parent: parentSecrets,
7107
+ names: /* @__PURE__ */ new Set([parameterName])
7108
+ });
7109
+ return;
7110
+ }
7111
+ if (typeof reads === "symbol") return;
7112
+ if (reads.parent !== parentSecrets) {
7113
+ inheritedParameterReads.set(childSecrets, POISONED_PARAMETER_READS);
7114
+ return;
7115
+ }
7116
+ reads.names.add(parameterName);
7117
+ }
7118
+ function redactInheritedParameterValue(parentSecrets, parameterName, value) {
7119
+ return inheritedParameterExpression(parentSecrets, parameterName, value) ?? redactSecretsForState(value, parentSecrets);
7120
+ }
7121
+ function positionByInheritedParameter(bag, source, secrets) {
7122
+ const keys = Object.keys(source);
7123
+ if (keys.length !== 1 || keys[0] !== "Ref") return void 0;
7124
+ const name = source["Ref"];
7125
+ if (typeof name !== "string") return void 0;
7126
+ const reads = inheritedParameterReads.get(secrets);
7127
+ if (reads === void 0 || typeof reads === "symbol" || !reads.names.has(name)) return;
7128
+ if (typeof bag !== "string" && !Array.isArray(bag)) return void 0;
7129
+ if (carriesChildOnlyPlaintext(bag, secrets, reads.parent)) return void 0;
7130
+ const answer = redactInheritedParameterValue(reads.parent, name, bag);
7131
+ if (!deepEqualJsonValue(redactSecretsForState(answer, secrets), answer)) return void 0;
7132
+ return answer;
7133
+ }
7134
+ function carriesChildOnlyPlaintext(value, childSecrets, parentSecrets) {
7135
+ const parentNeedles = new Set(substringNeedlesOf(parentSecrets));
7136
+ const childNeedles = new Set(substringNeedlesOf(childSecrets));
7137
+ const childOnly = [...childSecrets.keys()].filter((plaintext) => plaintext !== "" && (!parentSecrets.has(plaintext) || childNeedles.has(plaintext) && !parentNeedles.has(plaintext)));
7138
+ for (const needle of parentNeedles) if (needle.length >= 4 && !childSecrets.has(needle)) childOnly.push(needle);
7139
+ if (childOnly.length === 0) return false;
7140
+ const visit = (node) => {
7141
+ if (typeof node === "string") return childOnly.some((plaintext) => node.includes(plaintext));
7142
+ if (Array.isArray(node)) return node.some(visit);
7143
+ if (node !== null && typeof node === "object") return Object.values(node).some(visit);
7144
+ return false;
7145
+ };
7146
+ return visit(value);
7147
+ }
7148
+
6825
7149
  //#endregion
6826
7150
  //#region src/deployment/secret-redaction/redact-path.ts
6827
7151
  function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameGeneration) {
@@ -6835,6 +7159,10 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
6835
7159
  }
6836
7160
  return positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration);
6837
7161
  }
7162
+ if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$4(source)) {
7163
+ const inherited = positionByInheritedParameter(bag, source, secrets);
7164
+ if (inherited !== void 0) return inherited;
7165
+ }
6838
7166
  if (typeof bag === "string" && isPlainObject$4(source)) {
6839
7167
  const certified = positionByCrossStackSource(bag, source, secrets);
6840
7168
  if (certified !== void 0) return certified;
@@ -7189,127 +7517,6 @@ function deriveReadbackNeedles(bag, source, secrets, rules) {
7189
7517
  };
7190
7518
  }
7191
7519
 
7192
- //#endregion
7193
- //#region src/deployment/secret-redaction/fresh-noecho.ts
7194
- function embedsFreshNoEchoValue(text, secrets) {
7195
- const fresh = freshNoEchoValuesOf.get(secrets);
7196
- if (fresh === void 0) return false;
7197
- for (const value of fresh) if (isMaskOnlyPlaintext(secrets, value) && text.includes(value)) return true;
7198
- return false;
7199
- }
7200
- function carriesFreshNoEchoValue(value, secrets) {
7201
- const isFresh = freshNoEchoLeafTest(secrets);
7202
- if (isFresh === void 0) return false;
7203
- const seen = /* @__PURE__ */ new Set();
7204
- const walk = (node) => {
7205
- if (typeof node === "string") return isFresh(node);
7206
- if (node === null || typeof node !== "object") return false;
7207
- if (seen.has(node)) return false;
7208
- seen.add(node);
7209
- if (Array.isArray(node)) return node.some((item) => walk(item));
7210
- return Object.values(node).some((child) => walk(child));
7211
- };
7212
- return walk(value);
7213
- }
7214
- function freshNoEchoLeafPositions(value, secrets) {
7215
- const isFresh = freshNoEchoLeafTest(secrets);
7216
- if (isFresh === void 0) return [];
7217
- const leaves = [];
7218
- const ancestors = /* @__PURE__ */ new Set();
7219
- const walk = (node, path) => {
7220
- if (typeof node === "string") {
7221
- if (isFresh(node)) leaves.push({
7222
- path,
7223
- plaintext: node
7224
- });
7225
- return;
7226
- }
7227
- if (node === null || typeof node !== "object") return;
7228
- if (ancestors.has(node)) return;
7229
- ancestors.add(node);
7230
- if (Array.isArray(node)) node.forEach((item, index) => walk(item, [...path, index]));
7231
- else for (const [key, child] of Object.entries(node)) walk(child, [...path, key]);
7232
- ancestors.delete(node);
7233
- };
7234
- walk(value, []);
7235
- return leaves;
7236
- }
7237
- function freshNoEchoLeafTest(secrets) {
7238
- const fresh = freshNoEchoValuesOf.get(secrets);
7239
- if (fresh === void 0 || fresh.size === 0) return void 0;
7240
- const needles = containmentNeedlesOf(secrets).filter((needle) => fresh.has(needle));
7241
- return (leaf) => fresh.has(leaf) && isMaskOnlyPlaintext(secrets, leaf) || leaf !== "***" && embedsNeedleOutsideReferences(leaf, needles, secrets);
7242
- }
7243
- function containmentNeedlesOf(secrets) {
7244
- const values = containmentValuesOf.get(secrets);
7245
- if (values === void 0 || values.size === 0) return [];
7246
- const needles = [];
7247
- for (const value of values) if (value.length >= 4 && isMaskOnlyPlaintext(secrets, value)) needles.push(value);
7248
- return needles;
7249
- }
7250
- function isStrictlyInsideASpan(spans, start, end) {
7251
- return spans.some((span) => span.start <= start && end <= span.end && (span.start !== start || span.end !== end));
7252
- }
7253
- function embedsNeedleOutsideReferences(leaf, needles, secrets) {
7254
- let spans;
7255
- for (const needle of needles) for (let at = leaf.indexOf(needle); at >= 0; at = leaf.indexOf(needle, at + 1)) {
7256
- spans ??= isDynamicReferenceString(leaf) ? resolvableReferenceSpans(leaf, new Set(secrets.values())) : [];
7257
- if (!isStrictlyInsideASpan(spans, at, at + needle.length)) return true;
7258
- }
7259
- return false;
7260
- }
7261
- function flattenEmbeddedNoEchoLeaves(value, secrets) {
7262
- const needles = containmentNeedlesOf(secrets);
7263
- if (needles.length === 0) return value;
7264
- const flattens = (leaf) => leaf !== "***" && embedsNeedleOutsideReferences(leaf, needles, secrets);
7265
- const walk = (node) => {
7266
- if (typeof node === "string") return flattens(node) ? "***" : node;
7267
- if (node === null || typeof node !== "object") return node;
7268
- if (Array.isArray(node)) {
7269
- let changed = false;
7270
- const out = node.map((item) => {
7271
- const next = walk(item);
7272
- if (next !== item) changed = true;
7273
- return next;
7274
- });
7275
- return changed ? out : node;
7276
- }
7277
- if (isOrdinaryDate(node)) {
7278
- const persisted = node.toJSON();
7279
- return typeof persisted === "string" && flattens(persisted) ? "***" : node;
7280
- }
7281
- let out;
7282
- for (const [key, child] of Object.entries(node)) {
7283
- const next = walk(child);
7284
- if (next === child) continue;
7285
- out ??= Object.assign(Object.create(null), node);
7286
- out[key] = next;
7287
- }
7288
- return out ?? node;
7289
- };
7290
- return walk(value);
7291
- }
7292
- function substringNeedlesOf(secrets) {
7293
- const needles = [];
7294
- for (const plaintext of secrets.keys()) if (!isMaskOnlyPlaintext(secrets, plaintext)) needles.push(plaintext);
7295
- return needles;
7296
- }
7297
- function recordedExpressionsOf(secrets) {
7298
- const expressions = /* @__PURE__ */ new Set();
7299
- for (const [plaintext, expression] of secrets) if (!isMaskOnlyPlaintext(secrets, plaintext)) expressions.add(expression);
7300
- return expressions;
7301
- }
7302
- const recoverableMaskedOutputs = /* @__PURE__ */ new Map();
7303
- function maskedOutputKey(identity, stackName, region, outputKey) {
7304
- return `${identity}\u0000${stackName}\u0000${region}\u0000${outputKey}`;
7305
- }
7306
- function recordRecoverableMaskedOutput(identity, stackName, region, outputKey, plaintext) {
7307
- recoverableMaskedOutputs.set(maskedOutputKey(identity, stackName, region, outputKey), plaintext);
7308
- }
7309
- function recoverMaskedOutput(identity, stackName, region, outputKey) {
7310
- return recoverableMaskedOutputs.get(maskedOutputKey(identity, stackName, region, outputKey));
7311
- }
7312
-
7313
7520
  //#endregion
7314
7521
  //#region src/deployment/secret-redaction/redact-state.ts
7315
7522
  function redactSecretsForState(bag, secrets, source, rules = TEMPLATE_DERIVED_RULES) {
@@ -8023,161 +8230,6 @@ function hasMaskableValues(secrets) {
8023
8230
  return logOnly !== void 0 && logOnly.size > 0;
8024
8231
  }
8025
8232
 
8026
- //#endregion
8027
- //#region src/deployment/secret-redaction/nested-stack.ts
8028
- const NESTED_STACK_RESOURCE_TYPE$4 = "AWS::CloudFormation::Stack";
8029
- const nestedStackParameterExpressions = /* @__PURE__ */ new WeakMap();
8030
- const UNFRAMED_SPELLING = Symbol("cdkd.nested-parameter.unframed-spelling");
8031
- function recordNestedStackParameterExpressions(secrets, resourceType, resolvedProperties, sourceProperties, rules = TEMPLATE_DERIVED_RULES) {
8032
- if (resourceType !== NESTED_STACK_RESOURCE_TYPE$4) return;
8033
- if (secrets.size === 0) return;
8034
- if (!isPlainObject$4(resolvedProperties) || !isPlainObject$4(sourceProperties)) return;
8035
- if (!Object.hasOwn(resolvedProperties, "Parameters")) return;
8036
- if (!Object.hasOwn(sourceProperties, "Parameters")) return;
8037
- const resolvedParameters = resolvedProperties["Parameters"];
8038
- const sourceParameters = sourceProperties["Parameters"];
8039
- if (!isPlainObject$4(resolvedParameters) || !isPlainObject$4(sourceParameters)) return;
8040
- const positioned = redactSecretsForState(markSameGenerationBag({ ...resolvedParameters }), secrets, sourceParameters, rules);
8041
- let table = nestedStackParameterExpressions.get(secrets);
8042
- for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
8043
- if (typeof resolvedValue !== "string" || !secrets.has(resolvedValue)) continue;
8044
- const expression = positioned[name];
8045
- if (typeof expression !== "string") continue;
8046
- if (!isSingleDynamicReferenceToken(expression)) continue;
8047
- const sourceLeaf = sourceParameters[name];
8048
- if (typeof sourceLeaf === "string" && expression !== sourceLeaf) continue;
8049
- if (expression === resolvedValue) continue;
8050
- const seenResolvingTo = plaintextIndexOf(secrets).get(expression);
8051
- if (seenResolvingTo !== void 0 && seenResolvingTo !== resolvedValue) continue;
8052
- if (typeof sourceLeaf === "string" && resolvedPlaintextOf(secrets, expression) !== resolvedValue) continue;
8053
- if (table === void 0) {
8054
- table = /* @__PURE__ */ new Map();
8055
- nestedStackParameterExpressions.set(secrets, table);
8056
- }
8057
- storeAssociation(table, name, expression, resolvedValue);
8058
- }
8059
- const framesByValue = /* @__PURE__ */ new Map();
8060
- const tokensOf = /* @__PURE__ */ new Map();
8061
- const frameSpellings = /* @__PURE__ */ new Map();
8062
- const frameSpellingOf = (name) => {
8063
- if (!frameSpellings.has(name)) frameSpellings.set(name, computeFrameSpelling(name));
8064
- return frameSpellings.get(name);
8065
- };
8066
- const computeFrameSpelling = (name) => {
8067
- const resolvedValue = resolvedParameters[name];
8068
- if (typeof resolvedValue !== "string") return void 0;
8069
- const sourceLeaf = sourceParameters[name];
8070
- if (typeof sourceLeaf === "string") return sourceLeaf;
8071
- if (!isPlainObject$4(sourceLeaf)) return void 0;
8072
- const written = positioned[name];
8073
- if (typeof written !== "string") return void 0;
8074
- const rendered = intrinsicSkeletonSegments(sourceLeaf)?.map((s) => s === UNKNOWN_PART ? "\0" : s).join("");
8075
- const spans = rendered === void 0 ? [] : dynamicReferenceSpans(rendered);
8076
- if (rendered !== void 0 && spans.length === 1) {
8077
- const [span] = spans;
8078
- const ownToken = rendered.slice(span.start, span.end);
8079
- if (written !== resolvedValue && SPELLED_SECRET_REFERENCE_PREFIXES.some((prefix) => ownToken.startsWith(prefix))) return written;
8080
- }
8081
- const substituted = substitutedSpellingOf(secrets, sourceLeaf, resolvedValue);
8082
- if (substituted === void 0) return void 0;
8083
- return written === resolvedValue || written === substituted ? substituted : void 0;
8084
- };
8085
- const certifiedSpellingOf = (name) => {
8086
- const sourceLeaf = sourceParameters[name];
8087
- if (typeof sourceLeaf === "string") return positioned[name] === sourceLeaf ? sourceLeaf : void 0;
8088
- return frameSpellingOf(name);
8089
- };
8090
- const unwrittenValues = /* @__PURE__ */ new Set();
8091
- for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
8092
- if (typeof resolvedValue !== "string") continue;
8093
- const spelling = frameSpellingOf(name);
8094
- const frame = spelling === void 0 ? void 0 : singleSpanFrame(resolvedValue, spelling);
8095
- const frames = framesByValue.get(resolvedValue) ?? /* @__PURE__ */ new Set();
8096
- const unframed = frame === void 0 || resolvedPlaintextOf(secrets, frame.token) !== frame.middle;
8097
- frames.add(unframed ? UNFRAMED_SPELLING : `${frame.prefix.length}:${frame.prefix}${frame.suffix}`);
8098
- framesByValue.set(resolvedValue, frames);
8099
- if (!unframed) {
8100
- const tokens = tokensOf.get(resolvedValue) ?? /* @__PURE__ */ new Set();
8101
- tokens.add(frame.token);
8102
- tokensOf.set(resolvedValue, tokens);
8103
- if (typeof sourceParameters[name] !== "string" && positioned[name] !== spelling) unwrittenValues.add(resolvedValue);
8104
- }
8105
- }
8106
- for (const value of unwrittenValues) if (tokensOf.get(value)?.size !== 1) framesByValue.get(value)?.add(UNFRAMED_SPELLING);
8107
- const rowWithoutParameters = {};
8108
- for (const [key, value] of Object.entries(resolvedProperties)) if (key !== "Parameters") rowWithoutParameters[key] = value;
8109
- const outsideLeaves = wholeStringLeavesOf(rowWithoutParameters);
8110
- const framed = /* @__PURE__ */ new Map();
8111
- const framedByName = [];
8112
- for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
8113
- if (typeof resolvedValue !== "string") continue;
8114
- const spelling = certifiedSpellingOf(name);
8115
- if (spelling === void 0) continue;
8116
- if (redactSecretsForState(resolvedValue, secrets) !== resolvedValue) continue;
8117
- const frame = singleSpanFrame(resolvedValue, spelling);
8118
- if (frame === void 0 || resolvedPlaintextOf(secrets, frame.token) !== frame.middle) continue;
8119
- if (framesByValue.get(resolvedValue)?.size !== 1) continue;
8120
- const isNeedle = resolvedValue.length >= 4;
8121
- const rewrites = (leaf) => leaf === resolvedValue || isNeedle && leaf.includes(resolvedValue);
8122
- let embedded = false;
8123
- for (const leaf of outsideLeaves) if (rewrites(leaf)) {
8124
- embedded = true;
8125
- break;
8126
- }
8127
- for (const other of Object.values(resolvedParameters)) {
8128
- if (embedded) break;
8129
- if (typeof other === "string") {
8130
- if (other !== resolvedValue && rewrites(other)) embedded = true;
8131
- continue;
8132
- }
8133
- for (const leaf of wholeStringLeavesOf(other)) if (rewrites(leaf)) {
8134
- embedded = true;
8135
- break;
8136
- }
8137
- }
8138
- if (embedded) continue;
8139
- framedByName.push([
8140
- name,
8141
- spelling,
8142
- resolvedValue
8143
- ]);
8144
- if (secrets.get(frame.middle) !== frame.token && tokensOf.get(resolvedValue)?.size !== 1) continue;
8145
- framed.set(resolvedValue, spelling);
8146
- }
8147
- for (const [plaintext, expression] of framed) secrets.set(plaintext, expression);
8148
- for (const [name, expression, plaintext] of framedByName) {
8149
- if (table === void 0) {
8150
- table = /* @__PURE__ */ new Map();
8151
- nestedStackParameterExpressions.set(secrets, table);
8152
- }
8153
- storeAssociation(table, name, expression, plaintext);
8154
- }
8155
- }
8156
- function inheritNestedStackParameterAssociations(childSecrets, parentSecrets) {
8157
- const table = nestedStackParameterExpressions.get(parentSecrets);
8158
- if (table === void 0 || table.size === 0) return;
8159
- let associations = crossStackAssociations.get(childSecrets);
8160
- for (const [name, association] of table) {
8161
- const key = crossStackSourceKey({ Ref: name });
8162
- if (key === void 0) continue;
8163
- if (associations === void 0) {
8164
- associations = /* @__PURE__ */ new Map();
8165
- crossStackAssociations.set(childSecrets, associations);
8166
- }
8167
- if (typeof association === "symbol") {
8168
- associations.set(key, association);
8169
- continue;
8170
- }
8171
- storeAssociation(associations, key, association.expression, association.plaintext);
8172
- }
8173
- }
8174
- function inheritedParameterExpression(parentSecrets, parameterName, resolvedValue) {
8175
- const association = nestedStackParameterExpressions.get(parentSecrets)?.get(parameterName);
8176
- if (association === void 0 || typeof association === "symbol") return void 0;
8177
- if (Array.isArray(resolvedValue)) return certifiedListForLeaf(parentSecrets, association, resolvedValue);
8178
- return certifiedExpressionForLeaf(parentSecrets, association, resolvedValue);
8179
- }
8180
-
8181
8233
  //#endregion
8182
8234
  //#region src/deployment/secret-redaction/unresolved-token-frame.ts
8183
8235
  function liveMatchesUnresolvedTokenFrame(send, live, unresolvedTokens, secrets) {
@@ -15185,22 +15237,27 @@ function accountArgs(recovery) {
15185
15237
  flag: "--state-prefix",
15186
15238
  value: prefix,
15187
15239
  hole: "prefix",
15188
- opts: { plainIdent: true }
15240
+ opts: prefixGate(prefix)
15189
15241
  });
15190
15242
  return args;
15191
15243
  }
15244
+ function prefixGate(prefix) {
15245
+ return prefix.split("/").every((seg) => isPasteableIdent(seg)) ? {} : { plainIdent: true };
15246
+ }
15192
15247
  const ACCOUNT_FLAG_BY_HOLE = {
15193
15248
  profile: "--profile",
15194
15249
  bucket: "--state-bucket",
15195
15250
  prefix: "--state-prefix"
15196
15251
  };
15197
- function withheldAccountClause(withheld, where) {
15198
- const parts = withheld.filter((w) => ACCOUNT_FLAG_BY_HOLE[w.hole] !== void 0).map((w) => `the '${ACCOUNT_FLAG_BY_HOLE[w.hole]}' value this run was given ${accountReason(w.reason)}`);
15252
+ function withheldAccountClause(recovery, where) {
15253
+ const slashPrefix = recovery?.statePrefix?.includes("/") === true;
15254
+ const parts = withheldAccountValues(recovery).filter((w) => ACCOUNT_FLAG_BY_HOLE[w.hole] !== void 0).map((w) => `the '${ACCOUNT_FLAG_BY_HOLE[w.hole]}' value this run was given ${w.hole === "prefix" && w.reason === "not-plain" && slashPrefix ? PREFIX_NOT_PLAIN_WHY : accountReason(w.reason)}`);
15199
15255
  if (parts.length === 0) return "";
15200
15256
  const sentence = parts.join(", and ");
15201
15257
  const holes = parts.length === 1 ? "a quoted hole in its place" : "quoted holes in their place";
15202
15258
  return `${sentence.charAt(0).toUpperCase()}${sentence.slice(1)}, so ${where} ${holes}: replace each such hole whole, quotes included, with the shell-quoted value you passed this run. `;
15203
15259
  }
15260
+ const PREFIX_NOT_PLAIN_WHY = "has a '/'-separated part that is not a plain identifier (a letter or digit, then letters, digits, '~', '_', '.' or '-'), the only shape printed in a command beside a labelled line";
15204
15261
  function accountReason(reason) {
15205
15262
  switch (reason) {
15206
15263
  case "altered": return "does not render exactly";
@@ -15231,7 +15288,7 @@ function confirmKeyListing(recovery) {
15231
15288
  return accountArgs(recovery).length === 0 ? `'cdkd state list --long'` : `'cdkd state list --long' run with the same account flags as the command lines below`;
15232
15289
  }
15233
15290
  function destroyAccountClause(recovery) {
15234
- const clause = withheldAccountClause(withheldAccountValues(recovery), "the command lines below print");
15291
+ const clause = withheldAccountClause(recovery, "the command lines below print");
15235
15292
  return clause === "" ? "" : ` ${clause.trimEnd()}`;
15236
15293
  }
15237
15294
  function refuseMalformedResourcesForDestroy(state, stackName, region, recovery) {
@@ -15246,8 +15303,7 @@ function divergentRecordRegionRefusalMessage(stackName, keyRegion, divergentBody
15246
15303
  const kind = describeRegionValueKind(divergentBodyRegion);
15247
15304
  const opening = exact ? `cdkd will not destroy stack ${shellQuote(safeIdentifier(stackName, cap))} (${shellQuote(safeIdentifier(keyRegion, cap))}): the state record read from that region's key carries a 'region' of its own (${kind}) that is not the key's, and ${lists}` : `cdkd will not destroy the state record this command loaded: it carries a 'region' of its own (${kind}) that is not the region of the key it was read from, and ${lists}`;
15248
15305
  const listing = withheldListingPointer(recovery);
15249
- const withheldAccounts = withheldAccountValues(recovery);
15250
- const remedy = exact ? "Re-run with --verbose to see what the record's region field holds, then either destroy against the region the resources are really in, or repair that field to match the key it is stored under and re-run. " + withheldAccountClause(withheldAccounts, "the command at the end of this message prints") + "To drop the record and leave the live resources standing, spelled out rather than pasteable because that command DELETES a record: " + dropRecordTemplate(recovery) : "This record's stack name or region does NOT render exactly — what any surrounding output shows is a sanitized form, and another record may render identically — so this message names no target and offers no command against one. List the records with " + (listing.line === void 0 ? `${WITHHELD_LISTING_POINTER}. Inspect it with: ${inspectCommand(void 0, void 0)}` : `${listing.pointer}.` + destroyAccountClause(recovery) + `\n${listing.line}\nInspect it with: ${inspectCommand(void 0, void 0, recovery)}`);
15306
+ const remedy = exact ? "Re-run with --verbose to see what the record's region field holds, then either destroy against the region the resources are really in, or repair that field to match the key it is stored under and re-run. " + withheldAccountClause(recovery, "the command at the end of this message prints") + "To drop the record and leave the live resources standing, spelled out rather than pasteable because that command DELETES a record: " + dropRecordTemplate(recovery) : "This record's stack name or region does NOT render exactly — what any surrounding output shows is a sanitized form, and another record may render identically — so this message names no target and offers no command against one. List the records with " + (listing.line === void 0 ? `${WITHHELD_LISTING_POINTER}. Inspect it with: ${inspectCommand(void 0, void 0)}` : `${listing.pointer}.` + destroyAccountClause(recovery) + `\n${listing.line}\nInspect it with: ${inspectCommand(void 0, void 0, recovery)}`);
15251
15307
  return `${opening} ${resourceCount === void 0 ? `— so cdkd can neither count what it would delete nor tell which region it is in` : `— so cdkd cannot tell which region those resources are in`}. cdkd stamps the key's region into every record it writes, so this record was not written by cdkd. Destroying against the key's region would issue every delete there; if the record's own region is the honest half, each delete comes back not-found, which this command reads as ALREADY DELETED — it would report success, remove the record, and leave every resource standing in the other region with nothing naming it. ${remedy}`;
15252
15308
  }
15253
15309
  function refuseDivergentRecordRegionForDestroy(state, stackName, keyRegion, divergentBodyRegion, recovery, provenOrphans = 0) {
@@ -15256,14 +15312,14 @@ function refuseDivergentRecordRegionForDestroy(state, stackName, keyRegion, dive
15256
15312
  if (resourceCount === 0 && provenOrphans === 0) return;
15257
15313
  throw markNonRetryable(new CdkdError(divergentRecordRegionRefusalMessage(stackName, keyRegion, divergentBodyRegion, resourceCount, recovery, provenOrphans), STATE_REGION_DIVERGED));
15258
15314
  }
15259
- function malformedDeployResourcesRefusalMessage(rawStackName, rawRegion) {
15315
+ function malformedDeployResourcesRefusalMessage(rawStackName, rawRegion, recovery) {
15260
15316
  const stackName = absentIfEmpty(rawStackName);
15261
15317
  const region = absentIfEmpty(rawRegion);
15262
- return `${malformedStateDiagnosis(stackName, region)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: an unreadable map reads as ZERO recorded resources, so every resource the template declares is planned as a CREATE and the deploy re-provisions a stack that already exists, colliding on each deterministic name and duplicating the rest, then saves a well-formed record over the only evidence anything was wrong. Reading the bag as EMPTY produces that same plan rather than avoiding it. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the stack with this map read as EMPTY and warns that it did. ${inspectClause(stackName, region)}Inspect it with: ${inspectCommand(stackName, region)}`;
15318
+ return `${malformedStateDiagnosis(stackName, region)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: an unreadable map reads as ZERO recorded resources, so every resource the template declares is planned as a CREATE and the deploy re-provisions a stack that already exists, colliding on each deterministic name and duplicating the rest, then saves a well-formed record over the only evidence anything was wrong. Reading the bag as EMPTY produces that same plan rather than avoiding it. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the stack with this map read as EMPTY and warns that it did. ${inspectClause(stackName, region, recovery)}Inspect it with: ${inspectCommand(stackName, region, recovery)}`;
15263
15319
  }
15264
- function refuseMalformedResourcesForDeploy(state, stackName, region) {
15320
+ function refuseMalformedResourcesForDeploy(state, stackName, region, recovery) {
15265
15321
  if (hasReadableResources(state)) return;
15266
- throw markNonRetryable(new CdkdError(malformedDeployResourcesRefusalMessage(stackName, region), STATE_RESOURCES_MALFORMED));
15322
+ throw markNonRetryable(new CdkdError(malformedDeployResourcesRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED));
15267
15323
  }
15268
15324
  const EXPORT_LEGACY_LEAD = "The record was loaded from its legacy key, which carries no region segment — 'cdkd state show' reads such a record only when its body names a region, and a 'cdkd deploy' will not migrate it while it is torn — so inspect the object directly";
15269
15325
  const EXPORT_DELETES_STATE = "'cdkd export' migrates the resources this record lists into CloudFormation and then DELETES the cdkd state, so it refuses rather than continuing, under '--dry-run' too.";
@@ -15276,19 +15332,19 @@ function refuseMalformedResourcesForExport(state, stackName, region, recovery) {
15276
15332
  if (hasReadableResources(state)) return;
15277
15333
  throw new CdkdError(malformedExportResourcesRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED);
15278
15334
  }
15279
- function malformedRenderedContainersWarning(rawStackName, rawRegion, containers) {
15335
+ function malformedRenderedContainersWarning(rawStackName, rawRegion, containers, recovery) {
15280
15336
  const stackName = absentIfEmpty(rawStackName);
15281
15337
  const region = absentIfEmpty(rawRegion);
15282
15338
  const names = containers.map((name) => `'${safeIdentifier(name, 128)}'`).join(", ");
15283
- return `${stackClause(stackName, region)} has a non-object ${names} — the record is malformed or truncated. 'Object.entries' walks a string or a list as readily as a map, so rendering one INVENTS a row per character or element. Continuing with it EMPTY: this view shows no rows there, which is not the same as the record holding none. A per-resource container is named once however many resources hold one. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
15339
+ return `${stackClause(stackName, region)} has a non-object ${names} — the record is malformed or truncated. 'Object.entries' walks a string or a list as readily as a map, so rendering one INVENTS a row per character or element. Continuing with it EMPTY: this view shows no rows there, which is not the same as the record holding none. A per-resource container is named once however many resources hold one. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
15284
15340
  }
15285
15341
  function absentIfEmpty(value) {
15286
15342
  return value === "" ? void 0 : value;
15287
15343
  }
15288
- function malformedResourcesWarning(rawStackName, rawRegion) {
15344
+ function malformedResourcesWarning(rawStackName, rawRegion, recovery) {
15289
15345
  const stackName = absentIfEmpty(rawStackName);
15290
15346
  const region = absentIfEmpty(rawRegion);
15291
- return `${malformedStateDiagnosis(stackName, region)} Continuing with an EMPTY resource set: this command's output describes zero resources, which is not the same as the stack having none. ${inspectClause(stackName, region)}Inspect it with: ${inspectCommand(stackName, region)}`;
15347
+ return `${malformedStateDiagnosis(stackName, region)} Continuing with an EMPTY resource set: this command's output describes zero resources, which is not the same as the stack having none. ${inspectClause(stackName, region, recovery)}Inspect it with: ${inspectCommand(stackName, region, recovery)}`;
15292
15348
  }
15293
15349
  function repairMalformedOutputsForReadOnly(state) {
15294
15350
  if (hasReadableOutputs(state)) return false;
@@ -15296,10 +15352,10 @@ function repairMalformedOutputsForReadOnly(state) {
15296
15352
  return true;
15297
15353
  }
15298
15354
  const DEPLOY_REFUSES_OUTPUTS_SENTENCE = "'cdkd deploy' REFUSES this record when it loads it, over this same unreadable 'outputs' map, rather than rebuilding the map over it — repair the stored value before deploying.";
15299
- function malformedOutputsWarning(rawStackName, rawRegion) {
15355
+ function malformedOutputsWarning(rawStackName, rawRegion, recovery) {
15300
15356
  const stackName = absentIfEmpty(rawStackName);
15301
15357
  const region = absentIfEmpty(rawRegion);
15302
- return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. Where the stored value is a string or a list, 'Object.entries' walks it as readily as a map, so diffing it INVENTS a REMOVE row per character or element carrying the record's own characters; where it is a number, a boolean or null, it yields no comparison at all. Continuing with it EMPTY: every output this diff resolves is reported as an ADD and no stored key is reported as a REMOVE, which is not the same as the record holding none. ${DEPLOY_REFUSES_OUTPUTS_SENTENCE} ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
15358
+ return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. Where the stored value is a string or a list, 'Object.entries' walks it as readily as a map, so diffing it INVENTS a REMOVE row per character or element carrying the record's own characters; where it is a number, a boolean or null, it yields no comparison at all. Continuing with it EMPTY: every output this diff resolves is reported as an ADD and no stored key is reported as a REMOVE, which is not the same as the record holding none. ${DEPLOY_REFUSES_OUTPUTS_SENTENCE} ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
15303
15359
  }
15304
15360
  function refuseMalformedState(state, stackName, region, recovery) {
15305
15361
  if (hasReadableResources(state)) return;
@@ -15310,15 +15366,15 @@ function malformedOutputsRefusalMessage(rawStackName, rawRegion, recovery) {
15310
15366
  const region = absentIfEmpty(rawRegion);
15311
15367
  return inspectTail(`${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. This command can WRITE state, so it refuses rather than continuing: it REBUILDS the bag before saving, and 'Object.entries' walks a string or a list as readily as a map, so a six-character value would be saved back as a well-formed six-key map (a null one as an empty map). That replaces the only signal anything is wrong with a legitimate-looking record, permanently — and the next deploy republishes it into the shared exports index every other stack's Fn::ImportValue resolves against. Repair or remove the record first.`, stackName, region, recovery);
15312
15368
  }
15313
- function malformedExportSourceWarning(rawStackName, rawRegion) {
15369
+ function malformedExportSourceWarning(rawStackName, rawRegion, recovery) {
15314
15370
  const stackName = absentIfEmpty(rawStackName);
15315
15371
  const region = absentIfEmpty(rawRegion);
15316
- return `${stackClause(stackName, region)} has no readable 'outputs' map or 'exportNames' list — the record is malformed or truncated. It contributes NO exports to this region's index, which is not the same as the stack exporting none: an Fn::ImportValue of a name this stack really publishes will fail in the CONSUMER stack, naming that stack rather than this record. Continuing with the other producers — enumerating a string or a list here would instead publish one FABRICATED export per character or element. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
15372
+ return `${stackClause(stackName, region)} has no readable 'outputs' map or 'exportNames' list — the record is malformed or truncated. It contributes NO exports to this region's index, which is not the same as the stack exporting none: an Fn::ImportValue of a name this stack really publishes will fail in the CONSUMER stack, naming that stack rather than this record. Continuing with the other producers — enumerating a string or a list here would instead publish one FABRICATED export per character or element. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
15317
15373
  }
15318
- function malformedExportNamesWarning(rawStackName, rawRegion) {
15374
+ function malformedExportNamesWarning(rawStackName, rawRegion, recovery) {
15319
15375
  const stackName = absentIfEmpty(rawStackName);
15320
15376
  const region = absentIfEmpty(rawRegion);
15321
- return `${stackClause(stackName, region)} has an unusable 'exportNames' list — the record is malformed or truncated. It is read as an EMPTY export set, which is not the same as the record holding one: no stored key is reported as an export, so a row that should carry an '[export]' tag renders without it. Reading it as UNKNOWN instead would be worse — that falls back to the pre-v9 rule where every output name is importable. ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
15377
+ return `${stackClause(stackName, region)} has an unusable 'exportNames' list — the record is malformed or truncated. It is read as an EMPTY export set, which is not the same as the record holding one: no stored key is reported as an export, so a row that should carry an '[export]' tag renders without it. Reading it as UNKNOWN instead would be worse — that falls back to the pre-v9 rule where every output name is importable. ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
15322
15378
  }
15323
15379
  function refuseMalformedOutputs(state, stackName, region, recovery) {
15324
15380
  if (hasReadableOutputs(state)) return;
@@ -15333,10 +15389,10 @@ function repairMalformedOrphansForReadOnly(state) {
15333
15389
  state.orphans = [];
15334
15390
  return true;
15335
15391
  }
15336
- function malformedOrphansWarning(rawStackName, rawRegion) {
15392
+ function malformedOrphansWarning(rawStackName, rawRegion, recovery) {
15337
15393
  const stackName = absentIfEmpty(rawStackName);
15338
15394
  const region = absentIfEmpty(rawRegion);
15339
- return `${stackClause(stackName, region)} has no readable 'orphans' list — the record is malformed or truncated. Readers reach it on a bare '?? []' or '?.length', which admits a string, a number, a plain object and null alike: a string is WALKED, one garbage orphan per character, and the others read as no orphans at all. Continuing with it EMPTY: this view previews no adoption and names no orphan, which is NOT the same as the record holding none — resources from an earlier failed deploy may still be live in AWS. ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
15395
+ return `${stackClause(stackName, region)} has no readable 'orphans' list — the record is malformed or truncated. Readers reach it on a bare '?? []' or '?.length', which admits a string, a number, a plain object and null alike: a string is WALKED, one garbage orphan per character, and the others read as no orphans at all. Continuing with it EMPTY: this view previews no adoption and names no orphan, which is NOT the same as the record holding none — resources from an earlier failed deploy may still be live in AWS. ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
15340
15396
  }
15341
15397
  function malformedOrphansRefusalMessage(rawStackName, rawRegion, recovery) {
15342
15398
  const stackName = absentIfEmpty(rawStackName);
@@ -15370,19 +15426,19 @@ function refuseMalformedOutputsForDestroy(state, stackName, region, recovery) {
15370
15426
  if (hasReadableOutputs(state)) return;
15371
15427
  throw markNonRetryable(new CdkdError(malformedDestroyOutputsRefusalMessage(stackName, region, recovery), STATE_RESOURCES_MALFORMED));
15372
15428
  }
15373
- function malformedNestedChildOutputsRefusalMessage(rawChildStackName, rawRegion) {
15429
+ function malformedNestedChildOutputsRefusalMessage(rawChildStackName, rawRegion, recovery) {
15374
15430
  const childStackName = absentIfEmpty(rawChildStackName);
15375
15431
  const region = absentIfEmpty(rawRegion);
15376
- return `${stackClause(childStackName, region, "nested stack child")} has no readable 'outputs' map — the record is malformed or truncated. The parent's 'Outputs.<Key>' attributes are REBUILT from this bag and persisted into the PARENT's record, and 'Object.entries' walks a string or a list as readily as a map — so a six-character value would become six fabricated parent attributes that every Fn::GetAtt against this nested stack then resolves into live AWS calls. The deploy refuses rather than fabricating them. Repair or remove the child's record first. ${inspectClause(childStackName, region)}Inspect it with: ` + inspectCommand(childStackName, region);
15432
+ return `${stackClause(childStackName, region, "nested stack child")} has no readable 'outputs' map — the record is malformed or truncated. The parent's 'Outputs.<Key>' attributes are REBUILT from this bag and persisted into the PARENT's record, and 'Object.entries' walks a string or a list as readily as a map — so a six-character value would become six fabricated parent attributes that every Fn::GetAtt against this nested stack then resolves into live AWS calls. The deploy refuses rather than fabricating them. Repair or remove the child's record first. ${inspectClause(childStackName, region, recovery)}Inspect it with: ` + inspectCommand(childStackName, region, recovery);
15377
15433
  }
15378
- function refuseMalformedNestedChildOutputs(state, childStackName, region) {
15434
+ function refuseMalformedNestedChildOutputs(state, childStackName, region, recovery) {
15379
15435
  if (hasReadableOutputs(state)) return;
15380
- throw markNonRetryable(new CdkdError(malformedNestedChildOutputsRefusalMessage(childStackName, region), STATE_RESOURCES_MALFORMED));
15436
+ throw markNonRetryable(new CdkdError(malformedNestedChildOutputsRefusalMessage(childStackName, region, recovery), STATE_RESOURCES_MALFORMED));
15381
15437
  }
15382
- function malformedLocalOutputsWarning(rawStackName, rawRegion) {
15438
+ function malformedLocalOutputsWarning(rawStackName, rawRegion, recovery) {
15383
15439
  const stackName = absentIfEmpty(rawStackName);
15384
15440
  const region = absentIfEmpty(rawRegion);
15385
- return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. 'Object.entries' walks a string or a list as readily as a map, so reading it would hand this local run one FABRICATED output per character or element. Continuing with it EMPTY: every reference to an output of this record resolves to nothing and is dropped, which is not the same as the record holding none. ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
15441
+ return `${stackClause(stackName, region)} has no readable 'outputs' map — the record is malformed or truncated. 'Object.entries' walks a string or a list as readily as a map, so reading it would hand this local run one FABRICATED output per character or element. Continuing with it EMPTY: every reference to an output of this record resolves to nothing and is dropped, which is not the same as the record holding none. ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
15386
15442
  }
15387
15443
  const NAMED_UNREADABLE_PROPERTY_BAGS = 5;
15388
15444
  function stackClause(stackName, region, kind = "") {
@@ -15433,7 +15489,7 @@ function inspectCommand(stackName, region, recovery) {
15433
15489
  return inspectGate(stackName, region, recovery).command;
15434
15490
  }
15435
15491
  function inspectClause(stackName, region, recovery) {
15436
- const accounts = withheldAccountClause(withheldAccountValues(recovery), "the command at the end of this line prints");
15492
+ const accounts = withheldAccountClause(recovery, "the command at the end of this line prints");
15437
15493
  if (stackName === void 0) return accounts;
15438
15494
  const { withheld } = inspectGate(stackName, region, recovery);
15439
15495
  const parts = [inspectWithheldPart("stack name above", withheld, "stack", true), inspectWithheldPart("region above", withheld, "region", false)].filter((part) => part !== "");
@@ -15490,10 +15546,10 @@ function unreadableResourcePropertyBags(state) {
15490
15546
  if (!hasReadableResources(state)) return [];
15491
15547
  return Object.entries(state.resources).filter(([, entry]) => isReadableBag(entry) && !isReadableBag(entry.properties)).map(([logicalId]) => logicalId);
15492
15548
  }
15493
- function refuseMalformedResourceProperties(state, stackName, region) {
15549
+ function refuseMalformedResourceProperties(state, stackName, region, recovery) {
15494
15550
  const unreadable = unreadableResourcePropertyBags(state);
15495
15551
  if (unreadable.length === 0) return;
15496
- throw markNonRetryable(new CdkdError(malformedResourcePropertiesRefusalMessage(stackName, region, unreadable), STATE_RESOURCES_MALFORMED));
15552
+ throw markNonRetryable(new CdkdError(malformedResourcePropertiesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED));
15497
15553
  }
15498
15554
  function repairMalformedResourcePropertiesForReadOnly(state) {
15499
15555
  const unreadable = unreadableResourcePropertyBags(state);
@@ -15515,10 +15571,10 @@ function namedPropertyBagsDiagnosis(stackName, region, logicalIds, describeUnsaf
15515
15571
  function namedPropertyBagsClause(stackName, region, logicalIds) {
15516
15572
  return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} Comparing a template against one reports every property the template declares as ADDED (a string bag also invents one change per character), and a create-only property among them is a REPLACEMENT of the live resource.`;
15517
15573
  }
15518
- function malformedResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds) {
15574
+ function malformedResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
15519
15575
  const stackName = absentIfEmpty(rawStackName);
15520
15576
  const region = absentIfEmpty(rawRegion);
15521
- return `${namedPropertyBagsClause(stackName, region, logicalIds)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: a DELETE and re-create of resources the template did not change, and reading the bag as empty produces that same verdict rather than avoiding it. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the rest of the stack with those maps read as EMPTY and warns that it did. ${inspectClause(stackName, region)}Inspect the record with: ${inspectCommand(stackName, region)}`;
15577
+ return `${namedPropertyBagsClause(stackName, region, logicalIds)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: a DELETE and re-create of resources the template did not change, and reading the bag as empty produces that same verdict rather than avoiding it. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the rest of the stack with those maps read as EMPTY and warns that it did. ${inspectClause(stackName, region, recovery)}Inspect the record with: ${inspectCommand(stackName, region, recovery)}`;
15522
15578
  }
15523
15579
  function malformedOrphanResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
15524
15580
  const stackName = absentIfEmpty(rawStackName);
@@ -15551,7 +15607,7 @@ function withheldIdentityClause(stackName, region) {
15551
15607
  return ` — the stack name or region above did not render exactly, so take them from the 'Find the exact name' command below — replace each quoted hole, quotes included, with ${JSON_LISTING_HOLE_VALUE} — rather than from this message`;
15552
15608
  }
15553
15609
  function withheldRecoveryClause(recovery) {
15554
- const clause = withheldAccountClause(withheldAccountValues(recovery), "the command lines below print").trimEnd();
15610
+ const clause = withheldAccountClause(recovery, "the command lines below print").trimEnd();
15555
15611
  if (clause === "") return "";
15556
15612
  return ` — ${clause.charAt(0).toLowerCase()}${clause.slice(1, -1)}`;
15557
15613
  }
@@ -15603,26 +15659,26 @@ function refuseMalformedResourcePropertiesForOrphan(state, removedLogicalIds, st
15603
15659
  if (unreadable.length === 0) return;
15604
15660
  throw new CdkdError(malformedOrphanResourcePropertiesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
15605
15661
  }
15606
- function malformedResourcePropertiesWarning(rawStackName, rawRegion, logicalIds) {
15662
+ function malformedResourcePropertiesWarning(rawStackName, rawRegion, logicalIds, recovery) {
15607
15663
  const stackName = absentIfEmpty(rawStackName);
15608
15664
  const region = absentIfEmpty(rawRegion);
15609
- return `${namedPropertyBagsClause(stackName, region, logicalIds)} Continuing with those maps EMPTY: what these records are stored as holding is NOT what this preview compares against. Where the template still declares the resource, every property it declares previews as an addition and a create-only one as a replacement; where it no longer declares it, the DELETE row shows an empty previous side instead of the stored one. Do NOT run 'cdkd deploy' against this record — it REFUSES on the same defect rather than acting on this preview. ${inspectClause(stackName, region)}See the stored values with: ${inspectCommand(stackName, region)}`;
15665
+ return `${namedPropertyBagsClause(stackName, region, logicalIds)} Continuing with those maps EMPTY: what these records are stored as holding is NOT what this preview compares against. Where the template still declares the resource, every property it declares previews as an addition and a create-only one as a replacement; where it no longer declares it, the DELETE row shows an empty previous side instead of the stored one. Do NOT run 'cdkd deploy' against this record — it REFUSES on the same defect rather than acting on this preview. ${inspectClause(stackName, region, recovery)}See the stored values with: ${inspectCommand(stackName, region, recovery)}`;
15610
15666
  }
15611
15667
  const DRIFT_PROPERTIES_ROLE = "To 'cdkd drift' this map is the baseline wherever no 'observedProperties' is recorded — a stored string reads as one drifted key per character, and an EMPTY reading compares nothing and reports the resource clean — and it is where cdkd finds the secret positions it must mask.";
15612
- function malformedDriftResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds) {
15668
+ function malformedDriftResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
15613
15669
  const stackName = absentIfEmpty(rawStackName);
15614
15670
  const region = absentIfEmpty(rawRegion);
15615
- return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} 'cdkd drift --accept' and '--revert' WRITE this record back, so they refuse rather than continuing. ${DRIFT_PROPERTIES_ROLE} Continuing would let '--accept' save, and '--revert' push to the live resource, a verdict about properties this record does not hold. Nothing was written and no AWS resource was modified. Repair or remove the record first; plain 'cdkd drift' compares the rest of the stack and reports these resources as not compared. ${inspectClause(stackName, region)}Inspect the record with: ${inspectCommand(stackName, region)}`;
15671
+ return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} 'cdkd drift --accept' and '--revert' WRITE this record back, so they refuse rather than continuing. ${DRIFT_PROPERTIES_ROLE} Continuing would let '--accept' save, and '--revert' push to the live resource, a verdict about properties this record does not hold. Nothing was written and no AWS resource was modified. Repair or remove the record first; plain 'cdkd drift' compares the rest of the stack and reports these resources as not compared. ${inspectClause(stackName, region, recovery)}Inspect the record with: ${inspectCommand(stackName, region, recovery)}`;
15616
15672
  }
15617
- function refuseMalformedResourcePropertiesForDrift(state, stackName, region) {
15673
+ function refuseMalformedResourcePropertiesForDrift(state, stackName, region, recovery) {
15618
15674
  const unreadable = unreadableResourcePropertyBags(state);
15619
15675
  if (unreadable.length === 0) return;
15620
- throw new CdkdError(malformedDriftResourcePropertiesRefusalMessage(stackName, region, unreadable), STATE_RESOURCES_MALFORMED);
15676
+ throw new CdkdError(malformedDriftResourcePropertiesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED);
15621
15677
  }
15622
- function malformedDriftResourcePropertiesWarning(rawStackName, rawRegion, logicalIds) {
15678
+ function malformedDriftResourcePropertiesWarning(rawStackName, rawRegion, logicalIds, recovery) {
15623
15679
  const stackName = absentIfEmpty(rawStackName);
15624
15680
  const region = absentIfEmpty(rawRegion);
15625
- return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} ${DRIFT_PROPERTIES_ROLE} So 'cdkd drift' does NOT compare these resources: each is reported as not compared, and the run does not exit clean. The rest of the stack is compared as usual. 'cdkd drift --accept' / '--revert' and 'cdkd deploy' REFUSE this record. ${inspectClause(stackName, region)}See the stored values with: ${inspectCommand(stackName, region)}`;
15681
+ return `${namedPropertyBagsDiagnosis(stackName, region, logicalIds)} ${DRIFT_PROPERTIES_ROLE} So 'cdkd drift' does NOT compare these resources: each is reported as not compared, and the run does not exit clean. The rest of the stack is compared as usual. 'cdkd drift --accept' / '--revert' and 'cdkd deploy' REFUSE this record. ${inspectClause(stackName, region, recovery)}See the stored values with: ${inspectCommand(stackName, region, recovery)}`;
15626
15682
  }
15627
15683
  function malformedExportResourcePropertiesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
15628
15684
  const stackName = absentIfEmpty(rawStackName);
@@ -15652,15 +15708,15 @@ function repairMalformedResourceEntriesForReadOnly(state) {
15652
15708
  for (const logicalId of unreadable) delete state.resources[logicalId];
15653
15709
  return unreadable;
15654
15710
  }
15655
- function malformedResourceEntriesWarning(rawStackName, rawRegion, logicalIds) {
15711
+ function malformedResourceEntriesWarning(rawStackName, rawRegion, logicalIds, recovery) {
15656
15712
  const stackName = absentIfEmpty(rawStackName);
15657
15713
  const region = absentIfEmpty(rawRegion);
15658
- return `${namedEntriesClause(stackName, region, logicalIds)} Continuing WITHOUT them: this command's output describes the remaining resources only, which is not the same as the stack holding none of these. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
15714
+ return `${namedEntriesClause(stackName, region, logicalIds)} Continuing WITHOUT them: this command's output describes the remaining resources only, which is not the same as the stack holding none of these. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
15659
15715
  }
15660
- function malformedOrphanRecordsWarning(rawStackName, rawRegion, logicalIds, alsoRejectsTornMaps) {
15716
+ function malformedOrphanRecordsWarning(rawStackName, rawRegion, logicalIds, alsoRejectsTornMaps, recovery) {
15661
15717
  const stackName = absentIfEmpty(rawStackName);
15662
15718
  const region = absentIfEmpty(rawRegion);
15663
- return `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' that cannot be read as resources — ${namedOrphanRows(logicalIds)} — because they are not objects, have no string 'logicalId' or share it with another row, or their 'state' is not an object, names no resource type${alsoRejectsTornMaps ? ", has no non-empty string 'physicalId', or holds a 'properties' or 'attributes' map that is not an object" : ` or has no non-empty string 'physicalId'`}. Continuing WITHOUT them: ${alsoRejectsTornMaps ? `they are excluded from the secret scan, so nothing this run does can certify them` : "they are not previewed for adoption, and 'cdkd deploy' refuses the record over them rather than dropping them as this command does"}. These ids were read from 'orphans'; the 'resources' map carries its own warning when it is damaged too. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
15719
+ return `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' that cannot be read as resources — ${namedOrphanRows(logicalIds)} — because they are not objects, have no string 'logicalId' or share it with another row, or their 'state' is not an object, names no resource type${alsoRejectsTornMaps ? ", has no non-empty string 'physicalId', or holds a 'properties' or 'attributes' map that is not an object" : ` or has no non-empty string 'physicalId'`}. Continuing WITHOUT them: ${alsoRejectsTornMaps ? `they are excluded from the secret scan, so nothing this run does can certify them` : "they are not previewed for adoption, and 'cdkd deploy' refuses the record over them rather than dropping them as this command does"}. These ids were read from 'orphans'; the 'resources' map carries its own warning when it is damaged too. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
15664
15720
  }
15665
15721
  function namedEntriesClause(stackName, region, logicalIds) {
15666
15722
  const named = logicalIds.slice(0, NAMED_UNREADABLE_ENTRIES).map((id) => displayLogicalId(id)).join(", ");
@@ -15673,15 +15729,15 @@ function malformedResourceEntriesRefusalMessage(rawStackName, rawRegion, logical
15673
15729
  const region = absentIfEmpty(rawRegion);
15674
15730
  return `${namedEntriesClause(stackName, region, logicalIds)} This command can WRITE state, so it refuses rather than skipping them: saving over the record would report a clean run for entries nothing could read, and would leave the next command to fail on them with no more to go on. Nothing was locked, read from AWS or written FOR THIS STACK. ${inspectClause(stackName, region, recovery)}Inspect it with: ` + inspectCommand(stackName, region, recovery);
15675
15731
  }
15676
- function refuseMalformedResourceEntriesForDeploy(state, stackName, region) {
15732
+ function refuseMalformedResourceEntriesForDeploy(state, stackName, region, recovery) {
15677
15733
  const unreadable = unreadableResourceEntries(state);
15678
15734
  if (unreadable.length === 0) return;
15679
- throw markNonRetryable(new CdkdError(malformedDeployResourceEntriesRefusalMessage(stackName, region, unreadable), STATE_RESOURCES_MALFORMED));
15735
+ throw markNonRetryable(new CdkdError(malformedDeployResourceEntriesRefusalMessage(stackName, region, unreadable, recovery), STATE_RESOURCES_MALFORMED));
15680
15736
  }
15681
- function malformedDeployResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds) {
15737
+ function malformedDeployResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
15682
15738
  const stackName = absentIfEmpty(rawStackName);
15683
15739
  const region = absentIfEmpty(rawRegion);
15684
- return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: a row that is not an object reads as a resource cdkd does not manage, so the template's resource of that id is planned as a CREATE (a second copy of a live resource, or a name collision), and a row with no resource type is planned as a TYPE CHANGE, which replaces the live resource. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the rest of the stack without those rows and warns that it did. ${inspectClause(stackName, region)}Inspect the record with: ` + inspectCommand(stackName, region);
15740
+ return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd deploy' can WRITE state and AWS resources, so it refuses rather than continuing — under '--dry-run' too, because the plan a dry run would print is the wrong one: a row that is not an object reads as a resource cdkd does not manage, so the template's resource of that id is planned as a CREATE (a second copy of a live resource, or a name collision), and a row with no resource type is planned as a TYPE CHANGE, which replaces the live resource. Nothing was provisioned and no state was written FOR THIS STACK. Repair or remove the record first; 'cdkd diff' previews the rest of the stack without those rows and warns that it did. ${inspectClause(stackName, region, recovery)}Inspect the record with: ` + inspectCommand(stackName, region, recovery);
15685
15741
  }
15686
15742
  function refuseMalformedResourceEntriesForDestroy(state, stackName, region, recovery) {
15687
15743
  const unreadable = unreadableResourceEntries(state);
@@ -15719,20 +15775,20 @@ function malformedImportUnrepairedEntriesRefusalMessage(rawStackName, rawRegion,
15719
15775
  const region = absentIfEmpty(rawRegion);
15720
15776
  return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd import' was asked to re-import these rows and their import did not succeed (each is reported above), so the record it would save still holds them unreadable; it refuses rather than saving a row it could not replace. Nothing was written FOR THIS STACK, and the resources this run did import stay as they are in AWS. Fix what the import reported, or repair the rows by hand, and re-run. ${inspectClause(stackName, region, recovery)}Inspect the record with: ` + inspectCommand(stackName, region, recovery);
15721
15777
  }
15722
- function malformedScrubResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds) {
15778
+ function malformedScrubResourceEntriesRefusalMessage(rawStackName, rawRegion, logicalIds, recovery) {
15723
15779
  const stackName = absentIfEmpty(rawStackName);
15724
15780
  const region = absentIfEmpty(rawRegion);
15725
- return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd scrub' REBUILDS and SAVES the resource map whenever anything in the stack changed, so it refuses rather than continuing: a null row either stops the rewrite on a bare TypeError under the lock (the template still positions it and this stack recorded a secret) or is copied into the rebuilt map as it stands — reported clean when no secret was recorded at all, saved back the moment another record changed; a string or number the template positions is spread into an object and saved as one; and a row with no resource type is rewritten and saved still without one. Nothing was written FOR THIS STACK. Repair or remove the row first; '--dry-run' audits the rest of the record without it and warns that it did. ${inspectClause(stackName, region)}Inspect the record with: ` + inspectCommand(stackName, region);
15781
+ return `${namedEntriesClause(stackName, region, logicalIds)} 'cdkd scrub' REBUILDS and SAVES the resource map whenever anything in the stack changed, so it refuses rather than continuing: a null row either stops the rewrite on a bare TypeError under the lock (the template still positions it and this stack recorded a secret) or is copied into the rebuilt map as it stands — reported clean when no secret was recorded at all, saved back the moment another record changed; a string or number the template positions is spread into an object and saved as one; and a row with no resource type is rewritten and saved still without one. Nothing was written FOR THIS STACK. Repair or remove the row first; '--dry-run' audits the rest of the record without it and warns that it did. ${inspectClause(stackName, region, recovery)}Inspect the record with: ` + inspectCommand(stackName, region, recovery);
15726
15782
  }
15727
- function malformedLocalResourcesWarning(rawStackName, rawRegion) {
15783
+ function malformedLocalResourcesWarning(rawStackName, rawRegion, recovery) {
15728
15784
  const stackName = absentIfEmpty(rawStackName);
15729
15785
  const region = absentIfEmpty(rawRegion);
15730
- return `${malformedStateDiagnosis(stackName, region)} Continuing with it EMPTY: every 'Ref' and 'Fn::GetAtt' in this run's environment that names a resource of this record resolves to nothing and is dropped, and a bare '--assume-role' falls back to the developer's credentials — which is not the same as the record holding no resources. Nothing is written; 'cdkd deploy' and 'cdkd destroy' refuse this record instead. ${inspectClause(stackName, region)}See the stored value with: ` + inspectCommand(stackName, region);
15786
+ return `${malformedStateDiagnosis(stackName, region)} Continuing with it EMPTY: every 'Ref' and 'Fn::GetAtt' in this run's environment that names a resource of this record resolves to nothing and is dropped, and a bare '--assume-role' falls back to the developer's credentials — which is not the same as the record holding no resources. Nothing is written; 'cdkd deploy' and 'cdkd destroy' refuse this record instead. ${inspectClause(stackName, region, recovery)}See the stored value with: ` + inspectCommand(stackName, region, recovery);
15731
15787
  }
15732
- function malformedLocalResourceEntriesWarning(rawStackName, rawRegion, logicalIds) {
15788
+ function malformedLocalResourceEntriesWarning(rawStackName, rawRegion, logicalIds, recovery) {
15733
15789
  const stackName = absentIfEmpty(rawStackName);
15734
15790
  const region = absentIfEmpty(rawRegion);
15735
- return `${namedEntriesClause(stackName, region, logicalIds)} Continuing WITHOUT them: a 'Ref' or 'Fn::GetAtt' in this run's environment that names one of these ids resolves to nothing and is dropped, and a bare '--assume-role' read through one falls back to the developer's credentials — which is not the same as the record holding no such resource. Nothing is written; 'cdkd deploy' and 'cdkd destroy' refuse this record instead. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
15791
+ return `${namedEntriesClause(stackName, region, logicalIds)} Continuing WITHOUT them: a 'Ref' or 'Fn::GetAtt' in this run's environment that names one of these ids resolves to nothing and is dropped, and a bare '--assume-role' read through one falls back to the developer's credentials — which is not the same as the record holding no such resource. Nothing is written; 'cdkd deploy' and 'cdkd destroy' refuse this record instead. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
15736
15792
  }
15737
15793
  function refuseMalformedResourceEntriesForOrphan(state, removedLogicalIds, stackName, region, recovery) {
15738
15794
  const removed = new Set(removedLogicalIds);
@@ -15781,10 +15837,10 @@ function hasAddressablePhysicalId(entry) {
15781
15837
  const physicalId = entry.physicalId;
15782
15838
  return typeof physicalId === "string" && physicalId.trim() !== "";
15783
15839
  }
15784
- function unaddressableUpdateRefusalMessage(rawStackName, rawRegion, logicalId, resourceType) {
15840
+ function unaddressableUpdateRefusalMessage(rawStackName, rawRegion, logicalId, resourceType, recovery) {
15785
15841
  const stackName = absentIfEmpty(rawStackName);
15786
15842
  const region = absentIfEmpty(rawRegion);
15787
- return `${stackClause(stackName, region)} holds a record for ${displayIdent(logicalId)} (${displayIdent(resourceType)}) with no non-empty string 'physicalId', so cdkd cannot address that resource in AWS and did not try to update it. 'cdkd deploy' fails on it rather than skipping it, since a skipped update would end the deploy without the template's change. Nothing was sent for this resource. Repair the record's 'physicalId' and re-run. ${inspectClause(stackName, region)}Inspect the record with: ` + inspectCommand(stackName, region);
15843
+ return `${stackClause(stackName, region)} holds a record for ${displayIdent(logicalId)} (${displayIdent(resourceType)}) with no non-empty string 'physicalId', so cdkd cannot address that resource in AWS and did not try to update it. 'cdkd deploy' fails on it rather than skipping it, since a skipped update would end the deploy without the template's change. Nothing was sent for this resource. Repair the record's 'physicalId' and re-run. ${inspectClause(stackName, region, recovery)}Inspect the record with: ` + inspectCommand(stackName, region, recovery);
15788
15844
  }
15789
15845
  function unpreviewableOrphanRecords(state) {
15790
15846
  if (!Array.isArray(state.orphans)) return [];
@@ -15873,10 +15929,10 @@ function refuseMalformedOrphansForOrphan(state, stackName, region, recovery) {
15873
15929
  function deployRefusesOrphanRowsReason(logicalIds) {
15874
15930
  return `${logicalIds.length} rollback-orphan record(s) in 'orphans' — ${namedOrphanRows(logicalIds)} — carry a 'properties' or 'attributes' map that cannot be read. This preview KEEPS them, so any adoption shown for them is one 'cdkd deploy' will not perform: it refuses the record over the same rows, and the deploy this previews will not start.`;
15875
15931
  }
15876
- function malformedOrphanRowsKeptWarning(rawStackName, rawRegion, logicalIds) {
15932
+ function malformedOrphanRowsKeptWarning(rawStackName, rawRegion, logicalIds, recovery) {
15877
15933
  const stackName = absentIfEmpty(rawStackName);
15878
15934
  const region = absentIfEmpty(rawRegion);
15879
- return `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' — ${namedOrphanRows(logicalIds)} — whose 'properties' or 'attributes' map is not an object. This preview KEEPS them. 'cdkd deploy' of THIS stack does NOT: it refuses the whole record over these rows and will not start until they are repaired. ${inspectClause(stackName, region)}See the stored values with: ` + inspectCommand(stackName, region);
15935
+ return `${stackClause(stackName, region)} holds ${logicalIds.length} rollback-orphan record(s) in 'orphans' — ${namedOrphanRows(logicalIds)} — whose 'properties' or 'attributes' map is not an object. This preview KEEPS them. 'cdkd deploy' of THIS stack does NOT: it refuses the whole record over these rows and will not start until they are repaired. ${inspectClause(stackName, region, recovery)}See the stored values with: ` + inspectCommand(stackName, region, recovery);
15880
15936
  }
15881
15937
  function namedOrphanRows(logicalIds) {
15882
15938
  const named = logicalIds.slice(0, NAMED_UNREADABLE_ENTRIES).map((id) => displayLogicalId(id)).join(", ");
@@ -17993,7 +18049,7 @@ async function resolveGetAtt(getAtt, context) {
17993
18049
  const [rawLogicalId, rawAttributeName] = getAtt;
17994
18050
  logicalId = rawLogicalId;
17995
18051
  const resolvedAttributeName = await this.resolveValue(rawAttributeName, context);
17996
- if (typeof resolvedAttributeName !== "string") throw new Error(`Fn::GetAtt attribute name for ${this.displayMasked(logicalId, context)} must resolve to a string, got ${typeof resolvedAttributeName}: ${stringifyValue(this.maskValueLeaves(resolvedAttributeName, context))}`);
18052
+ if (typeof resolvedAttributeName !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetAtt attribute name for ${this.displayMasked(logicalId, context)} must resolve to a string, got ${typeof resolvedAttributeName}: ${stringifyValue(this.maskValueLeaves(resolvedAttributeName, context))}`));
17997
18053
  attributeName = resolvedAttributeName;
17998
18054
  } else {
17999
18055
  const split = splitGetAttStringForm(getAtt);
@@ -18335,8 +18391,8 @@ function pinSecretVerdict(expression, secret, scope) {
18335
18391
  async function resolveImportValue(importValueArg, context) {
18336
18392
  const sourceKey = crossStackSourceKey({ "Fn::ImportValue": importValueArg });
18337
18393
  const exportName = await this.resolveValue(importValueArg, context);
18338
- if (typeof exportName !== "string") throw new Error(`Fn::ImportValue: export name must resolve to a string, got ${typeof exportName}`);
18339
- if (!context.stateBackend) throw new Error("Fn::ImportValue: state backend is required for cross-stack references");
18394
+ if (typeof exportName !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::ImportValue: export name must resolve to a string, got ${typeof exportName}`));
18395
+ if (!context.stateBackend) throw markNonRetryable(/* @__PURE__ */ new Error("Fn::ImportValue: state backend is required for cross-stack references"));
18340
18396
  const loggedExportName = this.displayMasked(exportName, context);
18341
18397
  this.logger.debug(`Resolving Fn::ImportValue: ${loggedExportName}`);
18342
18398
  if (context.exportIndex) {
@@ -18516,32 +18572,32 @@ function getCfnClient(region) {
18516
18572
  //#endregion
18517
18573
  //#region src/deployment/intrinsic-resolver/stack-output.ts
18518
18574
  async function resolveGetStackOutput(arg, context) {
18519
- if (!arg || typeof arg !== "object" || Array.isArray(arg)) throw new Error(`Fn::GetStackOutput: argument must be an object with StackName/OutputName/Region/RoleArn, got ${arg === null ? "null" : Array.isArray(arg) ? "array" : typeof arg}`);
18575
+ if (!arg || typeof arg !== "object" || Array.isArray(arg)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: argument must be an object with StackName/OutputName/Region/RoleArn, got ${arg === null ? "null" : Array.isArray(arg) ? "array" : typeof arg}`));
18520
18576
  const args = arg;
18521
- if (!("StackName" in args)) throw new Error("Fn::GetStackOutput: StackName is required");
18522
- if (!("OutputName" in args)) throw new Error("Fn::GetStackOutput: OutputName is required");
18577
+ if (!("StackName" in args)) throw markNonRetryable(/* @__PURE__ */ new Error("Fn::GetStackOutput: StackName is required"));
18578
+ if (!("OutputName" in args)) throw markNonRetryable(/* @__PURE__ */ new Error("Fn::GetStackOutput: OutputName is required"));
18523
18579
  const sourceKey = crossStackSourceKey({ "Fn::GetStackOutput": args });
18524
18580
  const stackName = await this.resolveValue(args["StackName"], context);
18525
- if (typeof stackName !== "string" || stackName === "") throw new Error(`Fn::GetStackOutput: StackName must resolve to a non-empty string, got ${typeof stackName}`);
18581
+ if (typeof stackName !== "string" || stackName === "") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: StackName must resolve to a non-empty string, got ${typeof stackName}`));
18526
18582
  const outputName = await this.resolveValue(args["OutputName"], context);
18527
- if (typeof outputName !== "string" || outputName === "") throw new Error(`Fn::GetStackOutput: OutputName must resolve to a non-empty string, got ${typeof outputName}`);
18583
+ if (typeof outputName !== "string" || outputName === "") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: OutputName must resolve to a non-empty string, got ${typeof outputName}`));
18528
18584
  let region = this.resolverRegion;
18529
18585
  let loggedRegionText = this.logTextOfLeaf(region, context);
18530
18586
  if ("Region" in args && args["Region"] !== void 0 && args["Region"] !== null) {
18531
18587
  const resolvedRegion = await this.resolveValue(args["Region"], context);
18532
- if (typeof resolvedRegion !== "string" || resolvedRegion === "") throw new Error(`Fn::GetStackOutput: Region must resolve to a non-empty string, got ${typeof resolvedRegion}`);
18588
+ if (typeof resolvedRegion !== "string" || resolvedRegion === "") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: Region must resolve to a non-empty string, got ${typeof resolvedRegion}`));
18533
18589
  const requestedRegion = canonicalizeRegion(resolvedRegion);
18534
- if (!isClientSafeRegion(requestedRegion)) throw new Error(`Fn::GetStackOutput: ${this.displayMaskedIdent(this.logTextOfLeaf(resolvedRegion, context) !== resolvedRegion ? "***" : resolvedRegion, context, 64)} is not a valid AWS region name. The region selects both the AWS endpoint and the state-file key, so cdkd will not use it.`);
18590
+ if (!isClientSafeRegion(requestedRegion)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: ${this.displayMaskedIdent(this.logTextOfLeaf(resolvedRegion, context) !== resolvedRegion ? "***" : resolvedRegion, context, 64)} is not a valid AWS region name. The region selects both the AWS endpoint and the state-file key, so cdkd will not use it.`));
18535
18591
  region = requestedRegion;
18536
18592
  loggedRegionText = this.regionLogText(resolvedRegion, context);
18537
18593
  }
18538
18594
  let roleArn;
18539
18595
  if ("RoleArn" in args && args["RoleArn"] !== void 0 && args["RoleArn"] !== null) {
18540
18596
  const raw = args["RoleArn"];
18541
- if (typeof raw !== "string" || raw === "") throw new Error(`Fn::GetStackOutput: RoleArn must be a literal string in the template (no Ref / Fn::GetAtt / Fn::Sub allowed for cross-account references). Got ${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}${typeof raw === "object" ? ` (intrinsic shape: ${this.displayMasked(JSON.stringify(raw).slice(0, 80), context)})` : ""}.`);
18597
+ if (typeof raw !== "string" || raw === "") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: RoleArn must be a literal string in the template (no Ref / Fn::GetAtt / Fn::Sub allowed for cross-account references). Got ${raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw}${typeof raw === "object" ? ` (intrinsic shape: ${this.displayMasked(JSON.stringify(raw).slice(0, 80), context)})` : ""}.`));
18542
18598
  roleArn = raw;
18543
18599
  }
18544
- if (!roleArn && context.stackName && context.stackName === stackName && canonicalizeRegion(region) === canonicalizeRegion(this.resolverRegion)) throw new Error(`Fn::GetStackOutput: cannot reference own stack ${this.displayMaskedIdent(stackName, context, STACK_REF_MAX_CODE_POINTS)} in the same region ${this.displayMaskedIdent(loggedRegionText, context)}`);
18600
+ if (!roleArn && context.stackName && context.stackName === stackName && canonicalizeRegion(region) === canonicalizeRegion(this.resolverRegion)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: cannot reference own stack ${this.displayMaskedIdent(stackName, context, STACK_REF_MAX_CODE_POINTS)} in the same region ${this.displayMaskedIdent(loggedRegionText, context)}`));
18545
18601
  const loggedStackName = this.displayMaskedIdent(stackName, context, STACK_REF_MAX_CODE_POINTS);
18546
18602
  const loggedOutputName = this.displayMaskedIdent(outputName, context);
18547
18603
  const loggedRegion = this.displayMasked(loggedRegionText, context);
@@ -18559,7 +18615,7 @@ async function resolveGetStackOutput(arg, context) {
18559
18615
  if (cfnOutputs) {
18560
18616
  if (!Object.hasOwn(cfnOutputs, outputName)) {
18561
18617
  const available = this.describeAvailableOutputs(Object.keys(cfnOutputs), context);
18562
- throw new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in CloudFormation stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`);
18618
+ throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in CloudFormation stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`));
18563
18619
  }
18564
18620
  const value = cfnOutputs[outputName];
18565
18621
  this.logger.info(`Resolved Fn::GetStackOutput: StackName=${loggedStackName}, Region=${loggedRegion}, OutputName=${loggedOutputName} (from CloudFormation stack outputs; weak reference — producer is not cdkd-managed)`);
@@ -18572,7 +18628,7 @@ async function resolveGetStackOutput(arg, context) {
18572
18628
  const outputs = stateData.state.outputs ?? {};
18573
18629
  if (!Object.hasOwn(outputs, outputName)) {
18574
18630
  const available = this.describeAvailableOutputs(Object.keys(outputs), context);
18575
- throw new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`);
18631
+ throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: output ${loggedOutputName} not found in stack ${loggedStackName} (${displayIdent(loggedRegion)}). Available outputs: ${available}`));
18576
18632
  }
18577
18633
  const value = outputs[outputName];
18578
18634
  this.logger.info(`Resolved Fn::GetStackOutput: StackName=${loggedStackName}, Region=${loggedRegion}, OutputName=${loggedOutputName}${roleArn ? `, RoleArn=${shownRoleArn}` : ""} (${carriesDynamicReference(value) ? "redacted dynamic reference" : "literal value"})`);
@@ -18825,7 +18881,7 @@ async function applyRoleArnIfSet(opts) {
18825
18881
  //#endregion
18826
18882
  //#region src/deployment/intrinsic-resolver/stack-state.ts
18827
18883
  async function getSameAccountStackState(stackName, region, context) {
18828
- if (!context.stateBackend) throw new Error("Fn::GetStackOutput: state backend is required for cross-stack references");
18884
+ if (!context.stateBackend) throw markNonRetryable(/* @__PURE__ */ new Error("Fn::GetStackOutput: state backend is required for cross-stack references"));
18829
18885
  return context.stateBackend.getState(stackName, region);
18830
18886
  }
18831
18887
  async function getCrossAccountStackState(roleArn, stackName, region, context) {
@@ -18834,7 +18890,7 @@ async function getCrossAccountStackState(roleArn, stackName, region, context) {
18834
18890
  const shownRoleArn = displayIdent(roleArn, { maxCodePoints: 613 });
18835
18891
  const bounded = !/\s/.test(roleArn) && shownRoleArn === roleArn ? `'${shownRoleArn}'` : shellBoundedDisplay(shownRoleArn);
18836
18892
  const subject = bounded === "a value that cannot be shown safely here" ? `the RoleArn argument (${UNSHOWABLE_VALUE})` : `RoleArn ${bounded}`;
18837
- throw new Error(`Fn::GetStackOutput: ${subject} is not a valid IAM role ARN. Expected shape: arn:<partition>:iam::<12-digit-account-id>:role/<role-name> (e.g. arn:aws:iam::123456789012:role/MyRole, arn:aws-us-gov:iam::...).`);
18893
+ throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetStackOutput: ${subject} is not a valid IAM role ARN. Expected shape: arn:<partition>:iam::<12-digit-account-id>:role/<role-name> (e.g. arn:aws:iam::123456789012:role/MyRole, arn:aws-us-gov:iam::...).`));
18838
18894
  }
18839
18895
  const credentials = await assumeRoleForCrossAccountStateRead(roleArn);
18840
18896
  const { bucket, region: bucketRegion } = await resolveCrossAccountStateBucket(parsed.accountId, credentials);
@@ -19139,7 +19195,7 @@ async function resolveSecretsManagerReference(inner, context, nameLogText) {
19139
19195
  versionId = remainingParts[2] || "";
19140
19196
  } else secretId = afterService;
19141
19197
  if (!versionStage) versionStage = "AWSCURRENT";
19142
- if (!secretId) throw new Error("Dynamic reference: secretsmanager SECRET_ID is required");
19198
+ if (!secretId) throw markNonRetryable(/* @__PURE__ */ new Error("Dynamic reference: secretsmanager SECRET_ID is required"));
19143
19199
  const loggedSecretId = this.displayMasked(nameLogText(secretId), context);
19144
19200
  const loggedJsonKey = this.displayMasked(nameLogText(jsonKey), context);
19145
19201
  this.logger.debug(`Resolving dynamic reference: secretsmanager:${loggedSecretId}:SecretString:${loggedJsonKey}:${this.displayMasked(nameLogText(versionStage), context)}:${this.displayMasked(nameLogText(versionId), context)}`);
@@ -19154,14 +19210,14 @@ async function resolveSecretsManagerReference(inner, context, nameLogText) {
19154
19210
  [versionStage, this.displayMasked(nameLogText(versionStage), context)],
19155
19211
  [versionId, this.displayMasked(nameLogText(versionId), context)]
19156
19212
  ], context))).SecretString;
19157
- if (!secretString) throw new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} does not contain a SecretString value`);
19213
+ if (!secretString) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} does not contain a SecretString value`));
19158
19214
  if (jsonKey) try {
19159
19215
  const parsed = JSON.parse(secretString);
19160
19216
  const keyValue = Object.hasOwn(parsed, jsonKey) ? parsed[jsonKey] : void 0;
19161
- if (keyValue === void 0) throw new Error(`Dynamic reference: key ${quotedRender(loggedJsonKey, "'")} not found in secret ${quotedRender(loggedSecretId, "'")}`);
19217
+ if (keyValue === void 0) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: key ${quotedRender(loggedJsonKey, "'")} not found in secret ${quotedRender(loggedSecretId, "'")}`));
19162
19218
  return stringifyValue(keyValue);
19163
19219
  } catch (error) {
19164
- if (error instanceof SyntaxError) throw new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} is not valid JSON but JSON_KEY ${quotedRender(loggedJsonKey, "'")} was specified`);
19220
+ if (error instanceof SyntaxError) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} is not valid JSON but JSON_KEY ${quotedRender(loggedJsonKey, "'")} was specified`));
19165
19221
  throw error;
19166
19222
  }
19167
19223
  return secretString;
@@ -19180,7 +19236,7 @@ async function sendWithThrottleRetry(operation, label, masks) {
19180
19236
  }
19181
19237
  async function resolveSSMReference(parts, decrypt, service, context, nameLogText) {
19182
19238
  const parameterName = parts.slice(1).join(":");
19183
- if (!parameterName) throw new Error(`Dynamic reference: ${service} PARAMETER_NAME is required`);
19239
+ if (!parameterName) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: ${service} PARAMETER_NAME is required`));
19184
19240
  const loggedParameterName = this.displayMasked(nameLogText(parameterName), context);
19185
19241
  this.logger.debug(`Resolving dynamic reference: ${service}:${loggedParameterName}`);
19186
19242
  const client = this.clientsForRegion(this.explicitRegion).ssm;
@@ -19190,7 +19246,7 @@ async function resolveSSMReference(parts, decrypt, service, context, nameLogText
19190
19246
  });
19191
19247
  const response = await this.sendWithThrottleRetry(() => client.send(command), `${service}:${loggedParameterName}`, this.namedRequestMasks([[parameterName, loggedParameterName]], context));
19192
19248
  const paramValue = response.Parameter?.Value;
19193
- if (paramValue === void 0 || paramValue === null) throw new Error(`Dynamic reference: SSM parameter ${quotedRender(loggedParameterName, "'")} not found or has no value`);
19249
+ if (paramValue === void 0 || paramValue === null) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: SSM parameter ${quotedRender(loggedParameterName, "'")} not found or has no value`));
19194
19250
  const paramType = response.Parameter?.Type;
19195
19251
  const secure = paramType !== "String" && paramType !== "StringList";
19196
19252
  if (secure && paramType !== "SecureString" && !this.warnedUnrecognizedSsmTypes.has(injectiveKey(parameterName, String(paramType)))) {
@@ -19234,7 +19290,7 @@ async function resolveJoin(joinArgs, context, source) {
19234
19290
  const [delimiter, rawValues] = joinArgs;
19235
19291
  let values = rawValues;
19236
19292
  if (!Array.isArray(values)) values = await this.resolveValue(values, context);
19237
- if (!Array.isArray(values)) throw new Error(`Fn::Join's second argument must be a list (an array literal or a list-returning intrinsic such as Fn::Cidr / Fn::GetAZs / Fn::Split / a Ref to a list-typed parameter — any List<...> type or CommaDelimitedList), but resolved to ${typeof values}`);
19293
+ if (!Array.isArray(values)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Join's second argument must be a list (an array literal or a list-returning intrinsic such as Fn::Cidr / Fn::GetAZs / Fn::Split / a Ref to a list-typed parameter — any List<...> type or CommaDelimitedList), but resolved to ${typeof values}`));
19238
19294
  const literalList = Array.isArray(rawValues);
19239
19295
  const resolvedParts = await allSettledKeepingFirstRejection(() => values.map(async (v) => {
19240
19296
  if (typeof v === "string") {
@@ -19317,7 +19373,7 @@ async function resolveSelect(selectArgs, context) {
19317
19373
  throw markNonRetryable(new IntrinsicResolutionRefusalError(`Fn::Select: the index${sourceClause} must resolve to a non-negative integer (a number, or its decimal string with no leading zero), got ${this.describeOperandShape(resolvedIndex, context)}. Use a literal, a Ref to a parameter or an Fn::FindInMap that yields one.`));
19318
19374
  }
19319
19375
  const resolvedList = await this.resolveValue(list, context);
19320
- if (!Array.isArray(resolvedList)) throw new Error(`Fn::Select: list must be an array, got ${typeof resolvedList}`);
19376
+ if (!Array.isArray(resolvedList)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Select: list must be an array, got ${typeof resolvedList}`));
19321
19377
  const loggedPosition = this.displayMasked(String(position), context);
19322
19378
  if (position >= resolvedList.length) {
19323
19379
  if (loggedPosition !== String(position)) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Fn::Select: the index ${loggedPosition} is out of bounds (array length: ${resolvedList.length}), and it resolves from a secret value, so cdkd will not write it into the OutOfBounds placeholder.`));
@@ -19653,7 +19709,7 @@ async function resolveConditionReference(conditionName, context) {
19653
19709
  return false;
19654
19710
  }
19655
19711
  async function resolveAnd(conditions, context) {
19656
- if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) throw new Error(`Fn::And requires between 2 and 10 conditions, got ${conditions.length}`);
19712
+ if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::And requires between 2 and 10 conditions, got ${conditions.length}`));
19657
19713
  const results = [];
19658
19714
  for (const condition of conditions) {
19659
19715
  const resolved = await this.resolveValue(condition, context);
@@ -19664,7 +19720,7 @@ async function resolveAnd(conditions, context) {
19664
19720
  return result;
19665
19721
  }
19666
19722
  async function resolveOr(conditions, context) {
19667
- if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) throw new Error(`Fn::Or requires between 2 and 10 conditions, got ${conditions.length}`);
19723
+ if (!Array.isArray(conditions) || conditions.length < 2 || conditions.length > 10) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Or requires between 2 and 10 conditions, got ${conditions.length}`));
19668
19724
  const results = [];
19669
19725
  for (const condition of conditions) {
19670
19726
  const resolved = await this.resolveValue(condition, context);
@@ -19675,7 +19731,7 @@ async function resolveOr(conditions, context) {
19675
19731
  return result;
19676
19732
  }
19677
19733
  async function resolveNot(notArgs, context) {
19678
- if (!Array.isArray(notArgs) || notArgs.length !== 1) throw new Error(`Fn::Not requires exactly one condition, got ${Array.isArray(notArgs) ? notArgs.length : 0}`);
19734
+ if (!Array.isArray(notArgs) || notArgs.length !== 1) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Not requires exactly one condition, got ${Array.isArray(notArgs) ? notArgs.length : 0}`));
19679
19735
  const [condition] = notArgs;
19680
19736
  const resolved = await this.resolveValue(condition, context);
19681
19737
  const result = !resolved;
@@ -19693,20 +19749,20 @@ async function resolveFindInMap(findInMapArgs, context) {
19693
19749
  const map = mappings != null && Object.hasOwn(mappings, mapName) ? mappings[mapName] : void 0;
19694
19750
  if (!mappings) {
19695
19751
  if (hasDefaultValue) return await resolveDefault();
19696
- throw new Error(`Fn::FindInMap: no Mappings section found in template`);
19752
+ throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::FindInMap: no Mappings section found in template`));
19697
19753
  }
19698
19754
  if (!map) {
19699
19755
  if (hasDefaultValue) return await resolveDefault();
19700
- throw new Error(`Fn::FindInMap: mapping ${quotedRender(this.displayMasked(mapName, context), "'")} not found in Mappings section`);
19756
+ throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::FindInMap: mapping ${quotedRender(this.displayMasked(mapName, context), "'")} not found in Mappings section`));
19701
19757
  }
19702
19758
  const topLevel = Object.hasOwn(map, topLevelKey) ? map[topLevelKey] : void 0;
19703
19759
  if (!topLevel || typeof topLevel !== "object") {
19704
19760
  if (hasDefaultValue) return await resolveDefault();
19705
- throw new Error(`Fn::FindInMap: top-level key ${quotedRender(this.displayMasked(topLevelKey, context), "'")} not found in mapping ${quotedRender(this.displayMasked(mapName, context), "'")}`);
19761
+ throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::FindInMap: top-level key ${quotedRender(this.displayMasked(topLevelKey, context), "'")} not found in mapping ${quotedRender(this.displayMasked(mapName, context), "'")}`));
19706
19762
  }
19707
19763
  if (!Object.hasOwn(topLevel, secondLevelKey)) {
19708
19764
  if (hasDefaultValue) return await resolveDefault();
19709
- throw new Error(`Fn::FindInMap: second-level key ${quotedRender(this.displayMasked(secondLevelKey, context), "'")} not found in mapping ${quotedRender(this.displayMasked(mapName, context), "'")} under top-level key ${quotedRender(this.displayMasked(topLevelKey, context), "'")}`);
19765
+ throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::FindInMap: second-level key ${quotedRender(this.displayMasked(secondLevelKey, context), "'")} not found in mapping ${quotedRender(this.displayMasked(mapName, context), "'")} under top-level key ${quotedRender(this.displayMasked(topLevelKey, context), "'")}`));
19710
19766
  }
19711
19767
  const result = topLevel[secondLevelKey];
19712
19768
  this.logger.debug(`Resolved Fn::FindInMap: ${this.logRender(mapName, context)}.${this.logRender(topLevelKey, context)}.${this.logRender(secondLevelKey, context)} resolved to ${this.logRender(JSON.stringify(this.maskValueLeaves(result, context)), context, { structured: true })}`);
@@ -19714,7 +19770,7 @@ async function resolveFindInMap(findInMapArgs, context) {
19714
19770
  }
19715
19771
  async function resolveBase64(value, context) {
19716
19772
  const resolvedValue = await this.resolveValue(value, context);
19717
- if (typeof resolvedValue !== "string") throw new Error(`Fn::Base64: value must resolve to a string, got ${typeof resolvedValue}`);
19773
+ if (typeof resolvedValue !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Base64: value must resolve to a string, got ${typeof resolvedValue}`));
19718
19774
  if (context.skipDynamicReferences === true && keepsSecretReferenceToken(resolvedValue) && !(context.recordedSecretValues !== void 0 && embedsFreshNoEchoValue(resolvedValue, context.recordedSecretValues))) {
19719
19775
  this.logger.debug(safeMsg`Resolved Fn::Base64: ${this.logRender(this.logTextOfLeaf(resolvedValue, context), context)} resolved to ${"***"} (an unresolved secret reference, compared as the mask the deploy persists)`);
19720
19776
  return "***";
@@ -19742,7 +19798,7 @@ async function resolveGetAZs(value, context) {
19742
19798
  let loggedRegionText;
19743
19799
  if (typeof resolvedValue === "string" && resolvedValue !== "") {
19744
19800
  const requested = canonicalizeRegion(resolvedValue);
19745
- if (!isClientSafeRegion(requested)) throw new Error(`Fn::GetAZs: the value ${quotedRender(this.displayMasked(this.logTextOfLeaf(resolvedValue, context) !== resolvedValue ? "***" : resolvedValue, context).slice(0, 64), "'")} is not a valid AWS region name. A region is substituted into the AWS service hostname, so cdkd will not build a client from it.`);
19801
+ if (!isClientSafeRegion(requested)) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetAZs: the value ${quotedRender(this.displayMasked(this.logTextOfLeaf(resolvedValue, context) !== resolvedValue ? "***" : resolvedValue, context).slice(0, 64), "'")} is not a valid AWS region name. A region is substituted into the AWS service hostname, so cdkd will not build a client from it.`));
19746
19802
  region = requested;
19747
19803
  clientRegion = requested;
19748
19804
  loggedRegionText = this.regionLogText(resolvedValue, context);
@@ -19771,7 +19827,7 @@ async function resolveGetAZs(value, context) {
19771
19827
  const masks = this.namedRequestMasks([[region, loggedRegion]], context);
19772
19828
  throw new Error(`Fn::GetAZs: failed to describe availability zones for region ${quotedRender(loggedRegion, "'")}: ${masks.text(error instanceof Error ? error.message : String(error))}`);
19773
19829
  }
19774
- if (azNames.length === 0) throw new Error(`Fn::GetAZs: no availability zones returned for region ${quotedRender(this.displayMasked(loggedRegionText ?? region, context), "'")}. Either the region is not enabled on this account (opt-in regions must be enabled before use), or the request was answered by a different region's endpoint.`);
19830
+ if (azNames.length === 0) throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::GetAZs: no availability zones returned for region ${quotedRender(this.displayMasked(loggedRegionText ?? region, context), "'")}. Either the region is not enabled on this account (opt-in regions must be enabled before use), or the request was answered by a different region's endpoint.`));
19775
19831
  cachedAvailabilityZones.set(azCacheKey, azNames);
19776
19832
  this.logger.debug(`Resolved Fn::GetAZs: ${this.logRender(loggedRegionText ?? region, context)} resolved to ${this.logRender(JSON.stringify(this.maskValueLeaves(azNames, context)), context, { structured: true })}`);
19777
19833
  return azNames;
@@ -19797,7 +19853,7 @@ async function resolveCidr(args, context) {
19797
19853
  const ipBlock = await this.resolveValue(rawIpBlock, context);
19798
19854
  const count = Number(await this.resolveValue(rawCount, context));
19799
19855
  const cidrBits = Number(await this.resolveValue(rawCidrBits, context));
19800
- if (!ipBlock || typeof ipBlock !== "string") throw new Error(`Fn::Cidr: ipBlock must be a string, got ${typeof ipBlock}: ${JSON.stringify(this.maskValueLeaves(ipBlock, context))}`);
19856
+ if (!ipBlock || typeof ipBlock !== "string") throw markNonRetryable(/* @__PURE__ */ new Error(`Fn::Cidr: ipBlock must be a string, got ${typeof ipBlock}: ${JSON.stringify(this.maskValueLeaves(ipBlock, context))}`));
19801
19857
  this.logger.debug(`Resolving Fn::Cidr: ipBlock=${this.displayMasked(JSON.stringify(this.maskValueLeaves(ipBlock, context)), context)}, count=${this.displayMasked(String(count), context)}, cidrBits=${this.displayMasked(String(cidrBits), context)}`);
19802
19858
  const isIpv6 = ipBlock.includes(":");
19803
19859
  const results = [];
@@ -20095,7 +20151,7 @@ async function resolveParameters(template, userParameters, options) {
20095
20151
  let referencedNames;
20096
20152
  for (const [name, definition] of Object.entries(templateParameters)) {
20097
20153
  const paramDef = definition;
20098
- if (isUnboundTemplateParameter(name, template, userParameters)) throw new Error(`Parameter ${maskInherited(name)} is required but no value was provided and no default exists`);
20154
+ if (isUnboundTemplateParameter(name, template, userParameters)) throw markNonRetryable(/* @__PURE__ */ new Error(`Parameter ${maskInherited(name)} is required but no value was provided and no default exists`));
20099
20155
  if (userParameters && Object.hasOwn(userParameters, name)) {
20100
20156
  const userValue = userParameters[name];
20101
20157
  if (userValue !== void 0) {
@@ -20197,6 +20253,7 @@ function recordInheritedParameterSecrets(parameterName, value, context) {
20197
20253
  for (const [plaintext, expression] of inheritedSecretsCarriedBy(value, inherited)) {
20198
20254
  const own = inheritedParameterExpression(inherited, parameterName, plaintext);
20199
20255
  recorded.set(plaintext, typeof own === "string" ? own : expression);
20256
+ recordInheritedParameterRead(recorded, inherited, parameterName);
20200
20257
  carryFreshNoEchoMark(inherited, recorded, plaintext);
20201
20258
  }
20202
20259
  }
@@ -20420,7 +20477,7 @@ var IntrinsicFunctionResolver = class IntrinsicFunctionResolver {
20420
20477
  if ("Fn::GetAZs" in obj) return await this.resolveGetAZs(obj["Fn::GetAZs"], context);
20421
20478
  if ("Fn::Cidr" in obj) return await this.resolveCidr(obj["Fn::Cidr"], context);
20422
20479
  const unknownIntrinsicKey = detectUnknownIntrinsicKey(obj);
20423
- if (unknownIntrinsicKey !== void 0) throw buildUnknownIntrinsicError(unknownIntrinsicKey);
20480
+ if (unknownIntrinsicKey !== void 0) throw markNonRetryable(buildUnknownIntrinsicError(unknownIntrinsicKey));
20424
20481
  const resolved = {};
20425
20482
  for (const [key, val] of Object.entries(obj)) {
20426
20483
  const resolvedVal = context.abandonedResolutions === void 0 ? await this.resolveValue(val, context) : await this.resolveKeyUnit(key, val, context, context.abandonedResolutions);
@@ -20618,10 +20675,10 @@ var DiffCalculator = class DiffCalculator {
20618
20675
  conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue) {
20619
20676
  return this.replacementRules.conditionalReplacementVerdict(resourceType, propertyPath, oldValue, newValue);
20620
20677
  }
20621
- async calculateDiff(currentState, desiredTemplate, resolveFn, canonicalizeProperties, allowedUnsupportedProperties, freshParameters, maskForLog, recreateTargets, maskedInputs) {
20678
+ async calculateDiff(currentState, desiredTemplate, resolveFn, canonicalizeProperties, allowedUnsupportedProperties, freshParameters, maskForLog, recreateTargets, maskedInputs, refusalRecovery) {
20622
20679
  const changes = /* @__PURE__ */ new Map();
20623
- refuseMalformedResourceEntriesForDeploy(currentState, void 0, void 0);
20624
- refuseMalformedResourceProperties(currentState, void 0, void 0);
20680
+ refuseMalformedResourceEntriesForDeploy(currentState, void 0, void 0, refusalRecovery);
20681
+ refuseMalformedResourceProperties(currentState, void 0, void 0, refusalRecovery);
20625
20682
  const currentResources = currentState.resources;
20626
20683
  const desiredResources = desiredTemplate.Resources;
20627
20684
  this.logger.debug("Calculating diff...");
@@ -22050,7 +22107,7 @@ var CloudControlProvider = class {
22050
22107
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
22051
22108
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
22052
22109
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
22053
- const { ASGProvider } = await import("./asg-provider-C1TlpooI.js");
22110
+ const { ASGProvider } = await import("./asg-provider-BDJ1qN0J.js");
22054
22111
  const delegateRegion = ambientRegion();
22055
22112
  let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
22056
22113
  if (asgProvider === void 0) {
@@ -22156,7 +22213,7 @@ var CloudControlProvider = class {
22156
22213
  const family = SDK_DELETE_FAMILIES.get(resourceType);
22157
22214
  const cached = this.sdkDeleteDelegates.get(family);
22158
22215
  if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
22159
- const provider = family === "rds" ? new (await (import("./rds-provider-DeGFzOUc.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-CvY6ekmg.js"))).NeptuneProvider({ region: ccRegion });
22216
+ const provider = family === "rds" ? new (await (import("./rds-provider-C193wAF8.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-C-WMp2hQ.js"))).NeptuneProvider({ region: ccRegion });
22160
22217
  this.sdkDeleteDelegates.set(family, {
22161
22218
  region: ccRegion,
22162
22219
  provider
@@ -27483,8 +27540,17 @@ function sanitizeSnapshotBase(physicalId) {
27483
27540
  return base;
27484
27541
  }
27485
27542
  function finalSnapshotNamePrefix(physicalId, resourceType) {
27543
+ return finalSnapshotNameCut(physicalId, resourceType).prefix;
27544
+ }
27545
+ function finalSnapshotNameCut(physicalId, resourceType) {
27486
27546
  const maxLength = resourceType === "AWS::ElastiCache::CacheCluster" || resourceType === "AWS::ElastiCache::ReplicationGroup" ? 50 : 255;
27487
- return `${sanitizeSnapshotBase(physicalId).slice(0, maxLength - 22).replace(/-+$/, "")}-final-`;
27547
+ const sanitized = sanitizeSnapshotBase(physicalId);
27548
+ const base = sanitized.slice(0, maxLength - 22).replace(/-+$/, "");
27549
+ return {
27550
+ prefix: `${base}-final-`,
27551
+ sanitized,
27552
+ kept: base.length
27553
+ };
27488
27554
  }
27489
27555
  function buildFinalSnapshotIdentifier(physicalId, resourceType, now = /* @__PURE__ */ new Date()) {
27490
27556
  const ts = now.toISOString().replace(/[-:]/g, "").replace(/\..*$/, "").replace("T", "-").toLowerCase();
@@ -27827,6 +27893,24 @@ function recordRollbackSkip(scope, op, reason) {
27827
27893
  reason: scope.mask(reason)
27828
27894
  });
27829
27895
  }
27896
+ function rollbackCannotAddress(record, opResourceType, route, physicalId) {
27897
+ return !(record?.resourceType === "AWS::CloudFormation::Stack" && opResourceType === "AWS::CloudFormation::Stack" && record.provisionedBy !== "cc-api" && route !== "cc-api") && !hasAddressablePhysicalId({ physicalId });
27898
+ }
27899
+ function retainedSurvivorId(record, op) {
27900
+ if (hasAddressablePhysicalId(record)) return record.physicalId;
27901
+ if (hasAddressablePhysicalId(op)) return op.physicalId;
27902
+ }
27903
+ const UNADDRESSABLE_SKIP_CAUSE = "Its recorded 'physicalId' is not a non-empty string, so cdkd cannot address the resource in AWS and sent nothing for it; the rollback left it and its state record exactly as they are.";
27904
+ const UNADDRESSABLE_JOURNAL_SKIP_CAUSE = "Its rollback-journal entry's 'physicalId' is not a non-empty string and no state record holds the resource, so cdkd cannot address it in AWS and sent nothing for it; if it was created in AWS, delete it manually.";
27905
+ function skipUnaddressableReplay(scope, logger, op, what, source = "record") {
27906
+ if (source === "journal") {
27907
+ logger.warn(safeMsg` Rollback: Cannot ${what} ${shownLogicalId(op.logicalId)} (${refusalResourceType(op.resourceType)}) ` + "— its rollback journal entry has no non-empty string 'physicalId' and no state record holds it, so cdkd cannot address it in AWS and sent nothing for it. If it was created in AWS, delete it manually.");
27908
+ recordRollbackSkip(scope, op, UNADDRESSABLE_JOURNAL_SKIP_CAUSE);
27909
+ return;
27910
+ }
27911
+ logger.warn(safeMsg` Rollback: Cannot ${what} ${shownLogicalId(op.logicalId)} (${refusalResourceType(op.resourceType)}) ` + "— its state record has no non-empty string 'physicalId', so cdkd cannot address it in AWS and sent nothing for it. The resource and its state record are left exactly as they are. Repair the record's 'physicalId' (inspect it with `cdkd state show`), then re-converge it with `cdkd deploy`.");
27912
+ recordRollbackSkip(scope, op, UNADDRESSABLE_SKIP_CAUSE);
27913
+ }
27830
27914
  function effectiveProvisionedBy(record, fallbackProvisionedBy) {
27831
27915
  return record?.provisionedBy ?? fallbackProvisionedBy;
27832
27916
  }
@@ -28132,8 +28216,24 @@ function secretNameNeedlesOf(logicalId, record, secrets, options) {
28132
28216
  if (embeddedBag !== void 0 && physicalId !== void 0) {
28133
28217
  for (const needle of printingCorpusOf(embeddedBag).keys()) if (needle !== "" && (needle === physicalId || needle.length >= 4 && physicalId.includes(needle))) add(needle);
28134
28218
  }
28219
+ if (physicalId !== void 0) for (const spelling of finalSnapshotSpellingsOf(physicalId, record?.resourceType, needles)) add(spelling);
28135
28220
  return needles.size > 0 ? needles : void 0;
28136
28221
  }
28222
+ function finalSnapshotSpellingsOf(physicalId, resourceType, needles) {
28223
+ if (typeof resourceType !== "string" || !(ATOMIC_FINAL_SNAPSHOT_TYPES.has(resourceType) || PRE_DELETE_SNAPSHOT_TYPES.has(resourceType))) return [];
28224
+ const { prefix, sanitized, kept } = finalSnapshotNameCut(physicalId, resourceType);
28225
+ const spellings = [];
28226
+ for (const needle of needles) {
28227
+ const folded = needle.toLowerCase().replace(/[^a-z0-9-]/g, "-").replace(/-{2,}/g, "-");
28228
+ if (folded.length < 4) continue;
28229
+ for (let at = sanitized.indexOf(folded); at !== -1; at = sanitized.indexOf(folded, at + 1)) {
28230
+ if (at >= kept) break;
28231
+ if (at + folded.length > kept) spellings.push(prefix);
28232
+ else if (folded !== needle) spellings.push(folded);
28233
+ }
28234
+ }
28235
+ return spellings;
28236
+ }
28137
28237
  function secretNamesReadBy(logicalId, record, resources, judge = () => ({
28138
28238
  secrets: void 0,
28139
28239
  embedded: void 0
@@ -28565,6 +28665,15 @@ function classifyRollbackOp(op, stateResources, orphanLogicalIds) {
28565
28665
  oldProperties: op.previousState.properties,
28566
28666
  newProperties: current.properties
28567
28667
  })) return "skip-already-done";
28668
+ const retainedOld = op.oldResourceRetained ?? op.previousState.updateReplacePolicy === "Retain";
28669
+ if (rollbackCannotAddress(current, op.resourceType, current.provisionedBy ?? op.provisionedBy, current.physicalId)) {
28670
+ if (!resolveReplacementOldType(op).ok) return "refuse-replacement-routing";
28671
+ return retainedOld ? "reverse-replacement-readopt" : "reverse-replacement";
28672
+ }
28673
+ if (retainedOld && op.physicalId !== void 0 && !hasAddressablePhysicalId(op)) {
28674
+ if (!resolveReplacementOldType(op).ok) return "refuse-replacement-routing";
28675
+ return "reverse-replacement-readopt";
28676
+ }
28568
28677
  if (op.physicalId !== void 0 && current.physicalId !== op.physicalId) {
28569
28678
  if (sameTypeAsOld && deepEqual$1(current.properties, op.previousState.properties)) return "skip-already-done";
28570
28679
  return "skip-mismatch";
@@ -28584,7 +28693,7 @@ function classifyFailedOp(op, stateResources, siblings = []) {
28584
28693
  if (op.physicalIdRecoveredFromError === true) {
28585
28694
  if (current) {
28586
28695
  if (current.physicalId === op.physicalId) return "skip-failed-noop";
28587
- if (!isReplacedRecord(op, current)) return "skip-failed-mismatch";
28696
+ if (!isReplacedRecord(op, current) && !isProvenDistinctRecord(op, current)) return "skip-failed-mismatch";
28588
28697
  }
28589
28698
  if (stateHoldsPhysicalId(stateResources, op.resourceType, op.physicalId)) return "skip-failed-noop";
28590
28699
  const orphanPolicy = effectiveDeletionPolicy(op.resourceType, op.deletionPolicy, op.attemptedProperties);
@@ -28611,7 +28720,21 @@ function isReplacedRecord(op, record) {
28611
28720
  return isReplacementOrphan(op) && record !== void 0 && record.physicalId === op.replacedPhysicalId && record.resourceType === op.replacedResourceType;
28612
28721
  }
28613
28722
  function failedOpOwnRecord(op, stateResources) {
28614
- return isReplacementOrphan(op) ? void 0 : stateResources[op.logicalId];
28723
+ return recordUnderIdIsNotOwn(op, stateResources) ? void 0 : stateResources[op.logicalId];
28724
+ }
28725
+ const provenDistinctFrom = /* @__PURE__ */ new WeakMap();
28726
+ function markProvenDistinctFromRecord(op, record) {
28727
+ provenDistinctFrom.set(op, {
28728
+ physicalId: record.physicalId,
28729
+ resourceType: record.resourceType
28730
+ });
28731
+ }
28732
+ function isProvenDistinctRecord(op, record) {
28733
+ const verdict = provenDistinctFrom.get(op);
28734
+ return verdict !== void 0 && record !== void 0 && record.physicalId === verdict.physicalId && record.resourceType === verdict.resourceType;
28735
+ }
28736
+ function recordUnderIdIsNotOwn(op, stateResources) {
28737
+ return isReplacementOrphan(op) || isProvenDistinctRecord(op, Object.hasOwn(stateResources, op.logicalId) ? stateResources[op.logicalId] : void 0);
28615
28738
  }
28616
28739
  function replacementNeverSwapped(op, siblings) {
28617
28740
  return siblings.some((s) => s !== op && isReplacementOrphan(s) && s.logicalId === op.logicalId && s.replacedPhysicalId === op.physicalId);
@@ -28892,6 +29015,10 @@ async function replayDelete(s) {
28892
29015
  return;
28893
29016
  }
28894
29017
  const deleteProvisionedBy = effectiveProvisionedBy(stateResources[op.logicalId], op.provisionedBy);
29018
+ if (rollbackCannotAddress(stateResources[op.logicalId], op.resourceType, deleteProvisionedBy, op.physicalId)) {
29019
+ skipUnaddressableReplay(s, logger, op, "delete created resource");
29020
+ return;
29021
+ }
28895
29022
  s.createRollbackRoute = deleteProvisionedBy;
28896
29023
  const snapshotPolicy = action === "delete-with-final-snapshot";
28897
29024
  const takeFinalSnapshot = snapshotPolicy && ctx.skipFinalSnapshot !== true;
@@ -28937,10 +29064,24 @@ async function replayReadopt(s) {
28937
29064
  const { op, stateResources, stackName, ctx, result, inlinePolicyWriters, afterOp, logger, mask } = s;
28938
29065
  const current = stateResources[op.logicalId];
28939
29066
  const prev = op.previousState;
29067
+ const oldShown = hasAddressablePhysicalId({ physicalId: prev.physicalId }) ? displaySafe(mask(prev.physicalId)) : "no recorded id";
29068
+ const unprovenCopyRefusal = (reason) => {
29069
+ const remedy = orphanRemedy(op.logicalId, ctx);
29070
+ return ownRemedyError(markNonRetryable(new CdkdError(safeMsg`Cannot reverse the replacement of ${shownLogicalId(op.logicalId)} (${refusalResourceType(op.resourceType)}): ` + reason + ` The retained old resource (${oldShown}) is named only by the rollback journal, so the JOURNAL is kept. Check both resources by hand.` + (remedy.offered ? ` To leave this one as it is, re-run ${rerunRollbackPhrase(ctx, "`cdkd rollback`")} with the command below; that also drops the journal's only record of the retained old resource (${oldShown}), so note that id first.` : ` No repair of the state record makes this op succeed on a re-run.`) + remedy.clause + remedy.line, STATE_RESOURCES_MALFORMED)));
29071
+ };
29072
+ const opIdUnusable = op.physicalId !== void 0 && !hasAddressablePhysicalId(op);
29073
+ if (!rollbackRetainsNewResource(current) && rollbackCannotAddress(current, op.resourceType, current.provisionedBy ?? op.provisionedBy, current.physicalId)) {
29074
+ if (opIdUnusable) throw unprovenCopyRefusal("neither its state record nor its rollback journal entry has a non-empty string 'physicalId' for the replacement's new resource, so cdkd cannot address that resource in AWS or tell which resource it is, and sent nothing.");
29075
+ const target = op.physicalId === void 0 ? void 0 : refusalPhysicalId(mask(String(op.physicalId)));
29076
+ const repair = target === void 0 ? `Repair the record's 'physicalId' to the id of the replacement's NEW resource (inspect it with \`cdkd state show\`): the journal does not record that id, and the re-run DELETES the resource the repaired record names as the new copy, so name the right one. Then re-run ${rerunRollbackPhrase(ctx, "`cdkd rollback`")}.` : `Repair the record's 'physicalId' to ${target}, the replacement's new resource the journal records (inspect it with \`cdkd state show\`); the re-run deletes it and re-adopts the old one. Any other id stops the revert and drops the journal's only record of the retained old resource (${oldShown}). Then re-run ${rerunRollbackPhrase(ctx, "`cdkd rollback`")}.` + (describedPhysicalIdPointer(target) !== "" ? " That id is left out of the prose above: it is not a plain identifier — read it from the rollback journal." : target.includes("***") ? ` That id is shown masked — read the full value from the rollback journal.` : "");
29077
+ throw new CdkdError(safeMsg`Cannot reverse the replacement of ${shownLogicalId(op.logicalId)} (${refusalResourceType(op.resourceType)}): ` + `its state record has no non-empty string 'physicalId', so cdkd cannot address the new resource in AWS to delete it, and sent nothing. The retained old resource (${oldShown}) is named only by the rollback journal, so the JOURNAL is kept. ` + repair, STATE_RESOURCES_MALFORMED);
29078
+ }
29079
+ if (!rollbackRetainsNewResource(current) && opIdUnusable && current.physicalId !== op.physicalId) throw unprovenCopyRefusal("its rollback journal entry has no non-empty string 'physicalId' for the replacement's new resource, so cdkd cannot tell whether the resource state records under this id is that one, and did not delete it; nothing was sent.");
28940
29080
  logger.info(` Rollback: Reversing replacement of ${safe(op.logicalId)} (${safe(op.resourceType)}) — deleting the new resource and re-adopting the retained old one (${displaySafe(mask(prev.physicalId))})`);
28941
29081
  let survivorReason;
29082
+ const survivorId = retainedSurvivorId(current, op);
28942
29083
  if (rollbackRetainsNewResource(current)) {
28943
- const survivorMessages = retainedSurvivorMessages(op.logicalId, op.resourceType, current.physicalId, `State is restored to the old resource (${prev.physicalId}).`, mask);
29084
+ const survivorMessages = retainedSurvivorMessages(op.logicalId, op.resourceType, survivorId ?? "no recorded id", `State is restored to the old resource (${prev.physicalId}).`, mask);
28944
29085
  logger.warn(survivorMessages.warn);
28945
29086
  survivorReason = survivorMessages.reason;
28946
29087
  result.warnings++;
@@ -28978,7 +29119,7 @@ async function replayReadopt(s) {
28978
29119
  resourceType: op.resourceType,
28979
29120
  ...op.provisionedBy && { provisionedBy: op.provisionedBy },
28980
29121
  ...survivorReason !== void 0 && {
28981
- physicalId: current.physicalId,
29122
+ ...survivorId !== void 0 && { physicalId: survivorId },
28982
29123
  reason: mask(survivorReason),
28983
29124
  ...survivorProvisionedBy && { provisionedBy: survivorProvisionedBy }
28984
29125
  }
@@ -29007,6 +29148,10 @@ async function replayRevert(s) {
29007
29148
  recordRollbackSkip(s, op, ABSENT_BASELINE_SKIP_CAUSE);
29008
29149
  return;
29009
29150
  }
29151
+ if (rollbackCannotAddress(current, op.resourceType, op.provisionedBy, current.physicalId)) {
29152
+ skipUnaddressableReplay(s, logger, op, "restore");
29153
+ return;
29154
+ }
29010
29155
  logger.info(` Rollback: Restoring ${safe(op.logicalId)} (${safe(op.resourceType)}) to previous state`);
29011
29156
  const { provider, provisionedBy: revertVia } = ctx.providerRegistry.getProviderFor({
29012
29157
  resourceType: op.resourceType,
@@ -29086,6 +29231,10 @@ async function replayReverseReplacement(s) {
29086
29231
  recordRollbackSkip(s, op, ABSENT_BASELINE_SKIP_CAUSE);
29087
29232
  return;
29088
29233
  }
29234
+ if (!rollbackRetainsNewResource(current) && rollbackCannotAddress(current, op.resourceType, current.provisionedBy ?? op.provisionedBy, current.physicalId)) {
29235
+ skipUnaddressableReplay(s, logger, op, "reverse the replacement of");
29236
+ return;
29237
+ }
29089
29238
  const resolvedPrevProps = await resolveReplayProps(prev.properties, resolver, secrets, ctx, op.logicalId) ?? {};
29090
29239
  refuseMaskedReplayBaseline(resolvedPrevProps, op.logicalId);
29091
29240
  opMasker.addNamed({
@@ -29228,8 +29377,9 @@ async function replayReverseReplacement(s) {
29228
29377
  if (!adoptedLiveNewResource) inlinePolicyWriters.record(op.logicalId, "create", stateResources[op.logicalId], false, createProvisionedBy);
29229
29378
  await afterOp?.(op.logicalId);
29230
29379
  let survivorReason;
29380
+ const survivorId = retainedSurvivorId(current, op);
29231
29381
  if (!deletedNewFirst && !adoptedLiveNewResource && rollbackRetainsNewResource(current)) {
29232
- const survivorMessages = retainedSurvivorMessages(op.logicalId, op.resourceType, current.physicalId, `State records the re-created old resource (${stateResources[op.logicalId]?.physicalId ?? prev.physicalId}).`, mask);
29382
+ const survivorMessages = retainedSurvivorMessages(op.logicalId, op.resourceType, survivorId ?? "no recorded id", `State records the re-created old resource (${stateResources[op.logicalId]?.physicalId ?? prev.physicalId}).`, mask);
29233
29383
  logger.warn(survivorMessages.warn);
29234
29384
  survivorReason = survivorMessages.reason;
29235
29385
  result.warnings++;
@@ -29261,7 +29411,7 @@ async function replayReverseReplacement(s) {
29261
29411
  resourceType: op.resourceType,
29262
29412
  ...op.provisionedBy && { provisionedBy: op.provisionedBy },
29263
29413
  ...survivorReason !== void 0 && {
29264
- physicalId: current.physicalId,
29414
+ ...survivorId !== void 0 && { physicalId: survivorId },
29265
29415
  reason: mask(survivorReason),
29266
29416
  ...survivorProvisionedBy && { provisionedBy: survivorProvisionedBy }
29267
29417
  },
@@ -29548,7 +29698,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
29548
29698
  result.orphaned.push(orphaned);
29549
29699
  options.onOrphan?.(orphaned);
29550
29700
  }
29551
- if (!isReplacementOrphan(op)) delete stateResources[op.logicalId];
29701
+ if (!recordUnderIdIsNotOwn(op, stateResources)) delete stateResources[op.logicalId];
29552
29702
  await noteRetainedResource(op.resourceType, op.logicalId);
29553
29703
  logger.info(` Rollback: leaving partially-created ${safe(op.logicalId)} (${safe(op.resourceType)}) in AWS (DeletionPolicy: Retain)` + (failedCreateRecord ? " — removed from state" : " — it was never in state"));
29554
29704
  await options.afterOp?.(op.logicalId);
@@ -29566,6 +29716,10 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
29566
29716
  case "delete-failed-create-with-final-snapshot": {
29567
29717
  const failedCreateRecord = failedOpOwnRecord(op, stateResources);
29568
29718
  const deleteProvisionedBy = effectiveProvisionedBy(failedCreateRecord, op.provisionedBy);
29719
+ if (rollbackCannotAddress(failedCreateRecord, op.resourceType, deleteProvisionedBy, op.physicalId)) {
29720
+ skipUnaddressableReplay(skipScope, logger, op, "delete partially-created resource", failedCreateRecord ? "record" : "journal");
29721
+ break;
29722
+ }
29569
29723
  createRollbackRoute = deleteProvisionedBy;
29570
29724
  const snapshotPolicy = action === "delete-failed-create-with-final-snapshot";
29571
29725
  const takeFinalSnapshot = snapshotPolicy && ctx.skipFinalSnapshot !== true;
@@ -29603,7 +29757,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
29603
29757
  result.warnings++;
29604
29758
  result.leftInPlace++;
29605
29759
  }
29606
- if (!isReplacementOrphan(op)) delete stateResources[op.logicalId];
29760
+ if (!recordUnderIdIsNotOwn(op, stateResources)) delete stateResources[op.logicalId];
29607
29761
  await options.afterOp?.(op.logicalId);
29608
29762
  ctx.recordEvent?.({
29609
29763
  eventType: "ROLLBACK_RESOURCE_SUCCEEDED",
@@ -29627,6 +29781,10 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
29627
29781
  recordRollbackSkip(skipScope, op, ABSENT_BASELINE_SKIP_CAUSE);
29628
29782
  break;
29629
29783
  }
29784
+ if (rollbackCannotAddress(current, op.resourceType, op.provisionedBy ?? current.provisionedBy, current.physicalId)) {
29785
+ skipUnaddressableReplay(skipScope, logger, op, "force-revert failed UPDATE of");
29786
+ break;
29787
+ }
29630
29788
  logger.info(` Rollback: force-reverting failed UPDATE of ${safe(op.logicalId)} (${safe(op.resourceType)}) to its pre-deploy properties (--revert-failed; remote state is unknown)`);
29631
29789
  const { provider, provisionedBy: revertVia } = ctx.providerRegistry.getProviderFor({
29632
29790
  resourceType: op.resourceType,
@@ -29703,7 +29861,7 @@ async function replayFailedOperationsUnbound(failedOps, stateResources, stackNam
29703
29861
  error: maskedRollbackEventError(revertError, mask)
29704
29862
  });
29705
29863
  }
29706
- inlinePolicyWriters.noteOutcome(op, action === "skip-failed-noop" || action === "skip-failed-mismatch" || action === "skip-failed-superseded" || action === "skip-failed-replaced-deleted" || ownRecord(stateResources, op.logicalId) !== recordBefore || isReplacementOrphan(op) && !pending.has(op) && (action === "delete-failed-create" || action === "delete-failed-create-with-final-snapshot" || action === "orphan-failed-create-retain"));
29864
+ inlinePolicyWriters.noteOutcome(op, action === "skip-failed-noop" || action === "skip-failed-mismatch" || action === "skip-failed-superseded" || action === "skip-failed-replaced-deleted" || ownRecord(stateResources, op.logicalId) !== recordBefore || recordUnderIdIsNotOwn(op, stateResources) && !pending.has(op) && (action === "delete-failed-create" || action === "delete-failed-create-with-final-snapshot" || action === "orphan-failed-create-retain"));
29707
29865
  }
29708
29866
  if (result.interrupted) await restoreHeldInlinePolicies(inlinePolicyWriters, stateResources, stackName, ctx, result, { refuseAll: true });
29709
29867
  if (emitEnvelope) ctx.recordEvent?.({
@@ -30313,7 +30471,7 @@ async function settleJournaledOrphansOnSuccess(args) {
30313
30471
  logger.info(safeMsg`The rollback journal of stack ${stack} records ${all.length} resource(s) a failed deploy ` + `created that no state record holds; acting on them per their DeletionPolicy before the journal is removed:`);
30314
30472
  for (const line of journaledOrphanLines(orphans, logger)) logger.info(line);
30315
30473
  try {
30316
- const { unreadable, tracked } = await applySuccessRule(orphans, stateResources, orphans.deployLogicalIds ?? /* @__PURE__ */ new Set(), args.foreignHolder, stack, logger, args.isInterrupted);
30474
+ const { unreadable, tracked } = await applySuccessRule(orphans, stateResources, orphans.deployLogicalIds ?? /* @__PURE__ */ new Set(), args.foreignHolder, stack, logger, args.isInterrupted, ctx);
30317
30475
  const acting = {
30318
30476
  segments: orphans.segments.map(({ segment, ops }) => ({
30319
30477
  segment,
@@ -30372,7 +30530,7 @@ async function settleJournaledOrphansOnSuccess(args) {
30372
30530
  keepJournal: true
30373
30531
  };
30374
30532
  }
30375
- async function applySuccessRule(orphans, stateResources, deployLogicalIds, foreignHolder, stack, logger, isInterrupted) {
30533
+ async function applySuccessRule(orphans, stateResources, deployLogicalIds, foreignHolder, stack, logger, isInterrupted, identityCtx) {
30376
30534
  const unreadable = /* @__PURE__ */ new Set();
30377
30535
  const tracked = /* @__PURE__ */ new Set();
30378
30536
  let interrupted = false;
@@ -30387,9 +30545,20 @@ async function applySuccessRule(orphans, stateResources, deployLogicalIds, forei
30387
30545
  tracked.add(op);
30388
30546
  continue;
30389
30547
  }
30390
- if (Object.prototype.hasOwnProperty.call(stateResources, op.logicalId) && !isReplacedRecord(op, stateResources[op.logicalId]) || deployLogicalIds.has(op.logicalId)) {
30391
- op.physicalIdRecoveredFromError = false;
30392
- continue;
30548
+ const hasRecord = Object.prototype.hasOwnProperty.call(stateResources, op.logicalId);
30549
+ const record = hasRecord ? stateResources[op.logicalId] : void 0;
30550
+ const recordUnderId = hasRecord && !isReplacedRecord(op, record);
30551
+ if (recordUnderId || deployLogicalIds.has(op.logicalId)) {
30552
+ const verdict = recordUnderId ? await recordIdentity(op, record, identityCtx, logger) : "unknown";
30553
+ if (verdict === "same") {
30554
+ tracked.add(op);
30555
+ continue;
30556
+ }
30557
+ if (verdict !== "different") {
30558
+ op.physicalIdRecoveredFromError = false;
30559
+ continue;
30560
+ }
30561
+ markProvenDistinctFromRecord(op, record);
30393
30562
  }
30394
30563
  const holding = await foreignHolder(op.resourceType, op.physicalId);
30395
30564
  if (holding === void 0) continue;
@@ -30406,6 +30575,23 @@ async function applySuccessRule(orphans, stateResources, deployLogicalIds, forei
30406
30575
  tracked
30407
30576
  };
30408
30577
  }
30578
+ async function recordIdentity(op, record, ctx, logger) {
30579
+ if (typeof record !== "object" || record === null || record.resourceType !== op.resourceType || typeof record.physicalId !== "string" || record.physicalId === "" || !op.physicalId) return "unknown";
30580
+ try {
30581
+ const { provider } = ctx.providerRegistry.getProviderFor({
30582
+ resourceType: op.resourceType,
30583
+ provisionedBy: op.provisionedBy
30584
+ });
30585
+ if (typeof provider.isSameResource !== "function") return "unknown";
30586
+ return await provider.isSameResource(op.physicalId, {
30587
+ physicalId: record.physicalId,
30588
+ ...record.provisionedBy !== void 0 && { provisionedBy: record.provisionedBy }
30589
+ }, op.resourceType, { expectedRegion: ctx.region });
30590
+ } catch (err) {
30591
+ logger.debug(safeMsg`Could not compare ${logicalIdShown(op.logicalId)}'s journaled resource with its state record (${displaySafe(err instanceof Error ? err.name : typeof err)}).`);
30592
+ return "unknown";
30593
+ }
30594
+ }
30409
30595
  function makeForeignHolderScan(stateBackend) {
30410
30596
  let scan;
30411
30597
  const key = (type, id) => JSON.stringify([type, id]);
@@ -31307,7 +31493,7 @@ function redactParametersForDiff(parameterValues) {
31307
31493
  const inherited = this.options.inheritedSecrets;
31308
31494
  if (!inherited || inherited.size === 0) return parameterValues;
31309
31495
  const out = Object.create(null);
31310
- for (const [name, value] of Object.entries(parameterValues)) out[name] = inheritedParameterExpression(inherited, name, value) ?? redactSecretsForState(value, inherited);
31496
+ for (const [name, value] of Object.entries(parameterValues)) out[name] = redactInheritedParameterValue(inherited, name, value);
31311
31497
  return out;
31312
31498
  }
31313
31499
  function rememberRecoverableMaskedOutputs(stackName, resolved, redacted) {
@@ -31527,7 +31713,7 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
31527
31713
  recordedAttributes: currentResource.attributes
31528
31714
  });
31529
31715
  } catch (deleteError) {
31530
- throw new Error(maskSecretsInText(`Failed to delete old resource ${logicalId} (${currentResource.physicalId}) during the --replace delete-first fallback: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`, secrets));
31716
+ throw new Error(maskSecretsInText(`Failed to delete old resource ${logicalId} (${currentResource.physicalId}) during the --replace delete-first fallback: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`, secrets), { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, secrets) : void 0 });
31531
31717
  }
31532
31718
  reportDeleteGuards(deleteResult, {
31533
31719
  physicalId: currentResource.physicalId,
@@ -31550,7 +31736,7 @@ async function replaceDeleteFirstAndRecreate(logicalId, resourceType, oldResourc
31550
31736
  isRetryable: isRecreateRetryableError
31551
31737
  });
31552
31738
  } catch (recreateError) {
31553
- throw new Error(maskSecretsInText(`Failed to re-create ${logicalId} after the --replace delete-first fallback already deleted the old resource (${currentResource.physicalId}): ${recreateError instanceof Error ? recreateError.message : String(recreateError)}. Re-run the deploy to create it fresh.`, secrets), { cause: recreateError instanceof Error ? recreateError : void 0 });
31739
+ throw new Error(maskSecretsInText(`Failed to re-create ${logicalId} after the --replace delete-first fallback already deleted the old resource (${currentResource.physicalId}): ${recreateError instanceof Error ? recreateError.message : String(recreateError)}. Re-run the deploy to create it fresh.`, secrets), { cause: recreateError instanceof Error ? maskSecretsInError(recreateError, secrets) : void 0 });
31554
31740
  }
31555
31741
  }
31556
31742
  function typeChangeNameQuestion(resourceType, input) {
@@ -34970,7 +35156,7 @@ async function provisionUpdate(logicalId, change, stateResources, stackName, tem
34970
35156
  return;
34971
35157
  }
34972
35158
  this.refuseRedactedAttributeReads(logicalId, resourceType, context);
34973
- if (!(currentResource.resourceType === "AWS::CloudFormation::Stack" && currentResource.provisionedBy !== "cc-api") && !hasAddressablePhysicalId(currentResource)) throw markRefusedBeforeApplying(markNonRetryable(new CdkdError(unaddressableUpdateRefusalMessage(stackName, this.stackRegion, logicalId, oldResourceType), STATE_RESOURCES_MALFORMED)));
35159
+ if (!(currentResource.resourceType === "AWS::CloudFormation::Stack" && currentResource.provisionedBy !== "cc-api") && !hasAddressablePhysicalId(currentResource)) throw markRefusedBeforeApplying(markNonRetryable(new CdkdError(unaddressableUpdateRefusalMessage(stackName, this.stackRegion, logicalId, oldResourceType, this.options.refusalRecovery), STATE_RESOURCES_MALFORMED)));
34974
35160
  this.attemptedResolvedProps.set(logicalId, resolvedProps);
34975
35161
  const noEchoHeldPaths = /* @__PURE__ */ new Set();
34976
35162
  if (change.propertyChanges?.some((pc) => pc.requiresReplacement) === true) {
@@ -35234,7 +35420,7 @@ async function updateByReplacement({ change, counts, currentProps, currentResour
35234
35420
  recordedAttributes: currentResource.attributes
35235
35421
  });
35236
35422
  } catch (deleteError) {
35237
- throw new Error(`Failed to destroy old resource ${logicalId} (${currentResource.physicalId}) during ${recreateFlagName}: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`);
35423
+ throw new Error(maskSecretsInText(`Failed to destroy old resource ${logicalId} (${currentResource.physicalId}) during ${recreateFlagName}: ${deleteError instanceof Error ? deleteError.message : String(deleteError)}`, updateSecrets), { cause: deleteError instanceof Error ? maskSecretsInError(deleteError, updateSecrets) : void 0 });
35238
35424
  }
35239
35425
  reportDeleteGuards(recreateDeleteResult, {
35240
35426
  physicalId: currentResource.physicalId,
@@ -37167,12 +37353,12 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
37167
37353
  };
37168
37354
  const currentEtag = currentStateData?.etag;
37169
37355
  this.healBaseline = currentState.resources ?? {};
37170
- refuseMalformedOutputs(currentState, stackName, this.stackRegion);
37171
- refuseMalformedResourcesForDeploy(currentState, stackName, this.stackRegion);
37172
- refuseMalformedResourceEntriesForDeploy(currentState, stackName, this.stackRegion);
37173
- refuseMalformedResourceProperties(currentState, stackName, this.stackRegion);
37174
- refuseMalformedOrphans(currentState, stackName, this.stackRegion);
37175
- refuseMalformedOrphanRecords(currentState, stackName, this.stackRegion);
37356
+ refuseMalformedOutputs(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
37357
+ refuseMalformedResourcesForDeploy(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
37358
+ refuseMalformedResourceEntriesForDeploy(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
37359
+ refuseMalformedResourceProperties(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
37360
+ refuseMalformedOrphans(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
37361
+ refuseMalformedOrphanRecords(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
37176
37362
  const migrationPending = currentStateData?.migrationPending ?? false;
37177
37363
  this.logger.debug(`Loaded current state: ${Object.keys(currentState.resources).length} resources`);
37178
37364
  if (this.options.onCurrentStateLoaded) await this.options.onCurrentStateLoaded(stackName, currentStateData?.state);
@@ -37269,7 +37455,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
37269
37455
  sources: maskedInputSourcesForDiff,
37270
37456
  rebaselined: /* @__PURE__ */ new Map()
37271
37457
  };
37272
- const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), this.freshNoEchoParameters(parameterValues), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs);
37458
+ const changes = await this.diffCalculator.calculateDiff(currentState, effectiveTemplate, diffResolveFn, makeCanonicalizePropertiesFn(this.providerRegistry), this.providerRegistry.getAllowedUnsupportedProperties?.(), this.freshNoEchoParameters(parameterValues), this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues), recreateTargetIdsFor(this.options.recreateTargets, stackName), maskedInputs, this.options.refusalRecovery);
37273
37459
  createOnlyPrefetch.cancel();
37274
37460
  for (const [logicalId, fingerprints] of maskedInputs?.rebaselined ?? []) {
37275
37461
  const record = currentState.resources[logicalId];
@@ -37947,5 +38133,5 @@ DeployEngine.prototype.replacementNameOrigin = replacementNameOrigin;
37947
38133
  DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice;
37948
38134
 
37949
38135
  //#endregion
37950
- export { resourcesNamingDeclaredParameter as $, createSecretMasker as $a, repairMalformedResourceEntriesForReadOnly as $i, deleteSkipReason as $n, ensureAssetStorage as $o, deployRefusesOrphanRowsReason as $r, derivePartitionAndUrlSuffix as $s, effectiveDeletionPolicy as $t, resolveDynamoDbDeleteBudgetClock as A, requireConfigObject as Aa, refuseMalformedOrphans as Ai, acquireIdempotencyToken as An, acceptedCreateOnlyDropsOf as Ao, s3BucketWebsiteUrl as Ar, getDefaultStateBucketName as As, planRollback as At, getPriorAttempts as B, TemplateParser as Ba, refuseMalformedResourceEntriesForImportSave as Bi, CC_BROKEN_REASON as Bn, orphansCarriedFrom as Bo, AWS_NO_VALUE as Br, stateBucketExistenceConfirmed as Bs, updatePartialMessage as Bt, perType as C, coerceCfnInteger as Ca, malformedScrubResourceEntriesRefusalMessage as Ci, findDestructiveChanges as Cn, WHOLE_DYNAMIC_REFERENCE_PATTERN as Co, callerEnvCredentials as Cr, warnFinchArgvExposure as Cs, getStackRecords as Ct, beginDeleteWait as D, readConfigString as Da, refuseMalformedNestedChildOutputs as Di, ledgerForStack as Dn, S3StateBackend as Do, s3BucketDomainName as Dr, getDockerImageBySourceHash as Ds, isJournaledOrphan as Dt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as E, configStringRefusal as Ea, refuseDivergentRecordRegionForDestroy as Ei, earliestDefined as En, isLockInfoExpired as Eo, s3BucketArn as Er, AssetManifestLoader as Es, demoteSupersededOrphans as Et, waitForIndexesSettled as F, withRetry as Fa, refuseMalformedResourceAttributesForOrphan as Fi, refuseMalformedDesiredTags as Fn, hasUnverifiableParameterRefusal as Fo, isImpossibleEmptyStoredAttribute as Fr, resolveCaptureObservedState as Fs, inheritProducerRegions as Ft, cyan as G, createUnionSecretMasker as Ga, refuseMalformedResourcePropertiesForOrphan as Gi, getCurrentResourceSecrets as Gn, WorkGraph as Go, withSharedDrainBudget as Gr, MIGRATE_TMP_PREFIX as Gs, orphanRecordsPrintingBag as Gt, formatResourceLine as H, inheritNestedStackParameterAssociations as Ha, refuseMalformedResourcePropertiesForDestroy as Hi, ccBrokenReason as Hn, AssetPublisher as Ho, isStalePlaceholderArnAttribute as Hr, ssmResolvedValueType as Hs, completedReplayEntries as Ht, ECR_AUTO_DELETE_IMAGES_TAG as I, canonicalLambdaFunctionName as Ia, refuseMalformedResourceEntries as Ii, tagMapAsList as In, importableOutputKeys as Io, carriesDynamicReference as Ir, resolveSkipPrefix as Is, REDACTED_DELETE_ADDRESS_SKIP_REASON as It, red as J, logOnlyValueCount as Ja, refuseMalformedResourcesForExport as Ji, slowCcOperationTimeoutMs as Jn, loadPublishableAssetManifest as Jo, JSON_LISTING_HOLE_VALUE as Jr, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Js, ATOMIC_FINAL_SNAPSHOT_TYPES as Jt, gray as K, hasMaskableValues as Ka, refuseMalformedResourcesForDeploy as Ki, withPrintingSecrets as Kn, buildAssetRedirectMap as Ko, parameterInputsFor as Kr, findLargeInlineResources as Ks, secretNamePrintingBag as Kt, S3_AUTO_DELETE_OBJECTS_TAG as L, lambdaFunctionNameForMask as La, refuseMalformedResourceEntriesForDeploy as Li, tagPlanWarning as Ln, importableOutputs as Lo, carriesFetchableDynamicReference as Lr, resolveStateBucketWithDefault as Ls, isRedactedRecordedValue as Lt, DELETE_INDEX_WAIT_PROCEED_NOTE as M, prefetchCreateOnlyPropertyPaths as Ma, refuseMalformedOrphansForOrphan as Mi, DBPROXY_TAG_OPTIONS as Mn, exportNamesCarriedFrom as Mo, isUnboundTemplateParameter as Mr, loadCdkJson as Ms, resolveReplacementOldType as Mt, INDEX_SETTLE_POLL_INTERVAL_MS as N, templateResourceTypes as Na, refuseMalformedOutputs as Ni, planTagDiff as Nn, hasReadableExportSet as No, parameterTypeMayLoseSecretIdentity as Nr, resolveApp as Ns, findNestedStackTypeChanges as Nt, compensateRemovedDeletionProtection as O, replayWarn as Oa, refuseMalformedOrphanRecords as Oi, reserveStackCreateToken as On, rebuildClientForBucketRegion as Oo, s3BucketDualStackDomainName as Or, Synthesizer as Os, isReplacementOrphan as Ot, deleteTableWithIndexBusyRetry as P, describeTypeWithThrottleRetry as Pa, refuseMalformedOutputsForDestroy as Pi, readTagList as Pn, hasReasonlessBaselineRefusal as Po, getAccountInfo as Pr, resolveAutoAssetStorage as Ps, getCurrentProducerRegions as Pt, reachableDivergentParameters as Q, shareLogOnlyValues as Qa, repairMalformedOutputsForReadOnly as Qi, deleteIndeterminateGuards as Qn, assertAssetBucketRegion as Qo, UNREADABLE_RESOURCES_MAP_ROW as Qr, canonicalizeRegion as Qs, createPreDeleteFinalSnapshot as Qt, hasCdkAutoDeleteTag as R, sameLambdaFunctionAddress as Ra, refuseMalformedResourceEntriesForDestroy as Ri, definedAttributes as Rn, isReadableBag as Ro, isNamelessDynamicReferenceError as Rr, resolveStateBucketWithDefaultAndSource as Rs, redactedDeleteAddressFields as Rt, isProtectionValueActive as S, coerceCfnBoolean as Sa, malformedResourcesWarning as Si, constructPathOf as Sn, TEMPLATE_SOURCED_RULES as So, applyCallerIdentityCredentials as Sr, runDockerStreaming as Ss, destroyStackRecordsView as St, DynamoDBGlobalTableProvider as T, configIntegerRefusal as Ta, previewableOrphanRecords as Ti, RollbackInlinePolicyWriters as Tn, LockManager as To, isSettledInstanceState as Tr, stripControlChars as Ts, recordAfterRollbackUpdate as Tt, createReadOnlyAttributeHealerFactory as U, recordNestedStackParameterExpressions as Ua, refuseMalformedResourcePropertiesForDrift as Ui, wouldReturnToSdkProvider as Un, isSensitiveAttributeName as Uo, refStateLookupFromResource as Ur, CFN_TEMPLATE_BODY_LIMIT as Us, journaledOrphanPrintingBag as Ut, markRefusedBeforeApplying as V, liveMatchesUnresolvedTokenFrame as Va, refuseMalformedResourceEntriesForOrphan as Vi, ProviderRegistry as Vn, shouldRetainResource as Vo, cfnRefValueFromPhysicalId as Vr, warnDeprecatedNoPrefixCliFlag as Vs, updatePartialReason as Vt, bold as W, carryLogOnlyValues as Wa, refuseMalformedResourcePropertiesForExport as Wi, isCustomResourceType as Wn, stringifyValue as Wo, parseWebACLArn as Wr, CFN_TEMPLATE_URL_LIMIT as Ws, maskEventTextWithBoundBags as Wt, computeParameterTaint as X, recordLogOnlyParameterValue as Xa, repairMalformedOrphanRecordsForReadOnly as Xi, unchangedBehindSecretReference as Xn, AssetModeResolver as Xo, STATE_RESOURCES_MALFORMED as Xr, expectedOwnerParam as Xs, buildFinalSnapshotIdentifier as Xt, yellow as Y, printingCorpusOf as Ya, refuseMalformedState as Yi, ccProtectionRegistryTypes as Yn, rewriteTemplateAssetReferences as Yo, STATE_REGION_DIVERGED as Yr, decodeListingKey as Ys, PRE_DELETE_SNAPSHOT_TYPES as Yt, namesAnyDeclaredParameter as Z, recordLogOnlyValue as Za, repairMalformedOrphansForReadOnly as Zi, UNSPECIFIED_SKIP_REASON as Zn, BOOTSTRAP_MARKER_PREFIX as Zo, UNREADABLE_ORPHANS_CONTAINER_ROW as Zr, PARTITION_TABLE as Zs, ccRoutedFinalSnapshotError as Zt, makeCanonicalizePropertiesFn as _, WARM_THROUGHPUT_MEMBERS as _a, malformedOutputsRefusalMessage as _i, isExportAliasCollision as _n, recordProvenPublicExpression as _o, assertSendableRoleArn as _r, isMalformedEnvKey as _s, getCurrentNestedStackContext as _t, findNestedTemplateTreeDefect as a, findActionableSilentDrops as aa, hasPlainPrototype$1 as ac, isReadableResourceEntry as ai, extractDeploymentEventError as an, scrubResourceRecord as ao, isTerminationProtectionPropagationError as ar, validateContainerRepoName as as, makeSiblingClaimReader as at, recordedProtectionNote as b, toCfnInteger as ba, malformedResourceEntriesWarning as bi, DEFAULT_RESOURCE_WARN_AFTER_MS as bn, STATE_SOURCED_CROSS_GENERATION_RULES as bo, sendableAssumeRoleCommand as br, redactedDockerCause as bs, replayRollback as bt, renderNestedTemplateTreeDefect as c, withoutSilentDropProperties as ca, absoluteAssemblyPathEscape as cc, malformedExportSourceWarning as ci, exportAliasCollisionScrubWarning as cn, dynamicReferenceTokens as co, reEnableInstanceApiTermination as cr, resolveDockerContextDirectory as cs, displacedOpClause as ct, conditionInputsFrom as d, findReplacedReadersOfRecreateTargets as da, renderAssemblyPathEscape as dc, malformedLocalResourcesWarning as di, secretSafeKeyDisplay as dn, identityKeyFor as do, IntrinsicFunctionResolver as dr, describeDockerFailure as ds, getNestedRevertRun as dt, repairMalformedResourcePropertiesForReadOnly as ea, AssemblyReader as ec, displayLogicalId as ei, isFinalSnapshotError as en, errorCauseChain as eo, withIndeterminateGuard as er, getBootstrapMarkerKey as es, deleteJournaledOrphans as et, parentSuppliedValues as f, shownType as fa, resolveAssemblyPath as fc, malformedOrphanRecordsRefusalMessage as fi, exportNameSecretExposure as fn, carriesSecretMask as fo, classifyReplaySecretRegion as fr, dockerSpawnEnvWithSensitive as fs, nestedChildStackName as ft, mergeNoChangeOutputs as g, renderStatefulReason as ga, malformedOrphansWarning as gi, collectPublishedOutputNames as gn, recordNoEchoAttributeValues as go, assertFlagRoleArn as gr, isDockerClientEnvKey as gs, withNestedRevertRun as gt, keptWholeReasonText as h, isStatefulRecreateTargetSync as ha, malformedOrphansRefusalMessage as hi, collectDeclaredOutputNames as hn, recordMaskOnlyValuesIn as ho, applyRoleArnIfSet as hr, getDockerCmd as hs, revertedNestedRowIds as ht, childTemplateLoader as i, unreadableResourceEntries as ia, hasOwnKey as ic, isReadableOrphanRecord as ii, DeploymentEventsStore as in, redactSecretsForState as io, ec2InstanceProtectionSite as ir, validateAssetBucketName as is, sameJournaledOrphans as it, resolveDynamoDbDeleteBudgetMs as j, requireConfigString as ja, refuseMalformedOrphansForDestroy as ji, DBPROXY_TAGS_WHAT as jn, describeRegionValueKind as jo, coerceParameterTypedValue as jr, getLegacyStateBucketName as js, replacementNeverSwapped as jt, deleteBudgetKey as k, requireConfigArray as ka, refuseMalformedOrphanRecordsForDestroy as ki, withCreateTokenLedger as kn, splitImportedOps as ko, s3BucketRegionalDomainName as kr, synthesisStatusMessage as ks, planFailedOps as kt, templateIdentity as l, NO_CC_HANDLERS_REASON as la, describeFileReadFailure as lc, malformedLocalOutputsWarning as li, secretBearing as ln, isUncertifiedBaselineMaskPosition as lo, DiffCalculator as lr, describeDockerCapturedOutput as ls, displacedPhysicalIdShown as lt, isSecretBearingReferenceString as m, isStatefulRecreateTargetForReplace as ma, resolveBucketRegion as mc, malformedOrphanRowsKeptWarning as mi, noEchoParameterValueSeed as mn, recordMaskOnlyValue as mo, regionLessSecretName as mr, formatDockerLoginError as ms, revertNestedChildFromJournal as mt, IMPLICIT_DELETE_DEPENDENCIES as n, unpreviewableOrphanRecords as na, processStackMessages as nc, hasReadableOutputs as ni, unsupportedFinalSnapshotError as nn, maskSecretsInText as no, markWaitAbandoned as nr, parseBootstrapMarker as ns, journaledOrphanLines as nt, isAbsoluteAssetPath as o, findSilentDropProperties as oa, nullPrototypeRecord as oc, malformedDriftResourcePropertiesWarning as oi, WITHHELD_NAME_DISPLAY as on, recoverMaskedOutput as oo, observeThenDisableInstanceApiTermination as or, buildDenyExternalAccessPolicy as os, planOrphanAdoption as ot, readRecordedConditionVerdicts as p, MULTI_REGION_RECREATE_BLOCKED_TYPES as pa, clearBucketRegionCache as pc, malformedOrphanRecordsWarning as pi, isWholeDynamicReferenceValue as pn, provenPublicValue as po, producerRegionsFromState as pr, finchSecretArgvRefusal as ps, recordDisplacedSkips as pt, green as q, literalSplitDelimitersOf as qa, refuseMalformedResourcesForDestroy as qi, CloudControlProvider as qn, createAssetRedirectResolver as qo, passedParameterClassesOf as qr, uploadCfnTemplate as qs, stateSecretNameNeedles as qt, computeImplicitDeleteEdges as r, unreadableOrphanRecords as ra, defineOwnKey as rc, hasReadableResources as ri, DeploymentEventsReader as rn, markSameGenerationBag as ro, disableInstanceApiTermination as rr, readBootstrapMarkerBody as rs, loadJournaledOrphans as rt, listNestedTemplateRows as s, unwrittenCreateOnlyReplacement as sa, ownValue as sc, malformedExportNamesWarning as si, displayTextOrWithheld as sn, DYNAMIC_REFERENCE_TOKEN_SCAN as so, reDisableInstanceApiTermination as sr, buildDockerImage as ss, NESTED_PENDING_PARENT_REASON as st, DeployEngine as t, repairMalformedResourcesForReadOnly as ta, StageLoadError as tc, hasReadableOrphans as ti, refusesFinalSnapshot as tn, maskSecretsInError as to, isWaitAbandonedError as tr, isCrossRegionRedirect as ts, isHandledOrphan as tt, conditionFingerprint as u, hasNoCloudControlHandlers as ua, displayAssemblyPath as uc, malformedLocalResourceEntriesWarning as ui, secretBearingStateKeyWarning as un, pathCrossesDottedKey as uo, INTRINSIC_KEYS as ur, describeDockerExecFailure as us, dropSettledNestedJournals as ut, withResourceDeadline as v, coerceWarmThroughput as va, malformedOutputsWarning as vi, bindingSkippedOutputs as vn, wholeStringLeavesOf as vo, explicitRoleArnOrThrow as vr, partitionSensitiveEnv as vs, withNestedStackContext as vt, readProtection as w, configBooleanRefusal as wa, malformedStateRefusalMessage as wi, formatDestructiveChange as wn, isSingleDynamicReferenceToken as wo, envCredentialsAreAssumedRole as wr, escapeRegExp$3 as ws, withStackRecords as wt, PROTECTION_PROPERTY_BY_TYPE as x, toFiniteNumber as xa, malformedResourcePropertiesWarning as xi, maskingRetryLogger as xn, STATE_SOURCED_READBACK_RULES as xo, AWS_CREDENTIAL_ENV_KEYS as xr, runDockerForeground as xs, awaitInFlightSibling as xt, recordedProtectionEvidence as y, isWarmThroughputDecrease as ya, malformedRenderedContainersWarning as yi, DEFAULT_RESOURCE_TIMEOUT_MS as yn, STATE_SOURCED_BASELINE_RULES as yo, isIamRoleArn as yr, redactDockerArgvValues as ys, replayFailedOperations as yt, isTruthyCfnBoolean as z, DagBuilder as za, refuseMalformedResourceEntriesForImport as zi, stringifyIfAssigned as zn, orphansAfterRollback as zo, keepsSecretReferenceToken as zr, resolveUseCdkBootstrapAssets as zs, redactedDeleteAddressSkip as zt };
37951
- //# sourceMappingURL=deploy-engine-BPcBCyUE.js.map
38136
+ export { resourcesNamingDeclaredParameter as $, maskSecretsInError as $a, repairMalformedResourceEntriesForReadOnly as $i, deleteSkipReason as $n, ensureAssetStorage as $o, deployRefusesOrphanRowsReason as $r, derivePartitionAndUrlSuffix as $s, effectiveDeletionPolicy as $t, resolveDynamoDbDeleteBudgetClock as A, requireConfigObject as Aa, refuseMalformedOrphans as Ai, acquireIdempotencyToken as An, acceptedCreateOnlyDropsOf as Ao, s3BucketWebsiteUrl as Ar, getDefaultStateBucketName as As, planRollback as At, getPriorAttempts as B, TemplateParser as Ba, refuseMalformedResourceEntriesForImportSave as Bi, CC_BROKEN_REASON as Bn, orphansCarriedFrom as Bo, AWS_NO_VALUE as Br, stateBucketExistenceConfirmed as Bs, updatePartialMessage as Bt, perType as C, coerceCfnInteger as Ca, malformedScrubResourceEntriesRefusalMessage as Ci, findDestructiveChanges as Cn, WHOLE_DYNAMIC_REFERENCE_PATTERN as Co, callerEnvCredentials as Cr, warnFinchArgvExposure as Cs, getStackRecords as Ct, beginDeleteWait as D, readConfigString as Da, refuseMalformedNestedChildOutputs as Di, ledgerForStack as Dn, S3StateBackend as Do, s3BucketDomainName as Dr, getDockerImageBySourceHash as Ds, isJournaledOrphan as Dt, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as E, configStringRefusal as Ea, refuseDivergentRecordRegionForDestroy as Ei, earliestDefined as En, isLockInfoExpired as Eo, s3BucketArn as Er, AssetManifestLoader as Es, demoteSupersededOrphans as Et, waitForIndexesSettled as F, withRetry as Fa, refuseMalformedResourceAttributesForOrphan as Fi, refuseMalformedDesiredTags as Fn, hasUnverifiableParameterRefusal as Fo, isImpossibleEmptyStoredAttribute as Fr, resolveCaptureObservedState as Fs, inheritProducerRegions as Ft, cyan as G, literalSplitDelimitersOf as Ga, refuseMalformedResourcePropertiesForOrphan as Gi, getCurrentResourceSecrets as Gn, WorkGraph as Go, withSharedDrainBudget as Gr, MIGRATE_TMP_PREFIX as Gs, orphanRecordsPrintingBag as Gt, formatResourceLine as H, carryLogOnlyValues as Ha, refuseMalformedResourcePropertiesForDestroy as Hi, ccBrokenReason as Hn, AssetPublisher as Ho, isStalePlaceholderArnAttribute as Hr, ssmResolvedValueType as Hs, completedReplayEntries as Ht, ECR_AUTO_DELETE_IMAGES_TAG as I, canonicalLambdaFunctionName as Ia, refuseMalformedResourceEntries as Ii, tagMapAsList as In, importableOutputKeys as Io, carriesDynamicReference as Ir, resolveSkipPrefix as Is, REDACTED_DELETE_ADDRESS_SKIP_REASON as It, red as J, recordLogOnlyParameterValue as Ja, refuseMalformedResourcesForExport as Ji, slowCcOperationTimeoutMs as Jn, loadPublishableAssetManifest as Jo, JSON_LISTING_HOLE_VALUE as Jr, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as Js, ATOMIC_FINAL_SNAPSHOT_TYPES as Jt, gray as K, logOnlyValueCount as Ka, refuseMalformedResourcesForDeploy as Ki, withPrintingSecrets as Kn, buildAssetRedirectMap as Ko, parameterInputsFor as Kr, findLargeInlineResources as Ks, secretNamePrintingBag as Kt, S3_AUTO_DELETE_OBJECTS_TAG as L, lambdaFunctionNameForMask as La, refuseMalformedResourceEntriesForDeploy as Li, tagPlanWarning as Ln, importableOutputs as Lo, carriesFetchableDynamicReference as Lr, resolveStateBucketWithDefault as Ls, isRedactedRecordedValue as Lt, DELETE_INDEX_WAIT_PROCEED_NOTE as M, prefetchCreateOnlyPropertyPaths as Ma, refuseMalformedOrphansForOrphan as Mi, DBPROXY_TAG_OPTIONS as Mn, exportNamesCarriedFrom as Mo, isUnboundTemplateParameter as Mr, loadCdkJson as Ms, resolveReplacementOldType as Mt, INDEX_SETTLE_POLL_INTERVAL_MS as N, templateResourceTypes as Na, refuseMalformedOutputs as Ni, planTagDiff as Nn, hasReadableExportSet as No, parameterTypeMayLoseSecretIdentity as Nr, resolveApp as Ns, findNestedStackTypeChanges as Nt, compensateRemovedDeletionProtection as O, replayWarn as Oa, refuseMalformedOrphanRecords as Oi, reserveStackCreateToken as On, rebuildClientForBucketRegion as Oo, s3BucketDualStackDomainName as Or, Synthesizer as Os, isReplacementOrphan as Ot, deleteTableWithIndexBusyRetry as P, describeTypeWithThrottleRetry as Pa, refuseMalformedOutputsForDestroy as Pi, readTagList as Pn, hasReasonlessBaselineRefusal as Po, getAccountInfo as Pr, resolveAutoAssetStorage as Ps, getCurrentProducerRegions as Pt, reachableDivergentParameters as Q, errorCauseChain as Qa, repairMalformedOutputsForReadOnly as Qi, deleteIndeterminateGuards as Qn, assertAssetBucketRegion as Qo, UNREADABLE_RESOURCES_MAP_ROW as Qr, canonicalizeRegion as Qs, createPreDeleteFinalSnapshot as Qt, hasCdkAutoDeleteTag as R, sameLambdaFunctionAddress as Ra, refuseMalformedResourceEntriesForDestroy as Ri, definedAttributes as Rn, isReadableBag as Ro, isNamelessDynamicReferenceError as Rr, resolveStateBucketWithDefaultAndSource as Rs, redactedDeleteAddressFields as Rt, isProtectionValueActive as S, coerceCfnBoolean as Sa, malformedResourcesWarning as Si, constructPathOf as Sn, TEMPLATE_SOURCED_RULES as So, applyCallerIdentityCredentials as Sr, runDockerStreaming as Ss, destroyStackRecordsView as St, DynamoDBGlobalTableProvider as T, configIntegerRefusal as Ta, previewableOrphanRecords as Ti, RollbackInlinePolicyWriters as Tn, LockManager as To, isSettledInstanceState as Tr, stripControlChars as Ts, recordAfterRollbackUpdate as Tt, createReadOnlyAttributeHealerFactory as U, createUnionSecretMasker as Ua, refuseMalformedResourcePropertiesForDrift as Ui, wouldReturnToSdkProvider as Un, isSensitiveAttributeName as Uo, refStateLookupFromResource as Ur, CFN_TEMPLATE_BODY_LIMIT as Us, journaledOrphanPrintingBag as Ut, markRefusedBeforeApplying as V, liveMatchesUnresolvedTokenFrame as Va, refuseMalformedResourceEntriesForOrphan as Vi, ProviderRegistry as Vn, shouldRetainResource as Vo, cfnRefValueFromPhysicalId as Vr, warnDeprecatedNoPrefixCliFlag as Vs, updatePartialReason as Vt, bold as W, hasMaskableValues as Wa, refuseMalformedResourcePropertiesForExport as Wi, isCustomResourceType as Wn, stringifyValue as Wo, parseWebACLArn as Wr, CFN_TEMPLATE_URL_LIMIT as Ws, maskEventTextWithBoundBags as Wt, computeParameterTaint as X, shareLogOnlyValues as Xa, repairMalformedOrphanRecordsForReadOnly as Xi, unchangedBehindSecretReference as Xn, AssetModeResolver as Xo, STATE_RESOURCES_MALFORMED as Xr, expectedOwnerParam as Xs, buildFinalSnapshotIdentifier as Xt, yellow as Y, recordLogOnlyValue as Ya, refuseMalformedState as Yi, ccProtectionRegistryTypes as Yn, rewriteTemplateAssetReferences as Yo, STATE_REGION_DIVERGED as Yr, decodeListingKey as Ys, PRE_DELETE_SNAPSHOT_TYPES as Yt, namesAnyDeclaredParameter as Z, createSecretMasker as Za, repairMalformedOrphansForReadOnly as Zi, UNSPECIFIED_SKIP_REASON as Zn, BOOTSTRAP_MARKER_PREFIX as Zo, UNREADABLE_ORPHANS_CONTAINER_ROW as Zr, PARTITION_TABLE as Zs, ccRoutedFinalSnapshotError as Zt, makeCanonicalizePropertiesFn as _, WARM_THROUGHPUT_MEMBERS as _a, malformedOutputsRefusalMessage as _i, isExportAliasCollision as _n, recordProvenPublicExpression as _o, assertSendableRoleArn as _r, isMalformedEnvKey as _s, getCurrentNestedStackContext as _t, findNestedTemplateTreeDefect as a, findActionableSilentDrops as aa, hasPlainPrototype$1 as ac, isReadableResourceEntry as ai, extractDeploymentEventError as an, dynamicReferenceTokens as ao, isTerminationProtectionPropagationError as ar, validateContainerRepoName as as, makeSiblingClaimReader as at, recordedProtectionNote as b, toCfnInteger as ba, malformedResourceEntriesWarning as bi, DEFAULT_RESOURCE_WARN_AFTER_MS as bn, STATE_SOURCED_CROSS_GENERATION_RULES as bo, sendableAssumeRoleCommand as br, redactedDockerCause as bs, replayRollback as bt, renderNestedTemplateTreeDefect as c, withoutSilentDropProperties as ca, absoluteAssemblyPathEscape as cc, malformedExportSourceWarning as ci, exportAliasCollisionScrubWarning as cn, inheritNestedStackParameterAssociations as co, reEnableInstanceApiTermination as cr, resolveDockerContextDirectory as cs, displacedOpClause as ct, conditionInputsFrom as d, findReplacedReadersOfRecreateTargets as da, renderAssemblyPathEscape as dc, malformedLocalResourcesWarning as di, secretSafeKeyDisplay as dn, identityKeyFor as do, IntrinsicFunctionResolver as dr, describeDockerFailure as ds, getNestedRevertRun as dt, repairMalformedResourcePropertiesForReadOnly as ea, AssemblyReader as ec, displayLogicalId as ei, isFinalSnapshotError as en, maskSecretsInText as eo, withIndeterminateGuard as er, getBootstrapMarkerKey as es, deleteJournaledOrphans as et, parentSuppliedValues as f, shownType as fa, resolveAssemblyPath as fc, malformedOrphanRecordsRefusalMessage as fi, exportNameSecretExposure as fn, carriesSecretMask as fo, classifyReplaySecretRegion as fr, dockerSpawnEnvWithSensitive as fs, nestedChildStackName as ft, mergeNoChangeOutputs as g, renderStatefulReason as ga, malformedOrphansWarning as gi, collectPublishedOutputNames as gn, recordNoEchoAttributeValues as go, assertFlagRoleArn as gr, isDockerClientEnvKey as gs, withNestedRevertRun as gt, keptWholeReasonText as h, isStatefulRecreateTargetSync as ha, malformedOrphansRefusalMessage as hi, collectDeclaredOutputNames as hn, recordMaskOnlyValuesIn as ho, applyRoleArnIfSet as hr, getDockerCmd as hs, revertedNestedRowIds as ht, childTemplateLoader as i, unreadableResourceEntries as ia, hasOwnKey as ic, isReadableOrphanRecord as ii, DeploymentEventsStore as in, DYNAMIC_REFERENCE_TOKEN_SCAN as io, ec2InstanceProtectionSite as ir, validateAssetBucketName as is, sameJournaledOrphans as it, resolveDynamoDbDeleteBudgetMs as j, requireConfigString as ja, refuseMalformedOrphansForDestroy as ji, DBPROXY_TAGS_WHAT as jn, describeRegionValueKind as jo, coerceParameterTypedValue as jr, getLegacyStateBucketName as js, replacementNeverSwapped as jt, deleteBudgetKey as k, requireConfigArray as ka, refuseMalformedOrphanRecordsForDestroy as ki, withCreateTokenLedger as kn, splitImportedOps as ko, s3BucketRegionalDomainName as kr, synthesisStatusMessage as ks, planFailedOps as kt, templateIdentity as l, NO_CC_HANDLERS_REASON as la, describeFileReadFailure as lc, malformedLocalOutputsWarning as li, secretBearing as ln, recordNestedStackParameterExpressions as lo, DiffCalculator as lr, describeDockerCapturedOutput as ls, displacedPhysicalIdShown as lt, isSecretBearingReferenceString as m, isStatefulRecreateTargetForReplace as ma, resolveBucketRegion as mc, malformedOrphanRowsKeptWarning as mi, noEchoParameterValueSeed as mn, recordMaskOnlyValue as mo, regionLessSecretName as mr, formatDockerLoginError as ms, revertNestedChildFromJournal as mt, IMPLICIT_DELETE_DEPENDENCIES as n, unpreviewableOrphanRecords as na, processStackMessages as nc, hasReadableOutputs as ni, unsupportedFinalSnapshotError as nn, redactSecretsForState as no, markWaitAbandoned as nr, parseBootstrapMarker as ns, journaledOrphanLines as nt, isAbsoluteAssetPath as o, findSilentDropProperties as oa, nullPrototypeRecord as oc, malformedDriftResourcePropertiesWarning as oi, WITHHELD_NAME_DISPLAY as on, isUncertifiedBaselineMaskPosition as oo, observeThenDisableInstanceApiTermination as or, buildDenyExternalAccessPolicy as os, planOrphanAdoption as ot, readRecordedConditionVerdicts as p, MULTI_REGION_RECREATE_BLOCKED_TYPES as pa, clearBucketRegionCache as pc, malformedOrphanRecordsWarning as pi, isWholeDynamicReferenceValue as pn, provenPublicValue as po, producerRegionsFromState as pr, finchSecretArgvRefusal as ps, recordDisplacedSkips as pt, green as q, printingCorpusOf as qa, refuseMalformedResourcesForDestroy as qi, CloudControlProvider as qn, createAssetRedirectResolver as qo, passedParameterClassesOf as qr, uploadCfnTemplate as qs, stateSecretNameNeedles as qt, computeImplicitDeleteEdges as r, unreadableOrphanRecords as ra, defineOwnKey as rc, hasReadableResources as ri, DeploymentEventsReader as rn, scrubResourceRecord as ro, disableInstanceApiTermination as rr, readBootstrapMarkerBody as rs, loadJournaledOrphans as rt, listNestedTemplateRows as s, unwrittenCreateOnlyReplacement as sa, ownValue as sc, malformedExportNamesWarning as si, displayTextOrWithheld as sn, pathCrossesDottedKey as so, reDisableInstanceApiTermination as sr, buildDockerImage as ss, NESTED_PENDING_PARENT_REASON as st, DeployEngine as t, repairMalformedResourcesForReadOnly as ta, StageLoadError as tc, hasReadableOrphans as ti, refusesFinalSnapshot as tn, markSameGenerationBag as to, isWaitAbandonedError as tr, isCrossRegionRedirect as ts, isHandledOrphan as tt, conditionFingerprint as u, hasNoCloudControlHandlers as ua, displayAssemblyPath as uc, malformedLocalResourceEntriesWarning as ui, secretBearingStateKeyWarning as un, recoverMaskedOutput as uo, INTRINSIC_KEYS as ur, describeDockerExecFailure as us, dropSettledNestedJournals as ut, withResourceDeadline as v, coerceWarmThroughput as va, malformedOutputsWarning as vi, bindingSkippedOutputs as vn, wholeStringLeavesOf as vo, explicitRoleArnOrThrow as vr, partitionSensitiveEnv as vs, withNestedStackContext as vt, readProtection as w, configBooleanRefusal as wa, malformedStateRefusalMessage as wi, formatDestructiveChange as wn, isSingleDynamicReferenceToken as wo, envCredentialsAreAssumedRole as wr, escapeRegExp$3 as ws, withStackRecords as wt, PROTECTION_PROPERTY_BY_TYPE as x, toFiniteNumber as xa, malformedResourcePropertiesWarning as xi, maskingRetryLogger as xn, STATE_SOURCED_READBACK_RULES as xo, AWS_CREDENTIAL_ENV_KEYS as xr, runDockerForeground as xs, awaitInFlightSibling as xt, recordedProtectionEvidence as y, isWarmThroughputDecrease as ya, malformedRenderedContainersWarning as yi, DEFAULT_RESOURCE_TIMEOUT_MS as yn, STATE_SOURCED_BASELINE_RULES as yo, isIamRoleArn as yr, redactDockerArgvValues as ys, replayFailedOperations as yt, isTruthyCfnBoolean as z, DagBuilder as za, refuseMalformedResourceEntriesForImport as zi, stringifyIfAssigned as zn, orphansAfterRollback as zo, keepsSecretReferenceToken as zr, resolveUseCdkBootstrapAssets as zs, redactedDeleteAddressSkip as zt };
38137
+ //# sourceMappingURL=deploy-engine-iXgQFHYR.js.map