Skip to content

Commit 971be0a

Browse files
committed
Introduce a unified settings menu to manage API providers and API tool configurations
1 parent 39fcc4b commit 971be0a

9 files changed

Lines changed: 148 additions & 82 deletions

File tree

packages/vscode/src/view/backend/message-handlers/handle-configure-api-providers.ts renamed to packages/vscode/src/view/backend/message-handlers/handle-open-settings/configure-api-providers.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const normalize_base_url = (url: string): string => {
1212
return url.trim().replace(/\/+$/, '')
1313
}
1414

15-
export const handle_configure_api_providers = async (
15+
export const configure_api_providers = async (
1616
provider: ViewProvider
1717
): Promise<void> => {
1818
const providers_manager = new ApiProvidersManager(provider.context)
@@ -92,7 +92,7 @@ export const handle_configure_api_providers = async (
9292
]
9393
}
9494

95-
const show_providers_quick_pick = async () => {
95+
const show_providers_quick_pick = async (): Promise<void> => {
9696
const saved_providers = await providers_manager.get_providers()
9797

9898
if (saved_providers.length == 0) {
@@ -106,13 +106,16 @@ export const handle_configure_api_providers = async (
106106
quick_pick.placeholder = 'Select an API provider to edit or add a new one'
107107

108108
return new Promise<void>((resolve) => {
109+
let is_accepted = false
110+
109111
quick_pick.onDidAccept(async () => {
112+
is_accepted = true
110113
const selected = quick_pick.selectedItems[0]
114+
quick_pick.hide()
115+
111116
if (selected.label == '$(add) Add another API provider...') {
112-
quick_pick.hide()
113117
await show_create_provider_quick_pick()
114118
} else if ('provider' in selected) {
115-
quick_pick.hide()
116119
await edit_provider(selected.provider as Provider)
117120
}
118121
resolve()
@@ -124,13 +127,17 @@ export const handle_configure_api_providers = async (
124127
index: number
125128
}
126129

127-
if (event.button === edit_button) {
128-
quick_pick.hide()
129-
await edit_provider(item.provider)
130-
resolve()
131-
} else if (event.button === change_api_key_button) {
130+
if (
131+
event.button === edit_button ||
132+
event.button === change_api_key_button
133+
) {
134+
is_accepted = true
132135
quick_pick.hide()
133-
await edit_built_in_provider(item.provider as BuiltInProvider)
136+
if (event.button === edit_button) {
137+
await edit_provider(item.provider)
138+
} else if (event.button === change_api_key_button) {
139+
await edit_built_in_provider(item.provider as BuiltInProvider)
140+
}
134141
resolve()
135142
} else if (event.button === delete_button) {
136143
const confirm = await vscode.window.showWarningMessage(
@@ -145,15 +152,17 @@ export const handle_configure_api_providers = async (
145152
(p) => p.name != item.provider.name
146153
)
147154
await providers_manager.save_providers(updated_providers)
148-
quick_pick.items = await create_provider_items()
155+
149156
if (updated_providers.length === 0) {
157+
is_accepted = true
150158
quick_pick.hide()
151159
vscode.window.showInformationMessage(
152160
'All API providers have been removed.'
153161
)
154162
await show_create_provider_quick_pick()
155163
resolve()
156164
} else {
165+
quick_pick.items = await create_provider_items()
157166
quick_pick.show()
158167
}
159168
}
@@ -184,7 +193,9 @@ export const handle_configure_api_providers = async (
184193
})
185194

186195
quick_pick.onDidHide(() => {
187-
resolve()
196+
if (!is_accepted) {
197+
resolve()
198+
}
188199
})
189200

190201
quick_pick.show()
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
import * as vscode from 'vscode'
2+
import { ViewProvider } from '@/view/backend/view-provider'
3+
import { configure_api_providers } from './configure-api-providers'
4+
import { setup_api_tool_multi_config } from './setup-api-tool-multi-config'
5+
import { setup_api_tool } from './setup-api-tool'
6+
7+
export const handle_open_settings = async (
8+
provider: ViewProvider
9+
): Promise<void> => {
10+
const show_main_menu = async () => {
11+
const selected = await vscode.window.showQuickPick(
12+
[
13+
{
14+
label: 'Configure API Providers',
15+
detail:
16+
'OpenAI-compatible API endpoints to use by API tools. API keys never leave your device.'
17+
},
18+
{
19+
label: 'API tools',
20+
kind: vscode.QuickPickItemKind.Separator
21+
},
22+
{
23+
label: 'Code Completions',
24+
description: 'Get code at cursor from state-of-the-art reasoning models.'
25+
},
26+
{
27+
label: 'Edit Context',
28+
description:
29+
'Create and modify files in context based on natural language instructions.'
30+
},
31+
{
32+
label: 'Intelligent Update',
33+
description:
34+
'Handle "truncated" edit format and fix malformed diffs.'
35+
},
36+
{
37+
label: 'Commit Messages',
38+
description:
39+
'Generate meaningful commit messages precisely adhering to your style.'
40+
}
41+
],
42+
{
43+
title: 'Settings',
44+
placeHolder: 'Select option'
45+
}
46+
)
47+
48+
if (!selected) {
49+
return
50+
}
51+
52+
switch (selected.label) {
53+
case 'Configure API Providers':
54+
await configure_api_providers(provider)
55+
break
56+
case 'Code Completions':
57+
await setup_api_tool_multi_config({
58+
provider,
59+
tool: 'code-completions'
60+
})
61+
break
62+
case 'Edit Context':
63+
await setup_api_tool_multi_config({
64+
provider,
65+
tool: 'edit-context'
66+
})
67+
break
68+
case 'Intelligent Update':
69+
await setup_api_tool_multi_config({
70+
provider,
71+
tool: 'intelligent-update'
72+
})
73+
break
74+
case 'Commit Messages':
75+
await setup_api_tool({
76+
provider,
77+
tool: 'commit-messages'
78+
})
79+
break
80+
}
81+
82+
// Return to main menu after completing any operation
83+
await show_main_menu()
84+
}
85+
86+
await show_main_menu()
87+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './handle-open-settings'

packages/vscode/src/view/backend/message-handlers/handle-setup-api-tool-multi-config.ts renamed to packages/vscode/src/view/backend/message-handlers/handle-open-settings/setup-api-tool-multi-config.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ interface ToolMethods {
2828
get_display_name: () => string
2929
}
3030

31-
export const handle_setup_api_tool_multi_config = async (params: {
31+
export const setup_api_tool_multi_config = async (params: {
3232
provider: ViewProvider
3333
tool: SupportedTool
3434
}): Promise<void> => {
@@ -207,8 +207,11 @@ export const handle_setup_api_tool_multi_config = async (params: {
207207
quick_pick.matchOnDescription = true
208208
quick_pick.placeholder = 'Select a configuration to edit or add another one'
209209

210+
let is_accepted = false
211+
210212
return new Promise<void>((resolve) => {
211213
quick_pick.onDidAccept(async () => {
214+
is_accepted = true
212215
const selected = quick_pick.selectedItems[0]
213216
if (!selected) {
214217
quick_pick.hide()
@@ -220,10 +223,12 @@ export const handle_setup_api_tool_multi_config = async (params: {
220223
quick_pick.hide()
221224
await add_configuration()
222225
await show_configs_quick_pick()
226+
resolve()
223227
} else if ('config' in selected && selected.config) {
224228
quick_pick.hide()
225229
await edit_configuration(selected.config as ToolConfig)
226230
await show_configs_quick_pick()
231+
resolve()
227232
}
228233
})
229234

@@ -234,9 +239,11 @@ export const handle_setup_api_tool_multi_config = async (params: {
234239
}
235240

236241
if (event.button === edit_button) {
242+
is_accepted = true
237243
quick_pick.hide()
238244
await edit_configuration(item.config)
239245
await show_configs_quick_pick()
246+
resolve()
240247
} else if (event.button === delete_button) {
241248
const confirm = await vscode.window.showWarningMessage(
242249
`Are you sure you want to delete ${item.config.model} (${item.config.provider_name})?`,
@@ -259,11 +266,13 @@ export const handle_setup_api_tool_multi_config = async (params: {
259266
}
260267

261268
if (current_configs.length == 0) {
269+
is_accepted = true
262270
quick_pick.hide()
263271
await add_configuration()
264272
if (current_configs.length > 0) {
265273
await show_configs_quick_pick()
266274
}
275+
resolve()
267276
} else {
268277
quick_pick.items = create_config_items()
269278
quick_pick.show()
@@ -305,7 +314,9 @@ export const handle_setup_api_tool_multi_config = async (params: {
305314
})
306315

307316
quick_pick.onDidHide(() => {
308-
resolve()
317+
if (!is_accepted) {
318+
resolve()
319+
}
309320
})
310321

311322
quick_pick.show()

packages/vscode/src/view/backend/message-handlers/handle-setup-api-tool.ts renamed to packages/vscode/src/view/backend/message-handlers/handle-open-settings/setup-api-tool.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const DEFAULT_TEMPERATURE: { [key in SupportedTool]: number } = {
1818

1919
const DEFAULT_CONFIRMATION_THRESHOLD = 20000
2020

21-
export const handle_setup_api_tool = async (params: {
21+
export const setup_api_tool = async (params: {
2222
provider: ViewProvider
2323
tool: SupportedTool
2424
}): Promise<void> => {

packages/vscode/src/view/backend/message-handlers/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
export * from './handle-copy-prompt'
2-
export * from './handle-configure-api-providers'
32
export * from './handle-create-preset'
43
export * from './handle-delete-preset'
54
export * from './handle-duplicate-preset'
@@ -21,8 +20,6 @@ export * from './handle-send-prompt'
2120
export * from './handle-show-preset-picker'
2221
export * from './handle-show-quick-pick'
2322
export * from './handle-update-preset'
24-
export * from './handle-setup-api-tool-multi-config'
25-
export * from './handle-setup-api-tool'
2623
export * from './handle-pick-open-router-model'
2724
export * from './handle-save-home-view-type'
2825
export * from './handle-get-home-view-type'
@@ -34,3 +31,4 @@ export * from './handle-get-mode-web'
3431
export * from './handle-get-mode-api'
3532
export * from './handle-save-mode-web'
3633
export * from './handle-save-mode-api'
34+
export * from './handle-open-settings'

packages/vscode/src/view/backend/view-provider.ts

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,17 @@ import {
3636
handle_get_instructions,
3737
handle_request_editor_state,
3838
handle_request_editor_selection_state,
39-
handle_configure_api_providers,
40-
handle_setup_api_tool_multi_config,
41-
handle_setup_api_tool,
42-
handle_pick_open_router_model,
43-
handle_save_home_view_type,
44-
handle_get_home_view_type,
4539
handle_edit_context,
4640
handle_code_completion,
4741
handle_get_edit_format,
4842
handle_at_sign_quick_pick,
4943
handle_get_mode_web,
5044
handle_save_mode_web,
5145
handle_get_mode_api,
52-
handle_save_mode_api
46+
handle_save_mode_api,
47+
handle_save_home_view_type,
48+
handle_get_home_view_type,
49+
handle_open_settings
5350
} from './message-handlers'
5451
import {
5552
config_preset_to_ui_format,
@@ -347,7 +344,11 @@ export class ViewProvider implements vscode.WebviewViewProvider {
347344
} else if (message.command == 'PREVIEW_PRESET') {
348345
await handle_preview_preset(this, message)
349346
} else if (message.command == 'COPY_PROMPT') {
350-
await handle_copy_prompt(this, message.instruction, message.preset_name)
347+
await handle_copy_prompt(
348+
this,
349+
message.instruction,
350+
message.preset_name
351+
)
351352
} else if (message.command == 'SHOW_PRESET_PICKER') {
352353
await handle_show_preset_picker(this)
353354
} else if (message.command == 'REQUEST_EDITOR_STATE') {
@@ -388,36 +389,14 @@ export class ViewProvider implements vscode.WebviewViewProvider {
388389
await handle_save_edit_format(this, message)
389390
} else if (message.command == 'CARET_POSITION_CHANGED') {
390391
this.caret_position = message.caret_position
391-
} else if (message.command == 'CONFIGURE_API_PROVIDERS') {
392-
handle_configure_api_providers(this)
393-
} else if (message.command == 'SETUP_API_TOOL_CODE_COMPLETIONS') {
394-
await handle_setup_api_tool_multi_config({
395-
provider: this,
396-
tool: 'code-completions'
397-
})
398-
} else if (message.command == 'SETUP_API_TOOL_EDIT_CONTEXT') {
399-
await handle_setup_api_tool_multi_config({
400-
provider: this,
401-
tool: 'edit-context'
402-
})
403-
} else if (message.command == 'SETUP_API_TOOL_INTELLIGENT_UPDATE') {
404-
await handle_setup_api_tool_multi_config({
405-
provider: this,
406-
tool: 'intelligent-update'
407-
})
408-
} else if (message.command == 'SETUP_API_TOOL_COMMIT_MESSAGES') {
409-
await handle_setup_api_tool({
410-
provider: this,
411-
tool: 'commit-messages'
412-
})
413-
} else if (message.command == 'PICK_OPEN_ROUTER_MODEL') {
414-
await handle_pick_open_router_model(this)
415392
} else if (message.command == 'SAVE_HOME_VIEW_TYPE') {
416393
await handle_save_home_view_type(this, message)
417394
} else if (message.command == 'GET_HOME_VIEW_TYPE') {
418395
handle_get_home_view_type(this)
419396
} else if (message.command == 'SHOW_AT_SIGN_QUICK_PICK') {
420397
await handle_at_sign_quick_pick(this, this.context)
398+
} else if (message.command == 'OPEN_SETTINGS') {
399+
await handle_open_settings(this)
421400
}
422401
} catch (error: any) {
423402
console.error('Error handling message:', message, error)

0 commit comments

Comments
 (0)