@alchemy/cli 0.11.0 → 0.11.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.
@@ -3,10 +3,10 @@ if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  registerAuth,
5
5
  selectAppAfterAuth
6
- } from "./chunk-XZS6KZHN.js";
6
+ } from "./chunk-ILPOKA4Y.js";
7
7
  import "./chunk-I6YQX7PF.js";
8
8
  import "./chunk-RPSHRYCZ.js";
9
- import "./chunk-B5KVL3ZR.js";
9
+ import "./chunk-OL5MEN62.js";
10
10
  import "./chunk-DXQAGBW6.js";
11
11
  import "./chunk-LANOFNO6.js";
12
12
  import "./chunk-5BEJA752.js";
@@ -3,7 +3,7 @@ if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  gasManagerClientFromFlags,
5
5
  toAdminNetworkId
6
- } from "./chunk-B5KVL3ZR.js";
6
+ } from "./chunk-OL5MEN62.js";
7
7
  import {
8
8
  dim,
9
9
  green,
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  AdminClient,
13
13
  resolveAuthToken
14
- } from "./chunk-B5KVL3ZR.js";
14
+ } from "./chunk-OL5MEN62.js";
15
15
  import {
16
16
  bold,
17
17
  brand,
@@ -624,6 +624,11 @@ var Client = class _Client {
624
624
  if (networkNotEnabled) return networkNotEnabled;
625
625
  return errInvalidAPIKey(detail || void 0);
626
626
  }
627
+ isWrappedNetworkFailure(err) {
628
+ return err.status === void 0 && err.code === -32e3 && /\b(fetch failed|failed to fetch|network error|econnrefused|enotfound|etimedout|eai_again|socket hang up)\b/i.test(
629
+ err.message
630
+ );
631
+ }
627
632
  tryParseRPCError(text) {
628
633
  try {
629
634
  const parsed = JSON.parse(text);
@@ -673,7 +678,7 @@ var Client = class _Client {
673
678
  if (err.status !== void 0) {
674
679
  throw errNetwork(`HTTP ${err.status}: ${err.message}`);
675
680
  }
676
- if (this.isFetchFailureError(err)) {
681
+ if (this.isWrappedNetworkFailure(err)) {
677
682
  throw errNetwork(err.message);
678
683
  }
679
684
  throw errRPC(err.code, err.message);
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  resolveAuthToken,
8
8
  resolveWalletSession
9
- } from "./chunk-B5KVL3ZR.js";
9
+ } from "./chunk-OL5MEN62.js";
10
10
 
11
11
  // src/lib/onboarding.ts
12
12
  var SETUP_CAPABILITY_ORDER = [
@@ -53,7 +53,7 @@ function semverLT(a, b) {
53
53
  return false;
54
54
  }
55
55
  function currentVersion() {
56
- return true ? "0.11.0" : "0.0.0";
56
+ return true ? "0.11.1" : "0.0.0";
57
57
  }
58
58
  function toUpdateStatus(latestVersion, checkedAt) {
59
59
  const current = currentVersion();
package/dist/index.js CHANGED
@@ -5,10 +5,10 @@ import {
5
5
  errNotLoggedInForPolicyLookup,
6
6
  errSponsorshipNeedsPolicy,
7
7
  selectOrCreatePolicy
8
- } from "./chunk-KIYIW6SX.js";
8
+ } from "./chunk-CJDHJYLM.js";
9
9
  import {
10
10
  registerAuth
11
- } from "./chunk-XZS6KZHN.js";
11
+ } from "./chunk-ILPOKA4Y.js";
12
12
  import {
13
13
  openBrowser
14
14
  } from "./chunk-I6YQX7PF.js";
@@ -18,7 +18,7 @@ import {
18
18
  getSetupStatus,
19
19
  isSetupComplete,
20
20
  shouldRunOnboarding
21
- } from "./chunk-CSBYGYG6.js";
21
+ } from "./chunk-QWLBZTG5.js";
22
22
  import {
23
23
  isInteractiveAllowed
24
24
  } from "./chunk-RPSHRYCZ.js";
@@ -63,12 +63,12 @@ import {
63
63
  updateSession,
64
64
  validateNetwork,
65
65
  walletNetworkToChain
66
- } from "./chunk-B5KVL3ZR.js";
66
+ } from "./chunk-OL5MEN62.js";
67
67
  import {
68
68
  getAvailableUpdate,
69
69
  getUpdateStatus,
70
70
  printUpdateNotice
71
- } from "./chunk-4QSVWWSK.js";
71
+ } from "./chunk-SRGDGXY5.js";
72
72
  import {
73
73
  bold,
74
74
  brand,
@@ -133,11 +133,13 @@ import {
133
133
  isJSONMode,
134
134
  isLocalhost,
135
135
  isReplMode,
136
+ isRevealMode,
136
137
  noColor,
137
138
  parseBaseURLOverride,
138
139
  printHuman,
139
140
  printJSON,
140
141
  quiet,
142
+ redactSensitiveText,
141
143
  setFlags,
142
144
  setNoColor,
143
145
  timeout,
@@ -579,8 +581,8 @@ function registerConfig(program2) {
579
581
  "Interactive policy selection requires an interactive terminal. Pass an ID: `alchemy config set evm-gas-policy-id <id>`."
580
582
  );
581
583
  }
582
- const { selectOrCreatePolicy: selectOrCreatePolicy2 } = await import("./policy-prompt-3EVE7DW3.js");
583
- const { resolveNetwork: resolveNetwork2 } = await import("./resolve-FRMIY357.js");
584
+ const { selectOrCreatePolicy: selectOrCreatePolicy2 } = await import("./policy-prompt-YU6L2VJZ.js");
585
+ const { resolveNetwork: resolveNetwork2 } = await import("./resolve-WXXPXPCU.js");
584
586
  const network = resolveNetwork2(program2);
585
587
  await selectOrCreatePolicy2({
586
588
  flavor: "sponsorship",
@@ -634,8 +636,8 @@ function registerConfig(program2) {
634
636
  "Interactive policy selection requires an interactive terminal. Pass an ID: `alchemy config set solana-fee-policy-id <id>`."
635
637
  );
636
638
  }
637
- const { selectOrCreatePolicy: selectOrCreatePolicy2 } = await import("./policy-prompt-3EVE7DW3.js");
638
- const { resolveSolanaNetwork: resolveSolanaNetwork2 } = await import("./resolve-FRMIY357.js");
639
+ const { selectOrCreatePolicy: selectOrCreatePolicy2 } = await import("./policy-prompt-YU6L2VJZ.js");
640
+ const { resolveSolanaNetwork: resolveSolanaNetwork2 } = await import("./resolve-WXXPXPCU.js");
639
641
  const network = resolveSolanaNetwork2(program2);
640
642
  await selectOrCreatePolicy2({
641
643
  flavor: "solana",
@@ -692,7 +694,7 @@ function registerConfig(program2) {
692
694
  printJSON(toMap(cfg));
693
695
  return;
694
696
  }
695
- const { resolveAuthToken: resolveAuthToken2 } = await import("./resolve-FRMIY357.js");
697
+ const { resolveAuthToken: resolveAuthToken2 } = await import("./resolve-WXXPXPCU.js");
696
698
  const validToken = resolveAuthToken2(cfg);
697
699
  const authStatus = cfg.auth_token ? validToken ? `${green("\u2713")} authenticated${cfg.auth_token_expires_at ? ` ${dim(`(expires ${cfg.auth_token_expires_at})`)}` : ""}` : `${yellow("\u25C6")} expired${cfg.auth_token_expires_at ? ` ${dim(`(${cfg.auth_token_expires_at})`)}` : ""}` : dim("(not set) \u2014 run 'alchemy auth' to log in");
698
700
  const pairs = [
@@ -827,12 +829,24 @@ function registerVersion(program2) {
827
829
  }
828
830
 
829
831
  // src/commands/apps.ts
832
+ function redactAppUrl(value) {
833
+ return isRevealMode() ? value : redactSensitiveText(value);
834
+ }
830
835
  function maskAppSecrets(app) {
831
- return {
836
+ const masked = {
832
837
  ...app,
833
838
  ...app.apiKey !== void 0 && { apiKey: maskIf(app.apiKey) },
834
839
  ...app.webhookApiKey !== void 0 && { webhookApiKey: maskIf(app.webhookApiKey) }
835
840
  };
841
+ if (app.chainNetworks !== void 0) {
842
+ masked.chainNetworks = app.chainNetworks.map((network) => ({
843
+ ...network,
844
+ ...network.rpcUrl !== void 0 && { rpcUrl: redactAppUrl(network.rpcUrl) },
845
+ ...network.wsUrl !== void 0 && { wsUrl: redactAppUrl(network.wsUrl) },
846
+ ...network.grpcUrl !== void 0 && { grpcUrl: redactAppUrl(network.grpcUrl) }
847
+ }));
848
+ }
849
+ return masked;
836
850
  }
837
851
  function printFetchSummary(appsCount, pagesCount, opts) {
838
852
  const suffix = opts?.suffix ? ` ${opts.suffix}` : "";
@@ -3164,6 +3178,24 @@ function resolveWebhookApiKey(opts) {
3164
3178
  const cfg = load();
3165
3179
  return opts?.webhookApiKey || opts?.notifyToken || process.env.ALCHEMY_WEBHOOK_API_KEY || process.env.ALCHEMY_NOTIFY_AUTH_TOKEN || cfg.webhook_api_key || cfg.app?.webhookApiKey;
3166
3180
  }
3181
+ function isWebhookSigningKey(key) {
3182
+ const normalized = key.replace(/[^a-z0-9]/gi, "").toLowerCase();
3183
+ return (normalized.includes("signing") || normalized.includes("hmac")) && (normalized.includes("key") || normalized.includes("secret"));
3184
+ }
3185
+ function maskWebhookSecrets(value) {
3186
+ if (Array.isArray(value)) {
3187
+ return value.map(maskWebhookSecrets);
3188
+ }
3189
+ if (value && typeof value === "object") {
3190
+ return Object.fromEntries(
3191
+ Object.entries(value).map(([key, nested]) => [
3192
+ key,
3193
+ isWebhookSigningKey(key) && typeof nested === "string" ? maskIf(nested) : maskWebhookSecrets(nested)
3194
+ ])
3195
+ );
3196
+ }
3197
+ return value;
3198
+ }
3167
3199
  function registerWebhooks(program2) {
3168
3200
  const cmd = program2.command("webhook").description("Notify API wrappers");
3169
3201
  cmd.option("--webhook-api-key <key>", "Webhook API key").option("--notify-token <token>", "Deprecated alias for webhook API key");
@@ -3175,8 +3207,9 @@ function registerWebhooks(program2) {
3175
3207
  "Webhooks fetched",
3176
3208
  () => callNotify(token, "/team-webhooks")
3177
3209
  );
3178
- if (isJSONMode()) printJSON(result);
3179
- else printSyntaxJSON(result);
3210
+ const output = maskWebhookSecrets(result);
3211
+ if (isJSONMode()) printJSON(output);
3212
+ else printSyntaxJSON(output);
3180
3213
  } catch (err) {
3181
3214
  exitWithError(err);
3182
3215
  }
@@ -8360,13 +8393,7 @@ Examples:
8360
8393
  return;
8361
8394
  }
8362
8395
  const client = clientFromFlags(program2);
8363
- const parsed = params.map((p) => {
8364
- try {
8365
- return JSON.parse(p);
8366
- } catch {
8367
- return p;
8368
- }
8369
- });
8396
+ const parsed = parseRPCParams(params);
8370
8397
  debug(`rpc ${method} %o`, parsed);
8371
8398
  const result = await withSpinner(
8372
8399
  `Calling ${method}\u2026`,
@@ -8380,6 +8407,13 @@ Examples:
8380
8407
  });
8381
8408
  registerEvmRpcSurfaceCommands(program2, cmd);
8382
8409
  }
8410
+ function parseRPCParams(params) {
8411
+ const parsed = parseCLIParams(params);
8412
+ if (parsed.length === 1 && Array.isArray(parsed[0])) {
8413
+ return parsed[0];
8414
+ }
8415
+ return parsed;
8416
+ }
8383
8417
  function outputRpcHelp(cmd, method, params) {
8384
8418
  if (method !== "help") {
8385
8419
  return false;
@@ -10356,7 +10390,7 @@ async function flushProcessOutput() {
10356
10390
  }
10357
10391
  program.name("alchemy").description(
10358
10392
  "The Alchemy CLI lets you query blockchain data, call JSON-RPC methods, and manage your Alchemy configuration."
10359
- ).version("0.11.0", "-v, --version", "display CLI version").option("--api-key <key>", "Alchemy API key (env: ALCHEMY_API_KEY)").option(
10393
+ ).version("0.11.1", "-v, --version", "display CLI version").option("--api-key <key>", "Alchemy API key (env: ALCHEMY_API_KEY)").option(
10360
10394
  "-n, --network <network>",
10361
10395
  "Target network for networked commands"
10362
10396
  ).option("--x402", "Use x402 wallet-based gateway auth").option(
@@ -10543,11 +10577,11 @@ ${styledLine}`;
10543
10577
  "wallet"
10544
10578
  ];
10545
10579
  if (!skipAppPrompt.includes(cmdName) && isInteractiveAllowed(program) && !opts.apiKey && !process.env.ALCHEMY_API_KEY) {
10546
- const { resolveAuthToken: resolveAuthToken2 } = await import("./resolve-FRMIY357.js");
10580
+ const { resolveAuthToken: resolveAuthToken2 } = await import("./resolve-WXXPXPCU.js");
10547
10581
  const authToken = resolveAuthToken2(cfg);
10548
10582
  const hasApiKey = Boolean(cfg.api_key?.trim() || cfg.app?.apiKey);
10549
10583
  if (authToken && !hasApiKey) {
10550
- const { selectAppAfterAuth } = await import("./auth-6X2DBBYQ.js");
10584
+ const { selectAppAfterAuth } = await import("./auth-AU7LPEQL.js");
10551
10585
  console.log("");
10552
10586
  console.log(` No app selected. Please select an app to continue.`);
10553
10587
  await selectAppAfterAuth(authToken);
@@ -10582,7 +10616,7 @@ ${styledLine}`;
10582
10616
  if (isInteractiveAllowed(program)) {
10583
10617
  let latestForInteractiveStartup = null;
10584
10618
  if (shouldRunOnboarding(program, cfg)) {
10585
- const { runOnboarding } = await import("./onboarding-2FLKQYLY.js");
10619
+ const { runOnboarding } = await import("./onboarding-QOZOX4CZ.js");
10586
10620
  const latest = getAvailableUpdateOnce();
10587
10621
  const completed = await runOnboarding(program, latest);
10588
10622
  updateShownDuringInteractiveStartup = Boolean(latest);
@@ -10596,7 +10630,7 @@ ${styledLine}`;
10596
10630
  latestForInteractiveStartup
10597
10631
  );
10598
10632
  }
10599
- const { startREPL } = await import("./interactive-EXQM6HWQ.js");
10633
+ const { startREPL } = await import("./interactive-NPBITOGO.js");
10600
10634
  program.exitOverride();
10601
10635
  program.configureOutput({
10602
10636
  writeErr: () => {
@@ -2,14 +2,14 @@
2
2
  if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  getSetupMethod
5
- } from "./chunk-CSBYGYG6.js";
5
+ } from "./chunk-QWLBZTG5.js";
6
6
  import "./chunk-RPSHRYCZ.js";
7
7
  import {
8
8
  getRPCNetworkIds
9
- } from "./chunk-B5KVL3ZR.js";
9
+ } from "./chunk-OL5MEN62.js";
10
10
  import {
11
11
  getUpdateNoticeLines
12
- } from "./chunk-4QSVWWSK.js";
12
+ } from "./chunk-SRGDGXY5.js";
13
13
  import {
14
14
  bold,
15
15
  brand,
@@ -2,7 +2,7 @@
2
2
  if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  getUpdateNoticeLines
5
- } from "./chunk-4QSVWWSK.js";
5
+ } from "./chunk-SRGDGXY5.js";
6
6
  import {
7
7
  bold,
8
8
  brand,
@@ -51,7 +51,7 @@ async function runOnboarding(_program, latestUpdate = null) {
51
51
  auth_token_expires_at: result.expiresAt
52
52
  });
53
53
  console.log(` ${green("\u2713")} Logged in successfully`);
54
- const { selectAppAfterAuth } = await import("./auth-6X2DBBYQ.js");
54
+ const { selectAppAfterAuth } = await import("./auth-AU7LPEQL.js");
55
55
  await selectAppAfterAuth(result.token);
56
56
  return true;
57
57
  } catch (err) {
@@ -5,8 +5,8 @@ import {
5
5
  errNotLoggedInForPolicyLookup,
6
6
  errSponsorshipNeedsPolicy,
7
7
  selectOrCreatePolicy
8
- } from "./chunk-KIYIW6SX.js";
9
- import "./chunk-B5KVL3ZR.js";
8
+ } from "./chunk-CJDHJYLM.js";
9
+ import "./chunk-OL5MEN62.js";
10
10
  import "./chunk-DXQAGBW6.js";
11
11
  import "./chunk-LANOFNO6.js";
12
12
  import "./chunk-5BEJA752.js";
@@ -26,7 +26,7 @@ import {
26
26
  resolveWalletSession,
27
27
  resolveX402,
28
28
  resolveX402Client
29
- } from "./chunk-B5KVL3ZR.js";
29
+ } from "./chunk-OL5MEN62.js";
30
30
  import "./chunk-LANOFNO6.js";
31
31
  import "./chunk-5BEJA752.js";
32
32
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alchemy/cli",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "description": "Alchemy CLI — interact with blockchain data",
5
5
  "type": "module",
6
6
  "bin": {