Skip to content

Commit 93f6f0b

Browse files
committed
Centralize API configuration selection by extracting a shared get_api_configuration utility and refactoring callers to use it
- is such logic [Fragment] used anywhere else? create an util in `apps/editor/src/utils` - remove unused imports └── apps └── editor └── src ├── commands │ ├── code-at-cursor-command │ │ └── utils │ │ └── get-code-at-cursor-config.ts │ └── generate-commit-message-commands │ └── utils │ └── get-commit-message-config.ts ├── features │ └── search-files │ └── search-modes │ └── perform-intelligent-search-mode.ts ├── services │ └── providers-manager.ts ├── utils │ ├── agentic-cli-invocation │ │ ├── agents │ │ │ └── muse.ts │ │ └── invoke-agentic-cli.ts │ ├── apply-reasoning-effort.ts │ ├── build-user-content.ts │ ├── changes-integration │ │ └── diff-processor │ │ └── test-cases │ │ ├── generic-1 │ │ │ ├── diff.txt │ │ │ ├── expected.txt │ │ │ └── original.txt │ │ ├── generic-2 │ │ │ ├── diff.txt │ │ │ ├── expected.txt │ │ │ └── original.txt │ │ ├── generic-5 │ │ │ ├── expected.txt │ │ │ └── original.txt │ │ └── generic-6 │ │ ├── expected.txt │ │ └── original.txt │ ├── cli-configuration-format-converters.ts │ ├── extract-paths-from-text │ │ └── extract-paths-from-text.spec.ts │ ├── get-api-configuration.ts │ ├── show-configurations-quick-pick.ts │ ├── show-missing-configuration-notification.ts │ └── web-configuration-format-converters.ts └── views ├── prompt │ ├── backend │ │ ├── message-handlers │ │ │ ├── configurations │ │ │ │ ├── handle-get-api-configurations.ts │ │ │ │ ├── handle-toggle-pinned-api-configuration.ts │ │ │ │ └── handle-update-api-configuration.ts │ │ │ ├── handle-make-api-call.ts │ │ │ ├── handle-patch-repair.ts │ │ │ ├── handle-voice-input.ts │ │ │ └── utils │ │ │ └── patch-repair-utils.ts │ │ └── prompt-view-provider.ts │ ├── frontend │ │ └── hooks │ │ └── use-prompt │ │ └── use-prompt.ts │ └── types │ └── messages.ts ├── settings │ ├── backend │ │ ├── message-handlers │ │ │ ├── handle-get-api-configurations.ts │ │ │ ├── handle-reorder-api-configurations.ts │ │ │ ├── handle-select-default-api-configuration.ts │ │ │ ├── handle-set-default-api-configuration.ts │ │ │ └── handle-update-api-configuration.ts │ │ └── settings-view-provider.ts │ ├── frontend │ │ └── hooks │ │ └── use-settings.ts │ └── types │ └── messages.ts └── shared └── actions └── api ├── delete.ts ├── reorder.ts └── update └── update.ts
1 parent 477e762 commit 93f6f0b

6 files changed

Lines changed: 221 additions & 386 deletions

File tree

Lines changed: 17 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,91 +1,31 @@
11
import * as vscode from 'vscode'
2-
import {
3-
ProvidersManager,
4-
get_api_configuration_id,
5-
ApiConfiguration
6-
} from '../../../services/providers-manager'
7-
import { Logger } from '@shared/utils/logger'
2+
import { ProvidersManager } from '../../../services/providers-manager'
83
import { LAST_USED_CODE_AT_CURSOR_CONFIG_ID_STATE_KEY } from '@/constants/state-keys'
9-
import { t } from '@/i18n'
10-
import { show_configurations_quick_pick } from '@/utils/show-configurations-quick-pick'
11-
import { show_incomplete_setup_warning } from '@/utils/show-missing-configuration-notification'
4+
import { get_api_configuration } from '@/utils/get-api-configuration'
125

136
export const get_code_at_cursor_api_configuration = async (params: {
147
providers_manager: ProvidersManager
158
show_quick_pick?: boolean
169
extension_context: vscode.ExtensionContext
1710
api_configuration_id?: string
1811
}): Promise<{ provider: any; api_configuration: any } | undefined> => {
19-
const code_at_cursor_api_configurations =
20-
await params.providers_manager.get_api_configurations()
21-
22-
if (code_at_cursor_api_configurations.length == 0) {
23-
show_incomplete_setup_warning('api')
24-
return
25-
}
26-
27-
let selected_api_configuration: ApiConfiguration | null = null
28-
29-
if (params.api_configuration_id !== undefined) {
30-
selected_api_configuration =
31-
code_at_cursor_api_configurations.find(
32-
(c) => get_api_configuration_id(c) === params.api_configuration_id
33-
) || null
34-
} else if (!params.show_quick_pick) {
35-
const default_api_configuration =
36-
await params.providers_manager.get_default_code_at_cursor_api_configuration()
37-
if (default_api_configuration) {
38-
selected_api_configuration = default_api_configuration
39-
} else if (code_at_cursor_api_configurations.length == 1) {
40-
selected_api_configuration = code_at_cursor_api_configurations[0]
41-
}
42-
}
43-
44-
if (!selected_api_configuration || params.show_quick_pick) {
45-
const last_selected_id =
46-
params.extension_context.workspaceState.get<string>(
47-
LAST_USED_CODE_AT_CURSOR_CONFIG_ID_STATE_KEY
48-
)
49-
50-
const result = await show_configurations_quick_pick({
51-
items: code_at_cursor_api_configurations,
52-
type: 'api',
53-
last_selected_id
54-
})
55-
56-
if (!result || result === 'back') {
57-
return undefined
58-
}
59-
60-
const { item: api_configuration, id } = result
61-
62-
params.extension_context.workspaceState.update(
63-
LAST_USED_CODE_AT_CURSOR_CONFIG_ID_STATE_KEY,
64-
id
65-
)
66-
67-
selected_api_configuration = api_configuration
68-
}
69-
70-
const provider = await params.providers_manager.get_provider(
71-
selected_api_configuration.provider_name
72-
)
73-
74-
if (!provider) {
75-
vscode.window.showErrorMessage(
76-
t('common.error.provider-not-found', {
77-
name: selected_api_configuration.provider_name
78-
})
79-
)
80-
Logger.warn({
81-
function_name: 'get_code_at_cursor_api_configuration',
82-
message: 'API provider not found for Code at Cursor tool.'
83-
})
84-
return
12+
const result = await get_api_configuration({
13+
providers_manager: params.providers_manager,
14+
show_quick_pick: params.show_quick_pick,
15+
extension_context: params.extension_context,
16+
api_configuration_id: params.api_configuration_id,
17+
last_used_state_key: LAST_USED_CODE_AT_CURSOR_CONFIG_ID_STATE_KEY,
18+
default_api_configuration:
19+
await params.providers_manager.get_default_code_at_cursor_api_configuration(),
20+
caller_name: 'get_code_at_cursor_api_configuration'
21+
})
22+
23+
if (!result || result === 'back') {
24+
return undefined
8525
}
8626

8727
return {
88-
provider,
89-
api_configuration: selected_api_configuration
28+
provider: result.provider,
29+
api_configuration: result.api_configuration
9030
}
9131
}
Lines changed: 17 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import * as vscode from 'vscode'
22
import { ProvidersManager } from '@/services/providers-manager'
3-
import { Logger } from '@shared/utils/logger'
43
import { LAST_USED_COMMIT_MESSAGES_CONFIG_ID_STATE_KEY } from '@/constants/state-keys'
5-
import { t } from '@/i18n'
6-
import { show_configurations_quick_pick } from '@/utils/show-configurations-quick-pick'
7-
import { show_incomplete_setup_warning } from '@/utils/show-missing-configuration-notification'
4+
import { get_api_configuration } from '@/utils/get-api-configuration'
85

96
export interface CommitMessageApiConfiguration {
107
provider_name: string
@@ -29,76 +26,28 @@ export const get_commit_message_api_configuration = async (params: {
2926
const show_quick_pick = params.show_quick_pick ?? false
3027
const show_back_button = params.show_back_button ?? true
3128

32-
let commit_message_api_configuration:
33-
| CommitMessageApiConfiguration
34-
| null
35-
| undefined
36-
| 'back' = undefined
37-
38-
if (!commit_message_api_configuration) {
39-
const api_configurations = await providers_manager.get_api_configurations()
40-
41-
if (api_configurations.length == 0) {
42-
show_incomplete_setup_warning('api')
43-
return null
44-
}
45-
46-
if (api_configurations.length == 1 && !show_quick_pick) {
47-
commit_message_api_configuration = api_configurations[0]
48-
} else if (api_configurations.length >= 1) {
49-
const last_selected_id =
50-
params.extension_context.workspaceState.get<string>(
51-
LAST_USED_COMMIT_MESSAGES_CONFIG_ID_STATE_KEY
52-
)
53-
54-
const result = await show_configurations_quick_pick({
55-
items: api_configurations,
56-
type: 'api',
57-
last_selected_id,
58-
show_back_button,
59-
ignore_focus_out: true
60-
})
61-
62-
if (result == 'back' || !result) {
63-
commit_message_api_configuration = 'back'
64-
} else {
65-
params.extension_context.workspaceState.update(
66-
LAST_USED_COMMIT_MESSAGES_CONFIG_ID_STATE_KEY,
67-
result.id
68-
)
69-
commit_message_api_configuration = result.item
70-
}
71-
}
72-
}
73-
74-
if (commit_message_api_configuration == 'back') {
29+
const result = await get_api_configuration({
30+
providers_manager,
31+
extension_context: params.extension_context,
32+
show_quick_pick,
33+
last_used_state_key: LAST_USED_COMMIT_MESSAGES_CONFIG_ID_STATE_KEY,
34+
show_back_button,
35+
ignore_focus_out: true,
36+
caller_name: 'get_commit_message_api_configuration',
37+
auto_select_last_used: false
38+
})
39+
40+
if (result === 'back') {
7541
return 'back'
7642
}
7743

78-
if (!commit_message_api_configuration) {
79-
return null
80-
}
81-
82-
const provider = await providers_manager.get_provider(
83-
commit_message_api_configuration.provider_name
84-
)
85-
86-
if (!provider) {
87-
vscode.window.showErrorMessage(
88-
t('common.error.provider-not-found', {
89-
name: commit_message_api_configuration.provider_name
90-
})
91-
)
92-
Logger.warn({
93-
function_name: 'get_commit_message_api_configuration',
94-
message: 'API provider not found for Commit Messages tool.'
95-
})
44+
if (!result) {
9645
return null
9746
}
9847

9948
return {
100-
api_configuration: commit_message_api_configuration,
101-
provider,
102-
base_url: provider.base_url
49+
api_configuration: result.api_configuration,
50+
provider: result.provider,
51+
base_url: result.provider.base_url
10352
}
10453
}
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
import * as vscode from 'vscode'
2+
import {
3+
ProvidersManager,
4+
get_api_configuration_id,
5+
Provider,
6+
ApiConfiguration
7+
} from '@/services/providers-manager'
8+
import { Logger } from '@shared/utils/logger'
9+
import { t } from '@/i18n'
10+
import { show_configurations_quick_pick } from '@/utils/show-configurations-quick-pick'
11+
import { show_incomplete_setup_warning } from '@/utils/show-missing-configuration-notification'
12+
import { PromptViewProvider } from '@/views/prompt/backend/prompt-view-provider'
13+
import { ApiPromptType } from '@shared/types/prompt-types'
14+
15+
export const get_api_configuration = async (params: {
16+
providers_manager: ProvidersManager
17+
show_quick_pick?: boolean
18+
extension_context: vscode.ExtensionContext
19+
prompt_view_provider?: PromptViewProvider
20+
api_configuration_id?: string
21+
prompt_type?: ApiPromptType
22+
last_used_state_key?: string
23+
default_api_configuration?: ApiConfiguration | null
24+
show_back_button?: boolean
25+
ignore_focus_out?: boolean
26+
caller_name?: string
27+
auto_select_last_used?: boolean
28+
}): Promise<
29+
{ provider: Provider; api_configuration: ApiConfiguration } | 'back' | undefined
30+
> => {
31+
const api_configurations =
32+
await params.providers_manager.get_api_configurations()
33+
34+
if (api_configurations.length === 0) {
35+
show_incomplete_setup_warning('api')
36+
return undefined
37+
}
38+
39+
let selected_api_configuration: ApiConfiguration | null = null
40+
const auto_select = params.auto_select_last_used ?? true
41+
42+
if (params.api_configuration_id !== undefined) {
43+
selected_api_configuration =
44+
api_configurations.find(
45+
(c) => get_api_configuration_id(c) === params.api_configuration_id
46+
) || null
47+
48+
if (selected_api_configuration && params.last_used_state_key) {
49+
params.extension_context.workspaceState.update(
50+
params.last_used_state_key,
51+
params.api_configuration_id
52+
)
53+
54+
if (params.prompt_view_provider && params.prompt_type) {
55+
params.prompt_view_provider.send_message({
56+
command: 'SELECTED_API_CONFIGURATION_CHANGED',
57+
prompt_type: params.prompt_type,
58+
id: params.api_configuration_id
59+
})
60+
}
61+
}
62+
} else if (!params.show_quick_pick) {
63+
if (params.default_api_configuration) {
64+
selected_api_configuration = params.default_api_configuration
65+
} else if (params.last_used_state_key && auto_select) {
66+
const last_selected_id =
67+
params.extension_context.workspaceState.get<string>(
68+
params.last_used_state_key
69+
)
70+
71+
if (last_selected_id) {
72+
selected_api_configuration =
73+
api_configurations.find(
74+
(c) => get_api_configuration_id(c) === last_selected_id
75+
) || null
76+
}
77+
}
78+
79+
if (!selected_api_configuration && api_configurations.length === 1) {
80+
selected_api_configuration = api_configurations[0]
81+
}
82+
}
83+
84+
if (!selected_api_configuration || params.show_quick_pick) {
85+
const last_selected_id = params.last_used_state_key
86+
? params.extension_context.workspaceState.get<string>(
87+
params.last_used_state_key
88+
)
89+
: undefined
90+
91+
const result = await show_configurations_quick_pick({
92+
items: api_configurations,
93+
type: 'api',
94+
last_selected_id,
95+
show_back_button: params.show_back_button,
96+
ignore_focus_out: params.ignore_focus_out
97+
})
98+
99+
if (params.prompt_view_provider) {
100+
params.prompt_view_provider.send_message({
101+
command: 'FOCUS_PROMPT_FIELD'
102+
})
103+
}
104+
105+
if (result === 'back') {
106+
return 'back'
107+
}
108+
109+
if (!result) {
110+
return undefined
111+
}
112+
113+
const { item: api_configuration, id } = result
114+
115+
if (params.last_used_state_key) {
116+
params.extension_context.workspaceState.update(
117+
params.last_used_state_key,
118+
id
119+
)
120+
}
121+
122+
if (params.prompt_view_provider && params.prompt_type) {
123+
params.prompt_view_provider.send_message({
124+
command: 'SELECTED_API_CONFIGURATION_CHANGED',
125+
prompt_type: params.prompt_type,
126+
id: id
127+
})
128+
}
129+
selected_api_configuration = api_configuration
130+
}
131+
132+
const provider = await params.providers_manager.get_provider(
133+
selected_api_configuration.provider_name
134+
)
135+
136+
if (!provider) {
137+
vscode.window.showErrorMessage(
138+
t('common.error.provider-not-found', {
139+
name: selected_api_configuration.provider_name
140+
})
141+
)
142+
Logger.warn({
143+
function_name: params.caller_name || 'get_api_configuration',
144+
message: `API provider not found.`
145+
})
146+
return undefined
147+
}
148+
149+
return {
150+
provider,
151+
api_configuration: selected_api_configuration
152+
}
153+
}

0 commit comments

Comments
 (0)