cdk-local 0.149.8 → 0.149.9

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.
@@ -14,13 +14,14 @@ import { Agent as Agent$2 } from "agent-base";
14
14
  import { HttpProxyAgent } from "http-proxy-agent";
15
15
  import { HttpsProxyAgent } from "https-proxy-agent";
16
16
  import { getProxyForUrl } from "proxy-from-env";
17
+ import { GetSecretValueCommand, SecretsManagerClient } from "@aws-sdk/client-secrets-manager";
18
+ import { GetParameterCommand, GetParametersCommand, SSMClient } from "@aws-sdk/client-ssm";
17
19
  import { unzipSync } from "fflate";
18
20
  import { MultiSelectPrompt } from "@clack/core";
19
21
  import { S_BAR, S_BAR_END, S_BAR_START, S_CHECKBOX_ACTIVE, S_CHECKBOX_INACTIVE, S_CHECKBOX_SELECTED, confirm, isCancel, multiselect, select, text } from "@clack/prompts";
20
22
  import { CloudFormationClient, DescribeStacksCommand, ListExportsCommand, ListStackResourcesCommand } from "@aws-sdk/client-cloudformation";
21
23
  import { GetFunctionConfigurationCommand, LambdaClient } from "@aws-sdk/client-lambda";
22
24
  import { BedrockAgentCoreControlClient, GetAgentRuntimeCommand } from "@aws-sdk/client-bedrock-agentcore-control";
23
- import { GetParameterCommand, GetParametersCommand, SSMClient } from "@aws-sdk/client-ssm";
24
25
  import { execFile, spawn } from "node:child_process";
25
26
  import { connect, createServer as createServer$2 } from "node:net";
26
27
  import { promisify } from "node:util";
@@ -38,7 +39,6 @@ import * as chokidar from "chokidar";
38
39
  import { Sha256 } from "@aws-crypto/sha256-js";
39
40
  import { SignatureV4 } from "@smithy/signature-v4";
40
41
  import graphlib from "graphlib";
41
- import { GetSecretValueCommand, SecretsManagerClient } from "@aws-sdk/client-secrets-manager";
42
42
  import * as nodeBuffer from "node:buffer";
43
43
  import * as nodeQuerystring from "node:querystring";
44
44
  import * as vm from "node:vm";
@@ -506,6 +506,355 @@ function effectiveAssumeRoleArn(logicalId, opt) {
506
506
  return opt.perLambda?.[logicalId] ?? opt.globalArn;
507
507
  }
508
508
 
509
+ //#endregion
510
+ //#region src/utils/own-keys.ts
511
+ function defineOwnKey(target, key, value) {
512
+ Object.defineProperty(target, key, {
513
+ value,
514
+ writable: true,
515
+ enumerable: true,
516
+ configurable: true
517
+ });
518
+ }
519
+
520
+ //#endregion
521
+ //#region src/local/dynamic-reference-resolver.ts
522
+ var DynamicReferenceResolutionError = class DynamicReferenceResolutionError extends Error {
523
+ constructor(message) {
524
+ super(message);
525
+ this.name = "DynamicReferenceResolutionError";
526
+ Object.setPrototypeOf(this, DynamicReferenceResolutionError.prototype);
527
+ }
528
+ };
529
+ var DeferredFailure = class extends Error {
530
+ build;
531
+ constructor(build) {
532
+ super("deferred dynamic-reference failure");
533
+ this.build = build;
534
+ }
535
+ render(opts) {
536
+ return new DynamicReferenceResolutionError(this.build(opts.consumer, opts.overridable !== false));
537
+ }
538
+ };
539
+ function deferred(build) {
540
+ return new DeferredFailure(build);
541
+ }
542
+ const DYNAMIC_REFERENCE_SOURCE = String.raw`\{\{resolve:[^}]*\}\}`;
543
+ const DYNAMIC_REFERENCE_DETECT = new RegExp(DYNAMIC_REFERENCE_SOURCE);
544
+ function dynamicReferenceMatcher() {
545
+ return new RegExp(DYNAMIC_REFERENCE_SOURCE, "g");
546
+ }
547
+ function firstUsableRegion(...candidates) {
548
+ return candidates.find((r) => r !== void 0 && r !== "" && r !== "unknown-region");
549
+ }
550
+ function keysOverriddenBy(templateEnv, applyOverrides) {
551
+ const out = /* @__PURE__ */ new Set();
552
+ if (!templateEnv) return out;
553
+ const sentinel = {};
554
+ for (const k of Object.keys(templateEnv)) defineOwnKey(sentinel, k, `\u0000cdkl-sentinel:${k}`);
555
+ const applied = applyOverrides(sentinel);
556
+ for (const k of Object.keys(templateEnv)) if (!Object.hasOwn(applied, k) || applied[k] !== sentinel[k]) out.add(k);
557
+ return out;
558
+ }
559
+ function withoutKeys(env, keys) {
560
+ const out = {};
561
+ for (const k of Object.keys(env)) if (!keys.has(k)) defineOwnKey(out, k, env[k]);
562
+ return out;
563
+ }
564
+ function deployedFillMayBeSecret(templateValue, template) {
565
+ const resources = template?.Resources ?? {};
566
+ const secretAttribute = (logicalId, attribute) => {
567
+ const res = Object.hasOwn(resources, logicalId) ? resources[logicalId] : void 0;
568
+ const type = res && typeof res === "object" ? res["Type"] : void 0;
569
+ if (typeof type !== "string") return false;
570
+ if (type.startsWith("Custom::") || type === "AWS::CloudFormation::CustomResource") return true;
571
+ if (type === "AWS::CloudFormation::Stack") return attribute.startsWith("Outputs.");
572
+ return type === "AWS::IAM::AccessKey" && attribute === "SecretAccessKey" || type === "AWS::AppSync::ApiKey" && attribute === "ApiKey" || type === "AWS::Cognito::UserPoolClient" && attribute === "ClientSecret";
573
+ };
574
+ const getAttTarget = (arg) => {
575
+ if (Array.isArray(arg) && typeof arg[0] === "string" && typeof arg[1] === "string") return [arg[0], arg[1]];
576
+ if (typeof arg === "string" && arg.includes(".")) {
577
+ const i = arg.indexOf(".");
578
+ return [arg.slice(0, i), arg.slice(i + 1)];
579
+ }
580
+ };
581
+ const noEcho = /* @__PURE__ */ new Set();
582
+ for (const [name, decl] of Object.entries(template?.Parameters ?? {})) if (decl && typeof decl === "object") {
583
+ const flag = decl["NoEcho"];
584
+ if (String(flag).toLowerCase() === "true") noEcho.add(name);
585
+ }
586
+ const subNamesNoEcho = (body, bound) => {
587
+ for (const m of body.matchAll(/\$\{([^}!][^}]*)\}/g)) {
588
+ const name = m[1].trim();
589
+ if (bound.has(name)) continue;
590
+ if (noEcho.has(name)) return true;
591
+ const dot = name.indexOf(".");
592
+ if (dot > 0 && secretAttribute(name.slice(0, dot), name.slice(dot + 1))) return true;
593
+ }
594
+ return false;
595
+ };
596
+ const walk = (v) => {
597
+ if (typeof v === "string") return v.includes("{{resolve:");
598
+ if (Array.isArray(v)) return v.some(walk);
599
+ if (v === null || typeof v !== "object") return false;
600
+ const obj = v;
601
+ if (Object.hasOwn(obj, "Fn::ImportValue") || Object.hasOwn(obj, "Fn::GetStackOutput")) return true;
602
+ if (Object.hasOwn(obj, "Fn::GetAtt")) {
603
+ const target = getAttTarget(obj["Fn::GetAtt"]);
604
+ if (target && secretAttribute(target[0], target[1])) return true;
605
+ }
606
+ if (Object.hasOwn(obj, "Ref")) {
607
+ const target = obj["Ref"];
608
+ if (typeof target === "string" && noEcho.has(target)) return true;
609
+ }
610
+ if (Object.hasOwn(obj, "Fn::Sub")) {
611
+ const sub = obj["Fn::Sub"];
612
+ if (typeof sub === "string" && subNamesNoEcho(sub, /* @__PURE__ */ new Set())) return true;
613
+ if (Array.isArray(sub) && typeof sub[0] === "string") {
614
+ const bindings = sub[1] && typeof sub[1] === "object" ? sub[1] : {};
615
+ if (subNamesNoEcho(sub[0], new Set(Object.keys(bindings)))) return true;
616
+ }
617
+ }
618
+ return Object.values(obj).some(walk);
619
+ };
620
+ return walk(templateValue);
621
+ }
622
+ function containsDynamicReference(value) {
623
+ return typeof value === "string" && DYNAMIC_REFERENCE_DETECT.test(value);
624
+ }
625
+ function malformed(raw, why) {
626
+ return new DynamicReferenceResolutionError(`Malformed CloudFormation dynamic reference ${displayUntrustedValue(raw)}: ${why}.`);
627
+ }
628
+ function parseDynamicReference(raw) {
629
+ const m = /^\{\{resolve:([^:{}]*):([^{}]*)\}\}$/.exec(raw);
630
+ if (!m) throw malformed(raw, "expected {{resolve:<service>:<reference>}}");
631
+ const service = m[1];
632
+ const body = m[2];
633
+ if (service === "secretsmanager") return parseSecretsManager(raw, body);
634
+ if (service === "ssm" || service === "ssm-secure") return parseSsm(raw, service, body);
635
+ throw malformed(raw, `unsupported service ${displayUntrustedValue(service)} (expected secretsmanager, ssm or ssm-secure)`);
636
+ }
637
+ function parseSecretsManager(raw, body) {
638
+ const parts = body.split(":");
639
+ let secretId;
640
+ let rest;
641
+ let arnRegion;
642
+ if (body.startsWith("arn:")) {
643
+ if (parts.length < 7 || parts[2] !== "secretsmanager" || parts[5] !== "secret" || !parts[6]) throw malformed(raw, "the secret ARN is not arn:<partition>:secretsmanager:<region>:<account>:secret:<name>");
644
+ secretId = parts.slice(0, 7).join(":");
645
+ arnRegion = parts[3] || void 0;
646
+ rest = parts.slice(7);
647
+ } else {
648
+ secretId = parts[0];
649
+ rest = parts.slice(1);
650
+ }
651
+ if (secretId.length === 0) throw malformed(raw, "the secret id is empty");
652
+ if (rest.length > 4) throw malformed(raw, "too many segments after the secret id (expected SecretString:<json-key>:<version-stage>:<version-id>)");
653
+ const [secretString, jsonKey, versionStage, versionId] = rest;
654
+ if (secretString !== void 0 && secretString !== "" && secretString !== "SecretString") throw malformed(raw, "the only supported value segment is SecretString");
655
+ if (versionStage && versionId) throw malformed(raw, "specify a version stage or a version id, not both");
656
+ return {
657
+ service: "secretsmanager",
658
+ raw,
659
+ secretId,
660
+ ...arnRegion !== void 0 && { arnRegion },
661
+ ...jsonKey && { jsonKey },
662
+ ...versionStage && { versionStage },
663
+ ...versionId && { versionId }
664
+ };
665
+ }
666
+ function parseSsm(raw, service, body) {
667
+ const parts = body.split(":");
668
+ let nameParts;
669
+ let versionParts;
670
+ let arnRegion;
671
+ if (body.startsWith("arn:")) {
672
+ if (parts.length < 6 || parts[2] !== "ssm" || !parts[5]?.startsWith("parameter/")) throw malformed(raw, "the parameter ARN is not arn:<partition>:ssm:<region>:<account>:parameter/<name>");
673
+ nameParts = parts.slice(0, 6);
674
+ versionParts = parts.slice(6);
675
+ arnRegion = parts[3] || void 0;
676
+ } else {
677
+ nameParts = parts.slice(0, 1);
678
+ versionParts = parts.slice(1);
679
+ }
680
+ const name = nameParts.join(":");
681
+ if (name.length === 0) throw malformed(raw, "the parameter name is empty");
682
+ if (versionParts.length > 1) throw malformed(raw, "too many segments after the parameter name");
683
+ const version = versionParts[0];
684
+ if (version !== void 0 && !/^[1-9]\d*$/.test(version)) throw malformed(raw, "the parameter version must be a positive integer");
685
+ return {
686
+ service,
687
+ raw,
688
+ name,
689
+ ...arnRegion !== void 0 && { arnRegion },
690
+ ...version !== void 0 && { version }
691
+ };
692
+ }
693
+ function requiredPermissionsFor(ref) {
694
+ switch (ref.service) {
695
+ case "secretsmanager": return "secretsmanager:GetSecretValue (plus kms:Decrypt when the secret uses a customer managed KMS key)";
696
+ case "ssm": return "ssm:GetParameter";
697
+ case "ssm-secure": return "ssm:GetParameter and kms:Decrypt on the parameter key";
698
+ }
699
+ }
700
+ var DynamicReferenceResolver = class {
701
+ smClients = /* @__PURE__ */ new Map();
702
+ ssmClients = /* @__PURE__ */ new Map();
703
+ cache = /* @__PURE__ */ new Map();
704
+ options;
705
+ constructor(options = {}) {
706
+ this.options = options;
707
+ }
708
+ async resolveString(value, opts) {
709
+ if (!containsDynamicReference(value)) return value;
710
+ const tokens = [...value.matchAll(dynamicReferenceMatcher())].map((m) => m[0]);
711
+ const resolved = await Promise.all(tokens.map((t) => this.resolveToken(t, opts)));
712
+ let i = 0;
713
+ return value.replace(dynamicReferenceMatcher(), () => resolved[i++]);
714
+ }
715
+ dispose() {
716
+ for (const c of this.smClients.values()) c.destroy();
717
+ for (const c of this.ssmClients.values()) c.destroy();
718
+ this.smClients.clear();
719
+ this.ssmClients.clear();
720
+ this.cache.clear();
721
+ }
722
+ resolveToken(raw, opts) {
723
+ let ref;
724
+ try {
725
+ ref = parseDynamicReference(raw);
726
+ } catch (err) {
727
+ if (!(err instanceof DynamicReferenceResolutionError)) throw err;
728
+ return Promise.reject(new DynamicReferenceResolutionError(`${err.message.replace(/\.$/, "")} (${opts.consumer}).`));
729
+ }
730
+ const region = firstUsableRegion(ref.arnRegion, opts.region);
731
+ const cacheKey = `${region ?? ""}\u0000${raw}`;
732
+ let pending = this.cache.get(cacheKey);
733
+ if (!pending) {
734
+ pending = ref.service === "secretsmanager" ? this.fetchSecret(ref, region) : this.fetchParameter(ref, region);
735
+ this.cache.set(cacheKey, pending);
736
+ pending.catch(() => this.cache.delete(cacheKey));
737
+ }
738
+ const service = ref.service;
739
+ return pending.then((value) => {
740
+ getLogger().child("dynamic-reference").debug(`Resolved ${service} dynamic reference for ${opts.consumer}`);
741
+ return value;
742
+ }, (err) => {
743
+ throw err instanceof DeferredFailure ? err.render(opts) : err;
744
+ });
745
+ }
746
+ smClient(region) {
747
+ const key = region ?? "";
748
+ let c = this.smClients.get(key);
749
+ if (!c) {
750
+ c = this.options.secretsManagerClientFactory?.(region) ?? new SecretsManagerClient({
751
+ ...buildProxyClientConfig({ profile: this.options.profile }),
752
+ ...region && { region },
753
+ ...this.options.profile && { profile: this.options.profile }
754
+ });
755
+ this.smClients.set(key, c);
756
+ }
757
+ return c;
758
+ }
759
+ ssmClient(region) {
760
+ const key = region ?? "";
761
+ let c = this.ssmClients.get(key);
762
+ if (!c) {
763
+ c = this.options.ssmClientFactory?.(region) ?? new SSMClient({
764
+ ...buildProxyClientConfig({ profile: this.options.profile }),
765
+ ...region && { region },
766
+ ...this.options.profile && { profile: this.options.profile }
767
+ });
768
+ this.ssmClients.set(key, c);
769
+ }
770
+ return c;
771
+ }
772
+ fetchFailure(ref, region, operation, err) {
773
+ const name = err instanceof Error ? err.name : "";
774
+ let hint = "";
775
+ if (/NotFound/.test(name)) hint = ` The ${ref.service === "secretsmanager" ? "secret" : "parameter"} (or the requested version) does not exist in ${region ?? "the default region"}.`;
776
+ else if (/AccessDenied|NotAuthorized|UnrecognizedClient|ExpiredToken/.test(name)) hint = " The credentials cdk-local resolves with were refused.";
777
+ const detail = describeAwsFailureForWarn(err, operation);
778
+ return deferred((consumer, overridable) => `Could not resolve CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} (${operation} in ${region ?? "the default region"}): ${detail}.${hint} Resolving it needs ${requiredPermissionsFor(ref)}. cdk-local does not fall back to the unresolved token` + (overridable ? "; override the variable with --env-vars to skip the lookup." : "."));
779
+ }
780
+ async fetchSecret(ref, region) {
781
+ const operation = "SecretsManager GetSecretValue";
782
+ let secretString;
783
+ try {
784
+ secretString = (await this.smClient(region).send(new GetSecretValueCommand({
785
+ SecretId: ref.secretId,
786
+ ...ref.versionStage && { VersionStage: ref.versionStage },
787
+ ...ref.versionId && { VersionId: ref.versionId }
788
+ }))).SecretString;
789
+ } catch (err) {
790
+ throw this.fetchFailure(ref, region, operation, err);
791
+ }
792
+ if (secretString === void 0) throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer}: the secret has no SecretString (binary secrets cannot be referenced).`);
793
+ if (ref.jsonKey === void 0) return secretString;
794
+ const jsonKey = ref.jsonKey;
795
+ let parsed;
796
+ try {
797
+ parsed = JSON.parse(secretString);
798
+ } catch (err) {
799
+ const kind = err instanceof Error ? err.name : "unknown";
800
+ throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} names json-key ${displayUntrustedValue(jsonKey)} but the secret value is not valid JSON (${kind}). The parser detail is withheld because it would echo the secret plaintext.`);
801
+ }
802
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} names json-key ${displayUntrustedValue(jsonKey)} but the secret root is not a JSON object.`);
803
+ if (!Object.hasOwn(parsed, jsonKey)) throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} names json-key ${displayUntrustedValue(jsonKey)} but no such key exists in the secret JSON.`);
804
+ const value = parsed[jsonKey];
805
+ return typeof value === "string" ? value : JSON.stringify(value);
806
+ }
807
+ async fetchParameter(ref, region) {
808
+ const operation = "SSM GetParameter";
809
+ let value;
810
+ let type;
811
+ try {
812
+ const resp = await this.ssmClient(region).send(new GetParameterCommand({
813
+ Name: ref.version !== void 0 ? `${ref.name}:${ref.version}` : ref.name,
814
+ WithDecryption: ref.service === "ssm-secure"
815
+ }));
816
+ value = resp.Parameter?.Value;
817
+ type = resp.Parameter?.Type;
818
+ } catch (err) {
819
+ throw this.fetchFailure(ref, region, operation, err);
820
+ }
821
+ if (value === void 0) throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer}: SSM returned no parameter value.`);
822
+ if (ref.service === "ssm" && type === "SecureString") throw deferred((consumer) => `CloudFormation dynamic reference ${displayUntrustedValue(ref.raw)} for ${consumer} names a SecureString parameter; use {{resolve:ssm-secure:...}} for SecureString parameters.`);
823
+ return value;
824
+ }
825
+ };
826
+ function keysNotFromTemplate(templateEnv, finalEnv) {
827
+ const out = /* @__PURE__ */ new Set();
828
+ for (const [k, v] of Object.entries(finalEnv)) {
829
+ const declared = templateEnv !== void 0 && Object.hasOwn(templateEnv, k) ? templateEnv[k] : void 0;
830
+ if (declared === void 0 || typeof declared !== "string" && typeof declared !== "number" && typeof declared !== "boolean" || String(declared) !== v) out.add(k);
831
+ }
832
+ return out;
833
+ }
834
+ async function resolveDynamicReferencesInEnv(env, options) {
835
+ const candidates = Object.keys(env).filter((k) => !options.skipKeys?.has(k) && containsDynamicReference(env[k]));
836
+ if (candidates.length === 0) return {
837
+ env,
838
+ resolvedKeys: []
839
+ };
840
+ const resolver = options.resolver ?? new DynamicReferenceResolver(options);
841
+ try {
842
+ const values = await Promise.all(candidates.map((k) => resolver.resolveString(env[k], {
843
+ region: options.region,
844
+ consumer: `${options.label} env var ${displayUntrustedValue(k)}`
845
+ })));
846
+ const out = {};
847
+ for (const k of Object.keys(env)) defineOwnKey(out, k, env[k]);
848
+ candidates.forEach((k, i) => defineOwnKey(out, k, values[i]));
849
+ return {
850
+ env: out,
851
+ resolvedKeys: candidates
852
+ };
853
+ } finally {
854
+ if (!options.resolver) resolver.dispose();
855
+ }
856
+ }
857
+
509
858
  //#endregion
510
859
  //#region src/utils/error-handler.ts
511
860
  var CdkLocalError = class CdkLocalError extends Error {
@@ -3612,17 +3961,6 @@ function toFlagName(field) {
3612
3961
  return "--" + field.replace(/([A-Z])/g, "-$1").toLowerCase();
3613
3962
  }
3614
3963
 
3615
- //#endregion
3616
- //#region src/utils/own-keys.ts
3617
- function defineOwnKey(target, key, value) {
3618
- Object.defineProperty(target, key, {
3619
- value,
3620
- writable: true,
3621
- enumerable: true,
3622
- configurable: true
3623
- });
3624
- }
3625
-
3626
3964
  //#endregion
3627
3965
  //#region src/local/state-resolver.ts
3628
3966
  function substituteAgainstState(value, contextOrResources) {
@@ -3988,9 +4326,20 @@ async function resolveImportValueAsync(arg, context) {
3988
4326
  kind: "unresolved",
3989
4327
  reason: `Fn::ImportValue ${displayUntrustedValue(exportName)}: export not found in any deployed stack in this region`
3990
4328
  };
4329
+ return crossStackLiteral(resolved, context.consumerRegion ?? context.pseudoParameters?.region, context);
4330
+ }
4331
+ async function crossStackLiteral(value, producerRegion, context) {
4332
+ if (producerRegion && context.resolveDynamicReferences && containsDynamicReference(value)) {
4333
+ const plain = await context.resolveDynamicReferences(value, producerRegion);
4334
+ context.onDynamicReferenceResolved?.();
4335
+ return {
4336
+ kind: "literal",
4337
+ value: plain
4338
+ };
4339
+ }
3991
4340
  return {
3992
4341
  kind: "literal",
3993
- value: resolved
4342
+ value
3994
4343
  };
3995
4344
  }
3996
4345
  async function resolveGetStackOutputAsync(arg, context) {
@@ -4057,10 +4406,7 @@ async function resolveGetStackOutputAsync(arg, context) {
4057
4406
  kind: "unresolved",
4058
4407
  reason: `Fn::GetStackOutput ${displayUntrustedValue(stackName)}.${displayUntrustedValue(outputName)} (${displayUntrustedValue(region)}): output not found in producer stack state`
4059
4408
  };
4060
- return {
4061
- kind: "literal",
4062
- value: resolved
4063
- };
4409
+ return crossStackLiteral(resolved, region, context);
4064
4410
  }
4065
4411
  function substituteEnvVarsFromState(templateEnv, contextOrResources) {
4066
4412
  const env = {};
@@ -4111,7 +4457,7 @@ function resolveWithSensitivity(value, context) {
4111
4457
  };
4112
4458
  }
4113
4459
  async function resolveWithSensitivityAsync(value, context) {
4114
- if (!context.sensitiveParameters || context.sensitiveParameters.size === 0) return {
4460
+ if ((!context.sensitiveParameters || context.sensitiveParameters.size === 0) && !context.resolveDynamicReferences) return {
4115
4461
  result: await substituteAgainstStateAsync(value, context),
4116
4462
  consumedSensitive: false
4117
4463
  };
@@ -4121,6 +4467,9 @@ async function resolveWithSensitivityAsync(value, context) {
4121
4467
  ...context,
4122
4468
  onSensitiveParameterConsumed: () => {
4123
4469
  consumedSensitive = true;
4470
+ },
4471
+ onDynamicReferenceResolved: () => {
4472
+ consumedSensitive = true;
4124
4473
  }
4125
4474
  }),
4126
4475
  consumedSensitive
@@ -4928,6 +5277,7 @@ function checkVolumeHostPath(hostPath) {
4928
5277
  }
4929
5278
  async function applyCrossStackResolverToTask(task, context) {
4930
5279
  if (!context.crossStackResolver) return;
5280
+ const { resolveDynamicReferences: _envOnly, ...secretContext } = context;
4931
5281
  const rawContainers = (task.resource.Properties ?? {})["ContainerDefinitions"];
4932
5282
  if (!Array.isArray(rawContainers)) return;
4933
5283
  for (let idx = 0; idx < task.containers.length; idx += 1) {
@@ -4963,7 +5313,7 @@ async function applyCrossStackResolverToTask(task, context) {
4963
5313
  if (typeof valueFromRaw === "string" && valueFromRaw.length > 0) continue;
4964
5314
  if (container.secrets.some((s) => s.name === sName)) continue;
4965
5315
  if (!isCrossStackIntrinsic(valueFromRaw)) continue;
4966
- const sub = await substituteAgainstStateAsync(valueFromRaw, context);
5316
+ const sub = await substituteAgainstStateAsync(valueFromRaw, secretContext);
4967
5317
  if (sub.kind === "literal" && typeof sub.value === "string" && sub.value.length > 0) {
4968
5318
  container.secrets.push({
4969
5319
  name: sName,
@@ -12136,6 +12486,8 @@ async function buildContainerSpec(args) {
12136
12486
  let templateEnv = getTemplateEnv$1(lambda.resource);
12137
12487
  const stateBundle = stateByStack.get(lambda.stack.stackName);
12138
12488
  let stateAudit;
12489
+ const plaintextKeys = /* @__PURE__ */ new Set();
12490
+ const deployedSecretKeys = [];
12139
12491
  if (stateBundle) {
12140
12492
  const context = { resources: stateBundle.state.resources };
12141
12493
  if (stateBundle.pseudoParameters) context.pseudoParameters = stateBundle.pseudoParameters;
@@ -12153,13 +12505,15 @@ async function buildContainerSpec(args) {
12153
12505
  unresolved = fb.stillUnresolved;
12154
12506
  for (const key of fb.filled) {
12155
12507
  resolvedKeys.push(key);
12508
+ plaintextKeys.add(key);
12509
+ if (deployedFillMayBeSecret(getTemplateEnv$1(lambda.resource)?.[key], lambda.stack.template)) deployedSecretKeys.push(key);
12156
12510
  getLogger().debug(`Lambda ${logicalId}: filled env var ${key} from deployed function config`);
12157
12511
  }
12158
12512
  }
12159
12513
  stateAudit = {
12160
12514
  resolvedKeys,
12161
12515
  unresolved,
12162
- sensitiveKeys: audit.sensitiveKeys
12516
+ sensitiveKeys: [...audit.sensitiveKeys, ...deployedSecretKeys]
12163
12517
  };
12164
12518
  for (const { key, reason } of unresolved) getLogger().warn(`Lambda ${logicalId}: state source could not substitute env var ${key} (${reason}). Override it via --env-vars or it will be dropped.`);
12165
12519
  }
@@ -12170,6 +12524,14 @@ async function buildContainerSpec(args) {
12170
12524
  const overrideKeyExample = lambdaCdkPath?.replace(/\/Resource$/, "") ?? logicalId;
12171
12525
  getLogger().warn(`Lambda ${logicalId}: env var ${key} contains a CloudFormation intrinsic and was dropped. Override it with --env-vars (e.g. {"${overrideKeyExample}":{"${key}":"<literal>"}}) or pass a state-source flag (e.g. --from-cfn-stack or a host-provided extension) to recover deployed values.`);
12172
12526
  }
12527
+ for (const key of stateAudit?.sensitiveKeys ?? []) plaintextKeys.add(key);
12528
+ for (const key of keysNotFromTemplate(templateEnv, envResult.resolved)) plaintextKeys.add(key);
12529
+ const dynamic = await resolveDynamicReferencesInEnv(envResult.resolved, {
12530
+ region: firstUsableRegion(stateBundle?.region, stackRegionOverride, lambda.stack.region, stsRegion, profileRegion),
12531
+ label: `Lambda ${logicalId}`,
12532
+ skipKeys: plaintextKeys,
12533
+ ...profile !== void 0 && { profile }
12534
+ });
12173
12535
  const dockerEnv = {
12174
12536
  AWS_LAMBDA_FUNCTION_NAME: logicalId,
12175
12537
  AWS_LAMBDA_FUNCTION_MEMORY_SIZE: String(lambda.memoryMb),
@@ -12177,7 +12539,7 @@ async function buildContainerSpec(args) {
12177
12539
  AWS_LAMBDA_FUNCTION_VERSION: "$LATEST",
12178
12540
  AWS_LAMBDA_LOG_GROUP_NAME: `/aws/lambda/${logicalId}`,
12179
12541
  AWS_LAMBDA_LOG_STREAM_NAME: "local",
12180
- ...envResult.resolved
12542
+ ...dynamic.env
12181
12543
  };
12182
12544
  const roleArn = resolveStartApiAssumeRoleArn({
12183
12545
  logicalId,
@@ -12217,7 +12579,8 @@ async function buildContainerSpec(args) {
12217
12579
  target: "/tmp",
12218
12580
  sizeMb: lambda.ephemeralStorageMb
12219
12581
  } : void 0;
12220
- const sensitiveEnvKeys = stateAudit && stateAudit.sensitiveKeys.length > 0 ? new Set(stateAudit.sensitiveKeys) : void 0;
12582
+ const sensitiveKeyList = [...stateAudit?.sensitiveKeys ?? [], ...dynamic.resolvedKeys];
12583
+ const sensitiveEnvKeys = sensitiveKeyList.length > 0 ? new Set(sensitiveKeyList) : void 0;
12221
12584
  if (lambda.kind === "zip") return {
12222
12585
  kind: "zip",
12223
12586
  lambda,
@@ -12631,13 +12994,16 @@ async function loadStateForRoutedStacks(stacks, routes, routesWithAuth, options,
12631
12994
  try {
12632
12995
  const loaded = await provider.load(stack.stackName, stack.region);
12633
12996
  if (!loaded) continue;
12634
- const bundle = { state: {
12635
- version: 1,
12636
- stackName: stack.stackName,
12637
- resources: loaded.resources,
12638
- outputs: loaded.outputs,
12639
- lastModified: 0
12640
- } };
12997
+ const bundle = {
12998
+ state: {
12999
+ version: 1,
13000
+ stackName: stack.stackName,
13001
+ resources: loaded.resources,
13002
+ outputs: loaded.outputs,
13003
+ lastModified: 0
13004
+ },
13005
+ region: loaded.region
13006
+ };
12641
13007
  if (stackHasIntrinsicEnv(stackName)) {
12642
13008
  const pseudo = await resolvePseudoParametersForStartApi(loaded.region, options);
12643
13009
  if (pseudo) bundle.pseudoParameters = pseudo;
@@ -13145,14 +13511,30 @@ function applyProfileCredentialsOverlay(env, profileCreds, assumeRoleActive) {
13145
13511
  else delete env["AWS_SESSION_TOKEN"];
13146
13512
  }
13147
13513
  async function resolveLambdaContainerEnv(lambda, options, profileCredentials, extraStateProviders) {
13514
+ const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
13515
+ try {
13516
+ return await resolveLambdaContainerEnvWith(lambda, options, profileCredentials, extraStateProviders, dynamicRefs);
13517
+ } finally {
13518
+ dynamicRefs.dispose();
13519
+ }
13520
+ }
13521
+ async function resolveLambdaContainerEnvWith(lambda, options, profileCredentials, extraStateProviders, dynamicRefs) {
13148
13522
  const logger = getLogger();
13149
13523
  let stateAudit;
13150
- let templateEnv = getTemplateEnv(lambda.resource);
13524
+ let ownerRegion;
13525
+ const plaintextKeys = /* @__PURE__ */ new Set();
13526
+ const deployedSecretKeys = [];
13527
+ const declaredEnv = getTemplateEnv(lambda.resource);
13528
+ const overrides = readEnvOverridesFile$3(options.envVars);
13529
+ const lambdaCdkPath = readCdkPathOrUndefined(lambda.resource);
13530
+ const overriddenKeys = keysOverriddenBy(declaredEnv, (env) => resolveEnvVars$1(lambda.logicalId, lambdaCdkPath, env, overrides).resolved);
13531
+ let templateEnv = declaredEnv && withoutKeys(declaredEnv, overriddenKeys);
13151
13532
  let stateForRoleHint;
13152
13533
  const stateProvider = createLocalStateProvider(options, lambda.stack.stackName, await resolveCfnFallbackRegion(options, lambda.stack.region), extraStateProviders);
13153
13534
  if (stateProvider) try {
13154
13535
  const loaded = await stateProvider.load(lambda.stack.stackName, lambda.stack.region);
13155
13536
  if (loaded) {
13537
+ ownerRegion = loaded.region;
13156
13538
  stateForRoleHint = {
13157
13539
  version: 1,
13158
13540
  stackName: lambda.stack.stackName,
@@ -13162,7 +13544,11 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
13162
13544
  };
13163
13545
  const subContext = {
13164
13546
  resources: loaded.resources,
13165
- consumerRegion: loaded.region
13547
+ consumerRegion: loaded.region,
13548
+ resolveDynamicReferences: (value, producerRegion) => dynamicRefs.resolveString(value, {
13549
+ region: producerRegion,
13550
+ consumer: `Lambda ${lambda.logicalId} cross-stack env value`
13551
+ })
13166
13552
  };
13167
13553
  if (envHasIntrinsicValue(templateEnv)) {
13168
13554
  const pseudo = await resolvePseudoParametersForInvoke(lambda.stack.region, options);
@@ -13192,6 +13578,8 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
13192
13578
  unresolved = fb.stillUnresolved;
13193
13579
  for (const key of fb.filled) {
13194
13580
  resolvedKeys.push(key);
13581
+ plaintextKeys.add(key);
13582
+ if (deployedFillMayBeSecret(declaredEnv?.[key], lambda.stack.template)) deployedSecretKeys.push(key);
13195
13583
  logger.debug(`${label}: filled env var ${key} from deployed function config`);
13196
13584
  }
13197
13585
  }
@@ -13199,7 +13587,7 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
13199
13587
  stateAudit = {
13200
13588
  resolvedKeys,
13201
13589
  unresolved,
13202
- sensitiveKeys: audit.sensitiveKeys
13590
+ sensitiveKeys: [...audit.sensitiveKeys, ...deployedSecretKeys]
13203
13591
  };
13204
13592
  for (const { key, reason } of unresolved) logger.warn(`${label}: could not substitute env var ${key} (${reason}). Override it via --env-vars or it will be dropped.`);
13205
13593
  }
@@ -13207,14 +13595,20 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
13207
13595
  stateProvider.dispose();
13208
13596
  throw err;
13209
13597
  }
13210
- const overrides = readEnvOverridesFile$3(options.envVars);
13211
- const lambdaCdkPath = readCdkPathOrUndefined(lambda.resource);
13212
13598
  const envResult = resolveEnvVars$1(lambda.logicalId, lambdaCdkPath, templateEnv, overrides);
13213
13599
  for (const key of envResult.unresolved) {
13214
13600
  if (stateAudit && stateAudit.unresolved.some((u) => u.key === key)) continue;
13215
13601
  const overrideKeyExample = lambdaCdkPath?.replace(/\/Resource$/, "") ?? lambda.logicalId;
13216
13602
  logger.warn(`Environment variable ${key} contains a CloudFormation intrinsic and was dropped. Override it with --env-vars (e.g. {"${overrideKeyExample}":{"${key}":"<literal>"}}), or pass a state-source flag (e.g. --from-cfn-stack or a host-provided extension) to recover deployed values.`);
13217
13603
  }
13604
+ for (const key of stateAudit?.sensitiveKeys ?? []) plaintextKeys.add(key);
13605
+ for (const key of keysNotFromTemplate(templateEnv, envResult.resolved)) plaintextKeys.add(key);
13606
+ const dynamic = await resolveDynamicReferencesInEnv(envResult.resolved, {
13607
+ region: firstUsableRegion(ownerRegion, options.stackRegion, lambda.stack.region, options.region, profileCredentials?.region),
13608
+ label: `Lambda ${lambda.logicalId}`,
13609
+ skipKeys: plaintextKeys,
13610
+ resolver: dynamicRefs
13611
+ });
13218
13612
  let resolvedAssumeRoleArn;
13219
13613
  try {
13220
13614
  resolvedAssumeRoleArn = await resolveAssumeRoleArnForLambda(options.assumeRole, stateForRoleHint, stateProvider, lambda.logicalId);
@@ -13228,7 +13622,7 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
13228
13622
  AWS_LAMBDA_FUNCTION_VERSION: "$LATEST",
13229
13623
  AWS_LAMBDA_LOG_GROUP_NAME: `/aws/lambda/${lambda.logicalId}`,
13230
13624
  AWS_LAMBDA_LOG_STREAM_NAME: "local",
13231
- ...envResult.resolved
13625
+ ...dynamic.env
13232
13626
  };
13233
13627
  let assumeSucceeded = false;
13234
13628
  if (resolvedAssumeRoleArn) {
@@ -13264,7 +13658,7 @@ async function resolveLambdaContainerEnv(lambda, options, profileCredentials, ex
13264
13658
  }
13265
13659
  return {
13266
13660
  env: dockerEnv,
13267
- sensitiveEnvKeys: stateAudit?.sensitiveKeys ?? [],
13661
+ sensitiveEnvKeys: [.../* @__PURE__ */ new Set([...stateAudit?.sensitiveKeys ?? [], ...dynamic.resolvedKeys])],
13268
13662
  ...stateForRoleHint !== void 0 && { stateForRoleHint },
13269
13663
  assumeRoleApplied: assumeSucceeded
13270
13664
  };
@@ -14583,13 +14977,28 @@ function findFileAssetByObjectKey$1(fileAssets, hash) {
14583
14977
  for (const asset of fileAssets.values()) if (Object.values(asset.destinations).some((d) => d.objectKey === zip || d.objectKey.endsWith(`/${zip}`))) return asset;
14584
14978
  }
14585
14979
  async function buildContainerEnv(resolved, options, profileCredentials, profileCredsFile, stateProvider, loaded, imageContext) {
14980
+ const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
14981
+ try {
14982
+ return await buildContainerEnvWith(resolved, options, profileCredentials, profileCredsFile, stateProvider, loaded, imageContext, dynamicRefs);
14983
+ } finally {
14984
+ dynamicRefs.dispose();
14985
+ }
14986
+ }
14987
+ async function buildContainerEnvWith(resolved, options, profileCredentials, profileCredsFile, stateProvider, loaded, imageContext, dynamicRefs) {
14586
14988
  const logger = getLogger();
14587
- let templateEnv = resolved.environmentVariables;
14989
+ const overrides = readEnvOverridesFile$2(options.envVars);
14990
+ const cdkPath = readCdkPathOrUndefined(resolved.resource);
14991
+ const overriddenKeys = keysOverriddenBy(resolved.environmentVariables, (env) => resolveEnvVars$1(resolved.logicalId, cdkPath, env, overrides).resolved);
14992
+ let templateEnv = withoutKeys(resolved.environmentVariables, overriddenKeys);
14588
14993
  const sensitiveEnvKeys = /* @__PURE__ */ new Set();
14589
14994
  if (stateProvider && loaded) {
14590
14995
  const subContext = {
14591
14996
  resources: imageContext?.stateResources ?? loaded.resources,
14592
- consumerRegion: loaded.region
14997
+ consumerRegion: loaded.region,
14998
+ resolveDynamicReferences: (value, producerRegion) => dynamicRefs.resolveString(value, {
14999
+ region: producerRegion,
15000
+ consumer: `AgentCore Runtime ${resolved.logicalId} cross-stack env value`
15001
+ })
14593
15002
  };
14594
15003
  const pseudo = imageContext?.pseudoParameters ?? derivePseudoParametersFromRegion(loaded.region);
14595
15004
  if (pseudo) subContext.pseudoParameters = pseudo;
@@ -14603,14 +15012,21 @@ async function buildContainerEnv(resolved, options, profileCredentials, profileC
14603
15012
  for (const key of audit.sensitiveKeys) sensitiveEnvKeys.add(key);
14604
15013
  for (const { key, reason } of audit.unresolved) logger.warn(`${stateProvider.label}: could not substitute env var ${key} (${reason}). Override it via --env-vars or it will be dropped.`);
14605
15014
  }
14606
- const overrides = readEnvOverridesFile$2(options.envVars);
14607
- const cdkPath = readCdkPathOrUndefined(resolved.resource);
14608
15015
  const envResult = resolveEnvVars$1(resolved.logicalId, cdkPath, templateEnv, overrides);
14609
15016
  for (const key of envResult.unresolved) {
14610
15017
  const overrideKeyExample = cdkPath?.replace(/\/Resource$/, "") ?? resolved.logicalId;
14611
15018
  logger.warn(`Environment variable ${key} contains a CloudFormation intrinsic and was dropped. Override it with --env-vars (e.g. {"${overrideKeyExample}":{"${key}":"<literal>"}}), or pass a state-source flag (e.g. --from-cfn-stack) to recover deployed values.`);
14612
15019
  }
14613
- const dockerEnv = { ...envResult.resolved };
15020
+ const skipKeys = keysNotFromTemplate(templateEnv, envResult.resolved);
15021
+ for (const key of sensitiveEnvKeys) skipKeys.add(key);
15022
+ const dynamic = await resolveDynamicReferencesInEnv(envResult.resolved, {
15023
+ region: firstUsableRegion(loaded?.region, options.stackRegion, resolved.stack.region, options.region),
15024
+ label: `AgentCore Runtime ${resolved.logicalId}`,
15025
+ skipKeys,
15026
+ resolver: dynamicRefs
15027
+ });
15028
+ for (const key of dynamic.resolvedKeys) sensitiveEnvKeys.add(key);
15029
+ const dockerEnv = { ...dynamic.env };
14614
15030
  const assumeRoleArn = await resolveAssumeRoleArn(options, resolved, loaded, stateProvider);
14615
15031
  await applyAgentCoreCredentialEnv(dockerEnv, {
14616
15032
  ...assumeRoleArn !== void 0 && { assumeRoleArn },
@@ -15588,13 +16004,27 @@ async function runEcsTask(task, options, state) {
15588
16004
  const startOrder = topoSort(buildDependencyGraph(task.containers), task.containers);
15589
16005
  const finchRefusals = [];
15590
16006
  for (const c of task.containers) {
15591
- const refusal = finchSecretArgvRefusal([...c.secrets.map((s) => s.name), ...c.sensitiveEnvKeys].filter((n) => !isMalformedEnvKey(n) && !isDockerClientEnvKey(n)), {
16007
+ const refusal = finchSecretArgvRefusal([
16008
+ ...c.secrets.map((s) => s.name),
16009
+ ...c.sensitiveEnvKeys,
16010
+ ...dynamicReferenceEnvKeys(c, options.envOverrides)
16011
+ ].filter((n) => !isMalformedEnvKey(n) && !isDockerClientEnvKey(n)), {
15592
16012
  label: "Container",
15593
16013
  name: c.name
15594
16014
  });
15595
16015
  if (refusal !== void 0) finchRefusals.push(refusal);
15596
16016
  }
15597
16017
  if (finchRefusals.length > 0) throw new EcsTaskRunnerError(finchRefusals.join("\n"));
16018
+ const argvRefusals = [];
16019
+ for (const c of task.containers) {
16020
+ const fields = [
16021
+ ["Command", c.command],
16022
+ ["EntryPoint", c.entryPoint],
16023
+ ["HealthCheck.Command", c.healthCheck?.command]
16024
+ ];
16025
+ for (const [field, argv] of fields) if (argv?.some((a) => containsDynamicReference(a))) argvRefusals.push(`Container ${displayUntrustedValue(c.name)}: ${field} carries a CloudFormation dynamic reference ({{resolve:...}}). cdk-local resolves dynamic references only in Environment, because resolving one here would put the secret on the docker run argv. Move the value into an Environment variable or a Secrets entry.`);
16026
+ }
16027
+ if (argvRefusals.length > 0) throw new EcsTaskRunnerError(argvRefusals.join("\n"));
15598
16028
  const imagePlan = options.imagePlanByContainer ?? /* @__PURE__ */ new Map();
15599
16029
  if (!options.imagePlanByContainer) await prepareImages(task, imagePlan, options);
15600
16030
  const allSecrets = [];
@@ -15607,6 +16037,22 @@ async function runEcsTask(task, options, state) {
15607
16037
  ...options.region !== void 0 && { region: options.region },
15608
16038
  ...options.profile !== void 0 && { profile: options.profile }
15609
16039
  }));
16040
+ const dynamicEnvByContainer = /* @__PURE__ */ new Map();
16041
+ const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
16042
+ try {
16043
+ for (const c of task.containers) {
16044
+ const tokenKeys = new Set(dynamicReferenceEnvKeys(c, options.envOverrides));
16045
+ if (tokenKeys.size === 0) continue;
16046
+ dynamicEnvByContainer.set(c.name, await resolveDynamicReferencesInEnv(c.environment, {
16047
+ region: firstUsableRegion(options.stackRegion, task.stack.region, options.region),
16048
+ label: `Container ${c.name}`,
16049
+ skipKeys: new Set(Object.keys(c.environment).filter((k) => !tokenKeys.has(k))),
16050
+ resolver: dynamicRefs
16051
+ }));
16052
+ }
16053
+ } finally {
16054
+ dynamicRefs.dispose();
16055
+ }
15610
16056
  if (options.existingNetwork) state.network = {
15611
16057
  ...options.existingNetwork,
15612
16058
  ownedByCaller: true
@@ -15645,9 +16091,14 @@ async function runEcsTask(task, options, state) {
15645
16091
  for (const container of task.containers) {
15646
16092
  const image = imagePlan.get(container.name);
15647
16093
  if (!image) throw new EcsTaskRunnerError(`Internal: no resolved image for container '${container.name}'.`);
16094
+ const dynamic = dynamicEnvByContainer.get(container.name);
15648
16095
  const built = buildDockerRunArgs({
15649
16096
  task,
15650
- container,
16097
+ container: dynamic && dynamic.resolvedKeys.length > 0 ? {
16098
+ ...container,
16099
+ environment: dynamic.env,
16100
+ sensitiveEnvKeys: [...container.sensitiveEnvKeys, ...dynamic.resolvedKeys]
16101
+ } : container,
15651
16102
  image,
15652
16103
  network: state.network.networkName,
15653
16104
  volumeByName,
@@ -15919,6 +16370,18 @@ async function realizeDockerVolumes(volumes, state) {
15919
16370
  function randHex(bytes) {
15920
16371
  return randomBytes(bytes).toString("hex");
15921
16372
  }
16373
+ function overriddenEnvKeys(overrides, containerName) {
16374
+ if (!overrides) return [];
16375
+ return [...Object.keys(overrides["Parameters"] ?? {}), ...Object.keys(overrides[containerName] ?? {})];
16376
+ }
16377
+ function dynamicReferenceEnvKeys(container, overrides) {
16378
+ const skip = /* @__PURE__ */ new Set([
16379
+ ...container.sensitiveEnvKeys,
16380
+ ...container.secrets.map((s) => s.name),
16381
+ ...overriddenEnvKeys(overrides, container.name)
16382
+ ]);
16383
+ return Object.keys(container.environment).filter((k) => !skip.has(k) && containsDynamicReference(container.environment[k]));
16384
+ }
15922
16385
  function groupSecretsByContainer(resolved) {
15923
16386
  const out = /* @__PURE__ */ new Map();
15924
16387
  for (const r of resolved) {
@@ -19395,15 +19858,25 @@ async function resolveServiceAndRunnerOpts(boot, stacks, options, discovery, ski
19395
19858
  const consumerRegion = options.region ?? process.env["AWS_REGION"] ?? process.env["AWS_DEFAULT_REGION"] ?? service.stack.region ?? "us-east-1";
19396
19859
  const resolver = await stateProvider.buildCrossStackResolver(consumerRegion);
19397
19860
  if (resolver) {
19861
+ const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
19398
19862
  const subContext = {
19399
19863
  resources: imageContext?.stateResources ?? {},
19400
19864
  ...imageContext?.pseudoParameters && { pseudoParameters: imageContext.pseudoParameters },
19401
19865
  ...imageContext?.stateParameters && { parameters: imageContext.stateParameters },
19402
19866
  ...imageContext?.stateSensitiveParameters?.length && { sensitiveParameters: new Set(imageContext.stateSensitiveParameters) },
19403
19867
  consumerRegion,
19404
- crossStackResolver: resolver
19868
+ crossStackResolver: resolver,
19869
+ resolveDynamicReferences: (value, producerRegion) => dynamicRefs.resolveString(value, {
19870
+ region: producerRegion,
19871
+ consumer: `Task ${service.task.taskDefinitionLogicalId} cross-stack env value`,
19872
+ overridable: false
19873
+ })
19405
19874
  };
19406
- await applyCrossStackResolverToTask(service.task, subContext);
19875
+ try {
19876
+ await applyCrossStackResolverToTask(service.task, subContext);
19877
+ } finally {
19878
+ dynamicRefs.dispose();
19879
+ }
19407
19880
  }
19408
19881
  } else if (!stateProvider && taskNeeds.needsCrossStackResolver) logger.warn("Container Environment / Secrets entries contain Fn::ImportValue / Fn::GetStackOutput intrinsics. Pass a state-source flag (e.g. --from-cfn-stack or a host-provided extension) to substitute them against deployed state.");
19409
19882
  const effectiveAssumeRole = resolveEcsAssumeRoleOption(options);
@@ -19427,6 +19900,7 @@ async function resolveServiceAndRunnerOpts(boot, stacks, options, discovery, ski
19427
19900
  detach: true
19428
19901
  };
19429
19902
  if (envOverrides) taskOpts.envOverrides = envOverrides;
19903
+ if (options.stackRegion) taskOpts.stackRegion = options.stackRegion;
19430
19904
  if (assumedCredentials) taskOpts.taskCredentials = assumedCredentials;
19431
19905
  if (resolvedRoleArn) taskOpts.taskRoleArn = resolvedRoleArn;
19432
19906
  if (options.platform) taskOpts.platformOverride = options.platform;
@@ -20045,14 +20519,27 @@ async function localRunTaskCommand(target, options, extraStateProviders) {
20045
20519
  if (stateProvider && taskNeeds.needsCrossStackResolver) {
20046
20520
  const consumerRegion = options.region ?? process.env["AWS_REGION"] ?? process.env["AWS_DEFAULT_REGION"] ?? task.stack.region ?? "us-east-1";
20047
20521
  const resolver = await stateProvider.buildCrossStackResolver(consumerRegion);
20048
- if (resolver) await applyCrossStackResolverToTask(task, {
20049
- resources: imageContext?.stateResources ?? {},
20050
- ...imageContext?.pseudoParameters && { pseudoParameters: imageContext.pseudoParameters },
20051
- ...imageContext?.stateParameters && { parameters: imageContext.stateParameters },
20052
- ...imageContext?.stateSensitiveParameters?.length && { sensitiveParameters: new Set(imageContext.stateSensitiveParameters) },
20053
- consumerRegion,
20054
- crossStackResolver: resolver
20055
- });
20522
+ if (resolver) {
20523
+ const dynamicRefs = new DynamicReferenceResolver({ ...options.profile !== void 0 && { profile: options.profile } });
20524
+ const subContext = {
20525
+ resources: imageContext?.stateResources ?? {},
20526
+ ...imageContext?.pseudoParameters && { pseudoParameters: imageContext.pseudoParameters },
20527
+ ...imageContext?.stateParameters && { parameters: imageContext.stateParameters },
20528
+ ...imageContext?.stateSensitiveParameters?.length && { sensitiveParameters: new Set(imageContext.stateSensitiveParameters) },
20529
+ consumerRegion,
20530
+ crossStackResolver: resolver,
20531
+ resolveDynamicReferences: (value, producerRegion) => dynamicRefs.resolveString(value, {
20532
+ region: producerRegion,
20533
+ consumer: `Task ${task.taskDefinitionLogicalId} cross-stack env value`,
20534
+ overridable: false
20535
+ })
20536
+ };
20537
+ try {
20538
+ await applyCrossStackResolverToTask(task, subContext);
20539
+ } finally {
20540
+ dynamicRefs.dispose();
20541
+ }
20542
+ }
20056
20543
  } else if (!stateProvider && taskNeeds.needsCrossStackResolver) logger.warn("Container Environment / Secrets entries contain Fn::ImportValue / Fn::GetStackOutput intrinsics. Pass a state-source flag (e.g. --from-cfn-stack or a host-provided extension) to substitute them against deployed state.");
20057
20544
  sigintHandler = () => {
20058
20545
  sigintCount += 1;
@@ -20092,6 +20579,7 @@ async function localRunTaskCommand(target, options, extraStateProviders) {
20092
20579
  if (resolvedRoleArn) runOpts.taskRoleArn = resolvedRoleArn;
20093
20580
  if (options.platform) runOpts.platformOverride = options.platform;
20094
20581
  if (options.region) runOpts.region = options.region;
20582
+ if (options.stackRegion) runOpts.stackRegion = options.stackRegion;
20095
20583
  if (options.ecrRoleArn) runOpts.ecrRoleArn = options.ecrRoleArn;
20096
20584
  if (options.profile) runOpts.profile = options.profile;
20097
20585
  const hostPortOverrides = parseHostPortOverrides(options.hostPort);
@@ -29038,5 +29526,5 @@ function addStudioSpecificOptions(cmd) {
29038
29526
  }
29039
29527
 
29040
29528
  //#endregion
29041
- export { applyEdgeResponseResult as $, buildJwksUrlFromIssuer as $n, resolveCfnStackName as $r, buildCloudMapIndex as $t, startAgentCoreHttpServer as A, resolveProfileCredentials as Ai, classifySourceChange as An, ConnectionRegistry as Ar, addRunTaskSpecificOptions as At, idFromArn as B, buildStageMap as Bn, resolveRuntimeFileExtension as Br, resolveEcsAssumeRoleOption as Bt, addListSpecificOptions as C, resolveAgentCoreTarget as Ci, waitForAgentCorePing as Cn, tryParseStatus as Cr, parseLbPortOverrides as Ct, createLocalStartAgentCoreCommand as D, tryResolveImageFnJoin as Di, computeCodeImageTag as Dn, probeHostGatewaySupport as Dr, addStartServiceSpecificOptions as Dt, addStartAgentCoreSpecificOptions as E, substituteImagePlaceholders as Ei, buildAgentCoreCodeImage as En, HOST_GATEWAY_MIN_VERSION as Er, resolveAlbFrontDoor as Et, createLocalStartCloudFrontCommand as F, createWatchPredicates as Fn, buildDisconnectEvent as Fr, addImageOverrideOptions as Ft, classifyS3Error as G, filterRoutesByApiIdentifiers as Gn, substituteEnvVarsFromState as Gr, enforceImageOverrideOrphans as Gt, createDeployedKvsDataSource as H, resolveEnvVars$1 as Hn, EcsTaskResolutionError as Hr, runEcsServiceEmulator as Ht, normalizeKvsFileKeys as I, resolveApiTargetSubset as In, buildMessageEvent as Ir, buildEcsImageResolutionContext$1 as It, startCloudFrontServer as J, startApiServer as Jn, createLocalStateProvider as Jr, resolveImageOverrides as Jt, createS3OriginReader as K, groupRoutesByServer as Kn, substituteEnvVarsFromStateAsync as Kr, mergeForService as Kt, parseKvsFileOverrides as L, createAuthorizerCache as Ln, architectureToPlatform as Lr, ecsClusterOption as Lt, startAgentCoreWsBridge as M, isProxyEnvConfigured as Mi, createLocalInvokeCommand as Mn, handleConnectionsRequest as Mr, MAX_TASKS_SUBNET_RANGE_CAP as Mt, LocalStartCloudFrontError as N, addStartApiSpecificOptions as Nn, parseConnectionsPath as Nr, addCommonEcsServiceOptions as Nt, buildAgentCoreServeAuthCheck as O, LocalInvokeBuildError as Oi, renderCodeDockerfile as On, resolveHostGatewayExtraHosts as Or, createLocalStartServiceCommand as Ot, addStartCloudFrontSpecificOptions as P, createLocalStartApiCommand as Pn, buildConnectEvent as Pr, addEcsAssumeRoleOptions as Pt, applyEdgeRequestResult as Q, buildCognitoJwksUrl as Qn, resolveCfnRegion as Qr, listPinnedTargets as Qt, parseOriginOverrides as R, createFileWatcher as Rn, buildContainerImage as Rr, parseMaxTasks as Rt, StudioEventBus as S, pickAgentCoreCandidateStack as Si, waitForAgentCoreHttpReady as Sn, selectIntegrationResponse as Sr, createLocalStartAlbCommand as St, formatTargetListing as T, formatStateRemedy as Ti, SUPPORTED_CODE_RUNTIMES as Tn, HOST_DOCKER_INTERNAL_GATEWAY as Tr, isApplicationLoadBalancer as Tt, resolveDeployedKvsArnByName as U, availableApiIdentifiers as Un, substituteAgainstState as Ur, ImageOverrideError as Ut, resolveKvsModulesForDistribution as V, materializeLayerFromArn as Vn, resolveRuntimeImage as Vr, resolveSharedSidecarCredentials as Vt, resolveDeployedOriginBucket as W, filterRoutesByApiIdentifier as Wn, substituteAgainstStateAsync as Wr, buildImageOverrideTag as Wt, serveFromStaticOrigin as X, resolveServiceIntegrationParameters as Xn, rejectExplicitCfnStackWithMultipleStacks as Xr, describePinnedImageUri as Xt, resolveErrorResponseCandidates as Y, resolveSelectionExpression as Yn, isCfnFlagPresent as Yr, runImageOverrideBuilds as Yt, serveLambdaUrlOrigin as Z, defaultCredentialsLoader as Zn, resolveCfnFallbackRegion as Zr, isLocalCdkAssetImage as Zt, filterStudioTargetGroups as _, AGENTCORE_AGUI_PROTOCOL as _i, parseSseForJsonRpc as _n, applyAuthorizerOverlay as _r, createCloudFrontModule as _t, createLocalStudioCommand as a, countTargets as ai, attachContainerLogStreamer as an, computeRequestIdentityHash as ar, describeS3OriginDomain as at, renderStudioHtml as b, AGENTCORE_RUNTIME_TYPE as bi, AGENTCORE_SESSION_ID_HEADER as bn, evaluateResponseParameters as br, addAlbSpecificOptions as bt, startStudioProxy as c, discoverWebSocketApis as ci, bridgeAgentCoreWs as cn, invokeTokenAuthorizer as cr, pickFunctionUrlLogicalIdFromOrigin as ct, createStudioDispatcher as d, parseSelectionExpressionPath as di, A2A_PATH as dn, buildCorsConfigByApiId as dr, pickTargetFunctionLogicalId as dt, CfnLocalStateProvider as ei, CloudMapRegistry as en, createJwksCache as er, buildEdgeRequestEvent as et, filterStudioCustomResources as f, webSocketApiMatchesIdentifier as fi, a2aInvokeOnce as fn, buildCorsConfigFromCloudFrontChain as fr, resolveCloudFrontDistribution as ft, annotatePinnedEcsTargets as g, AGENTCORE_A2A_PROTOCOL as gi, mcpInvokeOnce as gn, translateLambdaResponse as gr, stripCloudFrontImport as gt, annotateEcsTaskPinnedTargets as h, resolveLambdaArnIntrinsic as hi, MCP_PROTOCOL_VERSION as hn, matchRoute as hr, runViewerResponse as ht, coerceStopRequest as i, resolveSingleTarget as ii, getContainerNetworkIp as in, buildMethodArn as ir, CLOUDFRONT_DISTRIBUTION_TYPE as it, attachAgentCoreWsBridge as j, buildProxyClientConfig as ji, addInvokeSpecificOptions as jn, buildMgmtEndpointEnvUrl as jr, createLocalRunTaskCommand as jt, selectServeInboundAuth as k, buildStsClientConfig as ki, toCmdArgv as kn, bufferToBody as kr, serviceStrategy as kt, relayServeRequest as l, discoverWebSocketApisOrThrow as li, invokeAgentCoreWs as ln, attachAuthorizers as lr, pickKvsLogicalIdFromArn as lt, annotateAlbPinnedBackingServices as m, pickRefLogicalId as mi, MCP_PATH as mn, matchPreflight as mr, runViewerRequest as mt, coerceRunRequest as n, resolveSsmParameters as ni, SOFT_RELOAD_COMPLETION_LOG_SUFFIX as nn, verifyJwtAuthorizer as nr, edgeHeadersToHttp as nt, resolveServeBaseUrl as o, listTargets as oi, addInvokeAgentCoreSpecificOptions as on, evaluateCachedLambdaPolicy as or, extractKvsAssociations as ot, isCustomResourceLambdaTarget as p, discoverRoutes as pi, MCP_CONTAINER_PORT as pn, isFunctionUrlOacFronted as pr, compileCloudFrontFunction as pt, matchBehavior as q, readMtlsMaterialsFromDisk as qn, LocalStateSourceError as qr, parseImageOverrideFlags as qt, coerceServeRequest as r, resolveWatchConfig as ri, setShadowReadyTimeoutMs as rn, verifyJwtViaDiscovery as rr, httpHeadersToEdge as rt, createStudioServeManager as s, availableWebSocketApiIdentifiers as si, createLocalInvokeAgentCoreCommand as sn, invokeRequestAuthorizer as sr, isCloudFrontDistribution as st, addStudioSpecificOptions as t, collectSsmParameterRefs as ti, DEFAULT_SHADOW_READY_TIMEOUT_MS as tn, verifyCognitoJwt as tr, buildEdgeResponseEvent as tt, reinvoke as u, filterWebSocketApisByIdentifiers as ui, A2A_CONTAINER_PORT as un, applyCorsResponseHeaders as ur, pickLambdaEdgeFunctionLogicalId as ut, startStudioServer as v, AGENTCORE_HTTP_PROTOCOL as vi, AGENTCORE_SIGV4_SERVICE as vn, buildHttpApiV2Event as vr, createLocalFileKvsDataSource as vt, createLocalListCommand as w, derivePseudoParametersFromRegion as wi, downloadAndExtractS3Bundle as wn, VtlEvaluationError as wr, resolveAlbTarget as wt, createStudioStore as x, AgentCoreResolutionError as xi, invokeAgentCore as xn, pickResponseTemplate as xr, albStrategy as xt, toStudioTargetGroups as y, AGENTCORE_MCP_PROTOCOL as yi, signAgentCoreInvocation as yn, buildRestV1Event as yr, createUnboundCloudFrontModule as yt, resolveCloudFrontTarget as z, attachStageContext as zn, resolveRuntimeCodeMountPath as zr, parseRestartPolicy as zt };
29042
- //# sourceMappingURL=local-studio-DGJn7XtJ.js.map
29529
+ export { applyEdgeResponseResult as $, buildJwksUrlFromIssuer as $n, resolveCfnStackName as $r, buildCloudMapIndex as $t, startAgentCoreHttpServer as A, DynamicReferenceResolver as Ai, classifySourceChange as An, ConnectionRegistry as Ar, addRunTaskSpecificOptions as At, idFromArn as B, resolveProfileCredentials as Bi, buildStageMap as Bn, resolveRuntimeFileExtension as Br, resolveEcsAssumeRoleOption as Bt, addListSpecificOptions as C, resolveAgentCoreTarget as Ci, waitForAgentCorePing as Cn, tryParseStatus as Cr, parseLbPortOverrides as Ct, createLocalStartAgentCoreCommand as D, tryResolveImageFnJoin as Di, computeCodeImageTag as Dn, probeHostGatewaySupport as Dr, addStartServiceSpecificOptions as Dt, addStartAgentCoreSpecificOptions as E, substituteImagePlaceholders as Ei, buildAgentCoreCodeImage as En, HOST_GATEWAY_MIN_VERSION as Er, resolveAlbFrontDoor as Et, createLocalStartCloudFrontCommand as F, keysOverriddenBy as Fi, createWatchPredicates as Fn, buildDisconnectEvent as Fr, addImageOverrideOptions as Ft, classifyS3Error as G, filterRoutesByApiIdentifiers as Gn, substituteEnvVarsFromState as Gr, enforceImageOverrideOrphans as Gt, createDeployedKvsDataSource as H, isProxyEnvConfigured as Hi, resolveEnvVars$1 as Hn, EcsTaskResolutionError as Hr, runEcsServiceEmulator as Ht, normalizeKvsFileKeys as I, parseDynamicReference as Ii, resolveApiTargetSubset as In, buildMessageEvent as Ir, buildEcsImageResolutionContext$1 as It, startCloudFrontServer as J, startApiServer as Jn, createLocalStateProvider as Jr, resolveImageOverrides as Jt, createS3OriginReader as K, groupRoutesByServer as Kn, substituteEnvVarsFromStateAsync as Kr, mergeForService as Kt, parseKvsFileOverrides as L, resolveDynamicReferencesInEnv as Li, createAuthorizerCache as Ln, architectureToPlatform as Lr, ecsClusterOption as Lt, startAgentCoreWsBridge as M, deployedFillMayBeSecret as Mi, createLocalInvokeCommand as Mn, handleConnectionsRequest as Mr, MAX_TASKS_SUBNET_RANGE_CAP as Mt, LocalStartCloudFrontError as N, firstUsableRegion as Ni, addStartApiSpecificOptions as Nn, parseConnectionsPath as Nr, addCommonEcsServiceOptions as Nt, buildAgentCoreServeAuthCheck as O, LocalInvokeBuildError as Oi, renderCodeDockerfile as On, resolveHostGatewayExtraHosts as Or, createLocalStartServiceCommand as Ot, addStartCloudFrontSpecificOptions as P, keysNotFromTemplate as Pi, createLocalStartApiCommand as Pn, buildConnectEvent as Pr, addEcsAssumeRoleOptions as Pt, applyEdgeRequestResult as Q, buildCognitoJwksUrl as Qn, resolveCfnRegion as Qr, listPinnedTargets as Qt, parseOriginOverrides as R, withoutKeys as Ri, createFileWatcher as Rn, buildContainerImage as Rr, parseMaxTasks as Rt, StudioEventBus as S, pickAgentCoreCandidateStack as Si, waitForAgentCoreHttpReady as Sn, selectIntegrationResponse as Sr, createLocalStartAlbCommand as St, formatTargetListing as T, formatStateRemedy as Ti, SUPPORTED_CODE_RUNTIMES as Tn, HOST_DOCKER_INTERNAL_GATEWAY as Tr, isApplicationLoadBalancer as Tt, resolveDeployedKvsArnByName as U, availableApiIdentifiers as Un, substituteAgainstState as Ur, ImageOverrideError as Ut, resolveKvsModulesForDistribution as V, buildProxyClientConfig as Vi, materializeLayerFromArn as Vn, resolveRuntimeImage as Vr, resolveSharedSidecarCredentials as Vt, resolveDeployedOriginBucket as W, filterRoutesByApiIdentifier as Wn, substituteAgainstStateAsync as Wr, buildImageOverrideTag as Wt, serveFromStaticOrigin as X, resolveServiceIntegrationParameters as Xn, rejectExplicitCfnStackWithMultipleStacks as Xr, describePinnedImageUri as Xt, resolveErrorResponseCandidates as Y, resolveSelectionExpression as Yn, isCfnFlagPresent as Yr, runImageOverrideBuilds as Yt, serveLambdaUrlOrigin as Z, defaultCredentialsLoader as Zn, resolveCfnFallbackRegion as Zr, isLocalCdkAssetImage as Zt, filterStudioTargetGroups as _, AGENTCORE_AGUI_PROTOCOL as _i, parseSseForJsonRpc as _n, applyAuthorizerOverlay as _r, createCloudFrontModule as _t, createLocalStudioCommand as a, countTargets as ai, attachContainerLogStreamer as an, computeRequestIdentityHash as ar, describeS3OriginDomain as at, renderStudioHtml as b, AGENTCORE_RUNTIME_TYPE as bi, AGENTCORE_SESSION_ID_HEADER as bn, evaluateResponseParameters as br, addAlbSpecificOptions as bt, startStudioProxy as c, discoverWebSocketApis as ci, bridgeAgentCoreWs as cn, invokeTokenAuthorizer as cr, pickFunctionUrlLogicalIdFromOrigin as ct, createStudioDispatcher as d, parseSelectionExpressionPath as di, A2A_PATH as dn, buildCorsConfigByApiId as dr, pickTargetFunctionLogicalId as dt, CfnLocalStateProvider as ei, CloudMapRegistry as en, createJwksCache as er, buildEdgeRequestEvent as et, filterStudioCustomResources as f, webSocketApiMatchesIdentifier as fi, a2aInvokeOnce as fn, buildCorsConfigFromCloudFrontChain as fr, resolveCloudFrontDistribution as ft, annotatePinnedEcsTargets as g, AGENTCORE_A2A_PROTOCOL as gi, mcpInvokeOnce as gn, translateLambdaResponse as gr, stripCloudFrontImport as gt, annotateEcsTaskPinnedTargets as h, resolveLambdaArnIntrinsic as hi, MCP_PROTOCOL_VERSION as hn, matchRoute as hr, runViewerResponse as ht, coerceStopRequest as i, resolveSingleTarget as ii, getContainerNetworkIp as in, buildMethodArn as ir, CLOUDFRONT_DISTRIBUTION_TYPE as it, attachAgentCoreWsBridge as j, containsDynamicReference as ji, addInvokeSpecificOptions as jn, buildMgmtEndpointEnvUrl as jr, createLocalRunTaskCommand as jt, selectServeInboundAuth as k, DynamicReferenceResolutionError as ki, toCmdArgv as kn, bufferToBody as kr, serviceStrategy as kt, relayServeRequest as l, discoverWebSocketApisOrThrow as li, invokeAgentCoreWs as ln, attachAuthorizers as lr, pickKvsLogicalIdFromArn as lt, annotateAlbPinnedBackingServices as m, pickRefLogicalId as mi, MCP_PATH as mn, matchPreflight as mr, runViewerRequest as mt, coerceRunRequest as n, resolveSsmParameters as ni, SOFT_RELOAD_COMPLETION_LOG_SUFFIX as nn, verifyJwtAuthorizer as nr, edgeHeadersToHttp as nt, resolveServeBaseUrl as o, listTargets as oi, addInvokeAgentCoreSpecificOptions as on, evaluateCachedLambdaPolicy as or, extractKvsAssociations as ot, isCustomResourceLambdaTarget as p, discoverRoutes as pi, MCP_CONTAINER_PORT as pn, isFunctionUrlOacFronted as pr, compileCloudFrontFunction as pt, matchBehavior as q, readMtlsMaterialsFromDisk as qn, LocalStateSourceError as qr, parseImageOverrideFlags as qt, coerceServeRequest as r, resolveWatchConfig as ri, setShadowReadyTimeoutMs as rn, verifyJwtViaDiscovery as rr, httpHeadersToEdge as rt, createStudioServeManager as s, availableWebSocketApiIdentifiers as si, createLocalInvokeAgentCoreCommand as sn, invokeRequestAuthorizer as sr, isCloudFrontDistribution as st, addStudioSpecificOptions as t, collectSsmParameterRefs as ti, DEFAULT_SHADOW_READY_TIMEOUT_MS as tn, verifyCognitoJwt as tr, buildEdgeResponseEvent as tt, reinvoke as u, filterWebSocketApisByIdentifiers as ui, A2A_CONTAINER_PORT as un, applyCorsResponseHeaders as ur, pickLambdaEdgeFunctionLogicalId as ut, startStudioServer as v, AGENTCORE_HTTP_PROTOCOL as vi, AGENTCORE_SIGV4_SERVICE as vn, buildHttpApiV2Event as vr, createLocalFileKvsDataSource as vt, createLocalListCommand as w, derivePseudoParametersFromRegion as wi, downloadAndExtractS3Bundle as wn, VtlEvaluationError as wr, resolveAlbTarget as wt, createStudioStore as x, AgentCoreResolutionError as xi, invokeAgentCore as xn, pickResponseTemplate as xr, albStrategy as xt, toStudioTargetGroups as y, AGENTCORE_MCP_PROTOCOL as yi, signAgentCoreInvocation as yn, buildRestV1Event as yr, createUnboundCloudFrontModule as yt, resolveCloudFrontTarget as z, buildStsClientConfig as zi, attachStageContext as zn, resolveRuntimeCodeMountPath as zr, parseRestartPolicy as zt };
29530
+ //# sourceMappingURL=local-studio-CcK2y5Gs.js.map