@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,151 @@
1
+ import { Stack, CfnOutput } from 'aws-cdk-lib';
2
+ import { Instance, InstanceType, InstanceClass, InstanceSize, MachineImage, BlockDeviceVolume, EbsDeviceVolumeType, SecurityGroup, UserData, SubnetType, Vpc, } from 'aws-cdk-lib/aws-ec2';
3
+ import { Role, ServicePrincipal, ManagedPolicy, PolicyStatement } from 'aws-cdk-lib/aws-iam';
4
+ export class OpenClawStack extends Stack {
5
+ constructor(scope, id, props) {
6
+ super(scope, id, props);
7
+ const { config, apiProvider, apiKeyParamName, gatewayTokenParamName } = props;
8
+ const gatewayPort = 18789;
9
+ // VPC Configuration - Use default or create new based on config
10
+ let vpc;
11
+ if (props.useDefaultVpc) {
12
+ // Use default VPC (exists in every AWS account)
13
+ vpc = Vpc.fromLookup(this, 'DefaultVpc', {
14
+ isDefault: true,
15
+ });
16
+ }
17
+ else {
18
+ // Create new dedicated VPC with public subnet
19
+ vpc = new Vpc(this, 'OpenClawVpc', {
20
+ cidr: '10.0.0.0/16',
21
+ maxAzs: 1,
22
+ subnetConfiguration: [
23
+ {
24
+ cidrMask: 24,
25
+ name: 'Public',
26
+ subnetType: SubnetType.PUBLIC,
27
+ },
28
+ ],
29
+ natGateways: 0,
30
+ });
31
+ }
32
+ // Security group - SSM access only (no inbound ports)
33
+ const sg = new SecurityGroup(this, 'OpenClawEc2Sg', {
34
+ vpc,
35
+ description: 'Security group for OpenClaw instance - SSM access only, no inbound ports',
36
+ allowAllOutbound: true,
37
+ });
38
+ // IAM role for SSM and optionally CloudWatch
39
+ const managedPolicies = [
40
+ ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
41
+ ];
42
+ // Conditionally add CloudWatch policy if enabled
43
+ if (config.enableCloudWatchLogs) {
44
+ managedPolicies.push(ManagedPolicy.fromAwsManagedPolicyName('CloudWatchAgentServerPolicy'));
45
+ }
46
+ const role = new Role(this, 'OpenClawEc2Role', {
47
+ assumedBy: new ServicePrincipal('ec2.amazonaws.com'),
48
+ managedPolicies,
49
+ });
50
+ const apiKeyParamArn = Stack.of(this).formatArn({
51
+ service: 'ssm',
52
+ resource: 'parameter',
53
+ resourceName: apiKeyParamName.replace(/^\/+/, ''),
54
+ });
55
+ const gatewayTokenParamArn = Stack.of(this).formatArn({
56
+ service: 'ssm',
57
+ resource: 'parameter',
58
+ resourceName: gatewayTokenParamName.replace(/^\/+/, ''),
59
+ });
60
+ role.addToPolicy(new PolicyStatement({
61
+ actions: ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParameterHistory'],
62
+ resources: [apiKeyParamArn, gatewayTokenParamArn],
63
+ }));
64
+ // Determine AMI - Ubuntu 24.04 LTS
65
+ const ami = MachineImage.lookup({
66
+ name: 'ubuntu/images/hvm-ssd-gp3/ubuntu-noble-24.04-amd64-server-*',
67
+ owners: ['099720109477'], // Canonical
68
+ });
69
+ // UserData script - simplified without Tailscale
70
+ const userData = UserData.forLinux();
71
+ // Set appropriate environment variable based on API provider
72
+ const apiKeyEnvVar = apiProvider.toUpperCase().replace(/-/g, '_');
73
+ const authChoiceFlag = apiProvider === 'anthropic-api-key' ? 'apiKey' : apiProvider;
74
+ userData.addCommands('#!/bin/bash', 'set -e', '', 'export DEBIAN_FRONTEND=noninteractive', '', '# System updates', 'apt-get update', 'apt-get upgrade -y', '', '# Check if SSM Agent is already installed (Ubuntu 24.04 has it pre-installed via snap)', 'if ! systemctl is-active --quiet snap.amazon-ssm-agent.amazon-ssm-agent.service && ! systemctl is-active --quiet amazon-ssm-agent; then', ' echo "Installing SSM Agent..."', ' curl -fsSL https://amazon-ssm-us-east-1.s3.us-east-1.amazonaws.com/latest/debian_amd64/amazon-ssm-agent.deb -o /tmp/amazon-ssm-agent.deb || curl -fsSL https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb -o /tmp/amazon-ssm-agent.deb', ' dpkg -i /tmp/amazon-ssm-agent.deb || true', ' systemctl enable amazon-ssm-agent || true', ' systemctl start amazon-ssm-agent || true', 'else', ' echo "SSM Agent already installed"', 'fi', '', '# Install required packages', 'apt-get install -y curl git python3 python3-pip jq wget snapd unzip', '', '# Install AWS CLI v2 (apt package is not available on Ubuntu 24.04)', 'if ! command -v aws >/dev/null 2>&1; then', ' ARCH="$(uname -m)"', ' if [ "$ARCH" = "aarch64" ]; then', ' AWSCLI_URL="https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip"', ' else', ' AWSCLI_URL="https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"', ' fi', ' curl -fsSL "$AWSCLI_URL" -o /tmp/awscliv2.zip', ' unzip -q /tmp/awscliv2.zip -d /tmp', ' /tmp/aws/install || /tmp/aws/install --update', 'fi', '', '# Load API key from SSM Parameter Store', `export AWS_REGION="${Stack.of(this).region}"`, `export AWS_DEFAULT_REGION="${Stack.of(this).region}"`, `API_KEY_PARAM_NAME="${apiKeyParamName}"`, 'API_KEY="$(aws ssm get-parameter --with-decryption --name "$API_KEY_PARAM_NAME" --query Parameter.Value --output text || true)"', 'if [ -z "$API_KEY" ]; then', ' echo "WARNING: API key not found in SSM Parameter Store"', 'fi', '', '# Load gateway token from SSM Parameter Store', `GATEWAY_TOKEN_PARAM_NAME="${gatewayTokenParamName}"`, 'GATEWAY_TOKEN="$(aws ssm get-parameter --with-decryption --name "$GATEWAY_TOKEN_PARAM_NAME" --query Parameter.Value --output text || true)"', 'if [ -z "$GATEWAY_TOKEN" ]; then', ' echo "WARNING: Gateway token not found in SSM Parameter Store"', 'fi', '', '# Install Docker', 'curl -fsSL https://get.docker.com | sh', 'systemctl enable docker', 'systemctl start docker', 'usermod -aG docker ubuntu', '', '# Install NVM and Node.js for ubuntu user', "sudo -u ubuntu bash << 'UBUNTU_SCRIPT'", 'set -e', 'cd ~', '', '# Install NVM', 'curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash', '', '# Load NVM', 'export NVM_DIR="$HOME/.nvm"', '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"', '', '# Install Node.js 22', 'nvm install 22', 'nvm use 22', 'nvm alias default 22', '', '# Install OpenClaw', 'npm install -g openclaw@latest', '', '# Install Homebrew (non-interactive, no sudo required)', 'echo "Installing Homebrew..."', 'NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" || echo "WARNING: Homebrew installation failed"', '', '# Add NVM to bashrc if not already there', "if ! grep -q 'NVM_DIR' ~/.bashrc; then", ' echo \'export NVM_DIR="$HOME/.nvm"\' >> ~/.bashrc', ' echo \'[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"\' >> ~/.bashrc', 'fi', '', '# Add Homebrew to bashrc if it was installed', 'if [ -d /home/linuxbrew/.linuxbrew ]; then', " if ! grep -q 'linuxbrew' ~/.bashrc; then", ' echo >> ~/.bashrc', ' echo \'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"\' >> ~/.bashrc', ' fi', ' # Load Homebrew for immediate use', ' eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"', ' # Install GCC (recommended by Homebrew)', ' brew install gcc || echo "WARNING: GCC installation failed"', 'fi', 'UBUNTU_SCRIPT', '', '# Install build-essential for Homebrew (as root)', 'apt-get install -y build-essential', '', '# Enable systemd linger for ubuntu user (required for user services to run at boot)', 'loginctl enable-linger ubuntu', '', '# Wait for user systemd to be ready', 'sleep 2', '', '# Ensure XDG_RUNTIME_DIR is set for user services', 'mkdir -p /run/user/1000', 'chown ubuntu:ubuntu /run/user/1000', 'chmod 700 /run/user/1000', 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus', '', '# Start user systemd instance', 'systemctl start user@1000.service || true', '',
75
+ // Run OpenClaw onboarding with appropriate API key
76
+ '# Run OpenClaw onboarding as ubuntu user', 'echo "Running OpenClaw onboarding..."', `sudo -H -u ubuntu API_KEY="$API_KEY" bash << 'ONBOARD_SCRIPT'`, 'export HOME=/home/ubuntu', 'export NVM_DIR="$HOME/.nvm"', '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"', 'export XDG_RUNTIME_DIR=/run/user/1000', 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus', `export ${apiKeyEnvVar}="$API_KEY"`, '', `openclaw onboard --non-interactive --accept-risk \\\n --mode local \\\n --auth-choice ${authChoiceFlag} \\\n --${apiProvider} "$${apiKeyEnvVar}" \\\n --gateway-port ${gatewayPort} \\\n --gateway-bind loopback \\\n --skip-daemon \\\n --skip-skills || echo "WARNING: OpenClaw onboarding failed. Run openclaw onboard manually."`, 'ONBOARD_SCRIPT', '', '# Install daemon service', 'echo "Installing OpenClaw daemon..."', "sudo -H -u ubuntu XDG_RUNTIME_DIR=/run/user/1000 bash << 'DAEMON_SCRIPT'", 'export HOME=/home/ubuntu', 'export NVM_DIR="$HOME/.nvm"', '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"', 'export XDG_RUNTIME_DIR=/run/user/1000', 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus', '', '# Install but do not start the daemon yet', 'openclaw daemon install || echo "WARNING: Daemon install failed. Run openclaw daemon install manually."', 'DAEMON_SCRIPT', '', '# Configure gateway with authentication token', 'echo "Configuring gateway..."', `sudo -H -u ubuntu GATEWAY_TOKEN="$GATEWAY_TOKEN" bash << 'CONFIG_SCRIPT'`, 'export HOME=/home/ubuntu', 'export NVM_DIR="$HOME/.nvm"', '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"', 'export XDG_RUNTIME_DIR=/run/user/1000', 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus', '', 'config_path="/home/ubuntu/.openclaw/openclaw.json"', 'if [ -f "$config_path" ]; then', ' # Update gateway token safely via jq', ' tmp_config="$(mktemp)"', ' if jq --arg token "$GATEWAY_TOKEN" \'if (.gateway | type) == "object" then .gateway.auth.token = $token else . + {gateway:{auth:{token:$token}}} end\' "$config_path" > "$tmp_config"; then', ' mv "$tmp_config" "$config_path"', ' echo "Configured gateway with authentication token"', ' else', ' rm -f "$tmp_config"', ' echo "WARNING: Failed to update gateway token in config"', ' fi', ' ', ' # Start the daemon with the correct token', ' openclaw daemon start || echo "WARNING: Could not start daemon"', 'else', ' echo "WARNING: OpenClaw config not found. Onboarding may have failed."', 'fi', 'CONFIG_SCRIPT', '', '# Ensure proper ownership of .openclaw directory', 'chown -R ubuntu:ubuntu /home/ubuntu/.openclaw', '', '# Restart daemon as ubuntu user to ensure it picks up all changes', "sudo -H -u ubuntu bash << 'RESTART_SCRIPT'", 'export HOME=/home/ubuntu', 'export NVM_DIR="$HOME/.nvm"', '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"', 'export XDG_RUNTIME_DIR=/run/user/1000', 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus', 'openclaw daemon restart || echo "WARNING: Could not restart daemon"', 'RESTART_SCRIPT', '', '# Create completion marker', 'touch /tmp/openclaw-setup-complete', '', 'echo "OpenClaw setup complete!"', `echo "Gateway Token stored in SSM Parameter Store"`, `echo "Or use SSM: aws ssm start-session --target <instance-id>"`, `echo "Dashboard: http://localhost:${gatewayPort} (via port forward)"`);
77
+ // Parse instance type from config
78
+ const instanceClass = InstanceClass[config.instanceType.class];
79
+ const instanceSize = InstanceSize[config.instanceType.size];
80
+ // EC2 instance
81
+ const instance = new Instance(this, 'OpenClawEc2', {
82
+ vpc,
83
+ instanceType: InstanceType.of(instanceClass, instanceSize),
84
+ machineImage: ami,
85
+ securityGroup: sg,
86
+ role,
87
+ userData,
88
+ vpcSubnets: { subnetType: SubnetType.PUBLIC },
89
+ requireImdsv2: true,
90
+ blockDevices: [
91
+ {
92
+ deviceName: '/dev/sda1',
93
+ volume: BlockDeviceVolume.ebs(30, {
94
+ volumeType: EbsDeviceVolumeType.GP3,
95
+ encrypted: true,
96
+ deleteOnTermination: true,
97
+ }),
98
+ },
99
+ ],
100
+ });
101
+ // Add tags for easy identification
102
+ instance.instance.addPropertyOverride('Tags', [
103
+ { Key: 'Name', Value: config.instanceName },
104
+ { Key: 'Project', Value: config.projectName },
105
+ { Key: 'ManagedBy', Value: 'openclaw-aws' },
106
+ ]);
107
+ // Outputs
108
+ new CfnOutput(this, 'InstanceId', {
109
+ value: instance.instanceId,
110
+ description: 'EC2 Instance ID',
111
+ exportName: `${id}-InstanceId`,
112
+ });
113
+ new CfnOutput(this, 'InstanceName', {
114
+ value: config.instanceName,
115
+ description: 'EC2 Instance Name',
116
+ });
117
+ new CfnOutput(this, 'GatewayPort', {
118
+ value: gatewayPort.toString(),
119
+ description: 'OpenClaw Gateway Port',
120
+ });
121
+ new CfnOutput(this, 'SSMConnectCommand', {
122
+ value: `aws ssm start-session --target ${instance.instanceId} --region ${Stack.of(this).region}`,
123
+ description: 'SSM connection command',
124
+ });
125
+ new CfnOutput(this, 'SSMPortForwardCommand', {
126
+ value: `aws ssm start-session --target ${instance.instanceId} --document-name AWS-StartPortForwardingSession --parameters "portNumber=${gatewayPort},localPortNumber=${gatewayPort}" --region ${Stack.of(this).region}`,
127
+ description: `Port forwarding command for dashboard (access at http://localhost:${gatewayPort})`,
128
+ });
129
+ new CfnOutput(this, 'SetupInstructions', {
130
+ value: [
131
+ 'Setup Instructions:',
132
+ '1. Connect via SSM (recommended):',
133
+ ` aws ssm start-session --target ${instance.instanceId}`,
134
+ '',
135
+ '2. Check OpenClaw status:',
136
+ ' openclaw status',
137
+ '',
138
+ '3. Start gateway manually (if needed):',
139
+ ` openclaw gateway --port ${gatewayPort}`,
140
+ '',
141
+ '4. Access dashboard via SSM port forward:',
142
+ ` aws ssm start-session --target ${instance.instanceId} --document-name AWS-StartPortForwardingSession --parameters "portNumber=${gatewayPort},localPortNumber=${gatewayPort}"`,
143
+ ` Then open: http://localhost:${gatewayPort}`,
144
+ ' Tip: Use openclaw-aws dashboard to include the token automatically.',
145
+ ].join('\n'),
146
+ description: 'Post-deployment instructions',
147
+ });
148
+ }
149
+ }
150
+ export default OpenClawStack;
151
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/cdk/stack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CommandModule } from 'yargs';
2
+ interface ConnectArgs {
3
+ name?: string;
4
+ }
5
+ export declare const connectCommand: CommandModule<{}, ConnectArgs>;
6
+ export default connectCommand;
7
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/connect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAU3C,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,EAAE,EAAE,WAAW,CA0GzD,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,99 @@
1
+ import { execa } from 'execa';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { logger } from '../utils/logger.js';
5
+ import { buildCommandContext } from '../utils/context.js';
6
+ import { resolveInstanceId, checkSSMStatus, waitForSSM } from '../utils/aws.js';
7
+ import { handleError, AWSError, withRetry, isRetryableError } from '../utils/errors.js';
8
+ import { validateSSMPlugin } from '../utils/aws-validation.js';
9
+ export const connectCommand = {
10
+ command: 'connect',
11
+ describe: 'Connect to EC2 instance via SSM',
12
+ builder: (yargs) => {
13
+ return yargs.option('name', {
14
+ type: 'string',
15
+ describe: 'Deployment name',
16
+ });
17
+ },
18
+ handler: async (argv) => {
19
+ try {
20
+ const ctx = await buildCommandContext({ name: argv.name });
21
+ const config = ctx.config;
22
+ // Validate SSM plugin is installed
23
+ await validateSSMPlugin();
24
+ logger.info(`Connecting ${chalk.cyan(ctx.name)}`);
25
+ // Get instance ID
26
+ const spinner = ora('Finding instance...').start();
27
+ let instanceId;
28
+ try {
29
+ instanceId = await resolveInstanceId(config.stack.name, config.aws.region);
30
+ spinner.succeed(`Found instance: ${chalk.cyan(instanceId)}`);
31
+ }
32
+ catch (error) {
33
+ spinner.fail('Instance not found');
34
+ throw error;
35
+ }
36
+ // Check SSM connectivity
37
+ spinner.start('Checking SSM connectivity...');
38
+ const isReady = await checkSSMStatus(instanceId, config.aws.region);
39
+ if (!isReady) {
40
+ spinner.text =
41
+ chalk.yellow('Instance not ready, waiting...') + ' (this may take a few minutes)';
42
+ const didBecomeReady = await waitForSSM(instanceId, config.aws.region, 180000, 10000);
43
+ if (!didBecomeReady) {
44
+ spinner.fail('Instance SSM not ready after 3 minutes');
45
+ throw new AWSError('Instance not ready for SSM connection', [
46
+ 'The instance may still be starting up',
47
+ 'Wait a few more minutes and try again',
48
+ 'Run: openclaw-aws status (to check instance state)',
49
+ ]);
50
+ }
51
+ spinner.succeed('Instance ready for connection');
52
+ }
53
+ else {
54
+ spinner.succeed('Instance ready for connection');
55
+ }
56
+ // Set up environment
57
+ const env = ctx.awsEnv;
58
+ console.log('');
59
+ logger.info(`Connecting to ${chalk.cyan(config.instance.name)} (${chalk.gray(instanceId)})...`);
60
+ console.log(chalk.gray('(To exit, type "exit" or press Ctrl+D)'));
61
+ console.log('');
62
+ // Launch SSM session with retry
63
+ try {
64
+ await withRetry(() => execa('aws', [
65
+ 'ssm',
66
+ 'start-session',
67
+ '--target',
68
+ instanceId,
69
+ '--region',
70
+ config.aws.region,
71
+ '--document-name',
72
+ 'AWS-StartInteractiveCommand',
73
+ '--parameters',
74
+ 'command="sudo su - ubuntu"',
75
+ ], {
76
+ stdio: 'inherit',
77
+ env,
78
+ }), {
79
+ maxAttempts: 3,
80
+ delayMs: 2000,
81
+ shouldRetry: (error) => isRetryableError(error),
82
+ operationName: 'start SSM session',
83
+ });
84
+ }
85
+ catch {
86
+ throw new AWSError('Failed to start SSM session', [
87
+ 'Check your internet connection',
88
+ 'Verify AWS credentials are valid',
89
+ 'Try again in a few moments',
90
+ ]);
91
+ }
92
+ }
93
+ catch (error) {
94
+ handleError(error);
95
+ }
96
+ },
97
+ };
98
+ export default connectCommand;
99
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/cli/commands/connect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAM/D,MAAM,CAAC,MAAM,cAAc,GAAmC;IAC5D,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,iCAAiC;IAE3C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QACjB,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;YAC1B,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,iBAAiB;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAE1B,mCAAmC;YACnC,MAAM,iBAAiB,EAAE,CAAC;YAE1B,MAAM,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAElD,kBAAkB;YAClB,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;YAEnD,IAAI,UAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,UAAU,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3E,OAAO,CAAC,OAAO,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;gBACnC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,yBAAyB;YACzB,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEpE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,IAAI;oBACV,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,GAAG,gCAAgC,CAAC;gBACpF,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBAEtF,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;oBACvD,MAAM,IAAI,QAAQ,CAAC,uCAAuC,EAAE;wBAC1D,uCAAuC;wBACvC,uCAAuC;wBACvC,oDAAoD;qBACrD,CAAC,CAAC;gBACL,CAAC;gBACD,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;YAED,qBAAqB;YACrB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;YAEvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,CAAC,IAAI,CACT,iBAAiB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CACnF,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,gCAAgC;YAChC,IAAI,CAAC;gBACH,MAAM,SAAS,CACb,GAAG,EAAE,CACH,KAAK,CACH,KAAK,EACL;oBACE,KAAK;oBACL,eAAe;oBACf,UAAU;oBACV,UAAU;oBACV,UAAU;oBACV,MAAM,CAAC,GAAG,CAAC,MAAM;oBACjB,iBAAiB;oBACjB,6BAA6B;oBAC7B,cAAc;oBACd,4BAA4B;iBAC7B,EACD;oBACE,KAAK,EAAE,SAAS;oBAChB,GAAG;iBACJ,CACF,EACH;oBACE,WAAW,EAAE,CAAC;oBACd,OAAO,EAAE,IAAI;oBACb,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC;oBAC/C,aAAa,EAAE,mBAAmB;iBACnC,CACF,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,IAAI,QAAQ,CAAC,6BAA6B,EAAE;oBAChD,gCAAgC;oBAChC,kCAAkC;oBAClC,4BAA4B;iBAC7B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;CACF,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { CommandModule } from 'yargs';
2
+ export declare const currentCommand: CommandModule;
3
+ export default currentCommand;
4
+ //# sourceMappingURL=current.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/current.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAK3C,eAAO,MAAM,cAAc,EAAE,aAY5B,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,18 @@
1
+ import chalk from 'chalk';
2
+ import { logger } from '../utils/logger.js';
3
+ import { getCurrentName } from '../utils/config-store.js';
4
+ export const currentCommand = {
5
+ command: 'current',
6
+ describe: 'Show current config',
7
+ handler: async () => {
8
+ const current = getCurrentName();
9
+ if (!current) {
10
+ logger.info('No current config selected');
11
+ console.log('\nUse: ' + chalk.cyan('openclaw-aws use <name>'));
12
+ return;
13
+ }
14
+ logger.info(`Current config: ${chalk.cyan(current)}`);
15
+ },
16
+ };
17
+ export default currentCommand;
18
+ //# sourceMappingURL=current.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current.js","sourceRoot":"","sources":["../../../src/cli/commands/current.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,CAAC,MAAM,cAAc,GAAkB;IAC3C,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,qBAAqB;IAC/B,OAAO,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;QACjC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;CACF,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CommandModule } from 'yargs';
2
+ interface DashboardArgs {
3
+ name?: string;
4
+ noOpen?: boolean;
5
+ }
6
+ export declare const dashboardCommand: CommandModule<{}, DashboardArgs>;
7
+ export default dashboardCommand;
8
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAe3C,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAkDD,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,EAAE,EAAE,aAAa,CAoM7D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,231 @@
1
+ import { execa } from 'execa';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { logger } from '../utils/logger.js';
5
+ import { loadOutputsByName } from '../utils/config.js';
6
+ import { buildCommandContext } from '../utils/context.js';
7
+ import { resolveInstanceId, checkSSMStatus, checkGatewayStatus } from '../utils/aws.js';
8
+ import { handleError, AWSError } from '../utils/errors.js';
9
+ import { validateSSMPlugin } from '../utils/aws-validation.js';
10
+ import net from 'net';
11
+ import { GetParameterCommand } from '@aws-sdk/client-ssm';
12
+ import { createSsmClient } from '../utils/aws-clients.js';
13
+ import { getGatewayTokenParamName } from '../utils/api-keys.js';
14
+ async function waitForLocalPort(port, timeoutMs = 15000, intervalMs = 500) {
15
+ const start = Date.now();
16
+ while (Date.now() - start < timeoutMs) {
17
+ const isOpen = await new Promise((resolve) => {
18
+ const socket = new net.Socket();
19
+ const onError = () => {
20
+ socket.destroy();
21
+ resolve(false);
22
+ };
23
+ socket.setTimeout(1000);
24
+ socket.once('error', onError);
25
+ socket.once('timeout', onError);
26
+ socket.connect(port, '127.0.0.1', () => {
27
+ socket.end();
28
+ resolve(true);
29
+ });
30
+ });
31
+ if (isOpen)
32
+ return true;
33
+ await new Promise((resolve) => setTimeout(resolve, intervalMs));
34
+ }
35
+ return false;
36
+ }
37
+ async function fetchGatewayToken(configName, region) {
38
+ const client = createSsmClient(region);
39
+ const paramName = getGatewayTokenParamName(configName);
40
+ try {
41
+ const response = await client.send(new GetParameterCommand({
42
+ Name: paramName,
43
+ WithDecryption: true,
44
+ }));
45
+ return response.Parameter?.Value;
46
+ }
47
+ catch {
48
+ return undefined;
49
+ }
50
+ finally {
51
+ client.destroy();
52
+ }
53
+ }
54
+ export const dashboardCommand = {
55
+ command: 'dashboard',
56
+ describe: 'Forward port 18789 for OpenClaw dashboard access',
57
+ builder: (yargs) => {
58
+ return yargs
59
+ .option('name', {
60
+ type: 'string',
61
+ describe: 'Deployment name',
62
+ })
63
+ .option('no-open', {
64
+ type: 'boolean',
65
+ describe: 'Do not open browser automatically',
66
+ default: false,
67
+ });
68
+ },
69
+ handler: async (argv) => {
70
+ try {
71
+ const ctx = await buildCommandContext({ name: argv.name });
72
+ const config = ctx.config;
73
+ // Validate SSM plugin is installed
74
+ await validateSSMPlugin();
75
+ logger.info(`Opening dashboard for ${chalk.cyan(ctx.name)}`);
76
+ // Get instance ID
77
+ const spinner = ora('Finding instance...').start();
78
+ let instanceId;
79
+ try {
80
+ instanceId = await resolveInstanceId(config.stack.name, config.aws.region);
81
+ spinner.succeed(`Found instance: ${chalk.cyan(instanceId)}`);
82
+ }
83
+ catch (error) {
84
+ spinner.fail('Instance not found');
85
+ throw error;
86
+ }
87
+ // Check SSM connectivity
88
+ spinner.start('Checking SSM connectivity...');
89
+ const isReady = await checkSSMStatus(instanceId, config.aws.region);
90
+ if (!isReady) {
91
+ spinner.fail('Instance not ready');
92
+ throw new AWSError('Instance not ready for SSM connection', [
93
+ 'Run: openclaw-aws status (to check instance state)',
94
+ 'Run: openclaw-aws connect (which will wait for instance)',
95
+ 'The instance may still be starting up',
96
+ ]);
97
+ }
98
+ spinner.succeed('Instance ready');
99
+ spinner.start('Checking gateway status...');
100
+ const gatewayStatus = await checkGatewayStatus(instanceId, config.aws.region);
101
+ if (!gatewayStatus.running) {
102
+ spinner.fail('Gateway not running');
103
+ throw new AWSError('OpenClaw gateway is not running', [
104
+ 'Run: openclaw-aws status (to check gateway status)',
105
+ 'Run: openclaw-aws connect (to restart the gateway)',
106
+ 'If the instance is new, wait a few minutes and try again',
107
+ ]);
108
+ }
109
+ spinner.succeed('Gateway running');
110
+ // Set up environment
111
+ const env = ctx.awsEnv;
112
+ spinner.start('Setting up port forwarding...');
113
+ // Start port forwarding
114
+ // Note: This is a long-running process, so we don't await it
115
+ const portForward = execa('aws', [
116
+ 'ssm',
117
+ 'start-session',
118
+ '--target',
119
+ instanceId,
120
+ '--document-name',
121
+ 'AWS-StartPortForwardingSession',
122
+ '--parameters',
123
+ JSON.stringify({
124
+ portNumber: ['18789'],
125
+ localPortNumber: ['18789'],
126
+ }),
127
+ '--region',
128
+ config.aws.region,
129
+ ], {
130
+ env,
131
+ stdio: 'inherit',
132
+ });
133
+ // Wait a moment for port forwarding to establish
134
+ await new Promise((resolve) => setTimeout(resolve, 2000));
135
+ spinner.succeed('Port forwarding established');
136
+ // Get gateway token from outputs
137
+ const outputs = loadOutputsByName(ctx.name);
138
+ const stackOutputs = (outputs?.[config.stack.name] ?? {});
139
+ let tokenSource = 'missing';
140
+ let gatewayToken = stackOutputs.GatewayToken;
141
+ if (!gatewayToken) {
142
+ gatewayToken = await fetchGatewayToken(ctx.name, config.aws.region);
143
+ tokenSource = gatewayToken ? 'ssm' : 'missing';
144
+ }
145
+ else {
146
+ tokenSource = 'outputs';
147
+ }
148
+ const gatewayPort = stackOutputs.GatewayPort || '18789';
149
+ const gatewayPortNumber = parseInt(gatewayPort, 10) || 18789;
150
+ const dashboardUrl = gatewayToken
151
+ ? `http://localhost:${gatewayPort}/?token=${gatewayToken}`
152
+ : `http://localhost:${gatewayPort}`;
153
+ console.log('\n' + '='.repeat(50));
154
+ logger.success('Dashboard Available!');
155
+ console.log('='.repeat(50));
156
+ console.log(`\n🌐 Dashboard URL: ${chalk.cyan(dashboardUrl)}`);
157
+ if (gatewayToken) {
158
+ console.log(`\nšŸ”‘ Gateway Token (${tokenSource}): ${chalk.gray(gatewayToken)}`);
159
+ }
160
+ else {
161
+ console.log(`\n${chalk.yellow('āš ļø Gateway token could not be retrieved.')}`);
162
+ console.log(` Checked: CloudFormation outputs and SSM Parameter Store.`);
163
+ console.log(` Dashboard auth may fail without ?token=<value> in the URL.`);
164
+ }
165
+ if (!argv.noOpen) {
166
+ spinner.start('Waiting for dashboard to become ready...');
167
+ const ready = await waitForLocalPort(gatewayPortNumber);
168
+ if (ready) {
169
+ spinner.succeed('Dashboard ready');
170
+ }
171
+ else {
172
+ spinner.warn('Dashboard not ready yet; opening anyway');
173
+ }
174
+ if (!gatewayToken) {
175
+ console.log('\nSkipping automatic browser open because gateway token is missing.');
176
+ console.log('Use openclaw-aws logs --service to inspect gateway startup/auth configuration.');
177
+ }
178
+ else {
179
+ console.log('\nšŸ“– Opening in your default browser...');
180
+ try {
181
+ // Try to open browser (cross-platform)
182
+ const { execa: execaSync } = await import('execa');
183
+ if (process.platform === 'darwin') {
184
+ await execaSync('open', [dashboardUrl]);
185
+ }
186
+ else if (process.platform === 'win32') {
187
+ await execaSync('cmd', ['/c', 'start', dashboardUrl]);
188
+ }
189
+ else {
190
+ await execaSync('xdg-open', [dashboardUrl]);
191
+ }
192
+ }
193
+ catch {
194
+ // Silently fail if browser open doesn't work
195
+ console.log('\n(Could not open browser automatically)');
196
+ }
197
+ }
198
+ }
199
+ console.log(`\n${chalk.bold('Keep this terminal window open')}`);
200
+ console.log(`Press ${chalk.yellow('Ctrl+C')} to stop port forwarding\n`);
201
+ let cleanupRequested = false;
202
+ const cleanup = () => {
203
+ if (cleanupRequested)
204
+ return;
205
+ cleanupRequested = true;
206
+ console.log('\n\nStopping port forwarding...');
207
+ portForward.kill('SIGINT');
208
+ };
209
+ process.once('SIGINT', cleanup);
210
+ process.once('SIGTERM', cleanup);
211
+ // Keep process alive until session ends or user interrupts
212
+ try {
213
+ await portForward;
214
+ }
215
+ catch (error) {
216
+ if (!cleanupRequested) {
217
+ throw error;
218
+ }
219
+ }
220
+ finally {
221
+ process.off('SIGINT', cleanup);
222
+ process.off('SIGTERM', cleanup);
223
+ }
224
+ }
225
+ catch (error) {
226
+ handleError(error);
227
+ }
228
+ },
229
+ };
230
+ export default dashboardCommand;
231
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../../src/cli/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CommandModule } from 'yargs';
2
+ interface DeployArgs {
3
+ autoApprove?: boolean;
4
+ name?: string;
5
+ all?: boolean;
6
+ }
7
+ export declare const deployCommand: CommandModule<{}, DeployArgs>;
8
+ export default deployCommand;
9
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/deploy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAiC3C,UAAU,UAAU;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAmDD,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,EAAE,EAAE,UAAU,CAiZvD,CAAC;AAEF,eAAe,aAAa,CAAC"}