@lvce-editor/chat-view 6.16.0 → 6.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chatViewWorkerMain.js +277 -49
- package/package.json +1 -1
|
@@ -1118,14 +1118,14 @@ const create$2 = rpcId => {
|
|
|
1118
1118
|
};
|
|
1119
1119
|
|
|
1120
1120
|
const {
|
|
1121
|
-
invoke: invoke$
|
|
1121
|
+
invoke: invoke$7,
|
|
1122
1122
|
set: set$7
|
|
1123
1123
|
} = create$2(6007);
|
|
1124
1124
|
const getMathBlockDom = async node => {
|
|
1125
|
-
return invoke$
|
|
1125
|
+
return invoke$7('ChatMath.getMathBlockDom', node);
|
|
1126
1126
|
};
|
|
1127
1127
|
const getMathInlineDom = async node => {
|
|
1128
|
-
return invoke$
|
|
1128
|
+
return invoke$7('ChatMath.getMathInlineDom', node);
|
|
1129
1129
|
};
|
|
1130
1130
|
|
|
1131
1131
|
const Button$2 = 'button';
|
|
@@ -1218,30 +1218,30 @@ const SetPatches = 'Viewlet.setPatches';
|
|
|
1218
1218
|
const FocusChatInput = 8000;
|
|
1219
1219
|
|
|
1220
1220
|
const {
|
|
1221
|
-
invoke: invoke$
|
|
1221
|
+
invoke: invoke$6,
|
|
1222
1222
|
set: set$6
|
|
1223
1223
|
} = create$2(ChatNetworkWorker);
|
|
1224
1224
|
|
|
1225
1225
|
const {
|
|
1226
|
-
invoke: invoke$
|
|
1226
|
+
invoke: invoke$5,
|
|
1227
1227
|
set: set$5
|
|
1228
1228
|
} = create$2(ChatToolWorker);
|
|
1229
1229
|
|
|
1230
1230
|
const {
|
|
1231
|
-
invoke: invoke$
|
|
1231
|
+
invoke: invoke$4,
|
|
1232
1232
|
set: set$4
|
|
1233
1233
|
} = create$2(ExtensionHostWorker);
|
|
1234
1234
|
|
|
1235
1235
|
const {
|
|
1236
|
-
invoke: invoke$
|
|
1236
|
+
invoke: invoke$3,
|
|
1237
1237
|
set: set$3
|
|
1238
1238
|
} = create$2(OpenerWorker);
|
|
1239
1239
|
const openExternal = async url => {
|
|
1240
|
-
return invoke$
|
|
1240
|
+
return invoke$3('Open.openExternal', url);
|
|
1241
1241
|
};
|
|
1242
1242
|
|
|
1243
1243
|
const {
|
|
1244
|
-
invoke: invoke$
|
|
1244
|
+
invoke: invoke$2,
|
|
1245
1245
|
invokeAndTransfer,
|
|
1246
1246
|
set: set$2
|
|
1247
1247
|
} = create$2(RendererWorker);
|
|
@@ -1250,7 +1250,7 @@ const showContextMenu2 = async (uid, menuId, x, y, args) => {
|
|
|
1250
1250
|
number(menuId);
|
|
1251
1251
|
number(x);
|
|
1252
1252
|
number(y);
|
|
1253
|
-
await invoke$
|
|
1253
|
+
await invoke$2('ContextMenu.show2', uid, menuId, x, y, args);
|
|
1254
1254
|
};
|
|
1255
1255
|
const sendMessagePortToOpenerWorker$1 = async (port, rpcId) => {
|
|
1256
1256
|
const command = 'HandleMessagePort.handleMessagePort';
|
|
@@ -1261,7 +1261,7 @@ const sendMessagePortToChatMathWorker$1 = async (port, rpcId) => {
|
|
|
1261
1261
|
await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToChatMathWorker', port, command, rpcId);
|
|
1262
1262
|
};
|
|
1263
1263
|
const readFile = async uri => {
|
|
1264
|
-
return invoke$
|
|
1264
|
+
return invoke$2('FileSystem.readFile', uri);
|
|
1265
1265
|
};
|
|
1266
1266
|
const sendMessagePortToExtensionHostWorker$1 = async (port, rpcId = 0) => {
|
|
1267
1267
|
const command = 'HandleMessagePort.handleMessagePort2';
|
|
@@ -1274,13 +1274,13 @@ const sendMessagePortToChatToolWorker = async port => {
|
|
|
1274
1274
|
await invokeAndTransfer('SendMessagePortToExtensionHostWorker.sendMessagePortToChatToolWorker', port, 'HandleMessagePort.handleMessagePort');
|
|
1275
1275
|
};
|
|
1276
1276
|
const activateByEvent$1 = (event, assetDir, platform) => {
|
|
1277
|
-
return invoke$
|
|
1277
|
+
return invoke$2('ExtensionHostManagement.activateByEvent', event, assetDir, platform);
|
|
1278
1278
|
};
|
|
1279
1279
|
const getPreference = async key => {
|
|
1280
|
-
return await invoke$
|
|
1280
|
+
return await invoke$2('Preferences.get', key);
|
|
1281
1281
|
};
|
|
1282
1282
|
const measureTextBlockHeight$1 = async (actualInput, fontFamily, fontSize, lineHeightPx, width) => {
|
|
1283
|
-
return invoke$
|
|
1283
|
+
return invoke$2(`MeasureTextHeight.measureTextBlockHeight`, actualInput, fontFamily, fontSize, lineHeightPx, width);
|
|
1284
1284
|
};
|
|
1285
1285
|
|
|
1286
1286
|
const toCommandId = key => {
|
|
@@ -1679,6 +1679,7 @@ const createDefaultState = () => {
|
|
|
1679
1679
|
chatSendAreaPaddingLeft: 8,
|
|
1680
1680
|
chatSendAreaPaddingRight: 8,
|
|
1681
1681
|
chatSendAreaPaddingTop: 10,
|
|
1682
|
+
chatStorageWorkerEnabled: false,
|
|
1682
1683
|
composerDropActive: false,
|
|
1683
1684
|
composerDropEnabled: true,
|
|
1684
1685
|
composerFontFamily: 'system-ui',
|
|
@@ -1702,7 +1703,10 @@ const createDefaultState = () => {
|
|
|
1702
1703
|
messagesScrollTop: 0,
|
|
1703
1704
|
mockAiResponseDelay: 800,
|
|
1704
1705
|
mockApiCommandId: '',
|
|
1706
|
+
modelPickerOpen: false,
|
|
1707
|
+
modelPickerSearchValue: '',
|
|
1705
1708
|
models: getDefaultModels(),
|
|
1709
|
+
newChatModelPickerEnabled: false,
|
|
1706
1710
|
nextMessageId: 1,
|
|
1707
1711
|
openApiApiBaseUrl: 'https://api.openai.com/v1',
|
|
1708
1712
|
openApiApiKey: '',
|
|
@@ -1790,6 +1794,12 @@ const create = (uid, x, y, width, height, platform, assetDir) => {
|
|
|
1790
1794
|
set$1(uid, state, state);
|
|
1791
1795
|
};
|
|
1792
1796
|
|
|
1797
|
+
const invoke$1 = async (method, ...params) => {
|
|
1798
|
+
{
|
|
1799
|
+
throw new Error('ChatStorageWorker is not initialized');
|
|
1800
|
+
}
|
|
1801
|
+
};
|
|
1802
|
+
|
|
1793
1803
|
const toError = error => {
|
|
1794
1804
|
if (error instanceof Error) {
|
|
1795
1805
|
return error;
|
|
@@ -2366,8 +2376,12 @@ const createDefaultStorage = () => {
|
|
|
2366
2376
|
return new IndexedDbChatSessionStorage();
|
|
2367
2377
|
};
|
|
2368
2378
|
let chatSessionStorage = createDefaultStorage();
|
|
2379
|
+
let chatStorageWorkerEnabled = false;
|
|
2380
|
+
const setChatStorageWorkerEnabled$1 = enabled => {
|
|
2381
|
+
chatStorageWorkerEnabled = enabled;
|
|
2382
|
+
};
|
|
2369
2383
|
const listChatSessions = async () => {
|
|
2370
|
-
const sessions = await chatSessionStorage.listSessions();
|
|
2384
|
+
const sessions = chatStorageWorkerEnabled ? await invoke$1() : await chatSessionStorage.listSessions();
|
|
2371
2385
|
return sessions.map(session => {
|
|
2372
2386
|
const summary = {
|
|
2373
2387
|
id: session.id,
|
|
@@ -2384,7 +2398,7 @@ const listChatSessions = async () => {
|
|
|
2384
2398
|
});
|
|
2385
2399
|
};
|
|
2386
2400
|
const getChatSession = async id => {
|
|
2387
|
-
const session = await chatSessionStorage.getSession(id);
|
|
2401
|
+
const session = chatStorageWorkerEnabled ? await invoke$1('ChatStorage.getSession', id) : await chatSessionStorage.getSession(id);
|
|
2388
2402
|
if (!session) {
|
|
2389
2403
|
return undefined;
|
|
2390
2404
|
}
|
|
@@ -2405,18 +2419,35 @@ const saveChatSession = async session => {
|
|
|
2405
2419
|
messages: [...session.messages],
|
|
2406
2420
|
title: session.title
|
|
2407
2421
|
};
|
|
2408
|
-
|
|
2422
|
+
const sessionValue = session.projectId ? {
|
|
2409
2423
|
...value,
|
|
2410
2424
|
projectId: session.projectId
|
|
2411
|
-
} : value
|
|
2425
|
+
} : value;
|
|
2426
|
+
if (chatStorageWorkerEnabled) {
|
|
2427
|
+
await invoke$1('ChatStorage.setSession', sessionValue);
|
|
2428
|
+
return;
|
|
2429
|
+
}
|
|
2430
|
+
await chatSessionStorage.setSession(sessionValue);
|
|
2412
2431
|
};
|
|
2413
2432
|
const deleteChatSession = async id => {
|
|
2433
|
+
if (chatStorageWorkerEnabled) {
|
|
2434
|
+
await invoke$1('ChatStorage.deleteSession', id);
|
|
2435
|
+
return;
|
|
2436
|
+
}
|
|
2414
2437
|
await chatSessionStorage.deleteSession(id);
|
|
2415
2438
|
};
|
|
2416
2439
|
const clearChatSessions = async () => {
|
|
2440
|
+
if (chatStorageWorkerEnabled) {
|
|
2441
|
+
await invoke$1();
|
|
2442
|
+
return;
|
|
2443
|
+
}
|
|
2417
2444
|
await chatSessionStorage.clear();
|
|
2418
2445
|
};
|
|
2419
2446
|
const appendChatViewEvent = async event => {
|
|
2447
|
+
if (chatStorageWorkerEnabled) {
|
|
2448
|
+
await invoke$1('ChatStorage.appendEvent', event);
|
|
2449
|
+
return;
|
|
2450
|
+
}
|
|
2420
2451
|
await chatSessionStorage.appendEvent(event);
|
|
2421
2452
|
};
|
|
2422
2453
|
|
|
@@ -2560,7 +2591,7 @@ const isEqualProjectExpandedIds = (a, b) => {
|
|
|
2560
2591
|
return true;
|
|
2561
2592
|
};
|
|
2562
2593
|
const isEqual = (oldState, newState) => {
|
|
2563
|
-
return oldState.addContextButtonEnabled === newState.addContextButtonEnabled && oldState.authEnabled === newState.authEnabled && oldState.authErrorMessage === newState.authErrorMessage && oldState.authStatus === newState.authStatus && oldState.composerDropActive === newState.composerDropActive && oldState.composerDropEnabled === newState.composerDropEnabled && oldState.composerValue === newState.composerValue && oldState.initial === newState.initial && isEqualProjectExpandedIds(oldState.projectExpandedIds, newState.projectExpandedIds) && oldState.projectListScrollTop === newState.projectListScrollTop && oldState.renamingSessionId === newState.renamingSessionId && oldState.selectedModelId === newState.selectedModelId && oldState.selectedProjectId === newState.selectedProjectId && oldState.selectedSessionId === newState.selectedSessionId && oldState.showRunMode === newState.showRunMode && oldState.runMode === newState.runMode && oldState.sessions === newState.sessions && oldState.tokensMax === newState.tokensMax && oldState.tokensUsed === newState.tokensUsed && oldState.usageOverviewEnabled === newState.usageOverviewEnabled && oldState.useChatMathWorker === newState.useChatMathWorker && oldState.viewMode === newState.viewMode && oldState.voiceDictationEnabled === newState.voiceDictationEnabled;
|
|
2594
|
+
return oldState.addContextButtonEnabled === newState.addContextButtonEnabled && oldState.authEnabled === newState.authEnabled && oldState.authErrorMessage === newState.authErrorMessage && oldState.authStatus === newState.authStatus && oldState.composerDropActive === newState.composerDropActive && oldState.composerDropEnabled === newState.composerDropEnabled && oldState.composerValue === newState.composerValue && oldState.initial === newState.initial && oldState.modelPickerOpen === newState.modelPickerOpen && oldState.modelPickerSearchValue === newState.modelPickerSearchValue && oldState.newChatModelPickerEnabled === newState.newChatModelPickerEnabled && isEqualProjectExpandedIds(oldState.projectExpandedIds, newState.projectExpandedIds) && oldState.projectListScrollTop === newState.projectListScrollTop && oldState.renamingSessionId === newState.renamingSessionId && oldState.selectedModelId === newState.selectedModelId && oldState.selectedProjectId === newState.selectedProjectId && oldState.selectedSessionId === newState.selectedSessionId && oldState.showRunMode === newState.showRunMode && oldState.runMode === newState.runMode && oldState.sessions === newState.sessions && oldState.tokensMax === newState.tokensMax && oldState.tokensUsed === newState.tokensUsed && oldState.usageOverviewEnabled === newState.usageOverviewEnabled && oldState.useChatMathWorker === newState.useChatMathWorker && oldState.viewMode === newState.viewMode && oldState.voiceDictationEnabled === newState.voiceDictationEnabled;
|
|
2564
2595
|
};
|
|
2565
2596
|
|
|
2566
2597
|
const diffScrollTop = (oldState, newState) => {
|
|
@@ -3083,7 +3114,7 @@ const handleChatListContextMenu = async (state, eventX, eventY) => {
|
|
|
3083
3114
|
if (!item) {
|
|
3084
3115
|
return state;
|
|
3085
3116
|
}
|
|
3086
|
-
await invoke$
|
|
3117
|
+
await invoke$2('ContextMenu.show', eventX, eventY, CHAT_LIST_ITEM_CONTEXT_MENU, item.id);
|
|
3087
3118
|
return state;
|
|
3088
3119
|
};
|
|
3089
3120
|
|
|
@@ -3114,7 +3145,7 @@ const createSession = async (state, projectIdOverride = '') => {
|
|
|
3114
3145
|
|
|
3115
3146
|
const openFolder = async () => {
|
|
3116
3147
|
try {
|
|
3117
|
-
return await invoke$
|
|
3148
|
+
return await invoke$2('FilePicker.showDirectoryPicker');
|
|
3118
3149
|
} catch {
|
|
3119
3150
|
return '';
|
|
3120
3151
|
}
|
|
@@ -3218,7 +3249,7 @@ const get = async key => {
|
|
|
3218
3249
|
return getPreference(key);
|
|
3219
3250
|
};
|
|
3220
3251
|
const update = async settings => {
|
|
3221
|
-
await invoke$
|
|
3252
|
+
await invoke$2('Preferences.update', settings);
|
|
3222
3253
|
};
|
|
3223
3254
|
|
|
3224
3255
|
const trailingSlashesRegex$3 = /\/+$/;
|
|
@@ -3246,12 +3277,12 @@ const handleClickLogin = async state => {
|
|
|
3246
3277
|
};
|
|
3247
3278
|
if (state.uid) {
|
|
3248
3279
|
set$1(state.uid, state, signingInState);
|
|
3249
|
-
await invoke$
|
|
3280
|
+
await invoke$2('Chat.rerender');
|
|
3250
3281
|
}
|
|
3251
3282
|
let usedMockResponse = false;
|
|
3252
3283
|
try {
|
|
3253
3284
|
usedMockResponse = hasPendingMockLoginResponse();
|
|
3254
|
-
const response = usedMockResponse ? await consumeNextLoginResponse() : await invoke$
|
|
3285
|
+
const response = usedMockResponse ? await consumeNextLoginResponse() : await invoke$2('Auth.login', state.backendUrl);
|
|
3255
3286
|
if (!isLoginResponse(response)) {
|
|
3256
3287
|
return {
|
|
3257
3288
|
...signingInState,
|
|
@@ -3285,7 +3316,7 @@ const handleClickLogin = async state => {
|
|
|
3285
3316
|
} catch (error) {
|
|
3286
3317
|
const errorMessage = error instanceof Error && error.message ? error.message : 'Backend authentication failed.';
|
|
3287
3318
|
if (!usedMockResponse) {
|
|
3288
|
-
await invoke$
|
|
3319
|
+
await invoke$2('Main.openUri', `${trimTrailingSlashes(state.backendUrl)}/auth/login`);
|
|
3289
3320
|
}
|
|
3290
3321
|
return {
|
|
3291
3322
|
...signingInState,
|
|
@@ -3297,7 +3328,7 @@ const handleClickLogin = async state => {
|
|
|
3297
3328
|
|
|
3298
3329
|
const handleClickLogout = async state => {
|
|
3299
3330
|
try {
|
|
3300
|
-
await invoke$
|
|
3331
|
+
await invoke$2('Auth.logout', state.backendUrl);
|
|
3301
3332
|
} catch {
|
|
3302
3333
|
// Ignore logout bridge errors and still clear local auth state.
|
|
3303
3334
|
}
|
|
@@ -3318,7 +3349,7 @@ const handleClickLogout = async state => {
|
|
|
3318
3349
|
};
|
|
3319
3350
|
|
|
3320
3351
|
const handleClickOpenApiApiKeySettings = async state => {
|
|
3321
|
-
await invoke$
|
|
3352
|
+
await invoke$2('Main.openUri', 'app://settings.json');
|
|
3322
3353
|
return state;
|
|
3323
3354
|
};
|
|
3324
3355
|
|
|
@@ -3328,7 +3359,7 @@ const handleClickOpenApiApiKeyWebsite = async state => {
|
|
|
3328
3359
|
};
|
|
3329
3360
|
|
|
3330
3361
|
const handleClickOpenRouterApiKeySettings = async state => {
|
|
3331
|
-
await invoke$
|
|
3362
|
+
await invoke$2('Main.openUri', 'app://settings.json');
|
|
3332
3363
|
return state;
|
|
3333
3364
|
};
|
|
3334
3365
|
|
|
@@ -3365,10 +3396,10 @@ const getAiResponse$1 = async options => {
|
|
|
3365
3396
|
};
|
|
3366
3397
|
|
|
3367
3398
|
const execute = async (name, rawArguments, options) => {
|
|
3368
|
-
return invoke$
|
|
3399
|
+
return invoke$5('ChatTool.execute', name, rawArguments, options);
|
|
3369
3400
|
};
|
|
3370
3401
|
const getTools = async () => {
|
|
3371
|
-
return invoke$
|
|
3402
|
+
return invoke$5('ChatTool.getTools');
|
|
3372
3403
|
};
|
|
3373
3404
|
|
|
3374
3405
|
const stringifyToolOutput = output => {
|
|
@@ -3868,7 +3899,7 @@ const executeProvider = async ({
|
|
|
3868
3899
|
}) => {
|
|
3869
3900
|
await activateByEvent(event, assetDir, platform);
|
|
3870
3901
|
// @ts-ignore
|
|
3871
|
-
const result = invoke$
|
|
3902
|
+
const result = invoke$4(method, ...params);
|
|
3872
3903
|
return result;
|
|
3873
3904
|
};
|
|
3874
3905
|
|
|
@@ -4000,10 +4031,10 @@ const getOpenApiApiEndpoint = openApiApiBaseUrl => {
|
|
|
4000
4031
|
};
|
|
4001
4032
|
|
|
4002
4033
|
const makeApiRequest = async options => {
|
|
4003
|
-
return invoke$
|
|
4034
|
+
return invoke$6('ChatNetwork.makeApiRequest', options);
|
|
4004
4035
|
};
|
|
4005
4036
|
const makeStreamingApiRequest = async options => {
|
|
4006
|
-
return invoke$
|
|
4037
|
+
return invoke$6('ChatNetwork.makeStreamingApiRequest', options);
|
|
4007
4038
|
};
|
|
4008
4039
|
|
|
4009
4040
|
const getTextContent = content => {
|
|
@@ -5855,7 +5886,7 @@ const handleClickSaveOpenRouterApiKey = async state => {
|
|
|
5855
5886
|
};
|
|
5856
5887
|
set$1(state.uid, state, optimisticState);
|
|
5857
5888
|
// @ts-ignore
|
|
5858
|
-
await invoke$
|
|
5889
|
+
await invoke$2('Chat.rerender');
|
|
5859
5890
|
const persistedState = await setOpenRouterApiKey(optimisticState, openRouterApiKey);
|
|
5860
5891
|
const updatedState = {
|
|
5861
5892
|
...persistedState,
|
|
@@ -7223,7 +7254,7 @@ const getSelectedSession = (sessions, selectedSessionId) => {
|
|
|
7223
7254
|
const setAndRerenderHandleTextChunkState = async (uid, previousState, nextState) => {
|
|
7224
7255
|
set$1(uid, previousState, nextState);
|
|
7225
7256
|
// @ts-ignore
|
|
7226
|
-
await invoke$
|
|
7257
|
+
await invoke$2('Chat.rerender');
|
|
7227
7258
|
};
|
|
7228
7259
|
|
|
7229
7260
|
const getToolCallMergeKey = toolCall => {
|
|
@@ -7363,7 +7394,7 @@ const handleTextChunkFunction = async (uid, assistantMessageId, chunk, handleTex
|
|
|
7363
7394
|
};
|
|
7364
7395
|
set$1(uid, handleTextChunkState.previousState, nextState);
|
|
7365
7396
|
// @ts-ignore
|
|
7366
|
-
await invoke$
|
|
7397
|
+
await invoke$2('Chat.rerender');
|
|
7367
7398
|
return {
|
|
7368
7399
|
latestState: nextState,
|
|
7369
7400
|
previousState: nextState
|
|
@@ -7565,7 +7596,7 @@ const handleSubmit = async state => {
|
|
|
7565
7596
|
}
|
|
7566
7597
|
set$1(state.uid, state, optimisticState);
|
|
7567
7598
|
// @ts-ignore
|
|
7568
|
-
await invoke$
|
|
7599
|
+
await invoke$2('Chat.rerender');
|
|
7569
7600
|
let handleTextChunkState = {
|
|
7570
7601
|
latestState: optimisticState,
|
|
7571
7602
|
previousState: optimisticState
|
|
@@ -7688,6 +7719,9 @@ const Dictate = 'dictate';
|
|
|
7688
7719
|
const Send = 'send';
|
|
7689
7720
|
const Back = 'back';
|
|
7690
7721
|
const Model = 'model';
|
|
7722
|
+
const ModelPickerToggle = 'model-picker-toggle';
|
|
7723
|
+
const ModelPickerSearch = 'model-picker-search';
|
|
7724
|
+
const ModelPickerSettings = 'model-picker-settings';
|
|
7691
7725
|
const RunMode = 'runMode';
|
|
7692
7726
|
const ToggleChatFocus = 'toggle-chat-focus';
|
|
7693
7727
|
const ToggleSearch = 'toggle-search';
|
|
@@ -7703,6 +7737,7 @@ const SessionDelete = 'SessionDelete';
|
|
|
7703
7737
|
const ProjectPrefix = 'project:';
|
|
7704
7738
|
const SessionPrefix = 'session:';
|
|
7705
7739
|
const RenamePrefix = 'session-rename:';
|
|
7740
|
+
const ModelPickerItemPrefix = 'model-picker-item:';
|
|
7706
7741
|
const getProjectInputName = projectId => {
|
|
7707
7742
|
return `${ProjectPrefix}${projectId}`;
|
|
7708
7743
|
};
|
|
@@ -7736,6 +7771,15 @@ const isRenameInputName = name => {
|
|
|
7736
7771
|
const getRenameIdFromInputName = name => {
|
|
7737
7772
|
return name.slice(RenamePrefix.length);
|
|
7738
7773
|
};
|
|
7774
|
+
const getModelPickerItemInputName = modelId => {
|
|
7775
|
+
return `${ModelPickerItemPrefix}${modelId}`;
|
|
7776
|
+
};
|
|
7777
|
+
const isModelPickerItemInputName = name => {
|
|
7778
|
+
return name.startsWith(ModelPickerItemPrefix);
|
|
7779
|
+
};
|
|
7780
|
+
const getModelIdFromModelPickerItemInputName = name => {
|
|
7781
|
+
return name.slice(ModelPickerItemPrefix.length);
|
|
7782
|
+
};
|
|
7739
7783
|
|
|
7740
7784
|
const OpenApiApiKeyInput = 'open-api-api-key';
|
|
7741
7785
|
const SaveOpenApiApiKey = 'save-openapi-api-key';
|
|
@@ -7875,6 +7919,22 @@ const handleClick = async (state, name, id = '') => {
|
|
|
7875
7919
|
searchFieldVisible: !state.searchFieldVisible,
|
|
7876
7920
|
searchValue: state.searchFieldVisible ? '' : state.searchValue
|
|
7877
7921
|
};
|
|
7922
|
+
case name === ModelPickerToggle:
|
|
7923
|
+
return {
|
|
7924
|
+
...state,
|
|
7925
|
+
modelPickerOpen: !state.modelPickerOpen,
|
|
7926
|
+
modelPickerSearchValue: state.modelPickerOpen ? '' : state.modelPickerSearchValue
|
|
7927
|
+
};
|
|
7928
|
+
case isModelPickerItemInputName(name):
|
|
7929
|
+
{
|
|
7930
|
+
const modelId = getModelIdFromModelPickerItemInputName(name);
|
|
7931
|
+
return {
|
|
7932
|
+
...state,
|
|
7933
|
+
modelPickerOpen: false,
|
|
7934
|
+
modelPickerSearchValue: '',
|
|
7935
|
+
selectedModelId: modelId
|
|
7936
|
+
};
|
|
7937
|
+
}
|
|
7878
7938
|
case isProjectInputName(name):
|
|
7879
7939
|
{
|
|
7880
7940
|
const projectId = getProjectIdFromInputName(name);
|
|
@@ -7929,7 +7989,7 @@ const handleClickBack = async state => {
|
|
|
7929
7989
|
|
|
7930
7990
|
const handleClickClose = async () => {
|
|
7931
7991
|
// @ts-ignore
|
|
7932
|
-
await invoke$
|
|
7992
|
+
await invoke$2('Layout.hideSecondarySideBar');
|
|
7933
7993
|
};
|
|
7934
7994
|
|
|
7935
7995
|
const handleClickDelete = async (state, sessionId = '') => {
|
|
@@ -7951,7 +8011,7 @@ const handleClickFileName = async uri => {
|
|
|
7951
8011
|
return;
|
|
7952
8012
|
}
|
|
7953
8013
|
const normalizedUri = normalizeFileReferenceUri(uri);
|
|
7954
|
-
await invoke$
|
|
8014
|
+
await invoke$2('Main.openUri', normalizedUri);
|
|
7955
8015
|
};
|
|
7956
8016
|
|
|
7957
8017
|
const handleClickNew = async state => {
|
|
@@ -7961,12 +8021,12 @@ const handleClickNew = async state => {
|
|
|
7961
8021
|
};
|
|
7962
8022
|
|
|
7963
8023
|
const handleClickSessionDebug = async state => {
|
|
7964
|
-
await invoke$
|
|
8024
|
+
await invoke$2('Main.openUri', `chat-debug://${state.selectedSessionId}`);
|
|
7965
8025
|
return state;
|
|
7966
8026
|
};
|
|
7967
8027
|
|
|
7968
8028
|
const handleClickSettings = async () => {
|
|
7969
|
-
await invoke$
|
|
8029
|
+
await invoke$2('Main.openUri', 'app://settings.json');
|
|
7970
8030
|
};
|
|
7971
8031
|
|
|
7972
8032
|
const handleDragEnter = async (state, name, hasFiles = true) => {
|
|
@@ -8078,6 +8138,12 @@ const handleInput = async (state, name, value, inputSource = 'user') => {
|
|
|
8078
8138
|
if (name === Search) {
|
|
8079
8139
|
return handleSearchValueChange(state, value);
|
|
8080
8140
|
}
|
|
8141
|
+
if (name === ModelPickerSearch) {
|
|
8142
|
+
return {
|
|
8143
|
+
...state,
|
|
8144
|
+
modelPickerSearchValue: value
|
|
8145
|
+
};
|
|
8146
|
+
}
|
|
8081
8147
|
if (name !== Composer) {
|
|
8082
8148
|
return state;
|
|
8083
8149
|
}
|
|
@@ -8208,6 +8274,8 @@ const handleMissingApiKeySubmit = async (state, submitterName = '') => {
|
|
|
8208
8274
|
const handleModelChange = async (state, value) => {
|
|
8209
8275
|
return {
|
|
8210
8276
|
...state,
|
|
8277
|
+
modelPickerOpen: false,
|
|
8278
|
+
modelPickerSearchValue: '',
|
|
8211
8279
|
selectedModelId: value
|
|
8212
8280
|
};
|
|
8213
8281
|
};
|
|
@@ -8513,6 +8581,15 @@ const loadBackendUrl = async () => {
|
|
|
8513
8581
|
}
|
|
8514
8582
|
};
|
|
8515
8583
|
|
|
8584
|
+
const loadChatStorageWorkerEnabled = async () => {
|
|
8585
|
+
try {
|
|
8586
|
+
const savedChatStorageWorkerEnabled = await get('chatView.chatStorageWorkerEnabled');
|
|
8587
|
+
return typeof savedChatStorageWorkerEnabled === 'boolean' ? savedChatStorageWorkerEnabled : false;
|
|
8588
|
+
} catch {
|
|
8589
|
+
return false;
|
|
8590
|
+
}
|
|
8591
|
+
};
|
|
8592
|
+
|
|
8516
8593
|
const loadComposerDropEnabled = async () => {
|
|
8517
8594
|
try {
|
|
8518
8595
|
const savedComposerDropEnabled = await get('chatView.composerDropEnabled');
|
|
@@ -8639,13 +8716,14 @@ const loadVoiceDictationEnabled = async () => {
|
|
|
8639
8716
|
};
|
|
8640
8717
|
|
|
8641
8718
|
const loadPreferences = async () => {
|
|
8642
|
-
const [aiSessionTitleGenerationEnabled, authAccessToken, authEnabled, authRefreshToken, backendUrl, composerDropEnabled, openApiApiKey, openRouterApiKey, emitStreamingFunctionCallEvents, searchEnabled, streamingEnabled, todoListToolEnabled, passIncludeObfuscation, useChatCoordinatorWorker, useChatMathWorker, useChatNetworkWorkerForRequests, useChatToolWorker, voiceDictationEnabled] = await Promise.all([loadAiSessionTitleGenerationEnabled(), loadBackendAccessToken(), loadAuthEnabled(), loadBackendRefreshToken(), loadBackendUrl(), loadComposerDropEnabled(), loadOpenApiApiKey(), loadOpenRouterApiKey(), loadEmitStreamingFunctionCallEvents(), loadSearchEnabled(), loadStreamingEnabled(), loadTodoListToolEnabled(), loadPassIncludeObfuscation(), loadUseChatCoordinatorWorker(), loadUseChatMathWorker(), loadUseChatNetworkWorkerForRequests(), loadUseChatToolWorker(), loadVoiceDictationEnabled()]);
|
|
8719
|
+
const [aiSessionTitleGenerationEnabled, authAccessToken, authEnabled, authRefreshToken, backendUrl, chatStorageWorkerEnabled, composerDropEnabled, openApiApiKey, openRouterApiKey, emitStreamingFunctionCallEvents, searchEnabled, streamingEnabled, todoListToolEnabled, passIncludeObfuscation, useChatCoordinatorWorker, useChatMathWorker, useChatNetworkWorkerForRequests, useChatToolWorker, voiceDictationEnabled] = await Promise.all([loadAiSessionTitleGenerationEnabled(), loadBackendAccessToken(), loadAuthEnabled(), loadBackendRefreshToken(), loadBackendUrl(), loadChatStorageWorkerEnabled(), loadComposerDropEnabled(), loadOpenApiApiKey(), loadOpenRouterApiKey(), loadEmitStreamingFunctionCallEvents(), loadSearchEnabled(), loadStreamingEnabled(), loadTodoListToolEnabled(), loadPassIncludeObfuscation(), loadUseChatCoordinatorWorker(), loadUseChatMathWorker(), loadUseChatNetworkWorkerForRequests(), loadUseChatToolWorker(), loadVoiceDictationEnabled()]);
|
|
8643
8720
|
return {
|
|
8644
8721
|
aiSessionTitleGenerationEnabled,
|
|
8645
8722
|
authAccessToken,
|
|
8646
8723
|
authEnabled,
|
|
8647
8724
|
authRefreshToken,
|
|
8648
8725
|
backendUrl,
|
|
8726
|
+
chatStorageWorkerEnabled,
|
|
8649
8727
|
composerDropEnabled,
|
|
8650
8728
|
emitStreamingFunctionCallEvents,
|
|
8651
8729
|
openApiApiKey,
|
|
@@ -8703,6 +8781,7 @@ const loadContent = async (state, savedState) => {
|
|
|
8703
8781
|
authEnabled,
|
|
8704
8782
|
authRefreshToken,
|
|
8705
8783
|
backendUrl,
|
|
8784
|
+
chatStorageWorkerEnabled,
|
|
8706
8785
|
composerDropEnabled,
|
|
8707
8786
|
emitStreamingFunctionCallEvents,
|
|
8708
8787
|
openApiApiKey,
|
|
@@ -8717,6 +8796,7 @@ const loadContent = async (state, savedState) => {
|
|
|
8717
8796
|
useChatToolWorker,
|
|
8718
8797
|
voiceDictationEnabled
|
|
8719
8798
|
} = await loadPreferences();
|
|
8799
|
+
setChatStorageWorkerEnabled$1(chatStorageWorkerEnabled);
|
|
8720
8800
|
const legacySavedSessions = getSavedSessions(savedState);
|
|
8721
8801
|
const storedSessions = await listChatSessions();
|
|
8722
8802
|
let sessions = storedSessions;
|
|
@@ -8772,6 +8852,7 @@ const loadContent = async (state, savedState) => {
|
|
|
8772
8852
|
authStatus: authAccessToken ? 'signed-in' : 'signed-out',
|
|
8773
8853
|
backendUrl,
|
|
8774
8854
|
chatListScrollTop,
|
|
8855
|
+
chatStorageWorkerEnabled,
|
|
8775
8856
|
composerDropActive: false,
|
|
8776
8857
|
composerDropEnabled,
|
|
8777
8858
|
composerValue: savedComposerValue ?? state.composerValue,
|
|
@@ -8779,6 +8860,9 @@ const loadContent = async (state, savedState) => {
|
|
|
8779
8860
|
initial: false,
|
|
8780
8861
|
lastNormalViewMode,
|
|
8781
8862
|
messagesScrollTop,
|
|
8863
|
+
modelPickerOpen: false,
|
|
8864
|
+
modelPickerSearchValue: '',
|
|
8865
|
+
newChatModelPickerEnabled: state.newChatModelPickerEnabled,
|
|
8782
8866
|
openApiApiKey,
|
|
8783
8867
|
openApiApiKeyInput: openApiApiKey,
|
|
8784
8868
|
openRouterApiKey,
|
|
@@ -9006,6 +9090,12 @@ const ChatViewDropOverlay = 'ChatViewDropOverlay';
|
|
|
9006
9090
|
const ChatViewDropOverlayActive = 'ChatViewDropOverlayActive';
|
|
9007
9091
|
const SendButtonDisabled = 'SendButtonDisabled';
|
|
9008
9092
|
const ChatSendAreaBottom = 'ChatSendAreaBottom';
|
|
9093
|
+
const ChatModelPickerContainer = 'ChatModelPickerContainer';
|
|
9094
|
+
const ChatModelPicker = 'ChatModelPicker';
|
|
9095
|
+
const ChatModelPickerHeader = 'ChatModelPickerHeader';
|
|
9096
|
+
const ChatModelPickerList = 'ChatModelPickerList';
|
|
9097
|
+
const ChatModelPickerItem = 'ChatModelPickerItem';
|
|
9098
|
+
const ChatModelPickerItemSelected = 'ChatModelPickerItemSelected';
|
|
9009
9099
|
const ChatSendAreaContent = 'ChatSendAreaContent';
|
|
9010
9100
|
const ChatTodoList = 'ChatTodoList';
|
|
9011
9101
|
const ChatTodoListHeader = 'ChatTodoListHeader';
|
|
@@ -9050,6 +9140,7 @@ const Markdown = 'Markdown';
|
|
|
9050
9140
|
const MarkdownQuote = 'MarkdownQuote';
|
|
9051
9141
|
const MarkdownMathBlock = 'MarkdownMathBlock';
|
|
9052
9142
|
const MarkdownTable = 'MarkdownTable';
|
|
9143
|
+
const ChatTableWrapper = 'ChatTableWrapper';
|
|
9053
9144
|
const Message = 'Message';
|
|
9054
9145
|
const ChatMessageContent = 'ChatMessageContent';
|
|
9055
9146
|
const ChatToolCalls = 'ChatToolCalls';
|
|
@@ -9130,6 +9221,66 @@ const getModelLabel = model => {
|
|
|
9130
9221
|
return model.name;
|
|
9131
9222
|
};
|
|
9132
9223
|
|
|
9224
|
+
const getChatModelPickerVirtualDom = (models, selectedModelId, modelPickerOpen, modelPickerSearchValue) => {
|
|
9225
|
+
const selectedModel = models.find(model => model.id === selectedModelId);
|
|
9226
|
+
const selectedModelLabel = selectedModel ? selectedModel.name : selectedModelId;
|
|
9227
|
+
const normalizedSearch = modelPickerSearchValue.trim().toLowerCase();
|
|
9228
|
+
const visibleModels = normalizedSearch ? models.filter(model => getModelLabel(model).toLowerCase().includes(normalizedSearch)) : models;
|
|
9229
|
+
return [{
|
|
9230
|
+
childCount: modelPickerOpen ? 2 : 1,
|
|
9231
|
+
className: ChatModelPickerContainer,
|
|
9232
|
+
type: Div
|
|
9233
|
+
}, {
|
|
9234
|
+
childCount: 2,
|
|
9235
|
+
className: Select,
|
|
9236
|
+
name: ModelPickerToggle,
|
|
9237
|
+
onClick: HandleClick,
|
|
9238
|
+
title: selectedModelLabel,
|
|
9239
|
+
type: Button$1
|
|
9240
|
+
}, {
|
|
9241
|
+
childCount: 0,
|
|
9242
|
+
className: 'MaskIcon MaskIconChevronUp',
|
|
9243
|
+
type: Div
|
|
9244
|
+
}, text(selectedModelLabel), ...(modelPickerOpen ? [{
|
|
9245
|
+
childCount: 3 + visibleModels.length,
|
|
9246
|
+
className: ChatModelPicker,
|
|
9247
|
+
type: Div
|
|
9248
|
+
}, {
|
|
9249
|
+
childCount: 2,
|
|
9250
|
+
className: ChatModelPickerHeader,
|
|
9251
|
+
type: Div
|
|
9252
|
+
}, {
|
|
9253
|
+
childCount: 0,
|
|
9254
|
+
className: InputBox,
|
|
9255
|
+
name: ModelPickerSearch,
|
|
9256
|
+
onInput: HandleInput,
|
|
9257
|
+
placeholder: 'Search models',
|
|
9258
|
+
type: Input,
|
|
9259
|
+
value: modelPickerSearchValue
|
|
9260
|
+
}, {
|
|
9261
|
+
childCount: 1,
|
|
9262
|
+
className: IconButton,
|
|
9263
|
+
name: ModelPickerSettings,
|
|
9264
|
+
onClick: HandleClick,
|
|
9265
|
+
title: 'Settings',
|
|
9266
|
+
type: Button$1
|
|
9267
|
+
}, {
|
|
9268
|
+
childCount: 0,
|
|
9269
|
+
className: 'MaskIcon MaskIconSettingsGear',
|
|
9270
|
+
type: Div
|
|
9271
|
+
}, {
|
|
9272
|
+
childCount: visibleModels.length,
|
|
9273
|
+
className: ChatModelPickerList,
|
|
9274
|
+
type: Div
|
|
9275
|
+
}, ...visibleModels.flatMap(model => [{
|
|
9276
|
+
childCount: 1,
|
|
9277
|
+
className: `${ChatModelPickerItem}${model.id === selectedModelId ? ` ${ChatModelPickerItemSelected}` : ''}`,
|
|
9278
|
+
name: getModelPickerItemInputName(model.id),
|
|
9279
|
+
onClick: HandleClick,
|
|
9280
|
+
type: Button$1
|
|
9281
|
+
}, text(getModelLabel(model))])] : [])];
|
|
9282
|
+
};
|
|
9283
|
+
|
|
9133
9284
|
const getModelOptionDOm = (model, selectedModelId) => {
|
|
9134
9285
|
return [{
|
|
9135
9286
|
childCount: 1,
|
|
@@ -9253,7 +9404,7 @@ const getUsageOverviewDom = (tokensUsed, tokensMax) => {
|
|
|
9253
9404
|
}, text(usageLabel)];
|
|
9254
9405
|
};
|
|
9255
9406
|
|
|
9256
|
-
const getChatSendAreaDom = (composerValue, models, selectedModelId, usageOverviewEnabled, tokensUsed, tokensMax, addContextButtonEnabled, showRunMode, runMode, todoListToolEnabled, todoListItems, voiceDictationEnabled = false) => {
|
|
9407
|
+
const getChatSendAreaDom = (composerValue, modelPickerOpen, modelPickerSearchValue, models, newChatModelPickerEnabled, selectedModelId, usageOverviewEnabled, tokensUsed, tokensMax, addContextButtonEnabled, showRunMode, runMode, todoListToolEnabled, todoListItems, voiceDictationEnabled = false) => {
|
|
9257
9408
|
const isSendDisabled = composerValue.trim() === '';
|
|
9258
9409
|
const controlsCount = 2 + (usageOverviewEnabled ? 1 : 0) + (showRunMode ? 1 : 0) + (addContextButtonEnabled ? 1 : 0);
|
|
9259
9410
|
const hasTodoList = todoListToolEnabled && todoListItems.length > 0;
|
|
@@ -9307,7 +9458,7 @@ const getChatSendAreaDom = (composerValue, models, selectedModelId, usageOvervie
|
|
|
9307
9458
|
childCount: voiceDictationEnabled ? controlsCount + 1 : controlsCount,
|
|
9308
9459
|
className: ChatSendAreaBottom,
|
|
9309
9460
|
type: Div
|
|
9310
|
-
}, ...getChatSelectVirtualDom(models, selectedModelId), ...(showRunMode ? getRunModeSelectVirtualDom(runMode) : []), ...(usageOverviewEnabled ? getUsageOverviewDom(tokensUsed, tokensMax) : []), ...(addContextButtonEnabled ? getAddContextButtonDom() : []), ...getSendButtonDom(isSendDisabled, voiceDictationEnabled)];
|
|
9461
|
+
}, ...(newChatModelPickerEnabled ? getChatModelPickerVirtualDom(models, selectedModelId, modelPickerOpen, modelPickerSearchValue) : getChatSelectVirtualDom(models, selectedModelId)), ...(showRunMode ? getRunModeSelectVirtualDom(runMode) : []), ...(usageOverviewEnabled ? getUsageOverviewDom(tokensUsed, tokensMax) : []), ...(addContextButtonEnabled ? getAddContextButtonDom() : []), ...getSendButtonDom(isSendDisabled, voiceDictationEnabled)];
|
|
9311
9462
|
};
|
|
9312
9463
|
|
|
9313
9464
|
const getImageAltText = alt => {
|
|
@@ -9544,6 +9695,9 @@ const highlightCode = (code, language) => {
|
|
|
9544
9695
|
}];
|
|
9545
9696
|
};
|
|
9546
9697
|
|
|
9698
|
+
const hasVisibleInlineContent = children => {
|
|
9699
|
+
return children.some(child => child.type !== 'text' || child.text.trim() !== '');
|
|
9700
|
+
};
|
|
9547
9701
|
const getTokenDom = token => {
|
|
9548
9702
|
if (!token.className) {
|
|
9549
9703
|
return [text(token.text)];
|
|
@@ -9605,6 +9759,11 @@ const getTableRowDom = (row, useChatMathWorker) => {
|
|
|
9605
9759
|
};
|
|
9606
9760
|
const getTableDom = (node, useChatMathWorker) => {
|
|
9607
9761
|
return [{
|
|
9762
|
+
childCount: 1,
|
|
9763
|
+
className: ChatTableWrapper,
|
|
9764
|
+
style: 'padding-bottom: 8px;',
|
|
9765
|
+
type: Div
|
|
9766
|
+
}, {
|
|
9608
9767
|
childCount: 2,
|
|
9609
9768
|
className: MarkdownTable,
|
|
9610
9769
|
type: Table
|
|
@@ -9650,6 +9809,9 @@ const getBlockQuoteDom = (node, useChatMathWorker) => {
|
|
|
9650
9809
|
};
|
|
9651
9810
|
const getMessageNodeDom = (node, useChatMathWorker = false) => {
|
|
9652
9811
|
if (node.type === 'text') {
|
|
9812
|
+
if (!hasVisibleInlineContent(node.children)) {
|
|
9813
|
+
return [];
|
|
9814
|
+
}
|
|
9653
9815
|
return [{
|
|
9654
9816
|
childCount: node.children.length,
|
|
9655
9817
|
className: Markdown,
|
|
@@ -10563,7 +10725,8 @@ const getChatMessageDom = (message, parsedMessageContent, _openRouterApiKeyInput
|
|
|
10563
10725
|
const messageDom = getMessageContentDom(parsedMessageContent, useChatMathWorker);
|
|
10564
10726
|
const toolCallsDom = getToolCallsDom(message);
|
|
10565
10727
|
const toolCallsChildCount = toolCallsDom.length > 0 ? 1 : 0;
|
|
10566
|
-
const
|
|
10728
|
+
const messageDomChildCount = messageDom.filter(node => node.type !== Text).length;
|
|
10729
|
+
const extraChildCount = isOpenApiApiKeyMissingMessage || isOpenRouterApiKeyMissingMessage || isOpenRouterRequestFailedMessage || isOpenRouterTooManyRequestsMessage ? messageDomChildCount + 1 + toolCallsChildCount : messageDomChildCount + toolCallsChildCount;
|
|
10567
10730
|
return [{
|
|
10568
10731
|
childCount: 1,
|
|
10569
10732
|
className: mergeClassNames(Message, roleClassName),
|
|
@@ -10737,7 +10900,10 @@ const getChatModeChatFocusVirtualDom = ({
|
|
|
10737
10900
|
composerLineHeight = 20,
|
|
10738
10901
|
composerValue,
|
|
10739
10902
|
messagesScrollTop = 0,
|
|
10903
|
+
modelPickerOpen = false,
|
|
10904
|
+
modelPickerSearchValue = '',
|
|
10740
10905
|
models,
|
|
10906
|
+
newChatModelPickerEnabled = false,
|
|
10741
10907
|
openApiApiKeyInput,
|
|
10742
10908
|
openRouterApiKeyInput,
|
|
10743
10909
|
openRouterApiKeyState = 'idle',
|
|
@@ -10768,7 +10934,7 @@ const getChatModeChatFocusVirtualDom = ({
|
|
|
10768
10934
|
onDragEnter: HandleDragEnterChatView,
|
|
10769
10935
|
onDragOver: HandleDragOverChatView,
|
|
10770
10936
|
type: Div
|
|
10771
|
-
}, ...getProjectListDom(projects, sessions, projectExpandedIds, selectedProjectId, selectedSessionId, projectListScrollTop), ...getMessagesDom(messages, parsedMessages, openRouterApiKeyInput, openApiApiKeyInput, openRouterApiKeyState, messagesScrollTop, useChatMathWorker, true), ...getChatSendAreaDom(composerValue, models, selectedModelId, usageOverviewEnabled, tokensUsed, tokensMax, addContextButtonEnabled, showRunMode, runMode, todoListToolEnabled, todoListItems, voiceDictationEnabled), ...(isDropOverlayVisible ? [{
|
|
10937
|
+
}, ...getProjectListDom(projects, sessions, projectExpandedIds, selectedProjectId, selectedSessionId, projectListScrollTop), ...getMessagesDom(messages, parsedMessages, openRouterApiKeyInput, openApiApiKeyInput, openRouterApiKeyState, messagesScrollTop, useChatMathWorker, true), ...getChatSendAreaDom(composerValue, modelPickerOpen, modelPickerSearchValue, models, newChatModelPickerEnabled, selectedModelId, usageOverviewEnabled, tokensUsed, tokensMax, addContextButtonEnabled, showRunMode, runMode, todoListToolEnabled, todoListItems, voiceDictationEnabled), ...(isDropOverlayVisible ? [{
|
|
10772
10938
|
childCount: 1,
|
|
10773
10939
|
className: mergeClassNames(ChatViewDropOverlay, ChatViewDropOverlayActive),
|
|
10774
10940
|
name: ComposerDropTarget,
|
|
@@ -10902,7 +11068,10 @@ const getChatModeDetailVirtualDom = ({
|
|
|
10902
11068
|
composerLineHeight = 20,
|
|
10903
11069
|
composerValue,
|
|
10904
11070
|
messagesScrollTop = 0,
|
|
11071
|
+
modelPickerOpen = false,
|
|
11072
|
+
modelPickerSearchValue = '',
|
|
10905
11073
|
models,
|
|
11074
|
+
newChatModelPickerEnabled = false,
|
|
10906
11075
|
openApiApiKeyInput,
|
|
10907
11076
|
openRouterApiKeyInput,
|
|
10908
11077
|
openRouterApiKeyState = 'idle',
|
|
@@ -10930,7 +11099,7 @@ const getChatModeDetailVirtualDom = ({
|
|
|
10930
11099
|
onDragEnter: HandleDragEnterChatView,
|
|
10931
11100
|
onDragOver: HandleDragOverChatView,
|
|
10932
11101
|
type: Div
|
|
10933
|
-
}, ...getChatHeaderDomDetailMode(selectedSessionTitle, authEnabled, authStatus, authErrorMessage), ...getMessagesDom(messages, parsedMessages, openRouterApiKeyInput, openApiApiKeyInput, openRouterApiKeyState, messagesScrollTop, useChatMathWorker), ...getChatSendAreaDom(composerValue, models, selectedModelId, usageOverviewEnabled, tokensUsed, tokensMax, addContextButtonEnabled, showRunMode, runMode, todoListToolEnabled, todoListItems, voiceDictationEnabled), ...(isDropOverlayVisible ? [{
|
|
11102
|
+
}, ...getChatHeaderDomDetailMode(selectedSessionTitle, authEnabled, authStatus, authErrorMessage), ...getMessagesDom(messages, parsedMessages, openRouterApiKeyInput, openApiApiKeyInput, openRouterApiKeyState, messagesScrollTop, useChatMathWorker), ...getChatSendAreaDom(composerValue, modelPickerOpen, modelPickerSearchValue, models, newChatModelPickerEnabled, selectedModelId, usageOverviewEnabled, tokensUsed, tokensMax, addContextButtonEnabled, showRunMode, runMode, todoListToolEnabled, todoListItems, voiceDictationEnabled), ...(isDropOverlayVisible ? [{
|
|
10934
11103
|
childCount: 1,
|
|
10935
11104
|
className: mergeClassNames(ChatViewDropOverlay, ChatViewDropOverlayActive),
|
|
10936
11105
|
name: ComposerDropTarget,
|
|
@@ -11044,7 +11213,10 @@ const getChatModeListVirtualDom = ({
|
|
|
11044
11213
|
composerHeight = 28,
|
|
11045
11214
|
composerLineHeight = 20,
|
|
11046
11215
|
composerValue,
|
|
11216
|
+
modelPickerOpen = false,
|
|
11217
|
+
modelPickerSearchValue = '',
|
|
11047
11218
|
models,
|
|
11219
|
+
newChatModelPickerEnabled = false,
|
|
11048
11220
|
runMode,
|
|
11049
11221
|
searchEnabled = false,
|
|
11050
11222
|
searchFieldVisible = false,
|
|
@@ -11069,7 +11241,7 @@ const getChatModeListVirtualDom = ({
|
|
|
11069
11241
|
onDragEnter: HandleDragEnterChatView,
|
|
11070
11242
|
onDragOver: HandleDragOverChatView,
|
|
11071
11243
|
type: Div
|
|
11072
|
-
}, ...getChatHeaderListModeDom(authEnabled, authStatus, authErrorMessage, searchEnabled, searchFieldVisible, searchValue), ...getChatListDom(visibleSessions, selectedSessionId, chatListScrollTop), ...getChatSendAreaDom(composerValue, models, selectedModelId, usageOverviewEnabled, tokensUsed, tokensMax, addContextButtonEnabled, showRunMode, runMode, todoListToolEnabled, todoListItems, voiceDictationEnabled), ...(isDropOverlayVisible ? [{
|
|
11244
|
+
}, ...getChatHeaderListModeDom(authEnabled, authStatus, authErrorMessage, searchEnabled, searchFieldVisible, searchValue), ...getChatListDom(visibleSessions, selectedSessionId, chatListScrollTop), ...getChatSendAreaDom(composerValue, modelPickerOpen, modelPickerSearchValue, models, newChatModelPickerEnabled, selectedModelId, usageOverviewEnabled, tokensUsed, tokensMax, addContextButtonEnabled, showRunMode, runMode, todoListToolEnabled, todoListItems, voiceDictationEnabled), ...(isDropOverlayVisible ? [{
|
|
11073
11245
|
childCount: 1,
|
|
11074
11246
|
className: mergeClassNames(ChatViewDropOverlay, ChatViewDropOverlayActive),
|
|
11075
11247
|
name: ComposerDropTarget,
|
|
@@ -11177,7 +11349,10 @@ const getChatVirtualDom = options => {
|
|
|
11177
11349
|
composerLineHeight,
|
|
11178
11350
|
composerValue,
|
|
11179
11351
|
messagesScrollTop,
|
|
11352
|
+
modelPickerOpen = false,
|
|
11353
|
+
modelPickerSearchValue = '',
|
|
11180
11354
|
models,
|
|
11355
|
+
newChatModelPickerEnabled = false,
|
|
11181
11356
|
openApiApiKeyInput,
|
|
11182
11357
|
openRouterApiKeyInput,
|
|
11183
11358
|
openRouterApiKeyState,
|
|
@@ -11219,7 +11394,10 @@ const getChatVirtualDom = options => {
|
|
|
11219
11394
|
composerLineHeight,
|
|
11220
11395
|
composerValue,
|
|
11221
11396
|
messagesScrollTop,
|
|
11397
|
+
modelPickerOpen,
|
|
11398
|
+
modelPickerSearchValue,
|
|
11222
11399
|
models,
|
|
11400
|
+
newChatModelPickerEnabled,
|
|
11223
11401
|
openApiApiKeyInput,
|
|
11224
11402
|
openRouterApiKeyInput,
|
|
11225
11403
|
openRouterApiKeyState,
|
|
@@ -11255,7 +11433,10 @@ const getChatVirtualDom = options => {
|
|
|
11255
11433
|
composerLineHeight,
|
|
11256
11434
|
composerValue,
|
|
11257
11435
|
messagesScrollTop,
|
|
11436
|
+
modelPickerOpen,
|
|
11437
|
+
modelPickerSearchValue,
|
|
11258
11438
|
models,
|
|
11439
|
+
newChatModelPickerEnabled,
|
|
11259
11440
|
openApiApiKeyInput,
|
|
11260
11441
|
openRouterApiKeyInput,
|
|
11261
11442
|
openRouterApiKeyState,
|
|
@@ -11287,7 +11468,10 @@ const getChatVirtualDom = options => {
|
|
|
11287
11468
|
composerHeight,
|
|
11288
11469
|
composerLineHeight,
|
|
11289
11470
|
composerValue,
|
|
11471
|
+
modelPickerOpen,
|
|
11472
|
+
modelPickerSearchValue,
|
|
11290
11473
|
models,
|
|
11474
|
+
newChatModelPickerEnabled,
|
|
11291
11475
|
runMode,
|
|
11292
11476
|
searchEnabled,
|
|
11293
11477
|
searchFieldVisible,
|
|
@@ -11324,7 +11508,10 @@ const renderItems = (oldState, newState) => {
|
|
|
11324
11508
|
composerValue,
|
|
11325
11509
|
initial,
|
|
11326
11510
|
messagesScrollTop,
|
|
11511
|
+
modelPickerOpen,
|
|
11512
|
+
modelPickerSearchValue,
|
|
11327
11513
|
models,
|
|
11514
|
+
newChatModelPickerEnabled,
|
|
11328
11515
|
openApiApiKeyInput,
|
|
11329
11516
|
openRouterApiKeyInput,
|
|
11330
11517
|
openRouterApiKeyState,
|
|
@@ -11367,7 +11554,10 @@ const renderItems = (oldState, newState) => {
|
|
|
11367
11554
|
composerLineHeight,
|
|
11368
11555
|
composerValue,
|
|
11369
11556
|
messagesScrollTop,
|
|
11557
|
+
modelPickerOpen,
|
|
11558
|
+
modelPickerSearchValue,
|
|
11370
11559
|
models,
|
|
11560
|
+
newChatModelPickerEnabled,
|
|
11371
11561
|
openApiApiKeyInput,
|
|
11372
11562
|
openRouterApiKeyInput,
|
|
11373
11563
|
openRouterApiKeyState,
|
|
@@ -11649,6 +11839,8 @@ const reset = async state => {
|
|
|
11649
11839
|
composerHeight: getMinComposerHeightForState(state),
|
|
11650
11840
|
composerValue: '',
|
|
11651
11841
|
mockAiResponseDelay: 0,
|
|
11842
|
+
modelPickerOpen: false,
|
|
11843
|
+
modelPickerSearchValue: '',
|
|
11652
11844
|
openApiApiKey: '',
|
|
11653
11845
|
openRouterApiKey: '',
|
|
11654
11846
|
openRouterApiKeyInput: '',
|
|
@@ -11750,6 +11942,19 @@ const setChatList = state => {
|
|
|
11750
11942
|
};
|
|
11751
11943
|
};
|
|
11752
11944
|
|
|
11945
|
+
const setChatStorageWorkerEnabled = async (state, chatStorageWorkerEnabled, persist = true) => {
|
|
11946
|
+
if (persist) {
|
|
11947
|
+
await update({
|
|
11948
|
+
'chatView.chatStorageWorkerEnabled': chatStorageWorkerEnabled
|
|
11949
|
+
});
|
|
11950
|
+
}
|
|
11951
|
+
setChatStorageWorkerEnabled$1(chatStorageWorkerEnabled);
|
|
11952
|
+
return {
|
|
11953
|
+
...state,
|
|
11954
|
+
chatStorageWorkerEnabled
|
|
11955
|
+
};
|
|
11956
|
+
};
|
|
11957
|
+
|
|
11753
11958
|
const setEmitStreamingFunctionCallEvents = (state, emitStreamingFunctionCallEvents) => {
|
|
11754
11959
|
return {
|
|
11755
11960
|
...state,
|
|
@@ -11757,6 +11962,15 @@ const setEmitStreamingFunctionCallEvents = (state, emitStreamingFunctionCallEven
|
|
|
11757
11962
|
};
|
|
11758
11963
|
};
|
|
11759
11964
|
|
|
11965
|
+
const setNewChatModelPickerEnabled = (state, newChatModelPickerEnabled) => {
|
|
11966
|
+
return {
|
|
11967
|
+
...state,
|
|
11968
|
+
modelPickerOpen: newChatModelPickerEnabled ? state.modelPickerOpen : false,
|
|
11969
|
+
modelPickerSearchValue: newChatModelPickerEnabled ? state.modelPickerSearchValue : '',
|
|
11970
|
+
newChatModelPickerEnabled
|
|
11971
|
+
};
|
|
11972
|
+
};
|
|
11973
|
+
|
|
11760
11974
|
const setQuestionToolEnabled = (state, questionToolEnabled) => {
|
|
11761
11975
|
return {
|
|
11762
11976
|
...state,
|
|
@@ -11910,7 +12124,9 @@ const commandMap = {
|
|
|
11910
12124
|
'Chat.setAuthEnabled': wrapCommand(setAuthEnabled),
|
|
11911
12125
|
'Chat.setBackendUrl': wrapCommand(setBackendUrl),
|
|
11912
12126
|
'Chat.setChatList': wrapCommand(setChatList),
|
|
12127
|
+
'Chat.setChatStorageWorkerEnabled': wrapCommand(setChatStorageWorkerEnabled),
|
|
11913
12128
|
'Chat.setEmitStreamingFunctionCallEvents': wrapCommand(setEmitStreamingFunctionCallEvents),
|
|
12129
|
+
'Chat.setNewChatModelPickerEnabled': wrapCommand(setNewChatModelPickerEnabled),
|
|
11914
12130
|
'Chat.setOpenRouterApiKey': wrapCommand(setOpenRouterApiKey),
|
|
11915
12131
|
'Chat.setQuestionToolEnabled': wrapCommand(setQuestionToolEnabled),
|
|
11916
12132
|
'Chat.setSearchEnabled': wrapCommand(setSearchEnabled),
|
|
@@ -11958,6 +12174,18 @@ const initializeChatNetworkWorker = async () => {
|
|
|
11958
12174
|
set$6(rpc);
|
|
11959
12175
|
};
|
|
11960
12176
|
|
|
12177
|
+
const sendMessagePortToChatStorageWorker = async port => {
|
|
12178
|
+
// @ts-ignore
|
|
12179
|
+
await undefined(port, 0);
|
|
12180
|
+
};
|
|
12181
|
+
const initializeChatStorageWorker = async () => {
|
|
12182
|
+
const rpc = await create$4({
|
|
12183
|
+
commandMap: {},
|
|
12184
|
+
send: sendMessagePortToChatStorageWorker
|
|
12185
|
+
});
|
|
12186
|
+
set$3(rpc);
|
|
12187
|
+
};
|
|
12188
|
+
|
|
11961
12189
|
const send = port => {
|
|
11962
12190
|
return sendMessagePortToChatToolWorker(port);
|
|
11963
12191
|
};
|
|
@@ -11986,7 +12214,7 @@ const listen = async () => {
|
|
|
11986
12214
|
commandMap: commandMap
|
|
11987
12215
|
});
|
|
11988
12216
|
set$2(rpc);
|
|
11989
|
-
await Promise.all([initializeChatNetworkWorker(), initializeChatMathWorker(), initializeChatCoordinatorWorker(), initializeChatToolWorker(), initializeOpenerWorker()]);
|
|
12217
|
+
await Promise.all([initializeChatNetworkWorker(), initializeChatMathWorker(), initializeChatCoordinatorWorker(), initializeChatToolWorker(), initializeOpenerWorker(), initializeChatStorageWorker()]);
|
|
11990
12218
|
};
|
|
11991
12219
|
|
|
11992
12220
|
const main = async () => {
|