@lvce-editor/chat-debug-view 10.21.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.
@@ -1481,11 +1481,11 @@ const General$1 = 'General';
1481
1481
  const Headers = 'Headers';
1482
1482
  const ImageCouldNotBeLoaded = 'image could not be loaded';
1483
1483
  const InputTokens = 'Input Tokens';
1484
- const InvalidSessionId = 'Invalid session id';
1485
- const InvalidUriEncoding = 'Invalid URI encoding';
1486
- 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';
1487
1487
  const Method$1 = 'Method';
1488
- const MissingUri = 'Missing URI';
1488
+ const MissingUri$1 = 'Missing URI';
1489
1489
  const Network = 'Network';
1490
1490
  const NoChatSessionFound = 'No chat session found for sessionId "{PH1}".';
1491
1491
  const NoEventsFound = 'No events have been found';
@@ -1503,14 +1503,16 @@ const RequestMethod = 'Request Method';
1503
1503
  const RequestUrl = 'Request URL';
1504
1504
  const Response = 'Response';
1505
1505
  const ResponseHeaders$1 = 'Response Headers';
1506
+ const ResponseHeadersInfo = 'Some headers may not be displayed due to Access-Control-Expose-Headers header.';
1506
1507
  const SecondsRange = '{PH1}s-{PH2}s';
1507
1508
  const Size$1 = 'Size';
1508
1509
  const Started = 'Started';
1509
1510
  const Status$2 = 'Status';
1510
1511
  const StatusCode = 'Status Code';
1511
1512
  const Stream = 'Stream';
1512
- const TableSummaryPlural = '{PH1} events, {PH2} from start to finish';
1513
- const TableSummarySingular = '{PH1} event, {PH2} from start to finish';
1513
+ const TableSummaryRequestPlural = '{PH1} requests';
1514
+ const TableSummaryRequestSingular = '{PH1} request';
1515
+ const TableSummaryFinish = 'Finish {PH1}';
1514
1516
  const Timing = 'Timing';
1515
1517
  const Tokens = 'Tokens';
1516
1518
  const ToSeconds = 'to {PH1}s';
@@ -1574,7 +1576,7 @@ const headers = () => {
1574
1576
  return i18nString(Headers);
1575
1577
  };
1576
1578
  const invalidSessionId = () => {
1577
- return i18nString(InvalidSessionId);
1579
+ return i18nString(InvalidSessionId$1);
1578
1580
  };
1579
1581
  const imageCouldNotBeLoaded = () => {
1580
1582
  return i18nString(ImageCouldNotBeLoaded);
@@ -1583,13 +1585,13 @@ const inputTokens = () => {
1583
1585
  return i18nString(InputTokens);
1584
1586
  };
1585
1587
  const invalidUriEncoding = () => {
1586
- return i18nString(InvalidUriEncoding);
1588
+ return i18nString(InvalidUriEncoding$1);
1587
1589
  };
1588
1590
  const invalidUriFormat = () => {
1589
- return i18nString(InvalidUriFormat);
1591
+ return i18nString(InvalidUriFormat$1);
1590
1592
  };
1591
1593
  const missingUri = () => {
1592
- return i18nString(MissingUri);
1594
+ return i18nString(MissingUri$1);
1593
1595
  };
1594
1596
  const method = () => {
1595
1597
  return i18nString(Method$1);
@@ -1640,6 +1642,9 @@ const requestUrl = () => {
1640
1642
  const responseHeaders = () => {
1641
1643
  return i18nString(ResponseHeaders$1);
1642
1644
  };
1645
+ const responseHeadersInfo = () => {
1646
+ return i18nString(ResponseHeadersInfo);
1647
+ };
1643
1648
  const resetColumns = () => {
1644
1649
  return i18nString(ResetColumns);
1645
1650
  };
@@ -1670,10 +1675,14 @@ const timing = () => {
1670
1675
  const tokens = () => {
1671
1676
  return i18nString(Tokens);
1672
1677
  };
1673
- const tableSummary = (eventCount, duration) => {
1674
- return i18nString(eventCount === 1 ? TableSummarySingular : TableSummaryPlural, {
1675
- PH1: String(eventCount),
1676
- 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
1677
1686
  });
1678
1687
  };
1679
1688
  const toSeconds = seconds => {
@@ -1811,25 +1820,6 @@ const isDetailTab = value => {
1811
1820
  return value === Response$1 || value === Preview$1 || value === Payload$1 || value === Headers$1 || value === Tokens$1 || value === Headers$1 || value === Timing$1;
1812
1821
  };
1813
1822
 
1814
- const RE_SPACE = /\s+/;
1815
- const tokenToEventCategoryFilter = new Map([['@tools', Tools$1], ['@network', Network$1], ['@ui', Ui$1], ['@stream', Stream$1]]);
1816
- const parseFilterValue = filterValue => {
1817
- const normalizedFilter = filterValue.trim().toLowerCase();
1818
- if (!normalizedFilter) {
1819
- return {
1820
- eventCategoryFilter: All$1,
1821
- filterText: ''
1822
- };
1823
- }
1824
- const parts = normalizedFilter.split(RE_SPACE);
1825
- const eventCategoryFilter = parts.map(part => tokenToEventCategoryFilter.get(part)).find(Boolean) || All$1;
1826
- const filterText = parts.filter(part => !tokenToEventCategoryFilter.has(part)).join(' ');
1827
- return {
1828
- eventCategoryFilter,
1829
- filterText
1830
- };
1831
- };
1832
-
1833
1823
  const hasDetailTab = (detailTabs, value) => {
1834
1824
  return detailTabs.some(detailTab => detailTab.name === value);
1835
1825
  };
@@ -1852,28 +1842,45 @@ const Duration = 'duration';
1852
1842
  const Status$1 = 'status';
1853
1843
  const Size = 'size';
1854
1844
  const tableColumnNames = [Type, Method, Status$1, Size, Duration];
1855
- const createTableColumns = () => {
1856
- return [{
1857
- isVisible: true,
1858
- label: type(),
1859
- name: Type
1860
- }, {
1861
- isVisible: true,
1845
+ const tableColumnDefinitions = {
1846
+ [Duration]: {
1847
+ defaultWidth: 110,
1848
+ label: duration(),
1849
+ minimumWidth: 80
1850
+ },
1851
+ [Method]: {
1852
+ defaultWidth: 90,
1862
1853
  label: method(),
1863
- name: Method
1864
- }, {
1865
- isVisible: true,
1866
- label: status(),
1867
- name: Status$1
1868
- }, {
1869
- isVisible: true,
1854
+ minimumWidth: 56
1855
+ },
1856
+ [Size]: {
1857
+ defaultWidth: 100,
1870
1858
  label: size(),
1871
- name: Size
1872
- }, {
1873
- isVisible: true,
1874
- label: duration(),
1875
- name: Duration
1876
- }];
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
+ });
1877
1884
  };
1878
1885
  const defaultVisibleTableColumns = tableColumnNames;
1879
1886
  const isTableColumn = value => {
@@ -1889,13 +1896,45 @@ const getTableColumnsWithVisibility = (tableColumns, visibleTableColumns) => {
1889
1896
  isVisible: visibleColumns.has(column.name)
1890
1897
  }));
1891
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
+ };
1892
1934
  const getOrderedVisibleTableColumns = (values, tableColumns = createTableColumns()) => {
1893
1935
  const visibleColumns = new Set(values.filter(isTableColumn));
1894
1936
  return tableColumns.map(column => column.name).filter(column => visibleColumns.has(column));
1895
1937
  };
1896
- const isVisibleTableColumn = (tableColumns, column) => {
1897
- return tableColumns.some(tableColumn => tableColumn.name === column && tableColumn.isVisible);
1898
- };
1899
1938
  const getTableColumnLabel = (tableColumns, name) => {
1900
1939
  const match = tableColumns.find(column => column.name === name);
1901
1940
  if (match) {
@@ -1917,17 +1956,15 @@ const getTableColumnLabel = (tableColumns, name) => {
1917
1956
  }
1918
1957
  };
1919
1958
 
1920
- const defaultTableColumnWidths = {
1921
- duration: 110,
1922
- method: 90,
1923
- size: 100,
1924
- status: 110,
1925
- type: 260
1926
- };
1927
-
1928
1959
  const getMainWidth = state => {
1929
1960
  return Math.max(0, state.width - state.horizontalPadding);
1930
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
+ };
1931
1968
  const clampTableWidth = (state, tableWidth) => {
1932
1969
  const mainWidth = getMainWidth(state);
1933
1970
  const maxTableWidth = Math.max(0, mainWidth - state.minDetailsWidth - state.sashWidth);
@@ -1939,24 +1976,21 @@ const getDetailsWidth = (state, tableWidth) => {
1939
1976
  const clampedTableWidth = clampTableWidth(state, tableWidth);
1940
1977
  return Math.max(0, mainWidth - clampedTableWidth - state.sashWidth);
1941
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
+ };
1942
1987
  const getTableWidthFromClientX = (state, clientX) => {
1943
1988
  const nextTableWidth = clientX - state.x - state.leftPadding;
1944
1989
  return clampTableWidth(state, nextTableWidth);
1945
1990
  };
1946
1991
 
1947
- const minimumTableColumnWidths = {
1948
- [Duration]: 80,
1949
- [Method]: 56,
1950
- [Size]: 80,
1951
- [Status$1]: 56,
1952
- [Type]: 80
1953
- };
1954
- const getMinimumTableColumnWidth = column => {
1955
- return minimumTableColumnWidths[column];
1956
- };
1957
-
1958
- const getTableColumnLayout = (tableWidth, visibleTableColumns, tableColumnWidths) => {
1959
- const visibleColumns = getOrderedVisibleTableColumns(visibleTableColumns);
1992
+ const getTableColumnLayout = (tableWidth, visibleTableColumns, tableColumns) => {
1993
+ const visibleColumns = getOrderedVisibleTableColumns(visibleTableColumns, tableColumns);
1960
1994
  if (visibleColumns.length === 0) {
1961
1995
  return {
1962
1996
  fixedColumns: [],
@@ -1973,10 +2007,10 @@ const getTableColumnLayout = (tableWidth, visibleTableColumns, tableColumnWidths
1973
2007
  visibleColumnWidths.push(Math.max(0, remainingWidth));
1974
2008
  continue;
1975
2009
  }
1976
- const minimumWidth = getMinimumTableColumnWidth(column);
1977
- 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);
1978
2012
  const maxWidth = Math.max(minimumWidth, remainingWidth - minimumRemainingWidth);
1979
- const preferredWidth = tableColumnWidths[column];
2013
+ const preferredWidth = getTableColumnWidth(tableColumns, column);
1980
2014
  const clampedWidth = Math.max(minimumWidth, Math.min(preferredWidth, maxWidth));
1981
2015
  visibleColumnWidths.push(clampedWidth);
1982
2016
  remainingWidth -= clampedWidth;
@@ -1995,24 +2029,21 @@ const getTableColumnLayout = (tableWidth, visibleTableColumns, tableColumnWidths
1995
2029
  };
1996
2030
  };
1997
2031
 
1998
- const getResizedTableColumnWidths = (state, visibleTableColumns, tableColumnWidths, clientX, resizerDownId) => {
2032
+ const getResizedTableColumnWidths = (state, visibleTableColumns, tableColumns, clientX, resizerDownId) => {
1999
2033
  const clampedTableWidth = clampTableWidth(state, state.tableWidth);
2000
- const layout = getTableColumnLayout(clampedTableWidth, visibleTableColumns, tableColumnWidths);
2034
+ const layout = getTableColumnLayout(clampedTableWidth, visibleTableColumns, tableColumns);
2001
2035
  if (resizerDownId < 1 || resizerDownId >= layout.visibleColumns.length) {
2002
- return tableColumnWidths;
2036
+ return tableColumns;
2003
2037
  }
2004
2038
  const boundaryIndex = resizerDownId - 1;
2005
2039
  const precedingWidth = layout.visibleColumnWidths.slice(0, boundaryIndex).reduce((total, current) => total + current, 0);
2006
2040
  const resizedColumn = layout.visibleColumns[boundaryIndex];
2007
- const minimumWidth = getMinimumTableColumnWidth(resizedColumn);
2008
- 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);
2009
2043
  const maxWidth = Math.max(minimumWidth, clampedTableWidth - precedingWidth - minimumRemainingWidth);
2010
2044
  const nextWidth = clientX - state.x - state.leftPadding - precedingWidth;
2011
2045
  const clampedWidth = Math.max(minimumWidth, Math.min(nextWidth, maxWidth));
2012
- return {
2013
- ...tableColumnWidths,
2014
- [resizedColumn]: clampedWidth
2015
- };
2046
+ return setTableColumnWidth(tableColumns, resizedColumn, clampedWidth);
2016
2047
  };
2017
2048
 
2018
2049
  const isSameTableColumnWidths = (first, second) => {
@@ -2049,9 +2080,6 @@ const restoreCategoryFilters = (savedState, currentCategoryFilters) => {
2049
2080
  if (typeof savedState.eventCategoryFilter === 'string' && validEventCategoryFilters.has(savedState.eventCategoryFilter)) {
2050
2081
  return selectCategoryFilter(currentCategoryFilters, savedState.eventCategoryFilter);
2051
2082
  }
2052
- if (typeof savedState.filterValue === 'string') {
2053
- return selectCategoryFilter(currentCategoryFilters, parseFilterValue(savedState.filterValue).eventCategoryFilter);
2054
- }
2055
2083
  return currentCategoryFilters;
2056
2084
  };
2057
2085
  const restoreFilterValue = (savedState, currentFilterValue) => {
@@ -2081,24 +2109,26 @@ const restoreVisibleTableColumns = (savedState, currentTableColumns) => {
2081
2109
  }
2082
2110
  return getTableColumnsWithVisibility(currentTableColumns, visibleTableColumns);
2083
2111
  };
2084
- const restoreTableColumnWidths = (savedState, currentTableColumnWidths) => {
2112
+ const restoreTableColumns = (savedState, currentTableColumns) => {
2113
+ const tableColumnsWithVisibility = restoreVisibleTableColumns(savedState, currentTableColumns);
2085
2114
  const {
2086
2115
  tableColumnWidths: savedTableColumnWidths
2087
2116
  } = savedState;
2088
2117
  if (isTableColumnWidths(savedTableColumnWidths)) {
2089
- return savedTableColumnWidths;
2118
+ return setTableColumnWidths(tableColumnsWithVisibility, savedTableColumnWidths);
2090
2119
  }
2091
2120
  if (isLegacyTableColumnWidths(savedTableColumnWidths)) {
2092
2121
  const legacyTableColumnWidths = savedTableColumnWidths;
2093
- return {
2122
+ const currentTableColumnWidths = getTableColumnWidths(currentTableColumns);
2123
+ return setTableColumnWidths(tableColumnsWithVisibility, {
2094
2124
  duration: legacyTableColumnWidths.duration,
2095
2125
  method: legacyTableColumnWidths.method,
2096
2126
  size: currentTableColumnWidths.size,
2097
2127
  status: legacyTableColumnWidths.status,
2098
2128
  type: legacyTableColumnWidths.type
2099
- };
2129
+ });
2100
2130
  }
2101
- return currentTableColumnWidths;
2131
+ return tableColumnsWithVisibility;
2102
2132
  };
2103
2133
  const restoreSavedState = (state, savedState) => {
2104
2134
  if (!isSavedState(savedState)) {
@@ -2110,8 +2140,7 @@ const restoreSavedState = (state, savedState) => {
2110
2140
  detailTabs: restoreDetailTabs(savedState, state.detailTabs),
2111
2141
  filterValue: restoreFilterValue(savedState, state.filterValue),
2112
2142
  selectedEventId: restoreSelectedEventId(savedState, state.selectedEventId),
2113
- tableColumns: restoreVisibleTableColumns(savedState, state.tableColumns),
2114
- tableColumnWidths: restoreTableColumnWidths(savedState, state.tableColumnWidths),
2143
+ tableColumns: restoreTableColumns(savedState, state.tableColumns),
2115
2144
  timelineEndSeconds: restoreTimelineEndSeconds(savedState, state.timelineEndSeconds),
2116
2145
  timelineStartSeconds: restoreTimelineStartSeconds(savedState, state.timelineStartSeconds)
2117
2146
  };
@@ -2322,7 +2351,7 @@ const getEventsWithTime = events => {
2322
2351
  });
2323
2352
  };
2324
2353
 
2325
- const clamp$1 = (value, minimum, maximum) => {
2354
+ const clamp = (value, minimum, maximum) => {
2326
2355
  return Math.max(minimum, Math.min(value, maximum));
2327
2356
  };
2328
2357
 
@@ -2356,8 +2385,8 @@ const getNormalizedRange = (durationSeconds, startValue, endValue) => {
2356
2385
  const rawEnd = parsedEnd ?? durationSeconds;
2357
2386
  const rangeStart = Math.min(rawStart, rawEnd);
2358
2387
  const rangeEnd = Math.max(rawStart, rawEnd);
2359
- const normalizedStart = clamp$1(rangeStart, 0, durationSeconds);
2360
- const normalizedEnd = clamp$1(rangeEnd, 0, durationSeconds);
2388
+ const normalizedStart = clamp(rangeStart, 0, durationSeconds);
2389
+ const normalizedEnd = clamp(rangeEnd, 0, durationSeconds);
2361
2390
  return {
2362
2391
  endSeconds: roundSeconds(normalizedEnd),
2363
2392
  hasSelection: true,
@@ -2481,8 +2510,8 @@ const createDefaultState = () => {
2481
2510
  showResponsePartEvents: false,
2482
2511
  sortColumn: '',
2483
2512
  sortDescending: false,
2513
+ summaries: [],
2484
2514
  tableColumns: createTableColumns(),
2485
- tableColumnWidths: defaultTableColumnWidths,
2486
2515
  tableDeltaY: 0,
2487
2516
  tableMaxLineY: 0,
2488
2517
  tableMinLineY: 0,
@@ -2490,6 +2519,7 @@ const createDefaultState = () => {
2490
2519
  tableScrollBarHandleOffset: 0,
2491
2520
  tableScrollBarPointerActive: false,
2492
2521
  tableWidth: defaultTableWidth,
2522
+ tableWidthManuallyResized: false,
2493
2523
  timelineEndSeconds: '',
2494
2524
  timelineEvents: [],
2495
2525
  timelineFilterDescription: '',
@@ -2542,7 +2572,7 @@ const RenderFocusContext = 4;
2542
2572
  const RenderFocus = 5;
2543
2573
 
2544
2574
  const diff = (oldState, newState) => {
2545
- 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.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) {
2546
2576
  return [RenderIncremental, RenderCss];
2547
2577
  }
2548
2578
  return [];
@@ -2579,6 +2609,45 @@ const mergedEventType = 'tool-execution';
2579
2609
  const handleSubmitEventType = 'handle-submit';
2580
2610
  const sseResponseCompletedEventType = 'sse-response-completed';
2581
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
+
2582
2651
  const hasMatchingToolName = (startedEvent, finishedEvent) => {
2583
2652
  if (typeof startedEvent.toolName === 'string' && typeof finishedEvent.toolName === 'string') {
2584
2653
  return startedEvent.toolName === finishedEvent.toolName;
@@ -2684,7 +2753,8 @@ const mergeRequestResponseEvents = (startedEvent, finishedEvent) => {
2684
2753
  return {
2685
2754
  ...mergeToolExecutionEvents(startedEvent, finishedEvent, startedEvent.type),
2686
2755
  requestEvent: startedEvent,
2687
- responseEvent: finishedEvent
2756
+ responseEvent: finishedEvent,
2757
+ size: getResponsePayloadSize(finishedEvent)
2688
2758
  };
2689
2759
  };
2690
2760
  const isMatchingRequestResponsePair = (startedEvent, finishedEvent) => {
@@ -2790,12 +2860,8 @@ const matchesEventCategoryFilter = (event, eventCategoryFilters) => {
2790
2860
  const getFilteredEvents = (events, filterValue, eventCategoryFilters, showInputEvents, showResponsePartEvents, showEventStreamFinishedEvents) => {
2791
2861
  const visibleEvents = getVisibleEvents(events, showInputEvents, showResponsePartEvents, showEventStreamFinishedEvents);
2792
2862
  const collapsedEvents = collapseToolExecutionEvents(visibleEvents);
2793
- const parsedFilter = parseFilterValue(filterValue);
2794
- const activeEventCategoryFilters = parsedFilter.eventCategoryFilter === All$1 ? eventCategoryFilters : [parsedFilter.eventCategoryFilter];
2795
- const filteredByCategory = collapsedEvents.filter(event => matchesEventCategoryFilter(event, activeEventCategoryFilters));
2796
- const {
2797
- filterText
2798
- } = parsedFilter;
2863
+ const filteredByCategory = collapsedEvents.filter(event => matchesEventCategoryFilter(event, eventCategoryFilters));
2864
+ const filterText = filterValue.trim().toLowerCase();
2799
2865
  if (!filterText) {
2800
2866
  return filteredByCategory;
2801
2867
  }
@@ -2983,10 +3049,22 @@ const sortEventsByTableColumn = (events, sortColumn, sortDescending) => {
2983
3049
  };
2984
3050
 
2985
3051
  const getCurrentEvents$1 = state => {
2986
- const eventCategoryFilters = getSelectedEventCategoryFilters(state.categoryFilters);
2987
- const filteredEvents = getFilteredEvents(state.events, state.filterValue, eventCategoryFilters, state.showInputEvents, state.showResponsePartEvents, state.showEventStreamFinishedEvents);
2988
- const timelineEvents = filterEventsByTimelineRange(filteredEvents, state.timelineStartSeconds, state.timelineEndSeconds);
2989
- 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);
2990
3068
  };
2991
3069
 
2992
3070
  const getCurrentEvents = state => getCurrentEvents$1(state);
@@ -3009,6 +3087,8 @@ const loadSelectedEvent = async ({
3009
3087
  sessionId,
3010
3088
  type
3011
3089
  }) => {
3090
+ // TODO load them in parallel
3091
+ // or adjust worker function to load both start and end event
3012
3092
  const raw = await loadSelectedEvent$1(sessionId, eventId, type);
3013
3093
  if (endEventId && endEventId !== -1) {
3014
3094
  const end = await loadSelectedEvent$1(sessionId, endEventId, type);
@@ -3323,7 +3403,7 @@ const selectEventAtIndex = async (state, selectedEventIndex) => {
3323
3403
  type: selectedEvent.type
3324
3404
  });
3325
3405
  const resolvedSelectedEvent = await withPreparedSelectedEventPreview(mergeSelectedEventDetails(selectedEvent, selectedEventDetails));
3326
- return withSelectedEventVisible({
3406
+ const nextState = {
3327
3407
  ...state,
3328
3408
  detailTabs: createDetailTabs(selectedDetailTab, resolvedSelectedEvent),
3329
3409
  previewTextCursorColumnIndex: null,
@@ -3334,6 +3414,10 @@ const selectEventAtIndex = async (state, selectedEventIndex) => {
3334
3414
  selectedEvent: resolvedSelectedEvent,
3335
3415
  selectedEventId: selectedEvent.eventId,
3336
3416
  selectedEventIndex
3417
+ };
3418
+ return withSelectedEventVisible({
3419
+ ...nextState,
3420
+ tableWidth: shouldUseBalancedSplitTableWidth(nextState) ? getBalancedSplitTableWidth(nextState) : state.tableWidth
3337
3421
  });
3338
3422
  };
3339
3423
 
@@ -3394,36 +3478,17 @@ const getMenuEntriesTableBody = props => {
3394
3478
  }];
3395
3479
  };
3396
3480
 
3397
- const getColumnVisibilityFlags = (tableColumns, column) => {
3398
- 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
+ };
3399
3489
  };
3400
-
3401
3490
  const getMenuEntriesTableHeader = state => {
3402
- return [{
3403
- args: [Type],
3404
- command: 'ChatDebug.toggleTableColumnVisibility',
3405
- flags: getColumnVisibilityFlags(state.tableColumns, Type),
3406
- id: 'type',
3407
- label: type()
3408
- }, {
3409
- args: [Status$1],
3410
- command: 'ChatDebug.toggleTableColumnVisibility',
3411
- flags: getColumnVisibilityFlags(state.tableColumns, Status$1),
3412
- id: 'status',
3413
- label: status()
3414
- }, {
3415
- args: [Size],
3416
- command: 'ChatDebug.toggleTableColumnVisibility',
3417
- flags: getColumnVisibilityFlags(state.tableColumns, Size),
3418
- id: 'size',
3419
- label: size()
3420
- }, {
3421
- args: [Duration],
3422
- command: 'ChatDebug.toggleTableColumnVisibility',
3423
- flags: getColumnVisibilityFlags(state.tableColumns, Duration),
3424
- id: 'duration',
3425
- label: duration()
3426
- }, {
3491
+ return [...state.tableColumns.map(column => getColumnMenuEntry(column.name, column.label, column.isVisible)), {
3427
3492
  args: [],
3428
3493
  command: 'ChatDebug.resetTableColumns',
3429
3494
  flags: None$1,
@@ -3502,12 +3567,10 @@ const getMenuIds = () => {
3502
3567
  return [MenuChatDebugTableHeader, MenuChatDebugTableBody, 556, 557];
3503
3568
  };
3504
3569
 
3505
- const ParseChatDebugUriErrorCode = {
3506
- InvalidSessionId: 1,
3507
- InvalidUriEncoding: 2,
3508
- InvalidUriFormat: 3,
3509
- MissingUri: 4
3510
- };
3570
+ const InvalidSessionId = 1;
3571
+ const InvalidUriEncoding = 2;
3572
+ const InvalidUriFormat = 3;
3573
+ const MissingUri = 4;
3511
3574
 
3512
3575
  const ParseChatDebugUriResultType = {
3513
3576
  Error: 2,
@@ -3519,7 +3582,7 @@ const invalidSessionIdPattern = /[/?#]/;
3519
3582
  const parseChatDebugUri = uri => {
3520
3583
  if (!uri) {
3521
3584
  return {
3522
- code: ParseChatDebugUriErrorCode.MissingUri,
3585
+ code: MissingUri,
3523
3586
  message: missingUri(),
3524
3587
  type: ParseChatDebugUriResultType.Error
3525
3588
  };
@@ -3527,7 +3590,7 @@ const parseChatDebugUri = uri => {
3527
3590
  const match = uri.match(chatDebugUriPattern);
3528
3591
  if (!match) {
3529
3592
  return {
3530
- code: ParseChatDebugUriErrorCode.InvalidUriFormat,
3593
+ code: InvalidUriFormat,
3531
3594
  message: invalidUriFormat(),
3532
3595
  type: ParseChatDebugUriResultType.Error
3533
3596
  };
@@ -3538,14 +3601,14 @@ const parseChatDebugUri = uri => {
3538
3601
  sessionId = decodeURIComponent(encodedSessionId);
3539
3602
  } catch {
3540
3603
  return {
3541
- code: ParseChatDebugUriErrorCode.InvalidUriEncoding,
3604
+ code: InvalidUriEncoding,
3542
3605
  message: invalidUriEncoding(),
3543
3606
  type: ParseChatDebugUriResultType.Error
3544
3607
  };
3545
3608
  }
3546
3609
  if (!sessionId || invalidSessionIdPattern.test(sessionId)) {
3547
3610
  return {
3548
- code: ParseChatDebugUriErrorCode.InvalidSessionId,
3611
+ code: InvalidSessionId,
3549
3612
  message: invalidSessionId(),
3550
3613
  type: ParseChatDebugUriResultType.Error
3551
3614
  };
@@ -3565,7 +3628,7 @@ const getSessionIdFromUri = state => {
3565
3628
  };
3566
3629
 
3567
3630
  const getInvalidUriMessage = (uri, code) => {
3568
- if (code === ParseChatDebugUriErrorCode.MissingUri) {
3631
+ if (code === MissingUri) {
3569
3632
  return unableToLoadDebugSessionMissingUri();
3570
3633
  }
3571
3634
  return unableToLoadDebugSessionInvalidUri(uri);
@@ -3584,6 +3647,49 @@ const getEffectiveTimelineRange = (timelineStartSeconds, timelineEndSeconds, tim
3584
3647
  };
3585
3648
  };
3586
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
+
3587
3693
  const getTimelineEvents = state => {
3588
3694
  const {
3589
3695
  events,
@@ -3616,12 +3722,16 @@ const getStateWithTimelineInfo = state => {
3616
3722
  const effectiveRange = getEffectiveTimelineRange(state.timelineStartSeconds, state.timelineEndSeconds, state.timelineSelectionActive, state.timelineSelectionAnchorSeconds, state.timelineSelectionFocusSeconds);
3617
3723
  const timelineInfo = getTimelineInfo(timelineEvents, effectiveRange.startSeconds, effectiveRange.endSeconds);
3618
3724
  const timelineFilterDescription = getTimelineFilterDescription(state.timelineStartSeconds, state.timelineEndSeconds);
3619
- return {
3725
+ const nextState = {
3620
3726
  ...state,
3621
3727
  timelineEvents,
3622
3728
  timelineFilterDescription,
3623
3729
  timelineInfo
3624
3730
  };
3731
+ return {
3732
+ ...nextState,
3733
+ summaries: getTableSummaries(getCurrentEvents$1(nextState))
3734
+ };
3625
3735
  };
3626
3736
 
3627
3737
  const getStateWithInvalidUri = state => {
@@ -3691,7 +3801,7 @@ const getMergedRequestResponseEvent = (item, response) => {
3691
3801
  eventEndId: response.eventId,
3692
3802
  eventId: item.eventId,
3693
3803
  method: 'POST',
3694
- size: 0,
3804
+ size: getResponsePayloadSize(response),
3695
3805
  ...(started === undefined ? {} : {
3696
3806
  started
3697
3807
  }),
@@ -3708,7 +3818,7 @@ const getMergedRequestResponseEvent = (item, response) => {
3708
3818
  eventEndId: response.eventId,
3709
3819
  eventId: item.eventId,
3710
3820
  method: 'POST',
3711
- size: 0,
3821
+ size: getResponsePayloadSize(response),
3712
3822
  ...(started === undefined ? {} : {
3713
3823
  started
3714
3824
  }),
@@ -3759,7 +3869,10 @@ const listChatViewEvents = async (sessionId, _databaseName, _dataBaseVersion, _e
3759
3869
  };
3760
3870
 
3761
3871
  const restoreSelectedEvent = async state => {
3762
- if (state.selectedEventId === null) {
3872
+ const {
3873
+ selectedEventId
3874
+ } = state;
3875
+ if (selectedEventId === null) {
3763
3876
  return {
3764
3877
  ...state,
3765
3878
  previewTextCursorColumnIndex: null,
@@ -3860,11 +3973,14 @@ const loadEventsForSessionId = async (state, sessionId) => {
3860
3973
  };
3861
3974
 
3862
3975
  const refreshEvents = async state => {
3863
- const sessionId = state.sessionId || getSessionIdFromUri(state);
3864
- if (!sessionId) {
3976
+ const {
3977
+ sessionId
3978
+ } = state;
3979
+ const actual = sessionId || getSessionIdFromUri(state);
3980
+ if (!actual) {
3865
3981
  return getStateWithInvalidUri(state);
3866
3982
  }
3867
- return loadEventsForSessionId(state, sessionId);
3983
+ return loadEventsForSessionId(state, actual);
3868
3984
  };
3869
3985
 
3870
3986
  const refresh = async state => {
@@ -3919,6 +4035,9 @@ const handleEscape = state => {
3919
4035
  };
3920
4036
 
3921
4037
  const getEventIndexByStableId$1 = (events, event) => {
4038
+ if (typeof event.eventId !== 'number') {
4039
+ return -1;
4040
+ }
3922
4041
  return events.findIndex(candidate => candidate.eventId === event.eventId);
3923
4042
  };
3924
4043
 
@@ -4013,7 +4132,7 @@ const getBoolean = value => {
4013
4132
  const General = 'general';
4014
4133
  const RequestHeaders = 'requestHeaders';
4015
4134
  const ResponseHeaders = 'responseHeaders';
4016
- const headerSectionKeys = [General, RequestHeaders, ResponseHeaders];
4135
+ const headerSectionKeys = [General, ResponseHeaders, RequestHeaders];
4017
4136
  const isHeaderSectionKey = value => {
4018
4137
  return headerSectionKeys.includes(value);
4019
4138
  };
@@ -4046,6 +4165,9 @@ const parseTimelineRangePreset$1 = value => {
4046
4165
  };
4047
4166
  };
4048
4167
  const getEventIndexByStableId = (events, event) => {
4168
+ if (typeof event.eventId !== 'number') {
4169
+ return -1;
4170
+ }
4049
4171
  return events.findIndex(candidate => candidate.eventId === event.eventId);
4050
4172
  };
4051
4173
  const getSelectedEventIndex = state => {
@@ -4143,7 +4265,7 @@ const handleUseDevtoolsLayout = (state, _value, checked) => {
4143
4265
  const useDevtoolsLayout = getBoolean(checked);
4144
4266
  const selectedEventIndex = useDevtoolsLayout ? getSelectedEventIndex(state) : null;
4145
4267
  const hasSelectedEvent = useDevtoolsLayout && selectedEventIndex !== null;
4146
- return applyVirtualTableState({
4268
+ const nextState = {
4147
4269
  ...state,
4148
4270
  previewTextCursorColumnIndex: hasSelectedEvent ? state.previewTextCursorColumnIndex : null,
4149
4271
  previewTextCursorRowIndex: hasSelectedEvent ? state.previewTextCursorRowIndex : null,
@@ -4151,6 +4273,10 @@ const handleUseDevtoolsLayout = (state, _value, checked) => {
4151
4273
  selectedEventId: hasSelectedEvent ? state.selectedEventId : null,
4152
4274
  selectedEventIndex,
4153
4275
  useDevtoolsLayout
4276
+ };
4277
+ return applyVirtualTableState({
4278
+ ...nextState,
4279
+ tableWidth: shouldUseBalancedSplitTableWidth(nextState) ? getBalancedSplitTableWidth(nextState) : state.tableWidth
4154
4280
  });
4155
4281
  };
4156
4282
  const handleSelectedEventIndex = (state, value) => {
@@ -4574,9 +4700,6 @@ const getPreviewEvent = event => {
4574
4700
 
4575
4701
  const previewTextRowHeight = 20;
4576
4702
  const defaultPreviewTextColumnWidth = 9;
4577
- const clamp = (value, min, max) => {
4578
- return Math.min(Math.max(value, min), max);
4579
- };
4580
4703
  const getPreviewTextCursorFromPoint = (value, x, y) => {
4581
4704
  const lines = value.split('\n');
4582
4705
  const rowIndex = clamp(Math.floor(Math.max(y, 0) / previewTextRowHeight), 0, Math.max(lines.length - 1, 0));
@@ -4797,7 +4920,8 @@ const handleSashPointerMove = (state, eventX, eventY) => {
4797
4920
  }
4798
4921
  return {
4799
4922
  ...state,
4800
- tableWidth: getTableWidthFromClientX(state, eventX)
4923
+ tableWidth: getTableWidthFromClientX(state, eventX),
4924
+ tableWidthManuallyResized: true
4801
4925
  };
4802
4926
  };
4803
4927
 
@@ -4864,7 +4988,7 @@ const handleTableResizerPointerMove = (state, clientX) => {
4864
4988
  }
4865
4989
  return {
4866
4990
  ...state,
4867
- tableColumnWidths: getResizedTableColumnWidths(state, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths, clientX, state.tableResizerDownId)
4991
+ tableColumns: getResizedTableColumnWidths(state, getVisibleTableColumns(state.tableColumns), state.tableColumns, clientX, state.tableResizerDownId)
4868
4992
  };
4869
4993
  };
4870
4994
 
@@ -5203,17 +5327,22 @@ const handleTimelinePointerUp = (state, eventX) => {
5203
5327
  const setUseDevtoolsLayout = (state, checked) => {
5204
5328
  const useDevtoolsLayout = getBoolean(checked);
5205
5329
  const selectedEventIndex = useDevtoolsLayout ? getSelectedEventIndex$1(state) : null;
5206
- return applyVirtualTableState({
5330
+ const hasSelectedEvent = useDevtoolsLayout && selectedEventIndex !== null;
5331
+ const nextState = {
5207
5332
  ...state,
5208
- previewTextCursorColumnIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorColumnIndex : null,
5209
- previewTextCursorRowIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorRowIndex : null,
5210
- 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,
5211
5336
  previewTextScrollBarHandleOffset: 0,
5212
5337
  previewTextScrollBarPointerActive: false,
5213
- selectedEvent: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEvent : null,
5214
- selectedEventId: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEventId : null,
5338
+ selectedEvent: hasSelectedEvent ? state.selectedEvent : null,
5339
+ selectedEventId: hasSelectedEvent ? state.selectedEventId : null,
5215
5340
  selectedEventIndex,
5216
5341
  useDevtoolsLayout
5342
+ };
5343
+ return applyVirtualTableState({
5344
+ ...nextState,
5345
+ tableWidth: shouldUseBalancedSplitTableWidth(nextState) ? getBalancedSplitTableWidth(nextState) : state.tableWidth
5217
5346
  });
5218
5347
  };
5219
5348
 
@@ -5254,7 +5383,8 @@ const loadEventsFromUri = async state => {
5254
5383
 
5255
5384
  const loadContent = async (state, savedState) => {
5256
5385
  await getPreference('chatDebug.autoRefresh');
5257
- const nextState = await loadEventsFromUri(restoreSavedState(state, savedState));
5386
+ const restoredState = restoreSavedState(state, savedState);
5387
+ const nextState = await loadEventsFromUri(restoredState);
5258
5388
  if (nextState.sessionId) {
5259
5389
  try {
5260
5390
  await registerUpdateListener(nextState.sessionId, rpcId, nextState.uid);
@@ -5359,7 +5489,7 @@ const getCss = state => {
5359
5489
  if (state.width >= state.largeBreakpoint) {
5360
5490
  topSize = 30;
5361
5491
  }
5362
- const tableColumnLayout = getTableColumnLayout(tableContentWidth, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths);
5492
+ const tableColumnLayout = getTableColumnLayout(tableContentWidth, getVisibleTableColumns(state.tableColumns), state.tableColumns);
5363
5493
  const [tableColZeroWidth = 0, tableColOneWidth = 0, tableColTwoWidth = 0, tableColThreeWidth = 0, tableColFourWidth = 0] = tableColumnLayout.visibleColumnWidths;
5364
5494
  const resizerOneLeft = tableColumnLayout.resizerLefts[0] ?? 0;
5365
5495
  const resizerTwoLeft = tableColumnLayout.resizerLefts[1] ?? 0;
@@ -5384,7 +5514,7 @@ const getCss = state => {
5384
5514
  --ChatDebugViewPreviewScrollBarWidth: ${previewVirtualization.showScrollBar ? devtoolsTableScrollBarWidth : 0}px;
5385
5515
  --ChatDebugViewPreviewViewportHeight: ${previewVirtualization.viewportHeight}px;
5386
5516
  --ChatDebugViewDetailsWidth: ${detailsWidth}px;
5387
- --ChatDebugViewDurationColumnWidth: ${state.tableColumnWidths.duration}px;
5517
+ --ChatDebugViewDurationColumnWidth: ${getTableColumnWidth(state.tableColumns, Duration)}px;
5388
5518
  --ChatDebugViewTableRowHeight: ${devtoolsTableRowHeight}px;
5389
5519
  --ChatDebugViewTableScrollBarHeight: ${scrollBarHeight}px;
5390
5520
  --ChatDebugViewTableScrollBarOffset: ${scrollBarOffset}px;
@@ -5400,7 +5530,7 @@ const getCss = state => {
5400
5530
  --ChatDebugViewTimelineSelectionEndLeft: ${selectionEndPercent ?? 0}%;
5401
5531
  --ChatDebugViewTimelineSelectionStartLeft: ${selectionStartPercent ?? 0}%;
5402
5532
  --ChatDebugViewTopSize: ${topSize}px;
5403
- --ChatDebugViewTypeColumnWidth: ${state.tableColumnWidths.type}px;
5533
+ --ChatDebugViewTypeColumnWidth: ${getTableColumnWidth(state.tableColumns, Type)}px;
5404
5534
  padding: ${state.viewPadding}px;
5405
5535
  padding-right: 0;
5406
5536
  }
@@ -5565,6 +5695,14 @@ const getCss = state => {
5565
5695
  .ChatDebugViewHeadersCellName {
5566
5696
  font-weight: 500;
5567
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
+
5568
5706
  .PreviewVirtualizedEditor {
5569
5707
  height: var(--ChatDebugViewPreviewViewportHeight);
5570
5708
  overflow: hidden;
@@ -5972,6 +6110,7 @@ const ChatDebugViewHeadersRowEven = 'ChatDebugViewHeadersRowEven';
5972
6110
  const ChatDebugViewHeadersRowOdd = 'ChatDebugViewHeadersRowOdd';
5973
6111
  const ChatDebugViewHeadersSection = 'ChatDebugViewHeadersSection';
5974
6112
  const ChatDebugViewHeadersSectionHeading = 'ChatDebugViewHeadersSectionHeading';
6113
+ const ChatDebugViewHeadersSectionInfo = 'ChatDebugViewHeadersSectionInfo';
5975
6114
  const ChatDebugViewHeadersTable = 'ChatDebugViewHeadersTable';
5976
6115
  const ChatDebugViewDevtoolsSplit = 'ChatDebugViewDevtoolsSplit';
5977
6116
  const ChatDebugViewEmpty = 'ChatDebugViewEmpty';
@@ -6408,9 +6547,7 @@ const formatHttpStatusCode = value => {
6408
6547
  const isHeadersRecord = value => {
6409
6548
  return typeof value === 'object' && value !== null && !Array.isArray(value);
6410
6549
  };
6411
- const isNonEmptyString = value => {
6412
- return typeof value === 'string' && value.length > 0;
6413
- };
6550
+
6414
6551
  const getStatusCodeValue = selectedEvent => {
6415
6552
  if (!selectedEvent) {
6416
6553
  return undefined;
@@ -6427,6 +6564,36 @@ const getStatusCodeValue = selectedEvent => {
6427
6564
  }
6428
6565
  return undefined;
6429
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
+
6430
6597
  const stringifyHeaderValue = value => {
6431
6598
  try {
6432
6599
  return JSON.stringify(value, (_key, nestedValue) => {
@@ -6439,6 +6606,7 @@ const stringifyHeaderValue = value => {
6439
6606
  return '[unserializable]';
6440
6607
  }
6441
6608
  };
6609
+
6442
6610
  const getHeaderValueText = value => {
6443
6611
  if (typeof value === 'string') {
6444
6612
  return value;
@@ -6460,29 +6628,7 @@ const getHeaderValueText = value => {
6460
6628
  }
6461
6629
  return stringifyHeaderValue(value);
6462
6630
  };
6463
- const getHeaders = value => {
6464
- if (!isHeadersRecord(value)) {
6465
- return [];
6466
- }
6467
- return Object.entries(value);
6468
- };
6469
- const getGeneralEntries = selectedEvent => {
6470
- if (!selectedEvent) {
6471
- return [];
6472
- }
6473
- const entries = [];
6474
- if (isNonEmptyString(selectedEvent.url)) {
6475
- entries.push([requestUrl(), selectedEvent.url]);
6476
- }
6477
- if (isNonEmptyString(selectedEvent.method)) {
6478
- entries.push([requestMethod(), selectedEvent.method]);
6479
- }
6480
- const statusCode$1 = getStatusCodeValue(selectedEvent);
6481
- if (statusCode$1 !== undefined && statusCode$1 !== '') {
6482
- entries.push([statusCode(), formatHttpStatusCode(statusCode$1)]);
6483
- }
6484
- return entries;
6485
- };
6631
+
6486
6632
  const getHeaderRowNodes = (headerName, headerValue, index) => {
6487
6633
  return [{
6488
6634
  childCount: 2,
@@ -6498,6 +6644,7 @@ const getHeaderRowNodes = (headerName, headerValue, index) => {
6498
6644
  type: Div
6499
6645
  }, text(getHeaderValueText(headerValue))];
6500
6646
  };
6647
+
6501
6648
  const getHeadersTableNodes = headers => {
6502
6649
  const headerRows = [];
6503
6650
  for (const [index, [headerName, headerValue]] of headers.entries()) {
@@ -6509,13 +6656,17 @@ const getHeadersTableNodes = headers => {
6509
6656
  type: Ul
6510
6657
  }, ...headerRows];
6511
6658
  };
6512
- const getHeaderSectionNodes = (section, label, headers, collapsedHeaderSections) => {
6659
+
6660
+ const getHeaderSectionNodes = (section, label, headers, collapsedHeaderSections, infoMessage = '') => {
6513
6661
  const isCollapsed = collapsedHeaderSections.includes(section);
6662
+ const hasInfoMessage = !isCollapsed && infoMessage !== '';
6663
+ const childCount = isCollapsed ? 1 : 2 + Number(hasInfoMessage);
6514
6664
  return [{
6515
- childCount: isCollapsed ? 1 : 2,
6665
+ childCount,
6516
6666
  className: ChatDebugViewHeadersSection,
6517
6667
  type: Div
6518
6668
  }, {
6669
+ ariaExpanded: !isCollapsed,
6519
6670
  childCount: 1,
6520
6671
  className: ChatDebugViewHeadersSectionHeading,
6521
6672
  name: ToggleHeadersSection,
@@ -6523,8 +6674,13 @@ const getHeaderSectionNodes = (section, label, headers, collapsedHeaderSections)
6523
6674
  onClick: HandleFilterInput,
6524
6675
  type: Button$1,
6525
6676
  value: section
6526
- }, text(label), ...(isCollapsed ? [] : getHeadersTableNodes(headers))];
6677
+ }, text(label), ...(isCollapsed ? [] : getHeadersTableNodes(headers)), ...(hasInfoMessage ? [{
6678
+ childCount: 1,
6679
+ className: ChatDebugViewHeadersSectionInfo,
6680
+ type: Div
6681
+ }, text(infoMessage)] : [])];
6527
6682
  };
6683
+
6528
6684
  const getHeadersContentNodes = (responseEventNodes, selectedEvent, collapsedHeaderSections = []) => {
6529
6685
  const generalEntries = getGeneralEntries(selectedEvent);
6530
6686
  const requestHeaders$1 = getHeaders(selectedEvent?.headers);
@@ -6536,12 +6692,12 @@ const getHeadersContentNodes = (responseEventNodes, selectedEvent, collapsedHead
6536
6692
  if (generalEntries.length > 0) {
6537
6693
  nodes.push(...getHeaderSectionNodes(General, general(), generalEntries, collapsedHeaderSections));
6538
6694
  }
6695
+ if (responseHeaders$1.length > 0) {
6696
+ nodes.push(...getHeaderSectionNodes(ResponseHeaders, responseHeaders(), responseHeaders$1, collapsedHeaderSections, responseHeadersInfo()));
6697
+ }
6539
6698
  if (requestHeaders$1.length > 0) {
6540
6699
  nodes.push(...getHeaderSectionNodes(RequestHeaders, requestHeaders(), requestHeaders$1, collapsedHeaderSections));
6541
6700
  }
6542
- if (responseHeaders$1.length > 0) {
6543
- nodes.push(...getHeaderSectionNodes(ResponseHeaders, responseHeaders(), responseHeaders$1, collapsedHeaderSections));
6544
- }
6545
6701
  return nodes;
6546
6702
  };
6547
6703
 
@@ -7841,59 +7997,42 @@ const getSplitViewDom = (splitChildCount, eventsClassName, tableNodes, sashNodes
7841
7997
  }, ...tableNodes, ...sashNodes, ...detailsNodes];
7842
7998
  };
7843
7999
 
7844
- const formatTimelineMilliseconds = value => {
7845
- return `${Math.round(value * 1000)}ms`;
7846
- };
7847
-
7848
- const formatTimelineSeconds = value => {
7849
- if (Number.isInteger(value)) {
7850
- return `${value}s`;
7851
- }
7852
- return `${Number(value.toFixed(1))}s`;
7853
- };
7854
-
7855
- const getEndTime = event => {
7856
- return event.ended ?? event.endTime ?? event.timestamp;
7857
- };
7858
-
7859
- const getStartTime = event => {
7860
- return event.started ?? event.startTime ?? event.timestamp;
7861
- };
7862
-
7863
- const formatTableSummaryDuration = durationMs => {
7864
- if (durationMs < 1000) {
7865
- return formatTimelineMilliseconds(durationMs / 1000);
7866
- }
7867
- return formatTimelineSeconds(durationMs / 1000);
7868
- };
7869
- const getTableSummary = events => {
7870
- let minStart = Number.POSITIVE_INFINITY;
7871
- let maxEnd = Number.NEGATIVE_INFINITY;
7872
- for (const event of events) {
7873
- const startTime = toTimeNumber(getStartTime(event));
7874
- const endTime = toTimeNumber(getEndTime(event));
7875
- if (typeof startTime === 'number' && Number.isFinite(startTime)) {
7876
- minStart = Math.min(minStart, startTime);
7877
- }
7878
- if (typeof endTime === 'number' && Number.isFinite(endTime)) {
7879
- maxEnd = Math.max(maxEnd, endTime);
7880
- }
7881
- }
7882
- const durationMs = Number.isFinite(minStart) && Number.isFinite(maxEnd) ? Math.max(0, maxEnd - minStart) : 0;
7883
- return tableSummary(events.length, formatTableSummaryDuration(durationMs));
7884
- };
7885
-
7886
8000
  const tableSummaryNode = {
7887
- childCount: 1,
8001
+ childCount: 0,
7888
8002
  className: TableSummary,
7889
8003
  role: Status,
7890
8004
  type: Div
7891
8005
  };
7892
- const getTableSummaryDom = summary => {
7893
- 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) {
7894
8026
  return [];
7895
8027
  }
7896
- 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;
7897
8036
  };
7898
8037
 
7899
8038
  const getTableBodyDom = (rowNodes, eventCount) => {
@@ -7952,7 +8091,7 @@ const getTableHeaderDom = (visibleTableColumns = defaultVisibleTableColumns, tab
7952
8091
  }, ...getHeaderCellNodes(visibleTableColumns, tableColumns)];
7953
8092
  };
7954
8093
 
7955
- const getTableDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0) => {
8094
+ const getTableDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summaries = [], focus = 0) => {
7956
8095
  return [{
7957
8096
  childCount: 3,
7958
8097
  className: Table,
@@ -8009,7 +8148,7 @@ const getTableScrollBarDom = visible => {
8009
8148
  }];
8010
8149
  };
8011
8150
 
8012
- 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) => {
8013
8152
  const tableWrapperClassName = mergeClassNames(TableWrapper, focus === FocusChatDebugTable ? FocusOutline : '', className);
8014
8153
  const tableWrapperNode = {
8015
8154
  childCount: showScrollBar ? 3 : 2,
@@ -8020,16 +8159,16 @@ const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultV
8020
8159
  role
8021
8160
  } : {})
8022
8161
  };
8023
- 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)];
8024
8163
  };
8025
8164
 
8026
- const getTableWrapperWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = 'none', showScrollBar = false) => {
8027
- 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);
8028
8167
  return [{
8029
8168
  childCount: tableSummaryNodes.length === 0 ? 1 : 2,
8030
8169
  className: TableWrapperWrapper,
8031
8170
  type: Div
8032
- }, ...getTableWrapperDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus, className, role, showScrollBar), ...tableSummaryNodes];
8171
+ }, ...getTableWrapperDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summaries, focus, className, role, showScrollBar), ...tableSummaryNodes];
8033
8172
  };
8034
8173
 
8035
8174
  const getBucketUnitDom = (unitCount, presetValue) => {
@@ -8202,7 +8341,7 @@ const getTimelineDom = (timelineInfo, hoverPercent = null) => {
8202
8341
  }, ...selectionNodes];
8203
8342
  };
8204
8343
 
8205
- 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 = []) => {
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)) => {
8206
8345
  const visibleEvents = events.slice(minLineY, maxLineY);
8207
8346
  const rows = createDevtoolsRows(visibleEvents, selectedEventIndex, minLineY);
8208
8347
  const rowNodes = getDevtoolsRows(rows, visibleTableColumns);
@@ -8224,9 +8363,8 @@ const getDevtoolsDom = (events, selectedEvent, selectedEventIndex, timelineEvent
8224
8363
  const responseEventNodes = selectedEvent ? getEventNode(getResponseEvent(selectedEvent)) : [];
8225
8364
  const hasSelectedEvent = !!selectedEvent;
8226
8365
  const eventsClassName = getEventsClassName(hasSelectedEvent);
8227
- const summary = getTableSummary(events);
8228
8366
  const showScrollBar = visibleEvents.length < events.length;
8229
- const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableWrapperWrapperDom(rowNodes, visibleEvents.length, visibleTableColumns, tableColumns, summary, focus, '', '', showScrollBar);
8367
+ const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableWrapperWrapperDom(rowNodes, visibleEvents.length, visibleTableColumns, tableColumns, summaries, focus, '', '', showScrollBar);
8230
8368
  const detailsNodes = getDetailsDom(previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, detailTabs, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualizationOptions, collapsedHeaderSections);
8231
8369
  const sashNodes = getSashNodesDom(hasSelectedEvent);
8232
8370
  const splitChildCount = hasSelectedEvent ? 3 : 1;
@@ -8281,7 +8419,7 @@ const getEventCategoryFilterDescription = eventCategoryFilters => {
8281
8419
  }
8282
8420
  return eventCategoryFilters.map(eventCategoryFilter => getEventCategoryFilterLabel(eventCategoryFilter).toLowerCase()).join(', ');
8283
8421
  };
8284
- 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 = []) => {
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)) => {
8285
8423
  if (errorMessage) {
8286
8424
  return getDebugErrorDom(errorMessage);
8287
8425
  }
@@ -8305,7 +8443,7 @@ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilters, ca
8305
8443
  const emptyMessage = getEmptyMessage(events.length, hasFilterValue, useNoToolCallEventsMessage, noFilteredEventsMessage);
8306
8444
  const safeSelectedEventIndex = selectedEventIndex === null || selectedEventIndex < 0 || selectedEventIndex >= events.length ? null : selectedEventIndex;
8307
8445
  if (useDevtoolsLayout) {
8308
- 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);
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);
8309
8447
  const devtoolsContentNodes = devtoolsDom.slice(1);
8310
8448
  const topLevelNodes = [...getDebugViewTopDom(filterValue, useDevtoolsLayout, categoryFilters), ...devtoolsContentNodes];
8311
8449
  const rootChildCount = getTopLevelChildCount(topLevelNodes);
@@ -8341,7 +8479,7 @@ const renderItems = (oldState, newState) => {
8341
8479
  }
8342
8480
  const filteredEvents = getCurrentEvents$1(newState);
8343
8481
  const previewTextViewportHeight = getPreviewTextViewportHeight(newState);
8344
- 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);
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);
8345
8483
  return [SetDom2, newState.uid, dom];
8346
8484
  };
8347
8485
 
@@ -8547,15 +8685,20 @@ const rerender = state => {
8547
8685
  };
8548
8686
 
8549
8687
  const resetTableColumns = state => {
8550
- 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) {
8551
8695
  return state;
8552
8696
  }
8553
8697
  return {
8554
8698
  ...state,
8555
8699
  sortColumn: '',
8556
8700
  sortDescending: false,
8557
- tableColumns: createTableColumns(),
8558
- tableColumnWidths: defaultTableColumnWidths
8701
+ tableColumns: defaultTableColumns
8559
8702
  };
8560
8703
  };
8561
8704
 
@@ -8564,9 +8707,10 @@ const handleResize = (state, dimensions) => {
8564
8707
  ...state,
8565
8708
  ...dimensions
8566
8709
  };
8710
+ const tableWidth = shouldUseBalancedSplitTableWidth(nextState) ? getBalancedSplitTableWidth(nextState) : clampTableWidth(nextState, state.tableWidth);
8567
8711
  return applyVirtualTableState({
8568
8712
  ...nextState,
8569
- tableWidth: clampTableWidth(nextState, state.tableWidth)
8713
+ tableWidth
8570
8714
  });
8571
8715
  };
8572
8716
 
@@ -8588,7 +8732,6 @@ const saveState = state => {
8588
8732
  selectedEventId,
8589
8733
  sessionId,
8590
8734
  tableColumns,
8591
- tableColumnWidths,
8592
8735
  timelineEndSeconds,
8593
8736
  timelineStartSeconds
8594
8737
  } = state;
@@ -8599,7 +8742,7 @@ const saveState = state => {
8599
8742
  selectedDetailTab: getSelectedDetailTab(detailTabs),
8600
8743
  selectedEventId,
8601
8744
  sessionId,
8602
- tableColumnWidths,
8745
+ tableColumnWidths: getTableColumnWidths(tableColumns),
8603
8746
  timelineEndSeconds,
8604
8747
  timelineStartSeconds,
8605
8748
  visibleTableColumns: getVisibleTableColumns(tableColumns)
@@ -8673,12 +8816,15 @@ const setSessionId = async (state, sessionId) => {
8673
8816
  };
8674
8817
 
8675
8818
  const toggleTableColumnVisibility = (state, column) => {
8819
+ const {
8820
+ tableColumns
8821
+ } = state;
8676
8822
  if (!isTableColumn(column)) {
8677
8823
  return state;
8678
8824
  }
8679
8825
  return {
8680
8826
  ...state,
8681
- tableColumns: state.tableColumns.map(tableColumn => {
8827
+ tableColumns: tableColumns.map(tableColumn => {
8682
8828
  if (tableColumn.name !== column) {
8683
8829
  return tableColumn;
8684
8830
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/chat-debug-view",
3
- "version": "10.21.0",
3
+ "version": "10.22.0",
4
4
  "description": "Chat Debug View Worker",
5
5
  "repository": {
6
6
  "type": "git",