zelari-code 0.1.1 → 0.1.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,35 +1,32 @@
1
1
  /**
2
- * grokOAuth — complete OAuth flow for xAI Grok / SuperGrok provider.
2
+ * grokOAuth — Device Authorization Grant (RFC 8628) flow for xAI Grok / SuperGrok.
3
3
  *
4
- * Implements PKCE OAuth2 (RFC 7636) flow with OpenID Connect discovery,
5
- * matching the pattern used by the reference `supergrok-oauth` client
6
- * (https://github.com/toptoppy/supergrok-oauth).
4
+ * xAI does NOT support the browser-redirect Authorization Code Grant for its
5
+ * public OAuth client (`response_type=code` returns "Only response_type=code
6
+ * is supported" against the device endpoint, and the redirect flow is not
7
+ * registered). Instead xAI exposes the Device Authorization Grant — the same
8
+ * "sign in on another device" pattern used by Netflix on TVs and GitHub CLI.
7
9
  *
8
- * 1. Fetch OpenID Connect discovery document from `{issuer}/.well-known/openid-configuration`
9
- * 2. Generate PKCE verifier + S256 challenge
10
- * 3. Build authorization URL with state, scope, code_challenge
11
- * 4. Start local OAuth callback server (port 56121, path /callback)
12
- * 5. Open the user's browser to the authorization URL
13
- * 6. Wait for the redirect callback to deliver the authorization code
14
- * 7. Verify state to prevent CSRF
15
- * 8. Exchange code for access token (with code_verifier) at the token endpoint
16
- * 9. Return { accessToken, expiresAt, refreshToken }
10
+ * Flow:
11
+ * 1. POST /oauth2/device/code → { device_code, user_code, verification_uri, ... }
12
+ * 2. Show the user: "Visit <verification_uri> and enter code <user_code>"
13
+ * 3. Poll POST /oauth2/token with grant_type=device_code until:
14
+ * - access_token returned (success)
15
+ * - "expired"/"denied" error
16
+ * - timeout
17
+ * 4. Return { accessToken, expiresAt, refreshToken }
17
18
  *
18
- * The browser launcher is INJECTED so tests can verify URL construction
19
- * without spawning a real browser. The fetch implementation is also injected
20
- * so tests can mock the token exchange.
19
+ * Endpoints (xAI auth server):
20
+ * - Device code: https://auth.x.ai/oauth2/device/code
21
+ * - Token: https://auth.x.ai/oauth2/token
21
22
  *
22
23
  * Default config (override via env GROK_OAUTH_CLIENT_ID):
23
- * - Issuer: https://auth.x.ai
24
24
  * - Client ID: b1a00492-073a-47ea-816f-4c329264a828 (xAI public OAuth client)
25
25
  * - Scope: openid profile email offline_access grok-cli:access api:access
26
- * - Redirect: http://127.0.0.1:56121/callback
27
26
  *
27
+ * @see https://datatracker.ietf.org/doc/html/rfc8628
28
28
  * @see docs/plans/2026-06-29-anathema-coder-v2.md (Task 16.2)
29
29
  */
30
- import { startOAuthCallbackServer } from './oauthCallbackServer.js';
31
- import nodeCrypto from 'node:crypto';
32
- const { getRandomValues, createHash } = nodeCrypto;
33
30
  export class GrokOAuthError extends Error {
34
31
  code;
35
32
  constructor(message, code) {
@@ -40,12 +37,10 @@ export class GrokOAuthError extends Error {
40
37
  }
41
38
  /**
42
39
  * Default xAI OAuth client ID — public client registered for SuperGrok OAuth
43
- * (same as used by the reference supergrok-oauth Python client).
40
+ * (same as used by the reference supergrok-oauth Python client + Grok-CLI).
44
41
  */
45
42
  export const DEFAULT_GROK_OAUTH_CLIENT_ID = 'b1a00492-073a-47ea-816f-4c329264a828';
46
- /** Default OAuth issuer for xAI authentication server. */
47
- export const DEFAULT_GROK_OAUTH_ISSUER = 'https://auth.x.ai';
48
- /** Default OAuth scopes for full SuperGrok access (matches supergrok-oauth config). */
43
+ /** Default OAuth scopes for full SuperGrok access. */
49
44
  export const DEFAULT_GROK_OAUTH_SCOPES = [
50
45
  'openid',
51
46
  'profile',
@@ -54,123 +49,85 @@ export const DEFAULT_GROK_OAUTH_SCOPES = [
54
49
  'grok-cli:access',
55
50
  'api:access',
56
51
  ];
57
- /** Default redirect port (matches supergrok-oauth config). */
58
- export const DEFAULT_GROK_OAUTH_REDIRECT_PORT = 56121;
59
- /** Default redirect path (matches supergrok-oauth config). */
60
- export const DEFAULT_GROK_OAUTH_REDIRECT_PATH = '/callback';
61
- /** Fetch the OpenID Connect discovery document. */
62
- export async function fetchGrokDiscovery(options = {}) {
63
- const fetchImpl = options.fetchImpl ?? fetch;
64
- const discoveryUrl = options.discoveryUrl ?? `${options.issuer ?? DEFAULT_GROK_OAUTH_ISSUER}/.well-known/openid-configuration`;
65
- let response;
66
- try {
67
- response = await fetchImpl(discoveryUrl, { method: 'GET', headers: { Accept: 'application/json' } });
68
- }
69
- catch (err) {
70
- throw new GrokOAuthError(`OAuth discovery network error: ${err instanceof Error ? err.message : String(err)}`, 'discovery_network_error');
71
- }
72
- if (!response.ok) {
73
- const text = await response.text().catch(() => '');
74
- throw new GrokOAuthError(`OAuth discovery HTTP ${response.status}: ${text.slice(0, 200)}`, `discovery_http_${response.status}`);
75
- }
76
- let body;
77
- try {
78
- body = await response.json();
79
- }
80
- catch (err) {
81
- throw new GrokOAuthError(`OAuth discovery returned invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
82
- }
83
- if (!body || typeof body !== 'object') {
84
- throw new GrokOAuthError('OAuth discovery returned non-object body');
85
- }
86
- const obj = body;
87
- if (typeof obj.authorization_endpoint !== 'string' || typeof obj.token_endpoint !== 'string') {
88
- throw new GrokOAuthError('OAuth discovery missing authorization_endpoint or token_endpoint');
89
- }
90
- return {
91
- authorizationEndpoint: obj.authorization_endpoint,
92
- tokenEndpoint: obj.token_endpoint,
93
- };
94
- }
52
+ /** Default device-code endpoint. */
53
+ export const DEFAULT_DEVICE_CODE_ENDPOINT = 'https://auth.x.ai/oauth2/device/code';
54
+ /** Default token endpoint (shared by device poll + refresh). */
55
+ export const DEFAULT_TOKEN_ENDPOINT = 'https://auth.x.ai/oauth2/token';
56
+ /** Device-code grant type URN (RFC 8628). */
57
+ export const DEVICE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';
58
+ /** Default overall authorization timeout (5 minutes). */
59
+ export const DEFAULT_OAUTH_TIMEOUT_MS = 300_000;
60
+ const defaultSleep = (ms) => new Promise((r) => setTimeout(r, ms));
95
61
  /**
96
- * Generate PKCE verifier (RFC 7636) and S256 challenge.
97
- * Returns base64url-encoded strings (no padding).
62
+ * Request a device authorization code (RFC 8628 §3.1).
63
+ *
64
+ * POSTs client_id + scope to the device-code endpoint and returns the
65
+ * device_code, user_code, verification_uri, and polling interval.
98
66
  */
99
- export function generatePkce() {
100
- // 64 random bytes → base64url → strip padding → take first 128 chars
101
- const random = getRandomValues(new Uint8Array(64));
102
- const verifier = Buffer.from(random).toString('base64url').slice(0, 128);
103
- // SHA-256(verifier) → base64url (no padding)
104
- const hash = createHash('sha256').update(verifier).digest();
105
- const challenge = hash.toString('base64url').replace(/=+$/, '');
106
- return { verifier, challenge };
107
- }
108
- /** Build the xAI authorization URL with PKCE. */
109
- export function buildGrokAuthorizeUrl(options) {
110
- const scopes = options.scopes ?? DEFAULT_GROK_OAUTH_SCOPES;
111
- const params = new URLSearchParams({
112
- client_id: options.clientId,
113
- redirect_uri: options.redirectUri,
114
- response_type: 'code',
115
- scope: scopes.join(' '),
116
- state: options.state ?? crypto.randomUUID(),
117
- code_challenge: options.codeChallenge,
118
- code_challenge_method: 'S256',
119
- });
120
- return `${options.authorizeEndpoint}?${params.toString()}`;
121
- }
122
- /** Exchange the authorization code for an access token. */
123
- export async function exchangeGrokCode(options) {
67
+ export async function requestDeviceCode(options) {
124
68
  const fetchImpl = options.fetchImpl ?? fetch;
69
+ const endpoint = options.deviceCodeEndpoint ?? DEFAULT_DEVICE_CODE_ENDPOINT;
70
+ const scopes = options.scopes ?? DEFAULT_GROK_OAUTH_SCOPES;
125
71
  let response;
126
72
  try {
127
- response = await fetchImpl(options.tokenEndpoint, {
73
+ response = await fetchImpl(endpoint, {
128
74
  method: 'POST',
129
75
  headers: {
130
76
  'Content-Type': 'application/x-www-form-urlencoded',
131
77
  Accept: 'application/json',
132
78
  },
133
79
  body: new URLSearchParams({
134
- grant_type: 'authorization_code',
135
80
  client_id: options.clientId,
136
- code: options.code,
137
- redirect_uri: options.redirectUri,
138
- code_verifier: options.codeVerifier,
81
+ scope: scopes.join(' '),
139
82
  }).toString(),
140
83
  });
141
84
  }
142
85
  catch (err) {
143
- throw new GrokOAuthError(`Token exchange network error: ${err instanceof Error ? err.message : String(err)}`);
86
+ throw new GrokOAuthError(`Device code request network error: ${err instanceof Error ? err.message : String(err)}`, 'device_code_network_error');
144
87
  }
145
88
  if (!response.ok) {
146
89
  const errText = await response.text().catch(() => '');
147
- throw new GrokOAuthError(`Token exchange HTTP ${response.status}: ${errText.slice(0, 200)}`, `http_${response.status}`);
90
+ throw new GrokOAuthError(`Device code request HTTP ${response.status}: ${errText.slice(0, 200)}`, `device_code_http_${response.status}`);
148
91
  }
149
92
  let body;
150
93
  try {
151
94
  body = await response.json();
152
95
  }
153
96
  catch (err) {
154
- throw new GrokOAuthError(`Token exchange returned invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
97
+ throw new GrokOAuthError(`Device code response invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
155
98
  }
156
99
  if (!body || typeof body !== 'object') {
157
- throw new GrokOAuthError('Token exchange returned non-object body');
100
+ throw new GrokOAuthError('Device code response is not an object');
158
101
  }
159
102
  const obj = body;
160
- const accessToken = obj.access_token;
161
- if (typeof accessToken !== 'string' || accessToken.length === 0) {
162
- throw new GrokOAuthError('Token exchange response missing access_token', 'no_access_token');
103
+ const deviceCode = obj.device_code;
104
+ const userCode = obj.user_code;
105
+ const verificationUri = obj.verification_uri;
106
+ if (typeof deviceCode !== 'string' || deviceCode.length === 0) {
107
+ throw new GrokOAuthError('Device code response missing device_code', 'no_device_code');
163
108
  }
164
- return parseTokenResponseBody(obj, accessToken, 'Token exchange');
109
+ if (typeof userCode !== 'string' || userCode.length === 0) {
110
+ throw new GrokOAuthError('Device code response missing user_code', 'no_user_code');
111
+ }
112
+ if (typeof verificationUri !== 'string' || verificationUri.length === 0) {
113
+ throw new GrokOAuthError('Device code response missing verification_uri', 'no_verification_uri');
114
+ }
115
+ return {
116
+ deviceCode,
117
+ userCode,
118
+ verificationUri,
119
+ ...(typeof obj.verification_uri_complete === 'string' && obj.verification_uri_complete.length > 0
120
+ ? { verificationUriComplete: obj.verification_uri_complete }
121
+ : {}),
122
+ expiresIn: typeof obj.expires_in === 'number' && Number.isFinite(obj.expires_in) ? obj.expires_in : 1800,
123
+ interval: typeof obj.interval === 'number' && Number.isFinite(obj.interval) ? obj.interval : 5,
124
+ };
165
125
  }
166
126
  /**
167
127
  * Parse the standard OAuth token response body into a GrokOAuthResult.
168
- * Shared between `exchangeGrokCode` and `refreshGrokToken`.
169
- *
170
- * @param label Human-readable label for the operation (used in error messages).
171
- * @param accessToken Pre-validated access token from the body.
128
+ * Shared between the device-code poll and `refreshGrokToken`.
172
129
  */
173
- function parseTokenResponseBody(obj, accessToken, label) {
130
+ function parseTokenResponseBody(obj, accessToken) {
174
131
  const result = { accessToken };
175
132
  if (typeof obj.expires_in === 'number' && Number.isFinite(obj.expires_in)) {
176
133
  result.expiresAt = Date.now() + obj.expires_in * 1000;
@@ -178,28 +135,163 @@ function parseTokenResponseBody(obj, accessToken, label) {
178
135
  if (typeof obj.refresh_token === 'string' && obj.refresh_token.length > 0) {
179
136
  result.refreshToken = obj.refresh_token;
180
137
  }
181
- // xAI SuperGrok OAuth also returns refresh_token_expires_in (refresh token TTL).
182
- // Capture it so callers can warn before the refresh token expires.
183
138
  if (typeof obj.refresh_token_expires_in === 'number' && Number.isFinite(obj.refresh_token_expires_in)) {
184
139
  result.refreshExpiresAt = Date.now() + obj.refresh_token_expires_in * 1000;
185
140
  }
186
- // Some providers also return `scope` — we ignore it for now.
187
- void obj;
188
- void label;
189
141
  return result;
190
142
  }
191
143
  /**
192
- * Exchange a refresh token for a new access token (Task D.2.1, v3-D).
144
+ * Poll the token endpoint with the device_code until the user authorizes,
145
+ * denies, the code expires, or the overall timeout is reached (RFC 8628 §3.4).
193
146
  *
194
- * Per RFC 6749 §6, the request body is:
195
- * grant_type=refresh_token&refresh_token=<token>&client_id=<id>
147
+ * Error codes per RFC 8628 §3.5:
148
+ * authorization_pending → keep polling (normal)
149
+ * slow_down → back off (increase interval by 5s)
150
+ * expired → device_code expired → fatal
151
+ * denied → user denied → fatal
152
+ * access_denied → (some providers) → fatal
153
+ */
154
+ export async function pollForDeviceToken(options) {
155
+ const fetchImpl = options.fetchImpl ?? fetch;
156
+ const sleep = options.sleepImpl ?? defaultSleep;
157
+ const endpoint = options.tokenEndpoint ?? DEFAULT_TOKEN_ENDPOINT;
158
+ const deadline = Date.now() + options.timeoutMs;
159
+ let interval = Math.max(options.interval, 1);
160
+ // eslint-disable-next-line no-constant-condition
161
+ while (true) {
162
+ if (Date.now() >= deadline) {
163
+ throw new GrokOAuthError('Device authorization timed out waiting for user approval', 'timeout');
164
+ }
165
+ let response;
166
+ try {
167
+ response = await fetchImpl(endpoint, {
168
+ method: 'POST',
169
+ headers: {
170
+ 'Content-Type': 'application/x-www-form-urlencoded',
171
+ Accept: 'application/json',
172
+ },
173
+ body: new URLSearchParams({
174
+ grant_type: DEVICE_GRANT_TYPE,
175
+ client_id: options.clientId,
176
+ device_code: options.deviceCode,
177
+ }).toString(),
178
+ });
179
+ }
180
+ catch (err) {
181
+ throw new GrokOAuthError(`Token poll network error: ${err instanceof Error ? err.message : String(err)}`, 'poll_network_error');
182
+ }
183
+ // Success: 200 with access_token.
184
+ if (response.ok) {
185
+ let body;
186
+ try {
187
+ body = await response.json();
188
+ }
189
+ catch (err) {
190
+ throw new GrokOAuthError(`Token response invalid JSON: ${err instanceof Error ? err.message : String(err)}`);
191
+ }
192
+ if (!body || typeof body !== 'object') {
193
+ throw new GrokOAuthError('Token response is not an object');
194
+ }
195
+ const obj = body;
196
+ const accessToken = obj.access_token;
197
+ if (typeof accessToken !== 'string' || accessToken.length === 0) {
198
+ throw new GrokOAuthError('Token response missing access_token', 'no_access_token');
199
+ }
200
+ return parseTokenResponseBody(obj, accessToken);
201
+ }
202
+ // Error: parse the OAuth error code to decide whether to keep polling.
203
+ let errBody = {};
204
+ try {
205
+ const parsed = await response.json();
206
+ if (parsed && typeof parsed === 'object')
207
+ errBody = parsed;
208
+ }
209
+ catch {
210
+ // Non-JSON error body — treat as transient and keep polling unless 4xx is definitive.
211
+ }
212
+ const errorCode = typeof errBody.error === 'string' ? errBody.error : `http_${response.status}`;
213
+ switch (errorCode) {
214
+ case 'authorization_pending':
215
+ await sleep(interval * 1000);
216
+ continue;
217
+ case 'slow_down':
218
+ // RFC 8628 §3.5: increase the interval by 5 seconds.
219
+ interval += 5;
220
+ await sleep(interval * 1000);
221
+ continue;
222
+ case 'expired_token':
223
+ case 'expired':
224
+ throw new GrokOAuthError('Device code expired before user authorized', 'expired');
225
+ case 'access_denied':
226
+ case 'denied':
227
+ throw new GrokOAuthError('User denied the authorization request', 'denied');
228
+ case 'invalid_grant':
229
+ throw new GrokOAuthError('Device code rejected (invalid_grant)', 'invalid_grant');
230
+ default:
231
+ // Unknown error — surface it rather than polling forever.
232
+ throw new GrokOAuthError(`Token poll error: ${errorCode}${typeof errBody.error_description === 'string' ? ` — ${errBody.error_description}` : ''}`, errorCode);
233
+ }
234
+ }
235
+ }
236
+ /**
237
+ * Run the complete Device Authorization Grant flow.
196
238
  *
197
- * Some providers also require `client_secret` — xAI does not (public OAuth).
239
+ * Steps:
240
+ * 1. Request a device code (user_code + verification_uri)
241
+ * 2. Call onUserCode() so the caller can display the code/URL to the user
242
+ * 3. Open the verification URI in the browser
243
+ * 4. Poll the token endpoint until authorized / denied / timed out
198
244
  *
199
- * The provider MAY rotate the refresh_token: callers should treat the
200
- * returned `refreshToken` (if any) as the new authoritative value and
201
- * persist it. If the provider does NOT return a new refresh_token, the
202
- * caller should keep using the previous one.
245
+ * @throws GrokOAuthError on any failure (network, denied, expired, timeout).
246
+ */
247
+ export async function runGrokOAuthFlow(options = {}) {
248
+ const clientId = options.clientId || process.env.GROK_OAUTH_CLIENT_ID || DEFAULT_GROK_OAUTH_CLIENT_ID;
249
+ if (!clientId || clientId.trim().length === 0) {
250
+ throw new GrokOAuthError('Missing clientId', 'no_client_id');
251
+ }
252
+ // Step 1: request device code.
253
+ const deviceAuth = await requestDeviceCode({
254
+ clientId,
255
+ scopes: options.scopes,
256
+ deviceCodeEndpoint: options.deviceCodeEndpoint,
257
+ fetchImpl: options.fetchImpl,
258
+ });
259
+ // Step 2: surface the user_code + verification_uri to the caller.
260
+ if (options.onUserCode) {
261
+ await options.onUserCode(deviceAuth);
262
+ }
263
+ // Step 3: open the browser to the verification URI (best-effort, non-blocking).
264
+ // Prefer verification_uri_complete when provided (pre-fills the user_code).
265
+ try {
266
+ await openBrowser(deviceAuth.verificationUriComplete ?? deviceAuth.verificationUri);
267
+ }
268
+ catch {
269
+ // Browser launch is best-effort — the user can still visit the URL manually
270
+ // (the code was already surfaced via onUserCode).
271
+ }
272
+ // Step 4: poll for the token. Timeout is the lesser of the overall timeout
273
+ // and the device_code lifetime (xAI will reject an expired code anyway).
274
+ const timeoutMs = options.timeoutMs ?? DEFAULT_OAUTH_TIMEOUT_MS;
275
+ const effectiveTimeout = Math.min(timeoutMs, deviceAuth.expiresIn * 1000);
276
+ return pollForDeviceToken({
277
+ clientId,
278
+ deviceCode: deviceAuth.deviceCode,
279
+ interval: deviceAuth.interval,
280
+ timeoutMs: effectiveTimeout,
281
+ tokenEndpoint: options.tokenEndpoint,
282
+ fetchImpl: options.fetchImpl,
283
+ sleepImpl: options.sleepImpl,
284
+ });
285
+ }
286
+ /**
287
+ * Exchange a refresh token for a new access token (RFC 6749 §6).
288
+ *
289
+ * Reuses the same xAI token endpoint as the device flow. The provider MAY
290
+ * rotate the refresh_token: callers should treat the returned `refreshToken`
291
+ * (if any) as the new authoritative value and persist it. If the provider
292
+ * does NOT return a new refresh_token, the caller keeps the previous one.
293
+ *
294
+ * Consumed by refreshRegistry.ts (grokRefreshAdapter) for auto-refresh.
203
295
  */
204
296
  export async function refreshGrokToken(options) {
205
297
  if (!options.clientId || options.clientId.trim().length === 0) {
@@ -208,7 +300,7 @@ export async function refreshGrokToken(options) {
208
300
  if (!options.refreshToken || options.refreshToken.trim().length === 0) {
209
301
  throw new GrokOAuthError('Missing refreshToken', 'no_refresh_token');
210
302
  }
211
- const endpoint = options.tokenEndpoint ?? 'https://oauth.x.ai/token';
303
+ const endpoint = options.tokenEndpoint ?? DEFAULT_TOKEN_ENDPOINT;
212
304
  const fetchImpl = options.fetchImpl ?? fetch;
213
305
  let response;
214
306
  try {
@@ -230,7 +322,6 @@ export async function refreshGrokToken(options) {
230
322
  }
231
323
  if (!response.ok) {
232
324
  const errText = await response.text().catch(() => '');
233
- // 400/401 with "invalid_grant" → refresh token expired or revoked.
234
325
  const code = response.status === 400 || response.status === 401 ? 'invalid_grant' : `http_${response.status}`;
235
326
  throw new GrokOAuthError(`Token refresh HTTP ${response.status}: ${errText.slice(0, 200)}`, code);
236
327
  }
@@ -249,95 +340,7 @@ export async function refreshGrokToken(options) {
249
340
  if (typeof accessToken !== 'string' || accessToken.length === 0) {
250
341
  throw new GrokOAuthError('Token refresh response missing access_token', 'no_access_token');
251
342
  }
252
- return parseTokenResponseBody(obj, accessToken, 'Token refresh');
253
- }
254
- /**
255
- * Run the complete OAuth flow.
256
- *
257
- * Steps:
258
- * 1. Fetch OpenID Connect discovery document
259
- * 2. Generate PKCE verifier + S256 challenge
260
- * 3. Build authorization URL
261
- * 4. Start local callback server
262
- * 5. Open browser
263
- * 6. Wait for callback
264
- * 7. Verify state to prevent CSRF
265
- * 8. Exchange code for token (with code_verifier)
266
- *
267
- * @throws GrokOAuthError on any failure (network, missing params, provider error).
268
- */
269
- export async function runGrokOAuthFlow(options) {
270
- const clientId = options.clientId || process.env.GROK_OAUTH_CLIENT_ID || DEFAULT_GROK_OAUTH_CLIENT_ID;
271
- if (!clientId || clientId.trim().length === 0) {
272
- throw new GrokOAuthError('Missing clientId', 'no_client_id');
273
- }
274
- const callbackPort = options.callbackPort ?? DEFAULT_GROK_OAUTH_REDIRECT_PORT;
275
- const callbackPath = options.callbackPath ?? DEFAULT_GROK_OAUTH_REDIRECT_PATH;
276
- const redirectUri = `http://127.0.0.1:${callbackPort}${callbackPath}`;
277
- // Step 1: fetch OpenID Connect discovery document.
278
- const discovery = await fetchGrokDiscovery({
279
- issuer: options.issuer,
280
- discoveryUrl: options.discoveryUrl,
281
- fetchImpl: options.fetchImpl,
282
- });
283
- // Step 2: generate PKCE verifier + S256 challenge.
284
- const { verifier: codeVerifier, challenge: codeChallenge } = generatePkce();
285
- const state = crypto.randomUUID();
286
- // Step 3: build authorize URL with PKCE.
287
- const authorizeUrl = buildGrokAuthorizeUrl({
288
- clientId,
289
- redirectUri,
290
- scopes: options.scopes,
291
- state,
292
- codeChallenge,
293
- authorizeEndpoint: discovery.authorizationEndpoint,
294
- });
295
- // Step 4: start callback server.
296
- let handle;
297
- try {
298
- handle = await startOAuthCallbackServer({
299
- port: callbackPort,
300
- timeoutMs: options.callbackTimeoutMs ?? 120_000,
301
- expectedPath: callbackPath,
302
- });
303
- }
304
- catch (err) {
305
- throw new GrokOAuthError(`Failed to start OAuth callback server on port ${callbackPort}: ${err instanceof Error ? err.message : String(err)}`, 'callback_bind_failed');
306
- }
307
- try {
308
- // Step 5: open browser (or call injected opener for tests).
309
- if (options.onBrowserOpen) {
310
- await options.onBrowserOpen(authorizeUrl);
311
- }
312
- else {
313
- // Production path: open in default browser.
314
- await openBrowser(authorizeUrl);
315
- }
316
- // Step 6: wait for callback.
317
- const callbackResult = await handle.waitForCode();
318
- // Step 7: verify state (CSRF protection).
319
- if (callbackResult.state !== state) {
320
- throw new GrokOAuthError(`OAuth state mismatch — possible CSRF. expected=${state} got=${callbackResult.state ?? '(none)'}`, 'state_mismatch');
321
- }
322
- if (callbackResult.error) {
323
- throw new GrokOAuthError(`OAuth provider returned error: ${callbackResult.error}${callbackResult.errorDescription ? ` — ${callbackResult.errorDescription}` : ''}`, callbackResult.error);
324
- }
325
- if (!callbackResult.code) {
326
- throw new GrokOAuthError('OAuth callback did not include authorization code', 'no_code');
327
- }
328
- // Step 8: exchange code for token (with code_verifier).
329
- return await exchangeGrokCode({
330
- clientId,
331
- code: callbackResult.code,
332
- codeVerifier,
333
- redirectUri,
334
- tokenEndpoint: discovery.tokenEndpoint,
335
- fetchImpl: options.fetchImpl,
336
- });
337
- }
338
- finally {
339
- handle.close();
340
- }
343
+ return parseTokenResponseBody(obj, accessToken);
341
344
  }
342
345
  /**
343
346
  * Open the given URL in the user's default browser. Cross-platform via
@@ -346,8 +349,6 @@ export async function runGrokOAuthFlow(options) {
346
349
  */
347
350
  export async function openBrowser(url) {
348
351
  const { spawn } = await import('node:child_process');
349
- // Detect platform via process.env.PLATFORM? Use process.platform.
350
- // 'darwin' → open, 'win32' → start (cmd /c start ""), else → xdg-open
351
352
  const cmd = (() => {
352
353
  switch (process.platform) {
353
354
  case 'darwin': return { bin: 'open', args: [url] };
@@ -360,11 +361,9 @@ export async function openBrowser(url) {
360
361
  const child = spawn(cmd.bin, cmd.args, { stdio: 'ignore', detached: true });
361
362
  child.on('error', (err) => reject(err));
362
363
  child.on('spawn', () => {
363
- // Detach so the browser process can outlive the Node CLI.
364
364
  child.unref();
365
365
  resolve();
366
366
  });
367
- // Fallback in case 'spawn' doesn't fire on all platforms.
368
367
  setTimeout(() => resolve(), 100);
369
368
  }
370
369
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"grokOAuth.js","sourceRoot":"","sources":["../../src/cli/grokOAuth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"grokOAuth.js","sourceRoot":"","sources":["../../src/cli/grokOAuth.ts"],"names":[],"mappings":"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"}