@go-to-k/cdkd 0.298.8 → 0.299.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/{asg-provider-B8N6UPAH.js → asg-provider-CGN1a3d3.js} +4 -4
  2. package/dist/{asg-provider-B8N6UPAH.js.map → asg-provider-CGN1a3d3.js.map} +1 -1
  3. package/dist/{aws-client-defaults-D0q0z4dG.js → aws-client-defaults-DBXBcg0J.js} +79 -3
  4. package/dist/aws-client-defaults-DBXBcg0J.js.map +1 -0
  5. package/dist/{aws-clients-CnmtbrxD.js → aws-clients-Bj7qH5Ph.js} +2 -2
  6. package/dist/{aws-clients-CnmtbrxD.js.map → aws-clients-Bj7qH5Ph.js.map} +1 -1
  7. package/dist/cli.js +2 -2
  8. package/dist/{deploy-engine-HKmcD4Kn.js → deploy-engine-4K_B3N08.js} +679 -176
  9. package/dist/deploy-engine-4K_B3N08.js.map +1 -0
  10. package/dist/{iam-policy-targets-CwKiK9nS.js → iam-policy-targets-Pn2m0R67.js} +3 -3
  11. package/dist/{iam-policy-targets-CwKiK9nS.js.map → iam-policy-targets-Pn2m0R67.js.map} +1 -1
  12. package/dist/{iam-role-provider-BiCib2zp.js → iam-role-provider-BKnf387o.js} +47 -7
  13. package/dist/iam-role-provider-BKnf387o.js.map +1 -0
  14. package/dist/index.d.ts +24 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +4 -4
  17. package/dist/{neptune-provider-D3Qcci3J.js → neptune-provider-CR19ID_J.js} +4 -4
  18. package/dist/{neptune-provider-D3Qcci3J.js.map → neptune-provider-CR19ID_J.js.map} +1 -1
  19. package/dist/{program-MMwB_CTT.js → program-BgsCaZFy.js} +230 -80
  20. package/dist/program-BgsCaZFy.js.map +1 -0
  21. package/dist/{provider-classes--iMwAb7q.js → provider-classes-DxHQcC1K.js} +79 -14
  22. package/dist/provider-classes-DxHQcC1K.js.map +1 -0
  23. package/dist/{rds-provider-BdUme0V8.js → rds-provider-BO3U39K0.js} +4 -4
  24. package/dist/{rds-provider-BdUme0V8.js.map → rds-provider-BO3U39K0.js.map} +1 -1
  25. package/dist/{version-n6UXfuUI.js → version-DUCWZskc.js} +2 -2
  26. package/dist/{version-n6UXfuUI.js.map → version-DUCWZskc.js.map} +1 -1
  27. package/package.json +1 -1
  28. package/dist/aws-client-defaults-D0q0z4dG.js.map +0 -1
  29. package/dist/deploy-engine-HKmcD4Kn.js.map +0 -1
  30. package/dist/iam-role-provider-BiCib2zp.js.map +0 -1
  31. package/dist/program-MMwB_CTT.js.map +0 -1
  32. package/dist/provider-classes--iMwAb7q.js.map +0 -1
@@ -1,8 +1,8 @@
1
- import { r as getAwsClients, s as __exportAll } from "./aws-clients-CnmtbrxD.js";
1
+ import { r as getAwsClients, s as __exportAll } from "./aws-clients-Bj7qH5Ph.js";
2
2
  import { A as UNRENDERABLE, C as looksLikeCdkdGeneratedName, E as withoutGeneratedFallbackName, F as displayStackName, H as truncateCodePoints, I as isPasteableIdent, M as displayAwsMessage, N as displayIdent, O as SECRET_REF_MAX_CODE_POINTS, P as displaySafe, R as plainIdentOr, S as getCurrentStackName, T as withStackName, V as terminalSafe, a as getLogger, b as generateResourceNameWithFallback, d as installLogLineMaskerSource, f as getLiveRenderer, g as applyDefaultNameForFallback, k as STACK_REF_MAX_CODE_POINTS, o as isStdoutReservedForPayload, r as safeStringify$1, t as describeAwsFailure, u as currentLogLineMasker, v as explicitNamePropertyFor, w as withSkipPrefix, x as getCurrentSkipPrefix, y as generateResourceName, z as safeMsg } from "./aws-failure-text-DtvlUugx.js";
3
- import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-CwKiK9nS.js";
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-n6UXfuUI.js";
3
+ import { $ as protectedReplacementAdvice, $n as isAmbiguousOutcomeError, $t as credentialFingerprint, A as isQuotableImportValue, An as UNSHOWABLE_VALUE, At as isAuxiliaryMarkOf, B as isTerminalDeleteFailure, Bn as withheldTargetClause, Bt as recoveryCommandFlags, Ct as RETRY_AUXILIARY_OWNER, Dt as createdResourceIdentityBeforeFailure, E as assertRegionMatch, Et as createdBeforeFailure, F as resolveExplicitPhysicalId, Fn as physicalIdShownBesideCommand, G as runDeleteAttempt, Gn as isNameCollisionErrorFrom, H as observeThenDisableProtection, Ht as CUSTOM_RESOURCE_RESPONSE_PREFIX, In as plainOrDescribed, J as DELETION_PROTECTION_DOC_POINTER, Jn as isReplayedNameCollisionFrom, Kn as isNameCooldownError, L as ProtectionFlipRegistry, Ln as quotedOrDescribed, Lt as formatLockExpiry, M as quotedRemedyLogicalId, Mt as markCreatedBeforeFailure, N as refusalTypeShown, Nn as isInertUnquoted, Nt as UNREPRODUCIBLE_LOCK_CLAUSE, On as SHELL_ACTIVE, Ot as hasCreatedBeforeFailure, Pn as pasteableCommand, Pt as buildForceUnlockCommand, Q as pasteableAwsCommand, Qn as isAmbiguousCcHandlerErrorCode, Qt as clientDefaultsFor, R as compensateProtectionFlip, Rn as shellBoundedDisplay, Rt as formatLockOperation, Sn as SynthesisError, St as withDerivedNameMasks, T as RESOURCE_NOT_FOUND, Tn as normalizeAwsError, U as protectionFlipKey, Un as isUpdateUnsupportedError, Ut as DEFAULT_STATE_PREFIX, Vt as sanitizeRecoveryValue, Wn as hasReplayMayCollide, Wt as injectiveKey, Xn as markReplayMayCollide, Xt as ambientClientDefaults, Yt as withPasteableAwsProfile, Zn as formatRetryClassificationSignals, Zt as ambientCredentialConfig, _n as ResourceTimeoutError, _t as createMaskedLogSinks, an as DependencyError, ar as isMarkedNonRetryable, at as startInterruptWatch, bt as maskDeep, cn as IntrinsicResolutionRefusalError, cr as markRedactedCause, ct as canonicalizeRoute53QueryName, d as prepareRemovalForUpdate, dn as LockError, en as AccountIdUnavailableError, er as isIamPropagationError, f as removalWarning, fn as MacroExpansionError, ft as logicalIdShown, gn as ProvisioningError, gt as stateOrphanRecordRemedy, ht as segmentAfterAnchor, i as holdsSecretDerivedEntry, in as CrossAccountSecretRefusalError, it as isInterruptedWaitError, j as normalizeAwsTagsToCfn, jn as commandHole, jt as markAuxiliaryFailure, kn as SHELL_ACTIVE_WHY, kt as isAuxiliaryFailure, l as withUnchangedSecretPrincipalLists, lr as wrapMaskedAwsError, m as withoutInjectedRemovals, mt as resourceTypeShown, nn as CdkdError, nr as isTransientServerError, or as isThrottlingError, ot as ElapsedBudgetRegistry, pn as MalformedProducerRecordRefusalError, qn as isRecreateRetryableError, qt as producerRecordKey, rr as retryClassificationText, sn as DynamicReferenceRegionAmbiguousError, sr as markNonRetryable, st as monotonicNowMs, tn as AssetError, tr as isRetryableTransientError, ut as compositeIdSeparatorRefusal, vn as ResourceUpdateNotSupportedError, vt as createMaskedRetryLogger, w as withoutServerErrorRetries, wt as carryCreatedBeforeFailure, xn as StateError, xt as maskerOrIdentity, yt as isSecretDerivedValue, z as deleteWithProtectionCompensation, zn as shellQuote, zt as formatLockOwner } from "./iam-policy-targets-Pn2m0R67.js";
4
+ import { a as setAssumedRoleCredentials, i as getPreAssumeEnvCredentials, n as awsClientDefaults, o as setPreAssumeEnvCredentials, r as getAssumedRoleCredentials, s as ambientRegion, t as SECOND_ROLE_PUBLISH_REFUSAL } from "./aws-client-defaults-DBXBcg0J.js";
5
+ import { t as getCdkdVersion } from "./version-DUCWZskc.js";
6
6
  import { createHash, randomUUID } from "node:crypto";
7
7
  import { AsyncLocalStorage } from "node:async_hooks";
8
8
  import { CreateBucketCommand, DeleteObjectCommand, DeleteObjectsCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketReplicationCommand, GetObjectCommand, HeadBucketCommand, HeadObjectCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchKey, PutBucketEncryptionCommand, PutBucketLifecycleConfigurationCommand, PutBucketPolicyCommand, PutObjectCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -2308,7 +2308,7 @@ async function resolveStateBucketWithDefaultAndSource(cliBucket, region, legacyF
2308
2308
  logger.debug("No state bucket specified, resolving default from account...");
2309
2309
  const { GetCallerIdentityCommand } = await import("@aws-sdk/client-sts");
2310
2310
  const { S3Client, HeadBucketCommand, ListObjectsV2Command } = await import("@aws-sdk/client-s3");
2311
- const { getAwsClients } = await import("./aws-clients-CnmtbrxD.js").then((n) => n.n);
2311
+ const { getAwsClients } = await import("./aws-clients-Bj7qH5Ph.js").then((n) => n.n);
2312
2312
  const { expectedOwnerParam, recordResolvedAccountId } = await Promise.resolve().then(() => expected_bucket_owner_exports);
2313
2313
  const probeDeps = {
2314
2314
  HeadBucketCommand,
@@ -4751,7 +4751,8 @@ const STATE_SCHEMA_VERSIONS_READABLE = [
4751
4751
  8,
4752
4752
  9,
4753
4753
  10,
4754
- 11
4754
+ 11,
4755
+ 12
4755
4756
  ];
4756
4757
  function hasUnverifiableParameterRefusal(record) {
4757
4758
  return record?.observedBaselineRefused === true && record.observedBaselineRefusalReason === "unverifiable-parameter";
@@ -5482,6 +5483,19 @@ async function rebuildClientForBucketRegion(client, bucket, opts = {}) {
5482
5483
  return replacement;
5483
5484
  }
5484
5485
 
5486
+ //#endregion
5487
+ //#region src/state/token-free-state.ts
5488
+ const tokenFreeStates = /* @__PURE__ */ new WeakSet();
5489
+ function bodyMayCarryReferences(body) {
5490
+ return body.includes("{{resolve:") || body.includes("\"referenceProvenance\"") || body.includes("\"outputReferenceProvenance\"");
5491
+ }
5492
+ function markTokenFreeState(state) {
5493
+ tokenFreeStates.add(state);
5494
+ }
5495
+ function isKnownTokenFreeState(state) {
5496
+ return state !== void 0 && tokenFreeStates.has(state);
5497
+ }
5498
+
5485
5499
  //#endregion
5486
5500
  //#region src/state/s3-state-backend.ts
5487
5501
  function errorDetail$2(error) {
@@ -5649,6 +5663,7 @@ var S3StateBackend = class S3StateBackend {
5649
5663
  const bodyString = await response.Body.transformToString();
5650
5664
  const parsed = this.parseStateBody(bodyString, stackName);
5651
5665
  const { state, divergentBodyRegion } = this.adoptKeyRegion(parsed, region, shownStackName, shownRegionName);
5666
+ if (!bodyMayCarryReferences(bodyString)) markTokenFreeState(state);
5652
5667
  this.logger.debug(`Retrieved state: ${shownStackName} (${shownRegionName}), ETag: ${response.ETag}`);
5653
5668
  return {
5654
5669
  state,
@@ -5679,7 +5694,7 @@ var S3StateBackend = class S3StateBackend {
5679
5694
  const { expectedEtag, migrateLegacy } = options;
5680
5695
  const body = {
5681
5696
  ...state,
5682
- version: 11,
5697
+ version: 12,
5683
5698
  stackName,
5684
5699
  region
5685
5700
  };
@@ -7174,7 +7189,7 @@ const WHOLE_DYNAMIC_REFERENCE_PATTERN = new RegExp(`^\\{\\{resolve:${DYNAMIC_REF
7174
7189
  function isSingleDynamicReferenceToken(value) {
7175
7190
  return WHOLE_DYNAMIC_REFERENCE_PATTERN.test(value);
7176
7191
  }
7177
- function isPlainObject$4(value) {
7192
+ function isPlainObject$5(value) {
7178
7193
  return value !== null && typeof value === "object" && !Array.isArray(value);
7179
7194
  }
7180
7195
 
@@ -7423,7 +7438,7 @@ function crossStackSourceKey(source) {
7423
7438
  }
7424
7439
  if (key === "Fn::GetStackOutput") {
7425
7440
  const args = source[key];
7426
- if (!isPlainObject$4(args)) return void 0;
7441
+ if (!isPlainObject$5(args)) return void 0;
7427
7442
  const stackName = Object.hasOwn(args, "StackName") ? literalStringOrUndefined(args["StackName"]) : void 0;
7428
7443
  const outputName = Object.hasOwn(args, "OutputName") ? literalStringOrUndefined(args["OutputName"]) : void 0;
7429
7444
  if (stackName === void 0 || outputName === void 0) return void 0;
@@ -7469,7 +7484,7 @@ function crossStackSourceKey(source) {
7469
7484
  let template;
7470
7485
  let variables;
7471
7486
  if (typeof raw === "string") template = raw;
7472
- else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$4(raw[1])) {
7487
+ else if (Array.isArray(raw) && raw.length === 2 && isPlainObject$5(raw[1])) {
7473
7488
  if (typeof raw[0] !== "string") return void 0;
7474
7489
  template = raw[0];
7475
7490
  variables = raw[1];
@@ -7712,12 +7727,12 @@ const UNFRAMED_SPELLING = Symbol("cdkd.nested-parameter.unframed-spelling");
7712
7727
  function recordNestedStackParameterExpressions(secrets, resourceType, resolvedProperties, sourceProperties, rules = TEMPLATE_DERIVED_RULES) {
7713
7728
  if (resourceType !== NESTED_STACK_RESOURCE_TYPE$4) return;
7714
7729
  if (secrets.size === 0) return;
7715
- if (!isPlainObject$4(resolvedProperties) || !isPlainObject$4(sourceProperties)) return;
7730
+ if (!isPlainObject$5(resolvedProperties) || !isPlainObject$5(sourceProperties)) return;
7716
7731
  if (!Object.hasOwn(resolvedProperties, "Parameters")) return;
7717
7732
  if (!Object.hasOwn(sourceProperties, "Parameters")) return;
7718
7733
  const resolvedParameters = resolvedProperties["Parameters"];
7719
7734
  const sourceParameters = sourceProperties["Parameters"];
7720
- if (!isPlainObject$4(resolvedParameters) || !isPlainObject$4(sourceParameters)) return;
7735
+ if (!isPlainObject$5(resolvedParameters) || !isPlainObject$5(sourceParameters)) return;
7721
7736
  const positioned = redactSecretsForState(markSameGenerationBag({ ...resolvedParameters }), secrets, sourceParameters, rules);
7722
7737
  let table = nestedStackParameterExpressions.get(secrets);
7723
7738
  for (const [name, resolvedValue] of Object.entries(resolvedParameters)) {
@@ -7766,7 +7781,7 @@ function recordNestedStackParameterExpressions(secrets, resourceType, resolvedPr
7766
7781
  if (typeof resolvedValue !== "string") return void 0;
7767
7782
  const sourceLeaf = sourceParameters[name];
7768
7783
  if (typeof sourceLeaf === "string") return sourceLeaf;
7769
- if (!isPlainObject$4(sourceLeaf)) return void 0;
7784
+ if (!isPlainObject$5(sourceLeaf)) return void 0;
7770
7785
  const written = positioned[name];
7771
7786
  if (typeof written !== "string") return void 0;
7772
7787
  const rendered = intrinsicSkeletonSegments(sourceLeaf)?.map((s) => s === UNKNOWN_PART ? "\0" : s).join("");
@@ -7977,7 +7992,7 @@ function appendValuePlaceholderParts(value, out, budget, depth) {
7977
7992
  if (budget.exhausted) return;
7978
7993
  const literal = joinPartLiteralText(value);
7979
7994
  if (literal !== void 0) return pushPlaceholderPart(out, literal, budget);
7980
- if (isPlainObject$4(value) && Object.keys(value).length === 1) {
7995
+ if (isPlainObject$5(value) && Object.keys(value).length === 1) {
7981
7996
  const ref = value["Ref"];
7982
7997
  if (typeof ref === "string" && ref !== "") return pushPlaceholderPart(out, keyedPart({ Ref: ref }), budget);
7983
7998
  if (depth >= MAX_PLACEHOLDER_DEPTH) {
@@ -8009,7 +8024,7 @@ function appendParameterPlaceholderParts(source, out, budget, depth) {
8009
8024
  let template;
8010
8025
  let variables = {};
8011
8026
  if (typeof args === "string") template = args;
8012
- else if (Array.isArray(args) && args.length === 2 && isPlainObject$4(args[1])) {
8027
+ else if (Array.isArray(args) && args.length === 2 && isPlainObject$5(args[1])) {
8013
8028
  template = args[0];
8014
8029
  variables = args[1];
8015
8030
  } else return false;
@@ -8157,7 +8172,7 @@ function isUniquelyKeyedBy(items, key) {
8157
8172
  if (items.length === 0) return false;
8158
8173
  const seen = /* @__PURE__ */ new Set();
8159
8174
  for (const item of items) {
8160
- if (!isPlainObject$4(item) || !Object.hasOwn(item, key)) return false;
8175
+ if (!isPlainObject$5(item) || !Object.hasOwn(item, key)) return false;
8161
8176
  const id = item[key];
8162
8177
  if (typeof id !== "string" || id === "") return false;
8163
8178
  if (seen.has(id)) return false;
@@ -8187,11 +8202,11 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
8187
8202
  }
8188
8203
  return positionByEmbeddedSpan(bag, source, secrets, bagIsSameGeneration);
8189
8204
  }
8190
- if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$4(source)) {
8205
+ if ((typeof bag === "string" || Array.isArray(bag)) && isPlainObject$5(source)) {
8191
8206
  const inherited = positionByInheritedParameter(bag, source, secrets);
8192
8207
  if (inherited !== void 0) return inherited;
8193
8208
  }
8194
- if (typeof bag === "string" && isPlainObject$4(source)) {
8209
+ if (typeof bag === "string" && isPlainObject$5(source)) {
8195
8210
  const certified = positionByCrossStackSource(bag, source, secrets);
8196
8211
  if (certified !== void 0) return certified;
8197
8212
  const placeheld = positionByParameterPlaceholders(bag, source, secrets);
@@ -8201,7 +8216,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
8201
8216
  const framed = positionByIntrinsicFrame(bag, source, secrets, secretExpressions, bagIsSameGeneration);
8202
8217
  if (framed !== void 0) return framed;
8203
8218
  }
8204
- if (Array.isArray(bag) && isPlainObject$4(source)) {
8219
+ if (Array.isArray(bag) && isPlainObject$5(source)) {
8205
8220
  const positionedList = positionListByCrossStackSource(bag, source, secrets);
8206
8221
  if (positionedList !== void 0) return positionedList;
8207
8222
  }
@@ -8229,7 +8244,7 @@ function redactByPath(bag, source, secrets, rules, secretExpressions, bagIsSameG
8229
8244
  }
8230
8245
  if (rules.descendArrays && bag.length === source.length) return bag.map((item, i) => redactByPath(item, source[i], secrets, rules, secretExpressions, bagIsSameGeneration));
8231
8246
  }
8232
- if (isPlainObject$4(bag) && hasPlainPrototype(bag) && isPlainObject$4(source)) {
8247
+ if (isPlainObject$5(bag) && hasPlainPrototype(bag) && isPlainObject$5(source)) {
8233
8248
  const out = Object.create(null);
8234
8249
  for (const [k, v] of Object.entries(bag)) out[k] = Object.hasOwn(source, k) ? redactByPath(v, source[k], secrets, rules, secretExpressions, bagIsSameGeneration) : redactSecretsForState(v, secrets);
8235
8250
  return out;
@@ -8242,7 +8257,7 @@ function isReadbackProjectedFromState(rules) {
8242
8257
  function subtreeHasDynamicReference(value) {
8243
8258
  if (isDynamicReferenceString(value)) return true;
8244
8259
  if (Array.isArray(value)) return value.some(subtreeHasDynamicReference);
8245
- if (isPlainObject$4(value)) return Object.values(value).some(subtreeHasDynamicReference);
8260
+ if (isPlainObject$5(value)) return Object.values(value).some(subtreeHasDynamicReference);
8246
8261
  return false;
8247
8262
  }
8248
8263
  function pathCrossesDottedKey(bag, path) {
@@ -8317,8 +8332,8 @@ function deepEqualJsonValue(a, b) {
8317
8332
  if (!Array.isArray(b) || a.length !== b.length) return false;
8318
8333
  return a.every((item, i) => deepEqualJsonValue(item, b[i]));
8319
8334
  }
8320
- if (isPlainObject$4(a)) {
8321
- if (!isPlainObject$4(b)) return false;
8335
+ if (isPlainObject$5(a)) {
8336
+ if (!isPlainObject$5(b)) return false;
8322
8337
  if (!hasPlainPrototype(a) || !hasPlainPrototype(b)) return false;
8323
8338
  const keys = Object.keys(a);
8324
8339
  if (keys.length !== Object.keys(b).length) return false;
@@ -8344,7 +8359,7 @@ function refuseUncertifiedSubtree(value, sourceLiterals, mark, seen = /* @__PURE
8344
8359
  for (const item of value) out.push(refuseUncertifiedSubtree(item, sourceLiterals, mark, seen));
8345
8360
  return out;
8346
8361
  }
8347
- if (isPlainObject$4(value) && hasPlainPrototype(value)) {
8362
+ if (isPlainObject$5(value) && hasPlainPrototype(value)) {
8348
8363
  const out = Object.create(null);
8349
8364
  seen.set(value, out);
8350
8365
  for (const [k, v] of Object.entries(value)) out[k] = refuseUncertifiedSubtree(v, sourceLiterals, mark, seen);
@@ -8372,7 +8387,7 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
8372
8387
  return mark ? POSITION_DECIDED : source;
8373
8388
  }
8374
8389
  if (!subtreeHasDynamicReference(source)) return bag;
8375
- if (isPlainObject$4(bag) && hasPlainPrototype(bag) && isPlainObject$4(source)) {
8390
+ if (isPlainObject$5(bag) && hasPlainPrototype(bag) && isPlainObject$5(source)) {
8376
8391
  const out = Object.create(null);
8377
8392
  for (const [k, v] of Object.entries(bag)) out[k] = Object.hasOwn(source, k) ? refuseUncertifiedReadbackPositions(v, source[k], secrets, failClosed, learn, mark) : v;
8378
8393
  return out;
@@ -8399,14 +8414,14 @@ function refuseUncertifiedReadbackPositions(bag, source, secrets, failClosed, le
8399
8414
  function isDistinguishingAnchor(value) {
8400
8415
  if (typeof value === "string") return value !== "";
8401
8416
  if (Array.isArray(value)) return value.some(isDistinguishingAnchor);
8402
- if (isPlainObject$4(value)) return Object.values(value).some(isDistinguishingAnchor);
8417
+ if (isPlainObject$5(value)) return Object.values(value).some(isDistinguishingAnchor);
8403
8418
  return false;
8404
8419
  }
8405
8420
  const ANCHOR_REFERENCE_MASK = "<ref>";
8406
8421
  function anchorSignature(source) {
8407
8422
  if (isDynamicReferenceString(source)) return ANCHOR_REFERENCE_MASK;
8408
8423
  if (Array.isArray(source)) return `[${source.map(anchorSignature).sort().join(",")}]`;
8409
- if (isPlainObject$4(source)) return `{${Object.keys(source).sort().map((k) => `${JSON.stringify(k)}:${anchorSignature(source[k])}`).join(",")}}`;
8424
+ if (isPlainObject$5(source)) return `{${Object.keys(source).sort().map((k) => `${JSON.stringify(k)}:${anchorSignature(source[k])}`).join(",")}}`;
8410
8425
  return JSON.stringify(source) ?? "undefined";
8411
8426
  }
8412
8427
  function anchorsCorroboratePairing(bag, source, anchors) {
@@ -8416,8 +8431,8 @@ function anchorsCorroboratePairing(bag, source, anchors) {
8416
8431
  return true;
8417
8432
  }
8418
8433
  if (isDynamicReferenceString(source)) return typeof bag === "string";
8419
- if (isPlainObject$4(source)) {
8420
- if (!isPlainObject$4(bag)) return false;
8434
+ if (isPlainObject$5(source)) {
8435
+ if (!isPlainObject$5(bag)) return false;
8421
8436
  return Object.keys(source).every((k) => Object.hasOwn(bag, k) && anchorsCorroboratePairing(bag[k], source[k], anchors));
8422
8437
  }
8423
8438
  if (Array.isArray(source)) {
@@ -8508,13 +8523,13 @@ function learnMixedLeafNeedle(collector, bag, source) {
8508
8523
  learnNeedle(collector, plaintext, token);
8509
8524
  }
8510
8525
  function asChild(marks, key) {
8511
- return isPlainObject$4(marks) && hasPlainPrototype(marks) ? marks[key] : void 0;
8526
+ return isPlainObject$5(marks) && hasPlainPrototype(marks) ? marks[key] : void 0;
8512
8527
  }
8513
8528
  function asIndex(marks, index) {
8514
8529
  return Array.isArray(marks) ? marks[index] : void 0;
8515
8530
  }
8516
8531
  function preferPositionDecisions(scanned, refused, bag, marks, inferred) {
8517
- if (isPlainObject$4(bag) && hasPlainPrototype(bag) && isPlainObject$4(refused) && isPlainObject$4(scanned)) {
8532
+ if (isPlainObject$5(bag) && hasPlainPrototype(bag) && isPlainObject$5(refused) && isPlainObject$5(scanned)) {
8518
8533
  const out = Object.create(null);
8519
8534
  for (const [k, v] of Object.entries(refused)) out[k] = preferPositionDecisions(scanned[k], v, bag[k], asChild(marks, k), inferred);
8520
8535
  return out;
@@ -8953,6 +8968,95 @@ function positionByIntrinsicFrame(bag, source, secrets, secretExpressions, bagIs
8953
8968
  }, bagIsSameGeneration);
8954
8969
  }
8955
8970
 
8971
+ //#endregion
8972
+ //#region src/deployment/secret-redaction/reference-provenance.ts
8973
+ const passProvenanceOf = /* @__PURE__ */ new WeakMap();
8974
+ const MAX_REFERENCE_VERSIONS = 8;
8975
+ function entryFor(secrets, token) {
8976
+ let table = passProvenanceOf.get(secrets);
8977
+ if (table === void 0) {
8978
+ table = /* @__PURE__ */ new Map();
8979
+ passProvenanceOf.set(secrets, table);
8980
+ }
8981
+ let entry = table.get(token);
8982
+ if (entry === void 0) {
8983
+ entry = {
8984
+ regions: /* @__PURE__ */ new Set(),
8985
+ regionUnknown: false,
8986
+ versions: /* @__PURE__ */ new Set(),
8987
+ versionUnknown: false,
8988
+ readVersions: /* @__PURE__ */ new Set()
8989
+ };
8990
+ table.set(token, entry);
8991
+ }
8992
+ return entry;
8993
+ }
8994
+ function recordReferenceResolution(secrets, token, resolution) {
8995
+ const entry = entryFor(secrets, token);
8996
+ if (resolution.region === void 0) entry.regionUnknown = true;
8997
+ else entry.regions.add(resolution.region);
8998
+ if (resolution.version === void 0) {
8999
+ entry.versionUnknown = true;
9000
+ return;
9001
+ }
9002
+ entry.versions.add(resolution.version);
9003
+ if (resolution.route === "read") entry.readVersions.add(resolution.version);
9004
+ }
9005
+ function recordReferenceProvenanceEntry(secrets, token, provenance, route) {
9006
+ const entry = entryFor(secrets, token);
9007
+ if (provenance.region === void 0) entry.regionUnknown = true;
9008
+ else entry.regions.add(provenance.region);
9009
+ if (provenance.versions === void 0 || provenance.versions.length === 0) {
9010
+ entry.versionUnknown = true;
9011
+ return;
9012
+ }
9013
+ for (const version of provenance.versions) {
9014
+ entry.versions.add(version);
9015
+ if (route === "read") entry.readVersions.add(version);
9016
+ }
9017
+ if (route === "literal") for (const version of provenance.readVersions ?? []) entry.readVersions.add(version);
9018
+ }
9019
+ function mergeReferenceProvenance(from, to) {
9020
+ const source = passProvenanceOf.get(from);
9021
+ if (source === void 0 || from === to) return;
9022
+ for (const [token, entry] of source) {
9023
+ const target = entryFor(to, token);
9024
+ for (const region of entry.regions) target.regions.add(region);
9025
+ target.regionUnknown ||= entry.regionUnknown;
9026
+ for (const version of entry.versions) target.versions.add(version);
9027
+ target.versionUnknown ||= entry.versionUnknown;
9028
+ for (const version of entry.readVersions) target.readVersions.add(version);
9029
+ }
9030
+ }
9031
+ function hasPassProvenance(secrets) {
9032
+ if (secrets === void 0) return false;
9033
+ const table = passProvenanceOf.get(secrets);
9034
+ return table !== void 0 && table.size > 0;
9035
+ }
9036
+ function passProvenanceFor(secrets, token) {
9037
+ if (secrets === void 0) return void 0;
9038
+ const entry = passProvenanceOf.get(secrets)?.get(token);
9039
+ if (entry === void 0) return void 0;
9040
+ return finalize(entry);
9041
+ }
9042
+ function finalize(entry) {
9043
+ const out = {};
9044
+ if (!entry.regionUnknown && entry.regions.size === 1) out.region = [...entry.regions][0];
9045
+ if (!entry.versionUnknown && entry.versions.size > 0 && entry.versions.size <= 8) {
9046
+ out.versions = [...entry.versions].sort();
9047
+ if (entry.readVersions.size > 0) out.readVersions = [...entry.readVersions].sort();
9048
+ }
9049
+ return out;
9050
+ }
9051
+ function snapshotPassProvenance(secrets) {
9052
+ if (secrets === void 0) return void 0;
9053
+ const table = passProvenanceOf.get(secrets);
9054
+ if (table === void 0 || table.size === 0) return void 0;
9055
+ const out = /* @__PURE__ */ new Map();
9056
+ for (const [token, entry] of table) out.set(token, finalize(entry));
9057
+ return out;
9058
+ }
9059
+
8956
9060
  //#endregion
8957
9061
  //#region src/deployment/secret-redaction/pairs.ts
8958
9062
  const resolvedPairsOf = /* @__PURE__ */ new WeakMap();
@@ -8973,6 +9077,7 @@ function recordResolvedPair(secrets, expression, plaintext) {
8973
9077
  }
8974
9078
  function mergeResolvedPairs(from, to) {
8975
9079
  carryMaskOnlyMarks(from, to);
9080
+ mergeReferenceProvenance(from, to);
8976
9081
  const pairs = resolvedPairsOf.get(from);
8977
9082
  if (pairs === void 0) return;
8978
9083
  for (const [expression, plaintext] of pairs) if (typeof plaintext === "string") recordResolvedPair(to, expression, plaintext);
@@ -9543,7 +9648,7 @@ function readsNoEchoSource(node, sources) {
9543
9648
  if (typeof argument === "string") return subStringReadsNoEcho(argument, void 0, sources);
9544
9649
  if (Array.isArray(argument)) {
9545
9650
  const [text, variables] = argument;
9546
- const vars = isPlainObject$4(variables) ? variables : void 0;
9651
+ const vars = isPlainObject$5(variables) ? variables : void 0;
9547
9652
  if (typeof text === "string" && subStringReadsNoEcho(text, vars, sources)) return true;
9548
9653
  return vars !== void 0 && Object.values(vars).some(walk);
9549
9654
  }
@@ -9577,7 +9682,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
9577
9682
  parameters: sources.parameters,
9578
9683
  ...sources.conditions !== void 0 && { conditions: sources.conditions }
9579
9684
  };
9580
- const isBareDeclaredGetAtt = (node) => isPlainObject$4(node) && intrinsicKeyOf(node) === "Fn::GetAtt" && getAttReadsNoEcho(node["Fn::GetAtt"], sources);
9685
+ const isBareDeclaredGetAtt = (node) => isPlainObject$5(node) && intrinsicKeyOf(node) === "Fn::GetAtt" && getAttReadsNoEcho(node["Fn::GetAtt"], sources);
9581
9686
  const walk = (source, value, path) => {
9582
9687
  if (value === void 0) return;
9583
9688
  if (source === null || typeof source !== "object") return;
@@ -9593,7 +9698,7 @@ function noEchoCoordinatesOf(template, resolved, sources, onCoordinate) {
9593
9698
  const record = source;
9594
9699
  const intrinsic = intrinsicKeyOf(record);
9595
9700
  if (intrinsic === void 0) {
9596
- if (!isPlainObject$4(value)) {
9701
+ if (!isPlainObject$5(value)) {
9597
9702
  if (readsNoEchoSource(record, parametersOnly)) push(path, source);
9598
9703
  return;
9599
9704
  }
@@ -9641,7 +9746,7 @@ function maskWholeValue(value) {
9641
9746
  if (value === null || value === void 0) return value;
9642
9747
  if (typeof value === "string" && isSingleDynamicReferenceToken(value)) return value;
9643
9748
  if (Array.isArray(value)) return value.map(maskWholeValue);
9644
- if (isPlainObject$4(value)) {
9749
+ if (isPlainObject$5(value)) {
9645
9750
  const out = {};
9646
9751
  for (const [key, child] of Object.entries(value)) Object.defineProperty(out, key, {
9647
9752
  value: maskWholeValue(child),
@@ -9664,7 +9769,7 @@ function readAt(bag, coordinate) {
9664
9769
  node = node[segment];
9665
9770
  continue;
9666
9771
  }
9667
- if (!isPlainObject$4(node) || !Object.hasOwn(node, segment)) return {
9772
+ if (!isPlainObject$5(node) || !Object.hasOwn(node, segment)) return {
9668
9773
  found: false,
9669
9774
  value: void 0
9670
9775
  };
@@ -9680,7 +9785,7 @@ function valueAtCoordinate(bag, coordinate) {
9680
9785
  }
9681
9786
  function cloneContainer(node) {
9682
9787
  if (Array.isArray(node)) return [...node];
9683
- if (isPlainObject$4(node)) return { ...node };
9788
+ if (isPlainObject$5(node)) return { ...node };
9684
9789
  return node;
9685
9790
  }
9686
9791
  function maskAtCoordinates(bag, coordinates) {
@@ -9747,20 +9852,20 @@ function readbackPathFor(readback, properties, coordinate) {
9747
9852
  if (!Array.isArray(live)) return path.length === 0 ? void 0 : path;
9748
9853
  const key = Array.isArray(desired) ? identityKeyFor(live, desired) : void 0;
9749
9854
  const element = Array.isArray(desired) ? desired[segment] : void 0;
9750
- if (key === void 0 || !isPlainObject$4(element)) return path;
9855
+ if (key === void 0 || !isPlainObject$5(element)) return path;
9751
9856
  const identity = element[key];
9752
- const index = live.findIndex((item) => isPlainObject$4(item) && item[key] === identity);
9857
+ const index = live.findIndex((item) => isPlainObject$5(item) && item[key] === identity);
9753
9858
  if (index < 0) return path;
9754
9859
  path.push(index);
9755
9860
  live = live[index];
9756
9861
  desired = element;
9757
9862
  continue;
9758
9863
  }
9759
- if (!isPlainObject$4(live)) return path.length === 0 ? void 0 : path;
9864
+ if (!isPlainObject$5(live)) return path.length === 0 ? void 0 : path;
9760
9865
  if (!Object.hasOwn(live, segment)) return void 0;
9761
9866
  path.push(segment);
9762
9867
  live = live[segment];
9763
- desired = isPlainObject$4(desired) ? desired[segment] : void 0;
9868
+ desired = isPlainObject$5(desired) ? desired[segment] : void 0;
9764
9869
  }
9765
9870
  return path;
9766
9871
  }
@@ -9789,7 +9894,7 @@ function witnessNormalize(stored, today, v11) {
9789
9894
  const confirmed = [];
9790
9895
  const differing = [];
9791
9896
  const walk = (s, t, v, path) => {
9792
- if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$4(v) ? !isPlainObject$4(s) : false)) {
9897
+ if (v !== "***" && containsMask(v) && (Array.isArray(v) ? !Array.isArray(s) || s.length !== v.length : isPlainObject$5(v) ? !isPlainObject$5(s) : false)) {
9793
9898
  if (s === void 0 || containsMask(s)) return s;
9794
9899
  if (jsonEqual(s, t)) {
9795
9900
  confirmed.push(path);
@@ -9818,8 +9923,8 @@ function witnessNormalize(stored, today, v11) {
9818
9923
  });
9819
9924
  return changed ? out : s;
9820
9925
  }
9821
- if (isPlainObject$4(v) && isPlainObject$4(s)) {
9822
- const tt = isPlainObject$4(t) ? t : {};
9926
+ if (isPlainObject$5(v) && isPlainObject$5(s)) {
9927
+ const tt = isPlainObject$5(t) ? t : {};
9823
9928
  let out;
9824
9929
  for (const key of Object.keys(v)) {
9825
9930
  if (!Object.hasOwn(s, key)) continue;
@@ -9842,7 +9947,7 @@ function witnessNormalize(stored, today, v11) {
9842
9947
  function containsMask(value) {
9843
9948
  if (value === "***") return true;
9844
9949
  if (Array.isArray(value)) return value.some(containsMask);
9845
- if (isPlainObject$4(value)) return Object.values(value).some(containsMask);
9950
+ if (isPlainObject$5(value)) return Object.values(value).some(containsMask);
9846
9951
  return false;
9847
9952
  }
9848
9953
  function jsonEqual(a, b) {
@@ -9886,7 +9991,7 @@ function noEchoComparison(options) {
9886
9991
  const out = node.map(walk);
9887
9992
  return out.some((item, i) => item !== node[i]) ? out : node;
9888
9993
  }
9889
- if (isPlainObject$4(node)) {
9994
+ if (isPlainObject$5(node)) {
9890
9995
  let out;
9891
9996
  for (const [key, child] of Object.entries(node)) {
9892
9997
  const next = walk(child);
@@ -11813,6 +11918,14 @@ const inFlightLookups = /* @__PURE__ */ new Map();
11813
11918
  function getCreateOnlyPropertyPaths(resourceType) {
11814
11919
  return lookupCreateOnlyPropertyPaths(resourceType, false);
11815
11920
  }
11921
+ function cachedCreateOnlyPropertyPaths(resourceType) {
11922
+ if (hasNoRegistrySchema(resourceType)) return Promise.resolve([]);
11923
+ if (inFlightLookups.has(resourceType)) return void 0;
11924
+ const cached = createOnlyPropertiesCache.get(resourceType);
11925
+ if (cached !== void 0) return cached;
11926
+ const snapshot = CREATE_ONLY_PATHS_SNAPSHOT.get(resourceType);
11927
+ return snapshot === void 0 ? void 0 : Promise.resolve(snapshot);
11928
+ }
11816
11929
  function prefetchCreateOnlyPropertyPaths(resourceTypes) {
11817
11930
  const started = [];
11818
11931
  for (const type of new Set(resourceTypes)) {
@@ -12765,7 +12878,7 @@ function probeFoundSameId(resourceType, a, b) {
12765
12878
  //#region src/provisioning/config-shape.ts
12766
12879
  function readConfigString(container, key, fallback, containerPath, options) {
12767
12880
  if (container === void 0 || container === null) return fallback;
12768
- if (!isPlainObject$3(container) || isUnresolvedIntrinsicContainer(container)) {
12881
+ if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) {
12769
12882
  const detail = malformedShapeDetail(container);
12770
12883
  if (options?.onUnusable) {
12771
12884
  const named = fallback === "" ? "" : ` (${fallback})`;
@@ -12805,7 +12918,7 @@ function requireConfigArray(value, path, options) {
12805
12918
  return value;
12806
12919
  }
12807
12920
  function requireConfigObject(value, path, options) {
12808
- if (!isPlainObject$3(value) || isUnresolvedIntrinsicContainer(value)) {
12921
+ if (!isPlainObject$4(value) || isUnresolvedIntrinsicContainer(value)) {
12809
12922
  const detail = malformedShapeDetail(value);
12810
12923
  if (options?.onUnusable) {
12811
12924
  options.onUnusable(`${path} must be an object ${detail}. Leaving this configuration unapplied here; the same value is REFUSED on a template-path create.`);
@@ -12817,7 +12930,7 @@ function requireConfigObject(value, path, options) {
12817
12930
  }
12818
12931
  function configStringRefusal(container, key, fallback, containerPath, options) {
12819
12932
  if (container === void 0 || container === null) return void 0;
12820
- if (!isPlainObject$3(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
12933
+ if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
12821
12934
  return configValueRefusal(container[key], fallback, `${containerPath}.${key}`, options);
12822
12935
  }
12823
12936
  function coerceCfnBoolean(value) {
@@ -12830,7 +12943,7 @@ function coerceCfnBoolean(value) {
12830
12943
  }
12831
12944
  function configBooleanRefusal(container, key, containerPath) {
12832
12945
  if (container === void 0 || container === null) return void 0;
12833
- if (!isPlainObject$3(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
12946
+ if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
12834
12947
  const value = container[key];
12835
12948
  if (value === void 0) return void 0;
12836
12949
  if (coerceCfnBoolean(value) !== void 0) return void 0;
@@ -12844,7 +12957,7 @@ function coerceCfnInteger(value) {
12844
12957
  }
12845
12958
  function configIntegerRefusal(container, key, containerPath, min, max) {
12846
12959
  if (container === void 0 || container === null) return void 0;
12847
- if (!isPlainObject$3(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
12960
+ if (!isPlainObject$4(container) || isUnresolvedIntrinsicContainer(container)) return `${containerPath} must be an object ${malformedShapeDetail(container)}`;
12848
12961
  const value = container[key];
12849
12962
  if (value === void 0) return void 0;
12850
12963
  const n = coerceCfnInteger(value);
@@ -12858,10 +12971,10 @@ function configValueRefusal(value, fallback, path, options) {
12858
12971
  if (typeof value !== "string" || value.trim() === "") return `${path} must be a non-empty string ${malformedShapeDetail(value)}`;
12859
12972
  }
12860
12973
  function malformedShapeDetail(value) {
12861
- if (isPlainObject$3(value) && isUnresolvedIntrinsicContainer(value)) return `(got ${describe(value)} — nothing substituted it before this call)`;
12974
+ if (isPlainObject$4(value) && isUnresolvedIntrinsicContainer(value)) return `(got ${describe(value)} — nothing substituted it before this call)`;
12862
12975
  return `(got ${describe(value)}) — check for an unresolved intrinsic or a mis-nested template value`;
12863
12976
  }
12864
- function isPlainObject$3(value) {
12977
+ function isPlainObject$4(value) {
12865
12978
  return typeof value === "object" && value !== null && !Array.isArray(value);
12866
12979
  }
12867
12980
  const NAMEABLE_INTRINSIC_KEYS = /* @__PURE__ */ new Set([
@@ -12888,7 +13001,7 @@ function describe(value) {
12888
13001
  if (value === null) return "null";
12889
13002
  if (Array.isArray(value)) return "an array";
12890
13003
  if (typeof value === "string") return value.trim() === "" ? "a blank string" : "a string";
12891
- if (isPlainObject$3(value) && isUnresolvedIntrinsicContainer(value)) {
13004
+ if (isPlainObject$4(value) && isUnresolvedIntrinsicContainer(value)) {
12892
13005
  const key = Object.keys(value)[0];
12893
13006
  return NAMEABLE_INTRINSIC_KEYS.has(key) ? `an unresolved ${key} intrinsic` : "an unresolved intrinsic";
12894
13007
  }
@@ -17778,7 +17891,7 @@ function maskedPropertyFingerprint(templateValue) {
17778
17891
  return `${FINGERPRINT_PREFIX}${digest}`;
17779
17892
  }
17780
17893
  var UnknownInput = class extends Error {};
17781
- function isPlainObject$2(value) {
17894
+ function isPlainObject$3(value) {
17782
17895
  return value !== null && typeof value === "object" && !Array.isArray(value);
17783
17896
  }
17784
17897
  const DYNAMIC_REFERENCE_OPEN = "{{resolve:";
@@ -17798,7 +17911,7 @@ function carriesSecretValue(value, corpora) {
17798
17911
  return false;
17799
17912
  }
17800
17913
  function parameterInputsFor(args) {
17801
- const declared = isPlainObject$2(args.template.Parameters) ? args.template.Parameters : {};
17914
+ const declared = isPlainObject$3(args.template.Parameters) ? args.template.Parameters : {};
17802
17915
  const values = args.values ?? {};
17803
17916
  const inputs = /* @__PURE__ */ new Map();
17804
17917
  const bound = {};
@@ -17809,7 +17922,7 @@ function parameterInputsFor(args) {
17809
17922
  continue;
17810
17923
  }
17811
17924
  const value = values[name];
17812
- let secret = isPlainObject$2(definition) && declaresNoEcho(definition) || carriesSecretValue(value, []);
17925
+ let secret = isPlainObject$3(definition) && declaresNoEcho(definition) || carriesSecretValue(value, []);
17813
17926
  if (!secret && args.nestedChild === true && args.supplied !== void 0) {
17814
17927
  if (Object.hasOwn(args.supplied, name)) {
17815
17928
  const passed = args.passedClasses?.get(name);
@@ -17860,7 +17973,7 @@ function intrinsicKey(value) {
17860
17973
  const OPAQUE_ATTRIBUTE_TYPES = /* @__PURE__ */ new Set(["AWS::CloudFormation::CustomResource", NESTED_STACK_TYPE$4]);
17861
17974
  function hasOpaqueAttributes(logicalId, walk) {
17862
17975
  const definition = walk.resources[logicalId];
17863
- const type = isPlainObject$2(definition) ? definition["Type"] : void 0;
17976
+ const type = isPlainObject$3(definition) ? definition["Type"] : void 0;
17864
17977
  return typeof type === "string" && (type.startsWith("Custom::") || OPAQUE_ATTRIBUTE_TYPES.has(type));
17865
17978
  }
17866
17979
  function getAttTarget(operand) {
@@ -17885,7 +17998,7 @@ function taintOf(logicalId, walk) {
17885
17998
  const visit = (value) => {
17886
17999
  if (typeof value === "string") return value.includes(DYNAMIC_REFERENCE_OPEN);
17887
18000
  if (Array.isArray(value)) return value.some(visit);
17888
- if (!isPlainObject$2(value)) return false;
18001
+ if (!isPlainObject$3(value)) return false;
17889
18002
  const key = intrinsicKey(value);
17890
18003
  const operand = key === void 0 ? void 0 : value[key];
17891
18004
  let verdict = "clean";
@@ -17897,7 +18010,7 @@ function taintOf(logicalId, walk) {
17897
18010
  else if (key === "Fn::FindInMap" && mapReadClass(operand, walk.sources.template) !== "clean") verdict = "tainted";
17898
18011
  else if (key === "Fn::Sub") {
17899
18012
  const text = Array.isArray(operand) ? operand[0] : operand;
17900
- const vars = Array.isArray(operand) && isPlainObject$2(operand[1]) ? operand[1] : {};
18013
+ const vars = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
17901
18014
  if (typeof text === "string") for (const name of subPlaceholders(text)) {
17902
18015
  if (Object.hasOwn(vars, name)) continue;
17903
18016
  const owner = name.includes(".") ? name.split(".")[0] : name;
@@ -17911,7 +18024,7 @@ function taintOf(logicalId, walk) {
17911
18024
  return Object.values(value).some(visit);
17912
18025
  };
17913
18026
  const definition = walk.resources[logicalId];
17914
- const result = visit(isPlainObject$2(definition) ? definition["Properties"] : void 0) ? "tainted" : unknown ? "unknown" : "clean";
18027
+ const result = visit(isPlainObject$3(definition) ? definition["Properties"] : void 0) ? "tainted" : unknown ? "unknown" : "clean";
17915
18028
  walk.inProgress.delete(logicalId);
17916
18029
  walk.taint.set(logicalId, result);
17917
18030
  return result;
@@ -17927,7 +18040,7 @@ function conditionInput(name, walk) {
17927
18040
  return typeof verdict === "boolean" ? verdict : "unknown";
17928
18041
  }
17929
18042
  function conditionClosure(name, walk) {
17930
- const definitions = isPlainObject$2(walk.sources.template.Conditions) ? walk.sources.template.Conditions : {};
18043
+ const definitions = isPlainObject$3(walk.sources.template.Conditions) ? walk.sources.template.Conditions : {};
17931
18044
  let secret = false;
17932
18045
  let unknown = false;
17933
18046
  let unread = false;
@@ -17942,7 +18055,7 @@ function conditionClosure(name, walk) {
17942
18055
  value.forEach(visit);
17943
18056
  return;
17944
18057
  }
17945
- if (!isPlainObject$2(value)) return;
18058
+ if (!isPlainObject$3(value)) return;
17946
18059
  const keys = Object.keys(value);
17947
18060
  if (keys.length === 1 && keys[0] === "Condition" && typeof value["Condition"] === "string") {
17948
18061
  pending.push(value["Condition"]);
@@ -17975,7 +18088,7 @@ function conditionClosure(name, walk) {
17975
18088
  if (key === "Fn::Sub") {
17976
18089
  const operand = value["Fn::Sub"];
17977
18090
  const text = Array.isArray(operand) ? operand[0] : operand;
17978
- const vars = Array.isArray(operand) && isPlainObject$2(operand[1]) ? operand[1] : {};
18091
+ const vars = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
17979
18092
  if (typeof text === "string") for (const name of subPlaceholders(text)) {
17980
18093
  if (Object.hasOwn(vars, name)) continue;
17981
18094
  if (name.includes(".") && !name.startsWith("AWS::")) secret = true;
@@ -18004,8 +18117,8 @@ function mapReadClass(operand, template) {
18004
18117
  const mapName = Array.isArray(operand) ? operand[0] : void 0;
18005
18118
  if (typeof mapName !== "string") return "unknown";
18006
18119
  const mappings = template.Mappings;
18007
- const map = isPlainObject$2(mappings) && Object.hasOwn(mappings, mapName) ? mappings[mapName] : void 0;
18008
- if (!isPlainObject$2(map)) return "unknown";
18120
+ const map = isPlainObject$3(mappings) && Object.hasOwn(mappings, mapName) ? mappings[mapName] : void 0;
18121
+ if (!isPlainObject$3(map)) return "unknown";
18009
18122
  return carriesSecretValue(map, []) ? "secret" : "clean";
18010
18123
  }
18011
18124
  async function resolvedInput(node, walk) {
@@ -18073,7 +18186,7 @@ async function inputForm(value, walk) {
18073
18186
  concrete: parts.every((p) => p.concrete)
18074
18187
  };
18075
18188
  }
18076
- if (!isPlainObject$2(value)) return {
18189
+ if (!isPlainObject$3(value)) return {
18077
18190
  form: value,
18078
18191
  concrete: true
18079
18192
  };
@@ -18136,7 +18249,7 @@ async function inputForm(value, walk) {
18136
18249
  concrete: false
18137
18250
  };
18138
18251
  }
18139
- const explicit = Array.isArray(operand) && isPlainObject$2(operand[1]) ? operand[1] : {};
18252
+ const explicit = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
18140
18253
  const vars = await inputForm(explicit, walk);
18141
18254
  const placeholders = [];
18142
18255
  let concrete = vars.concrete && !text.includes(DYNAMIC_REFERENCE_OPEN);
@@ -18189,8 +18302,8 @@ function newWalk(sources, nested = {
18189
18302
  }) {
18190
18303
  return {
18191
18304
  sources,
18192
- resources: isPlainObject$2(sources.template.Resources) ? sources.template.Resources : {},
18193
- parameters: isPlainObject$2(sources.template.Parameters) ? sources.template.Parameters : {},
18305
+ resources: isPlainObject$3(sources.template.Resources) ? sources.template.Resources : {},
18306
+ parameters: isPlainObject$3(sources.template.Parameters) ? sources.template.Parameters : {},
18194
18307
  taint: /* @__PURE__ */ new Map(),
18195
18308
  inProgress: /* @__PURE__ */ new Set(),
18196
18309
  stackChain: nested.stackChain,
@@ -18214,34 +18327,34 @@ function passedKey(passed) {
18214
18327
  function isNestedStackRow(logicalId, walk) {
18215
18328
  if (!Object.hasOwn(walk.resources, logicalId)) return false;
18216
18329
  const definition = walk.resources[logicalId];
18217
- return isPlainObject$2(definition) && definition["Type"] === NESTED_STACK_TYPE$4;
18330
+ return isPlainObject$3(definition) && definition["Type"] === NESTED_STACK_TYPE$4;
18218
18331
  }
18219
18332
  function getAttAttribute(operand, target) {
18220
18333
  if (Array.isArray(operand)) return operand.length === 2 && typeof operand[1] === "string" ? operand[1] : void 0;
18221
18334
  return typeof operand === "string" ? operand.slice(target.length + 1) : void 0;
18222
18335
  }
18223
18336
  function rowParameters(definition) {
18224
- const properties = isPlainObject$2(definition) ? definition["Properties"] : void 0;
18337
+ const properties = isPlainObject$3(definition) ? definition["Properties"] : void 0;
18225
18338
  if (properties === void 0) return {};
18226
- if (!isPlainObject$2(properties)) return "unknown";
18339
+ if (!isPlainObject$3(properties)) return "unknown";
18227
18340
  const parameters = properties["Parameters"];
18228
18341
  if (parameters === void 0) return {};
18229
- if (!isPlainObject$2(parameters) || intrinsicKey(parameters) !== void 0) return "unknown";
18342
+ if (!isPlainObject$3(parameters) || intrinsicKey(parameters) !== void 0) return "unknown";
18230
18343
  return parameters;
18231
18344
  }
18232
18345
  function childParameterInputs(template, passed) {
18233
- const declared = isPlainObject$2(template.Parameters) ? template.Parameters : {};
18346
+ const declared = isPlainObject$3(template.Parameters) ? template.Parameters : {};
18234
18347
  const inputs = /* @__PURE__ */ new Map();
18235
18348
  for (const name of Object.keys(declared)) {
18236
18349
  const definition = declared[name];
18237
- if (isPlainObject$2(definition) && declaresNoEcho(definition)) inputs.set(name, { kind: "secret" });
18350
+ if (isPlainObject$3(definition) && declaresNoEcho(definition)) inputs.set(name, { kind: "secret" });
18238
18351
  else if (passed.has(name)) {
18239
18352
  const passedClass = passed.get(name);
18240
18353
  inputs.set(name, passedClass === "clean" ? {
18241
18354
  kind: "value",
18242
18355
  value: void 0
18243
18356
  } : passedClass === "unknown" ? { kind: "unknown" } : { kind: "secret" });
18244
- } else if (isPlainObject$2(definition) && Object.hasOwn(definition, "Default") && !carriesSecretValue(definition["Default"], [])) inputs.set(name, {
18357
+ } else if (isPlainObject$3(definition) && Object.hasOwn(definition, "Default") && !carriesSecretValue(definition["Default"], [])) inputs.set(name, {
18245
18358
  kind: "value",
18246
18359
  value: definition["Default"]
18247
18360
  });
@@ -18258,7 +18371,7 @@ function closureClass(closure) {
18258
18371
  return closure.unread ? "unread" : "clean";
18259
18372
  }
18260
18373
  async function childOutputClass(loaded, outputName, passed, chain, shared) {
18261
- if (loaded === void 0 || !isPlainObject$2(loaded.template)) return "unknown";
18374
+ if (loaded === void 0 || !isPlainObject$3(loaded.template)) return "unknown";
18262
18375
  const scopeKey = JSON.stringify([loaded.identity, passedKey(passed)]);
18263
18376
  const memoKey = JSON.stringify([scopeKey, outputName]);
18264
18377
  const memo = shared.outputs.get(memoKey);
@@ -18271,8 +18384,8 @@ async function classifyChildOutput(loaded, outputName, passed, chain, shared, sc
18271
18384
  if (++shared.steps > MAX_NESTED_OUTPUT_STEPS) return "unknown";
18272
18385
  if (chain.includes(loaded.identity) || chain.length >= MAX_NESTED_OUTPUT_DEPTH) return "unknown";
18273
18386
  const template = loaded.template;
18274
- const output = (isPlainObject$2(template.Outputs) ? template.Outputs : {})[outputName];
18275
- if (!isPlainObject$2(output) || !Object.hasOwn(output, "Value")) return "unknown";
18387
+ const output = (isPlainObject$3(template.Outputs) ? template.Outputs : {})[outputName];
18388
+ if (!isPlainObject$3(output) || !Object.hasOwn(output, "Value")) return "unknown";
18276
18389
  const scope = {
18277
18390
  walk: newWalk({
18278
18391
  template,
@@ -18344,7 +18457,7 @@ async function expressionClass(value, scope) {
18344
18457
  return result;
18345
18458
  };
18346
18459
  if (Array.isArray(value)) return all(value);
18347
- if (!isPlainObject$2(value)) return "clean";
18460
+ if (!isPlainObject$3(value)) return "clean";
18348
18461
  const key = intrinsicKey(value);
18349
18462
  if (key === void 0) return all(Object.values(value));
18350
18463
  const operand = value[key];
@@ -18359,7 +18472,7 @@ async function expressionClass(value, scope) {
18359
18472
  case "Fn::Sub": {
18360
18473
  const text = Array.isArray(operand) ? operand[0] : operand;
18361
18474
  if (typeof text !== "string") return worseOf("unknown", await expressionClass(operand, scope));
18362
- const vars = Array.isArray(operand) && isPlainObject$2(operand[1]) ? operand[1] : {};
18475
+ const vars = Array.isArray(operand) && isPlainObject$3(operand[1]) ? operand[1] : {};
18363
18476
  let result = text.includes(DYNAMIC_REFERENCE_OPEN) ? "secret" : "clean";
18364
18477
  result = worseOf(result, await all(Object.values(vars)));
18365
18478
  for (const name of subPlaceholders(text)) {
@@ -18437,7 +18550,7 @@ async function classifyPassedParameters(parameters, sources) {
18437
18550
  }
18438
18551
  async function classifyPassed(parameters, sources, nested) {
18439
18552
  const classes = /* @__PURE__ */ new Map();
18440
- if (!isPlainObject$2(parameters)) return classes;
18553
+ if (!isPlainObject$3(parameters)) return classes;
18441
18554
  for (const [name, expression] of Object.entries(parameters)) {
18442
18555
  let passedClass;
18443
18556
  try {
@@ -18478,7 +18591,7 @@ function possiblyMaskedKeys(resolvedProps, corpora) {
18478
18591
  const wholeShortLeaf = (value) => {
18479
18592
  if (typeof value === "string") return short.includes(value);
18480
18593
  if (Array.isArray(value)) return value.some(wholeShortLeaf);
18481
- if (isPlainObject$2(value)) return Object.values(value).some(wholeShortLeaf);
18594
+ if (isPlainObject$3(value)) return Object.values(value).some(wholeShortLeaf);
18482
18595
  return false;
18483
18596
  };
18484
18597
  return Object.keys(resolvedProps).filter((key) => {
@@ -18509,7 +18622,7 @@ function maskedPropertyFingerprintsOf(record) {
18509
18622
  const read = /* @__PURE__ */ new Map();
18510
18623
  if (record === null || typeof record !== "object") return read;
18511
18624
  const field = record.maskedPropertyFingerprints;
18512
- if (!isPlainObject$2(field)) return read;
18625
+ if (!isPlainObject$3(field)) return read;
18513
18626
  for (const [key, value] of Object.entries(field)) if (typeof value === "string" && value.startsWith(FINGERPRINT_PREFIX)) read.set(key, value);
18514
18627
  return read;
18515
18628
  }
@@ -18517,7 +18630,7 @@ function maskedPropertyInputFingerprintsOf(record) {
18517
18630
  const read = /* @__PURE__ */ new Map();
18518
18631
  if (record === null || typeof record !== "object") return read;
18519
18632
  const field = record.maskedPropertyInputFingerprints;
18520
- if (!isPlainObject$2(field)) return read;
18633
+ if (!isPlainObject$3(field)) return read;
18521
18634
  const text = maskedPropertyFingerprintsOf(record);
18522
18635
  for (const [key, value] of Object.entries(field)) {
18523
18636
  if (typeof value !== "string" || !value.startsWith(INPUT_FINGERPRINT_PREFIX)) continue;
@@ -18564,7 +18677,7 @@ async function movedMaskedProperties(record, templateProps, fingerprinter, onReb
18564
18677
  function withRebaselinedFingerprints(record, fingerprints) {
18565
18678
  const text = maskedPropertyFingerprintsOf(record);
18566
18679
  const field = record.maskedPropertyInputFingerprints;
18567
- const next = isPlainObject$2(field) ? Object.entries(field) : [];
18680
+ const next = isPlainObject$3(field) ? Object.entries(field) : [];
18568
18681
  let changed = false;
18569
18682
  for (const [key, value] of Object.entries(fingerprints)) {
18570
18683
  if (text.get(key) !== splitInputFingerprint(value).text) continue;
@@ -18597,10 +18710,10 @@ function withMaskedPropertyFingerprints(scrubbed, writtenBag, templateProps, sec
18597
18710
  fingerprints = maskedPropertyFingerprintsFor(scrubbed.properties, templateProps);
18598
18711
  inputs = boundInputFingerprints(fingerprints, inputFingerprints);
18599
18712
  } else {
18600
- if (!isPlainObject$2(previous)) return scrubbed;
18713
+ if (!isPlainObject$3(previous)) return scrubbed;
18601
18714
  if (corpora.length === 0) return scrubbed;
18602
18715
  fingerprints = { ...previous };
18603
- inputs = isPlainObject$2(previousInputs) ? { ...previousInputs } : void 0;
18716
+ inputs = isPlainObject$3(previousInputs) ? { ...previousInputs } : void 0;
18604
18717
  }
18605
18718
  if (fingerprints !== void 0 && corpora.length > 0) {
18606
18719
  const refused = Object.keys(fingerprints).filter((key) => Object.hasOwn(templateProps, key) && corpora.some((corpus) => templateCarriesNeedle(templateProps[key], corpus)));
@@ -20026,6 +20139,17 @@ function recordProducerSecretPairs(logicalId, value, context) {
20026
20139
  if (bag === void 0 || context.producerSecrets === void 0) return;
20027
20140
  const producer = context.producerSecrets(logicalId);
20028
20141
  if (producer === void 0 || producer === bag || producer.size === 0) return;
20142
+ if (hasPassProvenance(producer)) {
20143
+ const served = [...wholeStringLeavesOf(value)];
20144
+ for (const [plaintext, expression] of producer) {
20145
+ if (plaintext.length < 4 || !expression.startsWith("{{resolve:")) continue;
20146
+ if (!served.some((leaf) => leaf.includes(plaintext))) continue;
20147
+ const entry = passProvenanceFor(producer, expression);
20148
+ if (entry === void 0) continue;
20149
+ recordReferenceProvenanceEntry(bag, expression, entry, "read");
20150
+ if (context.provenanceSink !== void 0) recordReferenceProvenanceEntry(context.provenanceSink, expression, entry, "read");
20151
+ }
20152
+ }
20029
20153
  const preRun = context.producerPreRunPhysicalId?.(logicalId);
20030
20154
  const record = Object.hasOwn(context.resources, logicalId) ? context.resources[logicalId] : void 0;
20031
20155
  if (typeof preRun !== "string" || record?.physicalId !== preRun) return;
@@ -20058,6 +20182,7 @@ async function reresolveRecordedReferences(value, logicalId, context, origin, so
20058
20182
  return value;
20059
20183
  }
20060
20184
  if (!await this.referencesMatchPhysicalId(value, logicalId, context)) {
20185
+ if (context.provenanceCapture) return value;
20061
20186
  this.logger.warn(safeMsg`Serving ${this.displayMasked(origin, context)} as recorded, with its {{resolve:...}} reference(s) unresolved: cdkd cannot confirm the secret still holds the value ${this.displayMasked(logicalId, context)} was deployed with, because its physical id does not contain it. Either the secret changed since then (update ${this.displayMasked(logicalId, context)} so cdkd deploys it with the new value), or the value is not part of its name (a custom resource's Data, a name shorter than four characters), and cdkd sends the recorded reference as before.`);
20062
20187
  return value;
20063
20188
  }
@@ -20345,7 +20470,10 @@ async function reresolveCrossStackValue(value, producerRegion, context, origin,
20345
20470
  }
20346
20471
  if (!carriesDynamicReference(value)) return value;
20347
20472
  const resolver = this.resolverForProducerRegion(producerRegion, context, producerRegionLogText);
20348
- const pinnedContext = producerRegion ? withoutProducerRegions(context) : context;
20473
+ const pinnedContext = {
20474
+ ...producerRegion ? withoutProducerRegions(context) : context,
20475
+ provenanceRoute: "read"
20476
+ };
20349
20477
  const walk = async (v) => {
20350
20478
  if (typeof v === "string") return v.includes("{{resolve:") ? await resolver.resolveDynamicReferences(v, pinnedContext) : v;
20351
20479
  if (Array.isArray(v)) {
@@ -21147,6 +21275,16 @@ async function getCrossAccountStackState(roleArn, stackName, region, context) {
21147
21275
  function secretVerdictScope(resolver) {
21148
21276
  return injectiveKey(credentialFingerprint(ambientCredentialConfig()), canonicalizeRegion(resolver.explicitRegion) ?? "");
21149
21277
  }
21278
+ function recordProvenanceOfResolution(resolver, context, token, version) {
21279
+ if (context === void 0) return;
21280
+ const resolution = {
21281
+ region: canonicalizeRegion(resolver.explicitRegion),
21282
+ version,
21283
+ route: context.provenanceRoute ?? "literal"
21284
+ };
21285
+ if (context.recordedSecretValues !== void 0) recordReferenceResolution(context.recordedSecretValues, token, resolution);
21286
+ if (context.provenanceSink !== void 0) recordReferenceResolution(context.provenanceSink, token, resolution);
21287
+ }
21150
21288
  async function resolveDynamicReferences(value, context) {
21151
21289
  return (await this.resolveDynamicReferencesWithLogTwin(value, value, context, void 0, true)).result;
21152
21290
  }
@@ -21214,6 +21352,7 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
21214
21352
  recorded.set(cached.value, fullMatch);
21215
21353
  recordResolvedPair(recorded, fullMatch, cached.value);
21216
21354
  }
21355
+ if (cached.secret && cached.value) recordProvenanceOfResolution(this, context, fullMatch, cached.version);
21217
21356
  if (service === "ssm" && !cached.secret && recorded && !this.producerRegionGuest) recordProvenPublicExpression(recorded, fullMatch, cached.value);
21218
21357
  result = result.replace(fullMatch, () => cached.value);
21219
21358
  twin = twin.replace(fullMatch, () => cached.secret && cached.value ? "***" : cached.value);
@@ -21229,8 +21368,12 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
21229
21368
  let isSecret = isKnownSecret;
21230
21369
  let cacheable = true;
21231
21370
  let pinSecureVerdict = false;
21232
- if (service === "secretsmanager") resolved = await this.resolveSecretsManagerReference(inner, context, nameLogText);
21233
- else if (service === "ssm") {
21371
+ let resolvedVersion;
21372
+ if (service === "secretsmanager") {
21373
+ const versionOut = {};
21374
+ resolved = await this.resolveSecretsManagerReference(inner, context, nameLogText, versionOut);
21375
+ resolvedVersion = versionOut.version;
21376
+ } else if (service === "ssm") {
21234
21377
  const decrypt = context?.skipDynamicReferences !== true;
21235
21378
  const param = await this.resolveSSMReference(parts, decrypt, "ssm", context, nameLogText);
21236
21379
  const proofBag = context?.recordedSecretValues;
@@ -21253,11 +21396,13 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
21253
21396
  }
21254
21397
  }
21255
21398
  resolved = param.value;
21399
+ resolvedVersion = param.version;
21256
21400
  } else if (service === "ssm-secure") {
21257
21401
  const param = await this.resolveSSMReference(parts, true, "ssm-secure", context, nameLogText);
21258
21402
  if (!param.secure) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Refusing to resolve ${this.displayMasked(tokenLogText, context)}: the parameter is a ${param.type} parameter, and the ssm-secure spelling is defined for SecureString parameters only. Reference it as {{resolve:ssm:...}} if it is public configuration.`));
21259
21403
  isSecret = true;
21260
21404
  resolved = param.value;
21405
+ resolvedVersion = param.version;
21261
21406
  } else {
21262
21407
  if (!persistedText && this.tokenAssembledFromSecret(fullMatch, tokenLogText, context)) throw markNonRetryable(new IntrinsicResolutionRefusalError(`Refusing to resolve ${this.displayMasked(tokenLogText, context)}: its service is not one cdkd resolves (secretsmanager, ssm, ssm-secure), and the reference was assembled from a secret value, so leaving it as written would send that value to AWS and record it in state in the clear.`));
21263
21408
  this.logger.warn(this.displayMasked(`Unsupported dynamic reference service: ${this.displayMasked(nameLogText(String(service)), context)}`, context));
@@ -21268,7 +21413,8 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
21268
21413
  if (pinSecureVerdict) this.pinSecretVerdict(fullMatch, true, verdictScope);
21269
21414
  if (cacheable) this.cachedDynamicReferences.set(dynamicReferenceCacheKey, {
21270
21415
  value: resolved,
21271
- secret: isSecret
21416
+ secret: isSecret,
21417
+ ...resolvedVersion !== void 0 && { version: resolvedVersion }
21272
21418
  });
21273
21419
  if (isSecret && resolved) {
21274
21420
  const recorded = context?.recordedSecretValues;
@@ -21276,6 +21422,7 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
21276
21422
  recorded.set(resolved, fullMatch);
21277
21423
  recordResolvedPair(recorded, fullMatch, resolved);
21278
21424
  }
21425
+ recordProvenanceOfResolution(this, context, fullMatch, resolvedVersion);
21279
21426
  if (service === "secretsmanager" || service === "ssm-secure") this.pinSecretVerdict(fullMatch, true, verdictScope);
21280
21427
  }
21281
21428
  result = result.replace(fullMatch, () => resolved);
@@ -21312,7 +21459,7 @@ async function resolveDynamicReferencesWithLogTwin(value, logTwin, context, inhe
21312
21459
 
21313
21460
  //#endregion
21314
21461
  //#region src/deployment/intrinsic-resolver/dynamic-ref-lookups.ts
21315
- async function resolveSecretsManagerReference(inner, context, nameLogText) {
21462
+ async function resolveSecretsManagerReference(inner, context, nameLogText, versionOut) {
21316
21463
  const afterService = inner.substring(15);
21317
21464
  let secretId;
21318
21465
  let jsonKey = "";
@@ -21350,11 +21497,13 @@ async function resolveSecretsManagerReference(inner, context, nameLogText) {
21350
21497
  ...versionStage && versionStage !== "" && { VersionStage: versionStage },
21351
21498
  ...versionId && versionId !== "" && { VersionId: versionId }
21352
21499
  });
21353
- const secretString = (await this.sendWithThrottleRetry(() => client.send(command), `secretsmanager:${loggedSecretId}`, this.namedRequestMasks([
21500
+ const response = await this.sendWithThrottleRetry(() => client.send(command), `secretsmanager:${loggedSecretId}`, this.namedRequestMasks([
21354
21501
  [secretId, loggedSecretId],
21355
21502
  [versionStage, this.displayMasked(nameLogText(versionStage), context)],
21356
21503
  [versionId, this.displayMasked(nameLogText(versionId), context)]
21357
- ], context))).SecretString;
21504
+ ], context));
21505
+ const secretString = response.SecretString;
21506
+ if (versionOut !== void 0 && typeof response.VersionId === "string") versionOut.version = response.VersionId;
21358
21507
  if (!secretString) throw markNonRetryable(/* @__PURE__ */ new Error(`Dynamic reference: secret ${quotedRender(loggedSecretId, "'")} does not contain a SecretString value`));
21359
21508
  if (jsonKey) try {
21360
21509
  const parsed = JSON.parse(secretString);
@@ -21399,10 +21548,12 @@ async function resolveSSMReference(parts, decrypt, service, context, nameLogText
21399
21548
  const reported = paramType === void 0 ? "(absent)" : quotedRender(this.displayMasked(String(paramType), context), "'");
21400
21549
  this.logger.warn(`SSM parameter ${quotedRender(loggedParameterName, "'")} reported an unrecognized Type ${reported} — treating its value as a secret, so cdkd will persist the {{resolve:${service}:...}} expression rather than the resolved value. Declare the parameter as String / StringList if it is public config.`);
21401
21550
  }
21551
+ const paramVersion = response.Parameter?.Version;
21402
21552
  return {
21403
21553
  value: paramValue,
21404
21554
  secure,
21405
- type: paramType
21555
+ type: paramType,
21556
+ ...typeof paramVersion === "number" && Number.isSafeInteger(paramVersion) && { version: String(paramVersion) }
21406
21557
  };
21407
21558
  }
21408
21559
 
@@ -22401,7 +22552,10 @@ function recordInheritedParameterSecrets(parameterName, value, context) {
22401
22552
  if (inherited && recorded) recordInheritedNoEchoListElements(this, inherited, recorded, value, context);
22402
22553
  if (!inherited || inherited.size === 0 || !recorded) return;
22403
22554
  for (const [plaintext, expression] of inheritedSecretsCarriedBy(value, inherited)) {
22404
- recorded.set(plaintext, carriedExpressionFor(inherited, parameterName, value, plaintext, expression));
22555
+ const carried = carriedExpressionFor(inherited, parameterName, value, plaintext, expression);
22556
+ recorded.set(plaintext, carried);
22557
+ const parentEntry = context.inheritedReferenceProvenance?.get(carried);
22558
+ if (parentEntry !== void 0) recordReferenceProvenanceEntry(recorded, carried, parentEntry, "read");
22405
22559
  recordInheritedParameterRead(recorded, inherited, parameterName);
22406
22560
  carryFreshNoEchoMark(inherited, recorded, plaintext);
22407
22561
  }
@@ -24274,8 +24428,8 @@ function compare(desired, previous, mask) {
24274
24428
  if (!Array.isArray(desired) || desired.length !== previous.length) return "differs";
24275
24429
  return combine(previous.map((item, i) => compare(desired[i], item, mask)));
24276
24430
  }
24277
- if (isPlainObject$1(previous)) {
24278
- if (!isPlainObject$1(desired)) return "differs";
24431
+ if (isPlainObject$2(previous)) {
24432
+ if (!isPlainObject$2(desired)) return "differs";
24279
24433
  if (!Object.keys(desired).every((k) => Object.prototype.hasOwnProperty.call(previous, k))) return "differs";
24280
24434
  return combine(Object.keys(previous).map((k) => compare(desired[k], previous[k], mask)));
24281
24435
  }
@@ -24301,7 +24455,7 @@ function resolvesReference(desired, previous, mask) {
24301
24455
  const pattern = literals.map(escapeRegExp$1).join("[\\s\\S]*");
24302
24456
  return new RegExp(`^${pattern}$`).test(desired);
24303
24457
  }
24304
- function isPlainObject$1(value) {
24458
+ function isPlainObject$2(value) {
24305
24459
  return typeof value === "object" && value !== null && !Array.isArray(value);
24306
24460
  }
24307
24461
  function escapeRegExp$1(text) {
@@ -25092,7 +25246,7 @@ var CloudControlProvider = class {
25092
25246
  const indeterminateGuard = await this.confirmDeleteTargetIdentity(logicalId, resourceType, physicalId, context);
25093
25247
  if (context?.removeProtection === true && resourceType === "AWS::AutoScaling::AutoScalingGroup") {
25094
25248
  this.logger.debug(`Delegating protected AutoScalingGroup ${logicalId} delete to the SDK ASGProvider (Cloud Control cannot force-delete a protected ASG)`);
25095
- const { ASGProvider } = await import("./asg-provider-B8N6UPAH.js");
25249
+ const { ASGProvider } = await import("./asg-provider-CGN1a3d3.js");
25096
25250
  const delegateRegion = ambientRegion();
25097
25251
  let asgProvider = this.asgDeleteDelegates.get(delegateRegion);
25098
25252
  if (asgProvider === void 0) {
@@ -25198,7 +25352,7 @@ var CloudControlProvider = class {
25198
25352
  const family = SDK_DELETE_FAMILIES.get(resourceType);
25199
25353
  const cached = this.sdkDeleteDelegates.get(family);
25200
25354
  if (cached !== void 0 && cached.region === ccRegion) return cached.provider;
25201
- const provider = family === "rds" ? new (await (import("./rds-provider-BdUme0V8.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-D3Qcci3J.js"))).NeptuneProvider({ region: ccRegion });
25355
+ const provider = family === "rds" ? new (await (import("./rds-provider-BO3U39K0.js"))).RDSProvider({ region: ccRegion }) : new (await (import("./neptune-provider-CR19ID_J.js"))).NeptuneProvider({ region: ccRegion });
25202
25356
  this.sdkDeleteDelegates.set(family, {
25203
25357
  region: ccRegion,
25204
25358
  provider
@@ -30005,6 +30159,325 @@ async function reserveStackCreateToken(options) {
30005
30159
  };
30006
30160
  }
30007
30161
 
30162
+ //#endregion
30163
+ //#region src/deployment/deploy-value-equality.ts
30164
+ function isReplacementCeiling(pc) {
30165
+ return pc.requiresReplacement && (pc.inPlacePropagated === true || pc.replacementPropagated === true);
30166
+ }
30167
+ function keyOrderFreeJson(value) {
30168
+ return JSON.stringify(value, (_key, node) => {
30169
+ if (node === null || typeof node !== "object" || Array.isArray(node)) return node;
30170
+ const sorted = Object.create(null);
30171
+ for (const key of Object.keys(node).sort()) sorted[key] = node[key];
30172
+ return sorted;
30173
+ });
30174
+ }
30175
+ function liveHoldsFreshLeaves(live, leaves) {
30176
+ for (const leaf of leaves) {
30177
+ let node = live;
30178
+ for (const segment of leaf.path) {
30179
+ if (typeof segment === "number") {
30180
+ if (!Array.isArray(node) || segment >= node.length) return false;
30181
+ node = node[segment];
30182
+ continue;
30183
+ }
30184
+ if (node === null || typeof node !== "object" || Array.isArray(node)) return false;
30185
+ if (!Object.prototype.hasOwnProperty.call(node, segment)) return false;
30186
+ node = node[segment];
30187
+ }
30188
+ if (typeof leaf.plaintext === "string") {
30189
+ if (typeof node !== "string" || node !== leaf.plaintext) return false;
30190
+ } else if (node === void 0 || keyOrderFreeJson(node) !== keyOrderFreeJson(leaf.plaintext)) return false;
30191
+ }
30192
+ return true;
30193
+ }
30194
+ function outputMapsEqual(a, b) {
30195
+ return deepEqualValue(a, b);
30196
+ }
30197
+ function deepEqualValue(a, b) {
30198
+ if (a === b) return true;
30199
+ if (a == null || b == null) return a === b;
30200
+ if (typeof a !== typeof b) return false;
30201
+ if (typeof a !== "object") return false;
30202
+ if (Array.isArray(a) || Array.isArray(b)) {
30203
+ if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
30204
+ return a.every((v, i) => deepEqualValue(v, b[i]));
30205
+ }
30206
+ const ao = a;
30207
+ const bo = b;
30208
+ const ak = Object.keys(ao);
30209
+ if (ak.length !== Object.keys(bo).length) return false;
30210
+ for (const k of ak) {
30211
+ if (!Object.prototype.hasOwnProperty.call(bo, k)) return false;
30212
+ if (!deepEqualValue(ao[k], bo[k])) return false;
30213
+ }
30214
+ return true;
30215
+ }
30216
+
30217
+ //#endregion
30218
+ //#region src/deployment/reference-provenance-record.ts
30219
+ const SSM_VERSION = /^[0-9]{1,10}$/;
30220
+ const SECRETS_MANAGER_VERSION = /^[A-Za-z0-9_+=.@/-]{32,64}$/;
30221
+ function referenceTokensIn(value, into = /* @__PURE__ */ new Set()) {
30222
+ const walk = (v) => {
30223
+ if (typeof v === "string") {
30224
+ if (!v.includes("{{resolve:")) return;
30225
+ for (const token of dynamicReferenceTokens(v)) into.add(token);
30226
+ return;
30227
+ }
30228
+ if (Array.isArray(v)) {
30229
+ for (const item of v) walk(item);
30230
+ return;
30231
+ }
30232
+ if (v !== null && typeof v === "object") for (const item of Object.values(v)) walk(item);
30233
+ };
30234
+ walk(value);
30235
+ return into;
30236
+ }
30237
+ function recordReferenceTokens(record) {
30238
+ const tokens = referenceTokensIn(record.properties);
30239
+ referenceTokensIn(record.attributes, tokens);
30240
+ referenceTokensIn(record.observedProperties, tokens);
30241
+ return tokens;
30242
+ }
30243
+ function versionShapeOf(token) {
30244
+ if (token.startsWith("{{resolve:secretsmanager:")) return SECRETS_MANAGER_VERSION;
30245
+ if (token.startsWith("{{resolve:ssm:") || token.startsWith("{{resolve:ssm-secure:")) return SSM_VERSION;
30246
+ }
30247
+ function isValidReferenceVersion(token, version) {
30248
+ const shape = versionShapeOf(token);
30249
+ return shape !== void 0 && typeof version === "string" && shape.test(version);
30250
+ }
30251
+ function validReferenceRegion(region) {
30252
+ if (typeof region !== "string") return void 0;
30253
+ return canonicalizeRegion(region) === region && isClientSafeRegion(region) ? region : void 0;
30254
+ }
30255
+ function isPlainObject$1(value) {
30256
+ return value !== null && typeof value === "object" && !Array.isArray(value);
30257
+ }
30258
+ function validateReferenceProvenance(token, raw) {
30259
+ if (!isSingleDynamicReferenceToken(token) || !isPlainObject$1(raw)) return void 0;
30260
+ const versionsRaw = Object.hasOwn(raw, "versions") ? raw["versions"] : void 0;
30261
+ const readRaw = Object.hasOwn(raw, "readVersions") ? raw["readVersions"] : void 0;
30262
+ if (readRaw !== void 0) {
30263
+ if (!Array.isArray(readRaw)) return void 0;
30264
+ const all = Array.isArray(versionsRaw) ? versionsRaw : [];
30265
+ if (!readRaw.every((v) => all.includes(v))) return void 0;
30266
+ }
30267
+ const out = {};
30268
+ const region = validReferenceRegion(Object.hasOwn(raw, "region") ? raw["region"] : void 0);
30269
+ if (region !== void 0) out.region = region;
30270
+ if (Array.isArray(versionsRaw) && versionsRaw.length > 0 && versionsRaw.length <= 8 && versionsRaw.every((v) => isValidReferenceVersion(token, v)) && (readRaw === void 0 || readRaw.every((v) => typeof v === "string"))) {
30271
+ out.versions = [...new Set(versionsRaw)].sort();
30272
+ if (readRaw !== void 0 && readRaw.length > 0) out.readVersions = [...new Set(readRaw)].sort();
30273
+ }
30274
+ return out;
30275
+ }
30276
+ function referenceProvenanceOf(record) {
30277
+ if (!isPlainObject$1(record) || !Object.hasOwn(record, "referenceProvenance")) return void 0;
30278
+ return validatedBag(record["referenceProvenance"]);
30279
+ }
30280
+ function validatedBag(field) {
30281
+ if (!isPlainObject$1(field)) return void 0;
30282
+ const out = Object.create(null);
30283
+ for (const [token, raw] of Object.entries(field)) {
30284
+ const entry = validateReferenceProvenance(token, raw);
30285
+ if (entry !== void 0) out[token] = entry;
30286
+ }
30287
+ return { ...out };
30288
+ }
30289
+ function hasReferenceProvenanceField(record) {
30290
+ return isPlainObject$1(record) && Object.hasOwn(record, "referenceProvenance") && record["referenceProvenance"] !== void 0;
30291
+ }
30292
+ function outputReferenceProvenanceOf(state, outputKey) {
30293
+ if (!isPlainObject$1(state) || !Object.hasOwn(state, "outputReferenceProvenance")) return;
30294
+ const field = state["outputReferenceProvenance"];
30295
+ if (!isPlainObject$1(field) || !Object.hasOwn(field, outputKey)) return void 0;
30296
+ return validatedBag(field[outputKey]);
30297
+ }
30298
+ function persistable(token, entry) {
30299
+ return (entry === void 0 ? void 0 : validateReferenceProvenance(token, entry)) ?? {};
30300
+ }
30301
+ function tokensUnderPaths(properties, paths) {
30302
+ const out = /* @__PURE__ */ new Set();
30303
+ const descend = (value, path, at) => {
30304
+ if (at === path.length) {
30305
+ referenceTokensIn(value, out);
30306
+ return;
30307
+ }
30308
+ if (Array.isArray(value)) {
30309
+ const next = path[at] === "*" ? at + 1 : at;
30310
+ for (const item of value) descend(item, path, next);
30311
+ return;
30312
+ }
30313
+ if (isPlainObject$1(value) && Object.hasOwn(value, path[at])) descend(value[path[at]], path, at + 1);
30314
+ };
30315
+ for (const path of paths) descend(properties, path, 0);
30316
+ return out;
30317
+ }
30318
+ function provenanceForWrittenRecord(args) {
30319
+ const { record, secrets, previous, inPlace } = args;
30320
+ const previousField = inPlace === void 0 ? void 0 : referenceProvenanceOf(previous);
30321
+ if (!hasPassProvenance(secrets) && previousField === void 0 && args.walkWithoutPassProvenance !== true) return;
30322
+ const tokens = recordReferenceTokens(record);
30323
+ if (tokens.size === 0) return void 0;
30324
+ let kept;
30325
+ if (inPlace !== void 0) {
30326
+ kept = inPlace.createOnly === "all" ? tokens : tokensUnderPaths(record.properties, inPlace.createOnly);
30327
+ if (inPlace.attributesCarried) referenceTokensIn(record.attributes, kept);
30328
+ }
30329
+ const out = {};
30330
+ for (const token of [...tokens].sort()) {
30331
+ const pass = passProvenanceFor(secrets, token);
30332
+ if (kept === void 0 || !kept.has(token)) {
30333
+ out[token] = persistable(token, pass);
30334
+ continue;
30335
+ }
30336
+ const before = previousField !== void 0 && Object.hasOwn(previousField, token) ? previousField[token] : void 0;
30337
+ if (pass === void 0) {
30338
+ out[token] = before === void 0 ? {} : { ...before };
30339
+ continue;
30340
+ }
30341
+ out[token] = persistable(token, unionWithPrevious(pass, before));
30342
+ }
30343
+ return out;
30344
+ }
30345
+ function unionWithPrevious(pass, before) {
30346
+ const out = {};
30347
+ if (pass.region !== void 0 && (before?.region === void 0 || before.region === pass.region)) out.region = pass.region;
30348
+ if (pass.versions !== void 0 && before?.versions !== void 0) {
30349
+ out.versions = [.../* @__PURE__ */ new Set([...before.versions, ...pass.versions])].sort();
30350
+ if (pass.readVersions !== void 0) out.readVersions = [...pass.readVersions];
30351
+ }
30352
+ return out;
30353
+ }
30354
+ function outputProvenanceForPersist(args) {
30355
+ const { outputs, resolvedThisRun, carriedFrom, sinkOf } = args;
30356
+ if (!resolvedThisRun) return carriedFrom !== void 0 && isPlainObject$1(carriedFrom.outputReferenceProvenance) ? carriedFrom.outputReferenceProvenance : void 0;
30357
+ let out;
30358
+ for (const [outputKey, value] of Object.entries(outputs)) {
30359
+ const sink = sinkOf(outputKey);
30360
+ if (!hasPassProvenance(sink)) continue;
30361
+ const tokens = referenceTokensIn(value);
30362
+ if (tokens.size === 0) continue;
30363
+ const entries = {};
30364
+ for (const token of [...tokens].sort()) entries[token] = persistable(token, passProvenanceFor(sink, token));
30365
+ out ??= Object.create(null);
30366
+ out[outputKey] = entries;
30367
+ }
30368
+ return out === void 0 ? void 0 : { ...out };
30369
+ }
30370
+ const KEEP_REFERENCE_PROVENANCE = Symbol("keep reference provenance");
30371
+ function withReferenceProvenance(record, field) {
30372
+ if (field === KEEP_REFERENCE_PROVENANCE) return record;
30373
+ if (field === void 0 && !Object.hasOwn(record, "referenceProvenance")) return record;
30374
+ const { referenceProvenance: _previous, ...rest } = record;
30375
+ return field === void 0 ? rest : {
30376
+ ...rest,
30377
+ referenceProvenance: field
30378
+ };
30379
+ }
30380
+
30381
+ //#endregion
30382
+ //#region src/deployment/deploy-engine/provenance-capture.ts
30383
+ function kickOffProvenanceCapture(args) {
30384
+ const { noChange, resources, template } = args;
30385
+ let chain = Promise.resolve();
30386
+ for (const logicalId of noChange) {
30387
+ const record = Object.hasOwn(resources, logicalId) ? resources[logicalId] : void 0;
30388
+ if (record === void 0 || hasReferenceProvenanceField(record)) continue;
30389
+ const tokens = recordReferenceTokens(record);
30390
+ if (tokens.size === 0) continue;
30391
+ const properties = (Object.hasOwn(template.Resources, logicalId) ? template.Resources[logicalId] : void 0)?.Properties ?? {};
30392
+ const task = chain.then(() => captureOne(this, logicalId, record, tokens, properties, args)).catch(() => ({
30393
+ record,
30394
+ field: void 0
30395
+ }));
30396
+ chain = task;
30397
+ this.provenanceCaptureTasks.set(logicalId, task);
30398
+ }
30399
+ }
30400
+ function warnUnattributed(engine, logicalId) {
30401
+ engine.logger.warn(safeMsg`Could not record where the secret reference(s) in ${logicalId} were resolved (state schema v12 migration). cdkd keeps its previous handling of them; update ${logicalId} to record it.`);
30402
+ }
30403
+ async function captureOne(engine, logicalId, record, tokens, properties, args) {
30404
+ const bag = /* @__PURE__ */ new Map();
30405
+ const { attributeHealer: _healer, ...base } = engine.buildResolverContext({
30406
+ template: args.template,
30407
+ resources: { ...args.resources },
30408
+ ...args.parameters && { parameters: args.parameters },
30409
+ ...args.conditions && { conditions: args.conditions }
30410
+ }, args.stackName);
30411
+ const { producerSecrets: _producer, ...withoutRecorders } = base;
30412
+ const context = {
30413
+ ...withoutRecorders,
30414
+ recordedSecretValues: bag,
30415
+ recordedImports: [],
30416
+ recordedOutputReads: [],
30417
+ staleAttributeHeal: { phase: "probe" },
30418
+ printingSecrets: /* @__PURE__ */ new Map(),
30419
+ provenanceCapture: true
30420
+ };
30421
+ const stored = record.properties ?? {};
30422
+ for (const [key, value] of Object.entries(properties)) {
30423
+ if (!Object.hasOwn(stored, key) || recordReferenceTokens({ properties: stored[key] }).size === 0) continue;
30424
+ try {
30425
+ await engine.resolver.resolve(structuredClone(value), context);
30426
+ } catch (error) {
30427
+ if (isThrottlingError(error)) return {
30428
+ record,
30429
+ field: void 0
30430
+ };
30431
+ }
30432
+ }
30433
+ const physicalId = typeof record.physicalId === "string" ? record.physicalId.toLowerCase() : "";
30434
+ const field = {};
30435
+ let unattributed = false;
30436
+ for (const token of [...tokens].sort()) {
30437
+ const pass = passProvenanceFor(bag, token);
30438
+ const plaintext = resolvedPlaintextOf(bag, token);
30439
+ const named = plaintext !== void 0 && plaintext.length >= 4 && physicalId.includes(plaintext.toLowerCase());
30440
+ const entry = validateReferenceProvenance(token, {
30441
+ ...pass?.region !== void 0 && { region: pass.region },
30442
+ ...named && pass?.versions !== void 0 && { versions: pass.versions }
30443
+ }) ?? {};
30444
+ if (entry.region === void 0 && entry.versions === void 0) unattributed = true;
30445
+ field[token] = entry;
30446
+ }
30447
+ if (unattributed) warnUnattributed(engine, logicalId);
30448
+ return {
30449
+ record,
30450
+ field
30451
+ };
30452
+ }
30453
+ async function drainProvenanceCaptures(stateResources) {
30454
+ if (this.provenanceCaptureTasks.size === 0) return 0;
30455
+ const entries = [...this.provenanceCaptureTasks.entries()];
30456
+ this.provenanceCaptureTasks.clear();
30457
+ const outcomes = await Promise.all(entries.map(([, task]) => task));
30458
+ let installed = 0;
30459
+ for (let i = 0; i < entries.length; i++) {
30460
+ const logicalId = entries[i][0];
30461
+ const { record, field } = outcomes[i];
30462
+ if (field === void 0) continue;
30463
+ const target = Object.hasOwn(stateResources, logicalId) ? stateResources[logicalId] : void 0;
30464
+ if (target === void 0 || target.physicalId !== record.physicalId || target.resourceType !== record.resourceType) continue;
30465
+ stateResources[logicalId] = {
30466
+ ...target,
30467
+ referenceProvenance: field
30468
+ };
30469
+ installed++;
30470
+ }
30471
+ return installed;
30472
+ }
30473
+ function provenanceBaselineOf(state, tokenFree) {
30474
+ return {
30475
+ outputs: state.outputs,
30476
+ ...state.outputReferenceProvenance !== void 0 && { outputReferenceProvenance: state.outputReferenceProvenance },
30477
+ tokenFree
30478
+ };
30479
+ }
30480
+
30008
30481
  //#endregion
30009
30482
  //#region src/analyzer/destructive-changes.ts
30010
30483
  const IGNORED_RESOURCE_TYPES = /* @__PURE__ */ new Set(["AWS::CDK::Metadata"]);
@@ -31482,10 +31955,13 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
31482
31955
  continue;
31483
31956
  }
31484
31957
  const ownReads = [];
31958
+ const provenanceSink = /* @__PURE__ */ new Map();
31959
+ this.outputProvenanceSinks.set(outputKey, provenanceSink);
31485
31960
  try {
31486
31961
  const resolved = await this.resolver.resolve(output.Value, {
31487
31962
  ...context,
31488
- redactedAttributeReads: ownReads
31963
+ redactedAttributeReads: ownReads,
31964
+ provenanceSink
31489
31965
  });
31490
31966
  refuseMaskedOutputReads(outputKey, ownReads);
31491
31967
  if (resolved === void 0 && this.options.strictGetAtt) throw markNonRetryable(/* @__PURE__ */ new Error("the value resolved to nothing"));
@@ -31540,6 +32016,8 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
31540
32016
  else if (isExportAliasCollision(exportName, outputKey, publishedOutputNames)) this.logger.warn(exportAliasCollisionWarning(outputKey, exportName, outputsPassSecrets));
31541
32017
  else {
31542
32018
  outputs[exportName] = value;
32019
+ const aliasedSink = this.outputProvenanceSinks.get(outputKey);
32020
+ if (aliasedSink !== void 0) this.outputProvenanceSinks.set(exportName, aliasedSink);
31543
32021
  if (!this.resolvedExportNames.includes(exportName)) this.resolvedExportNames.push(exportName);
31544
32022
  this.outputsTemplateSource[exportName] = outputValue;
31545
32023
  }
@@ -31553,6 +32031,8 @@ async function resolveOutputs(template, resources, stackName, digestSource, para
31553
32031
  this.outputsTemplateSource[outputKey] = output.Value;
31554
32032
  }
31555
32033
  this.skippedOutputs = collectSkippedOutputs(digestSource, outputs);
32034
+ this.outputsResolvedThisRun.add(outputs);
32035
+ this.resolvedOutputsBag = outputs;
31556
32036
  return markSameGenerationBag(outputs);
31557
32037
  }
31558
32038
  function buildDisplayOutputs(template, resolvedOutputs) {
@@ -34700,7 +35180,7 @@ async function revertNestedChildFromJournal(args) {
34700
35180
  const { skippedOutputs: _dropped, ...carried } = base;
34701
35181
  const next = () => ({
34702
35182
  ...carried,
34703
- version: 11,
35183
+ version: 12,
34704
35184
  region,
34705
35185
  resources: { ...stateResources },
34706
35186
  ...orphansAfterRollback(base, mintedOrphans),
@@ -34716,6 +35196,7 @@ async function revertNestedChildFromJournal(args) {
34716
35196
  const state = next();
34717
35197
  if (!restoring) return state;
34718
35198
  if (restoredOutputs && !restoredOutputs.exportNames) delete state.exportNames;
35199
+ if (restoredOutputs) delete state.outputReferenceProvenance;
34719
35200
  if (restoredReads && !restoredReads.imports) delete state.imports;
34720
35201
  if (restoredReads && !restoredReads.outputReads) delete state.outputReads;
34721
35202
  return state;
@@ -35596,7 +36077,8 @@ function kickOffObservedCapture(provider, logicalId, physicalId, resourceType, r
35596
36077
  this.observedCaptureTasks.set(logicalId, promise);
35597
36078
  }
35598
36079
  async function drainObservedCaptures(stateResources) {
35599
- if (this.observedCaptureTasks.size === 0) return 0;
36080
+ const captured = await this.drainProvenanceCaptures(stateResources);
36081
+ if (this.observedCaptureTasks.size === 0) return captured;
35600
36082
  const entries = Array.from(this.observedCaptureTasks.entries());
35601
36083
  this.observedCaptureTasks.clear();
35602
36084
  const resolved = await Promise.all(entries.map(([, p]) => p));
@@ -35612,7 +36094,7 @@ async function drainObservedCaptures(stateResources) {
35612
36094
  target.observedProperties = recapturedFrom !== void 0 ? observed : markSameGenerationBag({ ...observed });
35613
36095
  }
35614
36096
  }
35615
- return installed;
36097
+ return installed + captured;
35616
36098
  }
35617
36099
  const STANDALONE_SIBLING = {
35618
36100
  Roles: {
@@ -35795,61 +36277,6 @@ function kickOffMaskedBaselineRecapture(provider, logicalId, resource, producerR
35795
36277
  this.observedCaptureTasks.set(logicalId, task);
35796
36278
  }
35797
36279
 
35798
- //#endregion
35799
- //#region src/deployment/deploy-value-equality.ts
35800
- function isReplacementCeiling(pc) {
35801
- return pc.requiresReplacement && (pc.inPlacePropagated === true || pc.replacementPropagated === true);
35802
- }
35803
- function keyOrderFreeJson(value) {
35804
- return JSON.stringify(value, (_key, node) => {
35805
- if (node === null || typeof node !== "object" || Array.isArray(node)) return node;
35806
- const sorted = Object.create(null);
35807
- for (const key of Object.keys(node).sort()) sorted[key] = node[key];
35808
- return sorted;
35809
- });
35810
- }
35811
- function liveHoldsFreshLeaves(live, leaves) {
35812
- for (const leaf of leaves) {
35813
- let node = live;
35814
- for (const segment of leaf.path) {
35815
- if (typeof segment === "number") {
35816
- if (!Array.isArray(node) || segment >= node.length) return false;
35817
- node = node[segment];
35818
- continue;
35819
- }
35820
- if (node === null || typeof node !== "object" || Array.isArray(node)) return false;
35821
- if (!Object.prototype.hasOwnProperty.call(node, segment)) return false;
35822
- node = node[segment];
35823
- }
35824
- if (typeof leaf.plaintext === "string") {
35825
- if (typeof node !== "string" || node !== leaf.plaintext) return false;
35826
- } else if (node === void 0 || keyOrderFreeJson(node) !== keyOrderFreeJson(leaf.plaintext)) return false;
35827
- }
35828
- return true;
35829
- }
35830
- function outputMapsEqual(a, b) {
35831
- return deepEqualValue(a, b);
35832
- }
35833
- function deepEqualValue(a, b) {
35834
- if (a === b) return true;
35835
- if (a == null || b == null) return a === b;
35836
- if (typeof a !== typeof b) return false;
35837
- if (typeof a !== "object") return false;
35838
- if (Array.isArray(a) || Array.isArray(b)) {
35839
- if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;
35840
- return a.every((v, i) => deepEqualValue(v, b[i]));
35841
- }
35842
- const ao = a;
35843
- const bo = b;
35844
- const ak = Object.keys(ao);
35845
- if (ak.length !== Object.keys(bo).length) return false;
35846
- for (const k of ak) {
35847
- if (!Object.prototype.hasOwnProperty.call(bo, k)) return false;
35848
- if (!deepEqualValue(ao[k], bo[k])) return false;
35849
- }
35850
- return true;
35851
- }
35852
-
35853
36280
  //#endregion
35854
36281
  //#region src/deployment/deploy-engine/masking.ts
35855
36282
  function diffLogMasker(diffSecrets, template, parameterValues, resources) {
@@ -35906,6 +36333,11 @@ function absorbOutputsPassSecrets() {
35906
36333
  }
35907
36334
  }
35908
36335
  function redactOutputs(outputs) {
36336
+ const redacted = redactOutputsBag.call(this, outputs);
36337
+ if (this.outputsResolvedThisRun.has(outputs)) this.outputsResolvedThisRun.add(redacted);
36338
+ return redacted;
36339
+ }
36340
+ function redactOutputsBag(outputs) {
35909
36341
  this.absorbOutputsPassSecrets();
35910
36342
  if (this.outputSecrets.size === 0) return this.maskOutputsByPosition(outputs);
35911
36343
  return this.maskOutputsByPosition(redactSecretsForState(outputs, this.outputSecrets, this.outputsSourceUsable ? this.outputsTemplateSource : void 0, TEMPLATE_SOURCED_RULES));
@@ -36557,6 +36989,7 @@ function buildResolverContext(base, stackName) {
36557
36989
  attributeHealer: (logicalId, resource) => this.healStaleAttributes(logicalId, resource, stackName),
36558
36990
  ...this.options.inheritedSecrets && hasMaskableValues(this.options.inheritedSecrets) && { inheritedSecrets: this.options.inheritedSecrets },
36559
36991
  ...this.options.inheritedPhysicalNameCopies && { inheritedPhysicalNameCopies: this.options.inheritedPhysicalNameCopies },
36992
+ ...this.options.inheritedReferenceProvenance && { inheritedReferenceProvenance: this.options.inheritedReferenceProvenance },
36560
36993
  recordedSecretValues,
36561
36994
  noEchoAttributeResources: this.noEchoAttributeResources,
36562
36995
  secretNameNeedles: (logicalId) => this.noteSecretNamedRecord(logicalId, Object.hasOwn(base.resources, logicalId) ? base.resources[logicalId] : void 0),
@@ -42369,6 +42802,10 @@ async function updateInPlace({ conditions, counts, currentProps, currentPropsAsW
42369
42802
  } else throw updateError;
42370
42803
  }
42371
42804
  this.updateWasReplaced.set(logicalId, result.wasReplaced === true);
42805
+ if (result.wasReplaced !== true && (hasPassProvenance(updateSecrets) || referenceProvenanceOf(currentResource) !== void 0)) {
42806
+ const cached = cachedCreateOnlyPropertyPaths(resourceType);
42807
+ this.inPlaceCreateOnlyPaths.set(logicalId, cached === void 0 ? "all" : await cached.catch(() => "all"));
42808
+ }
42372
42809
  if (result.wasReplaced) {
42373
42810
  this.noteSecretNamedRecord(logicalId, {
42374
42811
  resourceType,
@@ -42972,7 +43409,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
42972
43409
  saveChain = saveChain.then(async () => {
42973
43410
  try {
42974
43411
  const partialState = {
42975
- version: 11,
43412
+ version: 12,
42976
43413
  region: this.stackRegion,
42977
43414
  stackName: currentState.stackName,
42978
43415
  resources: newResources,
@@ -43279,7 +43716,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
43279
43716
  }
43280
43717
  try {
43281
43718
  const preRollbackState = {
43282
- version: 11,
43719
+ version: 12,
43283
43720
  region: this.stackRegion,
43284
43721
  stackName: currentState.stackName,
43285
43722
  resources: newResources,
@@ -43332,7 +43769,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
43332
43769
  }
43333
43770
  try {
43334
43771
  const postRollbackState = {
43335
- version: 11,
43772
+ version: 12,
43336
43773
  region: this.stackRegion,
43337
43774
  stackName: currentState.stackName,
43338
43775
  resources: newResources,
@@ -43351,7 +43788,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
43351
43788
  try {
43352
43789
  const freshEtag = (await this.stateBackend.getState(stackName, this.stackRegion))?.etag;
43353
43790
  const postRollbackState = {
43354
- version: 11,
43791
+ version: 12,
43355
43792
  region: this.stackRegion,
43356
43793
  stackName: currentState.stackName,
43357
43794
  resources: newResources,
@@ -43384,7 +43821,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
43384
43821
  }
43385
43822
  return {
43386
43823
  state: {
43387
- version: 11,
43824
+ version: 12,
43388
43825
  region: this.stackRegion,
43389
43826
  stackName: currentState.stackName,
43390
43827
  resources: newResources,
@@ -43402,7 +43839,7 @@ async function executeDeployment(template, currentState, changes, dag, execution
43402
43839
  }
43403
43840
  async function persistStateAfterOutputFailure(stackName, currentState, newResources, currentEtag, pendingMigration) {
43404
43841
  const buildState = () => ({
43405
- version: 11,
43842
+ version: 12,
43406
43843
  region: this.stackRegion,
43407
43844
  stackName: currentState.stackName,
43408
43845
  resources: newResources,
@@ -44707,7 +45144,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
44707
45144
  const currentStateData = await this.stateBackend.getState(stackName, this.stackRegion);
44708
45145
  noteDeployStateRecord(currentStateData?.state !== void 0);
44709
45146
  const currentState = currentStateData?.state ?? {
44710
- version: 11,
45147
+ version: 12,
44711
45148
  region: this.stackRegion,
44712
45149
  stackName,
44713
45150
  resources: {},
@@ -44724,6 +45161,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
44724
45161
  refuseMalformedResourceProperties(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
44725
45162
  refuseMalformedOrphans(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
44726
45163
  refuseMalformedOrphanRecords(currentState, stackName, this.stackRegion, this.options.refusalRecovery);
45164
+ this.provenanceBaseline = provenanceBaselineOf(currentState, isKnownTokenFreeState(currentStateData?.state));
44727
45165
  const migrationPending = currentStateData?.migrationPending ?? false;
44728
45166
  this.logger.debug(`Loaded current state: ${Object.keys(currentState.resources).length} resources`);
44729
45167
  if (this.options.onCurrentStateLoaded) {
@@ -44879,8 +45317,20 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
44879
45317
  firstDeployStateGate = void 0;
44880
45318
  await gate;
44881
45319
  }
45320
+ const startProvenanceCapture = () => {
45321
+ if (this.options.dryRun || isKnownTokenFreeState(currentStateData?.state)) return;
45322
+ this.kickOffProvenanceCapture({
45323
+ noChange: this.diffCalculator.filterByType(changes, "NO_CHANGE").map((change) => change.logicalId),
45324
+ resources: currentState.resources,
45325
+ template: effectiveTemplate,
45326
+ parameters: parameterValues,
45327
+ conditions,
45328
+ stackName
45329
+ });
45330
+ };
44882
45331
  if (!this.diffCalculator.hasChanges(changes)) {
44883
45332
  this.logger.info("No changes detected. Stack is up to date.");
45333
+ startProvenanceCapture();
44884
45334
  let persistedOutputs = currentState.outputs ?? {};
44885
45335
  if (!this.options.dryRun) {
44886
45336
  const resolvedOutputs = this.redactOutputs(await withSharedDrainBudget(() => this.resolveOutputs(effectiveTemplate, currentState.resources, stackName, outputsDigestSource, parameterValues, conditions)));
@@ -44918,9 +45368,10 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
44918
45368
  options: this.options,
44919
45369
  stackName
44920
45370
  });
44921
- if (observedRefresh || maskedFingerprintsBackfilled || conditionVerdictsChanged || outputsChanged || exportSetChanged || skippedOutputsChanged || orphansChanged || healedAttributesPending) try {
45371
+ const outputProvenanceBackfill = !outputsChanged && currentState.outputReferenceProvenance === void 0 && this.provenanceBaseline?.tokenFree === false && this.outputReferenceProvenanceFor(persistedOutputs, this.redactOutputs(persistedOutputs)) !== void 0;
45372
+ if (observedRefresh || outputProvenanceBackfill || maskedFingerprintsBackfilled || conditionVerdictsChanged || outputsChanged || exportSetChanged || skippedOutputsChanged || orphansChanged || healedAttributesPending) try {
44922
45373
  const refreshedState = {
44923
- version: 11,
45374
+ version: 12,
44924
45375
  region: this.stackRegion,
44925
45376
  stackName: currentState.stackName,
44926
45377
  resources: currentState.resources,
@@ -45030,6 +45481,7 @@ async function doDeployWithPrefetch(stackName, template, createOnlyPrefetch) {
45030
45481
  recreateTargetIds: recreateTargetIdsFor(this.options.recreateTargets, stackName),
45031
45482
  secretMask: () => this.diffLogMasker(diffResolverContext.recordedSecretValues, effectiveTemplate, parameterValues, currentState.resources)
45032
45483
  })) this.generatedNameGuard?.noteApprovalPrompted();
45484
+ startProvenanceCapture();
45033
45485
  this.generatedNameGuard?.recordPlannedIntents();
45034
45486
  this.resolver.resetPhysicalIdFallbackCount();
45035
45487
  const progress = {
@@ -45365,6 +45817,12 @@ var DeployEngine = class {
45365
45817
  restoredLostChildren = /* @__PURE__ */ new Set();
45366
45818
  updatesThatSentNothing = /* @__PURE__ */ new Set();
45367
45819
  updateWasReplaced = /* @__PURE__ */ new Map();
45820
+ inPlaceCreateOnlyPaths = /* @__PURE__ */ new Map();
45821
+ outputProvenanceSinks = /* @__PURE__ */ new Map();
45822
+ outputsResolvedThisRun = /* @__PURE__ */ new WeakSet();
45823
+ provenanceBaseline = void 0;
45824
+ resolvedOutputsBag = void 0;
45825
+ provenanceCaptureTasks = /* @__PURE__ */ new Map();
45368
45826
  oldDeletedBeforeCreate = /* @__PURE__ */ new Set();
45369
45827
  healBaseline = {};
45370
45828
  runProducerRegionEvidence = void 0;
@@ -45434,6 +45892,12 @@ var DeployEngine = class {
45434
45892
  this.restoredLostChildren = /* @__PURE__ */ new Set();
45435
45893
  this.updatesThatSentNothing = /* @__PURE__ */ new Set();
45436
45894
  this.updateWasReplaced = /* @__PURE__ */ new Map();
45895
+ this.inPlaceCreateOnlyPaths = /* @__PURE__ */ new Map();
45896
+ this.outputProvenanceSinks = /* @__PURE__ */ new Map();
45897
+ this.outputsResolvedThisRun = /* @__PURE__ */ new WeakSet();
45898
+ this.provenanceBaseline = void 0;
45899
+ this.resolvedOutputsBag = void 0;
45900
+ this.provenanceCaptureTasks = /* @__PURE__ */ new Map();
45437
45901
  this.oldDeletedBeforeCreate = /* @__PURE__ */ new Set();
45438
45902
  this.healBaseline = {};
45439
45903
  this.runProducerRegionEvidence = void 0;
@@ -45454,7 +45918,7 @@ var DeployEngine = class {
45454
45918
  const templateProps = this.perResourceTemplateProps.get(logicalId);
45455
45919
  const scrubbed = scrubResourceRecord(this.withHealedAttributes(logicalId, record), secrets ?? /* @__PURE__ */ new Map(), templateProps);
45456
45920
  const noEchoScrubbed = this.applyNoEchoPersist(logicalId, record, this.withNoEchoExactEchoes(logicalId, scrubbed), templateProps, state.resources, secrets);
45457
- resources[logicalId] = withConstructPath(withMaskedPropertyFingerprints(noEchoScrubbed, record.properties, templateProps, secrets, this.fingerprintNoEchoValues, this.perResourceInputFingerprints.get(logicalId)), constructPathOf(this.constructPathTemplate, logicalId));
45921
+ resources[logicalId] = withReferenceProvenance(withConstructPath(withMaskedPropertyFingerprints(noEchoScrubbed, record.properties, templateProps, secrets, this.fingerprintNoEchoValues, this.perResourceInputFingerprints.get(logicalId)), constructPathOf(this.constructPathTemplate, logicalId)), this.referenceProvenanceToPersist(logicalId, record, noEchoScrubbed, secrets));
45458
45922
  }
45459
45923
  const orphans = state.orphans?.map((entry) => {
45460
45924
  const sameResource = this.perResourceResolvedType.get(entry.logicalId) === entry.state.resourceType;
@@ -45466,14 +45930,51 @@ var DeployEngine = class {
45466
45930
  });
45467
45931
  const outputs = this.redactOutputs(state.outputs);
45468
45932
  const crossStackReads = this.redactCrossStackReads(state);
45933
+ const { outputReferenceProvenance: _incoming, ...rest } = state;
45934
+ const outputReferenceProvenance = this.outputReferenceProvenanceFor(state.outputs, outputs);
45469
45935
  return {
45470
- ...state,
45936
+ ...rest,
45471
45937
  resources,
45472
45938
  outputs,
45473
45939
  ...orphans === void 0 ? {} : { orphans },
45474
- ...crossStackReads
45940
+ ...crossStackReads,
45941
+ ...outputReferenceProvenance !== void 0 && { outputReferenceProvenance }
45475
45942
  };
45476
45943
  }
45944
+ outputReferenceProvenanceFor(outputs, redacted) {
45945
+ const sinkOf = (outputKey) => this.outputProvenanceSinks.get(outputKey);
45946
+ const baseline = this.provenanceBaseline;
45947
+ if (!this.outputsResolvedThisRun.has(outputs) && baseline !== void 0 && outputs === baseline.outputs && baseline.outputReferenceProvenance === void 0 && !baseline.tokenFree && this.resolvedOutputsBag !== void 0 && outputMapsEqual(this.redactOutputs(this.resolvedOutputsBag), redacted)) return outputProvenanceForPersist({
45948
+ outputs: redacted,
45949
+ resolvedThisRun: true,
45950
+ carriedFrom: void 0,
45951
+ sinkOf
45952
+ });
45953
+ return outputProvenanceForPersist({
45954
+ outputs: redacted,
45955
+ resolvedThisRun: this.outputsResolvedThisRun.has(outputs),
45956
+ carriedFrom: baseline !== void 0 && outputs === baseline.outputs ? baseline : void 0,
45957
+ sinkOf
45958
+ });
45959
+ }
45960
+ referenceProvenanceToPersist(logicalId, record, scrubbed, secrets) {
45961
+ const sameGeneration = isSameGenerationBag(record.properties);
45962
+ if (!sameGeneration && !isWrittenFromDeployedTemplate(record.properties)) return KEEP_REFERENCE_PROVENANCE;
45963
+ const previous = Object.hasOwn(this.healBaseline, logicalId) ? this.healBaseline[logicalId] : void 0;
45964
+ if (this.updatesThatSentNothing.has(logicalId) && previous !== void 0) return previous.referenceProvenance;
45965
+ const createOnly = sameGeneration ? this.inPlaceCreateOnlyPaths.get(logicalId) : "all";
45966
+ const inPlace = this.updateWasReplaced.get(logicalId) === false && previous !== void 0 ? {
45967
+ createOnly: createOnly ?? "all",
45968
+ attributesCarried: record.attributes !== void 0 && record.attributes === previous.attributes
45969
+ } : void 0;
45970
+ return provenanceForWrittenRecord({
45971
+ record: scrubbed,
45972
+ secrets,
45973
+ previous,
45974
+ inPlace,
45975
+ walkWithoutPassProvenance: this.provenanceBaseline?.tokenFree !== true
45976
+ });
45977
+ }
45477
45978
  redactCrossStackReads(state) {
45478
45979
  if (state.imports === void 0 && state.outputReads === void 0) return {};
45479
45980
  const secrets = this.allRecordedSecrets();
@@ -45622,6 +46123,8 @@ DeployEngine.prototype.namingSecretsFor = namingSecretsFor;
45622
46123
  DeployEngine.prototype.noteSecretNamedReads = noteSecretNamedReads;
45623
46124
  DeployEngine.prototype.kickOffObservedCapture = kickOffObservedCapture;
45624
46125
  DeployEngine.prototype.drainObservedCaptures = drainObservedCaptures;
46126
+ DeployEngine.prototype.kickOffProvenanceCapture = kickOffProvenanceCapture;
46127
+ DeployEngine.prototype.drainProvenanceCaptures = drainProvenanceCaptures;
45625
46128
  DeployEngine.prototype.buildObservedCaptureSiblings = buildObservedCaptureSiblings;
45626
46129
  DeployEngine.prototype.stampReasonlessParameterRefusals = stampReasonlessParameterRefusals;
45627
46130
  DeployEngine.prototype.kickOffAutoRefreshObservedProperties = kickOffAutoRefreshObservedProperties;
@@ -45655,5 +46158,5 @@ DeployEngine.prototype.replacementNameOrigin = replacementNameOrigin;
45655
46158
  DeployEngine.prototype.orphanedNameCollisionAdvice = orphanedNameCollisionAdvice;
45656
46159
 
45657
46160
  //#endregion
45658
- export { isTruthyCfnBoolean as $, isStatefulRecreateTargetForReplace as $a, stateBucketExistenceConfirmed as $c, malformedOrphansRefusalMessage as $i, ledgerForStack as $n, markSameGenerationBag as $o, sendableAssumeRoleCommand as $r, AssetPublisher as $s, seedsDeleteFirstGuard as $t, noEchoComparisonForTemplate as A, refuseMalformedResourcesForDeploy as Aa, redactDockerArgvValues as Ac, declaresNoEcho as Ai, journaledOrphanPrintingBag as An, maskWholeValue as Ao, deleteIndeterminateGuards as Ar, LockManager as As, dropFailedHint as At, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as B, unpreviewableOrphanRecords as Ba, getDockerImageBySourceHash as Bc, hasReadableOutputs as Bi, PRE_DELETE_SNAPSHOT_TYPES as Bn, carryLogOnlyValues as Bo, reDisableInstanceApiTermination as Br, splitImportedOps as Bs, getStackRecords as Bt, recordRetainedForReadoption as C, refuseMalformedResourceEntriesForImport as Ca, dockerSpawnEnvWithSensitive as Cc, cfnRefValueFromPhysicalId as Ci, displayAssemblyPath as Cl, collectDeclaredOutputNames as Cn, sameLambdaFunctionAddress as Co, applyCustomResourceResponseExpiration as Cr, wholeStringLeavesOf as Cs, revertNestedChildFromJournal as Ct, withResourceDeadline as D, refuseMalformedResourcePropertiesForDrift as Da, isDockerClientEnvKey as Dc, withSharedDrainBudget as Di, injectedAwsRegionValue as Dl, DEFAULT_RESOURCE_TIMEOUT_MS as Dn, isMarkedCoordinate as Do, unchangedBehindSecretReference as Dr, TEMPLATE_SOURCED_RULES as Ds, getCurrentNestedStackContext as Dt, serviceTokenBlockingReason as E, refuseMalformedResourcePropertiesForDestroy as Ea, getDockerCmd as Ec, parseWebACLArn as Ei, injectAwsRegion as El, bindingSkippedOutputs as En, canonicalCoordinates as Eo, slowCcOperationTimeoutMs as Er, STATE_SOURCED_READBACK_RULES as Es, collectNestedChildUnaddressed as Et, PROTECTION_PROPERTY_BY_TYPE as F, repairMalformedOrphansForReadOnly as Fa, warnFinchArgvExposure as Fc, UNREADABLE_RESOURCES_MAP_ROW as Fi, secretNamedRecordNeedles as Fn, passedNoEchoParametersOf as Fo, markWaitAbandoned as Fr, CrossPrefixScanCache as Fs, sameJournaledOrphans as Ft, resolveDynamoDbDeleteBudgetMs as G, findSilentDropProperties as Ga, loadCdkJson as Gc, malformedExportNamesWarning as Gi, isFinalSnapshotError as Gn, printingCorpusOf as Go, poisonRenderedSpellingsCollidingIn as Gr, hasReasonlessBaselineRefusal as Gs, isJournaledOrphan as Gt, compensateRemovedDeletionProtection as H, unreadableResourceEntries as Ha, synthesisStatusMessage as Hc, isReadableOrphanRecord as Hi, ccRoutedFinalSnapshotError as Hn, hasMaskableValues as Ho, DiffCalculator as Hr, describeRegionValueKind as Hs, removeProtectionTypeList as Ht, isProtectionValueActive as I, repairMalformedOutputsForReadOnly as Ia, escapeRegExp$3 as Ic, accountArgs as Ii, stateSecretNameNeedles as In, readbackPathFor as Io, disableInstanceApiTermination as Ir, applyCrossPrefixScan as Is, replayFailedOperations as It, deleteTableWithIndexBusyRetry as J, NO_CC_HANDLERS_REASON as Ja, resolveCaptureObservedState as Jc, malformedLocalResourceEntriesWarning as Ji, maskingRetryLogger as Jn, shareLogOnlyValues as Jo, applyRoleArnIfSet as Jr, importableOutputs as Js, planRollback as Jt, DELETE_INDEX_WAIT_PROCEED_NOTE as K, unwrittenCreateOnlyReplacement as Ka, resolveApp as Kc, malformedExportSourceWarning as Ki, refusesFinalSnapshot as Kn, recordLogOnlyParameterValue as Ko, producerLookupOver as Kr, hasUnverifiableParameterRefusal as Ks, isReplacementOrphan as Kt, perType as L, repairMalformedResourceEntriesForReadOnly as La, stripControlChars as Lc, deployRefusesOrphanRowsReason as Li, storedSecretNameNeedles as Ln, readsNoEchoSource as Lo, ec2InstanceProtectionSite as Lr, crossPrefixDeniedWarning as Ls, replayRollback as Lt, noEchoParameterNamesOf as M, refuseMalformedResourcesForExport as Ma, redactedDockerCause as Mc, STATE_REGION_DIVERGED as Mi, orphanRecordsPrintingBag as Mn, noEchoCoordinatesOf as Mo, deleteSkipReason as Mr, S3StateBackend as Ms, journaledOrphanLines as Mt, recordedProtectionEvidence as N, refuseMalformedState as Na, runDockerForeground as Nc, STATE_RESOURCES_MALFORMED as Ni, secretNamePrintingBag as Nn, noEchoLeavesOf as No, withIndeterminateGuard as Nr, rebuildClientForBucketRegion as Ns, loadJournaledOrphans as Nt, diffSecurity as O, refuseMalformedResourcePropertiesForExport as Oa, isMalformedEnvKey as Oc, parameterInputsFor as Oi, clearBucketRegionCache as Ol, DEFAULT_RESOURCE_WARN_AFTER_MS as On, maskAtCoordinates as Oo, RollbackInlinePolicyWriters as Or, WHOLE_DYNAMIC_REFERENCE_PATTERN as Os, withNestedStackContext as Ot, recordedProtectionNote as P, repairMalformedOrphanRecordsForReadOnly as Pa, runDockerStreaming as Pc, UNREADABLE_ORPHANS_CONTAINER_ROW as Pi, secretNamePrintingBags as Pn, noEchoOutputsComparison as Po, isWaitAbandonedError as Pr, CrossPrefixReadError as Ps, makeForeignHolderScan as Pt, hasCdkAutoDeleteTag as Q, MULTI_REGION_RECREATE_BLOCKED_TYPES as Qa, resolveUseCdkBootstrapAssets as Qc, malformedOrphanRowsKeptWarning as Qi, earliestDefined as Qn, maskSecretsInText as Qo, isIamRoleArn as Qr, shouldRetainResource as Qs, resolveReplacementOldType as Qt, readProtection as R, repairMalformedResourcePropertiesForReadOnly as Ra, stripForDisplay as Rc, displayLogicalId as Ri, extractDeploymentEventError as Rn, valueAtCoordinate as Ro, isTerminationProtectionPropagationError as Rr, isAccessDenied$1 as Rs, awaitInFlightSibling as Rt, keptForReadoption as S, refuseMalformedResourceEntriesForDestroy as Sa, describeDockerFailure as Sc, AWS_NO_VALUE as Si, describeFileReadFailure as Sl, noEchoParameterValueSeed as Sn, lambdaFunctionNameForMask as So, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Sr, recordProvenPublicExpression as Ss, recordDisplacedSkips as St, findServiceTokenRefusals as T, refuseMalformedResourceEntriesForOrphan as Ta, formatDockerLoginError as Tc, refStateLookupFromResource as Ti, resolveAssemblyPath as Tl, isExportAliasCollision as Tn, TemplateParser as To, CloudControlProvider as Tr, STATE_SOURCED_CROSS_GENERATION_RULES as Ts, withNestedRevertRun as Tt, deleteBudgetKey as U, withheldAccountClause as Ua, getDefaultStateBucketName as Uc, isReadableResourceEntry as Ui, createPreDeleteFinalSnapshot as Un, literalSplitDelimitersOf as Uo, INTRINSIC_KEYS as Ur, exportNamesCarriedFrom as Us, recordAfterRollbackUpdate as Ut, beginDeleteWait as V, unreadableOrphanRecords as Va, Synthesizer as Vc, hasReadableResources as Vi, buildFinalSnapshotIdentifier as Vn, createUnionSecretMasker as Vo, reEnableInstanceApiTermination as Vr, acceptedCreateOnlyDropsOf as Vs, withStackRecords as Vt, resolveDynamoDbDeleteBudgetClock as W, findActionableSilentDrops as Wa, getLegacyStateBucketName as Wc, malformedDriftResourcePropertiesWarning as Wi, effectiveDeletionPolicy as Wn, logOnlyValueCount as Wo, IntrinsicFunctionResolver as Wr, hasReadableExportSet as Ws, demoteSupersededOrphans as Wt, ECR_AUTO_DELETE_IMAGES_TAG as X, findReplacedReadersOfRecreateTargets as Xa, resolveStateBucketWithDefault as Xc, malformedOrphanRecordsRefusalMessage as Xi, findDestructiveChanges as Xn, errorCauseChain as Xo, assertSendableRoleArn as Xr, orphansAfterRollback as Xs, recordUnderIdIsNotOwn as Xt, waitForIndexesSettled as Y, hasNoCloudControlHandlers as Ya, resolveSkipPrefix as Yc, malformedLocalResourcesWarning as Yi, constructPathOf as Yn, createSecretMasker as Yo, assertFlagRoleArn as Yr, isReadableBag as Ys, recheckFailedPlan as Yt, S3_AUTO_DELETE_OBJECTS_TAG as Z, shownType as Za, resolveStateBucketWithDefaultAndSource as Zc, malformedOrphanRecordsWarning as Zi, formatDestructiveChange as Zn, maskSecretsInError as Zo, explicitRoleArnOrThrow as Zr, orphansCarriedFrom as Zs, replacementNeverSwapped as Zt, makeCanonicalizePropertiesFn as _, refuseMalformedOutputs as _a, buildDenyExternalAccessPolicy as _c, isImpossibleEmptyStoredAttribute as _i, hasOwnKey as _l, secretSafeKeyDisplay as _n, prefetchCreateOnlyPropertyPaths as _o, TemplateNoEchoReresolver as _r, provenPublicValue as _s, displacedOpClause as _t, findNestedTemplateTreeDefect as a, malformedResourcePropertiesWarning as aa, loadPublishableAssetManifest as ac, s3BucketArn as ai, findLargeInlineResources as al, isRedactedRecordedValue as an, toCfnInteger as ao, planTagDiff as ar, dynamicReferenceTokens as as, cyan as at, lookupEachName as b, refuseMalformedResourceEntries as ba, describeDockerCapturedOutput as bc, isNamelessDynamicReferenceError as bi, ownValue as bl, exportNameSecretExposure as bn, withRetry as bo, getCurrentResourceSecrets as br, recordNoEchoAttributeValues as bs, getNestedRevertRun as bt, renderNestedTemplateTreeDefect as c, malformedStateRefusalMessage as ca, BOOTSTRAP_MARKER_PREFIX as cc, s3BucketRegionalDomainName as ci, decodeListingKey as cl, updatePartialMessage as cn, coerceCfnInteger as co, tagMapAsList as cr, identityKeyFor as cs, red as ct, conditionInputsFrom as d, refuseMalformedNestedChildOutputs as da, getBootstrapMarkerKey as dc, producerRegionsFromState as di, canonicalizeRegion as dl, DeploymentEventsStore as dn, configStringRefusal as do, stringifyIfAssigned as dr, recoverMaskedOutput as ds, namesAnyDeclaredParameter as dt, malformedOrphansWarning as ea, isSensitiveAttributeName as ec, AWS_CREDENTIAL_ENV_KEYS as ei, warnDeprecatedNoPrefixCliFlag as el, orphanDeleteNeedsIdentity as en, isStatefulRecreateTargetSync as eo, reserveStackCreateToken as er, redactSecretsForState as es, getPriorAttempts as et, parentSuppliedValues as f, refuseMalformedOrphanRecords as fa, isCrossRegionRedirect as fc, regionLessSecretName as fi, derivePartitionAndUrlSuffix as fl, WITHHELD_NAME_DISPLAY as fn, readConfigString as fo, CC_BROKEN_REASON as fr, physicalNameCopiesOf as fs, reachableDivergentParameters as ft, mergeNoChangeOutputs as g, refuseMalformedOrphansForOrphan as ga, validateContainerRepoName as gc, getAccountInfo as gi, defineOwnKey as gl, secretBearingStateKeyWarning as gn, requireConfigString as go, wouldReturnToSdkProvider as gr, carriesSecretMask as gs, NESTED_PENDING_PARENT_REASON as gt, keptWholeReasonText as h, refuseMalformedOrphansForDestroy as ha, validateAssetBucketName as hc, parameterTypeMayLoseSecretIdentity as hi, processStackMessages as hl, secretBearing as hn, requireConfigObject as ho, isCustomResource as hr, splitGetAttStringForm as hs, planOrphanAdoption as ht, childTemplateLoader as i, malformedResourceEntriesWarning as ia, createAssetRedirectResolver as ic, isSettledInstanceState as ii, MIGRATE_TMP_PREFIX as il, REDACTED_DELETE_ADDRESS_SKIP_REASON as in, isWarmThroughputDecrease as io, DBPROXY_TAG_OPTIONS as ir, DYNAMIC_REFERENCE_TOKEN_SCAN as is, bold as it, noEchoExactEchoLeavesOf as j, refuseMalformedResourcesForDestroy as ja, redactedCause as jc, JSON_LISTING_HOLE_VALUE as ji, maskEventTextWithBoundBags as jn, maskedLeafCoordinatesOf as jo, deleteLeftInPlace as jr, isLockInfoExpired as js, isHandledOrphan as jt, noEchoAttributeNamesOf as k, refuseMalformedResourcePropertiesForOrphan as ka, partitionSensitiveEnv as kc, passedParameterClassesOf as ki, resolveBucketRegion as kl, completedReplayEntries as kn, maskReadbackAtCoordinates as ko, UNSPECIFIED_SKIP_REASON as kr, isSingleDynamicReferenceToken as ks, deleteJournaledOrphans as kt, templateIdentity as l, previewableOrphanRecords as la, assertAssetBucketRegion as lc, s3BucketWebsiteUrl as li, expectedOwnerParam as ll, updatePartialReason as ln, configBooleanRefusal as lo, tagPlanWarning as lr, inheritNestedStackParameterAssociations as ls, yellow as lt, isSecretBearingReferenceString as m, refuseMalformedOrphans as ma, readBootstrapMarkerBody as mc, isUnboundTemplateParameter as mi, StageLoadError as ml, exportAliasCollisionScrubWarning as mn, requireConfigArray as mo, ccBrokenReason as mr, recordPhysicalNameCopy as ms, makeSiblingClaimReader as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedOutputsWarning as na, WorkGraph as nc, callerEnvCredentials as ni, CFN_TEMPLATE_BODY_LIMIT as nl, getCurrentProducerRegions as nn, WARM_THROUGHPUT_MEMBERS as no, acquireIdempotencyToken as nr, withPhysicalNameCopies as ns, formatResourceLine as nt, isAbsoluteAssetPath as o, malformedResourcesWarning as oa, rewriteTemplateAssetReferences as oc, s3BucketDomainName as oi, uploadCfnTemplate as ol, redactedDeleteAddressFields as on, toFiniteNumber as oo, readTagList as or, isUncertifiedBaselineMaskPosition as os, gray as ot, readRecordedConditionVerdicts as p, refuseMalformedOrphanRecordsForDestroy as pa, parseBootstrapMarker as pc, coerceParameterTypedValue as pi, AssemblyReader as pl, displayTextOrWithheld as pn, replayWarn as po, ProviderRegistry as pr, recordAttributeIdCopy as ps, resourcesNamingDeclaredParameter as pt, INDEX_SETTLE_POLL_INTERVAL_MS as q, withoutSilentDropProperties as qa, resolveAutoAssetStorage as qc, malformedLocalOutputsWarning as qi, unsupportedFinalSnapshotError as qn, recordLogOnlyValue as qo, refuseUnreadableCdkCrossAccountRefs as qr, importableOutputKeys as qs, planFailedOps as qt, computeImplicitDeleteEdges as r, malformedRenderedContainersWarning as ra, buildAssetRedirectMap as rc, envCredentialsAreAssumedRole as ri, CFN_TEMPLATE_URL_LIMIT as rl, inheritProducerRegions as rn, coerceWarmThroughput as ro, DBPROXY_TAGS_WHAT as rr, withoutPhysicalNameCopies as rs, createReadOnlyAttributeHealerFactory as rt, listNestedTemplateRows as s, malformedScrubResourceEntriesRefusalMessage as sa, AssetModeResolver as sc, s3BucketDualStackDomainName as si, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as sl, redactedDeleteAddressSkip as sn, coerceCfnBoolean as so, refuseMalformedDesiredTags as sr, pathCrossesDottedKey as ss, green as st, DeployEngine as t, malformedOutputsRefusalMessage as ta, stringifyValue as tc, applyCallerIdentityCredentials as ti, ssmResolvedValueType as tl, findNestedStackTypeChanges as tn, renderStatefulReason as to, withCreateTokenLedger as tr, scrubResourceRecord as ts, markRefusedBeforeApplying as tt, conditionFingerprint as u, refuseDivergentRecordRegionForDestroy as ua, ensureAssetStorage as uc, classifyReplaySecretRegion as ui, PARTITION_TABLE as ul, DeploymentEventsReader as un, configIntegerRefusal as uo, definedAttributes as ur, recordNestedStackParameterExpressions as us, computeParameterTaint as ut, chunks as v, refuseMalformedOutputsForDestroy as va, buildDockerImage as vc, carriesDynamicReference as vi, hasPlainPrototype$1 as vl, carriedExportAliasExposure as vn, templateResourceTypes as vo, readsNoEchoDeleteValues as vr, recordMaskOnlyValue as vs, displacedPhysicalIdShown as vt, deferredServiceTokenWarning as w, refuseMalformedResourceEntriesForImportSave as wa, finchSecretArgvRefusal as wc, isStalePlaceholderArnAttribute as wi, renderAssemblyPathEscape as wl, collectPublishedOutputNames as wn, DagBuilder as wo, customResourceResponseExpirationWarning as wr, STATE_SOURCED_BASELINE_RULES as ws, revertedNestedRowIds as wt, withApiLimit as x, refuseMalformedResourceEntriesForDeploy as xa, describeDockerExecFailure as xc, keepsSecretReferenceToken as xi, absoluteAssemblyPathEscape as xl, isWholeDynamicReferenceValue as xn, canonicalLambdaFunctionName as xo, withPrintingSecrets as xr, recordNoEchoParameterFreshValue as xs, nestedChildStackName as xt, isAccessDeniedError as y, refuseMalformedResourceAttributesForOrphan as ya, resolveDockerContextDirectory as yc, carriesFetchableDynamicReference as yi, nullPrototypeRecord as yl, exportNameNoEchoParameters as yn, describeTypeWithThrottleRetry as yo, isCustomResourceType as yr, recordMaskOnlyValuesIn as ys, dropSettledNestedJournals as yt, DynamoDBGlobalTableProvider as z, repairMalformedResourcesForReadOnly as za, AssetManifestLoader as zc, hasReadableOrphans as zi, ATOMIC_FINAL_SNAPSHOT_TYPES as zn, liveMatchesUnresolvedTokenFrame as zo, observeThenDisableInstanceApiTermination as zr, isNotImplemented as zs, destroyStackRecordsView as zt };
45659
- //# sourceMappingURL=deploy-engine-HKmcD4Kn.js.map
46161
+ export { isTruthyCfnBoolean as $, MULTI_REGION_RECREATE_BLOCKED_TYPES as $a, resolveStateBucketWithDefault as $c, malformedOrphanRowsKeptWarning as $i, earliestDefined as $n, maskSecretsInText as $o, isIamRoleArn as $r, orphansAfterRollback as $s, seedsDeleteFirstGuard as $t, noEchoComparisonForTemplate as A, refuseMalformedResourcePropertiesForOrphan as Aa, isDockerClientEnvKey as Ac, passedParameterClassesOf as Ai, injectedAwsRegionValue as Al, journaledOrphanPrintingBag as An, maskReadbackAtCoordinates as Ao, UNSPECIFIED_SKIP_REASON as Ar, TEMPLATE_SOURCED_RULES as As, dropFailedHint as At, DYNAMODB_DELETE_MIN_RESOURCE_TIMEOUT_MS as B, repairMalformedResourcesForReadOnly as Ba, stripControlChars as Bc, hasReadableOrphans as Bi, PRE_DELETE_SNAPSHOT_TYPES as Bn, liveMatchesUnresolvedTokenFrame as Bo, observeThenDisableInstanceApiTermination as Br, crossPrefixDeniedWarning as Bs, getStackRecords as Bt, recordRetainedForReadoption as C, refuseMalformedResourceEntriesForDestroy as Ca, describeDockerCapturedOutput as Cc, AWS_NO_VALUE as Ci, ownValue as Cl, collectDeclaredOutputNames as Cn, lambdaFunctionNameForMask as Co, CUSTOM_RESOURCE_RESPONSE_LIFECYCLE_RULE_ID as Cr, recordNoEchoAttributeValues as Cs, revertNestedChildFromJournal as Ct, withResourceDeadline as D, refuseMalformedResourcePropertiesForDestroy as Da, finchSecretArgvRefusal as Dc, parseWebACLArn as Di, renderAssemblyPathEscape as Dl, DEFAULT_RESOURCE_TIMEOUT_MS as Dn, canonicalCoordinates as Do, slowCcOperationTimeoutMs as Dr, STATE_SOURCED_BASELINE_RULES as Ds, getCurrentNestedStackContext as Dt, serviceTokenBlockingReason as E, refuseMalformedResourceEntriesForOrphan as Ea, dockerSpawnEnvWithSensitive as Ec, refStateLookupFromResource as Ei, displayAssemblyPath as El, bindingSkippedOutputs as En, TemplateParser as Eo, CloudControlProvider as Er, wholeStringLeavesOf as Es, collectNestedChildUnaddressed as Et, PROTECTION_PROPERTY_BY_TYPE as F, repairMalformedOrphanRecordsForReadOnly as Fa, redactedDockerCause as Fc, UNREADABLE_ORPHANS_CONTAINER_ROW as Fi, secretNamedRecordNeedles as Fn, noEchoOutputsComparison as Fo, isWaitAbandonedError as Fr, S3StateBackend as Fs, sameJournaledOrphans as Ft, resolveDynamoDbDeleteBudgetMs as G, findActionableSilentDrops as Ga, synthesisStatusMessage as Gc, malformedDriftResourcePropertiesWarning as Gi, isFinalSnapshotError as Gn, logOnlyValueCount as Go, IntrinsicFunctionResolver as Gr, describeRegionValueKind as Gs, isJournaledOrphan as Gt, compensateRemovedDeletionProtection as H, unreadableOrphanRecords as Ha, AssetManifestLoader as Hc, hasReadableResources as Hi, ccRoutedFinalSnapshotError as Hn, createUnionSecretMasker as Ho, reEnableInstanceApiTermination as Hr, isNotImplemented as Hs, removeProtectionTypeList as Ht, isProtectionValueActive as I, repairMalformedOrphansForReadOnly as Ia, runDockerForeground as Ic, UNREADABLE_RESOURCES_MAP_ROW as Ii, stateSecretNameNeedles as In, passedNoEchoParametersOf as Io, markWaitAbandoned as Ir, rebuildClientForBucketRegion as Is, replayFailedOperations as It, deleteTableWithIndexBusyRetry as J, withoutSilentDropProperties as Ja, loadCdkJson as Jc, malformedLocalOutputsWarning as Ji, maskingRetryLogger as Jn, recordLogOnlyValue as Jo, refuseUnreadableCdkCrossAccountRefs as Jr, hasReasonlessBaselineRefusal as Js, planRollback as Jt, DELETE_INDEX_WAIT_PROCEED_NOTE as K, findSilentDropProperties as Ka, getDefaultStateBucketName as Kc, malformedExportNamesWarning as Ki, refusesFinalSnapshot as Kn, printingCorpusOf as Ko, poisonRenderedSpellingsCollidingIn as Kr, exportNamesCarriedFrom as Ks, isReplacementOrphan as Kt, perType as L, repairMalformedOutputsForReadOnly as La, runDockerStreaming as Lc, accountArgs as Li, storedSecretNameNeedles as Ln, readbackPathFor as Lo, disableInstanceApiTermination as Lr, CrossPrefixReadError as Ls, replayRollback as Lt, noEchoParameterNamesOf as M, refuseMalformedResourcesForDestroy as Ma, partitionSensitiveEnv as Mc, JSON_LISTING_HOLE_VALUE as Mi, resolveBucketRegion as Ml, orphanRecordsPrintingBag as Mn, maskedLeafCoordinatesOf as Mo, deleteLeftInPlace as Mr, isSingleDynamicReferenceToken as Ms, journaledOrphanLines as Mt, recordedProtectionEvidence as N, refuseMalformedResourcesForExport as Na, redactDockerArgvValues as Nc, STATE_REGION_DIVERGED as Ni, secretNamePrintingBag as Nn, noEchoCoordinatesOf as No, deleteSkipReason as Nr, LockManager as Ns, loadJournaledOrphans as Nt, diffSecurity as O, refuseMalformedResourcePropertiesForDrift as Oa, formatDockerLoginError as Oc, withSharedDrainBudget as Oi, resolveAssemblyPath as Ol, DEFAULT_RESOURCE_WARN_AFTER_MS as On, isMarkedCoordinate as Oo, unchangedBehindSecretReference as Or, STATE_SOURCED_CROSS_GENERATION_RULES as Os, withNestedStackContext as Ot, recordedProtectionNote as P, refuseMalformedState as Pa, redactedCause as Pc, STATE_RESOURCES_MALFORMED as Pi, secretNamePrintingBags as Pn, noEchoLeavesOf as Po, withIndeterminateGuard as Pr, isLockInfoExpired as Ps, makeForeignHolderScan as Pt, hasCdkAutoDeleteTag as Q, shownType as Qa, resolveSkipPrefix as Qc, malformedOrphanRecordsWarning as Qi, outputReferenceProvenanceOf as Qn, maskSecretsInError as Qo, explicitRoleArnOrThrow as Qr, isReadableBag as Qs, resolveReplacementOldType as Qt, readProtection as R, repairMalformedResourceEntriesForReadOnly as Ra, warnFinchArgvExposure as Rc, deployRefusesOrphanRowsReason as Ri, extractDeploymentEventError as Rn, readsNoEchoSource as Ro, ec2InstanceProtectionSite as Rr, CrossPrefixScanCache as Rs, awaitInFlightSibling as Rt, keptForReadoption as S, refuseMalformedResourceEntriesForDeploy as Sa, resolveDockerContextDirectory as Sc, keepsSecretReferenceToken as Si, nullPrototypeRecord as Sl, noEchoParameterValueSeed as Sn, canonicalLambdaFunctionName as So, withPrintingSecrets as Sr, recordMaskOnlyValuesIn as Ss, recordDisplacedSkips as St, findServiceTokenRefusals as T, refuseMalformedResourceEntriesForImportSave as Ta, describeDockerFailure as Tc, isStalePlaceholderArnAttribute as Ti, describeFileReadFailure as Tl, isExportAliasCollision as Tn, DagBuilder as To, customResourceResponseExpirationWarning as Tr, recordProvenPublicExpression as Ts, withNestedRevertRun as Tt, deleteBudgetKey as U, unreadableResourceEntries as Ua, getDockerImageBySourceHash as Uc, isReadableOrphanRecord as Ui, createPreDeleteFinalSnapshot as Un, hasMaskableValues as Uo, DiffCalculator as Ur, splitImportedOps as Us, recordAfterRollbackUpdate as Ut, beginDeleteWait as V, unpreviewableOrphanRecords as Va, stripForDisplay as Vc, hasReadableOutputs as Vi, buildFinalSnapshotIdentifier as Vn, carryLogOnlyValues as Vo, reDisableInstanceApiTermination as Vr, isAccessDenied$1 as Vs, withStackRecords as Vt, resolveDynamoDbDeleteBudgetClock as W, withheldAccountClause as Wa, Synthesizer as Wc, isReadableResourceEntry as Wi, effectiveDeletionPolicy as Wn, literalSplitDelimitersOf as Wo, INTRINSIC_KEYS as Wr, acceptedCreateOnlyDropsOf as Ws, demoteSupersededOrphans as Wt, ECR_AUTO_DELETE_IMAGES_TAG as X, hasNoCloudControlHandlers as Xa, resolveAutoAssetStorage as Xc, malformedLocalResourcesWarning as Xi, findDestructiveChanges as Xn, createSecretMasker as Xo, assertFlagRoleArn as Xr, importableOutputKeys as Xs, recordUnderIdIsNotOwn as Xt, waitForIndexesSettled as Y, NO_CC_HANDLERS_REASON as Ya, resolveApp as Yc, malformedLocalResourceEntriesWarning as Yi, constructPathOf as Yn, shareLogOnlyValues as Yo, applyRoleArnIfSet as Yr, hasUnverifiableParameterRefusal as Ys, recheckFailedPlan as Yt, S3_AUTO_DELETE_OBJECTS_TAG as Z, findReplacedReadersOfRecreateTargets as Za, resolveCaptureObservedState as Zc, malformedOrphanRecordsRefusalMessage as Zi, formatDestructiveChange as Zn, errorCauseChain as Zo, assertSendableRoleArn as Zr, importableOutputs as Zs, replacementNeverSwapped as Zt, makeCanonicalizePropertiesFn as _, refuseMalformedOrphansForOrphan as _a, readBootstrapMarkerBody as _c, getAccountInfo as _i, StageLoadError as _l, secretSafeKeyDisplay as _n, requireConfigString as _o, wouldReturnToSdkProvider as _r, recordPhysicalNameCopy as _s, displacedOpClause as _t, findNestedTemplateTreeDefect as a, malformedResourceEntriesWarning as aa, WorkGraph as ac, isSettledInstanceState as ai, CFN_TEMPLATE_BODY_LIMIT as al, isRedactedRecordedValue as an, isWarmThroughputDecrease as ao, DBPROXY_TAG_OPTIONS as ar, withPhysicalNameCopies as as, cyan as at, lookupEachName as b, refuseMalformedResourceAttributesForOrphan as ba, buildDenyExternalAccessPolicy as bc, carriesFetchableDynamicReference as bi, hasOwnKey as bl, exportNameSecretExposure as bn, describeTypeWithThrottleRetry as bo, isCustomResourceType as br, provenPublicValue as bs, getNestedRevertRun as bt, renderNestedTemplateTreeDefect as c, malformedScrubResourceEntriesRefusalMessage as ca, loadPublishableAssetManifest as cc, s3BucketDualStackDomainName as ci, findLargeInlineResources as cl, updatePartialMessage as cn, coerceCfnBoolean as co, refuseMalformedDesiredTags as cr, dynamicReferenceTokens as cs, red as ct, conditionInputsFrom as d, refuseDivergentRecordRegionForDestroy as da, BOOTSTRAP_MARKER_PREFIX as dc, classifyReplaySecretRegion as di, decodeListingKey as dl, DeploymentEventsStore as dn, configIntegerRefusal as do, definedAttributes as dr, identityKeyFor as ds, namesAnyDeclaredParameter as dt, malformedOrphansRefusalMessage as ea, orphansCarriedFrom as ec, sendableAssumeRoleCommand as ei, resolveStateBucketWithDefaultAndSource as el, orphanDeleteNeedsIdentity as en, isStatefulRecreateTargetForReplace as eo, ledgerForStack as er, markSameGenerationBag as es, getPriorAttempts as et, parentSuppliedValues as f, refuseMalformedNestedChildOutputs as fa, assertAssetBucketRegion as fc, producerRegionsFromState as fi, expectedOwnerParam as fl, WITHHELD_NAME_DISPLAY as fn, configStringRefusal as fo, stringifyIfAssigned as fr, inheritNestedStackParameterAssociations as fs, reachableDivergentParameters as ft, mergeNoChangeOutputs as g, refuseMalformedOrphansForDestroy as ga, parseBootstrapMarker as gc, parameterTypeMayLoseSecretIdentity as gi, AssemblyReader as gl, secretBearingStateKeyWarning as gn, requireConfigObject as go, isCustomResource as gr, recordAttributeIdCopy as gs, NESTED_PENDING_PARENT_REASON as gt, keptWholeReasonText as h, refuseMalformedOrphans as ha, isCrossRegionRedirect as hc, isUnboundTemplateParameter as hi, derivePartitionAndUrlSuffix as hl, secretBearing as hn, requireConfigArray as ho, ccBrokenReason as hr, physicalNameCopiesOf as hs, planOrphanAdoption as ht, childTemplateLoader as i, malformedRenderedContainersWarning as ia, stringifyValue as ic, envCredentialsAreAssumedRole as ii, ssmResolvedValueType as il, REDACTED_DELETE_ADDRESS_SKIP_REASON as in, coerceWarmThroughput as io, DBPROXY_TAGS_WHAT as ir, scrubResourceRecord as is, bold as it, noEchoExactEchoLeavesOf as j, refuseMalformedResourcesForDeploy as ja, isMalformedEnvKey as jc, declaresNoEcho as ji, clearBucketRegionCache as jl, maskEventTextWithBoundBags as jn, maskWholeValue as jo, deleteIndeterminateGuards as jr, WHOLE_DYNAMIC_REFERENCE_PATTERN as js, isHandledOrphan as jt, noEchoAttributeNamesOf as k, refuseMalformedResourcePropertiesForExport as ka, getDockerCmd as kc, parameterInputsFor as ki, injectAwsRegion as kl, completedReplayEntries as kn, maskAtCoordinates as ko, RollbackInlinePolicyWriters as kr, STATE_SOURCED_READBACK_RULES as ks, deleteJournaledOrphans as kt, templateIdentity as l, malformedStateRefusalMessage as la, rewriteTemplateAssetReferences as lc, s3BucketRegionalDomainName as li, uploadCfnTemplate as ll, updatePartialReason as ln, coerceCfnInteger as lo, tagMapAsList as lr, isUncertifiedBaselineMaskPosition as ls, yellow as lt, isSecretBearingReferenceString as m, refuseMalformedOrphanRecordsForDestroy as ma, getBootstrapMarkerKey as mc, coerceParameterTypedValue as mi, canonicalizeRegion as ml, exportAliasCollisionScrubWarning as mn, replayWarn as mo, ProviderRegistry as mr, recoverMaskedOutput as ms, makeSiblingClaimReader as mt, IMPLICIT_DELETE_DEPENDENCIES as n, malformedOutputsRefusalMessage as na, AssetPublisher as nc, applyCallerIdentityCredentials as ni, stateBucketExistenceConfirmed as nl, getCurrentProducerRegions as nn, renderStatefulReason as no, withCreateTokenLedger as nr, snapshotPassProvenance as ns, formatResourceLine as nt, isAbsoluteAssetPath as o, malformedResourcePropertiesWarning as oa, buildAssetRedirectMap as oc, s3BucketArn as oi, CFN_TEMPLATE_URL_LIMIT as ol, redactedDeleteAddressFields as on, toCfnInteger as oo, planTagDiff as or, withoutPhysicalNameCopies as os, gray as ot, readRecordedConditionVerdicts as p, refuseMalformedOrphanRecords as pa, ensureAssetStorage as pc, regionLessSecretName as pi, PARTITION_TABLE as pl, displayTextOrWithheld as pn, readConfigString as po, CC_BROKEN_REASON as pr, recordNestedStackParameterExpressions as ps, resourcesNamingDeclaredParameter as pt, INDEX_SETTLE_POLL_INTERVAL_MS as q, unwrittenCreateOnlyReplacement as qa, getLegacyStateBucketName as qc, malformedExportSourceWarning as qi, unsupportedFinalSnapshotError as qn, recordLogOnlyParameterValue as qo, producerLookupOver as qr, hasReadableExportSet as qs, planFailedOps as qt, computeImplicitDeleteEdges as r, malformedOutputsWarning as ra, isSensitiveAttributeName as rc, callerEnvCredentials as ri, warnDeprecatedNoPrefixCliFlag as rl, inheritProducerRegions as rn, WARM_THROUGHPUT_MEMBERS as ro, acquireIdempotencyToken as rr, redactSecretsForState as rs, createReadOnlyAttributeHealerFactory as rt, listNestedTemplateRows as s, malformedResourcesWarning as sa, createAssetRedirectResolver as sc, s3BucketDomainName as si, MIGRATE_TMP_PREFIX as sl, redactedDeleteAddressSkip as sn, toFiniteNumber as so, readTagList as sr, DYNAMIC_REFERENCE_TOKEN_SCAN as ss, green as st, DeployEngine as t, malformedOrphansWarning as ta, shouldRetainResource as tc, AWS_CREDENTIAL_ENV_KEYS as ti, resolveUseCdkBootstrapAssets as tl, findNestedStackTypeChanges as tn, isStatefulRecreateTargetSync as to, reserveStackCreateToken as tr, recordReferenceProvenanceEntry as ts, markRefusedBeforeApplying as tt, conditionFingerprint as u, previewableOrphanRecords as ua, AssetModeResolver as uc, s3BucketWebsiteUrl as ui, CUSTOM_RESOURCE_RESPONSE_OBJECT_DESCRIPTION as ul, DeploymentEventsReader as un, configBooleanRefusal as uo, tagPlanWarning as ur, pathCrossesDottedKey as us, computeParameterTaint as ut, chunks as v, refuseMalformedOutputs as va, validateAssetBucketName as vc, isImpossibleEmptyStoredAttribute as vi, processStackMessages as vl, carriedExportAliasExposure as vn, prefetchCreateOnlyPropertyPaths as vo, TemplateNoEchoReresolver as vr, splitGetAttStringForm as vs, displacedPhysicalIdShown as vt, deferredServiceTokenWarning as w, refuseMalformedResourceEntriesForImport as wa, describeDockerExecFailure as wc, cfnRefValueFromPhysicalId as wi, absoluteAssemblyPathEscape as wl, collectPublishedOutputNames as wn, sameLambdaFunctionAddress as wo, applyCustomResourceResponseExpiration as wr, recordNoEchoParameterFreshValue as ws, revertedNestedRowIds as wt, withApiLimit as x, refuseMalformedResourceEntries as xa, buildDockerImage as xc, isNamelessDynamicReferenceError as xi, hasPlainPrototype$1 as xl, isWholeDynamicReferenceValue as xn, withRetry as xo, getCurrentResourceSecrets as xr, recordMaskOnlyValue as xs, nestedChildStackName as xt, isAccessDeniedError as y, refuseMalformedOutputsForDestroy as ya, validateContainerRepoName as yc, carriesDynamicReference as yi, defineOwnKey as yl, exportNameNoEchoParameters as yn, templateResourceTypes as yo, readsNoEchoDeleteValues as yr, carriesSecretMask as ys, dropSettledNestedJournals as yt, DynamoDBGlobalTableProvider as z, repairMalformedResourcePropertiesForReadOnly as za, escapeRegExp$3 as zc, displayLogicalId as zi, ATOMIC_FINAL_SNAPSHOT_TYPES as zn, valueAtCoordinate as zo, isTerminationProtectionPropagationError as zr, applyCrossPrefixScan as zs, destroyStackRecordsView as zt };
46162
+ //# sourceMappingURL=deploy-engine-4K_B3N08.js.map