@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.
- package/dist/app.js +23 -30
- package/dist/client-manifest.json +1 -1
- package/dist/index.js +23 -30
- package/dist/public/chunks/{AdminPage-YEKZOKH6.js → AdminPage-M5RBVZFN.js} +1 -1
- package/dist/public/chunks/{AutomationPage-5GS3IUAK.js → AutomationPage-WALCREDT.js} +1 -1
- package/dist/public/chunks/{AutomationRunsPage-IPYEZU4L.js → AutomationRunsPage-CV47E4UX.js} +1 -1
- package/dist/public/chunks/{AutomationsPage-HSAYPC3C.js → AutomationsPage-57L3AQVJ.js} +1 -1
- package/dist/public/chunks/{CodePage-IPFKXWFB.js → CodePage-XJUYMFJH.js} +1 -1
- package/dist/public/chunks/{ConnectionsPage-5XUEK6FS.js → ConnectionsPage-3QQAGYWF.js} +1 -1
- package/dist/public/chunks/{LocationDetailPage-27ETUGR6.js → LocationDetailPage-4IL5HQML.js} +1 -1
- package/dist/public/chunks/{LocationsPage-WOKMQAGM.js → LocationsPage-D2DUQAHJ.js} +1 -1
- package/dist/public/chunks/{PeoplePage-6YQLDOUL.js → PeoplePage-6F5GPQ7C.js} +1 -1
- package/dist/public/chunks/{PersonProfilePage-GYMAZFIK.js → PersonProfilePage-SPAYQPTD.js} +1 -1
- package/dist/public/chunks/{PersonalTokensPage-4BCR744B.js → PersonalTokensPage-SHAUJ74M.js} +1 -1
- package/dist/public/chunks/{PluginUserPage-IP6WL7MD.js → PluginUserPage-64FIWD7M.js} +1 -1
- package/dist/public/chunks/{RepositoryPage-TRD44LQ3.js → RepositoryPage-L7IHOXSN.js} +1 -1
- package/dist/public/chunks/{SettingsPage-4E3SLQ36.js → SettingsPage-U7WG4FHE.js} +1 -1
- package/dist/public/chunks/{SystemPage-C3XBKXKW.js → SystemPage-ZBC43OJH.js} +1 -1
- package/dist/public/chunks/{WorkspaceFormPage-2LS2X67Q.js → WorkspaceFormPage-3NVIIZ4P.js} +1 -1
- package/dist/public/chunks/{WorkspacesPage-5WB3CUTX.js → WorkspacesPage-G73HPBDD.js} +1 -1
- package/dist/public/chunks/{chunk-VFEBNOPX.js → chunk-2J3LGF5Q.js} +1 -1
- package/dist/public/chunks/chunk-2NNKHSZE.js +1 -0
- package/dist/public/chunks/chunk-4TQSTCIN.js +13 -0
- package/dist/public/chunks/chunk-64GPEGGE.js +1 -0
- package/dist/public/chunks/{chunk-WZVO3HG4.js → chunk-6FHY65EQ.js} +1 -1
- package/dist/public/chunks/{chunk-YYNMZ4WC.js → chunk-DEEO4D4N.js} +1 -1
- package/dist/public/chunks/{chunk-SDKV3OID.js → chunk-FSGVY7HB.js} +1 -1
- package/dist/public/chunks/chunk-GZBMHYYU.js +1 -0
- package/dist/public/chunks/{chunk-NQMDED2R.js → chunk-II4NXLSQ.js} +1 -1
- package/dist/public/chunks/{chunk-B6HGRBBX.js → chunk-ILH47V7O.js} +1 -1
- package/dist/public/chunks/{chunk-GRMX2HX6.js → chunk-JPL2NRWK.js} +1 -1
- package/dist/public/chunks/{chunk-NQOJAZFQ.js → chunk-JVJ5UWIK.js} +1 -1
- package/dist/public/chunks/{chunk-V5UDSIRA.js → chunk-K4TYMAA3.js} +1 -1
- package/dist/public/chunks/{chunk-EFEREKX4.js → chunk-KDUTK357.js} +1 -1
- package/dist/public/chunks/{chunk-RHIXHBS5.js → chunk-LZYAHJVQ.js} +1 -1
- package/dist/public/chunks/{chunk-5GZDBGAR.js → chunk-MKKFXRYO.js} +1 -1
- package/dist/public/chunks/{chunk-PEQNT5MO.js → chunk-NGQRNS3C.js} +1 -1
- package/dist/public/chunks/{chunk-IA6BJDKN.js → chunk-ONDKE72P.js} +1 -1
- package/dist/public/chunks/{chunk-WJ3OXMVX.js → chunk-PG7M7L24.js} +1 -1
- package/dist/public/chunks/{chunk-6GQL3EVJ.js → chunk-QQUFROWT.js} +1 -1
- package/dist/public/chunks/{chunk-UAH6DWNS.js → chunk-RB5FBDEY.js} +1 -1
- package/dist/public/chunks/{chunk-A2QWWA7O.js → chunk-RGXXD4DM.js} +1 -1
- package/dist/public/chunks/{chunk-AYXSBMWA.js → chunk-TC7TU4GK.js} +1 -1
- package/dist/public/chunks/chunk-WLIOZO3W.js +1 -0
- package/dist/public/chunks/{chunk-VXT3FIVL.js → chunk-XDUSY26N.js} +11 -11
- package/dist/public/client-4OAAOHF4.js +68 -0
- package/dist/tailwind.css +1 -1
- package/package.json +4 -4
- package/src/client/components/BottomSheet.tsx +1 -1
- package/src/client/components/DetailsPanel.tsx +2 -1
- package/src/client/conversations/ConversationBrief.tsx +129 -65
- package/src/client/conversations/ConversationDetails.tsx +13 -14
- package/src/client/conversations/ConversationEventLog.tsx +20 -97
- package/src/client/conversations/ConversationHeader.tsx +41 -26
- package/src/client/conversations/ConversationHeaderActions.tsx +3 -1
- package/src/client/conversations/ConversationLinkedWork.tsx +30 -10
- package/src/client/conversations/ConversationMeta.tsx +15 -15
- package/src/client/conversations/ConversationPage.tsx +31 -7
- package/src/client/conversations/ConversationTranscript.tsx +234 -186
- package/src/client/conversations/ConversationUsageBreakdown.tsx +142 -64
- package/src/client/conversations/DetailsList.tsx +7 -1
- package/src/client/conversations/PendingMailboxStack.tsx +88 -44
- package/src/client/conversations/TranscriptActivityGroup.tsx +7 -14
- package/src/client/conversations/TranscriptEventView.tsx +7 -3
- package/src/client/conversations/TranscriptReasoningView.tsx +4 -2
- package/src/client/conversations/TranscriptRows.tsx +37 -5
- package/src/client/conversations/TranscriptView.tsx +4 -0
- package/src/client/conversations/queries.ts +74 -43
- package/src/client/conversations/transcriptBottomPinning.ts +13 -5
- package/src/client/conversations/transcriptListRows.ts +215 -0
- package/src/client/conversations/virtualRows.ts +168 -0
- package/src/client/http.ts +6 -5
- package/src/client/sentry.ts +53 -3
- package/src/conversation-cache.ts +8 -10
- package/src/mock-reporting/fixtures.ts +0 -8
- package/dist/public/chunks/chunk-GO45RQDL.js +0 -1
- package/dist/public/chunks/chunk-N4AONKD3.js +0 -1
- package/dist/public/chunks/chunk-QNA7F7QB.js +0 -1
- package/dist/public/chunks/chunk-R4ORRE77.js +0 -1
- package/dist/public/chunks/chunk-Z2JPRGFT.js +0 -1
- 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
|
-
|
|
487
|
-
export function hasConversationStats(props: {
|
|
486
|
+
type ConversationStatsProps = {
|
|
488
487
|
conversation: Conversation | undefined;
|
|
489
488
|
detail?: ConversationDetailReport;
|
|
490
|
-
|
|
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(
|
|
580
|
-
|
|
581
|
-
|
|
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 =
|
|
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
|
|
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)
|
|
540
|
-
|
|
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
|
-
|
|
768
|
-
conversation,
|
|
769
|
-
detail: detail.data,
|
|
770
|
-
}) ? (
|
|
794
|
+
showUsageBreakdown ? (
|
|
771
795
|
<ConversationUsageBreakdown
|
|
772
796
|
conversation={conversation}
|
|
773
797
|
detail={detail.data}
|