@lvce-editor/chat-debug-view 10.17.0 → 10.18.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.
@@ -1471,6 +1471,7 @@ const FailedToLoadChatDebugSession = 'Failed to load chat debug session "{PH1}".
1471
1471
  const FailedToLoadChatDebugSessionWithError = 'Failed to load chat debug session "{PH1}": {PH2}';
1472
1472
  const FilterEvents = 'Filter events';
1473
1473
  const FromSeconds = 'from {PH1}s';
1474
+ const General = 'General';
1474
1475
  const Headers = 'Headers';
1475
1476
  const ImageCouldNotBeLoaded = 'image could not be loaded';
1476
1477
  const InputTokens = 'Input Tokens';
@@ -1492,10 +1493,15 @@ const Preview = 'Preview';
1492
1493
  const Refresh = 'Refresh';
1493
1494
  const RefreshEvents = 'Refresh events';
1494
1495
  const ResetColumns = 'Reset columns';
1496
+ const RequestHeaders = 'Request Headers';
1497
+ const RequestMethod = 'Request Method';
1498
+ const RequestUrl = 'Request URL';
1495
1499
  const Response = 'Response';
1500
+ const ResponseHeaders = 'Response Headers';
1496
1501
  const SecondsRange = '{PH1}s-{PH2}s';
1497
1502
  const Started = 'Started';
1498
1503
  const Status$2 = 'Status';
1504
+ const StatusCode = 'Status Code';
1499
1505
  const Stream = 'Stream';
1500
1506
  const TableSummaryPlural = '{PH1} events, {PH2} from start to finish';
1501
1507
  const TableSummarySingular = '{PH1} event, {PH2} from start to finish';
@@ -1556,6 +1562,9 @@ const fromSeconds = seconds => {
1556
1562
  PH1: seconds
1557
1563
  });
1558
1564
  };
1565
+ const general = () => {
1566
+ return i18nString(General);
1567
+ };
1559
1568
  const headers = () => {
1560
1569
  return i18nString(Headers);
1561
1570
  };
@@ -1617,6 +1626,18 @@ const refresh$1 = () => {
1617
1626
  const refreshEvents$1 = () => {
1618
1627
  return i18nString(RefreshEvents);
1619
1628
  };
1629
+ const requestHeaders = () => {
1630
+ return i18nString(RequestHeaders);
1631
+ };
1632
+ const requestMethod = () => {
1633
+ return i18nString(RequestMethod);
1634
+ };
1635
+ const requestUrl = () => {
1636
+ return i18nString(RequestUrl);
1637
+ };
1638
+ const responseHeaders = () => {
1639
+ return i18nString(ResponseHeaders);
1640
+ };
1620
1641
  const resetColumns = () => {
1621
1642
  return i18nString(ResetColumns);
1622
1643
  };
@@ -1635,6 +1656,9 @@ const started = () => {
1635
1656
  const stream = () => {
1636
1657
  return i18nString(Stream);
1637
1658
  };
1659
+ const statusCode = () => {
1660
+ return i18nString(StatusCode);
1661
+ };
1638
1662
  const timing = () => {
1639
1663
  return i18nString(Timing);
1640
1664
  };
@@ -2071,7 +2095,13 @@ const isHeadersRecord$1 = value => {
2071
2095
  return typeof value === 'object' && value !== null && !Array.isArray(value);
2072
2096
  };
2073
2097
  const hasHeadersDetails = event => {
2074
- return event.type === 'ai-request' && isHeadersRecord$1(event.headers);
2098
+ if (event.type !== 'ai-request') {
2099
+ return false;
2100
+ }
2101
+ if (isHeadersRecord$1(event.headers)) {
2102
+ return true;
2103
+ }
2104
+ return isHeadersRecord$1(event.endValue) && isHeadersRecord$1(event.endValue.headers);
2075
2105
  };
2076
2106
 
2077
2107
  const hasTimingDetails = event => {
@@ -2082,6 +2112,11 @@ const hasTimingDetails = event => {
2082
2112
  };
2083
2113
 
2084
2114
  const getResponseEvent = event => {
2115
+ // @ts-ignore
2116
+ if (event && event.endValue && event.endValue.value) {
2117
+ // @ts-ignore
2118
+ return event.endValue.value;
2119
+ }
2085
2120
  const {
2086
2121
  responseEvent
2087
2122
  } = event;
@@ -2891,7 +2926,12 @@ const getSelectedDetailTab = detailTabs => {
2891
2926
  return detailTabs[0]?.name ?? Response$1;
2892
2927
  };
2893
2928
 
2894
- const loadSelectedEvent = async (_databaseName, _dataBaseVersion, _eventStoreName, sessionId, _sessionIdIndexName, eventId, type, endEventId) => {
2929
+ const loadSelectedEvent = async ({
2930
+ endEventId,
2931
+ eventId,
2932
+ sessionId,
2933
+ type
2934
+ }) => {
2895
2935
  const raw = await loadSelectedEvent$1(sessionId, eventId, type);
2896
2936
  if (endEventId && endEventId !== -1) {
2897
2937
  const end = await loadSelectedEvent$1(sessionId, endEventId, type);
@@ -3161,12 +3201,8 @@ const withPreparedSelectedEventPreview = async event => {
3161
3201
 
3162
3202
  const selectEventAtIndex = async (state, selectedEventIndex) => {
3163
3203
  const {
3164
- databaseName,
3165
- dataBaseVersion,
3166
3204
  detailTabs,
3167
- eventStoreName,
3168
- sessionId,
3169
- sessionIdIndexName
3205
+ sessionId
3170
3206
  } = state;
3171
3207
  const selectedDetailTab = getSelectedDetailTab(detailTabs);
3172
3208
  const currentEvents = getCurrentEvents$1(state);
@@ -3187,9 +3223,13 @@ const selectEventAtIndex = async (state, selectedEventIndex) => {
3187
3223
  selectedEventIndex
3188
3224
  };
3189
3225
  }
3190
- const selectedEventDetails = await loadSelectedEvent(databaseName, dataBaseVersion, eventStoreName, sessionId, sessionIdIndexName, selectedEvent.eventId, selectedEvent.type,
3191
- // @ts-ignore
3192
- selectedEvent['eventEndId'] || 0);
3226
+ const selectedEventDetails = await loadSelectedEvent({
3227
+ // @ts-ignore
3228
+ endEventId: selectedEvent['eventEndId'] || 0,
3229
+ eventId: selectedEvent.eventId,
3230
+ sessionId,
3231
+ type: selectedEvent.type
3232
+ });
3193
3233
  const resolvedSelectedEvent = await withPreparedSelectedEventPreview(mergeSelectedEventDetails(selectedEvent, selectedEventDetails));
3194
3234
  return withSelectedEventVisible({
3195
3235
  ...state,
@@ -3378,19 +3418,40 @@ const getMergedRequestResponseEvent = (item, response) => {
3378
3418
  const parsedStart = new Date(item.timestamp || '');
3379
3419
  const parsedEnd = new Date(response.timestamp || '');
3380
3420
  const durationMs = parsedEnd.getTime() - parsedStart.getTime();
3421
+ const started = getStartedTimestamp(item);
3422
+ const ended = getEndedTimestamp(response);
3423
+ const timestamp = item.timestamp ?? started;
3381
3424
  if (Number.isFinite(durationMs) && durationMs >= 0) {
3382
3425
  return {
3383
3426
  durationMs,
3427
+ ...(ended === undefined ? {} : {
3428
+ ended
3429
+ }),
3384
3430
  eventEndId: response.eventId,
3385
3431
  eventId: item.eventId,
3386
3432
  method: 'POST',
3433
+ ...(started === undefined ? {} : {
3434
+ started
3435
+ }),
3436
+ ...(timestamp === undefined ? {} : {
3437
+ timestamp
3438
+ }),
3387
3439
  type: 'ai-request-response'
3388
3440
  };
3389
3441
  }
3390
3442
  return {
3443
+ ...(ended === undefined ? {} : {
3444
+ ended
3445
+ }),
3391
3446
  eventEndId: response.eventId,
3392
3447
  eventId: item.eventId,
3393
3448
  method: 'POST',
3449
+ ...(started === undefined ? {} : {
3450
+ started
3451
+ }),
3452
+ ...(timestamp === undefined ? {} : {
3453
+ timestamp
3454
+ }),
3394
3455
  type: 'ai-request-response'
3395
3456
  };
3396
3457
  };
@@ -3644,7 +3705,11 @@ const restoreSelectedEvent = async state => {
3644
3705
  selectedEventIndex: null
3645
3706
  };
3646
3707
  }
3647
- const selectedEventDetails = await loadEventsDependencies.loadSelectedEvent(state.databaseName, state.dataBaseVersion, state.eventStoreName, state.sessionId, state.sessionIdIndexName, selectedEvent.eventId, selectedEvent.type);
3708
+ const selectedEventDetails = await loadEventsDependencies.loadSelectedEvent({
3709
+ eventId: selectedEvent.eventId,
3710
+ sessionId: state.sessionId,
3711
+ type: selectedEvent.type
3712
+ });
3648
3713
  const resolvedSelectedEvent = await withPreparedSelectedEventPreview(mergeSelectedEventDetails(selectedEvent, selectedEventDetails));
3649
3714
  return {
3650
3715
  ...state,
@@ -5231,6 +5296,24 @@ const getCss = state => {
5231
5296
  width: 100%;
5232
5297
  }
5233
5298
 
5299
+ .ChatDebugViewHeadersSection {
5300
+ display: flex;
5301
+ flex-direction: column;
5302
+ }
5303
+
5304
+ .ChatDebugViewHeadersSection + .ChatDebugViewHeadersSection {
5305
+ margin-top: 16px;
5306
+ }
5307
+
5308
+ .ChatDebugViewHeadersSectionHeading {
5309
+ color: var(--vscode-descriptionForeground, rgba(255, 255, 255, 0.7));
5310
+ font-size: 11px;
5311
+ font-weight: 600;
5312
+ letter-spacing: 0.08em;
5313
+ margin-bottom: 6px;
5314
+ text-transform: uppercase;
5315
+ }
5316
+
5234
5317
  .ChatDebugViewHeadersCell {
5235
5318
  border-bottom: 1px solid var(--vscode-panel-border, rgba(255, 255, 255, 0.12));
5236
5319
  color: var(--vscode-editor-foreground);
@@ -5666,6 +5749,8 @@ const ChatDebugViewHeadersHead = 'ChatDebugViewHeadersHead';
5666
5749
  const ChatDebugViewHeadersRow = 'ChatDebugViewHeadersRow';
5667
5750
  const ChatDebugViewHeadersRowEven = 'ChatDebugViewHeadersRowEven';
5668
5751
  const ChatDebugViewHeadersRowOdd = 'ChatDebugViewHeadersRowOdd';
5752
+ const ChatDebugViewHeadersSection = 'ChatDebugViewHeadersSection';
5753
+ const ChatDebugViewHeadersSectionHeading = 'ChatDebugViewHeadersSectionHeading';
5669
5754
  const ChatDebugViewHeadersTable = 'ChatDebugViewHeadersTable';
5670
5755
  const ChatDebugViewDevtoolsSplit = 'ChatDebugViewDevtoolsSplit';
5671
5756
  const ChatDebugViewEmpty = 'ChatDebugViewEmpty';
@@ -5942,22 +6027,22 @@ const getDetailContentDom = (selectedDetailTab, safeSelectedDetailTab, contentNo
5942
6027
  }, ...contentNodes];
5943
6028
  };
5944
6029
 
5945
- const detailsCloseButtonDom = [{
5946
- 'aria-label': closeDetails(),
5947
- childCount: 1,
5948
- className: ChatDebugViewDetailsClose,
5949
- name: CloseDetails$1,
5950
- onChange: HandleCloseDetails,
5951
- onClick: HandleCloseDetails,
5952
- type: Button$1,
5953
- value: 'close'
5954
- }, {
6030
+ const icon = {
5955
6031
  childCount: 0,
5956
6032
  className: 'MaskIcon MaskIconClose',
5957
6033
  type: Div
5958
- }];
6034
+ };
5959
6035
  const getDetailsCloseButtonDom = () => {
5960
- return detailsCloseButtonDom;
6036
+ return [{
6037
+ 'aria-label': closeDetails(),
6038
+ childCount: 1,
6039
+ className: ChatDebugViewDetailsClose,
6040
+ name: CloseDetails$1,
6041
+ onChange: HandleCloseDetails,
6042
+ onClick: HandleCloseDetails,
6043
+ type: Button$1,
6044
+ value: 'close'
6045
+ }, icon];
5961
6046
  };
5962
6047
 
5963
6048
  const getDetailTabDom = detailTab => {
@@ -5989,13 +6074,14 @@ const getTabNodes = detailTabs => {
5989
6074
  }, ...detailTabs.flatMap(getDetailTabDom)];
5990
6075
  };
5991
6076
 
6077
+ const parentNode = {
6078
+ childCount: 2,
6079
+ className: ChatDebugViewDetailsTop,
6080
+ onContextMenu: HandleDetailsTopContextMenu,
6081
+ type: Div
6082
+ };
5992
6083
  const getDetailsTopVirtualDom = detailTabs => {
5993
- return [{
5994
- childCount: 2,
5995
- className: ChatDebugViewDetailsTop,
5996
- onContextMenu: HandleDetailsTopContextMenu,
5997
- type: Div
5998
- }, ...getDetailsCloseButtonDom(), ...getTabNodes(detailTabs)];
6084
+ return [parentNode, ...getDetailsCloseButtonDom(), ...getTabNodes(detailTabs)];
5999
6085
  };
6000
6086
 
6001
6087
  const getNormalizedDetailTabs = (selectedEvent, detailTabs) => {
@@ -6008,6 +6094,25 @@ const getNormalizedDetailTabs = (selectedEvent, detailTabs) => {
6008
6094
  const isHeadersRecord = value => {
6009
6095
  return typeof value === 'object' && value !== null && !Array.isArray(value);
6010
6096
  };
6097
+ const isNonEmptyString = value => {
6098
+ return typeof value === 'string' && value.length > 0;
6099
+ };
6100
+ const getStatusCodeValue = selectedEvent => {
6101
+ if (!selectedEvent) {
6102
+ return undefined;
6103
+ }
6104
+ const endValue = isHeadersRecord(selectedEvent.endValue) ? selectedEvent.endValue : undefined;
6105
+ if (endValue?.statusCode !== undefined) {
6106
+ return endValue.statusCode;
6107
+ }
6108
+ if (selectedEvent.statusCode !== undefined) {
6109
+ return selectedEvent.statusCode;
6110
+ }
6111
+ if (selectedEvent.type === 'ai-request' || selectedEvent.type === 'ai-response') {
6112
+ return getStatusText(selectedEvent);
6113
+ }
6114
+ return undefined;
6115
+ };
6011
6116
  const stringifyHeaderValue = value => {
6012
6117
  try {
6013
6118
  return JSON.stringify(value, (_key, nestedValue) => {
@@ -6041,11 +6146,28 @@ const getHeaderValueText = value => {
6041
6146
  }
6042
6147
  return stringifyHeaderValue(value);
6043
6148
  };
6044
- const getHeaders = selectedEvent => {
6045
- if (selectedEvent === null || !isHeadersRecord(selectedEvent.headers)) {
6149
+ const getHeaders = value => {
6150
+ if (!isHeadersRecord(value)) {
6046
6151
  return [];
6047
6152
  }
6048
- return Object.entries(selectedEvent.headers);
6153
+ return Object.entries(value);
6154
+ };
6155
+ const getGeneralEntries = selectedEvent => {
6156
+ if (!selectedEvent) {
6157
+ return [];
6158
+ }
6159
+ const entries = [];
6160
+ if (isNonEmptyString(selectedEvent.url)) {
6161
+ entries.push([requestUrl(), selectedEvent.url]);
6162
+ }
6163
+ if (isNonEmptyString(selectedEvent.method)) {
6164
+ entries.push([requestMethod(), selectedEvent.method]);
6165
+ }
6166
+ const statusCode$1 = getStatusCodeValue(selectedEvent);
6167
+ if (statusCode$1 !== undefined && statusCode$1 !== '') {
6168
+ entries.push([statusCode(), statusCode$1]);
6169
+ }
6170
+ return entries;
6049
6171
  };
6050
6172
  const getHeaderRowNodes = (headerName, headerValue, index) => {
6051
6173
  return [{
@@ -6062,11 +6184,7 @@ const getHeaderRowNodes = (headerName, headerValue, index) => {
6062
6184
  type: Td
6063
6185
  }, text(getHeaderValueText(headerValue))];
6064
6186
  };
6065
- const getHeadersContentNodes = (responseEventNodes, selectedEvent) => {
6066
- const headers = getHeaders(selectedEvent);
6067
- if (headers.length === 0) {
6068
- return responseEventNodes;
6069
- }
6187
+ const getHeadersTableNodes = headers => {
6070
6188
  const headerRows = [];
6071
6189
  for (const [index, [headerName, headerValue]] of headers.entries()) {
6072
6190
  headerRows.push(...getHeaderRowNodes(headerName, headerValue, index));
@@ -6097,6 +6215,36 @@ const getHeadersContentNodes = (responseEventNodes, selectedEvent) => {
6097
6215
  type: TBody
6098
6216
  }, ...headerRows];
6099
6217
  };
6218
+ const getHeaderSectionNodes = (label, headers) => {
6219
+ return [{
6220
+ childCount: 2,
6221
+ className: ChatDebugViewHeadersSection,
6222
+ type: Div
6223
+ }, {
6224
+ childCount: 1,
6225
+ className: ChatDebugViewHeadersSectionHeading,
6226
+ type: Div
6227
+ }, text(label), ...getHeadersTableNodes(headers)];
6228
+ };
6229
+ const getHeadersContentNodes = (responseEventNodes, selectedEvent) => {
6230
+ const generalEntries = getGeneralEntries(selectedEvent);
6231
+ const requestHeaders$1 = getHeaders(selectedEvent?.headers);
6232
+ const responseHeaders$1 = getHeaders(isHeadersRecord(selectedEvent?.endValue) ? selectedEvent.endValue.headers : undefined);
6233
+ if (generalEntries.length === 0 && requestHeaders$1.length === 0 && responseHeaders$1.length === 0) {
6234
+ return responseEventNodes;
6235
+ }
6236
+ const nodes = [];
6237
+ if (generalEntries.length > 0) {
6238
+ nodes.push(...getHeaderSectionNodes(general(), generalEntries));
6239
+ }
6240
+ if (requestHeaders$1.length > 0) {
6241
+ nodes.push(...getHeaderSectionNodes(requestHeaders(), requestHeaders$1));
6242
+ }
6243
+ if (responseHeaders$1.length > 0) {
6244
+ nodes.push(...getHeaderSectionNodes(responseHeaders(), responseHeaders$1));
6245
+ }
6246
+ return nodes;
6247
+ };
6100
6248
 
6101
6249
  const getEditorRowDom = line => {
6102
6250
  return [{
@@ -6982,7 +7130,13 @@ const getTextEvent = (previewEvent, selectedEvent, previewTextCursor, virtualiza
6982
7130
  const showLineNumbers = !isInvalidImageMessage && !isChatMessageUpdatedPreview;
6983
7131
  return getTextNode(previewEvent, showLineNumbers, showLineNumbers ? previewTextCursor ?? null : null, undefined, virtualization);
6984
7132
  };
7133
+ const isOpenAiRequestPreviewEvent = previewEvent => {
7134
+ return isRecord(previewEvent) && previewEvent.type === 'ai-request' && isRecord(previewEvent.endValue) && isRecord(previewEvent.endValue.value) && typeof previewEvent.endValue.value.output_text === 'string';
7135
+ };
6985
7136
  const getPreviewEventNodes = (previewEvent, selectedEvent, previewTextCursor, virtualization) => {
7137
+ if (isOpenAiRequestPreviewEvent(previewEvent)) {
7138
+ return getTextEvent(previewEvent.endValue.value.output_text);
7139
+ }
6986
7140
  if (typeof previewEvent === 'string') {
6987
7141
  return getTextEvent(previewEvent, selectedEvent, previewTextCursor, virtualization);
6988
7142
  }
@@ -7215,12 +7369,13 @@ const getDetailsDom = (previewEventNodes, payloadEventNodes = previewEventNodes,
7215
7369
  }, ...getDetailsTopVirtualDom(normalizedDetailTabs), ...getDetailContentDom(selectedDetailTab, safeSelectedDetailTab, contentNodes)];
7216
7370
  };
7217
7371
 
7372
+ const td$1 = {
7373
+ childCount: 1,
7374
+ className: mergeClassNames(TableCell, ChatDebugViewCellDuration),
7375
+ type: Td
7376
+ };
7218
7377
  const getCellDurationDom = event => {
7219
- return [{
7220
- childCount: 1,
7221
- className: mergeClassNames(TableCell, ChatDebugViewCellDuration),
7222
- type: Td
7223
- }, text(getEventTableDurationText(event))];
7378
+ return [td$1, text(getEventTableDurationText(event))];
7224
7379
  };
7225
7380
 
7226
7381
  const getMethods = new Set(['list_dir', 'list_files', 'read_file']);
@@ -7246,12 +7401,13 @@ const getEventTableMethodLabel = event => {
7246
7401
  return '';
7247
7402
  };
7248
7403
 
7404
+ const td = {
7405
+ childCount: 1,
7406
+ className: TableCell,
7407
+ type: Td
7408
+ };
7249
7409
  const getCellMethodDom = event => {
7250
- return [{
7251
- childCount: 1,
7252
- className: TableCell,
7253
- type: Td
7254
- }, text(getEventTableMethodLabel(event))];
7410
+ return [td, text(getEventTableMethodLabel(event))];
7255
7411
  };
7256
7412
 
7257
7413
  const getCellStatusDom = (event, isErrorStatus) => {
@@ -8065,7 +8221,7 @@ const renderEventListeners = () => {
8065
8221
  params: ['handleTimelineDoubleClick']
8066
8222
  }, {
8067
8223
  name: HandlePreviewTextPointerDown,
8068
- params: ['handlePreviewTextPointerDown', 'event.clientX - event.currentTarget.getBoundingClientRect().left', 'event.clientY - event.currentTarget.getBoundingClientRect().top']
8224
+ params: ['handlePreviewTextPointerDown']
8069
8225
  }];
8070
8226
  };
8071
8227
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/chat-debug-view",
3
- "version": "10.17.0",
3
+ "version": "10.18.0",
4
4
  "description": "Chat Debug View Worker",
5
5
  "repository": {
6
6
  "type": "git",