@lvce-editor/chat-debug-view 10.2.0 → 10.3.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.
@@ -2245,6 +2245,7 @@ const createDefaultState = () => {
2245
2245
  timelineEndSeconds: '',
2246
2246
  timelineEvents: [],
2247
2247
  timelineFilterDescription: '',
2248
+ timelineHeight: 81,
2248
2249
  timelineHoverPercent: null,
2249
2250
  timelineHoverSeconds: '',
2250
2251
  timelineInfo: emptyTimelineInfo,
@@ -2292,7 +2293,7 @@ const RenderFocusContext = 4;
2292
2293
  const RenderFocus = 5;
2293
2294
 
2294
2295
  const diff = (oldState, newState) => {
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) {
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) {
2296
2297
  return [RenderIncremental, RenderCss];
2297
2298
  }
2298
2299
  return [];
@@ -2383,6 +2384,76 @@ const mergeToolExecutionEvents = (startedEvent, finishedEvent, type = mergedEven
2383
2384
  return mergedEvent;
2384
2385
  };
2385
2386
 
2387
+ const requestEventTypes = new Set(['request', 'ai-request']);
2388
+ const responseEventTypes = new Set(['response', 'ai-response-success']);
2389
+ const getPairId = event => {
2390
+ const {
2391
+ request_id: requestIdSnake,
2392
+ requestId,
2393
+ requestID,
2394
+ turn_id: turnIdSnake,
2395
+ turnId
2396
+ } = event;
2397
+ if (typeof requestId === 'string' || typeof requestId === 'number') {
2398
+ return requestId;
2399
+ }
2400
+ if (typeof requestIdSnake === 'string' || typeof requestIdSnake === 'number') {
2401
+ return requestIdSnake;
2402
+ }
2403
+ if (typeof requestID === 'string' || typeof requestID === 'number') {
2404
+ return requestID;
2405
+ }
2406
+ if (typeof turnId === 'string' || typeof turnId === 'number') {
2407
+ return turnId;
2408
+ }
2409
+ if (typeof turnIdSnake === 'string' || typeof turnIdSnake === 'number') {
2410
+ return turnIdSnake;
2411
+ }
2412
+ const {
2413
+ body,
2414
+ request,
2415
+ response,
2416
+ value
2417
+ } = event;
2418
+ const bodyPairId = body?.requestId ?? body?.request_id ?? body?.requestID ?? body?.turnId ?? body?.turn_id;
2419
+ if (typeof bodyPairId === 'string' || typeof bodyPairId === 'number') {
2420
+ return bodyPairId;
2421
+ }
2422
+ const requestPairId = request?.requestId ?? request?.request_id ?? request?.requestID ?? request?.turnId ?? request?.turn_id;
2423
+ if (typeof requestPairId === 'string' || typeof requestPairId === 'number') {
2424
+ return requestPairId;
2425
+ }
2426
+ const valuePairId = value?.requestId ?? value?.request_id ?? value?.requestID ?? value?.turnId ?? value?.turn_id;
2427
+ if (typeof valuePairId === 'string' || typeof valuePairId === 'number') {
2428
+ return valuePairId;
2429
+ }
2430
+ const responsePairId = response?.requestId ?? response?.request_id ?? response?.requestID ?? response?.turnId ?? response?.turn_id;
2431
+ if (typeof responsePairId === 'string' || typeof responsePairId === 'number') {
2432
+ return responsePairId;
2433
+ }
2434
+ return undefined;
2435
+ };
2436
+ const mergeRequestResponseEvents = (startedEvent, finishedEvent) => {
2437
+ return {
2438
+ ...mergeToolExecutionEvents(startedEvent, finishedEvent, startedEvent.type),
2439
+ requestEvent: startedEvent,
2440
+ responseEvent: finishedEvent
2441
+ };
2442
+ };
2443
+ const isMatchingRequestResponsePair = (startedEvent, finishedEvent) => {
2444
+ if (!requestEventTypes.has(startedEvent.type) || !responseEventTypes.has(finishedEvent.type)) {
2445
+ return false;
2446
+ }
2447
+ if (startedEvent.sessionId !== finishedEvent.sessionId) {
2448
+ return false;
2449
+ }
2450
+ const startedPairId = getPairId(startedEvent);
2451
+ const finishedPairId = getPairId(finishedEvent);
2452
+ if (startedPairId !== undefined && finishedPairId !== undefined) {
2453
+ return startedPairId === finishedPairId;
2454
+ }
2455
+ return startedEvent.type === 'ai-request' && finishedEvent.type === 'ai-response-success';
2456
+ };
2386
2457
  const isMatchingHandleSubmitPair = (startedEvent, finishedEvent) => {
2387
2458
  return startedEvent.type === handleSubmitEventType && finishedEvent.type === sseResponseCompletedEventType && startedEvent.sessionId === finishedEvent.sessionId;
2388
2459
  };
@@ -2396,6 +2467,11 @@ const collapseToolExecutionEvents = events => {
2396
2467
  i++;
2397
2468
  continue;
2398
2469
  }
2470
+ if (nextEvent && isMatchingRequestResponsePair(event, nextEvent)) {
2471
+ collapsedEvents.push(mergeRequestResponseEvents(event, nextEvent));
2472
+ i++;
2473
+ continue;
2474
+ }
2399
2475
  if (nextEvent && isMatchingHandleSubmitPair(event, nextEvent)) {
2400
2476
  collapsedEvents.push(mergeToolExecutionEvents(event, nextEvent, handleSubmitEventType));
2401
2477
  i++;
@@ -2644,6 +2720,30 @@ const loadSelectedEvent = async (_databaseName, _dataBaseVersion, _eventStoreNam
2644
2720
  return loadSelectedEvent$1(sessionId, eventId, type);
2645
2721
  };
2646
2722
 
2723
+ const mergeSelectedEventDetails = (selectedEvent, selectedEventDetails) => {
2724
+ if (!selectedEventDetails) {
2725
+ return selectedEvent;
2726
+ }
2727
+ const {
2728
+ requestEvent,
2729
+ responseEvent
2730
+ } = selectedEvent;
2731
+ if (!requestEvent || !responseEvent || typeof requestEvent !== 'object' || typeof responseEvent !== 'object') {
2732
+ return selectedEventDetails;
2733
+ }
2734
+ const selectedEventDetailsType = selectedEventDetails.type;
2735
+ const resolvedResponseEvent = selectedEventDetailsType === 'response' || selectedEventDetailsType === 'ai-response-success' ? selectedEventDetails : responseEvent;
2736
+ return {
2737
+ ...selectedEventDetails,
2738
+ ...selectedEvent,
2739
+ requestEvent: {
2740
+ ...requestEvent,
2741
+ ...selectedEventDetails
2742
+ },
2743
+ responseEvent: resolvedResponseEvent
2744
+ };
2745
+ };
2746
+
2647
2747
  const devtoolsTableHeaderHeight = 24;
2648
2748
  const devtoolsTableRowHeight = 24;
2649
2749
  const devtoolsTableScrollBarWidth = 12;
@@ -2654,7 +2754,10 @@ const devtoolsRootGap = 4;
2654
2754
  const devtoolsTopHeight = 28;
2655
2755
  const devtoolsTimelineHeight = 88;
2656
2756
  const getTableBodyY = (state, hasTimeline) => {
2657
- return state.y + viewPadding + devtoolsTopHeight + devtoolsRootGap + (hasTimeline ? devtoolsTimelineHeight : 0) + devtoolsTableHeaderHeight;
2757
+ const {
2758
+ y
2759
+ } = state;
2760
+ return y + viewPadding + devtoolsTopHeight + devtoolsRootGap + (hasTimeline ? devtoolsTimelineHeight : 0) + devtoolsTableHeaderHeight;
2658
2761
  };
2659
2762
 
2660
2763
  const getTableBodyHeight = (state, eventCount) => {
@@ -2883,7 +2986,7 @@ const selectEventAtIndex = async (state, selectedEventIndex, dependencies = sele
2883
2986
  };
2884
2987
  }
2885
2988
  const selectedEventDetails = await dependencies.loadSelectedEvent(state.databaseName, state.dataBaseVersion, state.eventStoreName, state.sessionId, state.sessionIdIndexName, selectedEvent.eventId, selectedEvent.type);
2886
- const resolvedSelectedEvent = await withPreparedSelectedEventPreview(selectedEventDetails ?? selectedEvent);
2989
+ const resolvedSelectedEvent = await withPreparedSelectedEventPreview(mergeSelectedEventDetails(selectedEvent, selectedEventDetails));
2887
2990
  return withSelectedEventVisible({
2888
2991
  ...state,
2889
2992
  detailTabs: createDetailTabs(selectedDetailTab, resolvedSelectedEvent),
@@ -2991,24 +3094,32 @@ const show2 = async (uid, menuId, x, y, args) => {
2991
3094
  };
2992
3095
 
2993
3096
  const getTableBodyEventIndex = (state, eventX, eventY) => {
2994
- if (!state.useDevtoolsLayout) {
3097
+ const {
3098
+ tableMaxLineY,
3099
+ tableMinLineY,
3100
+ tableWidth,
3101
+ useDevtoolsLayout,
3102
+ width,
3103
+ x
3104
+ } = state;
3105
+ if (!useDevtoolsLayout) {
2995
3106
  return -1;
2996
3107
  }
2997
3108
  const currentEvents = getCurrentEvents$1(state);
2998
3109
  if (currentEvents.length === 0) {
2999
3110
  return -1;
3000
3111
  }
3001
- const tableX = state.x + leftPadding;
3002
- const tableWidth = clampTableWidth(state.width, state.tableWidth);
3112
+ const tableX = x + leftPadding;
3113
+ const tableWidthNew = clampTableWidth(width, tableWidth);
3003
3114
  const hasTimeline = currentEvents.length > 0;
3004
3115
  const tableBodyY = getTableBodyY(state, hasTimeline);
3005
3116
  const relativeX = eventX - tableX;
3006
3117
  const relativeY = eventY - tableBodyY;
3007
- if (relativeX < 0 || relativeX >= tableWidth || relativeY < 0) {
3118
+ if (relativeX < 0 || relativeX >= tableWidthNew || relativeY < 0) {
3008
3119
  return -1;
3009
3120
  }
3010
- const eventIndex = state.tableMinLineY + Math.floor(relativeY / devtoolsTableRowHeight);
3011
- if (eventIndex < state.tableMinLineY || eventIndex >= state.tableMaxLineY || eventIndex >= currentEvents.length) {
3121
+ const eventIndex = tableMinLineY + Math.floor(relativeY / devtoolsTableRowHeight);
3122
+ if (eventIndex < tableMinLineY || eventIndex >= tableMaxLineY || eventIndex >= currentEvents.length) {
3012
3123
  return -1;
3013
3124
  }
3014
3125
  return eventIndex;
@@ -3251,7 +3362,7 @@ const restoreSelectedEvent = async state => {
3251
3362
  };
3252
3363
  }
3253
3364
  const selectedEventDetails = await loadEventsDependencies.loadSelectedEvent(state.databaseName, state.dataBaseVersion, state.eventStoreName, state.sessionId, state.sessionIdIndexName, selectedEvent.eventId, selectedEvent.type);
3254
- const resolvedSelectedEvent = selectedEventDetails ? await withPreparedSelectedEventPreview(selectedEventDetails) : null;
3365
+ const resolvedSelectedEvent = await withPreparedSelectedEventPreview(mergeSelectedEventDetails(selectedEvent, selectedEventDetails));
3255
3366
  return {
3256
3367
  ...state,
3257
3368
  previewTextCursorColumnIndex: null,
@@ -3699,6 +3810,22 @@ const shouldIncludeArguments = (event, name) => {
3699
3810
  };
3700
3811
 
3701
3812
  const getPayloadEvent = event => {
3813
+ const {
3814
+ requestEvent
3815
+ } = event;
3816
+ if (requestEvent && typeof requestEvent === 'object' && typeof requestEvent.type === 'string') {
3817
+ const mergedRequestEvent = requestEvent;
3818
+ if (mergedRequestEvent.body !== undefined) {
3819
+ return mergedRequestEvent.body;
3820
+ }
3821
+ if (mergedRequestEvent.value !== undefined) {
3822
+ return mergedRequestEvent.value;
3823
+ }
3824
+ if (hasOwn(mergedRequestEvent, 'arguments')) {
3825
+ return mergedRequestEvent.arguments;
3826
+ }
3827
+ return requestEvent;
3828
+ }
3702
3829
  const name = getPreviewName(event);
3703
3830
  if (name === 'list_files' && hasOwn(event, 'arguments')) {
3704
3831
  return event.arguments;
@@ -3951,14 +4078,18 @@ const handleTableFocus = state => {
3951
4078
  };
3952
4079
 
3953
4080
  const handleTableHeaderClick = (state, value) => {
4081
+ const {
4082
+ sortColumn,
4083
+ sortDescending
4084
+ } = state;
3954
4085
  if (!isTableColumn(value)) {
3955
4086
  return state;
3956
4087
  }
3957
- const sortDescending = state.sortColumn === value ? !state.sortDescending : false;
4088
+ const newSortDescending = sortColumn === value ? !sortDescending : false;
3958
4089
  const nextState = {
3959
4090
  ...state,
3960
4091
  sortColumn: value,
3961
- sortDescending
4092
+ sortDescending: newSortDescending
3962
4093
  };
3963
4094
  return withPreservedSelection$1(state, nextState);
3964
4095
  };
@@ -4384,12 +4515,14 @@ const getCss = state => {
4384
4515
  --ResizerTwoLeft: ${resizerTwoLeft}px;
4385
4516
  --ChatDebugViewSashWidth: ${sashWidth}px;
4386
4517
  --ChatDebugViewTableWidth: ${tableWidth}px;
4518
+ --ChatDebugViewTimelineHeight: ${state.timelineHeight}px;
4387
4519
  --ChatDebugViewTimelineCursorGuideLeft: ${state.timelineHoverPercent ?? 0}%;
4388
4520
  --ChatDebugViewTimelineSelectionEndLeft: ${selectionEndPercent ?? 0}%;
4389
4521
  --ChatDebugViewTimelineSelectionStartLeft: ${selectionStartPercent ?? 0}%;
4390
4522
  --ChatDebugViewTopSize: ${topSize}px;
4391
4523
  --ChatDebugViewTypeColumnWidth: ${state.tableColumnWidths.type}px;
4392
4524
  padding: ${viewPadding}px;
4525
+ padding-right: 0;
4393
4526
  }
4394
4527
 
4395
4528
  .TableWrapper {
@@ -4402,6 +4535,20 @@ const getCss = state => {
4402
4535
  width: calc(100% - var(--ChatDebugViewTableScrollBarWidth));
4403
4536
  }
4404
4537
 
4538
+ .ChatDebugViewTimeline {
4539
+ contain: strict;
4540
+ display: flex;
4541
+ flex-direction: column;
4542
+ gap: 8px;
4543
+ height: var(--ChatDebugViewTimelineHeight);
4544
+ }
4545
+
4546
+ .ChatDebugViewTimelineInteractive {
4547
+ flex: 1;
4548
+ min-height: 0;
4549
+ position: relative;
4550
+ }
4551
+
4405
4552
  .TableScrollBar {
4406
4553
  background: rgba(255, 255, 255, 0.06);
4407
4554
  border-radius: 999px;
@@ -5586,6 +5733,20 @@ const getEventsClassName = hasSelectedEvent => {
5586
5733
  return widthClassName;
5587
5734
  };
5588
5735
 
5736
+ const getResponseEvent = event => {
5737
+ const {
5738
+ responseEvent
5739
+ } = event;
5740
+ if (responseEvent && typeof responseEvent === 'object' && typeof responseEvent.type === 'string') {
5741
+ const mergedResponseEvent = responseEvent;
5742
+ if (mergedResponseEvent.value !== undefined) {
5743
+ return mergedResponseEvent.value;
5744
+ }
5745
+ return responseEvent;
5746
+ }
5747
+ return event;
5748
+ };
5749
+
5589
5750
  const sashNodesDom = [{
5590
5751
  childCount: 0,
5591
5752
  className: Sash,
@@ -5806,7 +5967,6 @@ const getTableScrollBarDom = visible => {
5806
5967
 
5807
5968
  const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = '', showScrollBar = false) => {
5808
5969
  const tableWrapperClassName = mergeClassNames(TableWrapper, focus === FocusChatDebugTable ? FocusOutline : '', className);
5809
- const scrollBarNodes = getTableScrollBarDom(showScrollBar);
5810
5970
  const tableWrapperNode = {
5811
5971
  childCount: showScrollBar ? 3 : 2,
5812
5972
  className: tableWrapperClassName,
@@ -5816,7 +5976,7 @@ const getTableWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultV
5816
5976
  role
5817
5977
  } : {})
5818
5978
  };
5819
- return [tableWrapperNode, ...getTableDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus), ...getTableResizersDom(visibleTableColumns), ...scrollBarNodes];
5979
+ return [tableWrapperNode, ...getTableDom(rowNodes, eventCount, visibleTableColumns, tableColumns, summary, focus), ...getTableResizersDom(visibleTableColumns), ...getTableScrollBarDom(showScrollBar)];
5820
5980
  };
5821
5981
 
5822
5982
  const getTableWrapperWrapperDom = (rowNodes, eventCount, visibleTableColumns = defaultVisibleTableColumns, tableColumns = createTableColumns(), summary = '', focus = 0, className = '', role = '', showScrollBar = false) => {
@@ -6008,7 +6168,7 @@ const getDevtoolsDom = (events, selectedEvent, selectedEventIndex, timelineEvent
6008
6168
  rowIndex: previewTextCursorRowIndex
6009
6169
  });
6010
6170
  const payloadEventNodes = selectedEvent ? getEventNode(getPayloadEvent(selectedEvent)) : [];
6011
- const responseEventNodes = selectedEvent ? getEventNode(selectedEvent) : [];
6171
+ const responseEventNodes = selectedEvent ? getEventNode(getResponseEvent(selectedEvent)) : [];
6012
6172
  const hasSelectedEvent = responseEventNodes.length > 0;
6013
6173
  const eventsClassName = getEventsClassName(hasSelectedEvent);
6014
6174
  const summary = getTableSummary(events);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/chat-debug-view",
3
- "version": "10.2.0",
3
+ "version": "10.3.0",
4
4
  "description": "Chat Debug View Worker",
5
5
  "repository": {
6
6
  "type": "git",