@sentry/junior-dashboard 0.248.0 → 0.250.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/README.md +3 -0
- package/dist/app.js +2 -2
- package/dist/client.js +40 -38
- package/dist/index.js +2 -2
- package/dist/tailwind.css +1 -1
- package/package.json +3 -3
- package/src/client/App.tsx +19 -5
- package/src/client/components/ActorAvatar.tsx +7 -4
- package/src/client/components/AutomationCard.tsx +2 -2
- package/src/client/components/Button.tsx +12 -11
- package/src/client/components/ConversationList.tsx +3 -3
- package/src/client/components/ConversationSummary.tsx +2 -1
- package/src/client/components/DetailList.tsx +3 -3
- package/src/client/components/Drawer.tsx +2 -2
- package/src/client/components/EmptyTelemetry.tsx +1 -1
- package/src/client/components/Field.tsx +1 -2
- package/src/client/components/FilterBar.tsx +6 -6
- package/src/client/components/Metric.tsx +4 -4
- package/src/client/components/Notice.tsx +7 -7
- package/src/client/components/PageContentSkeleton.tsx +2 -2
- package/src/client/components/Pagination.tsx +2 -2
- package/src/client/components/ParticipantAvatarStack.tsx +4 -4
- package/src/client/components/ProfileMenu.tsx +17 -7
- package/src/client/components/README.md +122 -58
- package/src/client/components/SearchInput.tsx +4 -3
- package/src/client/components/SegmentedNav.tsx +10 -17
- package/src/client/components/SegmentedTabs.tsx +3 -3
- package/src/client/components/Select.tsx +1 -1
- package/src/client/components/SelectableRow.tsx +2 -2
- package/src/client/components/Skeleton.tsx +1 -1
- package/src/client/components/StatusChip.tsx +1 -1
- package/src/client/components/StatusDot.tsx +1 -1
- package/src/client/components/TextInput.tsx +1 -1
- package/src/client/components/Tooltip.tsx +2 -2
- package/src/client/components/VersionDriftBanner.tsx +2 -2
- package/src/client/components/charts/ActivityChart.tsx +5 -6
- package/src/client/components/charts/CacheWrites.tsx +3 -3
- package/src/client/components/charts/ChartHeader.tsx +4 -4
- package/src/client/components/charts/ChartLegend.tsx +1 -1
- package/src/client/components/charts/InputCacheChart.tsx +5 -5
- package/src/client/components/charts/WorkspaceUsageChart.tsx +4 -11
- package/src/client/components/controls/DirectorySortSelect.tsx +2 -2
- package/src/client/components/directory/DirectoryMetric.tsx +2 -2
- package/src/client/components/directory/DirectoryRowsSkeleton.tsx +5 -5
- package/src/client/components/directory/DirectoryTable.tsx +3 -3
- package/src/client/components/layout/CardHeader.tsx +4 -4
- package/src/client/components/layout/DashboardChrome.tsx +9 -3
- package/src/client/components/layout/DashboardHeader.tsx +7 -7
- package/src/client/components/layout/PageHeader.tsx +2 -2
- package/src/client/components/layout/SecondaryNavigation.tsx +7 -14
- package/src/client/components/layout/SectionIntro.tsx +1 -1
- package/src/client/components/layout/SectionTitle.tsx +1 -1
- package/src/client/components/metrics/StatCard.tsx +2 -2
- package/src/client/conversations/ConversationArchiveNotices.tsx +1 -1
- package/src/client/conversations/ConversationBrief.tsx +4 -4
- package/src/client/conversations/ConversationChildAgents.tsx +7 -4
- package/src/client/conversations/ConversationComposer.tsx +8 -7
- package/src/client/conversations/ConversationHeader.tsx +5 -5
- package/src/client/conversations/ConversationHeaderActions.tsx +9 -9
- package/src/client/conversations/ConversationHomeList.tsx +3 -3
- package/src/client/conversations/ConversationListStatusIcon.tsx +1 -1
- package/src/client/conversations/ConversationMemories.tsx +4 -4
- package/src/client/conversations/ConversationMeta.tsx +10 -10
- package/src/client/conversations/ConversationPage.tsx +2 -1
- package/src/client/conversations/ConversationSidebar.tsx +6 -6
- package/src/client/conversations/ConversationUsageBreakdown.tsx +4 -4
- package/src/client/conversations/ConversationWorkspace.tsx +1 -1
- package/src/client/conversations/ConversationWorkspaceLoading.tsx +4 -4
- package/src/client/conversations/CopyMarkdownButton.tsx +1 -1
- package/src/client/conversations/EventUsage.tsx +2 -2
- package/src/client/conversations/PendingMailboxStack.tsx +5 -5
- package/src/client/conversations/README.md +9 -0
- package/src/client/conversations/SubagentTranscriptDrawer.tsx +39 -23
- package/src/client/conversations/ToolFrame.tsx +36 -14
- package/src/client/conversations/TranscriptActivityGroup.tsx +10 -3
- package/src/client/conversations/TranscriptAttachmentsDeliveredView.tsx +4 -6
- package/src/client/conversations/TranscriptContextEventView.tsx +2 -2
- package/src/client/conversations/TranscriptEventView.tsx +1 -1
- package/src/client/conversations/TranscriptMarkdown.tsx +3 -3
- package/src/client/conversations/TranscriptMessageContextView.tsx +7 -7
- package/src/client/conversations/TranscriptMessageView.tsx +2 -6
- package/src/client/conversations/TranscriptRailEvent.tsx +20 -8
- package/src/client/conversations/TranscriptReasoningView.tsx +12 -12
- package/src/client/conversations/TranscriptStructuredEventView.tsx +16 -11
- package/src/client/conversations/TranscriptSubagentView.tsx +64 -39
- package/src/client/conversations/TranscriptText.tsx +5 -4
- package/src/client/conversations/TranscriptToolView.tsx +9 -11
- package/src/client/conversations/TranscriptTurnContextView.tsx +3 -3
- package/src/client/conversations/TranscriptView.tsx +3 -3
- package/src/client/conversations/UsageCard.tsx +1 -1
- package/src/client/conversations/eventTranscript.ts +7 -0
- package/src/client/conversations/transcriptMarkdownLinks.ts +2 -4
- package/src/client/conversations/transcriptStyles.ts +1 -1
- package/src/client/pages/ConnectionsPage.tsx +207 -0
- package/src/client/pages/PersonalTokensPage.tsx +4 -4
- package/src/client/pages/admin/AdminPage.tsx +2 -2
- package/src/client/pages/automations/AutomationCostChart.tsx +2 -2
- package/src/client/pages/automations/AutomationDetailsDrawer.tsx +5 -10
- package/src/client/pages/automations/AutomationEditor.tsx +1 -1
- package/src/client/pages/automations/AutomationExecutionChart.tsx +2 -2
- package/src/client/pages/automations/AutomationExecutionStatusChart.tsx +2 -2
- package/src/client/pages/automations/AutomationExecutionsPage.tsx +4 -4
- package/src/client/pages/automations/AutomationRow.tsx +4 -4
- package/src/client/pages/automations/AutomationRunsPage.tsx +3 -3
- package/src/client/pages/automations/AutomationScheduleFields.tsx +1 -1
- package/src/client/pages/automations/AutomationVersionsPage.tsx +1 -1
- package/src/client/pages/code/CodeActivityChart.tsx +7 -6
- package/src/client/pages/code/CodeChangeRow.tsx +1 -1
- package/src/client/pages/code/CodePage.tsx +5 -5
- package/src/client/pages/code/RepositoryPage.tsx +2 -2
- package/src/client/pages/dev/ChartFixtures.tsx +265 -21
- package/src/client/pages/dev/ComponentsPage.tsx +40 -146
- package/src/client/pages/dev/TranscriptActivityFixtures.tsx +206 -0
- package/src/client/pages/locations/LocationDetailPage.tsx +4 -4
- package/src/client/pages/locations/LocationDirectory.tsx +1 -1
- package/src/client/pages/locations/PrivateActivityCard.tsx +3 -3
- package/src/client/pages/memory/MemoryCostChart.tsx +3 -5
- package/src/client/pages/memory/MemoryDetailsDrawer.tsx +5 -5
- package/src/client/pages/memory/MemoryPage.tsx +15 -15
- package/src/client/pages/memory/MemoryTimeline.tsx +3 -5
- package/src/client/pages/people/ContributionGrid.tsx +8 -5
- package/src/client/pages/people/PersonProfilePage.tsx +3 -6
- package/src/client/pages/people/ProfilePluginReports.tsx +2 -2
- package/src/client/pages/system/GuardianActivity.tsx +9 -9
- package/src/client/pages/system/PluginBarChart.tsx +4 -6
- package/src/client/pages/system/PluginDetails.tsx +11 -7
- package/src/client/pages/system/PluginPanels.tsx +8 -8
- package/src/client/pages/system/PluginReportRecordSet.tsx +14 -14
- package/src/client/pages/system/PluginReports.tsx +7 -11
- package/src/client/pages/system/SkillInventory.tsx +9 -9
- package/src/client/pages/system/SystemActivity.tsx +1 -1
- package/src/client/pages/system/SystemPage.tsx +3 -6
- package/src/client/pages/system/WorkspaceDetails.tsx +2 -5
- package/src/client/pages/system/WorkspaceEditor.tsx +2 -2
- package/src/client/pages/system/WorkspaceList.tsx +2 -2
- package/src/client/pages/user/PluginUserPage.tsx +3 -3
- package/src/client/styles.ts +5 -4
- package/src/client/types.ts +2 -0
- package/src/tailwind.css +36 -38
|
@@ -24,7 +24,7 @@ import {
|
|
|
24
24
|
} from "../format";
|
|
25
25
|
import { Tooltip } from "../components/Tooltip";
|
|
26
26
|
import { MetricList, type MetricListItem } from "../components/Metric";
|
|
27
|
-
import { cn } from "../styles";
|
|
27
|
+
import { cn, dashboardInlineLinkClass } from "../styles";
|
|
28
28
|
import {
|
|
29
29
|
CostMetric,
|
|
30
30
|
DurationMetric,
|
|
@@ -49,9 +49,9 @@ export function PendingAuthorization(props: {
|
|
|
49
49
|
};
|
|
50
50
|
}) {
|
|
51
51
|
return (
|
|
52
|
-
<div className="mb-2 rounded-lg border border-
|
|
52
|
+
<div className="mb-2 rounded-lg border border-dashboard-accent/20 bg-dashboard-accent/[0.07] px-3 py-2.5 font-sans text-sm text-dashboard-text">
|
|
53
53
|
<a
|
|
54
|
-
className="font-medium text-
|
|
54
|
+
className="font-medium text-dashboard-accent-text underline decoration-dashboard-accent/40 underline-offset-2 hover:text-dashboard-accent-text"
|
|
55
55
|
href={props.authorization.authorizationUrl}
|
|
56
56
|
rel="noreferrer"
|
|
57
57
|
target="_blank"
|
|
@@ -82,7 +82,7 @@ export function ConversationPrivacyChip(props: {
|
|
|
82
82
|
className={
|
|
83
83
|
isPublic
|
|
84
84
|
? "inline-flex max-w-full items-center gap-1 rounded-full border border-dashboard-border-emphasis bg-dashboard-fill-soft px-2 py-0.5 font-sans text-2xs font-medium text-dashboard-text-muted"
|
|
85
|
-
: "inline-flex max-w-full items-center gap-1 rounded-full border border-
|
|
85
|
+
: "inline-flex max-w-full items-center gap-1 rounded-full border border-dashboard-border-strong bg-dashboard-fill-soft px-2 py-0.5 font-sans text-2xs font-medium text-dashboard-text-muted"
|
|
86
86
|
}
|
|
87
87
|
role="note"
|
|
88
88
|
title={`${fullLabel}. ${detail}`}
|
|
@@ -176,7 +176,7 @@ export function ConversationSidebarAnnotations(props: {
|
|
|
176
176
|
<SidebarAnnotationGroupChip group={group} key={group.label} />
|
|
177
177
|
))}
|
|
178
178
|
{badges.overflowGroupCount > 0 ? (
|
|
179
|
-
<span className="inline-flex h-5 min-w-7 shrink-0 items-center justify-center rounded-full border border-
|
|
179
|
+
<span className="inline-flex h-5 min-w-7 shrink-0 items-center justify-center rounded-full border border-dashboard-border-strong bg-dashboard-control px-1.5 font-sans text-2xs tabular-nums leading-none text-dashboard-text-muted">
|
|
180
180
|
+{badges.overflowGroupCount}
|
|
181
181
|
</span>
|
|
182
182
|
) : null}
|
|
@@ -225,7 +225,7 @@ function SidebarAnnotationGroupChip(props: {
|
|
|
225
225
|
group: SidebarAnnotationBadgeGroup;
|
|
226
226
|
}) {
|
|
227
227
|
return (
|
|
228
|
-
<span className="inline-flex h-5 min-w-0 max-w-60 shrink-0 items-center gap-1 truncate rounded-full border border-
|
|
228
|
+
<span className="inline-flex h-5 min-w-0 max-w-60 shrink-0 items-center gap-1 truncate rounded-full border border-dashboard-border-strong bg-dashboard-control px-1.5 font-sans text-2xs leading-none text-dashboard-text-muted">
|
|
229
229
|
{props.group.annotations.map((annotation) =>
|
|
230
230
|
annotation.objectType ? (
|
|
231
231
|
<ObjectIcon
|
|
@@ -269,7 +269,7 @@ function SidebarAnnotationStatusChip(props: {
|
|
|
269
269
|
// real chips, not floating glyphs. Box-shadow cutout (not border) keeps
|
|
270
270
|
// layout at 18px while punching a surface-colored ring through the chip
|
|
271
271
|
// underneath — classic avatar-facepile silhouette.
|
|
272
|
-
"relative box-border inline-flex size-[18px] shrink-0 items-center justify-center rounded-full border border-
|
|
272
|
+
"relative box-border inline-flex size-[18px] shrink-0 items-center justify-center rounded-full border border-dashboard-border-strong bg-dashboard-control",
|
|
273
273
|
props.stacked && "-ml-1",
|
|
274
274
|
)}
|
|
275
275
|
style={{
|
|
@@ -420,7 +420,7 @@ export function ConversationAnnotations(props: {
|
|
|
420
420
|
className={cn(
|
|
421
421
|
"inline-flex min-w-0 max-w-full shrink-0 items-center gap-2 rounded-md font-sans leading-snug text-dashboard-text no-underline transition-colors focus-visible:outline focus-visible:outline-2 focus-visible:outline-dashboard-focus",
|
|
422
422
|
props.layout === "strip"
|
|
423
|
-
? "px-1 py-0.5 text-xs hover:text-
|
|
423
|
+
? "px-1 py-0.5 text-xs hover:text-dashboard-accent-text"
|
|
424
424
|
: "min-h-10 border border-dashboard-border px-3 py-2 text-sm hover:border-dashboard-border-interactive hover:bg-dashboard-surface-hover",
|
|
425
425
|
)}
|
|
426
426
|
href={link.url ?? undefined}
|
|
@@ -471,7 +471,7 @@ function resourceLinkTitle(link: {
|
|
|
471
471
|
function LocationLink(props: { label: string; locationUrl?: string }) {
|
|
472
472
|
return props.locationUrl ? (
|
|
473
473
|
<a
|
|
474
|
-
className=
|
|
474
|
+
className={dashboardInlineLinkClass}
|
|
475
475
|
href={props.locationUrl}
|
|
476
476
|
rel="noreferrer"
|
|
477
477
|
target="_blank"
|
|
@@ -494,7 +494,7 @@ function SourceTask(props: {
|
|
|
494
494
|
const title = props.sourceTask.title?.trim();
|
|
495
495
|
const link = automationId ? (
|
|
496
496
|
<Link
|
|
497
|
-
className=
|
|
497
|
+
className={dashboardInlineLinkClass}
|
|
498
498
|
to={automationPath(automationId)}
|
|
499
499
|
>
|
|
500
500
|
Triggered by {kindLabel}
|
|
@@ -186,6 +186,7 @@ export function ConversationPage(props: {
|
|
|
186
186
|
conversation: ConversationTranscript;
|
|
187
187
|
}) => {
|
|
188
188
|
setSubagentTarget({
|
|
189
|
+
...(part.agentName ? { agentName: part.agentName } : undefined),
|
|
189
190
|
conversationId: part.childConversationId,
|
|
190
191
|
label: part.title ?? part.agentName,
|
|
191
192
|
status: part.status,
|
|
@@ -327,7 +328,7 @@ export function ConversationPage(props: {
|
|
|
327
328
|
{detail.isPending ? (
|
|
328
329
|
<TranscriptLoading />
|
|
329
330
|
) : detail.error && !detail.data ? (
|
|
330
|
-
<Card className="border-
|
|
331
|
+
<Card className="border-dashboard-border bg-dashboard-fill-soft p-4 font-sans text-xs leading-relaxed text-dashboard-text-muted">
|
|
331
332
|
{detail.error.message}
|
|
332
333
|
</Card>
|
|
333
334
|
) : (
|
|
@@ -88,8 +88,8 @@ export function ConversationSidebar(props: {
|
|
|
88
88
|
className={cn(
|
|
89
89
|
"relative min-w-0",
|
|
90
90
|
isLanding
|
|
91
|
-
? "border-t border-
|
|
92
|
-
: "grid h-full min-h-0 grid-rows-[auto_auto_minmax(0,1fr)] overflow-hidden border-r border-dashboard-border
|
|
91
|
+
? "border-t border-dashboard-border bg-transparent"
|
|
92
|
+
: "grid h-full min-h-0 grid-rows-[auto_auto_minmax(0,1fr)] overflow-hidden border-r border-dashboard-border bg-dashboard-surface-panel",
|
|
93
93
|
)}
|
|
94
94
|
>
|
|
95
95
|
<div className="px-5 py-3">
|
|
@@ -106,7 +106,7 @@ export function ConversationSidebar(props: {
|
|
|
106
106
|
{isLanding ? null : (
|
|
107
107
|
<button
|
|
108
108
|
aria-label="New conversation"
|
|
109
|
-
className="grid size-7 cursor-pointer place-items-center rounded-md text-dashboard-text-muted transition hover:bg-
|
|
109
|
+
className="grid size-7 cursor-pointer place-items-center rounded-md text-dashboard-text-muted transition hover:bg-dashboard-fill-hover hover:text-dashboard-text focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-dashboard-focus"
|
|
110
110
|
onClick={props.onNewConversation}
|
|
111
111
|
title="New conversation"
|
|
112
112
|
type="button"
|
|
@@ -293,7 +293,7 @@ const ConversationSidebarRow = memo(function ConversationSidebarRow(props: {
|
|
|
293
293
|
<Link
|
|
294
294
|
aria-current={props.selected ? "page" : undefined}
|
|
295
295
|
className={cn(
|
|
296
|
-
"block min-w-0 rounded-lg px-3 py-2 text-inherit no-underline transition-colors hover:bg-dashboard-fill-hover max-sm:pr-10",
|
|
296
|
+
"block min-w-0 rounded-lg px-3 py-2 text-inherit no-underline transition-colors hover:bg-dashboard-fill-hover focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-dashboard-focus max-sm:pr-10",
|
|
297
297
|
props.selected && "bg-dashboard-surface-active",
|
|
298
298
|
)}
|
|
299
299
|
to={conversationPath(props.conversation.id)}
|
|
@@ -323,7 +323,7 @@ const ConversationSidebarRow = memo(function ConversationSidebarRow(props: {
|
|
|
323
323
|
</Link>
|
|
324
324
|
<button
|
|
325
325
|
aria-label={`${props.conversation.archivedAt ? "Restore" : "Archive"} ${title}`}
|
|
326
|
-
className="absolute right-1.5 top-1/2 z-10 grid size-7 -translate-y-1/2 cursor-pointer place-items-center rounded-md bg-dashboard-surface-active text-dashboard-text-muted transition hover:text-dashboard-text focus:outline-
|
|
326
|
+
className="absolute right-1.5 top-1/2 z-10 grid size-7 -translate-y-1/2 cursor-pointer place-items-center rounded-md bg-dashboard-surface-active text-dashboard-text-muted transition hover:text-dashboard-text focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-dashboard-focus sm:pointer-events-none sm:opacity-0 sm:focus:pointer-events-auto sm:focus:opacity-100 sm:group-focus-within:pointer-events-auto sm:group-focus-within:opacity-100 sm:group-hover:pointer-events-auto sm:group-hover:opacity-100 disabled:cursor-not-allowed"
|
|
327
327
|
disabled={archive.isPending}
|
|
328
328
|
onClick={() =>
|
|
329
329
|
archive.mutate({
|
|
@@ -413,7 +413,7 @@ function ArchivedConversationNotice(props: {
|
|
|
413
413
|
>
|
|
414
414
|
{restore.error ? (
|
|
415
415
|
<div
|
|
416
|
-
className="border-t border-rose-300/25 bg-rose-400/[0.12] px-3 py-2 font-
|
|
416
|
+
className="border-t border-rose-300/25 bg-rose-400/[0.12] px-3 py-2 font-sans text-xs text-rose-50/85"
|
|
417
417
|
role="alert"
|
|
418
418
|
>
|
|
419
419
|
Could not restore the conversation.
|
|
@@ -99,10 +99,10 @@ function BreakdownTable(props: {
|
|
|
99
99
|
</span>
|
|
100
100
|
) : null}
|
|
101
101
|
</th>
|
|
102
|
-
<td className="py-2 text-right align-top font-
|
|
102
|
+
<td className="py-2 text-right align-top font-sans tabular-nums text-dashboard-text">
|
|
103
103
|
{row.count}
|
|
104
104
|
</td>
|
|
105
|
-
<td className="py-2 text-right align-top font-
|
|
105
|
+
<td className="py-2 text-right align-top font-sans tabular-nums text-dashboard-text">
|
|
106
106
|
{row.cost}
|
|
107
107
|
</td>
|
|
108
108
|
</tr>
|
|
@@ -112,10 +112,10 @@ function BreakdownTable(props: {
|
|
|
112
112
|
<th scope="row" className="py-2 text-left font-semibold">
|
|
113
113
|
{props.total.label}
|
|
114
114
|
</th>
|
|
115
|
-
<td className="py-2 text-right font-
|
|
115
|
+
<td className="py-2 text-right font-sans tabular-nums">
|
|
116
116
|
{props.total.count}
|
|
117
117
|
</td>
|
|
118
|
-
<td className="py-2 text-right font-
|
|
118
|
+
<td className="py-2 text-right font-sans tabular-nums">
|
|
119
119
|
{props.total.cost}
|
|
120
120
|
</td>
|
|
121
121
|
</tr>
|
|
@@ -93,7 +93,7 @@ export function ConversationWorkspace() {
|
|
|
93
93
|
<main
|
|
94
94
|
className={cn(
|
|
95
95
|
dashboardContainerClass,
|
|
96
|
-
"h-full min-h-0 overflow-y-auto overscroll-contain px-4 py-4 sm:px-6 sm:py-6
|
|
96
|
+
"h-full min-h-0 overflow-y-auto overscroll-contain px-4 py-4 sm:px-6 sm:py-6",
|
|
97
97
|
)}
|
|
98
98
|
>
|
|
99
99
|
<div className="mx-auto grid w-full max-w-6xl gap-8">
|
|
@@ -12,7 +12,7 @@ export function ConversationWorkspaceLoading(props: { detail: boolean }) {
|
|
|
12
12
|
aria-live="polite"
|
|
13
13
|
className={cn(
|
|
14
14
|
dashboardContainerClass,
|
|
15
|
-
"grid h-full min-h-0 overflow-hidden md:grid-cols-[
|
|
15
|
+
"grid h-full min-h-0 overflow-hidden md:grid-cols-[20rem_minmax(0,1fr)]",
|
|
16
16
|
)}
|
|
17
17
|
role="status"
|
|
18
18
|
>
|
|
@@ -25,7 +25,7 @@ export function ConversationWorkspaceLoading(props: { detail: boolean }) {
|
|
|
25
25
|
|
|
26
26
|
function ConversationSidebarLoading() {
|
|
27
27
|
return (
|
|
28
|
-
<aside className="hidden h-full min-h-0 grid-rows-[auto_auto_minmax(0,1fr)] overflow-hidden border-r border-
|
|
28
|
+
<aside className="hidden h-full min-h-0 grid-rows-[auto_auto_minmax(0,1fr)] overflow-hidden border-r border-dashboard-border bg-dashboard-fill-faint md:grid">
|
|
29
29
|
<div className="flex items-center justify-between gap-2 px-3 pb-2 pt-3">
|
|
30
30
|
<h2 className="m-0 font-display text-lg font-medium leading-tight text-dashboard-text">
|
|
31
31
|
Conversations
|
|
@@ -60,7 +60,7 @@ function ConversationHomeLoading() {
|
|
|
60
60
|
aria-live="polite"
|
|
61
61
|
className={cn(
|
|
62
62
|
dashboardContainerClass,
|
|
63
|
-
"h-full min-h-0 overflow-y-auto overscroll-contain px-4 py-4 sm:px-6 sm:py-6
|
|
63
|
+
"h-full min-h-0 overflow-y-auto overscroll-contain px-4 py-4 sm:px-6 sm:py-6",
|
|
64
64
|
)}
|
|
65
65
|
role="status"
|
|
66
66
|
>
|
|
@@ -89,7 +89,7 @@ function ConversationDetailLoading() {
|
|
|
89
89
|
return (
|
|
90
90
|
<section
|
|
91
91
|
aria-label="Selected conversation"
|
|
92
|
-
className="grid min-h-0 grid-rows-[minmax(0,1fr)] overflow-hidden bg-
|
|
92
|
+
className="grid min-h-0 grid-rows-[minmax(0,1fr)] overflow-hidden bg-dashboard-fill-faint"
|
|
93
93
|
>
|
|
94
94
|
<ChatLayout
|
|
95
95
|
scrollAriaLabel="Conversation transcript"
|
|
@@ -39,7 +39,7 @@ export function CopyMarkdownButton(props: {
|
|
|
39
39
|
return (
|
|
40
40
|
<button
|
|
41
41
|
aria-label={label}
|
|
42
|
-
className="flex w-full cursor-pointer items-center gap-2.5 rounded-md border-0 bg-transparent px-2.5 py-2 text-left text-sm font-semibold text-dashboard-text transition-colors hover:bg-
|
|
42
|
+
className="flex w-full cursor-pointer items-center gap-2.5 rounded-md border-0 bg-transparent px-2.5 py-2 text-left text-sm font-semibold text-dashboard-text transition-colors hover:bg-dashboard-fill-strong focus-visible:bg-dashboard-fill-strong focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50"
|
|
43
43
|
disabled={!props.getMarkdown || status === "copying"}
|
|
44
44
|
onClick={() => void copyMarkdown()}
|
|
45
45
|
type="button"
|
|
@@ -77,7 +77,7 @@ export function EventUsage({ usage }: { usage?: ConversationUsage }) {
|
|
|
77
77
|
>
|
|
78
78
|
{row.label}
|
|
79
79
|
</th>
|
|
80
|
-
<td className="py-2 text-right font-
|
|
80
|
+
<td className="py-2 text-right font-sans tabular-nums text-dashboard-text">
|
|
81
81
|
{row.tokens === undefined ? (
|
|
82
82
|
<span
|
|
83
83
|
aria-label="Not recorded"
|
|
@@ -89,7 +89,7 @@ export function EventUsage({ usage }: { usage?: ConversationUsage }) {
|
|
|
89
89
|
row.tokens.toLocaleString("en-US")
|
|
90
90
|
)}
|
|
91
91
|
</td>
|
|
92
|
-
<td className="py-2 text-right font-
|
|
92
|
+
<td className="py-2 text-right font-sans tabular-nums text-dashboard-text">
|
|
93
93
|
{row.cost === undefined ? (
|
|
94
94
|
<span
|
|
95
95
|
aria-label="Not recorded separately"
|
|
@@ -91,7 +91,7 @@ function PendingMetaIcons(props: {
|
|
|
91
91
|
? "Could not remove. Try again."
|
|
92
92
|
: "Remove queued message"
|
|
93
93
|
}
|
|
94
|
-
className="inline-flex size-5 cursor-pointer items-center justify-center rounded border-0 bg-transparent p-0 text-dashboard-text-muted transition-colors hover:bg-
|
|
94
|
+
className="inline-flex size-5 cursor-pointer items-center justify-center rounded-md border-0 bg-transparent p-0 text-dashboard-text-muted transition-colors hover:bg-dashboard-fill-hover hover:text-amber-50 focus-visible:outline focus-visible:outline-1 focus-visible:outline-amber-200/55 disabled:cursor-default disabled:opacity-50"
|
|
95
95
|
disabled={props.cancelDisabled}
|
|
96
96
|
onClick={props.onCancel}
|
|
97
97
|
type="button"
|
|
@@ -141,7 +141,7 @@ function PendingRow(props: {
|
|
|
141
141
|
<article className="grid min-w-0 grid-cols-[minmax(0,1fr)] gap-1 px-3 py-2 text-dashboard-text md:px-3.5">
|
|
142
142
|
<TranscriptHeadingRow
|
|
143
143
|
left={
|
|
144
|
-
<span className="inline-block max-w-full truncate font-
|
|
144
|
+
<span className="inline-block max-w-full truncate font-sans text-sm font-semibold leading-tight text-dashboard-text">
|
|
145
145
|
{roleLabel}
|
|
146
146
|
</span>
|
|
147
147
|
}
|
|
@@ -160,11 +160,11 @@ function PendingRow(props: {
|
|
|
160
160
|
}
|
|
161
161
|
/>
|
|
162
162
|
{redacted ? (
|
|
163
|
-
<p className="m-0 font-
|
|
163
|
+
<p className="m-0 font-sans text-sm leading-snug text-dashboard-text-muted">
|
|
164
164
|
[redacted]
|
|
165
165
|
</p>
|
|
166
166
|
) : (
|
|
167
|
-
<p className="m-0 line-clamp-3 font-
|
|
167
|
+
<p className="m-0 line-clamp-3 font-sans text-sm leading-snug text-dashboard-text-subtle">
|
|
168
168
|
{text}
|
|
169
169
|
</p>
|
|
170
170
|
)}
|
|
@@ -174,7 +174,7 @@ function PendingRow(props: {
|
|
|
174
174
|
Could not send.
|
|
175
175
|
</p>
|
|
176
176
|
<button
|
|
177
|
-
className="cursor-pointer border-0 bg-transparent p-0 font-sans text-xs font-medium text-
|
|
177
|
+
className="cursor-pointer border-0 bg-transparent p-0 font-sans text-xs font-medium text-dashboard-accent-text/90 underline-offset-2 hover:underline focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-dashboard-focus"
|
|
178
178
|
onClick={() => props.onRetry?.(props.message)}
|
|
179
179
|
type="button"
|
|
180
180
|
>
|
|
@@ -16,6 +16,15 @@ shared controls and overlays.
|
|
|
16
16
|
`flush` when the text already sits on the transcript edge. It extends the
|
|
17
17
|
padded control around that text. Do not repeat negative margins at call sites.
|
|
18
18
|
The caller owns the native `details` element and its content.
|
|
19
|
+
- Activity rows (tools, reasoning, and grouped rail events) share one
|
|
20
|
+
layout: a 1rem icon column, an 8px gap, then the title and metadata.
|
|
21
|
+
Expanded content sits in `transcriptActivityBodyClass` under the title.
|
|
22
|
+
`TranscriptActivityNesting` tells a rail event that it is inside an activity
|
|
23
|
+
group. Outside a group, the rail icon sits in the avatar column so the text
|
|
24
|
+
lines up with message text.
|
|
25
|
+
- `TranscriptSubagentView` renders a child agent as a card with its name,
|
|
26
|
+
status, run time, and title. It matches the child agent rows in the details
|
|
27
|
+
drawer and opens the child transcript.
|
|
19
28
|
- `TranscriptAttachments` owns wrapping for both message attachments and file
|
|
20
29
|
deliveries. `ImageAttachment` owns image previews.
|
|
21
30
|
- `TranscriptTurnContextView` owns context content. The shared `Drawer` owns
|
|
@@ -4,7 +4,11 @@ import { Link } from "react-router";
|
|
|
4
4
|
|
|
5
5
|
import { useConversationData } from "./queries";
|
|
6
6
|
import { conversationPath } from "./conversationRoutes";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
conversationDetailTitle,
|
|
9
|
+
formatMessageTimestamp,
|
|
10
|
+
formatRelativeMessageTimestamp,
|
|
11
|
+
} from "../format";
|
|
8
12
|
import { buildConversationMarkdown } from "../markdownExport";
|
|
9
13
|
import { Drawer } from "../components/Drawer";
|
|
10
14
|
import { SearchInput } from "../components/SearchInput";
|
|
@@ -22,6 +26,8 @@ import { transcriptEmptyClass } from "./transcriptStyles";
|
|
|
22
26
|
|
|
23
27
|
/** One child Conversation to show, with what its parent already knows. */
|
|
24
28
|
export interface SubagentTranscriptTarget {
|
|
29
|
+
/** Agent name, such as "planner". Shown beside the status. */
|
|
30
|
+
agentName?: string;
|
|
25
31
|
conversationId: string;
|
|
26
32
|
/** Task title or agent name, shown before the child loads. */
|
|
27
33
|
label?: string;
|
|
@@ -58,6 +64,11 @@ function SubagentTranscriptDrawerContent(props: {
|
|
|
58
64
|
const label =
|
|
59
65
|
props.target.label ?? conversationDetailTitle(detail) ?? "Subagent";
|
|
60
66
|
const status = statusLabel(props.target.status, detail?.status);
|
|
67
|
+
const agentName =
|
|
68
|
+
props.target.agentName && props.target.agentName !== label
|
|
69
|
+
? props.target.agentName
|
|
70
|
+
: undefined;
|
|
71
|
+
const startedAt = detail ? Date.parse(detail.startedAt) : undefined;
|
|
61
72
|
const searchOpenVisible = searchOpen || search.length > 0;
|
|
62
73
|
|
|
63
74
|
const titleId = "subagent-transcript-drawer-title";
|
|
@@ -100,42 +111,47 @@ function SubagentTranscriptDrawerContent(props: {
|
|
|
100
111
|
aria-hidden="true"
|
|
101
112
|
className="shrink-0 text-cyan-300"
|
|
102
113
|
size={16}
|
|
103
|
-
strokeWidth={2
|
|
114
|
+
strokeWidth={2}
|
|
104
115
|
/>
|
|
105
116
|
<h2
|
|
106
|
-
className="m-0 min-w-0 break-words text-lg font-
|
|
117
|
+
className="m-0 min-w-0 break-words font-display text-lg font-medium leading-tight tracking-tight text-dashboard-text"
|
|
107
118
|
id={titleId}
|
|
108
119
|
>
|
|
109
120
|
{label}
|
|
110
121
|
</h2>
|
|
111
122
|
</div>
|
|
112
|
-
<div className="mt-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
123
|
+
<div className="mt-1.5 flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-xs leading-5 text-dashboard-text-muted">
|
|
124
|
+
{agentName ? (
|
|
125
|
+
<span className="font-medium text-dashboard-text">
|
|
126
|
+
{agentName}
|
|
127
|
+
</span>
|
|
128
|
+
) : null}
|
|
129
|
+
{status ? (
|
|
130
|
+
<StatusChip size="compact" tone={subagentStatusTone(status)}>
|
|
131
|
+
{status}
|
|
132
|
+
</StatusChip>
|
|
133
|
+
) : null}
|
|
134
|
+
{detail && startedAt !== undefined ? (
|
|
135
|
+
<time
|
|
136
|
+
className="tabular-nums"
|
|
137
|
+
dateTime={detail.startedAt}
|
|
138
|
+
title={formatMessageTimestamp(startedAt, true)}
|
|
139
|
+
>
|
|
140
|
+
Started {formatRelativeMessageTimestamp(startedAt)}
|
|
141
|
+
</time>
|
|
142
|
+
) : null}
|
|
116
143
|
<Link
|
|
117
|
-
className="inline-flex w-fit items-center gap-1 font-
|
|
144
|
+
className="inline-flex w-fit items-center gap-1 font-medium text-dashboard-accent-text no-underline hover:underline"
|
|
118
145
|
onClick={props.onClose}
|
|
119
146
|
to={conversationPath(props.target.conversationId)}
|
|
120
147
|
>
|
|
121
148
|
Open conversation
|
|
122
|
-
<ExternalLink aria-hidden="true" size={12} strokeWidth={2
|
|
149
|
+
<ExternalLink aria-hidden="true" size={12} strokeWidth={2} />
|
|
123
150
|
</Link>
|
|
124
151
|
</div>
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
<StatusChip size="compact" tone={subagentStatusTone(status)}>
|
|
129
|
-
{status}
|
|
130
|
-
</StatusChip>
|
|
131
|
-
) : null}
|
|
132
|
-
{detail ? (
|
|
133
|
-
<time className="font-mono" dateTime={detail.startedAt}>
|
|
134
|
-
{formatMessageTimestamp(Date.parse(detail.startedAt))}
|
|
135
|
-
</time>
|
|
136
|
-
) : null}
|
|
137
|
-
</div>
|
|
138
|
-
) : null}
|
|
152
|
+
<code className="mt-1 block min-w-0 break-all font-mono text-xs text-dashboard-text-faint">
|
|
153
|
+
{props.target.conversationId}
|
|
154
|
+
</code>
|
|
139
155
|
{searchOpenVisible ? (
|
|
140
156
|
<div className="mt-3 min-w-0">
|
|
141
157
|
<SearchInput
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { useState, type ReactNode } from "react";
|
|
2
|
+
import type { LucideIcon } from "lucide-react";
|
|
2
3
|
|
|
3
4
|
import { cn } from "../styles";
|
|
4
5
|
import {
|
|
@@ -8,10 +9,17 @@ import {
|
|
|
8
9
|
import { useTranscriptSearch } from "./transcriptSearch";
|
|
9
10
|
import { TranscriptSummary } from "./TranscriptSummary";
|
|
10
11
|
|
|
12
|
+
/** Frame expanded transcript activity content below its row title. */
|
|
13
|
+
export const transcriptActivityBodyClass =
|
|
14
|
+
"ml-6 mt-1.5 min-w-0 overflow-hidden rounded-md border border-dashboard-border-subtle bg-dashboard-surface-panel";
|
|
15
|
+
|
|
11
16
|
/** Render the shared expandable/non-expandable frame for transcript tools. */
|
|
12
17
|
export function ToolFrame(props: {
|
|
13
18
|
children?: ReactNode;
|
|
14
19
|
expandable?: boolean;
|
|
20
|
+
/** Icon in the activity icon column. Rail events pass their own icon. */
|
|
21
|
+
icon?: LucideIcon;
|
|
22
|
+
iconClassName?: string;
|
|
15
23
|
meta: string[];
|
|
16
24
|
mobileSummaryMeta?: string;
|
|
17
25
|
signature: ReactNode;
|
|
@@ -21,7 +29,8 @@ export function ToolFrame(props: {
|
|
|
21
29
|
const metaText = props.meta.join(" · ");
|
|
22
30
|
const interactive = props.expandable ?? Boolean(props.children);
|
|
23
31
|
const staticFrame = searchActive || !interactive;
|
|
24
|
-
const
|
|
32
|
+
const Icon = props.icon;
|
|
33
|
+
const row = (
|
|
25
34
|
<TranscriptHeadingRow
|
|
26
35
|
left={
|
|
27
36
|
<>
|
|
@@ -62,42 +71,55 @@ export function ToolFrame(props: {
|
|
|
62
71
|
rightClassName="ml-3 min-w-0 max-md:hidden"
|
|
63
72
|
/>
|
|
64
73
|
);
|
|
74
|
+
const header = Icon ? (
|
|
75
|
+
<div className="grid min-w-0 grid-cols-[1rem_minmax(0,1fr)] items-center gap-2">
|
|
76
|
+
<Icon
|
|
77
|
+
aria-hidden="true"
|
|
78
|
+
className={cn("size-3.5 justify-self-center", props.iconClassName)}
|
|
79
|
+
strokeWidth={2}
|
|
80
|
+
/>
|
|
81
|
+
{row}
|
|
82
|
+
</div>
|
|
83
|
+
) : (
|
|
84
|
+
row
|
|
85
|
+
);
|
|
65
86
|
const mobileMeta =
|
|
66
87
|
metaText && props.children ? (
|
|
67
|
-
<div className="hidden min-w-0 break-words
|
|
88
|
+
<div className="hidden min-w-0 break-words border-b border-dashboard-border-subtle px-2.5 py-1.5 font-sans text-xs tabular-nums leading-snug text-dashboard-text-muted max-md:block">
|
|
68
89
|
{metaText}
|
|
69
90
|
</div>
|
|
70
91
|
) : null;
|
|
71
92
|
|
|
93
|
+
const body = props.children ? (
|
|
94
|
+
<div className={transcriptActivityBodyClass}>
|
|
95
|
+
{mobileMeta}
|
|
96
|
+
{props.children}
|
|
97
|
+
</div>
|
|
98
|
+
) : null;
|
|
99
|
+
|
|
72
100
|
// Force-expand tool details during search so highlighted matches are visible.
|
|
73
101
|
if (staticFrame) {
|
|
74
102
|
return (
|
|
75
|
-
<div className="min-w-0 max-w-full
|
|
76
|
-
<div className="block
|
|
103
|
+
<div className="min-w-0 max-w-full">
|
|
104
|
+
<div className="block py-1.5 font-mono text-xs leading-tight text-dashboard-text-muted">
|
|
77
105
|
{header}
|
|
78
106
|
</div>
|
|
79
|
-
{
|
|
80
|
-
{props.children}
|
|
107
|
+
{body}
|
|
81
108
|
</div>
|
|
82
109
|
);
|
|
83
110
|
}
|
|
84
111
|
|
|
85
112
|
return (
|
|
86
113
|
<details
|
|
87
|
-
className="group min-w-0 max-w-full
|
|
114
|
+
className="group min-w-0 max-w-full"
|
|
88
115
|
open={open}
|
|
89
116
|
onToggle={(event) => setOpen(event.currentTarget.open)}
|
|
90
117
|
>
|
|
91
|
-
<TranscriptSummary className="block font-mono text-xs leading-tight text-dashboard-text-muted">
|
|
118
|
+
<TranscriptSummary className="-mx-2 block font-mono text-xs leading-tight text-dashboard-text-muted">
|
|
92
119
|
{header}
|
|
93
120
|
</TranscriptSummary>
|
|
94
121
|
{/* Closed details hide DOM, but still mount React children and run Shiki. */}
|
|
95
|
-
{open ?
|
|
96
|
-
<>
|
|
97
|
-
{mobileMeta}
|
|
98
|
-
{props.children}
|
|
99
|
-
</>
|
|
100
|
-
) : null}
|
|
122
|
+
{open ? body : null}
|
|
101
123
|
</details>
|
|
102
124
|
);
|
|
103
125
|
}
|
|
@@ -7,6 +7,7 @@ import { formatMs } from "../format";
|
|
|
7
7
|
import type { RenderedTranscriptEntry } from "./transcriptRenderModel";
|
|
8
8
|
import { cn } from "../styles";
|
|
9
9
|
import { useTranscriptSearch } from "./transcriptSearch";
|
|
10
|
+
import { TranscriptActivityNesting } from "./TranscriptRailEvent";
|
|
10
11
|
import { TranscriptSummary } from "./TranscriptSummary";
|
|
11
12
|
|
|
12
13
|
function countLabel(count: number, singular: string, plural: string): string {
|
|
@@ -156,7 +157,11 @@ export function TranscriptActivityGroup(props: {
|
|
|
156
157
|
const live = hasLiveActivity(props.entries);
|
|
157
158
|
|
|
158
159
|
if (searchActive) {
|
|
159
|
-
return
|
|
160
|
+
return (
|
|
161
|
+
<TranscriptActivityNesting.Provider value>
|
|
162
|
+
<div className="grid min-w-0 gap-1">{rows}</div>
|
|
163
|
+
</TranscriptActivityNesting.Provider>
|
|
164
|
+
);
|
|
160
165
|
}
|
|
161
166
|
|
|
162
167
|
const open = activityGroupOpen(userOpen);
|
|
@@ -167,7 +172,7 @@ export function TranscriptActivityGroup(props: {
|
|
|
167
172
|
flush
|
|
168
173
|
className={cn(
|
|
169
174
|
"flex items-center gap-1 text-left text-xs leading-tight text-dashboard-text-muted",
|
|
170
|
-
live && "text-
|
|
175
|
+
live && "text-dashboard-accent-text/80",
|
|
171
176
|
)}
|
|
172
177
|
onClick={(event) => {
|
|
173
178
|
event.preventDefault();
|
|
@@ -190,7 +195,9 @@ export function TranscriptActivityGroup(props: {
|
|
|
190
195
|
</span>
|
|
191
196
|
</Tooltip>
|
|
192
197
|
</TranscriptSummary>
|
|
193
|
-
<
|
|
198
|
+
<TranscriptActivityNesting.Provider value>
|
|
199
|
+
<div className="mt-1.5 grid min-w-0 gap-1">{rows}</div>
|
|
200
|
+
</TranscriptActivityNesting.Provider>
|
|
194
201
|
</details>
|
|
195
202
|
);
|
|
196
203
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { TranscriptAttachments } from "./TranscriptAttachment";
|
|
2
2
|
|
|
3
3
|
import { getDashboardAgentName } from "../agentName";
|
|
4
|
-
import { formatMessageTimestamp } from "../format";
|
|
5
4
|
import type {
|
|
6
5
|
ConversationTranscript,
|
|
7
6
|
TranscriptViewAttachmentsDeliveredPart,
|
|
8
7
|
} from "../types";
|
|
9
8
|
import { TranscriptMessageHeading } from "./TranscriptHeadingRow";
|
|
10
9
|
import { TranscriptMessageShell } from "./TranscriptMessageShell";
|
|
10
|
+
import { TranscriptTimestamp } from "./TranscriptTimestamp";
|
|
11
11
|
|
|
12
12
|
/** Render host-delivered conversation attachments as first-class transcript media. */
|
|
13
13
|
export function TranscriptAttachmentsDeliveredView(props: {
|
|
@@ -15,17 +15,15 @@ export function TranscriptAttachmentsDeliveredView(props: {
|
|
|
15
15
|
part: TranscriptViewAttachmentsDeliveredPart;
|
|
16
16
|
timestamp?: number;
|
|
17
17
|
}) {
|
|
18
|
-
const timestamp = formatMessageTimestamp(props.timestamp);
|
|
19
|
-
|
|
20
18
|
return (
|
|
21
19
|
<TranscriptMessageShell role="assistant" actor={getDashboardAgentName()}>
|
|
22
20
|
<TranscriptMessageHeading>
|
|
23
|
-
<span className="max-w-full truncate font-sans text-sm font-semibold leading-6 text-
|
|
21
|
+
<span className="max-w-full truncate font-sans text-sm font-semibold leading-6 text-dashboard-accent-text">
|
|
24
22
|
{getDashboardAgentName()}
|
|
25
23
|
</span>
|
|
26
|
-
{timestamp ? (
|
|
24
|
+
{typeof props.timestamp === "number" ? (
|
|
27
25
|
<span className="text-xs leading-6 text-dashboard-text-muted">
|
|
28
|
-
{timestamp}
|
|
26
|
+
<TranscriptTimestamp value={props.timestamp} />
|
|
29
27
|
</span>
|
|
30
28
|
) : null}
|
|
31
29
|
</TranscriptMessageHeading>
|
|
@@ -18,10 +18,10 @@ export function TranscriptContextEventView(props: {
|
|
|
18
18
|
? ` using the ${event.modelProfile} profile (${event.modelId})`
|
|
19
19
|
: "";
|
|
20
20
|
return (
|
|
21
|
-
<article className="min-w-0
|
|
21
|
+
<article className="min-w-0 py-0.5">
|
|
22
22
|
<div className="flex min-w-0 flex-wrap items-center justify-between gap-x-3 gap-y-1">
|
|
23
23
|
<strong
|
|
24
|
-
className={`font-
|
|
24
|
+
className={`font-sans text-xs font-semibold ${
|
|
25
25
|
handoff ? "text-sky-100" : "text-amber-100"
|
|
26
26
|
}`}
|
|
27
27
|
>
|
|
@@ -41,7 +41,7 @@ export function TranscriptEventView(props: { message: TranscriptViewMessage }) {
|
|
|
41
41
|
strokeWidth={2.2}
|
|
42
42
|
/>
|
|
43
43
|
</TranscriptSummary>
|
|
44
|
-
<pre className="mt-2 max-h-80 overflow-auto whitespace-pre-wrap break-words rounded-lg border border-dashboard-border bg-dashboard-surface px-3 py-2 font-
|
|
44
|
+
<pre className="mt-2 max-h-80 overflow-auto whitespace-pre-wrap break-words rounded-lg border border-dashboard-border bg-dashboard-surface-panel px-3 py-2 font-sans text-xs leading-relaxed text-dashboard-text-muted">
|
|
45
45
|
<HighlightText text={text} />
|
|
46
46
|
</pre>
|
|
47
47
|
</details>
|
|
@@ -177,7 +177,7 @@ function MarkdownTable(props: {
|
|
|
177
177
|
|
|
178
178
|
return (
|
|
179
179
|
<div className="min-w-0 max-w-full overflow-x-auto rounded-md border border-dashboard-border bg-dashboard-fill-faint">
|
|
180
|
-
<table className="w-max border-collapse text-left text-sm">
|
|
180
|
+
<table className="w-max min-w-full border-collapse text-left text-sm">
|
|
181
181
|
<thead className="bg-dashboard-overlay-soft">
|
|
182
182
|
<tr>
|
|
183
183
|
{Array.from({ length: columnCount }, (_, index) => {
|
|
@@ -185,7 +185,7 @@ function MarkdownTable(props: {
|
|
|
185
185
|
return (
|
|
186
186
|
<th
|
|
187
187
|
className={cn(
|
|
188
|
-
"whitespace-nowrap border-b border-dashboard-border px-2.5 py-1.5 font-
|
|
188
|
+
"whitespace-nowrap border-b border-dashboard-border px-2.5 py-1.5 font-sans text-xs font-medium text-dashboard-text-muted",
|
|
189
189
|
tableCellAlignClass(alignment),
|
|
190
190
|
)}
|
|
191
191
|
key={`h-${index}`}
|
|
@@ -365,7 +365,7 @@ function renderInlineCode(text: string, keyBase: number): ReactNode[] {
|
|
|
365
365
|
}
|
|
366
366
|
nodes.push(
|
|
367
367
|
<code
|
|
368
|
-
className="rounded-[0.25rem] bg-
|
|
368
|
+
className="rounded-[0.25rem] bg-dashboard-fill-strong px-1 py-0.5 font-mono text-[0.9em] text-dashboard-text"
|
|
369
369
|
key={`code-${keyBase}-${part++}`}
|
|
370
370
|
>
|
|
371
371
|
<HighlightText text={match[2] ?? ""} />
|