@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,359 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import prompts from 'prompts';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
import { getConfigPathByName } from '../utils/config.js';
|
|
7
|
+
import { buildCommandContext } from '../utils/context.js';
|
|
8
|
+
import { getStackStatus } from '../utils/aws.js';
|
|
9
|
+
import { handleError, AWSError } from '../utils/errors.js';
|
|
10
|
+
import { getCDKBinary } from '../utils/cdk.js';
|
|
11
|
+
import { listConfigNames, clearCurrentName, getCurrentName, setCurrentName, } from '../utils/config-store.js';
|
|
12
|
+
import { DeleteParameterCommand } from '@aws-sdk/client-ssm';
|
|
13
|
+
import { createSsmClient } from '../utils/aws-clients.js';
|
|
14
|
+
import { getApiKeyParamName, getGatewayTokenParamName } from '../utils/api-keys.js';
|
|
15
|
+
import path from 'path';
|
|
16
|
+
import { fileURLToPath } from 'url';
|
|
17
|
+
import fs from 'fs';
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
19
|
+
const __dirname = path.dirname(__filename);
|
|
20
|
+
async function deleteApiKeyParam(configName, provider, region) {
|
|
21
|
+
const client = createSsmClient(region);
|
|
22
|
+
const paramName = getApiKeyParamName(configName, provider);
|
|
23
|
+
try {
|
|
24
|
+
await client.send(new DeleteParameterCommand({ Name: paramName }));
|
|
25
|
+
logger.info(`Deleted SSM parameter: ${paramName}`);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (error instanceof Error && error.name === 'ParameterNotFound') {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
logger.warn(`Failed to delete SSM parameter: ${paramName}`);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
client.destroy();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function deleteGatewayTokenParam(configName, region) {
|
|
38
|
+
const client = createSsmClient(region);
|
|
39
|
+
const paramName = getGatewayTokenParamName(configName);
|
|
40
|
+
try {
|
|
41
|
+
await client.send(new DeleteParameterCommand({ Name: paramName }));
|
|
42
|
+
logger.info(`Deleted SSM parameter: ${paramName}`);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
if (error instanceof Error && error.name === 'ParameterNotFound') {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
logger.warn(`Failed to delete SSM parameter: ${paramName}`);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
client.destroy();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function updateCurrentAfterDeletion(deletedNames) {
|
|
55
|
+
const current = getCurrentName();
|
|
56
|
+
if (!current || !deletedNames.includes(current))
|
|
57
|
+
return;
|
|
58
|
+
const remaining = listConfigNames();
|
|
59
|
+
if (remaining.length > 0) {
|
|
60
|
+
setCurrentName(remaining[0]);
|
|
61
|
+
logger.info(`Current config set to ${remaining[0]}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
clearCurrentName();
|
|
65
|
+
logger.info('No configs remaining. Current config cleared');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export const destroyCommand = {
|
|
69
|
+
command: 'destroy',
|
|
70
|
+
describe: 'Delete all AWS resources',
|
|
71
|
+
builder: (yargs) => {
|
|
72
|
+
return yargs
|
|
73
|
+
.option('force', {
|
|
74
|
+
type: 'boolean',
|
|
75
|
+
describe: 'Skip confirmation prompt',
|
|
76
|
+
default: false,
|
|
77
|
+
})
|
|
78
|
+
.option('delete-config', {
|
|
79
|
+
type: 'boolean',
|
|
80
|
+
describe: 'Delete configuration file after destroying',
|
|
81
|
+
default: false,
|
|
82
|
+
})
|
|
83
|
+
.option('name', {
|
|
84
|
+
type: 'string',
|
|
85
|
+
describe: 'Deployment name',
|
|
86
|
+
})
|
|
87
|
+
.option('all', {
|
|
88
|
+
type: 'boolean',
|
|
89
|
+
describe: 'Destroy all configs',
|
|
90
|
+
default: false,
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
handler: async (argv) => {
|
|
94
|
+
try {
|
|
95
|
+
if (argv.all) {
|
|
96
|
+
const names = listConfigNames();
|
|
97
|
+
if (names.length === 0) {
|
|
98
|
+
logger.info('No configs found');
|
|
99
|
+
console.log('\nRun: ' + chalk.cyan('openclaw-aws init --name <name>'));
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const { confirmText } = await prompts({
|
|
103
|
+
type: 'text',
|
|
104
|
+
name: 'confirmText',
|
|
105
|
+
message: 'Type "DESTROY ALL" to confirm:',
|
|
106
|
+
validate: (value) => value === 'DESTROY ALL' || 'You must type DESTROY ALL to confirm',
|
|
107
|
+
});
|
|
108
|
+
if (confirmText !== 'DESTROY ALL') {
|
|
109
|
+
logger.warn('Destruction cancelled');
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const cdkBinary = getCDKBinary();
|
|
113
|
+
const cdkAppPath = path.resolve(__dirname, '../../cdk/app.js');
|
|
114
|
+
for (const name of names) {
|
|
115
|
+
const ctx = await buildCommandContext({ name });
|
|
116
|
+
const config = ctx.config;
|
|
117
|
+
const apiProvider = config.openclaw?.apiProvider || 'anthropic-api-key';
|
|
118
|
+
logger.title('OpenClaw AWS - Destroy');
|
|
119
|
+
logger.info(`Destroying ${chalk.cyan(ctx.name)}`);
|
|
120
|
+
let stackExists = true;
|
|
121
|
+
const spinner = ora('Checking stack status...').start();
|
|
122
|
+
try {
|
|
123
|
+
await getStackStatus(config.stack.name, config.aws.region);
|
|
124
|
+
spinner.succeed(`Stack found: ${config.stack.name}`);
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
spinner.warn('Stack not found (may already be deleted)');
|
|
128
|
+
stackExists = false;
|
|
129
|
+
}
|
|
130
|
+
if (!stackExists) {
|
|
131
|
+
logger.info('No resources to delete');
|
|
132
|
+
await deleteApiKeyParam(ctx.name, apiProvider, config.aws.region);
|
|
133
|
+
await deleteGatewayTokenParam(ctx.name, config.aws.region);
|
|
134
|
+
console.log('');
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const env = {
|
|
138
|
+
...ctx.awsEnv,
|
|
139
|
+
OPENCLAW_CONFIG_NAME: ctx.name,
|
|
140
|
+
CDK_DISABLE_VERSION_CHECK: 'true',
|
|
141
|
+
CDK_DISABLE_CLI_TELEMETRY: '1',
|
|
142
|
+
CI: 'true',
|
|
143
|
+
};
|
|
144
|
+
const destroySpinner = ora('Destroying stack... (this may take 3-5 minutes)').start();
|
|
145
|
+
try {
|
|
146
|
+
await execa(cdkBinary, [
|
|
147
|
+
'destroy',
|
|
148
|
+
config.stack.name,
|
|
149
|
+
'--app',
|
|
150
|
+
`node ${cdkAppPath}`,
|
|
151
|
+
'--no-notices',
|
|
152
|
+
'--no-version-reporting',
|
|
153
|
+
'--force',
|
|
154
|
+
], {
|
|
155
|
+
env,
|
|
156
|
+
cwd: process.cwd(),
|
|
157
|
+
});
|
|
158
|
+
destroySpinner.succeed('Stack destroyed successfully');
|
|
159
|
+
logger.success('All resources removed');
|
|
160
|
+
console.log('\nTotal cost: $0/month');
|
|
161
|
+
await deleteApiKeyParam(ctx.name, apiProvider, config.aws.region);
|
|
162
|
+
await deleteGatewayTokenParam(ctx.name, config.aws.region);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
destroySpinner.fail('Destruction failed');
|
|
166
|
+
throw new AWSError('Stack destruction failed', [
|
|
167
|
+
'Check AWS Console CloudFormation page for details',
|
|
168
|
+
'Some resources may need manual cleanup',
|
|
169
|
+
'Try running destroy again after a few minutes',
|
|
170
|
+
]);
|
|
171
|
+
}
|
|
172
|
+
console.log('');
|
|
173
|
+
}
|
|
174
|
+
if (argv.deleteConfig) {
|
|
175
|
+
for (const name of names) {
|
|
176
|
+
const configPath = getConfigPathByName(name);
|
|
177
|
+
if (fs.existsSync(configPath)) {
|
|
178
|
+
fs.unlinkSync(configPath);
|
|
179
|
+
logger.success(`Configuration deleted: ${name}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
updateCurrentAfterDeletion(names);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
const { deleteConfigs } = await prompts({
|
|
186
|
+
type: 'confirm',
|
|
187
|
+
name: 'deleteConfigs',
|
|
188
|
+
message: 'Delete configuration files for all configs?',
|
|
189
|
+
initial: false,
|
|
190
|
+
});
|
|
191
|
+
if (deleteConfigs) {
|
|
192
|
+
for (const name of names) {
|
|
193
|
+
const configPath = getConfigPathByName(name);
|
|
194
|
+
if (fs.existsSync(configPath)) {
|
|
195
|
+
fs.unlinkSync(configPath);
|
|
196
|
+
logger.success(`Configuration deleted: ${name}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
updateCurrentAfterDeletion(names);
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
logger.info('Configurations kept');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
// Load configuration
|
|
208
|
+
const ctx = await buildCommandContext({ name: argv.name });
|
|
209
|
+
const config = ctx.config;
|
|
210
|
+
const apiProvider = config.openclaw?.apiProvider || 'anthropic-api-key';
|
|
211
|
+
logger.title('OpenClaw AWS - Destroy');
|
|
212
|
+
logger.info(`Destroying ${chalk.cyan(ctx.name)}`);
|
|
213
|
+
// Try to get stack status
|
|
214
|
+
let stackExists = true;
|
|
215
|
+
let instanceId;
|
|
216
|
+
const spinner = ora('Checking stack status...').start();
|
|
217
|
+
try {
|
|
218
|
+
const status = await getStackStatus(config.stack.name, config.aws.region);
|
|
219
|
+
instanceId = status.instanceId;
|
|
220
|
+
spinner.succeed(`Stack found: ${config.stack.name}`);
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
spinner.warn('Stack not found (may already be deleted)');
|
|
224
|
+
stackExists = false;
|
|
225
|
+
}
|
|
226
|
+
if (!stackExists) {
|
|
227
|
+
logger.info('No resources to delete');
|
|
228
|
+
console.log('\n' + chalk.bold('Next steps:'));
|
|
229
|
+
console.log(' ' + chalk.cyan('openclaw-aws deploy') + ' - Create a deployment');
|
|
230
|
+
console.log(' ' + chalk.cyan('openclaw-aws status') + ' - Check current status');
|
|
231
|
+
await deleteApiKeyParam(ctx.name, apiProvider, config.aws.region);
|
|
232
|
+
await deleteGatewayTokenParam(ctx.name, config.aws.region);
|
|
233
|
+
if (argv.deleteConfig) {
|
|
234
|
+
const configPath = getConfigPathByName(ctx.name);
|
|
235
|
+
if (fs.existsSync(configPath)) {
|
|
236
|
+
fs.unlinkSync(configPath);
|
|
237
|
+
logger.success('Configuration file deleted');
|
|
238
|
+
}
|
|
239
|
+
updateCurrentAfterDeletion([ctx.name]);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
const { deleteConfig } = await prompts({
|
|
243
|
+
type: 'confirm',
|
|
244
|
+
name: 'deleteConfig',
|
|
245
|
+
message: 'Delete configuration file?',
|
|
246
|
+
initial: false,
|
|
247
|
+
});
|
|
248
|
+
if (deleteConfig) {
|
|
249
|
+
const configPath = getConfigPathByName(ctx.name);
|
|
250
|
+
if (fs.existsSync(configPath)) {
|
|
251
|
+
fs.unlinkSync(configPath);
|
|
252
|
+
logger.success('Configuration file deleted');
|
|
253
|
+
}
|
|
254
|
+
updateCurrentAfterDeletion([ctx.name]);
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
logger.info(`Configuration kept at ${getConfigPathByName(ctx.name)}`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// Show what will be deleted
|
|
263
|
+
console.log('\n' + chalk.red('⚠ WARNING:') + ' This will permanently delete:\n');
|
|
264
|
+
console.log(chalk.red(' ✗ EC2 instance: ' + config.instance.name + (instanceId ? ` (${instanceId})` : '')));
|
|
265
|
+
console.log(chalk.red(' ✗ All data on the instance'));
|
|
266
|
+
console.log(chalk.red(' ✗ Security group'));
|
|
267
|
+
console.log(chalk.red(' ✗ IAM role'));
|
|
268
|
+
console.log(chalk.red(' ✗ CloudFormation stack: ' + config.stack.name));
|
|
269
|
+
console.log('\n' + chalk.bold('This action CANNOT be undone!\n'));
|
|
270
|
+
// Confirmation
|
|
271
|
+
if (!argv.force) {
|
|
272
|
+
const { confirmText } = await prompts({
|
|
273
|
+
type: 'text',
|
|
274
|
+
name: 'confirmText',
|
|
275
|
+
message: 'Type "DELETE" to confirm:',
|
|
276
|
+
validate: (value) => value === 'DELETE' || 'You must type DELETE to confirm',
|
|
277
|
+
});
|
|
278
|
+
if (confirmText !== 'DELETE') {
|
|
279
|
+
logger.warn('Destruction cancelled');
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Get CDK binary (local from node_modules or global fallback)
|
|
284
|
+
const cdkBinary = getCDKBinary();
|
|
285
|
+
// Get CDK app path
|
|
286
|
+
const cdkAppPath = path.resolve(__dirname, '../../cdk/app.js');
|
|
287
|
+
// Set up environment
|
|
288
|
+
const env = {
|
|
289
|
+
...ctx.awsEnv,
|
|
290
|
+
OPENCLAW_CONFIG_NAME: ctx.name,
|
|
291
|
+
CDK_DISABLE_VERSION_CHECK: 'true',
|
|
292
|
+
CDK_DISABLE_CLI_TELEMETRY: '1',
|
|
293
|
+
CI: 'true',
|
|
294
|
+
};
|
|
295
|
+
// Destroy stack
|
|
296
|
+
const destroySpinner = ora('Destroying stack... (this may take 3-5 minutes)').start();
|
|
297
|
+
try {
|
|
298
|
+
await execa(cdkBinary, [
|
|
299
|
+
'destroy',
|
|
300
|
+
config.stack.name,
|
|
301
|
+
'--app',
|
|
302
|
+
`node ${cdkAppPath}`,
|
|
303
|
+
'--no-notices',
|
|
304
|
+
'--no-version-reporting',
|
|
305
|
+
'--force',
|
|
306
|
+
], {
|
|
307
|
+
env,
|
|
308
|
+
cwd: process.cwd(),
|
|
309
|
+
});
|
|
310
|
+
destroySpinner.succeed('Stack destroyed successfully');
|
|
311
|
+
logger.success('All resources removed');
|
|
312
|
+
console.log('\nTotal cost: $0/month');
|
|
313
|
+
await deleteApiKeyParam(ctx.name, apiProvider, config.aws.region);
|
|
314
|
+
await deleteGatewayTokenParam(ctx.name, config.aws.region);
|
|
315
|
+
// Ask about config file
|
|
316
|
+
if (argv.deleteConfig) {
|
|
317
|
+
const configPath = getConfigPathByName(ctx.name);
|
|
318
|
+
if (fs.existsSync(configPath)) {
|
|
319
|
+
fs.unlinkSync(configPath);
|
|
320
|
+
logger.success('Configuration file deleted');
|
|
321
|
+
}
|
|
322
|
+
updateCurrentAfterDeletion([ctx.name]);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
const { deleteConfig } = await prompts({
|
|
326
|
+
type: 'confirm',
|
|
327
|
+
name: 'deleteConfig',
|
|
328
|
+
message: 'Delete configuration file?',
|
|
329
|
+
initial: false,
|
|
330
|
+
});
|
|
331
|
+
if (deleteConfig) {
|
|
332
|
+
const configPath = getConfigPathByName(ctx.name);
|
|
333
|
+
if (fs.existsSync(configPath)) {
|
|
334
|
+
fs.unlinkSync(configPath);
|
|
335
|
+
logger.success('Configuration file deleted');
|
|
336
|
+
}
|
|
337
|
+
updateCurrentAfterDeletion([ctx.name]);
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
logger.info(`Configuration kept at ${getConfigPathByName(ctx.name)}`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch {
|
|
345
|
+
destroySpinner.fail('Destruction failed');
|
|
346
|
+
throw new AWSError('Stack destruction failed', [
|
|
347
|
+
'Check AWS Console CloudFormation page for details',
|
|
348
|
+
'Some resources may need manual cleanup',
|
|
349
|
+
'Try running destroy again after a few minutes',
|
|
350
|
+
]);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
handleError(error);
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
};
|
|
358
|
+
export default destroyCommand;
|
|
359
|
+
//# sourceMappingURL=destroy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../../src/cli/commands/destroy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CommandModule } from 'yargs';
|
|
2
|
+
import type { Provider } from '../types/index.js';
|
|
3
|
+
interface InitArgs {
|
|
4
|
+
name?: string;
|
|
5
|
+
region?: string;
|
|
6
|
+
instanceType?: string;
|
|
7
|
+
yes?: boolean;
|
|
8
|
+
apiProvider?: Provider;
|
|
9
|
+
}
|
|
10
|
+
export declare const initCommand: CommandModule<{}, InitArgs>;
|
|
11
|
+
export default initCommand;
|
|
12
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAa3C,OAAO,KAAK,EAAkB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlE,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,QAAQ,CAAC;CACxB;AAED,eAAO,MAAM,WAAW,EAAE,aAAa,CAAC,EAAE,EAAE,QAAQ,CA8QnD,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import prompts from 'prompts';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
import { saveConfigByName, configExistsByName } from '../utils/config.js';
|
|
5
|
+
import { setCurrentName } from '../utils/config-store.js';
|
|
6
|
+
import { validateProjectName, validateInstanceName, AWS_REGIONS, INSTANCE_TYPES, } from '../utils/validation.js';
|
|
7
|
+
import { handleError, ValidationError } from '../utils/errors.js';
|
|
8
|
+
import { API_PROVIDERS } from '../constants.js';
|
|
9
|
+
export const initCommand = {
|
|
10
|
+
command: 'init',
|
|
11
|
+
describe: 'Initialize OpenClaw AWS deployment configuration',
|
|
12
|
+
builder: (yargs) => {
|
|
13
|
+
return yargs
|
|
14
|
+
.option('region', {
|
|
15
|
+
type: 'string',
|
|
16
|
+
describe: 'AWS region',
|
|
17
|
+
})
|
|
18
|
+
.option('name', {
|
|
19
|
+
type: 'string',
|
|
20
|
+
describe: 'Deployment name (unique)',
|
|
21
|
+
})
|
|
22
|
+
.option('instance-type', {
|
|
23
|
+
type: 'string',
|
|
24
|
+
describe: 'EC2 instance type',
|
|
25
|
+
})
|
|
26
|
+
.option('api-provider', {
|
|
27
|
+
type: 'string',
|
|
28
|
+
describe: 'API provider',
|
|
29
|
+
choices: API_PROVIDERS.map((p) => p.value),
|
|
30
|
+
})
|
|
31
|
+
.option('yes', {
|
|
32
|
+
type: 'boolean',
|
|
33
|
+
alias: 'y',
|
|
34
|
+
describe: 'Use default values (non-interactive)',
|
|
35
|
+
default: false,
|
|
36
|
+
});
|
|
37
|
+
},
|
|
38
|
+
handler: async (argv) => {
|
|
39
|
+
try {
|
|
40
|
+
logger.title('OpenClaw AWS - Deployment Setup Wizard');
|
|
41
|
+
const apiProviderValues = API_PROVIDERS.map((p) => p.value);
|
|
42
|
+
if (argv.apiProvider && !apiProviderValues.includes(argv.apiProvider)) {
|
|
43
|
+
throw new ValidationError(`Invalid API provider: ${argv.apiProvider}`, [
|
|
44
|
+
`Valid providers: ${apiProviderValues.join(', ')}`,
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
// Check if config already exists (by name)
|
|
48
|
+
if (argv.name && configExistsByName(argv.name)) {
|
|
49
|
+
const { overwrite } = await prompts({
|
|
50
|
+
type: 'confirm',
|
|
51
|
+
name: 'overwrite',
|
|
52
|
+
message: `Deployment "${argv.name}" already exists. Overwrite?`,
|
|
53
|
+
initial: false,
|
|
54
|
+
});
|
|
55
|
+
if (!overwrite) {
|
|
56
|
+
logger.info('Configuration unchanged');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
let config;
|
|
61
|
+
let deploymentName = argv.name;
|
|
62
|
+
if (argv.yes) {
|
|
63
|
+
// Use defaults
|
|
64
|
+
const apiProvider = argv.apiProvider || 'anthropic-api-key';
|
|
65
|
+
deploymentName = deploymentName || 'my-openclaw-bot';
|
|
66
|
+
config = {
|
|
67
|
+
version: '1.0',
|
|
68
|
+
// deployment name is the single source of truth; project name removed
|
|
69
|
+
aws: {
|
|
70
|
+
region: argv.region || 'us-east-1',
|
|
71
|
+
},
|
|
72
|
+
network: {
|
|
73
|
+
useDefaultVpc: true,
|
|
74
|
+
},
|
|
75
|
+
instance: {
|
|
76
|
+
type: argv.instanceType || 't3.small',
|
|
77
|
+
name: `openclaw-${deploymentName}`,
|
|
78
|
+
},
|
|
79
|
+
features: {
|
|
80
|
+
cloudWatchLogs: true,
|
|
81
|
+
},
|
|
82
|
+
stack: {
|
|
83
|
+
name: `OpenclawStack-${deploymentName}`,
|
|
84
|
+
},
|
|
85
|
+
openclaw: {
|
|
86
|
+
apiProvider,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Interactive prompts
|
|
92
|
+
const answers = await prompts([
|
|
93
|
+
{
|
|
94
|
+
type: 'text',
|
|
95
|
+
name: 'deploymentName',
|
|
96
|
+
message: 'Deployment name (unique):',
|
|
97
|
+
initial: deploymentName,
|
|
98
|
+
validate: (value) => validateProjectName(value) === true
|
|
99
|
+
? true
|
|
100
|
+
: `Name your bot. ${String(validateProjectName(value))}`,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: 'select',
|
|
104
|
+
name: 'region',
|
|
105
|
+
message: 'AWS Region:',
|
|
106
|
+
choices: AWS_REGIONS,
|
|
107
|
+
initial: 0,
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
type: 'select',
|
|
111
|
+
name: 'useDefaultVpc',
|
|
112
|
+
message: 'VPC Configuration:',
|
|
113
|
+
choices: [
|
|
114
|
+
{
|
|
115
|
+
title: 'Use default VPC (recommended)',
|
|
116
|
+
value: true,
|
|
117
|
+
description: 'Simpler, faster, uses existing VPC',
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
title: 'Create new VPC',
|
|
121
|
+
value: false,
|
|
122
|
+
description: 'Dedicated isolated VPC for OpenClaw',
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
initial: 0,
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
type: 'select',
|
|
129
|
+
name: 'instanceType',
|
|
130
|
+
message: 'EC2 Instance type:',
|
|
131
|
+
choices: INSTANCE_TYPES,
|
|
132
|
+
initial: 0,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'text',
|
|
136
|
+
name: 'instanceName',
|
|
137
|
+
message: 'Instance name:',
|
|
138
|
+
initial: (_prev, values) => `openclaw-${values.deploymentName}`,
|
|
139
|
+
validate: (value) => validateInstanceName(value) === true ? true : String(validateInstanceName(value)),
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'select',
|
|
143
|
+
name: 'apiProvider',
|
|
144
|
+
message: 'Select AI API Provider:',
|
|
145
|
+
choices: [...API_PROVIDERS],
|
|
146
|
+
initial: 0,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
type: 'confirm',
|
|
150
|
+
name: 'cloudWatchLogs',
|
|
151
|
+
message: 'Enable CloudWatch Logs?',
|
|
152
|
+
initial: true,
|
|
153
|
+
},
|
|
154
|
+
]);
|
|
155
|
+
// Check if user cancelled
|
|
156
|
+
if (!answers.deploymentName) {
|
|
157
|
+
logger.warn('Setup cancelled');
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
deploymentName = answers.deploymentName;
|
|
161
|
+
config = {
|
|
162
|
+
version: '1.0',
|
|
163
|
+
aws: {
|
|
164
|
+
region: argv.region || answers.region,
|
|
165
|
+
},
|
|
166
|
+
network: {
|
|
167
|
+
useDefaultVpc: answers.useDefaultVpc,
|
|
168
|
+
},
|
|
169
|
+
instance: {
|
|
170
|
+
type: argv.instanceType || answers.instanceType,
|
|
171
|
+
name: `openclaw-${deploymentName}`,
|
|
172
|
+
},
|
|
173
|
+
features: {
|
|
174
|
+
cloudWatchLogs: answers.cloudWatchLogs,
|
|
175
|
+
},
|
|
176
|
+
stack: {
|
|
177
|
+
name: `OpenclawStack-${deploymentName}`,
|
|
178
|
+
},
|
|
179
|
+
openclaw: {
|
|
180
|
+
apiProvider: answers.apiProvider,
|
|
181
|
+
},
|
|
182
|
+
};
|
|
183
|
+
// Show warnings after config created
|
|
184
|
+
if (!config.network.useDefaultVpc) {
|
|
185
|
+
logger.info('ℹ️ Note: A new VPC will be created for this deployment');
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
if (!deploymentName) {
|
|
189
|
+
throw new Error('Deployment name is required');
|
|
190
|
+
}
|
|
191
|
+
if (configExistsByName(deploymentName) && !argv.name) {
|
|
192
|
+
logger.warn(`Deployment "${deploymentName}" already exists`);
|
|
193
|
+
console.log('Choose a different name or rerun with --name to overwrite.');
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
logger.info(`Creating deployment ${chalk.cyan(deploymentName)}`);
|
|
197
|
+
// Save configuration
|
|
198
|
+
saveConfigByName(config, deploymentName);
|
|
199
|
+
logger.success(`Configuration saved for "${deploymentName}"`);
|
|
200
|
+
setCurrentName(deploymentName);
|
|
201
|
+
// Display summary
|
|
202
|
+
console.log('\n' + chalk.bold('Configuration Summary:'));
|
|
203
|
+
console.log(` ${chalk.bold('Deployment:')} ${chalk.cyan(deploymentName)}`);
|
|
204
|
+
console.log(` ${chalk.bold('Region:')} ${chalk.cyan(config.aws.region)}`);
|
|
205
|
+
console.log(` ${chalk.bold('Instance:')} ${chalk.cyan(config.instance.type)}`);
|
|
206
|
+
console.log(` ${chalk.bold('Name:')} ${chalk.cyan(config.instance.name)}`);
|
|
207
|
+
console.log(` ${chalk.bold('AMI:')} ${chalk.cyan('Ubuntu 24.04 LTS')}`);
|
|
208
|
+
console.log(` ${chalk.bold('Node.js:')} ${chalk.cyan('22 (hardcoded)')}`);
|
|
209
|
+
console.log(` ${chalk.bold('Stack:')} ${chalk.cyan(config.stack.name)}`);
|
|
210
|
+
console.log(` ${chalk.bold('API Provider:')} ${chalk.cyan(config.openclaw?.apiProvider || 'anthropic')}`);
|
|
211
|
+
// Show required environment variable
|
|
212
|
+
const apiProvider = config.openclaw?.apiProvider || 'anthropic-api-key';
|
|
213
|
+
const envVarName = apiProvider.toUpperCase().replace(/-/g, '_');
|
|
214
|
+
console.log(`\n${chalk.yellow('⚠ Required before deployment:')}`);
|
|
215
|
+
console.log(` Set your API key: export ${envVarName}=your-api-key`);
|
|
216
|
+
console.log(` Or add it to .env: ${envVarName}=your-api-key`);
|
|
217
|
+
if (apiProvider === 'openrouter-api-key') {
|
|
218
|
+
console.log(` Get your key: https://openrouter.ai/keys`);
|
|
219
|
+
}
|
|
220
|
+
else if (apiProvider === 'anthropic-api-key') {
|
|
221
|
+
console.log(` Get your key: https://console.anthropic.com/settings/keys`);
|
|
222
|
+
}
|
|
223
|
+
else if (apiProvider === 'openai-api-key') {
|
|
224
|
+
console.log(` Get your key: https://platform.openai.com/api-keys`);
|
|
225
|
+
}
|
|
226
|
+
// Ask to deploy now
|
|
227
|
+
if (!argv.yes) {
|
|
228
|
+
console.log('');
|
|
229
|
+
const { deployNow } = await prompts({
|
|
230
|
+
type: 'confirm',
|
|
231
|
+
name: 'deployNow',
|
|
232
|
+
message: 'Deploy now?',
|
|
233
|
+
initial: false,
|
|
234
|
+
});
|
|
235
|
+
if (deployNow) {
|
|
236
|
+
console.log('');
|
|
237
|
+
await import('./deploy.js').then(({ default: deployCommand }) => deployCommand.handler?.({
|
|
238
|
+
name: deploymentName,
|
|
239
|
+
autoApprove: false,
|
|
240
|
+
_: [],
|
|
241
|
+
$0: 'openclaw-aws',
|
|
242
|
+
}));
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
console.log(`\n${chalk.bold('Next steps:')}`);
|
|
246
|
+
console.log(` Set your API key: ${chalk.cyan(`export ${envVarName}=your-api-key`)}`);
|
|
247
|
+
console.log(` Or add it to .env: ${chalk.cyan(`${envVarName}=your-api-key`)}`);
|
|
248
|
+
console.log(` When you're ready, run: ${chalk.cyan('openclaw-aws deploy')}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
handleError(error);
|
|
254
|
+
}
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
export default initCommand;
|
|
258
|
+
//# sourceMappingURL=init.js.map
|