Skip to content

Commit cca8366

Browse files
committed
Refactor preset handling to dynamically load configuration based on the active chat mode
1 parent be36ed3 commit cca8366

9 files changed

Lines changed: 120 additions & 42 deletions

packages/vscode/package.json

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,18 @@
620620
{
621621
"name": "(3)",
622622
"chatbot": "Claude"
623+
},
624+
{
625+
"name": "(4)",
626+
"chatbot": "Grok"
627+
},
628+
{
629+
"name": "(5)",
630+
"chatbot": "DeepSeek"
631+
},
632+
{
633+
"name": "(6)",
634+
"chatbot": "Qwen"
623635
}
624636
],
625637
"description": "Preset is a general or task specific web chat configuration.",
@@ -736,6 +748,18 @@
736748
{
737749
"name": "(3)",
738750
"chatbot": "Claude"
751+
},
752+
{
753+
"name": "(4)",
754+
"chatbot": "Grok"
755+
},
756+
{
757+
"name": "(5)",
758+
"chatbot": "DeepSeek"
759+
},
760+
{
761+
"name": "(6)",
762+
"chatbot": "Qwen"
739763
}
740764
],
741765
"description": "Preset is a general or task specific web chat configuration.",
@@ -852,6 +876,18 @@
852876
{
853877
"name": "(3)",
854878
"chatbot": "Claude"
879+
},
880+
{
881+
"name": "(4)",
882+
"chatbot": "Grok"
883+
},
884+
{
885+
"name": "(5)",
886+
"chatbot": "DeepSeek"
887+
},
888+
{
889+
"name": "(6)",
890+
"chatbot": "Qwen"
855891
}
856892
],
857893
"description": "Preset is a general or task specific web chat configuration.",
@@ -938,6 +974,18 @@
938974
{
939975
"name": "(3)",
940976
"chatbot": "Claude"
977+
},
978+
{
979+
"name": "(4)",
980+
"chatbot": "Grok"
981+
},
982+
{
983+
"name": "(5)",
984+
"chatbot": "DeepSeek"
985+
},
986+
{
987+
"name": "(6)",
988+
"chatbot": "Qwen"
941989
}
942990
],
943991
"description": "Preset is a general or task specific web chat configuration.",

packages/vscode/src/view/backend/message-handlers/handle-create-preset.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ export const handle_create_preset = async (
1111
provider: ViewProvider
1212
): Promise<void> => {
1313
const config = vscode.workspace.getConfiguration('codeWebChat')
14+
const presets_config_key = provider.get_presets_config_key()
1415
const current_presets =
15-
config.get<ConfigPresetFormat[]>('chatPresetsForEditContext', []) || []
16+
config.get<ConfigPresetFormat[]>(presets_config_key, []) || []
1617

1718
let new_name = ''
1819
let copy_number = 0
@@ -35,7 +36,7 @@ export const handle_create_preset = async (
3536
command: 'PRESET_CREATED',
3637
preset: config_preset_to_ui_format(new_preset)
3738
})
38-
await config.update('chatPresetsForEditContext', updated_presets, true)
39+
await config.update(presets_config_key, updated_presets, true)
3940
} catch (error) {
4041
vscode.window.showErrorMessage(`Failed to create preset: ${error}`)
4142
}

packages/vscode/src/view/backend/message-handlers/handle-delete-preset.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ export const handle_delete_preset = async (
1010
): Promise<void> => {
1111
const preset_name = message.name
1212
const config = vscode.workspace.getConfiguration('codeWebChat')
13+
const presets_config_key = provider.get_presets_config_key()
1314
const current_presets =
14-
config.get<ConfigPresetFormat[]>('chatPresetsForEditContext', []) || []
15+
config.get<ConfigPresetFormat[]>(presets_config_key, []) || []
1516

1617
const is_unnamed = !preset_name || /^\(\d+\)$/.test(preset_name.trim())
1718
const display_preset_name = is_unnamed ? 'Unnamed' : preset_name
@@ -38,7 +39,7 @@ export const handle_delete_preset = async (
3839

3940
try {
4041
await config.update(
41-
'chatPresetsForEditContext',
42+
presets_config_key,
4243
updated_presets,
4344
vscode.ConfigurationTarget.Global
4445
)
@@ -56,7 +57,7 @@ export const handle_delete_preset = async (
5657
restored_presets.splice(preset_index, 0, deleted_preset)
5758

5859
await config.update(
59-
'chatPresetsForEditContext',
60+
presets_config_key,
6061
restored_presets,
6162
vscode.ConfigurationTarget.Global
6263
)

packages/vscode/src/view/backend/message-handlers/handle-duplicate-preset.ts

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ export const handle_duplicate_preset = async (
1010
): Promise<void> => {
1111
const preset_name = message.name
1212
const config = vscode.workspace.getConfiguration('codeWebChat')
13+
const presets_config_key = provider.get_presets_config_key()
1314
const current_presets =
14-
config.get<ConfigPresetFormat[]>('chatPresetsForEditContext', []) || []
15+
config.get<ConfigPresetFormat[]>(presets_config_key, []) || []
1516

1617
const preset_to_duplicate = current_presets.find((p) => p.name == preset_name)
1718
if (!preset_to_duplicate) {
@@ -22,25 +23,28 @@ export const handle_duplicate_preset = async (
2223
const original_index = current_presets.findIndex((p) => p.name == preset_name)
2324

2425
const parenthetical_match = preset_name.match(/^(.*?)(?:\s*\((\d+)\))?$/)
25-
const base_name = parenthetical_match?.[1]?.trim() || ''
26-
const existing_number = parenthetical_match?.[2]
27-
? parseInt(parenthetical_match[2], 10)
28-
: 0
29-
30-
let new_name: string
31-
let copy_number: number
32-
33-
if (existing_number > 0) {
34-
copy_number = existing_number + 1
35-
new_name = base_name ? `${base_name} (${copy_number})` : `(${copy_number})`
36-
} else {
37-
copy_number = 1
38-
new_name = `${preset_name} (${copy_number})`
39-
}
26+
const original_base_name = parenthetical_match?.[1]?.trim()
27+
const existing_number_str = parenthetical_match?.[2]
28+
29+
const base_for_duplication =
30+
existing_number_str !== undefined && original_base_name !== undefined
31+
? original_base_name
32+
: preset_name.trim()
33+
34+
let copy_number =
35+
existing_number_str !== undefined
36+
? parseInt(existing_number_str, 10) + 1
37+
: 1
38+
39+
let new_name = base_for_duplication
40+
? `${base_for_duplication} (${copy_number})`
41+
: `(${copy_number})`
4042

41-
while (current_presets.some((p) => p.name == new_name)) {
43+
while (current_presets.some((p) => p.name === new_name)) {
4244
copy_number++
43-
new_name = base_name ? `${base_name} (${copy_number})` : `(${copy_number})`
45+
new_name = base_for_duplication
46+
? `${base_for_duplication} (${copy_number})`
47+
: `(${copy_number})`
4448
}
4549

4650
const duplicated_preset = {
@@ -52,7 +56,7 @@ export const handle_duplicate_preset = async (
5256
updated_presets.splice(original_index + 1, 0, duplicated_preset)
5357

5458
try {
55-
await config.update('chatPresetsForEditContext', updated_presets, true)
59+
await config.update(presets_config_key, updated_presets, true)
5660
provider.send_presets_to_webview(webview_view.webview)
5761
} catch (error) {
5862
vscode.window.showErrorMessage(`Failed to duplicate preset: ${error}`)
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
import * as vscode from 'vscode'
22
import { SavePresetsOrderMessage } from '@/view/types/messages'
33
import { ui_preset_to_config_format } from '@/view/backend/helpers/preset-format-converters'
4+
import { ViewProvider } from '../view-provider'
45

56
export const handle_save_presets_order = async (
7+
provider: ViewProvider,
68
message: SavePresetsOrderMessage
79
): Promise<void> => {
810
const config = vscode.workspace.getConfiguration('codeWebChat')
11+
const presets_config_key = provider.get_presets_config_key()
912
const config_formatted_presets = message.presets.map((preset) =>
1013
ui_preset_to_config_format(preset)
1114
)
1215
await config.update(
13-
'chatPresetsForEditContext',
16+
presets_config_key,
1417
config_formatted_presets,
1518
vscode.ConfigurationTarget.Global
1619
)
17-
}
20+
}

packages/vscode/src/view/backend/message-handlers/handle-send-prompt.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export const handle_send_prompt = async (
3939
}
4040

4141
const valid_preset_names = await validate_presets({
42+
provider,
4243
preset_names: preset_names,
4344
is_code_completions_mode: provider.web_mode == 'code-completions',
4445
context: provider.context,
@@ -177,16 +178,15 @@ export const handle_send_prompt = async (
177178
}
178179

179180
async function validate_presets(params: {
181+
provider: ViewProvider
180182
preset_names: string[]
181183
is_code_completions_mode: boolean
182184
context: vscode.ExtensionContext
183185
instructions: string
184186
}): Promise<string[]> {
185187
const config = vscode.workspace.getConfiguration('codeWebChat')
186-
const presets = config.get<ConfigPresetFormat[]>(
187-
'chatPresetsForEditContext',
188-
[]
189-
)
188+
const presets_config_key = params.provider.get_presets_config_key()
189+
const presets = config.get<ConfigPresetFormat[]>(presets_config_key, [])
190190
const available_presets = presets.filter((preset) =>
191191
!params.is_code_completions_mode
192192
? true

packages/vscode/src/view/backend/message-handlers/handle-show-preset-picker.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ export const handle_show_preset_picker = async (
88
provider: ViewProvider
99
): Promise<void> => {
1010
const config = vscode.workspace.getConfiguration('codeWebChat')
11-
const web_chat_presets = config.get<ConfigPresetFormat[]>(
12-
'chatPresetsForEditContext',
13-
[]
14-
)
11+
const presets_config_key = provider.get_presets_config_key()
12+
const web_chat_presets =
13+
config.get<ConfigPresetFormat[]>(presets_config_key, []) || []
1514

1615
const selected_preset_names_state_key =
1716
provider.web_mode == 'code-completions'

packages/vscode/src/view/backend/message-handlers/handle-update-preset.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ export const handle_update_preset = async (
1818
webview_view: vscode.WebviewView
1919
): Promise<void> => {
2020
const config = vscode.workspace.getConfiguration('codeWebChat')
21+
const presets_config_key = provider.get_presets_config_key()
2122
const current_presets =
22-
config.get<ConfigPresetFormat[]>('chatPresetsForEditContext', []) || []
23+
config.get<ConfigPresetFormat[]>(presets_config_key, []) || []
2324

2425
const preset_index = current_presets.findIndex(
2526
(p) => p.name == message.updating_preset.name
@@ -122,7 +123,7 @@ export const handle_update_preset = async (
122123
updated_presets[preset_index] = ui_preset_to_config_format(updated_ui_preset)
123124

124125
await config.update(
125-
'chatPresetsForEditContext',
126+
presets_config_key,
126127
updated_presets,
127128
vscode.ConfigurationTarget.Global
128129
)

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

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,21 @@ export class ViewProvider implements vscode.WebviewViewProvider {
7373
public api_mode: ApiMode
7474
public home_view_type: HomeViewType = HOME_VIEW_TYPES.WEB
7575

76+
public get_presets_config_key(): string {
77+
switch (this.web_mode) {
78+
case 'ask':
79+
return 'chatPresetsForAskAboutContext'
80+
case 'edit':
81+
return 'chatPresetsForEditContext'
82+
case 'code-completions':
83+
return 'chatPresetsForCodeAtCursor'
84+
case 'no-context':
85+
return 'chatPresetsForNoContext'
86+
default:
87+
return 'chatPresetsForEditContext'
88+
}
89+
}
90+
7691
constructor(
7792
public readonly extension_uri: vscode.Uri,
7893
public readonly workspace_provider: WorkspaceProvider,
@@ -105,9 +120,13 @@ export class ViewProvider implements vscode.WebviewViewProvider {
105120
this._config_listener = vscode.workspace.onDidChangeConfiguration(
106121
(event) => {
107122
if (!this._webview_view) return
108-
if (
109-
event.affectsConfiguration('codeWebChat.chatPresetsForEditContext')
110-
) {
123+
const all_preset_keys = [
124+
'codeWebChat.chatPresetsForAskAboutContext',
125+
'codeWebChat.chatPresetsForEditContext',
126+
'codeWebChat.chatPresetsForCodeAtCursor',
127+
'codeWebChat.chatPresetsForNoContext'
128+
]
129+
if (all_preset_keys.some((key) => event.affectsConfiguration(key))) {
111130
this.send_presets_to_webview(this._webview_view.webview)
112131
}
113132
}
@@ -361,7 +380,7 @@ export class ViewProvider implements vscode.WebviewViewProvider {
361380
} else if (message.command == 'GET_CURRENT_TOKEN_COUNT') {
362381
this.calculate_token_count()
363382
} else if (message.command == 'SAVE_PRESETS_ORDER') {
364-
await handle_save_presets_order(message)
383+
await handle_save_presets_order(this, message)
365384
} else if (message.command == 'UPDATE_PRESET') {
366385
await handle_update_preset(this, message, webview_view)
367386
} else if (message.command == 'DELETE_PRESET') {
@@ -383,7 +402,8 @@ export class ViewProvider implements vscode.WebviewViewProvider {
383402
} else if (message.command == 'GET_WEB_MODE') {
384403
handle_get_mode_web(this)
385404
} else if (message.command == 'SAVE_WEB_MODE') {
386-
await handle_save_mode_web(this, message.mode)
405+
handle_save_mode_web(this, message.mode)
406+
this.send_presets_to_webview(webview_view.webview)
387407
} else if (message.command == 'GET_API_MODE') {
388408
handle_get_mode_api(this)
389409
} else if (message.command == 'SAVE_API_MODE') {
@@ -417,8 +437,9 @@ export class ViewProvider implements vscode.WebviewViewProvider {
417437

418438
public send_presets_to_webview(_: vscode.Webview) {
419439
const config = vscode.workspace.getConfiguration('codeWebChat')
440+
const presets_config_key = this.get_presets_config_key()
420441
const web_chat_presets_config =
421-
config.get<ConfigPresetFormat[]>('chatPresetsForEditContext', []) || []
442+
config.get<ConfigPresetFormat[]>(presets_config_key, []) || []
422443

423444
const presets_for_ui: Preset[] = web_chat_presets_config
424445
.filter((preset_config) => CHATBOTS[preset_config.chatbot])

0 commit comments

Comments
 (0)