@lvce-editor/chat-debug-view 10.0.0 → 10.2.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.
@@ -1315,6 +1315,9 @@ const listChatViewEvents$1 = async sessionId => {
1315
1315
  const loadSelectedEvent$1 = async (sessionId, eventId, type) => {
1316
1316
  return invoke$1('ChatStorage.loadSelectedEvent', sessionId, eventId, type);
1317
1317
  };
1318
+ const registerUpdateListener = async (sessionId, rpcId, uid) => {
1319
+ return invoke$1('ChatStorage.registerUpdateListener', sessionId, rpcId, uid);
1320
+ };
1318
1321
 
1319
1322
  const appendStoredEventForTest = async (state, event) => {
1320
1323
  await appendEvent(event);
@@ -2217,6 +2220,8 @@ const createDefaultState = () => {
2217
2220
  largeBreakpoint: 900,
2218
2221
  mediumBreakpoint: 600,
2219
2222
  platform: 0,
2223
+ previewTextCursorColumnIndex: null,
2224
+ previewTextCursorRowIndex: null,
2220
2225
  sashPointerActive: false,
2221
2226
  selectedEvent: null,
2222
2227
  selectedEventId: null,
@@ -2230,7 +2235,12 @@ const createDefaultState = () => {
2230
2235
  sortDescending: false,
2231
2236
  tableColumns: createTableColumns(),
2232
2237
  tableColumnWidths: defaultTableColumnWidths,
2238
+ tableDeltaY: 0,
2239
+ tableMaxLineY: 0,
2240
+ tableMinLineY: 0,
2233
2241
  tableResizerDownId: 0,
2242
+ tableScrollBarHandleOffset: 0,
2243
+ tableScrollBarPointerActive: false,
2234
2244
  tableWidth: defaultTableWidth,
2235
2245
  timelineEndSeconds: '',
2236
2246
  timelineEvents: [],
@@ -2282,7 +2292,7 @@ const RenderFocusContext = 4;
2282
2292
  const RenderFocus = 5;
2283
2293
 
2284
2294
  const diff = (oldState, newState) => {
2285
- if (oldState.categoryFilters !== newState.categoryFilters || oldState.detailTabs !== newState.detailTabs || oldState.errorMessage !== newState.errorMessage || oldState.events !== newState.events || oldState.filterValue !== newState.filterValue || 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.tableWidth !== newState.tableWidth || oldState.timelineEndSeconds !== newState.timelineEndSeconds || 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) {
2295
+ 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.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) {
2286
2296
  return [RenderIncremental, RenderCss];
2287
2297
  }
2288
2298
  return [];
@@ -2555,6 +2565,9 @@ const hasErrorStatus = event => {
2555
2565
  const {
2556
2566
  status
2557
2567
  } = event;
2568
+ if (status === 'error') {
2569
+ return true;
2570
+ }
2558
2571
  if (isErrorStatusCode(status)) {
2559
2572
  return true;
2560
2573
  }
@@ -2631,6 +2644,102 @@ const loadSelectedEvent = async (_databaseName, _dataBaseVersion, _eventStoreNam
2631
2644
  return loadSelectedEvent$1(sessionId, eventId, type);
2632
2645
  };
2633
2646
 
2647
+ const devtoolsTableHeaderHeight = 24;
2648
+ const devtoolsTableRowHeight = 24;
2649
+ const devtoolsTableScrollBarWidth = 12;
2650
+ const devtoolsTableSummaryHeight = 24;
2651
+ const minimumDevtoolsTableScrollBarHeight = 20;
2652
+
2653
+ const devtoolsRootGap = 4;
2654
+ const devtoolsTopHeight = 28;
2655
+ const devtoolsTimelineHeight = 88;
2656
+ const getTableBodyY = (state, hasTimeline) => {
2657
+ return state.y + viewPadding + devtoolsTopHeight + devtoolsRootGap + (hasTimeline ? devtoolsTimelineHeight : 0) + devtoolsTableHeaderHeight;
2658
+ };
2659
+
2660
+ const getTableBodyHeight = (state, eventCount) => {
2661
+ if (eventCount === 0) {
2662
+ return 0;
2663
+ }
2664
+ const tableBodyY = getTableBodyY(state, true);
2665
+ return Math.max(0, state.height - (tableBodyY - state.y) - viewPadding - devtoolsTableSummaryHeight);
2666
+ };
2667
+ const getVisibleRowCount = tableBodyHeight => {
2668
+ if (tableBodyHeight <= 0) {
2669
+ return 0;
2670
+ }
2671
+ return Math.max(1, Math.ceil(tableBodyHeight / devtoolsTableRowHeight));
2672
+ };
2673
+ const getMaxDeltaY = (eventCount, tableBodyHeight) => {
2674
+ return Math.max(eventCount * devtoolsTableRowHeight - tableBodyHeight, 0);
2675
+ };
2676
+ const clampTableDeltaY = (deltaY, eventCount, tableBodyHeight) => {
2677
+ const maxDeltaY = getMaxDeltaY(eventCount, tableBodyHeight);
2678
+ if (deltaY < 0) {
2679
+ return 0;
2680
+ }
2681
+ if (deltaY > maxDeltaY) {
2682
+ return maxDeltaY;
2683
+ }
2684
+ return deltaY;
2685
+ };
2686
+ const getScrollBarHeight = (eventCount, tableBodyHeight) => {
2687
+ if (eventCount === 0 || tableBodyHeight <= 0) {
2688
+ return 0;
2689
+ }
2690
+ const contentHeight = eventCount * devtoolsTableRowHeight;
2691
+ if (contentHeight <= tableBodyHeight) {
2692
+ return 0;
2693
+ }
2694
+ return Math.max(minimumDevtoolsTableScrollBarHeight, Math.floor(tableBodyHeight * tableBodyHeight / contentHeight));
2695
+ };
2696
+ const getScrollBarOffset = (deltaY, maxDeltaY, tableBodyHeight, scrollBarHeight) => {
2697
+ if (maxDeltaY <= 0 || scrollBarHeight <= 0 || tableBodyHeight <= scrollBarHeight) {
2698
+ return 0;
2699
+ }
2700
+ return Math.round(deltaY / maxDeltaY * (tableBodyHeight - scrollBarHeight));
2701
+ };
2702
+ const applyVirtualTableState = state => {
2703
+ const currentEvents = getCurrentEvents$2(state);
2704
+ const tableBodyHeight = getTableBodyHeight(state, currentEvents.length);
2705
+ const deltaY = clampTableDeltaY(state.tableDeltaY, currentEvents.length, tableBodyHeight);
2706
+ const minLineY = Math.floor(deltaY / devtoolsTableRowHeight);
2707
+ const visibleRowCount = getVisibleRowCount(tableBodyHeight);
2708
+ const maxLineY = Math.min(currentEvents.length, minLineY + visibleRowCount);
2709
+ return {
2710
+ ...state,
2711
+ tableDeltaY: deltaY,
2712
+ tableMaxLineY: maxLineY,
2713
+ tableMinLineY: minLineY
2714
+ };
2715
+ };
2716
+ const setTableDeltaY = (state, deltaY) => {
2717
+ return applyVirtualTableState({
2718
+ ...state,
2719
+ tableDeltaY: deltaY
2720
+ });
2721
+ };
2722
+ const withSelectedEventVisible = state => {
2723
+ if (state.selectedEventIndex === null || state.selectedEventIndex < 0) {
2724
+ return applyVirtualTableState(state);
2725
+ }
2726
+ const currentEvents = getCurrentEvents$2(state);
2727
+ const tableBodyHeight = getTableBodyHeight(state, currentEvents.length);
2728
+ const visibleRowCount = getVisibleRowCount(tableBodyHeight);
2729
+ if (visibleRowCount === 0) {
2730
+ return applyVirtualTableState(state);
2731
+ }
2732
+ const minLineY = Math.floor(state.tableDeltaY / devtoolsTableRowHeight);
2733
+ const maxLineY = minLineY + visibleRowCount;
2734
+ if (state.selectedEventIndex < minLineY) {
2735
+ return setTableDeltaY(state, state.selectedEventIndex * devtoolsTableRowHeight);
2736
+ }
2737
+ if (state.selectedEventIndex >= maxLineY) {
2738
+ return setTableDeltaY(state, (state.selectedEventIndex + 1) * devtoolsTableRowHeight - tableBodyHeight);
2739
+ }
2740
+ return applyVirtualTableState(state);
2741
+ };
2742
+
2634
2743
  const svgWidthRegex = /\bwidth=["']([\d.]+)(?:px)?["']/i;
2635
2744
  const svgHeightRegex = /\bheight=["']([\d.]+)(?:px)?["']/i;
2636
2745
  const svgViewBoxRegex = /\bviewBox=["'][^"']*?([\d.]+)\s+([\d.]+)\s+([\d.]+)\s+([\d.]+)["']/i;
@@ -2775,13 +2884,15 @@ const selectEventAtIndex = async (state, selectedEventIndex, dependencies = sele
2775
2884
  }
2776
2885
  const selectedEventDetails = await dependencies.loadSelectedEvent(state.databaseName, state.dataBaseVersion, state.eventStoreName, state.sessionId, state.sessionIdIndexName, selectedEvent.eventId, selectedEvent.type);
2777
2886
  const resolvedSelectedEvent = await withPreparedSelectedEventPreview(selectedEventDetails ?? selectedEvent);
2778
- return {
2887
+ return withSelectedEventVisible({
2779
2888
  ...state,
2780
2889
  detailTabs: createDetailTabs(selectedDetailTab, resolvedSelectedEvent),
2890
+ previewTextCursorColumnIndex: null,
2891
+ previewTextCursorRowIndex: null,
2781
2892
  selectedEvent: resolvedSelectedEvent,
2782
2893
  selectedEventId: selectedEvent.eventId,
2783
2894
  selectedEventIndex
2784
- };
2895
+ });
2785
2896
  };
2786
2897
 
2787
2898
  const focusIndex = async (state, index) => {
@@ -2879,16 +2990,6 @@ const show2 = async (uid, menuId, x, y, args) => {
2879
2990
  await showContextMenu2(uid, menuId, x, y, args);
2880
2991
  };
2881
2992
 
2882
- const devtoolsTableHeaderHeight = 24;
2883
- const devtoolsTableRowHeight = 24;
2884
-
2885
- const devtoolsRootGap = 4;
2886
- const devtoolsTopHeight = 28;
2887
- const devtoolsTimelineHeight = 88;
2888
- const getTableBodyY = (state, hasTimeline) => {
2889
- return state.y + viewPadding + devtoolsTopHeight + devtoolsRootGap + (hasTimeline ? devtoolsTimelineHeight : 0) + devtoolsTableHeaderHeight;
2890
- };
2891
-
2892
2993
  const getTableBodyEventIndex = (state, eventX, eventY) => {
2893
2994
  if (!state.useDevtoolsLayout) {
2894
2995
  return -1;
@@ -2906,8 +3007,8 @@ const getTableBodyEventIndex = (state, eventX, eventY) => {
2906
3007
  if (relativeX < 0 || relativeX >= tableWidth || relativeY < 0) {
2907
3008
  return -1;
2908
3009
  }
2909
- const eventIndex = Math.floor(relativeY / devtoolsTableRowHeight);
2910
- if (eventIndex < 0 || eventIndex >= currentEvents.length) {
3010
+ const eventIndex = state.tableMinLineY + Math.floor(relativeY / devtoolsTableRowHeight);
3011
+ if (eventIndex < state.tableMinLineY || eventIndex >= state.tableMaxLineY || eventIndex >= currentEvents.length) {
2911
3012
  return -1;
2912
3013
  }
2913
3014
  return eventIndex;
@@ -3120,6 +3221,8 @@ const restoreSelectedEvent = async state => {
3120
3221
  if (state.selectedEventId === null) {
3121
3222
  return {
3122
3223
  ...state,
3224
+ previewTextCursorColumnIndex: null,
3225
+ previewTextCursorRowIndex: null,
3123
3226
  selectedEvent: null,
3124
3227
  selectedEventIndex: null
3125
3228
  };
@@ -3129,6 +3232,8 @@ const restoreSelectedEvent = async state => {
3129
3232
  if (selectedEventIndex === -1) {
3130
3233
  return {
3131
3234
  ...state,
3235
+ previewTextCursorColumnIndex: null,
3236
+ previewTextCursorRowIndex: null,
3132
3237
  selectedEvent: null,
3133
3238
  selectedEventId: null,
3134
3239
  selectedEventIndex: null
@@ -3138,6 +3243,8 @@ const restoreSelectedEvent = async state => {
3138
3243
  if (!selectedEvent || typeof selectedEvent.eventId !== 'number') {
3139
3244
  return {
3140
3245
  ...state,
3246
+ previewTextCursorColumnIndex: null,
3247
+ previewTextCursorRowIndex: null,
3141
3248
  selectedEvent: null,
3142
3249
  selectedEventId: null,
3143
3250
  selectedEventIndex: null
@@ -3147,6 +3254,8 @@ const restoreSelectedEvent = async state => {
3147
3254
  const resolvedSelectedEvent = selectedEventDetails ? await withPreparedSelectedEventPreview(selectedEventDetails) : null;
3148
3255
  return {
3149
3256
  ...state,
3257
+ previewTextCursorColumnIndex: null,
3258
+ previewTextCursorRowIndex: null,
3150
3259
  selectedEvent: resolvedSelectedEvent,
3151
3260
  selectedEventId: selectedEvent.eventId,
3152
3261
  selectedEventIndex
@@ -3162,7 +3271,7 @@ const loadEventsForSessionId = async (state, sessionId) => {
3162
3271
  } = state;
3163
3272
  const result = await loadEventsDependencies.listChatViewEvents(sessionId, databaseName, dataBaseVersion, eventStoreName, sessionIdIndexName);
3164
3273
  if (result.type === 'error') {
3165
- return getStateWithTimelineInfo({
3274
+ return applyVirtualTableState(getStateWithTimelineInfo({
3166
3275
  ...state,
3167
3276
  errorMessage: getFailedToLoadMessage(sessionId, result.error),
3168
3277
  events: [],
@@ -3171,13 +3280,13 @@ const loadEventsForSessionId = async (state, sessionId) => {
3171
3280
  selectedEventId: null,
3172
3281
  selectedEventIndex: null,
3173
3282
  sessionId
3174
- });
3283
+ }));
3175
3284
  }
3176
3285
  const {
3177
3286
  events
3178
3287
  } = result;
3179
3288
  if (events.length === 0) {
3180
- return getStateWithTimelineInfo({
3289
+ return applyVirtualTableState(getStateWithTimelineInfo({
3181
3290
  ...state,
3182
3291
  errorMessage: getSessionNotFoundMessage(sessionId),
3183
3292
  events: [],
@@ -3186,7 +3295,7 @@ const loadEventsForSessionId = async (state, sessionId) => {
3186
3295
  selectedEventId: null,
3187
3296
  selectedEventIndex: null,
3188
3297
  sessionId
3189
- });
3298
+ }));
3190
3299
  }
3191
3300
  const nextState = getStateWithTimelineInfo({
3192
3301
  ...state,
@@ -3195,7 +3304,8 @@ const loadEventsForSessionId = async (state, sessionId) => {
3195
3304
  initial: false,
3196
3305
  sessionId
3197
3306
  });
3198
- return restoreSelectedEvent(nextState);
3307
+ const restoredState = await restoreSelectedEvent(nextState);
3308
+ return withSelectedEventVisible(restoredState);
3199
3309
  };
3200
3310
 
3201
3311
  const loadEventsFromUri = async state => {
@@ -3228,6 +3338,8 @@ const handleClickRefresh = async state => {
3228
3338
  const handleCloseDetails = state => {
3229
3339
  return {
3230
3340
  ...state,
3341
+ previewTextCursorColumnIndex: null,
3342
+ previewTextCursorRowIndex: null,
3231
3343
  selectedEvent: null,
3232
3344
  selectedEventId: null,
3233
3345
  selectedEventIndex: null
@@ -3311,12 +3423,12 @@ const getPreservedSelectedEventIndex$1 = (oldState, newState) => {
3311
3423
  const withPreservedSelection$1 = (state, nextState) => {
3312
3424
  const nextStateWithTimelineInfo = getStateWithTimelineInfo(nextState);
3313
3425
  const selectedEventIndex = getPreservedSelectedEventIndex$1(state, nextStateWithTimelineInfo);
3314
- return {
3426
+ return withSelectedEventVisible({
3315
3427
  ...nextStateWithTimelineInfo,
3316
3428
  selectedEvent: selectedEventIndex === null ? null : state.selectedEvent,
3317
3429
  selectedEventId: selectedEventIndex === null ? null : state.selectedEventId,
3318
3430
  selectedEventIndex
3319
- };
3431
+ });
3320
3432
  };
3321
3433
 
3322
3434
  const handleEventCategoryFilter = (state, value, ctrlKey = false, metaKey = false) => {
@@ -3423,12 +3535,14 @@ const parseSelectedEventIndex = value => {
3423
3535
  const withPreservedSelection = (state, nextState) => {
3424
3536
  const nextStateWithTimelineInfo = getStateWithTimelineInfo(nextState);
3425
3537
  const selectedEventIndex = getPreservedSelectedEventIndex(state, nextStateWithTimelineInfo);
3426
- return {
3538
+ return withSelectedEventVisible({
3427
3539
  ...nextStateWithTimelineInfo,
3540
+ previewTextCursorColumnIndex: selectedEventIndex === null ? null : state.previewTextCursorColumnIndex,
3541
+ previewTextCursorRowIndex: selectedEventIndex === null ? null : state.previewTextCursorRowIndex,
3428
3542
  selectedEvent: selectedEventIndex === null ? null : state.selectedEvent,
3429
3543
  selectedEventId: selectedEventIndex === null ? null : state.selectedEventId,
3430
3544
  selectedEventIndex
3431
- };
3545
+ });
3432
3546
  };
3433
3547
  const handleInput = (state, name, value, checked) => {
3434
3548
  if (name === Filter) {
@@ -3473,22 +3587,26 @@ const handleInput = (state, name, value, checked) => {
3473
3587
  if (name === UseDevtoolsLayout) {
3474
3588
  const useDevtoolsLayout = getBoolean(checked);
3475
3589
  const selectedEventIndex = useDevtoolsLayout ? getSelectedEventIndex(state) : null;
3476
- return {
3590
+ return applyVirtualTableState({
3477
3591
  ...state,
3592
+ previewTextCursorColumnIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorColumnIndex : null,
3593
+ previewTextCursorRowIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorRowIndex : null,
3478
3594
  selectedEvent: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEvent : null,
3479
3595
  selectedEventId: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEventId : null,
3480
3596
  selectedEventIndex,
3481
3597
  useDevtoolsLayout
3482
- };
3598
+ });
3483
3599
  }
3484
3600
  if (name === SelectedEventIndex) {
3485
3601
  const selectedEventIndex = parseSelectedEventIndex(value);
3486
- return {
3602
+ return withSelectedEventVisible({
3487
3603
  ...state,
3604
+ previewTextCursorColumnIndex: selectedEventIndex === null ? null : state.previewTextCursorColumnIndex,
3605
+ previewTextCursorRowIndex: selectedEventIndex === null ? null : state.previewTextCursorRowIndex,
3488
3606
  selectedEvent: selectedEventIndex === null ? null : state.selectedEvent,
3489
3607
  selectedEventId: selectedEventIndex === null ? null : state.selectedEventId,
3490
3608
  selectedEventIndex
3491
- };
3609
+ });
3492
3610
  }
3493
3611
  if (name === TimelineStartSeconds) {
3494
3612
  const nextState = {
@@ -3512,12 +3630,14 @@ const handleInput = (state, name, value, checked) => {
3512
3630
  return withPreservedSelection(state, nextState);
3513
3631
  }
3514
3632
  if (name === CloseDetails) {
3515
- return {
3633
+ return applyVirtualTableState({
3516
3634
  ...state,
3635
+ previewTextCursorColumnIndex: null,
3636
+ previewTextCursorRowIndex: null,
3517
3637
  selectedEvent: null,
3518
3638
  selectedEventId: null,
3519
3639
  selectedEventIndex: null
3520
- };
3640
+ });
3521
3641
  }
3522
3642
  if (name === DetailTab) {
3523
3643
  if (!isDetailTab(value)) {
@@ -3535,138 +3655,470 @@ const handleInput = (state, name, value, checked) => {
3535
3655
  return state;
3536
3656
  };
3537
3657
 
3538
- const handleSashPointerDown = (state, eventX, eventY) => {
3539
- if (state.sashPointerActive) {
3540
- return state;
3658
+ const getListFilesPreviewEvent = (event, name) => {
3659
+ if (name !== 'list_files') {
3660
+ return undefined;
3541
3661
  }
3542
- return {
3543
- ...state,
3544
- sashPointerActive: true
3545
- };
3546
- };
3547
-
3548
- const handleSashPointerMove = (state, eventX, eventY) => {
3549
- if (!state.sashPointerActive) {
3550
- return state;
3662
+ const {
3663
+ result
3664
+ } = event;
3665
+ if (typeof result !== 'object' || result === null) {
3666
+ return undefined;
3551
3667
  }
3552
- return {
3553
- ...state,
3554
- tableWidth: getTableWidthFromClientX(state.x, state.width, eventX)
3555
- };
3556
- };
3557
-
3558
- const handleSashPointerUp = (state, eventX, eventY) => {
3559
- if (!state.sashPointerActive) {
3560
- return state;
3668
+ const {
3669
+ entries
3670
+ } = result;
3671
+ if (entries !== undefined) {
3672
+ return entries;
3561
3673
  }
3562
- return {
3563
- ...state,
3564
- sashPointerActive: false
3565
- };
3566
- };
3567
-
3568
- const FocusChatDebugTable = 221_139;
3569
-
3570
- const handleTableFocus = state => {
3571
- return {
3572
- ...state,
3573
- focus: FocusChatDebugTable
3574
- };
3674
+ return result;
3575
3675
  };
3576
3676
 
3577
- const handleTableHeaderClick = (state, value) => {
3578
- if (!isTableColumn(value)) {
3579
- return state;
3677
+ const getPreviewName = event => {
3678
+ if (typeof event.name === 'string' && event.name) {
3679
+ return event.name;
3580
3680
  }
3581
- const sortDescending = state.sortColumn === value ? !state.sortDescending : false;
3582
- const nextState = {
3583
- ...state,
3584
- sortColumn: value,
3585
- sortDescending
3586
- };
3587
- return withPreservedSelection$1(state, nextState);
3588
- };
3589
-
3590
- const getTableResizerId = name => {
3591
- switch (name) {
3592
- case 'ResizerOne':
3593
- return 1;
3594
- case 'ResizerTwo':
3595
- return 2;
3596
- default:
3597
- return 0;
3681
+ if (typeof event.toolName === 'string' && event.toolName) {
3682
+ return event.toolName;
3598
3683
  }
3684
+ return undefined;
3599
3685
  };
3600
- const handleTableResizerPointerDown = (state, name, clientX) => {
3601
- return {
3602
- ...state,
3603
- tableResizerDownId: getTableResizerId(name)
3604
- };
3686
+
3687
+ const hasOwn = (event, key) => {
3688
+ return Object.hasOwn(event, key);
3605
3689
  };
3606
3690
 
3607
- const handleTableResizerPointerMove = (state, clientX) => {
3608
- if (!state.tableResizerDownId) {
3609
- return state;
3691
+ const shouldIncludeArguments = (event, name) => {
3692
+ if (!hasOwn(event, 'arguments')) {
3693
+ return false;
3610
3694
  }
3611
- return {
3612
- ...state,
3613
- tableColumnWidths: getResizedTableColumnWidths(state.width, state.tableWidth, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths, state.x, clientX, state.tableResizerDownId)
3614
- };
3695
+ if (name === 'getWorkspaceUri') {
3696
+ return false;
3697
+ }
3698
+ return true;
3615
3699
  };
3616
3700
 
3617
- const handleTableResizerPointerUp = state => {
3618
- if (!state.tableResizerDownId) {
3619
- return state;
3701
+ const getPayloadEvent = event => {
3702
+ const name = getPreviewName(event);
3703
+ if (name === 'list_files' && hasOwn(event, 'arguments')) {
3704
+ return event.arguments;
3620
3705
  }
3621
- return {
3622
- ...state,
3623
- tableResizerDownId: 0
3706
+ const payloadEvent = {
3707
+ ...(name === undefined ? {} : {
3708
+ name
3709
+ }),
3710
+ ...(shouldIncludeArguments(event, name) ? {
3711
+ arguments: event.arguments
3712
+ } : {}),
3713
+ ...(hasOwn(event, 'result') ? {
3714
+ result: event.result
3715
+ } : {})
3624
3716
  };
3625
- };
3626
-
3627
- const handleTableRowCopy = async (state, eventIndex) => {
3628
- const currentEvents = getCurrentEvents$1(state);
3629
- const event = currentEvents[eventIndex];
3630
- if (!event) {
3631
- return state;
3717
+ if (Object.keys(payloadEvent).length > 0) {
3718
+ return payloadEvent;
3632
3719
  }
3633
- const text = JSON.stringify(event, null, 2);
3634
- await writeClipBoardText(text);
3635
- return state;
3720
+ return event;
3636
3721
  };
3637
3722
 
3638
- const handleTimelineContextMenu = state => {
3639
- return state;
3723
+ const isChatMessageAddedEvent = event => {
3724
+ return event.type === 'chat-message-added';
3640
3725
  };
3641
3726
 
3642
- const clearTimelineSelectionState = state => {
3643
- return getStateWithTimelineInfo({
3644
- ...state,
3645
- timelineSelectionActive: false,
3646
- timelineSelectionAnchorSeconds: '',
3647
- timelineSelectionFocusSeconds: ''
3648
- });
3727
+ const isChatMessageUpdatedEvent = event => {
3728
+ return event.type === 'chat-message-updated';
3649
3729
  };
3650
3730
 
3651
- const parseTimelineRangePreset = value => {
3652
- if (!value) {
3653
- return {
3654
- timelineEndSeconds: '',
3655
- timelineStartSeconds: ''
3656
- };
3731
+ const getResponseContentText = content => {
3732
+ if (!content || typeof content !== 'object') {
3733
+ return undefined;
3657
3734
  }
3658
- const [timelineStartSeconds = '', timelineEndSeconds = ''] = value.split(':', 2);
3659
- return {
3660
- timelineEndSeconds,
3661
- timelineStartSeconds
3662
- };
3735
+ if (Array.isArray(content)) {
3736
+ const [firstContentItem] = content;
3737
+ if (!firstContentItem || typeof firstContentItem !== 'object') {
3738
+ return undefined;
3739
+ }
3740
+ const {
3741
+ text
3742
+ } = firstContentItem;
3743
+ return typeof text === 'string' ? text : undefined;
3744
+ }
3745
+ const {
3746
+ text
3747
+ } = content;
3748
+ return typeof text === 'string' ? text : undefined;
3663
3749
  };
3664
- const handleTimelineStartSeconds = (state, value) => {
3665
- const nextState = {
3666
- ...state,
3667
- timelineStartSeconds: value
3668
- };
3669
- return withPreservedSelection$1(state, nextState);
3750
+ const getSseResponseCompletedPreviewText = event => {
3751
+ if (event.type !== 'sse-response-completed') {
3752
+ return undefined;
3753
+ }
3754
+ const {
3755
+ value
3756
+ } = event;
3757
+ if (!value || typeof value !== 'object') {
3758
+ return undefined;
3759
+ }
3760
+ const {
3761
+ response
3762
+ } = value;
3763
+ if (!response || typeof response !== 'object') {
3764
+ return undefined;
3765
+ }
3766
+ const {
3767
+ output
3768
+ } = response;
3769
+ if (!Array.isArray(output) || output.length === 0) {
3770
+ return undefined;
3771
+ }
3772
+ const [firstOutput] = output;
3773
+ if (!firstOutput || typeof firstOutput !== 'object') {
3774
+ return undefined;
3775
+ }
3776
+ const {
3777
+ content
3778
+ } = firstOutput;
3779
+ return getResponseContentText(content);
3780
+ };
3781
+ const getPreviewMessageText = event => {
3782
+ if (isChatMessageUpdatedEvent(event) && typeof event.text === 'string') {
3783
+ return event.text;
3784
+ }
3785
+ const sseResponseCompletedPreviewText = getSseResponseCompletedPreviewText(event);
3786
+ if (sseResponseCompletedPreviewText !== undefined) {
3787
+ return sseResponseCompletedPreviewText;
3788
+ }
3789
+ if (!isChatMessageAddedEvent(event)) {
3790
+ return undefined;
3791
+ }
3792
+ const {
3793
+ message
3794
+ } = event;
3795
+ if (!message || typeof message !== 'object') {
3796
+ return undefined;
3797
+ }
3798
+ if (!Object.hasOwn(message, 'text')) {
3799
+ return undefined;
3800
+ }
3801
+ const {
3802
+ text
3803
+ } = message;
3804
+ if (typeof text !== 'string') {
3805
+ return undefined;
3806
+ }
3807
+ return text;
3808
+ };
3809
+
3810
+ const getReadFilePreviewText = (event, name) => {
3811
+ if (name !== 'read_file') {
3812
+ return undefined;
3813
+ }
3814
+ const {
3815
+ result
3816
+ } = event;
3817
+ if (typeof result !== 'string') {
3818
+ return undefined;
3819
+ }
3820
+ return result;
3821
+ };
3822
+
3823
+ const getWriteFilePreviewText = (event, name) => {
3824
+ if (name !== 'write_file') {
3825
+ return undefined;
3826
+ }
3827
+ const {
3828
+ arguments: toolArguments
3829
+ } = event;
3830
+ if (typeof toolArguments !== 'object' || toolArguments === null || !Object.hasOwn(toolArguments, 'content')) {
3831
+ return undefined;
3832
+ }
3833
+ const {
3834
+ content
3835
+ } = toolArguments;
3836
+ if (typeof content !== 'string') {
3837
+ return undefined;
3838
+ }
3839
+ return content;
3840
+ };
3841
+
3842
+ const getPreviewEvent = event => {
3843
+ const selectedEventPreview = getSelectedEventPreview(event);
3844
+ if (selectedEventPreview !== undefined) {
3845
+ return selectedEventPreview;
3846
+ }
3847
+ const previewMessageText = getPreviewMessageText(event);
3848
+ if (previewMessageText !== undefined) {
3849
+ return previewMessageText;
3850
+ }
3851
+ const name = getPreviewName(event);
3852
+ const writeFilePreviewText = getWriteFilePreviewText(event, name);
3853
+ if (writeFilePreviewText !== undefined) {
3854
+ return writeFilePreviewText;
3855
+ }
3856
+ const readFilePreviewText = getReadFilePreviewText(event, name);
3857
+ if (readFilePreviewText !== undefined) {
3858
+ return readFilePreviewText;
3859
+ }
3860
+ const listFilesPreviewEvent = getListFilesPreviewEvent(event, name);
3861
+ if (listFilesPreviewEvent !== undefined) {
3862
+ return listFilesPreviewEvent;
3863
+ }
3864
+ return getPayloadEvent(event);
3865
+ };
3866
+
3867
+ const previewTextRowHeight = 20;
3868
+ const defaultPreviewTextColumnWidth = 9;
3869
+ const clamp = (value, min, max) => {
3870
+ return Math.min(Math.max(value, min), max);
3871
+ };
3872
+ const getPreviewTextCursorFromPoint = (value, x, y) => {
3873
+ const lines = value.split('\n');
3874
+ const rowIndex = clamp(Math.floor(Math.max(y, 0) / previewTextRowHeight), 0, Math.max(lines.length - 1, 0));
3875
+ const line = lines[rowIndex] || '';
3876
+ const columnIndex = clamp(Math.floor(Math.max(x, 0) / defaultPreviewTextColumnWidth), 0, line.length);
3877
+ return {
3878
+ columnIndex,
3879
+ rowIndex
3880
+ };
3881
+ };
3882
+ const getPreviewTextCursorStyle = cursor => {
3883
+ return `height: ${previewTextRowHeight}px; left: ${cursor.columnIndex * defaultPreviewTextColumnWidth}px; top: ${cursor.rowIndex * previewTextRowHeight}px; width: 0px;`;
3884
+ };
3885
+
3886
+ const hasNumberedTextPreview = (state, previewEvent) => {
3887
+ if (typeof previewEvent !== 'string') {
3888
+ return false;
3889
+ }
3890
+ if (previewEvent === ImageCouldNotBeLoaded) {
3891
+ return false;
3892
+ }
3893
+ return !state.selectedEvent || !isChatMessageUpdatedEvent(state.selectedEvent);
3894
+ };
3895
+ const handlePreviewTextPointerDown = (state, x, y) => {
3896
+ if (!state.selectedEvent) {
3897
+ return state;
3898
+ }
3899
+ const previewEvent = getPreviewEvent(state.selectedEvent);
3900
+ if (!hasNumberedTextPreview(state, previewEvent)) {
3901
+ return state;
3902
+ }
3903
+ const cursor = getPreviewTextCursorFromPoint(previewEvent, x, y);
3904
+ if (state.previewTextCursorColumnIndex === cursor.columnIndex && state.previewTextCursorRowIndex === cursor.rowIndex) {
3905
+ return state;
3906
+ }
3907
+ return {
3908
+ ...state,
3909
+ previewTextCursorColumnIndex: cursor.columnIndex,
3910
+ previewTextCursorRowIndex: cursor.rowIndex
3911
+ };
3912
+ };
3913
+
3914
+ const handleSashPointerDown = (state, eventX, eventY) => {
3915
+ if (state.sashPointerActive) {
3916
+ return state;
3917
+ }
3918
+ return {
3919
+ ...state,
3920
+ sashPointerActive: true
3921
+ };
3922
+ };
3923
+
3924
+ const handleSashPointerMove = (state, eventX, eventY) => {
3925
+ if (!state.sashPointerActive) {
3926
+ return state;
3927
+ }
3928
+ return {
3929
+ ...state,
3930
+ tableWidth: getTableWidthFromClientX(state.x, state.width, eventX)
3931
+ };
3932
+ };
3933
+
3934
+ const handleSashPointerUp = (state, eventX, eventY) => {
3935
+ if (!state.sashPointerActive) {
3936
+ return state;
3937
+ }
3938
+ return {
3939
+ ...state,
3940
+ sashPointerActive: false
3941
+ };
3942
+ };
3943
+
3944
+ const FocusChatDebugTable = 221_139;
3945
+
3946
+ const handleTableFocus = state => {
3947
+ return {
3948
+ ...state,
3949
+ focus: FocusChatDebugTable
3950
+ };
3951
+ };
3952
+
3953
+ const handleTableHeaderClick = (state, value) => {
3954
+ if (!isTableColumn(value)) {
3955
+ return state;
3956
+ }
3957
+ const sortDescending = state.sortColumn === value ? !state.sortDescending : false;
3958
+ const nextState = {
3959
+ ...state,
3960
+ sortColumn: value,
3961
+ sortDescending
3962
+ };
3963
+ return withPreservedSelection$1(state, nextState);
3964
+ };
3965
+
3966
+ const getTableResizerId = name => {
3967
+ switch (name) {
3968
+ case 'ResizerOne':
3969
+ return 1;
3970
+ case 'ResizerTwo':
3971
+ return 2;
3972
+ default:
3973
+ return 0;
3974
+ }
3975
+ };
3976
+ const handleTableResizerPointerDown = (state, name, clientX) => {
3977
+ return {
3978
+ ...state,
3979
+ tableResizerDownId: getTableResizerId(name)
3980
+ };
3981
+ };
3982
+
3983
+ const handleTableResizerPointerMove = (state, clientX) => {
3984
+ if (!state.tableResizerDownId) {
3985
+ return state;
3986
+ }
3987
+ return {
3988
+ ...state,
3989
+ tableColumnWidths: getResizedTableColumnWidths(state.width, state.tableWidth, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths, state.x, clientX, state.tableResizerDownId)
3990
+ };
3991
+ };
3992
+
3993
+ const handleTableResizerPointerUp = state => {
3994
+ if (!state.tableResizerDownId) {
3995
+ return state;
3996
+ }
3997
+ return {
3998
+ ...state,
3999
+ tableResizerDownId: 0
4000
+ };
4001
+ };
4002
+
4003
+ const handleTableRowCopy = async (state, eventIndex) => {
4004
+ const currentEvents = getCurrentEvents$1(state);
4005
+ const event = currentEvents[eventIndex];
4006
+ if (!event) {
4007
+ return state;
4008
+ }
4009
+ const text = JSON.stringify(event, null, 2);
4010
+ await writeClipBoardText(text);
4011
+ return state;
4012
+ };
4013
+
4014
+ const getHandleOffsetAndPercent = (tableBodyHeight, scrollBarHeight, relativeY) => {
4015
+ const halfScrollBarHeight = scrollBarHeight / 2;
4016
+ if (relativeY <= halfScrollBarHeight) {
4017
+ return {
4018
+ handleOffset: relativeY,
4019
+ percent: 0
4020
+ };
4021
+ }
4022
+ if (relativeY <= tableBodyHeight - halfScrollBarHeight) {
4023
+ return {
4024
+ handleOffset: halfScrollBarHeight,
4025
+ percent: (relativeY - halfScrollBarHeight) / Math.max(1, tableBodyHeight - scrollBarHeight)
4026
+ };
4027
+ }
4028
+ return {
4029
+ handleOffset: scrollBarHeight - tableBodyHeight + relativeY,
4030
+ percent: 1
4031
+ };
4032
+ };
4033
+ const handleTableScrollBarPointerDown = (state, eventY) => {
4034
+ const currentEvents = getCurrentEvents$2(state);
4035
+ const tableBodyHeight = getTableBodyHeight(state, currentEvents.length);
4036
+ const scrollBarHeight = getScrollBarHeight(currentEvents.length, tableBodyHeight);
4037
+ if (tableBodyHeight === 0 || scrollBarHeight === 0) {
4038
+ return state;
4039
+ }
4040
+ const relativeY = eventY - getTableBodyY(state, currentEvents.length > 0);
4041
+ const {
4042
+ handleOffset,
4043
+ percent
4044
+ } = getHandleOffsetAndPercent(tableBodyHeight, scrollBarHeight, relativeY);
4045
+ const maxDeltaY = getMaxDeltaY(currentEvents.length, tableBodyHeight);
4046
+ const nextState = setTableDeltaY(state, percent * maxDeltaY);
4047
+ return {
4048
+ ...nextState,
4049
+ tableScrollBarHandleOffset: handleOffset,
4050
+ tableScrollBarPointerActive: true
4051
+ };
4052
+ };
4053
+
4054
+ const handleTableScrollBarPointerMove = (state, eventY) => {
4055
+ if (!state.tableScrollBarPointerActive) {
4056
+ return state;
4057
+ }
4058
+ const currentEvents = getCurrentEvents$2(state);
4059
+ const tableBodyHeight = getTableBodyHeight(state, currentEvents.length);
4060
+ const scrollBarHeight = getScrollBarHeight(currentEvents.length, tableBodyHeight);
4061
+ if (tableBodyHeight === 0 || scrollBarHeight === 0) {
4062
+ return state;
4063
+ }
4064
+ const relativeY = eventY - getTableBodyY(state, currentEvents.length > 0);
4065
+ const nextHandleTop = Math.max(0, Math.min(tableBodyHeight - scrollBarHeight, relativeY - state.tableScrollBarHandleOffset));
4066
+ const percent = nextHandleTop / Math.max(1, tableBodyHeight - scrollBarHeight);
4067
+ const maxDeltaY = getMaxDeltaY(currentEvents.length, tableBodyHeight);
4068
+ const nextState = setTableDeltaY(state, percent * maxDeltaY);
4069
+ return {
4070
+ ...nextState,
4071
+ tableScrollBarPointerActive: true
4072
+ };
4073
+ };
4074
+
4075
+ const handleTableScrollBarPointerUp = state => {
4076
+ if (!state.tableScrollBarPointerActive && state.tableScrollBarHandleOffset === 0) {
4077
+ return state;
4078
+ }
4079
+ return {
4080
+ ...state,
4081
+ tableScrollBarHandleOffset: 0,
4082
+ tableScrollBarPointerActive: false
4083
+ };
4084
+ };
4085
+
4086
+ const handleTableWheel = (state, deltaY) => {
4087
+ return setTableDeltaY(state, state.tableDeltaY + deltaY);
4088
+ };
4089
+
4090
+ const handleTimelineContextMenu = state => {
4091
+ return state;
4092
+ };
4093
+
4094
+ const clearTimelineSelectionState = state => {
4095
+ return getStateWithTimelineInfo({
4096
+ ...state,
4097
+ timelineSelectionActive: false,
4098
+ timelineSelectionAnchorSeconds: '',
4099
+ timelineSelectionFocusSeconds: ''
4100
+ });
4101
+ };
4102
+
4103
+ const parseTimelineRangePreset = value => {
4104
+ if (!value) {
4105
+ return {
4106
+ timelineEndSeconds: '',
4107
+ timelineStartSeconds: ''
4108
+ };
4109
+ }
4110
+ const [timelineStartSeconds = '', timelineEndSeconds = ''] = value.split(':', 2);
4111
+ return {
4112
+ timelineEndSeconds,
4113
+ timelineStartSeconds
4114
+ };
4115
+ };
4116
+ const handleTimelineStartSeconds = (state, value) => {
4117
+ const nextState = {
4118
+ ...state,
4119
+ timelineStartSeconds: value
4120
+ };
4121
+ return withPreservedSelection$1(state, nextState);
3670
4122
  };
3671
4123
  const handleTimelineEndSeconds = (state, value) => {
3672
4124
  const nextState = {
@@ -3694,8 +4146,8 @@ const formatTimelinePresetValue = value => {
3694
4146
  return value.toFixed(3).replace(trailingZeroFractionRegex, '').replace(trailingFractionZeroRegex, '$1');
3695
4147
  };
3696
4148
 
3697
- const getTimelineEventX = (state, eventX) => {
3698
- return state.x + eventX;
4149
+ const getTimelineEventX = eventX => {
4150
+ return eventX;
3699
4151
  };
3700
4152
 
3701
4153
  const getTimelineLeft = state => {
@@ -3757,7 +4209,7 @@ const handleTimelinePointerDown = (state, name, eventX) => {
3757
4209
  }
3758
4210
  const timelineLeft = getTimelineLeft(state);
3759
4211
  const timelineWidth = getTimelineWidth(state);
3760
- const clientX = getTimelineEventX(state, eventX);
4212
+ const clientX = getTimelineEventX(eventX);
3761
4213
  const seconds = getTimelineSecondsFromClientX(state.timelineEvents, clientX, timelineLeft, timelineWidth);
3762
4214
  if (seconds === undefined) {
3763
4215
  return state;
@@ -3787,7 +4239,7 @@ const handleTimelinePointerLeave = state => {
3787
4239
  const handleTimelinePointerMove = (state, eventX) => {
3788
4240
  const timelineLeft = getTimelineLeft(state);
3789
4241
  const timelineWidth = getTimelineWidth(state);
3790
- const clientX = getTimelineEventX(state, eventX);
4242
+ const clientX = getTimelineEventX(eventX);
3791
4243
  const seconds = getTimelineSecondsFromClientX(state.timelineEvents, clientX, timelineLeft, timelineWidth);
3792
4244
  if (seconds === undefined) {
3793
4245
  return state;
@@ -3814,7 +4266,7 @@ const handleTimelinePointerUp = (state, eventX) => {
3814
4266
  }
3815
4267
  const timelineLeft = getTimelineLeft(state);
3816
4268
  const timelineWidth = getTimelineWidth(state);
3817
- const clientX = getTimelineEventX(state, eventX);
4269
+ const clientX = getTimelineEventX(eventX);
3818
4270
  const focusSeconds = getTimelineSecondsFromClientX(state.timelineEvents, clientX, timelineLeft, timelineWidth);
3819
4271
  if (focusSeconds === undefined) {
3820
4272
  return clearTimelineSelectionState(state);
@@ -3835,13 +4287,15 @@ const handleTimelinePointerUp = (state, eventX) => {
3835
4287
  const setUseDevtoolsLayout = (state, checked) => {
3836
4288
  const useDevtoolsLayout = getBoolean(checked);
3837
4289
  const selectedEventIndex = useDevtoolsLayout ? getSelectedEventIndex$1(state) : null;
3838
- return {
4290
+ return applyVirtualTableState({
3839
4291
  ...state,
4292
+ previewTextCursorColumnIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorColumnIndex : null,
4293
+ previewTextCursorRowIndex: useDevtoolsLayout && selectedEventIndex !== null ? state.previewTextCursorRowIndex : null,
3840
4294
  selectedEvent: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEvent : null,
3841
4295
  selectedEventId: useDevtoolsLayout && selectedEventIndex !== null ? state.selectedEventId : null,
3842
4296
  selectedEventIndex,
3843
4297
  useDevtoolsLayout
3844
- };
4298
+ });
3845
4299
  };
3846
4300
 
3847
4301
  const handleShowEventStreamFinishedEvents = (state, checked) => {
@@ -3866,15 +4320,29 @@ const handleShowResponsePartEvents = (state, checked) => {
3866
4320
  return withPreservedSelection$1(state, nextState);
3867
4321
  };
3868
4322
 
4323
+ const rpcId = 'handleStorageWorkerUpdate';
4324
+ const handleStorageWorkerUpdate = async uid => {
4325
+ await invoke('Viewlet.executeViewletCommand', uid, 'ChatDebug.handleClickRefresh');
4326
+ };
4327
+
4328
+ const loadContentDependencies = loadEventsDependencies;
4329
+ loadContentDependencies.registerUpdateListener = registerUpdateListener;
3869
4330
  const loadContent = async (state, savedState) => {
3870
4331
  await getPreference('chatDebug.autoRefresh');
3871
4332
  const nextState = await loadEventsFromUri(restoreSavedState(state, savedState));
3872
- return {
4333
+ if (nextState.sessionId) {
4334
+ try {
4335
+ await loadContentDependencies.registerUpdateListener(nextState.sessionId, rpcId, nextState.uid);
4336
+ } catch {
4337
+ // ignore
4338
+ }
4339
+ }
4340
+ return applyVirtualTableState({
3873
4341
  ...nextState,
3874
4342
  categoryFilters: createCategoryFilters(getSelectedEventCategoryFilters(nextState.categoryFilters)),
3875
4343
  detailTabs: createDetailTabs(getSelectedDetailTab(nextState.detailTabs), nextState.selectedEvent),
3876
4344
  tableColumns: createTableColumns()
3877
- };
4345
+ });
3878
4346
  };
3879
4347
 
3880
4348
  // cspell:ignore liga calt
@@ -3882,9 +4350,16 @@ const loadContent = async (state, savedState) => {
3882
4350
  const getCss = state => {
3883
4351
  const hasSelectedEvent = !!state.selectedEvent;
3884
4352
  const tableWidth = hasSelectedEvent ? clampTableWidth(state.width, state.tableWidth) : getMainWidth(state.width);
4353
+ const currentEvents = getCurrentEvents$2(state);
4354
+ const tableBodyHeight = getTableBodyHeight(state, currentEvents.length);
4355
+ const scrollBarHeight = getScrollBarHeight(currentEvents.length, tableBodyHeight);
4356
+ const maxDeltaY = getMaxDeltaY(currentEvents.length, tableBodyHeight);
4357
+ const showScrollBar = scrollBarHeight > 0;
4358
+ const scrollBarOffset = getScrollBarOffset(state.tableDeltaY, maxDeltaY, tableBodyHeight, scrollBarHeight);
4359
+ const tableContentWidth = Math.max(0, tableWidth - (showScrollBar ? devtoolsTableScrollBarWidth : 0));
3885
4360
  const detailsWidth = hasSelectedEvent ? getDetailsWidth(state.width, state.tableWidth) : 0;
3886
4361
  const topSize = state.width >= state.largeBreakpoint ? 30 : state.width >= state.mediumBreakpoint ? 60 : 60;
3887
- const tableColumnLayout = getTableColumnLayout(tableWidth, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths);
4362
+ const tableColumnLayout = getTableColumnLayout(tableContentWidth, getVisibleTableColumns(state.tableColumns), state.tableColumnWidths);
3888
4363
  const [tableColZeroWidth = 0, tableColOneWidth = 0, tableColTwoWidth = 0] = tableColumnLayout.visibleColumnWidths;
3889
4364
  const resizerOneLeft = tableColumnLayout.resizerLefts[0] ?? 0;
3890
4365
  const resizerTwoLeft = tableColumnLayout.resizerLefts[1] ?? 0;
@@ -3894,6 +4369,7 @@ const getCss = state => {
3894
4369
  } = state.timelineInfo;
3895
4370
  return `
3896
4371
  .ChatDebugView {
4372
+ --ChatDebugViewTableBodyHeight: ${tableBodyHeight}px;
3897
4373
  --ChatDebugViewTableHeaderHeight: ${devtoolsTableHeaderHeight}px;
3898
4374
  --ChatDebugViewTableColZeroWidth: ${tableColZeroWidth}px;
3899
4375
  --ChatDebugViewTableColOneWidth: ${tableColOneWidth}px;
@@ -3901,6 +4377,9 @@ const getCss = state => {
3901
4377
  --ChatDebugViewDetailsWidth: ${detailsWidth}px;
3902
4378
  --ChatDebugViewDurationColumnWidth: ${state.tableColumnWidths.duration}px;
3903
4379
  --ChatDebugViewTableRowHeight: ${devtoolsTableRowHeight}px;
4380
+ --ChatDebugViewTableScrollBarHeight: ${scrollBarHeight}px;
4381
+ --ChatDebugViewTableScrollBarOffset: ${scrollBarOffset}px;
4382
+ --ChatDebugViewTableScrollBarWidth: ${showScrollBar ? devtoolsTableScrollBarWidth : 0}px;
3904
4383
  --ResizerOneLeft: ${resizerOneLeft}px;
3905
4384
  --ResizerTwoLeft: ${resizerTwoLeft}px;
3906
4385
  --ChatDebugViewSashWidth: ${sashWidth}px;
@@ -3913,6 +4392,36 @@ const getCss = state => {
3913
4392
  padding: ${viewPadding}px;
3914
4393
  }
3915
4394
 
4395
+ .TableWrapper {
4396
+ height: calc(var(--ChatDebugViewTableHeaderHeight) + var(--ChatDebugViewTableBodyHeight));
4397
+ overflow: hidden;
4398
+ position: relative;
4399
+ }
4400
+
4401
+ .Table {
4402
+ width: calc(100% - var(--ChatDebugViewTableScrollBarWidth));
4403
+ }
4404
+
4405
+ .TableScrollBar {
4406
+ background: rgba(255, 255, 255, 0.06);
4407
+ border-radius: 999px;
4408
+ height: var(--ChatDebugViewTableBodyHeight);
4409
+ position: absolute;
4410
+ right: 0;
4411
+ top: var(--ChatDebugViewTableHeaderHeight);
4412
+ width: var(--ChatDebugViewTableScrollBarWidth);
4413
+ }
4414
+
4415
+ .TableScrollBarThumb {
4416
+ background: rgba(255, 255, 255, 0.22);
4417
+ border-radius: 999px;
4418
+ height: var(--ChatDebugViewTableScrollBarHeight);
4419
+ left: 2px;
4420
+ position: absolute;
4421
+ top: var(--ChatDebugViewTableScrollBarOffset);
4422
+ width: calc(100% - 4px);
4423
+ }
4424
+
3916
4425
  `;
3917
4426
  };
3918
4427
 
@@ -4259,10 +4768,11 @@ const ChatDebugViewQuickFilterPill = 'ChatDebugViewQuickFilterPill';
4259
4768
  const ChatDebugViewQuickFilterPillSelected = 'ChatDebugViewQuickFilterPillSelected';
4260
4769
  const ChatDebugViewQuickFilters = 'ChatDebugViewQuickFilters';
4261
4770
  const Sash = 'Sash';
4262
- const ChatDebugViewSashLine = 'ChatDebugViewSashLine';
4263
4771
  const Table = 'Table';
4264
4772
  const TableBody = 'TableBody';
4265
4773
  const TableSummary = 'TableSummary';
4774
+ const TableScrollBar = 'TableScrollBar';
4775
+ const TableScrollBarThumb = 'TableScrollBarThumb';
4266
4776
  const TableWrapper = 'TableWrapper';
4267
4777
  const TableWrapperWrapper = 'TableWrapperWrapper';
4268
4778
  const FocusOutline = 'FocusOutline';
@@ -4297,7 +4807,6 @@ const ChatDebugViewTimelineSelectionMarkerEnd = 'ChatDebugViewTimelineSelectionM
4297
4807
  const ChatDebugViewTimelineSelectionMarkerStart = 'ChatDebugViewTimelineSelectionMarkerStart';
4298
4808
  const ChatDebugViewTimelineSelectionOverlay = 'ChatDebugViewTimelineSelectionOverlay';
4299
4809
  const ChatDebugViewTimelineSelectionRange = 'ChatDebugViewTimelineSelectionRange';
4300
- const ChatDebugViewTimelineTop = 'ChatDebugViewTimelineTop';
4301
4810
  const ChatDebugViewTiming = 'ChatDebugViewTiming';
4302
4811
  const ChatDebugViewTimingLabel = 'ChatDebugViewTimingLabel';
4303
4812
  const ChatDebugViewTimingPreview = 'ChatDebugViewTimingPreview';
@@ -4313,7 +4822,6 @@ const ChatDebugViewTimingValue = 'ChatDebugViewTimingValue';
4313
4822
  const ChatDebugViewTop = 'ChatDebugViewTop';
4314
4823
  const ChatDebugViewTopDevtools = 'ChatDebugViewTop--devtools';
4315
4824
  const TableCell = 'TableCell';
4316
- const ChatDebugViewColumnFixed = 'ChatDebugViewColumnFixed';
4317
4825
  const ChatDebugViewCellDuration = 'ChatDebugViewCellDuration';
4318
4826
  const ChatDebugViewCellStatusError = 'ChatDebugViewCellStatusError';
4319
4827
  const InputBox = 'InputBox';
@@ -4364,6 +4872,11 @@ const HandleTimelinePointerLeave = 27;
4364
4872
  const HandleEventRowClick = 28;
4365
4873
  const HandleTableFocus = 29;
4366
4874
  const HandleDetailTabsFocus = 30;
4875
+ const HandlePreviewTextPointerDown = 31;
4876
+ const HandleTableScrollBarPointerDown = 32;
4877
+ const HandleTableScrollBarPointerMove = 33;
4878
+ const HandleTableScrollBarPointerUp = 34;
4879
+ const HandleTableWheel = 35;
4367
4880
 
4368
4881
  const getFilterInputDom = (filterValue, useDevtoolsLayout) => {
4369
4882
  return {
@@ -4458,17 +4971,22 @@ const getDetailsCloseButtonDom = () => {
4458
4971
  return detailsCloseButtonDom;
4459
4972
  };
4460
4973
 
4461
- const getEditorSelectionDom = () => {
4974
+ const defaultEditorCursor = {
4975
+ columnIndex: 0,
4976
+ rowIndex: 1
4977
+ };
4978
+ const getEditorSelectionDom = (cursor = defaultEditorCursor) => {
4979
+ const hasCursor = cursor !== null;
4462
4980
  return [{
4463
- childCount: 1,
4981
+ childCount: hasCursor ? 1 : 0,
4464
4982
  className: EditorSelections,
4465
4983
  type: Div
4466
- }, {
4984
+ }, ...(hasCursor ? [{
4467
4985
  childCount: 0,
4468
4986
  className: EditorSelection,
4469
- style: 'height: 20px; left: 0px; top: 20px; width: 0px;',
4987
+ style: getPreviewTextCursorStyle(cursor),
4470
4988
  type: Div
4471
- }];
4989
+ }] : [])];
4472
4990
  };
4473
4991
  const getGutterDom = (lineData, showLineNumbers) => {
4474
4992
  const gutterNodes = showLineNumbers ? lineData.flatMap((_, index) => {
@@ -4498,7 +5016,7 @@ const getEditorRowsDom = lineData => {
4498
5016
  type: Div
4499
5017
  }, ...lineData.flatMap(getEditorRowDom)];
4500
5018
  };
4501
- const getEditorDom = (lineData, showLineNumbers = true) => {
5019
+ const getEditorDom = (lineData, showLineNumbers = true, cursor = defaultEditorCursor, onPointerDown) => {
4502
5020
  return [{
4503
5021
  childCount: 1,
4504
5022
  className: EditorContainer,
@@ -4511,6 +5029,7 @@ const getEditorDom = (lineData, showLineNumbers = true) => {
4511
5029
  }, ...getGutterDom(lineData, showLineNumbers), {
4512
5030
  childCount: 2,
4513
5031
  className: EditorContent,
5032
+ onPointerDown,
4514
5033
  type: Div
4515
5034
  }, {
4516
5035
  'aria-autocomplete': 'list',
@@ -4530,7 +5049,7 @@ const getEditorDom = (lineData, showLineNumbers = true) => {
4530
5049
  childCount: 2,
4531
5050
  className: EditorLayers,
4532
5051
  type: Div
4533
- }, ...getEditorSelectionDom(), ...getEditorRowsDom(lineData)];
5052
+ }, ...getEditorSelectionDom(cursor), ...getEditorRowsDom(lineData)];
4534
5053
  };
4535
5054
 
4536
5055
  const isDigit = character => {
@@ -4703,216 +5222,6 @@ const getPanelId = detailTab => {
4703
5222
  return `ChatDebugViewDetailsPanel-${detailTab}`;
4704
5223
  };
4705
5224
 
4706
- const getPreviewName = event => {
4707
- if (typeof event.name === 'string' && event.name) {
4708
- return event.name;
4709
- }
4710
- if (typeof event.toolName === 'string' && event.toolName) {
4711
- return event.toolName;
4712
- }
4713
- return undefined;
4714
- };
4715
-
4716
- const hasOwn = (event, key) => {
4717
- return Object.hasOwn(event, key);
4718
- };
4719
-
4720
- const shouldIncludeArguments = (event, name) => {
4721
- if (!hasOwn(event, 'arguments')) {
4722
- return false;
4723
- }
4724
- if (name === 'getWorkspaceUri') {
4725
- return false;
4726
- }
4727
- return true;
4728
- };
4729
-
4730
- const getPayloadEvent = event => {
4731
- const name = getPreviewName(event);
4732
- if (name === 'list_files' && hasOwn(event, 'arguments')) {
4733
- return event.arguments;
4734
- }
4735
- const payloadEvent = {
4736
- ...(name === undefined ? {} : {
4737
- name
4738
- }),
4739
- ...(shouldIncludeArguments(event, name) ? {
4740
- arguments: event.arguments
4741
- } : {}),
4742
- ...(hasOwn(event, 'result') ? {
4743
- result: event.result
4744
- } : {})
4745
- };
4746
- if (Object.keys(payloadEvent).length > 0) {
4747
- return payloadEvent;
4748
- }
4749
- return event;
4750
- };
4751
-
4752
- const getListFilesPreviewEvent = (event, name) => {
4753
- if (name !== 'list_files') {
4754
- return undefined;
4755
- }
4756
- const {
4757
- result
4758
- } = event;
4759
- if (typeof result !== 'object' || result === null) {
4760
- return undefined;
4761
- }
4762
- const {
4763
- entries,
4764
- error
4765
- } = result;
4766
- if (entries !== undefined) {
4767
- return entries;
4768
- }
4769
- return error;
4770
- };
4771
-
4772
- const isChatMessageAddedEvent = event => {
4773
- return event.type === 'chat-message-added';
4774
- };
4775
-
4776
- const isChatMessageUpdatedEvent = event => {
4777
- return event.type === 'chat-message-updated';
4778
- };
4779
-
4780
- const getResponseContentText = content => {
4781
- if (!content || typeof content !== 'object') {
4782
- return undefined;
4783
- }
4784
- if (Array.isArray(content)) {
4785
- const [firstContentItem] = content;
4786
- if (!firstContentItem || typeof firstContentItem !== 'object') {
4787
- return undefined;
4788
- }
4789
- const {
4790
- text
4791
- } = firstContentItem;
4792
- return typeof text === 'string' ? text : undefined;
4793
- }
4794
- const {
4795
- text
4796
- } = content;
4797
- return typeof text === 'string' ? text : undefined;
4798
- };
4799
- const getSseResponseCompletedPreviewText = event => {
4800
- if (event.type !== 'sse-response-completed') {
4801
- return undefined;
4802
- }
4803
- const {
4804
- value
4805
- } = event;
4806
- if (!value || typeof value !== 'object') {
4807
- return undefined;
4808
- }
4809
- const {
4810
- response
4811
- } = value;
4812
- if (!response || typeof response !== 'object') {
4813
- return undefined;
4814
- }
4815
- const {
4816
- output
4817
- } = response;
4818
- if (!Array.isArray(output) || output.length === 0) {
4819
- return undefined;
4820
- }
4821
- const [firstOutput] = output;
4822
- if (!firstOutput || typeof firstOutput !== 'object') {
4823
- return undefined;
4824
- }
4825
- const {
4826
- content
4827
- } = firstOutput;
4828
- return getResponseContentText(content);
4829
- };
4830
- const getPreviewMessageText = event => {
4831
- if (isChatMessageUpdatedEvent(event) && typeof event.text === 'string') {
4832
- return event.text;
4833
- }
4834
- const sseResponseCompletedPreviewText = getSseResponseCompletedPreviewText(event);
4835
- if (sseResponseCompletedPreviewText !== undefined) {
4836
- return sseResponseCompletedPreviewText;
4837
- }
4838
- if (!isChatMessageAddedEvent(event)) {
4839
- return undefined;
4840
- }
4841
- const {
4842
- message
4843
- } = event;
4844
- if (!message || typeof message !== 'object') {
4845
- return undefined;
4846
- }
4847
- if (!Object.hasOwn(message, 'text')) {
4848
- return undefined;
4849
- }
4850
- const {
4851
- text
4852
- } = message;
4853
- if (typeof text !== 'string') {
4854
- return undefined;
4855
- }
4856
- return text;
4857
- };
4858
-
4859
- const getReadFilePreviewText = (event, name) => {
4860
- if (name !== 'read_file') {
4861
- return undefined;
4862
- }
4863
- const {
4864
- result
4865
- } = event;
4866
- if (typeof result !== 'string') {
4867
- return undefined;
4868
- }
4869
- return result;
4870
- };
4871
-
4872
- const getWriteFilePreviewText = (event, name) => {
4873
- if (name !== 'write_file') {
4874
- return undefined;
4875
- }
4876
- const {
4877
- arguments: toolArguments
4878
- } = event;
4879
- if (typeof toolArguments !== 'object' || toolArguments === null || !Object.hasOwn(toolArguments, 'content')) {
4880
- return undefined;
4881
- }
4882
- const {
4883
- content
4884
- } = toolArguments;
4885
- if (typeof content !== 'string') {
4886
- return undefined;
4887
- }
4888
- return content;
4889
- };
4890
-
4891
- const getPreviewEvent = event => {
4892
- const selectedEventPreview = getSelectedEventPreview(event);
4893
- if (selectedEventPreview !== undefined) {
4894
- return selectedEventPreview;
4895
- }
4896
- const previewMessageText = getPreviewMessageText(event);
4897
- if (previewMessageText !== undefined) {
4898
- return previewMessageText;
4899
- }
4900
- const name = getPreviewName(event);
4901
- const writeFilePreviewText = getWriteFilePreviewText(event, name);
4902
- if (writeFilePreviewText !== undefined) {
4903
- return writeFilePreviewText;
4904
- }
4905
- const readFilePreviewText = getReadFilePreviewText(event, name);
4906
- if (readFilePreviewText !== undefined) {
4907
- return readFilePreviewText;
4908
- }
4909
- const listFilesPreviewEvent = getListFilesPreviewEvent(event, name);
4910
- if (listFilesPreviewEvent !== undefined) {
4911
- return listFilesPreviewEvent;
4912
- }
4913
- return getPayloadEvent(event);
4914
- };
4915
-
4916
5225
  const isAttachmentImagePreview = value => {
4917
5226
  return typeof value === 'object' && value !== null && value.previewType === 'image';
4918
5227
  };
@@ -4955,11 +5264,11 @@ const getImagePreviewDom = preview => {
4955
5264
  }, ...getImagePreviewLabelDom(preview)];
4956
5265
  };
4957
5266
 
4958
- const getTextNode = (value, showLineNumbers = true) => {
5267
+ const getTextNode = (value, showLineNumbers = true, cursor = null) => {
4959
5268
  const lines = value.split('\n');
4960
5269
  const lineData = lines.map(line => {
4961
5270
  return {
4962
- childCount: 2,
5271
+ childCount: 1,
4963
5272
  nodes: [{
4964
5273
  childCount: 1,
4965
5274
  className: TokenText,
@@ -4967,15 +5276,15 @@ const getTextNode = (value, showLineNumbers = true) => {
4967
5276
  }, text(line)]
4968
5277
  };
4969
5278
  });
4970
- return getEditorDom(lineData, showLineNumbers);
5279
+ return getEditorDom(lineData, showLineNumbers, cursor, showLineNumbers ? HandlePreviewTextPointerDown : undefined);
4971
5280
  };
4972
5281
 
4973
- const getPreviewEventNodes = (previewEvent, selectedEvent) => {
5282
+ const getPreviewEventNodes = (previewEvent, selectedEvent, previewTextCursor) => {
4974
5283
  if (typeof previewEvent === 'string') {
4975
5284
  const isInvalidImageMessage = previewEvent === ImageCouldNotBeLoaded;
4976
5285
  const isChatMessageUpdatedPreview = !!selectedEvent && isChatMessageUpdatedEvent(selectedEvent);
4977
5286
  const showLineNumbers = !isInvalidImageMessage && !isChatMessageUpdatedPreview;
4978
- return getTextNode(previewEvent, showLineNumbers);
5287
+ return getTextNode(previewEvent, showLineNumbers, showLineNumbers ? previewTextCursor ?? null : null);
4979
5288
  }
4980
5289
  if (previewEvent === undefined) {
4981
5290
  return [];
@@ -5151,7 +5460,7 @@ const getNormalizedDetailTabs = (selectedEvent, detailTabs) => {
5151
5460
  }
5152
5461
  return createDetailTabs(getSelectedDetailTab(detailTabs), selectedEvent);
5153
5462
  };
5154
- const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes, responseEventNodes = payloadEventNodes, selectedEvent = null, detailTabs = createDetailTabs()) => {
5463
+ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes, responseEventNodes = payloadEventNodes, selectedEvent = null, detailTabs = createDetailTabs(), previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null) => {
5155
5464
  if (previewEventNodes.length === 0 && payloadEventNodes.length === 0 && responseEventNodes.length === 0) {
5156
5465
  return [];
5157
5466
  }
@@ -5172,7 +5481,10 @@ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes,
5172
5481
  if (selectedEvent === null) {
5173
5482
  return [];
5174
5483
  }
5175
- return getPreviewEventNodes(getPreviewEvent(selectedEvent), selectedEvent);
5484
+ return getPreviewEventNodes(getPreviewEvent(selectedEvent), selectedEvent, previewTextCursorRowIndex === null || previewTextCursorColumnIndex === null ? null : {
5485
+ columnIndex: previewTextCursorColumnIndex,
5486
+ rowIndex: previewTextCursorRowIndex
5487
+ });
5176
5488
  };
5177
5489
  const getDetailContentDomPayload = () => {
5178
5490
  if (payloadEventNodes.length > 0) {
@@ -5218,7 +5530,6 @@ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes,
5218
5530
  const getRowCellNodes = (event, isErrorStatus, visibleTableColumns) => {
5219
5531
  const orderedVisibleTableColumns = getOrderedVisibleTableColumns(visibleTableColumns);
5220
5532
  return orderedVisibleTableColumns.flatMap((column, index) => {
5221
- const isFixed = index < orderedVisibleTableColumns.length - 1;
5222
5533
  switch (column) {
5223
5534
  case Duration:
5224
5535
  return [{
@@ -5229,7 +5540,7 @@ const getRowCellNodes = (event, isErrorStatus, visibleTableColumns) => {
5229
5540
  case Status$1:
5230
5541
  return [{
5231
5542
  childCount: 1,
5232
- className: mergeClassNames(TableCell, isErrorStatus ? ChatDebugViewCellStatusError : '', isFixed ? ChatDebugViewColumnFixed : ''),
5543
+ className: mergeClassNames(TableCell, isErrorStatus ? ChatDebugViewCellStatusError : ''),
5233
5544
  type: Td
5234
5545
  }, text(getStatusText(event))];
5235
5546
  case Type:
@@ -5244,16 +5555,18 @@ const getRowCellNodes = (event, isErrorStatus, visibleTableColumns) => {
5244
5555
  });
5245
5556
  };
5246
5557
 
5247
- const getDevtoolsRows = (events, selectedEventIndex, visibleTableColumns = defaultVisibleTableColumns) => {
5558
+ const getDevtoolsRows = (events, selectedEventIndex, visibleTableColumns = defaultVisibleTableColumns, startIndex = 0) => {
5248
5559
  return events.flatMap((event, i) => {
5249
- const isEvenRow = i % 2 === 1;
5560
+ const actualIndex = startIndex + i;
5561
+ const isEvenRow = actualIndex % 2 === 1;
5250
5562
  const rowClassName = isEvenRow ? TableRowEven : TableRowOdd;
5251
- const isSelected = selectedEventIndex === i;
5563
+ const isSelected = selectedEventIndex === actualIndex;
5252
5564
  const isErrorStatus = hasErrorStatus(event);
5253
5565
  const rowCellNodes = getRowCellNodes(event, isErrorStatus, visibleTableColumns);
5254
5566
  return [{
5255
5567
  childCount: visibleTableColumns.length,
5256
5568
  className: mergeClassNames(TableRow, rowClassName, isSelected ? TableRowSelected : ''),
5569
+ 'data-index': `${actualIndex}`,
5257
5570
  type: Tr
5258
5571
  }, ...rowCellNodes];
5259
5572
  });
@@ -5274,14 +5587,10 @@ const getEventsClassName = hasSelectedEvent => {
5274
5587
  };
5275
5588
 
5276
5589
  const sashNodesDom = [{
5277
- childCount: 1,
5590
+ childCount: 0,
5278
5591
  className: Sash,
5279
5592
  onPointerDown: HandleSashPointerDown,
5280
5593
  type: Button$1
5281
- }, {
5282
- childCount: 0,
5283
- className: ChatDebugViewSashLine,
5284
- type: Div
5285
5594
  }];
5286
5595
  const getSashNodesDom = hasSelectedEvent => {
5287
5596
  if (!hasSelectedEvent) {
@@ -5479,26 +5788,44 @@ const getTableResizersDom = visibleTableColumns => {
5479
5788
  }, ...resizerNodes];
5480
5789
  };
5481
5790
 
5482
- const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = '') => {
5791
+ const getTableScrollBarDom = visible => {
5792
+ if (!visible) {
5793
+ return [];
5794
+ }
5795
+ return [{
5796
+ childCount: 1,
5797
+ className: TableScrollBar,
5798
+ onPointerDown: HandleTableScrollBarPointerDown,
5799
+ type: Div
5800
+ }, {
5801
+ childCount: 0,
5802
+ className: TableScrollBarThumb,
5803
+ type: Div
5804
+ }];
5805
+ };
5806
+
5807
+ const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = '', showScrollBar = false) => {
5483
5808
  const tableWrapperClassName = mergeClassNames(TableWrapper, focus === FocusChatDebugTable ? FocusOutline : '', className);
5809
+ const scrollBarNodes = getTableScrollBarDom(showScrollBar);
5484
5810
  const tableWrapperNode = {
5485
- childCount: 2,
5811
+ childCount: showScrollBar ? 3 : 2,
5486
5812
  className: tableWrapperClassName,
5813
+ onWheel: HandleTableWheel,
5487
5814
  type: Div,
5488
5815
  ...(role ? {
5489
5816
  role
5490
5817
  } : {})
5491
5818
  };
5492
- return [tableWrapperNode, ...getTableDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus), ...getTableResizersDom(visibleTableColumns)];
5819
+ return [tableWrapperNode, ...getTableDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus), ...getTableResizersDom(visibleTableColumns), ...scrollBarNodes];
5493
5820
  };
5494
5821
 
5495
- const getTableWrapperWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = '') => {
5822
+ const getTableWrapperWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = '', showScrollBar = false) => {
5496
5823
  const tableSummaryNodes = getTableSummaryDom(summary);
5497
5824
  return [{
5498
5825
  childCount: tableSummaryNodes.length === 0 ? 1 : 2,
5499
5826
  className: TableWrapperWrapper,
5500
5827
  type: Div
5501
- }, ...getTableWrapperDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus, className, role), ...tableSummaryNodes];
5828
+ }, ...getTableWrapperDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus, className, role, showScrollBar), ...tableSummaryNodes];
5502
5829
  };
5503
5830
 
5504
5831
  const getBucketUnitDom = (unitCount, presetValue) => {
@@ -5624,36 +5951,31 @@ const getTimelineBadgeNodes = timelineInfo => {
5624
5951
  };
5625
5952
 
5626
5953
  const getTimelineSummary = timelineInfo => {
5954
+ if (timelineInfo.durationSeconds === 0) {
5955
+ return '';
5956
+ }
5627
5957
  if (timelineInfo.hasSelection && timelineInfo.startSeconds !== null && timelineInfo.endSeconds !== null) {
5628
5958
  return windowSummary(formatTimelineSeconds(timelineInfo.startSeconds), formatTimelineSeconds(timelineInfo.endSeconds), formatTimelineSeconds(timelineInfo.durationSeconds));
5629
5959
  }
5630
5960
  return windowSummary('0s', formatTimelineSeconds(timelineInfo.durationSeconds), formatTimelineSeconds(timelineInfo.durationSeconds));
5631
5961
  };
5632
5962
 
5633
- const getTimelineTopDom = timelineInfo => {
5634
- return [{
5635
- childCount: 1,
5636
- className: ChatDebugViewTimelineTop,
5637
- type: Div
5638
- }, text(getTimelineSummary(timelineInfo))];
5639
- };
5640
-
5641
5963
  // cspell:ignore gettimelinedom
5642
5964
  const getTimelineDom = (timelineInfo, hoverPercent = null) => {
5643
5965
  if (timelineInfo.buckets.length === 0) {
5644
5966
  return [];
5645
5967
  }
5968
+ const summary = getTimelineSummary(timelineInfo);
5646
5969
  const badgeNodes = getTimelineBadgeNodes(timelineInfo);
5647
5970
  const bucketNodes = getBucketsDom(timelineInfo.buckets);
5648
5971
  const selectionNodes = getSelectionNodesDom(timelineInfo.hasSelection, timelineInfo.selectionStartPercent, timelineInfo.selectionEndPercent);
5649
5972
  const cursorGuideNodes = getCursorGuideNodes(hoverPercent);
5650
- const timelineTopDom = getTimelineTopDom(timelineInfo);
5651
5973
  return [{
5652
- childCount: 2,
5974
+ childCount: summary ? 2 : 1,
5653
5975
  className: ChatDebugViewTimeline,
5654
5976
  onContextMenu: HandleTimelineContextMenu,
5655
5977
  type: Section
5656
- }, ...timelineTopDom, {
5978
+ }, ...(summary ? [text(summary)] : []), {
5657
5979
  childCount: 3,
5658
5980
  className: ChatDebugViewTimelineInteractive,
5659
5981
  onDblClick: HandleTimelineDoubleClick,
@@ -5674,20 +5996,25 @@ const getTimelineDom = (timelineInfo, hoverPercent = null) => {
5674
5996
  }, ...selectionNodes];
5675
5997
  };
5676
5998
 
5677
- 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) => {
5678
- const rowNodes = getDevtoolsRows(events, selectedEventIndex, visibleTableColumns);
5999
+ 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) => {
6000
+ const visibleEvents = events.slice(minLineY, maxLineY);
6001
+ const rowNodes = getDevtoolsRows(visibleEvents, selectedEventIndex, visibleTableColumns, minLineY);
5679
6002
  const effectiveRange = getEffectiveTimelineRange(timelineStartSeconds, timelineEndSeconds, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds);
5680
6003
  const resolvedTimelineInfo = timelineInfo || getTimelineInfo(timelineEvents, effectiveRange.startSeconds, effectiveRange.endSeconds);
5681
6004
  const timelineNodes = getTimelineDom(resolvedTimelineInfo, timelineHoverPercent);
5682
6005
  const previewEvent = selectedEvent ? getPreviewEvent(selectedEvent) : undefined;
5683
- const previewEventNodes = getPreviewEventNodes(previewEvent, selectedEvent);
6006
+ const previewEventNodes = getPreviewEventNodes(previewEvent, selectedEvent, previewTextCursorRowIndex === null || previewTextCursorColumnIndex === null ? null : {
6007
+ columnIndex: previewTextCursorColumnIndex,
6008
+ rowIndex: previewTextCursorRowIndex
6009
+ });
5684
6010
  const payloadEventNodes = selectedEvent ? getEventNode(getPayloadEvent(selectedEvent)) : [];
5685
6011
  const responseEventNodes = selectedEvent ? getEventNode(selectedEvent) : [];
5686
6012
  const hasSelectedEvent = responseEventNodes.length > 0;
5687
6013
  const eventsClassName = getEventsClassName(hasSelectedEvent);
5688
6014
  const summary = getTableSummary(events);
5689
- const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableWrapperWrapperDom(rowNodes, events.length, visibleTableColumns, tableColumns, summary, focus);
5690
- const detailsNodes = getDetailsDom(previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, detailTabs);
6015
+ const showScrollBar = visibleEvents.length < events.length;
6016
+ const tableNodes = events.length === 0 ? getEmptyStateDom(emptyMessage) : getTableWrapperWrapperDom(rowNodes, visibleEvents.length, visibleTableColumns, tableColumns, summary, focus, '', '', showScrollBar);
6017
+ const detailsNodes = getDetailsDom(previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, detailTabs, previewTextCursorRowIndex, previewTextCursorColumnIndex);
5691
6018
  const sashNodes = getSashNodesDom(hasSelectedEvent);
5692
6019
  const splitChildCount = hasSelectedEvent ? 3 : 1;
5693
6020
  const rootChildCount = 3;
@@ -5741,7 +6068,7 @@ const getEventCategoryFilterDescription = eventCategoryFilters => {
5741
6068
  }
5742
6069
  return eventCategoryFilters.map(eventCategoryFilter => getEventCategoryFilterLabel(eventCategoryFilter).toLowerCase()).join(', ');
5743
6070
  };
5744
- 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) => {
6071
+ 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) => {
5745
6072
  if (errorMessage) {
5746
6073
  return getDebugErrorDom(errorMessage);
5747
6074
  }
@@ -5765,7 +6092,7 @@ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilters, ca
5765
6092
  const emptyMessage = getEmptyMessage(events.length, hasFilterValue, useNoToolCallEventsMessage, noFilteredEventsMessage);
5766
6093
  const safeSelectedEventIndex = selectedEventIndex === null || selectedEventIndex < 0 || selectedEventIndex >= events.length ? null : selectedEventIndex;
5767
6094
  if (useDevtoolsLayout) {
5768
- const devtoolsDom = getDevtoolsDom(events, selectedEvent, safeSelectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds, detailTabs, visibleTableColumns, tableColumns, timelineInfo, timelineHoverPercent, focus);
6095
+ const devtoolsDom = getDevtoolsDom(events, selectedEvent, safeSelectedEventIndex, timelineEvents, timelineStartSeconds, timelineEndSeconds, emptyMessage, timelineSelectionActive, timelineSelectionAnchorSeconds, timelineSelectionFocusSeconds, detailTabs, visibleTableColumns, tableColumns, timelineInfo, timelineHoverPercent, focus, previewTextCursorRowIndex, previewTextCursorColumnIndex, minLineY, maxLineY);
5769
6096
  const devtoolsContentNodes = devtoolsDom.slice(1);
5770
6097
  const topLevelNodes = [...getDebugViewTopDom(filterValue, useDevtoolsLayout, categoryFilters), ...devtoolsContentNodes];
5771
6098
  const rootChildCount = getTopLevelChildCount(topLevelNodes);
@@ -5797,8 +6124,8 @@ const renderItems = (oldState, newState) => {
5797
6124
  if (newState.initial) {
5798
6125
  return [SetDom2, newState.uid, []];
5799
6126
  }
5800
- const filteredEvents = filterEventsByTimelineRange(newState.timelineEvents, newState.timelineStartSeconds, newState.timelineEndSeconds);
5801
- 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);
6127
+ const filteredEvents = getCurrentEvents$2(newState);
6128
+ 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);
5802
6129
  return [SetDom2, newState.uid, dom];
5803
6130
  };
5804
6131
 
@@ -5942,6 +6269,20 @@ const renderEventListeners = () => {
5942
6269
  }, {
5943
6270
  name: HandleTableResizerPointerUp,
5944
6271
  params: ['handleTableResizerPointerUp']
6272
+ }, {
6273
+ name: HandleTableScrollBarPointerDown,
6274
+ params: ['handleTableScrollBarPointerDown', ClientY],
6275
+ trackPointerEvents: [HandleTableScrollBarPointerMove, HandleTableScrollBarPointerUp]
6276
+ }, {
6277
+ name: HandleTableScrollBarPointerMove,
6278
+ params: ['handleTableScrollBarPointerMove', ClientY]
6279
+ }, {
6280
+ name: HandleTableScrollBarPointerUp,
6281
+ params: ['handleTableScrollBarPointerUp']
6282
+ }, {
6283
+ name: HandleTableWheel,
6284
+ params: ['handleTableWheel', 'event.deltaY'],
6285
+ preventDefault: true
5945
6286
  }, {
5946
6287
  name: HandleTimelinePointerDown,
5947
6288
  params: ['handleTimelinePointerDown', TargetName, ClientX],
@@ -5958,6 +6299,9 @@ const renderEventListeners = () => {
5958
6299
  }, {
5959
6300
  name: HandleTimelineDoubleClick,
5960
6301
  params: ['handleTimelineDoubleClick']
6302
+ }, {
6303
+ name: HandlePreviewTextPointerDown,
6304
+ params: ['handlePreviewTextPointerDown', 'event.clientX - event.currentTarget.getBoundingClientRect().left', 'event.clientY - event.currentTarget.getBoundingClientRect().top']
5961
6305
  }];
5962
6306
  };
5963
6307
 
@@ -5981,10 +6325,10 @@ const handleResize = (state, dimensions) => {
5981
6325
  ...state,
5982
6326
  ...dimensions
5983
6327
  };
5984
- return {
6328
+ return applyVirtualTableState({
5985
6329
  ...nextState,
5986
6330
  tableWidth: clampTableWidth(nextState.width, state.tableWidth)
5987
- };
6331
+ });
5988
6332
  };
5989
6333
 
5990
6334
  const isResizeDimensions = value => {
@@ -6033,19 +6377,22 @@ const selectCurrent = async state => {
6033
6377
  };
6034
6378
 
6035
6379
  const setEvents = (state, events) => {
6036
- return getStateWithTimelineInfo({
6380
+ return applyVirtualTableState(getStateWithTimelineInfo({
6037
6381
  ...state,
6038
6382
  errorMessage: '',
6039
6383
  events,
6040
6384
  initial: false,
6385
+ previewTextCursorColumnIndex: null,
6386
+ previewTextCursorRowIndex: null,
6041
6387
  selectedEvent: null,
6042
6388
  selectedEventId: null,
6043
6389
  selectedEventIndex: null
6044
- });
6390
+ }));
6045
6391
  };
6046
6392
 
6047
6393
  const setSessionIdDependencies = {
6048
- listChatViewEvents: listChatViewEvents
6394
+ listChatViewEvents: listChatViewEvents,
6395
+ registerUpdateListener: registerUpdateListener
6049
6396
  };
6050
6397
  const setSessionId = async (state, sessionId) => {
6051
6398
  const {
@@ -6055,12 +6402,15 @@ const setSessionId = async (state, sessionId) => {
6055
6402
  sessionIdIndexName
6056
6403
  } = state;
6057
6404
  const result = await setSessionIdDependencies.listChatViewEvents(sessionId, databaseName, dataBaseVersion, eventStoreName, sessionIdIndexName);
6405
+ await setSessionIdDependencies.registerUpdateListener(sessionId, rpcId, state.uid);
6058
6406
  if (result.type === 'error') {
6059
6407
  return {
6060
6408
  ...state,
6061
6409
  errorMessage: getFailedToLoadMessage(sessionId, result.error),
6062
6410
  events: [],
6063
6411
  initial: false,
6412
+ previewTextCursorColumnIndex: null,
6413
+ previewTextCursorRowIndex: null,
6064
6414
  selectedEvent: null,
6065
6415
  selectedEventId: null,
6066
6416
  selectedEventIndex: null,
@@ -6075,6 +6425,8 @@ const setSessionId = async (state, sessionId) => {
6075
6425
  errorMessage: '',
6076
6426
  events,
6077
6427
  initial: false,
6428
+ previewTextCursorColumnIndex: null,
6429
+ previewTextCursorRowIndex: null,
6078
6430
  selectedEvent: null,
6079
6431
  selectedEventId: null,
6080
6432
  selectedEventIndex: null,
@@ -6124,6 +6476,7 @@ const commandMap = {
6124
6476
  'ChatDebug.handleEventRowClickAt': wrapCommand(handleEventRowClickAt),
6125
6477
  'ChatDebug.handleHeaderContextMenu': wrapCommand(handleHeaderContextMenu),
6126
6478
  'ChatDebug.handleInput': wrapCommand(handleInput),
6479
+ 'ChatDebug.handlePreviewTextPointerDown': wrapCommand(handlePreviewTextPointerDown),
6127
6480
  'ChatDebug.handleSashPointerDown': wrapCommand(handleSashPointerDown),
6128
6481
  'ChatDebug.handleSashPointerMove': wrapCommand(handleSashPointerMove),
6129
6482
  'ChatDebug.handleSashPointerUp': wrapCommand(handleSashPointerUp),
@@ -6137,6 +6490,10 @@ const commandMap = {
6137
6490
  'ChatDebug.handleTableResizerPointerMove': wrapCommand(handleTableResizerPointerMove),
6138
6491
  'ChatDebug.handleTableResizerPointerUp': wrapCommand(handleTableResizerPointerUp),
6139
6492
  'ChatDebug.handleTableRowCopy': wrapCommand(handleTableRowCopy),
6493
+ 'ChatDebug.handleTableScrollBarPointerDown': wrapCommand(handleTableScrollBarPointerDown),
6494
+ 'ChatDebug.handleTableScrollBarPointerMove': wrapCommand(handleTableScrollBarPointerMove),
6495
+ 'ChatDebug.handleTableScrollBarPointerUp': wrapCommand(handleTableScrollBarPointerUp),
6496
+ 'ChatDebug.handleTableWheel': wrapCommand(handleTableWheel),
6140
6497
  'ChatDebug.handleTimelineContextMenu': wrapCommand(handleTimelineContextMenu),
6141
6498
  'ChatDebug.handleTimelineDoubleClick': wrapCommand(handleTimelineDoubleClick),
6142
6499
  'ChatDebug.handleTimelineEndSeconds': wrapCommand(handleTimelineEndSeconds),
@@ -6169,7 +6526,9 @@ const sendMessagePortToChatStorageWorker = async port => {
6169
6526
  };
6170
6527
  const initializeChatStorageWorker = async () => {
6171
6528
  const rpc = await create$4({
6172
- commandMap: {},
6529
+ commandMap: {
6530
+ [rpcId]: handleStorageWorkerUpdate
6531
+ },
6173
6532
  send: sendMessagePortToChatStorageWorker
6174
6533
  });
6175
6534
  set$2(rpc);