@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.
Files changed (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +414 -0
  3. package/dist/cdk/app.d.ts +3 -0
  4. package/dist/cdk/app.d.ts.map +1 -0
  5. package/dist/cdk/app.js +60 -0
  6. package/dist/cdk/app.js.map +1 -0
  7. package/dist/cdk/stack.d.ts +16 -0
  8. package/dist/cdk/stack.d.ts.map +1 -0
  9. package/dist/cdk/stack.js +151 -0
  10. package/dist/cdk/stack.js.map +1 -0
  11. package/dist/cli/commands/connect.d.ts +7 -0
  12. package/dist/cli/commands/connect.d.ts.map +1 -0
  13. package/dist/cli/commands/connect.js +99 -0
  14. package/dist/cli/commands/connect.js.map +1 -0
  15. package/dist/cli/commands/current.d.ts +4 -0
  16. package/dist/cli/commands/current.d.ts.map +1 -0
  17. package/dist/cli/commands/current.js +18 -0
  18. package/dist/cli/commands/current.js.map +1 -0
  19. package/dist/cli/commands/dashboard.d.ts +8 -0
  20. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  21. package/dist/cli/commands/dashboard.js +231 -0
  22. package/dist/cli/commands/dashboard.js.map +1 -0
  23. package/dist/cli/commands/deploy.d.ts +9 -0
  24. package/dist/cli/commands/deploy.d.ts.map +1 -0
  25. package/dist/cli/commands/deploy.js +380 -0
  26. package/dist/cli/commands/deploy.js.map +1 -0
  27. package/dist/cli/commands/destroy.d.ts +10 -0
  28. package/dist/cli/commands/destroy.d.ts.map +1 -0
  29. package/dist/cli/commands/destroy.js +359 -0
  30. package/dist/cli/commands/destroy.js.map +1 -0
  31. package/dist/cli/commands/init.d.ts +12 -0
  32. package/dist/cli/commands/init.d.ts.map +1 -0
  33. package/dist/cli/commands/init.js +258 -0
  34. package/dist/cli/commands/init.js.map +1 -0
  35. package/dist/cli/commands/list.d.ts +4 -0
  36. package/dist/cli/commands/list.d.ts.map +1 -0
  37. package/dist/cli/commands/list.js +23 -0
  38. package/dist/cli/commands/list.js.map +1 -0
  39. package/dist/cli/commands/logs.d.ts +11 -0
  40. package/dist/cli/commands/logs.d.ts.map +1 -0
  41. package/dist/cli/commands/logs.js +163 -0
  42. package/dist/cli/commands/logs.js.map +1 -0
  43. package/dist/cli/commands/outputs.d.ts +7 -0
  44. package/dist/cli/commands/outputs.d.ts.map +1 -0
  45. package/dist/cli/commands/outputs.js +69 -0
  46. package/dist/cli/commands/outputs.js.map +1 -0
  47. package/dist/cli/commands/restart.d.ts +8 -0
  48. package/dist/cli/commands/restart.d.ts.map +1 -0
  49. package/dist/cli/commands/restart.js +91 -0
  50. package/dist/cli/commands/restart.js.map +1 -0
  51. package/dist/cli/commands/start.d.ts +7 -0
  52. package/dist/cli/commands/start.d.ts.map +1 -0
  53. package/dist/cli/commands/start.js +80 -0
  54. package/dist/cli/commands/start.js.map +1 -0
  55. package/dist/cli/commands/status.d.ts +12 -0
  56. package/dist/cli/commands/status.d.ts.map +1 -0
  57. package/dist/cli/commands/status.js +244 -0
  58. package/dist/cli/commands/status.js.map +1 -0
  59. package/dist/cli/commands/stop.d.ts +8 -0
  60. package/dist/cli/commands/stop.d.ts.map +1 -0
  61. package/dist/cli/commands/stop.js +86 -0
  62. package/dist/cli/commands/stop.js.map +1 -0
  63. package/dist/cli/commands/use.d.ts +7 -0
  64. package/dist/cli/commands/use.d.ts.map +1 -0
  65. package/dist/cli/commands/use.js +26 -0
  66. package/dist/cli/commands/use.js.map +1 -0
  67. package/dist/cli/constants.d.ts +63 -0
  68. package/dist/cli/constants.d.ts.map +1 -0
  69. package/dist/cli/constants.js +37 -0
  70. package/dist/cli/constants.js.map +1 -0
  71. package/dist/cli/index.d.ts +3 -0
  72. package/dist/cli/index.d.ts.map +1 -0
  73. package/dist/cli/index.js +43 -0
  74. package/dist/cli/index.js.map +1 -0
  75. package/dist/cli/types/index.d.ts +47 -0
  76. package/dist/cli/types/index.d.ts.map +1 -0
  77. package/dist/cli/types/index.js +2 -0
  78. package/dist/cli/types/index.js.map +1 -0
  79. package/dist/cli/utils/api-keys.d.ts +6 -0
  80. package/dist/cli/utils/api-keys.d.ts.map +1 -0
  81. package/dist/cli/utils/api-keys.js +14 -0
  82. package/dist/cli/utils/api-keys.js.map +1 -0
  83. package/dist/cli/utils/aws-clients.d.ts +7 -0
  84. package/dist/cli/utils/aws-clients.d.ts.map +1 -0
  85. package/dist/cli/utils/aws-clients.js +13 -0
  86. package/dist/cli/utils/aws-clients.js.map +1 -0
  87. package/dist/cli/utils/aws-validation.d.ts +35 -0
  88. package/dist/cli/utils/aws-validation.d.ts.map +1 -0
  89. package/dist/cli/utils/aws-validation.js +266 -0
  90. package/dist/cli/utils/aws-validation.js.map +1 -0
  91. package/dist/cli/utils/aws.d.ts +17 -0
  92. package/dist/cli/utils/aws.d.ts.map +1 -0
  93. package/dist/cli/utils/aws.js +213 -0
  94. package/dist/cli/utils/aws.js.map +1 -0
  95. package/dist/cli/utils/cdk.d.ts +12 -0
  96. package/dist/cli/utils/cdk.d.ts.map +1 -0
  97. package/dist/cli/utils/cdk.js +52 -0
  98. package/dist/cli/utils/cdk.js.map +1 -0
  99. package/dist/cli/utils/cloud-init.d.ts +11 -0
  100. package/dist/cli/utils/cloud-init.d.ts.map +1 -0
  101. package/dist/cli/utils/cloud-init.js +104 -0
  102. package/dist/cli/utils/cloud-init.js.map +1 -0
  103. package/dist/cli/utils/config-store.d.ts +17 -0
  104. package/dist/cli/utils/config-store.d.ts.map +1 -0
  105. package/dist/cli/utils/config-store.js +85 -0
  106. package/dist/cli/utils/config-store.js.map +1 -0
  107. package/dist/cli/utils/config-validation.d.ts +4 -0
  108. package/dist/cli/utils/config-validation.d.ts.map +1 -0
  109. package/dist/cli/utils/config-validation.js +89 -0
  110. package/dist/cli/utils/config-validation.js.map +1 -0
  111. package/dist/cli/utils/config.d.ts +12 -0
  112. package/dist/cli/utils/config.d.ts.map +1 -0
  113. package/dist/cli/utils/config.js +80 -0
  114. package/dist/cli/utils/config.js.map +1 -0
  115. package/dist/cli/utils/context.d.ts +14 -0
  116. package/dist/cli/utils/context.d.ts.map +1 -0
  117. package/dist/cli/utils/context.js +28 -0
  118. package/dist/cli/utils/context.js.map +1 -0
  119. package/dist/cli/utils/ec2.d.ts +6 -0
  120. package/dist/cli/utils/ec2.d.ts.map +1 -0
  121. package/dist/cli/utils/ec2.js +103 -0
  122. package/dist/cli/utils/ec2.js.map +1 -0
  123. package/dist/cli/utils/errors.d.ts +23 -0
  124. package/dist/cli/utils/errors.d.ts.map +1 -0
  125. package/dist/cli/utils/errors.js +126 -0
  126. package/dist/cli/utils/errors.js.map +1 -0
  127. package/dist/cli/utils/logger.d.ts +9 -0
  128. package/dist/cli/utils/logger.d.ts.map +1 -0
  129. package/dist/cli/utils/logger.js +25 -0
  130. package/dist/cli/utils/logger.js.map +1 -0
  131. package/dist/cli/utils/suggestions.d.ts +7 -0
  132. package/dist/cli/utils/suggestions.d.ts.map +1 -0
  133. package/dist/cli/utils/suggestions.js +44 -0
  134. package/dist/cli/utils/suggestions.js.map +1 -0
  135. package/dist/cli/utils/validation.d.ts +12 -0
  136. package/dist/cli/utils/validation.d.ts.map +1 -0
  137. package/dist/cli/utils/validation.js +52 -0
  138. package/dist/cli/utils/validation.js.map +1 -0
  139. package/package.json +96 -0
  140. 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