@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.
@@ -1118,14 +1118,14 @@ const create$2 = rpcId => {
1118
1118
  };
1119
1119
 
1120
1120
  const {
1121
- invoke: invoke$6,
1121
+ invoke: invoke$7,
1122
1122
  set: set$7
1123
1123
  } = create$2(6007);
1124
1124
  const getMathBlockDom = async node => {
1125
- return invoke$6('ChatMath.getMathBlockDom', node);
1125
+ return invoke$7('ChatMath.getMathBlockDom', node);
1126
1126
  };
1127
1127
  const getMathInlineDom = async node => {
1128
- return invoke$6('ChatMath.getMathInlineDom', node);
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$5,
1221
+ invoke: invoke$6,
1222
1222
  set: set$6
1223
1223
  } = create$2(ChatNetworkWorker);
1224
1224
 
1225
1225
  const {
1226
- invoke: invoke$4,
1226
+ invoke: invoke$5,
1227
1227
  set: set$5
1228
1228
  } = create$2(ChatToolWorker);
1229
1229
 
1230
1230
  const {
1231
- invoke: invoke$3,
1231
+ invoke: invoke$4,
1232
1232
  set: set$4
1233
1233
  } = create$2(ExtensionHostWorker);
1234
1234
 
1235
1235
  const {
1236
- invoke: invoke$2,
1236
+ invoke: invoke$3,
1237
1237
  set: set$3
1238
1238
  } = create$2(OpenerWorker);
1239
1239
  const openExternal = async url => {
1240
- return invoke$2('Open.openExternal', url);
1240
+ return invoke$3('Open.openExternal', url);
1241
1241
  };
1242
1242
 
1243
1243
  const {
1244
- invoke: invoke$1,
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$1('ContextMenu.show2', uid, menuId, x, y, args);
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$1('FileSystem.readFile', uri);
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$1('ExtensionHostManagement.activateByEvent', event, assetDir, platform);
1277
+ return invoke$2('ExtensionHostManagement.activateByEvent', event, assetDir, platform);
1278
1278
  };
1279
1279
  const getPreference = async key => {
1280
- return await invoke$1('Preferences.get', key);
1280
+ return await invoke$2('Preferences.get', key);
1281
1281
  };
1282
1282
  const measureTextBlockHeight$1 = async (actualInput, fontFamily, fontSize, lineHeightPx, width) => {
1283
- return invoke$1(`MeasureTextHeight.measureTextBlockHeight`, actualInput, fontFamily, fontSize, lineHeightPx, width);
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
- await chatSessionStorage.setSession(session.projectId ? {
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$1('ContextMenu.show', eventX, eventY, CHAT_LIST_ITEM_CONTEXT_MENU, item.id);
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$1('FilePicker.showDirectoryPicker');
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$1('Preferences.update', settings);
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$1('Chat.rerender');
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$1('Auth.login', state.backendUrl);
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$1('Main.openUri', `${trimTrailingSlashes(state.backendUrl)}/auth/login`);
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$1('Auth.logout', state.backendUrl);
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$1('Main.openUri', 'app://settings.json');
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$1('Main.openUri', 'app://settings.json');
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$4('ChatTool.execute', name, rawArguments, options);
3399
+ return invoke$5('ChatTool.execute', name, rawArguments, options);
3369
3400
  };
3370
3401
  const getTools = async () => {
3371
- return invoke$4('ChatTool.getTools');
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$3(method, ...params);
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$5('ChatNetwork.makeApiRequest', options);
4034
+ return invoke$6('ChatNetwork.makeApiRequest', options);
4004
4035
  };
4005
4036
  const makeStreamingApiRequest = async options => {
4006
- return invoke$5('ChatNetwork.makeStreamingApiRequest', options);
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$1('Chat.rerender');
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$1('Chat.rerender');
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$1('Chat.rerender');
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$1('Chat.rerender');
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$1('Layout.hideSecondarySideBar');
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$1('Main.openUri', normalizedUri);
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$1('Main.openUri', `chat-debug://${state.selectedSessionId}`);
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$1('Main.openUri', 'app://settings.json');
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 extraChildCount = isOpenApiApiKeyMissingMessage || isOpenRouterApiKeyMissingMessage || isOpenRouterRequestFailedMessage || isOpenRouterTooManyRequestsMessage ? parsedMessageContent.length + 1 + toolCallsChildCount : parsedMessageContent.length + toolCallsChildCount;
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 () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/chat-view",
3
- "version": "6.16.0",
3
+ "version": "6.18.0",
4
4
  "description": "Chat View Worker",
5
5
  "repository": {
6
6
  "type": "git",