@salza80/openclaw-aws 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +414 -0
- package/dist/cdk/app.d.ts +3 -0
- package/dist/cdk/app.d.ts.map +1 -0
- package/dist/cdk/app.js +60 -0
- package/dist/cdk/app.js.map +1 -0
- package/dist/cdk/stack.d.ts +16 -0
- package/dist/cdk/stack.d.ts.map +1 -0
- package/dist/cdk/stack.js +151 -0
- package/dist/cdk/stack.js.map +1 -0
- package/dist/cli/commands/connect.d.ts +7 -0
- package/dist/cli/commands/connect.d.ts.map +1 -0
- package/dist/cli/commands/connect.js +99 -0
- package/dist/cli/commands/connect.js.map +1 -0
- package/dist/cli/commands/current.d.ts +4 -0
- package/dist/cli/commands/current.d.ts.map +1 -0
- package/dist/cli/commands/current.js +18 -0
- package/dist/cli/commands/current.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +8 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +231 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/deploy.d.ts +9 -0
- package/dist/cli/commands/deploy.d.ts.map +1 -0
- package/dist/cli/commands/deploy.js +380 -0
- package/dist/cli/commands/deploy.js.map +1 -0
- package/dist/cli/commands/destroy.d.ts +10 -0
- package/dist/cli/commands/destroy.d.ts.map +1 -0
- package/dist/cli/commands/destroy.js +359 -0
- package/dist/cli/commands/destroy.js.map +1 -0
- package/dist/cli/commands/init.d.ts +12 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +258 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +4 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +23 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +11 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +163 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/outputs.d.ts +7 -0
- package/dist/cli/commands/outputs.d.ts.map +1 -0
- package/dist/cli/commands/outputs.js +69 -0
- package/dist/cli/commands/outputs.js.map +1 -0
- package/dist/cli/commands/restart.d.ts +8 -0
- package/dist/cli/commands/restart.d.ts.map +1 -0
- package/dist/cli/commands/restart.js +91 -0
- package/dist/cli/commands/restart.js.map +1 -0
- package/dist/cli/commands/start.d.ts +7 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +80 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +12 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +244 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +8 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +86 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/commands/use.d.ts +7 -0
- package/dist/cli/commands/use.d.ts.map +1 -0
- package/dist/cli/commands/use.js +26 -0
- package/dist/cli/commands/use.js.map +1 -0
- package/dist/cli/constants.d.ts +63 -0
- package/dist/cli/constants.d.ts.map +1 -0
- package/dist/cli/constants.js +37 -0
- package/dist/cli/constants.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +43 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/types/index.d.ts +47 -0
- package/dist/cli/types/index.d.ts.map +1 -0
- package/dist/cli/types/index.js +2 -0
- package/dist/cli/types/index.js.map +1 -0
- package/dist/cli/utils/api-keys.d.ts +6 -0
- package/dist/cli/utils/api-keys.d.ts.map +1 -0
- package/dist/cli/utils/api-keys.js +14 -0
- package/dist/cli/utils/api-keys.js.map +1 -0
- package/dist/cli/utils/aws-clients.d.ts +7 -0
- package/dist/cli/utils/aws-clients.d.ts.map +1 -0
- package/dist/cli/utils/aws-clients.js +13 -0
- package/dist/cli/utils/aws-clients.js.map +1 -0
- package/dist/cli/utils/aws-validation.d.ts +35 -0
- package/dist/cli/utils/aws-validation.d.ts.map +1 -0
- package/dist/cli/utils/aws-validation.js +266 -0
- package/dist/cli/utils/aws-validation.js.map +1 -0
- package/dist/cli/utils/aws.d.ts +17 -0
- package/dist/cli/utils/aws.d.ts.map +1 -0
- package/dist/cli/utils/aws.js +213 -0
- package/dist/cli/utils/aws.js.map +1 -0
- package/dist/cli/utils/cdk.d.ts +12 -0
- package/dist/cli/utils/cdk.d.ts.map +1 -0
- package/dist/cli/utils/cdk.js +52 -0
- package/dist/cli/utils/cdk.js.map +1 -0
- package/dist/cli/utils/cloud-init.d.ts +11 -0
- package/dist/cli/utils/cloud-init.d.ts.map +1 -0
- package/dist/cli/utils/cloud-init.js +104 -0
- package/dist/cli/utils/cloud-init.js.map +1 -0
- package/dist/cli/utils/config-store.d.ts +17 -0
- package/dist/cli/utils/config-store.d.ts.map +1 -0
- package/dist/cli/utils/config-store.js +85 -0
- package/dist/cli/utils/config-store.js.map +1 -0
- package/dist/cli/utils/config-validation.d.ts +4 -0
- package/dist/cli/utils/config-validation.d.ts.map +1 -0
- package/dist/cli/utils/config-validation.js +89 -0
- package/dist/cli/utils/config-validation.js.map +1 -0
- package/dist/cli/utils/config.d.ts +12 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +80 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/cli/utils/context.d.ts +14 -0
- package/dist/cli/utils/context.d.ts.map +1 -0
- package/dist/cli/utils/context.js +28 -0
- package/dist/cli/utils/context.js.map +1 -0
- package/dist/cli/utils/ec2.d.ts +6 -0
- package/dist/cli/utils/ec2.d.ts.map +1 -0
- package/dist/cli/utils/ec2.js +103 -0
- package/dist/cli/utils/ec2.js.map +1 -0
- package/dist/cli/utils/errors.d.ts +23 -0
- package/dist/cli/utils/errors.d.ts.map +1 -0
- package/dist/cli/utils/errors.js +126 -0
- package/dist/cli/utils/errors.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +9 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +25 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/cli/utils/suggestions.d.ts +7 -0
- package/dist/cli/utils/suggestions.d.ts.map +1 -0
- package/dist/cli/utils/suggestions.js +44 -0
- package/dist/cli/utils/suggestions.js.map +1 -0
- package/dist/cli/utils/validation.d.ts +12 -0
- package/dist/cli/utils/validation.d.ts.map +1 -0
- package/dist/cli/utils/validation.js +52 -0
- package/dist/cli/utils/validation.js.map +1 -0
- package/package.json +96 -0
- package/templates/openclaw.config.json.template +23 -0
|
@@ -0,0 +1,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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|