cdk-local 0.103.7 → 0.103.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.
- package/README.md +2 -2
- package/dist/cli.js +2 -2
- package/dist/index.js +1 -1
- package/dist/internal.js +1 -1
- package/dist/{local-studio-CSMk0ikr.js → local-studio-BEoOU1Y7.js} +134 -20
- package/dist/{local-studio-CSMk0ikr.js.map → local-studio-BEoOU1Y7.js.map} +1 -1
- package/dist/local-studio-D6G31cfP.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -80,7 +80,7 @@ cdkl invoke MyStack/Fn --from-cfn-stack --assume-role # ...and run as its depl
|
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
- **`start-api`** serves one HTTP server per API; a bare `start-api` in a multi-stack app needs `--all-stacks` or `--stack <name>`.
|
|
83
|
-
- **`run-task`** / single-replica **`start-service`** publish declared container ports on the host (`--host-port <container>=<host>`
|
|
83
|
+
- **`run-task`** / single-replica **`start-service`** publish declared container ports on the host (a privileged port like 80 auto-remaps to a free high host port with a WARN; `--host-port <container>=<host>` pins a specific one). **`start-service`** / **`start-alb`** also list each host URL in a `Service endpoints:` banner after boot so the access URL stays visible.
|
|
84
84
|
- **`start-alb`** stands up the ECS service(s) behind an ALB plus a host-side front-door on each listener port, honoring all six listener-rule conditions, weighted forwards, redirect / fixed-response actions, mixed ECS + Lambda targets, `authenticate-cognito` / `authenticate-oidc` actions (local Bearer-JWT enforcement), and WebSocket `Upgrade` proxying to ECS targets ([details](docs/cli-reference.md#cdkl-start-alb-run-an-alb-fronted-service-locally)).
|
|
85
85
|
- **`invoke-agentcore`** invokes a Bedrock AgentCore Runtime agent locally — container or `fromCodeAsset` / `fromS3` managed runtime, all four runtime protocols (HTTP and AGUI on 8080, MCP on 8000, A2A on 9000; SSE and WebSocket are HTTP wire-shape variants on the same 8080 container), with `customJwtAuthorizer` and `--sigv4` enforcement ([details](docs/cli-reference.md#cdkl-invoke-agentcore-run-bedrock-agentcore-runtime-agents-locally)).
|
|
86
86
|
- **`studio`** opens a local web console over the same synthesized targets — a point-and-click front over the same CLI runners. Takes no target (it lists them all). Flags + in-UI controls: [Web console — `cdkl studio`](#web-console--cdkl-studio).
|
|
@@ -200,7 +200,7 @@ Most CDK ECS apps boot multiple replicas behind an ALB. cdk-local exposes each l
|
|
|
200
200
|
**Why the extra flags on the simple case?** The template's `DesiredCount` (typically 3 in production) is honored locally by default, but N replicas can't all bind the same host port — so `start-service` skips host publishing for multi-replica runs and the app is reachable only from inside the `cdkl-svc-` docker network. To get the simple `curl http://127.0.0.1:...` access path:
|
|
201
201
|
|
|
202
202
|
- `--max-tasks 1` clamps the local replica count to 1 without touching your CDK code.
|
|
203
|
-
-
|
|
203
|
+
- A privileged declared host port (`< 1024`, e.g. 80) is auto-remapped to a free high host port — with a WARN naming the remap — because macOS Docker Desktop refuses to publish privileged ports and a `< 1024` host port needs root. `--host-port <containerPort>=<hostPort>` pins a specific host port instead.
|
|
204
204
|
|
|
205
205
|
`start-alb` uses the symmetric `--lb-port <listenerPort>=<hostPort>` for privileged listener ports like 80 / 443, and `--tls` (or `--tls-cert` / `--tls-key`) to terminate TLS locally instead of serving the HTTPS listener over plain HTTP (the default). Full resolution model: [docs/cli-reference.md](docs/cli-reference.md#cdkl-start-alb-run-an-alb-fronted-service-locally).
|
|
206
206
|
|
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { E as createLocalStartAlbCommand, F as createLocalRunTaskCommand, It as createLocalStartApiCommand, M as createLocalStartServiceCommand, Pt as createLocalInvokeCommand, S as createLocalListCommand, a as createLocalStudioCommand, dt as createLocalInvokeAgentCoreCommand } from "./local-studio-
|
|
2
|
+
import { E as createLocalStartAlbCommand, F as createLocalRunTaskCommand, It as createLocalStartApiCommand, M as createLocalStartServiceCommand, Pt as createLocalInvokeCommand, S as createLocalListCommand, a as createLocalStudioCommand, dt as createLocalInvokeAgentCoreCommand } from "./local-studio-BEoOU1Y7.js";
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
|
|
5
5
|
//#region src/cli/index.ts
|
|
6
6
|
const program = new Command();
|
|
7
|
-
program.name("cdkl").description("Run AWS CDK stacks locally with Docker.").version("0.103.
|
|
7
|
+
program.name("cdkl").description("Run AWS CDK stacks locally with Docker.").version("0.103.9");
|
|
8
8
|
program.addCommand(createLocalInvokeCommand());
|
|
9
9
|
program.addCommand(createLocalInvokeAgentCoreCommand());
|
|
10
10
|
program.addCommand(createLocalStartApiCommand());
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { d as setEmbedConfig, l as getEmbedConfig, u as resetEmbedConfig } from "./docker-cmd-GcI_cqY5.js";
|
|
2
|
-
import { $n as resolveCfnStackName, C as formatTargetListing, E as createLocalStartAlbCommand, F as createLocalRunTaskCommand, Gn as substituteEnvVarsFromState, It as createLocalStartApiCommand, Jn as createLocalStateProvider, Kn as substituteEnvVarsFromStateAsync, M as createLocalStartServiceCommand, Pt as createLocalInvokeCommand, Qn as resolveCfnRegion, S as createLocalListCommand, Un as substituteAgainstState, Wn as substituteAgainstStateAsync, Xn as rejectExplicitCfnStackWithMultipleStacks, Yn as isCfnFlagPresent, Zn as resolveCfnFallbackRegion, a as createLocalStudioCommand, ar as countTargets, dt as createLocalInvokeAgentCoreCommand, er as CfnLocalStateProvider, nr as resolveSsmParameters, or as listTargets, qn as LocalStateSourceError, tr as collectSsmParameterRefs } from "./local-studio-
|
|
2
|
+
import { $n as resolveCfnStackName, C as formatTargetListing, E as createLocalStartAlbCommand, F as createLocalRunTaskCommand, Gn as substituteEnvVarsFromState, It as createLocalStartApiCommand, Jn as createLocalStateProvider, Kn as substituteEnvVarsFromStateAsync, M as createLocalStartServiceCommand, Pt as createLocalInvokeCommand, Qn as resolveCfnRegion, S as createLocalListCommand, Un as substituteAgainstState, Wn as substituteAgainstStateAsync, Xn as rejectExplicitCfnStackWithMultipleStacks, Yn as isCfnFlagPresent, Zn as resolveCfnFallbackRegion, a as createLocalStudioCommand, ar as countTargets, dt as createLocalInvokeAgentCoreCommand, er as CfnLocalStateProvider, nr as resolveSsmParameters, or as listTargets, qn as LocalStateSourceError, tr as collectSsmParameterRefs } from "./local-studio-BEoOU1Y7.js";
|
|
3
3
|
|
|
4
4
|
export { CfnLocalStateProvider, LocalStateSourceError, collectSsmParameterRefs, countTargets, createLocalInvokeAgentCoreCommand, createLocalInvokeCommand, createLocalListCommand, createLocalRunTaskCommand, createLocalStartAlbCommand, createLocalStartApiCommand, createLocalStartServiceCommand, createLocalStateProvider, createLocalStudioCommand, formatTargetListing, getEmbedConfig, isCfnFlagPresent, listTargets, rejectExplicitCfnStackWithMultipleStacks, resetEmbedConfig, resolveCfnFallbackRegion, resolveCfnRegion, resolveCfnStackName, resolveSsmParameters, setEmbedConfig, substituteAgainstState, substituteAgainstStateAsync, substituteEnvVarsFromState, substituteEnvVarsFromStateAsync };
|
package/dist/internal.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { $ as runImageOverrideBuilds, $t as defaultCredentialsLoader, A as resolveAlbFrontDoor, An as ConnectionRegistry, Ar as resolveProfileCredentials, At as renderCodeDockerfile, B as buildEcsImageResolutionContext, Bn as resolveRuntimeFileExtension, Bt as createFileWatcher, Cn as pickResponseTemplate, Cr as resolveAgentCoreTarget, Ct as AGENTCORE_SESSION_ID_HEADER, D as parseLbPortOverrides, Dn as HOST_GATEWAY_MIN_VERSION, Dr as tryResolveImageFnJoin, Dt as SUPPORTED_CODE_RUNTIMES, En as VtlEvaluationError, Er as substituteImagePlaceholders, Et as downloadAndExtractS3Bundle, Fn as buildDisconnectEvent, Ft as addStartApiSpecificOptions, G as resolveSharedSidecarCredentials, Gt as availableApiIdentifiers, H as parseMaxTasks, Hn as EcsTaskResolutionError, Ht as buildStageMap, I as MAX_TASKS_SUBNET_RANGE_CAP, In as buildMessageEvent, J as buildImageOverrideTag, Jt as groupRoutesByServer, K as runEcsServiceEmulator, Kt as filterRoutesByApiIdentifier, L as addCommonEcsServiceOptions, Ln as architectureToPlatform, Lt as createWatchPredicates, Mn as handleConnectionsRequest, Mt as classifySourceChange, N as serviceStrategy, Nn as parseConnectionsPath, Nt as addInvokeSpecificOptions, O as resolveAlbTarget, On as probeHostGatewaySupport, Or as LocalInvokeBuildError, Ot as buildAgentCoreCodeImage, P as addRunTaskSpecificOptions, Pn as buildConnectEvent, Q as resolveImageOverrides, Qt as resolveServiceIntegrationParameters, R as addEcsAssumeRoleOptions, Rn as buildContainerImage, Rt as resolveApiTargetSubset, Sn as evaluateResponseParameters, Sr as pickAgentCoreCandidateStack, St as signAgentCoreInvocation, T as albStrategy, Tn as tryParseStatus, Tr as formatStateRemedy, Tt as waitForAgentCorePing, U as parseRestartPolicy, Ut as materializeLayerFromArn, V as ecsClusterOption, Vn as resolveRuntimeImage, Vt as attachStageContext, W as resolveEcsAssumeRoleOption, Wt as resolveEnvVars, X as mergeForService, Xt as startApiServer, Y as enforceImageOverrideOrphans, Yt as readMtlsMaterialsFromDisk, Z as parseImageOverrideFlags, Zt as resolveSelectionExpression, _ as toStudioTargetGroups, _n as matchRoute, _r as AGENTCORE_AGUI_PROTOCOL, _t as MCP_PATH, an as verifyJwtViaDiscovery, at as DEFAULT_SHADOW_READY_TIMEOUT_MS, b as StudioEventBus, bn as buildHttpApiV2Event, br as AGENTCORE_RUNTIME_TYPE, bt as parseSseForJsonRpc, c as startStudioProxy, cn as evaluateCachedLambdaPolicy, cr as discoverWebSocketApis, ct as getContainerNetworkIp, d as createStudioDispatcher, dn as attachAuthorizers, dr as parseSelectionExpressionPath, en as buildCognitoJwksUrl, et as describePinnedImageUri, f as filterStudioCustomResources, fn as applyCorsResponseHeaders, fr as webSocketApiMatchesIdentifier, ft as invokeAgentCoreWs, g as startStudioServer, gn as matchPreflight, gr as AGENTCORE_A2A_PROTOCOL, gt as MCP_CONTAINER_PORT, h as filterStudioTargetGroups, hn as isFunctionUrlOacFronted, hr as resolveLambdaArnIntrinsic, ht as a2aInvokeOnce, i as coerceStopRequest, in as verifyJwtAuthorizer, ir as resolveSingleTarget, it as CloudMapRegistry, j as addStartServiceSpecificOptions, jn as buildMgmtEndpointEnvUrl, jt as toCmdArgv, k as isApplicationLoadBalancer, kn as bufferToBody, kr as buildStsClientConfig, kt as computeCodeImageTag, l as relayServeRequest, ln as invokeRequestAuthorizer, lr as discoverWebSocketApisOrThrow, lt as attachContainerLogStreamer, m as annotatePinnedEcsTargets, mn as buildCorsConfigFromCloudFrontChain, mr as pickRefLogicalId, mt as A2A_PATH, n as coerceRunRequest, nn as createJwksCache, nt as listPinnedTargets, o as resolveServeBaseUrl, on as buildMethodArn, ot as SOFT_RELOAD_COMPLETION_LOG_SUFFIX, p as isCustomResourceLambdaTarget, pn as buildCorsConfigByApiId, pr as discoverRoutes, pt as A2A_CONTAINER_PORT, q as ImageOverrideError, qt as filterRoutesByApiIdentifiers, r as coerceServeRequest, rn as verifyCognitoJwt, rr as resolveWatchConfig, rt as buildCloudMapIndex, s as createStudioServeManager, sn as computeRequestIdentityHash, sr as availableWebSocketApiIdentifiers, st as setShadowReadyTimeoutMs, t as addStudioSpecificOptions, tn as buildJwksUrlFromIssuer, tt as isLocalCdkAssetImage, u as reinvoke, un as invokeTokenAuthorizer, ur as filterWebSocketApisByIdentifiers, ut as addInvokeAgentCoreSpecificOptions, v as renderStudioHtml, vn as translateLambdaResponse, vr as AGENTCORE_HTTP_PROTOCOL, vt as MCP_PROTOCOL_VERSION, w as addAlbSpecificOptions, wn as selectIntegrationResponse, wr as derivePseudoParametersFromRegion, wt as invokeAgentCore, x as addListSpecificOptions, xn as buildRestV1Event, xr as AgentCoreResolutionError, xt as AGENTCORE_SIGV4_SERVICE, y as createStudioStore, yn as applyAuthorizerOverlay, yr as AGENTCORE_MCP_PROTOCOL, yt as mcpInvokeOnce, z as addImageOverrideOptions, zn as resolveRuntimeCodeMountPath, zt as createAuthorizerCache } from "./local-studio-
|
|
1
|
+
import { $ as runImageOverrideBuilds, $t as defaultCredentialsLoader, A as resolveAlbFrontDoor, An as ConnectionRegistry, Ar as resolveProfileCredentials, At as renderCodeDockerfile, B as buildEcsImageResolutionContext, Bn as resolveRuntimeFileExtension, Bt as createFileWatcher, Cn as pickResponseTemplate, Cr as resolveAgentCoreTarget, Ct as AGENTCORE_SESSION_ID_HEADER, D as parseLbPortOverrides, Dn as HOST_GATEWAY_MIN_VERSION, Dr as tryResolveImageFnJoin, Dt as SUPPORTED_CODE_RUNTIMES, En as VtlEvaluationError, Er as substituteImagePlaceholders, Et as downloadAndExtractS3Bundle, Fn as buildDisconnectEvent, Ft as addStartApiSpecificOptions, G as resolveSharedSidecarCredentials, Gt as availableApiIdentifiers, H as parseMaxTasks, Hn as EcsTaskResolutionError, Ht as buildStageMap, I as MAX_TASKS_SUBNET_RANGE_CAP, In as buildMessageEvent, J as buildImageOverrideTag, Jt as groupRoutesByServer, K as runEcsServiceEmulator, Kt as filterRoutesByApiIdentifier, L as addCommonEcsServiceOptions, Ln as architectureToPlatform, Lt as createWatchPredicates, Mn as handleConnectionsRequest, Mt as classifySourceChange, N as serviceStrategy, Nn as parseConnectionsPath, Nt as addInvokeSpecificOptions, O as resolveAlbTarget, On as probeHostGatewaySupport, Or as LocalInvokeBuildError, Ot as buildAgentCoreCodeImage, P as addRunTaskSpecificOptions, Pn as buildConnectEvent, Q as resolveImageOverrides, Qt as resolveServiceIntegrationParameters, R as addEcsAssumeRoleOptions, Rn as buildContainerImage, Rt as resolveApiTargetSubset, Sn as evaluateResponseParameters, Sr as pickAgentCoreCandidateStack, St as signAgentCoreInvocation, T as albStrategy, Tn as tryParseStatus, Tr as formatStateRemedy, Tt as waitForAgentCorePing, U as parseRestartPolicy, Ut as materializeLayerFromArn, V as ecsClusterOption, Vn as resolveRuntimeImage, Vt as attachStageContext, W as resolveEcsAssumeRoleOption, Wt as resolveEnvVars, X as mergeForService, Xt as startApiServer, Y as enforceImageOverrideOrphans, Yt as readMtlsMaterialsFromDisk, Z as parseImageOverrideFlags, Zt as resolveSelectionExpression, _ as toStudioTargetGroups, _n as matchRoute, _r as AGENTCORE_AGUI_PROTOCOL, _t as MCP_PATH, an as verifyJwtViaDiscovery, at as DEFAULT_SHADOW_READY_TIMEOUT_MS, b as StudioEventBus, bn as buildHttpApiV2Event, br as AGENTCORE_RUNTIME_TYPE, bt as parseSseForJsonRpc, c as startStudioProxy, cn as evaluateCachedLambdaPolicy, cr as discoverWebSocketApis, ct as getContainerNetworkIp, d as createStudioDispatcher, dn as attachAuthorizers, dr as parseSelectionExpressionPath, en as buildCognitoJwksUrl, et as describePinnedImageUri, f as filterStudioCustomResources, fn as applyCorsResponseHeaders, fr as webSocketApiMatchesIdentifier, ft as invokeAgentCoreWs, g as startStudioServer, gn as matchPreflight, gr as AGENTCORE_A2A_PROTOCOL, gt as MCP_CONTAINER_PORT, h as filterStudioTargetGroups, hn as isFunctionUrlOacFronted, hr as resolveLambdaArnIntrinsic, ht as a2aInvokeOnce, i as coerceStopRequest, in as verifyJwtAuthorizer, ir as resolveSingleTarget, it as CloudMapRegistry, j as addStartServiceSpecificOptions, jn as buildMgmtEndpointEnvUrl, jt as toCmdArgv, k as isApplicationLoadBalancer, kn as bufferToBody, kr as buildStsClientConfig, kt as computeCodeImageTag, l as relayServeRequest, ln as invokeRequestAuthorizer, lr as discoverWebSocketApisOrThrow, lt as attachContainerLogStreamer, m as annotatePinnedEcsTargets, mn as buildCorsConfigFromCloudFrontChain, mr as pickRefLogicalId, mt as A2A_PATH, n as coerceRunRequest, nn as createJwksCache, nt as listPinnedTargets, o as resolveServeBaseUrl, on as buildMethodArn, ot as SOFT_RELOAD_COMPLETION_LOG_SUFFIX, p as isCustomResourceLambdaTarget, pn as buildCorsConfigByApiId, pr as discoverRoutes, pt as A2A_CONTAINER_PORT, q as ImageOverrideError, qt as filterRoutesByApiIdentifiers, r as coerceServeRequest, rn as verifyCognitoJwt, rr as resolveWatchConfig, rt as buildCloudMapIndex, s as createStudioServeManager, sn as computeRequestIdentityHash, sr as availableWebSocketApiIdentifiers, st as setShadowReadyTimeoutMs, t as addStudioSpecificOptions, tn as buildJwksUrlFromIssuer, tt as isLocalCdkAssetImage, u as reinvoke, un as invokeTokenAuthorizer, ur as filterWebSocketApisByIdentifiers, ut as addInvokeAgentCoreSpecificOptions, v as renderStudioHtml, vn as translateLambdaResponse, vr as AGENTCORE_HTTP_PROTOCOL, vt as MCP_PROTOCOL_VERSION, w as addAlbSpecificOptions, wn as selectIntegrationResponse, wr as derivePseudoParametersFromRegion, wt as invokeAgentCore, x as addListSpecificOptions, xn as buildRestV1Event, xr as AgentCoreResolutionError, xt as AGENTCORE_SIGV4_SERVICE, y as createStudioStore, yn as applyAuthorizerOverlay, yr as AGENTCORE_MCP_PROTOCOL, yt as mcpInvokeOnce, z as addImageOverrideOptions, zn as resolveRuntimeCodeMountPath, zt as createAuthorizerCache } from "./local-studio-BEoOU1Y7.js";
|
|
2
2
|
|
|
3
3
|
export { A2A_CONTAINER_PORT, A2A_PATH, AGENTCORE_A2A_PROTOCOL, AGENTCORE_AGUI_PROTOCOL, AGENTCORE_HTTP_PROTOCOL, AGENTCORE_MCP_PROTOCOL, AGENTCORE_RUNTIME_TYPE, AGENTCORE_SESSION_ID_HEADER, AGENTCORE_SIGV4_SERVICE, AgentCoreResolutionError, CloudMapRegistry, ConnectionRegistry, DEFAULT_SHADOW_READY_TIMEOUT_MS, EcsTaskResolutionError, HOST_GATEWAY_MIN_VERSION, ImageOverrideError, LocalInvokeBuildError, MAX_TASKS_SUBNET_RANGE_CAP, MCP_CONTAINER_PORT, MCP_PATH, MCP_PROTOCOL_VERSION, SOFT_RELOAD_COMPLETION_LOG_SUFFIX, SUPPORTED_CODE_RUNTIMES, StudioEventBus, VtlEvaluationError, a2aInvokeOnce, addAlbSpecificOptions, addCommonEcsServiceOptions, addEcsAssumeRoleOptions, addImageOverrideOptions, addInvokeAgentCoreSpecificOptions, addInvokeSpecificOptions, addListSpecificOptions, addRunTaskSpecificOptions, addStartApiSpecificOptions, addStartServiceSpecificOptions, addStudioSpecificOptions, albStrategy, annotatePinnedEcsTargets, applyAuthorizerOverlay, applyCorsResponseHeaders, architectureToPlatform, attachAuthorizers, attachContainerLogStreamer, attachStageContext, availableApiIdentifiers, availableWebSocketApiIdentifiers, bufferToBody, buildAgentCoreCodeImage, buildCloudMapIndex, buildCognitoJwksUrl, buildConnectEvent, buildContainerImage, buildCorsConfigByApiId, buildCorsConfigFromCloudFrontChain, buildDisconnectEvent, buildEcsImageResolutionContext, buildHttpApiV2Event, buildImageOverrideTag, buildJwksUrlFromIssuer, buildMessageEvent, buildMethodArn, buildMgmtEndpointEnvUrl, buildRestV1Event, buildStageMap, buildStsClientConfig, classifySourceChange, coerceRunRequest, coerceServeRequest, coerceStopRequest, computeCodeImageTag, computeRequestIdentityHash, createAuthorizerCache, createFileWatcher, createJwksCache, createStudioDispatcher, createStudioServeManager, createStudioStore, createWatchPredicates, defaultCredentialsLoader, derivePseudoParametersFromRegion, describePinnedImageUri, discoverRoutes, discoverWebSocketApis, discoverWebSocketApisOrThrow, downloadAndExtractS3Bundle, ecsClusterOption, enforceImageOverrideOrphans, evaluateCachedLambdaPolicy, evaluateResponseParameters, filterRoutesByApiIdentifier, filterRoutesByApiIdentifiers, filterStudioCustomResources, filterStudioTargetGroups, filterWebSocketApisByIdentifiers, formatStateRemedy, getContainerNetworkIp, groupRoutesByServer, handleConnectionsRequest, invokeAgentCore, invokeAgentCoreWs, invokeRequestAuthorizer, invokeTokenAuthorizer, isApplicationLoadBalancer, isCustomResourceLambdaTarget, isFunctionUrlOacFronted, isLocalCdkAssetImage, listPinnedTargets, matchPreflight, matchRoute, materializeLayerFromArn, mcpInvokeOnce, mergeForService, parseConnectionsPath, parseImageOverrideFlags, parseLbPortOverrides, parseMaxTasks, parseRestartPolicy, parseSelectionExpressionPath, parseSseForJsonRpc, pickAgentCoreCandidateStack, pickRefLogicalId, pickResponseTemplate, probeHostGatewaySupport, readMtlsMaterialsFromDisk, reinvoke, relayServeRequest, renderCodeDockerfile, renderStudioHtml, resolveAgentCoreTarget, resolveAlbFrontDoor, resolveAlbTarget, resolveApiTargetSubset, resolveEcsAssumeRoleOption, resolveEnvVars, resolveImageOverrides, resolveLambdaArnIntrinsic, resolveProfileCredentials, resolveRuntimeCodeMountPath, resolveRuntimeFileExtension, resolveRuntimeImage, resolveSelectionExpression, resolveServeBaseUrl, resolveServiceIntegrationParameters, resolveSharedSidecarCredentials, resolveSingleTarget, resolveWatchConfig, runEcsServiceEmulator, runImageOverrideBuilds, selectIntegrationResponse, serviceStrategy, setShadowReadyTimeoutMs, signAgentCoreInvocation, startApiServer, startStudioProxy, startStudioServer, substituteImagePlaceholders, toCmdArgv, toStudioTargetGroups, translateLambdaResponse, tryParseStatus, tryResolveImageFnJoin, verifyCognitoJwt, verifyJwtAuthorizer, verifyJwtViaDiscovery, waitForAgentCorePing, webSocketApiMatchesIdentifier };
|
|
@@ -20647,6 +20647,24 @@ async function runEcsTask(task, options, state) {
|
|
|
20647
20647
|
state.network = await createTaskNetwork(netCreateOpts);
|
|
20648
20648
|
}
|
|
20649
20649
|
const volumeByName = await realizeDockerVolumes(task.volumes, state);
|
|
20650
|
+
let effectiveHostPortOverrides = options.hostPortOverrides;
|
|
20651
|
+
let autoRemappedContainerPorts;
|
|
20652
|
+
if (!options.skipHostPortPublish) {
|
|
20653
|
+
const remaps = await resolvePrivilegedHostPortRemaps({
|
|
20654
|
+
task,
|
|
20655
|
+
userOverrides: options.hostPortOverrides,
|
|
20656
|
+
ephemeralPorts: new Set(options.ephemeralPublishContainerPorts ?? []),
|
|
20657
|
+
allocate: options.allocateHostPort ?? pickFreePort
|
|
20658
|
+
});
|
|
20659
|
+
const remapKeys = Object.keys(remaps);
|
|
20660
|
+
if (remapKeys.length > 0) {
|
|
20661
|
+
effectiveHostPortOverrides = {
|
|
20662
|
+
...options.hostPortOverrides,
|
|
20663
|
+
...remaps
|
|
20664
|
+
};
|
|
20665
|
+
autoRemappedContainerPorts = new Set(remapKeys.map(Number));
|
|
20666
|
+
}
|
|
20667
|
+
}
|
|
20650
20668
|
const dockerCmds = /* @__PURE__ */ new Map();
|
|
20651
20669
|
for (const container of task.containers) {
|
|
20652
20670
|
const image = imagePlan.get(container.name);
|
|
@@ -20665,7 +20683,8 @@ async function runEcsTask(task, options, state) {
|
|
|
20665
20683
|
region: options.region,
|
|
20666
20684
|
sidecarIp: state.network.sidecarIp,
|
|
20667
20685
|
...options.skipHostPortPublish ? { skipHostPortPublish: true } : {},
|
|
20668
|
-
...
|
|
20686
|
+
...effectiveHostPortOverrides ? { hostPortOverrides: effectiveHostPortOverrides } : {},
|
|
20687
|
+
...autoRemappedContainerPorts ? { autoRemappedContainerPorts } : {},
|
|
20669
20688
|
...options.ephemeralPublishContainerPorts && options.ephemeralPublishContainerPorts.length > 0 ? { ephemeralPublishContainerPorts: options.ephemeralPublishContainerPorts } : {},
|
|
20670
20689
|
...options.addHostFlags && options.addHostFlags.length > 0 ? { addHostFlags: options.addHostFlags } : {},
|
|
20671
20690
|
...(options.networkAliasesByContainer?.get(container.name)?.length ?? 0) > 0 ? { networkAliases: options.networkAliasesByContainer.get(container.name) } : {},
|
|
@@ -20992,6 +21011,51 @@ function parseHostPortOverrides(values) {
|
|
|
20992
21011
|
return out;
|
|
20993
21012
|
}
|
|
20994
21013
|
/**
|
|
21014
|
+
* Issue #357 — auto-remap privileged declared host ports to free high host
|
|
21015
|
+
* ports so `docker run` never tries to publish e.g. `127.0.0.1:80:80`.
|
|
21016
|
+
*
|
|
21017
|
+
* For each container port whose DECLARED host port (`hostPort ?? containerPort`)
|
|
21018
|
+
* is privileged (`< 1024`), is NOT already pinned by a user `--host-port`
|
|
21019
|
+
* override, and is NOT an ephemeral front-door port, a free high host port is
|
|
21020
|
+
* allocated and recorded as an additional override. A loud WARN names the remap
|
|
21021
|
+
* and the `--host-port` escape hatch so the change is never silent. The
|
|
21022
|
+
* returned map is keyed by containerPort and meant to be merged OVER the user
|
|
21023
|
+
* overrides (which always win).
|
|
21024
|
+
*
|
|
21025
|
+
* Why: macOS Docker Desktop rejects publishing a privileged host port through
|
|
21026
|
+
* the `com.docker.vmnetd` helper, and a `< 1024` host port needs root on Linux
|
|
21027
|
+
* — so a single-replica `start-service` / `run-task` / `start-alb` publish of a
|
|
21028
|
+
* task definition that declares container port 80 used to fail at `docker run`.
|
|
21029
|
+
* Remapping makes it work out of the box; the user can still pin a specific
|
|
21030
|
+
* (even privileged) port with `--host-port`.
|
|
21031
|
+
*
|
|
21032
|
+
* Pure except for the injected `allocate` (a free-host-port finder). Callers
|
|
21033
|
+
* skip this entirely when host-port publishing is suppressed (multi-replica).
|
|
21034
|
+
* One remap per containerPort (the override map is flat / keyed by container
|
|
21035
|
+
* port), matching the existing `--host-port` semantics.
|
|
21036
|
+
*
|
|
21037
|
+
* Applied automatically by `runEcsTask`; exported (no leading underscore) so the
|
|
21038
|
+
* unit tests can assert the remap decisions directly with an injected allocator.
|
|
21039
|
+
*/
|
|
21040
|
+
async function resolvePrivilegedHostPortRemaps(opts) {
|
|
21041
|
+
const { task, userOverrides, ephemeralPorts, allocate } = opts;
|
|
21042
|
+
const remaps = {};
|
|
21043
|
+
const seen = /* @__PURE__ */ new Set();
|
|
21044
|
+
for (const container of task.containers) for (const pm of container.portMappings) {
|
|
21045
|
+
const cp = pm.containerPort;
|
|
21046
|
+
if (seen.has(cp)) continue;
|
|
21047
|
+
if (ephemeralPorts.has(cp)) continue;
|
|
21048
|
+
if (userOverrides && userOverrides[cp] !== void 0) continue;
|
|
21049
|
+
const declaredHostPort = pm.hostPort ?? cp;
|
|
21050
|
+
if (declaredHostPort >= 1024) continue;
|
|
21051
|
+
seen.add(cp);
|
|
21052
|
+
const freePort = await allocate();
|
|
21053
|
+
remaps[cp] = freePort;
|
|
21054
|
+
getLogger().child("ecs").warn(`Container '${container.name}' container port ${cp} declares a privileged host port ${declaredHostPort}, which cannot be published locally (macOS Docker Desktop rejects privileged-port publishing; a host port < 1024 needs root). Auto-remapped to host port ${freePort}. Pass --host-port ${cp}=<hostPort> to pin a specific host port.`);
|
|
21055
|
+
}
|
|
21056
|
+
return remaps;
|
|
21057
|
+
}
|
|
21058
|
+
/**
|
|
20995
21059
|
* Build the full `docker run -d` argument list for one container.
|
|
20996
21060
|
* Exported (no-leading-underscore) so the unit tests can assert against
|
|
20997
21061
|
* the shape directly without spawning a process.
|
|
@@ -21019,7 +21083,7 @@ function buildDockerRunArgs(opts) {
|
|
|
21019
21083
|
const declaredHostPort = pm.hostPort ?? pm.containerPort;
|
|
21020
21084
|
const hostPort = opts.hostPortOverrides?.[pm.containerPort] ?? declaredHostPort;
|
|
21021
21085
|
const overridden = hostPort !== declaredHostPort;
|
|
21022
|
-
const overrideNote = overridden ? " (--host-port override)" : "";
|
|
21086
|
+
const overrideNote = opts.autoRemappedContainerPorts?.has(pm.containerPort) ?? false ? " (privileged-port auto-remap)" : overridden ? " (--host-port override)" : "";
|
|
21023
21087
|
getLogger().child("ecs").info(`Container '${container.name}' container port ${pm.containerPort} published on ${containerHost}:${hostPort}${overrideNote}. Reach it at ${containerHost}:${hostPort}.`);
|
|
21024
21088
|
args.push("-p", `${containerHost}:${hostPort}:${pm.containerPort}/${pm.protocol}`);
|
|
21025
21089
|
publishedEndpoints.push({
|
|
@@ -28249,6 +28313,15 @@ const OPTION_SPECS = {
|
|
|
28249
28313
|
flag: "--no-verify-auth",
|
|
28250
28314
|
kind: "boolean",
|
|
28251
28315
|
label: "Disable auth guard"
|
|
28316
|
+
},
|
|
28317
|
+
{
|
|
28318
|
+
flag: "--env-vars",
|
|
28319
|
+
kind: "env-kv",
|
|
28320
|
+
label: "Env vars",
|
|
28321
|
+
sep: "=",
|
|
28322
|
+
leftPlaceholder: "KEY",
|
|
28323
|
+
rightPlaceholder: "value",
|
|
28324
|
+
help: "Overlay the backing ECS task container env vars — add KEY=VALUE rows or paste a JSON object."
|
|
28252
28325
|
}
|
|
28253
28326
|
],
|
|
28254
28327
|
agentcore: [
|
|
@@ -28288,20 +28361,32 @@ const OPTION_SPECS = {
|
|
|
28288
28361
|
help: "Overlay container env vars — add KEY=VALUE rows or paste a JSON object."
|
|
28289
28362
|
}
|
|
28290
28363
|
],
|
|
28291
|
-
ecs: [
|
|
28292
|
-
|
|
28293
|
-
|
|
28294
|
-
|
|
28295
|
-
|
|
28296
|
-
|
|
28297
|
-
|
|
28298
|
-
|
|
28299
|
-
|
|
28300
|
-
|
|
28301
|
-
|
|
28302
|
-
|
|
28303
|
-
|
|
28304
|
-
|
|
28364
|
+
ecs: [
|
|
28365
|
+
{
|
|
28366
|
+
flag: "--max-tasks",
|
|
28367
|
+
kind: "scalar",
|
|
28368
|
+
label: "Max replicas",
|
|
28369
|
+
placeholder: "1",
|
|
28370
|
+
inputType: "number"
|
|
28371
|
+
},
|
|
28372
|
+
{
|
|
28373
|
+
flag: "--host-port",
|
|
28374
|
+
kind: "repeat-pair",
|
|
28375
|
+
label: "Container port publish",
|
|
28376
|
+
sep: "=",
|
|
28377
|
+
leftPlaceholder: "containerPort",
|
|
28378
|
+
rightPlaceholder: "hostPort"
|
|
28379
|
+
},
|
|
28380
|
+
{
|
|
28381
|
+
flag: "--env-vars",
|
|
28382
|
+
kind: "env-kv",
|
|
28383
|
+
label: "Env vars",
|
|
28384
|
+
sep: "=",
|
|
28385
|
+
leftPlaceholder: "KEY",
|
|
28386
|
+
rightPlaceholder: "value",
|
|
28387
|
+
help: "Overlay the task container env vars — add KEY=VALUE rows or paste a JSON object."
|
|
28388
|
+
}
|
|
28389
|
+
]
|
|
28305
28390
|
};
|
|
28306
28391
|
/** True when `value` is a non-empty trimmed string. */
|
|
28307
28392
|
function nonEmptyStr(value) {
|
|
@@ -31438,10 +31523,24 @@ function createStudioServeManager(config) {
|
|
|
31438
31523
|
const proxyFactory = config.proxyFactory ?? startStudioProxy;
|
|
31439
31524
|
const captureRequests = config.captureRequests ?? true;
|
|
31440
31525
|
const entries = /* @__PURE__ */ new Map();
|
|
31441
|
-
/**
|
|
31526
|
+
/**
|
|
31527
|
+
* Release every per-serve resource fronting `e` (best-effort; idempotent):
|
|
31528
|
+
* its capture proxies (slice C2) and the `--env-vars` temp dir (issue #355).
|
|
31529
|
+
* Called at every teardown path so neither a proxy socket nor the env file
|
|
31530
|
+
* leaks when a serve stops / errors / times out.
|
|
31531
|
+
*/
|
|
31442
31532
|
async function closeProxies(e) {
|
|
31443
31533
|
const proxies = e.proxies.splice(0);
|
|
31444
31534
|
await Promise.all(proxies.map((p) => p.close().catch(() => void 0)));
|
|
31535
|
+
if (e.envDir) {
|
|
31536
|
+
try {
|
|
31537
|
+
rmSync(e.envDir, {
|
|
31538
|
+
recursive: true,
|
|
31539
|
+
force: true
|
|
31540
|
+
});
|
|
31541
|
+
} catch {}
|
|
31542
|
+
delete e.envDir;
|
|
31543
|
+
}
|
|
31445
31544
|
}
|
|
31446
31545
|
function publicState(e) {
|
|
31447
31546
|
const s = {
|
|
@@ -31468,7 +31567,7 @@ function createStudioServeManager(config) {
|
|
|
31468
31567
|
if (message !== void 0) ev.message = message;
|
|
31469
31568
|
config.bus.emit("serve", ev);
|
|
31470
31569
|
}
|
|
31471
|
-
function buildArgs(req, spec) {
|
|
31570
|
+
function buildArgs(req, spec, envFile) {
|
|
31472
31571
|
const preferAssembly = config.watch !== true;
|
|
31473
31572
|
return [
|
|
31474
31573
|
spec.command,
|
|
@@ -31476,6 +31575,7 @@ function createStudioServeManager(config) {
|
|
|
31476
31575
|
...spec.portArgs,
|
|
31477
31576
|
...buildSharedChildArgs(config, { preferAssembly }),
|
|
31478
31577
|
...buildPerRunArgs(req.kind, req.options),
|
|
31578
|
+
...envFile ? ["--env-vars", envFile] : [],
|
|
31479
31579
|
...req.imageOverride && req.imageOverride.trim() !== "" ? ["--image-override", req.targetId + "=" + req.imageOverride.trim()] : [],
|
|
31480
31580
|
...config.watch === true ? ["--watch"] : [],
|
|
31481
31581
|
...tokenizeRawArgs(req.rawArgs)
|
|
@@ -31487,10 +31587,23 @@ function createStudioServeManager(config) {
|
|
|
31487
31587
|
const existing = entries.get(req.targetId);
|
|
31488
31588
|
if (existing && existing.status !== "stopped" && existing.status !== "error") throw new Error(`'${req.targetId}' is already running.`);
|
|
31489
31589
|
const startedAt = clock();
|
|
31590
|
+
let envDir;
|
|
31591
|
+
const envVars = resolveEnvVars(req.kind, req.options);
|
|
31592
|
+
if (envVars) {
|
|
31593
|
+
envDir = mkdtempSync(join(tmpdir(), "cdkl-studio-env-"));
|
|
31594
|
+
writeFileSync(join(envDir, "env-vars.json"), JSON.stringify(envVars));
|
|
31595
|
+
}
|
|
31596
|
+
const envFile = envDir ? join(envDir, "env-vars.json") : void 0;
|
|
31490
31597
|
let child;
|
|
31491
31598
|
try {
|
|
31492
|
-
child = spawnFn(nodeBin, [config.cliEntry, ...buildArgs(req, spec)], { cwd });
|
|
31599
|
+
child = spawnFn(nodeBin, [config.cliEntry, ...buildArgs(req, spec, envFile)], { cwd });
|
|
31493
31600
|
} catch (err) {
|
|
31601
|
+
if (envDir) try {
|
|
31602
|
+
rmSync(envDir, {
|
|
31603
|
+
recursive: true,
|
|
31604
|
+
force: true
|
|
31605
|
+
});
|
|
31606
|
+
} catch {}
|
|
31494
31607
|
throw err instanceof Error ? err : new Error(String(err));
|
|
31495
31608
|
}
|
|
31496
31609
|
const entry = {
|
|
@@ -31503,6 +31616,7 @@ function createStudioServeManager(config) {
|
|
|
31503
31616
|
proxies: []
|
|
31504
31617
|
};
|
|
31505
31618
|
if (child.pid !== void 0) entry.pid = child.pid;
|
|
31619
|
+
if (envDir) entry.envDir = envDir;
|
|
31506
31620
|
if (req.kind === "ecs") {
|
|
31507
31621
|
const hp = req.options?.["--host-port"];
|
|
31508
31622
|
if (Array.isArray(hp)) {
|
|
@@ -32120,4 +32234,4 @@ function addStudioSpecificOptions(cmd) {
|
|
|
32120
32234
|
|
|
32121
32235
|
//#endregion
|
|
32122
32236
|
export { runImageOverrideBuilds as $, resolveCfnStackName as $n, defaultCredentialsLoader as $t, resolveAlbFrontDoor as A, ConnectionRegistry as An, resolveProfileCredentials as Ar, renderCodeDockerfile as At, buildEcsImageResolutionContext$1 as B, resolveRuntimeFileExtension as Bn, createFileWatcher as Bt, formatTargetListing as C, pickResponseTemplate as Cn, resolveAgentCoreTarget as Cr, AGENTCORE_SESSION_ID_HEADER as Ct, parseLbPortOverrides as D, HOST_GATEWAY_MIN_VERSION as Dn, tryResolveImageFnJoin as Dr, SUPPORTED_CODE_RUNTIMES as Dt, createLocalStartAlbCommand as E, VtlEvaluationError as En, substituteImagePlaceholders as Er, downloadAndExtractS3Bundle as Et, createLocalRunTaskCommand as F, buildDisconnectEvent as Fn, addStartApiSpecificOptions as Ft, resolveSharedSidecarCredentials as G, substituteEnvVarsFromState as Gn, availableApiIdentifiers as Gt, parseMaxTasks as H, EcsTaskResolutionError as Hn, buildStageMap as Ht, MAX_TASKS_SUBNET_RANGE_CAP as I, buildMessageEvent as In, createLocalStartApiCommand as It, buildImageOverrideTag as J, createLocalStateProvider as Jn, groupRoutesByServer as Jt, runEcsServiceEmulator as K, substituteEnvVarsFromStateAsync as Kn, filterRoutesByApiIdentifier as Kt, addCommonEcsServiceOptions as L, architectureToPlatform as Ln, createWatchPredicates as Lt, createLocalStartServiceCommand as M, handleConnectionsRequest as Mn, classifySourceChange as Mt, serviceStrategy as N, parseConnectionsPath as Nn, addInvokeSpecificOptions as Nt, resolveAlbTarget as O, probeHostGatewaySupport as On, LocalInvokeBuildError as Or, buildAgentCoreCodeImage as Ot, addRunTaskSpecificOptions as P, buildConnectEvent as Pn, createLocalInvokeCommand as Pt, resolveImageOverrides as Q, resolveCfnRegion as Qn, resolveServiceIntegrationParameters as Qt, addEcsAssumeRoleOptions as R, buildContainerImage as Rn, resolveApiTargetSubset as Rt, createLocalListCommand as S, evaluateResponseParameters as Sn, pickAgentCoreCandidateStack as Sr, signAgentCoreInvocation as St, albStrategy as T, tryParseStatus as Tn, formatStateRemedy as Tr, waitForAgentCorePing as Tt, parseRestartPolicy as U, substituteAgainstState as Un, materializeLayerFromArn as Ut, ecsClusterOption as V, resolveRuntimeImage as Vn, attachStageContext as Vt, resolveEcsAssumeRoleOption as W, substituteAgainstStateAsync as Wn, resolveEnvVars$1 as Wt, mergeForService as X, rejectExplicitCfnStackWithMultipleStacks as Xn, startApiServer as Xt, enforceImageOverrideOrphans as Y, isCfnFlagPresent as Yn, readMtlsMaterialsFromDisk as Yt, parseImageOverrideFlags as Z, resolveCfnFallbackRegion as Zn, resolveSelectionExpression as Zt, toStudioTargetGroups as _, matchRoute as _n, AGENTCORE_AGUI_PROTOCOL as _r, MCP_PATH as _t, createLocalStudioCommand as a, verifyJwtViaDiscovery as an, countTargets as ar, DEFAULT_SHADOW_READY_TIMEOUT_MS as at, StudioEventBus as b, buildHttpApiV2Event as bn, AGENTCORE_RUNTIME_TYPE as br, parseSseForJsonRpc as bt, startStudioProxy as c, evaluateCachedLambdaPolicy as cn, discoverWebSocketApis as cr, getContainerNetworkIp as ct, createStudioDispatcher as d, attachAuthorizers as dn, parseSelectionExpressionPath as dr, createLocalInvokeAgentCoreCommand as dt, buildCognitoJwksUrl as en, CfnLocalStateProvider as er, describePinnedImageUri as et, filterStudioCustomResources as f, applyCorsResponseHeaders as fn, webSocketApiMatchesIdentifier as fr, invokeAgentCoreWs as ft, startStudioServer as g, matchPreflight as gn, AGENTCORE_A2A_PROTOCOL as gr, MCP_CONTAINER_PORT as gt, filterStudioTargetGroups as h, isFunctionUrlOacFronted as hn, resolveLambdaArnIntrinsic as hr, a2aInvokeOnce as ht, coerceStopRequest as i, verifyJwtAuthorizer as in, resolveSingleTarget as ir, CloudMapRegistry as it, addStartServiceSpecificOptions as j, buildMgmtEndpointEnvUrl as jn, toCmdArgv as jt, isApplicationLoadBalancer as k, bufferToBody as kn, buildStsClientConfig as kr, computeCodeImageTag as kt, relayServeRequest as l, invokeRequestAuthorizer as ln, discoverWebSocketApisOrThrow as lr, attachContainerLogStreamer as lt, annotatePinnedEcsTargets as m, buildCorsConfigFromCloudFrontChain as mn, pickRefLogicalId as mr, A2A_PATH as mt, coerceRunRequest as n, createJwksCache as nn, resolveSsmParameters as nr, listPinnedTargets as nt, resolveServeBaseUrl as o, buildMethodArn as on, listTargets as or, SOFT_RELOAD_COMPLETION_LOG_SUFFIX as ot, isCustomResourceLambdaTarget as p, buildCorsConfigByApiId as pn, discoverRoutes as pr, A2A_CONTAINER_PORT as pt, ImageOverrideError as q, LocalStateSourceError as qn, filterRoutesByApiIdentifiers as qt, coerceServeRequest as r, verifyCognitoJwt as rn, resolveWatchConfig as rr, buildCloudMapIndex as rt, createStudioServeManager as s, computeRequestIdentityHash as sn, availableWebSocketApiIdentifiers as sr, setShadowReadyTimeoutMs as st, addStudioSpecificOptions as t, buildJwksUrlFromIssuer as tn, collectSsmParameterRefs as tr, isLocalCdkAssetImage as tt, reinvoke as u, invokeTokenAuthorizer as un, filterWebSocketApisByIdentifiers as ur, addInvokeAgentCoreSpecificOptions as ut, renderStudioHtml as v, translateLambdaResponse as vn, AGENTCORE_HTTP_PROTOCOL as vr, MCP_PROTOCOL_VERSION as vt, addAlbSpecificOptions as w, selectIntegrationResponse as wn, derivePseudoParametersFromRegion as wr, invokeAgentCore as wt, addListSpecificOptions as x, buildRestV1Event as xn, AgentCoreResolutionError as xr, AGENTCORE_SIGV4_SERVICE as xt, createStudioStore as y, applyAuthorizerOverlay as yn, AGENTCORE_MCP_PROTOCOL as yr, mcpInvokeOnce as yt, addImageOverrideOptions as z, resolveRuntimeCodeMountPath as zn, createAuthorizerCache as zt };
|
|
32123
|
-
//# sourceMappingURL=local-studio-
|
|
32237
|
+
//# sourceMappingURL=local-studio-BEoOU1Y7.js.map
|