@chest-gate/cli 0.4.1 → 0.4.3
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsBpC,eAAO,MAAM,YAAY,SAkGrB,CAAC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import chalk from "chalk";
|
|
3
|
-
import { createServer } from "node:http";
|
|
4
|
-
import { createHash, randomBytes } from "node:crypto";
|
|
5
3
|
import { hostname } from "node:os";
|
|
6
4
|
import { createInterface } from "node:readline/promises";
|
|
7
5
|
import { stdin, stdout } from "node:process";
|
|
8
|
-
import
|
|
6
|
+
import { runPkceLogin, PkceLoginError } from "@chest-gate/auth-flow";
|
|
9
7
|
import { loadCredentials, saveCredentials, getDefaultGateUrl, getDefaultWebUrl, } from "../credentials.js";
|
|
10
|
-
const LOGIN_TIMEOUT_MS = 5 * 60 * 1000;
|
|
11
8
|
export const loginCommand = new Command("login")
|
|
12
9
|
.description("Sign in to Chest. Opens a browser, returns a CLI token to this device.")
|
|
13
10
|
.option("--web-url <url>", "Override chest.sh URL", getDefaultWebUrl())
|
|
@@ -42,187 +39,55 @@ export const loginCommand = new Command("login")
|
|
|
42
39
|
}
|
|
43
40
|
const webUrl = (opts.webUrl || getDefaultWebUrl()).replace(/\/$/, "");
|
|
44
41
|
const gateUrl = (opts.gateUrl || getDefaultGateUrl()).replace(/\/$/, "");
|
|
45
|
-
const verifier = base64url(randomBytes(32));
|
|
46
|
-
const challenge = base64url(createHash("sha256").update(verifier).digest());
|
|
47
|
-
const state = base64url(randomBytes(24));
|
|
48
|
-
const host = hostname() || "unknown";
|
|
49
42
|
const portArg = opts.port ? parseInt(opts.port, 10) : 0;
|
|
50
43
|
if (opts.port && (!Number.isFinite(portArg) || portArg < 0 || portArg > 65535)) {
|
|
51
44
|
console.error(chalk.red(` Invalid --port: ${opts.port}`));
|
|
52
45
|
process.exit(1);
|
|
53
46
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
47
|
+
let result;
|
|
48
|
+
try {
|
|
49
|
+
result = await runPkceLogin({
|
|
50
|
+
webUrl,
|
|
51
|
+
gateUrl,
|
|
52
|
+
hostname: hostname() || "unknown",
|
|
53
|
+
desiredPort: portArg,
|
|
54
|
+
openBrowser: opts.noBrowser !== true,
|
|
55
|
+
onListen: ({ loginUrl, port }) => {
|
|
56
|
+
console.log(chalk.gray(" Opening browser to authorize this device…"));
|
|
57
|
+
console.log(chalk.gray(" If it doesn't open, visit:"));
|
|
58
|
+
console.log(chalk.cyan(` ${loginUrl}`));
|
|
59
|
+
console.log();
|
|
60
|
+
console.log(chalk.gray(` Listening on http://127.0.0.1:${port}/callback`));
|
|
61
|
+
console.log();
|
|
62
|
+
process.stdout.write(chalk.gray(" Exchanging code… "));
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
console.log(chalk.green("done"));
|
|
65
66
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (!exchanged.ok) {
|
|
73
|
-
console.log(chalk.red("failed"));
|
|
74
|
-
console.error(chalk.red(`\n ✗ ${exchanged.error}\n`));
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (err instanceof PkceLoginError && err.kind === "exchange") {
|
|
69
|
+
console.log(chalk.red("failed"));
|
|
70
|
+
}
|
|
71
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
72
|
+
console.error(chalk.red(`\n ✗ ${message}\n`));
|
|
75
73
|
process.exit(1);
|
|
76
74
|
}
|
|
77
|
-
console.log(chalk.green("done"));
|
|
78
75
|
const creds = {
|
|
79
76
|
version: 1,
|
|
80
|
-
token:
|
|
81
|
-
ownerWallet:
|
|
82
|
-
tokenId:
|
|
83
|
-
label:
|
|
77
|
+
token: result.token,
|
|
78
|
+
ownerWallet: result.ownerWallet,
|
|
79
|
+
tokenId: result.tokenId,
|
|
80
|
+
label: result.label,
|
|
84
81
|
gateUrl,
|
|
85
82
|
createdAt: new Date().toISOString(),
|
|
86
83
|
};
|
|
87
84
|
const path = await saveCredentials(creds);
|
|
88
85
|
console.log();
|
|
89
|
-
console.log(chalk.green(" ✓ Logged in as ") + chalk.cyan(
|
|
90
|
-
console.log(chalk.gray(` Token label: `) + chalk.white(
|
|
86
|
+
console.log(chalk.green(" ✓ Logged in as ") + chalk.cyan(result.ownerWallet));
|
|
87
|
+
console.log(chalk.gray(` Token label: `) + chalk.white(result.label));
|
|
91
88
|
console.log(chalk.gray(` Saved to: `) + chalk.white(path));
|
|
92
89
|
console.log();
|
|
93
90
|
console.log(chalk.gray(" Manage tokens at ") + chalk.cyan(`${webUrl}/dashboard/agent-wallet`));
|
|
94
91
|
console.log();
|
|
95
92
|
});
|
|
96
|
-
function runLoopbackFlow(args) {
|
|
97
|
-
return new Promise((resolve) => {
|
|
98
|
-
let settled = false;
|
|
99
|
-
const finish = (r) => {
|
|
100
|
-
if (settled)
|
|
101
|
-
return;
|
|
102
|
-
settled = true;
|
|
103
|
-
try {
|
|
104
|
-
server.close();
|
|
105
|
-
}
|
|
106
|
-
catch { }
|
|
107
|
-
clearTimeout(timer);
|
|
108
|
-
resolve(r);
|
|
109
|
-
};
|
|
110
|
-
const server = createServer((req, res) => {
|
|
111
|
-
const url = new URL(req.url || "/", `http://127.0.0.1`);
|
|
112
|
-
if (url.pathname !== "/callback") {
|
|
113
|
-
res.writeHead(404, { "content-type": "text/plain" });
|
|
114
|
-
res.end("not found");
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
const recvState = url.searchParams.get("state");
|
|
118
|
-
const code = url.searchParams.get("code");
|
|
119
|
-
const error = url.searchParams.get("error");
|
|
120
|
-
if (error) {
|
|
121
|
-
res.writeHead(400, { "content-type": "text/html; charset=utf-8" });
|
|
122
|
-
res.end(htmlPage("Login failed", error, false));
|
|
123
|
-
finish({ kind: "error", message: `Browser returned error: ${error}` });
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
if (!recvState || recvState !== args.state) {
|
|
127
|
-
res.writeHead(400, { "content-type": "text/html; charset=utf-8" });
|
|
128
|
-
res.end(htmlPage("Invalid state", "State mismatch. Try again.", false));
|
|
129
|
-
finish({ kind: "error", message: "State mismatch on callback (possible CSRF)." });
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
if (!code) {
|
|
133
|
-
res.writeHead(400, { "content-type": "text/html; charset=utf-8" });
|
|
134
|
-
res.end(htmlPage("Missing code", "No authorization code on the callback.", false));
|
|
135
|
-
finish({ kind: "error", message: "Callback missing code parameter." });
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
res.writeHead(200, { "content-type": "text/html; charset=utf-8" });
|
|
139
|
-
res.end(htmlPage("You're signed in", "You can close this tab and return to the terminal.", true));
|
|
140
|
-
finish({ kind: "ok", code });
|
|
141
|
-
});
|
|
142
|
-
server.on("error", (err) => {
|
|
143
|
-
finish({ kind: "error", message: `Loopback server failed: ${err.message}` });
|
|
144
|
-
});
|
|
145
|
-
server.listen(args.desiredPort, "127.0.0.1", () => {
|
|
146
|
-
const addr = server.address();
|
|
147
|
-
if (!addr || typeof addr === "string") {
|
|
148
|
-
finish({ kind: "error", message: "Could not bind loopback server." });
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
const port = addr.port;
|
|
152
|
-
const params = new URLSearchParams({
|
|
153
|
-
state: args.state,
|
|
154
|
-
challenge: args.challenge,
|
|
155
|
-
port: String(port),
|
|
156
|
-
hostname: args.hostname,
|
|
157
|
-
});
|
|
158
|
-
const loginUrl = `${args.webUrl}/cli/login?${params.toString()}`;
|
|
159
|
-
console.log(chalk.gray(" Opening browser to authorize this device…"));
|
|
160
|
-
console.log(chalk.gray(" If it doesn't open, visit:"));
|
|
161
|
-
console.log(chalk.cyan(` ${loginUrl}`));
|
|
162
|
-
console.log();
|
|
163
|
-
console.log(chalk.gray(` Listening on http://127.0.0.1:${port}/callback`));
|
|
164
|
-
console.log();
|
|
165
|
-
if (args.openBrowser) {
|
|
166
|
-
open(loginUrl).catch(() => {
|
|
167
|
-
// Non-fatal; the user can still copy the URL.
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
const timer = setTimeout(() => {
|
|
172
|
-
finish({ kind: "error", message: "Timed out waiting for browser sign-in (5 min)." });
|
|
173
|
-
}, LOGIN_TIMEOUT_MS);
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
async function exchangeCode(args) {
|
|
177
|
-
let res;
|
|
178
|
-
try {
|
|
179
|
-
res = await fetch(`${args.gateUrl}/v1/cli/exchange`, {
|
|
180
|
-
method: "POST",
|
|
181
|
-
headers: { "content-type": "application/json" },
|
|
182
|
-
body: JSON.stringify({ code: args.code, verifier: args.verifier }),
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
catch (err) {
|
|
186
|
-
return { ok: false, error: `Network error: ${err.message}` };
|
|
187
|
-
}
|
|
188
|
-
if (!res.ok) {
|
|
189
|
-
let msg = `${res.status} ${res.statusText}`;
|
|
190
|
-
try {
|
|
191
|
-
const body = (await res.json());
|
|
192
|
-
msg = body.error || body.message || msg;
|
|
193
|
-
}
|
|
194
|
-
catch { }
|
|
195
|
-
return { ok: false, error: msg };
|
|
196
|
-
}
|
|
197
|
-
const body = (await res.json());
|
|
198
|
-
if (!body.token || !body.ownerWallet || !body.tokenId) {
|
|
199
|
-
return { ok: false, error: "Malformed response from gate." };
|
|
200
|
-
}
|
|
201
|
-
return {
|
|
202
|
-
ok: true,
|
|
203
|
-
token: body.token,
|
|
204
|
-
ownerWallet: body.ownerWallet,
|
|
205
|
-
tokenId: body.tokenId,
|
|
206
|
-
label: body.label || "CLI",
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
function base64url(buf) {
|
|
210
|
-
return buf.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
211
|
-
}
|
|
212
|
-
function htmlPage(title, body, ok) {
|
|
213
|
-
const accent = ok ? "#10b981" : "#ef4444";
|
|
214
|
-
return `<!doctype html>
|
|
215
|
-
<html><head><meta charset="utf-8"><title>${title}</title>
|
|
216
|
-
<style>
|
|
217
|
-
body { margin:0; min-height:100vh; display:grid; place-items:center;
|
|
218
|
-
font:15px/1.5 -apple-system,BlinkMacSystemFont,sans-serif; background:#0b0b0d; color:#e5e5e5; }
|
|
219
|
-
.card { background:#141418; border:1px solid #26262c; border-radius:12px;
|
|
220
|
-
padding:32px 36px; max-width:420px; }
|
|
221
|
-
.dot { display:inline-block; width:10px; height:10px; border-radius:50%;
|
|
222
|
-
background:${accent}; margin-right:10px; vertical-align:middle; }
|
|
223
|
-
h1 { margin:0 0 8px; font-size:18px; font-weight:600; }
|
|
224
|
-
p { margin:0; color:#a3a3aa; }
|
|
225
|
-
</style></head>
|
|
226
|
-
<body><div class="card"><h1><span class="dot"></span>${title}</h1><p>${body}</p></div></body></html>`;
|
|
227
|
-
}
|
|
228
93
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAqB3E;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAMvE;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAMzE;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,OAAO,CAAC,CAW1D;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
|
package/dist/credentials.js
CHANGED
|
@@ -3,8 +3,25 @@ import { existsSync } from "node:fs";
|
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
const CHEST_DIR = join(homedir(), ".chest");
|
|
6
|
-
const CREDENTIALS_PATH = join(CHEST_DIR, "
|
|
6
|
+
const CREDENTIALS_PATH = join(CHEST_DIR, "developer-token.json");
|
|
7
|
+
const LEGACY_CREDENTIALS_PATH = join(CHEST_DIR, "credentials.json");
|
|
7
8
|
const DEFAULT_GATE_URL = "https://gate.chest.sh";
|
|
9
|
+
let _warnedLegacy = false;
|
|
10
|
+
function warnLegacyOnce() {
|
|
11
|
+
if (_warnedLegacy)
|
|
12
|
+
return;
|
|
13
|
+
_warnedLegacy = true;
|
|
14
|
+
process.emitWarning(`~/.chest/credentials.json is deprecated; rename to ~/.chest/developer-token.json.`, "DeprecationWarning");
|
|
15
|
+
}
|
|
16
|
+
function resolveReadPath() {
|
|
17
|
+
if (existsSync(CREDENTIALS_PATH))
|
|
18
|
+
return CREDENTIALS_PATH;
|
|
19
|
+
if (existsSync(LEGACY_CREDENTIALS_PATH)) {
|
|
20
|
+
warnLegacyOnce();
|
|
21
|
+
return LEGACY_CREDENTIALS_PATH;
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
8
25
|
/**
|
|
9
26
|
* Load credentials, preferring CHEST_TOKEN env over the on-disk file.
|
|
10
27
|
* Returns null if neither is present.
|
|
@@ -23,9 +40,10 @@ export async function loadCredentials() {
|
|
|
23
40
|
source: "env",
|
|
24
41
|
};
|
|
25
42
|
}
|
|
26
|
-
|
|
43
|
+
const path = resolveReadPath();
|
|
44
|
+
if (!path)
|
|
27
45
|
return null;
|
|
28
|
-
const raw = await readFile(
|
|
46
|
+
const raw = await readFile(path, "utf-8");
|
|
29
47
|
const parsed = JSON.parse(raw);
|
|
30
48
|
return { ...parsed, source: "file" };
|
|
31
49
|
}
|
|
@@ -44,10 +62,16 @@ export async function saveCredentials(creds) {
|
|
|
44
62
|
return CREDENTIALS_PATH;
|
|
45
63
|
}
|
|
46
64
|
export async function deleteCredentials() {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
65
|
+
let removed = false;
|
|
66
|
+
if (existsSync(CREDENTIALS_PATH)) {
|
|
67
|
+
await unlink(CREDENTIALS_PATH);
|
|
68
|
+
removed = true;
|
|
69
|
+
}
|
|
70
|
+
if (existsSync(LEGACY_CREDENTIALS_PATH)) {
|
|
71
|
+
await unlink(LEGACY_CREDENTIALS_PATH);
|
|
72
|
+
removed = true;
|
|
73
|
+
}
|
|
74
|
+
return removed;
|
|
51
75
|
}
|
|
52
76
|
export function getCredentialsPath() {
|
|
53
77
|
return CREDENTIALS_PATH;
|
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;AACjE,MAAM,uBAAuB,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;AAEpE,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEjD,IAAI,aAAa,GAAG,KAAK,CAAC;AAC1B,SAAS,cAAc;IACrB,IAAI,aAAa;QAAE,OAAO;IAC1B,aAAa,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,WAAW,CACjB,mFAAmF,EACnF,oBAAoB,CACrB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,gBAAgB,CAAC;IAC1D,IAAI,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACxC,cAAc,EAAE,CAAC;QACjB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAgBD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,CAAC;YACV,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,gBAAgB;YAC/D,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,KAAK;SACd,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;IAC9C,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAkB;IACtD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnF,MAAM,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACjC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC/B,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,IAAI,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACxC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACtC,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,gBAAgB,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,kBAAkB,CAAC;AACjE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chest-gate/cli",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"description": "Chest Gate CLI. One command to monetise any API with x402 on Solana.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"x402",
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
"prepublishOnly": "npm run build"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
+
"@chest-gate/auth-flow": "^0.1.0",
|
|
38
39
|
"@chest-gate/proxy": "^0.1.0",
|
|
39
40
|
"@coral-xyz/anchor": "^0.32.1",
|
|
40
41
|
"@noble/curves": "^1.0.0",
|
|
@@ -47,7 +48,6 @@
|
|
|
47
48
|
"ed25519-hd-key": "^1.3.0",
|
|
48
49
|
"gray-matter": "^4.0.3",
|
|
49
50
|
"inquirer": "^12.0.0",
|
|
50
|
-
"open": "^11.0.0",
|
|
51
51
|
"yaml": "^2.7.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|