@lvce-editor/chat-debug-view 10.7.0 → 10.9.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.
@@ -1446,6 +1446,7 @@ const ImageCouldNotBeLoaded = 'image could not be loaded';
1446
1446
  const InvalidSessionId = 'Invalid session id';
1447
1447
  const InvalidUriEncoding = 'Invalid URI encoding';
1448
1448
  const InvalidUriFormat = 'Invalid URI format';
1449
+ const Method$1 = 'Method';
1449
1450
  const MissingUri = 'Missing URI';
1450
1451
  const Network$1 = 'Network';
1451
1452
  const NoChatSessionFound = 'No chat session found for sessionId "{PH1}".';
@@ -1528,6 +1529,9 @@ const invalidUriFormat = () => {
1528
1529
  const missingUri = () => {
1529
1530
  return i18nString(MissingUri);
1530
1531
  };
1532
+ const method = () => {
1533
+ return i18nString(Method$1);
1534
+ };
1531
1535
  const network = () => {
1532
1536
  return i18nString(Network$1);
1533
1537
  };
@@ -1830,14 +1834,19 @@ const parseFilterValue = filterValue => {
1830
1834
  };
1831
1835
 
1832
1836
  const Type = 'type';
1837
+ const Method = 'method';
1833
1838
  const Duration = 'duration';
1834
1839
  const Status$1 = 'status';
1835
- const tableColumnNames = [Type, Status$1, Duration];
1840
+ const tableColumnNames = [Type, Method, Status$1, Duration];
1836
1841
  const createTableColumns = () => {
1837
1842
  return [{
1838
1843
  isVisible: true,
1839
1844
  label: type(),
1840
1845
  name: Type
1846
+ }, {
1847
+ isVisible: true,
1848
+ label: method(),
1849
+ name: Method
1841
1850
  }, {
1842
1851
  isVisible: true,
1843
1852
  label: status(),
@@ -1877,6 +1886,8 @@ const getTableColumnLabel = (tableColumns, name) => {
1877
1886
  switch (name) {
1878
1887
  case Duration:
1879
1888
  return duration();
1889
+ case Method:
1890
+ return method();
1880
1891
  case Status$1:
1881
1892
  return status();
1882
1893
  case Type:
@@ -1888,6 +1899,7 @@ const getTableColumnLabel = (tableColumns, name) => {
1888
1899
 
1889
1900
  const defaultTableColumnWidths = {
1890
1901
  duration: 110,
1902
+ method: 90,
1891
1903
  status: 110,
1892
1904
  type: 260
1893
1905
  };
@@ -1921,6 +1933,7 @@ const getTableWidthFromClientX = (viewX, width, clientX) => {
1921
1933
 
1922
1934
  const minimumTableColumnWidths = {
1923
1935
  [Duration]: 80,
1936
+ [Method]: 56,
1924
1937
  [Status$1]: 56,
1925
1938
  [Type]: 80
1926
1939
  };
@@ -1989,7 +2002,7 @@ const getResizedTableColumnWidths = (width, tableWidth, visibleTableColumns, tab
1989
2002
  };
1990
2003
 
1991
2004
  const isSameTableColumnWidths = (first, second) => {
1992
- return first.type === second.type && first.duration === second.duration && first.status === second.status;
2005
+ return first.type === second.type && first.method === second.method && first.duration === second.duration && first.status === second.status;
1993
2006
  };
1994
2007
 
1995
2008
  const isFiniteNumber = value => {
@@ -2001,7 +2014,7 @@ const isTableColumnWidths = value => {
2001
2014
  return false;
2002
2015
  }
2003
2016
  const record = value;
2004
- return isFiniteNumber(record.type) && isFiniteNumber(record.duration) && isFiniteNumber(record.status);
2017
+ return isFiniteNumber(record.type) && isFiniteNumber(record.method) && isFiniteNumber(record.duration) && isFiniteNumber(record.status);
2005
2018
  };
2006
2019
 
2007
2020
  const validEventCategoryFilters = new Set([All, Network, Stream, Tools, Ui]);
@@ -2210,6 +2223,9 @@ const createDefaultState = () => {
2210
2223
  databaseName: 'lvce-chat-view-sessions',
2211
2224
  dataBaseVersion: 2,
2212
2225
  detailTabs: createDetailTabs(),
2226
+ devtoolsRootGap: 4,
2227
+ devtoolsTimelineHeight: 88,
2228
+ devtoolsTopHeight: 28,
2213
2229
  errorMessage: '',
2214
2230
  events: [],
2215
2231
  eventStoreName: 'chat-view-events',
@@ -2222,6 +2238,9 @@ const createDefaultState = () => {
2222
2238
  platform: 0,
2223
2239
  previewTextCursorColumnIndex: null,
2224
2240
  previewTextCursorRowIndex: null,
2241
+ previewTextDeltaY: 0,
2242
+ previewTextScrollBarHandleOffset: 0,
2243
+ previewTextScrollBarPointerActive: false,
2225
2244
  sashPointerActive: false,
2226
2245
  selectedEvent: null,
2227
2246
  selectedEventId: null,
@@ -2293,7 +2312,7 @@ const RenderFocusContext = 4;
2293
2312
  const RenderFocus = 5;
2294
2313
 
2295
2314
  const diff = (oldState, newState) => {
2296
- 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.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) {
2315
+ 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) {
2297
2316
  return [RenderIncremental, RenderCss];
2298
2317
  }
2299
2318
  return [];
@@ -2501,7 +2520,7 @@ const getVisibleEvents = (events, showInputEvents, showResponsePartEvents, showE
2501
2520
 
2502
2521
  const isNetworkEvent = event => {
2503
2522
  const normalizedType = event.type.toLowerCase();
2504
- return normalizedType === 'request' || normalizedType === 'response' || normalizedType === 'handle-response' || normalizedType.includes('fetch') || normalizedType.includes('xhr');
2523
+ return normalizedType === 'request' || normalizedType === 'ai-request' || normalizedType === 'response' || normalizedType === 'ai-response-success' || normalizedType === 'handle-response' || normalizedType.includes('fetch') || normalizedType.includes('xhr');
2505
2524
  };
2506
2525
 
2507
2526
  const isStreamEvent = event => {
@@ -2574,7 +2593,6 @@ const getEventTableDurationText = event => {
2574
2593
  return `${durationText.slice(0, -2)} ms`;
2575
2594
  };
2576
2595
 
2577
- const toolExecutionTypePrefix = 'tool-execution';
2578
2596
  const getToolName = event => {
2579
2597
  if (typeof event.toolName === 'string' && event.toolName) {
2580
2598
  return event.toolName;
@@ -2596,6 +2614,8 @@ const getToolName = event => {
2596
2614
  }
2597
2615
  return name;
2598
2616
  };
2617
+
2618
+ const toolExecutionTypePrefix = 'tool-execution';
2599
2619
  const getEventTypeLabel = event => {
2600
2620
  if (!event.type.startsWith(toolExecutionTypePrefix)) {
2601
2621
  return event.type;
@@ -2748,11 +2768,11 @@ const devtoolsTableScrollBarWidth = 12;
2748
2768
  const devtoolsTableSummaryHeight = 24;
2749
2769
  const minimumDevtoolsTableScrollBarHeight = 20;
2750
2770
 
2751
- const devtoolsRootGap = 4;
2752
- const devtoolsTopHeight = 28;
2753
- const devtoolsTimelineHeight = 88;
2754
2771
  const getTableBodyY = (state, hasTimeline) => {
2755
2772
  const {
2773
+ devtoolsRootGap,
2774
+ devtoolsTimelineHeight,
2775
+ devtoolsTopHeight,
2756
2776
  y
2757
2777
  } = state;
2758
2778
  return y + viewPadding + devtoolsTopHeight + devtoolsRootGap + (hasTimeline ? devtoolsTimelineHeight : 0) + devtoolsTableHeaderHeight;
@@ -2990,6 +3010,9 @@ const selectEventAtIndex = async (state, selectedEventIndex, dependencies = sele
2990
3010
  detailTabs: createDetailTabs(selectedDetailTab, resolvedSelectedEvent),
2991
3011
  previewTextCursorColumnIndex: null,
2992
3012
  previewTextCursorRowIndex: null,
3013
+ previewTextDeltaY: 0,
3014
+ previewTextScrollBarHandleOffset: 0,
3015
+ previewTextScrollBarPointerActive: false,
2993
3016
  selectedEvent: resolvedSelectedEvent,
2994
3017
  selectedEventId: selectedEvent.eventId,
2995
3018
  selectedEventIndex
@@ -3332,6 +3355,9 @@ const restoreSelectedEvent = async state => {
3332
3355
  ...state,
3333
3356
  previewTextCursorColumnIndex: null,
3334
3357
  previewTextCursorRowIndex: null,
3358
+ previewTextDeltaY: 0,
3359
+ previewTextScrollBarHandleOffset: 0,
3360
+ previewTextScrollBarPointerActive: false,
3335
3361
  selectedEvent: null,
3336
3362
  selectedEventIndex: null
3337
3363
  };
@@ -3343,6 +3369,9 @@ const restoreSelectedEvent = async state => {
3343
3369
  ...state,
3344
3370
  previewTextCursorColumnIndex: null,
3345
3371
  previewTextCursorRowIndex: null,
3372
+ previewTextDeltaY: 0,
3373
+ previewTextScrollBarHandleOffset: 0,
3374
+ previewTextScrollBarPointerActive: false,
3346
3375
  selectedEvent: null,
3347
3376
  selectedEventId: null,
3348
3377
  selectedEventIndex: null
@@ -3354,6 +3383,9 @@ const restoreSelectedEvent = async state => {
3354
3383
  ...state,
3355
3384
  previewTextCursorColumnIndex: null,
3356
3385
  previewTextCursorRowIndex: null,
3386
+ previewTextDeltaY: 0,
3387
+ previewTextScrollBarHandleOffset: 0,
3388
+ previewTextScrollBarPointerActive: false,
3357
3389
  selectedEvent: null,
3358
3390
  selectedEventId: null,
3359
3391
  selectedEventIndex: null
@@ -3365,6 +3397,9 @@ const restoreSelectedEvent = async state => {
3365
3397
  ...state,
3366
3398
  previewTextCursorColumnIndex: null,
3367
3399
  previewTextCursorRowIndex: null,
3400
+ previewTextDeltaY: 0,
3401
+ previewTextScrollBarHandleOffset: 0,
3402
+ previewTextScrollBarPointerActive: false,
3368
3403
  selectedEvent: resolvedSelectedEvent,
3369
3404
  selectedEventId: selectedEvent.eventId,
3370
3405
  selectedEventIndex
@@ -3449,6 +3484,9 @@ const handleCloseDetails$1 = state => {
3449
3484
  ...state,
3450
3485
  previewTextCursorColumnIndex: null,
3451
3486
  previewTextCursorRowIndex: null,
3487
+ previewTextDeltaY: 0,
3488
+ previewTextScrollBarHandleOffset: 0,
3489
+ previewTextScrollBarPointerActive: false,
3452
3490
  selectedEvent: null,
3453
3491
  selectedEventId: null,
3454
3492
  selectedEventIndex: null
@@ -3880,26 +3918,42 @@ const getResponseContentText = content => {
3880
3918
  } = content;
3881
3919
  return typeof text === 'string' ? text : undefined;
3882
3920
  };
3883
- const getSseResponseCompletedPreviewText = event => {
3884
- if (event.type !== 'sse-response-completed') {
3885
- return undefined;
3886
- }
3887
- const {
3888
- value
3889
- } = event;
3890
- if (!value || typeof value !== 'object') {
3891
- return undefined;
3921
+ const getResponseOutput = event => {
3922
+ if (event.type === 'sse-response-completed') {
3923
+ const {
3924
+ value
3925
+ } = event;
3926
+ if (!value || typeof value !== 'object') {
3927
+ return undefined;
3928
+ }
3929
+ const {
3930
+ response
3931
+ } = value;
3932
+ if (!response || typeof response !== 'object') {
3933
+ return undefined;
3934
+ }
3935
+ const {
3936
+ output
3937
+ } = response;
3938
+ return Array.isArray(output) ? output : undefined;
3892
3939
  }
3893
- const {
3894
- response
3895
- } = value;
3896
- if (!response || typeof response !== 'object') {
3897
- return undefined;
3940
+ if (event.type === 'ai-response') {
3941
+ const {
3942
+ value
3943
+ } = event;
3944
+ if (!value || typeof value !== 'object') {
3945
+ return undefined;
3946
+ }
3947
+ const {
3948
+ output
3949
+ } = value;
3950
+ return Array.isArray(output) ? output : undefined;
3898
3951
  }
3899
- const {
3900
- output
3901
- } = response;
3902
- if (!Array.isArray(output) || output.length === 0) {
3952
+ return undefined;
3953
+ };
3954
+ const getResponsePreviewText = event => {
3955
+ const output = getResponseOutput(event);
3956
+ if (!output || output.length === 0) {
3903
3957
  return undefined;
3904
3958
  }
3905
3959
  const [firstOutput] = output;
@@ -3915,9 +3969,9 @@ const getPreviewMessageText = event => {
3915
3969
  if (isChatMessageUpdatedEvent(event) && typeof event.text === 'string') {
3916
3970
  return event.text;
3917
3971
  }
3918
- const sseResponseCompletedPreviewText = getSseResponseCompletedPreviewText(event);
3919
- if (sseResponseCompletedPreviewText !== undefined) {
3920
- return sseResponseCompletedPreviewText;
3972
+ const responsePreviewText = getResponsePreviewText(event);
3973
+ if (responsePreviewText !== undefined) {
3974
+ return responsePreviewText;
3921
3975
  }
3922
3976
  if (!isChatMessageAddedEvent(event)) {
3923
3977
  return undefined;
@@ -4004,16 +4058,21 @@ const getWriteFilePreviewText = (event, name) => {
4004
4058
  const {
4005
4059
  arguments: toolArguments
4006
4060
  } = event;
4007
- if (typeof toolArguments !== 'object' || toolArguments === null || !Object.hasOwn(toolArguments, 'content')) {
4061
+ if (typeof toolArguments !== 'object' || toolArguments === null || !Object.hasOwn(toolArguments, 'content') || !Object.hasOwn(toolArguments, 'uri')) {
4008
4062
  return undefined;
4009
4063
  }
4010
4064
  const {
4011
- content
4065
+ content,
4066
+ uri
4012
4067
  } = toolArguments;
4013
- if (typeof content !== 'string') {
4068
+ if (typeof content !== 'string' || typeof uri !== 'string') {
4014
4069
  return undefined;
4015
4070
  }
4016
- return content;
4071
+ return {
4072
+ content,
4073
+ previewType: 'write-file',
4074
+ uri
4075
+ };
4017
4076
  };
4018
4077
 
4019
4078
  const getPreviewEvent = event => {
@@ -4064,6 +4123,77 @@ const getPreviewTextCursorStyle = cursor => {
4064
4123
  return `height: ${previewTextRowHeight}px; left: ${cursor.columnIndex * defaultPreviewTextColumnWidth}px; top: ${cursor.rowIndex * previewTextRowHeight}px; width: 0px;`;
4065
4124
  };
4066
4125
 
4126
+ const isWriteFilePreview = value => {
4127
+ return typeof value === 'object' && value !== null && value.previewType === 'write-file' && typeof value.content === 'string' && typeof value.uri === 'string';
4128
+ };
4129
+
4130
+ const getPreviewTextValue = selectedEvent => {
4131
+ if (!selectedEvent) {
4132
+ return undefined;
4133
+ }
4134
+ const previewEvent = getPreviewEvent(selectedEvent);
4135
+ if (typeof previewEvent === 'string') {
4136
+ return previewEvent;
4137
+ }
4138
+ if (isWriteFilePreview(previewEvent)) {
4139
+ return previewEvent.content;
4140
+ }
4141
+ return undefined;
4142
+ };
4143
+ const getPreviewTextLineCount = selectedEvent => {
4144
+ const value = getPreviewTextValue(selectedEvent);
4145
+ if (value === undefined) {
4146
+ return 0;
4147
+ }
4148
+ return value.split('\n').length;
4149
+ };
4150
+ const getPreviewTextViewportHeight = state => {
4151
+ if (!state.selectedEvent) {
4152
+ return 0;
4153
+ }
4154
+ return getTableBodyHeight(state, 1);
4155
+ };
4156
+ const getPreviewTextMaxDeltaY = (lineCount, viewportHeight) => {
4157
+ return Math.max(lineCount * previewTextRowHeight - viewportHeight, 0);
4158
+ };
4159
+ const clampPreviewTextDeltaY = (deltaY, lineCount, viewportHeight) => {
4160
+ const maxDeltaY = getPreviewTextMaxDeltaY(lineCount, viewportHeight);
4161
+ if (deltaY < 0) {
4162
+ return 0;
4163
+ }
4164
+ if (deltaY > maxDeltaY) {
4165
+ return maxDeltaY;
4166
+ }
4167
+ return deltaY;
4168
+ };
4169
+ const getPreviewVirtualizationState = (selectedEvent, viewportHeight, deltaY) => {
4170
+ const totalLineCount = getPreviewTextLineCount(selectedEvent);
4171
+ const clampedDeltaY = clampPreviewTextDeltaY(deltaY, totalLineCount, viewportHeight);
4172
+ const startLineY = Math.floor(clampedDeltaY / previewTextRowHeight);
4173
+ const visibleLineCount = viewportHeight <= 0 ? 0 : Math.max(1, Math.ceil(viewportHeight / previewTextRowHeight));
4174
+ const endLineY = Math.min(totalLineCount, startLineY + visibleLineCount);
4175
+ const maxDeltaY = getPreviewTextMaxDeltaY(totalLineCount, viewportHeight);
4176
+ const scrollBarHeight = getScrollBarHeight(totalLineCount, viewportHeight);
4177
+ const scrollBarOffset = getScrollBarOffset(clampedDeltaY, maxDeltaY, viewportHeight, scrollBarHeight);
4178
+ return {
4179
+ deltaY: clampedDeltaY,
4180
+ endLineY,
4181
+ maxDeltaY,
4182
+ scrollBarHeight,
4183
+ scrollBarOffset,
4184
+ showScrollBar: scrollBarHeight > 0,
4185
+ startLineY,
4186
+ totalLineCount,
4187
+ viewportHeight
4188
+ };
4189
+ };
4190
+ const setPreviewTextDeltaY = (state, deltaY) => {
4191
+ return {
4192
+ ...state,
4193
+ previewTextDeltaY: clampPreviewTextDeltaY(deltaY, getPreviewTextLineCount(state.selectedEvent), getPreviewTextViewportHeight(state))
4194
+ };
4195
+ };
4196
+
4067
4197
  const hasNumberedTextPreview = (state, previewEvent) => {
4068
4198
  if (typeof previewEvent !== 'string') {
4069
4199
  return false;
@@ -4081,7 +4211,8 @@ const handlePreviewTextPointerDown = (state, x, y) => {
4081
4211
  if (!hasNumberedTextPreview(state, previewEvent)) {
4082
4212
  return state;
4083
4213
  }
4084
- const cursor = getPreviewTextCursorFromPoint(previewEvent, x, y);
4214
+ const deltaY = clampPreviewTextDeltaY(state.previewTextDeltaY, getPreviewTextLineCount(state.selectedEvent), getPreviewTextViewportHeight(state));
4215
+ const cursor = getPreviewTextCursorFromPoint(previewEvent, x, y + deltaY);
4085
4216
  if (state.previewTextCursorColumnIndex === cursor.columnIndex && state.previewTextCursorRowIndex === cursor.rowIndex) {
4086
4217
  return state;
4087
4218
  }
@@ -4092,6 +4223,87 @@ const handlePreviewTextPointerDown = (state, x, y) => {
4092
4223
  };
4093
4224
  };
4094
4225
 
4226
+ const getPreviewTextBodyY = state => {
4227
+ return getTableBodyY(state, true);
4228
+ };
4229
+
4230
+ const getHandleOffsetAndPercent$1 = (viewportHeight, scrollBarHeight, relativeY) => {
4231
+ const halfScrollBarHeight = scrollBarHeight / 2;
4232
+ if (relativeY <= halfScrollBarHeight) {
4233
+ return {
4234
+ handleOffset: relativeY,
4235
+ percent: 0
4236
+ };
4237
+ }
4238
+ if (relativeY <= viewportHeight - halfScrollBarHeight) {
4239
+ return {
4240
+ handleOffset: halfScrollBarHeight,
4241
+ percent: (relativeY - halfScrollBarHeight) / Math.max(1, viewportHeight - scrollBarHeight)
4242
+ };
4243
+ }
4244
+ return {
4245
+ handleOffset: scrollBarHeight - viewportHeight + relativeY,
4246
+ percent: 1
4247
+ };
4248
+ };
4249
+ const handlePreviewTextScrollBarPointerDown = (state, eventY) => {
4250
+ const viewportHeight = getPreviewTextViewportHeight(state);
4251
+ const virtualization = getPreviewVirtualizationState(state.selectedEvent, viewportHeight, state.previewTextDeltaY);
4252
+ const bodyY = getPreviewTextBodyY(state);
4253
+ const relativeY = eventY - bodyY;
4254
+ if (virtualization.viewportHeight === 0 || virtualization.scrollBarHeight === 0) {
4255
+ return state;
4256
+ }
4257
+ const {
4258
+ handleOffset,
4259
+ percent
4260
+ } = getHandleOffsetAndPercent$1(virtualization.viewportHeight, virtualization.scrollBarHeight, relativeY);
4261
+ const nextState = setPreviewTextDeltaY(state, percent * virtualization.maxDeltaY);
4262
+ return {
4263
+ ...nextState,
4264
+ previewTextScrollBarHandleOffset: handleOffset,
4265
+ previewTextScrollBarPointerActive: true
4266
+ };
4267
+ };
4268
+
4269
+ const handlePreviewTextScrollBarPointerMove = (state, eventY) => {
4270
+ if (!state.previewTextScrollBarPointerActive) {
4271
+ return state;
4272
+ }
4273
+ const viewportHeight = getPreviewTextViewportHeight(state);
4274
+ const virtualization = getPreviewVirtualizationState(state.selectedEvent, viewportHeight, state.previewTextDeltaY);
4275
+ if (viewportHeight === 0 || virtualization.scrollBarHeight === 0) {
4276
+ return state;
4277
+ }
4278
+ const relativeY = eventY - getPreviewTextBodyY(state);
4279
+ const nextHandleTop = Math.max(0, Math.min(viewportHeight - virtualization.scrollBarHeight, relativeY - state.previewTextScrollBarHandleOffset));
4280
+ const percent = nextHandleTop / Math.max(1, viewportHeight - virtualization.scrollBarHeight);
4281
+ const nextState = setPreviewTextDeltaY(state, percent * virtualization.maxDeltaY);
4282
+ return {
4283
+ ...nextState,
4284
+ previewTextScrollBarPointerActive: true
4285
+ };
4286
+ };
4287
+
4288
+ const handlePreviewTextScrollBarPointerUp = state => {
4289
+ if (!state.previewTextScrollBarPointerActive && state.previewTextScrollBarHandleOffset === 0) {
4290
+ return state;
4291
+ }
4292
+ return {
4293
+ ...state,
4294
+ previewTextScrollBarHandleOffset: 0,
4295
+ previewTextScrollBarPointerActive: false
4296
+ };
4297
+ };
4298
+
4299
+ const handlePreviewTextWheel = (state, deltaY) => {
4300
+ return setPreviewTextDeltaY(state, state.previewTextDeltaY + deltaY);
4301
+ };
4302
+
4303
+ const handleRootContextMenu = state => {
4304
+ return state;
4305
+ };
4306
+
4095
4307
  const handleSashPointerDown = (state, eventX, eventY) => {
4096
4308
  if (state.sashPointerActive) {
4097
4309
  return state;
@@ -4152,6 +4364,8 @@ const getTableResizerId = name => {
4152
4364
  switch (name) {
4153
4365
  case 'ResizerOne':
4154
4366
  return 1;
4367
+ case 'ResizerThree':
4368
+ return 3;
4155
4369
  case 'ResizerTwo':
4156
4370
  return 2;
4157
4371
  default:
@@ -4476,6 +4690,9 @@ const setUseDevtoolsLayout = (state, checked) => {
4476
4690
  ...state,
4477
4691
  previewTextCursorColumnIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorColumnIndex : null,
4478
4692
  previewTextCursorRowIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorRowIndex : null,
4693
+ previewTextDeltaY: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextDeltaY : 0,
4694
+ previewTextScrollBarHandleOffset: 0,
4695
+ previewTextScrollBarPointerActive: false,
4479
4696
  selectedEvent: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEvent : null,
4480
4697
  selectedEventId: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEventId : null,
4481
4698
  selectedEventIndex,
@@ -4625,14 +4842,17 @@ const getCss = state => {
4625
4842
  const tableContentWidth = Math.max(0, tableWidth - (showScrollBar ? devtoolsTableScrollBarWidth : 0));
4626
4843
  const detailsWidth = hasSelectedEvent ? getDetailsWidth(state.width, state.tableWidth) : 0;
4627
4844
  const detailsLineNumberWidth = getDetailsLineNumberWidth(state);
4845
+ const previewTextViewportHeight = getPreviewTextViewportHeight(state);
4846
+ const previewVirtualization = getPreviewVirtualizationState(state.selectedEvent, previewTextViewportHeight, state.previewTextDeltaY);
4628
4847
  let topSize = 60;
4629
4848
  if (state.width >= state.largeBreakpoint) {
4630
4849
  topSize = 30;
4631
4850
  }
4632
4851
  const tableColumnLayout = getTableColumnLayout(tableContentWidth, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths);
4633
- const [tableColZeroWidth = 0, tableColOneWidth = 0, tableColTwoWidth = 0] = tableColumnLayout.visibleColumnWidths;
4852
+ const [tableColZeroWidth = 0, tableColOneWidth = 0, tableColTwoWidth = 0, tableColThreeWidth = 0] = tableColumnLayout.visibleColumnWidths;
4634
4853
  const resizerOneLeft = tableColumnLayout.resizerLefts[0] ?? 0;
4635
4854
  const resizerTwoLeft = tableColumnLayout.resizerLefts[1] ?? 0;
4855
+ const resizerThreeLeft = tableColumnLayout.resizerLefts[2] ?? 0;
4636
4856
  const {
4637
4857
  selectionEndPercent,
4638
4858
  selectionStartPercent
@@ -4644,7 +4864,12 @@ const getCss = state => {
4644
4864
  --ChatDebugViewTableColZeroWidth: ${tableColZeroWidth}px;
4645
4865
  --ChatDebugViewTableColOneWidth: ${tableColOneWidth}px;
4646
4866
  --ChatDebugViewTableColTwoWidth: ${tableColTwoWidth}px;
4867
+ --ChatDebugViewTableColThreeWidth: ${tableColThreeWidth}px;
4647
4868
  --ChatDebugViewDetailsLineNumberWidth: ${detailsLineNumberWidth}px;
4869
+ --ChatDebugViewPreviewScrollBarHeight: ${previewVirtualization.scrollBarHeight}px;
4870
+ --ChatDebugViewPreviewScrollBarOffset: ${previewVirtualization.scrollBarOffset}px;
4871
+ --ChatDebugViewPreviewScrollBarWidth: ${previewVirtualization.showScrollBar ? devtoolsTableScrollBarWidth : 0}px;
4872
+ --ChatDebugViewPreviewViewportHeight: ${previewVirtualization.viewportHeight}px;
4648
4873
  --ChatDebugViewDetailsWidth: ${detailsWidth}px;
4649
4874
  --ChatDebugViewDurationColumnWidth: ${state.tableColumnWidths.duration}px;
4650
4875
  --ChatDebugViewTableRowHeight: ${devtoolsTableRowHeight}px;
@@ -4653,6 +4878,7 @@ const getCss = state => {
4653
4878
  --ChatDebugViewTableScrollBarWidth: ${showScrollBar ? devtoolsTableScrollBarWidth : 0}px;
4654
4879
  --ResizerOneLeft: ${resizerOneLeft}px;
4655
4880
  --ResizerTwoLeft: ${resizerTwoLeft}px;
4881
+ --ResizerThreeLeft: ${resizerThreeLeft}px;
4656
4882
  --ChatDebugViewSashWidth: ${sashWidth}px;
4657
4883
  --ChatDebugViewTableWidth: ${tableWidth}px;
4658
4884
  --ChatDebugViewTimelineHeight: ${state.timelineHeight}px;
@@ -4700,6 +4926,36 @@ const getCss = state => {
4700
4926
  width: var(--ChatDebugViewDetailsLineNumberWidth);
4701
4927
  }
4702
4928
 
4929
+ .PreviewVirtualizedEditor {
4930
+ height: var(--ChatDebugViewPreviewViewportHeight);
4931
+ overflow: hidden;
4932
+ position: relative;
4933
+ }
4934
+
4935
+ .PreviewVirtualizedEditor .Editor {
4936
+ width: calc(100% - var(--ChatDebugViewPreviewScrollBarWidth));
4937
+ }
4938
+
4939
+ .PreviewTextScrollBar {
4940
+ background: rgba(255, 255, 255, 0.06);
4941
+ border-radius: 999px;
4942
+ height: var(--ChatDebugViewPreviewViewportHeight);
4943
+ position: absolute;
4944
+ right: 0;
4945
+ top: 0;
4946
+ width: var(--ChatDebugViewPreviewScrollBarWidth);
4947
+ }
4948
+
4949
+ .PreviewTextScrollBarThumb {
4950
+ background: rgba(255, 255, 255, 0.22);
4951
+ border-radius: 999px;
4952
+ height: var(--ChatDebugViewPreviewScrollBarHeight);
4953
+ left: 2px;
4954
+ position: absolute;
4955
+ top: var(--ChatDebugViewPreviewScrollBarOffset);
4956
+ width: calc(100% - 4px);
4957
+ }
4958
+
4703
4959
  .TableScrollBar {
4704
4960
  background: rgba(255, 255, 255, 0.06);
4705
4961
  border-radius: 999px;
@@ -4720,6 +4976,38 @@ const getCss = state => {
4720
4976
  width: calc(100% - 4px);
4721
4977
  }
4722
4978
 
4979
+ .TokenText {
4980
+ color: var(--vscode-editor-foreground);
4981
+ }
4982
+
4983
+ .TokenString {
4984
+ color: var(--vscode-debugTokenExpression-string, #ce9178);
4985
+ }
4986
+
4987
+ .TokenNumeric {
4988
+ color: var(--vscode-debugTokenExpression-number, #b5cea8);
4989
+ }
4990
+
4991
+ .TokenBoolean {
4992
+ color: var(--vscode-debugTokenExpression-boolean, #569cd6);
4993
+ }
4994
+
4995
+ .TokenKey,
4996
+ .TokenAttributeName,
4997
+ .TokenPropertyName {
4998
+ color: var(--vscode-symbolIcon-propertyForeground, #9cdcfe);
4999
+ }
5000
+
5001
+ .TokenKeyword,
5002
+ .TokenTag,
5003
+ .TokenSelector {
5004
+ color: var(--vscode-symbolIcon-keywordForeground, #569cd6);
5005
+ }
5006
+
5007
+ .TokenComment {
5008
+ color: var(--vscode-editorLineNumber-foreground, #6a9955);
5009
+ }
5010
+
4723
5011
  `;
4724
5012
  };
4725
5013
 
@@ -5048,6 +5336,9 @@ const EditorRows = 'EditorRows';
5048
5336
  const EditorSelection = 'EditorSelection';
5049
5337
  const EditorSelections = 'Selections';
5050
5338
  const EditorViewlet = 'Viewlet Editor';
5339
+ const PreviewTextScrollBar = 'PreviewTextScrollBar';
5340
+ const PreviewTextScrollBarThumb = 'PreviewTextScrollBarThumb';
5341
+ const PreviewVirtualizedEditor = 'PreviewVirtualizedEditor';
5051
5342
  const ChatDebugViewEventLineNumber = 'ChatDebugViewEventLineNumber';
5052
5343
  const Gutter = 'Gutter';
5053
5344
  const TableRowSelected = 'TableRowSelected';
@@ -5077,6 +5368,7 @@ const Resizer = 'Resizer';
5077
5368
  const ResizerInner = 'ResizerInner';
5078
5369
  const ResizerOne = 'ResizerOne';
5079
5370
  const ResizerTwo = 'ResizerTwo';
5371
+ const ResizerThree = 'ResizerThree';
5080
5372
  const TableHead = 'TableHead';
5081
5373
  const Resizers = 'Resizers';
5082
5374
  const TableCol = 'TableCol';
@@ -5123,25 +5415,17 @@ const ChatDebugViewCellDuration = 'ChatDebugViewCellDuration';
5123
5415
  const ChatDebugViewCellStatusError = 'ChatDebugViewCellStatusError';
5124
5416
  const InputBox = 'InputBox';
5125
5417
  const TokenBoolean = 'Token TokenBoolean';
5418
+ const TokenComment = 'Token TokenComment';
5126
5419
  const TokenKey = 'Token TokenKey';
5420
+ const TokenKeyword = 'Token TokenKeyword';
5127
5421
  const TokenNumeric = 'Token TokenNumeric';
5422
+ const TokenAttributeName = 'Token TokenAttributeName';
5423
+ const TokenPropertyName = 'Token TokenPropertyName';
5424
+ const TokenSelector = 'Token TokenSelector';
5128
5425
  const TokenString = 'Token TokenString';
5426
+ const TokenTag = 'Token TokenTag';
5129
5427
  const TokenText = 'Token TokenText';
5130
5428
 
5131
- const debugErrorRootNode = {
5132
- childCount: 1,
5133
- className: ChatDebugView,
5134
- type: Div
5135
- };
5136
- const debugErrorMessageNode = {
5137
- childCount: 1,
5138
- className: ChatDebugViewError,
5139
- type: Div
5140
- };
5141
- const getDebugErrorDom = errorMessage => {
5142
- return [debugErrorRootNode, debugErrorMessageNode, text(errorMessage)];
5143
- };
5144
-
5145
5429
  const HandleEventCategoryFilter = 4;
5146
5430
  const HandleFilterInput = 5;
5147
5431
  const SelectDetailTab = 6;
@@ -5174,6 +5458,25 @@ const HandleTableScrollBarPointerDown = 32;
5174
5458
  const HandleTableScrollBarPointerMove = 33;
5175
5459
  const HandleTableScrollBarPointerUp = 34;
5176
5460
  const HandleTableWheel = 35;
5461
+ const HandlePreviewTextWheel = 36;
5462
+ const HandlePreviewTextScrollBarPointerDown = 37;
5463
+ const HandlePreviewTextScrollBarPointerMove = 38;
5464
+ const HandlePreviewTextScrollBarPointerUp = 39;
5465
+ const HandleRootContextMenu = 40;
5466
+
5467
+ const debugErrorRootNode = {
5468
+ childCount: 1,
5469
+ className: ChatDebugView,
5470
+ type: Div
5471
+ };
5472
+ const debugErrorMessageNode = {
5473
+ childCount: 1,
5474
+ className: ChatDebugViewError,
5475
+ type: Div
5476
+ };
5477
+ const getDebugErrorDom = errorMessage => {
5478
+ return [debugErrorRootNode, debugErrorMessageNode, text(errorMessage)];
5479
+ };
5177
5480
 
5178
5481
  const getFilterInputDom = (filterValue, useDevtoolsLayout) => {
5179
5482
  return {
@@ -5238,18 +5541,51 @@ const getDebugViewTopDom = (filterValue, useDevtoolsLayout, categoryFilters) =>
5238
5541
  return [{
5239
5542
  childCount: 2 + (quickFilterNodes.length > 0 ? 1 : 0),
5240
5543
  className: mergeClassNames(ChatDebugViewTop, ChatDebugViewTopDevtools),
5241
- onContextMenu: HandleHeaderContextMenu,
5242
5544
  type: Search
5243
5545
  }, getFilterInputDom(filterValue, true), ...quickFilterNodes, ...refreshButtonDom];
5244
5546
  }
5245
5547
  return [{
5246
5548
  childCount: 2,
5247
5549
  className: ChatDebugViewTop,
5248
- onContextMenu: HandleHeaderContextMenu,
5249
5550
  type: Search
5250
5551
  }, getFilterInputDom(filterValue, false), ...refreshButtonDom];
5251
5552
  };
5252
5553
 
5554
+ const getNextSiblingIndex$2 = (nodes, index) => {
5555
+ let nextSiblingIndex = index + 1;
5556
+ const childCount = nodes[index]?.childCount || 0;
5557
+ for (let i = 0; i < childCount; i++) {
5558
+ nextSiblingIndex = getNextSiblingIndex$2(nodes, nextSiblingIndex);
5559
+ }
5560
+ return nextSiblingIndex;
5561
+ };
5562
+
5563
+ const getDirectChildCount$1 = nodes => {
5564
+ let count = 0;
5565
+ let index = 0;
5566
+ while (index < nodes.length) {
5567
+ count++;
5568
+ index = getNextSiblingIndex$2(nodes, index);
5569
+ }
5570
+ return count;
5571
+ };
5572
+
5573
+ const getPanelId = detailTab => {
5574
+ return `ChatDebugViewDetailsPanel-${detailTab}`;
5575
+ };
5576
+
5577
+ const getDetailContentDom = (selectedDetailTab, safeSelectedDetailTab, contentNodes) => {
5578
+ return [{
5579
+ 'aria-label': selectedDetailTab.label,
5580
+ childCount: getDirectChildCount$1(contentNodes),
5581
+ className: ChatDebugViewDetailsBottom,
5582
+ id: getPanelId(safeSelectedDetailTab),
5583
+ onContextMenu: HandleDetailsContextMenu,
5584
+ role: 'tabpanel',
5585
+ type: Div
5586
+ }, ...contentNodes];
5587
+ };
5588
+
5253
5589
  const detailsCloseButtonDom = [{
5254
5590
  'aria-label': closeDetails(),
5255
5591
  childCount: 1,
@@ -5268,6 +5604,29 @@ const getDetailsCloseButtonDom = () => {
5268
5604
  return detailsCloseButtonDom;
5269
5605
  };
5270
5606
 
5607
+ const getNormalizedDetailTabs = (selectedEvent, detailTabs) => {
5608
+ if (selectedEvent === null) {
5609
+ return detailTabs;
5610
+ }
5611
+ return createDetailTabs(getSelectedDetailTab(detailTabs), selectedEvent);
5612
+ };
5613
+
5614
+ const getEditorRowDom = line => {
5615
+ return [{
5616
+ childCount: line.childCount,
5617
+ className: EditorRow,
5618
+ type: Div
5619
+ }, ...line.nodes];
5620
+ };
5621
+
5622
+ const getEditorRowsDom = lineData => {
5623
+ return [{
5624
+ childCount: lineData.length,
5625
+ className: EditorRows,
5626
+ type: Div
5627
+ }, ...lineData.flatMap(getEditorRowDom)];
5628
+ };
5629
+
5271
5630
  const defaultEditorCursor = {
5272
5631
  columnIndex: 0,
5273
5632
  rowIndex: 1
@@ -5285,13 +5644,14 @@ const getEditorSelectionDom = (cursor = defaultEditorCursor) => {
5285
5644
  type: Div
5286
5645
  }] : [])];
5287
5646
  };
5288
- const getGutterDom = (lineData, showLineNumbers) => {
5647
+
5648
+ const getGutterDom = (lineData, showLineNumbers, lineNumberStart = 0) => {
5289
5649
  const gutterNodes = showLineNumbers ? lineData.flatMap((_, index) => {
5290
5650
  return [{
5291
5651
  childCount: 1,
5292
5652
  className: ChatDebugViewEventLineNumber,
5293
5653
  type: Span
5294
- }, text(String(index + 1))];
5654
+ }, text(String(lineNumberStart + index + 1))];
5295
5655
  }) : [];
5296
5656
  return [{
5297
5657
  childCount: showLineNumbers ? lineData.length : 0,
@@ -5299,21 +5659,55 @@ const getGutterDom = (lineData, showLineNumbers) => {
5299
5659
  type: Div
5300
5660
  }, ...gutterNodes];
5301
5661
  };
5302
- const getEditorRowDom = line => {
5303
- return [{
5304
- childCount: line.childCount,
5305
- className: EditorRow,
5662
+
5663
+ const getVirtualizedEditorDom = (lineData, showLineNumbers = true, cursor = null, onPointerDown, options) => {
5664
+ const editorChildren = [{
5665
+ childCount: 2,
5666
+ className: EditorViewlet,
5667
+ role: 'code',
5306
5668
  type: Div
5307
- }, ...line.nodes];
5308
- };
5309
- const getEditorRowsDom = lineData => {
5310
- return [{
5311
- childCount: lineData.length,
5312
- className: EditorRows,
5669
+ }, ...getGutterDom(lineData, showLineNumbers, options.lineNumberStart), {
5670
+ childCount: 2,
5671
+ className: EditorContent,
5672
+ onPointerDown,
5313
5673
  type: Div
5314
- }, ...lineData.flatMap(getEditorRowDom)];
5315
- };
5316
- const getEditorDom = (lineData, showLineNumbers = true, cursor = defaultEditorCursor, onPointerDown) => {
5674
+ }, {
5675
+ 'aria-autocomplete': 'list',
5676
+ 'aria-multiline': true,
5677
+ 'aria-roledescription': 'editor',
5678
+ autocapitalize: 'off',
5679
+ autocomplete: 'off',
5680
+ autocorrect: 'off',
5681
+ childCount: 0,
5682
+ className: EditorInput,
5683
+ name: 'editor',
5684
+ role: 'textbox',
5685
+ spellcheck: false,
5686
+ type: TextArea,
5687
+ wrap: 'off'
5688
+ }, {
5689
+ childCount: 2,
5690
+ className: EditorLayers,
5691
+ type: Div
5692
+ }, ...getEditorSelectionDom(cursor), ...getEditorRowsDom(lineData)];
5693
+ return [{
5694
+ childCount: options.showScrollBar ? 2 : 1,
5695
+ className: mergeClassNames(EditorContainer, PreviewVirtualizedEditor),
5696
+ onWheel: options.onWheel,
5697
+ type: Div
5698
+ }, ...editorChildren, ...(options.showScrollBar ? [{
5699
+ childCount: 1,
5700
+ className: PreviewTextScrollBar,
5701
+ onPointerDown: options.onScrollBarPointerDown,
5702
+ type: Div
5703
+ }, {
5704
+ childCount: 0,
5705
+ className: PreviewTextScrollBarThumb,
5706
+ type: Div
5707
+ }] : [])];
5708
+ };
5709
+
5710
+ const getEditorDom = (lineData, showLineNumbers = true, cursor, onPointerDown) => {
5317
5711
  return [{
5318
5712
  childCount: 1,
5319
5713
  className: EditorContainer,
@@ -5349,7 +5743,7 @@ const getEditorDom = (lineData, showLineNumbers = true, cursor = defaultEditorCu
5349
5743
  }, ...getEditorSelectionDom(cursor), ...getEditorRowsDom(lineData)];
5350
5744
  };
5351
5745
 
5352
- const isDigit = character => {
5746
+ const isDigit$1 = character => {
5353
5747
  return character !== undefined && character >= '0' && character <= '9';
5354
5748
  };
5355
5749
  const isWhitespace = character => {
@@ -5363,10 +5757,10 @@ const getIntegerEnd = (json, start) => {
5363
5757
  if (json[i] === '0') {
5364
5758
  return i + 1;
5365
5759
  }
5366
- if (!isDigit(json[i])) {
5760
+ if (!isDigit$1(json[i])) {
5367
5761
  return start;
5368
5762
  }
5369
- while (isDigit(json[i])) {
5763
+ while (isDigit$1(json[i])) {
5370
5764
  i++;
5371
5765
  }
5372
5766
  return i;
@@ -5377,10 +5771,10 @@ const getFractionEnd = (json, start) => {
5377
5771
  }
5378
5772
  const decimalStart = start;
5379
5773
  let i = start + 1;
5380
- if (!isDigit(json[i])) {
5774
+ if (!isDigit$1(json[i])) {
5381
5775
  return decimalStart;
5382
5776
  }
5383
- while (isDigit(json[i])) {
5777
+ while (isDigit$1(json[i])) {
5384
5778
  i++;
5385
5779
  }
5386
5780
  return i;
@@ -5394,10 +5788,10 @@ const getExponentEnd = (json, start) => {
5394
5788
  if (json[i] === '+' || json[i] === '-') {
5395
5789
  i++;
5396
5790
  }
5397
- if (!isDigit(json[i])) {
5791
+ if (!isDigit$1(json[i])) {
5398
5792
  return exponentStart;
5399
5793
  }
5400
- while (isDigit(json[i])) {
5794
+ while (isDigit$1(json[i])) {
5401
5795
  i++;
5402
5796
  }
5403
5797
  return i;
@@ -5409,7 +5803,7 @@ const getWhitespaceEnd = (json, start) => {
5409
5803
  }
5410
5804
  return i;
5411
5805
  };
5412
- const getStringEnd = (json, start) => {
5806
+ const getStringEnd$1 = (json, start) => {
5413
5807
  let i = start + 1;
5414
5808
  while (i < json.length) {
5415
5809
  const currentCharacter = json[i];
@@ -5425,7 +5819,7 @@ const getStringEnd = (json, start) => {
5425
5819
  return i;
5426
5820
  };
5427
5821
  const emitStringToken = (json, start, onToken) => {
5428
- const end = getStringEnd(json, start);
5822
+ const end = getStringEnd$1(json, start);
5429
5823
  const lookAheadIndex = getWhitespaceEnd(json, end);
5430
5824
  const className = json[lookAheadIndex] === ':' ? TokenKey : TokenString;
5431
5825
  onToken(className, json.slice(start, end));
@@ -5452,7 +5846,7 @@ const getLiteralToken = (json, start) => {
5452
5846
  }
5453
5847
  return undefined;
5454
5848
  };
5455
- const getNumberEnd = (json, start) => {
5849
+ const getNumberEnd$1 = (json, start) => {
5456
5850
  let i = getIntegerEnd(json, start);
5457
5851
  if (i === start) {
5458
5852
  return start;
@@ -5469,7 +5863,7 @@ const forEachTokenSegment = (json, onToken) => {
5469
5863
  i = emitStringToken(json, i, onToken);
5470
5864
  continue;
5471
5865
  }
5472
- const numberEnd = getNumberEnd(json, i);
5866
+ const numberEnd = getNumberEnd$1(json, i);
5473
5867
  if (numberEnd > i) {
5474
5868
  onToken(TokenNumeric, json.slice(i, numberEnd));
5475
5869
  i = numberEnd;
@@ -5485,6 +5879,24 @@ const forEachTokenSegment = (json, onToken) => {
5485
5879
  i++;
5486
5880
  }
5487
5881
  };
5882
+ const getTokenSegments = json => {
5883
+ const segments = [];
5884
+ forEachTokenSegment(json, (className, value) => {
5885
+ if (!value) {
5886
+ return;
5887
+ }
5888
+ const lastSegment = segments.at(-1);
5889
+ if (lastSegment && lastSegment.className === className) {
5890
+ lastSegment.value += value;
5891
+ return;
5892
+ }
5893
+ segments.push({
5894
+ className,
5895
+ value
5896
+ });
5897
+ });
5898
+ return segments;
5899
+ };
5488
5900
 
5489
5901
  const getJsonLines = value => {
5490
5902
  const json = JSON.stringify(value, null, 2);
@@ -5553,8 +5965,14 @@ const getEventNode = value => {
5553
5965
  return getEditorDom(lineData);
5554
5966
  };
5555
5967
 
5556
- const getPanelId = detailTab => {
5557
- return `ChatDebugViewDetailsPanel-${detailTab}`;
5968
+ const getPayloadContentNodes = (payloadEventNodes, selectedEvent) => {
5969
+ if (payloadEventNodes.length > 0) {
5970
+ return payloadEventNodes;
5971
+ }
5972
+ if (selectedEvent === null) {
5973
+ return [];
5974
+ }
5975
+ return getEventNode(getPayloadEvent(selectedEvent));
5558
5976
  };
5559
5977
 
5560
5978
  const getImagePreviewLabelDom = preview => {
@@ -5595,9 +6013,411 @@ const getImagePreviewDom = preview => {
5595
6013
  }, ...getImagePreviewLabelDom(preview)];
5596
6014
  };
5597
6015
 
5598
- const getTextNode = (value, showLineNumbers = true, cursor = null) => {
6016
+ const extensionToLanguage = {
6017
+ css: 'css',
6018
+ html: 'html',
6019
+ js: 'javascript',
6020
+ json: 'json',
6021
+ py: 'python',
6022
+ ts: 'typescript'
6023
+ };
6024
+ const getLanguageFromFileExtension = uri => {
6025
+ try {
6026
+ const url = new URL(uri);
6027
+ const path = url.pathname.toLowerCase();
6028
+ const lastDotIndex = path.lastIndexOf('.');
6029
+ if (lastDotIndex === -1) {
6030
+ return undefined;
6031
+ }
6032
+ const extension = path.slice(lastDotIndex + 1);
6033
+ return extensionToLanguage[extension];
6034
+ } catch {
6035
+ return undefined;
6036
+ }
6037
+ };
6038
+
6039
+ const pushToken = (segments, className, value) => {
6040
+ if (!value) {
6041
+ return segments;
6042
+ }
6043
+ const lastSegment = segments.at(-1);
6044
+ if (lastSegment && lastSegment.className === className) {
6045
+ const merged = {
6046
+ className,
6047
+ value: lastSegment.value + value
6048
+ };
6049
+ return [...segments.slice(0, -1), merged];
6050
+ }
6051
+ return [...segments, {
6052
+ className,
6053
+ value
6054
+ }];
6055
+ };
6056
+
6057
+ /* eslint-disable @typescript-eslint/prefer-readonly-parameter-types */
6058
+
6059
+ const jsIdentifierStartRegex = /[A-Za-z_$]/;
6060
+ const jsIdentifierPartRegex = /[\w$]/;
6061
+ const pythonIdentifierStartRegex = /[A-Za-z_]/;
6062
+ const pythonIdentifierPartRegex = /\w/;
6063
+ const cssIdentifierRegex = /[A-Za-z-]/;
6064
+ const htmlTagNameRegex = /[A-Za-z0-9:-]/;
6065
+ const htmlAttributeStartRegex = /[A-Za-z:_-]/;
6066
+ const htmlAttributePartRegex = /[\w:-]/;
6067
+ const leadingWhitespaceRegex = /^\s*/;
6068
+ const trailingWhitespaceRegex = /\s*$/;
6069
+ const jsKeywords = new Set(['async', 'await', 'class', 'const', 'else', 'export', 'extends', 'for', 'from', 'function', 'if', 'import', 'let', 'new', 'return', 'switch', 'try', 'while']);
6070
+ const tsKeywords = new Set([...jsKeywords, 'interface', 'implements', 'number', 'readonly', 'string', 'type']);
6071
+ const pythonKeywords = new Set(['as', 'class', 'def', 'elif', 'else', 'except', 'False', 'for', 'from', 'if', 'import', 'None', 'return', 'True', 'try', 'while', 'with']);
6072
+ const isIdentifierStart = character => {
6073
+ return !!character && jsIdentifierStartRegex.test(character);
6074
+ };
6075
+ const isIdentifierPart = character => {
6076
+ return !!character && jsIdentifierPartRegex.test(character);
6077
+ };
6078
+ const isPythonIdentifierStart = character => {
6079
+ return !!character && pythonIdentifierStartRegex.test(character);
6080
+ };
6081
+ const isPythonIdentifierPart = character => {
6082
+ return !!character && pythonIdentifierPartRegex.test(character);
6083
+ };
6084
+ const isDigit = character => {
6085
+ return !!character && character >= '0' && character <= '9';
6086
+ };
6087
+ const getStringEnd = (value, start, quote) => {
6088
+ let i = start + 1;
6089
+ while (i < value.length) {
6090
+ if (value[i] === '\\') {
6091
+ i += 2;
6092
+ continue;
6093
+ }
6094
+ if (value[i] === quote) {
6095
+ return i + 1;
6096
+ }
6097
+ i++;
6098
+ }
6099
+ return value.length;
6100
+ };
6101
+ const getBlockCommentEnd = (value, start, terminator) => {
6102
+ const endIndex = value.indexOf(terminator, start);
6103
+ if (endIndex === -1) {
6104
+ return value.length;
6105
+ }
6106
+ return endIndex + terminator.length;
6107
+ };
6108
+ const getLineCommentEnd = (value, start) => {
6109
+ const endIndex = value.indexOf('\n', start);
6110
+ if (endIndex === -1) {
6111
+ return value.length;
6112
+ }
6113
+ return endIndex;
6114
+ };
6115
+ const getNumberEnd = (value, start) => {
6116
+ let i = start;
6117
+ while (isDigit(value[i])) {
6118
+ i++;
6119
+ }
6120
+ if (value[i] === '.') {
6121
+ i++;
6122
+ while (isDigit(value[i])) {
6123
+ i++;
6124
+ }
6125
+ }
6126
+ return i;
6127
+ };
6128
+ const appendLineComment = (value, state) => {
6129
+ if (!value.startsWith('//', state.i) && !value.startsWith('#', state.i)) {
6130
+ return false;
6131
+ }
6132
+ const end = getLineCommentEnd(value, state.i);
6133
+ state.segments = pushToken(state.segments, TokenComment, value.slice(state.i, end));
6134
+ state.i = end;
6135
+ return true;
6136
+ };
6137
+ const appendBlockComment = (value, state) => {
6138
+ if (!value.startsWith('/*', state.i)) {
6139
+ return false;
6140
+ }
6141
+ const end = getBlockCommentEnd(value, state.i, '*/');
6142
+ state.segments = pushToken(state.segments, TokenComment, value.slice(state.i, end));
6143
+ state.i = end;
6144
+ return true;
6145
+ };
6146
+ const appendStringToken = (value, state) => {
6147
+ const quote = value[state.i];
6148
+ if (quote !== '"' && quote !== "'" && quote !== '`') {
6149
+ return false;
6150
+ }
6151
+ const end = getStringEnd(value, state.i, quote);
6152
+ state.segments = pushToken(state.segments, TokenString, value.slice(state.i, end));
6153
+ state.i = end;
6154
+ return true;
6155
+ };
6156
+ const appendNumericToken = (value, state) => {
6157
+ if (!isDigit(value[state.i])) {
6158
+ return false;
6159
+ }
6160
+ const end = getNumberEnd(value, state.i);
6161
+ state.segments = pushToken(state.segments, TokenNumeric, value.slice(state.i, end));
6162
+ state.i = end;
6163
+ return true;
6164
+ };
6165
+ const appendIdentifierToken = (value, state, keywords, isIdentifierStartCharacter, isIdentifierPartCharacter) => {
6166
+ if (!isIdentifierStartCharacter(value[state.i])) {
6167
+ return false;
6168
+ }
6169
+ let end = state.i + 1;
6170
+ while (isIdentifierPartCharacter(value[end])) {
6171
+ end++;
6172
+ }
6173
+ const identifier = value.slice(state.i, end);
6174
+ const className = keywords.has(identifier) ? TokenKeyword : TokenText;
6175
+ state.segments = pushToken(state.segments, className, identifier);
6176
+ state.i = end;
6177
+ return true;
6178
+ };
6179
+ const appendTextCharacter = (value, state) => {
6180
+ state.segments = pushToken(state.segments, TokenText, value[state.i]);
6181
+ state.i++;
6182
+ };
6183
+ const tokenizeCode = (value, keywords, isIdentifierStartCharacter, isIdentifierPartCharacter, supportsBlockComments) => {
6184
+ const state = {
6185
+ i: 0,
6186
+ segments: []
6187
+ };
6188
+ while (state.i < value.length) {
6189
+ if (appendLineComment(value, state)) {
6190
+ continue;
6191
+ }
6192
+ if (supportsBlockComments && appendBlockComment(value, state)) {
6193
+ continue;
6194
+ }
6195
+ if (appendStringToken(value, state)) {
6196
+ continue;
6197
+ }
6198
+ if (appendNumericToken(value, state)) {
6199
+ continue;
6200
+ }
6201
+ if (appendIdentifierToken(value, state, keywords, isIdentifierStartCharacter, isIdentifierPartCharacter)) {
6202
+ continue;
6203
+ }
6204
+ appendTextCharacter(value, state);
6205
+ }
6206
+ return state.segments;
6207
+ };
6208
+ const pushTrimmedSelector = (segments, value) => {
6209
+ const leadingWhitespace = value.match(leadingWhitespaceRegex)?.[0] ?? '';
6210
+ const trailingWhitespace = value.match(trailingWhitespaceRegex)?.[0] ?? '';
6211
+ const trimmed = value.slice(leadingWhitespace.length, value.length - trailingWhitespace.length);
6212
+ let result = segments;
6213
+ result = pushToken(result, TokenText, leadingWhitespace);
6214
+ result = pushToken(result, TokenSelector, trimmed);
6215
+ result = pushToken(result, TokenText, trailingWhitespace);
6216
+ return result;
6217
+ };
6218
+ const getCssIdentifierEnd = (value, start) => {
6219
+ let end = start + 1;
6220
+ while (cssIdentifierRegex.test(value[end] ?? '')) {
6221
+ end++;
6222
+ }
6223
+ return end;
6224
+ };
6225
+ const getCssIdentifierClassName = (value, end) => {
6226
+ let lookAhead = end;
6227
+ while (value[lookAhead] === ' ' || value[lookAhead] === '\t') {
6228
+ lookAhead++;
6229
+ }
6230
+ return value[lookAhead] === ':' ? TokenPropertyName : TokenText;
6231
+ };
6232
+ const appendCssIdentifier = (value, state) => {
6233
+ if (!cssIdentifierRegex.test(value[state.i] ?? '')) {
6234
+ return false;
6235
+ }
6236
+ const end = getCssIdentifierEnd(value, state.i);
6237
+ const identifier = value.slice(state.i, end);
6238
+ state.segments = pushToken(state.segments, getCssIdentifierClassName(value, end), identifier);
6239
+ state.i = end;
6240
+ return true;
6241
+ };
6242
+ const appendCssOutsideDeclaration = (value, state) => {
6243
+ const nextBrace = value.indexOf('{', state.i);
6244
+ if (nextBrace === -1) {
6245
+ state.segments = pushToken(state.segments, TokenText, value.slice(state.i));
6246
+ state.i = value.length;
6247
+ return true;
6248
+ }
6249
+ state.segments = pushTrimmedSelector(state.segments, value.slice(state.i, nextBrace));
6250
+ state.segments = pushToken(state.segments, TokenText, '{');
6251
+ state.i = nextBrace + 1;
6252
+ return false;
6253
+ };
6254
+ const handleCssDeclarationToken = (value, state) => {
6255
+ if (value[state.i] === '}') {
6256
+ state.segments = pushToken(state.segments, TokenText, '}');
6257
+ state.i++;
6258
+ return false;
6259
+ }
6260
+ if (appendNumericToken(value, state)) {
6261
+ return true;
6262
+ }
6263
+ if (appendCssIdentifier(value, state)) {
6264
+ return true;
6265
+ }
6266
+ appendTextCharacter(value, state);
6267
+ return true;
6268
+ };
6269
+ const tokenizeCss = value => {
6270
+ const state = {
6271
+ i: 0,
6272
+ segments: []
6273
+ };
6274
+ let inDeclarationBlock = false;
6275
+ while (state.i < value.length) {
6276
+ if (appendBlockComment(value, state)) {
6277
+ continue;
6278
+ }
6279
+ if (appendStringToken(value, state)) {
6280
+ continue;
6281
+ }
6282
+ if (!inDeclarationBlock) {
6283
+ if (appendCssOutsideDeclaration(value, state)) {
6284
+ break;
6285
+ }
6286
+ inDeclarationBlock = true;
6287
+ continue;
6288
+ }
6289
+ inDeclarationBlock = handleCssDeclarationToken(value, state);
6290
+ }
6291
+ return state.segments;
6292
+ };
6293
+ const getHtmlTagNameEnd = (value, start) => {
6294
+ let i = start + 1;
6295
+ while (htmlTagNameRegex.test(value[i] ?? '')) {
6296
+ i++;
6297
+ }
6298
+ return i;
6299
+ };
6300
+ const getHtmlAttributeEnd = (value, start) => {
6301
+ let end = start + 1;
6302
+ while (htmlAttributePartRegex.test(value[end] ?? '')) {
6303
+ end++;
6304
+ }
6305
+ return end;
6306
+ };
6307
+ const appendHtmlAttribute = (value, state) => {
6308
+ if (!htmlAttributeStartRegex.test(value[state.i] ?? '')) {
6309
+ return false;
6310
+ }
6311
+ const end = getHtmlAttributeEnd(value, state.i);
6312
+ state.segments = pushToken(state.segments, TokenAttributeName, value.slice(state.i, end));
6313
+ state.i = end;
6314
+ return true;
6315
+ };
6316
+ const appendHtmlString = (value, state) => {
6317
+ const quote = value[state.i];
6318
+ if (quote !== '"' && quote !== "'") {
6319
+ return false;
6320
+ }
6321
+ const end = getStringEnd(value, state.i, quote);
6322
+ state.segments = pushToken(state.segments, TokenString, value.slice(state.i, end));
6323
+ state.i = end;
6324
+ return true;
6325
+ };
6326
+ const tokenizeHtmlTag = (value, start) => {
6327
+ let segments = [];
6328
+ if (value.startsWith('</', start)) {
6329
+ const end = value.indexOf('>', start);
6330
+ const tagEnd = end === -1 ? value.length : end + 1;
6331
+ segments = pushToken(segments, TokenTag, value.slice(start, tagEnd));
6332
+ return {
6333
+ end: tagEnd,
6334
+ segments
6335
+ };
6336
+ }
6337
+ let i = getHtmlTagNameEnd(value, start);
6338
+ segments = pushToken(segments, TokenTag, value.slice(start, i));
6339
+ while (i < value.length) {
6340
+ if (value[i] === '>') {
6341
+ segments = pushToken(segments, TokenText, '>');
6342
+ return {
6343
+ end: i + 1,
6344
+ segments
6345
+ };
6346
+ }
6347
+ const state = {
6348
+ i,
6349
+ segments
6350
+ };
6351
+ if (appendHtmlString(value, state)) {
6352
+ ({
6353
+ i,
6354
+ segments
6355
+ } = state);
6356
+ continue;
6357
+ }
6358
+ if (appendHtmlAttribute(value, state)) {
6359
+ ({
6360
+ i,
6361
+ segments
6362
+ } = state);
6363
+ continue;
6364
+ }
6365
+ segments = pushToken(segments, TokenText, value[i]);
6366
+ i++;
6367
+ }
6368
+ return {
6369
+ end: value.length,
6370
+ segments
6371
+ };
6372
+ };
6373
+ const tokenizeHtml = value => {
6374
+ let segments = [];
6375
+ let i = 0;
6376
+ while (i < value.length) {
6377
+ if (value.startsWith('<!--', i)) {
6378
+ const end = getBlockCommentEnd(value, i, '-->');
6379
+ segments = pushToken(segments, TokenComment, value.slice(i, end));
6380
+ i = end;
6381
+ continue;
6382
+ }
6383
+ if (value[i] === '<') {
6384
+ const {
6385
+ end,
6386
+ segments: tagSegments
6387
+ } = tokenizeHtmlTag(value, i);
6388
+ for (const segment of tagSegments) {
6389
+ segments = pushToken(segments, segment.className, segment.value);
6390
+ }
6391
+ i = end;
6392
+ continue;
6393
+ }
6394
+ const nextTag = value.indexOf('<', i);
6395
+ const end = nextTag === -1 ? value.length : nextTag;
6396
+ segments = pushToken(segments, TokenText, value.slice(i, end));
6397
+ i = end;
6398
+ }
6399
+ return segments;
6400
+ };
6401
+ const getSyntaxHighlightTokens = (value, language) => {
6402
+ switch (language) {
6403
+ case 'css':
6404
+ return tokenizeCss(value);
6405
+ case 'html':
6406
+ return tokenizeHtml(value);
6407
+ case 'javascript':
6408
+ return tokenizeCode(value, jsKeywords, isIdentifierStart, isIdentifierPart, true);
6409
+ case 'json':
6410
+ return getTokenSegments(value);
6411
+ case 'python':
6412
+ return tokenizeCode(value, pythonKeywords, isPythonIdentifierStart, isPythonIdentifierPart, false);
6413
+ case 'typescript':
6414
+ return tokenizeCode(value, tsKeywords, isIdentifierStart, isIdentifierPart, true);
6415
+ }
6416
+ };
6417
+
6418
+ const getTextLineData = value => {
5599
6419
  const lines = value.split('\n');
5600
- const lineData = lines.map(line => {
6420
+ return lines.map(line => {
5601
6421
  return {
5602
6422
  childCount: 1,
5603
6423
  nodes: [{
@@ -5607,15 +6427,79 @@ const getTextNode = (value, showLineNumbers = true, cursor = null) => {
5607
6427
  }, text(line)]
5608
6428
  };
5609
6429
  });
6430
+ };
6431
+ const getTokenLineData = tokenSegments => {
6432
+ const lineData = [];
6433
+ let currentNodes = [];
6434
+ let childCount = 0;
6435
+ const pushLine = () => {
6436
+ lineData.push({
6437
+ childCount,
6438
+ nodes: currentNodes
6439
+ });
6440
+ currentNodes = [];
6441
+ childCount = 0;
6442
+ };
6443
+ const pushSegment = (className, segmentValue) => {
6444
+ if (!segmentValue) {
6445
+ return;
6446
+ }
6447
+ currentNodes.push({
6448
+ childCount: 1,
6449
+ className,
6450
+ type: Span
6451
+ }, text(segmentValue));
6452
+ childCount++;
6453
+ };
6454
+ for (const segment of tokenSegments) {
6455
+ let start = 0;
6456
+ for (let i = 0; i < segment.value.length; i++) {
6457
+ if (segment.value[i] !== '\n') {
6458
+ continue;
6459
+ }
6460
+ pushSegment(segment.className, segment.value.slice(start, i));
6461
+ pushLine();
6462
+ start = i + 1;
6463
+ }
6464
+ pushSegment(segment.className, segment.value.slice(start));
6465
+ }
6466
+ if (lineData.length === 0 || currentNodes.length > 0) {
6467
+ pushLine();
6468
+ }
6469
+ return lineData;
6470
+ };
6471
+ const getLineData = (value, tokenSegments) => {
6472
+ return tokenSegments ? getTokenLineData(tokenSegments) : getTextLineData(value);
6473
+ };
6474
+ const getTextNode = (value, showLineNumbers = true, cursor = null, tokenSegments, virtualization) => {
6475
+ const lineData = getLineData(value, tokenSegments);
6476
+ if (virtualization) {
6477
+ const slicedLineData = lineData.slice(virtualization.startLineY, virtualization.endLineY);
6478
+ const visibleCursor = cursor && cursor.rowIndex >= virtualization.startLineY && cursor.rowIndex < virtualization.endLineY ? {
6479
+ ...cursor,
6480
+ rowIndex: cursor.rowIndex - virtualization.startLineY
6481
+ } : null;
6482
+ return getVirtualizedEditorDom(slicedLineData, showLineNumbers, visibleCursor, showLineNumbers ? HandlePreviewTextPointerDown : undefined, {
6483
+ lineNumberStart: virtualization.startLineY,
6484
+ onScrollBarPointerDown: HandlePreviewTextScrollBarPointerDown,
6485
+ onWheel: HandlePreviewTextWheel,
6486
+ showScrollBar: virtualization.showScrollBar
6487
+ });
6488
+ }
5610
6489
  return getEditorDom(lineData, showLineNumbers, cursor, showLineNumbers ? HandlePreviewTextPointerDown : undefined);
5611
6490
  };
5612
6491
 
5613
- const getPreviewEventNodes = (previewEvent, selectedEvent, previewTextCursor) => {
6492
+ const getPreviewEventNodes = (previewEvent, selectedEvent, previewTextCursor, virtualization) => {
5614
6493
  if (typeof previewEvent === 'string') {
5615
6494
  const isInvalidImageMessage = previewEvent === ImageCouldNotBeLoaded;
5616
6495
  const isChatMessageUpdatedPreview = !!selectedEvent && isChatMessageUpdatedEvent(selectedEvent);
5617
6496
  const showLineNumbers = !isInvalidImageMessage && !isChatMessageUpdatedPreview;
5618
- return getTextNode(previewEvent, showLineNumbers, showLineNumbers ? previewTextCursor ?? null : null);
6497
+ return getTextNode(previewEvent, showLineNumbers, showLineNumbers ? previewTextCursor ?? null : null, undefined, virtualization);
6498
+ }
6499
+ if (isWriteFilePreview(previewEvent)) {
6500
+ const language = getLanguageFromFileExtension(previewEvent.uri);
6501
+ const tokenSegments = language ? getSyntaxHighlightTokens(previewEvent.content, language) : undefined;
6502
+ return getTextNode(previewEvent.content, true, previewTextCursor ?? null, tokenSegments, virtualization);
5619
6503
  }
5620
6504
  if (previewEvent === undefined) {
5621
6505
  return [];
@@ -5626,33 +6510,27 @@ const getPreviewEventNodes = (previewEvent, selectedEvent, previewTextCursor) =>
5626
6510
  return getEventNode(previewEvent);
5627
6511
  };
5628
6512
 
5629
- const getDetailTabDom = detailTab => {
5630
- const {
5631
- isSelected
5632
- } = detailTab;
5633
- return [{
5634
- 'aria-controls': getPanelId(detailTab.name),
5635
- ariaSelected: isSelected,
5636
- childCount: 1,
5637
- className: mergeClassNames(PanelTab, isSelected ? PanelTabSelected : ''),
5638
- name: detailTab.name,
5639
- onChange: SelectDetailTab,
5640
- onClick: SelectDetailTab,
5641
- onFocus: HandleDetailTabsFocus,
5642
- role: Tab,
5643
- tabIndex: isSelected ? 0 : -1,
5644
- type: Button$1
5645
- }, text(detailTab.label)];
6513
+ const getPreviewContentNodes = (previewEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, virtualization) => {
6514
+ if (previewEventNodes.length > 0) {
6515
+ return previewEventNodes;
6516
+ }
6517
+ if (selectedEvent === null) {
6518
+ return [];
6519
+ }
6520
+ return getPreviewEventNodes(getPreviewEvent(selectedEvent), selectedEvent, previewTextCursorRowIndex === null || previewTextCursorColumnIndex === null ? null : {
6521
+ columnIndex: previewTextCursorColumnIndex,
6522
+ rowIndex: previewTextCursorRowIndex
6523
+ }, virtualization);
5646
6524
  };
5647
6525
 
5648
- const getTabNodes = detailTabs => {
5649
- return [{
5650
- 'aria-label': detailSections(),
5651
- childCount: detailTabs.length,
5652
- className: ChatDebugViewDetailsTabs,
5653
- role: 'tablist',
5654
- type: Div
5655
- }, ...detailTabs.flatMap(getDetailTabDom)];
6526
+ const getResponseContentNodes = (responseEventNodes, selectedEvent) => {
6527
+ if (responseEventNodes.length > 0) {
6528
+ return responseEventNodes;
6529
+ }
6530
+ if (selectedEvent === null) {
6531
+ return [];
6532
+ }
6533
+ return getEventNode(selectedEvent);
5656
6534
  };
5657
6535
 
5658
6536
  const timestampFormatter = new Intl.DateTimeFormat('en-US', {
@@ -5768,96 +6646,63 @@ const getTimingDetailsDom = event => {
5768
6646
  }, ...getTimingPreviewDom(event), ...getTimingRowDom(started(), getStartText(event)), ...getTimingRowDom(ended(), getEndText(event)), ...getTimingRowDom(duration(), getDurationText(event))];
5769
6647
  };
5770
6648
 
5771
- const getNextSiblingIndex$2 = (nodes, index) => {
5772
- let nextSiblingIndex = index + 1;
5773
- const childCount = nodes[index]?.childCount || 0;
5774
- for (let i = 0; i < childCount; i++) {
5775
- nextSiblingIndex = getNextSiblingIndex$2(nodes, nextSiblingIndex);
5776
- }
5777
- return nextSiblingIndex;
5778
- };
5779
- const getDirectChildCount$1 = nodes => {
5780
- let count = 0;
5781
- let index = 0;
5782
- while (index < nodes.length) {
5783
- count++;
5784
- index = getNextSiblingIndex$2(nodes, index);
5785
- }
5786
- return count;
5787
- };
5788
- const getNormalizedDetailTabs = (selectedEvent, detailTabs) => {
5789
- if (selectedEvent === null) {
5790
- return detailTabs;
5791
- }
5792
- return createDetailTabs(getSelectedDetailTab(detailTabs), selectedEvent);
5793
- };
5794
6649
  const getTimingContentNodes = (responseEventNodes, selectedEvent) => {
5795
6650
  if (selectedEvent === null) {
5796
6651
  return responseEventNodes;
5797
6652
  }
5798
6653
  return getTimingDetailsDom(selectedEvent);
5799
6654
  };
5800
- const getPreviewContentNodes = (previewEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex) => {
5801
- if (previewEventNodes.length > 0) {
5802
- return previewEventNodes;
5803
- }
5804
- if (selectedEvent === null) {
5805
- return [];
5806
- }
5807
- return getPreviewEventNodes(getPreviewEvent(selectedEvent), selectedEvent, previewTextCursorRowIndex === null || previewTextCursorColumnIndex === null ? null : {
5808
- columnIndex: previewTextCursorColumnIndex,
5809
- rowIndex: previewTextCursorRowIndex
5810
- });
5811
- };
5812
- const getPayloadContentNodes = (payloadEventNodes, selectedEvent) => {
5813
- if (payloadEventNodes.length > 0) {
5814
- return payloadEventNodes;
5815
- }
5816
- if (selectedEvent === null) {
5817
- return [];
5818
- }
5819
- return getEventNode(getPayloadEvent(selectedEvent));
5820
- };
5821
- const getResponseContentNodes = (responseEventNodes, selectedEvent) => {
5822
- if (responseEventNodes.length > 0) {
5823
- return responseEventNodes;
5824
- }
5825
- if (selectedEvent === null) {
5826
- return [];
5827
- }
5828
- return getEventNode(selectedEvent);
5829
- };
5830
- const getSelectedContentNodes = (safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex) => {
6655
+
6656
+ const getSelectedContentNodes = (safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization) => {
5831
6657
  if (safeSelectedDetailTab === Timing) {
5832
6658
  return getTimingContentNodes(responseEventNodes, selectedEvent);
5833
6659
  }
5834
6660
  if (safeSelectedDetailTab === Preview) {
5835
- return getPreviewContentNodes(previewEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex);
6661
+ return getPreviewContentNodes(previewEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization);
5836
6662
  }
5837
6663
  if (safeSelectedDetailTab === Payload) {
5838
6664
  return getPayloadContentNodes(payloadEventNodes, selectedEvent);
5839
6665
  }
5840
6666
  return getResponseContentNodes(responseEventNodes, selectedEvent);
5841
6667
  };
5842
- const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes, responseEventNodes = payloadEventNodes, selectedEvent = null, detailTabs = createDetailTabs(), previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null) => {
6668
+
6669
+ const getDetailTabDom = detailTab => {
6670
+ const {
6671
+ isSelected
6672
+ } = detailTab;
6673
+ return [{
6674
+ 'aria-controls': getPanelId(detailTab.name),
6675
+ ariaSelected: isSelected,
6676
+ childCount: 1,
6677
+ className: mergeClassNames(PanelTab, isSelected ? PanelTabSelected : ''),
6678
+ name: detailTab.name,
6679
+ onChange: SelectDetailTab,
6680
+ onClick: SelectDetailTab,
6681
+ onFocus: HandleDetailTabsFocus,
6682
+ role: Tab,
6683
+ tabIndex: isSelected ? 0 : -1,
6684
+ type: Button$1
6685
+ }, text(detailTab.label)];
6686
+ };
6687
+
6688
+ const getTabNodes = detailTabs => {
6689
+ return [{
6690
+ 'aria-label': detailSections(),
6691
+ childCount: detailTabs.length,
6692
+ className: ChatDebugViewDetailsTabs,
6693
+ role: 'tablist',
6694
+ type: Div
6695
+ }, ...detailTabs.flatMap(getDetailTabDom)];
6696
+ };
6697
+
6698
+ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes, responseEventNodes = payloadEventNodes, selectedEvent = null, detailTabs = createDetailTabs(), previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, previewVirtualization) => {
5843
6699
  if (previewEventNodes.length === 0 && payloadEventNodes.length === 0 && responseEventNodes.length === 0) {
5844
6700
  return [];
5845
6701
  }
5846
6702
  const normalizedDetailTabs = getNormalizedDetailTabs(selectedEvent, detailTabs);
5847
6703
  const safeSelectedDetailTab = getSelectedDetailTab(normalizedDetailTabs);
5848
6704
  const selectedDetailTab = normalizedDetailTabs.find(detailTab => detailTab.name === safeSelectedDetailTab) ?? normalizedDetailTabs[0];
5849
- const getDetailContentDom = () => {
5850
- const contentNodes = getSelectedContentNodes(safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex);
5851
- return [{
5852
- 'aria-label': selectedDetailTab.label,
5853
- childCount: getDirectChildCount$1(contentNodes),
5854
- className: ChatDebugViewDetailsBottom,
5855
- id: getPanelId(safeSelectedDetailTab),
5856
- onContextMenu: HandleDetailsContextMenu,
5857
- role: 'tabpanel',
5858
- type: Div
5859
- }, ...contentNodes];
5860
- };
6705
+ const contentNodes = getSelectedContentNodes(safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization);
5861
6706
  return [{
5862
6707
  childCount: 2,
5863
6708
  className: ChatDebugViewDetails,
@@ -5867,7 +6712,27 @@ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes,
5867
6712
  className: ChatDebugViewDetailsTop,
5868
6713
  onContextMenu: HandleDetailsTopContextMenu,
5869
6714
  type: Div
5870
- }, ...getDetailsCloseButtonDom(), ...getTabNodes(normalizedDetailTabs), ...getDetailContentDom()];
6715
+ }, ...getDetailsCloseButtonDom(), ...getTabNodes(normalizedDetailTabs), ...getDetailContentDom(selectedDetailTab, safeSelectedDetailTab, contentNodes)];
6716
+ };
6717
+
6718
+ const getMethods = new Set(['list_dir', 'list_files', 'read_file']);
6719
+ const postMethods = new Set(['create_directory', 'create_file', 'mkdir', 'write_file']);
6720
+ const deleteMethods = new Set(['delete_directory', 'delete_file', 'delete_folder', 'remove_directory', 'remove_file', 'remove_folder']);
6721
+ const getEventTableMethodLabel = event => {
6722
+ const toolName = getToolName(event);
6723
+ if (!toolName) {
6724
+ return '';
6725
+ }
6726
+ if (getMethods.has(toolName)) {
6727
+ return 'GET';
6728
+ }
6729
+ if (postMethods.has(toolName)) {
6730
+ return 'POST';
6731
+ }
6732
+ if (deleteMethods.has(toolName)) {
6733
+ return 'DELETE';
6734
+ }
6735
+ return '';
5871
6736
  };
5872
6737
 
5873
6738
  const getRowCellNodes = (event, isErrorStatus, visibleTableColumns) => {
@@ -5880,6 +6745,12 @@ const getRowCellNodes = (event, isErrorStatus, visibleTableColumns) => {
5880
6745
  className: mergeClassNames(TableCell, ChatDebugViewCellDuration),
5881
6746
  type: Td
5882
6747
  }, text(getEventTableDurationText(event))];
6748
+ case Method:
6749
+ return [{
6750
+ childCount: 1,
6751
+ className: TableCell,
6752
+ type: Td
6753
+ }, text(getEventTableMethodLabel(event))];
5883
6754
  case Status$1:
5884
6755
  return [{
5885
6756
  childCount: 1,
@@ -6050,7 +6921,7 @@ const getTableBodyDom = (rowNodes, eventCount) => {
6050
6921
  }, ...rowNodes];
6051
6922
  };
6052
6923
 
6053
- const tableColClassNames = ['TableColZero', 'TableColOne', 'TableColTwo'];
6924
+ const tableColClassNames = ['TableColZero', 'TableColOne', 'TableColTwo', 'TableColThree'];
6054
6925
  const getTableColumnGroupDom = visibleTableColumns => {
6055
6926
  const orderedVisibleTableColumns = getOrderedVisibleTableColumns(visibleTableColumns);
6056
6927
  return [{
@@ -6073,6 +6944,7 @@ const getHeaderCellNode = (column, tableColumns) => {
6073
6944
  type: Th
6074
6945
  }, text(getTableColumnLabel(tableColumns, column))];
6075
6946
  };
6947
+
6076
6948
  const getHeaderCellNodes = (visibleTableColumns, tableColumns = createTableColumns()) => {
6077
6949
  const orderedVisibleTableColumns = getOrderedVisibleTableColumns(visibleTableColumns, tableColumns);
6078
6950
  return orderedVisibleTableColumns.flatMap(column => getHeaderCellNode(column, tableColumns));
@@ -6101,8 +6973,8 @@ const getTableDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleT
6101
6973
  }, ...getTableColumnGroupDom(visibleTableColumns), ...getTableHeaderDom(visibleTableColumns, tableColumns), ...getTableBodyDom(rowNodes, eventCount)];
6102
6974
  };
6103
6975
 
6104
- const resizerNames = ['ResizerOne', 'ResizerTwo'];
6105
- const resizerClassNames = [ResizerOne, ResizerTwo];
6976
+ const resizerNames = ['ResizerOne', 'ResizerTwo', 'ResizerThree'];
6977
+ const resizerClassNames = [ResizerOne, ResizerTwo, ResizerThree];
6106
6978
  const getTableResizersDom = visibleTableColumns => {
6107
6979
  const visibleColumnCount = getOrderedVisibleTableColumns(visibleTableColumns).length;
6108
6980
  const resizerCount = Math.max(0, visibleColumnCount - 1);
@@ -6127,6 +6999,7 @@ const getTableResizersDom = visibleTableColumns => {
6127
6999
  return [{
6128
7000
  childCount: resizerCount,
6129
7001
  className: Resizers,
7002
+ role: None,
6130
7003
  type: Div
6131
7004
  }, ...resizerNodes];
6132
7005
  };
@@ -6147,7 +7020,7 @@ const getTableScrollBarDom = visible => {
6147
7020
  }];
6148
7021
  };
6149
7022
 
6150
- const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = '', showScrollBar = false) => {
7023
+ const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = 'none', showScrollBar = false) => {
6151
7024
  const tableWrapperClassName = mergeClassNames(TableWrapper, focus === FocusChatDebugTable ? FocusOutline : '', className);
6152
7025
  const tableWrapperNode = {
6153
7026
  childCount: showScrollBar ? 3 : 2,
@@ -6161,7 +7034,7 @@ const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultV
6161
7034
  return [tableWrapperNode, ...getTableDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus), ...getTableResizersDom(visibleTableColumns), ...getTableScrollBarDom(showScrollBar)];
6162
7035
  };
6163
7036
 
6164
- const getTableWrapperWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = '', showScrollBar = false) => {
7037
+ const getTableWrapperWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = 'none', showScrollBar = false) => {
6165
7038
  const tableSummaryNodes = getTableSummaryDom(summary);
6166
7039
  return [{
6167
7040
  childCount: tableSummaryNodes.length === 0 ? 1 : 2,
@@ -6338,25 +7211,31 @@ const getTimelineDom = (timelineInfo, hoverPercent = null) => {
6338
7211
  }, ...selectionNodes];
6339
7212
  };
6340
7213
 
6341
- 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, minLineY = 0, maxLineY = events.length) => {
7214
+ 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) => {
6342
7215
  const visibleEvents = events.slice(minLineY, maxLineY);
6343
7216
  const rowNodes = getDevtoolsRows(visibleEvents, selectedEventIndex, visibleTableColumns, minLineY);
6344
7217
  const effectiveRange = getEffectiveTimelineRange(timelineStartSeconds, timelineEndSeconds, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds);
6345
7218
  const resolvedTimelineInfo = timelineInfo || getTimelineInfo(timelineEvents, effectiveRange.startSeconds, effectiveRange.endSeconds);
6346
7219
  const timelineNodes = getTimelineDom(resolvedTimelineInfo, timelineHoverPercent);
6347
7220
  const previewEvent = selectedEvent ? getPreviewEvent(selectedEvent) : undefined;
7221
+ const previewVirtualization = getPreviewVirtualizationState(selectedEvent, previewTextViewportHeight, previewTextDeltaY);
7222
+ const previewVirtualizationOptions = previewTextViewportHeight <= 0 || previewVirtualization.totalLineCount === 0 ? undefined : {
7223
+ endLineY: previewVirtualization.endLineY,
7224
+ showScrollBar: previewVirtualization.showScrollBar,
7225
+ startLineY: previewVirtualization.startLineY
7226
+ };
6348
7227
  const previewEventNodes = getPreviewEventNodes(previewEvent, selectedEvent, previewTextCursorRowIndex === null || previewTextCursorColumnIndex === null ? null : {
6349
7228
  columnIndex: previewTextCursorColumnIndex,
6350
7229
  rowIndex: previewTextCursorRowIndex
6351
- });
7230
+ }, previewVirtualizationOptions);
6352
7231
  const payloadEventNodes = selectedEvent ? getEventNode(getPayloadEvent(selectedEvent)) : [];
6353
7232
  const responseEventNodes = selectedEvent ? getEventNode(getResponseEvent(selectedEvent)) : [];
6354
- const hasSelectedEvent = responseEventNodes.length > 0;
7233
+ const hasSelectedEvent = !!selectedEvent;
6355
7234
  const eventsClassName = getEventsClassName(hasSelectedEvent);
6356
7235
  const summary = getTableSummary(events);
6357
7236
  const showScrollBar = visibleEvents.length < events.length;
6358
7237
  const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableWrapperWrapperDom(rowNodes, visibleEvents.length, visibleTableColumns, tableColumns, summary, focus, '', '', showScrollBar);
6359
- const detailsNodes = getDetailsDom(previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, detailTabs, previewTextCursorRowIndex, previewTextCursorColumnIndex);
7238
+ const detailsNodes = getDetailsDom(previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, detailTabs, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualizationOptions);
6360
7239
  const sashNodes = getSashNodesDom(hasSelectedEvent);
6361
7240
  const splitChildCount = hasSelectedEvent ? 3 : 1;
6362
7241
  const rootChildCount = 3;
@@ -6410,7 +7289,7 @@ const getEventCategoryFilterDescription = eventCategoryFilters => {
6410
7289
  }
6411
7290
  return eventCategoryFilters.map(eventCategoryFilter => getEventCategoryFilterLabel(eventCategoryFilter).toLowerCase()).join(', ');
6412
7291
  };
6413
- 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) => {
7292
+ 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) => {
6414
7293
  if (errorMessage) {
6415
7294
  return getDebugErrorDom(errorMessage);
6416
7295
  }
@@ -6434,13 +7313,14 @@ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilters, ca
6434
7313
  const emptyMessage = getEmptyMessage(events.length, hasFilterValue, useNoToolCallEventsMessage, noFilteredEventsMessage);
6435
7314
  const safeSelectedEventIndex = selectedEventIndex === null || selectedEventIndex < 0 || selectedEventIndex >= events.length ? null : selectedEventIndex;
6436
7315
  if (useDevtoolsLayout) {
6437
- const devtoolsDom = getDevtoolsDom(events, selectedEvent, safeSelectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds, detailTabs, visibleTableColumns, tableColumns, timelineInfo, timelineHoverPercent, focus, previewTextCursorRowIndex, previewTextCursorColumnIndex, minLineY, maxLineY);
7316
+ 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);
6438
7317
  const devtoolsContentNodes = devtoolsDom.slice(1);
6439
7318
  const topLevelNodes = [...getDebugViewTopDom(filterValue, useDevtoolsLayout, categoryFilters), ...devtoolsContentNodes];
6440
7319
  const rootChildCount = getTopLevelChildCount(topLevelNodes);
6441
7320
  return [{
6442
7321
  childCount: rootChildCount,
6443
7322
  className: mergeClassNames(ChatDebugView, ChatDebugViewDevtools),
7323
+ onContextMenu: HandleRootContextMenu,
6444
7324
  type: Div
6445
7325
  }, ...topLevelNodes];
6446
7326
  }
@@ -6450,6 +7330,7 @@ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilters, ca
6450
7330
  return [{
6451
7331
  childCount: rootChildCount,
6452
7332
  className: mergeClassNames(ChatDebugView, useDevtoolsLayout ? ChatDebugViewDevtools : ''),
7333
+ onContextMenu: HandleRootContextMenu,
6453
7334
  type: Div
6454
7335
  }, ...debugViewTopDom, ...contentNodes];
6455
7336
  };
@@ -6467,7 +7348,8 @@ const renderItems = (oldState, newState) => {
6467
7348
  return [SetDom2, newState.uid, []];
6468
7349
  }
6469
7350
  const filteredEvents = getCurrentEvents$2(newState);
6470
- 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);
7351
+ const previewTextViewportHeight = getPreviewTextViewportHeight(newState);
7352
+ 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);
6471
7353
  return [SetDom2, newState.uid, dom];
6472
7354
  };
6473
7355
 
@@ -6539,6 +7421,10 @@ const render2 = (uid, diffResult) => {
6539
7421
 
6540
7422
  const renderEventListeners = () => {
6541
7423
  return [{
7424
+ name: HandleRootContextMenu,
7425
+ params: ['handleRootContextMenu'],
7426
+ preventDefault: true
7427
+ }, {
6542
7428
  name: HandleHeaderContextMenu,
6543
7429
  params: ['handleHeaderContextMenu', ClientX, ClientY],
6544
7430
  preventDefault: true
@@ -6626,6 +7512,21 @@ const renderEventListeners = () => {
6626
7512
  params: ['handleTableWheel', 'event.deltaY'],
6627
7513
  passive: true,
6628
7514
  preventDefault: true
7515
+ }, {
7516
+ name: HandlePreviewTextWheel,
7517
+ params: ['handlePreviewTextWheel', 'event.deltaY'],
7518
+ passive: true,
7519
+ preventDefault: true
7520
+ }, {
7521
+ name: HandlePreviewTextScrollBarPointerDown,
7522
+ params: ['handlePreviewTextScrollBarPointerDown', ClientY],
7523
+ trackPointerEvents: [HandlePreviewTextScrollBarPointerMove, HandlePreviewTextScrollBarPointerUp]
7524
+ }, {
7525
+ name: HandlePreviewTextScrollBarPointerMove,
7526
+ params: ['handlePreviewTextScrollBarPointerMove', ClientY]
7527
+ }, {
7528
+ name: HandlePreviewTextScrollBarPointerUp,
7529
+ params: ['handlePreviewTextScrollBarPointerUp']
6629
7530
  }, {
6630
7531
  name: HandleTimelinePointerDown,
6631
7532
  params: ['handleTimelinePointerDown', TargetName, ClientX],
@@ -6653,11 +7554,13 @@ const rerender = state => {
6653
7554
  };
6654
7555
 
6655
7556
  const resetTableColumns = state => {
6656
- if (getVisibleTableColumns(state.tableColumns).join(',') === defaultVisibleTableColumns.join(',') && isSameTableColumnWidths(state.tableColumnWidths, defaultTableColumnWidths)) {
7557
+ if (getVisibleTableColumns(state.tableColumns).join(',') === defaultVisibleTableColumns.join(',') && isSameTableColumnWidths(state.tableColumnWidths, defaultTableColumnWidths) && state.sortColumn === '' && state.sortDescending === false) {
6657
7558
  return state;
6658
7559
  }
6659
7560
  return {
6660
7561
  ...state,
7562
+ sortColumn: '',
7563
+ sortDescending: false,
6661
7564
  tableColumns: createTableColumns(),
6662
7565
  tableColumnWidths: defaultTableColumnWidths
6663
7566
  };
@@ -6727,6 +7630,9 @@ const setEvents = (state, events) => {
6727
7630
  initial: false,
6728
7631
  previewTextCursorColumnIndex: null,
6729
7632
  previewTextCursorRowIndex: null,
7633
+ previewTextDeltaY: 0,
7634
+ previewTextScrollBarHandleOffset: 0,
7635
+ previewTextScrollBarPointerActive: false,
6730
7636
  selectedEvent: null,
6731
7637
  selectedEventId: null,
6732
7638
  selectedEventIndex: null
@@ -6754,6 +7660,9 @@ const setSessionId = async (state, sessionId) => {
6754
7660
  initial: false,
6755
7661
  previewTextCursorColumnIndex: null,
6756
7662
  previewTextCursorRowIndex: null,
7663
+ previewTextDeltaY: 0,
7664
+ previewTextScrollBarHandleOffset: 0,
7665
+ previewTextScrollBarPointerActive: false,
6757
7666
  selectedEvent: null,
6758
7667
  selectedEventId: null,
6759
7668
  selectedEventIndex: null,
@@ -6770,6 +7679,9 @@ const setSessionId = async (state, sessionId) => {
6770
7679
  initial: false,
6771
7680
  previewTextCursorColumnIndex: null,
6772
7681
  previewTextCursorRowIndex: null,
7682
+ previewTextDeltaY: 0,
7683
+ previewTextScrollBarHandleOffset: 0,
7684
+ previewTextScrollBarPointerActive: false,
6773
7685
  selectedEvent: null,
6774
7686
  selectedEventId: null,
6775
7687
  selectedEventIndex: null,
@@ -6820,6 +7732,11 @@ const commandMap = {
6820
7732
  'ChatDebug.handleHeaderContextMenu': wrapCommand(handleHeaderContextMenu),
6821
7733
  'ChatDebug.handleInput': wrapCommand(handleInput),
6822
7734
  'ChatDebug.handlePreviewTextPointerDown': wrapCommand(handlePreviewTextPointerDown),
7735
+ 'ChatDebug.handlePreviewTextScrollBarPointerDown': wrapCommand(handlePreviewTextScrollBarPointerDown),
7736
+ 'ChatDebug.handlePreviewTextScrollBarPointerMove': wrapCommand(handlePreviewTextScrollBarPointerMove),
7737
+ 'ChatDebug.handlePreviewTextScrollBarPointerUp': wrapCommand(handlePreviewTextScrollBarPointerUp),
7738
+ 'ChatDebug.handlePreviewTextWheel': wrapCommand(handlePreviewTextWheel),
7739
+ 'ChatDebug.handleRootContextMenu': wrapCommand(handleRootContextMenu),
6823
7740
  'ChatDebug.handleSashPointerDown': wrapCommand(handleSashPointerDown),
6824
7741
  'ChatDebug.handleSashPointerMove': wrapCommand(handleSashPointerMove),
6825
7742
  'ChatDebug.handleSashPointerUp': wrapCommand(handleSashPointerUp),