@lvce-editor/chat-debug-view 10.20.0 → 10.22.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.
@@ -1441,6 +1441,7 @@ const TimelineStartSeconds = 'timelineStartSeconds';
1441
1441
  const TimelineEndSeconds = 'timelineEndSeconds';
1442
1442
  const TimelineRangePreset = 'timelineRangePreset';
1443
1443
  const Refresh$1 = 'refresh';
1444
+ const ToggleHeadersSection = 'toggleHeadersSection';
1444
1445
  const All$1 = 'all';
1445
1446
  const Tools$1 = 'tools';
1446
1447
  const Network$1 = 'network';
@@ -1476,15 +1477,15 @@ const FailedToLoadChatDebugSession = 'Failed to load chat debug session "{PH1}".
1476
1477
  const FailedToLoadChatDebugSessionWithError = 'Failed to load chat debug session "{PH1}": {PH2}';
1477
1478
  const FilterEvents = 'Filter events';
1478
1479
  const FromSeconds = 'from {PH1}s';
1479
- const General = 'General';
1480
+ const General$1 = 'General';
1480
1481
  const Headers = 'Headers';
1481
1482
  const ImageCouldNotBeLoaded = 'image could not be loaded';
1482
1483
  const InputTokens = 'Input Tokens';
1483
- const InvalidSessionId = 'Invalid session id';
1484
- const InvalidUriEncoding = 'Invalid URI encoding';
1485
- const InvalidUriFormat = 'Invalid URI format';
1484
+ const InvalidSessionId$1 = 'Invalid session id';
1485
+ const InvalidUriEncoding$1 = 'Invalid URI encoding';
1486
+ const InvalidUriFormat$1 = 'Invalid URI format';
1486
1487
  const Method$1 = 'Method';
1487
- const MissingUri = 'Missing URI';
1488
+ const MissingUri$1 = 'Missing URI';
1488
1489
  const Network = 'Network';
1489
1490
  const NoChatSessionFound = 'No chat session found for sessionId "{PH1}".';
1490
1491
  const NoEventsFound = 'No events have been found';
@@ -1497,19 +1498,21 @@ const Preview = 'Preview';
1497
1498
  const Refresh = 'Refresh';
1498
1499
  const RefreshEvents = 'Refresh events';
1499
1500
  const ResetColumns = 'Reset columns';
1500
- const RequestHeaders = 'Request Headers';
1501
+ const RequestHeaders$1 = 'Request Headers';
1501
1502
  const RequestMethod = 'Request Method';
1502
1503
  const RequestUrl = 'Request URL';
1503
1504
  const Response = 'Response';
1504
- const ResponseHeaders = 'Response Headers';
1505
+ const ResponseHeaders$1 = 'Response Headers';
1506
+ const ResponseHeadersInfo = 'Some headers may not be displayed due to Access-Control-Expose-Headers header.';
1505
1507
  const SecondsRange = '{PH1}s-{PH2}s';
1506
1508
  const Size$1 = 'Size';
1507
1509
  const Started = 'Started';
1508
1510
  const Status$2 = 'Status';
1509
1511
  const StatusCode = 'Status Code';
1510
1512
  const Stream = 'Stream';
1511
- const TableSummaryPlural = '{PH1} events, {PH2} from start to finish';
1512
- const TableSummarySingular = '{PH1} event, {PH2} from start to finish';
1513
+ const TableSummaryRequestPlural = '{PH1} requests';
1514
+ const TableSummaryRequestSingular = '{PH1} request';
1515
+ const TableSummaryFinish = 'Finish {PH1}';
1513
1516
  const Timing = 'Timing';
1514
1517
  const Tokens = 'Tokens';
1515
1518
  const ToSeconds = 'to {PH1}s';
@@ -1567,13 +1570,13 @@ const fromSeconds = seconds => {
1567
1570
  });
1568
1571
  };
1569
1572
  const general = () => {
1570
- return i18nString(General);
1573
+ return i18nString(General$1);
1571
1574
  };
1572
1575
  const headers = () => {
1573
1576
  return i18nString(Headers);
1574
1577
  };
1575
1578
  const invalidSessionId = () => {
1576
- return i18nString(InvalidSessionId);
1579
+ return i18nString(InvalidSessionId$1);
1577
1580
  };
1578
1581
  const imageCouldNotBeLoaded = () => {
1579
1582
  return i18nString(ImageCouldNotBeLoaded);
@@ -1582,13 +1585,13 @@ const inputTokens = () => {
1582
1585
  return i18nString(InputTokens);
1583
1586
  };
1584
1587
  const invalidUriEncoding = () => {
1585
- return i18nString(InvalidUriEncoding);
1588
+ return i18nString(InvalidUriEncoding$1);
1586
1589
  };
1587
1590
  const invalidUriFormat = () => {
1588
- return i18nString(InvalidUriFormat);
1591
+ return i18nString(InvalidUriFormat$1);
1589
1592
  };
1590
1593
  const missingUri = () => {
1591
- return i18nString(MissingUri);
1594
+ return i18nString(MissingUri$1);
1592
1595
  };
1593
1596
  const method = () => {
1594
1597
  return i18nString(Method$1);
@@ -1628,7 +1631,7 @@ const refreshEvents$1 = () => {
1628
1631
  return i18nString(RefreshEvents);
1629
1632
  };
1630
1633
  const requestHeaders = () => {
1631
- return i18nString(RequestHeaders);
1634
+ return i18nString(RequestHeaders$1);
1632
1635
  };
1633
1636
  const requestMethod = () => {
1634
1637
  return i18nString(RequestMethod);
@@ -1637,7 +1640,10 @@ const requestUrl = () => {
1637
1640
  return i18nString(RequestUrl);
1638
1641
  };
1639
1642
  const responseHeaders = () => {
1640
- return i18nString(ResponseHeaders);
1643
+ return i18nString(ResponseHeaders$1);
1644
+ };
1645
+ const responseHeadersInfo = () => {
1646
+ return i18nString(ResponseHeadersInfo);
1641
1647
  };
1642
1648
  const resetColumns = () => {
1643
1649
  return i18nString(ResetColumns);
@@ -1669,10 +1675,14 @@ const timing = () => {
1669
1675
  const tokens = () => {
1670
1676
  return i18nString(Tokens);
1671
1677
  };
1672
- const tableSummary = (eventCount, duration) => {
1673
- return i18nString(eventCount === 1 ? TableSummarySingular : TableSummaryPlural, {
1674
- PH1: String(eventCount),
1675
- PH2: duration
1678
+ const tableSummaryRequests = eventCount => {
1679
+ return i18nString(eventCount === 1 ? TableSummaryRequestSingular : TableSummaryRequestPlural, {
1680
+ PH1: String(eventCount)
1681
+ });
1682
+ };
1683
+ const tableSummaryFinish = duration => {
1684
+ return i18nString(TableSummaryFinish, {
1685
+ PH1: duration
1676
1686
  });
1677
1687
  };
1678
1688
  const toSeconds = seconds => {
@@ -1810,25 +1820,6 @@ const isDetailTab = value => {
1810
1820
  return value === Response$1 || value === Preview$1 || value === Payload$1 || value === Headers$1 || value === Tokens$1 || value === Headers$1 || value === Timing$1;
1811
1821
  };
1812
1822
 
1813
- const RE_SPACE = /\s+/;
1814
- const tokenToEventCategoryFilter = new Map([['@tools', Tools$1], ['@network', Network$1], ['@ui', Ui$1], ['@stream', Stream$1]]);
1815
- const parseFilterValue = filterValue => {
1816
- const normalizedFilter = filterValue.trim().toLowerCase();
1817
- if (!normalizedFilter) {
1818
- return {
1819
- eventCategoryFilter: All$1,
1820
- filterText: ''
1821
- };
1822
- }
1823
- const parts = normalizedFilter.split(RE_SPACE);
1824
- const eventCategoryFilter = parts.map(part => tokenToEventCategoryFilter.get(part)).find(Boolean) || All$1;
1825
- const filterText = parts.filter(part => !tokenToEventCategoryFilter.has(part)).join(' ');
1826
- return {
1827
- eventCategoryFilter,
1828
- filterText
1829
- };
1830
- };
1831
-
1832
1823
  const hasDetailTab = (detailTabs, value) => {
1833
1824
  return detailTabs.some(detailTab => detailTab.name === value);
1834
1825
  };
@@ -1851,28 +1842,45 @@ const Duration = 'duration';
1851
1842
  const Status$1 = 'status';
1852
1843
  const Size = 'size';
1853
1844
  const tableColumnNames = [Type, Method, Status$1, Size, Duration];
1854
- const createTableColumns = () => {
1855
- return [{
1856
- isVisible: true,
1857
- label: type(),
1858
- name: Type
1859
- }, {
1860
- isVisible: true,
1845
+ const tableColumnDefinitions = {
1846
+ [Duration]: {
1847
+ defaultWidth: 110,
1848
+ label: duration(),
1849
+ minimumWidth: 80
1850
+ },
1851
+ [Method]: {
1852
+ defaultWidth: 90,
1861
1853
  label: method(),
1862
- name: Method
1863
- }, {
1864
- isVisible: true,
1865
- label: status(),
1866
- name: Status$1
1867
- }, {
1868
- isVisible: true,
1854
+ minimumWidth: 56
1855
+ },
1856
+ [Size]: {
1857
+ defaultWidth: 100,
1869
1858
  label: size(),
1870
- name: Size
1871
- }, {
1872
- isVisible: true,
1873
- label: duration(),
1874
- name: Duration
1875
- }];
1859
+ minimumWidth: 80
1860
+ },
1861
+ [Status$1]: {
1862
+ defaultWidth: 110,
1863
+ label: status(),
1864
+ minimumWidth: 56
1865
+ },
1866
+ [Type]: {
1867
+ defaultWidth: 260,
1868
+ label: type(),
1869
+ minimumWidth: 80
1870
+ }
1871
+ };
1872
+ const createTableColumns = () => {
1873
+ return tableColumnNames.map(name => {
1874
+ const definition = tableColumnDefinitions[name];
1875
+ return {
1876
+ defaultWidth: definition.defaultWidth,
1877
+ isVisible: true,
1878
+ label: definition.label,
1879
+ minimumWidth: definition.minimumWidth,
1880
+ name,
1881
+ width: definition.defaultWidth
1882
+ };
1883
+ });
1876
1884
  };
1877
1885
  const defaultVisibleTableColumns = tableColumnNames;
1878
1886
  const isTableColumn = value => {
@@ -1888,13 +1896,45 @@ const getTableColumnsWithVisibility = (tableColumns, visibleTableColumns) => {
1888
1896
  isVisible: visibleColumns.has(column.name)
1889
1897
  }));
1890
1898
  };
1899
+ const getTableColumnByName = (tableColumns, name) => {
1900
+ return tableColumns.find(column => column.name === name);
1901
+ };
1902
+ const getTableColumnWidth = (tableColumns, name) => {
1903
+ return getTableColumnByName(tableColumns, name)?.width ?? 0;
1904
+ };
1905
+ const getTableColumnMinimumWidth = (tableColumns, name) => {
1906
+ return getTableColumnByName(tableColumns, name)?.minimumWidth ?? 0;
1907
+ };
1908
+ const getTableColumnWidths = tableColumns => {
1909
+ return {
1910
+ duration: getTableColumnWidth(tableColumns, Duration),
1911
+ method: getTableColumnWidth(tableColumns, Method),
1912
+ size: getTableColumnWidth(tableColumns, Size),
1913
+ status: getTableColumnWidth(tableColumns, Status$1),
1914
+ type: getTableColumnWidth(tableColumns, Type)
1915
+ };
1916
+ };
1917
+ const setTableColumnWidths = (tableColumns, tableColumnWidths) => {
1918
+ return tableColumns.map(column => ({
1919
+ ...column,
1920
+ width: tableColumnWidths[column.name]
1921
+ }));
1922
+ };
1923
+ const setTableColumnWidth = (tableColumns, columnName, width) => {
1924
+ return tableColumns.map(column => {
1925
+ if (column.name !== columnName) {
1926
+ return column;
1927
+ }
1928
+ return {
1929
+ ...column,
1930
+ width
1931
+ };
1932
+ });
1933
+ };
1891
1934
  const getOrderedVisibleTableColumns = (values, tableColumns = createTableColumns()) => {
1892
1935
  const visibleColumns = new Set(values.filter(isTableColumn));
1893
1936
  return tableColumns.map(column => column.name).filter(column => visibleColumns.has(column));
1894
1937
  };
1895
- const isVisibleTableColumn = (tableColumns, column) => {
1896
- return tableColumns.some(tableColumn => tableColumn.name === column && tableColumn.isVisible);
1897
- };
1898
1938
  const getTableColumnLabel = (tableColumns, name) => {
1899
1939
  const match = tableColumns.find(column => column.name === name);
1900
1940
  if (match) {
@@ -1916,17 +1956,15 @@ const getTableColumnLabel = (tableColumns, name) => {
1916
1956
  }
1917
1957
  };
1918
1958
 
1919
- const defaultTableColumnWidths = {
1920
- duration: 110,
1921
- method: 90,
1922
- size: 100,
1923
- status: 110,
1924
- type: 260
1925
- };
1926
-
1927
1959
  const getMainWidth = state => {
1928
1960
  return Math.max(0, state.width - state.horizontalPadding);
1929
1961
  };
1962
+ const getNarrowMainWidthBreakpoint = state => {
1963
+ return Math.max(0, state.mediumBreakpoint - state.horizontalPadding);
1964
+ };
1965
+ const isNarrowSplitLayout = state => {
1966
+ return getMainWidth(state) <= getNarrowMainWidthBreakpoint(state);
1967
+ };
1930
1968
  const clampTableWidth = (state, tableWidth) => {
1931
1969
  const mainWidth = getMainWidth(state);
1932
1970
  const maxTableWidth = Math.max(0, mainWidth - state.minDetailsWidth - state.sashWidth);
@@ -1938,24 +1976,21 @@ const getDetailsWidth = (state, tableWidth) => {
1938
1976
  const clampedTableWidth = clampTableWidth(state, tableWidth);
1939
1977
  return Math.max(0, mainWidth - clampedTableWidth - state.sashWidth);
1940
1978
  };
1979
+ const getBalancedSplitTableWidth = state => {
1980
+ const mainWidth = getMainWidth(state);
1981
+ const balancedTableWidth = Math.floor(Math.max(0, mainWidth - state.sashWidth) / 2);
1982
+ return clampTableWidth(state, balancedTableWidth);
1983
+ };
1984
+ const shouldUseBalancedSplitTableWidth = state => {
1985
+ return !!state.selectedEvent && state.useDevtoolsLayout && !state.tableWidthManuallyResized && isNarrowSplitLayout(state);
1986
+ };
1941
1987
  const getTableWidthFromClientX = (state, clientX) => {
1942
1988
  const nextTableWidth = clientX - state.x - state.leftPadding;
1943
1989
  return clampTableWidth(state, nextTableWidth);
1944
1990
  };
1945
1991
 
1946
- const minimumTableColumnWidths = {
1947
- [Duration]: 80,
1948
- [Method]: 56,
1949
- [Size]: 80,
1950
- [Status$1]: 56,
1951
- [Type]: 80
1952
- };
1953
- const getMinimumTableColumnWidth = column => {
1954
- return minimumTableColumnWidths[column];
1955
- };
1956
-
1957
- const getTableColumnLayout = (tableWidth, visibleTableColumns, tableColumnWidths) => {
1958
- const visibleColumns = getOrderedVisibleTableColumns(visibleTableColumns);
1992
+ const getTableColumnLayout = (tableWidth, visibleTableColumns, tableColumns) => {
1993
+ const visibleColumns = getOrderedVisibleTableColumns(visibleTableColumns, tableColumns);
1959
1994
  if (visibleColumns.length === 0) {
1960
1995
  return {
1961
1996
  fixedColumns: [],
@@ -1972,10 +2007,10 @@ const getTableColumnLayout = (tableWidth, visibleTableColumns, tableColumnWidths
1972
2007
  visibleColumnWidths.push(Math.max(0, remainingWidth));
1973
2008
  continue;
1974
2009
  }
1975
- const minimumWidth = getMinimumTableColumnWidth(column);
1976
- const minimumRemainingWidth = visibleColumns.slice(index + 1).reduce((total, remainingColumn) => total + getMinimumTableColumnWidth(remainingColumn), 0);
2010
+ const minimumWidth = getTableColumnMinimumWidth(tableColumns, column);
2011
+ const minimumRemainingWidth = visibleColumns.slice(index + 1).reduce((total, remainingColumn) => total + getTableColumnMinimumWidth(tableColumns, remainingColumn), 0);
1977
2012
  const maxWidth = Math.max(minimumWidth, remainingWidth - minimumRemainingWidth);
1978
- const preferredWidth = tableColumnWidths[column];
2013
+ const preferredWidth = getTableColumnWidth(tableColumns, column);
1979
2014
  const clampedWidth = Math.max(minimumWidth, Math.min(preferredWidth, maxWidth));
1980
2015
  visibleColumnWidths.push(clampedWidth);
1981
2016
  remainingWidth -= clampedWidth;
@@ -1994,24 +2029,21 @@ const getTableColumnLayout = (tableWidth, visibleTableColumns, tableColumnWidths
1994
2029
  };
1995
2030
  };
1996
2031
 
1997
- const getResizedTableColumnWidths = (state, visibleTableColumns, tableColumnWidths, clientX, resizerDownId) => {
2032
+ const getResizedTableColumnWidths = (state, visibleTableColumns, tableColumns, clientX, resizerDownId) => {
1998
2033
  const clampedTableWidth = clampTableWidth(state, state.tableWidth);
1999
- const layout = getTableColumnLayout(clampedTableWidth, visibleTableColumns, tableColumnWidths);
2034
+ const layout = getTableColumnLayout(clampedTableWidth, visibleTableColumns, tableColumns);
2000
2035
  if (resizerDownId < 1 || resizerDownId >= layout.visibleColumns.length) {
2001
- return tableColumnWidths;
2036
+ return tableColumns;
2002
2037
  }
2003
2038
  const boundaryIndex = resizerDownId - 1;
2004
2039
  const precedingWidth = layout.visibleColumnWidths.slice(0, boundaryIndex).reduce((total, current) => total + current, 0);
2005
2040
  const resizedColumn = layout.visibleColumns[boundaryIndex];
2006
- const minimumWidth = getMinimumTableColumnWidth(resizedColumn);
2007
- const minimumRemainingWidth = layout.visibleColumns.slice(boundaryIndex + 1).reduce((total, column) => total + getMinimumTableColumnWidth(column), 0);
2041
+ const minimumWidth = getTableColumnMinimumWidth(tableColumns, resizedColumn);
2042
+ const minimumRemainingWidth = layout.visibleColumns.slice(boundaryIndex + 1).reduce((total, column) => total + getTableColumnMinimumWidth(tableColumns, column), 0);
2008
2043
  const maxWidth = Math.max(minimumWidth, clampedTableWidth - precedingWidth - minimumRemainingWidth);
2009
2044
  const nextWidth = clientX - state.x - state.leftPadding - precedingWidth;
2010
2045
  const clampedWidth = Math.max(minimumWidth, Math.min(nextWidth, maxWidth));
2011
- return {
2012
- ...tableColumnWidths,
2013
- [resizedColumn]: clampedWidth
2014
- };
2046
+ return setTableColumnWidth(tableColumns, resizedColumn, clampedWidth);
2015
2047
  };
2016
2048
 
2017
2049
  const isSameTableColumnWidths = (first, second) => {
@@ -2048,9 +2080,6 @@ const restoreCategoryFilters = (savedState, currentCategoryFilters) => {
2048
2080
  if (typeof savedState.eventCategoryFilter === 'string' && validEventCategoryFilters.has(savedState.eventCategoryFilter)) {
2049
2081
  return selectCategoryFilter(currentCategoryFilters, savedState.eventCategoryFilter);
2050
2082
  }
2051
- if (typeof savedState.filterValue === 'string') {
2052
- return selectCategoryFilter(currentCategoryFilters, parseFilterValue(savedState.filterValue).eventCategoryFilter);
2053
- }
2054
2083
  return currentCategoryFilters;
2055
2084
  };
2056
2085
  const restoreFilterValue = (savedState, currentFilterValue) => {
@@ -2080,24 +2109,26 @@ const restoreVisibleTableColumns = (savedState, currentTableColumns) => {
2080
2109
  }
2081
2110
  return getTableColumnsWithVisibility(currentTableColumns, visibleTableColumns);
2082
2111
  };
2083
- const restoreTableColumnWidths = (savedState, currentTableColumnWidths) => {
2112
+ const restoreTableColumns = (savedState, currentTableColumns) => {
2113
+ const tableColumnsWithVisibility = restoreVisibleTableColumns(savedState, currentTableColumns);
2084
2114
  const {
2085
2115
  tableColumnWidths: savedTableColumnWidths
2086
2116
  } = savedState;
2087
2117
  if (isTableColumnWidths(savedTableColumnWidths)) {
2088
- return savedTableColumnWidths;
2118
+ return setTableColumnWidths(tableColumnsWithVisibility, savedTableColumnWidths);
2089
2119
  }
2090
2120
  if (isLegacyTableColumnWidths(savedTableColumnWidths)) {
2091
2121
  const legacyTableColumnWidths = savedTableColumnWidths;
2092
- return {
2122
+ const currentTableColumnWidths = getTableColumnWidths(currentTableColumns);
2123
+ return setTableColumnWidths(tableColumnsWithVisibility, {
2093
2124
  duration: legacyTableColumnWidths.duration,
2094
2125
  method: legacyTableColumnWidths.method,
2095
2126
  size: currentTableColumnWidths.size,
2096
2127
  status: legacyTableColumnWidths.status,
2097
2128
  type: legacyTableColumnWidths.type
2098
- };
2129
+ });
2099
2130
  }
2100
- return currentTableColumnWidths;
2131
+ return tableColumnsWithVisibility;
2101
2132
  };
2102
2133
  const restoreSavedState = (state, savedState) => {
2103
2134
  if (!isSavedState(savedState)) {
@@ -2109,8 +2140,7 @@ const restoreSavedState = (state, savedState) => {
2109
2140
  detailTabs: restoreDetailTabs(savedState, state.detailTabs),
2110
2141
  filterValue: restoreFilterValue(savedState, state.filterValue),
2111
2142
  selectedEventId: restoreSelectedEventId(savedState, state.selectedEventId),
2112
- tableColumns: restoreVisibleTableColumns(savedState, state.tableColumns),
2113
- tableColumnWidths: restoreTableColumnWidths(savedState, state.tableColumnWidths),
2143
+ tableColumns: restoreTableColumns(savedState, state.tableColumns),
2114
2144
  timelineEndSeconds: restoreTimelineEndSeconds(savedState, state.timelineEndSeconds),
2115
2145
  timelineStartSeconds: restoreTimelineStartSeconds(savedState, state.timelineStartSeconds)
2116
2146
  };
@@ -2321,7 +2351,7 @@ const getEventsWithTime = events => {
2321
2351
  });
2322
2352
  };
2323
2353
 
2324
- const clamp$1 = (value, minimum, maximum) => {
2354
+ const clamp = (value, minimum, maximum) => {
2325
2355
  return Math.max(minimum, Math.min(value, maximum));
2326
2356
  };
2327
2357
 
@@ -2355,8 +2385,8 @@ const getNormalizedRange = (durationSeconds, startValue, endValue) => {
2355
2385
  const rawEnd = parsedEnd ?? durationSeconds;
2356
2386
  const rangeStart = Math.min(rawStart, rawEnd);
2357
2387
  const rangeEnd = Math.max(rawStart, rawEnd);
2358
- const normalizedStart = clamp$1(rangeStart, 0, durationSeconds);
2359
- const normalizedEnd = clamp$1(rangeEnd, 0, durationSeconds);
2388
+ const normalizedStart = clamp(rangeStart, 0, durationSeconds);
2389
+ const normalizedEnd = clamp(rangeEnd, 0, durationSeconds);
2360
2390
  return {
2361
2391
  endSeconds: roundSeconds(normalizedEnd),
2362
2392
  hasSelection: true,
@@ -2441,6 +2471,7 @@ const createDefaultState = () => {
2441
2471
  return {
2442
2472
  assetDir: '',
2443
2473
  categoryFilters: createCategoryFilters(),
2474
+ collapsedHeaderSections: [],
2444
2475
  databaseName: 'lvce-chat-view-sessions',
2445
2476
  dataBaseVersion: 2,
2446
2477
  defaultTableWidth,
@@ -2479,8 +2510,8 @@ const createDefaultState = () => {
2479
2510
  showResponsePartEvents: false,
2480
2511
  sortColumn: '',
2481
2512
  sortDescending: false,
2513
+ summaries: [],
2482
2514
  tableColumns: createTableColumns(),
2483
- tableColumnWidths: defaultTableColumnWidths,
2484
2515
  tableDeltaY: 0,
2485
2516
  tableMaxLineY: 0,
2486
2517
  tableMinLineY: 0,
@@ -2488,6 +2519,7 @@ const createDefaultState = () => {
2488
2519
  tableScrollBarHandleOffset: 0,
2489
2520
  tableScrollBarPointerActive: false,
2490
2521
  tableWidth: defaultTableWidth,
2522
+ tableWidthManuallyResized: false,
2491
2523
  timelineEndSeconds: '',
2492
2524
  timelineEvents: [],
2493
2525
  timelineFilterDescription: '',
@@ -2540,7 +2572,7 @@ const RenderFocusContext = 4;
2540
2572
  const RenderFocus = 5;
2541
2573
 
2542
2574
  const diff = (oldState, newState) => {
2543
- if (oldState.categoryFilters !== newState.categoryFilters || oldState.detailTabs !== newState.detailTabs || oldState.errorMessage !== newState.errorMessage || oldState.events !== newState.events || oldState.filterValue !== newState.filterValue || oldState.previewTextCursorColumnIndex !== newState.previewTextCursorColumnIndex || oldState.previewTextCursorRowIndex !== newState.previewTextCursorRowIndex || oldState.previewTextDeltaY !== newState.previewTextDeltaY || oldState.sessionId !== newState.sessionId || oldState.showEventStreamFinishedEvents !== newState.showEventStreamFinishedEvents || oldState.showInputEvents !== newState.showInputEvents || oldState.showResponsePartEvents !== newState.showResponsePartEvents || oldState.sortColumn !== newState.sortColumn || oldState.sortDescending !== newState.sortDescending || oldState.tableColumnWidths !== newState.tableColumnWidths || oldState.tableDeltaY !== newState.tableDeltaY || oldState.tableMaxLineY !== newState.tableMaxLineY || oldState.tableMinLineY !== newState.tableMinLineY || oldState.tableWidth !== newState.tableWidth || oldState.timelineEndSeconds !== newState.timelineEndSeconds || oldState.timelineHeight !== newState.timelineHeight || oldState.timelineHoverPercent !== newState.timelineHoverPercent || oldState.timelineHoverSeconds !== newState.timelineHoverSeconds || oldState.timelineSelectionActive !== newState.timelineSelectionActive || oldState.timelineSelectionAnchorSeconds !== newState.timelineSelectionAnchorSeconds || oldState.timelineSelectionFocusSeconds !== newState.timelineSelectionFocusSeconds || oldState.timelineStartSeconds !== newState.timelineStartSeconds || oldState.useDevtoolsLayout !== newState.useDevtoolsLayout || oldState.tableColumns !== newState.tableColumns || oldState.selectedEvent !== newState.selectedEvent || oldState.selectedEventIndex !== newState.selectedEventIndex || oldState.focus !== newState.focus || oldState.width !== newState.width || oldState.uid !== newState.uid) {
2575
+ if (oldState.categoryFilters !== newState.categoryFilters || oldState.collapsedHeaderSections !== newState.collapsedHeaderSections || oldState.detailTabs !== newState.detailTabs || oldState.errorMessage !== newState.errorMessage || oldState.events !== newState.events || oldState.filterValue !== newState.filterValue || oldState.previewTextCursorColumnIndex !== newState.previewTextCursorColumnIndex || oldState.previewTextCursorRowIndex !== newState.previewTextCursorRowIndex || oldState.previewTextDeltaY !== newState.previewTextDeltaY || oldState.summaries !== newState.summaries || oldState.sessionId !== newState.sessionId || oldState.showEventStreamFinishedEvents !== newState.showEventStreamFinishedEvents || oldState.showInputEvents !== newState.showInputEvents || oldState.showResponsePartEvents !== newState.showResponsePartEvents || oldState.sortColumn !== newState.sortColumn || oldState.sortDescending !== newState.sortDescending || oldState.tableDeltaY !== newState.tableDeltaY || oldState.tableMaxLineY !== newState.tableMaxLineY || oldState.tableMinLineY !== newState.tableMinLineY || oldState.tableWidth !== newState.tableWidth || oldState.timelineEndSeconds !== newState.timelineEndSeconds || oldState.timelineHeight !== newState.timelineHeight || oldState.timelineHoverPercent !== newState.timelineHoverPercent || oldState.timelineHoverSeconds !== newState.timelineHoverSeconds || oldState.timelineSelectionActive !== newState.timelineSelectionActive || oldState.timelineSelectionAnchorSeconds !== newState.timelineSelectionAnchorSeconds || oldState.timelineSelectionFocusSeconds !== newState.timelineSelectionFocusSeconds || oldState.timelineStartSeconds !== newState.timelineStartSeconds || oldState.useDevtoolsLayout !== newState.useDevtoolsLayout || oldState.tableColumns !== newState.tableColumns || oldState.selectedEvent !== newState.selectedEvent || oldState.selectedEventIndex !== newState.selectedEventIndex || oldState.focus !== newState.focus || oldState.width !== newState.width || oldState.uid !== newState.uid) {
2544
2576
  return [RenderIncremental, RenderCss];
2545
2577
  }
2546
2578
  return [];
@@ -2577,6 +2609,45 @@ const mergedEventType = 'tool-execution';
2577
2609
  const handleSubmitEventType = 'handle-submit';
2578
2610
  const sseResponseCompletedEventType = 'sse-response-completed';
2579
2611
 
2612
+ const encoder = new TextEncoder();
2613
+ const getEndValuePayload = event => {
2614
+ const {
2615
+ endValue
2616
+ } = event;
2617
+ return endValue?.value;
2618
+ };
2619
+ const getResponsePayload = event => {
2620
+ const endValuePayload = getEndValuePayload(event);
2621
+ if (endValuePayload !== undefined) {
2622
+ return endValuePayload;
2623
+ }
2624
+ if ('value' in event && event.value !== undefined) {
2625
+ return event.value;
2626
+ }
2627
+ if ('response' in event && event.response !== undefined) {
2628
+ return event.response;
2629
+ }
2630
+ return undefined;
2631
+ };
2632
+ const getPayloadText = payload => {
2633
+ if (typeof payload === 'string') {
2634
+ return payload;
2635
+ }
2636
+ const serialized = JSON.stringify(payload);
2637
+ return serialized ?? '';
2638
+ };
2639
+ const getResponsePayloadSize = event => {
2640
+ const payload = getResponsePayload(event);
2641
+ if (payload === undefined) {
2642
+ return 0;
2643
+ }
2644
+ try {
2645
+ return encoder.encode(getPayloadText(payload)).length;
2646
+ } catch {
2647
+ return 0;
2648
+ }
2649
+ };
2650
+
2580
2651
  const hasMatchingToolName = (startedEvent, finishedEvent) => {
2581
2652
  if (typeof startedEvent.toolName === 'string' && typeof finishedEvent.toolName === 'string') {
2582
2653
  return startedEvent.toolName === finishedEvent.toolName;
@@ -2682,7 +2753,8 @@ const mergeRequestResponseEvents = (startedEvent, finishedEvent) => {
2682
2753
  return {
2683
2754
  ...mergeToolExecutionEvents(startedEvent, finishedEvent, startedEvent.type),
2684
2755
  requestEvent: startedEvent,
2685
- responseEvent: finishedEvent
2756
+ responseEvent: finishedEvent,
2757
+ size: getResponsePayloadSize(finishedEvent)
2686
2758
  };
2687
2759
  };
2688
2760
  const isMatchingRequestResponsePair = (startedEvent, finishedEvent) => {
@@ -2788,37 +2860,46 @@ const matchesEventCategoryFilter = (event, eventCategoryFilters) => {
2788
2860
  const getFilteredEvents = (events, filterValue, eventCategoryFilters, showInputEvents, showResponsePartEvents, showEventStreamFinishedEvents) => {
2789
2861
  const visibleEvents = getVisibleEvents(events, showInputEvents, showResponsePartEvents, showEventStreamFinishedEvents);
2790
2862
  const collapsedEvents = collapseToolExecutionEvents(visibleEvents);
2791
- const parsedFilter = parseFilterValue(filterValue);
2792
- const activeEventCategoryFilters = parsedFilter.eventCategoryFilter === All$1 ? eventCategoryFilters : [parsedFilter.eventCategoryFilter];
2793
- const filteredByCategory = collapsedEvents.filter(event => matchesEventCategoryFilter(event, activeEventCategoryFilters));
2794
- const {
2795
- filterText
2796
- } = parsedFilter;
2863
+ const filteredByCategory = collapsedEvents.filter(event => matchesEventCategoryFilter(event, eventCategoryFilters));
2864
+ const filterText = filterValue.trim().toLowerCase();
2797
2865
  if (!filterText) {
2798
2866
  return filteredByCategory;
2799
2867
  }
2800
2868
  return filteredByCategory.filter(event => JSON.stringify(event).toLowerCase().includes(filterText));
2801
2869
  };
2802
2870
 
2871
+ const formatDurationSeconds = value => {
2872
+ return `${value.toFixed(1)}s`;
2873
+ };
2874
+
2875
+ const formatDurationText = durationMs => {
2876
+ if (durationMs >= 1000) {
2877
+ return formatDurationSeconds(durationMs / 1000);
2878
+ }
2879
+ return `${durationMs}ms`;
2880
+ };
2803
2881
  const getDurationText = event => {
2804
2882
  if (event.time) {
2805
2883
  return event.time;
2806
2884
  }
2807
2885
  const explicitDuration = event.durationMs ?? event.duration;
2808
2886
  if (typeof explicitDuration === 'number' && Number.isFinite(explicitDuration)) {
2809
- return `${explicitDuration}ms`;
2887
+ return formatDurationText(explicitDuration);
2810
2888
  }
2811
2889
  const start = toTimeNumber(event.started ?? event.startTime ?? event.startTimestamp ?? event.timestamp);
2812
2890
  const end = toTimeNumber(event.ended ?? event.endTime ?? event.endTimestamp ?? event.timestamp);
2813
2891
  if (start === undefined || end === undefined || end < start) {
2814
2892
  return '-';
2815
2893
  }
2816
- return `${end - start}ms`;
2894
+ return formatDurationText(end - start);
2817
2895
  };
2818
2896
 
2819
2897
  const getEventTableDurationText = event => {
2820
2898
  const durationText = getDurationText(event);
2821
2899
  if (!durationText.endsWith('ms')) {
2900
+ if (durationText.endsWith('s')) {
2901
+ return `${durationText.slice(0, -1)} s`;
2902
+ }
2822
2903
  return durationText;
2823
2904
  }
2824
2905
  return `${durationText.slice(0, -2)} ms`;
@@ -2968,10 +3049,22 @@ const sortEventsByTableColumn = (events, sortColumn, sortDescending) => {
2968
3049
  };
2969
3050
 
2970
3051
  const getCurrentEvents$1 = state => {
2971
- const eventCategoryFilters = getSelectedEventCategoryFilters(state.categoryFilters);
2972
- const filteredEvents = getFilteredEvents(state.events, state.filterValue, eventCategoryFilters, state.showInputEvents, state.showResponsePartEvents, state.showEventStreamFinishedEvents);
2973
- const timelineEvents = filterEventsByTimelineRange(filteredEvents, state.timelineStartSeconds, state.timelineEndSeconds);
2974
- return sortEventsByTableColumn(timelineEvents, state.sortColumn, state.sortDescending);
3052
+ const {
3053
+ categoryFilters,
3054
+ events,
3055
+ filterValue,
3056
+ showEventStreamFinishedEvents,
3057
+ showInputEvents,
3058
+ showResponsePartEvents,
3059
+ sortColumn,
3060
+ sortDescending,
3061
+ timelineEndSeconds,
3062
+ timelineStartSeconds
3063
+ } = state;
3064
+ const eventCategoryFilters = getSelectedEventCategoryFilters(categoryFilters);
3065
+ const filteredEvents = getFilteredEvents(events, filterValue, eventCategoryFilters, showInputEvents, showResponsePartEvents, showEventStreamFinishedEvents);
3066
+ const timelineEvents = filterEventsByTimelineRange(filteredEvents, timelineStartSeconds, timelineEndSeconds);
3067
+ return sortEventsByTableColumn(timelineEvents, sortColumn, sortDescending);
2975
3068
  };
2976
3069
 
2977
3070
  const getCurrentEvents = state => getCurrentEvents$1(state);
@@ -2994,6 +3087,8 @@ const loadSelectedEvent = async ({
2994
3087
  sessionId,
2995
3088
  type
2996
3089
  }) => {
3090
+ // TODO load them in parallel
3091
+ // or adjust worker function to load both start and end event
2997
3092
  const raw = await loadSelectedEvent$1(sessionId, eventId, type);
2998
3093
  if (endEventId && endEventId !== -1) {
2999
3094
  const end = await loadSelectedEvent$1(sessionId, endEventId, type);
@@ -3308,7 +3403,7 @@ const selectEventAtIndex = async (state, selectedEventIndex) => {
3308
3403
  type: selectedEvent.type
3309
3404
  });
3310
3405
  const resolvedSelectedEvent = await withPreparedSelectedEventPreview(mergeSelectedEventDetails(selectedEvent, selectedEventDetails));
3311
- return withSelectedEventVisible({
3406
+ const nextState = {
3312
3407
  ...state,
3313
3408
  detailTabs: createDetailTabs(selectedDetailTab, resolvedSelectedEvent),
3314
3409
  previewTextCursorColumnIndex: null,
@@ -3319,6 +3414,10 @@ const selectEventAtIndex = async (state, selectedEventIndex) => {
3319
3414
  selectedEvent: resolvedSelectedEvent,
3320
3415
  selectedEventId: selectedEvent.eventId,
3321
3416
  selectedEventIndex
3417
+ };
3418
+ return withSelectedEventVisible({
3419
+ ...nextState,
3420
+ tableWidth: shouldUseBalancedSplitTableWidth(nextState) ? getBalancedSplitTableWidth(nextState) : state.tableWidth
3322
3421
  });
3323
3422
  };
3324
3423
 
@@ -3379,36 +3478,17 @@ const getMenuEntriesTableBody = props => {
3379
3478
  }];
3380
3479
  };
3381
3480
 
3382
- const getColumnVisibilityFlags = (tableColumns, column) => {
3383
- return isVisibleTableColumn(tableColumns, column) ? Checked : Unchecked;
3481
+ const getColumnMenuEntry = (columnName, label, isVisible) => {
3482
+ return {
3483
+ args: [columnName],
3484
+ command: 'ChatDebug.toggleTableColumnVisibility',
3485
+ flags: isVisible ? Checked : Unchecked,
3486
+ id: columnName,
3487
+ label
3488
+ };
3384
3489
  };
3385
-
3386
3490
  const getMenuEntriesTableHeader = state => {
3387
- return [{
3388
- args: [Type],
3389
- command: 'ChatDebug.toggleTableColumnVisibility',
3390
- flags: getColumnVisibilityFlags(state.tableColumns, Type),
3391
- id: 'type',
3392
- label: type()
3393
- }, {
3394
- args: [Status$1],
3395
- command: 'ChatDebug.toggleTableColumnVisibility',
3396
- flags: getColumnVisibilityFlags(state.tableColumns, Status$1),
3397
- id: 'status',
3398
- label: status()
3399
- }, {
3400
- args: [Size],
3401
- command: 'ChatDebug.toggleTableColumnVisibility',
3402
- flags: getColumnVisibilityFlags(state.tableColumns, Size),
3403
- id: 'size',
3404
- label: size()
3405
- }, {
3406
- args: [Duration],
3407
- command: 'ChatDebug.toggleTableColumnVisibility',
3408
- flags: getColumnVisibilityFlags(state.tableColumns, Duration),
3409
- id: 'duration',
3410
- label: duration()
3411
- }, {
3491
+ return [...state.tableColumns.map(column => getColumnMenuEntry(column.name, column.label, column.isVisible)), {
3412
3492
  args: [],
3413
3493
  command: 'ChatDebug.resetTableColumns',
3414
3494
  flags: None$1,
@@ -3487,12 +3567,10 @@ const getMenuIds = () => {
3487
3567
  return [MenuChatDebugTableHeader, MenuChatDebugTableBody, 556, 557];
3488
3568
  };
3489
3569
 
3490
- const ParseChatDebugUriErrorCode = {
3491
- InvalidSessionId: 1,
3492
- InvalidUriEncoding: 2,
3493
- InvalidUriFormat: 3,
3494
- MissingUri: 4
3495
- };
3570
+ const InvalidSessionId = 1;
3571
+ const InvalidUriEncoding = 2;
3572
+ const InvalidUriFormat = 3;
3573
+ const MissingUri = 4;
3496
3574
 
3497
3575
  const ParseChatDebugUriResultType = {
3498
3576
  Error: 2,
@@ -3504,7 +3582,7 @@ const invalidSessionIdPattern = /[/?#]/;
3504
3582
  const parseChatDebugUri = uri => {
3505
3583
  if (!uri) {
3506
3584
  return {
3507
- code: ParseChatDebugUriErrorCode.MissingUri,
3585
+ code: MissingUri,
3508
3586
  message: missingUri(),
3509
3587
  type: ParseChatDebugUriResultType.Error
3510
3588
  };
@@ -3512,7 +3590,7 @@ const parseChatDebugUri = uri => {
3512
3590
  const match = uri.match(chatDebugUriPattern);
3513
3591
  if (!match) {
3514
3592
  return {
3515
- code: ParseChatDebugUriErrorCode.InvalidUriFormat,
3593
+ code: InvalidUriFormat,
3516
3594
  message: invalidUriFormat(),
3517
3595
  type: ParseChatDebugUriResultType.Error
3518
3596
  };
@@ -3523,14 +3601,14 @@ const parseChatDebugUri = uri => {
3523
3601
  sessionId = decodeURIComponent(encodedSessionId);
3524
3602
  } catch {
3525
3603
  return {
3526
- code: ParseChatDebugUriErrorCode.InvalidUriEncoding,
3604
+ code: InvalidUriEncoding,
3527
3605
  message: invalidUriEncoding(),
3528
3606
  type: ParseChatDebugUriResultType.Error
3529
3607
  };
3530
3608
  }
3531
3609
  if (!sessionId || invalidSessionIdPattern.test(sessionId)) {
3532
3610
  return {
3533
- code: ParseChatDebugUriErrorCode.InvalidSessionId,
3611
+ code: InvalidSessionId,
3534
3612
  message: invalidSessionId(),
3535
3613
  type: ParseChatDebugUriResultType.Error
3536
3614
  };
@@ -3550,7 +3628,7 @@ const getSessionIdFromUri = state => {
3550
3628
  };
3551
3629
 
3552
3630
  const getInvalidUriMessage = (uri, code) => {
3553
- if (code === ParseChatDebugUriErrorCode.MissingUri) {
3631
+ if (code === MissingUri) {
3554
3632
  return unableToLoadDebugSessionMissingUri();
3555
3633
  }
3556
3634
  return unableToLoadDebugSessionInvalidUri(uri);
@@ -3569,6 +3647,49 @@ const getEffectiveTimelineRange = (timelineStartSeconds, timelineEndSeconds, tim
3569
3647
  };
3570
3648
  };
3571
3649
 
3650
+ const formatTimelineMilliseconds = value => {
3651
+ return `${Math.round(value * 1000)}ms`;
3652
+ };
3653
+
3654
+ const formatTimelineSeconds = value => {
3655
+ if (Number.isInteger(value)) {
3656
+ return `${value}s`;
3657
+ }
3658
+ return `${Number(value.toFixed(1))}s`;
3659
+ };
3660
+
3661
+ const getEndTime = event => {
3662
+ return event.ended ?? event.endTime ?? event.timestamp;
3663
+ };
3664
+
3665
+ const getStartTime = event => {
3666
+ return event.started ?? event.startTime ?? event.timestamp;
3667
+ };
3668
+
3669
+ const formatTableSummaryDuration = durationMs => {
3670
+ if (durationMs < 1000) {
3671
+ return formatTimelineMilliseconds(durationMs / 1000);
3672
+ }
3673
+ return formatTimelineSeconds(durationMs / 1000);
3674
+ };
3675
+ const getTableSummaries = events => {
3676
+ let minStart = Number.POSITIVE_INFINITY;
3677
+ let maxEnd = Number.NEGATIVE_INFINITY;
3678
+ for (const event of events) {
3679
+ const startTime = toTimeNumber(getStartTime(event));
3680
+ const endTime = toTimeNumber(getEndTime(event));
3681
+ if (typeof startTime === 'number' && Number.isFinite(startTime)) {
3682
+ minStart = Math.min(minStart, startTime);
3683
+ }
3684
+ if (typeof endTime === 'number' && Number.isFinite(endTime)) {
3685
+ maxEnd = Math.max(maxEnd, endTime);
3686
+ }
3687
+ }
3688
+ const durationMs = Number.isFinite(minStart) && Number.isFinite(maxEnd) ? Math.max(0, maxEnd - minStart) : 0;
3689
+ const duration = formatTableSummaryDuration(durationMs);
3690
+ return [tableSummaryRequests(events.length), tableSummaryFinish(duration)];
3691
+ };
3692
+
3572
3693
  const getTimelineEvents = state => {
3573
3694
  const {
3574
3695
  events,
@@ -3601,12 +3722,16 @@ const getStateWithTimelineInfo = state => {
3601
3722
  const effectiveRange = getEffectiveTimelineRange(state.timelineStartSeconds, state.timelineEndSeconds, state.timelineSelectionActive, state.timelineSelectionAnchorSeconds, state.timelineSelectionFocusSeconds);
3602
3723
  const timelineInfo = getTimelineInfo(timelineEvents, effectiveRange.startSeconds, effectiveRange.endSeconds);
3603
3724
  const timelineFilterDescription = getTimelineFilterDescription(state.timelineStartSeconds, state.timelineEndSeconds);
3604
- return {
3725
+ const nextState = {
3605
3726
  ...state,
3606
3727
  timelineEvents,
3607
3728
  timelineFilterDescription,
3608
3729
  timelineInfo
3609
3730
  };
3731
+ return {
3732
+ ...nextState,
3733
+ summaries: getTableSummaries(getCurrentEvents$1(nextState))
3734
+ };
3610
3735
  };
3611
3736
 
3612
3737
  const getStateWithInvalidUri = state => {
@@ -3676,7 +3801,7 @@ const getMergedRequestResponseEvent = (item, response) => {
3676
3801
  eventEndId: response.eventId,
3677
3802
  eventId: item.eventId,
3678
3803
  method: 'POST',
3679
- size: 0,
3804
+ size: getResponsePayloadSize(response),
3680
3805
  ...(started === undefined ? {} : {
3681
3806
  started
3682
3807
  }),
@@ -3693,7 +3818,7 @@ const getMergedRequestResponseEvent = (item, response) => {
3693
3818
  eventEndId: response.eventId,
3694
3819
  eventId: item.eventId,
3695
3820
  method: 'POST',
3696
- size: 0,
3821
+ size: getResponsePayloadSize(response),
3697
3822
  ...(started === undefined ? {} : {
3698
3823
  started
3699
3824
  }),
@@ -3744,7 +3869,10 @@ const listChatViewEvents = async (sessionId, _databaseName, _dataBaseVersion, _e
3744
3869
  };
3745
3870
 
3746
3871
  const restoreSelectedEvent = async state => {
3747
- if (state.selectedEventId === null) {
3872
+ const {
3873
+ selectedEventId
3874
+ } = state;
3875
+ if (selectedEventId === null) {
3748
3876
  return {
3749
3877
  ...state,
3750
3878
  previewTextCursorColumnIndex: null,
@@ -3845,11 +3973,14 @@ const loadEventsForSessionId = async (state, sessionId) => {
3845
3973
  };
3846
3974
 
3847
3975
  const refreshEvents = async state => {
3848
- const sessionId = state.sessionId || getSessionIdFromUri(state);
3849
- if (!sessionId) {
3976
+ const {
3977
+ sessionId
3978
+ } = state;
3979
+ const actual = sessionId || getSessionIdFromUri(state);
3980
+ if (!actual) {
3850
3981
  return getStateWithInvalidUri(state);
3851
3982
  }
3852
- return loadEventsForSessionId(state, sessionId);
3983
+ return loadEventsForSessionId(state, actual);
3853
3984
  };
3854
3985
 
3855
3986
  const refresh = async state => {
@@ -3904,6 +4035,9 @@ const handleEscape = state => {
3904
4035
  };
3905
4036
 
3906
4037
  const getEventIndexByStableId$1 = (events, event) => {
4038
+ if (typeof event.eventId !== 'number') {
4039
+ return -1;
4040
+ }
3907
4041
  return events.findIndex(candidate => candidate.eventId === event.eventId);
3908
4042
  };
3909
4043
 
@@ -3995,6 +4129,28 @@ const getBoolean = value => {
3995
4129
  return value === true || value === 'true' || value === 'on' || value === '1';
3996
4130
  };
3997
4131
 
4132
+ const General = 'general';
4133
+ const RequestHeaders = 'requestHeaders';
4134
+ const ResponseHeaders = 'responseHeaders';
4135
+ const headerSectionKeys = [General, ResponseHeaders, RequestHeaders];
4136
+ const isHeaderSectionKey = value => {
4137
+ return headerSectionKeys.includes(value);
4138
+ };
4139
+
4140
+ const removeSection = (collapsedHeaderSections, section) => {
4141
+ return collapsedHeaderSections.filter(value => value !== section);
4142
+ };
4143
+ const toggleHeadersSection = (state, value) => {
4144
+ if (!isHeaderSectionKey(value)) {
4145
+ return state;
4146
+ }
4147
+ const isCollapsed = state.collapsedHeaderSections.includes(value);
4148
+ return {
4149
+ ...state,
4150
+ collapsedHeaderSections: isCollapsed ? removeSection(state.collapsedHeaderSections, value) : [...state.collapsedHeaderSections, value]
4151
+ };
4152
+ };
4153
+
3998
4154
  const parseTimelineRangePreset$1 = value => {
3999
4155
  if (!value) {
4000
4156
  return {
@@ -4009,6 +4165,9 @@ const parseTimelineRangePreset$1 = value => {
4009
4165
  };
4010
4166
  };
4011
4167
  const getEventIndexByStableId = (events, event) => {
4168
+ if (typeof event.eventId !== 'number') {
4169
+ return -1;
4170
+ }
4012
4171
  return events.findIndex(candidate => candidate.eventId === event.eventId);
4013
4172
  };
4014
4173
  const getSelectedEventIndex = state => {
@@ -4106,7 +4265,7 @@ const handleUseDevtoolsLayout = (state, _value, checked) => {
4106
4265
  const useDevtoolsLayout = getBoolean(checked);
4107
4266
  const selectedEventIndex = useDevtoolsLayout ? getSelectedEventIndex(state) : null;
4108
4267
  const hasSelectedEvent = useDevtoolsLayout && selectedEventIndex !== null;
4109
- return applyVirtualTableState({
4268
+ const nextState = {
4110
4269
  ...state,
4111
4270
  previewTextCursorColumnIndex: hasSelectedEvent ? state.previewTextCursorColumnIndex : null,
4112
4271
  previewTextCursorRowIndex: hasSelectedEvent ? state.previewTextCursorRowIndex : null,
@@ -4114,6 +4273,10 @@ const handleUseDevtoolsLayout = (state, _value, checked) => {
4114
4273
  selectedEventId: hasSelectedEvent ? state.selectedEventId : null,
4115
4274
  selectedEventIndex,
4116
4275
  useDevtoolsLayout
4276
+ };
4277
+ return applyVirtualTableState({
4278
+ ...nextState,
4279
+ tableWidth: shouldUseBalancedSplitTableWidth(nextState) ? getBalancedSplitTableWidth(nextState) : state.tableWidth
4117
4280
  });
4118
4281
  };
4119
4282
  const handleSelectedEventIndex = (state, value) => {
@@ -4164,6 +4327,9 @@ const handleDetailTab = (state, value) => {
4164
4327
  detailTabs
4165
4328
  };
4166
4329
  };
4330
+ const handleToggleHeadersSection = (state, value) => {
4331
+ return toggleHeadersSection(state, value);
4332
+ };
4167
4333
  const inputHandlers = {
4168
4334
  [CloseDetails$1]: handleCloseDetails,
4169
4335
  [DetailTab]: handleDetailTab,
@@ -4176,6 +4342,7 @@ const inputHandlers = {
4176
4342
  [TimelineEndSeconds]: handleTimelineEndSeconds$1,
4177
4343
  [TimelineRangePreset]: handleTimelineRangePreset$1,
4178
4344
  [TimelineStartSeconds]: handleTimelineStartSeconds$1,
4345
+ [ToggleHeadersSection]: handleToggleHeadersSection,
4179
4346
  [UseDevtoolsLayout]: handleUseDevtoolsLayout
4180
4347
  };
4181
4348
  const handleInput = (state, name, value, checked) => {
@@ -4278,9 +4445,6 @@ const getPayloadObject = (event, name) => {
4278
4445
  };
4279
4446
  };
4280
4447
  const getPayloadEvent = event => {
4281
- if (event && event.type === 'ai-request') {
4282
- return event.body;
4283
- }
4284
4448
  const {
4285
4449
  requestEvent
4286
4450
  } = event;
@@ -4288,6 +4452,9 @@ const getPayloadEvent = event => {
4288
4452
  if (mergedRequestPayloadEvent.found) {
4289
4453
  return mergedRequestPayloadEvent.value;
4290
4454
  }
4455
+ if (event && event.type === 'ai-request') {
4456
+ return event.body;
4457
+ }
4291
4458
  const name = getPreviewName(event);
4292
4459
  if (name === 'list_files' && hasOwn(event, 'arguments')) {
4293
4460
  return event.arguments;
@@ -4307,57 +4474,75 @@ const isChatMessageUpdatedEvent = event => {
4307
4474
  return event.type === 'chat-message-updated';
4308
4475
  };
4309
4476
 
4477
+ const getObjectValue = value => {
4478
+ if (!value || typeof value !== 'object') {
4479
+ return undefined;
4480
+ }
4481
+ return value;
4482
+ };
4310
4483
  const getResponseContentText = content => {
4311
- if (!content || typeof content !== 'object') {
4484
+ const contentObject = getObjectValue(content);
4485
+ if (!contentObject) {
4312
4486
  return undefined;
4313
4487
  }
4314
4488
  if (Array.isArray(content)) {
4315
4489
  const [firstContentItem] = content;
4316
- if (!firstContentItem || typeof firstContentItem !== 'object') {
4490
+ const firstContentItemObject = getObjectValue(firstContentItem);
4491
+ if (!firstContentItemObject) {
4317
4492
  return undefined;
4318
4493
  }
4319
4494
  const {
4320
4495
  text
4321
- } = firstContentItem;
4496
+ } = firstContentItemObject;
4322
4497
  return typeof text === 'string' ? text : undefined;
4323
4498
  }
4324
4499
  const {
4325
4500
  text
4326
- } = content;
4501
+ } = contentObject;
4327
4502
  return typeof text === 'string' ? text : undefined;
4328
4503
  };
4329
- const getResponseOutput = event => {
4330
- if (event.type === 'sse-response-completed') {
4331
- const {
4332
- value
4333
- } = event;
4334
- if (!value || typeof value !== 'object') {
4335
- return undefined;
4336
- }
4337
- const {
4338
- response
4339
- } = value;
4340
- if (!response || typeof response !== 'object') {
4341
- return undefined;
4342
- }
4343
- const {
4344
- output
4345
- } = response;
4346
- return Array.isArray(output) ? output : undefined;
4504
+ const getOutput = value => {
4505
+ const valueObject = getObjectValue(value);
4506
+ if (!valueObject) {
4507
+ return undefined;
4347
4508
  }
4348
- if (event.type === 'ai-response') {
4349
- const {
4350
- value
4351
- } = event;
4352
- if (!value || typeof value !== 'object') {
4509
+ const {
4510
+ output
4511
+ } = valueObject;
4512
+ return Array.isArray(output) ? output : undefined;
4513
+ };
4514
+ const getAiRequestResponseOutput = event => {
4515
+ const {
4516
+ endValue
4517
+ } = event;
4518
+ const endValueObject = getObjectValue(endValue);
4519
+ if (!endValueObject) {
4520
+ return undefined;
4521
+ }
4522
+ return getOutput(endValueObject.value);
4523
+ };
4524
+ const getCompletedResponseOutput = event => {
4525
+ const valueObject = getObjectValue(event.value);
4526
+ if (!valueObject) {
4527
+ return undefined;
4528
+ }
4529
+ const responseObject = getObjectValue(valueObject.response);
4530
+ if (!responseObject) {
4531
+ return undefined;
4532
+ }
4533
+ return getOutput(responseObject);
4534
+ };
4535
+ const getResponseOutput = event => {
4536
+ switch (event.type) {
4537
+ case 'ai-request':
4538
+ return getAiRequestResponseOutput(event);
4539
+ case 'ai-response':
4540
+ return getOutput(event.value);
4541
+ case 'sse-response-completed':
4542
+ return getCompletedResponseOutput(event);
4543
+ default:
4353
4544
  return undefined;
4354
- }
4355
- const {
4356
- output
4357
- } = value;
4358
- return Array.isArray(output) ? output : undefined;
4359
4545
  }
4360
- return undefined;
4361
4546
  };
4362
4547
  const getResponsePreviewText = event => {
4363
4548
  const output = getResponseOutput(event);
@@ -4365,12 +4550,13 @@ const getResponsePreviewText = event => {
4365
4550
  return undefined;
4366
4551
  }
4367
4552
  const [firstOutput] = output;
4368
- if (!firstOutput || typeof firstOutput !== 'object') {
4553
+ const firstOutputObject = getObjectValue(firstOutput);
4554
+ if (!firstOutputObject) {
4369
4555
  return undefined;
4370
4556
  }
4371
4557
  const {
4372
4558
  content
4373
- } = firstOutput;
4559
+ } = firstOutputObject;
4374
4560
  return getResponseContentText(content);
4375
4561
  };
4376
4562
  const getPreviewMessageText = event => {
@@ -4514,9 +4700,6 @@ const getPreviewEvent = event => {
4514
4700
 
4515
4701
  const previewTextRowHeight = 20;
4516
4702
  const defaultPreviewTextColumnWidth = 9;
4517
- const clamp = (value, min, max) => {
4518
- return Math.min(Math.max(value, min), max);
4519
- };
4520
4703
  const getPreviewTextCursorFromPoint = (value, x, y) => {
4521
4704
  const lines = value.split('\n');
4522
4705
  const rowIndex = clamp(Math.floor(Math.max(y, 0) / previewTextRowHeight), 0, Math.max(lines.length - 1, 0));
@@ -4737,7 +4920,8 @@ const handleSashPointerMove = (state, eventX, eventY) => {
4737
4920
  }
4738
4921
  return {
4739
4922
  ...state,
4740
- tableWidth: getTableWidthFromClientX(state, eventX)
4923
+ tableWidth: getTableWidthFromClientX(state, eventX),
4924
+ tableWidthManuallyResized: true
4741
4925
  };
4742
4926
  };
4743
4927
 
@@ -4804,7 +4988,7 @@ const handleTableResizerPointerMove = (state, clientX) => {
4804
4988
  }
4805
4989
  return {
4806
4990
  ...state,
4807
- tableColumnWidths: getResizedTableColumnWidths(state, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths, clientX, state.tableResizerDownId)
4991
+ tableColumns: getResizedTableColumnWidths(state, getVisibleTableColumns(state.tableColumns), state.tableColumns, clientX, state.tableResizerDownId)
4808
4992
  };
4809
4993
  };
4810
4994
 
@@ -5143,17 +5327,22 @@ const handleTimelinePointerUp = (state, eventX) => {
5143
5327
  const setUseDevtoolsLayout = (state, checked) => {
5144
5328
  const useDevtoolsLayout = getBoolean(checked);
5145
5329
  const selectedEventIndex = useDevtoolsLayout ? getSelectedEventIndex$1(state) : null;
5146
- return applyVirtualTableState({
5330
+ const hasSelectedEvent = useDevtoolsLayout && selectedEventIndex !== null;
5331
+ const nextState = {
5147
5332
  ...state,
5148
- previewTextCursorColumnIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorColumnIndex : null,
5149
- previewTextCursorRowIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorRowIndex : null,
5150
- previewTextDeltaY: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextDeltaY : 0,
5333
+ previewTextCursorColumnIndex: hasSelectedEvent ? state.previewTextCursorColumnIndex : null,
5334
+ previewTextCursorRowIndex: hasSelectedEvent ? state.previewTextCursorRowIndex : null,
5335
+ previewTextDeltaY: hasSelectedEvent ? state.previewTextDeltaY : 0,
5151
5336
  previewTextScrollBarHandleOffset: 0,
5152
5337
  previewTextScrollBarPointerActive: false,
5153
- selectedEvent: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEvent : null,
5154
- selectedEventId: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEventId : null,
5338
+ selectedEvent: hasSelectedEvent ? state.selectedEvent : null,
5339
+ selectedEventId: hasSelectedEvent ? state.selectedEventId : null,
5155
5340
  selectedEventIndex,
5156
5341
  useDevtoolsLayout
5342
+ };
5343
+ return applyVirtualTableState({
5344
+ ...nextState,
5345
+ tableWidth: shouldUseBalancedSplitTableWidth(nextState) ? getBalancedSplitTableWidth(nextState) : state.tableWidth
5157
5346
  });
5158
5347
  };
5159
5348
 
@@ -5194,7 +5383,8 @@ const loadEventsFromUri = async state => {
5194
5383
 
5195
5384
  const loadContent = async (state, savedState) => {
5196
5385
  await getPreference('chatDebug.autoRefresh');
5197
- const nextState = await loadEventsFromUri(restoreSavedState(state, savedState));
5386
+ const restoredState = restoreSavedState(state, savedState);
5387
+ const nextState = await loadEventsFromUri(restoredState);
5198
5388
  if (nextState.sessionId) {
5199
5389
  try {
5200
5390
  await registerUpdateListener(nextState.sessionId, rpcId, nextState.uid);
@@ -5299,7 +5489,7 @@ const getCss = state => {
5299
5489
  if (state.width >= state.largeBreakpoint) {
5300
5490
  topSize = 30;
5301
5491
  }
5302
- const tableColumnLayout = getTableColumnLayout(tableContentWidth, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths);
5492
+ const tableColumnLayout = getTableColumnLayout(tableContentWidth, getVisibleTableColumns(state.tableColumns), state.tableColumns);
5303
5493
  const [tableColZeroWidth = 0, tableColOneWidth = 0, tableColTwoWidth = 0, tableColThreeWidth = 0, tableColFourWidth = 0] = tableColumnLayout.visibleColumnWidths;
5304
5494
  const resizerOneLeft = tableColumnLayout.resizerLefts[0] ?? 0;
5305
5495
  const resizerTwoLeft = tableColumnLayout.resizerLefts[1] ?? 0;
@@ -5324,7 +5514,7 @@ const getCss = state => {
5324
5514
  --ChatDebugViewPreviewScrollBarWidth: ${previewVirtualization.showScrollBar ? devtoolsTableScrollBarWidth : 0}px;
5325
5515
  --ChatDebugViewPreviewViewportHeight: ${previewVirtualization.viewportHeight}px;
5326
5516
  --ChatDebugViewDetailsWidth: ${detailsWidth}px;
5327
- --ChatDebugViewDurationColumnWidth: ${state.tableColumnWidths.duration}px;
5517
+ --ChatDebugViewDurationColumnWidth: ${getTableColumnWidth(state.tableColumns, Duration)}px;
5328
5518
  --ChatDebugViewTableRowHeight: ${devtoolsTableRowHeight}px;
5329
5519
  --ChatDebugViewTableScrollBarHeight: ${scrollBarHeight}px;
5330
5520
  --ChatDebugViewTableScrollBarOffset: ${scrollBarOffset}px;
@@ -5340,7 +5530,7 @@ const getCss = state => {
5340
5530
  --ChatDebugViewTimelineSelectionEndLeft: ${selectionEndPercent ?? 0}%;
5341
5531
  --ChatDebugViewTimelineSelectionStartLeft: ${selectionStartPercent ?? 0}%;
5342
5532
  --ChatDebugViewTopSize: ${topSize}px;
5343
- --ChatDebugViewTypeColumnWidth: ${state.tableColumnWidths.type}px;
5533
+ --ChatDebugViewTypeColumnWidth: ${getTableColumnWidth(state.tableColumns, Type)}px;
5344
5534
  padding: ${state.viewPadding}px;
5345
5535
  padding-right: 0;
5346
5536
  }
@@ -5460,14 +5650,26 @@ const getCss = state => {
5460
5650
  }
5461
5651
 
5462
5652
  .ChatDebugViewHeadersSectionHeading {
5653
+ align-items: center;
5654
+ background: transparent;
5655
+ border: 0;
5463
5656
  color: var(--vscode-descriptionForeground, rgba(255, 255, 255, 0.7));
5657
+ cursor: pointer;
5658
+ display: flex;
5464
5659
  font-size: 11px;
5465
5660
  font-weight: 600;
5661
+ justify-content: flex-start;
5466
5662
  letter-spacing: 0.08em;
5467
5663
  margin-bottom: 6px;
5664
+ padding: 0;
5665
+ text-align: left;
5468
5666
  text-transform: uppercase;
5469
5667
  }
5470
5668
 
5669
+ .ChatDebugViewHeadersSectionHeading:hover {
5670
+ color: var(--vscode-editor-foreground);
5671
+ }
5672
+
5471
5673
  .ChatDebugViewHeadersRow {
5472
5674
  display: grid;
5473
5675
  grid-template-columns: minmax(0, 38%) minmax(0, 1fr);
@@ -5493,6 +5695,14 @@ const getCss = state => {
5493
5695
  .ChatDebugViewHeadersCellName {
5494
5696
  font-weight: 500;
5495
5697
  }
5698
+
5699
+ .ChatDebugViewHeadersSectionInfo {
5700
+ color: var(--vscode-descriptionForeground, rgba(255, 255, 255, 0.7));
5701
+ font-size: 11px;
5702
+ line-height: 1.4;
5703
+ margin-top: 8px;
5704
+ }
5705
+
5496
5706
  .PreviewVirtualizedEditor {
5497
5707
  height: var(--ChatDebugViewPreviewViewportHeight);
5498
5708
  overflow: hidden;
@@ -5900,6 +6110,7 @@ const ChatDebugViewHeadersRowEven = 'ChatDebugViewHeadersRowEven';
5900
6110
  const ChatDebugViewHeadersRowOdd = 'ChatDebugViewHeadersRowOdd';
5901
6111
  const ChatDebugViewHeadersSection = 'ChatDebugViewHeadersSection';
5902
6112
  const ChatDebugViewHeadersSectionHeading = 'ChatDebugViewHeadersSectionHeading';
6113
+ const ChatDebugViewHeadersSectionInfo = 'ChatDebugViewHeadersSectionInfo';
5903
6114
  const ChatDebugViewHeadersTable = 'ChatDebugViewHeadersTable';
5904
6115
  const ChatDebugViewDevtoolsSplit = 'ChatDebugViewDevtoolsSplit';
5905
6116
  const ChatDebugViewEmpty = 'ChatDebugViewEmpty';
@@ -6336,9 +6547,7 @@ const formatHttpStatusCode = value => {
6336
6547
  const isHeadersRecord = value => {
6337
6548
  return typeof value === 'object' && value !== null && !Array.isArray(value);
6338
6549
  };
6339
- const isNonEmptyString = value => {
6340
- return typeof value === 'string' && value.length > 0;
6341
- };
6550
+
6342
6551
  const getStatusCodeValue = selectedEvent => {
6343
6552
  if (!selectedEvent) {
6344
6553
  return undefined;
@@ -6355,6 +6564,36 @@ const getStatusCodeValue = selectedEvent => {
6355
6564
  }
6356
6565
  return undefined;
6357
6566
  };
6567
+
6568
+ const isNonEmptyString = value => {
6569
+ return typeof value === 'string' && value.length > 0;
6570
+ };
6571
+
6572
+ const getGeneralEntries = selectedEvent => {
6573
+ if (!selectedEvent) {
6574
+ return [];
6575
+ }
6576
+ const entries = [];
6577
+ if (isNonEmptyString(selectedEvent.url)) {
6578
+ entries.push([requestUrl(), selectedEvent.url]);
6579
+ }
6580
+ if (isNonEmptyString(selectedEvent.method)) {
6581
+ entries.push([requestMethod(), selectedEvent.method]);
6582
+ }
6583
+ const statusCode$1 = getStatusCodeValue(selectedEvent);
6584
+ if (statusCode$1 !== undefined && statusCode$1 !== '') {
6585
+ entries.push([statusCode(), formatHttpStatusCode(statusCode$1)]);
6586
+ }
6587
+ return entries;
6588
+ };
6589
+
6590
+ const getHeaders = value => {
6591
+ if (!isHeadersRecord(value)) {
6592
+ return [];
6593
+ }
6594
+ return Object.entries(value);
6595
+ };
6596
+
6358
6597
  const stringifyHeaderValue = value => {
6359
6598
  try {
6360
6599
  return JSON.stringify(value, (_key, nestedValue) => {
@@ -6367,6 +6606,7 @@ const stringifyHeaderValue = value => {
6367
6606
  return '[unserializable]';
6368
6607
  }
6369
6608
  };
6609
+
6370
6610
  const getHeaderValueText = value => {
6371
6611
  if (typeof value === 'string') {
6372
6612
  return value;
@@ -6388,29 +6628,7 @@ const getHeaderValueText = value => {
6388
6628
  }
6389
6629
  return stringifyHeaderValue(value);
6390
6630
  };
6391
- const getHeaders = value => {
6392
- if (!isHeadersRecord(value)) {
6393
- return [];
6394
- }
6395
- return Object.entries(value);
6396
- };
6397
- const getGeneralEntries = selectedEvent => {
6398
- if (!selectedEvent) {
6399
- return [];
6400
- }
6401
- const entries = [];
6402
- if (isNonEmptyString(selectedEvent.url)) {
6403
- entries.push([requestUrl(), selectedEvent.url]);
6404
- }
6405
- if (isNonEmptyString(selectedEvent.method)) {
6406
- entries.push([requestMethod(), selectedEvent.method]);
6407
- }
6408
- const statusCode$1 = getStatusCodeValue(selectedEvent);
6409
- if (statusCode$1 !== undefined && statusCode$1 !== '') {
6410
- entries.push([statusCode(), formatHttpStatusCode(statusCode$1)]);
6411
- }
6412
- return entries;
6413
- };
6631
+
6414
6632
  const getHeaderRowNodes = (headerName, headerValue, index) => {
6415
6633
  return [{
6416
6634
  childCount: 2,
@@ -6426,6 +6644,7 @@ const getHeaderRowNodes = (headerName, headerValue, index) => {
6426
6644
  type: Div
6427
6645
  }, text(getHeaderValueText(headerValue))];
6428
6646
  };
6647
+
6429
6648
  const getHeadersTableNodes = headers => {
6430
6649
  const headerRows = [];
6431
6650
  for (const [index, [headerName, headerValue]] of headers.entries()) {
@@ -6437,18 +6656,32 @@ const getHeadersTableNodes = headers => {
6437
6656
  type: Ul
6438
6657
  }, ...headerRows];
6439
6658
  };
6440
- const getHeaderSectionNodes = (label, headers) => {
6659
+
6660
+ const getHeaderSectionNodes = (section, label, headers, collapsedHeaderSections, infoMessage = '') => {
6661
+ const isCollapsed = collapsedHeaderSections.includes(section);
6662
+ const hasInfoMessage = !isCollapsed && infoMessage !== '';
6663
+ const childCount = isCollapsed ? 1 : 2 + Number(hasInfoMessage);
6441
6664
  return [{
6442
- childCount: 2,
6665
+ childCount,
6443
6666
  className: ChatDebugViewHeadersSection,
6444
6667
  type: Div
6445
6668
  }, {
6669
+ ariaExpanded: !isCollapsed,
6446
6670
  childCount: 1,
6447
6671
  className: ChatDebugViewHeadersSectionHeading,
6672
+ name: ToggleHeadersSection,
6673
+ onChange: HandleFilterInput,
6674
+ onClick: HandleFilterInput,
6675
+ type: Button$1,
6676
+ value: section
6677
+ }, text(label), ...(isCollapsed ? [] : getHeadersTableNodes(headers)), ...(hasInfoMessage ? [{
6678
+ childCount: 1,
6679
+ className: ChatDebugViewHeadersSectionInfo,
6448
6680
  type: Div
6449
- }, text(label), ...getHeadersTableNodes(headers)];
6681
+ }, text(infoMessage)] : [])];
6450
6682
  };
6451
- const getHeadersContentNodes = (responseEventNodes, selectedEvent) => {
6683
+
6684
+ const getHeadersContentNodes = (responseEventNodes, selectedEvent, collapsedHeaderSections = []) => {
6452
6685
  const generalEntries = getGeneralEntries(selectedEvent);
6453
6686
  const requestHeaders$1 = getHeaders(selectedEvent?.headers);
6454
6687
  const responseHeaders$1 = getHeaders(isHeadersRecord(selectedEvent?.endValue) ? selectedEvent.endValue.headers : undefined);
@@ -6457,13 +6690,13 @@ const getHeadersContentNodes = (responseEventNodes, selectedEvent) => {
6457
6690
  }
6458
6691
  const nodes = [];
6459
6692
  if (generalEntries.length > 0) {
6460
- nodes.push(...getHeaderSectionNodes(general(), generalEntries));
6461
- }
6462
- if (requestHeaders$1.length > 0) {
6463
- nodes.push(...getHeaderSectionNodes(requestHeaders(), requestHeaders$1));
6693
+ nodes.push(...getHeaderSectionNodes(General, general(), generalEntries, collapsedHeaderSections));
6464
6694
  }
6465
6695
  if (responseHeaders$1.length > 0) {
6466
- nodes.push(...getHeaderSectionNodes(responseHeaders(), responseHeaders$1));
6696
+ nodes.push(...getHeaderSectionNodes(ResponseHeaders, responseHeaders(), responseHeaders$1, collapsedHeaderSections, responseHeadersInfo()));
6697
+ }
6698
+ if (requestHeaders$1.length > 0) {
6699
+ nodes.push(...getHeaderSectionNodes(RequestHeaders, requestHeaders(), requestHeaders$1, collapsedHeaderSections));
6467
6700
  }
6468
6701
  return nodes;
6469
6702
  };
@@ -7557,7 +7790,7 @@ const getTokenUsageContentNodes = (responseEventNodes, selectedEvent) => {
7557
7790
  return getTokenUsageDetailsDom(selectedEvent);
7558
7791
  };
7559
7792
 
7560
- const getSelectedContentNodes = (safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization) => {
7793
+ const getSelectedContentNodes = (safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization, collapsedHeaderSections = []) => {
7561
7794
  if (safeSelectedDetailTab === Tokens$1) {
7562
7795
  return getTokenUsageContentNodes(responseEventNodes, selectedEvent);
7563
7796
  }
@@ -7571,19 +7804,19 @@ const getSelectedContentNodes = (safeSelectedDetailTab, previewEventNodes, paylo
7571
7804
  return getPayloadContentNodes(payloadEventNodes, selectedEvent);
7572
7805
  }
7573
7806
  if (safeSelectedDetailTab === Headers$1) {
7574
- return getHeadersContentNodes(responseEventNodes, selectedEvent);
7807
+ return getHeadersContentNodes(responseEventNodes, selectedEvent, collapsedHeaderSections);
7575
7808
  }
7576
7809
  return getResponseContentNodes(responseEventNodes, selectedEvent);
7577
7810
  };
7578
7811
 
7579
- const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes, responseEventNodes = payloadEventNodes, selectedEvent = null, detailTabs = createDetailTabs(), previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, previewVirtualization) => {
7812
+ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes, responseEventNodes = payloadEventNodes, selectedEvent = null, detailTabs = createDetailTabs(), previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, previewVirtualization, collapsedHeaderSections = []) => {
7580
7813
  if (previewEventNodes.length === 0 && payloadEventNodes.length === 0 && responseEventNodes.length === 0) {
7581
7814
  return [];
7582
7815
  }
7583
7816
  const normalizedDetailTabs = getNormalizedDetailTabs(selectedEvent, detailTabs);
7584
7817
  const safeSelectedDetailTab = getSelectedDetailTab(normalizedDetailTabs);
7585
7818
  const selectedDetailTab = normalizedDetailTabs.find(detailTab => detailTab.name === safeSelectedDetailTab) ?? normalizedDetailTabs[0];
7586
- const contentNodes = getSelectedContentNodes(safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization);
7819
+ const contentNodes = getSelectedContentNodes(safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization, collapsedHeaderSections);
7587
7820
  return [{
7588
7821
  childCount: 2,
7589
7822
  className: ChatDebugViewDetails,
@@ -7764,59 +7997,42 @@ const getSplitViewDom = (splitChildCount, eventsClassName, tableNodes, sashNodes
7764
7997
  }, ...tableNodes, ...sashNodes, ...detailsNodes];
7765
7998
  };
7766
7999
 
7767
- const formatTimelineMilliseconds = value => {
7768
- return `${Math.round(value * 1000)}ms`;
7769
- };
7770
-
7771
- const formatTimelineSeconds = value => {
7772
- if (Number.isInteger(value)) {
7773
- return `${value}s`;
7774
- }
7775
- return `${Number(value.toFixed(1))}s`;
7776
- };
7777
-
7778
- const getEndTime = event => {
7779
- return event.ended ?? event.endTime ?? event.timestamp;
7780
- };
7781
-
7782
- const getStartTime = event => {
7783
- return event.started ?? event.startTime ?? event.timestamp;
7784
- };
7785
-
7786
- const formatTableSummaryDuration = durationMs => {
7787
- if (durationMs < 1000) {
7788
- return formatTimelineMilliseconds(durationMs / 1000);
7789
- }
7790
- return formatTimelineSeconds(durationMs / 1000);
7791
- };
7792
- const getTableSummary = events => {
7793
- let minStart = Number.POSITIVE_INFINITY;
7794
- let maxEnd = Number.NEGATIVE_INFINITY;
7795
- for (const event of events) {
7796
- const startTime = toTimeNumber(getStartTime(event));
7797
- const endTime = toTimeNumber(getEndTime(event));
7798
- if (typeof startTime === 'number' && Number.isFinite(startTime)) {
7799
- minStart = Math.min(minStart, startTime);
7800
- }
7801
- if (typeof endTime === 'number' && Number.isFinite(endTime)) {
7802
- maxEnd = Math.max(maxEnd, endTime);
7803
- }
7804
- }
7805
- const durationMs = Number.isFinite(minStart) && Number.isFinite(maxEnd) ? Math.max(0, maxEnd - minStart) : 0;
7806
- return tableSummary(events.length, formatTableSummaryDuration(durationMs));
7807
- };
7808
-
7809
8000
  const tableSummaryNode = {
7810
- childCount: 1,
8001
+ childCount: 0,
7811
8002
  className: TableSummary,
7812
8003
  role: Status,
7813
8004
  type: Div
7814
8005
  };
7815
- const getTableSummaryDom = summary => {
7816
- if (!summary) {
8006
+ const tableSummaryItemNode = {
8007
+ childCount: 1,
8008
+ type: Span
8009
+ };
8010
+ const tableSummaryNodes = new Map();
8011
+ const getTableSummaryNode = childCount => {
8012
+ const existing = tableSummaryNodes.get(childCount);
8013
+ if (existing) {
8014
+ return existing;
8015
+ }
8016
+ const node = {
8017
+ ...tableSummaryNode,
8018
+ childCount
8019
+ };
8020
+ tableSummaryNodes.set(childCount, node);
8021
+ return node;
8022
+ };
8023
+ const getTableSummaryDom = summaries => {
8024
+ const nonEmptySummaries = summaries.filter(Boolean);
8025
+ if (nonEmptySummaries.length === 0) {
7817
8026
  return [];
7818
8027
  }
7819
- return [tableSummaryNode, text(summary)];
8028
+ const nodes = [getTableSummaryNode(nonEmptySummaries.length * 2 - 1)];
8029
+ for (let i = 0; i < nonEmptySummaries.length; i++) {
8030
+ nodes.push(tableSummaryItemNode, text(nonEmptySummaries[i]));
8031
+ if (i < nonEmptySummaries.length - 1) {
8032
+ nodes.push(text(' | '));
8033
+ }
8034
+ }
8035
+ return nodes;
7820
8036
  };
7821
8037
 
7822
8038
  const getTableBodyDom = (rowNodes, eventCount) => {
@@ -7875,7 +8091,7 @@ const getTableHeaderDom = (visibleTableColumns = defaultVisibleTableColumns, tab
7875
8091
  }, ...getHeaderCellNodes(visibleTableColumns, tableColumns)];
7876
8092
  };
7877
8093
 
7878
- const getTableDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0) => {
8094
+ const getTableDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summaries = [], focus = 0) => {
7879
8095
  return [{
7880
8096
  childCount: 3,
7881
8097
  className: Table,
@@ -7932,7 +8148,7 @@ const getTableScrollBarDom = visible => {
7932
8148
  }];
7933
8149
  };
7934
8150
 
7935
- const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = 'none', showScrollBar = false) => {
8151
+ const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summaries = [], focus = 0, className = '', role = 'none', showScrollBar = false) => {
7936
8152
  const tableWrapperClassName = mergeClassNames(TableWrapper, focus === FocusChatDebugTable ? FocusOutline : '', className);
7937
8153
  const tableWrapperNode = {
7938
8154
  childCount: showScrollBar ? 3 : 2,
@@ -7943,16 +8159,16 @@ const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultV
7943
8159
  role
7944
8160
  } : {})
7945
8161
  };
7946
- return [tableWrapperNode, ...getTableDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus), ...getTableResizersDom(visibleTableColumns), ...getTableScrollBarDom(showScrollBar)];
8162
+ return [tableWrapperNode, ...getTableDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summaries, focus), ...getTableResizersDom(visibleTableColumns), ...getTableScrollBarDom(showScrollBar)];
7947
8163
  };
7948
8164
 
7949
- const getTableWrapperWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = 'none', showScrollBar = false) => {
7950
- const tableSummaryNodes = getTableSummaryDom(summary);
8165
+ const getTableWrapperWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summaries = [], focus = 0, className = '', role = 'none', showScrollBar = false) => {
8166
+ const tableSummaryNodes = getTableSummaryDom(summaries);
7951
8167
  return [{
7952
8168
  childCount: tableSummaryNodes.length === 0 ? 1 : 2,
7953
8169
  className: TableWrapperWrapper,
7954
8170
  type: Div
7955
- }, ...getTableWrapperDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus, className, role, showScrollBar), ...tableSummaryNodes];
8171
+ }, ...getTableWrapperDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summaries, focus, className, role, showScrollBar), ...tableSummaryNodes];
7956
8172
  };
7957
8173
 
7958
8174
  const getBucketUnitDom = (unitCount, presetValue) => {
@@ -8125,7 +8341,7 @@ const getTimelineDom = (timelineInfo, hoverPercent = null) => {
8125
8341
  }, ...selectionNodes];
8126
8342
  };
8127
8343
 
8128
- const getDevtoolsDom = (events, selectedEvent, selectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage = noEventsFound(), timelineSelectionActive = false, timelineSelectionAnchorSeconds = '', timelineSelectionFocusSeconds = '', detailTabs = createDetailTabs(), visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), timelineInfo, timelineHoverPercent = null, focus = 0, previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, previewTextDeltaY = 0, previewTextViewportHeight = 0, minLineY = 0, maxLineY = events.length) => {
8344
+ const getDevtoolsDom = (events, selectedEvent, selectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage = noEventsFound(), timelineSelectionActive = false, timelineSelectionAnchorSeconds = '', timelineSelectionFocusSeconds = '', detailTabs = createDetailTabs(), visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), timelineInfo, timelineHoverPercent = null, focus = 0, previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, previewTextDeltaY = 0, previewTextViewportHeight = 0, minLineY = 0, maxLineY = events.length, collapsedHeaderSections = [], summaries = getTableSummaries(events)) => {
8129
8345
  const visibleEvents = events.slice(minLineY, maxLineY);
8130
8346
  const rows = createDevtoolsRows(visibleEvents, selectedEventIndex, minLineY);
8131
8347
  const rowNodes = getDevtoolsRows(rows, visibleTableColumns);
@@ -8147,10 +8363,9 @@ const getDevtoolsDom = (events, selectedEvent, selectedEventIndex, timelineEvent
8147
8363
  const responseEventNodes = selectedEvent ? getEventNode(getResponseEvent(selectedEvent)) : [];
8148
8364
  const hasSelectedEvent = !!selectedEvent;
8149
8365
  const eventsClassName = getEventsClassName(hasSelectedEvent);
8150
- const summary = getTableSummary(events);
8151
8366
  const showScrollBar = visibleEvents.length < events.length;
8152
- const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableWrapperWrapperDom(rowNodes, visibleEvents.length, visibleTableColumns, tableColumns, summary, focus, '', '', showScrollBar);
8153
- const detailsNodes = getDetailsDom(previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, detailTabs, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualizationOptions);
8367
+ const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableWrapperWrapperDom(rowNodes, visibleEvents.length, visibleTableColumns, tableColumns, summaries, focus, '', '', showScrollBar);
8368
+ const detailsNodes = getDetailsDom(previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, detailTabs, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualizationOptions, collapsedHeaderSections);
8154
8369
  const sashNodes = getSashNodesDom(hasSelectedEvent);
8155
8370
  const splitChildCount = hasSelectedEvent ? 3 : 1;
8156
8371
  const rootChildCount = 3;
@@ -8204,7 +8419,7 @@ const getEventCategoryFilterDescription = eventCategoryFilters => {
8204
8419
  }
8205
8420
  return eventCategoryFilters.map(eventCategoryFilter => getEventCategoryFilterLabel(eventCategoryFilter).toLowerCase()).join(', ');
8206
8421
  };
8207
- const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilters, categoryFilters, _showEventStreamFinishedEvents, _showInputEvents, _showResponsePartEvents, useDevtoolsLayout, selectedEvent, selectedEventIndex, timelineStartSeconds, timelineEndSeconds, timelineFilterDescription, timelineEvents, events, timelineSelectionActive = false, timelineSelectionAnchorSeconds = '', timelineSelectionFocusSeconds = '', visibleTableColumns = defaultVisibleTableColumns, detailTabs = createDetailTabs(), tableColumns = createTableColumns(), timelineInfo, timelineHoverPercent = null, focus = 0, previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, minLineY = 0, maxLineY = events.length, previewTextDeltaY = 0, previewTextViewportHeight = 0) => {
8422
+ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilters, categoryFilters, _showEventStreamFinishedEvents, _showInputEvents, _showResponsePartEvents, useDevtoolsLayout, selectedEvent, selectedEventIndex, timelineStartSeconds, timelineEndSeconds, timelineFilterDescription, timelineEvents, events, timelineSelectionActive = false, timelineSelectionAnchorSeconds = '', timelineSelectionFocusSeconds = '', visibleTableColumns = defaultVisibleTableColumns, detailTabs = createDetailTabs(), tableColumns = createTableColumns(), timelineInfo, timelineHoverPercent = null, focus = 0, previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, minLineY = 0, maxLineY = events.length, previewTextDeltaY = 0, previewTextViewportHeight = 0, collapsedHeaderSections = [], summaries = getTableSummaries(events)) => {
8208
8423
  if (errorMessage) {
8209
8424
  return getDebugErrorDom(errorMessage);
8210
8425
  }
@@ -8228,7 +8443,7 @@ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilters, ca
8228
8443
  const emptyMessage = getEmptyMessage(events.length, hasFilterValue, useNoToolCallEventsMessage, noFilteredEventsMessage);
8229
8444
  const safeSelectedEventIndex = selectedEventIndex === null || selectedEventIndex < 0 || selectedEventIndex >= events.length ? null : selectedEventIndex;
8230
8445
  if (useDevtoolsLayout) {
8231
- const devtoolsDom = getDevtoolsDom(events, selectedEvent, safeSelectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds, detailTabs, visibleTableColumns, tableColumns, timelineInfo, timelineHoverPercent, focus, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewTextDeltaY, previewTextViewportHeight, minLineY, maxLineY);
8446
+ const devtoolsDom = getDevtoolsDom(events, selectedEvent, safeSelectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds, detailTabs, visibleTableColumns, tableColumns, timelineInfo, timelineHoverPercent, focus, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewTextDeltaY, previewTextViewportHeight, minLineY, maxLineY, collapsedHeaderSections, summaries);
8232
8447
  const devtoolsContentNodes = devtoolsDom.slice(1);
8233
8448
  const topLevelNodes = [...getDebugViewTopDom(filterValue, useDevtoolsLayout, categoryFilters), ...devtoolsContentNodes];
8234
8449
  const rootChildCount = getTopLevelChildCount(topLevelNodes);
@@ -8264,7 +8479,7 @@ const renderItems = (oldState, newState) => {
8264
8479
  }
8265
8480
  const filteredEvents = getCurrentEvents$1(newState);
8266
8481
  const previewTextViewportHeight = getPreviewTextViewportHeight(newState);
8267
- const dom = getChatDebugViewDom(newState.errorMessage, newState.filterValue, getSelectedEventCategoryFilters(newState.categoryFilters), newState.categoryFilters, newState.showEventStreamFinishedEvents, newState.showInputEvents, newState.showResponsePartEvents, newState.useDevtoolsLayout, newState.selectedEvent, newState.selectedEventIndex, newState.timelineStartSeconds, newState.timelineEndSeconds, newState.timelineFilterDescription, withSessionEventIds(newState.timelineEvents), withSessionEventIds(filteredEvents), newState.timelineSelectionActive, newState.timelineSelectionAnchorSeconds, newState.timelineSelectionFocusSeconds, getVisibleTableColumns(newState.tableColumns), newState.detailTabs, newState.tableColumns, newState.timelineInfo, newState.timelineHoverPercent, newState.focus, newState.previewTextCursorRowIndex, newState.previewTextCursorColumnIndex, newState.tableMinLineY, newState.tableMaxLineY, newState.previewTextDeltaY, previewTextViewportHeight);
8482
+ const dom = getChatDebugViewDom(newState.errorMessage, newState.filterValue, getSelectedEventCategoryFilters(newState.categoryFilters), newState.categoryFilters, newState.showEventStreamFinishedEvents, newState.showInputEvents, newState.showResponsePartEvents, newState.useDevtoolsLayout, newState.selectedEvent, newState.selectedEventIndex, newState.timelineStartSeconds, newState.timelineEndSeconds, newState.timelineFilterDescription, withSessionEventIds(newState.timelineEvents), withSessionEventIds(filteredEvents), newState.timelineSelectionActive, newState.timelineSelectionAnchorSeconds, newState.timelineSelectionFocusSeconds, getVisibleTableColumns(newState.tableColumns), newState.detailTabs, newState.tableColumns, newState.timelineInfo, newState.timelineHoverPercent, newState.focus, newState.previewTextCursorRowIndex, newState.previewTextCursorColumnIndex, newState.tableMinLineY, newState.tableMaxLineY, newState.previewTextDeltaY, previewTextViewportHeight, newState.collapsedHeaderSections, newState.summaries);
8268
8483
  return [SetDom2, newState.uid, dom];
8269
8484
  };
8270
8485
 
@@ -8470,15 +8685,20 @@ const rerender = state => {
8470
8685
  };
8471
8686
 
8472
8687
  const resetTableColumns = state => {
8473
- if (getVisibleTableColumns(state.tableColumns).join(',') === defaultVisibleTableColumns.join(',') && isSameTableColumnWidths(state.tableColumnWidths, defaultTableColumnWidths) && state.sortColumn === '' && state.sortDescending === false) {
8688
+ const {
8689
+ sortColumn,
8690
+ sortDescending,
8691
+ tableColumns
8692
+ } = state;
8693
+ const defaultTableColumns = createTableColumns();
8694
+ if (getVisibleTableColumns(tableColumns).join(',') === defaultVisibleTableColumns.join(',') && isSameTableColumnWidths(getTableColumnWidths(tableColumns), getTableColumnWidths(defaultTableColumns)) && sortColumn === '' && sortDescending === false) {
8474
8695
  return state;
8475
8696
  }
8476
8697
  return {
8477
8698
  ...state,
8478
8699
  sortColumn: '',
8479
8700
  sortDescending: false,
8480
- tableColumns: createTableColumns(),
8481
- tableColumnWidths: defaultTableColumnWidths
8701
+ tableColumns: defaultTableColumns
8482
8702
  };
8483
8703
  };
8484
8704
 
@@ -8487,9 +8707,10 @@ const handleResize = (state, dimensions) => {
8487
8707
  ...state,
8488
8708
  ...dimensions
8489
8709
  };
8710
+ const tableWidth = shouldUseBalancedSplitTableWidth(nextState) ? getBalancedSplitTableWidth(nextState) : clampTableWidth(nextState, state.tableWidth);
8490
8711
  return applyVirtualTableState({
8491
8712
  ...nextState,
8492
- tableWidth: clampTableWidth(nextState, state.tableWidth)
8713
+ tableWidth
8493
8714
  });
8494
8715
  };
8495
8716
 
@@ -8511,7 +8732,6 @@ const saveState = state => {
8511
8732
  selectedEventId,
8512
8733
  sessionId,
8513
8734
  tableColumns,
8514
- tableColumnWidths,
8515
8735
  timelineEndSeconds,
8516
8736
  timelineStartSeconds
8517
8737
  } = state;
@@ -8522,7 +8742,7 @@ const saveState = state => {
8522
8742
  selectedDetailTab: getSelectedDetailTab(detailTabs),
8523
8743
  selectedEventId,
8524
8744
  sessionId,
8525
- tableColumnWidths,
8745
+ tableColumnWidths: getTableColumnWidths(tableColumns),
8526
8746
  timelineEndSeconds,
8527
8747
  timelineStartSeconds,
8528
8748
  visibleTableColumns: getVisibleTableColumns(tableColumns)
@@ -8596,12 +8816,15 @@ const setSessionId = async (state, sessionId) => {
8596
8816
  };
8597
8817
 
8598
8818
  const toggleTableColumnVisibility = (state, column) => {
8819
+ const {
8820
+ tableColumns
8821
+ } = state;
8599
8822
  if (!isTableColumn(column)) {
8600
8823
  return state;
8601
8824
  }
8602
8825
  return {
8603
8826
  ...state,
8604
- tableColumns: state.tableColumns.map(tableColumn => {
8827
+ tableColumns: tableColumns.map(tableColumn => {
8605
8828
  if (tableColumn.name !== column) {
8606
8829
  return tableColumn;
8607
8830
  }