@terminai/cli 0.21.0 → 0.25.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 (97) hide show
  1. package/dist/package.json +4 -4
  2. package/dist/src/config/auth.js +59 -3
  3. package/dist/src/config/auth.js.map +1 -1
  4. package/dist/src/config/auth.test.js +33 -5
  5. package/dist/src/config/auth.test.js.map +1 -1
  6. package/dist/src/config/config.js +9 -53
  7. package/dist/src/config/config.js.map +1 -1
  8. package/dist/src/config/effectiveAuthType.d.ts +9 -0
  9. package/dist/src/config/effectiveAuthType.js +48 -0
  10. package/dist/src/config/effectiveAuthType.js.map +1 -0
  11. package/dist/src/config/keyBindings.js +21 -3
  12. package/dist/src/config/keyBindings.js.map +1 -1
  13. package/dist/src/config/settingsToProviderConfig.d.ts +19 -0
  14. package/dist/src/config/settingsToProviderConfig.js +114 -0
  15. package/dist/src/config/settingsToProviderConfig.js.map +1 -0
  16. package/dist/src/core/initializer.js +4 -2
  17. package/dist/src/core/initializer.js.map +1 -1
  18. package/dist/src/core/initializer.test.js +16 -3
  19. package/dist/src/core/initializer.test.js.map +1 -1
  20. package/dist/src/gemini.js +18 -6
  21. package/dist/src/gemini.js.map +1 -1
  22. package/dist/src/generated/git-commit.d.ts +2 -2
  23. package/dist/src/generated/git-commit.js +2 -2
  24. package/dist/src/generated/git-commit.js.map +1 -1
  25. package/dist/src/services/BuiltinCommandLoader.js +2 -0
  26. package/dist/src/services/BuiltinCommandLoader.js.map +1 -1
  27. package/dist/src/test-utils/render.js +1 -0
  28. package/dist/src/test-utils/render.js.map +1 -1
  29. package/dist/src/ui/AppContainer.js +26 -25
  30. package/dist/src/ui/AppContainer.js.map +1 -1
  31. package/dist/src/ui/auth/AuthDialog.test.js +9 -2
  32. package/dist/src/ui/auth/AuthDialog.test.js.map +1 -1
  33. package/dist/src/ui/auth/AuthProviderWizardFlow.d.ts +14 -0
  34. package/dist/src/ui/auth/AuthProviderWizardFlow.js +40 -0
  35. package/dist/src/ui/auth/AuthProviderWizardFlow.js.map +1 -0
  36. package/dist/src/ui/auth/AuthProviderWizardFlow.test.d.ts +7 -0
  37. package/dist/src/ui/auth/AuthProviderWizardFlow.test.js +104 -0
  38. package/dist/src/ui/auth/AuthProviderWizardFlow.test.js.map +1 -0
  39. package/dist/src/ui/auth/OpenAIChatGptOAuthSetupDialog.d.ts +16 -0
  40. package/dist/src/ui/auth/OpenAIChatGptOAuthSetupDialog.js +344 -0
  41. package/dist/src/ui/auth/OpenAIChatGptOAuthSetupDialog.js.map +1 -0
  42. package/dist/src/ui/auth/OpenAICompatibleSetupDialog.d.ts +3 -2
  43. package/dist/src/ui/auth/OpenAICompatibleSetupDialog.js +85 -16
  44. package/dist/src/ui/auth/OpenAICompatibleSetupDialog.js.map +1 -1
  45. package/dist/src/ui/auth/ProviderWizard.d.ts +3 -2
  46. package/dist/src/ui/auth/ProviderWizard.js +40 -4
  47. package/dist/src/ui/auth/ProviderWizard.js.map +1 -1
  48. package/dist/src/ui/auth/ProviderWizard.test.js +41 -3
  49. package/dist/src/ui/auth/ProviderWizard.test.js.map +1 -1
  50. package/dist/src/ui/auth/useAuth.js +9 -8
  51. package/dist/src/ui/auth/useAuth.js.map +1 -1
  52. package/dist/src/ui/auth/useAuth.test.js +1 -1
  53. package/dist/src/ui/auth/useAuth.test.js.map +1 -1
  54. package/dist/src/ui/commands/authCommand.js +103 -4
  55. package/dist/src/ui/commands/authCommand.js.map +1 -1
  56. package/dist/src/ui/commands/authCommand.test.js +36 -4
  57. package/dist/src/ui/commands/authCommand.test.js.map +1 -1
  58. package/dist/src/ui/commands/thinkCommand.d.ts +8 -0
  59. package/dist/src/ui/commands/thinkCommand.js +29 -0
  60. package/dist/src/ui/commands/thinkCommand.js.map +1 -0
  61. package/dist/src/ui/commands/types.d.ts +1 -1
  62. package/dist/src/ui/commands/types.js.map +1 -1
  63. package/dist/src/ui/components/DialogManager.js +66 -16
  64. package/dist/src/ui/components/DialogManager.js.map +1 -1
  65. package/dist/src/ui/components/Footer.js +3 -1
  66. package/dist/src/ui/components/Footer.js.map +1 -1
  67. package/dist/src/ui/components/SettingsDialog.d.ts +2 -1
  68. package/dist/src/ui/components/SettingsDialog.js +84 -8
  69. package/dist/src/ui/components/SettingsDialog.js.map +1 -1
  70. package/dist/src/ui/components/shared/TextInput.js +1 -1
  71. package/dist/src/ui/components/shared/TextInput.js.map +1 -1
  72. package/dist/src/ui/contexts/UIActionsContext.d.ts +1 -2
  73. package/dist/src/ui/contexts/UIActionsContext.js.map +1 -1
  74. package/dist/src/ui/hooks/slashCommandProcessor.d.ts +1 -0
  75. package/dist/src/ui/hooks/slashCommandProcessor.js +3 -0
  76. package/dist/src/ui/hooks/slashCommandProcessor.js.map +1 -1
  77. package/dist/src/ui/hooks/slashCommandProcessor.test.js +1 -0
  78. package/dist/src/ui/hooks/slashCommandProcessor.test.js.map +1 -1
  79. package/dist/src/ui/hooks/useAtCompletion.test.js +50 -45
  80. package/dist/src/ui/hooks/useAtCompletion.test.js.map +1 -1
  81. package/dist/src/ui/hooks/useQuotaAndFallback.js +4 -1
  82. package/dist/src/ui/hooks/useQuotaAndFallback.js.map +1 -1
  83. package/dist/src/ui/hooks/useQuotaAndFallback.test.js +1 -1
  84. package/dist/src/ui/hooks/useQuotaAndFallback.test.js.map +1 -1
  85. package/dist/src/ui/types.d.ts +2 -1
  86. package/dist/src/ui/types.js +1 -0
  87. package/dist/src/ui/types.js.map +1 -1
  88. package/dist/src/utils/handleAutoUpdate.d.ts +1 -1
  89. package/dist/src/utils/updateEventEmitter.d.ts +1 -1
  90. package/dist/src/utils/webRemoteServer.js +3 -6
  91. package/dist/src/utils/webRemoteServer.js.map +1 -1
  92. package/dist/src/utils/webRemoteServer.test.js +1 -1
  93. package/dist/src/utils/webRemoteServer.test.js.map +1 -1
  94. package/dist/src/validateNonInterActiveAuth.js +4 -1
  95. package/dist/src/validateNonInterActiveAuth.js.map +1 -1
  96. package/dist/tsconfig.tsbuildinfo +1 -1
  97. package/package.json +4 -4
@@ -0,0 +1,104 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * Portions Copyright 2025 TerminaI Authors
6
+ * SPDX-License-Identifier: Apache-2.0
7
+ */
8
+ import { act } from 'react';
9
+ import { describe, expect, it, vi } from 'vitest';
10
+ import { renderWithProviders } from '../../test-utils/render.js';
11
+ import { AuthProviderWizardFlow } from './AuthProviderWizardFlow.js';
12
+ import { OpenAICompatibleSetupDialog } from './OpenAICompatibleSetupDialog.js';
13
+ import { OpenAIChatGptOAuthSetupDialog } from './OpenAIChatGptOAuthSetupDialog.js';
14
+ import { ProviderWizard } from './ProviderWizard.js';
15
+ vi.mock('./ProviderWizard.js', () => ({
16
+ ProviderWizard: vi.fn(() => null),
17
+ }));
18
+ vi.mock('./OpenAICompatibleSetupDialog.js', () => ({
19
+ OpenAICompatibleSetupDialog: vi.fn(() => null),
20
+ }));
21
+ vi.mock('./OpenAIChatGptOAuthSetupDialog.js', () => ({
22
+ OpenAIChatGptOAuthSetupDialog: vi.fn(() => null),
23
+ }));
24
+ const mockedProviderWizard = ProviderWizard;
25
+ const mockedOpenAICompatibleSetupDialog = OpenAICompatibleSetupDialog;
26
+ const mockedOpenAIChatGptOAuthSetupDialog = OpenAIChatGptOAuthSetupDialog;
27
+ function getLatestProviderWizardProps() {
28
+ const call = mockedProviderWizard.mock.calls.at(-1)?.[0];
29
+ if (!call) {
30
+ throw new Error('ProviderWizard was not rendered');
31
+ }
32
+ return call;
33
+ }
34
+ function getLatestOpenAISetupProps() {
35
+ const call = mockedOpenAICompatibleSetupDialog.mock.calls.at(-1)?.[0];
36
+ if (!call) {
37
+ throw new Error('OpenAICompatibleSetupDialog was not rendered');
38
+ }
39
+ return call;
40
+ }
41
+ function getLatestChatGptSetupProps() {
42
+ const call = mockedOpenAIChatGptOAuthSetupDialog.mock.calls.at(-1)?.[0];
43
+ if (!call) {
44
+ throw new Error('OpenAIChatGptOAuthSetupDialog was not rendered');
45
+ }
46
+ return call;
47
+ }
48
+ describe('AuthProviderWizardFlow', () => {
49
+ it('renders ProviderWizard first', () => {
50
+ const settings = { merged: {} };
51
+ renderWithProviders(_jsx(AuthProviderWizardFlow, { settings: settings, terminalWidth: 100, onComplete: () => { } }));
52
+ expect(mockedProviderWizard).toHaveBeenCalledOnce();
53
+ expect(mockedOpenAICompatibleSetupDialog).not.toHaveBeenCalled();
54
+ expect(mockedOpenAIChatGptOAuthSetupDialog).not.toHaveBeenCalled();
55
+ });
56
+ it('switches to OpenAI setup and can go back', () => {
57
+ const settings = { merged: {} };
58
+ renderWithProviders(_jsx(AuthProviderWizardFlow, { settings: settings, terminalWidth: 123, onComplete: () => { } }));
59
+ act(() => {
60
+ getLatestProviderWizardProps().onSelectOpenAICompatible();
61
+ });
62
+ const openaiProps = getLatestOpenAISetupProps();
63
+ expect(openaiProps.terminalWidth).toBe(123);
64
+ act(() => {
65
+ openaiProps.onBack();
66
+ });
67
+ expect(mockedProviderWizard.mock.calls.length).toBeGreaterThan(1);
68
+ });
69
+ it('completes when Gemini path proceeds', () => {
70
+ const settings = { merged: {} };
71
+ const onComplete = vi.fn();
72
+ renderWithProviders(_jsx(AuthProviderWizardFlow, { settings: settings, terminalWidth: 100, onComplete: onComplete }));
73
+ act(() => {
74
+ getLatestProviderWizardProps().onProceedToGeminiAuth();
75
+ });
76
+ expect(onComplete).toHaveBeenCalledOnce();
77
+ });
78
+ it('completes when OpenAI setup completes', () => {
79
+ const settings = { merged: {} };
80
+ const onComplete = vi.fn();
81
+ renderWithProviders(_jsx(AuthProviderWizardFlow, { settings: settings, terminalWidth: 100, onComplete: onComplete }));
82
+ act(() => {
83
+ getLatestProviderWizardProps().onSelectOpenAICompatible();
84
+ });
85
+ act(() => {
86
+ getLatestOpenAISetupProps().onComplete();
87
+ });
88
+ expect(onComplete).toHaveBeenCalledOnce();
89
+ });
90
+ it('switches to ChatGPT OAuth setup and can go back', () => {
91
+ const settings = { merged: {} };
92
+ renderWithProviders(_jsx(AuthProviderWizardFlow, { settings: settings, terminalWidth: 123, onComplete: () => { } }));
93
+ act(() => {
94
+ getLatestProviderWizardProps().onSelectOpenAIChatGptOauth();
95
+ });
96
+ const chatgptProps = getLatestChatGptSetupProps();
97
+ expect(chatgptProps.terminalWidth).toBe(123);
98
+ act(() => {
99
+ chatgptProps.onBack();
100
+ });
101
+ expect(mockedProviderWizard.mock.calls.length).toBeGreaterThan(1);
102
+ });
103
+ });
104
+ //# sourceMappingURL=AuthProviderWizardFlow.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProviderWizardFlow.test.js","sourceRoot":"","sources":["../../../../src/ui/auth/AuthProviderWizardFlow.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Google LLC
4
+ * Portions Copyright 2025 TerminaI Authors
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import type { LoadedSettings } from '../../config/settings.js';
8
+ interface Props {
9
+ settings: LoadedSettings;
10
+ terminalWidth?: number;
11
+ onBack: () => void;
12
+ onComplete: () => void | Promise<void>;
13
+ onAuthError: (error: string | null) => void;
14
+ }
15
+ export declare function OpenAIChatGptOAuthSetupDialog({ settings, terminalWidth, onBack, onComplete, onAuthError, }: Props): import("react/jsx-runtime").JSX.Element;
16
+ export {};
@@ -0,0 +1,344 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * Portions Copyright 2025 TerminaI Authors
6
+ * SPDX-License-Identifier: Apache-2.0
7
+ */
8
+ import { Box, Text } from 'ink';
9
+ import { useCallback, useEffect, useRef, useState } from 'react';
10
+ import { buildWizardSettingsPatch, ChatGptOAuthClient, ChatGptOAuthCredentialStorage, DEFAULT_CHATGPT_CODEX_BASE_URL, DEFAULT_OPENAI_OAUTH_REDIRECT_PORT, tryImportFromCodexCli, tryImportFromOpenCode, coreEvents, CoreEvent, } from '@terminai/core';
11
+ import { SettingScope } from '../../config/settings.js';
12
+ import { theme } from '../semantic-colors.js';
13
+ import { useTextBuffer } from '../components/shared/text-buffer.js';
14
+ import { TextInput } from '../components/shared/TextInput.js';
15
+ import { checkExhaustive } from '../../utils/checks.js';
16
+ import process from 'node:process';
17
+ import * as http from 'node:http';
18
+ import { URL } from 'node:url';
19
+ import { CliSpinner } from '../components/CliSpinner.js';
20
+ import open from 'open';
21
+ export function OpenAIChatGptOAuthSetupDialog({ settings, terminalWidth, onBack, onComplete, onAuthError, }) {
22
+ const viewportWidth = Math.max(20, (terminalWidth ?? process.stdout.columns ?? 80) - 8);
23
+ const [step, setStep] = useState('model');
24
+ const [authUrl, setAuthUrl] = useState(null);
25
+ const [oauthState, setOauthState] = useState(null);
26
+ const [codeVerifier, setCodeVerifier] = useState(null);
27
+ const [oauthInProgress, setOauthInProgress] = useState(false);
28
+ const serverRef = useRef(null);
29
+ const openaiSettings = settings.merged.llm?.openaiChatgptOauth;
30
+ const defaultModel = openaiSettings?.model || '';
31
+ const defaultBaseUrl = openaiSettings?.baseUrl || DEFAULT_CHATGPT_CODEX_BASE_URL;
32
+ const modelBuffer = useTextBuffer({
33
+ initialText: defaultModel,
34
+ initialCursorOffset: defaultModel.length,
35
+ viewport: { width: viewportWidth, height: 3 },
36
+ isValidPath: () => false,
37
+ inputFilter: (text) => text.replace(/[\r\n]/g, ''),
38
+ singleLine: true,
39
+ });
40
+ const baseUrlBuffer = useTextBuffer({
41
+ initialText: defaultBaseUrl,
42
+ initialCursorOffset: defaultBaseUrl.length,
43
+ viewport: { width: viewportWidth, height: 3 },
44
+ isValidPath: () => false,
45
+ inputFilter: (text) => text.replace(/[\r\n]/g, ''),
46
+ singleLine: true,
47
+ });
48
+ const manualPasteBuffer = useTextBuffer({
49
+ initialText: '',
50
+ initialCursorOffset: 0,
51
+ viewport: { width: viewportWidth, height: 3 },
52
+ isValidPath: () => false,
53
+ inputFilter: (text) => text.replace(/[\r\n]/g, ''),
54
+ singleLine: true,
55
+ });
56
+ // Calculate target scope freshly on every render to avoid stale closure issues
57
+ // if settings object is mutated but not replaced.
58
+ const workspaceSettings = settings.forScope(SettingScope.Workspace).settings;
59
+ const workspaceOpenai = workspaceSettings.llm?.openaiChatgptOauth;
60
+ const hasWorkspaceOverride = workspaceSettings.llm?.provider !== undefined ||
61
+ workspaceSettings.llm?.openaiCompatible !== undefined ||
62
+ workspaceSettings.llm?.openaiChatgptOauth !== undefined ||
63
+ !!workspaceOpenai?.baseUrl ||
64
+ !!workspaceOpenai?.model ||
65
+ !!workspaceOpenai?.internalModel;
66
+ const targetScope = hasWorkspaceOverride
67
+ ? SettingScope.Workspace
68
+ : SettingScope.User;
69
+ useEffect(() => () => {
70
+ try {
71
+ serverRef.current?.close();
72
+ }
73
+ catch {
74
+ // ignore
75
+ }
76
+ serverRef.current = null;
77
+ }, []);
78
+ const startOauthFlow = useCallback(async (client) => {
79
+ const redirectUri = `http://localhost:${DEFAULT_OPENAI_OAUTH_REDIRECT_PORT}/auth/callback`;
80
+ const start = client.startAuthorization({ redirectUri });
81
+ setAuthUrl(start.authUrl);
82
+ setOauthState(start.state);
83
+ setCodeVerifier(start.codeVerifier);
84
+ setOauthInProgress(true);
85
+ // Auto-open browser like Google OAuth does
86
+ coreEvents.emit(CoreEvent.UserFeedback, {
87
+ severity: 'info',
88
+ message: `\nChatGPT OAuth login required.\n` +
89
+ `Attempting to open authentication page in your browser.\n` +
90
+ `Otherwise navigate to:\n${start.authUrl}\n`,
91
+ });
92
+ try {
93
+ const childProcess = await open(start.authUrl);
94
+ childProcess.on('error', (error) => {
95
+ coreEvents.emit(CoreEvent.UserFeedback, {
96
+ severity: 'warning',
97
+ message: `Could not auto-open browser: ${error.message}. Please copy the URL above.`,
98
+ });
99
+ });
100
+ }
101
+ catch (_err) {
102
+ // Browser auto-open failed, user can still copy the URL
103
+ coreEvents.emit(CoreEvent.UserFeedback, {
104
+ severity: 'warning',
105
+ message: 'Could not auto-open browser. Please copy the URL above.',
106
+ });
107
+ }
108
+ const server = await bindOAuthServerWithCancelRetry({
109
+ expectedState: start.state,
110
+ onCode: async (code) => {
111
+ const creds = await client.exchangeAuthorizationCode({
112
+ code,
113
+ redirectUri,
114
+ codeVerifier: start.codeVerifier,
115
+ });
116
+ await ChatGptOAuthCredentialStorage.save(creds);
117
+ coreEvents.emit(CoreEvent.UserFeedback, {
118
+ severity: 'info',
119
+ message: 'ChatGPT OAuth authentication succeeded!\n',
120
+ });
121
+ void onComplete();
122
+ },
123
+ onError: (e) => {
124
+ onAuthError(e.message);
125
+ },
126
+ });
127
+ serverRef.current = server;
128
+ }, [onAuthError, onComplete]);
129
+ const applyProviderSettings = useCallback(() => {
130
+ const model = modelBuffer.text.trim();
131
+ if (!model) {
132
+ onAuthError('Model is required.');
133
+ setStep('model');
134
+ return false;
135
+ }
136
+ const baseUrl = baseUrlBuffer.text.trim() || DEFAULT_CHATGPT_CODEX_BASE_URL;
137
+ const patches = buildWizardSettingsPatch({
138
+ provider: 'openai_chatgpt_oauth',
139
+ openaiChatgptOauth: { model, baseUrl },
140
+ });
141
+ for (const patch of patches) {
142
+ settings.setValue(targetScope, patch.path, patch.value);
143
+ }
144
+ return true;
145
+ }, [
146
+ baseUrlBuffer.text,
147
+ modelBuffer.text,
148
+ onAuthError,
149
+ settings,
150
+ targetScope,
151
+ ]);
152
+ const onSubmit = async () => {
153
+ switch (step) {
154
+ case 'model':
155
+ onAuthError(null);
156
+ setStep('base_url');
157
+ return;
158
+ case 'base_url': {
159
+ onAuthError(null);
160
+ if (!applyProviderSettings())
161
+ return;
162
+ const client = new ChatGptOAuthClient();
163
+ const imported = (await tryImportFromCodexCli(client)) ??
164
+ (await tryImportFromOpenCode(client));
165
+ // Ensure imported credentials strictly have the required account ID
166
+ if (imported && imported.accountId) {
167
+ await ChatGptOAuthCredentialStorage.save(imported);
168
+ void onComplete();
169
+ return;
170
+ }
171
+ setStep('oauth');
172
+ return;
173
+ }
174
+ case 'oauth': {
175
+ // Manual paste submit
176
+ onAuthError(null);
177
+ const redirectUrl = manualPasteBuffer.text.trim();
178
+ const parsed = parseRedirectUrl(redirectUrl);
179
+ if (!parsed) {
180
+ onAuthError('Could not parse redirect URL. Paste the full URL from your browser.');
181
+ return;
182
+ }
183
+ if (!oauthState || parsed.state !== oauthState) {
184
+ onAuthError('State mismatch. Restart the OAuth flow and try again.');
185
+ return;
186
+ }
187
+ if (!codeVerifier) {
188
+ onAuthError('OAuth state is missing. Restart the OAuth flow.');
189
+ return;
190
+ }
191
+ const redirectUri = `http://localhost:${DEFAULT_OPENAI_OAUTH_REDIRECT_PORT}/auth/callback`;
192
+ const client = new ChatGptOAuthClient();
193
+ const creds = await client.exchangeAuthorizationCode({
194
+ code: parsed.code,
195
+ redirectUri,
196
+ codeVerifier,
197
+ });
198
+ await ChatGptOAuthCredentialStorage.save(creds);
199
+ void onComplete();
200
+ return;
201
+ }
202
+ default:
203
+ checkExhaustive(step);
204
+ }
205
+ };
206
+ useEffect(() => {
207
+ if (step !== 'oauth' || oauthInProgress)
208
+ return;
209
+ if (!applyProviderSettings())
210
+ return;
211
+ const client = new ChatGptOAuthClient();
212
+ void startOauthFlow(client).catch((e) => {
213
+ const msg = e instanceof Error ? e.message : 'Failed to start OAuth flow';
214
+ onAuthError(msg);
215
+ });
216
+ }, [
217
+ applyProviderSettings,
218
+ oauthInProgress,
219
+ onAuthError,
220
+ startOauthFlow,
221
+ step,
222
+ ]);
223
+ const title = 'ChatGPT OAuth setup';
224
+ const description = (() => {
225
+ switch (step) {
226
+ case 'model':
227
+ return 'Enter the model ID (e.g. gpt-5.2-codex).';
228
+ case 'base_url':
229
+ return 'Optional: override the Codex base URL (default is chatgpt.com).';
230
+ case 'oauth':
231
+ return authUrl
232
+ ? 'Open the URL below in your browser to sign in. If you cannot use the local callback, paste the final redirect URL here.'
233
+ : 'Starting OAuth...';
234
+ default:
235
+ checkExhaustive(step);
236
+ return '';
237
+ }
238
+ })();
239
+ const buffer = step === 'model'
240
+ ? modelBuffer
241
+ : step === 'base_url'
242
+ ? baseUrlBuffer
243
+ : manualPasteBuffer;
244
+ return (_jsxs(Box, { borderStyle: "round", borderColor: theme.border.focused, flexDirection: "column", padding: 1, width: "100%", children: [_jsx(Text, { bold: true, color: theme.text.primary, children: title }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.text.primary, children: description }) }), step === 'oauth' && authUrl && (_jsxs(Box, { marginTop: 1, flexDirection: "column", width: "100%", children: [_jsx(Text, { color: theme.text.secondary, children: "If browser didn't open, copy this URL:" }), _jsx(Box, { marginTop: 1, width: "100%", children: _jsx(Text, { color: theme.text.link, wrap: "wrap", children: authUrl }) }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: theme.text.secondary, children: [_jsx(CliSpinner, { type: "dots" }), " Waiting for OAuth callback on", ' ', `localhost:${DEFAULT_OPENAI_OAUTH_REDIRECT_PORT}`] }) })] })), _jsx(Box, { marginTop: 1, children: _jsx(Box, { borderStyle: "round", borderColor: theme.border.default, paddingX: 1, flexGrow: 1, children: _jsx(TextInput, { buffer: buffer, onSubmit: onSubmit, onCancel: onBack }) }) }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: theme.text.secondary, children: "(Press Enter to continue, Esc to go back)" }), _jsxs(Text, { color: theme.text.secondary, children: ["Saving config scope:", ' ', targetScope === SettingScope.Workspace ? 'workspace' : 'user'] })] })] }));
245
+ }
246
+ function parseRedirectUrl(urlText) {
247
+ try {
248
+ const url = new URL(urlText);
249
+ const code = url.searchParams.get('code') ?? '';
250
+ const state = url.searchParams.get('state') ?? '';
251
+ if (!code || !state)
252
+ return null;
253
+ return { code, state };
254
+ }
255
+ catch {
256
+ return null;
257
+ }
258
+ }
259
+ async function bindOAuthServerWithCancelRetry(input) {
260
+ const port = DEFAULT_OPENAI_OAUTH_REDIRECT_PORT;
261
+ const host = 'localhost';
262
+ const server = http.createServer((req, res) => {
263
+ try {
264
+ const url = new URL(req.url ?? '/', `http://${host}:${port}`);
265
+ if (url.pathname === '/cancel') {
266
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
267
+ res.end('cancelled');
268
+ try {
269
+ server.close();
270
+ }
271
+ catch {
272
+ // ignore
273
+ }
274
+ return;
275
+ }
276
+ if (url.pathname !== '/auth/callback') {
277
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
278
+ res.end('not found');
279
+ return;
280
+ }
281
+ const code = url.searchParams.get('code') ?? '';
282
+ const state = url.searchParams.get('state') ?? '';
283
+ if (!code || !state) {
284
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
285
+ res.end('missing code/state');
286
+ return;
287
+ }
288
+ if (state !== input.expectedState) {
289
+ res.writeHead(400, { 'Content-Type': 'text/plain' });
290
+ res.end('state mismatch');
291
+ return;
292
+ }
293
+ res.writeHead(200, { 'Content-Type': 'text/html' });
294
+ res.end('<!doctype html><meta charset="utf-8"><title>TerminaI</title><p>Authentication complete. You can close this tab.</p>');
295
+ void input.onCode(code).catch((e) => {
296
+ const err = e instanceof Error ? e : new Error('OAuth exchange failed');
297
+ input.onError(err);
298
+ });
299
+ }
300
+ catch (e) {
301
+ const err = e instanceof Error ? e : new Error('OAuth callback failed');
302
+ input.onError(err);
303
+ res.writeHead(500, { 'Content-Type': 'text/plain' });
304
+ res.end('error');
305
+ }
306
+ });
307
+ await listenWithCancelRetry(server, { host, port });
308
+ return server;
309
+ }
310
+ async function listenWithCancelRetry(server, input) {
311
+ const attempts = 10;
312
+ const delayMs = 200;
313
+ for (let i = 0; i < attempts; i++) {
314
+ try {
315
+ await new Promise((resolve, reject) => {
316
+ const onError = (err) => {
317
+ server.off('error', onError);
318
+ reject(err);
319
+ };
320
+ server.once('error', onError);
321
+ server.listen(input.port, input.host, () => {
322
+ server.off('error', onError);
323
+ resolve();
324
+ });
325
+ });
326
+ return;
327
+ }
328
+ catch (e) {
329
+ const code = typeof e === 'object' &&
330
+ e !== null &&
331
+ 'code' in e &&
332
+ typeof e.code === 'string'
333
+ ? e.code
334
+ : '';
335
+ if (code !== 'EADDRINUSE') {
336
+ throw e;
337
+ }
338
+ await fetch(`http://${input.host}:${input.port}/cancel`).catch(() => { });
339
+ await new Promise((r) => setTimeout(r, delayMs));
340
+ }
341
+ }
342
+ throw new Error(`Failed to bind ${input.host}:${input.port}`);
343
+ }
344
+ //# sourceMappingURL=OpenAIChatGptOAuthSetupDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAIChatGptOAuthSetupDialog.js","sourceRoot":"","sources":["../../../../src/ui/auth/OpenAIChatGptOAuthSetupDialog.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EACL,wBAAwB,EACxB,kBAAkB,EAClB,6BAA6B,EAC7B,8BAA8B,EAC9B,kCAAkC,EAClC,qBAAqB,EACrB,qBAAqB,EACrB,UAAU,EACV,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,IAAI,MAAM,MAAM,CAAC;AAYxB,MAAM,UAAU,6BAA6B,CAAC,EAC5C,QAAQ,EACR,aAAa,EACb,MAAM,EACN,UAAU,EACV,WAAW,GACL;IACN,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAC5B,EAAE,EACF,CAAC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,CACpD,CAAC;IAEF,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC5D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9D,MAAM,SAAS,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAEnD,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC;IAC/D,MAAM,YAAY,GAAG,cAAc,EAAE,KAAK,IAAI,EAAE,CAAC;IACjD,MAAM,cAAc,GAClB,cAAc,EAAE,OAAO,IAAI,8BAA8B,CAAC;IAE5D,MAAM,WAAW,GAAG,aAAa,CAAC;QAChC,WAAW,EAAE,YAAY;QACzB,mBAAmB,EAAE,YAAY,CAAC,MAAM;QACxC,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;QACxB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QAClD,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,aAAa,CAAC;QAClC,WAAW,EAAE,cAAc;QAC3B,mBAAmB,EAAE,cAAc,CAAC,MAAM;QAC1C,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;QACxB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QAClD,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,MAAM,iBAAiB,GAAG,aAAa,CAAC;QACtC,WAAW,EAAE,EAAE;QACf,mBAAmB,EAAE,CAAC;QACtB,QAAQ,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;QAC7C,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;QACxB,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;QAClD,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IAEH,+EAA+E;IAC/E,kDAAkD;IAClD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC;IAC7E,MAAM,eAAe,GAAG,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,CAAC;IAClE,MAAM,oBAAoB,GACxB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,KAAK,SAAS;QAC7C,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,KAAK,SAAS;QACrD,iBAAiB,CAAC,GAAG,EAAE,kBAAkB,KAAK,SAAS;QACvD,CAAC,CAAC,eAAe,EAAE,OAAO;QAC1B,CAAC,CAAC,eAAe,EAAE,KAAK;QACxB,CAAC,CAAC,eAAe,EAAE,aAAa,CAAC;IAEnC,MAAM,WAAW,GAAG,oBAAoB;QACtC,CAAC,CAAC,YAAY,CAAC,SAAS;QACxB,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;IAEtB,SAAS,CACP,GAAG,EAAE,CAAC,GAAG,EAAE;QACT,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;IAC3B,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,cAAc,GAAG,WAAW,CAChC,KAAK,EAAE,MAA0B,EAAiB,EAAE;QAClD,MAAM,WAAW,GAAG,oBAAoB,kCAAkC,gBAAgB,CAAC;QAC3F,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAEzD,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1B,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,eAAe,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACpC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAEzB,2CAA2C;QAC3C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;YACtC,QAAQ,EAAE,MAAM;YAChB,OAAO,EACL,mCAAmC;gBACnC,2DAA2D;gBAC3D,2BAA2B,KAAK,CAAC,OAAO,IAAI;SAC/C,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;oBACtC,QAAQ,EAAE,SAAS;oBACnB,OAAO,EAAE,gCAAgC,KAAK,CAAC,OAAO,8BAA8B;iBACrF,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,IAAI,EAAE,CAAC;YACd,wDAAwD;YACxD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;gBACtC,QAAQ,EAAE,SAAS;gBACnB,OAAO,EAAE,yDAAyD;aACnE,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,8BAA8B,CAAC;YAClD,aAAa,EAAE,KAAK,CAAC,KAAK;YAC1B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACrB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC;oBACnD,IAAI;oBACJ,WAAW;oBACX,YAAY,EAAE,KAAK,CAAC,YAAY;iBACjC,CAAC,CAAC;gBACH,MAAM,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChD,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;oBACtC,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,2CAA2C;iBACrD,CAAC,CAAC;gBACH,KAAK,UAAU,EAAE,CAAC;YACpB,CAAC;YACD,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;SACF,CAAC,CAAC;QAEH,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAC7B,CAAC,EACD,CAAC,WAAW,EAAE,UAAU,CAAC,CAC1B,CAAC;IAEF,MAAM,qBAAqB,GAAG,WAAW,CAAC,GAAY,EAAE;QACtD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,WAAW,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO,CAAC,OAAO,CAAC,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,8BAA8B,CAAC;QAE5E,MAAM,OAAO,GAAG,wBAAwB,CAAC;YACvC,QAAQ,EAAE,sBAAsB;YAChC,kBAAkB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;SACvC,CAAC,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE;QACD,aAAa,CAAC,IAAI;QAClB,WAAW,CAAC,IAAI;QAChB,WAAW;QACX,QAAQ;QACR,WAAW;KACZ,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO;gBACV,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClB,OAAO,CAAC,UAAU,CAAC,CAAC;gBACpB,OAAO;YACT,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClB,IAAI,CAAC,qBAAqB,EAAE;oBAAE,OAAO;gBAErC,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;gBACxC,MAAM,QAAQ,GACZ,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;oBACrC,CAAC,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;gBAExC,oEAAoE;gBACpE,IAAI,QAAQ,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;oBACnC,MAAM,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACnD,KAAK,UAAU,EAAE,CAAC;oBAClB,OAAO;gBACT,CAAC;gBAED,OAAO,CAAC,OAAO,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,sBAAsB;gBACtB,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClB,MAAM,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAClD,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,WAAW,CACT,qEAAqE,CACtE,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBAC/C,WAAW,CAAC,uDAAuD,CAAC,CAAC;oBACrE,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,WAAW,CAAC,iDAAiD,CAAC,CAAC;oBAC/D,OAAO;gBACT,CAAC;gBAED,MAAM,WAAW,GAAG,oBAAoB,kCAAkC,gBAAgB,CAAC;gBAC3F,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;gBACxC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC;oBACnD,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,WAAW;oBACX,YAAY;iBACb,CAAC,CAAC;gBACH,MAAM,6BAA6B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChD,KAAK,UAAU,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;YACD;gBACE,eAAe,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,KAAK,OAAO,IAAI,eAAe;YAAE,OAAO;QAEhD,IAAI,CAAC,qBAAqB,EAAE;YAAE,OAAO;QAErC,MAAM,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACxC,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;YAC/C,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CAAC;YAC1E,WAAW,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC,EAAE;QACD,qBAAqB;QACrB,eAAe;QACf,WAAW;QACX,cAAc;QACd,IAAI;KACL,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,qBAAqB,CAAC;IAEpC,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;QACxB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,OAAO;gBACV,OAAO,0CAA0C,CAAC;YACpD,KAAK,UAAU;gBACb,OAAO,iEAAiE,CAAC;YAC3E,KAAK,OAAO;gBACV,OAAO,OAAO;oBACZ,CAAC,CAAC,yHAAyH;oBAC3H,CAAC,CAAC,mBAAmB,CAAC;YAC1B;gBACE,eAAe,CAAC,IAAI,CAAC,CAAC;gBACtB,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,MAAM,GACV,IAAI,KAAK,OAAO;QACd,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,IAAI,KAAK,UAAU;YACnB,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,iBAAiB,CAAC;IAE1B,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EACjC,aAAa,EAAC,QAAQ,EACtB,OAAO,EAAE,CAAC,EACV,KAAK,EAAC,MAAM,aAEZ,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,YACjC,KAAK,GACD,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,YAAG,WAAW,GAAQ,GACjD,EAEL,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,CAC9B,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,aACpD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,uDAE1B,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,KAAK,EAAC,MAAM,YAC7B,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAC,MAAM,YACtC,OAAO,GACH,GACH,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,aAC/B,KAAC,UAAU,IAAC,IAAI,EAAC,MAAM,GAAG,oCAA+B,GAAG,EAC3D,aAAa,kCAAkC,EAAE,IAC7C,GACH,IACF,CACP,EAED,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,KAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EACjC,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,YAEX,KAAC,SAAS,IAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAI,GAC/D,GACF,EAEN,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,aACf,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,0DAE1B,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,qCACV,GAAG,EACvB,WAAW,KAAK,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,IACzD,IACH,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,KAI7C;IACC,MAAM,IAAI,GAAG,kCAAkC,CAAC;IAChD,MAAM,IAAI,GAAG,WAAW,CAAC;IAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;YAC9D,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;gBACtC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBAC9B,OAAO;YACT,CAAC;YACD,IAAI,KAAK,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;gBAClC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;gBACrD,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;YACpD,GAAG,CAAC,GAAG,CACL,qHAAqH,CACtH,CAAC;YAEF,KAAK,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAU,EAAE,EAAE;gBAC3C,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACxE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YACxE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YACrD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,qBAAqB,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,MAAmB,EACnB,KAAqC;IAErC,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,OAAO,GAAG,GAAG,CAAC;IAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,OAAO,GAAG,CAAC,GAAY,EAAE,EAAE;oBAC/B,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC7B,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE;oBACzC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;oBAC7B,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,IAAI,GACR,OAAO,CAAC,KAAK,QAAQ;gBACrB,CAAC,KAAK,IAAI;gBACV,MAAM,IAAI,CAAC;gBACX,OAAQ,CAAwB,CAAC,IAAI,KAAK,QAAQ;gBAChD,CAAC,CAAE,CAAsB,CAAC,IAAI;gBAC9B,CAAC,CAAC,EAAE,CAAC;YACT,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1B,MAAM,CAAC,CAAC;YACV,CAAC;YACD,MAAM,KAAK,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACzE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,kBAAkB,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC"}
@@ -7,9 +7,10 @@
7
7
  import type { LoadedSettings } from '../../config/settings.js';
8
8
  interface Props {
9
9
  settings: LoadedSettings;
10
+ terminalWidth?: number;
10
11
  onBack: () => void;
11
- onComplete: () => void;
12
+ onComplete: () => void | Promise<void>;
12
13
  onAuthError: (error: string | null) => void;
13
14
  }
14
- export declare function OpenAICompatibleSetupDialog({ settings, onBack, onComplete, onAuthError, }: Props): import("react/jsx-runtime").JSX.Element;
15
+ export declare function OpenAICompatibleSetupDialog({ settings, terminalWidth, onBack, onComplete, onAuthError, }: Props): import("react/jsx-runtime").JSX.Element;
15
16
  export {};