@salza80/openclaw-aws 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +414 -0
- package/dist/cdk/app.d.ts +3 -0
- package/dist/cdk/app.d.ts.map +1 -0
- package/dist/cdk/app.js +60 -0
- package/dist/cdk/app.js.map +1 -0
- package/dist/cdk/stack.d.ts +16 -0
- package/dist/cdk/stack.d.ts.map +1 -0
- package/dist/cdk/stack.js +151 -0
- package/dist/cdk/stack.js.map +1 -0
- package/dist/cli/commands/connect.d.ts +7 -0
- package/dist/cli/commands/connect.d.ts.map +1 -0
- package/dist/cli/commands/connect.js +99 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/current.d.ts +4 -0
- package/dist/cli/commands/current.d.ts.map +1 -0
- package/dist/cli/commands/current.js +18 -0
- package/dist/cli/commands/current.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +8 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +231 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +9 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +380 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/destroy.d.ts +10 -0
- package/dist/cli/commands/destroy.d.ts.map +1 -0
- package/dist/cli/commands/destroy.js +359 -0
- package/dist/cli/commands/destroy.js.map +1 -0
- package/dist/cli/commands/init.d.ts +12 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +258 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +4 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +23 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +11 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +163 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/outputs.d.ts +7 -0
- package/dist/cli/commands/outputs.d.ts.map +1 -0
- package/dist/cli/commands/outputs.js +69 -0
- package/dist/cli/commands/outputs.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +8 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +91 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +80 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +244 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +8 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +86 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/use.d.ts +7 -0
- package/dist/cli/commands/use.d.ts.map +1 -0
- package/dist/cli/commands/use.js +26 -0
- package/dist/cli/commands/use.js.map +1 -0
- package/dist/cli/constants.d.ts +63 -0
- package/dist/cli/constants.d.ts.map +1 -0
- package/dist/cli/constants.js +37 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +43 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/types/index.d.ts +47 -0
- package/dist/cli/types/index.d.ts.map +1 -0
- package/dist/cli/types/index.js +2 -0
- package/dist/cli/types/index.js.map +1 -0
- package/dist/cli/utils/api-keys.d.ts +6 -0
- package/dist/cli/utils/api-keys.d.ts.map +1 -0
- package/dist/cli/utils/api-keys.js +14 -0
- package/dist/cli/utils/api-keys.js.map +1 -0
- package/dist/cli/utils/aws-clients.d.ts +7 -0
- package/dist/cli/utils/aws-clients.d.ts.map +1 -0
- package/dist/cli/utils/aws-clients.js +13 -0
- package/dist/cli/utils/aws-clients.js.map +1 -0
- package/dist/cli/utils/aws-validation.d.ts +35 -0
- package/dist/cli/utils/aws-validation.d.ts.map +1 -0
- package/dist/cli/utils/aws-validation.js +266 -0
- package/dist/cli/utils/aws-validation.js.map +1 -0
- package/dist/cli/utils/aws.d.ts +17 -0
- package/dist/cli/utils/aws.d.ts.map +1 -0
- package/dist/cli/utils/aws.js +213 -0
- package/dist/cli/utils/aws.js.map +1 -0
- package/dist/cli/utils/cdk.d.ts +12 -0
- package/dist/cli/utils/cdk.d.ts.map +1 -0
- package/dist/cli/utils/cdk.js +52 -0
- package/dist/cli/utils/cdk.js.map +1 -0
- package/dist/cli/utils/cloud-init.d.ts +11 -0
- package/dist/cli/utils/cloud-init.d.ts.map +1 -0
- package/dist/cli/utils/cloud-init.js +104 -0
- package/dist/cli/utils/cloud-init.js.map +1 -0
- package/dist/cli/utils/config-store.d.ts +17 -0
- package/dist/cli/utils/config-store.d.ts.map +1 -0
- package/dist/cli/utils/config-store.js +85 -0
- package/dist/cli/utils/config-store.js.map +1 -0
- package/dist/cli/utils/config-validation.d.ts +4 -0
- package/dist/cli/utils/config-validation.d.ts.map +1 -0
- package/dist/cli/utils/config-validation.js +89 -0
- package/dist/cli/utils/config-validation.js.map +1 -0
- package/dist/cli/utils/config.d.ts +12 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +80 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/context.d.ts +14 -0
- package/dist/cli/utils/context.d.ts.map +1 -0
- package/dist/cli/utils/context.js +28 -0
- package/dist/cli/utils/context.js.map +1 -0
- package/dist/cli/utils/ec2.d.ts +6 -0
- package/dist/cli/utils/ec2.d.ts.map +1 -0
- package/dist/cli/utils/ec2.js +103 -0
- package/dist/cli/utils/ec2.js.map +1 -0
- package/dist/cli/utils/errors.d.ts +23 -0
- package/dist/cli/utils/errors.d.ts.map +1 -0
- package/dist/cli/utils/errors.js +126 -0
- package/dist/cli/utils/errors.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +9 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +25 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/cli/utils/suggestions.d.ts +7 -0
- package/dist/cli/utils/suggestions.d.ts.map +1 -0
- package/dist/cli/utils/suggestions.js +44 -0
- package/dist/cli/utils/suggestions.js.map +1 -0
- package/dist/cli/utils/validation.d.ts +12 -0
- package/dist/cli/utils/validation.d.ts.map +1 -0
- package/dist/cli/utils/validation.js +52 -0
- package/dist/cli/utils/validation.js.map +1 -0
- package/package.json +96 -0
- package/templates/openclaw.config.json.template +23 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Provider } from '../types/index.js';
|
|
2
|
+
export declare function getApiKeyEnvVar(provider: Provider): string;
|
|
3
|
+
export declare function getApiKeyParamName(configName: string, provider: Provider): string;
|
|
4
|
+
export declare function resolveApiKey(provider: Provider): string | undefined;
|
|
5
|
+
export declare function getGatewayTokenParamName(configName: string): string;
|
|
6
|
+
//# sourceMappingURL=api-keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAE1D;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAEjF;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAGpE;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEnE"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function getApiKeyEnvVar(provider) {
|
|
2
|
+
return provider.toUpperCase().replace(/-/g, '_');
|
|
3
|
+
}
|
|
4
|
+
export function getApiKeyParamName(configName, provider) {
|
|
5
|
+
return `/openclaw/${configName}/providers/${provider}/api-key`;
|
|
6
|
+
}
|
|
7
|
+
export function resolveApiKey(provider) {
|
|
8
|
+
const envVarName = getApiKeyEnvVar(provider);
|
|
9
|
+
return process.env[envVarName];
|
|
10
|
+
}
|
|
11
|
+
export function getGatewayTokenParamName(configName) {
|
|
12
|
+
return `/openclaw/${configName}/gateway-token`;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=api-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-keys.js","sourceRoot":"","sources":["../../../src/cli/utils/api-keys.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,QAAkB;IAChD,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,QAAkB;IACvE,OAAO,aAAa,UAAU,cAAc,QAAQ,UAAU,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAkB;IAC9C,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IACzD,OAAO,aAAa,UAAU,gBAAgB,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CloudFormationClient } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import { SSMClient } from '@aws-sdk/client-ssm';
|
|
3
|
+
import { EC2Client } from '@aws-sdk/client-ec2';
|
|
4
|
+
export declare function createCloudFormationClient(region: string): CloudFormationClient;
|
|
5
|
+
export declare function createSsmClient(region: string): SSMClient;
|
|
6
|
+
export declare function createEc2Client(region: string): EC2Client;
|
|
7
|
+
//# sourceMappingURL=aws-clients.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-clients.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/aws-clients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAE/E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEzD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEzD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { CloudFormationClient } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import { SSMClient } from '@aws-sdk/client-ssm';
|
|
3
|
+
import { EC2Client } from '@aws-sdk/client-ec2';
|
|
4
|
+
export function createCloudFormationClient(region) {
|
|
5
|
+
return new CloudFormationClient({ region });
|
|
6
|
+
}
|
|
7
|
+
export function createSsmClient(region) {
|
|
8
|
+
return new SSMClient({ region });
|
|
9
|
+
}
|
|
10
|
+
export function createEc2Client(region) {
|
|
11
|
+
return new EC2Client({ region });
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=aws-clients.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-clients.js","sourceRoot":"","sources":["../../../src/cli/utils/aws-clients.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,MAAM,UAAU,0BAA0B,CAAC,MAAc;IACvD,OAAO,IAAI,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,IAAI,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { OpenClawConfig } from '../types/index.js';
|
|
2
|
+
export interface AWSCredentials {
|
|
3
|
+
account: string;
|
|
4
|
+
userId: string;
|
|
5
|
+
arn: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function applyAwsProfile(profile?: string): void;
|
|
8
|
+
export declare function requireAwsCredentials(config: OpenClawConfig): Promise<AWSCredentials>;
|
|
9
|
+
export declare function validateAWSCredentials(region: string): Promise<AWSCredentials>;
|
|
10
|
+
export declare function validateAWSRegion(region: string): Promise<boolean>;
|
|
11
|
+
/**
|
|
12
|
+
* Get the current CDK bootstrap version from CloudFormation.
|
|
13
|
+
* Returns the version number or null if not bootstrapped.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getCDKBootstrapVersion(region: string): Promise<number | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if CDK is bootstrapped and meets minimum version requirement.
|
|
18
|
+
* Returns an object with bootstrap status, version, and minimum version check.
|
|
19
|
+
*/
|
|
20
|
+
export declare function checkCDKBootstrap(account: string, region: string, minVersion?: number): Promise<{
|
|
21
|
+
bootstrapped: boolean;
|
|
22
|
+
version: number | null;
|
|
23
|
+
meetsMinimum: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Run CDK bootstrap for the specified account and region.
|
|
27
|
+
* Uses the bundled CDK version to ensure compatibility.
|
|
28
|
+
*/
|
|
29
|
+
export declare function runCDKBootstrap(account: string, region: string, profile?: string): Promise<void>;
|
|
30
|
+
export declare function validatePreDeploy(config: OpenClawConfig): Promise<void>;
|
|
31
|
+
export declare function validateInstanceType(instanceType: string): void;
|
|
32
|
+
export declare function validateStackExists(stackName: string, region: string): Promise<boolean>;
|
|
33
|
+
export declare function validateNodeVersion(): void;
|
|
34
|
+
export declare function validateSSMPlugin(): Promise<void>;
|
|
35
|
+
//# sourceMappingURL=aws-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-validation.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/aws-validation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAItD;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAG3F;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA+BpF;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiBxE;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBnF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,MAAW,GACtB,OAAO,CAAC;IACT,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC,CAQD;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG7E;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAS/D;AAED,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAY7F;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAa1C;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAYvD"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts';
|
|
2
|
+
import { CloudFormationClient, DescribeStacksCommand } from '@aws-sdk/client-cloudformation';
|
|
3
|
+
import { EC2Client, DescribeRegionsCommand } from '@aws-sdk/client-ec2';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import prompts from 'prompts';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { ValidationError, AWSError, withRetry } from './errors.js';
|
|
8
|
+
import { awsCredentialSuggestions } from './suggestions.js';
|
|
9
|
+
import { MIN_NODE_VERSION } from '../constants.js';
|
|
10
|
+
export function applyAwsProfile(profile) {
|
|
11
|
+
if (!profile)
|
|
12
|
+
return;
|
|
13
|
+
process.env.AWS_PROFILE = profile;
|
|
14
|
+
process.env.AWS_SDK_LOAD_CONFIG = '1';
|
|
15
|
+
}
|
|
16
|
+
export async function requireAwsCredentials(config) {
|
|
17
|
+
applyAwsProfile(config.aws.profile);
|
|
18
|
+
return validateAWSCredentials(config.aws.region);
|
|
19
|
+
}
|
|
20
|
+
export async function validateAWSCredentials(region) {
|
|
21
|
+
const client = new STSClient({ region });
|
|
22
|
+
try {
|
|
23
|
+
const command = new GetCallerIdentityCommand({});
|
|
24
|
+
const response = await withRetry(async () => await client.send(command), {
|
|
25
|
+
maxAttempts: 3,
|
|
26
|
+
operationName: 'validate AWS credentials',
|
|
27
|
+
});
|
|
28
|
+
if (!response.Account || !response.UserId || !response.Arn) {
|
|
29
|
+
throw new AWSError('Invalid AWS credentials response', [
|
|
30
|
+
'Run: aws configure',
|
|
31
|
+
'Check your AWS credentials are properly set',
|
|
32
|
+
]);
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
account: response.Account,
|
|
36
|
+
userId: response.UserId,
|
|
37
|
+
arn: response.Arn,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error instanceof ValidationError || error instanceof AWSError) {
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
throw new AWSError('Failed to validate AWS credentials', [...awsCredentialSuggestions()]);
|
|
45
|
+
}
|
|
46
|
+
finally {
|
|
47
|
+
client.destroy();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function validateAWSRegion(region) {
|
|
51
|
+
const client = new EC2Client({ region });
|
|
52
|
+
try {
|
|
53
|
+
const command = new DescribeRegionsCommand({
|
|
54
|
+
RegionNames: [region],
|
|
55
|
+
});
|
|
56
|
+
await client.send(command);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
throw new ValidationError(`Invalid AWS region: ${region}`, [
|
|
61
|
+
'Check available regions: aws ec2 describe-regions',
|
|
62
|
+
'Common regions: us-east-1, us-west-2, eu-west-1',
|
|
63
|
+
]);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
client.destroy();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Get the current CDK bootstrap version from CloudFormation.
|
|
71
|
+
* Returns the version number or null if not bootstrapped.
|
|
72
|
+
*/
|
|
73
|
+
export async function getCDKBootstrapVersion(region) {
|
|
74
|
+
const client = new CloudFormationClient({ region });
|
|
75
|
+
try {
|
|
76
|
+
const command = new DescribeStacksCommand({
|
|
77
|
+
StackName: 'CDKToolkit',
|
|
78
|
+
});
|
|
79
|
+
const response = await client.send(command);
|
|
80
|
+
const stack = response.Stacks?.[0];
|
|
81
|
+
if (!stack)
|
|
82
|
+
return null;
|
|
83
|
+
// Find BootstrapVersion output
|
|
84
|
+
const versionOutput = stack.Outputs?.find((output) => output.OutputKey === 'BootstrapVersion');
|
|
85
|
+
if (!versionOutput?.OutputValue)
|
|
86
|
+
return null;
|
|
87
|
+
return parseInt(versionOutput.OutputValue, 10);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null; // Not bootstrapped
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
client.destroy();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if CDK is bootstrapped and meets minimum version requirement.
|
|
98
|
+
* Returns an object with bootstrap status, version, and minimum version check.
|
|
99
|
+
*/
|
|
100
|
+
export async function checkCDKBootstrap(account, region, minVersion = 30) {
|
|
101
|
+
const version = await getCDKBootstrapVersion(region);
|
|
102
|
+
return {
|
|
103
|
+
bootstrapped: version !== null,
|
|
104
|
+
version,
|
|
105
|
+
meetsMinimum: version !== null && version >= minVersion,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Run CDK bootstrap for the specified account and region.
|
|
110
|
+
* Uses the bundled CDK version to ensure compatibility.
|
|
111
|
+
*/
|
|
112
|
+
export async function runCDKBootstrap(account, region, profile) {
|
|
113
|
+
const { execa } = await import('execa');
|
|
114
|
+
const { getCDKBinary } = await import('./cdk.js');
|
|
115
|
+
const cdkBinary = getCDKBinary();
|
|
116
|
+
const envQualifier = `aws://${account}/${region}`;
|
|
117
|
+
const env = {
|
|
118
|
+
...process.env,
|
|
119
|
+
AWS_REGION: region,
|
|
120
|
+
CDK_DISABLE_VERSION_CHECK: 'true',
|
|
121
|
+
CDK_DISABLE_CLI_TELEMETRY: '1',
|
|
122
|
+
CI: 'true',
|
|
123
|
+
};
|
|
124
|
+
if (profile) {
|
|
125
|
+
env.AWS_PROFILE = profile;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
await execa(cdkBinary, ['bootstrap', '--no-notices', '--no-version-reporting', envQualifier], {
|
|
129
|
+
env,
|
|
130
|
+
stdio: 'inherit', // Show CDK output to user
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
throw new AWSError('Failed to bootstrap CDK', [
|
|
135
|
+
`Tried: ${cdkBinary} bootstrap ${envQualifier}`,
|
|
136
|
+
'Check AWS permissions (CloudFormation, S3, IAM required)',
|
|
137
|
+
'Learn more: https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html',
|
|
138
|
+
]);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
export async function validatePreDeploy(config) {
|
|
142
|
+
const spinner = ora('Running pre-deployment validation...').start();
|
|
143
|
+
try {
|
|
144
|
+
// 1. Validate AWS credentials
|
|
145
|
+
spinner.text = 'Validating AWS credentials...';
|
|
146
|
+
const credentials = await requireAwsCredentials(config);
|
|
147
|
+
spinner.succeed(`AWS credentials validated (Account: ${credentials.account})`);
|
|
148
|
+
// 2. Validate AWS region
|
|
149
|
+
spinner.start('Validating AWS region...');
|
|
150
|
+
await validateAWSRegion(config.aws.region);
|
|
151
|
+
spinner.succeed(`AWS region validated (${config.aws.region})`);
|
|
152
|
+
// 3. Check CDK bootstrap
|
|
153
|
+
spinner.start('Checking CDK bootstrap...');
|
|
154
|
+
const bootstrapStatus = await checkCDKBootstrap(credentials.account, config.aws.region);
|
|
155
|
+
if (!bootstrapStatus.meetsMinimum) {
|
|
156
|
+
spinner.warn(bootstrapStatus.bootstrapped
|
|
157
|
+
? `CDK bootstrap version ${bootstrapStatus.version} is outdated (requires v30+)`
|
|
158
|
+
: 'CDK not bootstrapped in this region');
|
|
159
|
+
console.log(''); // Empty line
|
|
160
|
+
// Explain what bootstrap does (concise)
|
|
161
|
+
if (!bootstrapStatus.bootstrapped) {
|
|
162
|
+
console.log(chalk.dim('CDK bootstrap sets up required AWS resources (S3 bucket, IAM roles) for deployments.'));
|
|
163
|
+
console.log(chalk.dim('This is a one-time setup per account/region.'));
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
console.log(chalk.dim('Your CDK bootstrap version needs to be upgraded to support the latest CDK features.'));
|
|
167
|
+
}
|
|
168
|
+
console.log(''); // Empty line
|
|
169
|
+
// Prompt user to run bootstrap
|
|
170
|
+
const { runBootstrap } = await prompts({
|
|
171
|
+
type: 'confirm',
|
|
172
|
+
name: 'runBootstrap',
|
|
173
|
+
message: bootstrapStatus.bootstrapped
|
|
174
|
+
? 'Upgrade CDK bootstrap now? (Recommended)'
|
|
175
|
+
: 'Run CDK bootstrap now? (Recommended)',
|
|
176
|
+
initial: true,
|
|
177
|
+
});
|
|
178
|
+
if (!runBootstrap) {
|
|
179
|
+
throw new ValidationError('CDK bootstrap required', [
|
|
180
|
+
`Run manually: npx cdk bootstrap aws://${credentials.account}/${config.aws.region}`,
|
|
181
|
+
'Learn more: https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html',
|
|
182
|
+
]);
|
|
183
|
+
}
|
|
184
|
+
// Run bootstrap
|
|
185
|
+
console.log(''); // Empty line
|
|
186
|
+
spinner.start('Bootstrapping CDK... (this may take 1-2 minutes)');
|
|
187
|
+
try {
|
|
188
|
+
await runCDKBootstrap(credentials.account, config.aws.region, config.aws.profile);
|
|
189
|
+
spinner.succeed('CDK bootstrap completed successfully');
|
|
190
|
+
// Verify the bootstrap worked and version is correct
|
|
191
|
+
spinner.start('Verifying bootstrap...');
|
|
192
|
+
const verifyStatus = await checkCDKBootstrap(credentials.account, config.aws.region);
|
|
193
|
+
if (!verifyStatus.meetsMinimum) {
|
|
194
|
+
spinner.fail('Bootstrap verification failed');
|
|
195
|
+
throw new ValidationError('CDK bootstrap verification failed', [
|
|
196
|
+
`Expected version 30+, got ${verifyStatus.version}`,
|
|
197
|
+
`Try running manually: npx cdk bootstrap aws://${credentials.account}/${config.aws.region}`,
|
|
198
|
+
]);
|
|
199
|
+
}
|
|
200
|
+
spinner.succeed(`CDK bootstrap verified (v${verifyStatus.version})`);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
spinner.fail('CDK bootstrap failed');
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
spinner.succeed(`CDK bootstrap verified (v${bootstrapStatus.version})`);
|
|
209
|
+
}
|
|
210
|
+
// 4. Validate instance type format
|
|
211
|
+
spinner.start('Validating configuration...');
|
|
212
|
+
validateInstanceType(config.instance.type);
|
|
213
|
+
spinner.succeed('Configuration validated');
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
spinner.fail('Validation failed');
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
export function validateInstanceType(instanceType) {
|
|
221
|
+
const validPattern = /^[a-z][0-9][a-z]?\.(nano|micro|small|medium|large|xlarge|[0-9]+xlarge)$/;
|
|
222
|
+
if (!validPattern.test(instanceType)) {
|
|
223
|
+
throw new ValidationError(`Invalid instance type: ${instanceType}`, [
|
|
224
|
+
'Format should be: family.size (e.g., t3.micro)',
|
|
225
|
+
'Valid examples: t3.micro, t3.small, t3.medium, m5.large',
|
|
226
|
+
]);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
export async function validateStackExists(stackName, region) {
|
|
230
|
+
const client = new CloudFormationClient({ region });
|
|
231
|
+
try {
|
|
232
|
+
const command = new DescribeStacksCommand({ StackName: stackName });
|
|
233
|
+
await client.send(command);
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
client.destroy();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
export function validateNodeVersion() {
|
|
244
|
+
const nodeVersion = process.version;
|
|
245
|
+
const majorVersion = parseInt(nodeVersion.split('.')[0].substring(1));
|
|
246
|
+
if (majorVersion < MIN_NODE_VERSION) {
|
|
247
|
+
throw new ValidationError(`Node.js version ${nodeVersion} is not supported. Requires Node.js ${MIN_NODE_VERSION} or higher.`, [
|
|
248
|
+
`Install Node.js ${MIN_NODE_VERSION} or higher from https://nodejs.org/`,
|
|
249
|
+
'Or use nvm: nvm install 22 && nvm use 22',
|
|
250
|
+
]);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
export async function validateSSMPlugin() {
|
|
254
|
+
const { execa } = await import('execa');
|
|
255
|
+
try {
|
|
256
|
+
await execa('session-manager-plugin', ['--version']);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
throw new ValidationError('AWS Session Manager plugin not found', [
|
|
260
|
+
'Install from: https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html',
|
|
261
|
+
'macOS: brew install --cask session-manager-plugin',
|
|
262
|
+
'Ubuntu: Download and install .deb package',
|
|
263
|
+
]);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=aws-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-validation.js","sourceRoot":"","sources":["../../../src/cli/utils/aws-validation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DeploymentStatus } from '../types/index.js';
|
|
2
|
+
export declare function getInstanceIdFromStack(stackName: string, region: string): Promise<string>;
|
|
3
|
+
export declare function resolveInstanceId(stackName: string, region: string): Promise<string>;
|
|
4
|
+
export declare function checkSSMStatus(instanceId: string, region: string): Promise<boolean>;
|
|
5
|
+
export declare function getSSMStatus(instanceId: string, region: string): Promise<{
|
|
6
|
+
status: string;
|
|
7
|
+
lastPing?: string;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function checkGatewayStatus(instanceId: string, region: string): Promise<{
|
|
10
|
+
running: boolean;
|
|
11
|
+
error?: string;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function waitForSSM(instanceId: string, region: string, maxWaitTime?: number, // 5 minutes
|
|
14
|
+
pollInterval?: number): Promise<boolean>;
|
|
15
|
+
export declare function getStackStatus(stackName: string, region: string): Promise<DeploymentStatus>;
|
|
16
|
+
export declare function getStackOutputs(stackName: string, region: string): Promise<Record<string, string>>;
|
|
17
|
+
//# sourceMappingURL=aws.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/aws.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsB/F;AAED,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAY1F;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBzF;AAED,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBhD;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+C/C;AAED,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,MAAe,EAAE,YAAY;AAC1C,YAAY,GAAE,MAAa,GAC1B,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAuDjG;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwBjC"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { DescribeStacksCommand } from '@aws-sdk/client-cloudformation';
|
|
2
|
+
import { DescribeInstanceInformationCommand, SendCommandCommand, GetCommandInvocationCommand, } from '@aws-sdk/client-ssm';
|
|
3
|
+
import { DescribeInstancesCommand } from '@aws-sdk/client-ec2';
|
|
4
|
+
import { createCloudFormationClient, createEc2Client, createSsmClient } from './aws-clients.js';
|
|
5
|
+
import { AWSError, withRetry } from './errors.js';
|
|
6
|
+
export async function getInstanceIdFromStack(stackName, region) {
|
|
7
|
+
const client = createCloudFormationClient(region);
|
|
8
|
+
const command = new DescribeStacksCommand({ StackName: stackName });
|
|
9
|
+
try {
|
|
10
|
+
const response = await client.send(command);
|
|
11
|
+
const outputs = response.Stacks?.[0]?.Outputs || [];
|
|
12
|
+
const instanceIdOutput = outputs.find((o) => o.OutputKey === 'InstanceId');
|
|
13
|
+
if (!instanceIdOutput?.OutputValue) {
|
|
14
|
+
throw new Error('Instance ID not found in stack outputs');
|
|
15
|
+
}
|
|
16
|
+
return instanceIdOutput.OutputValue;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (error instanceof Error && error.name === 'ValidationError') {
|
|
20
|
+
throw new Error(`Stack '${stackName}' not found in region '${region}'`);
|
|
21
|
+
}
|
|
22
|
+
throw error;
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
client.destroy();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export async function resolveInstanceId(stackName, region) {
|
|
29
|
+
try {
|
|
30
|
+
return await withRetry(() => getInstanceIdFromStack(stackName, region), {
|
|
31
|
+
maxAttempts: 2,
|
|
32
|
+
operationName: 'get instance ID',
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new AWSError('Could not find instance', [
|
|
37
|
+
'Run: openclaw-aws deploy (to create instance)',
|
|
38
|
+
'Run: openclaw-aws status (to check deployment)',
|
|
39
|
+
]);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export async function checkSSMStatus(instanceId, region) {
|
|
43
|
+
const client = createSsmClient(region);
|
|
44
|
+
const command = new DescribeInstanceInformationCommand({
|
|
45
|
+
Filters: [{ Key: 'InstanceIds', Values: [instanceId] }],
|
|
46
|
+
});
|
|
47
|
+
try {
|
|
48
|
+
const response = await client.send(command);
|
|
49
|
+
const instance = response.InstanceInformationList?.[0];
|
|
50
|
+
// Only return true if explicitly Online
|
|
51
|
+
// ConnectionLost, Inactive, or missing instance all return false
|
|
52
|
+
return instance?.PingStatus === 'Online';
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
client.destroy();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
export async function getSSMStatus(instanceId, region) {
|
|
62
|
+
const client = createSsmClient(region);
|
|
63
|
+
const command = new DescribeInstanceInformationCommand({
|
|
64
|
+
Filters: [{ Key: 'InstanceIds', Values: [instanceId] }],
|
|
65
|
+
});
|
|
66
|
+
try {
|
|
67
|
+
const response = await client.send(command);
|
|
68
|
+
const instance = response.InstanceInformationList?.[0];
|
|
69
|
+
if (!instance) {
|
|
70
|
+
return { status: 'not-registered' };
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
status: instance.PingStatus || 'unknown',
|
|
74
|
+
lastPing: instance.LastPingDateTime?.toISOString(),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return { status: 'error' };
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
client.destroy();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export async function checkGatewayStatus(instanceId, region) {
|
|
85
|
+
const client = createSsmClient(region);
|
|
86
|
+
try {
|
|
87
|
+
// Send command to check if openclaw gateway service is running
|
|
88
|
+
const sendCommand = new SendCommandCommand({
|
|
89
|
+
InstanceIds: [instanceId],
|
|
90
|
+
DocumentName: 'AWS-RunShellScript',
|
|
91
|
+
Parameters: {
|
|
92
|
+
commands: [
|
|
93
|
+
'sudo -u ubuntu bash -c "export XDG_RUNTIME_DIR=/run/user/1000; export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus; systemctl --user is-active openclaw-gateway.service"',
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
TimeoutSeconds: 30,
|
|
97
|
+
});
|
|
98
|
+
const sendResponse = await client.send(sendCommand);
|
|
99
|
+
const commandId = sendResponse.Command?.CommandId;
|
|
100
|
+
if (!commandId) {
|
|
101
|
+
return { running: false, error: 'Failed to send command' };
|
|
102
|
+
}
|
|
103
|
+
// Wait a bit for command to execute
|
|
104
|
+
await new Promise((resolve) => setTimeout(resolve, 2000));
|
|
105
|
+
// Get command result
|
|
106
|
+
const getResult = new GetCommandInvocationCommand({
|
|
107
|
+
CommandId: commandId,
|
|
108
|
+
InstanceId: instanceId,
|
|
109
|
+
});
|
|
110
|
+
const resultResponse = await client.send(getResult);
|
|
111
|
+
const output = resultResponse.StandardOutputContent?.trim();
|
|
112
|
+
return {
|
|
113
|
+
running: output === 'active',
|
|
114
|
+
error: output !== 'active' ? resultResponse.StandardErrorContent : undefined,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
return {
|
|
119
|
+
running: false,
|
|
120
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
client.destroy();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export async function waitForSSM(instanceId, region, maxWaitTime = 300000, // 5 minutes
|
|
128
|
+
pollInterval = 5000) {
|
|
129
|
+
const startTime = Date.now();
|
|
130
|
+
while (Date.now() - startTime < maxWaitTime) {
|
|
131
|
+
const isReady = await checkSSMStatus(instanceId, region);
|
|
132
|
+
if (isReady) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
136
|
+
}
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
export async function getStackStatus(stackName, region) {
|
|
140
|
+
const client = createCloudFormationClient(region);
|
|
141
|
+
const command = new DescribeStacksCommand({ StackName: stackName });
|
|
142
|
+
try {
|
|
143
|
+
const response = await client.send(command);
|
|
144
|
+
const stack = response.Stacks?.[0];
|
|
145
|
+
if (!stack) {
|
|
146
|
+
throw new Error(`Stack '${stackName}' not found`);
|
|
147
|
+
}
|
|
148
|
+
const status = {
|
|
149
|
+
stackName: stack.StackName || stackName,
|
|
150
|
+
stackStatus: stack.StackStatus || 'UNKNOWN',
|
|
151
|
+
};
|
|
152
|
+
// Try to get instance ID
|
|
153
|
+
try {
|
|
154
|
+
const instanceId = await getInstanceIdFromStack(stackName, region);
|
|
155
|
+
status.instanceId = instanceId;
|
|
156
|
+
// Get instance status
|
|
157
|
+
const ec2Client = createEc2Client(region);
|
|
158
|
+
try {
|
|
159
|
+
const instanceResponse = await ec2Client.send(new DescribeInstancesCommand({
|
|
160
|
+
InstanceIds: [instanceId],
|
|
161
|
+
}));
|
|
162
|
+
const instance = instanceResponse.Reservations?.[0]?.Instances?.[0];
|
|
163
|
+
if (instance) {
|
|
164
|
+
status.instanceStatus = instance.State?.Name || 'unknown';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
ec2Client.destroy();
|
|
169
|
+
}
|
|
170
|
+
// Get SSM status
|
|
171
|
+
const ssmReady = await checkSSMStatus(instanceId, region);
|
|
172
|
+
status.ssmStatus = ssmReady ? 'ready' : 'not-ready';
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// Instance might not be created yet
|
|
176
|
+
}
|
|
177
|
+
return status;
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
if (error instanceof Error && error.name === 'ValidationError') {
|
|
181
|
+
throw new Error(`Stack '${stackName}' not found in region '${region}'`);
|
|
182
|
+
}
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
client.destroy();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
export async function getStackOutputs(stackName, region) {
|
|
190
|
+
const client = createCloudFormationClient(region);
|
|
191
|
+
const command = new DescribeStacksCommand({ StackName: stackName });
|
|
192
|
+
try {
|
|
193
|
+
const response = await client.send(command);
|
|
194
|
+
const outputs = response.Stacks?.[0]?.Outputs || [];
|
|
195
|
+
const result = {};
|
|
196
|
+
outputs.forEach((output) => {
|
|
197
|
+
if (output.OutputKey && output.OutputValue) {
|
|
198
|
+
result[output.OutputKey] = output.OutputValue;
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
if (error instanceof Error && error.name === 'ValidationError') {
|
|
205
|
+
throw new Error(`Stack '${stackName}' not found in region '${region}'`);
|
|
206
|
+
}
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
finally {
|
|
210
|
+
client.destroy();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=aws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws.js","sourceRoot":"","sources":["../../../src/cli/utils/aws.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EACL,kCAAkC,EAClC,kBAAkB,EAClB,2BAA2B,GAC5B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,0BAA0B,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAChG,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAAiB,EAAE,MAAc;IAC5E,MAAM,MAAM,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAEpD,MAAM,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC;QAC3E,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,gBAAgB,CAAC,WAAW,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,0BAA0B,MAAM,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB,EAAE,MAAc;IACvE,IAAI,CAAC;QACH,OAAO,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;YACtE,WAAW,EAAE,CAAC;YACd,aAAa,EAAE,iBAAiB;SACjC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE;YAC5C,+CAA+C;YAC/C,gDAAgD;SACjD,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB,EAAE,MAAc;IACrE,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,kCAAkC,CAAC;QACrD,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;KACxD,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvD,wCAAwC;QACxC,iEAAiE;QACjE,OAAO,QAAQ,EAAE,UAAU,KAAK,QAAQ,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,MAAc;IAEd,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,kCAAkC,CAAC;QACrD,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;KACxD,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,QAAQ,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;QACtC,CAAC;QAED,OAAO;YACL,MAAM,EAAE,QAAQ,CAAC,UAAU,IAAI,SAAS;YACxC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,EAAE,WAAW,EAAE;SACnD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,UAAkB,EAClB,MAAc;IAEd,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,+DAA+D;QAC/D,MAAM,WAAW,GAAG,IAAI,kBAAkB,CAAC;YACzC,WAAW,EAAE,CAAC,UAAU,CAAC;YACzB,YAAY,EAAE,oBAAoB;YAClC,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,mLAAmL;iBACpL;aACF;YACD,cAAc,EAAE,EAAE;SACnB,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC;QAElD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;QAC7D,CAAC;QAED,oCAAoC;QACpC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAE1D,qBAAqB;QACrB,MAAM,SAAS,GAAG,IAAI,2BAA2B,CAAC;YAChD,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,UAAU;SACvB,CAAC,CAAC;QAEH,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,cAAc,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;QAE5D,OAAO;YACL,OAAO,EAAE,MAAM,KAAK,QAAQ;YAC5B,KAAK,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,CAAC,SAAS;SAC7E,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,UAAkB,EAClB,MAAc,EACd,cAAsB,MAAM,EAAE,YAAY;AAC1C,eAAuB,IAAI;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,WAAW,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACzD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,MAAc;IACpE,MAAM,MAAM,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,aAAa,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,MAAM,GAAqB;YAC/B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,SAAS;YACvC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,SAAS;SAC5C,CAAC;QAEF,yBAAyB;QACzB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YACnE,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YAE/B,sBAAsB;YACtB,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,CAAC;gBACH,MAAM,gBAAgB,GAAG,MAAM,SAAS,CAAC,IAAI,CAC3C,IAAI,wBAAwB,CAAC;oBAC3B,WAAW,EAAE,CAAC,UAAU,CAAC;iBAC1B,CAAC,CACH,CAAC;gBAEF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpE,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,CAAC,cAAc,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,IAAI,SAAS,CAAC;gBAC5D,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,CAAC;YAED,iBAAiB;YACjB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC1D,MAAM,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,0BAA0B,MAAM,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,SAAiB,EACjB,MAAc;IAEd,MAAM,MAAM,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IAEpE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;QAEpD,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC3C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC;YAChD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,UAAU,SAAS,0BAA0B,MAAM,GAAG,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the path to the CDK binary.
|
|
3
|
+
* Prefers the locally bundled CDK from node_modules/.bin/
|
|
4
|
+
* Falls back to global 'cdk' if local not found.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getCDKBinary(): string;
|
|
7
|
+
/**
|
|
8
|
+
* Validate that CDK is available (either local or global).
|
|
9
|
+
* Throws AWSError if CDK cannot be found.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateCDKAvailable(): void;
|
|
12
|
+
//# sourceMappingURL=cdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdk.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/cdk.ts"],"names":[],"mappings":"AAQA;;;;GAIG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAoBrC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAiB3C"}
|