|
5 | 5 | * implemented there) — reused via `initialProviderId`, not reimplemented. |
6 | 6 | */ |
7 | 7 |
|
8 | | -import { |
9 | | - mergeProviderIntoSettings, |
10 | | - saveGlobalSettings, |
11 | | - saveLocalSettings, |
12 | | - type Settings, |
13 | | -} from "../config/settings.js" |
14 | | -import { validateProviderConnection } from "../provider/validate-connection.js" |
| 8 | +import type { Settings } from "../config/settings.js" |
| 9 | +import { buildProviderSubmitHandler } from "../tui/provider-setup-submit.js" |
15 | 10 | import { runProviderSetup, type ProviderSetupConfig } from "./provider-setup.js" |
16 | 11 |
|
17 | 12 | export type ConnectProviderInput = { |
@@ -40,58 +35,22 @@ export async function connectProviderInline( |
40 | 35 | input: ConnectProviderInput, |
41 | 36 | ): Promise<ConnectProviderResult> { |
42 | 37 | let result: ConnectProviderResult = { connected: false } |
| 38 | + const submitProvider = buildProviderSubmitHandler(input.settingsPath, input.existing, input.cwd) |
43 | 39 |
|
44 | 40 | const submitted = await runProviderSetup({ |
45 | 41 | showTelemetryNotice: false, |
46 | 42 | initialProviderId: input.providerId, |
47 | 43 | ...(input.createRenderer !== undefined ? { createRenderer: input.createRenderer } : {}), |
48 | 44 | ...(input.startLogin !== undefined ? { startLogin: input.startLogin } : {}), |
49 | | - onSubmit: async (values, setPhase, { skipValidation, preset, oauth }) => { |
50 | | - const { name, baseURL, apiKey, model } = values |
51 | | - const providerName = name.trim() |
52 | | - const trimmedBaseURL = baseURL.trim() |
53 | | - const trimmedKey = apiKey.trim() |
54 | | - |
55 | | - if (oauth !== undefined) { |
56 | | - setPhase("saving") |
57 | | - const base = input.existing ?? { providers: {} } |
58 | | - await saveGlobalSettings(input.settingsPath, { |
59 | | - ...base, |
60 | | - defaultProvider: oauth.providerName, |
61 | | - }) |
62 | | - await saveLocalSettings(input.localSettingsPath, { |
63 | | - provider: oauth.providerName, |
64 | | - model: model.trim(), |
65 | | - }) |
66 | | - result = { connected: true, providerName: oauth.providerName, model: model.trim() } |
67 | | - return |
68 | | - } |
69 | | - |
70 | | - if (!skipValidation && preset?.anthropic !== true) { |
71 | | - const check = await validateProviderConnection({ |
72 | | - baseURL: trimmedBaseURL, |
73 | | - apiKey: trimmedKey.length > 0 ? trimmedKey : undefined, |
74 | | - }) |
75 | | - if (!check.ok) throw new Error(check.error) |
76 | | - } |
77 | | - |
78 | | - setPhase("saving") |
79 | | - const selectedModel = model.trim() |
80 | | - const models = |
81 | | - preset !== undefined && preset.models.includes(selectedModel) |
82 | | - ? [...preset.models] |
83 | | - : [selectedModel] |
84 | | - const newProvider = { |
85 | | - baseURL: trimmedBaseURL, |
86 | | - models, |
87 | | - defaultModel: selectedModel, |
88 | | - ...(trimmedKey.length > 0 ? { apiKey: trimmedKey } : { keyless: true }), |
89 | | - ...(preset?.anthropic === true ? { anthropic: true } : {}), |
90 | | - ...(preset?.opencodeGo === true ? { opencodeGo: true } : {}), |
91 | | - } |
92 | | - const merged = mergeProviderIntoSettings(input.existing, providerName, newProvider) |
93 | | - await saveGlobalSettings(input.settingsPath, merged) |
94 | | - result = { connected: true, providerName, model: selectedModel } |
| 45 | + onSubmit: async (values, setPhase, opts) => { |
| 46 | + // Persistence and validation (empty-key rejection, connection test, |
| 47 | + // unverified marking) live in the one funnel every provider-setup exit |
| 48 | + // path shares — see buildProviderSubmitHandler. |
| 49 | + await submitProvider(values, setPhase, opts) |
| 50 | + result = |
| 51 | + opts.oauth !== undefined |
| 52 | + ? { connected: true, providerName: opts.oauth.providerName, model: values.model.trim() } |
| 53 | + : { connected: true, providerName: values.name.trim(), model: values.model.trim() } |
95 | 54 | }, |
96 | 55 | }) |
97 | 56 |
|
|
0 commit comments