@lvce-editor/chat-debug-view 7.3.0 → 7.4.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.
@@ -1139,6 +1139,10 @@ const ClientY = 'event.clientY';
1139
1139
  const TargetName = 'event.target.name';
1140
1140
  const TargetValue = 'event.target.value';
1141
1141
 
1142
+ const None = 0;
1143
+ const Checked = 2;
1144
+ const Unchecked = 3;
1145
+
1142
1146
  const ChatStorageWorker = 6003;
1143
1147
  const RendererWorker = 1;
1144
1148
 
@@ -1305,6 +1309,186 @@ const appendStoredEventForTest = async (state, event) => {
1305
1309
  return state;
1306
1310
  };
1307
1311
 
1312
+ const emptyObject = {};
1313
+ const RE_PLACEHOLDER = /\{(PH\d+)\}/g;
1314
+ const i18nString = (key, placeholders = emptyObject) => {
1315
+ if (placeholders === emptyObject) {
1316
+ return key;
1317
+ }
1318
+ const replacer = (match, rest) => {
1319
+ return placeholders[rest];
1320
+ };
1321
+ return key.replaceAll(RE_PLACEHOLDER, replacer);
1322
+ };
1323
+
1324
+ const All$1 = 'All';
1325
+ const CloseDetails$1 = 'Close details';
1326
+ const Copy = 'Copy';
1327
+ const DetailSections = 'Detail sections';
1328
+ const Duration$1 = 'Duration';
1329
+ const Ended = 'Ended';
1330
+ const FailedToLoadChatDebugSession = 'Failed to load chat debug session "{PH1}". Please try again.';
1331
+ const FailedToLoadChatDebugSessionWithError = 'Failed to load chat debug session "{PH1}": {PH2}';
1332
+ const FilterEvents = 'Filter events';
1333
+ const FromSeconds = 'from {PH1}s';
1334
+ const InvalidSessionId = 'Invalid session id';
1335
+ const InvalidUriEncoding = 'Invalid URI encoding';
1336
+ const InvalidUriFormat = 'Invalid URI format';
1337
+ const MissingUri = 'Missing URI';
1338
+ const Network$1 = 'Network';
1339
+ const NoChatSessionFound = 'No chat session found for sessionId "{PH1}".';
1340
+ const NoEventsFound = 'No events have been found';
1341
+ const NoEventsFoundMatching = 'No events found matching {PH1}';
1342
+ const NoToolCallEvents = 'No tool call events.';
1343
+ const Preview$1 = 'Preview';
1344
+ const Refresh$1 = 'Refresh';
1345
+ const RefreshEvents = 'Refresh events';
1346
+ const ResetColumns = 'Reset columns';
1347
+ const Response$1 = 'Response';
1348
+ const SecondsRange = '{PH1}s-{PH2}s';
1349
+ const Started = 'Started';
1350
+ const Status$1 = 'Status';
1351
+ const Stream$1 = 'Stream';
1352
+ const Timing$1 = 'Timing';
1353
+ const ToSeconds = 'to {PH1}s';
1354
+ const Tools$1 = 'Tools';
1355
+ const Type$1 = 'Type';
1356
+ const Ui$1 = 'UI';
1357
+ const UnableToLoadDebugSessionInvalidUri = 'Unable to load debug session: invalid URI "{PH1}". Expected format: chat-debug://<sessionId>.';
1358
+ const UnableToLoadDebugSessionMissingUri = 'Unable to load debug session: missing URI. Expected format: chat-debug://<sessionId>.';
1359
+ const WindowSummary = 'Window {PH1}-{PH2} of {PH3}';
1360
+
1361
+ const copy = () => {
1362
+ return i18nString(Copy);
1363
+ };
1364
+ const status = () => {
1365
+ return i18nString(Status$1);
1366
+ };
1367
+ const all = () => {
1368
+ return i18nString(All$1);
1369
+ };
1370
+ const closeDetails = () => {
1371
+ return i18nString(CloseDetails$1);
1372
+ };
1373
+ const detailSections = () => {
1374
+ return i18nString(DetailSections);
1375
+ };
1376
+ const duration = () => {
1377
+ return i18nString(Duration$1);
1378
+ };
1379
+ const ended = () => {
1380
+ return i18nString(Ended);
1381
+ };
1382
+ const failedToLoadChatDebugSession = sessionId => {
1383
+ return i18nString(FailedToLoadChatDebugSession, {
1384
+ PH1: sessionId
1385
+ });
1386
+ };
1387
+ const failedToLoadChatDebugSessionWithError = (sessionId, errorMessage) => {
1388
+ return i18nString(FailedToLoadChatDebugSessionWithError, {
1389
+ PH1: sessionId,
1390
+ PH2: errorMessage
1391
+ });
1392
+ };
1393
+ const filterEvents = () => {
1394
+ return i18nString(FilterEvents);
1395
+ };
1396
+ const fromSeconds = seconds => {
1397
+ return i18nString(FromSeconds, {
1398
+ PH1: seconds
1399
+ });
1400
+ };
1401
+ const invalidSessionId = () => {
1402
+ return i18nString(InvalidSessionId);
1403
+ };
1404
+ const invalidUriEncoding = () => {
1405
+ return i18nString(InvalidUriEncoding);
1406
+ };
1407
+ const invalidUriFormat = () => {
1408
+ return i18nString(InvalidUriFormat);
1409
+ };
1410
+ const missingUri = () => {
1411
+ return i18nString(MissingUri);
1412
+ };
1413
+ const network = () => {
1414
+ return i18nString(Network$1);
1415
+ };
1416
+ const noChatSessionFound = sessionId => {
1417
+ return i18nString(NoChatSessionFound, {
1418
+ PH1: sessionId
1419
+ });
1420
+ };
1421
+ const noEventsFound = () => {
1422
+ return i18nString(NoEventsFound);
1423
+ };
1424
+ const noEventsFoundMatching = filterDescription => {
1425
+ return i18nString(NoEventsFoundMatching, {
1426
+ PH1: filterDescription
1427
+ });
1428
+ };
1429
+ const noToolCallEvents = () => {
1430
+ return i18nString(NoToolCallEvents);
1431
+ };
1432
+ const preview = () => {
1433
+ return i18nString(Preview$1);
1434
+ };
1435
+ const refresh$1 = () => {
1436
+ return i18nString(Refresh$1);
1437
+ };
1438
+ const refreshEvents$1 = () => {
1439
+ return i18nString(RefreshEvents);
1440
+ };
1441
+ const resetColumns = () => {
1442
+ return i18nString(ResetColumns);
1443
+ };
1444
+ const response = () => {
1445
+ return i18nString(Response$1);
1446
+ };
1447
+ const secondsRange = (start, end) => {
1448
+ return i18nString(SecondsRange, {
1449
+ PH1: start,
1450
+ PH2: end
1451
+ });
1452
+ };
1453
+ const started = () => {
1454
+ return i18nString(Started);
1455
+ };
1456
+ const stream = () => {
1457
+ return i18nString(Stream$1);
1458
+ };
1459
+ const timing = () => {
1460
+ return i18nString(Timing$1);
1461
+ };
1462
+ const toSeconds = seconds => {
1463
+ return i18nString(ToSeconds, {
1464
+ PH1: seconds
1465
+ });
1466
+ };
1467
+ const tools = () => {
1468
+ return i18nString(Tools$1);
1469
+ };
1470
+ const type = () => {
1471
+ return i18nString(Type$1);
1472
+ };
1473
+ const ui = () => {
1474
+ return i18nString(Ui$1);
1475
+ };
1476
+ const unableToLoadDebugSessionInvalidUri = uri => {
1477
+ return i18nString(UnableToLoadDebugSessionInvalidUri, {
1478
+ PH1: uri
1479
+ });
1480
+ };
1481
+ const unableToLoadDebugSessionMissingUri = () => {
1482
+ return i18nString(UnableToLoadDebugSessionMissingUri);
1483
+ };
1484
+ const windowSummary = (start, end, duration) => {
1485
+ return i18nString(WindowSummary, {
1486
+ PH1: start,
1487
+ PH2: end,
1488
+ PH3: duration
1489
+ });
1490
+ };
1491
+
1308
1492
  const Response = 'response';
1309
1493
  const Preview = 'preview';
1310
1494
  const Timing = 'timing';
@@ -1314,29 +1498,29 @@ const isDetailTab = value => {
1314
1498
  };
1315
1499
  const getDetailTabLabel = value => {
1316
1500
  if (value === Preview) {
1317
- return 'Preview';
1501
+ return preview();
1318
1502
  }
1319
1503
  if (value === Timing) {
1320
- return 'Timing';
1504
+ return timing();
1321
1505
  }
1322
- return 'Response';
1506
+ return response();
1323
1507
  };
1324
1508
 
1325
1509
  const createEventCategoryFilterOptions = () => {
1326
1510
  return [{
1327
- label: 'All',
1511
+ label: all(),
1328
1512
  value: All
1329
1513
  }, {
1330
- label: 'Tools',
1514
+ label: tools(),
1331
1515
  value: Tools
1332
1516
  }, {
1333
- label: 'Network',
1517
+ label: network(),
1334
1518
  value: Network
1335
1519
  }, {
1336
- label: 'UI',
1520
+ label: ui(),
1337
1521
  value: Ui
1338
1522
  }, {
1339
- label: 'Stream',
1523
+ label: stream(),
1340
1524
  value: Stream
1341
1525
  }];
1342
1526
  };
@@ -1344,15 +1528,15 @@ const createEventCategoryFilterOptions = () => {
1344
1528
  const getEventCategoryFilterLabel = eventCategoryFilter => {
1345
1529
  switch (eventCategoryFilter) {
1346
1530
  case Network:
1347
- return 'Network';
1531
+ return network();
1348
1532
  case Stream:
1349
- return 'Stream';
1533
+ return stream();
1350
1534
  case Tools:
1351
- return 'Tools';
1535
+ return tools();
1352
1536
  case Ui:
1353
- return 'UI';
1537
+ return ui();
1354
1538
  default:
1355
- return 'All';
1539
+ return all();
1356
1540
  }
1357
1541
  };
1358
1542
 
@@ -1381,6 +1565,22 @@ const parseFilterValue = filterValue => {
1381
1565
  };
1382
1566
  };
1383
1567
 
1568
+ const Type = 'type';
1569
+ const Duration = 'duration';
1570
+ const Status = 'status';
1571
+ const tableColumns = [Type, Duration, Status];
1572
+ const defaultVisibleTableColumns = tableColumns;
1573
+ const isTableColumn = value => {
1574
+ return tableColumns.includes(value);
1575
+ };
1576
+ const getOrderedVisibleTableColumns = values => {
1577
+ const visibleColumns = new Set(values.filter(isTableColumn));
1578
+ return tableColumns.filter(column => visibleColumns.has(column));
1579
+ };
1580
+ const isVisibleTableColumn = (visibleTableColumns, column) => {
1581
+ return visibleTableColumns.includes(column);
1582
+ };
1583
+
1384
1584
  const validEventCategoryFilters = new Set([All, Network, Stream, Tools, Ui]);
1385
1585
  const isSavedState = value => {
1386
1586
  return typeof value === 'object' && value !== null;
@@ -1398,6 +1598,7 @@ const restoreSavedState = (state, savedState) => {
1398
1598
  if (!isSavedState(savedState)) {
1399
1599
  return state;
1400
1600
  }
1601
+ const restoredVisibleTableColumns = Array.isArray(savedState.visibleTableColumns) ? getOrderedVisibleTableColumns(savedState.visibleTableColumns.filter(value => typeof value === 'string')) : state.visibleTableColumns;
1401
1602
  return {
1402
1603
  ...state,
1403
1604
  eventCategoryFilter: getRestoredEventCategoryFilter(savedState, state.eventCategoryFilter),
@@ -1405,7 +1606,8 @@ const restoreSavedState = (state, savedState) => {
1405
1606
  selectedDetailTab: typeof savedState.selectedDetailTab === 'string' && isDetailTab(savedState.selectedDetailTab) ? savedState.selectedDetailTab : state.selectedDetailTab,
1406
1607
  selectedEventId: typeof savedState.selectedEventId === 'number' || savedState.selectedEventId === null ? savedState.selectedEventId : state.selectedEventId,
1407
1608
  timelineEndSeconds: typeof savedState.timelineEndSeconds === 'string' ? savedState.timelineEndSeconds : state.timelineEndSeconds,
1408
- timelineStartSeconds: typeof savedState.timelineStartSeconds === 'string' ? savedState.timelineStartSeconds : state.timelineStartSeconds
1609
+ timelineStartSeconds: typeof savedState.timelineStartSeconds === 'string' ? savedState.timelineStartSeconds : state.timelineStartSeconds,
1610
+ visibleTableColumns: restoredVisibleTableColumns
1409
1611
  };
1410
1612
  };
1411
1613
 
@@ -1477,6 +1679,7 @@ const createDefaultState = () => {
1477
1679
  uid: 0,
1478
1680
  uri: '',
1479
1681
  useDevtoolsLayout: true,
1682
+ visibleTableColumns: defaultVisibleTableColumns,
1480
1683
  width: 0,
1481
1684
  x: 0,
1482
1685
  y: 0
@@ -1510,7 +1713,7 @@ const RenderCss = 2;
1510
1713
  const RenderIncremental = 3;
1511
1714
 
1512
1715
  const diff = (oldState, newState) => {
1513
- if (oldState.errorMessage !== newState.errorMessage || oldState.eventCategoryFilter !== newState.eventCategoryFilter || oldState.events !== newState.events || oldState.filterValue !== newState.filterValue || oldState.sessionId !== newState.sessionId || oldState.showEventStreamFinishedEvents !== newState.showEventStreamFinishedEvents || oldState.showInputEvents !== newState.showInputEvents || oldState.showResponsePartEvents !== newState.showResponsePartEvents || oldState.tableWidth !== newState.tableWidth || oldState.timelineEndSeconds !== newState.timelineEndSeconds || oldState.timelineSelectionActive !== newState.timelineSelectionActive || oldState.timelineSelectionAnchorSeconds !== newState.timelineSelectionAnchorSeconds || oldState.timelineSelectionFocusSeconds !== newState.timelineSelectionFocusSeconds || oldState.timelineStartSeconds !== newState.timelineStartSeconds || oldState.useDevtoolsLayout !== newState.useDevtoolsLayout || oldState.selectedDetailTab !== newState.selectedDetailTab || oldState.selectedEvent !== newState.selectedEvent || oldState.selectedEventIndex !== newState.selectedEventIndex || oldState.width !== newState.width || oldState.uid !== newState.uid) {
1716
+ if (oldState.errorMessage !== newState.errorMessage || oldState.eventCategoryFilter !== newState.eventCategoryFilter || oldState.events !== newState.events || oldState.filterValue !== newState.filterValue || oldState.sessionId !== newState.sessionId || oldState.showEventStreamFinishedEvents !== newState.showEventStreamFinishedEvents || oldState.showInputEvents !== newState.showInputEvents || oldState.showResponsePartEvents !== newState.showResponsePartEvents || oldState.tableWidth !== newState.tableWidth || oldState.timelineEndSeconds !== newState.timelineEndSeconds || oldState.timelineSelectionActive !== newState.timelineSelectionActive || oldState.timelineSelectionAnchorSeconds !== newState.timelineSelectionAnchorSeconds || oldState.timelineSelectionFocusSeconds !== newState.timelineSelectionFocusSeconds || oldState.timelineStartSeconds !== newState.timelineStartSeconds || oldState.useDevtoolsLayout !== newState.useDevtoolsLayout || oldState.visibleTableColumns !== newState.visibleTableColumns || oldState.selectedDetailTab !== newState.selectedDetailTab || oldState.selectedEvent !== newState.selectedEvent || oldState.selectedEventIndex !== newState.selectedEventIndex || oldState.width !== newState.width || oldState.uid !== newState.uid) {
1514
1717
  return [RenderIncremental, RenderCss];
1515
1718
  }
1516
1719
  return [];
@@ -1524,6 +1727,14 @@ const diff2 = uid => {
1524
1727
  return diff(oldState, newState);
1525
1728
  };
1526
1729
 
1730
+ const MenuChatDebugTableHeader = 2189;
1731
+ const handleHeaderContextMenu = async (state, eventX, eventY) => {
1732
+ await showContextMenu2(state.uid, MenuChatDebugTableHeader, eventX, eventY, {
1733
+ menuId: MenuChatDebugTableHeader
1734
+ });
1735
+ return state;
1736
+ };
1737
+
1527
1738
  const hasMatchingToolName = (startedEvent, finishedEvent) => {
1528
1739
  if (typeof startedEvent.toolName === 'string' && typeof finishedEvent.toolName === 'string') {
1529
1740
  return startedEvent.toolName === finishedEvent.toolName;
@@ -1891,8 +2102,51 @@ const handleTableBodyContextMenu = async (state, eventX, eventY) => {
1891
2102
  return state;
1892
2103
  };
1893
2104
 
2105
+ const getColumnVisibilityFlags = (state, column) => {
2106
+ return isVisibleTableColumn(state.visibleTableColumns, column) ? Checked : Unchecked;
2107
+ };
2108
+ const getMenuEntries2 = (state, props) => {
2109
+ if (props.menuId === MenuChatDebugTableHeader) {
2110
+ return [{
2111
+ args: [Type],
2112
+ command: 'ChatDebug.toggleTableColumnVisibility',
2113
+ flags: getColumnVisibilityFlags(state, Type),
2114
+ id: 'type',
2115
+ label: type()
2116
+ }, {
2117
+ args: [Duration],
2118
+ command: 'ChatDebug.toggleTableColumnVisibility',
2119
+ flags: getColumnVisibilityFlags(state, Duration),
2120
+ id: 'duration',
2121
+ label: duration()
2122
+ }, {
2123
+ args: [Status],
2124
+ command: 'ChatDebug.toggleTableColumnVisibility',
2125
+ flags: getColumnVisibilityFlags(state, Status),
2126
+ id: 'status',
2127
+ label: status()
2128
+ }, {
2129
+ args: [],
2130
+ command: 'ChatDebug.resetTableColumns',
2131
+ flags: None,
2132
+ id: 'reset-columns',
2133
+ label: resetColumns()
2134
+ }];
2135
+ }
2136
+ if (props.menuId === MenuChatDebugTableBody) {
2137
+ return [{
2138
+ args: [],
2139
+ command: 'ChatDebug.copy',
2140
+ flags: None,
2141
+ id: 'copy',
2142
+ label: copy()
2143
+ }];
2144
+ }
2145
+ return [];
2146
+ };
2147
+
1894
2148
  const getMenuIds = () => {
1895
- return [MenuChatDebugTableBody, 556, 557];
2149
+ return [MenuChatDebugTableHeader, MenuChatDebugTableBody, 556, 557];
1896
2150
  };
1897
2151
 
1898
2152
  const getErrorMessage = error => {
@@ -1910,9 +2164,9 @@ const getErrorMessage = error => {
1910
2164
  const getFailedToLoadMessage = (sessionId, error) => {
1911
2165
  const errorMessage = getErrorMessage(error);
1912
2166
  if (errorMessage) {
1913
- return `Failed to load chat debug session "${sessionId}": ${errorMessage}`;
2167
+ return failedToLoadChatDebugSessionWithError(sessionId, errorMessage);
1914
2168
  }
1915
- return `Failed to load chat debug session "${sessionId}". Please try again.`;
2169
+ return failedToLoadChatDebugSession(sessionId);
1916
2170
  };
1917
2171
 
1918
2172
  const ParseChatDebugUriErrorCode = {
@@ -1924,13 +2178,13 @@ const ParseChatDebugUriErrorCode = {
1924
2178
 
1925
2179
  const getInvalidUriMessage = (uri, code) => {
1926
2180
  if (code === ParseChatDebugUriErrorCode.MissingUri) {
1927
- return 'Unable to load debug session: missing URI. Expected format: chat-debug://<sessionId>.';
2181
+ return unableToLoadDebugSessionMissingUri();
1928
2182
  }
1929
- return `Unable to load debug session: invalid URI "${uri}". Expected format: chat-debug://<sessionId>.`;
2183
+ return unableToLoadDebugSessionInvalidUri(uri);
1930
2184
  };
1931
2185
 
1932
2186
  const getSessionNotFoundMessage = sessionId => {
1933
- return `No chat session found for sessionId "${sessionId}".`;
2187
+ return noChatSessionFound(sessionId);
1934
2188
  };
1935
2189
 
1936
2190
  const listChatViewEventsDependencies = {
@@ -1960,7 +2214,7 @@ const parseChatDebugUri = uri => {
1960
2214
  if (!uri) {
1961
2215
  return {
1962
2216
  code: ParseChatDebugUriErrorCode.MissingUri,
1963
- message: 'Missing URI',
2217
+ message: missingUri(),
1964
2218
  type: 'error'
1965
2219
  };
1966
2220
  }
@@ -1968,7 +2222,7 @@ const parseChatDebugUri = uri => {
1968
2222
  if (!match) {
1969
2223
  return {
1970
2224
  code: ParseChatDebugUriErrorCode.InvalidUriFormat,
1971
- message: 'Invalid URI format',
2225
+ message: invalidUriFormat(),
1972
2226
  type: 'error'
1973
2227
  };
1974
2228
  }
@@ -1979,14 +2233,14 @@ const parseChatDebugUri = uri => {
1979
2233
  } catch {
1980
2234
  return {
1981
2235
  code: ParseChatDebugUriErrorCode.InvalidUriEncoding,
1982
- message: 'Invalid URI encoding',
2236
+ message: invalidUriEncoding(),
1983
2237
  type: 'error'
1984
2238
  };
1985
2239
  }
1986
2240
  if (!sessionId || invalidSessionIdPattern.test(sessionId)) {
1987
2241
  return {
1988
2242
  code: ParseChatDebugUriErrorCode.InvalidSessionId,
1989
- message: 'Invalid session id',
2243
+ message: invalidSessionId(),
1990
2244
  type: 'error'
1991
2245
  };
1992
2246
  }
@@ -2145,6 +2399,10 @@ const handleDetailsContextMenu = state => {
2145
2399
  return state;
2146
2400
  };
2147
2401
 
2402
+ const handleDetailsTopContextMenu = state => {
2403
+ return state;
2404
+ };
2405
+
2148
2406
  const handleDetailTab = (state, value) => {
2149
2407
  if (!isDetailTab(value)) {
2150
2408
  return state;
@@ -2241,10 +2499,6 @@ const handleEventRowClick = async (state, value, button = 0) => {
2241
2499
  return selectEventAtIndex(state, selectedEventIndex, handleEventRowClickDependencies);
2242
2500
  };
2243
2501
 
2244
- const handleHeaderContextMenu = state => {
2245
- return state;
2246
- };
2247
-
2248
2502
  const getBoolean = value => {
2249
2503
  return value === true || value === 'true' || value === 'on' || value === '1';
2250
2504
  };
@@ -2448,6 +2702,10 @@ const handleSashPointerUp = (state, eventX, eventY) => {
2448
2702
  return state;
2449
2703
  };
2450
2704
 
2705
+ const handleTimelineContextMenu = state => {
2706
+ return state;
2707
+ };
2708
+
2451
2709
  const clearTimelineSelectionState = state => {
2452
2710
  return {
2453
2711
  ...state,
@@ -3105,17 +3363,19 @@ const HandleTableKeyDown = 18;
3105
3363
  const HandleTimelineRangePreset = 19;
3106
3364
  const HandleCloseDetails = 20;
3107
3365
  const HandleClickRefresh = 21;
3366
+ const HandleDetailsTopContextMenu = 22;
3367
+ const HandleTimelineContextMenu = 23;
3108
3368
 
3109
3369
  const getRefreshButtonDom = () => {
3110
3370
  return [{
3111
- 'aria-label': 'Refresh events',
3371
+ 'aria-label': refreshEvents$1(),
3112
3372
  childCount: 1,
3113
3373
  className: ChatDebugViewRefreshButton,
3114
3374
  name: Refresh,
3115
3375
  onClick: HandleClickRefresh,
3116
3376
  type: Button$1,
3117
3377
  value: Refresh
3118
- }, text('Refresh')];
3378
+ }, text(refresh$1())];
3119
3379
  };
3120
3380
  const getDebugViewTopDom = (filterValue, useDevtoolsLayout, quickFilterNodes) => {
3121
3381
  const refreshButtonDom = getRefreshButtonDom();
@@ -3132,7 +3392,7 @@ const getDebugViewTopDom = (filterValue, useDevtoolsLayout, quickFilterNodes) =>
3132
3392
  inputType: 'search',
3133
3393
  name: Filter,
3134
3394
  onInput: HandleFilterInput,
3135
- placeholder: 'Filter events',
3395
+ placeholder: filterEvents(),
3136
3396
  type: Input,
3137
3397
  value: filterValue
3138
3398
  }, ...quickFilterNodes, ...refreshButtonDom];
@@ -3149,7 +3409,7 @@ const getDebugViewTopDom = (filterValue, useDevtoolsLayout, quickFilterNodes) =>
3149
3409
  inputType: 'search',
3150
3410
  name: Filter,
3151
3411
  onInput: HandleFilterInput,
3152
- placeholder: 'Filter events',
3412
+ placeholder: filterEvents(),
3153
3413
  type: Input,
3154
3414
  value: filterValue
3155
3415
  }, ...refreshButtonDom];
@@ -3225,7 +3485,7 @@ const getTimingDetailsDom = event => {
3225
3485
  childCount: 3,
3226
3486
  className: ChatDebugViewTiming,
3227
3487
  type: Div
3228
- }, ...getTimingRowDom('Started', getStartText(event)), ...getTimingRowDom('Ended', getEndText(event)), ...getTimingRowDom('Duration', getDurationText(event))];
3488
+ }, ...getTimingRowDom(started(), getStartText(event)), ...getTimingRowDom(ended(), getEndText(event)), ...getTimingRowDom(duration(), getDurationText(event))];
3229
3489
  };
3230
3490
 
3231
3491
  const getTabId = detailTab => {
@@ -3265,9 +3525,10 @@ const getDetailsDom = (previewEventNodes, responseEventNodes = previewEventNodes
3265
3525
  }, {
3266
3526
  childCount: 2,
3267
3527
  className: ChatDebugViewDetailsTop,
3528
+ onContextMenu: HandleDetailsTopContextMenu,
3268
3529
  type: Div
3269
3530
  }, {
3270
- 'aria-label': 'Close details',
3531
+ 'aria-label': closeDetails(),
3271
3532
  childCount: 0,
3272
3533
  className: ChatDebugViewDetailsClose,
3273
3534
  name: CloseDetails,
@@ -3276,7 +3537,7 @@ const getDetailsDom = (previewEventNodes, responseEventNodes = previewEventNodes
3276
3537
  type: Button$1,
3277
3538
  value: 'close'
3278
3539
  }, {
3279
- 'aria-label': 'Detail sections',
3540
+ 'aria-label': detailSections(),
3280
3541
  childCount: detailTabs.length,
3281
3542
  className: ChatDebugViewDetailsTabs,
3282
3543
  role: 'tablist',
@@ -3372,30 +3633,45 @@ const getStatusText = event => {
3372
3633
  return hasErrorStatus(event) ? '400' : '200';
3373
3634
  };
3374
3635
 
3375
- const getDevtoolsRows = (events, selectedEventIndex) => {
3636
+ const getRowCellNodes = (event, isErrorStatus, visibleTableColumns) => {
3637
+ return visibleTableColumns.flatMap(column => {
3638
+ switch (column) {
3639
+ case Duration:
3640
+ return [{
3641
+ childCount: 1,
3642
+ className: joinClassNames(ChatDebugViewCell, ChatDebugViewCellDuration),
3643
+ type: Td
3644
+ }, text(getDurationText(event))];
3645
+ case Status:
3646
+ return [{
3647
+ childCount: 1,
3648
+ className: joinClassNames(ChatDebugViewCell, ChatDebugViewCellStatus, isErrorStatus && ChatDebugViewCellStatusError),
3649
+ type: Td
3650
+ }, text(getStatusText(event))];
3651
+ case Type:
3652
+ return [{
3653
+ childCount: 1,
3654
+ className: joinClassNames(ChatDebugViewCell, ChatDebugViewCellType),
3655
+ type: Td
3656
+ }, text(getEventTypeLabel(event))];
3657
+ default:
3658
+ return [];
3659
+ }
3660
+ });
3661
+ };
3662
+ const getDevtoolsRows = (events, selectedEventIndex, visibleTableColumns = defaultVisibleTableColumns) => {
3376
3663
  return events.flatMap((event, i) => {
3377
3664
  const isEvenRow = i % 2 === 1;
3378
3665
  const isSelected = selectedEventIndex === i;
3379
3666
  const isErrorStatus = hasErrorStatus(event);
3380
3667
  const rowIndex = String(i);
3668
+ const rowCellNodes = getRowCellNodes(event, isErrorStatus, visibleTableColumns);
3381
3669
  return [{
3382
- childCount: 3,
3670
+ childCount: visibleTableColumns.length,
3383
3671
  className: joinClassNames(ChatDebugViewEventRow, isEvenRow && TableRowEven, isSelected && ChatDebugViewEventRowSelected),
3384
3672
  'data-index': rowIndex,
3385
3673
  type: Tr
3386
- }, {
3387
- childCount: 1,
3388
- className: joinClassNames(ChatDebugViewCell, ChatDebugViewCellType),
3389
- type: Td
3390
- }, text(getEventTypeLabel(event)), {
3391
- childCount: 1,
3392
- className: joinClassNames(ChatDebugViewCell, ChatDebugViewCellDuration),
3393
- type: Td
3394
- }, text(getDurationText(event)), {
3395
- childCount: 1,
3396
- className: joinClassNames(ChatDebugViewCell, ChatDebugViewCellStatus, isErrorStatus && ChatDebugViewCellStatusError),
3397
- type: Td
3398
- }, text(getStatusText(event))];
3674
+ }, ...rowCellNodes];
3399
3675
  });
3400
3676
  };
3401
3677
 
@@ -3694,39 +3970,55 @@ const getTableBodyDom = (rowNodes, eventCount) => {
3694
3970
  }, ...rowNodes];
3695
3971
  };
3696
3972
 
3697
- const getTableHeaderDom = () => {
3973
+ const getHeaderCellNodes = visibleTableColumns => {
3974
+ return visibleTableColumns.flatMap(column => {
3975
+ switch (column) {
3976
+ case Duration:
3977
+ return [{
3978
+ childCount: 1,
3979
+ className: ChatDebugViewHeaderCell,
3980
+ scope: 'col',
3981
+ type: Th
3982
+ }, text(duration())];
3983
+ case Status:
3984
+ return [{
3985
+ childCount: 1,
3986
+ className: ChatDebugViewHeaderCell,
3987
+ scope: 'col',
3988
+ type: Th
3989
+ }, text(status())];
3990
+ case Type:
3991
+ return [{
3992
+ childCount: 1,
3993
+ className: ChatDebugViewHeaderCell,
3994
+ scope: 'col',
3995
+ type: Th
3996
+ }, text(type())];
3997
+ default:
3998
+ return [];
3999
+ }
4000
+ });
4001
+ };
4002
+ const getTableHeaderDom = (visibleTableColumns = defaultVisibleTableColumns) => {
4003
+ const headerCellNodes = getHeaderCellNodes(visibleTableColumns);
3698
4004
  return [{
3699
4005
  childCount: 1,
3700
4006
  className: ChatDebugViewTableHeader,
4007
+ onContextMenu: HandleHeaderContextMenu,
3701
4008
  type: THead
3702
4009
  }, {
3703
- childCount: 3,
4010
+ childCount: visibleTableColumns.length,
3704
4011
  className: ChatDebugViewTableHeaderRow,
3705
4012
  type: Tr
3706
- }, {
3707
- childCount: 1,
3708
- className: ChatDebugViewHeaderCell,
3709
- scope: 'col',
3710
- type: Th
3711
- }, text('Type'), {
3712
- childCount: 1,
3713
- className: ChatDebugViewHeaderCell,
3714
- scope: 'col',
3715
- type: Th
3716
- }, text('Duration'), {
3717
- childCount: 1,
3718
- className: ChatDebugViewHeaderCell,
3719
- scope: 'col',
3720
- type: Th
3721
- }, text('Status')];
4013
+ }, ...headerCellNodes];
3722
4014
  };
3723
4015
 
3724
- const getTableDom = (rowNodes, eventCount) => {
4016
+ const getTableDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns) => {
3725
4017
  return [{
3726
4018
  childCount: 2,
3727
4019
  className: ChatDebugViewTable,
3728
4020
  type: Table
3729
- }, ...getTableHeaderDom(), ...getTableBodyDom(rowNodes, eventCount)];
4021
+ }, ...getTableHeaderDom(visibleTableColumns), ...getTableBodyDom(rowNodes, eventCount)];
3730
4022
  };
3731
4023
 
3732
4024
  const formatPercent = value => {
@@ -3795,9 +4087,9 @@ const formatTimelineSeconds = value => {
3795
4087
  const getTimelineSummary = (timelineEvents, timelineStartSeconds, timelineEndSeconds) => {
3796
4088
  const timelineInfo = getTimelineInfo(timelineEvents, timelineStartSeconds, timelineEndSeconds);
3797
4089
  if (timelineInfo.hasSelection && timelineInfo.startSeconds !== null && timelineInfo.endSeconds !== null) {
3798
- return `Window ${formatTimelineSeconds(timelineInfo.startSeconds)}-${formatTimelineSeconds(timelineInfo.endSeconds)} of ${formatTimelineSeconds(timelineInfo.durationSeconds)}`;
4090
+ return windowSummary(formatTimelineSeconds(timelineInfo.startSeconds), formatTimelineSeconds(timelineInfo.endSeconds), formatTimelineSeconds(timelineInfo.durationSeconds));
3799
4091
  }
3800
- return `Window 0s-${formatTimelineSeconds(timelineInfo.durationSeconds)} of ${formatTimelineSeconds(timelineInfo.durationSeconds)}`;
4092
+ return windowSummary('0s', formatTimelineSeconds(timelineInfo.durationSeconds), formatTimelineSeconds(timelineInfo.durationSeconds));
3801
4093
  };
3802
4094
 
3803
4095
  const getTimelineNodes = (timelineEvents, timelineStartSeconds, timelineEndSeconds, timelineSelectionActive = false, timelineSelectionAnchorSeconds = '', timelineSelectionFocusSeconds = '') => {
@@ -3825,6 +4117,7 @@ const getTimelineNodes = (timelineEvents, timelineStartSeconds, timelineEndSecon
3825
4117
  return [{
3826
4118
  childCount: 2,
3827
4119
  className: ChatDebugViewTimeline,
4120
+ onContextMenu: HandleTimelineContextMenu,
3828
4121
  type: Section
3829
4122
  }, {
3830
4123
  childCount: 1,
@@ -3851,13 +4144,13 @@ const getTimelineNodes = (timelineEvents, timelineStartSeconds, timelineEndSecon
3851
4144
  }, ...selectionNodes];
3852
4145
  };
3853
4146
 
3854
- const getDevtoolsDom = (events, selectedEvent, selectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage = 'No events have been found', timelineSelectionActive = false, timelineSelectionAnchorSeconds = '', timelineSelectionFocusSeconds = '', selectedDetailTab = Response) => {
3855
- const rowNodes = getDevtoolsRows(events, selectedEventIndex);
4147
+ const getDevtoolsDom = (events, selectedEvent, selectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage = noEventsFound(), timelineSelectionActive = false, timelineSelectionAnchorSeconds = '', timelineSelectionFocusSeconds = '', selectedDetailTab = Response, visibleTableColumns = defaultVisibleTableColumns) => {
4148
+ const rowNodes = getDevtoolsRows(events, selectedEventIndex, visibleTableColumns);
3856
4149
  const timelineNodes = getTimelineNodes(timelineEvents, timelineStartSeconds, timelineEndSeconds, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds);
3857
4150
  const previewEventNodes = selectedEvent ? getEventNode(getPreviewEvent(selectedEvent)) : [];
3858
4151
  const responseEventNodes = selectedEvent ? getEventNode(selectedEvent) : [];
3859
4152
  const hasSelectedEvent = responseEventNodes.length > 0;
3860
- const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableDom(rowNodes, events.length);
4153
+ const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableDom(rowNodes, events.length, visibleTableColumns);
3861
4154
  const eventsClassName = getEventsClassName(hasSelectedEvent);
3862
4155
  const detailsNodes = getDetailsDom(previewEventNodes, responseEventNodes, selectedEvent, isDetailTab(selectedDetailTab) ? selectedDetailTab : Response);
3863
4156
  const sashNodes = getSashNodesDom(hasSelectedEvent);
@@ -3925,18 +4218,18 @@ const getTimelineFilterDescription = (timelineStartSeconds, timelineEndSeconds)
3925
4218
  const trimmedStart = timelineStartSeconds.trim();
3926
4219
  const trimmedEnd = timelineEndSeconds.trim();
3927
4220
  if (trimmedStart && trimmedEnd) {
3928
- return `${trimmedStart}s-${trimmedEnd}s`;
4221
+ return secondsRange(trimmedStart, trimmedEnd);
3929
4222
  }
3930
4223
  if (trimmedStart) {
3931
- return `from ${trimmedStart}s`;
4224
+ return fromSeconds(trimmedStart);
3932
4225
  }
3933
4226
  if (trimmedEnd) {
3934
- return `to ${trimmedEnd}s`;
4227
+ return toSeconds(trimmedEnd);
3935
4228
  }
3936
4229
  return '';
3937
4230
  };
3938
4231
 
3939
- const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilter, eventCategoryFilterOptions, _showEventStreamFinishedEvents, _showInputEvents, _showResponsePartEvents, useDevtoolsLayout, selectedEvent, selectedEventIndex, timelineStartSeconds, timelineEndSeconds, timelineEvents, events, timelineSelectionActive = false, timelineSelectionAnchorSeconds = '', timelineSelectionFocusSeconds = '', selectedDetailTab = Response) => {
4232
+ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilter, eventCategoryFilterOptions, _showEventStreamFinishedEvents, _showInputEvents, _showResponsePartEvents, useDevtoolsLayout, selectedEvent, selectedEventIndex, timelineStartSeconds, timelineEndSeconds, timelineEvents, events, timelineSelectionActive = false, timelineSelectionAnchorSeconds = '', timelineSelectionFocusSeconds = '', selectedDetailTab = Response, visibleTableColumns = defaultVisibleTableColumns) => {
3940
4233
  if (errorMessage) {
3941
4234
  return getDebugErrorDom(errorMessage);
3942
4235
  }
@@ -3955,11 +4248,11 @@ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilter, eve
3955
4248
  const hasTimelineFilter = Boolean(timelineFilterDescription);
3956
4249
  const hasFilterValue = filterDescriptionParts.length > 0;
3957
4250
  const filterDescription = filterDescriptionParts.join(' ');
3958
- const noFilteredEventsMessage = `no events found matching ${filterDescription}`;
4251
+ const noFilteredEventsMessage = noEventsFoundMatching(filterDescription);
3959
4252
  const useNoToolCallEventsMessage = eventCategoryFilter === Tools && !trimmedFilterValue && !hasTimelineFilter;
3960
- const emptyMessage = events.length === 0 && hasFilterValue ? useNoToolCallEventsMessage ? 'No tool call events.' : noFilteredEventsMessage : 'No events have been found';
4253
+ const emptyMessage = events.length === 0 && hasFilterValue ? useNoToolCallEventsMessage ? noToolCallEvents() : noFilteredEventsMessage : noEventsFound();
3961
4254
  const safeSelectedEventIndex = selectedEventIndex === null || selectedEventIndex < 0 || selectedEventIndex >= events.length ? null : selectedEventIndex;
3962
- const contentNodes = useDevtoolsLayout ? getDevtoolsDom(events, selectedEvent, safeSelectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds, isDetailTab(selectedDetailTab) ? selectedDetailTab : Response) : getLegacyEventsDom(errorMessage, emptyMessage, events.flatMap(getEventNode));
4255
+ const contentNodes = useDevtoolsLayout ? getDevtoolsDom(events, selectedEvent, safeSelectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds, isDetailTab(selectedDetailTab) ? selectedDetailTab : Response, visibleTableColumns) : getLegacyEventsDom(errorMessage, emptyMessage, events.flatMap(getEventNode));
3963
4256
  const quickFilterNodes = useDevtoolsLayout ? getQuickFilterNodes(eventCategoryFilter, eventCategoryFilterOptions) : [];
3964
4257
  const debugViewTopDom = getDebugViewTopDom(filterValue, useDevtoolsLayout, quickFilterNodes);
3965
4258
  const rootChildCount = 2;
@@ -3984,7 +4277,7 @@ const renderItems = (oldState, newState) => {
3984
4277
  }
3985
4278
  const timelineEvents = getTimelineEvents(newState);
3986
4279
  const filteredEvents = filterEventsByTimelineRange(timelineEvents, newState.timelineStartSeconds, newState.timelineEndSeconds);
3987
- const dom = getChatDebugViewDom(newState.errorMessage, newState.filterValue, newState.eventCategoryFilter, newState.eventCategoryFilterOptions, newState.showEventStreamFinishedEvents, newState.showInputEvents, newState.showResponsePartEvents, newState.useDevtoolsLayout, newState.selectedEvent, newState.selectedEventIndex, newState.timelineStartSeconds, newState.timelineEndSeconds, withSessionEventIds(timelineEvents), withSessionEventIds(filteredEvents), newState.timelineSelectionActive, newState.timelineSelectionAnchorSeconds, newState.timelineSelectionFocusSeconds, newState.selectedDetailTab);
4280
+ const dom = getChatDebugViewDom(newState.errorMessage, newState.filterValue, newState.eventCategoryFilter, newState.eventCategoryFilterOptions, newState.showEventStreamFinishedEvents, newState.showInputEvents, newState.showResponsePartEvents, newState.useDevtoolsLayout, newState.selectedEvent, newState.selectedEventIndex, newState.timelineStartSeconds, newState.timelineEndSeconds, withSessionEventIds(timelineEvents), withSessionEventIds(filteredEvents), newState.timelineSelectionActive, newState.timelineSelectionAnchorSeconds, newState.timelineSelectionFocusSeconds, newState.selectedDetailTab, newState.visibleTableColumns);
3988
4281
  return [SetDom2, newState.uid, dom];
3989
4282
  };
3990
4283
 
@@ -4032,7 +4325,7 @@ const render2 = (uid, diffResult) => {
4032
4325
  const renderEventListeners = () => {
4033
4326
  return [{
4034
4327
  name: HandleHeaderContextMenu,
4035
- params: ['handleHeaderContextMenu'],
4328
+ params: ['handleHeaderContextMenu', ClientX, ClientY],
4036
4329
  preventDefault: true
4037
4330
  }, {
4038
4331
  name: HandleEventRowClick,
@@ -4045,6 +4338,14 @@ const renderEventListeners = () => {
4045
4338
  name: HandleDetailsContextMenu,
4046
4339
  params: ['handleDetailsContextMenu'],
4047
4340
  preventDefault: true
4341
+ }, {
4342
+ name: HandleDetailsTopContextMenu,
4343
+ params: ['handleDetailsTopContextMenu'],
4344
+ preventDefault: true
4345
+ }, {
4346
+ name: HandleTimelineContextMenu,
4347
+ params: ['handleTimelineContextMenu'],
4348
+ preventDefault: true
4048
4349
  }, {
4049
4350
  name: HandleFilterInput,
4050
4351
  params: ['handleInput', TargetName, TargetValue]
@@ -4096,6 +4397,19 @@ const rerender = state => {
4096
4397
  return structuredClone(state);
4097
4398
  };
4098
4399
 
4400
+ const isSameVisibleTableColumns = (a, b) => {
4401
+ return a.length === b.length && a.every((value, index) => value === b[index]);
4402
+ };
4403
+ const resetTableColumns = state => {
4404
+ if (isSameVisibleTableColumns(state.visibleTableColumns, defaultVisibleTableColumns)) {
4405
+ return state;
4406
+ }
4407
+ return {
4408
+ ...state,
4409
+ visibleTableColumns: defaultVisibleTableColumns
4410
+ };
4411
+ };
4412
+
4099
4413
  const handleResize = (state, dimensions) => {
4100
4414
  const nextState = {
4101
4415
  ...state,
@@ -4125,7 +4439,8 @@ const saveState = state => {
4125
4439
  selectedEventId,
4126
4440
  sessionId,
4127
4441
  timelineEndSeconds,
4128
- timelineStartSeconds
4442
+ timelineStartSeconds,
4443
+ visibleTableColumns
4129
4444
  } = state;
4130
4445
  return {
4131
4446
  eventCategoryFilter,
@@ -4134,7 +4449,8 @@ const saveState = state => {
4134
4449
  selectedEventId,
4135
4450
  sessionId,
4136
4451
  timelineEndSeconds,
4137
- timelineStartSeconds
4452
+ timelineStartSeconds,
4453
+ visibleTableColumns
4138
4454
  };
4139
4455
  };
4140
4456
 
@@ -4182,15 +4498,33 @@ const setSessionId = async (state, sessionId) => {
4182
4498
  };
4183
4499
  };
4184
4500
 
4501
+ const toggleTableColumnVisibility = (state, column) => {
4502
+ if (!isTableColumn(column)) {
4503
+ return state;
4504
+ }
4505
+ const nextVisibleColumns = new Set(state.visibleTableColumns);
4506
+ if (nextVisibleColumns.has(column)) {
4507
+ nextVisibleColumns.delete(column);
4508
+ } else {
4509
+ nextVisibleColumns.add(column);
4510
+ }
4511
+ return {
4512
+ ...state,
4513
+ visibleTableColumns: getOrderedVisibleTableColumns([...nextVisibleColumns])
4514
+ };
4515
+ };
4516
+
4185
4517
  const commandMap = {
4186
4518
  'ChatDebug.appendStoredEventForTest': wrapCommand(appendStoredEventForTest),
4187
4519
  'ChatDebug.create': create,
4188
4520
  'ChatDebug.diff2': diff2,
4189
4521
  'ChatDebug.getCommandIds': getCommandIds,
4522
+ 'ChatDebug.getMenuEntries': wrapGetter(getMenuEntries2),
4190
4523
  'ChatDebug.getMenuIds': getMenuIds,
4191
4524
  'ChatDebug.handleClickRefresh': wrapCommand(handleClickRefresh),
4192
4525
  'ChatDebug.handleCloseDetails': wrapCommand(handleCloseDetails),
4193
4526
  'ChatDebug.handleDetailsContextMenu': wrapCommand(handleDetailsContextMenu),
4527
+ 'ChatDebug.handleDetailsTopContextMenu': wrapCommand(handleDetailsTopContextMenu),
4194
4528
  'ChatDebug.handleDetailTab': wrapCommand(handleDetailTab),
4195
4529
  'ChatDebug.handleEventCategoryFilter': wrapCommand(handleEventCategoryFilter),
4196
4530
  'ChatDebug.handleEventRowClick': wrapCommand(handleEventRowClick),
@@ -4203,6 +4537,7 @@ const commandMap = {
4203
4537
  'ChatDebug.handleShowInputEvents': wrapCommand(handleShowInputEvents),
4204
4538
  'ChatDebug.handleShowResponsePartEvents': wrapCommand(handleShowResponsePartEvents),
4205
4539
  'ChatDebug.handleTableBodyContextMenu': wrapCommand(handleTableBodyContextMenu),
4540
+ 'ChatDebug.handleTimelineContextMenu': wrapCommand(handleTimelineContextMenu),
4206
4541
  'ChatDebug.handleTimelineDoubleClick': wrapCommand(handleTimelineDoubleClick),
4207
4542
  'ChatDebug.handleTimelineEndSeconds': wrapCommand(handleTimelineEndSeconds),
4208
4543
  'ChatDebug.handleTimelinePointerDown': wrapCommand(handleTimelinePointerDown),
@@ -4217,11 +4552,13 @@ const commandMap = {
4217
4552
  'ChatDebug.render2': render2,
4218
4553
  'ChatDebug.renderEventListeners': renderEventListeners,
4219
4554
  'ChatDebug.rerender': wrapCommand(rerender),
4555
+ 'ChatDebug.resetTableColumns': wrapCommand(resetTableColumns),
4220
4556
  'ChatDebug.resize': wrapCommand(resize),
4221
4557
  'ChatDebug.saveState': wrapGetter(saveState),
4222
4558
  'ChatDebug.setEvents': wrapCommand(setEvents),
4223
4559
  'ChatDebug.setSessionId': wrapCommand(setSessionId),
4224
- 'ChatDebug.terminate': terminate
4560
+ 'ChatDebug.terminate': terminate,
4561
+ 'ChatDebug.toggleTableColumnVisibility': wrapCommand(toggleTableColumnVisibility)
4225
4562
  };
4226
4563
 
4227
4564
  const sendMessagePortToChatStorageWorker = async port => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/chat-debug-view",
3
- "version": "7.3.0",
3
+ "version": "7.4.0",
4
4
  "description": "Chat Debug View Worker",
5
5
  "repository": {
6
6
  "type": "git",