@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
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/app/stop.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/stop.ts
|
|
80
|
+
import { getEnvironmentConfig as getEnvironmentConfig2, getOrPromptAppID } from "@layr-labs/ecloud-sdk";
|
|
81
|
+
import chalk from "chalk";
|
|
82
|
+
var AppLifecycleStop = class _AppLifecycleStop extends Command {
|
|
83
|
+
static description = "Stop running app (stop GCP instance)";
|
|
84
|
+
static args = {
|
|
85
|
+
"app-id": Args.string({
|
|
86
|
+
description: "App ID or name to stop",
|
|
87
|
+
required: false
|
|
88
|
+
})
|
|
89
|
+
};
|
|
90
|
+
static flags = {
|
|
91
|
+
...commonFlags
|
|
92
|
+
};
|
|
93
|
+
async run() {
|
|
94
|
+
const { args, flags } = await this.parse(_AppLifecycleStop);
|
|
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: "stop"
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
const res = await app.stop(appId);
|
|
109
|
+
if (!res.tx) {
|
|
110
|
+
this.log(`
|
|
111
|
+
${chalk.gray(`Stop aborted`)}`);
|
|
112
|
+
} else {
|
|
113
|
+
this.log(`
|
|
114
|
+
\u2705 ${chalk.green(`App stopped successfully`)}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
export {
|
|
119
|
+
AppLifecycleStop as default
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=stop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/app/stop.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 AppLifecycleStop extends Command {\n static description = \"Stop running app (stop GCP instance)\";\n\n static args = {\n \"app-id\": Args.string({\n description: \"App ID or name to stop\",\n required: false,\n }),\n };\n\n static flags = {\n ...commonFlags,\n };\n\n async run() {\n const { args, flags } = await this.parse(AppLifecycleStop);\n const app = await createAppClient(flags);\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: \"stop\",\n }\n );\n\n const res = await app.stop(appId);\n\n if (!res.tx) {\n this.log(`\\n${chalk.gray(`Stop aborted`)}`);\n } else {\n this.log(`\\n✅ ${chalk.green(`App stopped 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"]}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/app/terminate.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/terminate.ts
|
|
80
|
+
import { getEnvironmentConfig as getEnvironmentConfig2, getOrPromptAppID } from "@layr-labs/ecloud-sdk";
|
|
81
|
+
import chalk from "chalk";
|
|
82
|
+
var AppLifecycleTerminate = class _AppLifecycleTerminate extends Command {
|
|
83
|
+
static description = "Terminate app (terminate GCP instance) permanently";
|
|
84
|
+
static args = {
|
|
85
|
+
"app-id": Args.string({
|
|
86
|
+
description: "App ID or name to terminate",
|
|
87
|
+
required: false
|
|
88
|
+
})
|
|
89
|
+
};
|
|
90
|
+
static flags = {
|
|
91
|
+
...commonFlags,
|
|
92
|
+
force: Flags2.boolean({
|
|
93
|
+
required: false,
|
|
94
|
+
description: "Force termination without confirmation",
|
|
95
|
+
default: false
|
|
96
|
+
})
|
|
97
|
+
};
|
|
98
|
+
async run() {
|
|
99
|
+
const { args, flags } = await this.parse(_AppLifecycleTerminate);
|
|
100
|
+
const app = await createAppClient(flags);
|
|
101
|
+
const environment = flags.environment || "sepolia";
|
|
102
|
+
const environmentConfig = getEnvironmentConfig2(environment);
|
|
103
|
+
const rpcUrl = flags.rpcUrl || environmentConfig.defaultRPCURL;
|
|
104
|
+
const appId = await getOrPromptAppID(
|
|
105
|
+
{
|
|
106
|
+
appID: args["app-id"],
|
|
107
|
+
environment: flags["environment"],
|
|
108
|
+
privateKey: flags["private-key"],
|
|
109
|
+
rpcUrl,
|
|
110
|
+
action: "terminate"
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
const res = await app.terminate(appId, {
|
|
114
|
+
force: flags.force
|
|
115
|
+
});
|
|
116
|
+
if (!res.tx) {
|
|
117
|
+
this.log(`
|
|
118
|
+
${chalk.gray(`Termination aborted`)}`);
|
|
119
|
+
} else {
|
|
120
|
+
this.log(`
|
|
121
|
+
\u2705 ${chalk.green(`App terminated successfully`)}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
export {
|
|
126
|
+
AppLifecycleTerminate as default
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=terminate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/app/terminate.ts","../../../src/client.ts","../../../src/flags.ts"],"sourcesContent":["import { Command, Args, Flags } 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 AppLifecycleTerminate extends Command {\n static description =\n \"Terminate app (terminate GCP instance) permanently\";\n\n static args = {\n \"app-id\": Args.string({\n description: \"App ID or name to terminate\",\n required: false,\n }),\n };\n\n static flags = {\n ...commonFlags,\n force: Flags.boolean({\n required: false,\n description: \"Force termination without confirmation\",\n default: false,\n }),\n };\n\n async run() {\n const { args, flags } = await this.parse(AppLifecycleTerminate);\n const app = await createAppClient(flags);\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: \"terminate\",\n }\n );\n\n const res = await app.terminate(appId, {\n force: flags.force,\n });\n\n if (!res.tx) {\n this.log(`\\n${chalk.gray(`Termination aborted`)}`);\n } else {\n this.log(`\\n✅ ${chalk.green(`App terminated 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":["Flags","getPrivateKeyInteractive","getEnvironmentConfig","Flags"]}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/app/upgrade.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/upgrade.ts
|
|
80
|
+
import chalk from "chalk";
|
|
81
|
+
var AppUpgrade = class _AppUpgrade extends Command {
|
|
82
|
+
static description = "Upgrade existing deployment";
|
|
83
|
+
static args = {
|
|
84
|
+
"app-id": Args.string({
|
|
85
|
+
description: "App ID or name to upgrade",
|
|
86
|
+
required: false
|
|
87
|
+
})
|
|
88
|
+
};
|
|
89
|
+
static flags = {
|
|
90
|
+
...commonFlags,
|
|
91
|
+
dockerfile: Flags2.string({
|
|
92
|
+
required: false,
|
|
93
|
+
description: "Path to Dockerfile",
|
|
94
|
+
env: "ECLOUD_DOCKERFILE_PATH"
|
|
95
|
+
}),
|
|
96
|
+
"image-ref": Flags2.string({
|
|
97
|
+
required: false,
|
|
98
|
+
description: "Image reference pointing to registry",
|
|
99
|
+
env: "ECLOUD_IMAGE_REF"
|
|
100
|
+
}),
|
|
101
|
+
"env-file": Flags2.string({
|
|
102
|
+
required: false,
|
|
103
|
+
description: 'Environment file to use (default: ".env")',
|
|
104
|
+
default: ".env",
|
|
105
|
+
env: "ECLOUD_ENVFILE_PATH"
|
|
106
|
+
}),
|
|
107
|
+
"log-visibility": Flags2.string({
|
|
108
|
+
required: false,
|
|
109
|
+
description: "Log visibility setting: public, private, or off",
|
|
110
|
+
options: ["public", "private", "off"],
|
|
111
|
+
env: "ECLOUD_LOG_VISIBILITY"
|
|
112
|
+
}),
|
|
113
|
+
"instance-type": Flags2.string({
|
|
114
|
+
required: false,
|
|
115
|
+
description: "Machine instance type to use e.g. g1-standard-4t, g1-standard-8t",
|
|
116
|
+
env: "ECLOUD_INSTANCE_TYPE"
|
|
117
|
+
})
|
|
118
|
+
};
|
|
119
|
+
async run() {
|
|
120
|
+
const { args, flags } = await this.parse(_AppUpgrade);
|
|
121
|
+
const app = await createAppClient(flags);
|
|
122
|
+
const res = await app.upgrade(args["app-id"], {
|
|
123
|
+
dockerfile: flags.dockerfile,
|
|
124
|
+
envFile: flags["env-file"],
|
|
125
|
+
imageRef: flags["image-ref"],
|
|
126
|
+
logVisibility: flags["log-visibility"],
|
|
127
|
+
instanceType: flags["instance-type"]
|
|
128
|
+
});
|
|
129
|
+
if (!res.tx) {
|
|
130
|
+
this.log(`
|
|
131
|
+
${chalk.gray(`Upgrade failed`)}`);
|
|
132
|
+
} else {
|
|
133
|
+
this.log(`
|
|
134
|
+
\u2705 ${chalk.green(`App upgraded successfully ${chalk.bold(`(id: ${res.appID}, image: ${res.imageRef})`)}`)}`);
|
|
135
|
+
}
|
|
136
|
+
this.log(JSON.stringify(res, null, 2));
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
export {
|
|
140
|
+
AppUpgrade as default
|
|
141
|
+
};
|
|
142
|
+
//# sourceMappingURL=upgrade.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/app/upgrade.ts","../../../src/client.ts","../../../src/flags.ts"],"sourcesContent":["import { Command, Args, 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 AppUpgrade extends Command {\n static description = \"Upgrade existing deployment\";\n\n static args = {\n \"app-id\": Args.string({\n description: \"App ID or name to upgrade\",\n required: false,\n }),\n };\n\n static flags = {\n ...commonFlags,\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 env: \"ECLOUD_INSTANCE_TYPE\",\n }),\n };\n\n async run() {\n const { args, flags } = await this.parse(AppUpgrade);\n const app = await createAppClient(flags);\n\n const res = await app.upgrade(args[\"app-id\"] as any, {\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) {\n this.log(`\\n${chalk.gray(`Upgrade failed`)}`);\n } else {\n this.log(`\\n✅ ${chalk.green(`App upgraded successfully ${chalk.bold(`(id: ${res.appID}, image: ${res.imageRef})`)}`)}`);\n }\n this.log(JSON.stringify(res, null, 2));\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,101 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// src/commands/auth/generate.ts
|
|
4
|
+
import { Command, Flags } from "@oclif/core";
|
|
5
|
+
import { confirm } from "@inquirer/prompts";
|
|
6
|
+
import {
|
|
7
|
+
generateNewPrivateKey,
|
|
8
|
+
storePrivateKey,
|
|
9
|
+
keyExists,
|
|
10
|
+
showPrivateKey,
|
|
11
|
+
displayWarning
|
|
12
|
+
} from "@layr-labs/ecloud-sdk";
|
|
13
|
+
var AuthGenerate = class _AuthGenerate extends Command {
|
|
14
|
+
static description = "Generate a new private key";
|
|
15
|
+
static aliases = ["auth:gen", "auth:new"];
|
|
16
|
+
static examples = [
|
|
17
|
+
"<%= config.bin %> <%= command.id %>",
|
|
18
|
+
"<%= config.bin %> <%= command.id %> --store"
|
|
19
|
+
];
|
|
20
|
+
static flags = {
|
|
21
|
+
store: Flags.boolean({
|
|
22
|
+
description: "Automatically store in OS keyring",
|
|
23
|
+
default: false
|
|
24
|
+
})
|
|
25
|
+
};
|
|
26
|
+
async run() {
|
|
27
|
+
const { flags } = await this.parse(_AuthGenerate);
|
|
28
|
+
this.log("Generating new private key...\n");
|
|
29
|
+
const { privateKey, address } = generateNewPrivateKey();
|
|
30
|
+
const content = `
|
|
31
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
32
|
+
A new private key was generated for you.
|
|
33
|
+
|
|
34
|
+
IMPORTANT: You MUST backup this key now.
|
|
35
|
+
It will never be shown again.
|
|
36
|
+
|
|
37
|
+
Address: ${address}
|
|
38
|
+
Private key: ${privateKey}
|
|
39
|
+
|
|
40
|
+
\u26A0\uFE0F SECURITY WARNING:
|
|
41
|
+
\u2022 Anyone with this key can control your account
|
|
42
|
+
\u2022 Never share it or commit it to version control
|
|
43
|
+
\u2022 Store it in a secure password manager
|
|
44
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
45
|
+
|
|
46
|
+
Press 'q' to exit and continue...
|
|
47
|
+
`;
|
|
48
|
+
const displayed = await showPrivateKey(content);
|
|
49
|
+
if (!displayed) {
|
|
50
|
+
this.log("Key generation cancelled.");
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
let shouldStore = flags.store;
|
|
54
|
+
if (!shouldStore && displayed) {
|
|
55
|
+
shouldStore = await confirm({
|
|
56
|
+
message: "Store this key in your OS keyring?",
|
|
57
|
+
default: true
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
if (shouldStore) {
|
|
61
|
+
const exists = await keyExists();
|
|
62
|
+
if (exists) {
|
|
63
|
+
displayWarning([
|
|
64
|
+
`WARNING: A private key for ecloud already exists!`,
|
|
65
|
+
"If you continue, the existing key will be PERMANENTLY REPLACED.",
|
|
66
|
+
"This cannot be undone!",
|
|
67
|
+
"",
|
|
68
|
+
"The previous key will be lost forever if you haven't backed it up."
|
|
69
|
+
]);
|
|
70
|
+
const confirmReplace = await confirm({
|
|
71
|
+
message: `Replace existing key for ecloud?`,
|
|
72
|
+
default: false
|
|
73
|
+
});
|
|
74
|
+
if (!confirmReplace) {
|
|
75
|
+
this.log(
|
|
76
|
+
"\nKey not stored. If you did not save your new key when it was displayed, it is now lost and cannot be recovered."
|
|
77
|
+
);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
await storePrivateKey(privateKey);
|
|
83
|
+
this.log(`
|
|
84
|
+
\u2713 Private key stored in OS keyring`);
|
|
85
|
+
this.log(`\u2713 Address: ${address}`);
|
|
86
|
+
this.log(
|
|
87
|
+
"\nYou can now use ecloud commands without --private-key flag."
|
|
88
|
+
);
|
|
89
|
+
} catch (err) {
|
|
90
|
+
this.error(`Failed to store key: ${err.message}`);
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
this.log("\nKey not stored in keyring.");
|
|
94
|
+
this.log("Remember to save the key shown above in a secure location.");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
export {
|
|
99
|
+
AuthGenerate as default
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/commands/auth/generate.ts"],"sourcesContent":["/**\n * Auth Generate Command\n *\n * Generate a new private key and optionally store it in OS keyring\n */\n\nimport { Command, Flags } from \"@oclif/core\";\nimport { confirm } from \"@inquirer/prompts\";\nimport {\n generateNewPrivateKey,\n storePrivateKey,\n keyExists,\n showPrivateKey,\n displayWarning,\n} from \"@layr-labs/ecloud-sdk\";\n\nexport default class AuthGenerate extends Command {\n static description = \"Generate a new private key\";\n\n static aliases = [\"auth:gen\", \"auth:new\"];\n\n static examples = [\n \"<%= config.bin %> <%= command.id %>\",\n \"<%= config.bin %> <%= command.id %> --store\",\n ];\n\n static flags = {\n store: Flags.boolean({\n description: \"Automatically store in OS keyring\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(AuthGenerate);\n\n // Generate new key\n this.log(\"Generating new private key...\\n\");\n const { privateKey, address } = generateNewPrivateKey();\n\n // Display key securely\n const content = `\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nA new private key was generated for you.\n\nIMPORTANT: You MUST backup this key now.\n It will never be shown again.\n\nAddress: ${address}\nPrivate key: ${privateKey}\n\n⚠️ SECURITY WARNING:\n • Anyone with this key can control your account\n • Never share it or commit it to version control\n • Store it in a secure password manager\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\nPress 'q' to exit and continue...\n`;\n\n const displayed = await showPrivateKey(content);\n\n if (!displayed) {\n this.log(\"Key generation cancelled.\");\n return;\n }\n\n // Ask about storing\n let shouldStore = flags.store;\n\n if (!shouldStore && displayed) {\n shouldStore = await confirm({\n message: \"Store this key in your OS keyring?\",\n default: true,\n });\n }\n\n if (shouldStore) {\n // Check if key already exists\n const exists = await keyExists();\n\n if (exists) {\n displayWarning([\n `WARNING: A private key for ecloud already exists!`,\n \"If you continue, the existing key will be PERMANENTLY REPLACED.\",\n \"This cannot be undone!\",\n \"\",\n \"The previous key will be lost forever if you haven't backed it up.\",\n ]);\n\n const confirmReplace = await confirm({\n message: `Replace existing key for ecloud?`,\n default: false,\n });\n\n if (!confirmReplace) {\n this.log(\n \"\\nKey not stored. If you did not save your new key when it was displayed, it is now lost and cannot be recovered.\"\n );\n return;\n }\n }\n\n // Store the key\n try {\n await storePrivateKey(privateKey);\n this.log(`\\n✓ Private key stored in OS keyring`);\n this.log(`✓ Address: ${address}`);\n this.log(\n \"\\nYou can now use ecloud commands without --private-key flag.\"\n );\n } catch (err: any) {\n this.error(`Failed to store key: ${err.message}`);\n }\n } else {\n this.log(\"\\nKey not stored in keyring.\");\n this.log(\"Remember to save the key shown above in a secure location.\");\n }\n }\n}\n"],"mappings":";;;AAMA,SAAS,SAAS,aAAa;AAC/B,SAAS,eAAe;AACxB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,IAAqB,eAArB,MAAqB,sBAAqB,QAAQ;AAAA,EAChD,OAAO,cAAc;AAAA,EAErB,OAAO,UAAU,CAAC,YAAY,UAAU;AAAA,EAExC,OAAO,WAAW;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,OAAO,MAAM,QAAQ;AAAA,MACnB,aAAa;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAqB;AACzB,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,aAAY;AAG/C,SAAK,IAAI,iCAAiC;AAC1C,UAAM,EAAE,YAAY,QAAQ,IAAI,sBAAsB;AAGtD,UAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,eAOL,OAAO;AAAA,eACP,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWrB,UAAM,YAAY,MAAM,eAAe,OAAO;AAE9C,QAAI,CAAC,WAAW;AACd,WAAK,IAAI,2BAA2B;AACpC;AAAA,IACF;AAGA,QAAI,cAAc,MAAM;AAExB,QAAI,CAAC,eAAe,WAAW;AAC7B,oBAAc,MAAM,QAAQ;AAAA,QAC1B,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,QAAI,aAAa;AAEf,YAAM,SAAS,MAAM,UAAU;AAE/B,UAAI,QAAQ;AACV,uBAAe;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,iBAAiB,MAAM,QAAQ;AAAA,UACnC,SAAS;AAAA,UACT,SAAS;AAAA,QACX,CAAC;AAED,YAAI,CAAC,gBAAgB;AACnB,eAAK;AAAA,YACH;AAAA,UACF;AACA;AAAA,QACF;AAAA,MACF;AAGA,UAAI;AACF,cAAM,gBAAgB,UAAU;AAChC,aAAK,IAAI;AAAA,wCAAsC;AAC/C,aAAK,IAAI,mBAAc,OAAO,EAAE;AAChC,aAAK;AAAA,UACH;AAAA,QACF;AAAA,MACF,SAAS,KAAU;AACjB,aAAK,MAAM,wBAAwB,IAAI,OAAO,EAAE;AAAA,MAClD;AAAA,IACF,OAAO;AACL,WAAK,IAAI,8BAA8B;AACvC,WAAK,IAAI,4DAA4D;AAAA,IACvE;AAAA,EACF;AACF;","names":[]}
|