@lvce-editor/chat-debug-view 10.19.0 → 10.20.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({
@@ -1500,6 +1503,7 @@ const RequestUrl = 'Request URL';
1500
1503
  const Response = 'Response';
1501
1504
  const ResponseHeaders = 'Response Headers';
1502
1505
  const SecondsRange = '{PH1}s-{PH2}s';
1506
+ const Size$1 = 'Size';
1503
1507
  const Started = 'Started';
1504
1508
  const Status$2 = 'Status';
1505
1509
  const StatusCode = 'Status Code';
@@ -1641,6 +1645,9 @@ const resetColumns = () => {
1641
1645
  const response = () => {
1642
1646
  return i18nString(Response);
1643
1647
  };
1648
+ const size = () => {
1649
+ return i18nString(Size$1);
1650
+ };
1644
1651
  const secondsRange = (start, end) => {
1645
1652
  return i18nString(SecondsRange, {
1646
1653
  PH1: start,
@@ -1842,7 +1849,8 @@ const Type = 'type';
1842
1849
  const Method = 'method';
1843
1850
  const Duration = 'duration';
1844
1851
  const Status$1 = 'status';
1845
- const tableColumnNames = [Type, Method, Status$1, Duration];
1852
+ const Size = 'size';
1853
+ const tableColumnNames = [Type, Method, Status$1, Size, Duration];
1846
1854
  const createTableColumns = () => {
1847
1855
  return [{
1848
1856
  isVisible: true,
@@ -1856,6 +1864,10 @@ const createTableColumns = () => {
1856
1864
  isVisible: true,
1857
1865
  label: status(),
1858
1866
  name: Status$1
1867
+ }, {
1868
+ isVisible: true,
1869
+ label: size(),
1870
+ name: Size
1859
1871
  }, {
1860
1872
  isVisible: true,
1861
1873
  label: duration(),
@@ -1893,6 +1905,8 @@ const getTableColumnLabel = (tableColumns, name) => {
1893
1905
  return duration();
1894
1906
  case Method:
1895
1907
  return method();
1908
+ case Size:
1909
+ return size();
1896
1910
  case Status$1:
1897
1911
  return status();
1898
1912
  case Type:
@@ -1905,6 +1919,7 @@ const getTableColumnLabel = (tableColumns, name) => {
1905
1919
  const defaultTableColumnWidths = {
1906
1920
  duration: 110,
1907
1921
  method: 90,
1922
+ size: 100,
1908
1923
  status: 110,
1909
1924
  type: 260
1910
1925
  };
@@ -1931,6 +1946,7 @@ const getTableWidthFromClientX = (state, clientX) => {
1931
1946
  const minimumTableColumnWidths = {
1932
1947
  [Duration]: 80,
1933
1948
  [Method]: 56,
1949
+ [Size]: 80,
1934
1950
  [Status$1]: 56,
1935
1951
  [Type]: 80
1936
1952
  };
@@ -1999,7 +2015,7 @@ const getResizedTableColumnWidths = (state, visibleTableColumns, tableColumnWidt
1999
2015
  };
2000
2016
 
2001
2017
  const isSameTableColumnWidths = (first, second) => {
2002
- return first.type === second.type && first.method === second.method && first.duration === second.duration && first.status === second.status;
2018
+ return first.type === second.type && first.method === second.method && first.duration === second.duration && first.size === second.size && first.status === second.status;
2003
2019
  };
2004
2020
 
2005
2021
  const isFiniteNumber = value => {
@@ -2011,13 +2027,20 @@ const isTableColumnWidths = value => {
2011
2027
  return false;
2012
2028
  }
2013
2029
  const record = value;
2014
- return isFiniteNumber(record.type) && isFiniteNumber(record.method) && isFiniteNumber(record.duration) && isFiniteNumber(record.status);
2030
+ return isFiniteNumber(record.type) && isFiniteNumber(record.method) && isFiniteNumber(record.duration) && isFiniteNumber(record.size) && isFiniteNumber(record.status);
2015
2031
  };
2016
2032
 
2017
2033
  const validEventCategoryFilters = new Set([All$1, Network$1, Stream$1, Tools$1, Ui$1]);
2018
2034
  const isSavedState = value => {
2019
2035
  return typeof value === 'object' && value !== null;
2020
2036
  };
2037
+ const isLegacyTableColumnWidths = value => {
2038
+ if (typeof value !== 'object' || value === null) {
2039
+ return false;
2040
+ }
2041
+ const record = value;
2042
+ 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);
2043
+ };
2021
2044
  const restoreCategoryFilters = (savedState, currentCategoryFilters) => {
2022
2045
  if (Array.isArray(savedState.eventCategoryFilters)) {
2023
2046
  return selectCategoryFilters(currentCategoryFilters, savedState.eventCategoryFilters.filter(value => typeof value === 'string'));
@@ -2050,10 +2073,31 @@ const restoreVisibleTableColumns = (savedState, currentTableColumns) => {
2050
2073
  return currentTableColumns;
2051
2074
  }
2052
2075
  const visibleTableColumns = savedState.visibleTableColumns.filter(value => typeof value === 'string');
2076
+ if (isLegacyTableColumnWidths(savedState.tableColumnWidths)) {
2077
+ const savedVisibleColumns = new Set(visibleTableColumns);
2078
+ const visibleColumnsWithDefaults = currentTableColumns.filter(column => savedVisibleColumns.has(column.name) || column.name === 'size').map(column => column.name);
2079
+ return getTableColumnsWithVisibility(currentTableColumns, visibleColumnsWithDefaults);
2080
+ }
2053
2081
  return getTableColumnsWithVisibility(currentTableColumns, visibleTableColumns);
2054
2082
  };
2055
2083
  const restoreTableColumnWidths = (savedState, currentTableColumnWidths) => {
2056
- return isTableColumnWidths(savedState.tableColumnWidths) ? savedState.tableColumnWidths : currentTableColumnWidths;
2084
+ const {
2085
+ tableColumnWidths: savedTableColumnWidths
2086
+ } = savedState;
2087
+ if (isTableColumnWidths(savedTableColumnWidths)) {
2088
+ return savedTableColumnWidths;
2089
+ }
2090
+ if (isLegacyTableColumnWidths(savedTableColumnWidths)) {
2091
+ const legacyTableColumnWidths = savedTableColumnWidths;
2092
+ return {
2093
+ duration: legacyTableColumnWidths.duration,
2094
+ method: legacyTableColumnWidths.method,
2095
+ size: currentTableColumnWidths.size,
2096
+ status: legacyTableColumnWidths.status,
2097
+ type: legacyTableColumnWidths.type
2098
+ };
2099
+ }
2100
+ return currentTableColumnWidths;
2057
2101
  };
2058
2102
  const restoreSavedState = (state, savedState) => {
2059
2103
  if (!isSavedState(savedState)) {
@@ -2105,21 +2149,37 @@ const hasTimingDetails = event => {
2105
2149
  return hasDuration || hasStart && hasEnd;
2106
2150
  };
2107
2151
 
2108
- const getResponseEvent = event => {
2109
- // @ts-ignore
2110
- if (event && event.endValue && event.endValue.value) {
2111
- // @ts-ignore
2112
- return event.endValue.value;
2152
+ const getEndValueResponseData = event => {
2153
+ const endValue = event.endValue;
2154
+ if (!endValue || endValue.value === undefined) {
2155
+ return undefined;
2113
2156
  }
2157
+ return endValue.value;
2158
+ };
2159
+ const getMergedResponseData = event => {
2114
2160
  const {
2115
2161
  responseEvent
2116
2162
  } = 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;
2163
+ if (!responseEvent || typeof responseEvent !== 'object' || typeof responseEvent.type !== 'string') {
2164
+ return undefined;
2165
+ }
2166
+ const mergedResponseEvent = responseEvent;
2167
+ if (mergedResponseEvent.value !== undefined) {
2168
+ return mergedResponseEvent.value;
2169
+ }
2170
+ return responseEvent;
2171
+ };
2172
+ const getResponseData = event => {
2173
+ const endValueResponseData = getEndValueResponseData(event);
2174
+ if (endValueResponseData !== undefined) {
2175
+ return endValueResponseData;
2176
+ }
2177
+ return getMergedResponseData(event);
2178
+ };
2179
+ const getResponseEvent = event => {
2180
+ const responseData = getResponseData(event);
2181
+ if (responseData !== undefined) {
2182
+ return responseData;
2123
2183
  }
2124
2184
  return event;
2125
2185
  };
@@ -2464,7 +2524,6 @@ const create = (uid, uri, x, y, width, height, platform, assetDir, sessionId = '
2464
2524
  platform,
2465
2525
  sessionId,
2466
2526
  sessionIdIndexName,
2467
- tableColumns: [],
2468
2527
  uid,
2469
2528
  uri,
2470
2529
  width,
@@ -2858,10 +2917,19 @@ const getStatusText = event => {
2858
2917
  return hasErrorStatus(event) ? '400' : '200';
2859
2918
  };
2860
2919
 
2920
+ const getSizeSortValue = event => {
2921
+ const rawSize = event.size;
2922
+ if (typeof rawSize !== 'number' || !Number.isFinite(rawSize)) {
2923
+ return '0000000000000000';
2924
+ }
2925
+ return String(Math.max(0, Math.trunc(rawSize))).padStart(16, '0');
2926
+ };
2861
2927
  const getEventTableColumnValue = (event, column) => {
2862
2928
  switch (column) {
2863
2929
  case Duration:
2864
2930
  return getEventTableDurationText(event);
2931
+ case Size:
2932
+ return getSizeSortValue(event);
2865
2933
  case Status$1:
2866
2934
  return getStatusText(event);
2867
2935
  case Type:
@@ -3083,11 +3151,26 @@ const getAttachmentImagePreviewMimeType = event => {
3083
3151
  return typeof event.mimeType === 'string' ? event.mimeType : undefined;
3084
3152
  };
3085
3153
 
3086
- const formatImageSize = size => {
3087
- if (size < 1024) {
3088
- return `${size} B`;
3154
+ const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB'];
3155
+ const formatBytes = size => {
3156
+ if (!Number.isFinite(size) || size <= 0) {
3157
+ return '0 B';
3089
3158
  }
3090
- return `${(size / 1024).toFixed(1)} kB`;
3159
+ let value = size;
3160
+ let unitIndex = 0;
3161
+ while (value >= 1024 && unitIndex < units.length - 1) {
3162
+ value /= 1024;
3163
+ unitIndex++;
3164
+ }
3165
+ if (unitIndex === 0) {
3166
+ return `${Math.trunc(value)} ${units[unitIndex]}`;
3167
+ }
3168
+ const formatted = value >= 10 ? value.toFixed(0) : value.toFixed(1);
3169
+ return `${formatted} ${units[unitIndex]}`;
3170
+ };
3171
+
3172
+ const formatImageSize = size => {
3173
+ return formatBytes(size);
3091
3174
  };
3092
3175
 
3093
3176
  const formatImageStats = (width, height, size) => {
@@ -3313,6 +3396,12 @@ const getMenuEntriesTableHeader = state => {
3313
3396
  flags: getColumnVisibilityFlags(state.tableColumns, Status$1),
3314
3397
  id: 'status',
3315
3398
  label: status()
3399
+ }, {
3400
+ args: [Size],
3401
+ command: 'ChatDebug.toggleTableColumnVisibility',
3402
+ flags: getColumnVisibilityFlags(state.tableColumns, Size),
3403
+ id: 'size',
3404
+ label: size()
3316
3405
  }, {
3317
3406
  args: [Duration],
3318
3407
  command: 'ChatDebug.toggleTableColumnVisibility',
@@ -3398,102 +3487,6 @@ const getMenuIds = () => {
3398
3487
  return [MenuChatDebugTableHeader, MenuChatDebugTableBody, 556, 557];
3399
3488
  };
3400
3489
 
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
3490
  const ParseChatDebugUriErrorCode = {
3498
3491
  InvalidSessionId: 1,
3499
3492
  InvalidUriEncoding: 2,
@@ -3657,6 +3650,99 @@ const getSessionNotFoundMessage = sessionId => {
3657
3650
  return noChatSessionFound(sessionId);
3658
3651
  };
3659
3652
 
3653
+ const getResponseMap = events => {
3654
+ const seen = Object.create(null);
3655
+ for (const event of events) {
3656
+ if (event.type === 'ai-response' && 'requestId' in event && typeof event.requestId === 'string') {
3657
+ seen[event.requestId] = event;
3658
+ }
3659
+ }
3660
+ return seen;
3661
+ };
3662
+
3663
+ const getMergedRequestResponseEvent = (item, response) => {
3664
+ const parsedStart = new Date(item.timestamp || '');
3665
+ const parsedEnd = new Date(response.timestamp || '');
3666
+ const durationMs = parsedEnd.getTime() - parsedStart.getTime();
3667
+ const started = getStartedTimestamp(item);
3668
+ const ended = getEndedTimestamp(response);
3669
+ const timestamp = item.timestamp ?? started;
3670
+ if (Number.isFinite(durationMs) && durationMs >= 0) {
3671
+ return {
3672
+ durationMs,
3673
+ ...(ended === undefined ? {} : {
3674
+ ended
3675
+ }),
3676
+ eventEndId: response.eventId,
3677
+ eventId: item.eventId,
3678
+ method: 'POST',
3679
+ size: 0,
3680
+ ...(started === undefined ? {} : {
3681
+ started
3682
+ }),
3683
+ ...(timestamp === undefined ? {} : {
3684
+ timestamp
3685
+ }),
3686
+ type: 'ai-request-response'
3687
+ };
3688
+ }
3689
+ return {
3690
+ ...(ended === undefined ? {} : {
3691
+ ended
3692
+ }),
3693
+ eventEndId: response.eventId,
3694
+ eventId: item.eventId,
3695
+ method: 'POST',
3696
+ size: 0,
3697
+ ...(started === undefined ? {} : {
3698
+ started
3699
+ }),
3700
+ ...(timestamp === undefined ? {} : {
3701
+ timestamp
3702
+ }),
3703
+ type: 'ai-request-response'
3704
+ };
3705
+ };
3706
+ const toPrettyEvents = rawEvents => {
3707
+ if (rawEvents.type === 'error') {
3708
+ return [];
3709
+ }
3710
+ const pretty = [];
3711
+ const map = getResponseMap(rawEvents.events);
3712
+ for (const item of rawEvents.events) {
3713
+ if (item.type === 'ai-request' && 'requestId' in item && typeof item.requestId === 'string') {
3714
+ const response = map[item.requestId];
3715
+ if (response) {
3716
+ pretty.push(getMergedRequestResponseEvent(item, response));
3717
+ } else {
3718
+ pretty.push(item);
3719
+ }
3720
+ } else if (item.type === 'ai-response' && 'requestId' in item && typeof item.requestId === 'string') ; else {
3721
+ pretty.push(item);
3722
+ }
3723
+ }
3724
+ return pretty;
3725
+ };
3726
+
3727
+ const listChatViewEvents = async (sessionId, _databaseName, _dataBaseVersion, _eventStoreName, _sessionIdIndexName) => {
3728
+ try {
3729
+ const rawEvents = await listChatViewEvents$1(sessionId);
3730
+ if (rawEvents.type === 'error') {
3731
+ return rawEvents;
3732
+ }
3733
+ const prettyEvents = toPrettyEvents(rawEvents);
3734
+ return {
3735
+ events: prettyEvents,
3736
+ type: 'success'
3737
+ };
3738
+ } catch (error) {
3739
+ return {
3740
+ error,
3741
+ type: 'error'
3742
+ };
3743
+ }
3744
+ };
3745
+
3660
3746
  const restoreSelectedEvent = async state => {
3661
3747
  if (state.selectedEventId === null) {
3662
3748
  return {
@@ -3699,7 +3785,7 @@ const restoreSelectedEvent = async state => {
3699
3785
  selectedEventIndex: null
3700
3786
  };
3701
3787
  }
3702
- const selectedEventDetails = await loadEventsDependencies.loadSelectedEvent({
3788
+ const selectedEventDetails = await loadSelectedEvent({
3703
3789
  eventId: selectedEvent.eventId,
3704
3790
  sessionId: state.sessionId,
3705
3791
  type: selectedEvent.type
@@ -3719,13 +3805,7 @@ const restoreSelectedEvent = async state => {
3719
3805
  };
3720
3806
 
3721
3807
  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);
3808
+ const result = await listChatViewEvents(sessionId);
3729
3809
  if (result.type === 'error') {
3730
3810
  return applyVirtualTableState(getStateWithTimelineInfo({
3731
3811
  ...state,
@@ -3764,14 +3844,6 @@ const loadEventsForSessionId = async (state, sessionId) => {
3764
3844
  return withSelectedEventVisible(restoredState);
3765
3845
  };
3766
3846
 
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
3847
  const refreshEvents = async state => {
3776
3848
  const sessionId = state.sessionId || getSessionIdFromUri(state);
3777
3849
  if (!sessionId) {
@@ -3784,11 +3856,8 @@ const refresh = async state => {
3784
3856
  return refreshEvents(state);
3785
3857
  };
3786
3858
 
3787
- const handleClickRefreshDependencies = {
3788
- refresh: refresh
3789
- };
3790
3859
  const handleClickRefresh = async state => {
3791
- return handleClickRefreshDependencies.refresh(state);
3860
+ return refresh(state);
3792
3861
  };
3793
3862
 
3794
3863
  const handleCloseDetails$1 = state => {
@@ -4710,6 +4779,8 @@ const handleTableHeaderClick = (state, value) => {
4710
4779
 
4711
4780
  const getTableResizerId = name => {
4712
4781
  switch (name) {
4782
+ case 'ResizerFour':
4783
+ return 4;
4713
4784
  case 'ResizerOne':
4714
4785
  return 1;
4715
4786
  case 'ResizerThree':
@@ -4758,6 +4829,30 @@ const handleTableRowCopy = async (state, eventIndex) => {
4758
4829
  return state;
4759
4830
  };
4760
4831
 
4832
+ const toDataUri$1 = text => {
4833
+ return `data:application/json,${encodeURIComponent(text)}`;
4834
+ };
4835
+ const handleTableRowDoubleClick = async (state, eventX, eventY) => {
4836
+ const eventIndex = getTableBodyEventIndex(state, eventX, eventY);
4837
+ if (eventIndex === -1) {
4838
+ return state;
4839
+ }
4840
+ const event = getCurrentEvents$1(state)[eventIndex];
4841
+ if (!event) {
4842
+ return state;
4843
+ }
4844
+ const responseData = getResponseData(event);
4845
+ if (responseData === undefined) {
4846
+ return state;
4847
+ }
4848
+ const text = JSON.stringify(responseData, null, 2);
4849
+ if (!text) {
4850
+ return state;
4851
+ }
4852
+ await openUri(toDataUri$1(text));
4853
+ return state;
4854
+ };
4855
+
4761
4856
  const toDataUri = text => {
4762
4857
  return `data:application/json,${encodeURIComponent(text)}`;
4763
4858
  };
@@ -5089,14 +5184,20 @@ const handleStorageWorkerUpdate = async uid => {
5089
5184
  await invoke('Viewlet.executeViewletCommand', uid, 'ChatDebug.handleClickRefresh');
5090
5185
  };
5091
5186
 
5092
- const loadContentDependencies = loadEventsDependencies;
5093
- loadContentDependencies.registerUpdateListener = registerUpdateListener;
5187
+ const loadEventsFromUri = async state => {
5188
+ const sessionId = getSessionIdFromUri(state);
5189
+ if (!sessionId) {
5190
+ return getStateWithInvalidUri(state);
5191
+ }
5192
+ return loadEventsForSessionId(state, sessionId);
5193
+ };
5194
+
5094
5195
  const loadContent = async (state, savedState) => {
5095
5196
  await getPreference('chatDebug.autoRefresh');
5096
5197
  const nextState = await loadEventsFromUri(restoreSavedState(state, savedState));
5097
5198
  if (nextState.sessionId) {
5098
5199
  try {
5099
- await loadContentDependencies.registerUpdateListener(nextState.sessionId, rpcId, nextState.uid);
5200
+ await registerUpdateListener(nextState.sessionId, rpcId, nextState.uid);
5100
5201
  } catch {
5101
5202
  // ignore
5102
5203
  }
@@ -5104,8 +5205,7 @@ const loadContent = async (state, savedState) => {
5104
5205
  return applyVirtualTableState({
5105
5206
  ...nextState,
5106
5207
  categoryFilters: createCategoryFilters(getSelectedEventCategoryFilters(nextState.categoryFilters)),
5107
- detailTabs: createDetailTabs(getSelectedDetailTab(nextState.detailTabs), nextState.selectedEvent),
5108
- tableColumns: createTableColumns()
5208
+ detailTabs: createDetailTabs(getSelectedDetailTab(nextState.detailTabs), nextState.selectedEvent)
5109
5209
  });
5110
5210
  };
5111
5211
 
@@ -5200,10 +5300,11 @@ const getCss = state => {
5200
5300
  topSize = 30;
5201
5301
  }
5202
5302
  const tableColumnLayout = getTableColumnLayout(tableContentWidth, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths);
5203
- const [tableColZeroWidth = 0, tableColOneWidth = 0, tableColTwoWidth = 0, tableColThreeWidth = 0] = tableColumnLayout.visibleColumnWidths;
5303
+ const [tableColZeroWidth = 0, tableColOneWidth = 0, tableColTwoWidth = 0, tableColThreeWidth = 0, tableColFourWidth = 0] = tableColumnLayout.visibleColumnWidths;
5204
5304
  const resizerOneLeft = tableColumnLayout.resizerLefts[0] ?? 0;
5205
5305
  const resizerTwoLeft = tableColumnLayout.resizerLefts[1] ?? 0;
5206
5306
  const resizerThreeLeft = tableColumnLayout.resizerLefts[2] ?? 0;
5307
+ const resizerFourLeft = tableColumnLayout.resizerLefts[3] ?? 0;
5207
5308
  const {
5208
5309
  selectionEndPercent,
5209
5310
  selectionStartPercent
@@ -5216,6 +5317,7 @@ const getCss = state => {
5216
5317
  --ChatDebugViewTableColOneWidth: ${tableColOneWidth}px;
5217
5318
  --ChatDebugViewTableColTwoWidth: ${tableColTwoWidth}px;
5218
5319
  --ChatDebugViewTableColThreeWidth: ${tableColThreeWidth}px;
5320
+ --ChatDebugViewTableColFourWidth: ${tableColFourWidth}px;
5219
5321
  --ChatDebugViewDetailsLineNumberWidth: ${detailsLineNumberWidth}px;
5220
5322
  --ChatDebugViewPreviewScrollBarHeight: ${previewVirtualization.scrollBarHeight}px;
5221
5323
  --ChatDebugViewPreviewScrollBarOffset: ${previewVirtualization.scrollBarOffset}px;
@@ -5230,6 +5332,7 @@ const getCss = state => {
5230
5332
  --ResizerOneLeft: ${resizerOneLeft}px;
5231
5333
  --ResizerTwoLeft: ${resizerTwoLeft}px;
5232
5334
  --ResizerThreeLeft: ${resizerThreeLeft}px;
5335
+ --ResizerFourLeft: ${resizerFourLeft}px;
5233
5336
  --ChatDebugViewSashWidth: ${state.sashWidth}px;
5234
5337
  --ChatDebugViewTableWidth: ${tableWidth}px;
5235
5338
  --ChatDebugViewTimelineHeight: ${state.timelineHeight}px;
@@ -5252,6 +5355,26 @@ const getCss = state => {
5252
5355
  width: calc(100% - var(--ChatDebugViewTableScrollBarWidth));
5253
5356
  }
5254
5357
 
5358
+ .TableColZero {
5359
+ width: var(--ChatDebugViewTableColZeroWidth);
5360
+ }
5361
+
5362
+ .TableColOne {
5363
+ width: var(--ChatDebugViewTableColOneWidth);
5364
+ }
5365
+
5366
+ .TableColTwo {
5367
+ width: var(--ChatDebugViewTableColTwoWidth);
5368
+ }
5369
+
5370
+ .TableColThree {
5371
+ width: var(--ChatDebugViewTableColThreeWidth);
5372
+ }
5373
+
5374
+ .TableColFour {
5375
+ width: var(--ChatDebugViewTableColFourWidth);
5376
+ }
5377
+
5255
5378
  .Resizers {
5256
5379
  bottom: 0;
5257
5380
  left: 0;
@@ -5287,6 +5410,10 @@ const getCss = state => {
5287
5410
  left: var(--ResizerThreeLeft);
5288
5411
  }
5289
5412
 
5413
+ .ResizerFour {
5414
+ left: var(--ResizerFourLeft);
5415
+ }
5416
+
5290
5417
  .ResizerInner {
5291
5418
  background: var(--vscode-panel-border, rgba(255, 255, 255, 0.12));
5292
5419
  bottom: 0;
@@ -5818,6 +5945,7 @@ const ResizerInner = 'ResizerInner';
5818
5945
  const ResizerOne = 'ResizerOne';
5819
5946
  const ResizerTwo = 'ResizerTwo';
5820
5947
  const ResizerThree = 'ResizerThree';
5948
+ const ResizerFour = 'ResizerFour';
5821
5949
  const TableHead = 'TableHead';
5822
5950
  const Resizers = 'Resizers';
5823
5951
  const TableCol = 'TableCol';
@@ -5861,6 +5989,7 @@ const ChatDebugViewTop = 'ChatDebugViewTop';
5861
5989
  const ChatDebugViewTopDevtools = 'ChatDebugViewTop--devtools';
5862
5990
  const TableCell = 'TableCell';
5863
5991
  const ChatDebugViewCellDuration = 'ChatDebugViewCellDuration';
5992
+ const ChatDebugViewCellSize = 'ChatDebugViewCellSize';
5864
5993
  const ChatDebugViewCellStatusError = 'ChatDebugViewCellStatusError';
5865
5994
  const InputBox = 'InputBox';
5866
5995
  const TokenBoolean = 'Token TokenBoolean';
@@ -5912,6 +6041,7 @@ const HandlePreviewTextScrollBarPointerDown = 37;
5912
6041
  const HandlePreviewTextScrollBarPointerMove = 38;
5913
6042
  const HandlePreviewTextScrollBarPointerUp = 39;
5914
6043
  const HandleRootContextMenu = 40;
6044
+ const HandleTableRowDoubleClick = 41;
5915
6045
 
5916
6046
  const debugErrorRootNode = {
5917
6047
  childCount: 1,
@@ -7461,13 +7591,13 @@ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes,
7461
7591
  }, ...getDetailsTopVirtualDom(normalizedDetailTabs), ...getDetailContentDom(selectedDetailTab, safeSelectedDetailTab, contentNodes)];
7462
7592
  };
7463
7593
 
7464
- const td$1 = {
7594
+ const td$2 = {
7465
7595
  childCount: 1,
7466
7596
  className: mergeClassNames(TableCell, ChatDebugViewCellDuration),
7467
7597
  type: Td
7468
7598
  };
7469
7599
  const getCellDurationDom = event => {
7470
- return [td$1, text(getEventTableDurationText(event))];
7600
+ return [td$2, text(getEventTableDurationText(event))];
7471
7601
  };
7472
7602
 
7473
7603
  const getMethods = new Set(['list_dir', 'list_files', 'read_file']);
@@ -7493,13 +7623,22 @@ const getEventTableMethodLabel = event => {
7493
7623
  return '';
7494
7624
  };
7495
7625
 
7496
- const td = {
7626
+ const td$1 = {
7497
7627
  childCount: 1,
7498
7628
  className: TableCell,
7499
7629
  type: Td
7500
7630
  };
7501
7631
  const getCellMethodDom = event => {
7502
- return [td, text(getEventTableMethodLabel(event))];
7632
+ return [td$1, text(getEventTableMethodLabel(event))];
7633
+ };
7634
+
7635
+ const td = {
7636
+ childCount: 1,
7637
+ className: mergeClassNames(TableCell, ChatDebugViewCellSize),
7638
+ type: Td
7639
+ };
7640
+ const getCellSizeDom = event => {
7641
+ return [td, text(formatBytes(event.size ?? 0))];
7503
7642
  };
7504
7643
 
7505
7644
  const getCellStatusDom = (event, isErrorStatus) => {
@@ -7524,6 +7663,8 @@ const getTableCellDom = (column, event, isErrorStatus) => {
7524
7663
  return getCellDurationDom(event);
7525
7664
  case Method:
7526
7665
  return getCellMethodDom(event);
7666
+ case Size:
7667
+ return getCellSizeDom(event);
7527
7668
  case Status$1:
7528
7669
  return getCellStatusDom(event, isErrorStatus);
7529
7670
  case Type:
@@ -7683,23 +7824,27 @@ const getTableBodyDom = (rowNodes, eventCount) => {
7683
7824
  childCount: eventCount === 0 ? 1 : eventCount,
7684
7825
  className: TableBody,
7685
7826
  onContextMenu: HandleTableBodyContextMenu,
7827
+ onDblClick: HandleTableRowDoubleClick,
7686
7828
  onPointerDown: HandleEventRowClickAt,
7687
7829
  type: TBody
7688
7830
  }, ...rowNodes];
7689
7831
  };
7690
7832
 
7691
- const tableColClassNames = ['TableColZero', 'TableColOne', 'TableColTwo', 'TableColThree'];
7833
+ const tableColClassNames = ['TableColZero', 'TableColOne', 'TableColTwo', 'TableColThree', 'TableColFour'];
7692
7834
  const getTableColumnGroupDom = visibleTableColumns => {
7693
7835
  const orderedVisibleTableColumns = getOrderedVisibleTableColumns(visibleTableColumns);
7694
7836
  return [{
7695
7837
  childCount: orderedVisibleTableColumns.length,
7696
7838
  className: 'ColGroup',
7697
7839
  type: ColGroup
7698
- }, ...orderedVisibleTableColumns.map((_, index) => ({
7699
- childCount: 0,
7700
- className: `${TableCol} ${tableColClassNames[index]}`,
7701
- type: Col
7702
- }))];
7840
+ }, ...orderedVisibleTableColumns.map((_, index) => {
7841
+ const columnClassName = tableColClassNames[index] ?? `TableCol${index}`;
7842
+ return {
7843
+ childCount: 0,
7844
+ className: `${TableCol} ${columnClassName}`,
7845
+ type: Col
7846
+ };
7847
+ })];
7703
7848
  };
7704
7849
 
7705
7850
  const getHeaderCellNode = (column, tableColumns) => {
@@ -7740,8 +7885,8 @@ const getTableDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleT
7740
7885
  }, ...getTableColumnGroupDom(visibleTableColumns), ...getTableHeaderDom(visibleTableColumns, tableColumns), ...getTableBodyDom(rowNodes, eventCount)];
7741
7886
  };
7742
7887
 
7743
- const resizerNames = ['ResizerOne', 'ResizerTwo', 'ResizerThree'];
7744
- const resizerClassNames = [ResizerOne, ResizerTwo, ResizerThree];
7888
+ const resizerNames = ['ResizerOne', 'ResizerTwo', 'ResizerThree', 'ResizerFour'];
7889
+ const resizerClassNames = [ResizerOne, ResizerTwo, ResizerThree, ResizerFour];
7745
7890
  const getTableResizersDom = visibleTableColumns => {
7746
7891
  const visibleColumnCount = getOrderedVisibleTableColumns(visibleTableColumns).length;
7747
7892
  const resizerCount = Math.max(0, visibleColumnCount - 1);
@@ -8204,6 +8349,9 @@ const renderEventListeners = () => {
8204
8349
  }, {
8205
8350
  name: HandleEventRowClickAt,
8206
8351
  params: ['handleEventRowClickAt', ClientX, ClientY, Button]
8352
+ }, {
8353
+ name: HandleTableRowDoubleClick,
8354
+ params: ['handleTableRowDoubleClick', ClientX, ClientY]
8207
8355
  }, {
8208
8356
  name: HandleTableBodyContextMenu,
8209
8357
  params: ['handleTableBodyContextMenu', ClientX, ClientY],
@@ -8407,19 +8555,9 @@ const setEvents = (state, events) => {
8407
8555
  }));
8408
8556
  };
8409
8557
 
8410
- const setSessionIdDependencies = {
8411
- listChatViewEvents: listChatViewEvents,
8412
- registerUpdateListener: registerUpdateListener
8413
- };
8414
8558
  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);
8559
+ const result = await listChatViewEvents(sessionId);
8560
+ await registerUpdateListener(sessionId, rpcId, state.uid);
8423
8561
  if (result.type === 'error') {
8424
8562
  return {
8425
8563
  ...state,
@@ -8518,6 +8656,7 @@ const commandMap = {
8518
8656
  'ChatDebug.handleTableResizerPointerMove': wrapCommand(handleTableResizerPointerMove),
8519
8657
  'ChatDebug.handleTableResizerPointerUp': wrapCommand(handleTableResizerPointerUp),
8520
8658
  'ChatDebug.handleTableRowCopy': wrapCommand(handleTableRowCopy),
8659
+ 'ChatDebug.handleTableRowDoubleClick': wrapCommand(handleTableRowDoubleClick),
8521
8660
  'ChatDebug.handleTableRowOpenInNewTab': wrapCommand(handleTableRowOpenInNewTab),
8522
8661
  'ChatDebug.handleTableScrollBarPointerDown': wrapCommand(handleTableScrollBarPointerDown),
8523
8662
  '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.20.0",
4
4
  "description": "Chat Debug View Worker",
5
5
  "repository": {
6
6
  "type": "git",