@levr-one/cli 0.7.8 → 0.8.0
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/dist/cli.js +102 -12
- package/dist/{importHandler--Odfz6sz.js → importHandler-zfgrGCyh.js} +184 -6
- package/dist/{listHandler-CBKYVX8A.js → listHandler-B5KqRcYG.js} +1 -1
- package/dist/loginHandler-BE9JX12M.js +388 -0
- package/dist/{pushHandler-BBzX09LW.js → pushHandler-BukCooiv.js} +2 -2
- package/dist/{resolve-workspace-Bk3y0q3v.js → resolve-workspace-NupdkCvd.js} +1 -1
- package/dist/{sdk-client-RgFjzRyG.js → sdk-client-CATjlmyX.js} +41 -14
- package/dist/{selectHandler-UrTpL_l1.js → selectHandler-CXwxIKL9.js} +1 -1
- package/dist/{statusHandler-BBTHpyog.js → statusHandler-CyhoTEEI.js} +1 -1
- package/package.json +2 -1
- package/dist/loginHandler-BOWFHzAn.js +0 -388
|
@@ -1,388 +0,0 @@
|
|
|
1
|
-
import { CLI_CLIENT_ID, getApiUrl, getAuthUrl, setSessionApiUrl, writeCredentials } from "./env-CHeKHu5S.js";
|
|
2
|
-
import { configureClient } from "./sdk-client-RgFjzRyG.js";
|
|
3
|
-
import "./workspace-store-DDOxnut1.js";
|
|
4
|
-
import { autoSelectWorkspace } from "./resolve-workspace-Bk3y0q3v.js";
|
|
5
|
-
import chalk from "chalk";
|
|
6
|
-
import { createHash, randomBytes } from "node:crypto";
|
|
7
|
-
import { createServer } from "node:http";
|
|
8
|
-
import { URL } from "node:url";
|
|
9
|
-
|
|
10
|
-
//#region src/auth/pkce.ts
|
|
11
|
-
/**
|
|
12
|
-
* Generate a PKCE code verifier (43-128 chars, base64url).
|
|
13
|
-
* Uses 64 random bytes → 86 chars after base64url encoding.
|
|
14
|
-
*/
|
|
15
|
-
function generateCodeVerifier() {
|
|
16
|
-
return randomBytes(64).toString("base64url").slice(0, 86);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Generate a PKCE code challenge from the verifier (SHA-256, base64url).
|
|
20
|
-
*/
|
|
21
|
-
function generateCodeChallenge(verifier) {
|
|
22
|
-
return createHash("sha256").update(verifier).digest("base64url");
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
//#endregion
|
|
26
|
-
//#region src/auth/localhost-server.ts
|
|
27
|
-
/**
|
|
28
|
-
* Inline CSS matching auth-web's design system.
|
|
29
|
-
* Uses prefers-color-scheme for automatic dark mode.
|
|
30
|
-
*/
|
|
31
|
-
const PAGE_STYLES = `
|
|
32
|
-
*{margin:0;padding:0;box-sizing:border-box}
|
|
33
|
-
body{
|
|
34
|
-
font-family:'Geist Variable',Geist,ui-sans-serif,system-ui,-apple-system,sans-serif;
|
|
35
|
-
-webkit-font-smoothing:antialiased;
|
|
36
|
-
-moz-osx-font-smoothing:grayscale;
|
|
37
|
-
text-rendering:optimizeLegibility;
|
|
38
|
-
background:#ffffff;color:#444444;
|
|
39
|
-
display:flex;align-items:center;justify-content:center;
|
|
40
|
-
min-height:100vh;padding:1rem;
|
|
41
|
-
}
|
|
42
|
-
.card{
|
|
43
|
-
width:100%;max-width:28rem;
|
|
44
|
-
background:#e5e5e5;border-radius:0.625rem;
|
|
45
|
-
padding:2rem;box-shadow:0 10px 15px -3px rgba(0,0,0,0.1),0 4px 6px -4px rgba(0,0,0,0.1);
|
|
46
|
-
text-align:center;
|
|
47
|
-
}
|
|
48
|
-
.logo{margin-bottom:1.5rem}
|
|
49
|
-
.logo img{height:2.5rem;width:auto}
|
|
50
|
-
.logo .logo-dark{display:none}
|
|
51
|
-
.icon-circle{
|
|
52
|
-
width:4rem;height:4rem;border-radius:50%;
|
|
53
|
-
display:inline-flex;align-items:center;justify-content:center;
|
|
54
|
-
margin-bottom:1rem;
|
|
55
|
-
}
|
|
56
|
-
.icon-circle.success{background:#dcfce7}
|
|
57
|
-
.icon-circle.error{background:#fee2e2}
|
|
58
|
-
.icon-circle svg{width:2rem;height:2rem}
|
|
59
|
-
.icon-circle.success svg{color:#16a34a}
|
|
60
|
-
.icon-circle.error svg{color:#ff5538}
|
|
61
|
-
h2{font-size:1.19rem;font-weight:700;color:#444444;margin-bottom:0.5rem}
|
|
62
|
-
p{font-size:0.83rem;color:#888888;line-height:1.5}
|
|
63
|
-
.error-detail{
|
|
64
|
-
margin-top:1rem;padding:1rem;
|
|
65
|
-
background:rgba(255,85,56,0.1);border:1px solid rgba(255,85,56,0.2);
|
|
66
|
-
border-radius:0.375rem;font-size:0.83rem;color:#ff5538;
|
|
67
|
-
}
|
|
68
|
-
@media(prefers-color-scheme:dark){
|
|
69
|
-
body{background:#1e223a;color:#ffffff}
|
|
70
|
-
.card{background:#2a2f4a}
|
|
71
|
-
.logo .logo-light{display:none}
|
|
72
|
-
.logo .logo-dark{display:block}
|
|
73
|
-
h2{color:#ffffff}
|
|
74
|
-
p{color:#a0a5ba}
|
|
75
|
-
}
|
|
76
|
-
`;
|
|
77
|
-
const CHECK_SVG = "<svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M5 13l4 4L19 7\"/></svg>";
|
|
78
|
-
const X_SVG = "<svg fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\"/></svg>";
|
|
79
|
-
function renderPage(variant, title, message, detail) {
|
|
80
|
-
const icon = variant === "success" ? CHECK_SVG : X_SVG;
|
|
81
|
-
const detailHtml = detail ? `<div class="error-detail">${escapeHtml(detail)}</div>` : "";
|
|
82
|
-
return `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Levr CLI</title><style>${PAGE_STYLES}</style></head><body><div class="card"><div class="logo"><img class="logo-light" src="data:image/png;base64,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" alt="Levr"><img class="logo-dark" src="data:image/png;base64,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us2t3Pnq4WcVNOhYRERERESko/JQCPgYwNFm9rbDmCIiIs6pEFDCLh4xovPUFSrXqO1luzRUYkvCugHswwS6w9fXlswlYNONmApiUroRj/cZG7xYUVvxZSaTyXrJaQHhyYDcg01p7ugqphEN1pQacPuurR94LCIiIiIi0pE4LATUAhgJ4HozUwtXEREpeyoElKHzrzi/f22XurVm9rA/G7FyfRXWoLEzgCTAJCz/ZScMhbUaIoD/9ewnAVgOQC4Z2NSK+uADBIkX+sxKfpIeP+2LTOaqWdF/VNGpqRmWfL5y5VcaUsHGLuIls/huqY9TK0U590BERERERKQcOSgEqA2QiIh0SCoEdADDhg1LDt5gcAWX7l45L2isrmisMHQC6rNIdJ6bW8KCYJlcMtlsQSBBNDamEt8w1TQtVZkm5gGpikY21Af1/Rur6v5+0N8bzIyuP6b2ymQyibGr5+5vrGRRBwgb0dhnIle49NDzRxczjoiIiIiISDkoYiHgSwB3AbjHzPT6TEREOhwVAqTDqqmpST6X+vz6xkoeWqwY6Ua765Zdz92/WOuLiIiIiIiUk4gLAeMB3AvgbjP7OKI1RURESlIhbWFEytLw4cNzgz9LHlnRgGuKsX4yh4+GjE8eWYy1RURERERE5DemAHgVwNUAtgIwxMxGqAggIiKiEwEiyGQyqV/WyN2dreDwqNZMBJjUbUaw1ZUH/POLqNYUEREREREpd/kTAbMAZPOPXDN/NgH4CcAohC1/RgH4Uj3/RUREFk2FABGEMwPGr5q7vL6axxQ4QHmREoGN6zaLm1+573nfRZWfiIiIiIiIiIiISFupECDyP3bS7Zk/Tu2TfZaGqrYsUD3PagbOSR6YOThTH3VyIiIiIiIiIiIiIm2hQoDIQv52zxn969PJv9ZX40waCyoIVNTbU+kczr5u+LkfFjs/ERERERERERERkdZQIUBkEU64OdNrXq+mP+YCbMEUNiSt+/x/MyBgwn5K56ymc0PFC5ftPXKMz1xFRERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERESi8n/OHKiCWFSTMwAAAABJRU5ErkJggg==" alt="Levr"></div><div class="icon-circle ${variant}">${icon}</div><h2>${escapeHtml(title)}</h2><p>${escapeHtml(message)}</p>` + detailHtml + "</div></body></html>";
|
|
83
|
-
}
|
|
84
|
-
function escapeHtml(str) {
|
|
85
|
-
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Start a temporary HTTP server on 127.0.0.1 with a random port.
|
|
89
|
-
* Waits for an OAuth callback at /callback?code=... and returns the code.
|
|
90
|
-
*/
|
|
91
|
-
function startCallbackServer(options = {}) {
|
|
92
|
-
const timeout = options.timeout ?? 12e4;
|
|
93
|
-
const expectedState = options.expectedState;
|
|
94
|
-
let resolvePort;
|
|
95
|
-
let resolveCode;
|
|
96
|
-
let rejectCode;
|
|
97
|
-
const portPromise = new Promise((resolve) => {
|
|
98
|
-
resolvePort = resolve;
|
|
99
|
-
});
|
|
100
|
-
const codePromise = new Promise((resolve, reject) => {
|
|
101
|
-
resolveCode = resolve;
|
|
102
|
-
rejectCode = reject;
|
|
103
|
-
});
|
|
104
|
-
const server = createServer((req, res) => {
|
|
105
|
-
const url = new URL(req.url ?? "/", `http://127.0.0.1`);
|
|
106
|
-
if (url.pathname === "/callback") {
|
|
107
|
-
const code = url.searchParams.get("code");
|
|
108
|
-
const error = url.searchParams.get("error");
|
|
109
|
-
if (error) {
|
|
110
|
-
res.writeHead(200, { "Content-Type": "text/html" });
|
|
111
|
-
res.end(renderPage("error", "Authentication failed", "You can close this window.", error));
|
|
112
|
-
clearTimeout(timer);
|
|
113
|
-
rejectCode(/* @__PURE__ */ new Error(`OAuth error: ${error}`));
|
|
114
|
-
server.close();
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
if (code) {
|
|
118
|
-
const returnedState = url.searchParams.get("state");
|
|
119
|
-
if (expectedState && returnedState !== expectedState) {
|
|
120
|
-
res.writeHead(200, { "Content-Type": "text/html" });
|
|
121
|
-
res.end(renderPage("error", "Authentication failed", "You can close this window.", "Invalid state parameter."));
|
|
122
|
-
clearTimeout(timer);
|
|
123
|
-
rejectCode(/* @__PURE__ */ new Error("OAuth state mismatch (possible CSRF)"));
|
|
124
|
-
server.close();
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
res.writeHead(200, { "Content-Type": "text/html" });
|
|
128
|
-
res.end(renderPage("success", "Authentication successful!", "You can close this window and return to the terminal."));
|
|
129
|
-
clearTimeout(timer);
|
|
130
|
-
resolveCode({ code });
|
|
131
|
-
server.close();
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
res.writeHead(404);
|
|
136
|
-
res.end("Not found");
|
|
137
|
-
});
|
|
138
|
-
const timer = setTimeout(() => {
|
|
139
|
-
rejectCode(/* @__PURE__ */ new Error("Authentication timed out. No callback received."));
|
|
140
|
-
server.close();
|
|
141
|
-
}, timeout);
|
|
142
|
-
server.listen(0, "127.0.0.1", () => {
|
|
143
|
-
const addr = server.address();
|
|
144
|
-
if (addr && typeof addr !== "string") resolvePort(addr.port);
|
|
145
|
-
});
|
|
146
|
-
return {
|
|
147
|
-
port: portPromise,
|
|
148
|
-
code: codePromise,
|
|
149
|
-
close: () => {
|
|
150
|
-
clearTimeout(timer);
|
|
151
|
-
server.close();
|
|
152
|
-
}
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
//#endregion
|
|
157
|
-
//#region src/utils/sleep.ts
|
|
158
|
-
function sleep(ms) {
|
|
159
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
//#endregion
|
|
163
|
-
//#region src/auth/device-flow.ts
|
|
164
|
-
/**
|
|
165
|
-
* Request a device authorization code from the backend.
|
|
166
|
-
*/
|
|
167
|
-
async function requestDeviceCode() {
|
|
168
|
-
const apiUrl = getApiUrl();
|
|
169
|
-
let res;
|
|
170
|
-
try {
|
|
171
|
-
res = await fetch(`${apiUrl}/v1/oauth/device/authorize`, {
|
|
172
|
-
method: "POST",
|
|
173
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
174
|
-
body: new URLSearchParams({
|
|
175
|
-
client_id: CLI_CLIENT_ID,
|
|
176
|
-
scope: "read:own write:own"
|
|
177
|
-
})
|
|
178
|
-
});
|
|
179
|
-
} catch {
|
|
180
|
-
throw new Error(`Could not reach ${apiUrl} — check the URL and your network connection.`);
|
|
181
|
-
}
|
|
182
|
-
if (!res.ok) {
|
|
183
|
-
const body = await res.text();
|
|
184
|
-
throw new Error(`Failed to request device code (${res.status}): ${body}`);
|
|
185
|
-
}
|
|
186
|
-
return await res.json();
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Poll the token endpoint for device flow approval.
|
|
190
|
-
* Returns tokens on success, throws on error/expiry/denial.
|
|
191
|
-
*/
|
|
192
|
-
async function pollForDeviceToken(options) {
|
|
193
|
-
const apiUrl = getApiUrl();
|
|
194
|
-
let interval = options.interval;
|
|
195
|
-
const deadline = Date.now() + options.expiresIn * 1e3;
|
|
196
|
-
while (Date.now() < deadline) {
|
|
197
|
-
await sleep(interval * 1e3);
|
|
198
|
-
const res = await fetch(`${apiUrl}/v1/oauth/token`, {
|
|
199
|
-
method: "POST",
|
|
200
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
201
|
-
body: new URLSearchParams({
|
|
202
|
-
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
203
|
-
device_code: options.deviceCode,
|
|
204
|
-
client_id: CLI_CLIENT_ID
|
|
205
|
-
})
|
|
206
|
-
});
|
|
207
|
-
if (res.ok) return await res.json();
|
|
208
|
-
const body = await res.json();
|
|
209
|
-
switch (body.error) {
|
|
210
|
-
case "authorization_pending":
|
|
211
|
-
options.onPending?.();
|
|
212
|
-
continue;
|
|
213
|
-
case "slow_down":
|
|
214
|
-
interval += 5;
|
|
215
|
-
continue;
|
|
216
|
-
case "expired_token": throw new Error("Device code expired. Please try again.");
|
|
217
|
-
case "access_denied": throw new Error("Authorization denied by user.");
|
|
218
|
-
default: throw new Error(`Unexpected error: ${body.error}`);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
throw new Error("Device code expired. Please try again.");
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
//#endregion
|
|
225
|
-
//#region src/commands/auth/loginHandler.ts
|
|
226
|
-
function formatCountdown(ms) {
|
|
227
|
-
const totalSec = Math.max(0, Math.ceil(ms / 1e3));
|
|
228
|
-
return `${Math.floor(totalSec / 60)}:${(totalSec % 60).toString().padStart(2, "0")}`;
|
|
229
|
-
}
|
|
230
|
-
async function loginHandler(flags) {
|
|
231
|
-
await performLogin(this, {
|
|
232
|
-
deviceCode: flags["device-code"],
|
|
233
|
-
url: flags.url
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Run the login flow (PKCE or device code). Reusable outside the Stricli
|
|
238
|
-
* handler (levr init composes it). Returns true on success; on failure the
|
|
239
|
-
* error has been printed and `exitCode` set.
|
|
240
|
-
*/
|
|
241
|
-
async function performLogin(ctx, options) {
|
|
242
|
-
if (options.url) setSessionApiUrl(options.url);
|
|
243
|
-
if (options.deviceCode) return deviceCodeLogin(ctx);
|
|
244
|
-
return pkceLogin(ctx);
|
|
245
|
-
}
|
|
246
|
-
async function pkceLogin(ctx) {
|
|
247
|
-
const apiUrl = getApiUrl();
|
|
248
|
-
let authUrl;
|
|
249
|
-
try {
|
|
250
|
-
authUrl = getAuthUrl();
|
|
251
|
-
} catch (err) {
|
|
252
|
-
ctx.logger.error(err instanceof Error ? err.message : "Invalid auth server configuration.");
|
|
253
|
-
ctx.process.exitCode = 1;
|
|
254
|
-
return false;
|
|
255
|
-
}
|
|
256
|
-
const codeVerifier = generateCodeVerifier();
|
|
257
|
-
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
258
|
-
const state = randomBytes(16).toString("hex");
|
|
259
|
-
const { port: portPromise, code: codePromise, close } = startCallbackServer({
|
|
260
|
-
timeout: 12e4,
|
|
261
|
-
expectedState: state
|
|
262
|
-
});
|
|
263
|
-
const redirectUri = `http://127.0.0.1:${await portPromise}/callback`;
|
|
264
|
-
const params = new URLSearchParams({
|
|
265
|
-
response_type: "code",
|
|
266
|
-
client_id: CLI_CLIENT_ID,
|
|
267
|
-
redirect_uri: redirectUri,
|
|
268
|
-
code_challenge: codeChallenge,
|
|
269
|
-
code_challenge_method: "S256",
|
|
270
|
-
scope: "read:own write:own",
|
|
271
|
-
state
|
|
272
|
-
});
|
|
273
|
-
const authorizeUrl = `${authUrl}/auth/oauth/authorize?${params.toString()}`;
|
|
274
|
-
ctx.process.stdout.write("Opening browser to authenticate...\n\n");
|
|
275
|
-
ctx.process.stdout.write(` If the browser doesn't open, visit:\n ${chalk.cyan(authorizeUrl)}\n\n`);
|
|
276
|
-
try {
|
|
277
|
-
await (await import("open")).default(authorizeUrl);
|
|
278
|
-
} catch {}
|
|
279
|
-
const timeoutMs = 12e4;
|
|
280
|
-
const deadline = Date.now() + timeoutMs;
|
|
281
|
-
const countdownTimer = setInterval(() => {
|
|
282
|
-
const remaining = deadline - Date.now();
|
|
283
|
-
ctx.process.stdout.write(`\rWaiting for authentication... ${chalk.dim(`(${formatCountdown(remaining)})`)}`);
|
|
284
|
-
}, 1e3);
|
|
285
|
-
ctx.process.stdout.write(`Waiting for authentication... ${chalk.dim(`(${formatCountdown(timeoutMs)})`)}`);
|
|
286
|
-
let authCode;
|
|
287
|
-
try {
|
|
288
|
-
authCode = (await codePromise).code;
|
|
289
|
-
} catch (err) {
|
|
290
|
-
close();
|
|
291
|
-
clearInterval(countdownTimer);
|
|
292
|
-
ctx.process.stdout.write("\n");
|
|
293
|
-
ctx.logger.error(err instanceof Error ? err.message : "Authentication failed.");
|
|
294
|
-
ctx.process.exitCode = 1;
|
|
295
|
-
return false;
|
|
296
|
-
}
|
|
297
|
-
clearInterval(countdownTimer);
|
|
298
|
-
try {
|
|
299
|
-
const tokenRes = await fetch(`${apiUrl}/v1/oauth/token`, {
|
|
300
|
-
method: "POST",
|
|
301
|
-
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
302
|
-
body: new URLSearchParams({
|
|
303
|
-
grant_type: "authorization_code",
|
|
304
|
-
code: authCode,
|
|
305
|
-
redirect_uri: redirectUri,
|
|
306
|
-
client_id: CLI_CLIENT_ID,
|
|
307
|
-
code_verifier: codeVerifier
|
|
308
|
-
})
|
|
309
|
-
});
|
|
310
|
-
if (!tokenRes.ok) {
|
|
311
|
-
const errBody = await tokenRes.text();
|
|
312
|
-
throw new Error(`Token exchange failed (${tokenRes.status}): ${errBody}`);
|
|
313
|
-
}
|
|
314
|
-
return await saveTokensAndFinish(ctx, await tokenRes.json());
|
|
315
|
-
} catch (err) {
|
|
316
|
-
ctx.process.stdout.write("\n");
|
|
317
|
-
ctx.logger.error(err instanceof Error ? err.message : "Token exchange failed.");
|
|
318
|
-
ctx.process.exitCode = 1;
|
|
319
|
-
return false;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
async function deviceCodeLogin(ctx) {
|
|
323
|
-
try {
|
|
324
|
-
const device = await requestDeviceCode();
|
|
325
|
-
ctx.process.stdout.write(`\nVisit: ${chalk.cyan(device.verification_uri)}\n`);
|
|
326
|
-
ctx.process.stdout.write(`Enter code: ${chalk.bold.yellow(device.user_code)}\n\n`);
|
|
327
|
-
const deviceDeadline = Date.now() + device.expires_in * 1e3;
|
|
328
|
-
const deviceTimer = setInterval(() => {
|
|
329
|
-
const remaining = deviceDeadline - Date.now();
|
|
330
|
-
ctx.process.stdout.write(`\rWaiting for authorization... ${chalk.dim(`(${formatCountdown(remaining)})`)}`);
|
|
331
|
-
}, 1e3);
|
|
332
|
-
ctx.process.stdout.write(`Waiting for authorization... ${chalk.dim(`(${formatCountdown(device.expires_in * 1e3)})`)}`);
|
|
333
|
-
let tokenData;
|
|
334
|
-
try {
|
|
335
|
-
tokenData = await pollForDeviceToken({
|
|
336
|
-
deviceCode: device.device_code,
|
|
337
|
-
interval: device.interval,
|
|
338
|
-
expiresIn: device.expires_in
|
|
339
|
-
});
|
|
340
|
-
} catch (err) {
|
|
341
|
-
clearInterval(deviceTimer);
|
|
342
|
-
throw err;
|
|
343
|
-
}
|
|
344
|
-
clearInterval(deviceTimer);
|
|
345
|
-
return await saveTokensAndFinish(ctx, tokenData);
|
|
346
|
-
} catch (err) {
|
|
347
|
-
ctx.process.stdout.write("\n");
|
|
348
|
-
ctx.logger.error(err instanceof Error ? err.message : "Device flow failed.");
|
|
349
|
-
ctx.process.exitCode = 1;
|
|
350
|
-
return false;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
async function saveTokensAndFinish(ctx, tokenData) {
|
|
354
|
-
const apiUrl = getApiUrl();
|
|
355
|
-
configureClient({
|
|
356
|
-
token: tokenData.access_token,
|
|
357
|
-
type: "jwt"
|
|
358
|
-
});
|
|
359
|
-
const user = tokenData.user;
|
|
360
|
-
if (!user) {
|
|
361
|
-
ctx.process.stdout.write("\n");
|
|
362
|
-
ctx.logger.error("Token response missing user data.");
|
|
363
|
-
ctx.process.exitCode = 1;
|
|
364
|
-
return false;
|
|
365
|
-
}
|
|
366
|
-
writeCredentials({
|
|
367
|
-
version: 1,
|
|
368
|
-
api_url: apiUrl,
|
|
369
|
-
access_token: tokenData.access_token,
|
|
370
|
-
refresh_token: tokenData.refresh_token,
|
|
371
|
-
expires_at: new Date(Date.now() + tokenData.expires_in * 1e3).toISOString(),
|
|
372
|
-
user: {
|
|
373
|
-
id: user.id,
|
|
374
|
-
email: user.email,
|
|
375
|
-
workspace_id: user.workspace_id
|
|
376
|
-
}
|
|
377
|
-
});
|
|
378
|
-
ctx.process.stdout.write(` ${chalk.green("done")}\n\n`);
|
|
379
|
-
ctx.logger.success(`Logged in as ${chalk.bold(user.email)}`);
|
|
380
|
-
ctx.process.stdout.write("Credentials saved.\n");
|
|
381
|
-
const wsResult = await autoSelectWorkspace();
|
|
382
|
-
if (wsResult.kind === "single") ctx.process.stdout.write(`Workspace: ${chalk.bold(wsResult.workspaceName)}\n`);
|
|
383
|
-
else if (wsResult.kind === "multiple") ctx.process.stdout.write(`\n${wsResult.count} workspaces available. Run ${chalk.cyan("'levr workspace list'")} to see them.\n`);
|
|
384
|
-
return true;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
//#endregion
|
|
388
|
-
export { loginHandler };
|