@sentry/junior-dashboard 0.248.0 → 0.249.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 +2 -2
- package/dist/client.js +36 -35
- package/dist/index.js +2 -2
- package/dist/tailwind.css +1 -1
- package/package.json +3 -3
- package/src/client/App.tsx +1 -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 +5 -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/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/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
|
@@ -14,7 +14,7 @@ export function StatCard(props: {
|
|
|
14
14
|
return (
|
|
15
15
|
<Card className="relative p-4 sm:p-5">
|
|
16
16
|
<div className="flex items-start justify-between gap-4">
|
|
17
|
-
<div className="font-
|
|
17
|
+
<div className="font-sans text-xs font-medium text-dashboard-text-muted">
|
|
18
18
|
{props.label}
|
|
19
19
|
</div>
|
|
20
20
|
<Icon aria-hidden="true" className="text-amber-400/55" size={15} />
|
|
@@ -23,7 +23,7 @@ export function StatCard(props: {
|
|
|
23
23
|
{props.value}
|
|
24
24
|
</div>
|
|
25
25
|
{props.detail ? (
|
|
26
|
-
<div className="mt-2 font-
|
|
26
|
+
<div className="mt-2 font-sans text-xs leading-relaxed text-dashboard-text-muted">
|
|
27
27
|
{props.detail}
|
|
28
28
|
</div>
|
|
29
29
|
) : null}
|
|
@@ -102,7 +102,7 @@ function ArchivedNotice(props: {
|
|
|
102
102
|
>
|
|
103
103
|
{restore.error ? (
|
|
104
104
|
<div
|
|
105
|
-
className="border-t border-rose-300/25 bg-rose-400/[0.12] px-3 py-2 font-
|
|
105
|
+
className="border-t border-rose-300/25 bg-rose-400/[0.12] px-3 py-2 font-sans text-xs text-rose-50/85"
|
|
106
106
|
role="alert"
|
|
107
107
|
>
|
|
108
108
|
Could not restore the conversation.
|
|
@@ -49,7 +49,7 @@ export function ConversationBrief(props: {
|
|
|
49
49
|
<StatusChip tone={outcomeTones[content.outcome.status]}>
|
|
50
50
|
{displayLabel(content.outcome.status)}
|
|
51
51
|
</StatusChip>
|
|
52
|
-
<span className="
|
|
52
|
+
<span className="text-xs text-dashboard-text-muted">
|
|
53
53
|
Brief v{props.brief.version} · updated{" "}
|
|
54
54
|
{formatTime(props.brief.updatedAt, {
|
|
55
55
|
dateStyle: "medium",
|
|
@@ -101,14 +101,14 @@ export function ConversationBrief(props: {
|
|
|
101
101
|
key={`${link.kind}:${link.url}`}
|
|
102
102
|
>
|
|
103
103
|
<a
|
|
104
|
-
className="min-w-0 break-all font-medium text-
|
|
104
|
+
className="min-w-0 break-all font-medium text-dashboard-accent-text underline decoration-dashboard-accent/30 underline-offset-2 hover:text-dashboard-accent-text"
|
|
105
105
|
href={link.url}
|
|
106
106
|
rel="noopener noreferrer"
|
|
107
107
|
target="_blank"
|
|
108
108
|
>
|
|
109
109
|
{link.label}
|
|
110
110
|
</a>
|
|
111
|
-
<span className="
|
|
111
|
+
<span className="text-xs text-dashboard-text-muted">
|
|
112
112
|
{displayLabel(link.kind)}
|
|
113
113
|
</span>
|
|
114
114
|
{link.status ? (
|
|
@@ -172,7 +172,7 @@ function BriefDecisions(props: { decisions: BriefContent["decisions"] }) {
|
|
|
172
172
|
<span className="min-w-0">{decision.text}</span>
|
|
173
173
|
</div>
|
|
174
174
|
{decision.by ? (
|
|
175
|
-
<div className="mt-0.5
|
|
175
|
+
<div className="mt-0.5 text-xs text-dashboard-text-muted">
|
|
176
176
|
by · {decision.by}
|
|
177
177
|
</div>
|
|
178
178
|
) : null}
|
|
@@ -124,13 +124,16 @@ function ChildAgentRow(props: {
|
|
|
124
124
|
|
|
125
125
|
return (
|
|
126
126
|
<button
|
|
127
|
-
className="grid w-full min-w-0 cursor-pointer gap-1.5 rounded-lg border border-dashboard-border-subtle bg-dashboard-surface px-3 py-2.5 text-left text-inherit transition-colors duration-200 hover:border-dashboard-border-emphasis hover:bg-dashboard-surface-hover focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-dashboard-focus"
|
|
127
|
+
className="grid w-full min-w-0 cursor-pointer gap-1.5 rounded-lg border border-dashboard-border-subtle bg-dashboard-surface-panel px-3 py-2.5 text-left text-inherit transition-colors duration-200 hover:border-dashboard-border-emphasis hover:bg-dashboard-surface-hover focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-dashboard-focus"
|
|
128
128
|
onClick={() =>
|
|
129
129
|
props.onOpen({
|
|
130
130
|
conversationId: agent.conversationId,
|
|
131
131
|
...(agent.redacted
|
|
132
132
|
? undefined
|
|
133
|
-
: {
|
|
133
|
+
: {
|
|
134
|
+
...(agent.name ? { agentName: agent.name } : undefined),
|
|
135
|
+
label: agent.title ?? agent.name,
|
|
136
|
+
}),
|
|
134
137
|
status: agent.status,
|
|
135
138
|
})
|
|
136
139
|
}
|
|
@@ -143,7 +146,7 @@ function ChildAgentRow(props: {
|
|
|
143
146
|
Private subagent
|
|
144
147
|
</span>
|
|
145
148
|
) : (
|
|
146
|
-
<span className="min-w-0 truncate font-
|
|
149
|
+
<span className="min-w-0 truncate font-medium text-dashboard-text-muted">
|
|
147
150
|
{agent.name ?? "subagent"}
|
|
148
151
|
</span>
|
|
149
152
|
)}
|
|
@@ -185,7 +188,7 @@ function ChildAgentRow(props: {
|
|
|
185
188
|
</span>
|
|
186
189
|
) : null}
|
|
187
190
|
{stats.length > 0 ? (
|
|
188
|
-
<span className="block
|
|
191
|
+
<span className="block text-xs tabular-nums text-dashboard-text-muted">
|
|
189
192
|
{stats.join(" · ")}
|
|
190
193
|
</span>
|
|
191
194
|
) : null}
|
|
@@ -351,7 +351,7 @@ export const ConversationComposer = memo(function ConversationComposer(
|
|
|
351
351
|
{props.error || imageError ? (
|
|
352
352
|
<div
|
|
353
353
|
aria-live="polite"
|
|
354
|
-
className="min-w-0 font-
|
|
354
|
+
className="min-w-0 font-sans text-xs leading-relaxed text-rose-300"
|
|
355
355
|
>
|
|
356
356
|
{imageError ?? props.error}
|
|
357
357
|
</div>
|
|
@@ -361,10 +361,10 @@ export const ConversationComposer = memo(function ConversationComposer(
|
|
|
361
361
|
// Accessory chrome needs a full footer row. Side-by-side mobile is
|
|
362
362
|
// only for the bare reply dock.
|
|
363
363
|
props.footerStart
|
|
364
|
-
? "block overflow-hidden focus-within:border-
|
|
365
|
-
: "grid grid-cols-[minmax(0,1fr)_auto] items-end overflow-hidden focus-within:border-
|
|
364
|
+
? "block overflow-hidden focus-within:border-dashboard-focus/45 focus-within:ring-1 focus-within:ring-dashboard-focus/25"
|
|
365
|
+
: "grid grid-cols-[minmax(0,1fr)_auto] items-end overflow-hidden focus-within:border-dashboard-accent/35 focus-within:ring-1 focus-within:ring-dashboard-focus/35 md:block",
|
|
366
366
|
dashboardComposerSurfaceClass,
|
|
367
|
-
dragging && "ring-2 ring-
|
|
367
|
+
dragging && "ring-2 ring-dashboard-focus",
|
|
368
368
|
)}
|
|
369
369
|
onDragOver={(event) => {
|
|
370
370
|
if (!event.dataTransfer.types.includes("Files")) return;
|
|
@@ -431,7 +431,7 @@ export const ConversationComposer = memo(function ConversationComposer(
|
|
|
431
431
|
autoCapitalize="off"
|
|
432
432
|
autoComplete="off"
|
|
433
433
|
autoCorrect="off"
|
|
434
|
-
className="min-h-12 max-h-28 w-full resize-none overflow-y-auto border-0 bg-transparent px-3 py-3 font-sans text-base leading-relaxed text-dashboard-text outline-none placeholder:text-dashboard-text-muted/65 md:min-h-14 md:max-h-none md:
|
|
434
|
+
className="min-h-12 max-h-28 w-full resize-none overflow-y-auto border-0 bg-transparent px-3 py-3 font-sans text-base leading-relaxed text-dashboard-text outline-none placeholder:text-dashboard-text-muted/65 md:min-h-14 md:max-h-none md:overflow-visible md:px-4 md:py-3"
|
|
435
435
|
disabled={Boolean(props.restoreDraftOnError && createPending)}
|
|
436
436
|
enterKeyHint="send"
|
|
437
437
|
id={id}
|
|
@@ -462,6 +462,7 @@ export const ConversationComposer = memo(function ConversationComposer(
|
|
|
462
462
|
aria-label="Attach images"
|
|
463
463
|
disabled={sendLocked || readingImages}
|
|
464
464
|
onClick={() => fileInputRef.current?.click()}
|
|
465
|
+
size="icon"
|
|
465
466
|
title="Attach images (up to 3 MB total)"
|
|
466
467
|
type="button"
|
|
467
468
|
>
|
|
@@ -478,7 +479,6 @@ export const ConversationComposer = memo(function ConversationComposer(
|
|
|
478
479
|
{props.onStop ? (
|
|
479
480
|
<Button
|
|
480
481
|
aria-label={props.stopPending ? "Stopping" : "Stop"}
|
|
481
|
-
className="rounded-lg font-sans"
|
|
482
482
|
disabled={props.stopPending || !online}
|
|
483
483
|
onClick={() => void stopTurn()}
|
|
484
484
|
title="Stop Junior"
|
|
@@ -491,7 +491,7 @@ export const ConversationComposer = memo(function ConversationComposer(
|
|
|
491
491
|
) : null}
|
|
492
492
|
<Button
|
|
493
493
|
aria-label={sendLocked ? "Sending message" : props.submitLabel}
|
|
494
|
-
className="
|
|
494
|
+
className="disabled:!border-transparent disabled:!bg-dashboard-fill-hover disabled:!text-dashboard-text-muted disabled:!opacity-100"
|
|
495
495
|
disabled={
|
|
496
496
|
(!canSend && !images.length) ||
|
|
497
497
|
!online ||
|
|
@@ -499,6 +499,7 @@ export const ConversationComposer = memo(function ConversationComposer(
|
|
|
499
499
|
readingImages
|
|
500
500
|
}
|
|
501
501
|
title={sendLocked ? "Sending message" : props.submitLabel}
|
|
502
|
+
tone="primary"
|
|
502
503
|
type="submit"
|
|
503
504
|
>
|
|
504
505
|
<Send aria-hidden="true" size={14} />
|
|
@@ -114,7 +114,7 @@ export function ConversationHeader(props: {
|
|
|
114
114
|
<Ellipsis aria-hidden="true" size={18} strokeWidth={2} />
|
|
115
115
|
</HeaderIconButton>
|
|
116
116
|
{mobileMenuOpen ? (
|
|
117
|
-
<div className="absolute right-0 top-[calc(100%+0.35rem)] z-40 w-56 rounded-xl border border-
|
|
117
|
+
<div className="absolute right-0 top-[calc(100%+0.35rem)] z-40 w-56 rounded-xl border border-dashboard-border-strong bg-dashboard-surface-raised/95 p-1.5 shadow-2xl shadow-black/75 backdrop-blur-xl">
|
|
118
118
|
<ConversationHeaderActions
|
|
119
119
|
archive={props.archive}
|
|
120
120
|
conversationId={props.conversationId}
|
|
@@ -138,7 +138,7 @@ export function ConversationHeader(props: {
|
|
|
138
138
|
/>
|
|
139
139
|
{openMobileNavigation ? (
|
|
140
140
|
<button
|
|
141
|
-
className="mt-0.5 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-
|
|
141
|
+
className="mt-0.5 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-hover focus-visible:bg-dashboard-fill-hover focus-visible:outline-none"
|
|
142
142
|
onClick={() => {
|
|
143
143
|
setMobileMenuOpen(false);
|
|
144
144
|
openMobileNavigation();
|
|
@@ -175,7 +175,7 @@ export function ConversationHeader(props: {
|
|
|
175
175
|
<MobileHeaderLivePortal>{liveIndicator}</MobileHeaderLivePortal>
|
|
176
176
|
<header
|
|
177
177
|
className={cn(
|
|
178
|
-
"sticky top-0 z-10 -mx-4 border-b border-dashboard-border
|
|
178
|
+
"sticky top-0 z-10 -mx-4 border-b border-dashboard-border bg-dashboard-bg md:-mx-7",
|
|
179
179
|
!showMobileHeader && "hidden md:block",
|
|
180
180
|
)}
|
|
181
181
|
>
|
|
@@ -221,12 +221,12 @@ export function ConversationHeader(props: {
|
|
|
221
221
|
{props.linkedWork ? (
|
|
222
222
|
<div
|
|
223
223
|
aria-label="Linked work"
|
|
224
|
-
className="border-t border-dashboard-border
|
|
224
|
+
className="border-t border-dashboard-border-subtle px-4 py-2.5 md:px-7"
|
|
225
225
|
>
|
|
226
226
|
{props.linkedWork}
|
|
227
227
|
</div>
|
|
228
228
|
) : null}
|
|
229
|
-
<div className="hidden border-t border-dashboard-border px-7 md:flex">
|
|
229
|
+
<div className="hidden border-t border-dashboard-border-subtle px-7 md:flex">
|
|
230
230
|
<TranscriptViewToggle
|
|
231
231
|
labelled
|
|
232
232
|
onChange={props.onViewChange}
|
|
@@ -96,7 +96,7 @@ export function ConversationHeaderActions(props: {
|
|
|
96
96
|
<Button
|
|
97
97
|
aria-label="Conversation details"
|
|
98
98
|
aria-pressed={props.detailsOpen}
|
|
99
|
-
className="ml-2
|
|
99
|
+
className="ml-2"
|
|
100
100
|
onClick={props.onDetailsClick}
|
|
101
101
|
>
|
|
102
102
|
<PanelRight aria-hidden="true" size={15} strokeWidth={2} />
|
|
@@ -153,13 +153,13 @@ function ViewModeButton(props: {
|
|
|
153
153
|
<ToggleButton
|
|
154
154
|
aria-label={props.label}
|
|
155
155
|
className={cn(
|
|
156
|
-
"!
|
|
156
|
+
"!no-underline",
|
|
157
157
|
props.labelled
|
|
158
|
-
? "relative flex h-11 items-center gap-2 px-0 py-0 text-
|
|
159
|
-
: "grid size-7 place-items-center rounded px-0 py-0",
|
|
158
|
+
? "relative flex h-11 items-center gap-2 rounded-none px-0 py-0 text-sm after:absolute after:inset-x-0 after:bottom-0 after:h-0.5"
|
|
159
|
+
: "grid size-7 place-items-center rounded-md px-0 py-0",
|
|
160
160
|
props.active &&
|
|
161
161
|
(props.labelled
|
|
162
|
-
? "text-
|
|
162
|
+
? "text-dashboard-text after:bg-dashboard-text-solid"
|
|
163
163
|
: "bg-dashboard-fill-hover text-dashboard-text"),
|
|
164
164
|
)}
|
|
165
165
|
onClick={props.onClick}
|
|
@@ -191,7 +191,7 @@ export function HeaderIconButton(props: {
|
|
|
191
191
|
aria-pressed={props.pressed}
|
|
192
192
|
className={cn(
|
|
193
193
|
"text-dashboard-text-muted",
|
|
194
|
-
props.pressed && "bg-
|
|
194
|
+
props.pressed && "bg-dashboard-fill-strong text-dashboard-text",
|
|
195
195
|
)}
|
|
196
196
|
onClick={props.onClick}
|
|
197
197
|
size="icon"
|
|
@@ -233,8 +233,8 @@ function MenuActionButton(props: {
|
|
|
233
233
|
aria-label={props.label}
|
|
234
234
|
aria-pressed={props.pressed}
|
|
235
235
|
className={cn(
|
|
236
|
-
"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-
|
|
237
|
-
props.pressed && "bg-
|
|
236
|
+
"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",
|
|
237
|
+
props.pressed && "bg-dashboard-fill-strong",
|
|
238
238
|
)}
|
|
239
239
|
onClick={props.onClick}
|
|
240
240
|
type="button"
|
|
@@ -258,7 +258,7 @@ function ArchiveConversationButton(
|
|
|
258
258
|
return (
|
|
259
259
|
<button
|
|
260
260
|
aria-label={label}
|
|
261
|
-
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-
|
|
261
|
+
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"
|
|
262
262
|
disabled={props.disabled}
|
|
263
263
|
onClick={props.onClick}
|
|
264
264
|
type="button"
|
|
@@ -172,7 +172,7 @@ function ConversationCardSection(props: {
|
|
|
172
172
|
return (
|
|
173
173
|
<section aria-labelledby={`conversation-section-${props.section.key}`}>
|
|
174
174
|
<h3
|
|
175
|
-
className="mb-2 mt-0 px-1 font-
|
|
175
|
+
className="mb-2 mt-0 px-1 font-sans text-xs font-medium text-dashboard-text-muted"
|
|
176
176
|
id={`conversation-section-${props.section.key}`}
|
|
177
177
|
>
|
|
178
178
|
{props.section.label}
|
|
@@ -238,7 +238,7 @@ function ConversationCard(props: {
|
|
|
238
238
|
</div>
|
|
239
239
|
<div className="flex items-start gap-3">
|
|
240
240
|
<Link
|
|
241
|
-
className="pointer-events-auto whitespace-nowrap font-
|
|
241
|
+
className="pointer-events-auto whitespace-nowrap font-sans text-xs tabular-nums text-dashboard-text-muted hover:text-dashboard-text focus:outline-none focus:ring-2 focus:ring-dashboard-focus"
|
|
242
242
|
to={conversationPath(conversation.id)}
|
|
243
243
|
>
|
|
244
244
|
{formatRelativeTime(conversation.lastSeenAt)}
|
|
@@ -272,7 +272,7 @@ function ConversationCard(props: {
|
|
|
272
272
|
{status === "active" ? "Working…" : "No recent message"}
|
|
273
273
|
</p>
|
|
274
274
|
)}
|
|
275
|
-
<div className="relative z-[1] flex min-w-0 flex-wrap items-center gap-x-1.5 gap-y-1 font-
|
|
275
|
+
<div className="relative z-[1] flex min-w-0 flex-wrap items-center gap-x-1.5 gap-y-1 font-sans text-xs text-dashboard-text-muted pointer-events-none">
|
|
276
276
|
{location ? <span className="truncate">{location}</span> : null}
|
|
277
277
|
{location && participants.length > 0 ? (
|
|
278
278
|
<span aria-hidden="true">·</span>
|
|
@@ -45,7 +45,7 @@ export function ConversationListStatusIcon(props: {
|
|
|
45
45
|
className={cn(
|
|
46
46
|
"size-1.5 shrink-0 rounded-full",
|
|
47
47
|
props.status === "failed" && "bg-rose-300",
|
|
48
|
-
props.status === "idle" && "bg-
|
|
48
|
+
props.status === "idle" && "bg-dashboard-text-faint",
|
|
49
49
|
)}
|
|
50
50
|
/>
|
|
51
51
|
);
|
|
@@ -66,17 +66,17 @@ export function ConversationMemories(props: { conversationId: string }) {
|
|
|
66
66
|
<ol className="m-0 grid list-none gap-3 p-0">
|
|
67
67
|
{query.data.memories.map((memory) => (
|
|
68
68
|
<li
|
|
69
|
-
className="grid gap-2 rounded-lg border border-dashboard-border-subtle bg-dashboard-surface px-3 py-3"
|
|
69
|
+
className="grid gap-2 rounded-lg border border-dashboard-border-subtle bg-dashboard-surface-panel px-3 py-3"
|
|
70
70
|
key={memory.id}
|
|
71
71
|
>
|
|
72
72
|
<p className="m-0 whitespace-pre-wrap break-words text-sm leading-relaxed text-dashboard-text">
|
|
73
73
|
{memory.content}
|
|
74
74
|
</p>
|
|
75
|
-
<div className="flex flex-wrap items-center gap-1.5
|
|
76
|
-
<span className="rounded border border-dashboard-border-subtle bg-dashboard-surface-raised px-1.5 py-0.5">
|
|
75
|
+
<div className="flex flex-wrap items-center gap-1.5 text-xs tabular-nums text-dashboard-text-muted">
|
|
76
|
+
<span className="rounded-md border border-dashboard-border-subtle bg-dashboard-surface-raised px-1.5 py-0.5">
|
|
77
77
|
{memory.kind}
|
|
78
78
|
</span>
|
|
79
|
-
<span className="rounded border border-dashboard-border-subtle bg-dashboard-surface-raised px-1.5 py-0.5">
|
|
79
|
+
<span className="rounded-md border border-dashboard-border-subtle bg-dashboard-surface-raised px-1.5 py-0.5">
|
|
80
80
|
{memory.visibility}
|
|
81
81
|
</span>
|
|
82
82
|
<time className="ml-auto" dateTime={memory.capturedAt}>
|
|
@@ -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
|
>
|