zelari-code 1.33.1 → 1.34.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.
Files changed (50) hide show
  1. package/README.md +2 -2
  2. package/dist/cli/anthropicOAuth.js +153 -0
  3. package/dist/cli/anthropicOAuth.js.map +1 -0
  4. package/dist/cli/app.js +3 -1
  5. package/dist/cli/app.js.map +1 -1
  6. package/dist/cli/chatgptOAuth.js +245 -0
  7. package/dist/cli/chatgptOAuth.js.map +1 -0
  8. package/dist/cli/desktopConfig.js +66 -2
  9. package/dist/cli/desktopConfig.js.map +1 -1
  10. package/dist/cli/hooks/useChatTurn.js +6 -5
  11. package/dist/cli/hooks/useChatTurn.js.map +1 -1
  12. package/dist/cli/hooks/useSlashDispatch.js +4 -3
  13. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  14. package/dist/cli/keyStore.js +52 -4
  15. package/dist/cli/keyStore.js.map +1 -1
  16. package/dist/cli/main.bundled.js +2861 -1381
  17. package/dist/cli/main.bundled.js.map +4 -4
  18. package/dist/cli/main.js +60 -1
  19. package/dist/cli/main.js.map +1 -1
  20. package/dist/cli/modelDiscovery.js +106 -7
  21. package/dist/cli/modelDiscovery.js.map +1 -1
  22. package/dist/cli/modelPricing.js +9 -0
  23. package/dist/cli/modelPricing.js.map +1 -1
  24. package/dist/cli/oauthDesktop.js +136 -0
  25. package/dist/cli/oauthDesktop.js.map +1 -0
  26. package/dist/cli/oauthPkce.js +74 -0
  27. package/dist/cli/oauthPkce.js.map +1 -0
  28. package/dist/cli/oauthSession.js +53 -0
  29. package/dist/cli/oauthSession.js.map +1 -0
  30. package/dist/cli/provider/anthropic.js +205 -0
  31. package/dist/cli/provider/anthropic.js.map +1 -0
  32. package/dist/cli/provider/chatgpt.js +197 -0
  33. package/dist/cli/provider/chatgpt.js.map +1 -0
  34. package/dist/cli/provider/openai-compatible.js +14 -1
  35. package/dist/cli/provider/openai-compatible.js.map +1 -1
  36. package/dist/cli/provider/resolveStream.js +11 -0
  37. package/dist/cli/provider/resolveStream.js.map +1 -0
  38. package/dist/cli/providerConfig.js +2 -0
  39. package/dist/cli/providerConfig.js.map +1 -1
  40. package/dist/cli/refreshRegistry.js +13 -2
  41. package/dist/cli/refreshRegistry.js.map +1 -1
  42. package/dist/cli/runHeadless.js +3 -2
  43. package/dist/cli/runHeadless.js.map +1 -1
  44. package/dist/cli/slashCommands.js +10 -7
  45. package/dist/cli/slashCommands.js.map +1 -1
  46. package/dist/cli/slashHandlers/provider.js +46 -20
  47. package/dist/cli/slashHandlers/provider.js.map +1 -1
  48. package/dist/cli/toolRegistry.js +4 -3
  49. package/dist/cli/toolRegistry.js.map +1 -1
  50. package/package.json +2 -2
package/README.md CHANGED
@@ -57,7 +57,7 @@ zelari-code
57
57
  | **npm** | **≥ 10** | Ships with Node 20 LTS; tested with npm 10 and 11. |
58
58
  | **OS** | Linux, macOS, Windows 10/11 | Tested on Pop!_OS 24.04, macOS 15, Windows 11. Windows requires Git Bash (auto-detected). |
59
59
  | **Disk** | ~50 MB for the CLI + `@zelari/core` | Models are not bundled — provider APIs are remote. |
60
- | **Account + API key** | 1 of: xAI Grok, OpenAI-compatible, GLM/Z.AI, MiniMax, DeepSeek | OAuth Grok supported via `/login grok`. |
60
+ | **Account + API key** | 1 of: xAI Grok, ChatGPT, Anthropic, OpenAI-compatible, GLM/Z.AI, MiniMax, DeepSeek | OAuth via `/login grok`, `/login chatgpt`, `/login anthropic`. |
61
61
 
62
62
  ### Optional (advanced tools)
63
63
 
@@ -201,7 +201,7 @@ Full reference: **[docs/GUIDA.md](./docs/GUIDA.md#comandi-slash)** (all flags, e
201
201
  |---|---|
202
202
  | `/help` | List all commands + loaded skills |
203
203
  | `/exit` | Exit the CLI |
204
- | `/login <provider> [key]` | Set API key; `/login grok` starts OAuth |
204
+ | `/login <provider> [key]` | Set API key; `/login grok\|chatgpt\|anthropic` starts OAuth |
205
205
  | `/provider`, `/provider <id>` | Show / switch LLM provider |
206
206
  | `/provider custom <url>` | Self-hosted endpoint (Ollama, LM Studio, …) |
207
207
  | `/model <name>`, `/models` | Set model / list discovered models |
@@ -0,0 +1,153 @@
1
+ /**
2
+ * anthropicOAuth — Claude Pro/Max subscription login (magic-link / paste-code).
3
+ *
4
+ * Claude Code-style PKCE against claude.ai. The redirect is Anthropic's hosted
5
+ * callback, which shows a code (`CODE#STATE`) to paste back — no localhost.
6
+ */
7
+ import { generatePkcePair } from './oauthPkce.js';
8
+ import { savePendingOAuth, takePendingOAuth } from './oauthSession.js';
9
+ import { openBrowser } from './grokOAuth.js';
10
+ export const DEFAULT_ANTHROPIC_CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';
11
+ export const ANTHROPIC_AUTHORIZE_URL = 'https://claude.ai/oauth/authorize';
12
+ export const ANTHROPIC_TOKEN_URL = 'https://console.anthropic.com/v1/oauth/token';
13
+ export const ANTHROPIC_REDIRECT_URI = 'https://console.anthropic.com/oauth/code/callback';
14
+ export const ANTHROPIC_SCOPE = 'org:create_api_key user:profile user:inference';
15
+ export class AnthropicOAuthError extends Error {
16
+ code;
17
+ constructor(message, code) {
18
+ super(message);
19
+ this.code = code;
20
+ this.name = 'AnthropicOAuthError';
21
+ }
22
+ }
23
+ export function parseAnthropicPasteCode(raw) {
24
+ const trimmed = raw.trim().replace(/^['"]|['"]$/g, '');
25
+ const hash = trimmed.indexOf('#');
26
+ if (hash === -1)
27
+ return { code: trimmed };
28
+ return { code: trimmed.slice(0, hash), state: trimmed.slice(hash + 1) || undefined };
29
+ }
30
+ export function buildAnthropicAuthorizeUrl(opts) {
31
+ const params = new URLSearchParams({
32
+ code: 'true',
33
+ response_type: 'code',
34
+ client_id: opts.clientId,
35
+ redirect_uri: ANTHROPIC_REDIRECT_URI,
36
+ scope: ANTHROPIC_SCOPE,
37
+ code_challenge: opts.challenge,
38
+ code_challenge_method: 'S256',
39
+ state: opts.state,
40
+ });
41
+ return `${ANTHROPIC_AUTHORIZE_URL}?${params.toString()}`;
42
+ }
43
+ function clientId() {
44
+ const env = process.env.ANTHROPIC_OAUTH_CLIENT_ID;
45
+ return env && env.trim().length > 0 ? env : DEFAULT_ANTHROPIC_CLIENT_ID;
46
+ }
47
+ export async function startAnthropicOAuth(options = {}) {
48
+ const { verifier, challenge } = generatePkcePair();
49
+ const state = verifier;
50
+ savePendingOAuth({
51
+ provider: 'anthropic',
52
+ codeVerifier: verifier,
53
+ state,
54
+ createdAt: Date.now(),
55
+ });
56
+ const authorizeUrl = buildAnthropicAuthorizeUrl({
57
+ clientId: clientId(),
58
+ challenge,
59
+ state,
60
+ });
61
+ if (options.openBrowser !== false) {
62
+ try {
63
+ await (options.openBrowserImpl ?? openBrowser)(authorizeUrl);
64
+ }
65
+ catch {
66
+ /* caller shows the URL */
67
+ }
68
+ }
69
+ return { authorizeUrl, state };
70
+ }
71
+ async function postJson(url, payload, fetchImpl) {
72
+ let response;
73
+ try {
74
+ response = await fetchImpl(url, {
75
+ method: 'POST',
76
+ headers: {
77
+ 'Content-Type': 'application/json',
78
+ Accept: 'application/json',
79
+ 'User-Agent': 'anthropic',
80
+ },
81
+ body: JSON.stringify(payload),
82
+ });
83
+ }
84
+ catch (err) {
85
+ throw new AnthropicOAuthError(`Anthropic OAuth network error: ${err instanceof Error ? err.message : String(err)}`, 'network_error');
86
+ }
87
+ let body = {};
88
+ try {
89
+ const parsed = await response.json();
90
+ if (parsed && typeof parsed === 'object')
91
+ body = parsed;
92
+ }
93
+ catch {
94
+ /* empty */
95
+ }
96
+ return { status: response.status, body };
97
+ }
98
+ function parseToken(body, fallbackRefresh) {
99
+ const accessToken = body.access_token;
100
+ if (typeof accessToken !== 'string' || accessToken.length === 0) {
101
+ throw new AnthropicOAuthError('Token response missing access_token', 'no_access_token');
102
+ }
103
+ const result = { accessToken };
104
+ if (typeof body.expires_in === 'number' && Number.isFinite(body.expires_in)) {
105
+ result.expiresAt = Date.now() + body.expires_in * 1000;
106
+ }
107
+ const refresh = (typeof body.refresh_token === 'string' && body.refresh_token) || fallbackRefresh;
108
+ if (refresh)
109
+ result.refreshToken = refresh;
110
+ return result;
111
+ }
112
+ export async function completeAnthropicOAuth(options) {
113
+ const pending = takePendingOAuth('anthropic');
114
+ if (!pending) {
115
+ throw new AnthropicOAuthError('No pending Anthropic login — run /login anthropic first', 'no_pending');
116
+ }
117
+ const parsed = parseAnthropicPasteCode(options.pasteCode);
118
+ if (!parsed.code) {
119
+ throw new AnthropicOAuthError('Empty authorization code', 'no_code');
120
+ }
121
+ const fetchImpl = options.fetchImpl ?? fetch;
122
+ const payload = {
123
+ grant_type: 'authorization_code',
124
+ code: parsed.code,
125
+ code_verifier: pending.codeVerifier,
126
+ client_id: clientId(),
127
+ redirect_uri: ANTHROPIC_REDIRECT_URI,
128
+ state: parsed.state ?? pending.state,
129
+ };
130
+ const { status, body } = await postJson(ANTHROPIC_TOKEN_URL, payload, fetchImpl);
131
+ if (status >= 400) {
132
+ const code = status === 400 || status === 401 ? 'invalid_grant' : `http_${status}`;
133
+ throw new AnthropicOAuthError(`Anthropic token exchange HTTP ${status}: ${String(body.error ?? '').slice(0, 160)}`, code);
134
+ }
135
+ return parseToken(body);
136
+ }
137
+ export async function refreshAnthropicToken(options) {
138
+ if (!options.refreshToken.trim()) {
139
+ throw new AnthropicOAuthError('Missing refreshToken', 'no_refresh_token');
140
+ }
141
+ const fetchImpl = options.fetchImpl ?? fetch;
142
+ const { status, body } = await postJson(ANTHROPIC_TOKEN_URL, {
143
+ grant_type: 'refresh_token',
144
+ refresh_token: options.refreshToken,
145
+ client_id: clientId(),
146
+ }, fetchImpl);
147
+ if (status >= 400) {
148
+ const code = status === 400 || status === 401 ? 'invalid_grant' : `http_${status}`;
149
+ throw new AnthropicOAuthError(`Anthropic token refresh HTTP ${status}: ${String(body.error ?? '').slice(0, 160)}`, code);
150
+ }
151
+ return parseToken(body, options.refreshToken);
152
+ }
153
+ //# sourceMappingURL=anthropicOAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropicOAuth.js","sourceRoot":"","sources":["../../src/cli/anthropicOAuth.ts"],"names":[],"mappings":"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"}
package/dist/cli/app.js CHANGED
@@ -50,6 +50,8 @@ const providerDefaults = {
50
50
  'minimax': 'MiniMax-chat-latest',
51
51
  'glm': 'glm-4.5',
52
52
  'deepseek': 'deepseek-v4-pro',
53
+ 'chatgpt': 'gpt-5.2-codex',
54
+ 'anthropic': 'claude-sonnet-4-5',
53
55
  };
54
56
  /**
55
57
  * App — Ink UI shell (v0.7.0 static-scrollback layout).
@@ -120,7 +122,7 @@ export function App() {
120
122
  // tab-completion show current choices without an explicit /discover.
121
123
  useEffect(() => {
122
124
  const id = activeProviderSpec.id;
123
- if (!['grok', 'glm', 'minimax', 'deepseek', 'openai-compatible'].includes(id))
125
+ if (!['grok', 'glm', 'minimax', 'deepseek', 'openai-compatible', 'chatgpt', 'anthropic'].includes(id))
124
126
  return;
125
127
  if (!isModelsCacheStale(id))
126
128
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,245 @@
1
+ /**
2
+ * chatgptOAuth — ChatGPT subscription login (Codex public OAuth client).
3
+ *
4
+ * Magic-link / device flow (preferred, matches Grok UX):
5
+ * POST /api/accounts/deviceauth/usercode → user_code + verification_uri
6
+ * poll /api/accounts/deviceauth/token → authorization_code
7
+ * POST /oauth/token (authorization_code) → access + refresh
8
+ *
9
+ * Optional browser PKCE (localhost:1455) via CHATGPT_OAUTH_FLOW=browser.
10
+ */
11
+ import { generatePkcePair, generateOAuthState, waitForLoopbackCallback } from './oauthPkce.js';
12
+ import { openBrowser } from './grokOAuth.js';
13
+ export const DEFAULT_CHATGPT_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';
14
+ export const CHATGPT_AUTHORIZE_URL = 'https://auth.openai.com/oauth/authorize';
15
+ export const CHATGPT_TOKEN_URL = 'https://auth.openai.com/oauth/token';
16
+ export const CHATGPT_DEVICE_CODE_URL = 'https://auth.openai.com/api/accounts/deviceauth/usercode';
17
+ export const CHATGPT_DEVICE_TOKEN_URL = 'https://auth.openai.com/api/accounts/deviceauth/token';
18
+ export const CHATGPT_DEVICE_REDIRECT_URI = 'https://auth.openai.com/deviceauth/callback';
19
+ export const CHATGPT_SCOPE = 'openid profile email offline_access';
20
+ export const CHATGPT_AUTH_CLAIMS = 'https://api.openai.com/auth';
21
+ export class ChatgptOAuthError extends Error {
22
+ code;
23
+ constructor(message, code) {
24
+ super(message);
25
+ this.code = code;
26
+ this.name = 'ChatgptOAuthError';
27
+ }
28
+ }
29
+ export function decodeJwtClaims(token) {
30
+ const parts = token.split('.');
31
+ if (parts.length < 2)
32
+ return {};
33
+ try {
34
+ const json = Buffer.from(parts[1], 'base64url').toString('utf-8');
35
+ const parsed = JSON.parse(json);
36
+ return parsed && typeof parsed === 'object' ? parsed : {};
37
+ }
38
+ catch {
39
+ return {};
40
+ }
41
+ }
42
+ export function extractChatgptAccountId(idToken) {
43
+ if (!idToken)
44
+ return undefined;
45
+ const claims = decodeJwtClaims(idToken);
46
+ const auth = claims[CHATGPT_AUTH_CLAIMS];
47
+ if (auth && typeof auth === 'object') {
48
+ const id = auth.chatgpt_account_id;
49
+ if (typeof id === 'string' && id.length > 0)
50
+ return id;
51
+ }
52
+ return undefined;
53
+ }
54
+ function parseTokenPayload(obj, fallbackRefresh) {
55
+ const accessToken = obj.access_token;
56
+ if (typeof accessToken !== 'string' || accessToken.length === 0) {
57
+ throw new ChatgptOAuthError('Token response missing access_token', 'no_access_token');
58
+ }
59
+ const idToken = typeof obj.id_token === 'string' ? obj.id_token : undefined;
60
+ const refresh = (typeof obj.refresh_token === 'string' && obj.refresh_token) || fallbackRefresh;
61
+ const result = { accessToken };
62
+ if (typeof obj.expires_in === 'number' && Number.isFinite(obj.expires_in)) {
63
+ result.expiresAt = Date.now() + obj.expires_in * 1000;
64
+ }
65
+ if (refresh)
66
+ result.refreshToken = refresh;
67
+ if (idToken) {
68
+ result.idToken = idToken;
69
+ const accountId = extractChatgptAccountId(idToken);
70
+ if (accountId)
71
+ result.accountId = accountId;
72
+ }
73
+ return result;
74
+ }
75
+ async function postForm(url, data, fetchImpl) {
76
+ let response;
77
+ try {
78
+ response = await fetchImpl(url, {
79
+ method: 'POST',
80
+ headers: {
81
+ 'Content-Type': 'application/x-www-form-urlencoded',
82
+ Accept: 'application/json',
83
+ },
84
+ body: new URLSearchParams(data).toString(),
85
+ });
86
+ }
87
+ catch (err) {
88
+ throw new ChatgptOAuthError(`ChatGPT OAuth network error: ${err instanceof Error ? err.message : String(err)}`, 'network_error');
89
+ }
90
+ let body = {};
91
+ try {
92
+ const parsed = await response.json();
93
+ if (parsed && typeof parsed === 'object')
94
+ body = parsed;
95
+ }
96
+ catch {
97
+ /* empty */
98
+ }
99
+ return { status: response.status, body };
100
+ }
101
+ export async function refreshChatgptToken(options) {
102
+ if (!options.refreshToken.trim()) {
103
+ throw new ChatgptOAuthError('Missing refreshToken', 'no_refresh_token');
104
+ }
105
+ const clientId = options.clientId || process.env.CHATGPT_OAUTH_CLIENT_ID || DEFAULT_CHATGPT_CLIENT_ID;
106
+ const fetchImpl = options.fetchImpl ?? fetch;
107
+ const { status, body } = await postForm(CHATGPT_TOKEN_URL, {
108
+ grant_type: 'refresh_token',
109
+ refresh_token: options.refreshToken,
110
+ client_id: clientId,
111
+ }, fetchImpl);
112
+ if (status >= 400) {
113
+ const code = status === 400 || status === 401 ? 'invalid_grant' : `http_${status}`;
114
+ throw new ChatgptOAuthError(`ChatGPT token refresh HTTP ${status}: ${String(body.error ?? '').slice(0, 160)}`, code);
115
+ }
116
+ return parseTokenPayload(body, options.refreshToken);
117
+ }
118
+ export async function runChatgptDeviceFlow(options) {
119
+ const clientId = options.clientId || process.env.CHATGPT_OAUTH_CLIENT_ID || DEFAULT_CHATGPT_CLIENT_ID;
120
+ const fetchImpl = options.fetchImpl ?? fetch;
121
+ const sleep = options.sleepImpl ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
122
+ const { verifier, challenge } = generatePkcePair();
123
+ const start = await postForm(CHATGPT_DEVICE_CODE_URL, {
124
+ client_id: clientId,
125
+ scope: CHATGPT_SCOPE,
126
+ code_challenge: challenge,
127
+ code_challenge_method: 'S256',
128
+ }, fetchImpl);
129
+ if (start.status >= 400) {
130
+ throw new ChatgptOAuthError(`ChatGPT device-code HTTP ${start.status}`, `device_http_${start.status}`);
131
+ }
132
+ const deviceCode = start.body.device_code;
133
+ const userCode = start.body.user_code;
134
+ const verificationUri = (typeof start.body.verification_uri === 'string' && start.body.verification_uri) ||
135
+ (typeof start.body.verification_uri_complete === 'string' &&
136
+ start.body.verification_uri_complete);
137
+ if (typeof deviceCode !== 'string' ||
138
+ typeof userCode !== 'string' ||
139
+ typeof verificationUri !== 'string') {
140
+ throw new ChatgptOAuthError('Device-code response missing fields', 'no_device_code');
141
+ }
142
+ const info = {
143
+ userCode,
144
+ verificationUri,
145
+ ...(typeof start.body.verification_uri_complete === 'string'
146
+ ? { verificationUriComplete: start.body.verification_uri_complete }
147
+ : {}),
148
+ };
149
+ if (options.onUserCode)
150
+ await options.onUserCode(info);
151
+ try {
152
+ await (options.openBrowserImpl ?? openBrowser)(info.verificationUriComplete ?? info.verificationUri);
153
+ }
154
+ catch {
155
+ /* user can open the URL manually */
156
+ }
157
+ const timeoutMs = options.timeoutMs ?? 300_000;
158
+ const deadline = Date.now() + timeoutMs;
159
+ let interval = 5;
160
+ let authorizationCode;
161
+ while (Date.now() < deadline) {
162
+ const poll = await postForm(CHATGPT_DEVICE_TOKEN_URL, { client_id: clientId, device_code: deviceCode }, fetchImpl);
163
+ const authCode = poll.body.authorization_code;
164
+ if (typeof authCode === 'string' && authCode.length > 0) {
165
+ authorizationCode = authCode;
166
+ break;
167
+ }
168
+ const err = typeof poll.body.error === 'string' ? poll.body.error : '';
169
+ if (err === 'slow_down')
170
+ interval += 5;
171
+ else if (err && err !== 'authorization_pending') {
172
+ throw new ChatgptOAuthError(`Device authorization failed: ${err}`, err);
173
+ }
174
+ await sleep(interval * 1000);
175
+ }
176
+ if (!authorizationCode) {
177
+ throw new ChatgptOAuthError('Timed out waiting for ChatGPT device authorization', 'timeout');
178
+ }
179
+ const token = await postForm(CHATGPT_TOKEN_URL, {
180
+ grant_type: 'authorization_code',
181
+ code: authorizationCode,
182
+ redirect_uri: CHATGPT_DEVICE_REDIRECT_URI,
183
+ client_id: clientId,
184
+ code_verifier: verifier,
185
+ }, fetchImpl);
186
+ if (token.status >= 400) {
187
+ throw new ChatgptOAuthError(`ChatGPT token exchange HTTP ${token.status}`, `token_http_${token.status}`);
188
+ }
189
+ return parseTokenPayload(token.body);
190
+ }
191
+ export async function runChatgptBrowserFlow(options) {
192
+ const clientId = options.clientId || process.env.CHATGPT_OAUTH_CLIENT_ID || DEFAULT_CHATGPT_CLIENT_ID;
193
+ const port = options.port ?? 1455;
194
+ const redirectUri = `http://localhost:${port}/auth/callback`;
195
+ const state = generateOAuthState();
196
+ const { verifier, challenge } = generatePkcePair();
197
+ const params = new URLSearchParams({
198
+ client_id: clientId,
199
+ response_type: 'code',
200
+ redirect_uri: redirectUri,
201
+ scope: CHATGPT_SCOPE,
202
+ code_challenge: challenge,
203
+ code_challenge_method: 'S256',
204
+ state,
205
+ });
206
+ const authorizeUrl = `${CHATGPT_AUTHORIZE_URL}?${params.toString()}`;
207
+ try {
208
+ await (options.openBrowserImpl ?? openBrowser)(authorizeUrl);
209
+ }
210
+ catch {
211
+ /* printed by caller */
212
+ }
213
+ const cb = await waitForLoopbackCallback({
214
+ port,
215
+ path: '/auth/callback',
216
+ timeoutMs: options.timeoutMs ?? 300_000,
217
+ });
218
+ if (cb.error) {
219
+ throw new ChatgptOAuthError(`ChatGPT OAuth error: ${cb.error} ${cb.errorDescription ?? ''}`, cb.error);
220
+ }
221
+ if (cb.state !== state)
222
+ throw new ChatgptOAuthError('OAuth state mismatch', 'state_mismatch');
223
+ if (!cb.code)
224
+ throw new ChatgptOAuthError('Callback missing code', 'no_code');
225
+ const fetchImpl = options.fetchImpl ?? fetch;
226
+ const token = await postForm(CHATGPT_TOKEN_URL, {
227
+ grant_type: 'authorization_code',
228
+ code: cb.code,
229
+ redirect_uri: redirectUri,
230
+ client_id: clientId,
231
+ code_verifier: verifier,
232
+ }, fetchImpl);
233
+ if (token.status >= 400) {
234
+ throw new ChatgptOAuthError(`ChatGPT token exchange HTTP ${token.status}`, `token_http_${token.status}`);
235
+ }
236
+ return parseTokenPayload(token.body);
237
+ }
238
+ export async function runChatgptOAuthFlow(options = {}) {
239
+ const flow = (process.env.CHATGPT_OAUTH_FLOW ?? 'device').toLowerCase();
240
+ if (flow === 'browser') {
241
+ return runChatgptBrowserFlow(options);
242
+ }
243
+ return runChatgptDeviceFlow(options);
244
+ }
245
+ //# sourceMappingURL=chatgptOAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgptOAuth.js","sourceRoot":"","sources":["../../src/cli/chatgptOAuth.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,7 @@
8
8
  * --set-key --provider <id> --key <secret>
9
9
  * --discover-models [--provider <id>]
10
10
  */
11
- import { PROVIDERS, resolveApiKey, getKeyStorePath, setApiKey, maskKey, } from './keyStore.js';
11
+ import { PROVIDERS, resolveApiKey, getKeyStorePath, getOAuthToken, isOAuthProvider, setApiKey, maskKey, } from './keyStore.js';
12
12
  import { getProviderConfig, getProviderConfigPath, setActiveProviderId, setModelForProvider, setCustomEndpoint, clearCustomEndpoint, getCustomEndpoint, } from './providerConfig.js';
13
13
  import { getCachedModels, discoverModelsForProvider, } from './modelDiscovery.js';
14
14
  import { getCurrentVersion } from './updater.js';
@@ -22,6 +22,61 @@ export function wantsSetKey(argv) {
22
22
  export function wantsDiscoverModels(argv) {
23
23
  return argv.includes('--discover-models');
24
24
  }
25
+ export function wantsLoginOAuth(argv) {
26
+ return argv.includes('--login-oauth');
27
+ }
28
+ export function wantsRefreshOAuth(argv) {
29
+ return argv.includes('--refresh-oauth');
30
+ }
31
+ export function wantsLogoutOAuth(argv) {
32
+ return argv.includes('--logout-oauth');
33
+ }
34
+ export function parseLoginOAuthFlags(argv) {
35
+ if (!argv.includes('--login-oauth'))
36
+ return { request: null };
37
+ let provider;
38
+ let code;
39
+ let noBrowser = false;
40
+ for (let i = 0; i < argv.length; i++) {
41
+ const arg = argv[i];
42
+ if (arg === '--provider') {
43
+ provider = argv[i + 1];
44
+ i++;
45
+ }
46
+ else if (arg === '--code') {
47
+ code = argv[i + 1];
48
+ i++;
49
+ }
50
+ else if (arg === '--no-browser') {
51
+ noBrowser = true;
52
+ }
53
+ }
54
+ if (!provider || provider.trim().length === 0) {
55
+ return { request: null, error: '--login-oauth requires --provider <id>' };
56
+ }
57
+ return {
58
+ request: {
59
+ provider: provider.trim(),
60
+ code: code?.trim() || undefined,
61
+ noBrowser: noBrowser || undefined,
62
+ },
63
+ };
64
+ }
65
+ export function parseProviderOnlyFlag(argv, flag) {
66
+ if (!argv.includes(flag))
67
+ return { provider: null, present: false };
68
+ let provider;
69
+ for (let i = 0; i < argv.length; i++) {
70
+ if (argv[i] === '--provider') {
71
+ provider = argv[i + 1];
72
+ i++;
73
+ }
74
+ }
75
+ if (!provider || provider.trim().length === 0) {
76
+ return { provider: null, present: true, error: `${flag} requires --provider <id>` };
77
+ }
78
+ return { provider: provider.trim(), present: true };
79
+ }
25
80
  /**
26
81
  * Parse --set-config [--provider id] [--model name] [--endpoint url] [--endpoint-clear].
27
82
  */
@@ -136,15 +191,22 @@ export function buildDesktopConfigSnapshot() {
136
191
  }
137
192
  const custom = getCustomEndpoint(p.id);
138
193
  const builtin = p.baseUrl ?? null;
194
+ const stored = getOAuthToken(p.id);
195
+ const hasKey = !!resolveApiKey(p.id);
196
+ const oauth = Boolean(stored?.refreshToken || stored?.expiresAt);
139
197
  return {
140
198
  id: p.id,
141
199
  displayName: p.displayName,
142
- hasKey: !!resolveApiKey(p.id),
200
+ hasKey,
143
201
  envVar: p.envVar,
144
202
  models,
145
203
  defaultModel,
146
204
  endpoint: custom ?? null,
147
205
  baseUrl: custom ?? builtin,
206
+ authKind: !hasKey ? 'none' : oauth ? 'oauth' : 'api_key',
207
+ expiresAt: stored?.expiresAt ?? null,
208
+ hasRefreshToken: Boolean(stored?.refreshToken),
209
+ oauthSupported: isOAuthProvider(p.id),
148
210
  };
149
211
  });
150
212
  return {
@@ -240,6 +302,8 @@ const DISCOVERABLE = [
240
302
  'minimax',
241
303
  'deepseek',
242
304
  'openai-compatible',
305
+ 'chatgpt',
306
+ 'anthropic',
243
307
  ];
244
308
  /** Fetch and cache models; print JSON result. */
245
309
  export async function runDiscoverModels(providerArg) {