@alchemy/cli 0.7.3 → 0.7.4-alpha.37

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.
@@ -11,8 +11,8 @@ import {
11
11
  prepareLogin,
12
12
  revokeToken,
13
13
  waitForCallback
14
- } from "./chunk-C5HNQOLB.js";
15
- import "./chunk-2BALTY22.js";
14
+ } from "./chunk-WCZIVY4O.js";
15
+ import "./chunk-MYHXAACL.js";
16
16
  export {
17
17
  AUTH_PORT,
18
18
  DEFAULT_EXPIRES_IN_SECONDS,
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
+ import {
4
+ registerAuth,
5
+ selectAppAfterAuth
6
+ } from "./chunk-2OUAYCVA.js";
7
+ import "./chunk-WCZIVY4O.js";
8
+ import "./chunk-AUGBYMHT.js";
9
+ import "./chunk-5HYOZ773.js";
10
+ import "./chunk-HR2UZ6ZU.js";
11
+ import "./chunk-PX2YJ7XC.js";
12
+ import "./chunk-MYHXAACL.js";
13
+ export {
14
+ registerAuth,
15
+ selectAppAfterAuth
16
+ };
@@ -4,14 +4,14 @@ import {
4
4
  completeLogin,
5
5
  prepareLogin,
6
6
  revokeToken
7
- } from "./chunk-C5HNQOLB.js";
7
+ } from "./chunk-WCZIVY4O.js";
8
8
  import {
9
9
  isInteractiveAllowed
10
- } from "./chunk-64A5W4M2.js";
10
+ } from "./chunk-AUGBYMHT.js";
11
11
  import {
12
12
  AdminClient,
13
13
  resolveAuthToken
14
- } from "./chunk-K6V3R7SH.js";
14
+ } from "./chunk-5HYOZ773.js";
15
15
  import {
16
16
  bold,
17
17
  brand,
@@ -20,13 +20,13 @@ import {
20
20
  promptAutocomplete,
21
21
  promptText,
22
22
  withSpinner
23
- } from "./chunk-5IL2PMZ6.js";
23
+ } from "./chunk-HR2UZ6ZU.js";
24
24
  import {
25
25
  configPath,
26
26
  load,
27
27
  maskIf,
28
28
  save
29
- } from "./chunk-JUCUKTP3.js";
29
+ } from "./chunk-PX2YJ7XC.js";
30
30
  import {
31
31
  CLIError,
32
32
  ErrorCode,
@@ -34,7 +34,7 @@ import {
34
34
  exitWithError,
35
35
  isJSONMode,
36
36
  printHuman
37
- } from "./chunk-2BALTY22.js";
37
+ } from "./chunk-MYHXAACL.js";
38
38
 
39
39
  // src/commands/auth.ts
40
40
  function registerAuth(program) {
@@ -4,7 +4,7 @@ import {
4
4
  configDir,
5
5
  load,
6
6
  save
7
- } from "./chunk-JUCUKTP3.js";
7
+ } from "./chunk-PX2YJ7XC.js";
8
8
  import {
9
9
  CLIError,
10
10
  ErrorCode,
@@ -29,7 +29,7 @@ import {
29
29
  parseBaseURLOverride,
30
30
  redactSensitiveText,
31
31
  verbose
32
- } from "./chunk-2BALTY22.js";
32
+ } from "./chunk-MYHXAACL.js";
33
33
 
34
34
  // src/lib/resolve.ts
35
35
  import { readFileSync as readFileSync2 } from "fs";
@@ -884,7 +884,20 @@ var walletSessionEnvironmentSchema = z.object({
884
884
  clientInstanceId: z.string().uuid().optional(),
885
885
  clientInstanceName: z.string().min(1).max(64).optional()
886
886
  }).strict();
887
+ var chainWalletSessionSchema = z.object({
888
+ sessionId: z.string().uuid(),
889
+ status: z.enum(["pending", "approved", "revoked", "expired"]),
890
+ expiresAt: z.string().datetime(),
891
+ chainType: z.enum(["evm", "solana"]),
892
+ walletId: z.string().min(1).optional(),
893
+ walletAddress: z.string().min(1).optional(),
894
+ providerKeyQuorumId: z.string().min(1).optional(),
895
+ providerSignerId: z.string().min(1).optional(),
896
+ capabilities: walletSessionCapabilitiesSchema.optional()
897
+ }).strict();
887
898
  var walletSessionSchema = z.object({
899
+ version: z.number().int().positive().optional(),
900
+ connectionRequestId: z.string().min(1).optional(),
888
901
  sessionId: z.string().uuid(),
889
902
  status: z.enum(["pending", "approved", "revoked", "expired"]),
890
903
  createdAt: z.string().datetime(),
@@ -903,7 +916,11 @@ var walletSessionSchema = z.object({
903
916
  chainType: z.string().min(1).optional(),
904
917
  backendBaseUrl: z.string().min(1).optional(),
905
918
  environment: walletSessionEnvironmentSchema.optional(),
906
- capabilities: walletSessionCapabilitiesSchema.optional()
919
+ capabilities: walletSessionCapabilitiesSchema.optional(),
920
+ sessionsByChain: z.object({
921
+ evm: chainWalletSessionSchema.optional(),
922
+ solana: chainWalletSessionSchema.optional()
923
+ }).strict().optional()
907
924
  }).strict();
908
925
  function sessionPath() {
909
926
  return join(configDir(), SESSION_FILE);
@@ -911,7 +928,59 @@ function sessionPath() {
911
928
  function parseStoredSession(value) {
912
929
  const parsed = walletSessionSchema.safeParse(value);
913
930
  if (!parsed.success) return null;
914
- return parsed.data;
931
+ return withLegacyChainSessions(parsed.data);
932
+ }
933
+ function withLegacyChainSessions(session) {
934
+ if (session.sessionsByChain) {
935
+ return withCompatibilityAliases(session);
936
+ }
937
+ const chainType = session.chainType === "solana" ? "solana" : "evm";
938
+ const walletId = chainType === "solana" ? session.solanaWalletId ?? session.walletId : session.evmWalletId ?? session.walletId;
939
+ const walletAddress = chainType === "solana" ? session.solanaAddress : session.evmAddress;
940
+ return withCompatibilityAliases({
941
+ ...session,
942
+ version: session.version ?? 1,
943
+ sessionsByChain: {
944
+ [chainType]: {
945
+ sessionId: session.sessionId,
946
+ status: session.status,
947
+ expiresAt: session.expiresAt,
948
+ chainType,
949
+ ...walletId ? { walletId } : {},
950
+ ...walletAddress ? { walletAddress } : {},
951
+ ...session.privyKeyQuorumId ? { providerKeyQuorumId: session.privyKeyQuorumId } : {},
952
+ ...session.privySignerId ? { providerSignerId: session.privySignerId } : {},
953
+ ...session.capabilities ? { capabilities: session.capabilities } : {}
954
+ }
955
+ }
956
+ });
957
+ }
958
+ function withCompatibilityAliases(session) {
959
+ const evm = session.sessionsByChain?.evm;
960
+ const solana = session.sessionsByChain?.solana;
961
+ const preferred = evm ?? solana;
962
+ if (!preferred) {
963
+ return session;
964
+ }
965
+ return {
966
+ ...session,
967
+ sessionId: preferred.sessionId,
968
+ status: preferred.status,
969
+ expiresAt: preferred.expiresAt,
970
+ walletId: evm?.walletId ?? solana?.walletId ?? session.walletId,
971
+ evmWalletId: evm?.walletId ?? session.evmWalletId,
972
+ evmAddress: evm?.walletAddress ?? session.evmAddress,
973
+ solanaWalletId: solana?.walletId ?? session.solanaWalletId,
974
+ solanaAddress: solana?.walletAddress ?? session.solanaAddress,
975
+ privyKeyQuorumId: evm?.providerKeyQuorumId ?? solana?.providerKeyQuorumId ?? session.privyKeyQuorumId,
976
+ privySignerId: evm?.providerSignerId ?? solana?.providerSignerId ?? session.privySignerId,
977
+ chainType: evm && solana ? "both" : preferred.chainType,
978
+ capabilities: {
979
+ ...evm?.capabilities ?? {},
980
+ ...solana?.capabilities ?? {},
981
+ ...session.capabilities ?? {}
982
+ }
983
+ };
915
984
  }
916
985
  function loadStoredSessionFromPath(path) {
917
986
  if (!existsSync(path)) return null;
@@ -925,13 +994,23 @@ function isExpired(session) {
925
994
  const expiresAt = new Date(session.expiresAt);
926
995
  return !Number.isNaN(expiresAt.getTime()) && expiresAt <= /* @__PURE__ */ new Date();
927
996
  }
997
+ function isSessionLoadable(session) {
998
+ if (session.sessionsByChain) {
999
+ return Object.values(session.sessionsByChain).some((chainSession) => {
1000
+ return Boolean(
1001
+ chainSession && chainSession.status !== "revoked" && !isExpired(chainSession)
1002
+ );
1003
+ });
1004
+ }
1005
+ if (session.status === "revoked") return false;
1006
+ return !isExpired(session);
1007
+ }
928
1008
  function createFileWalletSessionStore(path = sessionPath()) {
929
1009
  return {
930
1010
  load() {
931
1011
  const session = loadStoredSessionFromPath(path);
932
1012
  if (!session) return null;
933
- if (session.status === "revoked") return null;
934
- if (isExpired(session)) return null;
1013
+ if (!isSessionLoadable(session)) return null;
935
1014
  return session;
936
1015
  },
937
1016
  loadRaw() {
@@ -975,6 +1054,7 @@ function createPendingSession() {
975
1054
  const now = /* @__PURE__ */ new Date();
976
1055
  const expiresAt = new Date(now.getTime() + SESSION_TTL_DAYS * 24 * 60 * 60 * 1e3);
977
1056
  const session = {
1057
+ version: 2,
978
1058
  sessionId: randomUUID(),
979
1059
  status: "pending",
980
1060
  createdAt: now.toISOString(),
@@ -997,12 +1077,12 @@ function loadStoredSession() {
997
1077
  return store.load();
998
1078
  }
999
1079
  function saveSession(session) {
1000
- getWalletSessionStore().save(session);
1080
+ getWalletSessionStore().save(withCompatibilityAliases(session));
1001
1081
  }
1002
1082
  function updateSession(updates) {
1003
1083
  const session = loadSession();
1004
1084
  if (!session) return null;
1005
- const updated = { ...session, ...updates };
1085
+ const updated = withCompatibilityAliases({ ...session, ...updates });
1006
1086
  saveSession(updated);
1007
1087
  return updated;
1008
1088
  }
@@ -1010,11 +1090,52 @@ function clearSession() {
1010
1090
  return getWalletSessionStore().clear();
1011
1091
  }
1012
1092
  function isSessionValid(session) {
1093
+ if (session.sessionsByChain) {
1094
+ return Object.values(session.sessionsByChain).some((chainSession) => {
1095
+ return Boolean(chainSession && isChainSessionValid(chainSession));
1096
+ });
1097
+ }
1013
1098
  if (session.status !== "approved") return false;
1014
1099
  const expiresAt = new Date(session.expiresAt);
1015
1100
  if (Number.isNaN(expiresAt.getTime())) return false;
1016
1101
  return expiresAt > /* @__PURE__ */ new Date();
1017
1102
  }
1103
+ function isChainSessionValid(session) {
1104
+ if (session.status !== "approved") return false;
1105
+ const expiresAt = new Date(session.expiresAt);
1106
+ if (Number.isNaN(expiresAt.getTime())) return false;
1107
+ return expiresAt > /* @__PURE__ */ new Date();
1108
+ }
1109
+ function getWalletSessionByChain(session, chainType) {
1110
+ const chainSession = session.sessionsByChain?.[chainType];
1111
+ if (!chainSession) {
1112
+ if (!isSessionValid(session)) return null;
1113
+ if (chainType === "evm" && session.evmAddress) return session;
1114
+ if (chainType === "solana" && session.solanaAddress) return session;
1115
+ return null;
1116
+ }
1117
+ if (!isChainSessionValid(chainSession)) {
1118
+ return null;
1119
+ }
1120
+ return withCompatibilityAliases({
1121
+ ...session,
1122
+ sessionId: chainSession.sessionId,
1123
+ status: chainSession.status,
1124
+ expiresAt: chainSession.expiresAt,
1125
+ walletId: chainSession.walletId,
1126
+ evmWalletId: chainType === "evm" ? chainSession.walletId : session.evmWalletId,
1127
+ evmAddress: chainType === "evm" ? chainSession.walletAddress : session.evmAddress,
1128
+ solanaWalletId: chainType === "solana" ? chainSession.walletId : session.solanaWalletId,
1129
+ solanaAddress: chainType === "solana" ? chainSession.walletAddress : session.solanaAddress,
1130
+ privyKeyQuorumId: chainSession.providerKeyQuorumId,
1131
+ privySignerId: chainSession.providerSignerId,
1132
+ chainType,
1133
+ capabilities: chainSession.capabilities ?? session.capabilities,
1134
+ sessionsByChain: {
1135
+ [chainType]: chainSession
1136
+ }
1137
+ });
1138
+ }
1018
1139
 
1019
1140
  // src/lib/resolve.ts
1020
1141
  function getCommandOptions(program) {
@@ -1249,6 +1370,7 @@ export {
1249
1370
  updateSession,
1250
1371
  clearSession,
1251
1372
  isSessionValid,
1373
+ getWalletSessionByChain,
1252
1374
  resolveAPIKey,
1253
1375
  resolveAccessKey,
1254
1376
  resolveNetwork,
@@ -2,10 +2,10 @@
2
2
  if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  configPath
5
- } from "./chunk-JUCUKTP3.js";
5
+ } from "./chunk-PX2YJ7XC.js";
6
6
  import {
7
7
  esc
8
- } from "./chunk-2BALTY22.js";
8
+ } from "./chunk-MYHXAACL.js";
9
9
 
10
10
  // src/lib/update-check.ts
11
11
  import { execFileSync } from "child_process";
@@ -53,7 +53,7 @@ function semverLT(a, b) {
53
53
  return false;
54
54
  }
55
55
  function currentVersion() {
56
- return true ? "0.7.3" : "0.0.0";
56
+ return true ? "0.7.4-alpha.37" : "0.0.0";
57
57
  }
58
58
  function toUpdateStatus(latestVersion, checkedAt) {
59
59
  const current = currentVersion();
@@ -2,7 +2,7 @@
2
2
  if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  isJSONMode
5
- } from "./chunk-2BALTY22.js";
5
+ } from "./chunk-MYHXAACL.js";
6
6
 
7
7
  // src/lib/interaction.ts
8
8
  import { stdin, stdout } from "process";
@@ -5,7 +5,7 @@ import {
5
5
  isJSONMode,
6
6
  quiet,
7
7
  rgb
8
- } from "./chunk-2BALTY22.js";
8
+ } from "./chunk-MYHXAACL.js";
9
9
 
10
10
  // src/lib/terminal-ui.ts
11
11
  import * as readline from "readline";
@@ -448,8 +448,8 @@ function errAppRequired() {
448
448
  function errWalletKeyRequired() {
449
449
  return new CLIError(
450
450
  ErrorCode.AUTH_REQUIRED,
451
- "Wallet key required for x402. Set ALCHEMY_WALLET_KEY, run 'alchemy wallet connect --mode local --chain evm', or use --wallet-key-file.",
452
- "alchemy wallet connect --mode local --chain evm"
451
+ "Wallet key required for x402. Set ALCHEMY_WALLET_KEY, run 'alchemy wallet connect --mode local', or use --wallet-key-file.",
452
+ "alchemy wallet connect --mode local"
453
453
  );
454
454
  }
455
455
  function errSessionExpired() {
@@ -469,8 +469,8 @@ function errNoActiveSession() {
469
469
  function errSolanaWalletKeyRequired() {
470
470
  return new CLIError(
471
471
  ErrorCode.AUTH_REQUIRED,
472
- "Solana wallet key required. Set ALCHEMY_SOLANA_WALLET_KEY, run 'alchemy wallet connect --mode local --chain solana', or use --solana-wallet-key-file.",
473
- "alchemy wallet connect --mode local --chain solana"
472
+ "Solana wallet key required. Set ALCHEMY_SOLANA_WALLET_KEY, run 'alchemy wallet connect --mode local', or use --solana-wallet-key-file.",
473
+ "alchemy wallet connect --mode local"
474
474
  );
475
475
  }
476
476
  function errSolanaTransactionFailed(details) {
@@ -2,7 +2,7 @@
2
2
  if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  isRevealMode
5
- } from "./chunk-2BALTY22.js";
5
+ } from "./chunk-MYHXAACL.js";
6
6
 
7
7
  // src/lib/secrets.ts
8
8
  function maskSecret(value) {
@@ -2,11 +2,11 @@
2
2
  if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  isInteractiveAllowed
5
- } from "./chunk-64A5W4M2.js";
5
+ } from "./chunk-AUGBYMHT.js";
6
6
  import {
7
7
  resolveAuthToken,
8
8
  resolveWalletSession
9
- } from "./chunk-K6V3R7SH.js";
9
+ } from "./chunk-5HYOZ773.js";
10
10
 
11
11
  // src/lib/onboarding.ts
12
12
  var SETUP_CAPABILITY_ORDER = [
@@ -74,14 +74,14 @@ function getSetupCapabilities(cfg) {
74
74
  missing: hasLocalWallet || hasSessionWallet ? [] : ["wallet signer"],
75
75
  nextCommands: hasLocalWallet || hasSessionWallet ? [] : [
76
76
  "alchemy wallet connect",
77
- "alchemy wallet connect --mode local --chain evm"
77
+ "alchemy wallet connect --mode local"
78
78
  ]
79
79
  }),
80
80
  x402: capabilityStatus({
81
81
  complete: x402Ready,
82
82
  satisfiedBy: x402Ready ? "x402_wallet" : null,
83
83
  missing: x402Ready ? [] : ["x402 enabled with wallet key file"],
84
- nextCommands: x402Ready ? [] : ["alchemy wallet connect --mode local --chain evm && alchemy config set x402 true"]
84
+ nextCommands: x402Ready ? [] : ["alchemy wallet connect --mode local && alchemy config set x402 true"]
85
85
  })
86
86
  };
87
87
  }
@@ -115,7 +115,7 @@ function getSetupStatus(cfg) {
115
115
  "alchemy auth",
116
116
  "alchemy config set app",
117
117
  "alchemy config set access-key <key> && alchemy config set app <app-id>",
118
- "alchemy wallet connect --mode local --chain evm && alchemy config set x402 true"
118
+ "alchemy wallet connect --mode local && alchemy config set x402 true"
119
119
  ],
120
120
  capabilities
121
121
  };
@@ -2,7 +2,7 @@
2
2
  if(process.argv.includes("--no-color"))process.env.NO_COLOR="1";
3
3
  import {
4
4
  getBaseDomain
5
- } from "./chunk-2BALTY22.js";
5
+ } from "./chunk-MYHXAACL.js";
6
6
 
7
7
  // src/lib/auth.ts
8
8
  import { createHash, randomBytes } from "crypto";
@@ -26,7 +26,7 @@ import {
26
26
  exitWithError,
27
27
  isReplMode,
28
28
  setReplMode
29
- } from "./chunk-2BALTY22.js";
29
+ } from "./chunk-MYHXAACL.js";
30
30
  export {
31
31
  CLIError,
32
32
  EXIT_CODES,