@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,103 @@
|
|
|
1
|
+
import { StopInstancesCommand, StartInstancesCommand, RebootInstancesCommand, DescribeInstancesCommand, } from '@aws-sdk/client-ec2';
|
|
2
|
+
import { withRetry, AWSError } from './errors.js';
|
|
3
|
+
import { createEc2Client } from './aws-clients.js';
|
|
4
|
+
export async function stopInstance(instanceId, region) {
|
|
5
|
+
const client = createEc2Client(region);
|
|
6
|
+
const command = new StopInstancesCommand({
|
|
7
|
+
InstanceIds: [instanceId],
|
|
8
|
+
});
|
|
9
|
+
try {
|
|
10
|
+
await withRetry(() => client.send(command), { maxAttempts: 2, operationName: 'stop instance' });
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
throw new AWSError(`Failed to stop instance ${instanceId}`, [
|
|
14
|
+
'Check instance exists and is in a stoppable state',
|
|
15
|
+
'Verify IAM permissions for ec2:StopInstances',
|
|
16
|
+
]);
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
client.destroy();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export async function startInstance(instanceId, region) {
|
|
23
|
+
const client = createEc2Client(region);
|
|
24
|
+
const command = new StartInstancesCommand({
|
|
25
|
+
InstanceIds: [instanceId],
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
await withRetry(() => client.send(command), {
|
|
29
|
+
maxAttempts: 2,
|
|
30
|
+
operationName: 'start instance',
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
throw new AWSError(`Failed to start instance ${instanceId}`, [
|
|
35
|
+
'Check instance exists and is in a stopped state',
|
|
36
|
+
'Verify IAM permissions for ec2:StartInstances',
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
client.destroy();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export async function rebootInstance(instanceId, region) {
|
|
44
|
+
const client = createEc2Client(region);
|
|
45
|
+
const command = new RebootInstancesCommand({
|
|
46
|
+
InstanceIds: [instanceId],
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
await withRetry(() => client.send(command), {
|
|
50
|
+
maxAttempts: 2,
|
|
51
|
+
operationName: 'reboot instance',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new AWSError(`Failed to reboot instance ${instanceId}`, [
|
|
56
|
+
'Check instance exists and is running',
|
|
57
|
+
'Verify IAM permissions for ec2:RebootInstances',
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
client.destroy();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export async function getInstanceState(instanceId, region) {
|
|
65
|
+
const client = createEc2Client(region);
|
|
66
|
+
try {
|
|
67
|
+
const response = await client.send(new DescribeInstancesCommand({ InstanceIds: [instanceId] }));
|
|
68
|
+
return response.Reservations?.[0]?.Instances?.[0]?.State?.Name;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
client.destroy();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export async function waitForInstanceState(instanceId, region, desiredState, maxWaitTime = 180000) {
|
|
78
|
+
const client = createEc2Client(region);
|
|
79
|
+
try {
|
|
80
|
+
const startTime = Date.now();
|
|
81
|
+
while (Date.now() - startTime < maxWaitTime) {
|
|
82
|
+
try {
|
|
83
|
+
const response = await client.send(new DescribeInstancesCommand({ InstanceIds: [instanceId] }));
|
|
84
|
+
const instance = response.Reservations?.[0]?.Instances?.[0];
|
|
85
|
+
const currentState = instance?.State?.Name;
|
|
86
|
+
if (currentState === desiredState) {
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
// Wait 5 seconds before checking again
|
|
90
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Continue waiting
|
|
94
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
finally {
|
|
100
|
+
client.destroy();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ec2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ec2.js","sourceRoot":"","sources":["../../../src/cli/utils/ec2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare class CLIError extends Error {
|
|
2
|
+
readonly suggestions: string[];
|
|
3
|
+
readonly exitCode: number;
|
|
4
|
+
constructor(message: string, suggestions?: string[], exitCode?: number);
|
|
5
|
+
}
|
|
6
|
+
export declare function handleError(error: unknown): never;
|
|
7
|
+
export declare function withRetry<T>(operation: () => Promise<T>, options?: {
|
|
8
|
+
maxAttempts?: number;
|
|
9
|
+
delayMs?: number;
|
|
10
|
+
shouldRetry?: (error: unknown) => boolean;
|
|
11
|
+
operationName?: string;
|
|
12
|
+
}): Promise<T>;
|
|
13
|
+
export declare function isRetryableError(error: unknown): boolean;
|
|
14
|
+
export declare class ValidationError extends CLIError {
|
|
15
|
+
constructor(message: string, suggestions?: string[]);
|
|
16
|
+
}
|
|
17
|
+
export declare class AWSError extends CLIError {
|
|
18
|
+
constructor(message: string, suggestions?: string[]);
|
|
19
|
+
}
|
|
20
|
+
export declare class ConfigError extends CLIError {
|
|
21
|
+
constructor(message: string, suggestions?: string[]);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/errors.ts"],"names":[],"mappings":"AAWA,qBAAa,QAAS,SAAQ,KAAK;aAGf,WAAW,EAAE,MAAM,EAAE;aACrB,QAAQ,EAAE,MAAM;gBAFhC,OAAO,EAAE,MAAM,EACC,WAAW,GAAE,MAAM,EAAO,EAC1B,QAAQ,GAAE,MAAU;CAKvC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CA+BjD;AAuCD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;CACnB,GACL,OAAO,CAAC,CAAC,CAAC,CAuBZ;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAwBxD;AAED,qBAAa,eAAgB,SAAQ,QAAQ;gBAC/B,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,EAAO;CAIxD;AAED,qBAAa,QAAS,SAAQ,QAAQ;gBACxB,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,EAAO;CAIxD;AAED,qBAAa,WAAY,SAAQ,QAAQ;gBAC3B,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,EAAO;CAIxD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { logger } from './logger.js';
|
|
3
|
+
import { awsCredentialSuggestions, cdkBootstrapSuggestions, configNotFoundSuggestions, networkSuggestions, stackNotFoundSuggestions, ssmSuggestions, } from './suggestions.js';
|
|
4
|
+
export class CLIError extends Error {
|
|
5
|
+
suggestions;
|
|
6
|
+
exitCode;
|
|
7
|
+
constructor(message, suggestions = [], exitCode = 1) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.suggestions = suggestions;
|
|
10
|
+
this.exitCode = exitCode;
|
|
11
|
+
this.name = 'CLIError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function handleError(error) {
|
|
15
|
+
if (error instanceof CLIError) {
|
|
16
|
+
logger.error(error.message);
|
|
17
|
+
if (error.suggestions.length > 0) {
|
|
18
|
+
console.log('\n' + chalk.bold('Suggestions:'));
|
|
19
|
+
error.suggestions.forEach((suggestion) => {
|
|
20
|
+
console.log(' ' + chalk.cyan('→') + ' ' + suggestion);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
process.exit(error.exitCode);
|
|
24
|
+
}
|
|
25
|
+
if (error instanceof Error) {
|
|
26
|
+
logger.error(error.message);
|
|
27
|
+
// Provide suggestions based on error type
|
|
28
|
+
const suggestions = getErrorSuggestions(error);
|
|
29
|
+
if (suggestions.length > 0) {
|
|
30
|
+
console.log('\n' + chalk.bold('Suggestions:'));
|
|
31
|
+
suggestions.forEach((suggestion) => {
|
|
32
|
+
console.log(' ' + chalk.cyan('→') + ' ' + suggestion);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
logger.error('An unknown error occurred: ' + String(error));
|
|
38
|
+
process.exit(1);
|
|
39
|
+
}
|
|
40
|
+
function getErrorSuggestions(error) {
|
|
41
|
+
const message = error.message.toLowerCase();
|
|
42
|
+
const suggestions = [];
|
|
43
|
+
// AWS Credentials
|
|
44
|
+
if (message.includes('credentials') || message.includes('access denied')) {
|
|
45
|
+
suggestions.push(...awsCredentialSuggestions());
|
|
46
|
+
}
|
|
47
|
+
// CDK Bootstrap
|
|
48
|
+
if (message.includes('bootstrap') || message.includes('cdk toolkit')) {
|
|
49
|
+
suggestions.push(...cdkBootstrapSuggestions());
|
|
50
|
+
}
|
|
51
|
+
// Stack not found
|
|
52
|
+
if (message.includes('stack') && message.includes('not found')) {
|
|
53
|
+
suggestions.push(...stackNotFoundSuggestions());
|
|
54
|
+
}
|
|
55
|
+
// Config file
|
|
56
|
+
if (message.includes('config') && message.includes('not found')) {
|
|
57
|
+
suggestions.push(...configNotFoundSuggestions());
|
|
58
|
+
}
|
|
59
|
+
// SSM Session Manager
|
|
60
|
+
if (message.includes('ssm') || message.includes('session')) {
|
|
61
|
+
suggestions.push(...ssmSuggestions());
|
|
62
|
+
}
|
|
63
|
+
// Network/timeout
|
|
64
|
+
if (message.includes('timeout') || message.includes('network')) {
|
|
65
|
+
suggestions.push(...networkSuggestions());
|
|
66
|
+
}
|
|
67
|
+
return suggestions;
|
|
68
|
+
}
|
|
69
|
+
export async function withRetry(operation, options = {}) {
|
|
70
|
+
const { maxAttempts = 3, delayMs = 1000, shouldRetry = () => true } = options;
|
|
71
|
+
let lastError;
|
|
72
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
73
|
+
try {
|
|
74
|
+
return await operation();
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
lastError = error;
|
|
78
|
+
// Don't retry if we shouldn't or if this was the last attempt
|
|
79
|
+
if (!shouldRetry(error) || attempt === maxAttempts) {
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
// Wait before retrying (exponential backoff)
|
|
83
|
+
const delay = delayMs * Math.pow(2, attempt - 1);
|
|
84
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
throw lastError;
|
|
88
|
+
}
|
|
89
|
+
export function isRetryableError(error) {
|
|
90
|
+
if (!(error instanceof Error)) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
const message = error.message.toLowerCase();
|
|
94
|
+
// Network/timeout errors are retryable
|
|
95
|
+
if (message.includes('timeout') ||
|
|
96
|
+
message.includes('network') ||
|
|
97
|
+
message.includes('econnrefused') ||
|
|
98
|
+
message.includes('econnreset') ||
|
|
99
|
+
message.includes('throttl')) {
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
// AWS SDK errors
|
|
103
|
+
if (error.name === 'ThrottlingException' || error.name === 'TooManyRequestsException') {
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
export class ValidationError extends CLIError {
|
|
109
|
+
constructor(message, suggestions = []) {
|
|
110
|
+
super(message, suggestions, 1);
|
|
111
|
+
this.name = 'ValidationError';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export class AWSError extends CLIError {
|
|
115
|
+
constructor(message, suggestions = []) {
|
|
116
|
+
super(message, suggestions, 1);
|
|
117
|
+
this.name = 'AWSError';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
export class ConfigError extends CLIError {
|
|
121
|
+
constructor(message, suggestions = []) {
|
|
122
|
+
super(message, suggestions, 1);
|
|
123
|
+
this.name = 'ConfigError';
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/cli/utils/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const logger: {
|
|
2
|
+
info: (msg: string) => void;
|
|
3
|
+
success: (msg: string) => void;
|
|
4
|
+
warn: (msg: string) => void;
|
|
5
|
+
error: (msg: string) => void;
|
|
6
|
+
title: (msg: string) => void;
|
|
7
|
+
box: (title: string, lines: string[]) => void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;gBACL,MAAM;mBACH,MAAM;gBACT,MAAM;iBACL,MAAM;iBAEN,MAAM;iBAON,MAAM,SAAS,MAAM,EAAE;CAYrC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export const logger = {
|
|
3
|
+
info: (msg) => console.log(chalk.blue('ℹ'), msg),
|
|
4
|
+
success: (msg) => console.log(chalk.green('✓'), msg),
|
|
5
|
+
warn: (msg) => console.log(chalk.yellow('⚠'), msg),
|
|
6
|
+
error: (msg) => console.log(chalk.red('✗'), msg),
|
|
7
|
+
title: (msg) => {
|
|
8
|
+
const border = '─'.repeat(msg.length + 4);
|
|
9
|
+
console.log(chalk.bold(`\n┌${border}┐`));
|
|
10
|
+
console.log(chalk.bold(`│ ${msg} │`));
|
|
11
|
+
console.log(chalk.bold(`└${border}┘\n`));
|
|
12
|
+
},
|
|
13
|
+
box: (title, lines) => {
|
|
14
|
+
const maxLen = Math.max(title.length, ...lines.map((l) => l.length));
|
|
15
|
+
const border = '─'.repeat(maxLen + 4);
|
|
16
|
+
console.log(chalk.bold(`\n┌${border}┐`));
|
|
17
|
+
console.log(chalk.bold(`│ ${title.padEnd(maxLen)} │`));
|
|
18
|
+
console.log(chalk.bold(`├${border}┤`));
|
|
19
|
+
lines.forEach((line) => {
|
|
20
|
+
console.log(`│ ${line.padEnd(maxLen)} │`);
|
|
21
|
+
});
|
|
22
|
+
console.log(chalk.bold(`└${border}┘\n`));
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/cli/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IACxD,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAC5D,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAC1D,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAExD,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,EAAE,CAAC,KAAa,EAAE,KAAe,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function awsCredentialSuggestions(): string[];
|
|
2
|
+
export declare function cdkBootstrapSuggestions(): string[];
|
|
3
|
+
export declare function stackNotFoundSuggestions(): string[];
|
|
4
|
+
export declare function configNotFoundSuggestions(): string[];
|
|
5
|
+
export declare function ssmSuggestions(): string[];
|
|
6
|
+
export declare function networkSuggestions(): string[];
|
|
7
|
+
//# sourceMappingURL=suggestions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestions.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/suggestions.ts"],"names":[],"mappings":"AAAA,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CASnD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAKlD;AAED,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAMnD;AAED,wBAAgB,yBAAyB,IAAI,MAAM,EAAE,CAKpD;AAED,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAMzC;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAM7C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function awsCredentialSuggestions() {
|
|
2
|
+
return [
|
|
3
|
+
'Session expired? Re-authenticate: aws sso login',
|
|
4
|
+
'First-time setup (IAM Identity Center/SSO): aws configure sso',
|
|
5
|
+
'Using access keys? Configure the AWS CLI: aws configure',
|
|
6
|
+
'Check env vars: AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY',
|
|
7
|
+
'Check credentials file: ~/.aws/credentials',
|
|
8
|
+
'Verify IAM permissions for CloudFormation, EC2, and SSM',
|
|
9
|
+
];
|
|
10
|
+
}
|
|
11
|
+
export function cdkBootstrapSuggestions() {
|
|
12
|
+
return [
|
|
13
|
+
'Bootstrap your account/region: cdk bootstrap aws://ACCOUNT-ID/REGION',
|
|
14
|
+
'Docs: https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html',
|
|
15
|
+
];
|
|
16
|
+
}
|
|
17
|
+
export function stackNotFoundSuggestions() {
|
|
18
|
+
return [
|
|
19
|
+
'Run: openclaw-aws deploy (to create the stack)',
|
|
20
|
+
'Check: openclaw-aws status (to see current state)',
|
|
21
|
+
'Confirm region/profile in your config',
|
|
22
|
+
];
|
|
23
|
+
}
|
|
24
|
+
export function configNotFoundSuggestions() {
|
|
25
|
+
return [
|
|
26
|
+
'Create a deployment: openclaw-aws init --name <name>',
|
|
27
|
+
'List configs: openclaw-aws list',
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
export function ssmSuggestions() {
|
|
31
|
+
return [
|
|
32
|
+
'Install Session Manager plugin: https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html',
|
|
33
|
+
'Wait a few minutes after start/restart for SSM to be ready',
|
|
34
|
+
'Check: openclaw-aws status',
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
export function networkSuggestions() {
|
|
38
|
+
return [
|
|
39
|
+
'Check your internet connection',
|
|
40
|
+
'Verify the AWS region is reachable from your network',
|
|
41
|
+
'Try again in a few moments',
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=suggestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestions.js","sourceRoot":"","sources":["../../../src/cli/utils/suggestions.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,iDAAiD;QACjD,+DAA+D;QAC/D,yDAAyD;QACzD,6DAA6D;QAC7D,4CAA4C;QAC5C,yDAAyD;KAC1D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,sEAAsE;QACtE,uEAAuE;KACxE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,gDAAgD;QAChD,mDAAmD;QACnD,uCAAuC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,sDAAsD;QACtD,iCAAiC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO;QACL,+IAA+I;QAC/I,4DAA4D;QAC5D,4BAA4B;KAC7B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,gCAAgC;QAChC,sDAAsD;QACtD,4BAA4B;KAC7B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function validateProjectName(name: string): string | boolean;
|
|
2
|
+
export declare function validateInstanceName(name: string): string | boolean;
|
|
3
|
+
export declare const AWS_REGIONS: {
|
|
4
|
+
title: string;
|
|
5
|
+
value: string;
|
|
6
|
+
}[];
|
|
7
|
+
export declare const INSTANCE_TYPES: {
|
|
8
|
+
title: string;
|
|
9
|
+
value: string;
|
|
10
|
+
description: string;
|
|
11
|
+
}[];
|
|
12
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/validation.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAkBlE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAcnE;AAED,eAAO,MAAM,WAAW;;;GAavB,CAAC;AAEF,eAAO,MAAM,cAAc;;;;GAS1B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export function validateProjectName(name) {
|
|
2
|
+
if (!name || name.trim().length === 0) {
|
|
3
|
+
return 'Project name is required';
|
|
4
|
+
}
|
|
5
|
+
if (!/^[a-z0-9-]+$/.test(name)) {
|
|
6
|
+
return 'Use lowercase letters, numbers, and hyphens only';
|
|
7
|
+
}
|
|
8
|
+
if (name.startsWith('-') || name.endsWith('-')) {
|
|
9
|
+
return 'Cannot start or end with a hyphen';
|
|
10
|
+
}
|
|
11
|
+
if (name.length > 50) {
|
|
12
|
+
return 'Project name must be 50 characters or less';
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
export function validateInstanceName(name) {
|
|
17
|
+
if (!name || name.trim().length === 0) {
|
|
18
|
+
return 'Instance name is required';
|
|
19
|
+
}
|
|
20
|
+
if (!/^[a-zA-Z0-9-]+$/.test(name)) {
|
|
21
|
+
return 'Use letters, numbers, and hyphens only';
|
|
22
|
+
}
|
|
23
|
+
if (name.length > 63) {
|
|
24
|
+
return 'Instance name must be 63 characters or less';
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
export const AWS_REGIONS = [
|
|
29
|
+
{ title: 'US East (N. Virginia) - us-east-1', value: 'us-east-1' },
|
|
30
|
+
{ title: 'US East (Ohio) - us-east-2', value: 'us-east-2' },
|
|
31
|
+
{ title: 'US West (N. California) - us-west-1', value: 'us-west-1' },
|
|
32
|
+
{ title: 'US West (Oregon) - us-west-2', value: 'us-west-2' },
|
|
33
|
+
{ title: 'EU (Ireland) - eu-west-1', value: 'eu-west-1' },
|
|
34
|
+
{ title: 'EU (London) - eu-west-2', value: 'eu-west-2' },
|
|
35
|
+
{ title: 'EU (Paris) - eu-west-3', value: 'eu-west-3' },
|
|
36
|
+
{ title: 'EU (Frankfurt) - eu-central-1', value: 'eu-central-1' },
|
|
37
|
+
{ title: 'Asia Pacific (Tokyo) - ap-northeast-1', value: 'ap-northeast-1' },
|
|
38
|
+
{ title: 'Asia Pacific (Seoul) - ap-northeast-2', value: 'ap-northeast-2' },
|
|
39
|
+
{ title: 'Asia Pacific (Singapore) - ap-southeast-1', value: 'ap-southeast-1' },
|
|
40
|
+
{ title: 'Asia Pacific (Sydney) - ap-southeast-2', value: 'ap-southeast-2' },
|
|
41
|
+
];
|
|
42
|
+
export const INSTANCE_TYPES = [
|
|
43
|
+
// {
|
|
44
|
+
// title: 't3.micro - 2 vCPU, 1 GB RAM (Free tier eligible)',
|
|
45
|
+
// value: 't3.micro',
|
|
46
|
+
// description: '$~7.50/month',
|
|
47
|
+
// },
|
|
48
|
+
{ title: 't3.small - 2 vCPU, 2 GB RAM', value: 't3.small', description: '$~15/month' },
|
|
49
|
+
{ title: 't3.medium - 2 vCPU, 4 GB RAM', value: 't3.medium', description: '$~30/month' },
|
|
50
|
+
{ title: 't3.large - 2 vCPU, 8 GB RAM', value: 't3.large', description: '$~60/month' },
|
|
51
|
+
];
|
|
52
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/cli/utils/validation.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,kDAAkD,CAAC;IAC5D,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,OAAO,mCAAmC,CAAC;IAC7C,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACrB,OAAO,4CAA4C,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClC,OAAO,wCAAwC,CAAC;IAClD,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACrB,OAAO,6CAA6C,CAAC;IACvD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,EAAE,KAAK,EAAE,mCAAmC,EAAE,KAAK,EAAE,WAAW,EAAE;IAClE,EAAE,KAAK,EAAE,4BAA4B,EAAE,KAAK,EAAE,WAAW,EAAE;IAC3D,EAAE,KAAK,EAAE,qCAAqC,EAAE,KAAK,EAAE,WAAW,EAAE;IACpE,EAAE,KAAK,EAAE,8BAA8B,EAAE,KAAK,EAAE,WAAW,EAAE;IAC7D,EAAE,KAAK,EAAE,0BAA0B,EAAE,KAAK,EAAE,WAAW,EAAE;IACzD,EAAE,KAAK,EAAE,yBAAyB,EAAE,KAAK,EAAE,WAAW,EAAE;IACxD,EAAE,KAAK,EAAE,wBAAwB,EAAE,KAAK,EAAE,WAAW,EAAE;IACvD,EAAE,KAAK,EAAE,+BAA+B,EAAE,KAAK,EAAE,cAAc,EAAE;IACjE,EAAE,KAAK,EAAE,uCAAuC,EAAE,KAAK,EAAE,gBAAgB,EAAE;IAC3E,EAAE,KAAK,EAAE,uCAAuC,EAAE,KAAK,EAAE,gBAAgB,EAAE;IAC3E,EAAE,KAAK,EAAE,2CAA2C,EAAE,KAAK,EAAE,gBAAgB,EAAE;IAC/E,EAAE,KAAK,EAAE,wCAAwC,EAAE,KAAK,EAAE,gBAAgB,EAAE;CAC7E,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI;IACJ,+DAA+D;IAC/D,uBAAuB;IACvB,iCAAiC;IACjC,KAAK;IACL,EAAE,KAAK,EAAE,6BAA6B,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE;IACtF,EAAE,KAAK,EAAE,8BAA8B,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE;IACxF,EAAE,KAAK,EAAE,6BAA6B,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE;CACvF,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@salza80/openclaw-aws",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Deploy OpenClaw AI agents on AWS with a simple CLI",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"openclaw",
|
|
7
|
+
"moltbot",
|
|
8
|
+
"clawdbot",
|
|
9
|
+
"aws",
|
|
10
|
+
"cdk",
|
|
11
|
+
"chatbot",
|
|
12
|
+
"ai",
|
|
13
|
+
"whatsapp",
|
|
14
|
+
"telegram",
|
|
15
|
+
"discord",
|
|
16
|
+
"claude",
|
|
17
|
+
"infrastructure"
|
|
18
|
+
],
|
|
19
|
+
"author": "Sally Mclean <smclean17@gmail.com>",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"homepage": "https://github.com/salza80/openclaw-aws#readme",
|
|
22
|
+
"repository": {
|
|
23
|
+
"type": "git",
|
|
24
|
+
"url": "git+https://github.com/salza80/openclaw-aws.git"
|
|
25
|
+
},
|
|
26
|
+
"bugs": {
|
|
27
|
+
"url": "https://github.com/salza80/openclaw-aws/issues"
|
|
28
|
+
},
|
|
29
|
+
"type": "module",
|
|
30
|
+
"bin": {
|
|
31
|
+
"openclaw-aws": "./dist/cli/index.js"
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist/",
|
|
35
|
+
"templates/",
|
|
36
|
+
"README.md",
|
|
37
|
+
"LICENSE"
|
|
38
|
+
],
|
|
39
|
+
"scripts": {
|
|
40
|
+
"build": "tsc",
|
|
41
|
+
"typecheck": "tsc --noEmit",
|
|
42
|
+
"watch": "tsc -w",
|
|
43
|
+
"dev": "tsc -w",
|
|
44
|
+
"prepublishOnly": "npm run build",
|
|
45
|
+
"pretest": "npm run build",
|
|
46
|
+
"test": "vitest run",
|
|
47
|
+
"test:watch": "vitest",
|
|
48
|
+
"pretest:coverage": "npm run build",
|
|
49
|
+
"test:coverage": "vitest run --coverage",
|
|
50
|
+
"lint": "eslint . --ext .ts,.js",
|
|
51
|
+
"lint:fix": "eslint . --ext .ts,.js --fix",
|
|
52
|
+
"format": "prettier . --write",
|
|
53
|
+
"format:check": "prettier . --check",
|
|
54
|
+
"changeset": "changeset",
|
|
55
|
+
"version": "changeset version",
|
|
56
|
+
"release": "changeset publish"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"@aws-sdk/client-cloudformation": "^3.978.0",
|
|
60
|
+
"@aws-sdk/client-ec2": "^3.979.0",
|
|
61
|
+
"@aws-sdk/client-ssm": "^3.978.0",
|
|
62
|
+
"@aws-sdk/client-sts": "^3.978.0",
|
|
63
|
+
"aws-cdk": "^2.237.1",
|
|
64
|
+
"aws-cdk-lib": "^2.237.1",
|
|
65
|
+
"chalk": "^5.6.2",
|
|
66
|
+
"constructs": "^10.0.0",
|
|
67
|
+
"dotenv": "^16.6.1",
|
|
68
|
+
"execa": "^9.6.1",
|
|
69
|
+
"ora": "^8.2.0",
|
|
70
|
+
"prompts": "^2.4.2",
|
|
71
|
+
"yargs": "^17.7.2"
|
|
72
|
+
},
|
|
73
|
+
"devDependencies": {
|
|
74
|
+
"@changesets/cli": "^2.29.8",
|
|
75
|
+
"@types/node": "^24.10.1",
|
|
76
|
+
"@types/prompts": "^2.4.9",
|
|
77
|
+
"@types/yargs": "^17.0.33",
|
|
78
|
+
"@typescript-eslint/eslint-plugin": "^8.40.0",
|
|
79
|
+
"@typescript-eslint/parser": "^8.40.0",
|
|
80
|
+
"@vitest/coverage-v8": "^3.2.0",
|
|
81
|
+
"eslint": "^9.22.0",
|
|
82
|
+
"eslint-config-prettier": "^10.1.0",
|
|
83
|
+
"globals": "^15.15.0",
|
|
84
|
+
"prettier": "^3.6.2",
|
|
85
|
+
"typescript": "~5.9.3",
|
|
86
|
+
"vitest": "^3.2.0"
|
|
87
|
+
},
|
|
88
|
+
"engines": {
|
|
89
|
+
"node": ">=20.0.0"
|
|
90
|
+
},
|
|
91
|
+
"publishConfig": {
|
|
92
|
+
"registry": "https://registry.npmjs.org/",
|
|
93
|
+
"access": "public"
|
|
94
|
+
},
|
|
95
|
+
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
|
|
96
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "1.0",
|
|
3
|
+
"aws": {
|
|
4
|
+
"region": "us-east-1",
|
|
5
|
+
"profile": "default"
|
|
6
|
+
},
|
|
7
|
+
"instance": {
|
|
8
|
+
"type": "t3.micro",
|
|
9
|
+
"name": "openclaw-my-bot"
|
|
10
|
+
},
|
|
11
|
+
"network": {
|
|
12
|
+
"useDefaultVpc": true
|
|
13
|
+
},
|
|
14
|
+
"features": {
|
|
15
|
+
"cloudWatchLogs": true
|
|
16
|
+
},
|
|
17
|
+
"stack": {
|
|
18
|
+
"name": "OpenclawStack-my-bot"
|
|
19
|
+
},
|
|
20
|
+
"openclaw": {
|
|
21
|
+
"apiProvider": "anthropic-api-key"
|
|
22
|
+
}
|
|
23
|
+
}
|