Skip to content

Commit 12e701a

Browse files
committed
Remove preset groups and separators support and migrate existing configurations
1 parent 1de3b2d commit 12e701a

20 files changed

Lines changed: 242 additions & 968 deletions

‎apps/editor/src/extension.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ import {
1111
migrate_model_providers_type,
1212
migrate_prune_context_to_find_relevant_files,
1313
migrate_merge_configurations,
14-
migrate_preset_affix_to_prompt_template
14+
migrate_preset_affix_to_prompt_template,
15+
migrate_remove_preset_groups_and_separators
1516
} from './migrations'
1617
import {
1718
apply_chat_response_command,
@@ -69,6 +70,8 @@ export const activate = async (context: vscode.ExtensionContext) => {
6970
await migrate_merge_configurations(context)
7071
// 8 June 2026
7172
await migrate_preset_affix_to_prompt_template(context)
73+
// 8 June 2026
74+
await migrate_remove_preset_groups_and_separators(context)
7275
}
7376

7477
await migrations()

‎apps/editor/src/migrations/index.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ export * from './migrate-model-providers-type'
66
export * from './migrate-prune-context-to-find-relevant-files'
77
export * from './migrate-merge-configurations'
88
export * from './migrate-preset-affix-to-prompt-template'
9-
9+
export * from './migrate-remove-preset-groups-and-separators'
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import * as vscode from 'vscode'
2+
import { Logger } from '@shared/utils/logger'
3+
4+
const MIGRATION_ID = 'remove-preset-groups-and-separators-migration-20260608'
5+
6+
export async function migrate_remove_preset_groups_and_separators(
7+
context: vscode.ExtensionContext
8+
): Promise<void> {
9+
try {
10+
if (context.globalState.get(MIGRATION_ID)) {
11+
return
12+
}
13+
14+
const KEYS = [
15+
'chatPresetsForAskAboutContext',
16+
'chatPresetsForEditContext',
17+
'chatPresetsForCodeAtCursor',
18+
'chatPresetsForFindRelevantFiles',
19+
'chatPresetsForNoContext'
20+
]
21+
22+
for (const key of KEYS) {
23+
const config = vscode.workspace.getConfiguration('codeWebChat')
24+
const presetsInspect = config.inspect<any[]>(key)
25+
26+
if (
27+
presetsInspect?.globalValue &&
28+
Array.isArray(presetsInspect.globalValue)
29+
) {
30+
const presets = JSON.parse(JSON.stringify(presetsInspect.globalValue))
31+
// Filter out groups (no chatbot, has name) and separators (no chatbot, no name)
32+
const new_presets = presets.filter((p: any) => !!p.chatbot)
33+
34+
// Clean up obsolete fields
35+
for (const p of new_presets) {
36+
delete p.isCollapsed
37+
delete p.isSelected
38+
}
39+
40+
if (new_presets.length !== presets.length || presets.some((p: any) => p.isCollapsed !== undefined || p.isSelected !== undefined)) {
41+
await config.update(
42+
key,
43+
new_presets,
44+
vscode.ConfigurationTarget.Global
45+
)
46+
}
47+
}
48+
}
49+
50+
await context.globalState.update(MIGRATION_ID, true)
51+
Logger.info({
52+
function_name: 'migrate_remove_preset_groups_and_separators',
53+
message: 'Successfully removed preset groups and separators'
54+
})
55+
} catch (error) {
56+
Logger.error({
57+
function_name: 'migrate_remove_preset_groups_and_separators',
58+
message: 'Error removing preset groups and separators',
59+
data: error instanceof Error ? error.message : String(error)
60+
})
61+
}
62+
}

apps/editor/src/views/panel/backend/message-handlers/handle-create-preset-group-or-separator.ts renamed to apps/editor/src/views/panel/backend/message-handlers/handle-create-preset.ts

Lines changed: 12 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -6,76 +6,10 @@ import {
66
config_preset_to_ui_format,
77
ConfigPresetFormat
88
} from '@/views/panel/backend/utils/preset-format-converters'
9-
import { CreatePresetGroupOrSeparatorMessage } from '@/views/panel/types/messages'
9+
import { CreatePresetMessage } from '@/views/panel/types/messages'
1010

11-
const ITEM_NAME_GROUP = 'Group'
12-
const ITEM_NAME_SEPARATOR = 'Separator'
1311
const ITEM_NAME_PRESET = 'Preset'
1412

15-
const create_group = async (params: {
16-
panel_provider: PanelProvider
17-
insertion_index?: number
18-
}) => {
19-
const config = vscode.workspace.getConfiguration('codeWebChat')
20-
const presets_config_key = params.panel_provider.get_presets_config_key()
21-
const current_presets =
22-
config.get<ConfigPresetFormat[]>(presets_config_key, []) || []
23-
24-
let new_name = ''
25-
let copy_number = 0
26-
while (new_name == '' || current_presets.some((p) => p.name == new_name)) {
27-
new_name = `(${copy_number++})`
28-
}
29-
30-
const new_group = {
31-
name: new_name
32-
} as ConfigPresetFormat
33-
34-
const updated_presets = [...current_presets]
35-
if (params.insertion_index !== undefined) {
36-
updated_presets.splice(params.insertion_index, 0, new_group)
37-
} else {
38-
updated_presets.push(new_group)
39-
}
40-
41-
try {
42-
params.panel_provider.send_message({
43-
command: 'PRESET_CREATED',
44-
preset: config_preset_to_ui_format(new_group)
45-
})
46-
await config.update(presets_config_key, updated_presets, true)
47-
} catch (error) {
48-
vscode.window.showErrorMessage(
49-
dictionary.error_message.FAILED_TO_CREATE_ITEM(ITEM_NAME_GROUP, error)
50-
)
51-
}
52-
}
53-
54-
const create_separator = async (params: {
55-
panel_provider: PanelProvider
56-
insertion_index?: number
57-
}) => {
58-
const config = vscode.workspace.getConfiguration('codeWebChat')
59-
const presets_config_key = params.panel_provider.get_presets_config_key()
60-
const current_presets =
61-
config.get<ConfigPresetFormat[]>(presets_config_key, []) || []
62-
63-
const new_separator = {} as ConfigPresetFormat
64-
65-
const updated_presets = [...current_presets]
66-
if (params.insertion_index !== undefined) {
67-
updated_presets.splice(params.insertion_index, 0, new_separator)
68-
} else {
69-
updated_presets.push(new_separator)
70-
}
71-
72-
try {
73-
await config.update(presets_config_key, updated_presets, true)
74-
} catch (error) {
75-
vscode.window.showErrorMessage(`Failed to create ${ITEM_NAME_SEPARATOR}`)
76-
}
77-
}
78-
7913
const create_preset = async (params: {
8014
panel_provider: PanelProvider
8115
insertion_index?: number
@@ -105,15 +39,7 @@ const create_preset = async (params: {
10539
if (params.insertion_index !== undefined) {
10640
updated_presets.splice(params.insertion_index, 0, new_preset)
10741
} else {
108-
const last_group_or_separator = [...current_presets]
109-
.reverse()
110-
.find((p) => (!p.chatbot && p.name) || !p.name)
111-
112-
if (last_group_or_separator?.name && !last_group_or_separator.chatbot) {
113-
updated_presets.push({}, new_preset)
114-
} else {
115-
updated_presets.push(new_preset)
116-
}
42+
updated_presets.push(new_preset)
11743
}
11844

11945
try {
@@ -129,9 +55,9 @@ const create_preset = async (params: {
12955
}
13056
}
13157

132-
export const handle_create_preset_group_or_separator = async (
58+
export const handle_create_preset = async (
13359
panel_provider: PanelProvider,
134-
message: CreatePresetGroupOrSeparatorMessage
60+
message: CreatePresetMessage
13561
): Promise<void> => {
13662
let insertion_index: number | undefined
13763

@@ -184,43 +110,6 @@ export const handle_create_preset_group_or_separator = async (
184110
insertion_index = 0
185111
}
186112

187-
const show_item_types_menu = () => {
188-
const quickPick = vscode.window.createQuickPick()
189-
quickPick.items = [
190-
{ label: ITEM_NAME_PRESET },
191-
{ label: ITEM_NAME_GROUP },
192-
{ label: ITEM_NAME_SEPARATOR }
193-
]
194-
quickPick.title = 'Item Types'
195-
quickPick.placeholder = 'What would you like to create?'
196-
quickPick.buttons = [
197-
{
198-
iconPath: new vscode.ThemeIcon('close'),
199-
tooltip: 'Close'
200-
}
201-
]
202-
203-
quickPick.onDidTriggerButton(() => {
204-
quickPick.hide()
205-
})
206-
207-
quickPick.onDidAccept(async () => {
208-
const selection = quickPick.selectedItems[0]?.label
209-
quickPick.hide()
210-
211-
if (selection == ITEM_NAME_GROUP) {
212-
await create_group({ panel_provider, insertion_index })
213-
} else if (selection == ITEM_NAME_SEPARATOR) {
214-
await create_separator({ panel_provider, insertion_index })
215-
} else if (selection == ITEM_NAME_PRESET) {
216-
show_chatbots_menu()
217-
}
218-
})
219-
220-
quickPick.onDidHide(() => quickPick.dispose())
221-
quickPick.show()
222-
}
223-
224113
const show_chatbots_menu = () => {
225114
const chatbots = Object.entries(CHATBOTS)
226115
const items: vscode.QuickPickItem[] = chatbots.map(
@@ -237,21 +126,20 @@ export const handle_create_preset_group_or_separator = async (
237126
quick_pick.items = items
238127
quick_pick.title = 'Chatbots'
239128
quick_pick.placeholder = 'Choose a chatbot for the new preset'
240-
quick_pick.buttons = [vscode.QuickInputButtons.Back]
129+
quick_pick.buttons = [
130+
{
131+
iconPath: new vscode.ThemeIcon('close'),
132+
tooltip: 'Close'
133+
}
134+
]
241135

242-
let is_handled = false
243136
const disposables: vscode.Disposable[] = []
244137

245138
disposables.push(
246-
quick_pick.onDidTriggerButton((button) => {
247-
if (button === vscode.QuickInputButtons.Back) {
248-
is_handled = true
139+
quick_pick.onDidTriggerButton(() => {
249140
quick_pick.hide()
250-
show_item_types_menu()
251-
}
252141
}),
253142
quick_pick.onDidAccept(async () => {
254-
is_handled = true
255143
const selected_chatbot = quick_pick.selectedItems[0]
256144
?.label as keyof typeof CHATBOTS
257145
quick_pick.hide()
@@ -264,9 +152,6 @@ export const handle_create_preset_group_or_separator = async (
264152
}
265153
}),
266154
quick_pick.onDidHide(() => {
267-
if (!is_handled) {
268-
show_item_types_menu()
269-
}
270155
disposables.forEach((d) => d.dispose())
271156
quick_pick.dispose()
272157
})
@@ -275,5 +160,5 @@ export const handle_create_preset_group_or_separator = async (
275160
quick_pick.show()
276161
}
277162

278-
show_item_types_menu()
163+
show_chatbots_menu()
279164
}

‎apps/editor/src/views/panel/backend/message-handlers/handle-delete-preset-group-or-separator.ts‎

Lines changed: 0 additions & 96 deletions
This file was deleted.

0 commit comments

Comments
 (0)