@lvce-editor/chat-debug-view 7.0.0 → 7.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.
@@ -1128,6 +1128,7 @@ const Text = 12;
1128
1128
  const Th = 13;
1129
1129
  const THead = 14;
1130
1130
  const Tr = 15;
1131
+ const Section = 41;
1131
1132
  const Search = 42;
1132
1133
  const Label = 66;
1133
1134
  const Reference = 100;
@@ -1286,6 +1287,41 @@ const terminate = () => {
1286
1287
  globalThis.close();
1287
1288
  };
1288
1289
 
1290
+ const appendEvent = async event => {
1291
+ return invoke$1('ChatStorage.appendEvent', event);
1292
+ };
1293
+ const listChatViewEvents$1 = async sessionId => {
1294
+ return invoke$1('ChatStorage.listChatViewEvents', sessionId);
1295
+ };
1296
+ const loadSelectedEvent$1 = async (sessionId, eventId, type) => {
1297
+ return invoke$1('ChatStorage.loadSelectedEvent', sessionId, eventId, type);
1298
+ };
1299
+
1300
+ const appendStoredEventForTestDependencies = {
1301
+ appendEvent: appendEvent
1302
+ };
1303
+ const appendStoredEventForTest = async (state, event) => {
1304
+ await appendStoredEventForTestDependencies.appendEvent(event);
1305
+ return state;
1306
+ };
1307
+
1308
+ const Response = 'response';
1309
+ const Preview = 'preview';
1310
+ const Timing = 'timing';
1311
+ const detailTabs = [Preview, Response, Timing];
1312
+ const isDetailTab = value => {
1313
+ return value === Response || value === Preview || value === Timing;
1314
+ };
1315
+ const getDetailTabLabel = value => {
1316
+ if (value === Preview) {
1317
+ return 'Preview';
1318
+ }
1319
+ if (value === Timing) {
1320
+ return 'Timing';
1321
+ }
1322
+ return 'Response';
1323
+ };
1324
+
1289
1325
  const createEventCategoryFilterOptions = () => {
1290
1326
  return [{
1291
1327
  label: 'All',
@@ -1345,6 +1381,34 @@ const parseFilterValue = filterValue => {
1345
1381
  };
1346
1382
  };
1347
1383
 
1384
+ const validEventCategoryFilters = new Set([All, Network, Stream, Tools, Ui]);
1385
+ const isSavedState = value => {
1386
+ return typeof value === 'object' && value !== null;
1387
+ };
1388
+ const getRestoredEventCategoryFilter = (savedState, currentEventCategoryFilter) => {
1389
+ if (typeof savedState.eventCategoryFilter === 'string' && validEventCategoryFilters.has(savedState.eventCategoryFilter)) {
1390
+ return savedState.eventCategoryFilter;
1391
+ }
1392
+ if (typeof savedState.filterValue === 'string') {
1393
+ return parseFilterValue(savedState.filterValue).eventCategoryFilter;
1394
+ }
1395
+ return currentEventCategoryFilter;
1396
+ };
1397
+ const restoreSavedState = (state, savedState) => {
1398
+ if (!isSavedState(savedState)) {
1399
+ return state;
1400
+ }
1401
+ return {
1402
+ ...state,
1403
+ eventCategoryFilter: getRestoredEventCategoryFilter(savedState, state.eventCategoryFilter),
1404
+ filterValue: typeof savedState.filterValue === 'string' ? savedState.filterValue : state.filterValue,
1405
+ selectedDetailTab: typeof savedState.selectedDetailTab === 'string' && isDetailTab(savedState.selectedDetailTab) ? savedState.selectedDetailTab : state.selectedDetailTab,
1406
+ selectedEventId: typeof savedState.selectedEventId === 'number' || savedState.selectedEventId === null ? savedState.selectedEventId : state.selectedEventId,
1407
+ timelineEndSeconds: typeof savedState.timelineEndSeconds === 'string' ? savedState.timelineEndSeconds : state.timelineEndSeconds,
1408
+ timelineStartSeconds: typeof savedState.timelineStartSeconds === 'string' ? savedState.timelineStartSeconds : state.timelineStartSeconds
1409
+ };
1410
+ };
1411
+
1348
1412
  const {
1349
1413
  get,
1350
1414
  getCommandIds,
@@ -1354,23 +1418,6 @@ const {
1354
1418
  wrapGetter
1355
1419
  } = create$1();
1356
1420
 
1357
- const Response = 'response';
1358
- const Preview = 'preview';
1359
- const Timing = 'timing';
1360
- const detailTabs = [Preview, Response, Timing];
1361
- const isDetailTab = value => {
1362
- return value === Response || value === Preview || value === Timing;
1363
- };
1364
- const getDetailTabLabel = value => {
1365
- if (value === Preview) {
1366
- return 'Preview';
1367
- }
1368
- if (value === Timing) {
1369
- return 'Timing';
1370
- }
1371
- return 'Response';
1372
- };
1373
-
1374
1421
  const defaultTableWidth = 480;
1375
1422
  const minTableWidth = 240;
1376
1423
  const minDetailsWidth = 280;
@@ -1436,43 +1483,19 @@ const createDefaultState = () => {
1436
1483
  };
1437
1484
  };
1438
1485
 
1439
- const validEventCategoryFilters = new Set([All, Network, Stream, Tools, Ui]);
1440
- const getRestoredEventCategoryFilter = savedState => {
1441
- if (typeof savedState.eventCategoryFilter === 'string' && validEventCategoryFilters.has(savedState.eventCategoryFilter)) {
1442
- return savedState.eventCategoryFilter;
1443
- }
1444
- if (typeof savedState.filterValue === 'string') {
1445
- return parseFilterValue(savedState.filterValue).eventCategoryFilter;
1446
- }
1447
- return All;
1448
- };
1449
1486
  const create = (uid, uri, x, y, width, height, platform, assetDir, sessionId = '', databaseName = 'lvce-chat-view-sessions', dataBaseVersion = 2, eventStoreName = 'chat-view-events', sessionIdIndexName = 'sessionId', savedState = {}) => {
1450
1487
  const defaultState = createDefaultState();
1451
- const {
1452
- filterValue,
1453
- selectedEventId,
1454
- tableWidth,
1455
- timelineEndSeconds,
1456
- timelineStartSeconds
1457
- } = savedState;
1458
- const restoredEventCategoryFilter = getRestoredEventCategoryFilter(savedState);
1459
1488
  const state = {
1460
- ...defaultState,
1489
+ ...restoreSavedState(defaultState, savedState),
1461
1490
  assetDir,
1462
1491
  databaseName,
1463
1492
  dataBaseVersion,
1464
- eventCategoryFilter: restoredEventCategoryFilter,
1465
1493
  eventStoreName,
1466
- filterValue: filterValue ?? defaultState.filterValue,
1467
1494
  height,
1468
1495
  initial: true,
1469
1496
  platform,
1470
- selectedEventId: selectedEventId ?? defaultState.selectedEventId,
1471
1497
  sessionId,
1472
1498
  sessionIdIndexName,
1473
- tableWidth: tableWidth ?? defaultState.tableWidth,
1474
- timelineEndSeconds: timelineEndSeconds ?? defaultState.timelineEndSeconds,
1475
- timelineStartSeconds: timelineStartSeconds ?? defaultState.timelineStartSeconds,
1476
1499
  uid,
1477
1500
  uri,
1478
1501
  width,
@@ -1556,29 +1579,10 @@ const getEndedTimestamp = event => {
1556
1579
  return getTimestamp(event.ended) ?? getTimestamp(event.endTime) ?? getTimestamp(event.endTimestamp) ?? getTimestamp(event.timestamp);
1557
1580
  };
1558
1581
 
1559
- const eventStableIds = new WeakMap();
1560
- const eventStableIdState = {
1561
- nextStableEventId: 1
1562
- };
1563
-
1564
- const getOrCreateStableEventId = event => {
1565
- const existingStableEventId = eventStableIds.get(event);
1566
- if (existingStableEventId) {
1567
- return existingStableEventId;
1568
- }
1569
- const stableEventId = `event-${eventStableIdState.nextStableEventId++}`;
1570
- eventStableIds.set(event, stableEventId);
1571
- return stableEventId;
1572
- };
1573
-
1574
1582
  const getStartedTimestamp = event => {
1575
1583
  return getTimestamp(event.started) ?? getTimestamp(event.startTime) ?? getTimestamp(event.startTimestamp) ?? getTimestamp(event.timestamp);
1576
1584
  };
1577
1585
 
1578
- const setStableEventId = (event, stableEventId) => {
1579
- eventStableIds.set(event, stableEventId);
1580
- };
1581
-
1582
1586
  const mergeToolExecutionEvents = (startedEvent, finishedEvent) => {
1583
1587
  const ended = getEndedTimestamp(finishedEvent);
1584
1588
  const {
@@ -1599,15 +1603,9 @@ const mergeToolExecutionEvents = (startedEvent, finishedEvent) => {
1599
1603
  }),
1600
1604
  type: mergedEventType
1601
1605
  };
1602
- const stableEventId = `${getOrCreateStableEventId(startedEvent)}:${getOrCreateStableEventId(finishedEvent)}`;
1603
- setStableEventId(mergedEvent, stableEventId);
1604
1606
  return mergedEvent;
1605
1607
  };
1606
1608
 
1607
- const getStableEventId = event => {
1608
- return getOrCreateStableEventId(event);
1609
- };
1610
-
1611
1609
  const collapseToolExecutionEvents = events => {
1612
1610
  const collapsedEvents = [];
1613
1611
  for (let i = 0; i < events.length; i++) {
@@ -1861,13 +1859,6 @@ const getTimelineInfo = (events, startValue, endValue) => {
1861
1859
  };
1862
1860
  };
1863
1861
 
1864
- const listChatViewEvents$1 = async sessionId => {
1865
- return invoke$1('ChatStorage.listChatViewEvents', sessionId);
1866
- };
1867
- const loadSelectedEvent$1 = async (sessionId, eventId, type) => {
1868
- return invoke$1('ChatStorage.loadSelectedEvent', sessionId, eventId, type);
1869
- };
1870
-
1871
1862
  const listChatViewEventsDependencies = {
1872
1863
  listChatViewEventsFromWorker: listChatViewEvents$1
1873
1864
  };
@@ -2095,8 +2086,7 @@ const getCurrentEvents$2 = state => {
2095
2086
  return filterEventsByTimelineRange(filteredEvents, state.timelineStartSeconds, state.timelineEndSeconds);
2096
2087
  };
2097
2088
  const getEventIndexByStableId$1 = (events, event) => {
2098
- const stableEventId = getStableEventId(event);
2099
- return events.findIndex(candidate => getStableEventId(candidate) === stableEventId);
2089
+ return events.findIndex(candidate => candidate.eventId === event.eventId);
2100
2090
  };
2101
2091
  const getSelectedEventIndex$1 = state => {
2102
2092
  const {
@@ -2249,8 +2239,7 @@ const parseTimelineRangePreset$1 = value => {
2249
2239
  };
2250
2240
  };
2251
2241
  const getEventIndexByStableId = (events, event) => {
2252
- const stableEventId = getStableEventId(event);
2253
- return events.findIndex(candidate => getStableEventId(candidate) === stableEventId);
2242
+ return events.findIndex(candidate => candidate.eventId === event.eventId);
2254
2243
  };
2255
2244
  const getSelectedEventIndex = state => {
2256
2245
  const {
@@ -2631,8 +2620,8 @@ const handleShowResponsePartEvents = (state, checked) => {
2631
2620
  return withPreservedSelection$1(state, nextState);
2632
2621
  };
2633
2622
 
2634
- const loadContent = async state => {
2635
- return loadEventsFromUri(state);
2623
+ const loadContent = async (state, savedState) => {
2624
+ return loadEventsFromUri(restoreSavedState(state, savedState));
2636
2625
  };
2637
2626
 
2638
2627
  const getCss = state => {
@@ -2656,9 +2645,58 @@ const getCss = state => {
2656
2645
  contain: strict;
2657
2646
  }
2658
2647
 
2648
+ .ChatDebugViewDetailsBottom {
2649
+ display: flex;
2650
+ contain: strict;
2651
+ flex:1
2652
+
2653
+ }
2659
2654
  .ChatDebugViewEvent {
2660
2655
  contain: content
2661
2656
  }
2657
+
2658
+ .row {
2659
+ flex-shrink: 0;
2660
+ }
2661
+
2662
+ .ChatDebugViewRefreshButton {
2663
+ display: inline-flex;
2664
+ align-items: center;
2665
+ justify-content: center;
2666
+ flex: none;
2667
+ min-height: 28px;
2668
+ padding: 0 10px;
2669
+ border: 1px solid rgba(255, 255, 255, 0.16);
2670
+ border-radius: 6px;
2671
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0.04));
2672
+ color: inherit;
2673
+ font: inherit;
2674
+ font-size: 12px;
2675
+ font-weight: 500;
2676
+ line-height: 1;
2677
+ white-space: nowrap;
2678
+ cursor: pointer;
2679
+ transition: background-color 120ms ease, border-color 120ms ease, transform 120ms ease;
2680
+ }
2681
+
2682
+ .ChatDebugViewRefreshButton:hover {
2683
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.14), rgba(255, 255, 255, 0.08));
2684
+ border-color: rgba(255, 255, 255, 0.24);
2685
+ }
2686
+
2687
+ .ChatDebugViewRefreshButton:active {
2688
+ transform: translateY(1px);
2689
+ }
2690
+
2691
+ .ChatDebugViewRefreshButton:focus-visible {
2692
+ outline: 2px solid rgba(255, 255, 255, 0.4);
2693
+ outline-offset: 1px;
2694
+ }
2695
+
2696
+ .ChatDebugViewEventRow:hover {
2697
+ background: var(--ListHoverBackground);
2698
+ color: var(--ListHoverForeground);
2699
+ }
2662
2700
  `;
2663
2701
  };
2664
2702
 
@@ -2997,6 +3035,7 @@ const ChatDebugViewTable = 'ChatDebugViewTable';
2997
3035
  const ChatDebugViewTableBody = 'ChatDebugViewTableBody';
2998
3036
  const ChatDebugViewTableHeader = 'ChatDebugViewTableHeader';
2999
3037
  const ChatDebugViewTableHeaderRow = 'ChatDebugViewTableHeaderRow';
3038
+ const TableRowEven = 'TableRowEven';
3000
3039
  const ChatDebugViewTimeline = 'ChatDebugViewTimeline';
3001
3040
  const ChatDebugViewTimelineBucket = 'ChatDebugViewTimelineBucket';
3002
3041
  const ChatDebugViewTimelineBucketBar = 'ChatDebugViewTimelineBucketBar';
@@ -3221,7 +3260,7 @@ const getDetailsDom = (previewEventNodes, responseEventNodes = previewEventNodes
3221
3260
  return [{
3222
3261
  childCount: 2,
3223
3262
  className: ChatDebugViewDetails,
3224
- type: Div
3263
+ type: Section
3225
3264
  }, {
3226
3265
  childCount: 2,
3227
3266
  className: ChatDebugViewDetailsTop,
@@ -3334,12 +3373,13 @@ const getStatusText = event => {
3334
3373
 
3335
3374
  const getDevtoolsRows = (events, selectedEventIndex) => {
3336
3375
  return events.flatMap((event, i) => {
3376
+ const isEvenRow = i % 2 === 1;
3337
3377
  const isSelected = selectedEventIndex === i;
3338
3378
  const isErrorStatus = hasErrorStatus(event);
3339
3379
  const rowIndex = String(i);
3340
3380
  return [{
3341
3381
  childCount: 3,
3342
- className: joinClassNames(ChatDebugViewEventRow, isSelected && ChatDebugViewEventRowSelected),
3382
+ className: joinClassNames(ChatDebugViewEventRow, isEvenRow && TableRowEven, isSelected && ChatDebugViewEventRowSelected),
3343
3383
  'data-index': rowIndex,
3344
3384
  type: Tr
3345
3385
  }, {
@@ -3784,7 +3824,7 @@ const getTimelineNodes = (timelineEvents, timelineStartSeconds, timelineEndSecon
3784
3824
  return [{
3785
3825
  childCount: 2,
3786
3826
  className: ChatDebugViewTimeline,
3787
- type: Div
3827
+ type: Section
3788
3828
  }, {
3789
3829
  childCount: 1,
3790
3830
  className: ChatDebugViewTimelineTop,
@@ -3825,10 +3865,12 @@ const getDevtoolsDom = (events, selectedEvent, selectedEventIndex, timelineEvent
3825
3865
  return [{
3826
3866
  childCount: mainChildCount,
3827
3867
  className: ChatDebugViewDevtoolsMain,
3868
+ role: 'none',
3828
3869
  type: Div
3829
3870
  }, ...timelineNodes, {
3830
3871
  childCount: splitChildCount,
3831
3872
  className: ChatDebugViewDevtoolsSplit,
3873
+ role: 'none',
3832
3874
  type: Div
3833
3875
  }, {
3834
3876
  childCount: 1,
@@ -3988,12 +4030,20 @@ const render2 = (uid, diffResult) => {
3988
4030
 
3989
4031
  const renderEventListeners = () => {
3990
4032
  return [{
4033
+ name: HandleHeaderContextMenu,
4034
+ params: ['handleHeaderContextMenu'],
4035
+ preventDefault: true
4036
+ }, {
3991
4037
  name: HandleEventRowClick,
3992
4038
  params: ['handleEventRowClick', 'event.target.dataset.index', Button]
3993
4039
  }, {
3994
4040
  name: HandleTableBodyContextMenu,
3995
4041
  params: ['handleTableBodyContextMenu', ClientX, ClientY],
3996
4042
  preventDefault: true
4043
+ }, {
4044
+ name: HandleDetailsContextMenu,
4045
+ params: ['handleDetailsContextMenu'],
4046
+ preventDefault: true
3997
4047
  }, {
3998
4048
  name: HandleFilterInput,
3999
4049
  params: ['handleInput', TargetName, TargetValue]
@@ -4012,6 +4062,9 @@ const renderEventListeners = () => {
4012
4062
  }, {
4013
4063
  name: HandleClickRefresh,
4014
4064
  params: ['handleClickRefresh']
4065
+ }, {
4066
+ name: HandleTableKeyDown,
4067
+ params: ['handleTableKeyDown', 'event.key']
4015
4068
  }, {
4016
4069
  name: HandleSashPointerDown,
4017
4070
  params: ['handleSashPointerDown', ClientX, ClientY],
@@ -4067,28 +4120,20 @@ const saveState = state => {
4067
4120
  const {
4068
4121
  eventCategoryFilter,
4069
4122
  filterValue,
4070
- height,
4123
+ selectedDetailTab,
4071
4124
  selectedEventId,
4072
4125
  sessionId,
4073
- tableWidth,
4074
4126
  timelineEndSeconds,
4075
- timelineStartSeconds,
4076
- width,
4077
- x,
4078
- y
4127
+ timelineStartSeconds
4079
4128
  } = state;
4080
4129
  return {
4081
4130
  eventCategoryFilter,
4082
4131
  filterValue,
4083
- height,
4132
+ selectedDetailTab,
4084
4133
  selectedEventId,
4085
4134
  sessionId,
4086
- tableWidth,
4087
4135
  timelineEndSeconds,
4088
- timelineStartSeconds,
4089
- width,
4090
- x,
4091
- y
4136
+ timelineStartSeconds
4092
4137
  };
4093
4138
  };
4094
4139
 
@@ -4137,6 +4182,7 @@ const setSessionId = async (state, sessionId) => {
4137
4182
  };
4138
4183
 
4139
4184
  const commandMap = {
4185
+ 'ChatDebug.appendStoredEventForTest': wrapCommand(appendStoredEventForTest),
4140
4186
  'ChatDebug.create': create,
4141
4187
  'ChatDebug.diff2': diff2,
4142
4188
  'ChatDebug.getCommandIds': getCommandIds,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/chat-debug-view",
3
- "version": "7.0.0",
3
+ "version": "7.2.0",
4
4
  "description": "Chat Debug View Worker",
5
5
  "repository": {
6
6
  "type": "git",