@lvce-editor/chat-view 6.17.0 → 6.19.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 => {
@@ -1473,7 +1473,7 @@ const chatTitle = () => {
1473
1473
  return i18nString('Chat');
1474
1474
  };
1475
1475
  const chats = () => {
1476
- return i18nString('Chats');
1476
+ return i18nString('Chat');
1477
1477
  };
1478
1478
  const newChat = () => {
1479
1479
  return i18nString('New Chat');
@@ -1551,7 +1551,7 @@ const getOpenApiApiKey = () => {
1551
1551
  return i18nString('Get API Key');
1552
1552
  };
1553
1553
  const deleteChatSession$1 = () => {
1554
- return i18nString('Delete chat session');
1554
+ return i18nString('Archive');
1555
1555
  };
1556
1556
  const defaultSessionTitle = () => {
1557
1557
  return i18nString('Chat 1');
@@ -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',
@@ -1793,6 +1794,12 @@ const create = (uid, x, y, width, height, platform, assetDir) => {
1793
1794
  set$1(uid, state, state);
1794
1795
  };
1795
1796
 
1797
+ const invoke$1 = async (method, ...params) => {
1798
+ {
1799
+ throw new Error('ChatStorageWorker is not initialized');
1800
+ }
1801
+ };
1802
+
1796
1803
  const toError = error => {
1797
1804
  if (error instanceof Error) {
1798
1805
  return error;
@@ -2369,8 +2376,12 @@ const createDefaultStorage = () => {
2369
2376
  return new IndexedDbChatSessionStorage();
2370
2377
  };
2371
2378
  let chatSessionStorage = createDefaultStorage();
2379
+ let chatStorageWorkerEnabled = false;
2380
+ const setChatStorageWorkerEnabled$1 = enabled => {
2381
+ chatStorageWorkerEnabled = enabled;
2382
+ };
2372
2383
  const listChatSessions = async () => {
2373
- const sessions = await chatSessionStorage.listSessions();
2384
+ const sessions = chatStorageWorkerEnabled ? await invoke$1() : await chatSessionStorage.listSessions();
2374
2385
  return sessions.map(session => {
2375
2386
  const summary = {
2376
2387
  id: session.id,
@@ -2387,7 +2398,7 @@ const listChatSessions = async () => {
2387
2398
  });
2388
2399
  };
2389
2400
  const getChatSession = async id => {
2390
- const session = await chatSessionStorage.getSession(id);
2401
+ const session = chatStorageWorkerEnabled ? await invoke$1('ChatStorage.getSession', id) : await chatSessionStorage.getSession(id);
2391
2402
  if (!session) {
2392
2403
  return undefined;
2393
2404
  }
@@ -2408,18 +2419,35 @@ const saveChatSession = async session => {
2408
2419
  messages: [...session.messages],
2409
2420
  title: session.title
2410
2421
  };
2411
- await chatSessionStorage.setSession(session.projectId ? {
2422
+ const sessionValue = session.projectId ? {
2412
2423
  ...value,
2413
2424
  projectId: session.projectId
2414
- } : value);
2425
+ } : value;
2426
+ if (chatStorageWorkerEnabled) {
2427
+ await invoke$1('ChatStorage.setSession', sessionValue);
2428
+ return;
2429
+ }
2430
+ await chatSessionStorage.setSession(sessionValue);
2415
2431
  };
2416
2432
  const deleteChatSession = async id => {
2433
+ if (chatStorageWorkerEnabled) {
2434
+ await invoke$1('ChatStorage.deleteSession', id);
2435
+ return;
2436
+ }
2417
2437
  await chatSessionStorage.deleteSession(id);
2418
2438
  };
2419
2439
  const clearChatSessions = async () => {
2440
+ if (chatStorageWorkerEnabled) {
2441
+ await invoke$1();
2442
+ return;
2443
+ }
2420
2444
  await chatSessionStorage.clear();
2421
2445
  };
2422
2446
  const appendChatViewEvent = async event => {
2447
+ if (chatStorageWorkerEnabled) {
2448
+ await invoke$1('ChatStorage.appendEvent', event);
2449
+ return;
2450
+ }
2423
2451
  await chatSessionStorage.appendEvent(event);
2424
2452
  };
2425
2453
 
@@ -2943,6 +2971,7 @@ const OpenContainingFolder = 'Open Containing Folder';
2943
2971
  const OpenInIntegratedTerminal = 'Open in integrated Terminal';
2944
2972
  const Paste = 'Paste';
2945
2973
  const Rename = 'Rename';
2974
+ const Archive = 'Archive';
2946
2975
 
2947
2976
  const openContainingFolder = () => {
2948
2977
  return i18nString(OpenContainingFolder);
@@ -2968,10 +2997,27 @@ const copyRelativePath = () => {
2968
2997
  const rename = () => {
2969
2998
  return i18nString(Rename);
2970
2999
  };
3000
+ const archive = () => {
3001
+ return i18nString(Archive);
3002
+ };
2971
3003
  const deleteItem = () => {
2972
3004
  return i18nString(Delete);
2973
3005
  };
2974
3006
 
3007
+ const getMenuEntriesChatList = () => {
3008
+ return [{
3009
+ command: 'Chat.handleClickRename',
3010
+ flags: None,
3011
+ id: 'rename',
3012
+ label: rename()
3013
+ }, {
3014
+ command: 'Chat.handleClickArchive',
3015
+ flags: None,
3016
+ id: 'archive',
3017
+ label: archive()
3018
+ }];
3019
+ };
3020
+
2975
3021
  const menuEntrySeparator = {
2976
3022
  command: '',
2977
3023
  flags: Separator,
@@ -3042,8 +3088,13 @@ const menuEntryDelete = {
3042
3088
  const getMenuEntriesFile = () => {
3043
3089
  return [menuEntryCopyAsE2eTest, menuEntryOpenContainingFolder, menuEntryOpenInIntegratedTerminal, menuEntrySeparator, menuEntryCut, menuEntryCopy, menuEntryPaste, menuEntrySeparator, menuEntryCopyPath, menuEntryCopyRelativePath, menuEntrySeparator, menuEntryRename, menuEntryDelete];
3044
3090
  };
3045
- const getMenuEntries = () => {
3046
- return getMenuEntriesFile();
3091
+ const getMenuEntries = menuId => {
3092
+ switch (menuId) {
3093
+ case 1:
3094
+ return getMenuEntriesChatList();
3095
+ default:
3096
+ return getMenuEntriesFile();
3097
+ }
3047
3098
  };
3048
3099
 
3049
3100
  const getMenuEntryIds = () => {
@@ -3058,6 +3109,14 @@ const getSelectedSessionId = state => {
3058
3109
  return state.selectedSessionId;
3059
3110
  };
3060
3111
 
3112
+ const handleChatHeaderContextMenu = async state => {
3113
+ return state;
3114
+ };
3115
+
3116
+ const handleChatInputContextMenu = async state => {
3117
+ return state;
3118
+ };
3119
+
3061
3120
  const getListIndex = (state, eventX, eventY) => {
3062
3121
  const {
3063
3122
  headerHeight,
@@ -3075,18 +3134,29 @@ const getListIndex = (state, eventX, eventY) => {
3075
3134
  return Math.floor(relativeY / listItemHeight);
3076
3135
  };
3077
3136
 
3078
- const CHAT_LIST_ITEM_CONTEXT_MENU = 'ChatListItemContextMenu';
3079
3137
  const handleChatListContextMenu = async (state, eventX, eventY) => {
3138
+ const {
3139
+ selectedProjectId,
3140
+ sessions,
3141
+ uid
3142
+ } = state;
3080
3143
  const index = getListIndex(state, eventX, eventY);
3081
3144
  if (index === -1) {
3082
3145
  return state;
3083
3146
  }
3084
- const visibleSessions = getVisibleSessions(state.sessions, state.selectedProjectId);
3147
+ const visibleSessions = getVisibleSessions(sessions, selectedProjectId);
3085
3148
  const item = visibleSessions[index];
3086
3149
  if (!item) {
3087
3150
  return state;
3088
3151
  }
3089
- await invoke$1('ContextMenu.show', eventX, eventY, CHAT_LIST_ITEM_CONTEXT_MENU, item.id);
3152
+ await showContextMenu2(uid, -1, eventX, eventY, {
3153
+ menuId: -1,
3154
+ sessionId: item.id
3155
+ });
3156
+ return state;
3157
+ };
3158
+
3159
+ const handleChatWelcomeContextMenu = async state => {
3090
3160
  return state;
3091
3161
  };
3092
3162
 
@@ -3117,7 +3187,7 @@ const createSession = async (state, projectIdOverride = '') => {
3117
3187
 
3118
3188
  const openFolder = async () => {
3119
3189
  try {
3120
- return await invoke$1('FilePicker.showDirectoryPicker');
3190
+ return await invoke$2('FilePicker.showDirectoryPicker');
3121
3191
  } catch {
3122
3192
  return '';
3123
3193
  }
@@ -3221,7 +3291,7 @@ const get = async key => {
3221
3291
  return getPreference(key);
3222
3292
  };
3223
3293
  const update = async settings => {
3224
- await invoke$1('Preferences.update', settings);
3294
+ await invoke$2('Preferences.update', settings);
3225
3295
  };
3226
3296
 
3227
3297
  const trailingSlashesRegex$3 = /\/+$/;
@@ -3249,12 +3319,12 @@ const handleClickLogin = async state => {
3249
3319
  };
3250
3320
  if (state.uid) {
3251
3321
  set$1(state.uid, state, signingInState);
3252
- await invoke$1('Chat.rerender');
3322
+ await invoke$2('Chat.rerender');
3253
3323
  }
3254
3324
  let usedMockResponse = false;
3255
3325
  try {
3256
3326
  usedMockResponse = hasPendingMockLoginResponse();
3257
- const response = usedMockResponse ? await consumeNextLoginResponse() : await invoke$1('Auth.login', state.backendUrl);
3327
+ const response = usedMockResponse ? await consumeNextLoginResponse() : await invoke$2('Auth.login', state.backendUrl);
3258
3328
  if (!isLoginResponse(response)) {
3259
3329
  return {
3260
3330
  ...signingInState,
@@ -3288,7 +3358,7 @@ const handleClickLogin = async state => {
3288
3358
  } catch (error) {
3289
3359
  const errorMessage = error instanceof Error && error.message ? error.message : 'Backend authentication failed.';
3290
3360
  if (!usedMockResponse) {
3291
- await invoke$1('Main.openUri', `${trimTrailingSlashes(state.backendUrl)}/auth/login`);
3361
+ await invoke$2('Main.openUri', `${trimTrailingSlashes(state.backendUrl)}/auth/login`);
3292
3362
  }
3293
3363
  return {
3294
3364
  ...signingInState,
@@ -3300,7 +3370,7 @@ const handleClickLogin = async state => {
3300
3370
 
3301
3371
  const handleClickLogout = async state => {
3302
3372
  try {
3303
- await invoke$1('Auth.logout', state.backendUrl);
3373
+ await invoke$2('Auth.logout', state.backendUrl);
3304
3374
  } catch {
3305
3375
  // Ignore logout bridge errors and still clear local auth state.
3306
3376
  }
@@ -3321,7 +3391,7 @@ const handleClickLogout = async state => {
3321
3391
  };
3322
3392
 
3323
3393
  const handleClickOpenApiApiKeySettings = async state => {
3324
- await invoke$1('Main.openUri', 'app://settings.json');
3394
+ await invoke$2('Main.openUri', 'app://settings.json');
3325
3395
  return state;
3326
3396
  };
3327
3397
 
@@ -3331,7 +3401,7 @@ const handleClickOpenApiApiKeyWebsite = async state => {
3331
3401
  };
3332
3402
 
3333
3403
  const handleClickOpenRouterApiKeySettings = async state => {
3334
- await invoke$1('Main.openUri', 'app://settings.json');
3404
+ await invoke$2('Main.openUri', 'app://settings.json');
3335
3405
  return state;
3336
3406
  };
3337
3407
 
@@ -3368,10 +3438,10 @@ const getAiResponse$1 = async options => {
3368
3438
  };
3369
3439
 
3370
3440
  const execute = async (name, rawArguments, options) => {
3371
- return invoke$4('ChatTool.execute', name, rawArguments, options);
3441
+ return invoke$5('ChatTool.execute', name, rawArguments, options);
3372
3442
  };
3373
3443
  const getTools = async () => {
3374
- return invoke$4('ChatTool.getTools');
3444
+ return invoke$5('ChatTool.getTools');
3375
3445
  };
3376
3446
 
3377
3447
  const stringifyToolOutput = output => {
@@ -3871,7 +3941,7 @@ const executeProvider = async ({
3871
3941
  }) => {
3872
3942
  await activateByEvent(event, assetDir, platform);
3873
3943
  // @ts-ignore
3874
- const result = invoke$3(method, ...params);
3944
+ const result = invoke$4(method, ...params);
3875
3945
  return result;
3876
3946
  };
3877
3947
 
@@ -4003,10 +4073,10 @@ const getOpenApiApiEndpoint = openApiApiBaseUrl => {
4003
4073
  };
4004
4074
 
4005
4075
  const makeApiRequest = async options => {
4006
- return invoke$5('ChatNetwork.makeApiRequest', options);
4076
+ return invoke$6('ChatNetwork.makeApiRequest', options);
4007
4077
  };
4008
4078
  const makeStreamingApiRequest = async options => {
4009
- return invoke$5('ChatNetwork.makeStreamingApiRequest', options);
4079
+ return invoke$6('ChatNetwork.makeStreamingApiRequest', options);
4010
4080
  };
4011
4081
 
4012
4082
  const getTextContent = content => {
@@ -5858,7 +5928,7 @@ const handleClickSaveOpenRouterApiKey = async state => {
5858
5928
  };
5859
5929
  set$1(state.uid, state, optimisticState);
5860
5930
  // @ts-ignore
5861
- await invoke$1('Chat.rerender');
5931
+ await invoke$2('Chat.rerender');
5862
5932
  const persistedState = await setOpenRouterApiKey(optimisticState, openRouterApiKey);
5863
5933
  const updatedState = {
5864
5934
  ...persistedState,
@@ -7226,7 +7296,7 @@ const getSelectedSession = (sessions, selectedSessionId) => {
7226
7296
  const setAndRerenderHandleTextChunkState = async (uid, previousState, nextState) => {
7227
7297
  set$1(uid, previousState, nextState);
7228
7298
  // @ts-ignore
7229
- await invoke$1('Chat.rerender');
7299
+ await invoke$2('Chat.rerender');
7230
7300
  };
7231
7301
 
7232
7302
  const getToolCallMergeKey = toolCall => {
@@ -7366,7 +7436,7 @@ const handleTextChunkFunction = async (uid, assistantMessageId, chunk, handleTex
7366
7436
  };
7367
7437
  set$1(uid, handleTextChunkState.previousState, nextState);
7368
7438
  // @ts-ignore
7369
- await invoke$1('Chat.rerender');
7439
+ await invoke$2('Chat.rerender');
7370
7440
  return {
7371
7441
  latestState: nextState,
7372
7442
  previousState: nextState
@@ -7568,7 +7638,7 @@ const handleSubmit = async state => {
7568
7638
  }
7569
7639
  set$1(state.uid, state, optimisticState);
7570
7640
  // @ts-ignore
7571
- await invoke$1('Chat.rerender');
7641
+ await invoke$2('Chat.rerender');
7572
7642
  let handleTextChunkState = {
7573
7643
  latestState: optimisticState,
7574
7644
  previousState: optimisticState
@@ -7961,7 +8031,7 @@ const handleClickBack = async state => {
7961
8031
 
7962
8032
  const handleClickClose = async () => {
7963
8033
  // @ts-ignore
7964
- await invoke$1('Layout.hideSecondarySideBar');
8034
+ await invoke$2('Layout.hideSecondarySideBar');
7965
8035
  };
7966
8036
 
7967
8037
  const handleClickDelete = async (state, sessionId = '') => {
@@ -7983,7 +8053,7 @@ const handleClickFileName = async uri => {
7983
8053
  return;
7984
8054
  }
7985
8055
  const normalizedUri = normalizeFileReferenceUri(uri);
7986
- await invoke$1('Main.openUri', normalizedUri);
8056
+ await invoke$2('Main.openUri', normalizedUri);
7987
8057
  };
7988
8058
 
7989
8059
  const handleClickNew = async state => {
@@ -7993,12 +8063,12 @@ const handleClickNew = async state => {
7993
8063
  };
7994
8064
 
7995
8065
  const handleClickSessionDebug = async state => {
7996
- await invoke$1('Main.openUri', `chat-debug://${state.selectedSessionId}`);
8066
+ await invoke$2('Main.openUri', `chat-debug://${state.selectedSessionId}`);
7997
8067
  return state;
7998
8068
  };
7999
8069
 
8000
8070
  const handleClickSettings = async () => {
8001
- await invoke$1('Main.openUri', 'app://settings.json');
8071
+ await invoke$2('Main.openUri', 'app://settings.json');
8002
8072
  };
8003
8073
 
8004
8074
  const handleDragEnter = async (state, name, hasFiles = true) => {
@@ -8553,6 +8623,15 @@ const loadBackendUrl = async () => {
8553
8623
  }
8554
8624
  };
8555
8625
 
8626
+ const loadChatStorageWorkerEnabled = async () => {
8627
+ try {
8628
+ const savedChatStorageWorkerEnabled = await get('chatView.chatStorageWorkerEnabled');
8629
+ return typeof savedChatStorageWorkerEnabled === 'boolean' ? savedChatStorageWorkerEnabled : false;
8630
+ } catch {
8631
+ return false;
8632
+ }
8633
+ };
8634
+
8556
8635
  const loadComposerDropEnabled = async () => {
8557
8636
  try {
8558
8637
  const savedComposerDropEnabled = await get('chatView.composerDropEnabled');
@@ -8679,13 +8758,14 @@ const loadVoiceDictationEnabled = async () => {
8679
8758
  };
8680
8759
 
8681
8760
  const loadPreferences = async () => {
8682
- 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()]);
8761
+ 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()]);
8683
8762
  return {
8684
8763
  aiSessionTitleGenerationEnabled,
8685
8764
  authAccessToken,
8686
8765
  authEnabled,
8687
8766
  authRefreshToken,
8688
8767
  backendUrl,
8768
+ chatStorageWorkerEnabled,
8689
8769
  composerDropEnabled,
8690
8770
  emitStreamingFunctionCallEvents,
8691
8771
  openApiApiKey,
@@ -8743,6 +8823,7 @@ const loadContent = async (state, savedState) => {
8743
8823
  authEnabled,
8744
8824
  authRefreshToken,
8745
8825
  backendUrl,
8826
+ chatStorageWorkerEnabled,
8746
8827
  composerDropEnabled,
8747
8828
  emitStreamingFunctionCallEvents,
8748
8829
  openApiApiKey,
@@ -8757,6 +8838,7 @@ const loadContent = async (state, savedState) => {
8757
8838
  useChatToolWorker,
8758
8839
  voiceDictationEnabled
8759
8840
  } = await loadPreferences();
8841
+ setChatStorageWorkerEnabled$1(chatStorageWorkerEnabled);
8760
8842
  const legacySavedSessions = getSavedSessions(savedState);
8761
8843
  const storedSessions = await listChatSessions();
8762
8844
  let sessions = storedSessions;
@@ -8812,6 +8894,7 @@ const loadContent = async (state, savedState) => {
8812
8894
  authStatus: authAccessToken ? 'signed-in' : 'signed-out',
8813
8895
  backendUrl,
8814
8896
  chatListScrollTop,
8897
+ chatStorageWorkerEnabled,
8815
8898
  composerDropActive: false,
8816
8899
  composerDropEnabled,
8817
8900
  composerValue: savedComposerValue ?? state.composerValue,
@@ -8956,6 +9039,7 @@ const registerMockResponse = (state, mockResponse) => {
8956
9039
  return state;
8957
9040
  };
8958
9041
 
9042
+ /* eslint-disable @cspell/spellchecker */
8959
9043
  const getCss = (composerHeight, listItemHeight, chatMessageFontSize, chatMessageLineHeight, chatMessageFontFamily, textAreaPaddingTop, textAreaPaddingLeft, textAreaPaddingRight, textAreaPaddingBottom, chatSendAreaPaddingTop, chatSendAreaPaddingLeft, chatSendAreaPaddingRight, chatSendAreaPaddingBottom, renderHtmlCss) => {
8960
9044
  const buttonsHeight = 20;
8961
9045
  const gap = 10;
@@ -8982,6 +9066,46 @@ const getCss = (composerHeight, listItemHeight, chatMessageFontSize, chatMessage
8982
9066
  .ChatSendAreaBottom{
8983
9067
  height: ${buttonsHeight}px;
8984
9068
  }
9069
+
9070
+ .ChatSendArea:focus-within{
9071
+ border-color: darkcyan;
9072
+ }
9073
+
9074
+ .ChatListItem{
9075
+ display:flex;
9076
+ align-items:center;
9077
+ }
9078
+
9079
+ .ChatListItemStatusRow{
9080
+ width: 16px;
9081
+ min-width: 16px;
9082
+ display:flex;
9083
+ align-items:center;
9084
+ justify-content:center;
9085
+ }
9086
+
9087
+ .ChatListItemStatusIcon{
9088
+ font-size: 10px;
9089
+ }
9090
+
9091
+ .ChatListItemStatusStopped{
9092
+ color: var(--vscode-disabledForeground);
9093
+ }
9094
+
9095
+ .ChatListItemStatusInProgress{
9096
+ color: var(--vscode-charts-blue);
9097
+ }
9098
+
9099
+ .ChatListItemStatusFinished{
9100
+ color: var(--vscode-testing-iconPassed);
9101
+ .ChatListItem .SessionArchiveButton{
9102
+ opacity: 0;
9103
+ }
9104
+
9105
+ .ChatListItem:hover .SessionArchiveButton,
9106
+ .ChatListItem:focus-within .SessionArchiveButton{
9107
+ opacity: 1;
9108
+ }
8985
9109
  `;
8986
9110
  return `${baseCss}
8987
9111
 
@@ -9081,7 +9205,13 @@ const LabelDetail = 'LabelDetail';
9081
9205
  const ChatList = 'ChatList';
9082
9206
  const ChatListEmpty = 'ChatListEmpty';
9083
9207
  const ChatListItem = 'ChatListItem';
9208
+ const ChatListItemStatusRow = 'ChatListItemStatusRow';
9209
+ const ChatListItemStatusIcon = 'ChatListItemStatusIcon';
9210
+ const ChatListItemStatusStopped = 'ChatListItemStatusStopped';
9211
+ const ChatListItemStatusInProgress = 'ChatListItemStatusInProgress';
9212
+ const ChatListItemStatusFinished = 'ChatListItemStatusFinished';
9084
9213
  const ChatListItemLabel = 'ChatListItemLabel';
9214
+ const SessionArchiveButton = 'SessionArchiveButton';
9085
9215
  const ProjectAddButton = 'ProjectAddButton';
9086
9216
  const ProjectList = 'ProjectList';
9087
9217
  const ProjectListChevron = 'ProjectListChevron';
@@ -9169,6 +9299,9 @@ const HandleClickDictationButton = 34;
9169
9299
  const HandleMissingApiKeySubmit = 35;
9170
9300
  const HandleRunModeChange = 36;
9171
9301
  const HandleSearchInput = 37;
9302
+ const HandleChatWelcomeContextMenu = 39;
9303
+ const HandleChatHeaderContextMenu = 40;
9304
+ const HandleChatInputContextMenu = 41;
9172
9305
 
9173
9306
  const getModelLabel = model => {
9174
9307
  if (model.provider === 'openRouter') {
@@ -9408,6 +9541,7 @@ const getChatSendAreaDom = (composerValue, modelPickerOpen, modelPickerSearchVal
9408
9541
  childCount: 0,
9409
9542
  className: MultilineInputBox,
9410
9543
  name: Composer,
9544
+ onContextMenu: HandleChatInputContextMenu,
9411
9545
  onFocus: HandleFocus,
9412
9546
  onInput: HandleInput,
9413
9547
  placeholder: composePlaceholder(),
@@ -10701,6 +10835,7 @@ const getEmptyMessagesDom = () => {
10701
10835
  return [{
10702
10836
  childCount: 1,
10703
10837
  className: ChatWelcomeMessage,
10838
+ onContextMenu: HandleChatWelcomeContextMenu,
10704
10839
  type: Div
10705
10840
  }, text(startConversation())];
10706
10841
  };
@@ -10998,6 +11133,7 @@ const getChatHeaderDomDetailMode = (selectedSessionTitle, authEnabled = false, a
10998
11133
  return [{
10999
11134
  childCount: hasAuthError ? 3 : 2,
11000
11135
  className: ChatHeader,
11136
+ onContextMenu: HandleChatHeaderContextMenu,
11001
11137
  type: Div
11002
11138
  }, {
11003
11139
  childCount: 2,
@@ -11079,6 +11215,7 @@ const getChatHeaderListModeDom = (authEnabled = false, authStatus = 'signed-out'
11079
11215
  return [{
11080
11216
  childCount: headerChildCount,
11081
11217
  className: ChatHeader,
11218
+ onContextMenu: HandleChatHeaderContextMenu,
11082
11219
  type: Div
11083
11220
  }, {
11084
11221
  childCount: 1,
@@ -11116,18 +11253,37 @@ const getEmptyChatSessionsDom = () => {
11116
11253
  }, text(clickToOpenNewChat())];
11117
11254
  };
11118
11255
 
11256
+ const getSessionStatusClassName = session => {
11257
+ const hasInProgressAssistantMessage = session.messages.some(message => message.role === 'assistant' && message.inProgress);
11258
+ if (hasInProgressAssistantMessage) {
11259
+ return ChatListItemStatusInProgress;
11260
+ }
11261
+ const hasAssistantMessage = session.messages.some(message => message.role === 'assistant');
11262
+ if (hasAssistantMessage) {
11263
+ return ChatListItemStatusFinished;
11264
+ }
11265
+ return ChatListItemStatusStopped;
11266
+ };
11119
11267
  const getSessionDom = session => {
11120
11268
  const sessionClassName = ChatListItem;
11269
+ const sessionStatusClassName = getSessionStatusClassName(session);
11121
11270
  return [{
11122
- childCount: 2,
11271
+ childCount: 3,
11123
11272
  className: sessionClassName,
11124
11273
  type: Li
11274
+ }, {
11275
+ childCount: 1,
11276
+ className: ChatListItemStatusRow,
11277
+ type: Div
11278
+ }, {
11279
+ childCount: 0,
11280
+ className: `${ChatListItemStatusIcon} codicon codicon-circle-filled ${sessionStatusClassName}`,
11281
+ type: Div
11125
11282
  }, {
11126
11283
  childCount: 1,
11127
11284
  className: ChatListItemLabel,
11128
11285
  name: getSessionInputName(session.id),
11129
11286
  onContextMenu: HandleListContextMenu,
11130
- tabIndex: 0,
11131
11287
  type: Div
11132
11288
  }, text(session.title), {
11133
11289
  childCount: 1,
@@ -11135,14 +11291,18 @@ const getSessionDom = session => {
11135
11291
  type: Div
11136
11292
  }, {
11137
11293
  childCount: 1,
11138
- className: IconButton,
11294
+ className: mergeClassNames(IconButton, SessionArchiveButton),
11139
11295
  'data-id': session.id,
11140
11296
  name: SessionDelete,
11141
11297
  onClick: HandleClickDelete,
11142
11298
  tabIndex: 0,
11143
11299
  title: deleteChatSession$1(),
11144
11300
  type: Button$1
11145
- }, text('🗑')];
11301
+ }, {
11302
+ childCount: 0,
11303
+ className: 'MaskIcon MaskIconTrash',
11304
+ type: Div
11305
+ }];
11146
11306
  };
11147
11307
 
11148
11308
  const getChatListDom = (sessions, selectedSessionId, chatListScrollTop = 0) => {
@@ -11770,9 +11930,20 @@ const renderEventListeners = () => {
11770
11930
  name: HandleMessagesContextMenu,
11771
11931
  params: ['handleMessagesContextMenu'],
11772
11932
  preventDefault: true
11933
+ }, {
11934
+ name: HandleChatWelcomeContextMenu,
11935
+ params: ['handleChatWelcomeContextMenu']
11936
+ }, {
11937
+ name: HandleChatHeaderContextMenu,
11938
+ params: ['handleChatHeaderContextMenu'],
11939
+ preventDefault: true
11773
11940
  }, {
11774
11941
  name: HandleFocus,
11775
11942
  params: ['handleInputFocus', TargetName]
11943
+ }, {
11944
+ name: HandleChatInputContextMenu,
11945
+ params: ['handleChatInputContextMenu'],
11946
+ preventDefault: true
11776
11947
  }, {
11777
11948
  name: HandleKeyDown,
11778
11949
  params: ['handleKeyDown', Key, ShiftKey]
@@ -11901,6 +12072,19 @@ const setChatList = state => {
11901
12072
  };
11902
12073
  };
11903
12074
 
12075
+ const setChatStorageWorkerEnabled = async (state, chatStorageWorkerEnabled, persist = true) => {
12076
+ if (persist) {
12077
+ await update({
12078
+ 'chatView.chatStorageWorkerEnabled': chatStorageWorkerEnabled
12079
+ });
12080
+ }
12081
+ setChatStorageWorkerEnabled$1(chatStorageWorkerEnabled);
12082
+ return {
12083
+ ...state,
12084
+ chatStorageWorkerEnabled
12085
+ };
12086
+ };
12087
+
11904
12088
  const setEmitStreamingFunctionCallEvents = (state, emitStreamingFunctionCallEvents) => {
11905
12089
  return {
11906
12090
  ...state,
@@ -12018,8 +12202,11 @@ const commandMap = {
12018
12202
  'Chat.getMenuEntryIds': getMenuEntryIds,
12019
12203
  'Chat.getQuickPickMenuEntries': getQuickPickMenuEntries,
12020
12204
  'Chat.getSelectedSessionId': wrapGetter(getSelectedSessionId),
12205
+ 'Chat.handleChatHeaderContextMenu': wrapCommand(handleChatHeaderContextMenu),
12206
+ 'Chat.handleChatInputContextMenu': wrapCommand(handleChatInputContextMenu),
12021
12207
  'Chat.handleChatListContextMenu': handleChatListContextMenu,
12022
12208
  'Chat.handleChatListScroll': wrapCommand(handleChatListScroll),
12209
+ 'Chat.handleChatWelcomeContextMenu': wrapCommand(handleChatWelcomeContextMenu),
12023
12210
  'Chat.handleClick': wrapCommand(handleClick),
12024
12211
  'Chat.handleClickBack': wrapCommand(handleClickBack),
12025
12212
  'Chat.handleClickClose': handleClickClose,
@@ -12070,6 +12257,7 @@ const commandMap = {
12070
12257
  'Chat.setAuthEnabled': wrapCommand(setAuthEnabled),
12071
12258
  'Chat.setBackendUrl': wrapCommand(setBackendUrl),
12072
12259
  'Chat.setChatList': wrapCommand(setChatList),
12260
+ 'Chat.setChatStorageWorkerEnabled': wrapCommand(setChatStorageWorkerEnabled),
12073
12261
  'Chat.setEmitStreamingFunctionCallEvents': wrapCommand(setEmitStreamingFunctionCallEvents),
12074
12262
  'Chat.setNewChatModelPickerEnabled': wrapCommand(setNewChatModelPickerEnabled),
12075
12263
  'Chat.setOpenRouterApiKey': wrapCommand(setOpenRouterApiKey),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/chat-view",
3
- "version": "6.17.0",
3
+ "version": "6.19.0",
4
4
  "description": "Chat View Worker",
5
5
  "repository": {
6
6
  "type": "git",