@sentry/junior-dashboard 0.264.0 → 0.265.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/LICENSE +201 -0
- package/README.md +2 -5
- package/dist/app.js +119 -35
- package/dist/client.js +145 -136
- package/dist/index.d.ts +0 -1
- package/dist/index.js +119 -35
- package/dist/tailwind.css +1 -1
- package/package.json +5 -4
- package/src/api/schema.ts +0 -1
- package/src/app.ts +5 -20
- package/src/client/App.tsx +29 -31
- package/src/client/api.ts +7 -0
- package/src/client/components/BottomSheet.tsx +12 -2
- package/src/client/components/CopyButton.tsx +83 -0
- package/src/client/components/DetailsPanel.tsx +133 -0
- package/src/client/components/Drawer.tsx +15 -24
- package/src/client/components/FilterBar.tsx +16 -31
- package/src/client/components/Metric.tsx +33 -23
- package/src/client/components/PageContentSkeleton.tsx +1 -1
- package/src/client/components/Pagination.tsx +1 -1
- package/src/client/components/ParticipantAvatarStack.tsx +40 -36
- package/src/client/components/ProfileMenu.tsx +27 -93
- package/src/client/components/README.md +86 -77
- package/src/client/components/SegmentedNav.tsx +1 -1
- package/src/client/components/ShimmerText.tsx +2 -6
- package/src/client/components/ThemeSwitcher.tsx +19 -15
- package/src/client/components/charts/ActivityChart.tsx +173 -288
- package/src/client/components/charts/CacheWrites.tsx +63 -50
- package/src/client/components/charts/InputCacheChart.tsx +137 -131
- package/src/client/components/charts/README.md +4 -4
- package/src/client/components/charts/SystemMetricCharts.tsx +68 -95
- package/src/client/components/charts/WorkspaceUsageChart.tsx +42 -62
- package/src/client/components/controls/DirectorySortSelect.tsx +3 -3
- package/src/client/components/controls/TimeRangeSelector.tsx +10 -15
- package/src/client/components/layout/DashboardHeader.tsx +44 -90
- package/src/client/components/layout/SecondaryNavigation.tsx +2 -1
- package/src/client/components/layout/VisualViewportShell.tsx +2 -2
- package/src/client/components/ui/accordion.tsx +77 -0
- package/src/client/components/ui/alert-dialog.tsx +89 -0
- package/src/client/components/ui/button.tsx +85 -0
- package/src/client/components/ui/chart.tsx +74 -0
- package/src/client/components/ui/checkbox.tsx +26 -0
- package/src/client/components/ui/collapsible.tsx +22 -0
- package/src/client/components/ui/field.tsx +49 -0
- package/src/client/components/ui/input.tsx +35 -0
- package/src/client/components/ui/native-select.tsx +57 -0
- package/src/client/components/ui/popover.tsx +67 -0
- package/src/client/components/ui/radio-group.tsx +32 -0
- package/src/client/components/ui/sheet.tsx +13 -3
- package/src/client/components/ui/skeleton.tsx +19 -0
- package/src/client/components/ui/table.tsx +80 -0
- package/src/client/components/ui/tabs.tsx +75 -0
- package/src/client/components/ui/textarea.tsx +17 -0
- package/src/client/components/ui/toast.tsx +215 -0
- package/src/client/components/ui/toggle-group.tsx +36 -0
- package/src/client/components/ui/toggle.tsx +37 -0
- package/src/client/components/ui/tooltip.tsx +168 -0
- package/src/client/components/ui/trace.tsx +96 -0
- package/src/client/conversations/ChatLayout.tsx +7 -3
- package/src/client/conversations/ConversationBrief.tsx +17 -6
- package/src/client/conversations/ConversationComposer.tsx +26 -12
- package/src/client/conversations/ConversationDetails.tsx +147 -62
- package/src/client/conversations/ConversationEventDetails.tsx +141 -0
- package/src/client/conversations/ConversationEventLog.tsx +150 -129
- package/src/client/conversations/ConversationHeader.tsx +8 -3
- package/src/client/conversations/ConversationHeaderActions.tsx +90 -82
- package/src/client/conversations/ConversationHomeList.tsx +1 -1
- package/src/client/conversations/ConversationLinkedWork.tsx +118 -0
- package/src/client/conversations/ConversationMeta.tsx +55 -88
- package/src/client/conversations/ConversationPage.tsx +220 -101
- package/src/client/conversations/ConversationSidebar.tsx +48 -29
- package/src/client/conversations/ConversationWatches.tsx +165 -0
- package/src/client/conversations/ConversationWorkspace.tsx +12 -22
- package/src/client/conversations/ConversationWorkspaceLoading.tsx +1 -1
- package/src/client/conversations/DetailsList.tsx +124 -0
- package/src/client/conversations/EventDetails.tsx +42 -8
- package/src/client/conversations/ForkConversationButton.tsx +27 -16
- package/src/client/conversations/ObjectCard.tsx +20 -8
- package/src/client/conversations/PendingMailboxStack.tsx +52 -33
- package/src/client/conversations/README.md +86 -13
- package/src/client/conversations/ShareConversationButton.tsx +25 -13
- package/src/client/conversations/SubagentTranscriptDrawer.tsx +21 -15
- package/src/client/conversations/ToolFrame.tsx +36 -52
- package/src/client/conversations/TranscriptActivityGroup.tsx +13 -4
- package/src/client/conversations/TranscriptAutomationTriggerView.tsx +5 -4
- package/src/client/conversations/TranscriptContextEventView.tsx +25 -11
- package/src/client/conversations/TranscriptHeadingRow.tsx +7 -7
- package/src/client/conversations/TranscriptLoading.tsx +1 -1
- package/src/client/conversations/TranscriptMarkdown.tsx +25 -20
- package/src/client/conversations/TranscriptMessageContextView.tsx +8 -2
- package/src/client/conversations/TranscriptMessageView.tsx +6 -1
- package/src/client/conversations/TranscriptReasoningView.tsx +54 -68
- package/src/client/conversations/TranscriptTimestamp.tsx +9 -7
- package/src/client/conversations/TranscriptToolView.tsx +1 -1
- package/src/client/conversations/TranscriptTurnContextView.tsx +99 -27
- package/src/client/conversations/TranscriptView.tsx +63 -27
- package/src/client/conversations/eventLog.ts +57 -0
- package/src/client/conversations/eventTime.ts +60 -0
- package/src/client/conversations/queries.ts +29 -0
- package/src/client/conversations/transcriptBottomPinning.ts +34 -0
- package/src/client/format.ts +5 -0
- package/src/client/pages/ConnectionsPage.tsx +2 -2
- package/src/client/pages/PersonalTokensPage.tsx +4 -4
- package/src/client/pages/SettingsPage.tsx +9 -10
- package/src/client/pages/admin/ServiceAccountsSection.tsx +2 -2
- package/src/client/pages/automations/AutomationCostChart.tsx +50 -71
- package/src/client/pages/automations/AutomationDeleteDialog.tsx +87 -0
- package/src/client/pages/automations/AutomationDetails.tsx +193 -0
- package/src/client/pages/automations/AutomationEditPage.tsx +7 -8
- package/src/client/pages/automations/AutomationEditor.tsx +41 -29
- package/src/client/pages/automations/AutomationEditorLoading.tsx +1 -1
- package/src/client/pages/automations/AutomationEventFields.tsx +202 -119
- package/src/client/pages/automations/AutomationExecutionChart.tsx +51 -64
- package/src/client/pages/automations/AutomationExecutionStatusChart.tsx +47 -70
- package/src/client/pages/automations/AutomationExecutionsPage.tsx +150 -126
- package/src/client/pages/automations/AutomationFilters.tsx +189 -74
- package/src/client/pages/automations/AutomationLifecycle.tsx +109 -78
- package/src/client/pages/automations/AutomationOutcomeFields.tsx +26 -24
- package/src/client/pages/automations/AutomationRecentRuns.tsx +143 -0
- package/src/client/pages/automations/AutomationRow.tsx +12 -138
- package/src/client/pages/automations/AutomationRunDetails.tsx +307 -0
- package/src/client/pages/automations/AutomationRunsPage.tsx +119 -94
- package/src/client/pages/automations/AutomationScheduleFields.tsx +51 -51
- package/src/client/pages/automations/AutomationStatus.tsx +201 -0
- package/src/client/pages/automations/AutomationVersionsPage.tsx +65 -28
- package/src/client/pages/automations/AutomationsPage.tsx +80 -68
- package/src/client/pages/automations/AutomationsPageLayout.tsx +46 -14
- package/src/client/pages/automations/README.md +57 -0
- package/src/client/pages/automations/TriggerFilters.tsx +22 -0
- package/src/client/pages/automations/automationFormat.ts +37 -23
- package/src/client/pages/code/CodeActivityChart.tsx +59 -101
- package/src/client/pages/code/CodePage.tsx +52 -55
- package/src/client/pages/code/RepositoryPage.tsx +6 -8
- package/src/client/pages/locations/LocationActivityChart.tsx +53 -70
- package/src/client/pages/locations/LocationDirectoryActivityChart.tsx +60 -80
- package/src/client/pages/memory/MemoryCostChart.tsx +79 -103
- package/src/client/pages/memory/MemoryDetails.tsx +218 -0
- package/src/client/pages/memory/MemoryPage.tsx +168 -112
- package/src/client/pages/memory/MemoryPageLayout.tsx +33 -9
- package/src/client/pages/memory/MemoryTimeline.tsx +46 -69
- package/src/client/pages/memory/memoryRecord.ts +1 -1
- package/src/client/pages/people/ContributionGrid.tsx +23 -16
- package/src/client/pages/people/PeopleActivityChart.tsx +68 -107
- package/src/client/pages/people/ProfileCodeChanges.tsx +5 -5
- package/src/client/pages/system/BaseSandboxCard.tsx +1 -1
- package/src/client/pages/system/ConversationActivityChart.tsx +49 -67
- package/src/client/pages/system/GuardianActivity.tsx +1 -2
- package/src/client/pages/system/PluginBarChart.tsx +106 -87
- package/src/client/pages/system/PluginReportRecordSet.tsx +25 -24
- package/src/client/pages/system/README.md +23 -0
- package/src/client/pages/system/SystemNavigation.tsx +5 -1
- package/src/client/pages/system/WorkspaceDeleteDialog.tsx +111 -0
- package/src/client/pages/system/WorkspaceDetails.tsx +200 -43
- package/src/client/pages/system/WorkspaceEditor.tsx +59 -61
- package/src/client/pages/system/WorkspaceFormPage.tsx +23 -47
- package/src/client/pages/system/WorkspaceList.tsx +20 -30
- package/src/client/pages/system/WorkspacesPage.tsx +117 -119
- package/src/client/pages/system/sandboxSize.ts +8 -0
- package/src/client/pages/system/workspaceQueries.ts +53 -0
- package/src/client/pages/user/PluginUserPage.tsx +51 -2
- package/src/client/pages/user/pluginUserPageData.ts +1 -6
- package/src/client/styles.ts +4 -0
- package/src/client.tsx +7 -1
- package/src/mock-reporting/automation-collection.ts +4 -2
- package/src/mock-reporting/fixtures.ts +23 -7
- package/src/mock-reporting/routes.ts +12 -0
- package/src/mock-reporting/watches.ts +94 -0
- package/src/shell.ts +4 -9
- package/src/tailwind.css +0 -10
- package/src/client/components/Button.tsx +0 -118
- package/src/client/components/Field.tsx +0 -53
- package/src/client/components/SegmentedTabs.tsx +0 -119
- package/src/client/components/Select.tsx +0 -52
- package/src/client/components/Skeleton.tsx +0 -17
- package/src/client/components/TextInput.tsx +0 -58
- package/src/client/components/Tooltip.tsx +0 -216
- package/src/client/components/charts/useChartLayout.ts +0 -27
- package/src/client/components/ui/sheet.LICENSE +0 -21
- package/src/client/conversations/ConversationDetailsFrame.tsx +0 -119
- package/src/client/conversations/CopyMarkdownButton.tsx +0 -65
- package/src/client/pages/automations/AutomationDetailsDrawer.tsx +0 -219
- package/src/client/pages/dev/ChartFixtures.tsx +0 -325
- package/src/client/pages/dev/ComponentsPage.tsx +0 -899
- package/src/client/pages/dev/ConversationFixture.tsx +0 -231
- package/src/client/pages/dev/ObjectFixtures.tsx +0 -138
- package/src/client/pages/dev/SegmentedFixtures.tsx +0 -59
- package/src/client/pages/dev/SelectFixtures.tsx +0 -62
- package/src/client/pages/dev/TranscriptActivityFixtures.tsx +0 -206
- package/src/client/pages/memory/MemoryDetailsDrawer.tsx +0 -167
- package/src/client/pages/system/SandboxSizeSummary.tsx +0 -47
- package/src/client/pages/system/SnapshotSummary.tsx +0 -78
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
ConversationDetailReport,
|
|
3
|
-
ConversationReportEventData,
|
|
4
|
-
} from "@sentry/junior/api/schema";
|
|
5
|
-
|
|
6
|
-
import { ChatLayout } from "../../conversations/ChatLayout";
|
|
7
|
-
import { TranscriptMessageView } from "../../conversations/TranscriptMessageView";
|
|
8
|
-
import { ConversationTranscriptView } from "../../conversations/ConversationTranscript";
|
|
9
|
-
|
|
10
|
-
const TIMESTAMP = "2026-08-07T12:00:00.000Z";
|
|
11
|
-
const EVENTS: ConversationReportEventData[] = [
|
|
12
|
-
{
|
|
13
|
-
type: "message",
|
|
14
|
-
messageId: "gallery-user",
|
|
15
|
-
role: "user",
|
|
16
|
-
source: "slack",
|
|
17
|
-
actorIdentity: { fullName: "Alex Rivera" },
|
|
18
|
-
text: "Show me the visual QA.",
|
|
19
|
-
},
|
|
20
|
-
{ type: "turn_lifecycle", turnId: "gallery-turn", state: "started" },
|
|
21
|
-
{
|
|
22
|
-
type: "turn_context",
|
|
23
|
-
turnId: "gallery-turn",
|
|
24
|
-
pluginName: "memory",
|
|
25
|
-
kind: "recall",
|
|
26
|
-
version: 1,
|
|
27
|
-
content: {
|
|
28
|
-
memories: [
|
|
29
|
-
{
|
|
30
|
-
id: "gallery-memory",
|
|
31
|
-
content: "Use desktop and mobile screenshots for visual review.",
|
|
32
|
-
observedAtMs: Date.parse(TIMESTAMP),
|
|
33
|
-
scope: "personal",
|
|
34
|
-
kind: "preference",
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
type: "message",
|
|
41
|
-
messageId: "gallery-reply",
|
|
42
|
-
role: "assistant",
|
|
43
|
-
source: "slack",
|
|
44
|
-
text: "The change is ready for review.\n\nI tightened the conversation layout and kept the event details available below.",
|
|
45
|
-
cards: [
|
|
46
|
-
{
|
|
47
|
-
kind: "object",
|
|
48
|
-
plugin: "github",
|
|
49
|
-
key: "getsentry/junior#1200",
|
|
50
|
-
},
|
|
51
|
-
],
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
type: "attachments_delivered",
|
|
55
|
-
attachments: [
|
|
56
|
-
{
|
|
57
|
-
id: "qa-chart-png",
|
|
58
|
-
filename: "before.png",
|
|
59
|
-
contentType: "image/png",
|
|
60
|
-
bytes: 18211,
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
id: "qa-chart-png",
|
|
64
|
-
filename: "after.png",
|
|
65
|
-
contentType: "image/png",
|
|
66
|
-
bytes: 18211,
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
type: "message",
|
|
72
|
-
messageId: "gallery-comment",
|
|
73
|
-
role: "user",
|
|
74
|
-
eventType: "pull_request.comment.created",
|
|
75
|
-
eventObjectType: "code_change",
|
|
76
|
-
trustedSummary:
|
|
77
|
-
"GitHub PR getsentry/junior#1200 received a comment from vercel[bot].",
|
|
78
|
-
text: "Preview deployment is ready.",
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
type: "assistant_message",
|
|
82
|
-
parts: [
|
|
83
|
-
{
|
|
84
|
-
type: "reasoning",
|
|
85
|
-
text: "Check the preview before reporting the result.",
|
|
86
|
-
},
|
|
87
|
-
],
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
type: "tool_calls",
|
|
91
|
-
calls: [
|
|
92
|
-
{
|
|
93
|
-
toolCallId: "gallery-preview",
|
|
94
|
-
name: "webFetch",
|
|
95
|
-
status: "completed",
|
|
96
|
-
input: { url: "https://example.com/preview" },
|
|
97
|
-
output: { status: 200 },
|
|
98
|
-
},
|
|
99
|
-
],
|
|
100
|
-
},
|
|
101
|
-
{
|
|
102
|
-
type: "message",
|
|
103
|
-
messageId: "gallery-review",
|
|
104
|
-
role: "user",
|
|
105
|
-
eventType: "pull_request.review.commented",
|
|
106
|
-
eventObjectType: "code_change",
|
|
107
|
-
trustedSummary: "GitHub PR getsentry/junior#1200 received a review.",
|
|
108
|
-
text: "The preview is ready for visual review.",
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
type: "message",
|
|
112
|
-
messageId: "gallery-event-batch",
|
|
113
|
-
role: "user",
|
|
114
|
-
eventType: "pull_request.review.approved",
|
|
115
|
-
eventObjectType: "code_change",
|
|
116
|
-
trustedSummary: "GitHub PR getsentry/junior#1200 was approved by dcramer.",
|
|
117
|
-
events: [
|
|
118
|
-
{
|
|
119
|
-
eventType: "pull_request.review.approved",
|
|
120
|
-
label: "GitHub PR getsentry/junior#1200",
|
|
121
|
-
trustedSummary:
|
|
122
|
-
"GitHub PR getsentry/junior#1200 was approved by dcramer.",
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
eventType: "pull_request.review.commented",
|
|
126
|
-
label: "GitHub PR getsentry/junior#1200",
|
|
127
|
-
trustedSummary:
|
|
128
|
-
"GitHub PR getsentry/junior#1200 received a review comment from cursor[bot].",
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
eventType: "pull_request.review_comment.created",
|
|
132
|
-
label: "GitHub PR getsentry/junior#1200",
|
|
133
|
-
trustedSummary:
|
|
134
|
-
"GitHub PR getsentry/junior#1200 received an inline review comment from cursor[bot].",
|
|
135
|
-
},
|
|
136
|
-
],
|
|
137
|
-
text: "[task]\n\nThis is a task, not a message from a person.\n\nYou received 3 events.",
|
|
138
|
-
},
|
|
139
|
-
];
|
|
140
|
-
|
|
141
|
-
const CONVERSATION: ConversationDetailReport = {
|
|
142
|
-
conversationId: "internal:dashboard-qa",
|
|
143
|
-
displayTitle: "Conversation spacing",
|
|
144
|
-
cumulativeDurationMs: 0,
|
|
145
|
-
isParticipant: true,
|
|
146
|
-
status: "completed",
|
|
147
|
-
startedAt: TIMESTAMP,
|
|
148
|
-
lastSeenAt: TIMESTAMP,
|
|
149
|
-
lastProgressAt: TIMESTAMP,
|
|
150
|
-
generatedAt: TIMESTAMP,
|
|
151
|
-
surface: "slack",
|
|
152
|
-
eventHistory: { status: "available" },
|
|
153
|
-
annotations: [
|
|
154
|
-
{
|
|
155
|
-
kind: "object",
|
|
156
|
-
objectType: "code_change",
|
|
157
|
-
plugin: "github",
|
|
158
|
-
key: "getsentry/junior#1200",
|
|
159
|
-
label: "getsentry/junior#1200",
|
|
160
|
-
title: "Tighten conversation spacing",
|
|
161
|
-
status: "draft",
|
|
162
|
-
displayType: "Pull request",
|
|
163
|
-
url: "https://github.com/getsentry/junior/pull/1200",
|
|
164
|
-
facts: {
|
|
165
|
-
type: "code_change",
|
|
166
|
-
author: "alex",
|
|
167
|
-
sourceBranch: "fix/conversation-spacing",
|
|
168
|
-
targetBranch: "main",
|
|
169
|
-
},
|
|
170
|
-
createdAt: TIMESTAMP,
|
|
171
|
-
updatedAt: TIMESTAMP,
|
|
172
|
-
},
|
|
173
|
-
],
|
|
174
|
-
events: EVENTS.map((data, seq) => ({
|
|
175
|
-
seq,
|
|
176
|
-
createdAt: new Date(Date.parse(TIMESTAMP) + seq * 1_000).toISOString(),
|
|
177
|
-
data,
|
|
178
|
-
})),
|
|
179
|
-
};
|
|
180
|
-
|
|
181
|
-
/** Use the local mock reporting attachment route to review wrapping and previews. */
|
|
182
|
-
export function MessageAttachmentsFixture() {
|
|
183
|
-
return (
|
|
184
|
-
<div className="min-w-0 max-w-[52.5rem] bg-dashboard-bg p-3">
|
|
185
|
-
<TranscriptMessageView
|
|
186
|
-
conversation={CONVERSATION}
|
|
187
|
-
message={{
|
|
188
|
-
sourceSeq: 0,
|
|
189
|
-
timestamp: Date.parse(TIMESTAMP),
|
|
190
|
-
role: "assistant",
|
|
191
|
-
parts: [{ type: "text", text: "Two charts and the review notes." }],
|
|
192
|
-
attachments: [
|
|
193
|
-
{
|
|
194
|
-
id: "qa-chart-png",
|
|
195
|
-
filename: "before.png",
|
|
196
|
-
contentType: "image/png",
|
|
197
|
-
bytes: 18211,
|
|
198
|
-
},
|
|
199
|
-
{
|
|
200
|
-
id: "qa-chart-png",
|
|
201
|
-
filename: "after.png",
|
|
202
|
-
contentType: "image/png",
|
|
203
|
-
bytes: 18211,
|
|
204
|
-
},
|
|
205
|
-
{
|
|
206
|
-
id: "qa-notes-txt",
|
|
207
|
-
filename: "review-notes.txt",
|
|
208
|
-
contentType: "text/plain",
|
|
209
|
-
bytes: 42,
|
|
210
|
-
},
|
|
211
|
-
],
|
|
212
|
-
}}
|
|
213
|
-
/>
|
|
214
|
-
</div>
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/** Show messages, cards, and activity after an event in the real scroll frame. */
|
|
219
|
-
export function ConversationFixture() {
|
|
220
|
-
return (
|
|
221
|
-
<div className="h-[64rem] min-w-0 max-w-[52.5rem] bg-dashboard-bg">
|
|
222
|
-
<ChatLayout
|
|
223
|
-
scrollAriaLabel="Gallery conversation transcript"
|
|
224
|
-
scrollClassName="p-3"
|
|
225
|
-
scroll={
|
|
226
|
-
<ConversationTranscriptView conversation={CONVERSATION} responding />
|
|
227
|
-
}
|
|
228
|
-
/>
|
|
229
|
-
</div>
|
|
230
|
-
);
|
|
231
|
-
}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import type { OwnedObjectAnnotation } from "@sentry/junior-plugin-api";
|
|
2
|
-
import { objectIconPath, objectPresentation } from "@sentry/junior-plugin-api";
|
|
3
|
-
import { ObjectIcon } from "../../components/ObjectIcon";
|
|
4
|
-
import { ObjectCard } from "../../conversations/ObjectCard";
|
|
5
|
-
import { ConversationSidebarAnnotations } from "../../conversations/ConversationMeta";
|
|
6
|
-
import { TranscriptRailEvent } from "../../conversations/TranscriptRailEvent";
|
|
7
|
-
|
|
8
|
-
const objects: OwnedObjectAnnotation[] = [
|
|
9
|
-
...(["open", "closed", "warning"] as const).map((status, index) => ({
|
|
10
|
-
kind: "object" as const,
|
|
11
|
-
objectType: "task" as const,
|
|
12
|
-
plugin: "github",
|
|
13
|
-
key: `repo#${index + 1}`,
|
|
14
|
-
label: `repo#${index + 1}`,
|
|
15
|
-
title: "Fix the parser",
|
|
16
|
-
displayType: "Issue",
|
|
17
|
-
status,
|
|
18
|
-
url: `https://github.com/example/repo/issues/${index + 1}`,
|
|
19
|
-
})),
|
|
20
|
-
...(["open", "draft", "closed", "merged", "warning"] as const).map(
|
|
21
|
-
(status, index) => ({
|
|
22
|
-
kind: "object" as const,
|
|
23
|
-
objectType: "code_change" as const,
|
|
24
|
-
plugin: "github",
|
|
25
|
-
key: `repo#${index + 4}`,
|
|
26
|
-
label: `repo#${index + 4}`,
|
|
27
|
-
title: "Fix the parser",
|
|
28
|
-
displayType: "Pull request",
|
|
29
|
-
status,
|
|
30
|
-
url: `https://github.com/example/repo/pull/${index + 4}`,
|
|
31
|
-
}),
|
|
32
|
-
),
|
|
33
|
-
{
|
|
34
|
-
kind: "object",
|
|
35
|
-
objectType: "automation",
|
|
36
|
-
plugin: "junior",
|
|
37
|
-
key: "daily-check",
|
|
38
|
-
label: "Daily check",
|
|
39
|
-
title: "Check parser errors",
|
|
40
|
-
trigger: "Every weekday at 09:00 UTC",
|
|
41
|
-
status: "blocked",
|
|
42
|
-
warning: "Reconnect the provider to resume.",
|
|
43
|
-
url: "https://example.com/automations/daily-check",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
kind: "object",
|
|
47
|
-
objectType: "deployment",
|
|
48
|
-
plugin: "vercel",
|
|
49
|
-
key: "deploy-1",
|
|
50
|
-
label: "Production",
|
|
51
|
-
title: "parser.example.com",
|
|
52
|
-
status: "ERROR",
|
|
53
|
-
url: "https://example.com/deploy-1",
|
|
54
|
-
facts: {
|
|
55
|
-
type: "deployment",
|
|
56
|
-
environment: "Production",
|
|
57
|
-
revision: "a1b2c3d",
|
|
58
|
-
},
|
|
59
|
-
},
|
|
60
|
-
{
|
|
61
|
-
kind: "object",
|
|
62
|
-
objectType: "calendar_event",
|
|
63
|
-
plugin: "google",
|
|
64
|
-
key: "event-1",
|
|
65
|
-
label: "Oct 12",
|
|
66
|
-
title: "Parser sync",
|
|
67
|
-
url: "https://calendar.google.com/calendar/event?eid=1",
|
|
68
|
-
facts: {
|
|
69
|
-
type: "calendar_event",
|
|
70
|
-
when: "Mon, Oct 12, 10:00 – 10:30 PDT",
|
|
71
|
-
attendees: ["Sam Lee", "alex@example.com"],
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
kind: "object",
|
|
76
|
-
objectType: "item",
|
|
77
|
-
plugin: "example",
|
|
78
|
-
key: "item-1",
|
|
79
|
-
label: "Reference",
|
|
80
|
-
title: "Parser reference",
|
|
81
|
-
url: "https://example.com/reference",
|
|
82
|
-
},
|
|
83
|
-
];
|
|
84
|
-
|
|
85
|
-
/** Mixed types and states at each production icon size, including Slack assets. */
|
|
86
|
-
export function ObjectFixtures() {
|
|
87
|
-
return (
|
|
88
|
-
<div className="grid min-w-0 gap-6">
|
|
89
|
-
<div className="grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3">
|
|
90
|
-
{objects.map((object) => (
|
|
91
|
-
<div
|
|
92
|
-
key={object.key}
|
|
93
|
-
className="flex items-center gap-3 rounded-lg border border-dashboard-border p-3"
|
|
94
|
-
>
|
|
95
|
-
<ObjectIcon {...object} size={20} />
|
|
96
|
-
<span className="text-sm">
|
|
97
|
-
{object.displayType ?? objectPresentation(object).label} ·{" "}
|
|
98
|
-
{object.status ?? "Unknown"}
|
|
99
|
-
</span>
|
|
100
|
-
</div>
|
|
101
|
-
))}
|
|
102
|
-
</div>
|
|
103
|
-
<ConversationSidebarAnnotations
|
|
104
|
-
annotations={objects.map((object) => ({
|
|
105
|
-
key: object.key,
|
|
106
|
-
label: object.plugin,
|
|
107
|
-
objectType: object.objectType,
|
|
108
|
-
status: object.status,
|
|
109
|
-
}))}
|
|
110
|
-
/>
|
|
111
|
-
<TranscriptRailEvent kind="event" objectType="code_change">
|
|
112
|
-
Pull request checks failed
|
|
113
|
-
</TranscriptRailEvent>
|
|
114
|
-
<TranscriptRailEvent kind="event" objectType="task">
|
|
115
|
-
Issue closed
|
|
116
|
-
</TranscriptRailEvent>
|
|
117
|
-
<div className="flex flex-wrap items-center gap-4">
|
|
118
|
-
{objects.map((object) => (
|
|
119
|
-
<img
|
|
120
|
-
key={object.key}
|
|
121
|
-
src={objectIconPath(objectPresentation(object).icon)}
|
|
122
|
-
alt={`Slack asset: ${object.displayType ?? objectPresentation(object).label}, ${object.status ?? "unknown"}`}
|
|
123
|
-
width={32}
|
|
124
|
-
height={32}
|
|
125
|
-
/>
|
|
126
|
-
))}
|
|
127
|
-
<span className="text-xs text-dashboard-text-muted">
|
|
128
|
-
Slack PNG assets (not a Slack rendering preview)
|
|
129
|
-
</span>
|
|
130
|
-
</div>
|
|
131
|
-
<div className="grid min-w-0 items-start gap-4 lg:grid-cols-2">
|
|
132
|
-
{[objects[1]!, objects[5]!, ...objects.slice(8)].map((card) => (
|
|
133
|
-
<ObjectCard key={card.key} card={card} />
|
|
134
|
-
))}
|
|
135
|
-
</div>
|
|
136
|
-
</div>
|
|
137
|
-
);
|
|
138
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
|
|
3
|
-
import { SegmentedNav } from "../../components/SegmentedNav";
|
|
4
|
-
import { SegmentedTabs } from "../../components/SegmentedTabs";
|
|
5
|
-
|
|
6
|
-
/** Show panel tabs switching the panel below them. */
|
|
7
|
-
export function SegmentedTabsFixture() {
|
|
8
|
-
const [tab, setTab] = useState<"summary" | "memories" | "agents">("summary");
|
|
9
|
-
return (
|
|
10
|
-
<div className="h-64 max-w-xs">
|
|
11
|
-
<SegmentedTabs
|
|
12
|
-
scroll
|
|
13
|
-
items={[
|
|
14
|
-
{ label: "Summary", value: "summary" },
|
|
15
|
-
{ count: 3, label: "Memories", value: "memories" },
|
|
16
|
-
{ count: 2, label: "Subagents", value: "agents" },
|
|
17
|
-
]}
|
|
18
|
-
label="Conversation panels"
|
|
19
|
-
onChange={setTab}
|
|
20
|
-
value={tab}
|
|
21
|
-
>
|
|
22
|
-
<p className="m-0 text-sm leading-relaxed text-dashboard-text-muted">
|
|
23
|
-
{tab === "summary"
|
|
24
|
-
? "Checkout latency increased after the latest release. Compare traces from before and after the deployment, then inspect the slow serialization span. The public brief links the affected repository, the release, and the open code change. Keep the rollout paused until the comparison confirms the cause. The next check is to run the same request against the previous release and compare its timings. Use the linked work to record the result and any rollback decision. The participants can continue this investigation in the conversation while keeping these details open. Model usage and related child conversations remain available in their own sections."
|
|
25
|
-
: tab === "memories"
|
|
26
|
-
? "What Junior learned from this conversation."
|
|
27
|
-
: "Child conversations and their current work."}
|
|
28
|
-
</p>
|
|
29
|
-
</SegmentedTabs>
|
|
30
|
-
</div>
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const PAGE_LINKS = [
|
|
35
|
-
"Overview",
|
|
36
|
-
"People",
|
|
37
|
-
"Locations",
|
|
38
|
-
"Workspaces",
|
|
39
|
-
"Plugins",
|
|
40
|
-
].map((label) => ({
|
|
41
|
-
isActive: () => label === "Overview",
|
|
42
|
-
label,
|
|
43
|
-
to: `#${label.toLowerCase()}`,
|
|
44
|
-
}));
|
|
45
|
-
|
|
46
|
-
/** Show page links at label width, filling a row, and overflowing a row. */
|
|
47
|
-
export function SegmentedNavFixture() {
|
|
48
|
-
return (
|
|
49
|
-
<div className="grid gap-4">
|
|
50
|
-
<SegmentedNav ariaLabel="Label width" items={PAGE_LINKS} />
|
|
51
|
-
<div className="max-w-md">
|
|
52
|
-
<SegmentedNav ariaLabel="Fill" fill items={PAGE_LINKS.slice(0, 2)} />
|
|
53
|
-
</div>
|
|
54
|
-
<div className="max-w-xs">
|
|
55
|
-
<SegmentedNav ariaLabel="Overflow" fill items={PAGE_LINKS} />
|
|
56
|
-
</div>
|
|
57
|
-
</div>
|
|
58
|
-
);
|
|
59
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { useState } from "react";
|
|
2
|
-
import { DirectorySortSelect } from "../../components/controls/DirectorySortSelect";
|
|
3
|
-
import { Field } from "../../components/Field";
|
|
4
|
-
import { FilterGroup } from "../../components/FilterBar";
|
|
5
|
-
import { Select } from "../../components/Select";
|
|
6
|
-
|
|
7
|
-
/** Show shared select arrows at form, filter, and directory sizes. */
|
|
8
|
-
export function SelectFixtures() {
|
|
9
|
-
const [sort, setSort] = useState("recent");
|
|
10
|
-
|
|
11
|
-
return (
|
|
12
|
-
<div className="grid min-w-0 gap-4">
|
|
13
|
-
<Field label="Schedule" htmlFor="gallery-select-form">
|
|
14
|
-
<Select id="gallery-select-form" defaultValue="weekly">
|
|
15
|
-
<option value="daily">Every day</option>
|
|
16
|
-
<option value="weekly">Every week</option>
|
|
17
|
-
</Select>
|
|
18
|
-
</Field>
|
|
19
|
-
<FilterGroup label="State">
|
|
20
|
-
<Select aria-label="State" variant="filter">
|
|
21
|
-
<option>All states</option>
|
|
22
|
-
<option>Active</option>
|
|
23
|
-
<option>Paused</option>
|
|
24
|
-
</Select>
|
|
25
|
-
</FilterGroup>
|
|
26
|
-
<DirectorySortSelect
|
|
27
|
-
ariaLabel="Gallery sort"
|
|
28
|
-
onChange={setSort}
|
|
29
|
-
options={[
|
|
30
|
-
{ label: "Recently created", value: "recent" },
|
|
31
|
-
{ label: "Oldest created", value: "oldest" },
|
|
32
|
-
]}
|
|
33
|
-
value={sort}
|
|
34
|
-
/>
|
|
35
|
-
<FilterGroup className="w-36" label="Opened">
|
|
36
|
-
<Select aria-label="Opened">
|
|
37
|
-
<option>Last 90 days</option>
|
|
38
|
-
<option>Any time</option>
|
|
39
|
-
</Select>
|
|
40
|
-
</FilterGroup>
|
|
41
|
-
<Field label="Disabled" htmlFor="gallery-select-disabled">
|
|
42
|
-
<Select id="gallery-select-disabled" disabled>
|
|
43
|
-
<option>Every week</option>
|
|
44
|
-
</Select>
|
|
45
|
-
</Field>
|
|
46
|
-
<Field
|
|
47
|
-
label="Destination"
|
|
48
|
-
htmlFor="gallery-select-invalid"
|
|
49
|
-
error="Choose a destination."
|
|
50
|
-
>
|
|
51
|
-
<Select
|
|
52
|
-
id="gallery-select-invalid"
|
|
53
|
-
aria-invalid
|
|
54
|
-
aria-describedby="gallery-select-invalid-error"
|
|
55
|
-
>
|
|
56
|
-
<option value="">Choose a destination</option>
|
|
57
|
-
<option value="conversation">This Conversation</option>
|
|
58
|
-
</Select>
|
|
59
|
-
</Field>
|
|
60
|
-
</div>
|
|
61
|
-
);
|
|
62
|
-
}
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { TranscriptSubagentView } from "../../conversations/TranscriptSubagentView";
|
|
2
|
-
import { TranscriptToolView } from "../../conversations/TranscriptToolView";
|
|
3
|
-
import type {
|
|
4
|
-
TranscriptViewSubagentPart,
|
|
5
|
-
TranscriptViewToolCallPart,
|
|
6
|
-
} from "../../types";
|
|
7
|
-
|
|
8
|
-
type ToolCallFixture = {
|
|
9
|
-
description: string;
|
|
10
|
-
part: TranscriptViewToolCallPart;
|
|
11
|
-
timestamp: number;
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
const TOOL_CALL_TIMESTAMP = Date.UTC(2026, 4, 1, 16);
|
|
15
|
-
|
|
16
|
-
const TOOL_CALL_FIXTURES = [
|
|
17
|
-
{
|
|
18
|
-
description: "Default completed tool with normalized arguments",
|
|
19
|
-
part: {
|
|
20
|
-
id: "gallery-search",
|
|
21
|
-
input: {
|
|
22
|
-
query: "release regression",
|
|
23
|
-
limit: 25,
|
|
24
|
-
options: { includeArchived: false },
|
|
25
|
-
},
|
|
26
|
-
name: "searchIssues",
|
|
27
|
-
output: { matches: 3 },
|
|
28
|
-
resultTimestamp: TOOL_CALL_TIMESTAMP + 1_842,
|
|
29
|
-
status: "completed",
|
|
30
|
-
type: "tool_call",
|
|
31
|
-
},
|
|
32
|
-
timestamp: TOOL_CALL_TIMESTAMP,
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
description: "Running webSearch with name-only shimmer",
|
|
36
|
-
part: {
|
|
37
|
-
id: "gallery-running",
|
|
38
|
-
input: {
|
|
39
|
-
query: "service:checkout status:error",
|
|
40
|
-
max_results: 50,
|
|
41
|
-
},
|
|
42
|
-
name: "webSearch",
|
|
43
|
-
status: "running",
|
|
44
|
-
type: "tool_call",
|
|
45
|
-
},
|
|
46
|
-
timestamp: TOOL_CALL_TIMESTAMP + 3_000,
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
description: "Failed tool",
|
|
50
|
-
part: {
|
|
51
|
-
id: "gallery-error",
|
|
52
|
-
input: {
|
|
53
|
-
command: "jr-rpc config get github.repo",
|
|
54
|
-
timeout_ms: 10_000,
|
|
55
|
-
},
|
|
56
|
-
name: "bash",
|
|
57
|
-
output: { error: "configuration unavailable" },
|
|
58
|
-
resultTimestamp: TOOL_CALL_TIMESTAMP + 6_416,
|
|
59
|
-
status: "error",
|
|
60
|
-
type: "tool_call",
|
|
61
|
-
},
|
|
62
|
-
timestamp: TOOL_CALL_TIMESTAMP + 6_000,
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
description: "Known loadSkill signature",
|
|
66
|
-
part: {
|
|
67
|
-
id: "gallery-load-skill",
|
|
68
|
-
input: { skill_name: "junior-qa" },
|
|
69
|
-
name: "loadSkill",
|
|
70
|
-
output: { skill_name: "junior-qa" },
|
|
71
|
-
resultTimestamp: TOOL_CALL_TIMESTAMP + 8_105,
|
|
72
|
-
status: "completed",
|
|
73
|
-
type: "tool_call",
|
|
74
|
-
},
|
|
75
|
-
timestamp: TOOL_CALL_TIMESTAMP + 8_000,
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
description: "Known executeTool signature with nested arguments",
|
|
79
|
-
part: {
|
|
80
|
-
id: "gallery-execute-tool",
|
|
81
|
-
input: {
|
|
82
|
-
tool_name: "github_search",
|
|
83
|
-
arguments: { query: "is:pr is:open", limit: 25 },
|
|
84
|
-
},
|
|
85
|
-
name: "executeTool",
|
|
86
|
-
output: { matches: 3 },
|
|
87
|
-
resultTimestamp: TOOL_CALL_TIMESTAMP + 10_723,
|
|
88
|
-
status: "completed",
|
|
89
|
-
type: "tool_call",
|
|
90
|
-
},
|
|
91
|
-
timestamp: TOOL_CALL_TIMESTAMP + 10_000,
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
description: "Long generic arguments exercise both truncation limits",
|
|
95
|
-
part: {
|
|
96
|
-
id: "gallery-long",
|
|
97
|
-
input: {
|
|
98
|
-
project: "payments-checkout-platform",
|
|
99
|
-
query:
|
|
100
|
-
"Find every regression associated with the most recent production deployment and include the complete evidence trail",
|
|
101
|
-
environment: "production",
|
|
102
|
-
includeResolved: false,
|
|
103
|
-
ignoredAfterFourEntries: "not shown in the collapsed preview",
|
|
104
|
-
},
|
|
105
|
-
name: "investigateDeploy",
|
|
106
|
-
output: { channel_id: "C123" },
|
|
107
|
-
resultTimestamp: TOOL_CALL_TIMESTAMP + 13_250,
|
|
108
|
-
status: "completed",
|
|
109
|
-
type: "tool_call",
|
|
110
|
-
},
|
|
111
|
-
timestamp: TOOL_CALL_TIMESTAMP + 12_000,
|
|
112
|
-
},
|
|
113
|
-
{
|
|
114
|
-
description: "Completed tool without argument or result payloads",
|
|
115
|
-
part: {
|
|
116
|
-
id: "gallery-empty",
|
|
117
|
-
name: "systemTime",
|
|
118
|
-
status: "completed",
|
|
119
|
-
type: "tool_call",
|
|
120
|
-
},
|
|
121
|
-
timestamp: TOOL_CALL_TIMESTAMP + 15_000,
|
|
122
|
-
},
|
|
123
|
-
] as const satisfies readonly ToolCallFixture[];
|
|
124
|
-
|
|
125
|
-
const SUBAGENT_STARTED = Date.UTC(2026, 4, 1, 16);
|
|
126
|
-
|
|
127
|
-
const SUBAGENT_FIXTURES: readonly TranscriptViewSubagentPart[] = [
|
|
128
|
-
{
|
|
129
|
-
agentName: "planner",
|
|
130
|
-
childConversationId: "gallery-planner",
|
|
131
|
-
id: "gallery-planner",
|
|
132
|
-
status: "running",
|
|
133
|
-
subagentKind: "agent",
|
|
134
|
-
type: "subagent",
|
|
135
|
-
title: "Review the dashboard plan",
|
|
136
|
-
},
|
|
137
|
-
{
|
|
138
|
-
agentName: "reviewer",
|
|
139
|
-
childConversationId: "gallery-reviewer",
|
|
140
|
-
finishedTimestamp: SUBAGENT_STARTED + 16_000,
|
|
141
|
-
id: "gallery-reviewer",
|
|
142
|
-
status: "completed",
|
|
143
|
-
subagentKind: "agent",
|
|
144
|
-
type: "subagent",
|
|
145
|
-
title: "Check the pull request against the repository rules",
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
agentName: "github",
|
|
149
|
-
childConversationId: "gallery-github",
|
|
150
|
-
finishedTimestamp: SUBAGENT_STARTED + 4_000,
|
|
151
|
-
id: "gallery-github",
|
|
152
|
-
status: "blocked",
|
|
153
|
-
subagentKind: "agent",
|
|
154
|
-
type: "subagent",
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
agentName: "deploy",
|
|
158
|
-
childConversationId: "gallery-deploy",
|
|
159
|
-
finishedTimestamp: SUBAGENT_STARTED + 92_000,
|
|
160
|
-
id: "gallery-deploy",
|
|
161
|
-
status: "error",
|
|
162
|
-
subagentKind: "agent",
|
|
163
|
-
type: "subagent",
|
|
164
|
-
task: "Roll back payments-v42 in us-west1 and confirm the canary error rate.",
|
|
165
|
-
},
|
|
166
|
-
];
|
|
167
|
-
|
|
168
|
-
/** Render typed transcript tool states for visual regression and interaction checks. */
|
|
169
|
-
export function ToolCallGallery() {
|
|
170
|
-
return (
|
|
171
|
-
<div className="min-w-0 overflow-hidden rounded-lg border border-dashboard-border bg-dashboard-fill-faint">
|
|
172
|
-
<div className="border-b border-dashboard-border-subtle px-2.5 py-1.5 font-sans text-xs text-dashboard-text-muted">
|
|
173
|
-
Activity lane · click a row for arguments and result
|
|
174
|
-
</div>
|
|
175
|
-
<div className="grid min-w-0 gap-1 px-2 py-1.5">
|
|
176
|
-
{TOOL_CALL_FIXTURES.map((fixture) => (
|
|
177
|
-
<div className="grid min-w-0 gap-1" key={fixture.part.id}>
|
|
178
|
-
<div className="font-sans font-medium text-2xs text-dashboard-text-muted">
|
|
179
|
-
{fixture.description}
|
|
180
|
-
</div>
|
|
181
|
-
<TranscriptToolView
|
|
182
|
-
part={fixture.part}
|
|
183
|
-
timestamp={fixture.timestamp}
|
|
184
|
-
/>
|
|
185
|
-
</div>
|
|
186
|
-
))}
|
|
187
|
-
</div>
|
|
188
|
-
</div>
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/** Show subagent cards in each lifecycle status, with and without a title. */
|
|
193
|
-
export function SubagentCardFixture() {
|
|
194
|
-
return (
|
|
195
|
-
<div className="grid min-w-0 gap-2">
|
|
196
|
-
{SUBAGENT_FIXTURES.map((part) => (
|
|
197
|
-
<TranscriptSubagentView
|
|
198
|
-
key={part.id}
|
|
199
|
-
onOpenTranscript={() => undefined}
|
|
200
|
-
part={part}
|
|
201
|
-
timestamp={SUBAGENT_STARTED}
|
|
202
|
-
/>
|
|
203
|
-
))}
|
|
204
|
-
</div>
|
|
205
|
-
);
|
|
206
|
-
}
|