@sentry/junior-dashboard 0.280.0 → 0.281.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.
Files changed (81) hide show
  1. package/dist/app.js +23 -30
  2. package/dist/client-manifest.json +1 -1
  3. package/dist/index.js +23 -30
  4. package/dist/public/chunks/{AdminPage-YEKZOKH6.js → AdminPage-M5RBVZFN.js} +1 -1
  5. package/dist/public/chunks/{AutomationPage-5GS3IUAK.js → AutomationPage-WALCREDT.js} +1 -1
  6. package/dist/public/chunks/{AutomationRunsPage-IPYEZU4L.js → AutomationRunsPage-CV47E4UX.js} +1 -1
  7. package/dist/public/chunks/{AutomationsPage-HSAYPC3C.js → AutomationsPage-57L3AQVJ.js} +1 -1
  8. package/dist/public/chunks/{CodePage-IPFKXWFB.js → CodePage-XJUYMFJH.js} +1 -1
  9. package/dist/public/chunks/{ConnectionsPage-5XUEK6FS.js → ConnectionsPage-3QQAGYWF.js} +1 -1
  10. package/dist/public/chunks/{LocationDetailPage-27ETUGR6.js → LocationDetailPage-4IL5HQML.js} +1 -1
  11. package/dist/public/chunks/{LocationsPage-WOKMQAGM.js → LocationsPage-D2DUQAHJ.js} +1 -1
  12. package/dist/public/chunks/{PeoplePage-6YQLDOUL.js → PeoplePage-6F5GPQ7C.js} +1 -1
  13. package/dist/public/chunks/{PersonProfilePage-GYMAZFIK.js → PersonProfilePage-SPAYQPTD.js} +1 -1
  14. package/dist/public/chunks/{PersonalTokensPage-4BCR744B.js → PersonalTokensPage-SHAUJ74M.js} +1 -1
  15. package/dist/public/chunks/{PluginUserPage-IP6WL7MD.js → PluginUserPage-64FIWD7M.js} +1 -1
  16. package/dist/public/chunks/{RepositoryPage-TRD44LQ3.js → RepositoryPage-L7IHOXSN.js} +1 -1
  17. package/dist/public/chunks/{SettingsPage-4E3SLQ36.js → SettingsPage-U7WG4FHE.js} +1 -1
  18. package/dist/public/chunks/{SystemPage-C3XBKXKW.js → SystemPage-ZBC43OJH.js} +1 -1
  19. package/dist/public/chunks/{WorkspaceFormPage-2LS2X67Q.js → WorkspaceFormPage-3NVIIZ4P.js} +1 -1
  20. package/dist/public/chunks/{WorkspacesPage-5WB3CUTX.js → WorkspacesPage-G73HPBDD.js} +1 -1
  21. package/dist/public/chunks/{chunk-VFEBNOPX.js → chunk-2J3LGF5Q.js} +1 -1
  22. package/dist/public/chunks/chunk-2NNKHSZE.js +1 -0
  23. package/dist/public/chunks/chunk-4TQSTCIN.js +13 -0
  24. package/dist/public/chunks/chunk-64GPEGGE.js +1 -0
  25. package/dist/public/chunks/{chunk-WZVO3HG4.js → chunk-6FHY65EQ.js} +1 -1
  26. package/dist/public/chunks/{chunk-YYNMZ4WC.js → chunk-DEEO4D4N.js} +1 -1
  27. package/dist/public/chunks/{chunk-SDKV3OID.js → chunk-FSGVY7HB.js} +1 -1
  28. package/dist/public/chunks/chunk-GZBMHYYU.js +1 -0
  29. package/dist/public/chunks/{chunk-NQMDED2R.js → chunk-II4NXLSQ.js} +1 -1
  30. package/dist/public/chunks/{chunk-B6HGRBBX.js → chunk-ILH47V7O.js} +1 -1
  31. package/dist/public/chunks/{chunk-GRMX2HX6.js → chunk-JPL2NRWK.js} +1 -1
  32. package/dist/public/chunks/{chunk-NQOJAZFQ.js → chunk-JVJ5UWIK.js} +1 -1
  33. package/dist/public/chunks/{chunk-V5UDSIRA.js → chunk-K4TYMAA3.js} +1 -1
  34. package/dist/public/chunks/{chunk-EFEREKX4.js → chunk-KDUTK357.js} +1 -1
  35. package/dist/public/chunks/{chunk-RHIXHBS5.js → chunk-LZYAHJVQ.js} +1 -1
  36. package/dist/public/chunks/{chunk-5GZDBGAR.js → chunk-MKKFXRYO.js} +1 -1
  37. package/dist/public/chunks/{chunk-PEQNT5MO.js → chunk-NGQRNS3C.js} +1 -1
  38. package/dist/public/chunks/{chunk-IA6BJDKN.js → chunk-ONDKE72P.js} +1 -1
  39. package/dist/public/chunks/{chunk-WJ3OXMVX.js → chunk-PG7M7L24.js} +1 -1
  40. package/dist/public/chunks/{chunk-6GQL3EVJ.js → chunk-QQUFROWT.js} +1 -1
  41. package/dist/public/chunks/{chunk-UAH6DWNS.js → chunk-RB5FBDEY.js} +1 -1
  42. package/dist/public/chunks/{chunk-A2QWWA7O.js → chunk-RGXXD4DM.js} +1 -1
  43. package/dist/public/chunks/{chunk-AYXSBMWA.js → chunk-TC7TU4GK.js} +1 -1
  44. package/dist/public/chunks/chunk-WLIOZO3W.js +1 -0
  45. package/dist/public/chunks/{chunk-VXT3FIVL.js → chunk-XDUSY26N.js} +11 -11
  46. package/dist/public/client-4OAAOHF4.js +68 -0
  47. package/dist/tailwind.css +1 -1
  48. package/package.json +4 -4
  49. package/src/client/components/BottomSheet.tsx +1 -1
  50. package/src/client/components/DetailsPanel.tsx +2 -1
  51. package/src/client/conversations/ConversationBrief.tsx +129 -65
  52. package/src/client/conversations/ConversationDetails.tsx +13 -14
  53. package/src/client/conversations/ConversationEventLog.tsx +20 -97
  54. package/src/client/conversations/ConversationHeader.tsx +41 -26
  55. package/src/client/conversations/ConversationHeaderActions.tsx +3 -1
  56. package/src/client/conversations/ConversationLinkedWork.tsx +30 -10
  57. package/src/client/conversations/ConversationMeta.tsx +15 -15
  58. package/src/client/conversations/ConversationPage.tsx +31 -7
  59. package/src/client/conversations/ConversationTranscript.tsx +234 -186
  60. package/src/client/conversations/ConversationUsageBreakdown.tsx +142 -64
  61. package/src/client/conversations/DetailsList.tsx +7 -1
  62. package/src/client/conversations/PendingMailboxStack.tsx +88 -44
  63. package/src/client/conversations/TranscriptActivityGroup.tsx +7 -14
  64. package/src/client/conversations/TranscriptEventView.tsx +7 -3
  65. package/src/client/conversations/TranscriptReasoningView.tsx +4 -2
  66. package/src/client/conversations/TranscriptRows.tsx +37 -5
  67. package/src/client/conversations/TranscriptView.tsx +4 -0
  68. package/src/client/conversations/queries.ts +74 -43
  69. package/src/client/conversations/transcriptBottomPinning.ts +13 -5
  70. package/src/client/conversations/transcriptListRows.ts +215 -0
  71. package/src/client/conversations/virtualRows.ts +168 -0
  72. package/src/client/http.ts +6 -5
  73. package/src/client/sentry.ts +53 -3
  74. package/src/conversation-cache.ts +8 -10
  75. package/src/mock-reporting/fixtures.ts +0 -8
  76. package/dist/public/chunks/chunk-GO45RQDL.js +0 -1
  77. package/dist/public/chunks/chunk-N4AONKD3.js +0 -1
  78. package/dist/public/chunks/chunk-QNA7F7QB.js +0 -1
  79. package/dist/public/chunks/chunk-R4ORRE77.js +0 -1
  80. package/dist/public/chunks/chunk-Z2JPRGFT.js +0 -1
  81. package/dist/public/client-TYC7JKRE.js +0 -91
@@ -483,11 +483,14 @@ export function liveModelId(
483
483
  return openTurns.size > 0 ? modelId : undefined;
484
484
  }
485
485
 
486
- /** True when runtime stats have content to show in details. */
487
- export function hasConversationStats(props: {
486
+ type ConversationStatsProps = {
488
487
  conversation: Conversation | undefined;
489
488
  detail?: ConversationDetailReport;
490
- }): boolean {
489
+ showUsageBreakdown?: boolean;
490
+ };
491
+
492
+ /** True when runtime stats have content to show in details. */
493
+ export function hasConversationStats(props: ConversationStatsProps): boolean {
491
494
  return conversationStatItems(props).length > 0;
492
495
  }
493
496
 
@@ -500,10 +503,7 @@ type ConversationStatItem = {
500
503
  };
501
504
 
502
505
  /** Render runtime, source, token, and cost metadata as a labeled list. */
503
- export function ConversationStats(props: {
504
- conversation: Conversation | undefined;
505
- detail?: ConversationDetailReport;
506
- }) {
506
+ export function ConversationStats(props: ConversationStatsProps) {
507
507
  const stats = conversationStatItems(props);
508
508
  if (stats.length === 0) return null;
509
509
  return (
@@ -576,10 +576,9 @@ export function conversationCost(
576
576
  );
577
577
  }
578
578
 
579
- function conversationStatItems(props: {
580
- conversation: Conversation | undefined;
581
- detail?: ConversationDetailReport;
582
- }): ConversationStatItem[] {
579
+ function conversationStatItems(
580
+ props: ConversationStatsProps,
581
+ ): ConversationStatItem[] {
583
582
  if (!props.conversation) return [];
584
583
  const completeDetail = props.detail?.previousCursor
585
584
  ? undefined
@@ -596,9 +595,11 @@ function conversationStatItems(props: {
596
595
  props.detail?.childAgentTotals ?? props.conversation.childAgentTotals;
597
596
  const lastActivityAt = props.conversation.lastSeenAt;
598
597
  const location = conversationLocation(props.conversation, props.detail);
599
- const cost = conversationCost(props.conversation, props.detail);
598
+ const cost = props.showUsageBreakdown
599
+ ? null
600
+ : conversationCost(props.conversation, props.detail);
600
601
  const rawStats: Array<ConversationStatItem | undefined> = [
601
- // The desktop title bar shows the location and cost. Mobile hides that bar.
602
+ // The desktop title bar shows the location. Mobile hides that bar.
602
603
  location
603
604
  ? {
604
605
  content: location,
@@ -646,7 +647,7 @@ function conversationStatItems(props: {
646
647
  label: "Runtime",
647
648
  }
648
649
  : undefined,
649
- tokenSummary
650
+ tokenSummary && !props.showUsageBreakdown
650
651
  ? {
651
652
  content: (
652
653
  <TokenMetric
@@ -673,7 +674,6 @@ function conversationStatItems(props: {
673
674
  content: cost,
674
675
  key: "cost",
675
676
  label: "Cost",
676
- mobileOnly: true,
677
677
  }
678
678
  : undefined,
679
679
  childAgentTotals
@@ -2,6 +2,7 @@ import {
2
2
  useCallback,
3
3
  useEffect,
4
4
  useEffectEvent,
5
+ useLayoutEffect,
5
6
  useMemo,
6
7
  useRef,
7
8
  useState,
@@ -151,6 +152,7 @@ export function ConversationPage(props: {
151
152
  () => false,
152
153
  );
153
154
  const pageRef = useRef<HTMLDivElement>(null);
155
+ const focusDetailsOnOpen = useRef(false);
154
156
  const [subagentTarget, setSubagentTarget] =
155
157
  useState<SubagentTranscriptTarget>();
156
158
  const [searchParams, setSearchParams] = useSearchParams();
@@ -193,6 +195,10 @@ export function ConversationPage(props: {
193
195
  const [memoryPopover, setMemoryPopover] = useState<OpenMemoryPopover>();
194
196
  // A memory chosen in details waits here until its transcript row renders.
195
197
  const [memoryJump, setMemoryJump] = useState<MemoryJump>();
198
+ // The transcript mounts only rows near the viewport. The rows of the last
199
+ // memory jump stay mounted, so the jump finds its row and the popover
200
+ // keeps it.
201
+ const [revealSeq, setRevealSeq] = useState<number>();
196
202
  // The page stays mounted across Conversations. Memory state belongs to one.
197
203
  const [memoryConversationId, setMemoryConversationId] = useState(
198
204
  props.conversationId,
@@ -201,6 +207,7 @@ export function ConversationPage(props: {
201
207
  setMemoryConversationId(props.conversationId);
202
208
  setMemoryPopover(undefined);
203
209
  setMemoryJump(undefined);
210
+ setRevealSeq(undefined);
204
211
  }
205
212
  const quickQuestion = useQuickQuestionThread(props.conversationId);
206
213
  // Event details and turn context also show over a Quick question.
@@ -208,6 +215,14 @@ export function ConversationPage(props: {
208
215
  Boolean(quickQuestion.thread) && !eventOpen && !turnContext;
209
216
  const showDetails =
210
217
  detailsOpen && !eventOpen && !turnContext && !quickQuestion.thread;
218
+ useLayoutEffect(() => {
219
+ if (!showDetails || !focusDetailsOnOpen.current) return;
220
+ focusDetailsOnOpen.current = false;
221
+ // The inline opener leaves the tab order while details are visible.
222
+ pageRef.current
223
+ ?.querySelector<HTMLButtonElement>('[data-slot="details-panel-close"]')
224
+ ?.focus({ preventScroll: true });
225
+ }, [showDetails]);
211
226
  const [viewState, setView] = useState<TranscriptViewMode>(() =>
212
227
  eventOpen ? "raw" : "rich",
213
228
  );
@@ -345,6 +360,10 @@ export function ConversationPage(props: {
345
360
  ) : null;
346
361
  const conversationDetail = detail.data;
347
362
  const links = conversationLinks(conversationDetail);
363
+ const showUsageBreakdown = hasConversationUsageBreakdown({
364
+ conversation,
365
+ detail: conversationDetail,
366
+ });
348
367
  const title =
349
368
  conversationDetailTitle(detail.data) ??
350
369
  conversationDisplayTitle(conversation);
@@ -519,7 +538,7 @@ export function ConversationPage(props: {
519
538
  className={cn(
520
539
  "grid h-full min-h-0 min-w-0",
521
540
  (showDetails || showEvent || turnContext || showQuickQuestion) &&
522
- "xl:grid-cols-[minmax(0,1fr)_25rem]",
541
+ "xl:grid-cols-[minmax(0,1fr)_22rem] 2xl:grid-cols-[minmax(0,1fr)_25rem]",
523
542
  )}
524
543
  >
525
544
  <ChatLayout
@@ -536,8 +555,12 @@ export function ConversationPage(props: {
536
555
  if (eventOpen) setSelectedEventSeq(undefined);
537
556
  setTurnContext(undefined);
538
557
  quickQuestion.close();
539
- if (showDetails) closeDetails();
540
- else setDetailsChoice(true);
558
+ if (showDetails) {
559
+ closeDetails();
560
+ } else {
561
+ focusDetailsOnOpen.current = true;
562
+ setDetailsChoice(true);
563
+ }
541
564
  }}
542
565
  forks={
543
566
  detail.data?.forkedFromConversationId ||
@@ -665,6 +688,7 @@ export function ConversationPage(props: {
665
688
  history.newer ? undefined : detail.inlineMessages
666
689
  }
667
690
  pinRequestVersion={pinRequestVersion}
691
+ revealSeq={revealSeq}
668
692
  responding={
669
693
  !detail.error &&
670
694
  !history.newer &&
@@ -744,6 +768,7 @@ export function ConversationPage(props: {
744
768
  // can hide them.
745
769
  if (view !== "rich") onViewChange("rich");
746
770
  setSearch("");
771
+ setRevealSeq(entry.seq);
747
772
  setMemoryJump({
748
773
  memoryId: entry.memory.id,
749
774
  seq: entry.seq,
@@ -756,18 +781,17 @@ export function ConversationPage(props: {
756
781
  hasConversationStats({
757
782
  conversation,
758
783
  detail: detail.data,
784
+ showUsageBreakdown,
759
785
  }) ? (
760
786
  <ConversationStats
761
787
  conversation={conversation}
762
788
  detail={detail.data}
789
+ showUsageBreakdown={showUsageBreakdown}
763
790
  />
764
791
  ) : null
765
792
  }
766
793
  usage={
767
- hasConversationUsageBreakdown({
768
- conversation,
769
- detail: detail.data,
770
- }) ? (
794
+ showUsageBreakdown ? (
771
795
  <ConversationUsageBreakdown
772
796
  conversation={conversation}
773
797
  detail={detail.data}