@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.
Files changed (71) hide show
  1. package/VERSION +2 -2
  2. package/dist/commands/auth/generate.js +4 -4
  3. package/dist/commands/auth/generate.js.map +1 -1
  4. package/dist/commands/auth/login.js +2 -2
  5. package/dist/commands/auth/login.js.map +1 -1
  6. package/dist/commands/auth/logout.js +2 -2
  7. package/dist/commands/auth/logout.js.map +1 -1
  8. package/dist/commands/auth/migrate.js +2 -2
  9. package/dist/commands/auth/migrate.js.map +1 -1
  10. package/dist/commands/auth/whoami.js +7 -5
  11. package/dist/commands/auth/whoami.js.map +1 -1
  12. package/dist/commands/billing/cancel.js +9 -7
  13. package/dist/commands/billing/cancel.js.map +1 -1
  14. package/dist/commands/billing/status.js +8 -5
  15. package/dist/commands/billing/status.js.map +1 -1
  16. package/dist/commands/billing/subscribe.js +14 -10
  17. package/dist/commands/billing/subscribe.js.map +1 -1
  18. package/dist/commands/compute/app/create.js +2 -2
  19. package/dist/commands/compute/app/create.js.map +1 -1
  20. package/dist/commands/compute/app/deploy.js +105 -105
  21. package/dist/commands/compute/app/deploy.js.map +1 -1
  22. package/dist/commands/compute/app/info.js +55 -8
  23. package/dist/commands/compute/app/info.js.map +1 -1
  24. package/dist/commands/compute/app/list.js +8 -9
  25. package/dist/commands/compute/app/list.js.map +1 -1
  26. package/dist/commands/compute/app/logs.js +58 -11
  27. package/dist/commands/compute/app/logs.js.map +1 -1
  28. package/dist/commands/compute/app/profile/set.js +147 -22
  29. package/dist/commands/compute/app/profile/set.js.map +1 -1
  30. package/dist/commands/compute/app/releases.js +110 -143
  31. package/dist/commands/compute/app/releases.js.map +1 -1
  32. package/dist/commands/compute/app/start.js +58 -11
  33. package/dist/commands/compute/app/start.js.map +1 -1
  34. package/dist/commands/compute/app/stop.js +58 -11
  35. package/dist/commands/compute/app/stop.js.map +1 -1
  36. package/dist/commands/compute/app/terminate.js +58 -11
  37. package/dist/commands/compute/app/terminate.js.map +1 -1
  38. package/dist/commands/compute/app/upgrade.js +121 -67
  39. package/dist/commands/compute/app/upgrade.js.map +1 -1
  40. package/dist/commands/compute/build/info.js +8 -9
  41. package/dist/commands/compute/build/info.js.map +1 -1
  42. package/dist/commands/compute/build/list.js +50 -131
  43. package/dist/commands/compute/build/list.js.map +1 -1
  44. package/dist/commands/compute/build/logs.js +9 -10
  45. package/dist/commands/compute/build/logs.js.map +1 -1
  46. package/dist/commands/compute/build/status.js +9 -10
  47. package/dist/commands/compute/build/status.js.map +1 -1
  48. package/dist/commands/compute/build/submit.js +8 -9
  49. package/dist/commands/compute/build/submit.js.map +1 -1
  50. package/dist/commands/compute/build/verify.js +59 -12
  51. package/dist/commands/compute/build/verify.js.map +1 -1
  52. package/dist/commands/compute/environment/list.js +2 -2
  53. package/dist/commands/compute/environment/list.js.map +1 -1
  54. package/dist/commands/compute/environment/set.js +2 -2
  55. package/dist/commands/compute/environment/set.js.map +1 -1
  56. package/dist/commands/compute/environment/show.js +2 -2
  57. package/dist/commands/compute/environment/show.js.map +1 -1
  58. package/dist/commands/compute/undelegate.js +8 -9
  59. package/dist/commands/compute/undelegate.js.map +1 -1
  60. package/dist/commands/{telemetry.js → telemetry/disable.js} +15 -64
  61. package/dist/commands/telemetry/disable.js.map +1 -0
  62. package/dist/commands/telemetry/enable.js +164 -0
  63. package/dist/commands/telemetry/enable.js.map +1 -0
  64. package/dist/commands/telemetry/status.js +159 -0
  65. package/dist/commands/telemetry/status.js.map +1 -0
  66. package/dist/commands/upgrade.js +2 -2
  67. package/dist/commands/upgrade.js.map +1 -1
  68. package/dist/commands/version.js +2 -2
  69. package/dist/commands/version.js.map +1 -1
  70. package/package.json +4 -2
  71. 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 === true
132
- // Only enabled if explicitly set to true
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 choices = Object.entries(allApps).map(([name, appID]) => {
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 logger = {
1441
- info: (msg) => this.log(msg),
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 = await getPrivateKeyInteractive(flags["private-key"]);
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
- appId: appID,
1610
- privateKey,
1611
- rpcUrl,
1612
- environment,
1613
- imageRef,
1614
- imageDigest: verifiableImageDigest,
1615
- envFilePath,
1616
- instanceType,
1617
- logVisibility,
1618
- resourceUsageMonitoring,
1619
- skipTelemetry: true
1620
- },
1621
- logger
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
- prepared,
1650
- {
1651
- maxFeePerGas: gasEstimate.maxFeePerGas,
1652
- maxPriorityFeePerGas: gasEstimate.maxPriorityFeePerGas
1653
- },
1654
- logger,
1655
- true
1656
- // skipTelemetry
1657
- );
1658
- await watchUpgrade(res.appId, privateKey, rpcUrl, environment, logger, getClientId(), true);
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})`)}`)}`