@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,52 @@
1
+ import { fileURLToPath } from 'url';
2
+ import path from 'path';
3
+ import fs from 'fs';
4
+ import { AWSError } from './errors.js';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = path.dirname(__filename);
7
+ /**
8
+ * Get the path to the CDK binary.
9
+ * Prefers the locally bundled CDK from node_modules/.bin/
10
+ * Falls back to global 'cdk' if local not found.
11
+ */
12
+ export function getCDKBinary() {
13
+ // Try to find local CDK binary
14
+ // From src/cli/utils/ go up to package root, then to node_modules/.bin/cdk
15
+ const binDir = path.resolve(__dirname, '../../../node_modules/.bin');
16
+ const localCdkPath = path.join(binDir, 'cdk');
17
+ const localCdkCmd = path.join(binDir, 'cdk.cmd');
18
+ const localCdkPs1 = path.join(binDir, 'cdk.ps1');
19
+ if (process.platform === 'win32') {
20
+ if (fs.existsSync(localCdkCmd))
21
+ return localCdkCmd;
22
+ if (fs.existsSync(localCdkPs1))
23
+ return localCdkPs1;
24
+ }
25
+ if (fs.existsSync(localCdkPath)) {
26
+ return localCdkPath;
27
+ }
28
+ // Fallback to global CDK
29
+ // This will throw if 'cdk' is not in PATH, which execa will catch
30
+ return 'cdk';
31
+ }
32
+ /**
33
+ * Validate that CDK is available (either local or global).
34
+ * Throws AWSError if CDK cannot be found.
35
+ */
36
+ export function validateCDKAvailable() {
37
+ const cdkPath = getCDKBinary();
38
+ // If using global CDK, we can't easily check if it exists without running it
39
+ // execa will throw if the command doesn't exist, which is fine
40
+ if (cdkPath === 'cdk') {
41
+ // Global CDK - will be validated when we try to run it
42
+ return;
43
+ }
44
+ // For local CDK, we already checked it exists in getCDKBinary()
45
+ if (!fs.existsSync(cdkPath)) {
46
+ throw new AWSError('AWS CDK CLI not found', [
47
+ 'Reinstall this package: npm install -g @salza80/openclaw-aws',
48
+ 'Or install CDK globally: npm install -g aws-cdk',
49
+ ]);
50
+ }
51
+ }
52
+ //# sourceMappingURL=cdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdk.js","sourceRoot":"","sources":["../../../src/cli/utils/cdk.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,YAAY;IAC1B,+BAA+B;IAC/B,2EAA2E;IAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;IACrE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAEjD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,WAAW,CAAC;QACnD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,WAAW,CAAC;IACrD,CAAC;IAED,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,yBAAyB;IACzB,kEAAkE;IAClE,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;IAE/B,6EAA6E;IAC7E,+DAA+D;IAC/D,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,uDAAuD;QACvD,OAAO;IACT,CAAC;IAED,gEAAgE;IAChE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,QAAQ,CAAC,uBAAuB,EAAE;YAC1C,8DAA8D;YAC9D,iDAAiD;SAClD,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface CloudInitStatus {
2
+ isComplete: boolean;
3
+ hasError: boolean;
4
+ isOpenClawInstalled: boolean;
5
+ errorMessage?: string;
6
+ elapsedMinutes?: number;
7
+ }
8
+ export declare function checkCloudInitStatus(instanceId: string, region: string): Promise<CloudInitStatus>;
9
+ export declare function getConsoleOutput(instanceId: string, region: string): Promise<string>;
10
+ export declare function getInstallationProgress(output: string): string;
11
+ //# sourceMappingURL=cloud-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-init.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/cloud-init.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,eAAe,CAAC,CAmE1B;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB1F;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAc9D"}
@@ -0,0 +1,104 @@
1
+ import { GetConsoleOutputCommand } from '@aws-sdk/client-ec2';
2
+ import { withRetry } from './errors.js';
3
+ import { createEc2Client } from './aws-clients.js';
4
+ export async function checkCloudInitStatus(instanceId, region) {
5
+ const client = createEc2Client(region);
6
+ const command = new GetConsoleOutputCommand({
7
+ InstanceId: instanceId,
8
+ Latest: true,
9
+ });
10
+ try {
11
+ const response = await withRetry(() => client.send(command), {
12
+ maxAttempts: 2,
13
+ operationName: 'get console output',
14
+ });
15
+ const output = response.Output || '';
16
+ // Check if cloud-init finished
17
+ const isComplete = output.includes('Cloud-init v.') && output.includes('finished at');
18
+ // Only treat these patterns as fatal while cloud-init is still running.
19
+ const hasError = (output.includes('npm error') ||
20
+ output.includes('Error:') ||
21
+ output.includes('FAILED') ||
22
+ output.includes('command not found')) &&
23
+ !isComplete;
24
+ // Check if OpenClaw installed successfully
25
+ const isOpenClawInstalled = output.includes('OpenClaw CLI installed successfully') ||
26
+ (output.includes('openclaw@') && output.includes('added'));
27
+ // Extract error message if present
28
+ let errorMessage;
29
+ if (hasError && !isComplete) {
30
+ const errorMatch = output.match(/npm error (.*?)$/m) || output.match(/Error: (.*?)$/m);
31
+ if (errorMatch) {
32
+ errorMessage = errorMatch[1].trim();
33
+ }
34
+ }
35
+ // Calculate elapsed time
36
+ let elapsedMinutes;
37
+ const launchMatch = output.match(/started at (.*?)\./);
38
+ const finishMatch = output.match(/finished at (.*?)\./);
39
+ if (launchMatch && finishMatch) {
40
+ const start = new Date(launchMatch[1]);
41
+ const end = new Date(finishMatch[1]);
42
+ elapsedMinutes = Math.round((end.getTime() - start.getTime()) / 1000 / 60);
43
+ }
44
+ return {
45
+ isComplete,
46
+ hasError,
47
+ isOpenClawInstalled,
48
+ errorMessage,
49
+ elapsedMinutes,
50
+ };
51
+ }
52
+ catch {
53
+ // If we can't get console output, assume not ready
54
+ return {
55
+ isComplete: false,
56
+ hasError: false,
57
+ isOpenClawInstalled: false,
58
+ };
59
+ }
60
+ finally {
61
+ client.destroy();
62
+ }
63
+ }
64
+ export async function getConsoleOutput(instanceId, region) {
65
+ const client = createEc2Client(region);
66
+ const command = new GetConsoleOutputCommand({
67
+ InstanceId: instanceId,
68
+ Latest: true,
69
+ });
70
+ try {
71
+ const response = await withRetry(() => client.send(command), {
72
+ maxAttempts: 2,
73
+ operationName: 'get console output',
74
+ });
75
+ return response.Output || '';
76
+ }
77
+ catch {
78
+ return '';
79
+ }
80
+ finally {
81
+ client.destroy();
82
+ }
83
+ }
84
+ export function getInstallationProgress(output) {
85
+ if (output.includes('OpenClaw CLI installed successfully')) {
86
+ return 'OpenClaw installation complete ✅';
87
+ }
88
+ else if (output.includes('npm install -g openclaw')) {
89
+ return 'Installing OpenClaw CLI... (this takes 5-10 minutes)';
90
+ }
91
+ else if (output.includes('nodejs') && output.includes('Installing')) {
92
+ return 'Installing Node.js...';
93
+ }
94
+ else if (output.includes('NodeSource')) {
95
+ return 'Setting up Node.js repository...';
96
+ }
97
+ else if (output.includes('update -y')) {
98
+ return 'Updating system packages...';
99
+ }
100
+ else {
101
+ return 'Instance starting up...';
102
+ }
103
+ }
104
+ //# sourceMappingURL=cloud-init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-init.js","sourceRoot":"","sources":["../../../src/cli/utils/cloud-init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { OpenClawConfig } from '../types/index.js';
2
+ export interface ResolvedConfig {
3
+ name: string;
4
+ config: OpenClawConfig;
5
+ configPath: string;
6
+ configRoot: string;
7
+ }
8
+ export interface ConfigResolveOptions {
9
+ name?: string;
10
+ }
11
+ export declare function listConfigNames(): string[];
12
+ export declare function getCurrentName(): string | null;
13
+ export declare function clearCurrentName(): void;
14
+ export declare function setCurrentName(name: string): void;
15
+ export declare function resolveConfig(options?: ConfigResolveOptions): ResolvedConfig;
16
+ export declare function resolveOutputsPath(name: string): string;
17
+ //# sourceMappingURL=config-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/config-store.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAYD,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAQ1C;AAED,wBAAgB,cAAc,IAAI,MAAM,GAAG,IAAI,CAS9C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGjD;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,cAAc,CAoChF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGvD"}
@@ -0,0 +1,85 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { getConfigRoot, getConfigsDir, getConfigPathByName, getCurrentPath, getOutputsDir, getOutputsPathByName, loadConfigByName, } from './config.js';
4
+ import { ConfigError } from './errors.js';
5
+ function ensureDirs() {
6
+ const root = getConfigRoot();
7
+ const configsDir = getConfigsDir();
8
+ const outputsDir = getOutputsDir();
9
+ if (!fs.existsSync(root))
10
+ fs.mkdirSync(root, { recursive: true });
11
+ if (!fs.existsSync(configsDir))
12
+ fs.mkdirSync(configsDir, { recursive: true });
13
+ if (!fs.existsSync(outputsDir))
14
+ fs.mkdirSync(outputsDir, { recursive: true });
15
+ }
16
+ export function listConfigNames() {
17
+ ensureDirs();
18
+ const configsDir = getConfigsDir();
19
+ return fs
20
+ .readdirSync(configsDir)
21
+ .filter((file) => file.endsWith('.json'))
22
+ .map((file) => path.basename(file, '.json'))
23
+ .sort();
24
+ }
25
+ export function getCurrentName() {
26
+ const currentPath = getCurrentPath();
27
+ if (!fs.existsSync(currentPath))
28
+ return null;
29
+ try {
30
+ const content = JSON.parse(fs.readFileSync(currentPath, 'utf-8'));
31
+ return typeof content?.name === 'string' ? content.name : null;
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ export function clearCurrentName() {
38
+ const currentPath = getCurrentPath();
39
+ if (fs.existsSync(currentPath)) {
40
+ fs.unlinkSync(currentPath);
41
+ }
42
+ }
43
+ export function setCurrentName(name) {
44
+ ensureDirs();
45
+ fs.writeFileSync(getCurrentPath(), JSON.stringify({ name }, null, 2));
46
+ }
47
+ export function resolveConfig(options = {}) {
48
+ ensureDirs();
49
+ const available = listConfigNames();
50
+ let name = options.name;
51
+ if (!name) {
52
+ const current = getCurrentName();
53
+ if (current) {
54
+ name = current;
55
+ }
56
+ else if (available.length === 1) {
57
+ name = available[0];
58
+ setCurrentName(name);
59
+ }
60
+ }
61
+ if (!name) {
62
+ throw new ConfigError('No config selected', [
63
+ 'List configs: openclaw-aws list',
64
+ 'Select one: openclaw-aws use <name>',
65
+ 'Create one: openclaw-aws init --name <name>',
66
+ ]);
67
+ }
68
+ if (!available.includes(name)) {
69
+ throw new ConfigError(`Config not found: ${name}`, [
70
+ 'Create a deployment: openclaw-aws init --name <name>',
71
+ 'List configs: openclaw-aws list',
72
+ ]);
73
+ }
74
+ return {
75
+ name,
76
+ config: loadConfigByName(name),
77
+ configPath: getConfigPathByName(name),
78
+ configRoot: getConfigRoot(),
79
+ };
80
+ }
81
+ export function resolveOutputsPath(name) {
82
+ ensureDirs();
83
+ return getOutputsPathByName(name);
84
+ }
85
+ //# sourceMappingURL=config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../../../src/cli/utils/config-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { OpenClawConfig } from '../types/index.js';
2
+ export declare function validateConfig(config: OpenClawConfig): void;
3
+ export declare function validateConfigStructure(obj: unknown): obj is OpenClawConfig;
4
+ //# sourceMappingURL=config-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validation.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/config-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CA+E3D;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,cAAc,CAW3E"}
@@ -0,0 +1,89 @@
1
+ import { ValidationError } from './errors.js';
2
+ export function validateConfig(config) {
3
+ const errors = [];
4
+ // Validate version
5
+ if (!config.version || config.version !== '1.0') {
6
+ errors.push('Invalid or missing config version (expected: "1.0")');
7
+ }
8
+ // Validate AWS config
9
+ if (!config.aws) {
10
+ errors.push('Missing aws configuration');
11
+ }
12
+ else {
13
+ if (!config.aws.region) {
14
+ errors.push('Missing aws.region');
15
+ }
16
+ else if (!/^[a-z]{2}-[a-z]+-\d+$/.test(config.aws.region)) {
17
+ errors.push('Invalid aws.region format (e.g., us-east-1)');
18
+ }
19
+ }
20
+ // Validate instance config
21
+ if (!config.instance) {
22
+ errors.push('Missing instance configuration');
23
+ }
24
+ else {
25
+ if (!config.instance.type) {
26
+ errors.push('Missing instance.type');
27
+ }
28
+ else if (!/^[a-z][0-9][a-z]?\.(nano|micro|small|medium|large|xlarge|[0-9]+xlarge)$/.test(config.instance.type)) {
29
+ errors.push('Invalid instance.type format (e.g., t3.micro)');
30
+ }
31
+ if (!config.instance.name) {
32
+ errors.push('Missing instance.name');
33
+ }
34
+ else if (!/^[a-zA-Z0-9-]+$/.test(config.instance.name)) {
35
+ errors.push('instance.name must contain only letters, numbers, and hyphens');
36
+ }
37
+ else if (config.instance.name.length > 63) {
38
+ errors.push('instance.name must be 63 characters or less');
39
+ }
40
+ }
41
+ // Validate network config
42
+ if (!config.network) {
43
+ errors.push('Missing network configuration');
44
+ }
45
+ else if (typeof config.network.useDefaultVpc !== 'boolean') {
46
+ errors.push('network.useDefaultVpc must be a boolean');
47
+ }
48
+ // Validate features
49
+ if (!config.features) {
50
+ errors.push('Missing features configuration');
51
+ }
52
+ else {
53
+ if (typeof config.features.cloudWatchLogs !== 'boolean') {
54
+ errors.push('features.cloudWatchLogs must be a boolean');
55
+ }
56
+ }
57
+ // Validate stack config
58
+ if (!config.stack) {
59
+ errors.push('Missing stack configuration');
60
+ }
61
+ else {
62
+ if (!config.stack.name) {
63
+ errors.push('Missing stack.name');
64
+ }
65
+ else if (!/^[a-zA-Z][a-zA-Z0-9-]*$/.test(config.stack.name)) {
66
+ errors.push('stack.name must start with a letter and contain only letters, numbers, and hyphens');
67
+ }
68
+ else if (config.stack.name.length > 128) {
69
+ errors.push('stack.name must be 128 characters or less');
70
+ }
71
+ }
72
+ if (errors.length > 0) {
73
+ throw new ValidationError('Configuration validation failed:\n ' + errors.join('\n '), [
74
+ 'Run: openclaw-aws init (to recreate configuration)',
75
+ 'Or manually fix the active config in .openclaw-aws/configs/<name>.json (see .openclaw-aws/current.json)',
76
+ ]);
77
+ }
78
+ }
79
+ export function validateConfigStructure(obj) {
80
+ return !!(obj &&
81
+ typeof obj === 'object' &&
82
+ 'version' in obj &&
83
+ 'aws' in obj &&
84
+ 'instance' in obj &&
85
+ 'network' in obj &&
86
+ 'features' in obj &&
87
+ 'stack' in obj);
88
+ }
89
+ //# sourceMappingURL=config-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validation.js","sourceRoot":"","sources":["../../../src/cli/utils/config-validation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,mBAAmB;IACnB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IACrE,CAAC;IAED,sBAAsB;IACtB,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;aAAM,IACL,CAAC,yEAAyE,CAAC,IAAI,CAC7E,MAAM,CAAC,QAAQ,CAAC,IAAI,CACrB,EACD,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;aAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC/E,CAAC;aAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACzD,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACN,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC7C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CACT,oFAAoF,CACrF,CAAC;QACJ,CAAC;aAAM,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,eAAe,CAAC,sCAAsC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YACtF,oDAAoD;YACpD,yGAAyG;SAC1G,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAClD,OAAO,CAAC,CAAC,CACP,GAAG;QACH,OAAO,GAAG,KAAK,QAAQ;QACvB,SAAS,IAAI,GAAG;QAChB,KAAK,IAAI,GAAG;QACZ,UAAU,IAAI,GAAG;QACjB,SAAS,IAAI,GAAG;QAChB,UAAU,IAAI,GAAG;QACjB,OAAO,IAAI,GAAG,CACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { OpenClawConfig } from '../types/index.js';
2
+ export declare function getConfigRoot(): string;
3
+ export declare function getConfigsDir(): string;
4
+ export declare function getConfigPathByName(name: string): string;
5
+ export declare function getOutputsDir(): string;
6
+ export declare function getOutputsPathByName(name: string): string;
7
+ export declare function getCurrentPath(): string;
8
+ export declare function loadConfigByName(name: string): OpenClawConfig;
9
+ export declare function saveConfigByName(config: OpenClawConfig, name: string): void;
10
+ export declare function configExistsByName(name: string): boolean;
11
+ export declare function loadOutputsByName(name: string): Record<string, unknown> | null;
12
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASxD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CA6B7D;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAa3E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAY9E"}
@@ -0,0 +1,80 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
3
+ import { ConfigError } from './errors.js';
4
+ import { validateConfig, validateConfigStructure } from './config-validation.js';
5
+ const CONFIG_ROOT = '.openclaw-aws';
6
+ const CONFIGS_DIR = 'configs';
7
+ const OUTPUTS_DIR = 'outputs';
8
+ const CURRENT_FILE = 'current.json';
9
+ export function getConfigRoot() {
10
+ return path.join(process.cwd(), CONFIG_ROOT);
11
+ }
12
+ export function getConfigsDir() {
13
+ return path.join(getConfigRoot(), CONFIGS_DIR);
14
+ }
15
+ export function getConfigPathByName(name) {
16
+ return path.join(getConfigsDir(), `${name}.json`);
17
+ }
18
+ export function getOutputsDir() {
19
+ return path.join(getConfigRoot(), OUTPUTS_DIR);
20
+ }
21
+ export function getOutputsPathByName(name) {
22
+ return path.join(getOutputsDir(), `${name}.json`);
23
+ }
24
+ export function getCurrentPath() {
25
+ return path.join(getConfigRoot(), CURRENT_FILE);
26
+ }
27
+ export function loadConfigByName(name) {
28
+ const configFile = getConfigPathByName(name);
29
+ if (!fs.existsSync(configFile)) {
30
+ throw new ConfigError(`Config file not found: ${configFile}`, ['Run: openclaw-aws init']);
31
+ }
32
+ let config;
33
+ try {
34
+ const content = fs.readFileSync(configFile, 'utf-8');
35
+ config = JSON.parse(content);
36
+ }
37
+ catch {
38
+ throw new ConfigError(`Failed to parse config file: ${configFile}`, [
39
+ 'Check the file is valid JSON',
40
+ 'Run: openclaw-aws init (to recreate)',
41
+ ]);
42
+ }
43
+ // Validate structure
44
+ if (!validateConfigStructure(config)) {
45
+ throw new ConfigError('Invalid configuration structure', [
46
+ 'Run: openclaw-aws init (to recreate configuration)',
47
+ ]);
48
+ }
49
+ // Validate contents
50
+ validateConfig(config);
51
+ return config;
52
+ }
53
+ export function saveConfigByName(config, name) {
54
+ // Validate before saving
55
+ validateConfig(config);
56
+ const configDir = getConfigsDir();
57
+ const configFile = getConfigPathByName(name);
58
+ // Create directory if it doesn't exist
59
+ if (!fs.existsSync(configDir)) {
60
+ fs.mkdirSync(configDir, { recursive: true });
61
+ }
62
+ fs.writeFileSync(configFile, JSON.stringify(config, null, 2));
63
+ }
64
+ export function configExistsByName(name) {
65
+ return fs.existsSync(getConfigPathByName(name));
66
+ }
67
+ export function loadOutputsByName(name) {
68
+ const outputsPath = getOutputsPathByName(name);
69
+ if (!fs.existsSync(outputsPath)) {
70
+ return null;
71
+ }
72
+ try {
73
+ const content = fs.readFileSync(outputsPath, 'utf-8');
74
+ return JSON.parse(content);
75
+ }
76
+ catch {
77
+ return null;
78
+ }
79
+ }
80
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAEjF,MAAM,WAAW,GAAG,eAAe,CAAC;AACpC,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,YAAY,GAAG,cAAc,CAAC;AAEpC,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,WAAW,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,YAAY,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,WAAW,CAAC,0BAA0B,UAAU,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,WAAW,CAAC,gCAAgC,UAAU,EAAE,EAAE;YAClE,8BAA8B;YAC9B,sCAAsC;SACvC,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,WAAW,CAAC,iCAAiC,EAAE;YACvD,oDAAoD;SACrD,CAAC,CAAC;IACL,CAAC;IAED,oBAAoB;IACpB,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAsB,EAAE,IAAY;IACnE,yBAAyB;IACzB,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE7C,uCAAuC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { OpenClawConfig } from '../types/index.js';
2
+ export interface CommandContext {
3
+ name: string;
4
+ config: OpenClawConfig;
5
+ configPath: string;
6
+ awsEnv: Record<string, string | undefined>;
7
+ }
8
+ export interface CommandContextOptions {
9
+ name?: string;
10
+ requireCredentials?: boolean;
11
+ }
12
+ export declare function buildCommandContext(options?: CommandContextOptions): Promise<CommandContext>;
13
+ export declare function buildAwsEnv(config: OpenClawConfig): Record<string, string | undefined>;
14
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAWtF"}
@@ -0,0 +1,28 @@
1
+ import { resolveConfig } from './config-store.js';
2
+ import { applyAwsProfile, requireAwsCredentials } from './aws-validation.js';
3
+ export async function buildCommandContext(options = {}) {
4
+ const { name, config, configPath } = resolveConfig({ name: options.name });
5
+ if (options.requireCredentials !== false) {
6
+ await requireAwsCredentials(config);
7
+ }
8
+ else {
9
+ applyAwsProfile(config.aws.profile);
10
+ }
11
+ return {
12
+ name,
13
+ config,
14
+ configPath,
15
+ awsEnv: buildAwsEnv(config),
16
+ };
17
+ }
18
+ export function buildAwsEnv(config) {
19
+ const env = {
20
+ ...process.env,
21
+ AWS_REGION: config.aws.region,
22
+ };
23
+ if (config.aws.profile) {
24
+ env.AWS_PROFILE = config.aws.profile;
25
+ }
26
+ return env;
27
+ }
28
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/cli/utils/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAc7E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,UAAiC,EAAE;IAEnC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAE3E,IAAI,OAAO,CAAC,kBAAkB,KAAK,KAAK,EAAE,CAAC;QACzC,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,OAAO;QACL,IAAI;QACJ,MAAM;QACN,UAAU;QACV,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAsB;IAChD,MAAM,GAAG,GAAuC;QAC9C,GAAG,OAAO,CAAC,GAAG;QACd,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM;KAC9B,CAAC;IAEF,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACvB,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;IACvC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare function stopInstance(instanceId: string, region: string): Promise<void>;
2
+ export declare function startInstance(instanceId: string, region: string): Promise<void>;
3
+ export declare function rebootInstance(instanceId: string, region: string): Promise<void>;
4
+ export declare function getInstanceState(instanceId: string, region: string): Promise<string | undefined>;
5
+ export declare function waitForInstanceState(instanceId: string, region: string, desiredState: 'running' | 'stopped', maxWaitTime?: number): Promise<boolean>;
6
+ //# sourceMappingURL=ec2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ec2.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/ec2.ts"],"names":[],"mappings":"AASA,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBpF;AAED,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBrF;AAED,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBtF;AAED,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAY7B;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,SAAS,GAAG,SAAS,EACnC,WAAW,GAAE,MAAe,GAC3B,OAAO,CAAC,OAAO,CAAC,CA8BlB"}