@layr-labs/ecloud-cli 0.0.1-dev-rfc.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/README.md +195 -0
- package/bin/dev.cmd +3 -0
- package/bin/dev.js +5 -0
- package/bin/run.cmd +3 -0
- package/bin/run.js +5 -0
- package/dist/commands/app/create.js +29 -0
- package/dist/commands/app/create.js.map +1 -0
- package/dist/commands/app/deploy.js +142 -0
- package/dist/commands/app/deploy.js.map +1 -0
- package/dist/commands/app/logs.js +108 -0
- package/dist/commands/app/logs.js.map +1 -0
- package/dist/commands/app/start.js +121 -0
- package/dist/commands/app/start.js.map +1 -0
- package/dist/commands/app/stop.js +121 -0
- package/dist/commands/app/stop.js.map +1 -0
- package/dist/commands/app/terminate.js +128 -0
- package/dist/commands/app/terminate.js.map +1 -0
- package/dist/commands/app/upgrade.js +142 -0
- package/dist/commands/app/upgrade.js.map +1 -0
- package/dist/commands/auth/generate.js +101 -0
- package/dist/commands/auth/generate.js.map +1 -0
- package/dist/commands/auth/login.js +150 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.js +64 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/migrate.js +129 -0
- package/dist/commands/auth/migrate.js.map +1 -0
- package/dist/commands/auth/whoami.js +87 -0
- package/dist/commands/auth/whoami.js.map +1 -0
- package/dist/commands/billing/cancel.js +132 -0
- package/dist/commands/billing/cancel.js.map +1 -0
- package/dist/commands/billing/status.js +175 -0
- package/dist/commands/billing/status.js.map +1 -0
- package/dist/commands/billing/subscribe.js +157 -0
- package/dist/commands/billing/subscribe.js.map +1 -0
- package/dist/keys/mainnet-alpha/prod/kms-encryption-public-key.pem +14 -0
- package/dist/keys/mainnet-alpha/prod/kms-signing-public-key.pem +4 -0
- package/dist/keys/sepolia/dev/kms-encryption-public-key.pem +14 -0
- package/dist/keys/sepolia/dev/kms-signing-public-key.pem +4 -0
- package/dist/keys/sepolia/prod/kms-encryption-public-key.pem +14 -0
- package/dist/keys/sepolia/prod/kms-signing-public-key.pem +4 -0
- package/dist/templates/Dockerfile.layered.tmpl +58 -0
- package/dist/templates/compute-source-env.sh.tmpl +110 -0
- package/package.json +53 -0
package/README.md
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# ECloud SDK
|
|
2
|
+
|
|
3
|
+
A TypeScript SDK and CLI for deploying and managing applications on eigenx TEE (Trusted Execution Environment). This monorepo provides both programmatic SDK access and a command-line interface for interacting with ecloud's decentralized compute platform.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
ECloud SDK enables developers to:
|
|
8
|
+
- Deploy containerized applications to ecloud TEE
|
|
9
|
+
- Manage application lifecycle (start, stop, terminate)
|
|
10
|
+
- Build and push Docker images with encryption
|
|
11
|
+
- Interact with ecloud smart contracts on Ethereum networks
|
|
12
|
+
- Monitor application status and logs
|
|
13
|
+
|
|
14
|
+
## Packages
|
|
15
|
+
|
|
16
|
+
This monorepo contains two main packages:
|
|
17
|
+
|
|
18
|
+
### `@layr-labs/ecloud-sdk`
|
|
19
|
+
|
|
20
|
+
The core TypeScript SDK for programmatic access to ecloud services.
|
|
21
|
+
|
|
22
|
+
**Features:**
|
|
23
|
+
- Type-safe client for ecloud operations
|
|
24
|
+
- Docker image building and pushing
|
|
25
|
+
- KMS encryption for secure deployments
|
|
26
|
+
- Smart contract interactions (EIP7702)
|
|
27
|
+
- Environment configuration management
|
|
28
|
+
|
|
29
|
+
### `@layr-labs/ecloud-cli`
|
|
30
|
+
|
|
31
|
+
Command-line interface built with oclif for deploying and managing applications.
|
|
32
|
+
|
|
33
|
+
**Features:**
|
|
34
|
+
- Deploy applications from Docker images
|
|
35
|
+
- Manage application lifecycle
|
|
36
|
+
- Environment-aware configuration
|
|
37
|
+
- Support for multiple networks
|
|
38
|
+
|
|
39
|
+
## Installation
|
|
40
|
+
|
|
41
|
+
### Prerequisites
|
|
42
|
+
|
|
43
|
+
- Node.js 18+
|
|
44
|
+
- pnpm (recommended) or npm
|
|
45
|
+
- Docker (for building and pushing images)
|
|
46
|
+
|
|
47
|
+
### Install Dependencies
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pnpm install
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Build
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pnpm build
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Usage
|
|
60
|
+
|
|
61
|
+
### CLI Usage
|
|
62
|
+
|
|
63
|
+
The CLI is available via the `ecloud` command after building:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# Deploy an application
|
|
67
|
+
npx ecloud app deploy \
|
|
68
|
+
--private-key <your-private-key> \
|
|
69
|
+
--environment sepolia \
|
|
70
|
+
--image <docker-image-reference>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Common Flags:**
|
|
74
|
+
- `--private-key`: Your Ethereum private key (or set `ECLOUD_PRIVATE_KEY` env var)
|
|
75
|
+
- `--environment`: Target environment (`sepolia` or `mainnet-alpha`)
|
|
76
|
+
- `--rpc-url`: Custom RPC URL (optional, or set `ECLOUD_RPC_URL` env var)
|
|
77
|
+
|
|
78
|
+
**Example:**
|
|
79
|
+
```bash
|
|
80
|
+
npx ecloud app deploy \
|
|
81
|
+
--private-key 0x... \
|
|
82
|
+
--environment sepolia
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### SDK Usage
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { createECloudClient } from "@layr-labs/ecloud-sdk";
|
|
89
|
+
|
|
90
|
+
// Create a client
|
|
91
|
+
const client = createECloudClient({
|
|
92
|
+
privateKey: "0x...",
|
|
93
|
+
environment: "sepolia", // or "sepolia-dev" or "mainnet-alpha"
|
|
94
|
+
rpcUrl: "https://sepolia.infura.io/v3/...",
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// Deploy an application
|
|
98
|
+
const result = await client.app.deploy({
|
|
99
|
+
image: "myapp:latest",
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
console.log(`Deployed app ID: ${result.appId}`);
|
|
103
|
+
console.log(`Transaction hash: ${result.tx}`);
|
|
104
|
+
|
|
105
|
+
// Start an application
|
|
106
|
+
await client.app.start(result.appId);
|
|
107
|
+
|
|
108
|
+
// Stop an application
|
|
109
|
+
await client.app.stop(result.appId);
|
|
110
|
+
|
|
111
|
+
// Terminate an application
|
|
112
|
+
await client.app.terminate(result.appId);
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Environments
|
|
116
|
+
|
|
117
|
+
The SDK supports the following environments:
|
|
118
|
+
|
|
119
|
+
- **sepolia**: Sepolia testnet
|
|
120
|
+
- **mainnet-alpha**: Ethereum mainnet (alpha)
|
|
121
|
+
|
|
122
|
+
## Development
|
|
123
|
+
|
|
124
|
+
### Project Structure
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
ecloud-sdk/
|
|
128
|
+
├── packages/
|
|
129
|
+
│ ├── cli/ # CLI package
|
|
130
|
+
│ │ ├── src/
|
|
131
|
+
│ │ │ ├── commands/ # CLI commands
|
|
132
|
+
│ │ │ └── client.ts # Client loader
|
|
133
|
+
│ │ └── bin/ # CLI entry points
|
|
134
|
+
│ └── sdk/ # SDK package
|
|
135
|
+
│ └── src/
|
|
136
|
+
│ └── client/
|
|
137
|
+
│ └── modules/
|
|
138
|
+
│ └── app/ # App management module
|
|
139
|
+
│ ├── deploy/ # Deployment logic
|
|
140
|
+
│ └── index.ts
|
|
141
|
+
├── package.json
|
|
142
|
+
└── pnpm-workspace.yaml
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Scripts
|
|
146
|
+
|
|
147
|
+
- `pnpm build` - Build all packages
|
|
148
|
+
- `pnpm lint` - Lint all packages
|
|
149
|
+
- `pnpm format` - Check code formatting
|
|
150
|
+
- `pnpm format:fix` - Fix code formatting
|
|
151
|
+
- `pnpm test` - Run tests (when implemented)
|
|
152
|
+
- `pnpm ecloud` - Run the CLI
|
|
153
|
+
|
|
154
|
+
### Adding New Commands
|
|
155
|
+
|
|
156
|
+
1. Create a new command file in `packages/cli/src/commands/`
|
|
157
|
+
2. Export a class extending `Command` from `@oclif/core`
|
|
158
|
+
3. The command will be automatically discovered by oclif
|
|
159
|
+
|
|
160
|
+
### Adding New SDK Modules
|
|
161
|
+
|
|
162
|
+
1. Create a new module in `packages/sdk/src/client/modules/`
|
|
163
|
+
2. Export a module factory function (e.g., `createXxxModule`)
|
|
164
|
+
3. Add the module to the client in `packages/sdk/src/client/index.ts`
|
|
165
|
+
|
|
166
|
+
## Deployment Process
|
|
167
|
+
|
|
168
|
+
The deployment process involves several steps:
|
|
169
|
+
|
|
170
|
+
1. **Preflight Checks**: Validate environment and configuration
|
|
171
|
+
2. **Docker Build**: Build Docker image if needed
|
|
172
|
+
3. **Image Push**: Push image to registry
|
|
173
|
+
4. **Encryption**: Encrypt sensitive data using KMS
|
|
174
|
+
5. **On-Chain Deployment**: Deploy smart contract with app configuration
|
|
175
|
+
6. **Status Monitoring**: Watch until application is running
|
|
176
|
+
|
|
177
|
+
## Security
|
|
178
|
+
|
|
179
|
+
- Private keys are never stored or logged
|
|
180
|
+
- Sensitive data is encrypted using KMS before deployment
|
|
181
|
+
- All blockchain interactions use secure wallet clients
|
|
182
|
+
- Environment variables are supported for sensitive configuration
|
|
183
|
+
|
|
184
|
+
## Contributing
|
|
185
|
+
|
|
186
|
+
1. Fork the repository
|
|
187
|
+
2. Create a feature branch
|
|
188
|
+
3. Make your changes
|
|
189
|
+
4. Run tests and linting
|
|
190
|
+
5. Submit a pull request
|
|
191
|
+
|
|
192
|
+
## Support
|
|
193
|
+
|
|
194
|
+
For issues and questions, please open an issue on GitHub.
|
|
195
|
+
|
package/bin/dev.cmd
ADDED
package/bin/dev.js
ADDED
package/bin/run.cmd
ADDED
package/bin/run.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/app/create.ts
|
|
4
|
+
import { Command, Flags } from "@oclif/core";
|
|
5
|
+
import { createApp } from "@layr-labs/ecloud-sdk";
|
|
6
|
+
var AppCreate = class _AppCreate extends Command {
|
|
7
|
+
static description = "Create a new app";
|
|
8
|
+
// CreateApp flags
|
|
9
|
+
static flags = {
|
|
10
|
+
name: Flags.string(),
|
|
11
|
+
language: Flags.string(),
|
|
12
|
+
template: Flags.string(),
|
|
13
|
+
templateVersion: Flags.string(),
|
|
14
|
+
verbose: Flags.boolean()
|
|
15
|
+
};
|
|
16
|
+
async run() {
|
|
17
|
+
const { flags } = await this.parse(_AppCreate);
|
|
18
|
+
return createApp(flags, {
|
|
19
|
+
info: (msg, ...args) => console.log(msg, ...args),
|
|
20
|
+
warn: (msg, ...args) => console.warn(msg, ...args),
|
|
21
|
+
error: (msg, ...args) => console.error(msg, ...args),
|
|
22
|
+
debug: (msg, ...args) => flags.verbose && console.debug(msg, ...args)
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
export {
|
|
27
|
+
AppCreate as default
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/app/create.ts"],"sourcesContent":["import { Command, Flags } from \"@oclif/core\";\nimport { createApp } from \"@layr-labs/ecloud-sdk\";\n\nexport default class AppCreate extends Command {\n static description = \"Create a new app\";\n\n // CreateApp flags\n static flags = {\n name: Flags.string(),\n language: Flags.string(),\n template: Flags.string(),\n templateVersion: Flags.string(),\n verbose: Flags.boolean(),\n };\n\n async run() {\n const { flags } = await this.parse(AppCreate);\n\n // Skip creating client and call createApp directly\n return createApp(flags, {\n info: (msg: string, ...args: any[]) => console.log(msg, ...args),\n warn: (msg: string, ...args: any[]) => console.warn(msg, ...args),\n error: (msg: string, ...args: any[]) => console.error(msg, ...args),\n debug: (msg: string, ...args: any[]) =>\n flags.verbose && console.debug(msg, ...args),\n });\n }\n}\n"],"mappings":";;;AAAA,SAAS,SAAS,aAAa;AAC/B,SAAS,iBAAiB;AAE1B,IAAqB,YAArB,MAAqB,mBAAkB,QAAQ;AAAA,EAC7C,OAAO,cAAc;AAAA;AAAA,EAGrB,OAAO,QAAQ;AAAA,IACb,MAAM,MAAM,OAAO;AAAA,IACnB,UAAU,MAAM,OAAO;AAAA,IACvB,UAAU,MAAM,OAAO;AAAA,IACvB,iBAAiB,MAAM,OAAO;AAAA,IAC9B,SAAS,MAAM,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAM,MAAM;AACV,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,UAAS;AAG5C,WAAO,UAAU,OAAO;AAAA,MACtB,MAAM,CAAC,QAAgB,SAAgB,QAAQ,IAAI,KAAK,GAAG,IAAI;AAAA,MAC/D,MAAM,CAAC,QAAgB,SAAgB,QAAQ,KAAK,KAAK,GAAG,IAAI;AAAA,MAChE,OAAO,CAAC,QAAgB,SAAgB,QAAQ,MAAM,KAAK,GAAG,IAAI;AAAA,MAClE,OAAO,CAAC,QAAgB,SACtB,MAAM,WAAW,QAAQ,MAAM,KAAK,GAAG,IAAI;AAAA,IAC/C,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/app/deploy.ts
|
|
4
|
+
import { Command, Flags as Flags2 } from "@oclif/core";
|
|
5
|
+
|
|
6
|
+
// src/client.ts
|
|
7
|
+
import {
|
|
8
|
+
createAppModule,
|
|
9
|
+
createBillingModule,
|
|
10
|
+
getPrivateKeyInteractive as getPrivateKeyInteractive2,
|
|
11
|
+
getEnvironmentConfig,
|
|
12
|
+
requirePrivateKey,
|
|
13
|
+
getPrivateKeyWithSource
|
|
14
|
+
} from "@layr-labs/ecloud-sdk";
|
|
15
|
+
|
|
16
|
+
// src/flags.ts
|
|
17
|
+
import {
|
|
18
|
+
getEnvironmentInteractive,
|
|
19
|
+
getPrivateKeyInteractive,
|
|
20
|
+
getAvailableEnvironments
|
|
21
|
+
} from "@layr-labs/ecloud-sdk";
|
|
22
|
+
import { Flags } from "@oclif/core";
|
|
23
|
+
var getEnvironmentOptions = () => {
|
|
24
|
+
try {
|
|
25
|
+
return getAvailableEnvironments();
|
|
26
|
+
} catch {
|
|
27
|
+
return ["sepolia", "sepolia-dev", "mainnet-alpha"];
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var commonFlags = {
|
|
31
|
+
environment: Flags.string({
|
|
32
|
+
required: false,
|
|
33
|
+
description: "Deployment environment to use",
|
|
34
|
+
options: getEnvironmentOptions(),
|
|
35
|
+
env: "ECLOUD_ENV"
|
|
36
|
+
}),
|
|
37
|
+
"private-key": Flags.string({
|
|
38
|
+
required: false,
|
|
39
|
+
description: "Private key for signing transactions",
|
|
40
|
+
env: "ECLOUD_PRIVATE_KEY"
|
|
41
|
+
}),
|
|
42
|
+
"rpc-url": Flags.string({
|
|
43
|
+
required: false,
|
|
44
|
+
description: "RPC URL to connect to blockchain",
|
|
45
|
+
env: "ECLOUD_RPC_URL"
|
|
46
|
+
}),
|
|
47
|
+
verbose: Flags.boolean({
|
|
48
|
+
required: false,
|
|
49
|
+
description: "Enable verbose logging (default: false)",
|
|
50
|
+
default: false
|
|
51
|
+
})
|
|
52
|
+
};
|
|
53
|
+
async function validateCommonFlags(flags) {
|
|
54
|
+
flags["environment"] = await getEnvironmentInteractive(flags["environment"]);
|
|
55
|
+
flags["private-key"] = await getPrivateKeyInteractive(flags["private-key"]);
|
|
56
|
+
return flags;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// src/client.ts
|
|
60
|
+
async function createAppClient(flags) {
|
|
61
|
+
flags = await validateCommonFlags(flags);
|
|
62
|
+
const environment = flags.environment;
|
|
63
|
+
const environmentConfig = getEnvironmentConfig(environment);
|
|
64
|
+
const rpcUrl = flags["rpc-url"] || environmentConfig.defaultRPCURL;
|
|
65
|
+
const { key: privateKey, source } = await requirePrivateKey({
|
|
66
|
+
privateKey: flags["private-key"]
|
|
67
|
+
});
|
|
68
|
+
if (flags.verbose) {
|
|
69
|
+
console.log(`Using private key from: ${source}`);
|
|
70
|
+
}
|
|
71
|
+
return createAppModule({
|
|
72
|
+
verbose: flags.verbose,
|
|
73
|
+
privateKey,
|
|
74
|
+
rpcUrl,
|
|
75
|
+
environment
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// src/commands/app/deploy.ts
|
|
80
|
+
import chalk from "chalk";
|
|
81
|
+
var AppDeploy = class _AppDeploy extends Command {
|
|
82
|
+
static description = "Deploy new app";
|
|
83
|
+
static flags = {
|
|
84
|
+
...commonFlags,
|
|
85
|
+
name: Flags2.string({
|
|
86
|
+
required: false,
|
|
87
|
+
description: "Friendly name for the app",
|
|
88
|
+
env: "ECLOUD_NAME"
|
|
89
|
+
}),
|
|
90
|
+
dockerfile: Flags2.string({
|
|
91
|
+
required: false,
|
|
92
|
+
description: "Path to Dockerfile",
|
|
93
|
+
env: "ECLOUD_DOCKERFILE_PATH"
|
|
94
|
+
}),
|
|
95
|
+
"image-ref": Flags2.string({
|
|
96
|
+
required: false,
|
|
97
|
+
description: "Image reference pointing to registry",
|
|
98
|
+
env: "ECLOUD_IMAGE_REF"
|
|
99
|
+
}),
|
|
100
|
+
"env-file": Flags2.string({
|
|
101
|
+
required: false,
|
|
102
|
+
description: 'Environment file to use (default: ".env")',
|
|
103
|
+
default: ".env",
|
|
104
|
+
env: "ECLOUD_ENVFILE_PATH"
|
|
105
|
+
}),
|
|
106
|
+
"log-visibility": Flags2.string({
|
|
107
|
+
required: false,
|
|
108
|
+
description: "Log visibility setting: public, private, or off",
|
|
109
|
+
options: ["public", "private", "off"],
|
|
110
|
+
env: "ECLOUD_LOG_VISIBILITY"
|
|
111
|
+
}),
|
|
112
|
+
"instance-type": Flags2.string({
|
|
113
|
+
required: false,
|
|
114
|
+
description: "Machine instance type to use e.g. g1-standard-4t, g1-standard-8t",
|
|
115
|
+
options: ["g1-standard-4t", "g1-standard-8t"],
|
|
116
|
+
env: "ECLOUD_INSTANCE_TYPE"
|
|
117
|
+
})
|
|
118
|
+
};
|
|
119
|
+
async run() {
|
|
120
|
+
const { flags } = await this.parse(_AppDeploy);
|
|
121
|
+
const app = await createAppClient(flags);
|
|
122
|
+
const res = await app.deploy({
|
|
123
|
+
name: flags.name,
|
|
124
|
+
dockerfile: flags.dockerfile,
|
|
125
|
+
envFile: flags["env-file"],
|
|
126
|
+
imageRef: flags["image-ref"],
|
|
127
|
+
logVisibility: flags["log-visibility"],
|
|
128
|
+
instanceType: flags["instance-type"]
|
|
129
|
+
});
|
|
130
|
+
if (!res.tx || !res.ipAddress) {
|
|
131
|
+
this.log(`
|
|
132
|
+
${chalk.gray(`Deploy ${res.ipAddress ? "failed" : "aborted"}`)}`);
|
|
133
|
+
} else {
|
|
134
|
+
this.log(`
|
|
135
|
+
\u2705 ${chalk.green(`App deployed successfully ${chalk.bold(`(id: ${res.appID}, ip: ${res.ipAddress})`)}`)}`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
export {
|
|
140
|
+
AppDeploy as default
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/app/deploy.ts","../../../src/client.ts","../../../src/flags.ts"],"sourcesContent":["import { Command, Flags } from \"@oclif/core\";\nimport { logVisibility } from \"@layr-labs/ecloud-sdk\";\nimport { createAppClient } from \"../../client\";\nimport { commonFlags } from \"../../flags\";\nimport chalk from \"chalk\";\n\nexport default class AppDeploy extends Command {\n static description = \"Deploy new app\";\n\n static flags = {\n ...commonFlags,\n name: Flags.string({\n required: false,\n description: \"Friendly name for the app\",\n env: \"ECLOUD_NAME\",\n }),\n dockerfile: Flags.string({\n required: false,\n description: \"Path to Dockerfile\",\n env: \"ECLOUD_DOCKERFILE_PATH\",\n }),\n \"image-ref\": Flags.string({\n required: false,\n description: \"Image reference pointing to registry\",\n env: \"ECLOUD_IMAGE_REF\",\n }),\n \"env-file\": Flags.string({\n required: false,\n description: 'Environment file to use (default: \".env\")',\n default: \".env\",\n env: \"ECLOUD_ENVFILE_PATH\",\n }),\n \"log-visibility\": Flags.string({\n required: false,\n description: \"Log visibility setting: public, private, or off\",\n options: [\"public\", \"private\", \"off\"],\n env: \"ECLOUD_LOG_VISIBILITY\",\n }),\n \"instance-type\": Flags.string({\n required: false,\n description:\n \"Machine instance type to use e.g. g1-standard-4t, g1-standard-8t\",\n options: [\"g1-standard-4t\", \"g1-standard-8t\"],\n env: \"ECLOUD_INSTANCE_TYPE\",\n }),\n };\n\n async run() {\n const { flags } = await this.parse(AppDeploy);\n const app = await createAppClient(flags);\n\n const res = await app.deploy({\n name: flags.name,\n dockerfile: flags.dockerfile,\n envFile: flags[\"env-file\"],\n imageRef: flags[\"image-ref\"],\n logVisibility: flags[\"log-visibility\"] as logVisibility,\n instanceType: flags[\"instance-type\"],\n });\n\n if (!res.tx || !res.ipAddress) {\n this.log(`\\n${chalk.gray(`Deploy ${res.ipAddress ? \"failed\" : \"aborted\"}`)}`);\n } else {\n this.log(`\\n✅ ${chalk.green(`App deployed successfully ${chalk.bold(`(id: ${res.appID}, ip: ${res.ipAddress})`)}`)}`);\n }\n }\n}\n","import {\n createAppModule,\n createBillingModule,\n getPrivateKeyInteractive,\n getEnvironmentConfig,\n requirePrivateKey,\n getPrivateKeyWithSource,\n} from \"@layr-labs/ecloud-sdk\";\nimport { CommonFlags, validateCommonFlags } from \"./flags\";\nimport { Hex } from \"viem\";\n\nexport async function createAppClient(flags: CommonFlags) {\n flags = await validateCommonFlags(flags);\n\n const environment = flags.environment!;\n const environmentConfig = getEnvironmentConfig(environment);\n const rpcUrl = flags[\"rpc-url\"] || environmentConfig.defaultRPCURL;\n const { key: privateKey, source } = await requirePrivateKey({\n privateKey: flags[\"private-key\"],\n });\n\n if (flags.verbose) {\n console.log(`Using private key from: ${source}`);\n }\n\n return createAppModule({\n verbose: flags.verbose,\n privateKey,\n rpcUrl,\n environment,\n });\n}\n\nexport async function createBillingClient(flags: {\n \"private-key\"?: string;\n verbose?: boolean;\n}) {\n const result = await getPrivateKeyWithSource({\n privateKey: flags[\"private-key\"],\n });\n const privateKey = await getPrivateKeyInteractive(result?.key);\n\n return createBillingModule({\n verbose: flags.verbose ?? false,\n privateKey: privateKey as Hex,\n });\n}\n","import {\n getEnvironmentInteractive,\n getPrivateKeyInteractive,\n getAvailableEnvironments,\n} from \"@layr-labs/ecloud-sdk\";\nimport { Flags } from \"@oclif/core\";\n\nexport type CommonFlags = {\n verbose: boolean;\n environment?: string;\n \"private-key\"?: string;\n \"rpc-url\"?: string;\n};\n\n// Get available environments dynamically from SDK based on build type\nconst getEnvironmentOptions = (): string[] => {\n try {\n return getAvailableEnvironments();\n } catch {\n // Fallback to all environments if SDK not available\n return [\"sepolia\", \"sepolia-dev\", \"mainnet-alpha\"];\n }\n};\n\nexport const commonFlags = {\n environment: Flags.string({\n required: false,\n description: \"Deployment environment to use\",\n options: getEnvironmentOptions(),\n env: \"ECLOUD_ENV\",\n }),\n \"private-key\": Flags.string({\n required: false,\n description: \"Private key for signing transactions\",\n env: \"ECLOUD_PRIVATE_KEY\",\n }),\n \"rpc-url\": Flags.string({\n required: false,\n description: \"RPC URL to connect to blockchain\",\n env: \"ECLOUD_RPC_URL\",\n }),\n verbose: Flags.boolean({\n required: false,\n description: \"Enable verbose logging (default: false)\",\n default: false,\n }),\n};\n\n// Validate or prompt for required common flags\nexport async function validateCommonFlags(flags: CommonFlags) {\n flags[\"environment\"] = await getEnvironmentInteractive(flags[\"environment\"]);\n flags[\"private-key\"] = await getPrivateKeyInteractive(flags[\"private-key\"]);\n\n return flags;\n}\n"],"mappings":"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","names":["Flags","getPrivateKeyInteractive","Flags"]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/app/logs.ts
|
|
4
|
+
import { Command, Args, Flags as Flags2 } from "@oclif/core";
|
|
5
|
+
|
|
6
|
+
// src/client.ts
|
|
7
|
+
import {
|
|
8
|
+
createAppModule,
|
|
9
|
+
createBillingModule,
|
|
10
|
+
getPrivateKeyInteractive as getPrivateKeyInteractive2,
|
|
11
|
+
getEnvironmentConfig,
|
|
12
|
+
requirePrivateKey,
|
|
13
|
+
getPrivateKeyWithSource
|
|
14
|
+
} from "@layr-labs/ecloud-sdk";
|
|
15
|
+
|
|
16
|
+
// src/flags.ts
|
|
17
|
+
import {
|
|
18
|
+
getEnvironmentInteractive,
|
|
19
|
+
getPrivateKeyInteractive,
|
|
20
|
+
getAvailableEnvironments
|
|
21
|
+
} from "@layr-labs/ecloud-sdk";
|
|
22
|
+
import { Flags } from "@oclif/core";
|
|
23
|
+
var getEnvironmentOptions = () => {
|
|
24
|
+
try {
|
|
25
|
+
return getAvailableEnvironments();
|
|
26
|
+
} catch {
|
|
27
|
+
return ["sepolia", "sepolia-dev", "mainnet-alpha"];
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var commonFlags = {
|
|
31
|
+
environment: Flags.string({
|
|
32
|
+
required: false,
|
|
33
|
+
description: "Deployment environment to use",
|
|
34
|
+
options: getEnvironmentOptions(),
|
|
35
|
+
env: "ECLOUD_ENV"
|
|
36
|
+
}),
|
|
37
|
+
"private-key": Flags.string({
|
|
38
|
+
required: false,
|
|
39
|
+
description: "Private key for signing transactions",
|
|
40
|
+
env: "ECLOUD_PRIVATE_KEY"
|
|
41
|
+
}),
|
|
42
|
+
"rpc-url": Flags.string({
|
|
43
|
+
required: false,
|
|
44
|
+
description: "RPC URL to connect to blockchain",
|
|
45
|
+
env: "ECLOUD_RPC_URL"
|
|
46
|
+
}),
|
|
47
|
+
verbose: Flags.boolean({
|
|
48
|
+
required: false,
|
|
49
|
+
description: "Enable verbose logging (default: false)",
|
|
50
|
+
default: false
|
|
51
|
+
})
|
|
52
|
+
};
|
|
53
|
+
async function validateCommonFlags(flags) {
|
|
54
|
+
flags["environment"] = await getEnvironmentInteractive(flags["environment"]);
|
|
55
|
+
flags["private-key"] = await getPrivateKeyInteractive(flags["private-key"]);
|
|
56
|
+
return flags;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// src/client.ts
|
|
60
|
+
async function createAppClient(flags) {
|
|
61
|
+
flags = await validateCommonFlags(flags);
|
|
62
|
+
const environment = flags.environment;
|
|
63
|
+
const environmentConfig = getEnvironmentConfig(environment);
|
|
64
|
+
const rpcUrl = flags["rpc-url"] || environmentConfig.defaultRPCURL;
|
|
65
|
+
const { key: privateKey, source } = await requirePrivateKey({
|
|
66
|
+
privateKey: flags["private-key"]
|
|
67
|
+
});
|
|
68
|
+
if (flags.verbose) {
|
|
69
|
+
console.log(`Using private key from: ${source}`);
|
|
70
|
+
}
|
|
71
|
+
return createAppModule({
|
|
72
|
+
verbose: flags.verbose,
|
|
73
|
+
privateKey,
|
|
74
|
+
rpcUrl,
|
|
75
|
+
environment
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// src/commands/app/logs.ts
|
|
80
|
+
var AppLogs = class _AppLogs extends Command {
|
|
81
|
+
static description = "View app logs";
|
|
82
|
+
static args = {
|
|
83
|
+
"app-id": Args.string({
|
|
84
|
+
description: "App ID or name",
|
|
85
|
+
required: false
|
|
86
|
+
})
|
|
87
|
+
};
|
|
88
|
+
static flags = {
|
|
89
|
+
...commonFlags,
|
|
90
|
+
watch: Flags2.boolean({
|
|
91
|
+
description: "Watch logs continuously",
|
|
92
|
+
char: "w",
|
|
93
|
+
default: false
|
|
94
|
+
})
|
|
95
|
+
};
|
|
96
|
+
async run() {
|
|
97
|
+
const { args, flags } = await this.parse(_AppLogs);
|
|
98
|
+
const app = await createAppClient(flags);
|
|
99
|
+
await app.logs({
|
|
100
|
+
appID: args["app-id"],
|
|
101
|
+
watch: flags.watch
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
export {
|
|
106
|
+
AppLogs as default
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/app/logs.ts","../../../src/client.ts","../../../src/flags.ts"],"sourcesContent":["import { Command, Args, Flags } from \"@oclif/core\";\nimport { createAppClient } from \"../../client\";\nimport { commonFlags } from \"../../flags\";\n\nexport default class AppLogs extends Command {\n static description = \"View app logs\";\n\n static args = {\n \"app-id\": Args.string({\n description: \"App ID or name\",\n required: false,\n }),\n };\n\n static flags = {\n ...commonFlags,\n watch: Flags.boolean({\n description: \"Watch logs continuously\",\n char: \"w\",\n default: false,\n }),\n };\n\n async run() {\n const { args, flags } = await this.parse(AppLogs);\n const app = await createAppClient(flags);\n\n await app.logs({\n appID: args[\"app-id\"],\n watch: flags.watch,\n });\n }\n}\n\n","import {\n createAppModule,\n createBillingModule,\n getPrivateKeyInteractive,\n getEnvironmentConfig,\n requirePrivateKey,\n getPrivateKeyWithSource,\n} from \"@layr-labs/ecloud-sdk\";\nimport { CommonFlags, validateCommonFlags } from \"./flags\";\nimport { Hex } from \"viem\";\n\nexport async function createAppClient(flags: CommonFlags) {\n flags = await validateCommonFlags(flags);\n\n const environment = flags.environment!;\n const environmentConfig = getEnvironmentConfig(environment);\n const rpcUrl = flags[\"rpc-url\"] || environmentConfig.defaultRPCURL;\n const { key: privateKey, source } = await requirePrivateKey({\n privateKey: flags[\"private-key\"],\n });\n\n if (flags.verbose) {\n console.log(`Using private key from: ${source}`);\n }\n\n return createAppModule({\n verbose: flags.verbose,\n privateKey,\n rpcUrl,\n environment,\n });\n}\n\nexport async function createBillingClient(flags: {\n \"private-key\"?: string;\n verbose?: boolean;\n}) {\n const result = await getPrivateKeyWithSource({\n privateKey: flags[\"private-key\"],\n });\n const privateKey = await getPrivateKeyInteractive(result?.key);\n\n return createBillingModule({\n verbose: flags.verbose ?? false,\n privateKey: privateKey as Hex,\n });\n}\n","import {\n getEnvironmentInteractive,\n getPrivateKeyInteractive,\n getAvailableEnvironments,\n} from \"@layr-labs/ecloud-sdk\";\nimport { Flags } from \"@oclif/core\";\n\nexport type CommonFlags = {\n verbose: boolean;\n environment?: string;\n \"private-key\"?: string;\n \"rpc-url\"?: string;\n};\n\n// Get available environments dynamically from SDK based on build type\nconst getEnvironmentOptions = (): string[] => {\n try {\n return getAvailableEnvironments();\n } catch {\n // Fallback to all environments if SDK not available\n return [\"sepolia\", \"sepolia-dev\", \"mainnet-alpha\"];\n }\n};\n\nexport const commonFlags = {\n environment: Flags.string({\n required: false,\n description: \"Deployment environment to use\",\n options: getEnvironmentOptions(),\n env: \"ECLOUD_ENV\",\n }),\n \"private-key\": Flags.string({\n required: false,\n description: \"Private key for signing transactions\",\n env: \"ECLOUD_PRIVATE_KEY\",\n }),\n \"rpc-url\": Flags.string({\n required: false,\n description: \"RPC URL to connect to blockchain\",\n env: \"ECLOUD_RPC_URL\",\n }),\n verbose: Flags.boolean({\n required: false,\n description: \"Enable verbose logging (default: false)\",\n default: false,\n }),\n};\n\n// Validate or prompt for required common flags\nexport async function validateCommonFlags(flags: CommonFlags) {\n flags[\"environment\"] = await getEnvironmentInteractive(flags[\"environment\"]);\n flags[\"private-key\"] = await getPrivateKeyInteractive(flags[\"private-key\"]);\n\n return flags;\n}\n"],"mappings":";;;AAAA,SAAS,SAAS,MAAM,SAAAA,cAAa;;;ACArC;AAAA,EACE;AAAA,EACA;AAAA,EACA,4BAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACPP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa;AAUtB,IAAM,wBAAwB,MAAgB;AAC5C,MAAI;AACF,WAAO,yBAAyB;AAAA,EAClC,QAAQ;AAEN,WAAO,CAAC,WAAW,eAAe,eAAe;AAAA,EACnD;AACF;AAEO,IAAM,cAAc;AAAA,EACzB,aAAa,MAAM,OAAO;AAAA,IACxB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS,sBAAsB;AAAA,IAC/B,KAAK;AAAA,EACP,CAAC;AAAA,EACD,eAAe,MAAM,OAAO;AAAA,IAC1B,UAAU;AAAA,IACV,aAAa;AAAA,IACb,KAAK;AAAA,EACP,CAAC;AAAA,EACD,WAAW,MAAM,OAAO;AAAA,IACtB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,KAAK;AAAA,EACP,CAAC;AAAA,EACD,SAAS,MAAM,QAAQ;AAAA,IACrB,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS;AAAA,EACX,CAAC;AACH;AAGA,eAAsB,oBAAoB,OAAoB;AAC5D,QAAM,aAAa,IAAI,MAAM,0BAA0B,MAAM,aAAa,CAAC;AAC3E,QAAM,aAAa,IAAI,MAAM,yBAAyB,MAAM,aAAa,CAAC;AAE1E,SAAO;AACT;;;AD3CA,eAAsB,gBAAgB,OAAoB;AACxD,UAAQ,MAAM,oBAAoB,KAAK;AAEvC,QAAM,cAAc,MAAM;AAC1B,QAAM,oBAAoB,qBAAqB,WAAW;AAC1D,QAAM,SAAS,MAAM,SAAS,KAAK,kBAAkB;AACrD,QAAM,EAAE,KAAK,YAAY,OAAO,IAAI,MAAM,kBAAkB;AAAA,IAC1D,YAAY,MAAM,aAAa;AAAA,EACjC,CAAC;AAED,MAAI,MAAM,SAAS;AACjB,YAAQ,IAAI,2BAA2B,MAAM,EAAE;AAAA,EACjD;AAEA,SAAO,gBAAgB;AAAA,IACrB,SAAS,MAAM;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;;;AD3BA,IAAqB,UAArB,MAAqB,iBAAgB,QAAQ;AAAA,EAC3C,OAAO,cAAc;AAAA,EAErB,OAAO,OAAO;AAAA,IACZ,UAAU,KAAK,OAAO;AAAA,MACpB,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,GAAG;AAAA,IACH,OAAOC,OAAM,QAAQ;AAAA,MACnB,aAAa;AAAA,MACb,MAAM;AAAA,MACN,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM;AACV,UAAM,EAAE,MAAM,MAAM,IAAI,MAAM,KAAK,MAAM,QAAO;AAChD,UAAM,MAAM,MAAM,gBAAgB,KAAK;AAEvC,UAAM,IAAI,KAAK;AAAA,MACb,OAAO,KAAK,QAAQ;AAAA,MACpB,OAAO,MAAM;AAAA,IACf,CAAC;AAAA,EACH;AACF;","names":["Flags","getPrivateKeyInteractive","Flags"]}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/app/start.ts
|
|
4
|
+
import { Command, Args } from "@oclif/core";
|
|
5
|
+
|
|
6
|
+
// src/client.ts
|
|
7
|
+
import {
|
|
8
|
+
createAppModule,
|
|
9
|
+
createBillingModule,
|
|
10
|
+
getPrivateKeyInteractive as getPrivateKeyInteractive2,
|
|
11
|
+
getEnvironmentConfig,
|
|
12
|
+
requirePrivateKey,
|
|
13
|
+
getPrivateKeyWithSource
|
|
14
|
+
} from "@layr-labs/ecloud-sdk";
|
|
15
|
+
|
|
16
|
+
// src/flags.ts
|
|
17
|
+
import {
|
|
18
|
+
getEnvironmentInteractive,
|
|
19
|
+
getPrivateKeyInteractive,
|
|
20
|
+
getAvailableEnvironments
|
|
21
|
+
} from "@layr-labs/ecloud-sdk";
|
|
22
|
+
import { Flags } from "@oclif/core";
|
|
23
|
+
var getEnvironmentOptions = () => {
|
|
24
|
+
try {
|
|
25
|
+
return getAvailableEnvironments();
|
|
26
|
+
} catch {
|
|
27
|
+
return ["sepolia", "sepolia-dev", "mainnet-alpha"];
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
var commonFlags = {
|
|
31
|
+
environment: Flags.string({
|
|
32
|
+
required: false,
|
|
33
|
+
description: "Deployment environment to use",
|
|
34
|
+
options: getEnvironmentOptions(),
|
|
35
|
+
env: "ECLOUD_ENV"
|
|
36
|
+
}),
|
|
37
|
+
"private-key": Flags.string({
|
|
38
|
+
required: false,
|
|
39
|
+
description: "Private key for signing transactions",
|
|
40
|
+
env: "ECLOUD_PRIVATE_KEY"
|
|
41
|
+
}),
|
|
42
|
+
"rpc-url": Flags.string({
|
|
43
|
+
required: false,
|
|
44
|
+
description: "RPC URL to connect to blockchain",
|
|
45
|
+
env: "ECLOUD_RPC_URL"
|
|
46
|
+
}),
|
|
47
|
+
verbose: Flags.boolean({
|
|
48
|
+
required: false,
|
|
49
|
+
description: "Enable verbose logging (default: false)",
|
|
50
|
+
default: false
|
|
51
|
+
})
|
|
52
|
+
};
|
|
53
|
+
async function validateCommonFlags(flags) {
|
|
54
|
+
flags["environment"] = await getEnvironmentInteractive(flags["environment"]);
|
|
55
|
+
flags["private-key"] = await getPrivateKeyInteractive(flags["private-key"]);
|
|
56
|
+
return flags;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// src/client.ts
|
|
60
|
+
async function createAppClient(flags) {
|
|
61
|
+
flags = await validateCommonFlags(flags);
|
|
62
|
+
const environment = flags.environment;
|
|
63
|
+
const environmentConfig = getEnvironmentConfig(environment);
|
|
64
|
+
const rpcUrl = flags["rpc-url"] || environmentConfig.defaultRPCURL;
|
|
65
|
+
const { key: privateKey, source } = await requirePrivateKey({
|
|
66
|
+
privateKey: flags["private-key"]
|
|
67
|
+
});
|
|
68
|
+
if (flags.verbose) {
|
|
69
|
+
console.log(`Using private key from: ${source}`);
|
|
70
|
+
}
|
|
71
|
+
return createAppModule({
|
|
72
|
+
verbose: flags.verbose,
|
|
73
|
+
privateKey,
|
|
74
|
+
rpcUrl,
|
|
75
|
+
environment
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// src/commands/app/start.ts
|
|
80
|
+
import { getEnvironmentConfig as getEnvironmentConfig2, getOrPromptAppID } from "@layr-labs/ecloud-sdk";
|
|
81
|
+
import chalk from "chalk";
|
|
82
|
+
var AppLifecycleStart = class _AppLifecycleStart extends Command {
|
|
83
|
+
static description = "Start stopped app (start GCP instance)";
|
|
84
|
+
static args = {
|
|
85
|
+
"app-id": Args.string({
|
|
86
|
+
description: "App ID or name to start",
|
|
87
|
+
required: false
|
|
88
|
+
})
|
|
89
|
+
};
|
|
90
|
+
static flags = {
|
|
91
|
+
...commonFlags
|
|
92
|
+
};
|
|
93
|
+
async run() {
|
|
94
|
+
const { args, flags } = await this.parse(_AppLifecycleStart);
|
|
95
|
+
const app = await createAppClient(flags);
|
|
96
|
+
const environment = flags.environment || "sepolia";
|
|
97
|
+
const environmentConfig = getEnvironmentConfig2(environment);
|
|
98
|
+
const rpcUrl = flags.rpcUrl || environmentConfig.defaultRPCURL;
|
|
99
|
+
const appId = await getOrPromptAppID(
|
|
100
|
+
{
|
|
101
|
+
appID: args["app-id"],
|
|
102
|
+
environment: flags["environment"],
|
|
103
|
+
privateKey: flags["private-key"],
|
|
104
|
+
rpcUrl,
|
|
105
|
+
action: "start"
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
const res = await app.start(appId);
|
|
109
|
+
if (!res.tx) {
|
|
110
|
+
this.log(`
|
|
111
|
+
${chalk.gray(`Start aborted`)}`);
|
|
112
|
+
} else {
|
|
113
|
+
this.log(`
|
|
114
|
+
\u2705 ${chalk.green(`App started successfully`)}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
export {
|
|
119
|
+
AppLifecycleStart as default
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/app/start.ts","../../../src/client.ts","../../../src/flags.ts"],"sourcesContent":["import { Command, Args } from \"@oclif/core\";\nimport { createAppClient } from \"../../client\";\nimport { commonFlags } from \"../../flags\";\nimport { getEnvironmentConfig, getOrPromptAppID } from \"@layr-labs/ecloud-sdk\";\nimport chalk from \"chalk\";\n\nexport default class AppLifecycleStart extends Command {\n static description = \"Start stopped app (start GCP instance)\";\n\n static args = {\n \"app-id\": Args.string({\n description: \"App ID or name to start\",\n required: false,\n }),\n };\n\n static flags = {\n ...commonFlags,\n };\n\n async run() {\n const { args, flags } = await this.parse(AppLifecycleStart);\n const app = await createAppClient(flags);\n\n\n // Get environment config\n const environment = flags.environment || \"sepolia\";\n const environmentConfig = getEnvironmentConfig(environment);\n \n // Get RPC URL (needed for contract queries and authentication)\n const rpcUrl = flags.rpcUrl || environmentConfig.defaultRPCURL;\n \n // Resolve app ID (prompt if not provided)\n const appId = await getOrPromptAppID(\n {\n appID: args[\"app-id\"],\n environment: flags[\"environment\"]!,\n privateKey: flags[\"private-key\"],\n rpcUrl,\n action: \"start\",\n }\n );\n\n const res = await app.start(appId);\n\n if (!res.tx) {\n this.log(`\\n${chalk.gray(`Start aborted`)}`);\n } else {\n this.log(`\\n✅ ${chalk.green(`App started successfully`)}`);\n }\n }\n}\n\n","import {\n createAppModule,\n createBillingModule,\n getPrivateKeyInteractive,\n getEnvironmentConfig,\n requirePrivateKey,\n getPrivateKeyWithSource,\n} from \"@layr-labs/ecloud-sdk\";\nimport { CommonFlags, validateCommonFlags } from \"./flags\";\nimport { Hex } from \"viem\";\n\nexport async function createAppClient(flags: CommonFlags) {\n flags = await validateCommonFlags(flags);\n\n const environment = flags.environment!;\n const environmentConfig = getEnvironmentConfig(environment);\n const rpcUrl = flags[\"rpc-url\"] || environmentConfig.defaultRPCURL;\n const { key: privateKey, source } = await requirePrivateKey({\n privateKey: flags[\"private-key\"],\n });\n\n if (flags.verbose) {\n console.log(`Using private key from: ${source}`);\n }\n\n return createAppModule({\n verbose: flags.verbose,\n privateKey,\n rpcUrl,\n environment,\n });\n}\n\nexport async function createBillingClient(flags: {\n \"private-key\"?: string;\n verbose?: boolean;\n}) {\n const result = await getPrivateKeyWithSource({\n privateKey: flags[\"private-key\"],\n });\n const privateKey = await getPrivateKeyInteractive(result?.key);\n\n return createBillingModule({\n verbose: flags.verbose ?? false,\n privateKey: privateKey as Hex,\n });\n}\n","import {\n getEnvironmentInteractive,\n getPrivateKeyInteractive,\n getAvailableEnvironments,\n} from \"@layr-labs/ecloud-sdk\";\nimport { Flags } from \"@oclif/core\";\n\nexport type CommonFlags = {\n verbose: boolean;\n environment?: string;\n \"private-key\"?: string;\n \"rpc-url\"?: string;\n};\n\n// Get available environments dynamically from SDK based on build type\nconst getEnvironmentOptions = (): string[] => {\n try {\n return getAvailableEnvironments();\n } catch {\n // Fallback to all environments if SDK not available\n return [\"sepolia\", \"sepolia-dev\", \"mainnet-alpha\"];\n }\n};\n\nexport const commonFlags = {\n environment: Flags.string({\n required: false,\n description: \"Deployment environment to use\",\n options: getEnvironmentOptions(),\n env: \"ECLOUD_ENV\",\n }),\n \"private-key\": Flags.string({\n required: false,\n description: \"Private key for signing transactions\",\n env: \"ECLOUD_PRIVATE_KEY\",\n }),\n \"rpc-url\": Flags.string({\n required: false,\n description: \"RPC URL to connect to blockchain\",\n env: \"ECLOUD_RPC_URL\",\n }),\n verbose: Flags.boolean({\n required: false,\n description: \"Enable verbose logging (default: false)\",\n default: false,\n }),\n};\n\n// Validate or prompt for required common flags\nexport async function validateCommonFlags(flags: CommonFlags) {\n flags[\"environment\"] = await getEnvironmentInteractive(flags[\"environment\"]);\n flags[\"private-key\"] = await getPrivateKeyInteractive(flags[\"private-key\"]);\n\n return flags;\n}\n"],"mappings":"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","names":["getPrivateKeyInteractive","getEnvironmentConfig"]}
|