@layr-labs/ecloud-cli 0.2.0-dev → 0.2.0-dev.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/VERSION +2 -2
- package/dist/commands/auth/generate.js +4 -4
- package/dist/commands/auth/generate.js.map +1 -1
- package/dist/commands/auth/login.js +2 -2
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.js +2 -2
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/migrate.js +2 -2
- package/dist/commands/auth/migrate.js.map +1 -1
- package/dist/commands/auth/whoami.js +7 -5
- package/dist/commands/auth/whoami.js.map +1 -1
- package/dist/commands/billing/cancel.js +9 -7
- package/dist/commands/billing/cancel.js.map +1 -1
- package/dist/commands/billing/status.js +8 -5
- package/dist/commands/billing/status.js.map +1 -1
- package/dist/commands/billing/subscribe.js +14 -10
- package/dist/commands/billing/subscribe.js.map +1 -1
- package/dist/commands/compute/app/create.js +2 -2
- package/dist/commands/compute/app/create.js.map +1 -1
- package/dist/commands/compute/app/deploy.js +105 -105
- package/dist/commands/compute/app/deploy.js.map +1 -1
- package/dist/commands/compute/app/info.js +55 -8
- package/dist/commands/compute/app/info.js.map +1 -1
- package/dist/commands/compute/app/list.js +8 -9
- package/dist/commands/compute/app/list.js.map +1 -1
- package/dist/commands/compute/app/logs.js +58 -11
- package/dist/commands/compute/app/logs.js.map +1 -1
- package/dist/commands/compute/app/profile/set.js +147 -22
- package/dist/commands/compute/app/profile/set.js.map +1 -1
- package/dist/commands/compute/app/releases.js +110 -143
- package/dist/commands/compute/app/releases.js.map +1 -1
- package/dist/commands/compute/app/start.js +58 -11
- package/dist/commands/compute/app/start.js.map +1 -1
- package/dist/commands/compute/app/stop.js +58 -11
- package/dist/commands/compute/app/stop.js.map +1 -1
- package/dist/commands/compute/app/terminate.js +58 -11
- package/dist/commands/compute/app/terminate.js.map +1 -1
- package/dist/commands/compute/app/upgrade.js +121 -67
- package/dist/commands/compute/app/upgrade.js.map +1 -1
- package/dist/commands/compute/build/info.js +8 -9
- package/dist/commands/compute/build/info.js.map +1 -1
- package/dist/commands/compute/build/list.js +50 -131
- package/dist/commands/compute/build/list.js.map +1 -1
- package/dist/commands/compute/build/logs.js +9 -10
- package/dist/commands/compute/build/logs.js.map +1 -1
- package/dist/commands/compute/build/status.js +9 -10
- package/dist/commands/compute/build/status.js.map +1 -1
- package/dist/commands/compute/build/submit.js +8 -9
- package/dist/commands/compute/build/submit.js.map +1 -1
- package/dist/commands/compute/build/verify.js +59 -12
- package/dist/commands/compute/build/verify.js.map +1 -1
- package/dist/commands/compute/environment/list.js +2 -2
- package/dist/commands/compute/environment/list.js.map +1 -1
- package/dist/commands/compute/environment/set.js +2 -2
- package/dist/commands/compute/environment/set.js.map +1 -1
- package/dist/commands/compute/environment/show.js +2 -2
- package/dist/commands/compute/environment/show.js.map +1 -1
- package/dist/commands/compute/undelegate.js +8 -9
- package/dist/commands/compute/undelegate.js.map +1 -1
- package/dist/commands/{telemetry.js → telemetry/disable.js} +15 -64
- package/dist/commands/telemetry/disable.js.map +1 -0
- package/dist/commands/telemetry/enable.js +164 -0
- package/dist/commands/telemetry/enable.js.map +1 -0
- package/dist/commands/telemetry/status.js +159 -0
- package/dist/commands/telemetry/status.js.map +1 -0
- package/dist/commands/upgrade.js +2 -2
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/commands/version.js +2 -2
- package/dist/commands/version.js.map +1 -1
- package/package.json +4 -2
- package/dist/commands/telemetry.js.map +0 -1
|
@@ -2,15 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/commands/compute/app/upgrade.ts
|
|
4
4
|
import { Command, Args, Flags as Flags2 } from "@oclif/core";
|
|
5
|
-
import {
|
|
6
|
-
getEnvironmentConfig as getEnvironmentConfig3,
|
|
7
|
-
UserApiClient as UserApiClient3,
|
|
8
|
-
isMainnet,
|
|
9
|
-
prepareUpgrade,
|
|
10
|
-
prepareUpgradeFromVerifiableBuild,
|
|
11
|
-
executeUpgrade,
|
|
12
|
-
watchUpgrade
|
|
13
|
-
} from "@layr-labs/ecloud-sdk";
|
|
5
|
+
import { getEnvironmentConfig as getEnvironmentConfig3, UserApiClient as UserApiClient3, isMainnet } from "@layr-labs/ecloud-sdk";
|
|
14
6
|
|
|
15
7
|
// src/telemetry.ts
|
|
16
8
|
import {
|
|
@@ -72,6 +64,42 @@ function saveGlobalConfig(config) {
|
|
|
72
64
|
const content = dumpYaml(config, { lineWidth: -1 });
|
|
73
65
|
fs.writeFileSync(configPath, content, { mode: 420 });
|
|
74
66
|
}
|
|
67
|
+
function normalizeDirectoryPath(directoryPath) {
|
|
68
|
+
const resolved = path.resolve(directoryPath);
|
|
69
|
+
try {
|
|
70
|
+
return fs.realpathSync(resolved);
|
|
71
|
+
} catch {
|
|
72
|
+
return resolved;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function getLinkedAppForDirectory(environment, directoryPath) {
|
|
76
|
+
if (!directoryPath) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
const config = loadGlobalConfig();
|
|
80
|
+
const links = config.directory_links?.[environment];
|
|
81
|
+
if (!links) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
const normalizedPath = normalizeDirectoryPath(directoryPath);
|
|
85
|
+
const appId = links[normalizedPath];
|
|
86
|
+
return appId || null;
|
|
87
|
+
}
|
|
88
|
+
function setLinkedAppForDirectory(environment, directoryPath, appId) {
|
|
89
|
+
if (!directoryPath || !environment) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const config = loadGlobalConfig();
|
|
93
|
+
if (!config.directory_links) {
|
|
94
|
+
config.directory_links = {};
|
|
95
|
+
}
|
|
96
|
+
if (!config.directory_links[environment]) {
|
|
97
|
+
config.directory_links[environment] = {};
|
|
98
|
+
}
|
|
99
|
+
const normalizedPath = normalizeDirectoryPath(directoryPath);
|
|
100
|
+
config.directory_links[environment][normalizedPath] = appId.toLowerCase();
|
|
101
|
+
saveGlobalConfig(config);
|
|
102
|
+
}
|
|
75
103
|
function getDefaultEnvironment() {
|
|
76
104
|
const config = loadGlobalConfig();
|
|
77
105
|
return config.default_environment;
|
|
@@ -128,8 +156,8 @@ function createCLITelemetryClient() {
|
|
|
128
156
|
const environment = createAppEnvironment(userUUID);
|
|
129
157
|
const telemetryEnabled = getGlobalTelemetryPreference();
|
|
130
158
|
return createTelemetryClient(environment, "ecloud-cli", {
|
|
131
|
-
telemetryEnabled: telemetryEnabled
|
|
132
|
-
//
|
|
159
|
+
telemetryEnabled: telemetryEnabled !== false
|
|
160
|
+
// Enabled by default, disabled only if explicitly set to false
|
|
133
161
|
});
|
|
134
162
|
}
|
|
135
163
|
async function withTelemetry(command, action) {
|
|
@@ -173,6 +201,7 @@ async function withTelemetry(command, action) {
|
|
|
173
201
|
|
|
174
202
|
// src/flags.ts
|
|
175
203
|
import { Flags } from "@oclif/core";
|
|
204
|
+
import { getBuildType as getBuildType3 } from "@layr-labs/ecloud-sdk";
|
|
176
205
|
|
|
177
206
|
// src/utils/prompts.ts
|
|
178
207
|
import { input, select, password, confirm as inquirerConfirm } from "@inquirer/prompts";
|
|
@@ -251,7 +280,7 @@ function listApps(environment) {
|
|
|
251
280
|
|
|
252
281
|
// src/utils/version.ts
|
|
253
282
|
function getCliVersion() {
|
|
254
|
-
return true ? "0.2.0-dev" : "0.0.0";
|
|
283
|
+
return true ? "0.2.0-dev.1" : "0.0.0";
|
|
255
284
|
}
|
|
256
285
|
function getClientId() {
|
|
257
286
|
return `ecloud-cli/v${getCliVersion()}`;
|
|
@@ -553,6 +582,9 @@ function getDefaultAppName() {
|
|
|
553
582
|
return "myapp";
|
|
554
583
|
}
|
|
555
584
|
}
|
|
585
|
+
function getCurrentProjectPath() {
|
|
586
|
+
return process.env.INIT_CWD || process.cwd();
|
|
587
|
+
}
|
|
556
588
|
function suggestImageReference(registry, imageName, tag) {
|
|
557
589
|
imageName = imageName.toLowerCase().replace(/_/g, "-");
|
|
558
590
|
if (!tag) {
|
|
@@ -899,6 +931,7 @@ Select an app to ${action}:
|
|
|
899
931
|
switch (action) {
|
|
900
932
|
case "view":
|
|
901
933
|
case "view info for":
|
|
934
|
+
case "view releases for":
|
|
902
935
|
case "set profile for":
|
|
903
936
|
return true;
|
|
904
937
|
case "start":
|
|
@@ -927,7 +960,19 @@ Select an app to ${action}:
|
|
|
927
960
|
index: i
|
|
928
961
|
});
|
|
929
962
|
}
|
|
963
|
+
const linkedAppId = getLinkedAppForDirectory(environment, getCurrentProjectPath());
|
|
964
|
+
const normalizedLinkedAppId = linkedAppId ? linkedAppId.toLowerCase() : "";
|
|
930
965
|
appItems.sort((a, b) => {
|
|
966
|
+
if (normalizedLinkedAppId) {
|
|
967
|
+
const aLinked = String(a.addr).toLowerCase() === normalizedLinkedAppId;
|
|
968
|
+
const bLinked = String(b.addr).toLowerCase() === normalizedLinkedAppId;
|
|
969
|
+
if (aLinked && !bLinked) {
|
|
970
|
+
return -1;
|
|
971
|
+
}
|
|
972
|
+
if (bLinked && !aLinked) {
|
|
973
|
+
return 1;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
931
976
|
const aPriority = getStatusPriority(a.status, false);
|
|
932
977
|
const bPriority = getStatusPriority(b.status, false);
|
|
933
978
|
if (aPriority !== bPriority) {
|
|
@@ -993,7 +1038,18 @@ async function getAppIDInteractiveFromRegistry(environment, action) {
|
|
|
993
1038
|
}
|
|
994
1039
|
throw new Error(`Invalid app ID address: ${appIDInput}`);
|
|
995
1040
|
}
|
|
996
|
-
const
|
|
1041
|
+
const entries = Object.entries(allApps);
|
|
1042
|
+
const linkedAppId = getLinkedAppForDirectory(environment, getCurrentProjectPath());
|
|
1043
|
+
if (linkedAppId) {
|
|
1044
|
+
const linkedIndex = entries.findIndex(
|
|
1045
|
+
([, appId]) => String(appId).toLowerCase() === linkedAppId.toLowerCase()
|
|
1046
|
+
);
|
|
1047
|
+
if (linkedIndex > 0) {
|
|
1048
|
+
const [linkedEntry] = entries.splice(linkedIndex, 1);
|
|
1049
|
+
entries.unshift(linkedEntry);
|
|
1050
|
+
}
|
|
1051
|
+
}
|
|
1052
|
+
const choices = entries.map(([name, appID]) => {
|
|
997
1053
|
const displayName = `${name} (${appID})`;
|
|
998
1054
|
return { name: displayName, value: appID };
|
|
999
1055
|
});
|
|
@@ -1142,7 +1198,8 @@ var commonFlags = {
|
|
|
1142
1198
|
environment: Flags.string({
|
|
1143
1199
|
required: false,
|
|
1144
1200
|
description: "Deployment environment to use",
|
|
1145
|
-
env: "ECLOUD_ENV"
|
|
1201
|
+
env: "ECLOUD_ENV",
|
|
1202
|
+
default: async () => getDefaultEnvironment() || (getBuildType3() === "dev" ? "sepolia-dev" : "sepolia")
|
|
1146
1203
|
}),
|
|
1147
1204
|
"private-key": Flags.string({
|
|
1148
1205
|
required: false,
|
|
@@ -1161,9 +1218,6 @@ var commonFlags = {
|
|
|
1161
1218
|
})
|
|
1162
1219
|
};
|
|
1163
1220
|
async function validateCommonFlags(flags, options) {
|
|
1164
|
-
if (!flags["environment"]) {
|
|
1165
|
-
flags["environment"] = getDefaultEnvironment();
|
|
1166
|
-
}
|
|
1167
1221
|
flags["environment"] = await getEnvironmentInteractive(flags["environment"]);
|
|
1168
1222
|
if (options?.requirePrivateKey !== false) {
|
|
1169
1223
|
flags["private-key"] = await getPrivateKeyInteractive(flags["private-key"]);
|
|
@@ -1180,6 +1234,27 @@ import {
|
|
|
1180
1234
|
requirePrivateKey,
|
|
1181
1235
|
getPrivateKeyWithSource
|
|
1182
1236
|
} from "@layr-labs/ecloud-sdk";
|
|
1237
|
+
async function createComputeClient(flags) {
|
|
1238
|
+
flags = await validateCommonFlags(flags);
|
|
1239
|
+
const environment = flags.environment;
|
|
1240
|
+
const environmentConfig = getEnvironmentConfig2(environment);
|
|
1241
|
+
const rpcUrl = flags["rpc-url"] || environmentConfig.defaultRPCURL;
|
|
1242
|
+
const { key: privateKey, source } = await requirePrivateKey({
|
|
1243
|
+
privateKey: flags["private-key"]
|
|
1244
|
+
});
|
|
1245
|
+
if (flags.verbose) {
|
|
1246
|
+
console.log(`Using private key from: ${source}`);
|
|
1247
|
+
}
|
|
1248
|
+
return createComputeModule({
|
|
1249
|
+
verbose: flags.verbose,
|
|
1250
|
+
privateKey,
|
|
1251
|
+
rpcUrl,
|
|
1252
|
+
environment,
|
|
1253
|
+
clientId: getClientId(),
|
|
1254
|
+
skipTelemetry: true
|
|
1255
|
+
// CLI already has telemetry, skip SDK telemetry
|
|
1256
|
+
});
|
|
1257
|
+
}
|
|
1183
1258
|
async function createBuildClient(flags) {
|
|
1184
1259
|
flags = await validateCommonFlags(flags, { requirePrivateKey: false });
|
|
1185
1260
|
return createBuildModule({
|
|
@@ -1437,16 +1512,11 @@ var AppUpgrade = class _AppUpgrade extends Command {
|
|
|
1437
1512
|
async run() {
|
|
1438
1513
|
return withTelemetry(this, async () => {
|
|
1439
1514
|
const { args, flags } = await this.parse(_AppUpgrade);
|
|
1440
|
-
const
|
|
1441
|
-
|
|
1442
|
-
warn: (msg) => this.warn(msg),
|
|
1443
|
-
error: (msg) => this.error(msg),
|
|
1444
|
-
debug: (msg) => flags.verbose && this.log(msg)
|
|
1445
|
-
};
|
|
1446
|
-
const environment = flags.environment || "sepolia";
|
|
1515
|
+
const compute = await createComputeClient(flags);
|
|
1516
|
+
const environment = flags.environment;
|
|
1447
1517
|
const environmentConfig = getEnvironmentConfig3(environment);
|
|
1448
1518
|
const rpcUrl = flags["rpc-url"] || environmentConfig.defaultRPCURL;
|
|
1449
|
-
const privateKey =
|
|
1519
|
+
const privateKey = flags["private-key"];
|
|
1450
1520
|
const appID = await getOrPromptAppID({
|
|
1451
1521
|
appID: args["app-id"],
|
|
1452
1522
|
environment,
|
|
@@ -1604,37 +1674,21 @@ var AppUpgrade = class _AppUpgrade extends Command {
|
|
|
1604
1674
|
flags["resource-usage-monitoring"]
|
|
1605
1675
|
);
|
|
1606
1676
|
const logVisibility = logSettings.publicLogs ? "public" : logSettings.logRedirect ? "private" : "off";
|
|
1607
|
-
const { prepared, gasEstimate } = isVerifiable ? await prepareUpgradeFromVerifiableBuild(
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
) : await prepareUpgrade(
|
|
1623
|
-
{
|
|
1624
|
-
appId: appID,
|
|
1625
|
-
privateKey,
|
|
1626
|
-
rpcUrl,
|
|
1627
|
-
environment,
|
|
1628
|
-
dockerfilePath,
|
|
1629
|
-
imageRef,
|
|
1630
|
-
envFilePath,
|
|
1631
|
-
instanceType,
|
|
1632
|
-
logVisibility,
|
|
1633
|
-
resourceUsageMonitoring,
|
|
1634
|
-
skipTelemetry: true
|
|
1635
|
-
},
|
|
1636
|
-
logger
|
|
1637
|
-
);
|
|
1677
|
+
const { prepared, gasEstimate } = isVerifiable ? await compute.app.prepareUpgradeFromVerifiableBuild(appID, {
|
|
1678
|
+
imageRef,
|
|
1679
|
+
imageDigest: verifiableImageDigest,
|
|
1680
|
+
envFile: envFilePath,
|
|
1681
|
+
instanceType,
|
|
1682
|
+
logVisibility,
|
|
1683
|
+
resourceUsageMonitoring
|
|
1684
|
+
}) : await compute.app.prepareUpgrade(appID, {
|
|
1685
|
+
dockerfile: dockerfilePath,
|
|
1686
|
+
imageRef,
|
|
1687
|
+
envFile: envFilePath,
|
|
1688
|
+
instanceType,
|
|
1689
|
+
logVisibility,
|
|
1690
|
+
resourceUsageMonitoring
|
|
1691
|
+
});
|
|
1638
1692
|
this.log(`
|
|
1639
1693
|
Estimated transaction cost: ${chalk.cyan(gasEstimate.maxCostEth)} ETH`);
|
|
1640
1694
|
if (isMainnet(environmentConfig)) {
|
|
@@ -1645,17 +1699,17 @@ ${chalk.gray(`Upgrade cancelled`)}`);
|
|
|
1645
1699
|
return;
|
|
1646
1700
|
}
|
|
1647
1701
|
}
|
|
1648
|
-
const res = await executeUpgrade(
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1702
|
+
const res = await compute.app.executeUpgrade(prepared, {
|
|
1703
|
+
maxFeePerGas: gasEstimate.maxFeePerGas,
|
|
1704
|
+
maxPriorityFeePerGas: gasEstimate.maxPriorityFeePerGas
|
|
1705
|
+
});
|
|
1706
|
+
await compute.app.watchUpgrade(res.appId);
|
|
1707
|
+
try {
|
|
1708
|
+
const cwd = process.env.INIT_CWD || process.cwd();
|
|
1709
|
+
setLinkedAppForDirectory(environment, cwd, res.appId);
|
|
1710
|
+
} catch (err) {
|
|
1711
|
+
this.debug(`Failed to link directory to app: ${err.message}`);
|
|
1712
|
+
}
|
|
1659
1713
|
this.log(
|
|
1660
1714
|
`
|
|
1661
1715
|
\u2705 ${chalk.green(`App upgraded successfully ${chalk.bold(`(id: ${res.appId}, image: ${res.imageRef})`)}`)}`
|