@lvce-editor/chat-debug-view 10.19.0 → 10.21.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.
@@ -1377,14 +1377,6 @@ const appendStoredImageAttachmentForTest = async (state, sessionId, eventId, mim
1377
1377
  return state;
1378
1378
  };
1379
1379
 
1380
- const decodeBase64 = value => {
1381
- const decoded = atob(value);
1382
- const bytes = new Uint8Array(decoded.length);
1383
- for (let i = 0; i < decoded.length; i++) {
1384
- bytes[i] = decoded.codePointAt(i) || 0;
1385
- }
1386
- return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
1387
- };
1388
1380
  const createCanvasBlob = async mimeType => {
1389
1381
  const canvas = new OffscreenCanvas(2, 2);
1390
1382
  const context = canvas.getContext('2d');
@@ -1397,6 +1389,16 @@ const createCanvasBlob = async mimeType => {
1397
1389
  type: mimeType
1398
1390
  });
1399
1391
  };
1392
+
1393
+ const decodeBase64 = value => {
1394
+ const decoded = atob(value);
1395
+ const bytes = new Uint8Array(decoded.length);
1396
+ for (let i = 0; i < decoded.length; i++) {
1397
+ bytes[i] = decoded.codePointAt(i) || 0;
1398
+ }
1399
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
1400
+ };
1401
+
1400
1402
  const createBlob = async (mimeType, contentKind, content) => {
1401
1403
  if (contentKind === 'canvas') {
1402
1404
  return createCanvasBlob(mimeType);
@@ -1410,6 +1412,7 @@ const createBlob = async (mimeType, contentKind, content) => {
1410
1412
  type: mimeType
1411
1413
  });
1412
1414
  };
1415
+
1413
1416
  const appendStoredRemovedImageAttachmentForTest = async (state, sessionId, eventId, mimeType, name, contentKind, content, timestamp) => {
1414
1417
  const blob = await createBlob(mimeType, contentKind, content);
1415
1418
  await appendEvent({
@@ -1438,6 +1441,7 @@ const TimelineStartSeconds = 'timelineStartSeconds';
1438
1441
  const TimelineEndSeconds = 'timelineEndSeconds';
1439
1442
  const TimelineRangePreset = 'timelineRangePreset';
1440
1443
  const Refresh$1 = 'refresh';
1444
+ const ToggleHeadersSection = 'toggleHeadersSection';
1441
1445
  const All$1 = 'all';
1442
1446
  const Tools$1 = 'tools';
1443
1447
  const Network$1 = 'network';
@@ -1473,7 +1477,7 @@ const FailedToLoadChatDebugSession = 'Failed to load chat debug session "{PH1}".
1473
1477
  const FailedToLoadChatDebugSessionWithError = 'Failed to load chat debug session "{PH1}": {PH2}';
1474
1478
  const FilterEvents = 'Filter events';
1475
1479
  const FromSeconds = 'from {PH1}s';
1476
- const General = 'General';
1480
+ const General$1 = 'General';
1477
1481
  const Headers = 'Headers';
1478
1482
  const ImageCouldNotBeLoaded = 'image could not be loaded';
1479
1483
  const InputTokens = 'Input Tokens';
@@ -1494,12 +1498,13 @@ const Preview = 'Preview';
1494
1498
  const Refresh = 'Refresh';
1495
1499
  const RefreshEvents = 'Refresh events';
1496
1500
  const ResetColumns = 'Reset columns';
1497
- const RequestHeaders = 'Request Headers';
1501
+ const RequestHeaders$1 = 'Request Headers';
1498
1502
  const RequestMethod = 'Request Method';
1499
1503
  const RequestUrl = 'Request URL';
1500
1504
  const Response = 'Response';
1501
- const ResponseHeaders = 'Response Headers';
1505
+ const ResponseHeaders$1 = 'Response Headers';
1502
1506
  const SecondsRange = '{PH1}s-{PH2}s';
1507
+ const Size$1 = 'Size';
1503
1508
  const Started = 'Started';
1504
1509
  const Status$2 = 'Status';
1505
1510
  const StatusCode = 'Status Code';
@@ -1563,7 +1568,7 @@ const fromSeconds = seconds => {
1563
1568
  });
1564
1569
  };
1565
1570
  const general = () => {
1566
- return i18nString(General);
1571
+ return i18nString(General$1);
1567
1572
  };
1568
1573
  const headers = () => {
1569
1574
  return i18nString(Headers);
@@ -1624,7 +1629,7 @@ const refreshEvents$1 = () => {
1624
1629
  return i18nString(RefreshEvents);
1625
1630
  };
1626
1631
  const requestHeaders = () => {
1627
- return i18nString(RequestHeaders);
1632
+ return i18nString(RequestHeaders$1);
1628
1633
  };
1629
1634
  const requestMethod = () => {
1630
1635
  return i18nString(RequestMethod);
@@ -1633,7 +1638,7 @@ const requestUrl = () => {
1633
1638
  return i18nString(RequestUrl);
1634
1639
  };
1635
1640
  const responseHeaders = () => {
1636
- return i18nString(ResponseHeaders);
1641
+ return i18nString(ResponseHeaders$1);
1637
1642
  };
1638
1643
  const resetColumns = () => {
1639
1644
  return i18nString(ResetColumns);
@@ -1641,6 +1646,9 @@ const resetColumns = () => {
1641
1646
  const response = () => {
1642
1647
  return i18nString(Response);
1643
1648
  };
1649
+ const size = () => {
1650
+ return i18nString(Size$1);
1651
+ };
1644
1652
  const secondsRange = (start, end) => {
1645
1653
  return i18nString(SecondsRange, {
1646
1654
  PH1: start,
@@ -1842,7 +1850,8 @@ const Type = 'type';
1842
1850
  const Method = 'method';
1843
1851
  const Duration = 'duration';
1844
1852
  const Status$1 = 'status';
1845
- const tableColumnNames = [Type, Method, Status$1, Duration];
1853
+ const Size = 'size';
1854
+ const tableColumnNames = [Type, Method, Status$1, Size, Duration];
1846
1855
  const createTableColumns = () => {
1847
1856
  return [{
1848
1857
  isVisible: true,
@@ -1856,6 +1865,10 @@ const createTableColumns = () => {
1856
1865
  isVisible: true,
1857
1866
  label: status(),
1858
1867
  name: Status$1
1868
+ }, {
1869
+ isVisible: true,
1870
+ label: size(),
1871
+ name: Size
1859
1872
  }, {
1860
1873
  isVisible: true,
1861
1874
  label: duration(),
@@ -1893,6 +1906,8 @@ const getTableColumnLabel = (tableColumns, name) => {
1893
1906
  return duration();
1894
1907
  case Method:
1895
1908
  return method();
1909
+ case Size:
1910
+ return size();
1896
1911
  case Status$1:
1897
1912
  return status();
1898
1913
  case Type:
@@ -1905,6 +1920,7 @@ const getTableColumnLabel = (tableColumns, name) => {
1905
1920
  const defaultTableColumnWidths = {
1906
1921
  duration: 110,
1907
1922
  method: 90,
1923
+ size: 100,
1908
1924
  status: 110,
1909
1925
  type: 260
1910
1926
  };
@@ -1931,6 +1947,7 @@ const getTableWidthFromClientX = (state, clientX) => {
1931
1947
  const minimumTableColumnWidths = {
1932
1948
  [Duration]: 80,
1933
1949
  [Method]: 56,
1950
+ [Size]: 80,
1934
1951
  [Status$1]: 56,
1935
1952
  [Type]: 80
1936
1953
  };
@@ -1999,7 +2016,7 @@ const getResizedTableColumnWidths = (state, visibleTableColumns, tableColumnWidt
1999
2016
  };
2000
2017
 
2001
2018
  const isSameTableColumnWidths = (first, second) => {
2002
- return first.type === second.type && first.method === second.method && first.duration === second.duration && first.status === second.status;
2019
+ return first.type === second.type && first.method === second.method && first.duration === second.duration && first.size === second.size && first.status === second.status;
2003
2020
  };
2004
2021
 
2005
2022
  const isFiniteNumber = value => {
@@ -2011,13 +2028,20 @@ const isTableColumnWidths = value => {
2011
2028
  return false;
2012
2029
  }
2013
2030
  const record = value;
2014
- return isFiniteNumber(record.type) && isFiniteNumber(record.method) && isFiniteNumber(record.duration) && isFiniteNumber(record.status);
2031
+ return isFiniteNumber(record.type) && isFiniteNumber(record.method) && isFiniteNumber(record.duration) && isFiniteNumber(record.size) && isFiniteNumber(record.status);
2015
2032
  };
2016
2033
 
2017
2034
  const validEventCategoryFilters = new Set([All$1, Network$1, Stream$1, Tools$1, Ui$1]);
2018
2035
  const isSavedState = value => {
2019
2036
  return typeof value === 'object' && value !== null;
2020
2037
  };
2038
+ const isLegacyTableColumnWidths = value => {
2039
+ if (typeof value !== 'object' || value === null) {
2040
+ return false;
2041
+ }
2042
+ const record = value;
2043
+ return typeof record.duration === 'number' && Number.isFinite(record.duration) && typeof record.method === 'number' && Number.isFinite(record.method) && typeof record.status === 'number' && Number.isFinite(record.status) && typeof record.type === 'number' && Number.isFinite(record.type) && !('size' in record);
2044
+ };
2021
2045
  const restoreCategoryFilters = (savedState, currentCategoryFilters) => {
2022
2046
  if (Array.isArray(savedState.eventCategoryFilters)) {
2023
2047
  return selectCategoryFilters(currentCategoryFilters, savedState.eventCategoryFilters.filter(value => typeof value === 'string'));
@@ -2050,10 +2074,31 @@ const restoreVisibleTableColumns = (savedState, currentTableColumns) => {
2050
2074
  return currentTableColumns;
2051
2075
  }
2052
2076
  const visibleTableColumns = savedState.visibleTableColumns.filter(value => typeof value === 'string');
2077
+ if (isLegacyTableColumnWidths(savedState.tableColumnWidths)) {
2078
+ const savedVisibleColumns = new Set(visibleTableColumns);
2079
+ const visibleColumnsWithDefaults = currentTableColumns.filter(column => savedVisibleColumns.has(column.name) || column.name === 'size').map(column => column.name);
2080
+ return getTableColumnsWithVisibility(currentTableColumns, visibleColumnsWithDefaults);
2081
+ }
2053
2082
  return getTableColumnsWithVisibility(currentTableColumns, visibleTableColumns);
2054
2083
  };
2055
2084
  const restoreTableColumnWidths = (savedState, currentTableColumnWidths) => {
2056
- return isTableColumnWidths(savedState.tableColumnWidths) ? savedState.tableColumnWidths : currentTableColumnWidths;
2085
+ const {
2086
+ tableColumnWidths: savedTableColumnWidths
2087
+ } = savedState;
2088
+ if (isTableColumnWidths(savedTableColumnWidths)) {
2089
+ return savedTableColumnWidths;
2090
+ }
2091
+ if (isLegacyTableColumnWidths(savedTableColumnWidths)) {
2092
+ const legacyTableColumnWidths = savedTableColumnWidths;
2093
+ return {
2094
+ duration: legacyTableColumnWidths.duration,
2095
+ method: legacyTableColumnWidths.method,
2096
+ size: currentTableColumnWidths.size,
2097
+ status: legacyTableColumnWidths.status,
2098
+ type: legacyTableColumnWidths.type
2099
+ };
2100
+ }
2101
+ return currentTableColumnWidths;
2057
2102
  };
2058
2103
  const restoreSavedState = (state, savedState) => {
2059
2104
  if (!isSavedState(savedState)) {
@@ -2105,21 +2150,37 @@ const hasTimingDetails = event => {
2105
2150
  return hasDuration || hasStart && hasEnd;
2106
2151
  };
2107
2152
 
2108
- const getResponseEvent = event => {
2109
- // @ts-ignore
2110
- if (event && event.endValue && event.endValue.value) {
2111
- // @ts-ignore
2112
- return event.endValue.value;
2153
+ const getEndValueResponseData = event => {
2154
+ const endValue = event.endValue;
2155
+ if (!endValue || endValue.value === undefined) {
2156
+ return undefined;
2113
2157
  }
2158
+ return endValue.value;
2159
+ };
2160
+ const getMergedResponseData = event => {
2114
2161
  const {
2115
2162
  responseEvent
2116
2163
  } = event;
2117
- if (responseEvent && typeof responseEvent === 'object' && typeof responseEvent.type === 'string') {
2118
- const mergedResponseEvent = responseEvent;
2119
- if (mergedResponseEvent.value !== undefined) {
2120
- return mergedResponseEvent.value;
2121
- }
2122
- return responseEvent;
2164
+ if (!responseEvent || typeof responseEvent !== 'object' || typeof responseEvent.type !== 'string') {
2165
+ return undefined;
2166
+ }
2167
+ const mergedResponseEvent = responseEvent;
2168
+ if (mergedResponseEvent.value !== undefined) {
2169
+ return mergedResponseEvent.value;
2170
+ }
2171
+ return responseEvent;
2172
+ };
2173
+ const getResponseData = event => {
2174
+ const endValueResponseData = getEndValueResponseData(event);
2175
+ if (endValueResponseData !== undefined) {
2176
+ return endValueResponseData;
2177
+ }
2178
+ return getMergedResponseData(event);
2179
+ };
2180
+ const getResponseEvent = event => {
2181
+ const responseData = getResponseData(event);
2182
+ if (responseData !== undefined) {
2183
+ return responseData;
2123
2184
  }
2124
2185
  return event;
2125
2186
  };
@@ -2381,6 +2442,7 @@ const createDefaultState = () => {
2381
2442
  return {
2382
2443
  assetDir: '',
2383
2444
  categoryFilters: createCategoryFilters(),
2445
+ collapsedHeaderSections: [],
2384
2446
  databaseName: 'lvce-chat-view-sessions',
2385
2447
  dataBaseVersion: 2,
2386
2448
  defaultTableWidth,
@@ -2464,7 +2526,6 @@ const create = (uid, uri, x, y, width, height, platform, assetDir, sessionId = '
2464
2526
  platform,
2465
2527
  sessionId,
2466
2528
  sessionIdIndexName,
2467
- tableColumns: [],
2468
2529
  uid,
2469
2530
  uri,
2470
2531
  width,
@@ -2481,7 +2542,7 @@ const RenderFocusContext = 4;
2481
2542
  const RenderFocus = 5;
2482
2543
 
2483
2544
  const diff = (oldState, newState) => {
2484
- 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) {
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) {
2485
2546
  return [RenderIncremental, RenderCss];
2486
2547
  }
2487
2548
  return [];
@@ -2741,25 +2802,38 @@ const getFilteredEvents = (events, filterValue, eventCategoryFilters, showInputE
2741
2802
  return filteredByCategory.filter(event => JSON.stringify(event).toLowerCase().includes(filterText));
2742
2803
  };
2743
2804
 
2805
+ const formatDurationSeconds = value => {
2806
+ return `${value.toFixed(1)}s`;
2807
+ };
2808
+
2809
+ const formatDurationText = durationMs => {
2810
+ if (durationMs >= 1000) {
2811
+ return formatDurationSeconds(durationMs / 1000);
2812
+ }
2813
+ return `${durationMs}ms`;
2814
+ };
2744
2815
  const getDurationText = event => {
2745
2816
  if (event.time) {
2746
2817
  return event.time;
2747
2818
  }
2748
2819
  const explicitDuration = event.durationMs ?? event.duration;
2749
2820
  if (typeof explicitDuration === 'number' && Number.isFinite(explicitDuration)) {
2750
- return `${explicitDuration}ms`;
2821
+ return formatDurationText(explicitDuration);
2751
2822
  }
2752
2823
  const start = toTimeNumber(event.started ?? event.startTime ?? event.startTimestamp ?? event.timestamp);
2753
2824
  const end = toTimeNumber(event.ended ?? event.endTime ?? event.endTimestamp ?? event.timestamp);
2754
2825
  if (start === undefined || end === undefined || end < start) {
2755
2826
  return '-';
2756
2827
  }
2757
- return `${end - start}ms`;
2828
+ return formatDurationText(end - start);
2758
2829
  };
2759
2830
 
2760
2831
  const getEventTableDurationText = event => {
2761
2832
  const durationText = getDurationText(event);
2762
2833
  if (!durationText.endsWith('ms')) {
2834
+ if (durationText.endsWith('s')) {
2835
+ return `${durationText.slice(0, -1)} s`;
2836
+ }
2763
2837
  return durationText;
2764
2838
  }
2765
2839
  return `${durationText.slice(0, -2)} ms`;
@@ -2858,10 +2932,19 @@ const getStatusText = event => {
2858
2932
  return hasErrorStatus(event) ? '400' : '200';
2859
2933
  };
2860
2934
 
2935
+ const getSizeSortValue = event => {
2936
+ const rawSize = event.size;
2937
+ if (typeof rawSize !== 'number' || !Number.isFinite(rawSize)) {
2938
+ return '0000000000000000';
2939
+ }
2940
+ return String(Math.max(0, Math.trunc(rawSize))).padStart(16, '0');
2941
+ };
2861
2942
  const getEventTableColumnValue = (event, column) => {
2862
2943
  switch (column) {
2863
2944
  case Duration:
2864
2945
  return getEventTableDurationText(event);
2946
+ case Size:
2947
+ return getSizeSortValue(event);
2865
2948
  case Status$1:
2866
2949
  return getStatusText(event);
2867
2950
  case Type:
@@ -3083,11 +3166,26 @@ const getAttachmentImagePreviewMimeType = event => {
3083
3166
  return typeof event.mimeType === 'string' ? event.mimeType : undefined;
3084
3167
  };
3085
3168
 
3086
- const formatImageSize = size => {
3087
- if (size < 1024) {
3088
- return `${size} B`;
3169
+ const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB'];
3170
+ const formatBytes = size => {
3171
+ if (!Number.isFinite(size) || size <= 0) {
3172
+ return '0 B';
3089
3173
  }
3090
- return `${(size / 1024).toFixed(1)} kB`;
3174
+ let value = size;
3175
+ let unitIndex = 0;
3176
+ while (value >= 1024 && unitIndex < units.length - 1) {
3177
+ value /= 1024;
3178
+ unitIndex++;
3179
+ }
3180
+ if (unitIndex === 0) {
3181
+ return `${Math.trunc(value)} ${units[unitIndex]}`;
3182
+ }
3183
+ const formatted = value >= 10 ? value.toFixed(0) : value.toFixed(1);
3184
+ return `${formatted} ${units[unitIndex]}`;
3185
+ };
3186
+
3187
+ const formatImageSize = size => {
3188
+ return formatBytes(size);
3091
3189
  };
3092
3190
 
3093
3191
  const formatImageStats = (width, height, size) => {
@@ -3313,6 +3411,12 @@ const getMenuEntriesTableHeader = state => {
3313
3411
  flags: getColumnVisibilityFlags(state.tableColumns, Status$1),
3314
3412
  id: 'status',
3315
3413
  label: status()
3414
+ }, {
3415
+ args: [Size],
3416
+ command: 'ChatDebug.toggleTableColumnVisibility',
3417
+ flags: getColumnVisibilityFlags(state.tableColumns, Size),
3418
+ id: 'size',
3419
+ label: size()
3316
3420
  }, {
3317
3421
  args: [Duration],
3318
3422
  command: 'ChatDebug.toggleTableColumnVisibility',
@@ -3398,102 +3502,6 @@ const getMenuIds = () => {
3398
3502
  return [MenuChatDebugTableHeader, MenuChatDebugTableBody, 556, 557];
3399
3503
  };
3400
3504
 
3401
- const getResponseMap = events => {
3402
- const seen = Object.create(null);
3403
- for (const event of events) {
3404
- if (event.type === 'ai-response' && 'requestId' in event && typeof event.requestId === 'string') {
3405
- seen[event.requestId] = event;
3406
- }
3407
- }
3408
- return seen;
3409
- };
3410
-
3411
- const getMergedRequestResponseEvent = (item, response) => {
3412
- const parsedStart = new Date(item.timestamp || '');
3413
- const parsedEnd = new Date(response.timestamp || '');
3414
- const durationMs = parsedEnd.getTime() - parsedStart.getTime();
3415
- const started = getStartedTimestamp(item);
3416
- const ended = getEndedTimestamp(response);
3417
- const timestamp = item.timestamp ?? started;
3418
- if (Number.isFinite(durationMs) && durationMs >= 0) {
3419
- return {
3420
- durationMs,
3421
- ...(ended === undefined ? {} : {
3422
- ended
3423
- }),
3424
- eventEndId: response.eventId,
3425
- eventId: item.eventId,
3426
- method: 'POST',
3427
- ...(started === undefined ? {} : {
3428
- started
3429
- }),
3430
- ...(timestamp === undefined ? {} : {
3431
- timestamp
3432
- }),
3433
- type: 'ai-request-response'
3434
- };
3435
- }
3436
- return {
3437
- ...(ended === undefined ? {} : {
3438
- ended
3439
- }),
3440
- eventEndId: response.eventId,
3441
- eventId: item.eventId,
3442
- method: 'POST',
3443
- ...(started === undefined ? {} : {
3444
- started
3445
- }),
3446
- ...(timestamp === undefined ? {} : {
3447
- timestamp
3448
- }),
3449
- type: 'ai-request-response'
3450
- };
3451
- };
3452
- const toPrettyEvents = rawEvents => {
3453
- if (rawEvents.type === 'error') {
3454
- return [];
3455
- }
3456
- const pretty = [];
3457
- const map = getResponseMap(rawEvents.events);
3458
- for (const item of rawEvents.events) {
3459
- if (item.type === 'ai-request' && 'requestId' in item && typeof item.requestId === 'string') {
3460
- const response = map[item.requestId];
3461
- if (response) {
3462
- pretty.push(getMergedRequestResponseEvent(item, response));
3463
- } else {
3464
- pretty.push(item);
3465
- }
3466
- } else if (item.type === 'ai-response' && 'requestId' in item && typeof item.requestId === 'string') ; else {
3467
- pretty.push(item);
3468
- }
3469
- }
3470
- return pretty;
3471
- };
3472
-
3473
- const listChatViewEvents = async (sessionId, _databaseName, _dataBaseVersion, _eventStoreName, _sessionIdIndexName) => {
3474
- try {
3475
- const rawEvents = await listChatViewEvents$1(sessionId);
3476
- if (rawEvents.type === 'error') {
3477
- return rawEvents;
3478
- }
3479
- const prettyEvents = toPrettyEvents(rawEvents);
3480
- return {
3481
- events: prettyEvents,
3482
- type: 'success'
3483
- };
3484
- } catch (error) {
3485
- return {
3486
- error,
3487
- type: 'error'
3488
- };
3489
- }
3490
- };
3491
-
3492
- const loadEventsDependencies = {
3493
- listChatViewEvents: listChatViewEvents,
3494
- loadSelectedEvent: loadSelectedEvent
3495
- };
3496
-
3497
3505
  const ParseChatDebugUriErrorCode = {
3498
3506
  InvalidSessionId: 1,
3499
3507
  InvalidUriEncoding: 2,
@@ -3657,6 +3665,99 @@ const getSessionNotFoundMessage = sessionId => {
3657
3665
  return noChatSessionFound(sessionId);
3658
3666
  };
3659
3667
 
3668
+ const getResponseMap = events => {
3669
+ const seen = Object.create(null);
3670
+ for (const event of events) {
3671
+ if (event.type === 'ai-response' && 'requestId' in event && typeof event.requestId === 'string') {
3672
+ seen[event.requestId] = event;
3673
+ }
3674
+ }
3675
+ return seen;
3676
+ };
3677
+
3678
+ const getMergedRequestResponseEvent = (item, response) => {
3679
+ const parsedStart = new Date(item.timestamp || '');
3680
+ const parsedEnd = new Date(response.timestamp || '');
3681
+ const durationMs = parsedEnd.getTime() - parsedStart.getTime();
3682
+ const started = getStartedTimestamp(item);
3683
+ const ended = getEndedTimestamp(response);
3684
+ const timestamp = item.timestamp ?? started;
3685
+ if (Number.isFinite(durationMs) && durationMs >= 0) {
3686
+ return {
3687
+ durationMs,
3688
+ ...(ended === undefined ? {} : {
3689
+ ended
3690
+ }),
3691
+ eventEndId: response.eventId,
3692
+ eventId: item.eventId,
3693
+ method: 'POST',
3694
+ size: 0,
3695
+ ...(started === undefined ? {} : {
3696
+ started
3697
+ }),
3698
+ ...(timestamp === undefined ? {} : {
3699
+ timestamp
3700
+ }),
3701
+ type: 'ai-request-response'
3702
+ };
3703
+ }
3704
+ return {
3705
+ ...(ended === undefined ? {} : {
3706
+ ended
3707
+ }),
3708
+ eventEndId: response.eventId,
3709
+ eventId: item.eventId,
3710
+ method: 'POST',
3711
+ size: 0,
3712
+ ...(started === undefined ? {} : {
3713
+ started
3714
+ }),
3715
+ ...(timestamp === undefined ? {} : {
3716
+ timestamp
3717
+ }),
3718
+ type: 'ai-request-response'
3719
+ };
3720
+ };
3721
+ const toPrettyEvents = rawEvents => {
3722
+ if (rawEvents.type === 'error') {
3723
+ return [];
3724
+ }
3725
+ const pretty = [];
3726
+ const map = getResponseMap(rawEvents.events);
3727
+ for (const item of rawEvents.events) {
3728
+ if (item.type === 'ai-request' && 'requestId' in item && typeof item.requestId === 'string') {
3729
+ const response = map[item.requestId];
3730
+ if (response) {
3731
+ pretty.push(getMergedRequestResponseEvent(item, response));
3732
+ } else {
3733
+ pretty.push(item);
3734
+ }
3735
+ } else if (item.type === 'ai-response' && 'requestId' in item && typeof item.requestId === 'string') ; else {
3736
+ pretty.push(item);
3737
+ }
3738
+ }
3739
+ return pretty;
3740
+ };
3741
+
3742
+ const listChatViewEvents = async (sessionId, _databaseName, _dataBaseVersion, _eventStoreName, _sessionIdIndexName) => {
3743
+ try {
3744
+ const rawEvents = await listChatViewEvents$1(sessionId);
3745
+ if (rawEvents.type === 'error') {
3746
+ return rawEvents;
3747
+ }
3748
+ const prettyEvents = toPrettyEvents(rawEvents);
3749
+ return {
3750
+ events: prettyEvents,
3751
+ type: 'success'
3752
+ };
3753
+ } catch (error) {
3754
+ return {
3755
+ error,
3756
+ type: 'error'
3757
+ };
3758
+ }
3759
+ };
3760
+
3660
3761
  const restoreSelectedEvent = async state => {
3661
3762
  if (state.selectedEventId === null) {
3662
3763
  return {
@@ -3699,7 +3800,7 @@ const restoreSelectedEvent = async state => {
3699
3800
  selectedEventIndex: null
3700
3801
  };
3701
3802
  }
3702
- const selectedEventDetails = await loadEventsDependencies.loadSelectedEvent({
3803
+ const selectedEventDetails = await loadSelectedEvent({
3703
3804
  eventId: selectedEvent.eventId,
3704
3805
  sessionId: state.sessionId,
3705
3806
  type: selectedEvent.type
@@ -3719,13 +3820,7 @@ const restoreSelectedEvent = async state => {
3719
3820
  };
3720
3821
 
3721
3822
  const loadEventsForSessionId = async (state, sessionId) => {
3722
- const {
3723
- databaseName,
3724
- dataBaseVersion,
3725
- eventStoreName,
3726
- sessionIdIndexName
3727
- } = state;
3728
- const result = await loadEventsDependencies.listChatViewEvents(sessionId, databaseName, dataBaseVersion, eventStoreName, sessionIdIndexName);
3823
+ const result = await listChatViewEvents(sessionId);
3729
3824
  if (result.type === 'error') {
3730
3825
  return applyVirtualTableState(getStateWithTimelineInfo({
3731
3826
  ...state,
@@ -3764,14 +3859,6 @@ const loadEventsForSessionId = async (state, sessionId) => {
3764
3859
  return withSelectedEventVisible(restoredState);
3765
3860
  };
3766
3861
 
3767
- const loadEventsFromUri = async state => {
3768
- const sessionId = getSessionIdFromUri(state);
3769
- if (!sessionId) {
3770
- return getStateWithInvalidUri(state);
3771
- }
3772
- return loadEventsForSessionId(state, sessionId);
3773
- };
3774
-
3775
3862
  const refreshEvents = async state => {
3776
3863
  const sessionId = state.sessionId || getSessionIdFromUri(state);
3777
3864
  if (!sessionId) {
@@ -3784,11 +3871,8 @@ const refresh = async state => {
3784
3871
  return refreshEvents(state);
3785
3872
  };
3786
3873
 
3787
- const handleClickRefreshDependencies = {
3788
- refresh: refresh
3789
- };
3790
3874
  const handleClickRefresh = async state => {
3791
- return handleClickRefreshDependencies.refresh(state);
3875
+ return refresh(state);
3792
3876
  };
3793
3877
 
3794
3878
  const handleCloseDetails$1 = state => {
@@ -3926,6 +4010,28 @@ const getBoolean = value => {
3926
4010
  return value === true || value === 'true' || value === 'on' || value === '1';
3927
4011
  };
3928
4012
 
4013
+ const General = 'general';
4014
+ const RequestHeaders = 'requestHeaders';
4015
+ const ResponseHeaders = 'responseHeaders';
4016
+ const headerSectionKeys = [General, RequestHeaders, ResponseHeaders];
4017
+ const isHeaderSectionKey = value => {
4018
+ return headerSectionKeys.includes(value);
4019
+ };
4020
+
4021
+ const removeSection = (collapsedHeaderSections, section) => {
4022
+ return collapsedHeaderSections.filter(value => value !== section);
4023
+ };
4024
+ const toggleHeadersSection = (state, value) => {
4025
+ if (!isHeaderSectionKey(value)) {
4026
+ return state;
4027
+ }
4028
+ const isCollapsed = state.collapsedHeaderSections.includes(value);
4029
+ return {
4030
+ ...state,
4031
+ collapsedHeaderSections: isCollapsed ? removeSection(state.collapsedHeaderSections, value) : [...state.collapsedHeaderSections, value]
4032
+ };
4033
+ };
4034
+
3929
4035
  const parseTimelineRangePreset$1 = value => {
3930
4036
  if (!value) {
3931
4037
  return {
@@ -4095,6 +4201,9 @@ const handleDetailTab = (state, value) => {
4095
4201
  detailTabs
4096
4202
  };
4097
4203
  };
4204
+ const handleToggleHeadersSection = (state, value) => {
4205
+ return toggleHeadersSection(state, value);
4206
+ };
4098
4207
  const inputHandlers = {
4099
4208
  [CloseDetails$1]: handleCloseDetails,
4100
4209
  [DetailTab]: handleDetailTab,
@@ -4107,6 +4216,7 @@ const inputHandlers = {
4107
4216
  [TimelineEndSeconds]: handleTimelineEndSeconds$1,
4108
4217
  [TimelineRangePreset]: handleTimelineRangePreset$1,
4109
4218
  [TimelineStartSeconds]: handleTimelineStartSeconds$1,
4219
+ [ToggleHeadersSection]: handleToggleHeadersSection,
4110
4220
  [UseDevtoolsLayout]: handleUseDevtoolsLayout
4111
4221
  };
4112
4222
  const handleInput = (state, name, value, checked) => {
@@ -4209,9 +4319,6 @@ const getPayloadObject = (event, name) => {
4209
4319
  };
4210
4320
  };
4211
4321
  const getPayloadEvent = event => {
4212
- if (event && event.type === 'ai-request') {
4213
- return event.body;
4214
- }
4215
4322
  const {
4216
4323
  requestEvent
4217
4324
  } = event;
@@ -4219,6 +4326,9 @@ const getPayloadEvent = event => {
4219
4326
  if (mergedRequestPayloadEvent.found) {
4220
4327
  return mergedRequestPayloadEvent.value;
4221
4328
  }
4329
+ if (event && event.type === 'ai-request') {
4330
+ return event.body;
4331
+ }
4222
4332
  const name = getPreviewName(event);
4223
4333
  if (name === 'list_files' && hasOwn(event, 'arguments')) {
4224
4334
  return event.arguments;
@@ -4238,57 +4348,75 @@ const isChatMessageUpdatedEvent = event => {
4238
4348
  return event.type === 'chat-message-updated';
4239
4349
  };
4240
4350
 
4351
+ const getObjectValue = value => {
4352
+ if (!value || typeof value !== 'object') {
4353
+ return undefined;
4354
+ }
4355
+ return value;
4356
+ };
4241
4357
  const getResponseContentText = content => {
4242
- if (!content || typeof content !== 'object') {
4358
+ const contentObject = getObjectValue(content);
4359
+ if (!contentObject) {
4243
4360
  return undefined;
4244
4361
  }
4245
4362
  if (Array.isArray(content)) {
4246
4363
  const [firstContentItem] = content;
4247
- if (!firstContentItem || typeof firstContentItem !== 'object') {
4364
+ const firstContentItemObject = getObjectValue(firstContentItem);
4365
+ if (!firstContentItemObject) {
4248
4366
  return undefined;
4249
4367
  }
4250
4368
  const {
4251
4369
  text
4252
- } = firstContentItem;
4370
+ } = firstContentItemObject;
4253
4371
  return typeof text === 'string' ? text : undefined;
4254
4372
  }
4255
4373
  const {
4256
4374
  text
4257
- } = content;
4375
+ } = contentObject;
4258
4376
  return typeof text === 'string' ? text : undefined;
4259
4377
  };
4260
- const getResponseOutput = event => {
4261
- if (event.type === 'sse-response-completed') {
4262
- const {
4263
- value
4264
- } = event;
4265
- if (!value || typeof value !== 'object') {
4266
- return undefined;
4267
- }
4268
- const {
4269
- response
4270
- } = value;
4271
- if (!response || typeof response !== 'object') {
4272
- return undefined;
4273
- }
4274
- const {
4275
- output
4276
- } = response;
4277
- return Array.isArray(output) ? output : undefined;
4378
+ const getOutput = value => {
4379
+ const valueObject = getObjectValue(value);
4380
+ if (!valueObject) {
4381
+ return undefined;
4278
4382
  }
4279
- if (event.type === 'ai-response') {
4280
- const {
4281
- value
4282
- } = event;
4283
- if (!value || typeof value !== 'object') {
4383
+ const {
4384
+ output
4385
+ } = valueObject;
4386
+ return Array.isArray(output) ? output : undefined;
4387
+ };
4388
+ const getAiRequestResponseOutput = event => {
4389
+ const {
4390
+ endValue
4391
+ } = event;
4392
+ const endValueObject = getObjectValue(endValue);
4393
+ if (!endValueObject) {
4394
+ return undefined;
4395
+ }
4396
+ return getOutput(endValueObject.value);
4397
+ };
4398
+ const getCompletedResponseOutput = event => {
4399
+ const valueObject = getObjectValue(event.value);
4400
+ if (!valueObject) {
4401
+ return undefined;
4402
+ }
4403
+ const responseObject = getObjectValue(valueObject.response);
4404
+ if (!responseObject) {
4405
+ return undefined;
4406
+ }
4407
+ return getOutput(responseObject);
4408
+ };
4409
+ const getResponseOutput = event => {
4410
+ switch (event.type) {
4411
+ case 'ai-request':
4412
+ return getAiRequestResponseOutput(event);
4413
+ case 'ai-response':
4414
+ return getOutput(event.value);
4415
+ case 'sse-response-completed':
4416
+ return getCompletedResponseOutput(event);
4417
+ default:
4284
4418
  return undefined;
4285
- }
4286
- const {
4287
- output
4288
- } = value;
4289
- return Array.isArray(output) ? output : undefined;
4290
4419
  }
4291
- return undefined;
4292
4420
  };
4293
4421
  const getResponsePreviewText = event => {
4294
4422
  const output = getResponseOutput(event);
@@ -4296,12 +4424,13 @@ const getResponsePreviewText = event => {
4296
4424
  return undefined;
4297
4425
  }
4298
4426
  const [firstOutput] = output;
4299
- if (!firstOutput || typeof firstOutput !== 'object') {
4427
+ const firstOutputObject = getObjectValue(firstOutput);
4428
+ if (!firstOutputObject) {
4300
4429
  return undefined;
4301
4430
  }
4302
4431
  const {
4303
4432
  content
4304
- } = firstOutput;
4433
+ } = firstOutputObject;
4305
4434
  return getResponseContentText(content);
4306
4435
  };
4307
4436
  const getPreviewMessageText = event => {
@@ -4710,6 +4839,8 @@ const handleTableHeaderClick = (state, value) => {
4710
4839
 
4711
4840
  const getTableResizerId = name => {
4712
4841
  switch (name) {
4842
+ case 'ResizerFour':
4843
+ return 4;
4713
4844
  case 'ResizerOne':
4714
4845
  return 1;
4715
4846
  case 'ResizerThree':
@@ -4758,6 +4889,30 @@ const handleTableRowCopy = async (state, eventIndex) => {
4758
4889
  return state;
4759
4890
  };
4760
4891
 
4892
+ const toDataUri$1 = text => {
4893
+ return `data:application/json,${encodeURIComponent(text)}`;
4894
+ };
4895
+ const handleTableRowDoubleClick = async (state, eventX, eventY) => {
4896
+ const eventIndex = getTableBodyEventIndex(state, eventX, eventY);
4897
+ if (eventIndex === -1) {
4898
+ return state;
4899
+ }
4900
+ const event = getCurrentEvents$1(state)[eventIndex];
4901
+ if (!event) {
4902
+ return state;
4903
+ }
4904
+ const responseData = getResponseData(event);
4905
+ if (responseData === undefined) {
4906
+ return state;
4907
+ }
4908
+ const text = JSON.stringify(responseData, null, 2);
4909
+ if (!text) {
4910
+ return state;
4911
+ }
4912
+ await openUri(toDataUri$1(text));
4913
+ return state;
4914
+ };
4915
+
4761
4916
  const toDataUri = text => {
4762
4917
  return `data:application/json,${encodeURIComponent(text)}`;
4763
4918
  };
@@ -5089,14 +5244,20 @@ const handleStorageWorkerUpdate = async uid => {
5089
5244
  await invoke('Viewlet.executeViewletCommand', uid, 'ChatDebug.handleClickRefresh');
5090
5245
  };
5091
5246
 
5092
- const loadContentDependencies = loadEventsDependencies;
5093
- loadContentDependencies.registerUpdateListener = registerUpdateListener;
5247
+ const loadEventsFromUri = async state => {
5248
+ const sessionId = getSessionIdFromUri(state);
5249
+ if (!sessionId) {
5250
+ return getStateWithInvalidUri(state);
5251
+ }
5252
+ return loadEventsForSessionId(state, sessionId);
5253
+ };
5254
+
5094
5255
  const loadContent = async (state, savedState) => {
5095
5256
  await getPreference('chatDebug.autoRefresh');
5096
5257
  const nextState = await loadEventsFromUri(restoreSavedState(state, savedState));
5097
5258
  if (nextState.sessionId) {
5098
5259
  try {
5099
- await loadContentDependencies.registerUpdateListener(nextState.sessionId, rpcId, nextState.uid);
5260
+ await registerUpdateListener(nextState.sessionId, rpcId, nextState.uid);
5100
5261
  } catch {
5101
5262
  // ignore
5102
5263
  }
@@ -5104,8 +5265,7 @@ const loadContent = async (state, savedState) => {
5104
5265
  return applyVirtualTableState({
5105
5266
  ...nextState,
5106
5267
  categoryFilters: createCategoryFilters(getSelectedEventCategoryFilters(nextState.categoryFilters)),
5107
- detailTabs: createDetailTabs(getSelectedDetailTab(nextState.detailTabs), nextState.selectedEvent),
5108
- tableColumns: createTableColumns()
5268
+ detailTabs: createDetailTabs(getSelectedDetailTab(nextState.detailTabs), nextState.selectedEvent)
5109
5269
  });
5110
5270
  };
5111
5271
 
@@ -5200,10 +5360,11 @@ const getCss = state => {
5200
5360
  topSize = 30;
5201
5361
  }
5202
5362
  const tableColumnLayout = getTableColumnLayout(tableContentWidth, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths);
5203
- const [tableColZeroWidth = 0, tableColOneWidth = 0, tableColTwoWidth = 0, tableColThreeWidth = 0] = tableColumnLayout.visibleColumnWidths;
5363
+ const [tableColZeroWidth = 0, tableColOneWidth = 0, tableColTwoWidth = 0, tableColThreeWidth = 0, tableColFourWidth = 0] = tableColumnLayout.visibleColumnWidths;
5204
5364
  const resizerOneLeft = tableColumnLayout.resizerLefts[0] ?? 0;
5205
5365
  const resizerTwoLeft = tableColumnLayout.resizerLefts[1] ?? 0;
5206
5366
  const resizerThreeLeft = tableColumnLayout.resizerLefts[2] ?? 0;
5367
+ const resizerFourLeft = tableColumnLayout.resizerLefts[3] ?? 0;
5207
5368
  const {
5208
5369
  selectionEndPercent,
5209
5370
  selectionStartPercent
@@ -5216,6 +5377,7 @@ const getCss = state => {
5216
5377
  --ChatDebugViewTableColOneWidth: ${tableColOneWidth}px;
5217
5378
  --ChatDebugViewTableColTwoWidth: ${tableColTwoWidth}px;
5218
5379
  --ChatDebugViewTableColThreeWidth: ${tableColThreeWidth}px;
5380
+ --ChatDebugViewTableColFourWidth: ${tableColFourWidth}px;
5219
5381
  --ChatDebugViewDetailsLineNumberWidth: ${detailsLineNumberWidth}px;
5220
5382
  --ChatDebugViewPreviewScrollBarHeight: ${previewVirtualization.scrollBarHeight}px;
5221
5383
  --ChatDebugViewPreviewScrollBarOffset: ${previewVirtualization.scrollBarOffset}px;
@@ -5230,6 +5392,7 @@ const getCss = state => {
5230
5392
  --ResizerOneLeft: ${resizerOneLeft}px;
5231
5393
  --ResizerTwoLeft: ${resizerTwoLeft}px;
5232
5394
  --ResizerThreeLeft: ${resizerThreeLeft}px;
5395
+ --ResizerFourLeft: ${resizerFourLeft}px;
5233
5396
  --ChatDebugViewSashWidth: ${state.sashWidth}px;
5234
5397
  --ChatDebugViewTableWidth: ${tableWidth}px;
5235
5398
  --ChatDebugViewTimelineHeight: ${state.timelineHeight}px;
@@ -5252,6 +5415,26 @@ const getCss = state => {
5252
5415
  width: calc(100% - var(--ChatDebugViewTableScrollBarWidth));
5253
5416
  }
5254
5417
 
5418
+ .TableColZero {
5419
+ width: var(--ChatDebugViewTableColZeroWidth);
5420
+ }
5421
+
5422
+ .TableColOne {
5423
+ width: var(--ChatDebugViewTableColOneWidth);
5424
+ }
5425
+
5426
+ .TableColTwo {
5427
+ width: var(--ChatDebugViewTableColTwoWidth);
5428
+ }
5429
+
5430
+ .TableColThree {
5431
+ width: var(--ChatDebugViewTableColThreeWidth);
5432
+ }
5433
+
5434
+ .TableColFour {
5435
+ width: var(--ChatDebugViewTableColFourWidth);
5436
+ }
5437
+
5255
5438
  .Resizers {
5256
5439
  bottom: 0;
5257
5440
  left: 0;
@@ -5287,6 +5470,10 @@ const getCss = state => {
5287
5470
  left: var(--ResizerThreeLeft);
5288
5471
  }
5289
5472
 
5473
+ .ResizerFour {
5474
+ left: var(--ResizerFourLeft);
5475
+ }
5476
+
5290
5477
  .ResizerInner {
5291
5478
  background: var(--vscode-panel-border, rgba(255, 255, 255, 0.12));
5292
5479
  bottom: 0;
@@ -5333,14 +5520,26 @@ const getCss = state => {
5333
5520
  }
5334
5521
 
5335
5522
  .ChatDebugViewHeadersSectionHeading {
5523
+ align-items: center;
5524
+ background: transparent;
5525
+ border: 0;
5336
5526
  color: var(--vscode-descriptionForeground, rgba(255, 255, 255, 0.7));
5527
+ cursor: pointer;
5528
+ display: flex;
5337
5529
  font-size: 11px;
5338
5530
  font-weight: 600;
5531
+ justify-content: flex-start;
5339
5532
  letter-spacing: 0.08em;
5340
5533
  margin-bottom: 6px;
5534
+ padding: 0;
5535
+ text-align: left;
5341
5536
  text-transform: uppercase;
5342
5537
  }
5343
5538
 
5539
+ .ChatDebugViewHeadersSectionHeading:hover {
5540
+ color: var(--vscode-editor-foreground);
5541
+ }
5542
+
5344
5543
  .ChatDebugViewHeadersRow {
5345
5544
  display: grid;
5346
5545
  grid-template-columns: minmax(0, 38%) minmax(0, 1fr);
@@ -5818,6 +6017,7 @@ const ResizerInner = 'ResizerInner';
5818
6017
  const ResizerOne = 'ResizerOne';
5819
6018
  const ResizerTwo = 'ResizerTwo';
5820
6019
  const ResizerThree = 'ResizerThree';
6020
+ const ResizerFour = 'ResizerFour';
5821
6021
  const TableHead = 'TableHead';
5822
6022
  const Resizers = 'Resizers';
5823
6023
  const TableCol = 'TableCol';
@@ -5861,6 +6061,7 @@ const ChatDebugViewTop = 'ChatDebugViewTop';
5861
6061
  const ChatDebugViewTopDevtools = 'ChatDebugViewTop--devtools';
5862
6062
  const TableCell = 'TableCell';
5863
6063
  const ChatDebugViewCellDuration = 'ChatDebugViewCellDuration';
6064
+ const ChatDebugViewCellSize = 'ChatDebugViewCellSize';
5864
6065
  const ChatDebugViewCellStatusError = 'ChatDebugViewCellStatusError';
5865
6066
  const InputBox = 'InputBox';
5866
6067
  const TokenBoolean = 'Token TokenBoolean';
@@ -5912,6 +6113,7 @@ const HandlePreviewTextScrollBarPointerDown = 37;
5912
6113
  const HandlePreviewTextScrollBarPointerMove = 38;
5913
6114
  const HandlePreviewTextScrollBarPointerUp = 39;
5914
6115
  const HandleRootContextMenu = 40;
6116
+ const HandleTableRowDoubleClick = 41;
5915
6117
 
5916
6118
  const debugErrorRootNode = {
5917
6119
  childCount: 1,
@@ -6307,18 +6509,23 @@ const getHeadersTableNodes = headers => {
6307
6509
  type: Ul
6308
6510
  }, ...headerRows];
6309
6511
  };
6310
- const getHeaderSectionNodes = (label, headers) => {
6512
+ const getHeaderSectionNodes = (section, label, headers, collapsedHeaderSections) => {
6513
+ const isCollapsed = collapsedHeaderSections.includes(section);
6311
6514
  return [{
6312
- childCount: 2,
6515
+ childCount: isCollapsed ? 1 : 2,
6313
6516
  className: ChatDebugViewHeadersSection,
6314
6517
  type: Div
6315
6518
  }, {
6316
6519
  childCount: 1,
6317
6520
  className: ChatDebugViewHeadersSectionHeading,
6318
- type: Div
6319
- }, text(label), ...getHeadersTableNodes(headers)];
6521
+ name: ToggleHeadersSection,
6522
+ onChange: HandleFilterInput,
6523
+ onClick: HandleFilterInput,
6524
+ type: Button$1,
6525
+ value: section
6526
+ }, text(label), ...(isCollapsed ? [] : getHeadersTableNodes(headers))];
6320
6527
  };
6321
- const getHeadersContentNodes = (responseEventNodes, selectedEvent) => {
6528
+ const getHeadersContentNodes = (responseEventNodes, selectedEvent, collapsedHeaderSections = []) => {
6322
6529
  const generalEntries = getGeneralEntries(selectedEvent);
6323
6530
  const requestHeaders$1 = getHeaders(selectedEvent?.headers);
6324
6531
  const responseHeaders$1 = getHeaders(isHeadersRecord(selectedEvent?.endValue) ? selectedEvent.endValue.headers : undefined);
@@ -6327,13 +6534,13 @@ const getHeadersContentNodes = (responseEventNodes, selectedEvent) => {
6327
6534
  }
6328
6535
  const nodes = [];
6329
6536
  if (generalEntries.length > 0) {
6330
- nodes.push(...getHeaderSectionNodes(general(), generalEntries));
6537
+ nodes.push(...getHeaderSectionNodes(General, general(), generalEntries, collapsedHeaderSections));
6331
6538
  }
6332
6539
  if (requestHeaders$1.length > 0) {
6333
- nodes.push(...getHeaderSectionNodes(requestHeaders(), requestHeaders$1));
6540
+ nodes.push(...getHeaderSectionNodes(RequestHeaders, requestHeaders(), requestHeaders$1, collapsedHeaderSections));
6334
6541
  }
6335
6542
  if (responseHeaders$1.length > 0) {
6336
- nodes.push(...getHeaderSectionNodes(responseHeaders(), responseHeaders$1));
6543
+ nodes.push(...getHeaderSectionNodes(ResponseHeaders, responseHeaders(), responseHeaders$1, collapsedHeaderSections));
6337
6544
  }
6338
6545
  return nodes;
6339
6546
  };
@@ -7427,7 +7634,7 @@ const getTokenUsageContentNodes = (responseEventNodes, selectedEvent) => {
7427
7634
  return getTokenUsageDetailsDom(selectedEvent);
7428
7635
  };
7429
7636
 
7430
- const getSelectedContentNodes = (safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization) => {
7637
+ const getSelectedContentNodes = (safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization, collapsedHeaderSections = []) => {
7431
7638
  if (safeSelectedDetailTab === Tokens$1) {
7432
7639
  return getTokenUsageContentNodes(responseEventNodes, selectedEvent);
7433
7640
  }
@@ -7441,19 +7648,19 @@ const getSelectedContentNodes = (safeSelectedDetailTab, previewEventNodes, paylo
7441
7648
  return getPayloadContentNodes(payloadEventNodes, selectedEvent);
7442
7649
  }
7443
7650
  if (safeSelectedDetailTab === Headers$1) {
7444
- return getHeadersContentNodes(responseEventNodes, selectedEvent);
7651
+ return getHeadersContentNodes(responseEventNodes, selectedEvent, collapsedHeaderSections);
7445
7652
  }
7446
7653
  return getResponseContentNodes(responseEventNodes, selectedEvent);
7447
7654
  };
7448
7655
 
7449
- const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes, responseEventNodes = payloadEventNodes, selectedEvent = null, detailTabs = createDetailTabs(), previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, previewVirtualization) => {
7656
+ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes, responseEventNodes = payloadEventNodes, selectedEvent = null, detailTabs = createDetailTabs(), previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, previewVirtualization, collapsedHeaderSections = []) => {
7450
7657
  if (previewEventNodes.length === 0 && payloadEventNodes.length === 0 && responseEventNodes.length === 0) {
7451
7658
  return [];
7452
7659
  }
7453
7660
  const normalizedDetailTabs = getNormalizedDetailTabs(selectedEvent, detailTabs);
7454
7661
  const safeSelectedDetailTab = getSelectedDetailTab(normalizedDetailTabs);
7455
7662
  const selectedDetailTab = normalizedDetailTabs.find(detailTab => detailTab.name === safeSelectedDetailTab) ?? normalizedDetailTabs[0];
7456
- const contentNodes = getSelectedContentNodes(safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization);
7663
+ const contentNodes = getSelectedContentNodes(safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization, collapsedHeaderSections);
7457
7664
  return [{
7458
7665
  childCount: 2,
7459
7666
  className: ChatDebugViewDetails,
@@ -7461,13 +7668,13 @@ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes,
7461
7668
  }, ...getDetailsTopVirtualDom(normalizedDetailTabs), ...getDetailContentDom(selectedDetailTab, safeSelectedDetailTab, contentNodes)];
7462
7669
  };
7463
7670
 
7464
- const td$1 = {
7671
+ const td$2 = {
7465
7672
  childCount: 1,
7466
7673
  className: mergeClassNames(TableCell, ChatDebugViewCellDuration),
7467
7674
  type: Td
7468
7675
  };
7469
7676
  const getCellDurationDom = event => {
7470
- return [td$1, text(getEventTableDurationText(event))];
7677
+ return [td$2, text(getEventTableDurationText(event))];
7471
7678
  };
7472
7679
 
7473
7680
  const getMethods = new Set(['list_dir', 'list_files', 'read_file']);
@@ -7493,13 +7700,22 @@ const getEventTableMethodLabel = event => {
7493
7700
  return '';
7494
7701
  };
7495
7702
 
7496
- const td = {
7703
+ const td$1 = {
7497
7704
  childCount: 1,
7498
7705
  className: TableCell,
7499
7706
  type: Td
7500
7707
  };
7501
7708
  const getCellMethodDom = event => {
7502
- return [td, text(getEventTableMethodLabel(event))];
7709
+ return [td$1, text(getEventTableMethodLabel(event))];
7710
+ };
7711
+
7712
+ const td = {
7713
+ childCount: 1,
7714
+ className: mergeClassNames(TableCell, ChatDebugViewCellSize),
7715
+ type: Td
7716
+ };
7717
+ const getCellSizeDom = event => {
7718
+ return [td, text(formatBytes(event.size ?? 0))];
7503
7719
  };
7504
7720
 
7505
7721
  const getCellStatusDom = (event, isErrorStatus) => {
@@ -7524,6 +7740,8 @@ const getTableCellDom = (column, event, isErrorStatus) => {
7524
7740
  return getCellDurationDom(event);
7525
7741
  case Method:
7526
7742
  return getCellMethodDom(event);
7743
+ case Size:
7744
+ return getCellSizeDom(event);
7527
7745
  case Status$1:
7528
7746
  return getCellStatusDom(event, isErrorStatus);
7529
7747
  case Type:
@@ -7683,23 +7901,27 @@ const getTableBodyDom = (rowNodes, eventCount) => {
7683
7901
  childCount: eventCount === 0 ? 1 : eventCount,
7684
7902
  className: TableBody,
7685
7903
  onContextMenu: HandleTableBodyContextMenu,
7904
+ onDblClick: HandleTableRowDoubleClick,
7686
7905
  onPointerDown: HandleEventRowClickAt,
7687
7906
  type: TBody
7688
7907
  }, ...rowNodes];
7689
7908
  };
7690
7909
 
7691
- const tableColClassNames = ['TableColZero', 'TableColOne', 'TableColTwo', 'TableColThree'];
7910
+ const tableColClassNames = ['TableColZero', 'TableColOne', 'TableColTwo', 'TableColThree', 'TableColFour'];
7692
7911
  const getTableColumnGroupDom = visibleTableColumns => {
7693
7912
  const orderedVisibleTableColumns = getOrderedVisibleTableColumns(visibleTableColumns);
7694
7913
  return [{
7695
7914
  childCount: orderedVisibleTableColumns.length,
7696
7915
  className: 'ColGroup',
7697
7916
  type: ColGroup
7698
- }, ...orderedVisibleTableColumns.map((_, index) => ({
7699
- childCount: 0,
7700
- className: `${TableCol} ${tableColClassNames[index]}`,
7701
- type: Col
7702
- }))];
7917
+ }, ...orderedVisibleTableColumns.map((_, index) => {
7918
+ const columnClassName = tableColClassNames[index] ?? `TableCol${index}`;
7919
+ return {
7920
+ childCount: 0,
7921
+ className: `${TableCol} ${columnClassName}`,
7922
+ type: Col
7923
+ };
7924
+ })];
7703
7925
  };
7704
7926
 
7705
7927
  const getHeaderCellNode = (column, tableColumns) => {
@@ -7740,8 +7962,8 @@ const getTableDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleT
7740
7962
  }, ...getTableColumnGroupDom(visibleTableColumns), ...getTableHeaderDom(visibleTableColumns, tableColumns), ...getTableBodyDom(rowNodes, eventCount)];
7741
7963
  };
7742
7964
 
7743
- const resizerNames = ['ResizerOne', 'ResizerTwo', 'ResizerThree'];
7744
- const resizerClassNames = [ResizerOne, ResizerTwo, ResizerThree];
7965
+ const resizerNames = ['ResizerOne', 'ResizerTwo', 'ResizerThree', 'ResizerFour'];
7966
+ const resizerClassNames = [ResizerOne, ResizerTwo, ResizerThree, ResizerFour];
7745
7967
  const getTableResizersDom = visibleTableColumns => {
7746
7968
  const visibleColumnCount = getOrderedVisibleTableColumns(visibleTableColumns).length;
7747
7969
  const resizerCount = Math.max(0, visibleColumnCount - 1);
@@ -7980,7 +8202,7 @@ const getTimelineDom = (timelineInfo, hoverPercent = null) => {
7980
8202
  }, ...selectionNodes];
7981
8203
  };
7982
8204
 
7983
- 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) => {
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 = []) => {
7984
8206
  const visibleEvents = events.slice(minLineY, maxLineY);
7985
8207
  const rows = createDevtoolsRows(visibleEvents, selectedEventIndex, minLineY);
7986
8208
  const rowNodes = getDevtoolsRows(rows, visibleTableColumns);
@@ -8005,7 +8227,7 @@ const getDevtoolsDom = (events, selectedEvent, selectedEventIndex, timelineEvent
8005
8227
  const summary = getTableSummary(events);
8006
8228
  const showScrollBar = visibleEvents.length < events.length;
8007
8229
  const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableWrapperWrapperDom(rowNodes, visibleEvents.length, visibleTableColumns, tableColumns, summary, focus, '', '', showScrollBar);
8008
- const detailsNodes = getDetailsDom(previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, detailTabs, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualizationOptions);
8230
+ const detailsNodes = getDetailsDom(previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, detailTabs, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualizationOptions, collapsedHeaderSections);
8009
8231
  const sashNodes = getSashNodesDom(hasSelectedEvent);
8010
8232
  const splitChildCount = hasSelectedEvent ? 3 : 1;
8011
8233
  const rootChildCount = 3;
@@ -8059,7 +8281,7 @@ const getEventCategoryFilterDescription = eventCategoryFilters => {
8059
8281
  }
8060
8282
  return eventCategoryFilters.map(eventCategoryFilter => getEventCategoryFilterLabel(eventCategoryFilter).toLowerCase()).join(', ');
8061
8283
  };
8062
- 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) => {
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 = []) => {
8063
8285
  if (errorMessage) {
8064
8286
  return getDebugErrorDom(errorMessage);
8065
8287
  }
@@ -8083,7 +8305,7 @@ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilters, ca
8083
8305
  const emptyMessage = getEmptyMessage(events.length, hasFilterValue, useNoToolCallEventsMessage, noFilteredEventsMessage);
8084
8306
  const safeSelectedEventIndex = selectedEventIndex === null || selectedEventIndex < 0 || selectedEventIndex >= events.length ? null : selectedEventIndex;
8085
8307
  if (useDevtoolsLayout) {
8086
- 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);
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);
8087
8309
  const devtoolsContentNodes = devtoolsDom.slice(1);
8088
8310
  const topLevelNodes = [...getDebugViewTopDom(filterValue, useDevtoolsLayout, categoryFilters), ...devtoolsContentNodes];
8089
8311
  const rootChildCount = getTopLevelChildCount(topLevelNodes);
@@ -8119,7 +8341,7 @@ const renderItems = (oldState, newState) => {
8119
8341
  }
8120
8342
  const filteredEvents = getCurrentEvents$1(newState);
8121
8343
  const previewTextViewportHeight = getPreviewTextViewportHeight(newState);
8122
- 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);
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);
8123
8345
  return [SetDom2, newState.uid, dom];
8124
8346
  };
8125
8347
 
@@ -8204,6 +8426,9 @@ const renderEventListeners = () => {
8204
8426
  }, {
8205
8427
  name: HandleEventRowClickAt,
8206
8428
  params: ['handleEventRowClickAt', ClientX, ClientY, Button]
8429
+ }, {
8430
+ name: HandleTableRowDoubleClick,
8431
+ params: ['handleTableRowDoubleClick', ClientX, ClientY]
8207
8432
  }, {
8208
8433
  name: HandleTableBodyContextMenu,
8209
8434
  params: ['handleTableBodyContextMenu', ClientX, ClientY],
@@ -8407,19 +8632,9 @@ const setEvents = (state, events) => {
8407
8632
  }));
8408
8633
  };
8409
8634
 
8410
- const setSessionIdDependencies = {
8411
- listChatViewEvents: listChatViewEvents,
8412
- registerUpdateListener: registerUpdateListener
8413
- };
8414
8635
  const setSessionId = async (state, sessionId) => {
8415
- const {
8416
- databaseName,
8417
- dataBaseVersion,
8418
- eventStoreName,
8419
- sessionIdIndexName
8420
- } = state;
8421
- const result = await setSessionIdDependencies.listChatViewEvents(sessionId, databaseName, dataBaseVersion, eventStoreName, sessionIdIndexName);
8422
- await setSessionIdDependencies.registerUpdateListener(sessionId, rpcId, state.uid);
8636
+ const result = await listChatViewEvents(sessionId);
8637
+ await registerUpdateListener(sessionId, rpcId, state.uid);
8423
8638
  if (result.type === 'error') {
8424
8639
  return {
8425
8640
  ...state,
@@ -8518,6 +8733,7 @@ const commandMap = {
8518
8733
  'ChatDebug.handleTableResizerPointerMove': wrapCommand(handleTableResizerPointerMove),
8519
8734
  'ChatDebug.handleTableResizerPointerUp': wrapCommand(handleTableResizerPointerUp),
8520
8735
  'ChatDebug.handleTableRowCopy': wrapCommand(handleTableRowCopy),
8736
+ 'ChatDebug.handleTableRowDoubleClick': wrapCommand(handleTableRowDoubleClick),
8521
8737
  'ChatDebug.handleTableRowOpenInNewTab': wrapCommand(handleTableRowOpenInNewTab),
8522
8738
  'ChatDebug.handleTableScrollBarPointerDown': wrapCommand(handleTableScrollBarPointerDown),
8523
8739
  'ChatDebug.handleTableScrollBarPointerMove': wrapCommand(handleTableScrollBarPointerMove),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/chat-debug-view",
3
- "version": "10.19.0",
3
+ "version": "10.21.0",
4
4
  "description": "Chat Debug View Worker",
5
5
  "repository": {
6
6
  "type": "git",