@go-to-k/cdkd 0.284.0 → 0.284.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { $ as IntrinsicFunctionResolver, $n as StackTerminationProtectionError, $t as buildDenyExternalAccessPolicy, A as formatResourceLine, An as processStackMessages, At as withRetry, B as isExportAliasCollision, Bt as buildAssetRedirectMap, C as refusesFinalSnapshot, Cn as findLargeInlineResources, Ct as s3BucketDualStackDomainName, D as MULTI_REGION_RECREATE_BLOCKED_TYPES, Dn as canonicalizeRegion, Dt as DiffCalculator, E as extractDeploymentEventError, En as PARTITION_TABLE, Et as applyRoleArnIfSet, F as red, Fn as resetAwsClients, Ft as rebuildClientForBucketRegion, G as clearOnUpdateRemoval, Gt as stripControlChars, H as stateKeySecretExposure, Hn as LocalInvokeBuildError$1, Ht as loadPublishableAssetManifest, I as yellow, In as setAwsClients, It as shouldRetainResource, J as findSilentDropProperties, Jn as PartialFailureError, Jt as ensureAssetStorage, K as ProviderRegistry, Kn as MissingCdkCliError, Kt as AssetModeResolver, L as collectDeclaredOutputNames, Lt as AssetPublisher, M as cyan, Mn as resolveBucketRegion, Mt as TemplateParser, N as gray, Nn as AwsClients, Nt as LockManager, O as isStatefulRecreateTargetSync, On as derivePartitionAndUrlSuffix, Ot as INTRINSIC_KEYS, P as green, Pn as getAwsClients, Pt as S3StateBackend, Q as isTerminationProtectionPropagationError, Qn as StackHasActiveImportsError, Qt as validateContainerRepoName, R as collectPublishedOutputNames, Rn as CdkdError, Rt as stringifyValue, S as isFinalSnapshotError, Sn as MIGRATE_TMP_PREFIX, St as s3BucketDomainName, T as makeCanonicalizePropertiesFn, Tn as expectedOwnerParam, Tt as s3BucketWebsiteUrl, U as IAMRoleProvider, Un as LocalMigrateError, Ut as rewriteTemplateAssetReferences, V as secretBearingStateKeyWarning, Vn as DeployCancelledError, Vt as createAssetRedirectResolver, W as collectInlinePolicyNamesManagedBySiblings, Wn as LocalStartServiceError, Wt as escapeRegExp, X as slowCcOperationTimeoutMs, Xn as ResourceTimeoutError, Xt as parseBootstrapMarker, Y as CloudControlProvider, Yn as ProvisioningError, Yt as getBootstrapMarkerKey, Z as disableInstanceApiTermination, Zn as ResourceUpdateNotSupportedError, Zt as validateAssetBucketName, _ as ATOMIC_FINAL_SNAPSHOT_TYPES, _n as resolveUseCdkBootstrapAssets, _t as TEMPLATE_SOURCED_RULES, a as DeploymentEventsStore, an as AssetManifestLoader, ar as withErrorHandling, at as resolveExplicitPhysicalId, b as ccRoutedFinalSnapshotError, bn as CFN_TEMPLATE_BODY_LIMIT, bt as scrubResourceRecord, c as replayFailedOperations, cn as synthesisStatusMessage, cr as isThrottlingError, ct as configBooleanRefusal, d as updatePartialReason, dn as resolveApp, dt as replayWarn, en as buildDockerImage, et as cfnRefValueFromPhysicalId, f as UNSPECIFIED_SKIP_REASON, fn as resolveAutoAssetStorage, ft as requireConfigArray, g as computeImplicitDeleteEdges, gn as resolveStateBucketWithDefaultAndSource, gt as STATE_SOURCED_READBACK_RULES, h as IMPLICIT_DELETE_DEPENDENCIES, hn as resolveStateBucketWithDefault, ht as STATE_SOURCED_CROSS_GENERATION_RULES, i as DeploymentEventsReader, in as runDockerStreaming, ir as normalizeAwsError, it as normalizeAwsTagsToCfn, j as bold, jt as DagBuilder, k as renderStatefulReason, kn as AssemblyReader, kt as describeTypeWithThrottleRetry, l as replayRollback, ln as getDefaultStateBucketName, lr as markNonRetryable, lt as configStringRefusal, m as withResourceDeadline, mn as resolveSkipPrefix, mt as requireConfigString, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as getDockerCmd, nt as refStateLookupFromResource, o as planFailedOps, on as getDockerImageBySourceHash, or as isMarkedNonRetryable, ot as assertRegionMatch, p as deleteSkipReason, pn as resolveCaptureObservedState, pt as requireConfigObject, q as findActionableSilentDrops, qn as NestedStackChildDirectDestroyError, qt as BOOTSTRAP_MARKER_PREFIX, r as DeployEngine, rn as runDockerForeground, rt as WAFv2WebACLProvider, s as planRollback, sn as Synthesizer, sr as isRetryableTransientError, st as coerceCfnBoolean, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as formatDockerLoginError, tt as getAccountInfo, u as updatePartialMessage, un as getLegacyStateBucketName, ut as readConfigString, v as PRE_DELETE_SNAPSHOT_TYPES, vn as stateBucketExistenceConfirmed, vt as maskSecretsInText, w as unsupportedFinalSnapshotError, wn as uploadCfnTemplate, wt as s3BucketRegionalDomainName, x as createPreDeleteFinalSnapshot, xn as CFN_TEMPLATE_URL_LIMIT, xt as s3BucketArn, y as buildFinalSnapshotIdentifier, yn as warnDeprecatedNoPrefixCliFlag, yt as redactSecretsForState, z as exportAliasCollisionScrubWarning, zt as WorkGraph } from "./deploy-engine-C7JEL0Mg.js";
2
+ import { $ as IntrinsicFunctionResolver, $n as StackTerminationProtectionError, $t as buildDenyExternalAccessPolicy, A as formatResourceLine, An as processStackMessages, At as withRetry, B as isExportAliasCollision, Bt as buildAssetRedirectMap, C as refusesFinalSnapshot, Cn as findLargeInlineResources, Ct as s3BucketDualStackDomainName, D as MULTI_REGION_RECREATE_BLOCKED_TYPES, Dn as canonicalizeRegion, Dt as DiffCalculator, E as extractDeploymentEventError, En as PARTITION_TABLE, Et as applyRoleArnIfSet, F as red, Fn as resetAwsClients, Ft as rebuildClientForBucketRegion, G as clearOnUpdateRemoval, Gt as stripControlChars, H as stateKeySecretExposure, Hn as LocalInvokeBuildError$1, Ht as loadPublishableAssetManifest, I as yellow, In as setAwsClients, It as shouldRetainResource, J as findSilentDropProperties, Jn as PartialFailureError, Jt as ensureAssetStorage, K as ProviderRegistry, Kn as MissingCdkCliError, Kt as AssetModeResolver, L as collectDeclaredOutputNames, Lt as AssetPublisher, M as cyan, Mn as resolveBucketRegion, Mt as TemplateParser, N as gray, Nn as AwsClients, Nt as LockManager, O as isStatefulRecreateTargetSync, On as derivePartitionAndUrlSuffix, Ot as INTRINSIC_KEYS, P as green, Pn as getAwsClients, Pt as S3StateBackend, Q as isTerminationProtectionPropagationError, Qn as StackHasActiveImportsError, Qt as validateContainerRepoName, R as collectPublishedOutputNames, Rn as CdkdError, Rt as stringifyValue, S as isFinalSnapshotError, Sn as MIGRATE_TMP_PREFIX, St as s3BucketDomainName, T as makeCanonicalizePropertiesFn, Tn as expectedOwnerParam, Tt as s3BucketWebsiteUrl, U as IAMRoleProvider, Un as LocalMigrateError, Ut as rewriteTemplateAssetReferences, V as secretBearingStateKeyWarning, Vn as DeployCancelledError, Vt as createAssetRedirectResolver, W as collectInlinePolicyNamesManagedBySiblings, Wn as LocalStartServiceError, Wt as escapeRegExp, X as slowCcOperationTimeoutMs, Xn as ResourceTimeoutError, Xt as parseBootstrapMarker, Y as CloudControlProvider, Yn as ProvisioningError, Yt as getBootstrapMarkerKey, Z as disableInstanceApiTermination, Zn as ResourceUpdateNotSupportedError, Zt as validateAssetBucketName, _ as ATOMIC_FINAL_SNAPSHOT_TYPES, _n as resolveUseCdkBootstrapAssets, _t as TEMPLATE_SOURCED_RULES, a as DeploymentEventsStore, an as AssetManifestLoader, ar as withErrorHandling, at as resolveExplicitPhysicalId, b as ccRoutedFinalSnapshotError, bn as CFN_TEMPLATE_BODY_LIMIT, bt as scrubResourceRecord, c as replayFailedOperations, cn as synthesisStatusMessage, cr as isThrottlingError, ct as configBooleanRefusal, d as updatePartialReason, dn as resolveApp, dt as replayWarn, en as buildDockerImage, et as cfnRefValueFromPhysicalId, f as UNSPECIFIED_SKIP_REASON, fn as resolveAutoAssetStorage, ft as requireConfigArray, g as computeImplicitDeleteEdges, gn as resolveStateBucketWithDefaultAndSource, gt as STATE_SOURCED_READBACK_RULES, h as IMPLICIT_DELETE_DEPENDENCIES, hn as resolveStateBucketWithDefault, ht as STATE_SOURCED_CROSS_GENERATION_RULES, i as DeploymentEventsReader, in as runDockerStreaming, ir as normalizeAwsError, it as normalizeAwsTagsToCfn, j as bold, jt as DagBuilder, k as renderStatefulReason, kn as AssemblyReader, kt as describeTypeWithThrottleRetry, l as replayRollback, ln as getDefaultStateBucketName, lr as markNonRetryable, lt as configStringRefusal, m as withResourceDeadline, mn as resolveSkipPrefix, mt as requireConfigString, n as DEFAULT_RESOURCE_WARN_AFTER_MS, nn as getDockerCmd, nt as refStateLookupFromResource, o as planFailedOps, on as getDockerImageBySourceHash, or as isMarkedNonRetryable, ot as assertRegionMatch, p as deleteSkipReason, pn as resolveCaptureObservedState, pt as requireConfigObject, q as findActionableSilentDrops, qn as NestedStackChildDirectDestroyError, qt as BOOTSTRAP_MARKER_PREFIX, r as DeployEngine, rn as runDockerForeground, rt as WAFv2WebACLProvider, s as planRollback, sn as Synthesizer, sr as isRetryableTransientError, st as coerceCfnBoolean, t as DEFAULT_RESOURCE_TIMEOUT_MS, tn as formatDockerLoginError, tt as getAccountInfo, u as updatePartialMessage, un as getLegacyStateBucketName, ut as readConfigString, v as PRE_DELETE_SNAPSHOT_TYPES, vn as stateBucketExistenceConfirmed, vt as maskSecretsInText, w as unsupportedFinalSnapshotError, wn as uploadCfnTemplate, wt as s3BucketRegionalDomainName, x as createPreDeleteFinalSnapshot, xn as CFN_TEMPLATE_URL_LIMIT, xt as s3BucketArn, y as buildFinalSnapshotIdentifier, yn as warnDeprecatedNoPrefixCliFlag, yt as redactSecretsForState, z as exportAliasCollisionScrubWarning, zt as WorkGraph } from "./deploy-engine-CruC7Qxn.js";
3
3
  import { a as getLiveRenderer, c as PATTERN_B_RESOURCE_TYPES, d as generateResourceNameWithFallback, h as withStackName, i as runStackBuffered, m as withSkipPrefix, n as getLogger, o as PATTERN_B_NAME_OPTIONS, s as PATTERN_B_NAME_PROPERTIES, u as generateResourceName } from "./logger-zRrlbaQt.js";
4
- import { t as ASGProvider } from "./asg-provider-CMvwsTc7.js";
4
+ import { t as ASGProvider } from "./asg-provider-DDEsD6uA.js";
5
5
  import { AsyncLocalStorage } from "node:async_hooks";
6
6
  import { createHash, randomBytes, randomUUID } from "node:crypto";
7
7
  import { CopyObjectCommand, CreateBucketCommand, DeleteBucketAnalyticsConfigurationCommand, DeleteBucketCommand, DeleteBucketCorsCommand, DeleteBucketEncryptionCommand, DeleteBucketIntelligentTieringConfigurationCommand, DeleteBucketInventoryConfigurationCommand, DeleteBucketLifecycleCommand, DeleteBucketMetricsConfigurationCommand, DeleteBucketOwnershipControlsCommand, DeleteBucketPolicyCommand, DeleteBucketReplicationCommand, DeleteBucketTaggingCommand, DeleteBucketWebsiteCommand, DeleteObjectsCommand, GetBucketAccelerateConfigurationCommand, GetBucketCorsCommand, GetBucketEncryptionCommand, GetBucketLifecycleConfigurationCommand, GetBucketLocationCommand, GetBucketLoggingCommand, GetBucketNotificationConfigurationCommand, GetBucketOwnershipControlsCommand, GetBucketPolicyCommand, GetBucketReplicationCommand, GetBucketTaggingCommand, GetBucketVersioningCommand, GetBucketWebsiteCommand, GetObjectCommand, GetObjectLockConfigurationCommand, GetPublicAccessBlockCommand, HeadBucketCommand, ListBucketAnalyticsConfigurationsCommand, ListBucketIntelligentTieringConfigurationsCommand, ListBucketInventoryConfigurationsCommand, ListBucketMetricsConfigurationsCommand, ListObjectVersionsCommand, ListObjectsV2Command, NoSuchBucket, PutBucketAccelerateConfigurationCommand, PutBucketAnalyticsConfigurationCommand, PutBucketCorsCommand, PutBucketEncryptionCommand, PutBucketIntelligentTieringConfigurationCommand, PutBucketInventoryConfigurationCommand, PutBucketLifecycleConfigurationCommand, PutBucketLoggingCommand, PutBucketMetricsConfigurationCommand, PutBucketNotificationConfigurationCommand, PutBucketOwnershipControlsCommand, PutBucketPolicyCommand, PutBucketReplicationCommand, PutBucketTaggingCommand, PutBucketVersioningCommand, PutBucketWebsiteCommand, PutObjectCommand, PutObjectLockConfigurationCommand, PutPublicAccessBlockCommand, S3Client, S3ServiceException } from "@aws-sdk/client-s3";
@@ -39050,10 +39050,17 @@ function hasMfaConfigProps(properties) {
39050
39050
  * - `WebAuthnRelyingPartyID`/`WebAuthnUserVerification` -> `WebAuthnConfiguration`
39051
39051
  *
39052
39052
  * `MfaConfiguration` (ON/OFF/OPTIONAL) MUST be threaded into this request:
39053
- * `SetUserPoolMfaConfig` is a full-replace of the pool's MFA state, and an
39054
- * omitted `MfaConfiguration` defaults to OFF on the wire which resets the
39055
- * pool to MFA-disabled and makes AWS reject (or silently drop) the per-factor
39056
- * sub-blocks we are trying to enable. Use the template's `MfaConfiguration`
39053
+ * `SetUserPoolMfaConfig` is a full-replace of the pool's MFA state, and AWS
39054
+ * reads an omitted `MfaConfiguration` as OFF. That splits into two MUTUALLY
39055
+ * EXCLUSIVE arms both MEASURED against THIS API, not read off
39056
+ * `UpdateUserPool`'s blanket reset sentence, which holds only field by field:
39057
+ *
39058
+ * - WITH a per-factor sub-block in the request, AWS REJECTS the call: nothing
39059
+ * is reset, and the deploy FAILS.
39060
+ * - WITHOUT one, AWS accepts the call and the pool is silently reset to
39061
+ * MFA-disabled.
39062
+ *
39063
+ * Use the template's `MfaConfiguration`
39057
39064
  * when present; when the template omitted it, default by whether this call
39058
39065
  * enables an MFA FACTOR — `OPTIONAL` if it does, `OFF` (CloudFormation's own
39059
39066
  * default) if it does not. The body comment on that decision explains why both
@@ -39091,11 +39098,11 @@ function buildMfaConfigRequest(physicalId, properties, logger, declaredMfaConfig
39091
39098
  request.MfaConfiguration = declaredMfaConfiguration || (enablesMfaFactor ? "OPTIONAL" : "OFF");
39092
39099
  if (enabledMfasBlank) logger?.warn(`UserPool ${physicalId}: EnabledMfas is an empty string, which declares no MFA factor and is treated as absent — a mangled Fn::Join or an empty String parameter collapses to this shape. Nothing is enabled from it and MfaConfiguration is ${request.MfaConfiguration}; declare the factor names as a list (e.g. ["${MFA_FACTOR_SOFTWARE_TOKEN}"]) if a factor was intended.`);
39093
39100
  const anyFactorBlock = request.SmsMfaConfiguration !== void 0 || request.SoftwareTokenMfaConfiguration !== void 0 || request.EmailMfaConfiguration !== void 0;
39094
- if (request.MfaConfiguration === "OFF" && anyFactorBlock) logger?.warn(`UserPool ${physicalId}: MfaConfiguration is pinned to OFF while an MFA factor block is configured. The factor configuration is still sent, but the pool deploys with MFA DISABLED. Remove MfaConfiguration (or set it to ON / OPTIONAL) to enable the declared factor.`);
39101
+ if (request.MfaConfiguration === "OFF" && anyFactorBlock) logger?.warn(`UserPool ${physicalId}: MfaConfiguration is pinned to OFF while an MFA factor block is configured. AWS REJECTS that combination ("Invalid MFA configuration given, can't turn off MFA and configure an MFA together"), so this deploy FAILS rather than producing a pool with MFA disabled. Remove MfaConfiguration (or set it to ON / OPTIONAL) to enable the declared factor.`);
39095
39102
  const dropped = unrecognizedFactors.map((f) => JSON.stringify(f) ?? String(f));
39096
39103
  if (enabledMfasMalformed) dropped.push(`${JSON.stringify(properties["EnabledMfas"])} (not a list)`);
39097
39104
  if (dropped.length > 0) {
39098
- const consequence = request.MfaConfiguration === "OFF" ? `MfaConfiguration is OFF, so this pool deploys with MFA DISABLED` : anyFactorBlock ? `MfaConfiguration is ${request.MfaConfiguration} and another factor block IS sent, so these entries are silently ignored rather than failing the call on their own` : `MfaConfiguration is ${request.MfaConfiguration} with no factor enabled, so AWS rejects this call rather than deploying the pool with MFA disabled`;
39105
+ const consequence = request.MfaConfiguration === "OFF" && anyFactorBlock ? "MfaConfiguration is OFF while another factor block IS sent, so AWS REJECTS this call outright and the deploy fails" : request.MfaConfiguration === "OFF" ? `MfaConfiguration is OFF, so this pool deploys with MFA DISABLED` : anyFactorBlock ? `MfaConfiguration is ${request.MfaConfiguration} and another factor block IS sent, so these entries are silently ignored rather than failing the call on their own` : `MfaConfiguration is ${request.MfaConfiguration} with no factor enabled, so AWS rejects this call rather than deploying the pool with MFA disabled`;
39099
39106
  logger?.warn(`UserPool ${physicalId}: EnabledMfas entries ${dropped.join(", ")} do not map to an MFA factor block (known: ${MFA_FACTOR_SMS}, ${MFA_FACTOR_SOFTWARE_TOKEN}, ${MFA_FACTOR_EMAIL_OTP}); no factor is enabled from them. ${consequence}.`);
39100
39107
  }
39101
39108
  return request;
@@ -39259,9 +39266,52 @@ var CognitoUserPoolProvider = class {
39259
39266
  /**
39260
39267
  * Build the SDK `Policies` input from the CFn `Policies` blob. Both
39261
39268
  * sub-keys must be forwarded: `SignInPolicy` (passwordless first-auth
39262
- * factors) was silently dropped before issue #1380, and UpdateUserPool
39263
- * resets omitted attributes to their defaults, so leaving it out also
39264
- * wipes an existing sign-in policy on every update.
39269
+ * factors) was silently dropped before issue #1380, so a template that
39270
+ * declared -- or later CHANGED -- the allowed first-auth factors never
39271
+ * reached AWS at all.
39272
+ *
39273
+ * **Forwarding is what APPLIES a declared value; it is NOT what keeps an
39274
+ * existing one alive.** The original rationale here was AWS's blanket "if
39275
+ * you don't provide a value for an attribute, Amazon Cognito sets it to its
39276
+ * default value", i.e. that omitting `SignInPolicy` would WIPE it. MEASURED
39277
+ * us-east-1 2026-08-19 (issue #1968), on a pool created with
39278
+ * `SignInPolicy.AllowedFirstAuthFactors = [PASSWORD, EMAIL_OTP]` on the
39279
+ * default `ESSENTIALS` tier -- no explicit `UserPoolTier` was needed for the
39280
+ * field to be settable:
39281
+ *
39282
+ * - `UpdateUserPool` sending `Policies` with ONLY `PasswordPolicy` left
39283
+ * `SignInPolicy` at `[PASSWORD, EMAIL_OTP]`. Control: that same call's
39284
+ * `--auto-verified-attributes email` applied, so the update really ran.
39285
+ * - `UpdateUserPool` omitting `Policies` entirely left BOTH sub-keys intact
39286
+ * (a non-default `RequireSymbols: false` survived too), while
39287
+ * `AutoVerifiedAttributes` reset from `[email]` to none in that very call
39288
+ * -- the control proving the omission was processed, not ignored.
39289
+ * - An explicit `SignInPolicy` write landed in both directions
39290
+ * (`[PASSWORD]`, then back to `[PASSWORD, EMAIL_OTP]`), so the field is
39291
+ * reachable and writable here rather than silently dropped.
39292
+ * - The MIRROR image holds too, so the ledger entry is measured rather than
39293
+ * generalised from one sub-key: a container carrying ONLY `SignInPolicy`
39294
+ * updated it to `[PASSWORD, WEB_AUTHN]` while leaving a non-default
39295
+ * `PasswordPolicy` (`MinimumLength: 12`, `RequireSymbols: false`) intact,
39296
+ * with the same `--auto-verified-attributes` control.
39297
+ *
39298
+ * So the forwarding stays -- it is the only way a CHANGED sign-in policy is
39299
+ * applied -- but on the measured reason, not the blanket sentence. Do not
39300
+ * generalise that sentence to another field from this site: see
39301
+ * `readLiveMfaConfiguration`'s docstring, which carries the one ledger of
39302
+ * which fields were measured to reset and which were not.
39303
+ *
39304
+ * **Consequence of that measurement, NOT fixed here: there is no removal
39305
+ * path.** This builder forwards only what the template DECLARES, so deleting
39306
+ * `SignInPolicy` from a template sends nothing for it -- and nothing sent
39307
+ * means nothing changed. A user tightening their auth by removing a
39308
+ * passwordless first-auth factor therefore leaves it live on the pool
39309
+ * indefinitely, and `readCurrentState` keeps reporting a drift that
39310
+ * `cdkd drift --revert` cannot clear, since the revert routes through this
39311
+ * same builder. Clearing it needs an explicit reset value on the wire, which
39312
+ * is a behavior change with its own integ and is out of this lane's scope.
39313
+ * Whether CloudFormation removes it on the same template edit is UNMEASURED
39314
+ * -- do not assume parity in either direction.
39265
39315
  */
39266
39316
  toSdkUserPoolPolicies(policies) {
39267
39317
  const result = {};
@@ -39418,10 +39468,37 @@ var CognitoUserPoolProvider = class {
39418
39468
  * `--auto-verified-attributes` change in the same request applied) and that
39419
39469
  * the field is writable here rather than ignored (an explicit
39420
39470
  * `--mfa-configuration OFF` did reset it). So AWS's blanket "unspecified
39421
- * parameters are set to their default value" holds field by field —
39422
- * `AutoVerifiedAttributes` DOES reset, `MfaConfiguration` does not — and
39471
+ * parameters are set to their default value" holds field by field — and
39423
39472
  * there is no MFA-OFF window to design around.
39424
39473
  *
39474
+ * **This paragraph is the single ledger of that field-by-field result; a
39475
+ * per-field verdict belongs at that field's own site, pointing here.** Every
39476
+ * line below was taken with a control proving the omitting call really ran.
39477
+ *
39478
+ * `UpdateUserPool`, on omission:
39479
+ *
39480
+ * - `AutoVerifiedAttributes` — DOES reset when omitted (2026-08-18).
39481
+ * - `MfaConfiguration` — does NOT reset when omitted (2026-08-18, above).
39482
+ * - `Policies` — neither sub-key resets, measured in BOTH directions
39483
+ * (2026-08-19, issue #1968; details at `toSdkUserPoolPolicies`): a
39484
+ * container sent without `SignInPolicy` left `SignInPolicy` intact, a
39485
+ * container sent without `PasswordPolicy` left `PasswordPolicy` intact,
39486
+ * and omitting the container outright left both. Forwarding is still
39487
+ * REQUIRED to APPLY a changed sub-key — preservation is not application —
39488
+ * and no omission can express a REMOVAL.
39489
+ *
39490
+ * `SetUserPoolMfaConfig` — a DIFFERENT API with a DIFFERENT rule, kept in
39491
+ * its own section so neither list is read as evidence for the other:
39492
+ *
39493
+ * - `MfaConfiguration` — an omitted value is read as OFF. With a factor
39494
+ * sub-block in the request AWS REJECTS the call; with none it accepts and
39495
+ * resets the pool to MFA-disabled. An EXPLICIT OFF beside a block is
39496
+ * rejected the same way (2026-08-19, issue #1968; the transcript lives at
39497
+ * the pinned-OFF warning in `buildMfaConfigRequest`).
39498
+ *
39499
+ * Nothing here licenses a claim about a field on neither list, or about one
39500
+ * API from the other's section. Measure it.
39501
+ *
39425
39502
  * The earlier ordering was reached from that doc sentence alone and is kept
39426
39503
  * only because it is strictly safer and already tested: reading first cannot
39427
39504
  * report a value this same call clobbered, whatever AWS does later. Do not
@@ -81296,7 +81373,7 @@ function createMigrateCommand() {
81296
81373
  */
81297
81374
  function buildProgram() {
81298
81375
  const program = new Command();
81299
- program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.284.0");
81376
+ program.name("cdkd").description("CDK Direct - Deploy AWS CDK apps directly via SDK/Cloud Control API").version("0.284.1");
81300
81377
  program.hook("preAction", (_thisCommand, actionCommand) => {
81301
81378
  const { profile } = actionCommand.optsWithGlobals();
81302
81379
  if (profile !== void 0) process.env["AWS_PROFILE"] = profile;