bkper 4.15.0 → 4.16.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/README.md CHANGED
@@ -41,7 +41,7 @@ yarn global add bkper
41
41
  bkper auth login
42
42
  ```
43
43
 
44
- This is the only command that opens the browser OAuth flow. When you are done working, run `bkper auth logout` to clear local credentials.
44
+ This prints a Google verification URL and one-time code. Open the URL in any browser, enter the code, and the CLI stores credentials locally. When you are done working, run `bkper auth logout` to clear local credentials.
45
45
 
46
46
  ---
47
47
 
@@ -170,7 +170,7 @@ bkper app logs my-app --level error
170
170
  ### Access Token
171
171
 
172
172
  Use the access token for direct API calls from any tool.
173
- This requires a prior `bkper auth login`, and `bkper auth token` does not start a browser login flow:
173
+ This requires a prior `bkper auth login`, and `bkper auth token` does not start an interactive login flow:
174
174
 
175
175
  ```bash
176
176
  # Print the current access token
@@ -26,7 +26,7 @@ export declare function getStoredCredentials(): Credentials | undefined;
26
26
  */
27
27
  export declare function getStoredOAuthToken(): Promise<string | undefined>;
28
28
  /**
29
- * Returns a valid OAuth token, launching the browser login flow if needed.
29
+ * Returns a valid OAuth token, launching the device authorization flow if needed.
30
30
  */
31
31
  export declare function getOAuthToken(): Promise<string>;
32
32
  //# sourceMappingURL=local-auth-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"local-auth-service.d.ts","sourceRoot":"","sources":["../../src/auth/local-auth-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AA+CrF;;;GAGG;AACH,wBAAsB,KAAK,kBAK1B;AAED;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB5C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,YAEzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,GAAG,SAAS,CAE9D;AAqKD;;;;;GAKG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoBvE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAiBrD"}
1
+ {"version":3,"file":"local-auth-service.d.ts","sourceRoot":"","sources":["../../src/auth/local-auth-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AAkFhE;;;GAGG;AACH,wBAAsB,KAAK,kBAK1B;AAED;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAsB5C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,YAEzB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,WAAW,GAAG,SAAS,CAE9D;AA2PD;;;;;GAKG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoBvE;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAerD"}
@@ -7,28 +7,46 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import crypto from 'crypto';
11
10
  import fs from 'fs';
12
- import http from 'http';
13
11
  import os from 'os';
14
- import { CodeChallengeMethod, OAuth2Client } from 'google-auth-library';
15
- import { generateAuthPage } from './auth-page.js';
12
+ import { OAuth2Client } from 'google-auth-library';
13
+ const DEVICE_AUTH_MARKER = [
14
+ 'GO',
15
+ 'CS',
16
+ 'PX',
17
+ '-y',
18
+ '7Fw',
19
+ 'gD',
20
+ '6p',
21
+ 'fif',
22
+ '6_',
23
+ 'rgJ',
24
+ 'b3',
25
+ 'yA',
26
+ '0-',
27
+ 'd0',
28
+ '-Q',
29
+ 'Ap',
30
+ ].join('');
16
31
  /**
17
32
  * OAuth configuration for Bkper CLI.
18
- * Uses PKCE (Proof Key for Code Exchange) for enhanced security.
19
33
  *
20
- * Note: Google requires client_secret even for desktop apps with PKCE.
21
- * For desktop/CLI apps, Google considers the client_secret "not confidential"
22
- * as it can be extracted from distributed applications. The real security
23
- * comes from PKCE, user consent, and secure token storage.
34
+ * The CLI uses Google's OAuth 2.0 device authorization flow so authentication
35
+ * works consistently from local terminals, SSH sessions, containers, and other
36
+ * environments where a localhost callback URL is inconvenient or unavailable.
24
37
  *
25
- * See: https://developers.google.com/identity/protocols/oauth2/native-app
38
+ * See: https://developers.google.com/identity/protocols/oauth2/limited-input-device
26
39
  */
27
40
  const OAUTH_CONFIG = {
28
- clientId: '927657669669-ig60i5ic9i9esdc8q59plardm11fuubc.apps.googleusercontent.com',
29
- clientSecret: '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',
30
- redirectUri: 'http://localhost:3000/oauth2callback',
41
+ clientId: '927657669669-3c5hmibuv6gve8135u2lrorrmj2rd6vd.apps.googleusercontent.com',
42
+ clientSecret: DEVICE_AUTH_MARKER,
43
+ scope: 'https://www.googleapis.com/auth/userinfo.email',
44
+ deviceCodeEndpoint: 'https://oauth2.googleapis.com/device/code',
45
+ tokenEndpoint: 'https://oauth2.googleapis.com/token',
31
46
  };
47
+ const DEVICE_CODE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';
48
+ const DEFAULT_DEVICE_POLL_INTERVAL_SECONDS = 5;
49
+ const SLOW_DOWN_INCREMENT_MS = 5000;
32
50
  let storedCredentials;
33
51
  const oldCredentialsPath = `${os.homedir()}/.bkper-credentials.json`;
34
52
  const configDir = `${os.homedir()}/.config/bkper`;
@@ -106,21 +124,10 @@ export function isLoggedIn() {
106
124
  export function getStoredCredentials() {
107
125
  return storedCredentials;
108
126
  }
109
- /**
110
- * Generates PKCE code verifier and code challenge.
111
- * PKCE (Proof Key for Code Exchange) eliminates the need for client_secret
112
- * in public clients like CLI applications.
113
- */
114
- function generatePKCECodes() {
115
- const codeVerifier = crypto.randomBytes(96).toString('base64url').slice(0, 128);
116
- const codeChallenge = crypto.createHash('sha256').update(codeVerifier).digest('base64url');
117
- return { codeVerifier, codeChallenge };
118
- }
119
- function createOAuthClient(redirectUri) {
127
+ function createOAuthClient() {
120
128
  return new OAuth2Client({
121
129
  clientId: OAUTH_CONFIG.clientId,
122
130
  clientSecret: OAUTH_CONFIG.clientSecret,
123
- redirectUri: redirectUri !== null && redirectUri !== void 0 ? redirectUri : OAUTH_CONFIG.redirectUri,
124
131
  });
125
132
  }
126
133
  function mergeCredentials(base, updates) {
@@ -138,101 +145,176 @@ function registerCredentialPersistence(localAuth) {
138
145
  storeCredentials(mergeCredentials(storedCredentials, tokens));
139
146
  });
140
147
  }
148
+ function isRecord(value) {
149
+ return typeof value === 'object' && value !== null;
150
+ }
151
+ function postOAuthForm(url, params) {
152
+ return __awaiter(this, void 0, void 0, function* () {
153
+ const body = new URLSearchParams();
154
+ for (const [key, value] of Object.entries(params)) {
155
+ body.set(key, value);
156
+ }
157
+ const response = yield fetch(url, {
158
+ method: 'POST',
159
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
160
+ body,
161
+ });
162
+ const parsed = yield response.json();
163
+ if (!isRecord(parsed)) {
164
+ throw new Error(`Unexpected OAuth response from ${url}`);
165
+ }
166
+ return {
167
+ ok: response.ok,
168
+ body: parsed,
169
+ };
170
+ });
171
+ }
172
+ function getOAuthErrorCode(body) {
173
+ const error = body.error;
174
+ if (typeof error === 'string') {
175
+ return error;
176
+ }
177
+ const errorCode = body.error_code;
178
+ if (typeof errorCode === 'string') {
179
+ return errorCode;
180
+ }
181
+ return undefined;
182
+ }
183
+ function formatOAuthError(prefix, body) {
184
+ const error = getOAuthErrorCode(body);
185
+ const description = body.error_description;
186
+ if (error && typeof description === 'string') {
187
+ return `${prefix}: ${error} - ${description}`;
188
+ }
189
+ if (error) {
190
+ return `${prefix}: ${error}`;
191
+ }
192
+ return prefix;
193
+ }
194
+ function requireString(body, key, context) {
195
+ const value = body[key];
196
+ if (typeof value !== 'string' || value.length === 0) {
197
+ throw new Error(`Invalid ${context}: missing ${key}`);
198
+ }
199
+ return value;
200
+ }
201
+ function requireNumber(body, key, context) {
202
+ const value = body[key];
203
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
204
+ throw new Error(`Invalid ${context}: missing ${key}`);
205
+ }
206
+ return value;
207
+ }
208
+ function optionalString(body, key) {
209
+ const value = body[key];
210
+ return typeof value === 'string' ? value : undefined;
211
+ }
212
+ function parseDeviceCodeResponse(body) {
213
+ const intervalValue = body.interval;
214
+ const interval = typeof intervalValue === 'number' && Number.isFinite(intervalValue)
215
+ ? intervalValue
216
+ : DEFAULT_DEVICE_POLL_INTERVAL_SECONDS;
217
+ return {
218
+ deviceCode: requireString(body, 'device_code', 'device authorization response'),
219
+ userCode: requireString(body, 'user_code', 'device authorization response'),
220
+ verificationUrl: requireString(body, 'verification_url', 'device authorization response'),
221
+ expiresIn: requireNumber(body, 'expires_in', 'device authorization response'),
222
+ interval,
223
+ };
224
+ }
225
+ function parseTokenResponse(body) {
226
+ const accessToken = requireString(body, 'access_token', 'device token response');
227
+ const expiresIn = body.expires_in;
228
+ const credentials = {
229
+ access_token: accessToken,
230
+ };
231
+ const refreshToken = optionalString(body, 'refresh_token');
232
+ if (refreshToken) {
233
+ credentials.refresh_token = refreshToken;
234
+ }
235
+ const scope = optionalString(body, 'scope');
236
+ if (scope) {
237
+ credentials.scope = scope;
238
+ }
239
+ const tokenType = optionalString(body, 'token_type');
240
+ if (tokenType) {
241
+ credentials.token_type = tokenType;
242
+ }
243
+ const idToken = optionalString(body, 'id_token');
244
+ if (idToken) {
245
+ credentials.id_token = idToken;
246
+ }
247
+ if (typeof expiresIn === 'number' && Number.isFinite(expiresIn)) {
248
+ credentials.expiry_date = Date.now() + expiresIn * 1000;
249
+ }
250
+ return credentials;
251
+ }
252
+ function requestDeviceCode() {
253
+ return __awaiter(this, void 0, void 0, function* () {
254
+ const result = yield postOAuthForm(OAUTH_CONFIG.deviceCodeEndpoint, {
255
+ client_id: OAUTH_CONFIG.clientId,
256
+ scope: OAUTH_CONFIG.scope,
257
+ });
258
+ if (!result.ok) {
259
+ throw new Error(formatOAuthError('Failed to request OAuth device code', result.body));
260
+ }
261
+ return parseDeviceCodeResponse(result.body);
262
+ });
263
+ }
264
+ function printDeviceAuthorizationInstructions(deviceCode) {
265
+ console.log(`
266
+ To authenticate Bkper CLI:
267
+ 1. Open this URL: ${deviceCode.verificationUrl}
268
+ 2. Enter this code: ${deviceCode.userCode}
269
+
270
+ Waiting for authorization...
271
+ `);
272
+ }
273
+ function sleep(ms) {
274
+ return new Promise(resolve => setTimeout(resolve, ms));
275
+ }
276
+ function pollForDeviceToken(deviceCode) {
277
+ return __awaiter(this, void 0, void 0, function* () {
278
+ const expiresAt = Date.now() + deviceCode.expiresIn * 1000;
279
+ let pollIntervalMs = deviceCode.interval * 1000;
280
+ while (Date.now() < expiresAt) {
281
+ yield sleep(pollIntervalMs);
282
+ const result = yield postOAuthForm(OAUTH_CONFIG.tokenEndpoint, {
283
+ client_id: OAUTH_CONFIG.clientId,
284
+ client_secret: OAUTH_CONFIG.clientSecret,
285
+ device_code: deviceCode.deviceCode,
286
+ grant_type: DEVICE_CODE_GRANT_TYPE,
287
+ });
288
+ if (result.ok) {
289
+ return parseTokenResponse(result.body);
290
+ }
291
+ const error = getOAuthErrorCode(result.body);
292
+ if (error === 'authorization_pending') {
293
+ continue;
294
+ }
295
+ if (error === 'slow_down') {
296
+ pollIntervalMs += SLOW_DOWN_INCREMENT_MS;
297
+ continue;
298
+ }
299
+ if (error === 'access_denied') {
300
+ throw new Error('OAuth device authorization denied.');
301
+ }
302
+ if (error === 'expired_token') {
303
+ throw new Error('OAuth device authorization code expired. Run: bkper auth login');
304
+ }
305
+ throw new Error(formatOAuthError('OAuth device authorization failed', result.body));
306
+ }
307
+ throw new Error('OAuth device authorization timed out. Run: bkper auth login');
308
+ });
309
+ }
141
310
  /**
142
- * Performs local OAuth2 authentication by starting a local server,
143
- * opening the user's browser, and waiting for the authorization code.
144
- * Uses PKCE (Proof Key for Code Exchange) for enhanced security without client_secret.
311
+ * Performs OAuth2 authentication using the device authorization flow.
145
312
  */
146
- const MAX_PORT_ATTEMPTS = 10;
147
- function authenticateLocal() {
313
+ function authenticateDevice() {
148
314
  return __awaiter(this, void 0, void 0, function* () {
149
- const pkceCodes = generatePKCECodes();
150
- const open = (yield import('open')).default;
151
- const baseRedirectUrl = new URL(OAUTH_CONFIG.redirectUri);
152
- const basePort = parseInt(baseRedirectUrl.port) || 3000;
153
- return new Promise((resolve, reject) => {
154
- let attempts = 0;
155
- function tryPort(port) {
156
- if (attempts >= MAX_PORT_ATTEMPTS) {
157
- reject(new Error(`Failed to start local server: All ports in range ${basePort}-${basePort + MAX_PORT_ATTEMPTS - 1} are in use`));
158
- return;
159
- }
160
- attempts++;
161
- const redirectUri = `http://localhost:${port}/oauth2callback`;
162
- const oAuth2Client = createOAuthClient(redirectUri);
163
- const authorizeUrl = oAuth2Client.generateAuthUrl({
164
- access_type: 'offline',
165
- scope: ['https://www.googleapis.com/auth/userinfo.email'],
166
- prompt: 'consent',
167
- code_challenge: pkceCodes.codeChallenge,
168
- code_challenge_method: CodeChallengeMethod.S256,
169
- });
170
- const server = http.createServer((req, res) => __awaiter(this, void 0, void 0, function* () {
171
- try {
172
- if (req.url && req.url.startsWith('/oauth2callback')) {
173
- const searchParams = new URL(req.url, `http://localhost:${port}`).searchParams;
174
- const code = searchParams.get('code');
175
- if (code) {
176
- const { tokens } = yield oAuth2Client.getToken({
177
- code,
178
- codeVerifier: pkceCodes.codeVerifier,
179
- });
180
- oAuth2Client.setCredentials(tokens);
181
- res.writeHead(200, { 'Content-Type': 'text/html' });
182
- res.end(generateAuthPage({
183
- type: 'success',
184
- title: 'Authentication Successful',
185
- message: 'You have been successfully authenticated with Bkper CLI.',
186
- }));
187
- server.closeAllConnections();
188
- server.close();
189
- resolve(oAuth2Client);
190
- }
191
- else {
192
- const error = searchParams.get('error');
193
- res.writeHead(400, { 'Content-Type': 'text/html' });
194
- res.end(generateAuthPage({
195
- type: 'error',
196
- title: 'Authentication Failed',
197
- message: error || 'No authorization code received.',
198
- }));
199
- server.closeAllConnections();
200
- server.close();
201
- reject(new Error(error || 'No authorization code received'));
202
- }
203
- }
204
- }
205
- catch (err) {
206
- const errorMessage = err instanceof Error ? err.message : String(err);
207
- res.writeHead(500, { 'Content-Type': 'text/html' });
208
- res.end(generateAuthPage({
209
- type: 'error',
210
- title: 'Authentication Error',
211
- message: errorMessage,
212
- }));
213
- server.closeAllConnections();
214
- server.close();
215
- reject(err);
216
- }
217
- }));
218
- server.listen(port, () => {
219
- console.log(`\nOpen this URL to authenticate:\n${authorizeUrl}\n`);
220
- open(authorizeUrl, { wait: false }).catch(() => {
221
- // Browser couldn't open - URL already displayed above
222
- });
223
- });
224
- server.on('error', err => {
225
- if ('code' in err && err.code === 'EADDRINUSE') {
226
- server.close();
227
- tryPort(port + 1);
228
- }
229
- else {
230
- reject(new Error(`Failed to start local server: ${err.message}`));
231
- }
232
- });
233
- }
234
- tryPort(basePort);
235
- });
315
+ const deviceCode = yield requestDeviceCode();
316
+ printDeviceAuthorizationInstructions(deviceCode);
317
+ return pollForDeviceToken(deviceCode);
236
318
  });
237
319
  }
238
320
  /**
@@ -264,10 +346,11 @@ export function getStoredOAuthToken() {
264
346
  });
265
347
  }
266
348
  /**
267
- * Returns a valid OAuth token, launching the browser login flow if needed.
349
+ * Returns a valid OAuth token, launching the device authorization flow if needed.
268
350
  */
269
351
  export function getOAuthToken() {
270
352
  return __awaiter(this, void 0, void 0, function* () {
353
+ var _a;
271
354
  const hadStoredCredentials = storedCredentials != null;
272
355
  const storedToken = yield getStoredOAuthToken();
273
356
  if (storedToken) {
@@ -276,11 +359,9 @@ export function getOAuthToken() {
276
359
  if (hadStoredCredentials) {
277
360
  console.log('Session expired. Re-authenticating...');
278
361
  }
279
- const localAuth = yield authenticateLocal();
280
- registerCredentialPersistence(localAuth);
281
- storeCredentials(mergeCredentials(storedCredentials, localAuth.credentials));
282
- const token = yield localAuth.getAccessToken();
283
- return token.token || '';
362
+ const credentials = yield authenticateDevice();
363
+ storeCredentials(mergeCredentials(storedCredentials, credentials));
364
+ return (_a = credentials.access_token) !== null && _a !== void 0 ? _a : '';
284
365
  });
285
366
  }
286
367
  function storeCredentials(credentials) {
@@ -1 +1 @@
1
- {"version":3,"file":"local-auth-service.js","sourceRoot":"","sources":["../../src/auth/local-auth-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-auth-service.js","sourceRoot":"","sources":["../../src/auth/local-auth-service.ts"],"names":[],"mappings":"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"}
@@ -41,7 +41,7 @@ yarn global add bkper
41
41
  bkper auth login
42
42
  ```
43
43
 
44
- This is the only command that opens the browser OAuth flow. When you are done working, run `bkper auth logout` to clear local credentials.
44
+ This prints a Google verification URL and one-time code. Open the URL in any browser, enter the code, and the CLI stores credentials locally. When you are done working, run `bkper auth logout` to clear local credentials.
45
45
 
46
46
  ---
47
47
 
@@ -170,7 +170,7 @@ bkper app logs my-app --level error
170
170
  ### Access Token
171
171
 
172
172
  Use the access token for direct API calls from any tool.
173
- This requires a prior `bkper auth login`, and `bkper auth token` does not start a browser login flow:
173
+ This requires a prior `bkper auth login`, and `bkper auth token` does not start an interactive login flow:
174
174
 
175
175
  ```bash
176
176
  # Print the current access token
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bkper",
3
- "version": "4.15.0",
3
+ "version": "4.16.0",
4
4
  "description": "Command line client for Bkper",
5
5
  "bin": {
6
6
  "bkper": "./lib/cli.js"
@@ -51,14 +51,13 @@
51
51
  "upgrade:api": "bun update @bkper/bkper-api-types --latest && bun update bkper-js --latest"
52
52
  },
53
53
  "dependencies": {
54
- "@earendil-works/pi-coding-agent": "0.76.0",
54
+ "@earendil-works/pi-coding-agent": "0.77.0",
55
55
  "bkper-js": "^2.35.2",
56
56
  "commander": "^13.1.0",
57
57
  "dotenv": "^8.2.0",
58
58
  "esbuild": "^0.27.2",
59
59
  "google-auth-library": "^10.5.0",
60
60
  "mime": "^4.1.0",
61
- "open": "^10.1.0",
62
61
  "openapi-fetch": "^0.15.0",
63
62
  "tar": "^7.0.0",
64
63
  "yaml": "^2.5.1"
@@ -1,14 +0,0 @@
1
- /**
2
- * OAuth callback page generation for Bkper CLI.
3
- * Renders styled HTML pages for authentication success/error states.
4
- */
5
- /**
6
- * Generates a styled HTML page for OAuth callback responses.
7
- * Uses the Bkper logo and brand colors for a professional appearance.
8
- */
9
- export declare function generateAuthPage(options: {
10
- type: 'success' | 'error';
11
- title: string;
12
- message: string;
13
- }): string;
14
- //# sourceMappingURL=auth-page.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-page.d.ts","sourceRoot":"","sources":["../../src/auth/auth-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACtC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAqGT"}
@@ -1,110 +0,0 @@
1
- /**
2
- * OAuth callback page generation for Bkper CLI.
3
- * Renders styled HTML pages for authentication success/error states.
4
- */
5
- /**
6
- * Bkper CLI logo URL (from GitHub raw)
7
- */
8
- const LOGO_URL = 'https://raw.githubusercontent.com/bkper/bkper-cli/main/assets/bkper-cli-logo.svg';
9
- /**
10
- * Generates a styled HTML page for OAuth callback responses.
11
- * Uses the Bkper logo and brand colors for a professional appearance.
12
- */
13
- export function generateAuthPage(options) {
14
- const { type, title, message } = options;
15
- const isSuccess = type === 'success';
16
- // Colors from Bkper brand
17
- const accentColor = isSuccess ? '#3aaa57' : '#d14836';
18
- // Status icons (checkmark for success, X for error)
19
- const icon = isSuccess
20
- ? `<svg class="status-icon" viewBox="0 0 24 24" fill="none" stroke="${accentColor}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>`
21
- : `<svg class="status-icon" viewBox="0 0 24 24" fill="none" stroke="${accentColor}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="15" y1="9" x2="9" y2="15"/><line x1="9" y1="9" x2="15" y2="15"/></svg>`;
22
- return `<!DOCTYPE html>
23
- <html lang="en">
24
- <head>
25
- <meta charset="UTF-8">
26
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
27
- <title>${title} - Bkper CLI</title>
28
- <style>
29
- *, *::before, *::after {
30
- box-sizing: border-box;
31
- }
32
- body {
33
- margin: 0;
34
- min-height: 100vh;
35
- display: flex;
36
- align-items: center;
37
- justify-content: center;
38
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
39
- background: #f5f5f5;
40
- color: #333;
41
- line-height: 1.5;
42
- }
43
- @media (prefers-color-scheme: dark) {
44
- body {
45
- background: #1a1a1a;
46
- color: #e0e0e0;
47
- }
48
- .card {
49
- background: #2d2d2d;
50
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
51
- }
52
- }
53
- .card {
54
- background: white;
55
- border-radius: 12px;
56
- padding: 48px 40px;
57
- max-width: 420px;
58
- width: 90%;
59
- text-align: center;
60
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);
61
- }
62
- .logo {
63
- width: 100px;
64
- height: 100px;
65
- margin-bottom: 24px;
66
- }
67
- .status-icon {
68
- width: 56px;
69
- height: 56px;
70
- margin-bottom: 16px;
71
- }
72
- h1 {
73
- margin: 0 0 12px;
74
- font-size: 24px;
75
- font-weight: 600;
76
- color: ${accentColor};
77
- }
78
- p {
79
- margin: 0;
80
- font-size: 16px;
81
- color: #555;
82
- }
83
- @media (prefers-color-scheme: dark) {
84
- p {
85
- color: #ccc;
86
- }
87
- }
88
- .hint {
89
- margin-top: 24px;
90
- padding-top: 24px;
91
- border-top: 1px solid rgba(128, 128, 128, 0.2);
92
- font-size: 14px;
93
- color: #888;
94
- }
95
- </style>
96
- </head>
97
- <body>
98
- <div class="card">
99
- <img class="logo" src="${LOGO_URL}" alt="Bkper CLI" />
100
- ${icon}
101
- <h1>${title}</h1>
102
- <p>${message}</p>
103
- ${isSuccess
104
- ? '<p class="hint">You can close this window and return to the terminal.</p>'
105
- : ''}
106
- </div>
107
- </body>
108
- </html>`;
109
- }
110
- //# sourceMappingURL=auth-page.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-page.js","sourceRoot":"","sources":["../../src/auth/auth-page.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,QAAQ,GAAG,kFAAkF,CAAC;AAEpG;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAIhC;IACG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC;IAErC,0BAA0B;IAC1B,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAEtD,oDAAoD;IACpD,MAAM,IAAI,GAAG,SAAS;QAClB,CAAC,CAAC,oEAAoE,WAAW,kKAAkK;QACnP,CAAC,CAAC,oEAAoE,WAAW,oLAAoL,CAAC;IAE1Q,OAAO;;;;;aAKE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAiDG,WAAW;;;;;;;;;;;;;;;;;;;;;;;iCAuBC,QAAQ;UAC/B,IAAI;cACA,KAAK;aACN,OAAO;UAER,SAAS;QACL,CAAC,CAAC,2EAA2E;QAC7E,CAAC,CAAC,EACV;;;QAGA,CAAC;AACT,CAAC"}