zelari-code 0.1.2 → 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.
- package/README.md +4 -3
- package/dist/cli/app.js +18 -3
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/grokOAuth.js +215 -216
- package/dist/cli/grokOAuth.js.map +1 -1
- package/dist/cli/main.bundled.js +167 -319
- package/dist/cli/main.bundled.js.map +4 -4
- package/package.json +1 -1
package/dist/cli/grokOAuth.js
CHANGED
|
@@ -1,35 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* grokOAuth —
|
|
2
|
+
* grokOAuth — Device Authorization Grant (RFC 8628) flow for xAI Grok / SuperGrok.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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
|
|
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
|
|
58
|
-
export const
|
|
59
|
-
/** Default
|
|
60
|
-
export const
|
|
61
|
-
/**
|
|
62
|
-
export
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
*
|
|
97
|
-
*
|
|
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
|
|
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(
|
|
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
|
-
|
|
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(`
|
|
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(`
|
|
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(`
|
|
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('
|
|
100
|
+
throw new GrokOAuthError('Device code response is not an object');
|
|
158
101
|
}
|
|
159
102
|
const obj = body;
|
|
160
|
-
const
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
195
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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 ??
|
|
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
|
|
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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"}
|