@lvce-editor/chat-debug-view 10.11.0 → 10.13.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.
@@ -1185,6 +1185,9 @@ const writeClipBoardText = async text => {
1185
1185
  const getPreference = async key => {
1186
1186
  return await invoke('Preferences.get', key);
1187
1187
  };
1188
+ const openUri = async (uri, focus, options) => {
1189
+ await invoke('Main.openUri', uri, focus, options);
1190
+ };
1188
1191
 
1189
1192
  const toCommandId = key => {
1190
1193
  const dotIndex = key.indexOf('.');
@@ -1420,6 +1423,31 @@ const appendStoredRemovedImageAttachmentForTest = async (state, sessionId, event
1420
1423
  return state;
1421
1424
  };
1422
1425
 
1426
+ const Filter = 'filter';
1427
+ const EventCategoryFilter = 'eventCategoryFilter';
1428
+ const ShowEventStreamFinishedEvents = 'showEventStreamFinishedEvents';
1429
+ const ShowInputEvents = 'showInputEvents';
1430
+ const ShowResponsePartEvents = 'showResponsePartEvents';
1431
+ const UseDevtoolsLayout = 'useDevtoolsLayout';
1432
+ const SelectedEventIndex = 'selectedEventIndex';
1433
+ const CloseDetails$1 = 'closeDetails';
1434
+ const DetailTab = 'detailTab';
1435
+ const TimelineStartSeconds = 'timelineStartSeconds';
1436
+ const TimelineEndSeconds = 'timelineEndSeconds';
1437
+ const TimelineRangePreset = 'timelineRangePreset';
1438
+ const Refresh$1 = 'refresh';
1439
+ const All$1 = 'all';
1440
+ const Tools$1 = 'tools';
1441
+ const Network$1 = 'network';
1442
+ const Ui$1 = 'ui';
1443
+ const Stream$1 = 'stream';
1444
+ const Response$1 = 'response';
1445
+ const Preview$1 = 'preview';
1446
+ const Payload$1 = 'payload';
1447
+ const Headers$1 = 'headers';
1448
+ const Tokens$1 = 'tokens';
1449
+ const Timing$1 = 'timing';
1450
+
1423
1451
  const emptyObject = {};
1424
1452
  const RE_PLACEHOLDER = /\{(PH\d+)\}/g;
1425
1453
  const i18nString = (key, placeholders = emptyObject) => {
@@ -1432,8 +1460,8 @@ const i18nString = (key, placeholders = emptyObject) => {
1432
1460
  return key.replaceAll(RE_PLACEHOLDER, replacer);
1433
1461
  };
1434
1462
 
1435
- const All$1 = 'All';
1436
- const CloseDetails$1 = 'Close details';
1463
+ const All = 'All';
1464
+ const CloseDetails = 'Close details';
1437
1465
  const Copy = 'Copy';
1438
1466
  const CachedTokens = 'Cached Tokens';
1439
1467
  const DetailSections = 'Detail sections';
@@ -1443,7 +1471,7 @@ const FailedToLoadChatDebugSession = 'Failed to load chat debug session "{PH1}".
1443
1471
  const FailedToLoadChatDebugSessionWithError = 'Failed to load chat debug session "{PH1}": {PH2}';
1444
1472
  const FilterEvents = 'Filter events';
1445
1473
  const FromSeconds = 'from {PH1}s';
1446
- const Headers$1 = 'Headers';
1474
+ const Headers = 'Headers';
1447
1475
  const ImageCouldNotBeLoaded = 'image could not be loaded';
1448
1476
  const InputTokens = 'Input Tokens';
1449
1477
  const InvalidSessionId = 'Invalid session id';
@@ -1452,30 +1480,31 @@ const InvalidUriFormat = 'Invalid URI format';
1452
1480
  const Method$1 = 'Method';
1453
1481
  const MissingUri = 'Missing URI';
1454
1482
  const Name = 'Name';
1455
- const Network$1 = 'Network';
1483
+ const Network = 'Network';
1456
1484
  const NoChatSessionFound = 'No chat session found for sessionId "{PH1}".';
1457
1485
  const NoEventsFound = 'No events have been found';
1458
1486
  const NoEventsFoundMatching = 'No events found matching {PH1}';
1459
1487
  const NoToolCallEvents = 'No tool call events.';
1488
+ const OpenInNewTab = 'Open in New Tab';
1460
1489
  const OutputTokens = 'Output Tokens';
1461
- const Payload$1 = 'Payload';
1462
- const Preview$1 = 'Preview';
1463
- const Refresh$1 = 'Refresh';
1490
+ const Payload = 'Payload';
1491
+ const Preview = 'Preview';
1492
+ const Refresh = 'Refresh';
1464
1493
  const RefreshEvents = 'Refresh events';
1465
1494
  const ResetColumns = 'Reset columns';
1466
- const Response$1 = 'Response';
1495
+ const Response = 'Response';
1467
1496
  const SecondsRange = '{PH1}s-{PH2}s';
1468
1497
  const Started = 'Started';
1469
1498
  const Status$2 = 'Status';
1470
- const Stream$1 = 'Stream';
1499
+ const Stream = 'Stream';
1471
1500
  const TableSummaryPlural = '{PH1} events, {PH2} from start to finish';
1472
1501
  const TableSummarySingular = '{PH1} event, {PH2} from start to finish';
1473
- const Timing$1 = 'Timing';
1474
- const Tokens$1 = 'Tokens';
1502
+ const Timing = 'Timing';
1503
+ const Tokens = 'Tokens';
1475
1504
  const ToSeconds = 'to {PH1}s';
1476
- const Tools$1 = 'Tools';
1505
+ const Tools = 'Tools';
1477
1506
  const Type$1 = 'Type';
1478
- const Ui$1 = 'UI';
1507
+ const Ui = 'UI';
1479
1508
  const UnableToLoadDebugSessionInvalidUri = 'Unable to load debug session: invalid URI "{PH1}". Expected format: chat-debug://<sessionId>.';
1480
1509
  const UnableToLoadDebugSessionMissingUri = 'Unable to load debug session: missing URI. Expected format: chat-debug://<sessionId>.';
1481
1510
  const Value = 'Value';
@@ -1484,6 +1513,9 @@ const WindowSummary = 'Window {PH1}-{PH2} of {PH3}';
1484
1513
  const copy = () => {
1485
1514
  return i18nString(Copy);
1486
1515
  };
1516
+ const openInNewTab = () => {
1517
+ return i18nString(OpenInNewTab);
1518
+ };
1487
1519
  const cachedTokens = () => {
1488
1520
  return i18nString(CachedTokens);
1489
1521
  };
@@ -1491,10 +1523,10 @@ const status = () => {
1491
1523
  return i18nString(Status$2);
1492
1524
  };
1493
1525
  const all = () => {
1494
- return i18nString(All$1);
1526
+ return i18nString(All);
1495
1527
  };
1496
1528
  const closeDetails = () => {
1497
- return i18nString(CloseDetails$1);
1529
+ return i18nString(CloseDetails);
1498
1530
  };
1499
1531
  const detailSections = () => {
1500
1532
  return i18nString(DetailSections);
@@ -1525,7 +1557,7 @@ const fromSeconds = seconds => {
1525
1557
  });
1526
1558
  };
1527
1559
  const headers = () => {
1528
- return i18nString(Headers$1);
1560
+ return i18nString(Headers);
1529
1561
  };
1530
1562
  const invalidSessionId = () => {
1531
1563
  return i18nString(InvalidSessionId);
@@ -1552,7 +1584,7 @@ const name = () => {
1552
1584
  return i18nString(Name);
1553
1585
  };
1554
1586
  const network = () => {
1555
- return i18nString(Network$1);
1587
+ return i18nString(Network);
1556
1588
  };
1557
1589
  const noChatSessionFound = sessionId => {
1558
1590
  return i18nString(NoChatSessionFound, {
@@ -1571,16 +1603,16 @@ const noToolCallEvents = () => {
1571
1603
  return i18nString(NoToolCallEvents);
1572
1604
  };
1573
1605
  const preview = () => {
1574
- return i18nString(Preview$1);
1606
+ return i18nString(Preview);
1575
1607
  };
1576
1608
  const payload = () => {
1577
- return i18nString(Payload$1);
1609
+ return i18nString(Payload);
1578
1610
  };
1579
1611
  const outputTokens = () => {
1580
1612
  return i18nString(OutputTokens);
1581
1613
  };
1582
1614
  const refresh$1 = () => {
1583
- return i18nString(Refresh$1);
1615
+ return i18nString(Refresh);
1584
1616
  };
1585
1617
  const refreshEvents$1 = () => {
1586
1618
  return i18nString(RefreshEvents);
@@ -1589,7 +1621,7 @@ const resetColumns = () => {
1589
1621
  return i18nString(ResetColumns);
1590
1622
  };
1591
1623
  const response = () => {
1592
- return i18nString(Response$1);
1624
+ return i18nString(Response);
1593
1625
  };
1594
1626
  const secondsRange = (start, end) => {
1595
1627
  return i18nString(SecondsRange, {
@@ -1601,13 +1633,13 @@ const started = () => {
1601
1633
  return i18nString(Started);
1602
1634
  };
1603
1635
  const stream = () => {
1604
- return i18nString(Stream$1);
1636
+ return i18nString(Stream);
1605
1637
  };
1606
1638
  const timing = () => {
1607
- return i18nString(Timing$1);
1639
+ return i18nString(Timing);
1608
1640
  };
1609
1641
  const tokens = () => {
1610
- return i18nString(Tokens$1);
1642
+ return i18nString(Tokens);
1611
1643
  };
1612
1644
  const tableSummary = (eventCount, duration) => {
1613
1645
  return i18nString(eventCount === 1 ? TableSummarySingular : TableSummaryPlural, {
@@ -1621,7 +1653,7 @@ const toSeconds = seconds => {
1621
1653
  });
1622
1654
  };
1623
1655
  const tools = () => {
1624
- return i18nString(Tools$1);
1656
+ return i18nString(Tools);
1625
1657
  };
1626
1658
  const type = () => {
1627
1659
  return i18nString(Type$1);
@@ -1630,7 +1662,7 @@ const value = () => {
1630
1662
  return i18nString(Value);
1631
1663
  };
1632
1664
  const ui = () => {
1633
- return i18nString(Ui$1);
1665
+ return i18nString(Ui);
1634
1666
  };
1635
1667
  const unableToLoadDebugSessionInvalidUri = uri => {
1636
1668
  return i18nString(UnableToLoadDebugSessionInvalidUri, {
@@ -1648,262 +1680,66 @@ const windowSummary = (start, end, duration) => {
1648
1680
  });
1649
1681
  };
1650
1682
 
1651
- const Filter = 'filter';
1652
- const EventCategoryFilter = 'eventCategoryFilter';
1653
- const ShowEventStreamFinishedEvents = 'showEventStreamFinishedEvents';
1654
- const ShowInputEvents = 'showInputEvents';
1655
- const ShowResponsePartEvents = 'showResponsePartEvents';
1656
- const UseDevtoolsLayout = 'useDevtoolsLayout';
1657
- const SelectedEventIndex = 'selectedEventIndex';
1658
- const CloseDetails = 'closeDetails';
1659
- const DetailTab = 'detailTab';
1660
- const TimelineStartSeconds = 'timelineStartSeconds';
1661
- const TimelineEndSeconds = 'timelineEndSeconds';
1662
- const TimelineRangePreset = 'timelineRangePreset';
1663
- const Refresh = 'refresh';
1664
- const All = 'all';
1665
- const Tools = 'tools';
1666
- const Network = 'network';
1667
- const Ui = 'ui';
1668
- const Stream = 'stream';
1669
- const Response = 'response';
1670
- const Preview = 'preview';
1671
- const Payload = 'payload';
1672
- const Headers = 'headers';
1673
- const Tokens = 'tokens';
1674
- const Timing = 'timing';
1675
-
1676
- const isDetailTab = value => {
1677
- return value === Response || value === Preview || value === Payload || value === Headers || value === Tokens || value === Headers || value === Timing;
1678
- };
1679
-
1680
- const getSafeSelectedDetailTab = selectedDetailTab => {
1681
- return isDetailTab(selectedDetailTab) ? selectedDetailTab : Response;
1682
- };
1683
-
1684
- const isHeadersRecord$1 = value => {
1685
- return typeof value === 'object' && value !== null && !Array.isArray(value);
1686
- };
1687
- const hasHeadersDetails = event => {
1688
- return event.type === 'ai-request' && isHeadersRecord$1(event.headers);
1689
- };
1690
-
1691
- const hasTimingDetails = event => {
1692
- const hasDuration = typeof event.duration === 'number' || typeof event.durationMs === 'number';
1693
- const hasStart = event.started !== undefined || event.startTime !== undefined || event.startTimestamp !== undefined;
1694
- const hasEnd = event.ended !== undefined || event.endTime !== undefined || event.endTimestamp !== undefined;
1695
- return hasDuration || hasStart && hasEnd;
1696
- };
1697
-
1698
- const getResponseEvent = event => {
1699
- const {
1700
- responseEvent
1701
- } = event;
1702
- if (responseEvent && typeof responseEvent === 'object' && typeof responseEvent.type === 'string') {
1703
- const mergedResponseEvent = responseEvent;
1704
- if (mergedResponseEvent.value !== undefined) {
1705
- return mergedResponseEvent.value;
1706
- }
1707
- return responseEvent;
1708
- }
1709
- return event;
1710
- };
1711
-
1712
- const isObject = value => {
1713
- return typeof value === 'object' && value !== null;
1714
- };
1715
- const getNumber = (value, ...keys) => {
1716
- for (const key of keys) {
1717
- if (typeof value[key] === 'number') {
1718
- return value[key];
1719
- }
1720
- }
1721
- return undefined;
1722
- };
1723
- const getUsage = event => {
1724
- const responseEvent = getResponseEvent(event);
1725
- if (isObject(responseEvent) && isObject(responseEvent.usage)) {
1726
- return responseEvent.usage;
1727
- }
1728
- if (isObject(responseEvent) && isObject(responseEvent.value) && isObject(responseEvent.value.usage)) {
1729
- return responseEvent.value.usage;
1730
- }
1731
- return undefined;
1732
- };
1733
- const getTokenUsageDetails = event => {
1734
- const usage = getUsage(event);
1735
- if (!usage) {
1736
- return undefined;
1737
- }
1738
- const inputTokens = getNumber(usage, 'input_tokens', 'inputTokens');
1739
- const outputTokens = getNumber(usage, 'output_tokens', 'outputTokens');
1740
- let inputTokenDetails;
1741
- if (isObject(usage.input_tokens_details)) {
1742
- inputTokenDetails = usage.input_tokens_details;
1743
- } else if (isObject(usage.inputTokensDetails)) {
1744
- inputTokenDetails = usage.inputTokensDetails;
1745
- }
1746
- const cachedTokens = inputTokenDetails ? getNumber(inputTokenDetails, 'cached_tokens', 'cachedTokens') : getNumber(usage, 'cached_tokens', 'cachedTokens');
1747
- if (inputTokens === undefined && outputTokens === undefined && cachedTokens === undefined) {
1748
- return undefined;
1749
- }
1750
- return {
1751
- ...(cachedTokens === undefined ? undefined : {
1752
- cachedTokens
1753
- }),
1754
- ...(inputTokens === undefined ? undefined : {
1755
- inputTokens
1756
- }),
1757
- ...(outputTokens === undefined ? undefined : {
1758
- outputTokens
1759
- })
1760
- };
1761
- };
1762
-
1763
- const hasTokenUsageDetails = event => {
1764
- return getTokenUsageDetails(event) !== undefined;
1765
- };
1766
-
1767
- const createDetailTabs = (selectedDetailTab = Response, event) => {
1768
- const hasHeadersTab = event ? hasHeadersDetails(event) : false;
1769
- const hasTokensTab = event ? hasTokenUsageDetails(event) : false;
1770
- const hasTimingTab = event ? hasTimingDetails(event) : true;
1771
- const safeSelectedDetailTab = getSafeSelectedDetailTab(selectedDetailTab);
1772
- let normalizedSelectedDetailTab = safeSelectedDetailTab;
1773
- if (!hasHeadersTab && normalizedSelectedDetailTab === Headers) {
1774
- normalizedSelectedDetailTab = Response;
1775
- }
1776
- if (!hasTokensTab && normalizedSelectedDetailTab === Tokens) {
1777
- normalizedSelectedDetailTab = Response;
1778
- }
1779
- if (!hasTimingTab && normalizedSelectedDetailTab === Timing) {
1780
- normalizedSelectedDetailTab = Response;
1781
- }
1782
- const detailTabs = [{
1783
- isSelected: normalizedSelectedDetailTab === Preview,
1784
- label: preview(),
1785
- name: Preview
1786
- }, {
1787
- isSelected: normalizedSelectedDetailTab === Payload,
1788
- label: payload(),
1789
- name: Payload
1790
- }, {
1791
- isSelected: normalizedSelectedDetailTab === Response,
1792
- label: response(),
1793
- name: Response
1794
- }];
1795
- if (hasHeadersTab) {
1796
- detailTabs.push({
1797
- isSelected: normalizedSelectedDetailTab === Headers,
1798
- label: headers(),
1799
- name: Headers
1800
- });
1801
- }
1802
- if (hasTokensTab) {
1803
- detailTabs.push({
1804
- isSelected: normalizedSelectedDetailTab === Tokens,
1805
- label: tokens(),
1806
- name: Tokens
1807
- });
1808
- }
1809
- if (hasTimingTab) {
1810
- detailTabs.push({
1811
- isSelected: normalizedSelectedDetailTab === Timing,
1812
- label: timing(),
1813
- name: Timing
1814
- });
1815
- }
1816
- return detailTabs;
1817
- };
1818
-
1819
- const getSelectedDetailTab = detailTabs => {
1820
- const selectedDetailTab = detailTabs.find(detailTab => detailTab.isSelected);
1821
- if (selectedDetailTab) {
1822
- return selectedDetailTab.name;
1823
- }
1824
- const responseTab = detailTabs.find(detailTab => detailTab.name === Response);
1825
- if (responseTab) {
1826
- return responseTab.name;
1827
- }
1828
- return detailTabs[0]?.name ?? Response;
1829
- };
1830
-
1831
- const hasDetailTab = (detailTabs, value) => {
1832
- return detailTabs.some(detailTab => detailTab.name === value);
1833
- };
1834
-
1835
- const selectDetailTab$1 = (detailTabs, selectedDetailTab) => {
1836
- if (!hasDetailTab(detailTabs, selectedDetailTab)) {
1837
- return detailTabs;
1838
- }
1839
- return detailTabs.map(detailTab => {
1840
- return {
1841
- ...detailTab,
1842
- isSelected: detailTab.name === selectedDetailTab
1843
- };
1844
- });
1845
- };
1846
-
1847
1683
  const getEventCategoryFilterLabel = eventCategoryFilter => {
1848
1684
  switch (eventCategoryFilter) {
1849
- case Network:
1685
+ case Network$1:
1850
1686
  return network();
1851
- case Stream:
1687
+ case Stream$1:
1852
1688
  return stream();
1853
- case Tools:
1689
+ case Tools$1:
1854
1690
  return tools();
1855
- case Ui:
1691
+ case Ui$1:
1856
1692
  return ui();
1857
1693
  default:
1858
1694
  return all();
1859
1695
  }
1860
1696
  };
1861
1697
 
1862
- const eventCategoryFilters = [All, Tools, Network, Ui, Stream];
1863
- const normalizeSelectedEventCategoryFilters = (selectedEventCategoryFilter = All) => {
1698
+ const eventCategoryFilters = [All$1, Tools$1, Network$1, Ui$1, Stream$1];
1699
+ const normalizeSelectedEventCategoryFilters = (selectedEventCategoryFilter = All$1) => {
1864
1700
  const selectedEventCategoryFilters = Array.isArray(selectedEventCategoryFilter) ? selectedEventCategoryFilter : [selectedEventCategoryFilter];
1865
1701
  const uniqueSelectedEventCategoryFilters = [...new Set(selectedEventCategoryFilters)];
1866
1702
  const validSelectedEventCategoryFilters = uniqueSelectedEventCategoryFilters.filter(value => {
1867
1703
  return eventCategoryFilters.includes(value);
1868
1704
  });
1869
1705
  if (validSelectedEventCategoryFilters.length === 0) {
1870
- return [All];
1706
+ return [All$1];
1871
1707
  }
1872
- if (validSelectedEventCategoryFilters.includes(All)) {
1873
- return [All];
1708
+ if (validSelectedEventCategoryFilters.includes(All$1)) {
1709
+ return [All$1];
1874
1710
  }
1875
1711
  return validSelectedEventCategoryFilters;
1876
1712
  };
1877
- const createCategoryFilters$1 = (selectedEventCategoryFilter = All) => {
1713
+ const createCategoryFilters$1 = (selectedEventCategoryFilter = All$1) => {
1878
1714
  const selectedEventCategoryFilters = normalizeSelectedEventCategoryFilters(selectedEventCategoryFilter);
1879
1715
  return [{
1880
- isSelected: selectedEventCategoryFilters.includes(All),
1716
+ isSelected: selectedEventCategoryFilters.includes(All$1),
1881
1717
  label: all(),
1882
- name: All
1718
+ name: All$1
1883
1719
  }, {
1884
- isSelected: selectedEventCategoryFilters.includes(Tools),
1720
+ isSelected: selectedEventCategoryFilters.includes(Tools$1),
1885
1721
  label: tools(),
1886
- name: Tools
1722
+ name: Tools$1
1887
1723
  }, {
1888
- isSelected: selectedEventCategoryFilters.includes(Network),
1724
+ isSelected: selectedEventCategoryFilters.includes(Network$1),
1889
1725
  label: network(),
1890
- name: Network
1726
+ name: Network$1
1891
1727
  }, {
1892
- isSelected: selectedEventCategoryFilters.includes(Ui),
1728
+ isSelected: selectedEventCategoryFilters.includes(Ui$1),
1893
1729
  label: ui(),
1894
- name: Ui
1730
+ name: Ui$1
1895
1731
  }, {
1896
- isSelected: selectedEventCategoryFilters.includes(Stream),
1732
+ isSelected: selectedEventCategoryFilters.includes(Stream$1),
1897
1733
  label: stream(),
1898
- name: Stream
1734
+ name: Stream$1
1899
1735
  }];
1900
1736
  };
1901
1737
 
1902
- const createCategoryFilters = (selectedEventCategoryFilter = All) => {
1738
+ const createCategoryFilters = (selectedEventCategoryFilter = All$1) => {
1903
1739
  return createCategoryFilters$1(selectedEventCategoryFilter);
1904
1740
  };
1905
1741
  const isEventCategoryFilter = value => {
1906
- return value === All || value === Tools || value === Network || value === Ui || value === Stream;
1742
+ return value === All$1 || value === Tools$1 || value === Network$1 || value === Ui$1 || value === Stream$1;
1907
1743
  };
1908
1744
  const getSelectedEventCategoryFilters = categoryFilters => {
1909
1745
  const selectedCategoryFilters = categoryFilters.filter(categoryFilter => categoryFilter.isSelected);
@@ -1915,7 +1751,7 @@ const getSelectedEventCategoryFilter = categoryFilters => {
1915
1751
  if (selectedEventCategoryFilters.length === 1) {
1916
1752
  return selectedEventCategoryFilters[0];
1917
1753
  }
1918
- return All;
1754
+ return All$1;
1919
1755
  };
1920
1756
  const selectCategoryFilters = (categoryFilters, selectedEventCategoryFilters) => {
1921
1757
  const normalizedSelectedEventCategoryFilters = normalizeSelectedEventCategoryFilters(selectedEventCategoryFilters.filter(value => isEventCategoryFilter(value)));
@@ -1934,29 +1770,33 @@ const selectCategoryFilter = (categoryFilters, selectedEventCategoryFilter, addi
1934
1770
  if (!isEventCategoryFilter(selectedEventCategoryFilter)) {
1935
1771
  return categoryFilters;
1936
1772
  }
1937
- if (!additive || selectedEventCategoryFilter === All) {
1773
+ if (!additive || selectedEventCategoryFilter === All$1) {
1938
1774
  return selectCategoryFilters(categoryFilters, [selectedEventCategoryFilter]);
1939
1775
  }
1940
- const selectedEventCategoryFilters = getSelectedEventCategoryFilters(categoryFilters).filter(value => value !== All);
1776
+ const selectedEventCategoryFilters = getSelectedEventCategoryFilters(categoryFilters).filter(value => value !== All$1);
1941
1777
  const nextSelectedEventCategoryFilters = selectedEventCategoryFilters.includes(selectedEventCategoryFilter) ? selectedEventCategoryFilters.filter(value => value !== selectedEventCategoryFilter) : [...selectedEventCategoryFilters, selectedEventCategoryFilter];
1942
1778
  if (nextSelectedEventCategoryFilters.length === 0) {
1943
- return selectCategoryFilters(categoryFilters, [All]);
1779
+ return selectCategoryFilters(categoryFilters, [All$1]);
1944
1780
  }
1945
1781
  return selectCategoryFilters(categoryFilters, nextSelectedEventCategoryFilters);
1946
1782
  };
1947
1783
 
1784
+ const isDetailTab = value => {
1785
+ return value === Response$1 || value === Preview$1 || value === Payload$1 || value === Headers$1 || value === Tokens$1 || value === Headers$1 || value === Timing$1;
1786
+ };
1787
+
1948
1788
  const RE_SPACE = /\s+/;
1949
- const tokenToEventCategoryFilter = new Map([['@tools', Tools], ['@network', Network], ['@ui', Ui], ['@stream', Stream]]);
1789
+ const tokenToEventCategoryFilter = new Map([['@tools', Tools$1], ['@network', Network$1], ['@ui', Ui$1], ['@stream', Stream$1]]);
1950
1790
  const parseFilterValue = filterValue => {
1951
1791
  const normalizedFilter = filterValue.trim().toLowerCase();
1952
1792
  if (!normalizedFilter) {
1953
1793
  return {
1954
- eventCategoryFilter: All,
1794
+ eventCategoryFilter: All$1,
1955
1795
  filterText: ''
1956
1796
  };
1957
1797
  }
1958
1798
  const parts = normalizedFilter.split(RE_SPACE);
1959
- const eventCategoryFilter = parts.map(part => tokenToEventCategoryFilter.get(part)).find(Boolean) || All;
1799
+ const eventCategoryFilter = parts.map(part => tokenToEventCategoryFilter.get(part)).find(Boolean) || All$1;
1960
1800
  const filterText = parts.filter(part => !tokenToEventCategoryFilter.has(part)).join(' ');
1961
1801
  return {
1962
1802
  eventCategoryFilter,
@@ -1964,6 +1804,22 @@ const parseFilterValue = filterValue => {
1964
1804
  };
1965
1805
  };
1966
1806
 
1807
+ const hasDetailTab = (detailTabs, value) => {
1808
+ return detailTabs.some(detailTab => detailTab.name === value);
1809
+ };
1810
+
1811
+ const selectDetailTab$1 = (detailTabs, selectedDetailTab) => {
1812
+ if (!hasDetailTab(detailTabs, selectedDetailTab)) {
1813
+ return detailTabs;
1814
+ }
1815
+ return detailTabs.map(detailTab => {
1816
+ return {
1817
+ ...detailTab,
1818
+ isSelected: detailTab.name === selectedDetailTab
1819
+ };
1820
+ });
1821
+ };
1822
+
1967
1823
  const Type = 'type';
1968
1824
  const Method = 'method';
1969
1825
  const Duration = 'duration';
@@ -2140,7 +1996,7 @@ const isTableColumnWidths = value => {
2140
1996
  return isFiniteNumber(record.type) && isFiniteNumber(record.method) && isFiniteNumber(record.duration) && isFiniteNumber(record.status);
2141
1997
  };
2142
1998
 
2143
- const validEventCategoryFilters = new Set([All, Network, Stream, Tools, Ui]);
1999
+ const validEventCategoryFilters = new Set([All$1, Network$1, Stream$1, Tools$1, Ui$1]);
2144
2000
  const isSavedState = value => {
2145
2001
  return typeof value === 'object' && value !== null;
2146
2002
  };
@@ -2207,6 +2063,145 @@ const {
2207
2063
  wrapGetter
2208
2064
  } = create$1();
2209
2065
 
2066
+ const getSafeSelectedDetailTab = selectedDetailTab => {
2067
+ return isDetailTab(selectedDetailTab) ? selectedDetailTab : Response$1;
2068
+ };
2069
+
2070
+ const isHeadersRecord$1 = value => {
2071
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
2072
+ };
2073
+ const hasHeadersDetails = event => {
2074
+ return event.type === 'ai-request' && isHeadersRecord$1(event.headers);
2075
+ };
2076
+
2077
+ const hasTimingDetails = event => {
2078
+ const hasDuration = typeof event.duration === 'number' || typeof event.durationMs === 'number';
2079
+ const hasStart = event.started !== undefined || event.startTime !== undefined || event.startTimestamp !== undefined;
2080
+ const hasEnd = event.ended !== undefined || event.endTime !== undefined || event.endTimestamp !== undefined;
2081
+ return hasDuration || hasStart && hasEnd;
2082
+ };
2083
+
2084
+ const getResponseEvent = event => {
2085
+ const {
2086
+ responseEvent
2087
+ } = event;
2088
+ if (responseEvent && typeof responseEvent === 'object' && typeof responseEvent.type === 'string') {
2089
+ const mergedResponseEvent = responseEvent;
2090
+ if (mergedResponseEvent.value !== undefined) {
2091
+ return mergedResponseEvent.value;
2092
+ }
2093
+ return responseEvent;
2094
+ }
2095
+ return event;
2096
+ };
2097
+
2098
+ const isObject = value => {
2099
+ return typeof value === 'object' && value !== null;
2100
+ };
2101
+ const getNumber = (value, ...keys) => {
2102
+ for (const key of keys) {
2103
+ if (typeof value[key] === 'number') {
2104
+ return value[key];
2105
+ }
2106
+ }
2107
+ return undefined;
2108
+ };
2109
+ const getUsage = event => {
2110
+ const responseEvent = getResponseEvent(event);
2111
+ if (isObject(responseEvent) && isObject(responseEvent.usage)) {
2112
+ return responseEvent.usage;
2113
+ }
2114
+ if (isObject(responseEvent) && isObject(responseEvent.value) && isObject(responseEvent.value.usage)) {
2115
+ return responseEvent.value.usage;
2116
+ }
2117
+ return undefined;
2118
+ };
2119
+ const getTokenUsageDetails = event => {
2120
+ const usage = getUsage(event);
2121
+ if (!usage) {
2122
+ return undefined;
2123
+ }
2124
+ const inputTokens = getNumber(usage, 'input_tokens', 'inputTokens');
2125
+ const outputTokens = getNumber(usage, 'output_tokens', 'outputTokens');
2126
+ let inputTokenDetails;
2127
+ if (isObject(usage.input_tokens_details)) {
2128
+ inputTokenDetails = usage.input_tokens_details;
2129
+ } else if (isObject(usage.inputTokensDetails)) {
2130
+ inputTokenDetails = usage.inputTokensDetails;
2131
+ }
2132
+ const cachedTokens = inputTokenDetails ? getNumber(inputTokenDetails, 'cached_tokens', 'cachedTokens') : getNumber(usage, 'cached_tokens', 'cachedTokens');
2133
+ if (inputTokens === undefined && outputTokens === undefined && cachedTokens === undefined) {
2134
+ return undefined;
2135
+ }
2136
+ return {
2137
+ ...(cachedTokens === undefined ? undefined : {
2138
+ cachedTokens
2139
+ }),
2140
+ ...(inputTokens === undefined ? undefined : {
2141
+ inputTokens
2142
+ }),
2143
+ ...(outputTokens === undefined ? undefined : {
2144
+ outputTokens
2145
+ })
2146
+ };
2147
+ };
2148
+
2149
+ const hasTokenUsageDetails = event => {
2150
+ return getTokenUsageDetails(event) !== undefined;
2151
+ };
2152
+
2153
+ const createDetailTabs = (selectedDetailTab = Response$1, event) => {
2154
+ const hasHeadersTab = event ? hasHeadersDetails(event) : false;
2155
+ const hasTokensTab = event ? hasTokenUsageDetails(event) : false;
2156
+ const hasTimingTab = event ? hasTimingDetails(event) : true;
2157
+ const safeSelectedDetailTab = getSafeSelectedDetailTab(selectedDetailTab);
2158
+ let normalizedSelectedDetailTab = safeSelectedDetailTab;
2159
+ if (!hasHeadersTab && normalizedSelectedDetailTab === Headers$1) {
2160
+ normalizedSelectedDetailTab = Response$1;
2161
+ }
2162
+ if (!hasTokensTab && normalizedSelectedDetailTab === Tokens$1) {
2163
+ normalizedSelectedDetailTab = Response$1;
2164
+ }
2165
+ if (!hasTimingTab && normalizedSelectedDetailTab === Timing$1) {
2166
+ normalizedSelectedDetailTab = Response$1;
2167
+ }
2168
+ const detailTabs = [{
2169
+ isSelected: normalizedSelectedDetailTab === Preview$1,
2170
+ label: preview(),
2171
+ name: Preview$1
2172
+ }, {
2173
+ isSelected: normalizedSelectedDetailTab === Payload$1,
2174
+ label: payload(),
2175
+ name: Payload$1
2176
+ }, {
2177
+ isSelected: normalizedSelectedDetailTab === Response$1,
2178
+ label: response(),
2179
+ name: Response$1
2180
+ }];
2181
+ if (hasHeadersTab) {
2182
+ detailTabs.push({
2183
+ isSelected: normalizedSelectedDetailTab === Headers$1,
2184
+ label: headers(),
2185
+ name: Headers$1
2186
+ });
2187
+ }
2188
+ if (hasTokensTab) {
2189
+ detailTabs.push({
2190
+ isSelected: normalizedSelectedDetailTab === Tokens$1,
2191
+ label: tokens(),
2192
+ name: Tokens$1
2193
+ });
2194
+ }
2195
+ if (hasTimingTab) {
2196
+ detailTabs.push({
2197
+ isSelected: normalizedSelectedDetailTab === Timing$1,
2198
+ label: timing(),
2199
+ name: Timing$1
2200
+ });
2201
+ }
2202
+ return detailTabs;
2203
+ };
2204
+
2210
2205
  const toTimeNumber = value => {
2211
2206
  if (typeof value === 'number' && Number.isFinite(value)) {
2212
2207
  return value;
@@ -2465,6 +2460,18 @@ const diff2 = uid => {
2465
2460
  return diff(oldState, newState);
2466
2461
  };
2467
2462
 
2463
+ const getSelectedDetailTab = detailTabs => {
2464
+ const selectedDetailTab = detailTabs.find(detailTab => detailTab.isSelected);
2465
+ if (selectedDetailTab) {
2466
+ return selectedDetailTab.name;
2467
+ }
2468
+ const responseTab = detailTabs.find(detailTab => detailTab.name === Response$1);
2469
+ if (responseTab) {
2470
+ return responseTab.name;
2471
+ }
2472
+ return detailTabs[0]?.name ?? Response$1;
2473
+ };
2474
+
2468
2475
  const filterEventsByTimelineRange = (events, startValue, endValue) => {
2469
2476
  const eventsWithTime = getEventsWithTime(events);
2470
2477
  if (eventsWithTime.length === 0) {
@@ -2677,20 +2684,20 @@ const isUiEvent = event => {
2677
2684
 
2678
2685
  const matchesSingleEventCategoryFilter = (event, eventCategoryFilter) => {
2679
2686
  switch (eventCategoryFilter) {
2680
- case Network:
2687
+ case Network$1:
2681
2688
  return isNetworkEvent(event);
2682
- case Stream:
2689
+ case Stream$1:
2683
2690
  return isStreamEvent(event);
2684
- case Tools:
2691
+ case Tools$1:
2685
2692
  return isToolEvent(event);
2686
- case Ui:
2693
+ case Ui$1:
2687
2694
  return isUiEvent(event);
2688
2695
  default:
2689
2696
  return true;
2690
2697
  }
2691
2698
  };
2692
2699
  const matchesEventCategoryFilter = (event, eventCategoryFilters) => {
2693
- if (eventCategoryFilters.length === 0 || eventCategoryFilters.includes(All)) {
2700
+ if (eventCategoryFilters.length === 0 || eventCategoryFilters.includes(All$1)) {
2694
2701
  return true;
2695
2702
  }
2696
2703
  return eventCategoryFilters.some(eventCategoryFilter => matchesSingleEventCategoryFilter(event, eventCategoryFilter));
@@ -2700,7 +2707,7 @@ const getFilteredEvents = (events, filterValue, eventCategoryFilters, showInputE
2700
2707
  const visibleEvents = getVisibleEvents(events, showInputEvents, showResponsePartEvents, showEventStreamFinishedEvents);
2701
2708
  const collapsedEvents = collapseToolExecutionEvents(visibleEvents);
2702
2709
  const parsedFilter = parseFilterValue(filterValue);
2703
- const activeEventCategoryFilters = parsedFilter.eventCategoryFilter === All ? eventCategoryFilters : [parsedFilter.eventCategoryFilter];
2710
+ const activeEventCategoryFilters = parsedFilter.eventCategoryFilter === All$1 ? eventCategoryFilters : [parsedFilter.eventCategoryFilter];
2704
2711
  const filteredByCategory = collapsedEvents.filter(event => matchesEventCategoryFilter(event, activeEventCategoryFilters));
2705
2712
  const {
2706
2713
  filterText
@@ -3127,7 +3134,15 @@ const selectEventAtIndexDependencies = {
3127
3134
  };
3128
3135
  const getCurrentEvents$1 = state => getCurrentEvents$2(state);
3129
3136
  const selectEventAtIndex = async (state, selectedEventIndex, dependencies = selectEventAtIndexDependencies) => {
3130
- const selectedDetailTab = getSelectedDetailTab(state.detailTabs);
3137
+ const {
3138
+ databaseName,
3139
+ dataBaseVersion,
3140
+ detailTabs,
3141
+ eventStoreName,
3142
+ sessionId,
3143
+ sessionIdIndexName
3144
+ } = state;
3145
+ const selectedDetailTab = getSelectedDetailTab(detailTabs);
3131
3146
  const currentEvents = getCurrentEvents$1(state);
3132
3147
  const selectedEvent = currentEvents[selectedEventIndex];
3133
3148
  if (!selectedEvent) {
@@ -3146,7 +3161,7 @@ const selectEventAtIndex = async (state, selectedEventIndex, dependencies = sele
3146
3161
  selectedEventIndex
3147
3162
  };
3148
3163
  }
3149
- const selectedEventDetails = await dependencies.loadSelectedEvent(state.databaseName, state.dataBaseVersion, state.eventStoreName, state.sessionId, state.sessionIdIndexName, selectedEvent.eventId, selectedEvent.type);
3164
+ const selectedEventDetails = await dependencies.loadSelectedEvent(databaseName, dataBaseVersion, eventStoreName, sessionId, sessionIdIndexName, selectedEvent.eventId, selectedEvent.type);
3150
3165
  const resolvedSelectedEvent = await withPreparedSelectedEventPreview(mergeSelectedEventDetails(selectedEvent, selectedEventDetails));
3151
3166
  return withSelectedEventVisible({
3152
3167
  ...state,
@@ -3210,6 +3225,12 @@ const getMenuEntriesTableBody = props => {
3210
3225
  flags: None$1,
3211
3226
  id: 'copy',
3212
3227
  label: copy()
3228
+ }, {
3229
+ args: [props.eventIndex],
3230
+ command: 'ChatDebug.handleTableRowOpenInNewTab',
3231
+ flags: None$1,
3232
+ id: 'open-in-new-tab',
3233
+ label: openInNewTab()
3213
3234
  }];
3214
3235
  };
3215
3236
 
@@ -3312,9 +3333,51 @@ const getMenuIds = () => {
3312
3333
  return [MenuChatDebugTableHeader, MenuChatDebugTableBody, 556, 557];
3313
3334
  };
3314
3335
 
3336
+ const getResponseMap = events => {
3337
+ const seen = Object.create(null);
3338
+ for (const event of events) {
3339
+ if (event.type === 'ai-response' && 'requestId' in event && typeof event.requestId === 'string') {
3340
+ seen[event.requestId] = event;
3341
+ }
3342
+ }
3343
+ return seen;
3344
+ };
3345
+
3346
+ const toPrettyEvents = rawEvents => {
3347
+ if (rawEvents.type === 'error') {
3348
+ return [];
3349
+ }
3350
+ const pretty = [];
3351
+ const map = getResponseMap(rawEvents.events);
3352
+ for (const item of rawEvents.events) {
3353
+ if (item.type === 'ai-request' && 'requestId' in item && typeof item.requestId === 'string') {
3354
+ const response = map[item.requestId];
3355
+ if (response) {
3356
+ pretty.push({
3357
+ eventId: item.eventId,
3358
+ type: 'ai-request-response'
3359
+ });
3360
+ } else {
3361
+ pretty.push(item);
3362
+ }
3363
+ } else if (item.type === 'ai-response' && 'requestId' in item && typeof item.requestId === 'string') ; else {
3364
+ pretty.push(item);
3365
+ }
3366
+ }
3367
+ return pretty;
3368
+ };
3369
+
3315
3370
  const listChatViewEvents = async (sessionId, _databaseName, _dataBaseVersion, _eventStoreName, _sessionIdIndexName) => {
3316
3371
  try {
3317
- return await listChatViewEvents$1(sessionId);
3372
+ const rawEvents = await listChatViewEvents$1(sessionId);
3373
+ if (rawEvents.type === 'error') {
3374
+ return rawEvents;
3375
+ }
3376
+ const prettyEvents = toPrettyEvents(rawEvents);
3377
+ return {
3378
+ events: prettyEvents,
3379
+ type: 'success'
3380
+ };
3318
3381
  } catch (error) {
3319
3382
  return {
3320
3383
  error,
@@ -3724,7 +3787,7 @@ const handleEventCategoryFilter$1 = (state, value, ctrlKey = false, metaKey = fa
3724
3787
  const {
3725
3788
  categoryFilters
3726
3789
  } = state;
3727
- const newCategoryFilters = selectCategoryFilter(categoryFilters, value || All, ctrlKey || metaKey);
3790
+ const newCategoryFilters = selectCategoryFilter(categoryFilters, value || All$1, ctrlKey || metaKey);
3728
3791
  if (newCategoryFilters === categoryFilters) {
3729
3792
  return state;
3730
3793
  }
@@ -3845,7 +3908,7 @@ const handleFilter = (state, value) => {
3845
3908
  });
3846
3909
  };
3847
3910
  const handleEventCategoryFilter = (state, value) => {
3848
- const categoryFilters = selectCategoryFilter(state.categoryFilters, value || All);
3911
+ const categoryFilters = selectCategoryFilter(state.categoryFilters, value || All$1);
3849
3912
  if (categoryFilters === state.categoryFilters) {
3850
3913
  return state;
3851
3914
  }
@@ -3931,7 +3994,7 @@ const handleDetailTab = (state, value) => {
3931
3994
  };
3932
3995
  };
3933
3996
  const inputHandlers = {
3934
- [CloseDetails]: handleCloseDetails,
3997
+ [CloseDetails$1]: handleCloseDetails,
3935
3998
  [DetailTab]: handleDetailTab,
3936
3999
  [EventCategoryFilter]: handleEventCategoryFilter,
3937
4000
  [Filter]: handleFilter,
@@ -4552,6 +4615,20 @@ const handleTableRowCopy = async (state, eventIndex) => {
4552
4615
  return state;
4553
4616
  };
4554
4617
 
4618
+ const toDataUri = text => {
4619
+ return `data:application/json,${encodeURIComponent(text)}`;
4620
+ };
4621
+ const handleTableRowOpenInNewTab = async (state, eventIndex) => {
4622
+ const currentEvents = getCurrentEvents$1(state);
4623
+ const event = currentEvents[eventIndex];
4624
+ if (!event) {
4625
+ return state;
4626
+ }
4627
+ const text = JSON.stringify(event, null, 2);
4628
+ await openUri(toDataUri(text));
4629
+ return state;
4630
+ };
4631
+
4555
4632
  const getHandleOffsetAndPercent = (tableBodyHeight, scrollBarHeight, relativeY) => {
4556
4633
  const halfScrollBarHeight = scrollBarHeight / 2;
4557
4634
  if (relativeY <= halfScrollBarHeight) {
@@ -4939,13 +5016,13 @@ const getLineCount = state => {
4939
5016
  return 0;
4940
5017
  }
4941
5018
  const selectedDetailTab = getSelectedDetailTab(state.detailTabs);
4942
- if (selectedDetailTab === Timing || selectedDetailTab === Tokens) {
5019
+ if (selectedDetailTab === Timing$1 || selectedDetailTab === Tokens$1) {
4943
5020
  return 0;
4944
5021
  }
4945
- if (selectedDetailTab === Preview) {
5022
+ if (selectedDetailTab === Preview$1) {
4946
5023
  return getPreviewLineCount(selectedEvent);
4947
5024
  }
4948
- if (selectedDetailTab === Payload) {
5025
+ if (selectedDetailTab === Payload$1) {
4949
5026
  return getJsonLineCount(getPayloadEvent(selectedEvent));
4950
5027
  }
4951
5028
  return getJsonLineCount(getResponseEvent(selectedEvent));
@@ -5738,10 +5815,10 @@ const refreshButtonDom = [{
5738
5815
  'aria-label': refreshEvents$1(),
5739
5816
  childCount: 1,
5740
5817
  className: ChatDebugViewRefreshButton,
5741
- name: Refresh,
5818
+ name: Refresh$1,
5742
5819
  onClick: HandleClickRefresh,
5743
5820
  type: Button$1,
5744
- value: Refresh
5821
+ value: Refresh$1
5745
5822
  }, text(refresh$1())];
5746
5823
  const getRefreshButtonDom = () => {
5747
5824
  return refreshButtonDom;
@@ -5803,7 +5880,7 @@ const detailsCloseButtonDom = [{
5803
5880
  'aria-label': closeDetails(),
5804
5881
  childCount: 1,
5805
5882
  className: ChatDebugViewDetailsClose,
5806
- name: CloseDetails,
5883
+ name: CloseDetails$1,
5807
5884
  onChange: HandleCloseDetails,
5808
5885
  onClick: HandleCloseDetails,
5809
5886
  type: Button$1,
@@ -5817,6 +5894,44 @@ const getDetailsCloseButtonDom = () => {
5817
5894
  return detailsCloseButtonDom;
5818
5895
  };
5819
5896
 
5897
+ const getDetailTabDom = detailTab => {
5898
+ const {
5899
+ isSelected
5900
+ } = detailTab;
5901
+ return [{
5902
+ 'aria-controls': getPanelId(detailTab.name),
5903
+ ariaSelected: isSelected,
5904
+ childCount: 1,
5905
+ className: mergeClassNames(PanelTab, isSelected ? PanelTabSelected : ''),
5906
+ name: detailTab.name,
5907
+ onChange: SelectDetailTab,
5908
+ onClick: SelectDetailTab,
5909
+ onFocus: HandleDetailTabsFocus,
5910
+ role: Tab,
5911
+ tabIndex: isSelected ? 0 : -1,
5912
+ type: Button$1
5913
+ }, text(detailTab.label)];
5914
+ };
5915
+
5916
+ const getTabNodes = detailTabs => {
5917
+ return [{
5918
+ 'aria-label': detailSections(),
5919
+ childCount: detailTabs.length,
5920
+ className: ChatDebugViewDetailsTabs,
5921
+ role: 'tablist',
5922
+ type: Div
5923
+ }, ...detailTabs.flatMap(getDetailTabDom)];
5924
+ };
5925
+
5926
+ const getDetailsTopVirtualDom = detailTabs => {
5927
+ return [{
5928
+ childCount: 2,
5929
+ className: ChatDebugViewDetailsTop,
5930
+ onContextMenu: HandleDetailsTopContextMenu,
5931
+ type: Div
5932
+ }, ...getDetailsCloseButtonDom(), ...getTabNodes(detailTabs)];
5933
+ };
5934
+
5820
5935
  const getNormalizedDetailTabs = (selectedEvent, detailTabs) => {
5821
5936
  if (selectedEvent === null) {
5822
5937
  return detailTabs;
@@ -6993,53 +7108,24 @@ const getTokenUsageContentNodes = (responseEventNodes, selectedEvent) => {
6993
7108
  };
6994
7109
 
6995
7110
  const getSelectedContentNodes = (safeSelectedDetailTab, previewEventNodes, payloadEventNodes, responseEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization) => {
6996
- if (safeSelectedDetailTab === Tokens) {
7111
+ if (safeSelectedDetailTab === Tokens$1) {
6997
7112
  return getTokenUsageContentNodes(responseEventNodes, selectedEvent);
6998
7113
  }
6999
- if (safeSelectedDetailTab === Timing) {
7114
+ if (safeSelectedDetailTab === Timing$1) {
7000
7115
  return getTimingContentNodes(responseEventNodes, selectedEvent);
7001
7116
  }
7002
- if (safeSelectedDetailTab === Preview) {
7117
+ if (safeSelectedDetailTab === Preview$1) {
7003
7118
  return getPreviewContentNodes(previewEventNodes, selectedEvent, previewTextCursorRowIndex, previewTextCursorColumnIndex, previewVirtualization);
7004
7119
  }
7005
- if (safeSelectedDetailTab === Payload) {
7120
+ if (safeSelectedDetailTab === Payload$1) {
7006
7121
  return getPayloadContentNodes(payloadEventNodes, selectedEvent);
7007
7122
  }
7008
- if (safeSelectedDetailTab === Headers) {
7123
+ if (safeSelectedDetailTab === Headers$1) {
7009
7124
  return getHeadersContentNodes(responseEventNodes, selectedEvent);
7010
7125
  }
7011
7126
  return getResponseContentNodes(responseEventNodes, selectedEvent);
7012
7127
  };
7013
7128
 
7014
- const getDetailTabDom = detailTab => {
7015
- const {
7016
- isSelected
7017
- } = detailTab;
7018
- return [{
7019
- 'aria-controls': getPanelId(detailTab.name),
7020
- ariaSelected: isSelected,
7021
- childCount: 1,
7022
- className: mergeClassNames(PanelTab, isSelected ? PanelTabSelected : ''),
7023
- name: detailTab.name,
7024
- onChange: SelectDetailTab,
7025
- onClick: SelectDetailTab,
7026
- onFocus: HandleDetailTabsFocus,
7027
- role: Tab,
7028
- tabIndex: isSelected ? 0 : -1,
7029
- type: Button$1
7030
- }, text(detailTab.label)];
7031
- };
7032
-
7033
- const getTabNodes = detailTabs => {
7034
- return [{
7035
- 'aria-label': detailSections(),
7036
- childCount: detailTabs.length,
7037
- className: ChatDebugViewDetailsTabs,
7038
- role: 'tablist',
7039
- type: Div
7040
- }, ...detailTabs.flatMap(getDetailTabDom)];
7041
- };
7042
-
7043
7129
  const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes, responseEventNodes = payloadEventNodes, selectedEvent = null, detailTabs = createDetailTabs(), previewTextCursorRowIndex = null, previewTextCursorColumnIndex = null, previewVirtualization) => {
7044
7130
  if (previewEventNodes.length === 0 && payloadEventNodes.length === 0 && responseEventNodes.length === 0) {
7045
7131
  return [];
@@ -7052,12 +7138,7 @@ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes,
7052
7138
  childCount: 2,
7053
7139
  className: ChatDebugViewDetails,
7054
7140
  type: Section
7055
- }, {
7056
- childCount: 2,
7057
- className: ChatDebugViewDetailsTop,
7058
- onContextMenu: HandleDetailsTopContextMenu,
7059
- type: Div
7060
- }, ...getDetailsCloseButtonDom(), ...getTabNodes(normalizedDetailTabs), ...getDetailContentDom(selectedDetailTab, safeSelectedDetailTab, contentNodes)];
7141
+ }, ...getDetailsTopVirtualDom(normalizedDetailTabs), ...getDetailContentDom(selectedDetailTab, safeSelectedDetailTab, contentNodes)];
7061
7142
  };
7062
7143
 
7063
7144
  const getMethods = new Set(['list_dir', 'list_files', 'read_file']);
@@ -7629,7 +7710,7 @@ const getTopLevelChildCount = nodes => {
7629
7710
  return count;
7630
7711
  };
7631
7712
  const getEventCategoryFilterDescription = eventCategoryFilters => {
7632
- if (eventCategoryFilters.length === 0 || eventCategoryFilters.includes(All)) {
7713
+ if (eventCategoryFilters.length === 0 || eventCategoryFilters.includes(All$1)) {
7633
7714
  return '';
7634
7715
  }
7635
7716
  return eventCategoryFilters.map(eventCategoryFilter => getEventCategoryFilterLabel(eventCategoryFilter).toLowerCase()).join(', ');
@@ -7654,7 +7735,7 @@ const getChatDebugViewDom = (errorMessage, filterValue, eventCategoryFilters, ca
7654
7735
  const hasFilterValue = filterDescriptionParts.length > 0;
7655
7736
  const filterDescription = filterDescriptionParts.join(' ');
7656
7737
  const noFilteredEventsMessage = noEventsFoundMatching(filterDescription);
7657
- const useNoToolCallEventsMessage = eventCategoryFilters.length === 1 && eventCategoryFilters[0] === Tools && !trimmedFilterValue && !hasTimelineFilter;
7738
+ const useNoToolCallEventsMessage = eventCategoryFilters.length === 1 && eventCategoryFilters[0] === Tools$1 && !trimmedFilterValue && !hasTimelineFilter;
7658
7739
  const emptyMessage = getEmptyMessage(events.length, hasFilterValue, useNoToolCallEventsMessage, noFilteredEventsMessage);
7659
7740
  const safeSelectedEventIndex = selectedEventIndex === null || selectedEventIndex < 0 || selectedEventIndex >= events.length ? null : selectedEventIndex;
7660
7741
  if (useDevtoolsLayout) {
@@ -8093,6 +8174,7 @@ const commandMap = {
8093
8174
  'ChatDebug.handleTableResizerPointerMove': wrapCommand(handleTableResizerPointerMove),
8094
8175
  'ChatDebug.handleTableResizerPointerUp': wrapCommand(handleTableResizerPointerUp),
8095
8176
  'ChatDebug.handleTableRowCopy': wrapCommand(handleTableRowCopy),
8177
+ 'ChatDebug.handleTableRowOpenInNewTab': wrapCommand(handleTableRowOpenInNewTab),
8096
8178
  'ChatDebug.handleTableScrollBarPointerDown': wrapCommand(handleTableScrollBarPointerDown),
8097
8179
  'ChatDebug.handleTableScrollBarPointerMove': wrapCommand(handleTableScrollBarPointerMove),
8098
8180
  'ChatDebug.handleTableScrollBarPointerUp': wrapCommand(handleTableScrollBarPointerUp),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/chat-debug-view",
3
- "version": "10.11.0",
3
+ "version": "10.13.0",
4
4
  "description": "Chat Debug View Worker",
5
5
  "repository": {
6
6
  "type": "git",