Skip to content

Commit 6803a89

Browse files
committed
refactor: update component styles and state management
- Updated tool type casting in AgentTools component for better type safety. - Changed trend color classes in StatCard and AgentEvalsTab components to use new design tokens. - Modified LogsPage component to initialize selectedTransport and levelFilter states with "all" for improved filtering. - Adjusted ObservabilityPage component to set spanTypeFilter and entityTypeFilter defaults to "all". - Enhanced DashboardPage component styles to align with new design guidelines. - Updated Mastra configuration to include new headers and commented out unused middleware for clarity.
1 parent 832d8a7 commit 6803a89

7 files changed

Lines changed: 77 additions & 72 deletions

File tree

app/chat/components/agent-tools.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function AgentTools({ tools }: AgentToolsProps) {
3434
<Tool key={t.toolCallId} defaultOpen={false}>
3535
<ToolHeader
3636
title={toolName}
37-
type={toolType}
37+
type={toolType as `tool-${string}`}
3838
state={toolState}
3939
/>
4040
<ToolContent>

app/dashboard/_components/stat-card.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export function StatCard({
5656
<p
5757
className={cn(
5858
"text-xs mt-1",
59-
trend.positive ? "text-green-500" : "text-red-500"
59+
trend.positive ? "text-accent" : "text-destructive"
6060
)}
6161
>
6262
{trend.positive ? "+" : "-"}

app/dashboard/agents/_components/agent-evals-tab.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ export function AgentEvalsTab({ agentId }: AgentEvalsTabProps) {
5252
>
5353
<div className="flex items-center gap-3">
5454
{evaluation.passed ? (
55-
<CheckCircle2 className="h-4 w-4 text-green-500" />
55+
<CheckCircle2 className="h-4 w-4 text-accent" />
5656
) : (
57-
<XCircle className="h-4 w-4 text-red-500" />
57+
<XCircle className="h-4 w-4 text-destructive" />
5858
)}
5959
<span className="font-medium">{evaluation.name || `Eval ${index + 1}`}</span>
6060
</div>

app/dashboard/logs/page.tsx

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ import { cn } from "@/lib/utils"
3232

3333
export default function LogsPage() {
3434
const { data: transports, loading: transportsLoading } = useLogTransports()
35-
const [selectedTransport, setSelectedTransport] = useState<string>("")
35+
const [selectedTransport, setSelectedTransport] = useState<string>("all")
3636
const [runIdFilter, setRunIdFilter] = useState("")
37-
const { data: logs, loading, error, refetch } = useLogs(selectedTransport || undefined)
37+
const { data: logs, loading, error, refetch } = useLogs(selectedTransport === "all" ? undefined : selectedTransport)
3838
const { data: runLogs, loading: runLogsLoading } = useRunLogs(
3939
runIdFilter || null,
40-
selectedTransport || undefined
40+
selectedTransport === "all" ? undefined : selectedTransport
4141
)
4242

4343
const [searchQuery, setSearchQuery] = useState("")
44-
const [levelFilter, setLevelFilter] = useState<string>("")
44+
const [levelFilter, setLevelFilter] = useState<string>("all")
4545

4646
const logsArray = Array.isArray(logs) ? logs : (logs as unknown as { logs?: unknown[] })?.logs ?? []
4747
const filteredLogs = logsArray.filter((log: Record<string, unknown>) => {
@@ -50,7 +50,7 @@ export default function LogsPage() {
5050
(log.message as string)?.toLowerCase().includes(searchQuery.toLowerCase()) ||
5151
JSON.stringify(log).toLowerCase().includes(searchQuery.toLowerCase())
5252

53-
const matchesLevel = !levelFilter || log.level === levelFilter
53+
const matchesLevel = levelFilter === "all" || log.level === levelFilter
5454

5555
return matchesSearch && matchesLevel
5656
})
@@ -80,7 +80,7 @@ export default function LogsPage() {
8080
<SelectValue placeholder="Select transport" />
8181
</SelectTrigger>
8282
<SelectContent>
83-
<SelectItem value="">All Transports</SelectItem>
83+
<SelectItem value="all">All Transports</SelectItem>
8484
{((transports as unknown as { transports?: string[] })?.transports ?? []).map((t) => (
8585
<SelectItem key={t} value={t}>
8686
{t}
@@ -97,7 +97,7 @@ export default function LogsPage() {
9797
<SelectValue placeholder="All Levels" />
9898
</SelectTrigger>
9999
<SelectContent>
100-
<SelectItem value="">All Levels</SelectItem>
100+
<SelectItem value="all">All Levels</SelectItem>
101101
<SelectItem value="error">Error</SelectItem>
102102
<SelectItem value="warn">Warning</SelectItem>
103103
<SelectItem value="info">Info</SelectItem>
@@ -145,7 +145,7 @@ export default function LogsPage() {
145145
) : filteredLogs && filteredLogs.length > 0 ? (
146146
<div className="p-4 space-y-2">
147147
{filteredLogs.map((log: any, index: number) => (
148-
<LogEntry key={log.id || index} log={log} />
148+
<LogEntry key={log.id ?? index} log={log} />
149149
))}
150150
</div>
151151
) : (
@@ -190,7 +190,7 @@ export default function LogsPage() {
190190
<div className="p-4 space-y-2">
191191
{Array.isArray(runLogs) ? (
192192
runLogs.map((log: any, index: number) => (
193-
<LogEntry key={log.id || index} log={log} />
193+
<LogEntry key={log.id ?? index} log={log} />
194194
))
195195
) : (
196196
<LogEntry log={runLogs} />
@@ -216,12 +216,12 @@ function LogEntry({ log }: { log: any }) {
216216

217217
const levelConfig: Record<string, { icon: typeof Info; color: string; bg: string }> = {
218218
error: { icon: AlertCircle, color: "text-destructive", bg: "bg-destructive/10" },
219-
warn: { icon: AlertTriangle, color: "text-yellow-500", bg: "bg-yellow-500/10" },
220-
info: { icon: Info, color: "text-blue-500", bg: "bg-blue-500/10" },
219+
warn: { icon: AlertTriangle, color: "text-secondary dark:text-secondary-foreground", bg: "bg-secondary/10 dark:bg-secondary/30" },
220+
info: { icon: Info, color: "text-primary dark:text-primary-foreground", bg: "bg-primary/10 dark:bg-primary/30" },
221221
debug: { icon: Bug, color: "text-muted-foreground", bg: "bg-muted" },
222222
}
223223

224-
const level = log.level?.toLowerCase() || "info"
224+
const level = log.level?.toLowerCase() ?? "info"
225225
const config = levelConfig[level] || levelConfig.info
226226
const Icon = config.icon
227227

@@ -249,7 +249,7 @@ function LogEntry({ log }: { log: any }) {
249249
</Badge>
250250
)}
251251
</div>
252-
<p className="mt-1 text-sm truncate">{log.message || JSON.stringify(log)}</p>
252+
<p className="mt-1 text-sm truncate">{log.message ?? JSON.stringify(log)}</p>
253253
</div>
254254
{expanded ? (
255255
<ChevronDown className="h-4 w-4 shrink-0 text-muted-foreground" />

app/dashboard/observability/page.tsx

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,19 @@ export default function ObservabilityPage() {
4242
const [page, setPage] = useState(1)
4343
const [perPage, setPerPage] = useState(20)
4444
const [nameFilter, setNameFilter] = useState("")
45-
const [spanTypeFilter, setSpanTypeFilter] = useState<string>("")
46-
const [entityTypeFilter, setEntityTypeFilter] = useState<string>("")
45+
const [spanTypeFilter, setSpanTypeFilter] = useState<string>("all")
46+
const [entityTypeFilter, setEntityTypeFilter] = useState<string>("all")
4747

4848
const { data: traces, loading, error, refetch } = useAITraces({
4949
page,
5050
perPage,
5151
filters: {
5252
name: nameFilter || undefined,
53-
spanType: spanTypeFilter || undefined,
54-
entityType: (entityTypeFilter || undefined) as "agent" | "workflow" | undefined,
53+
spanType: spanTypeFilter === "all" ? undefined : spanTypeFilter,
54+
entityType: (entityTypeFilter === "all" ? undefined : entityTypeFilter) as
55+
| "agent"
56+
| "workflow"
57+
| undefined,
5558
},
5659
})
5760

@@ -86,7 +89,7 @@ export default function ObservabilityPage() {
8689
<SelectValue placeholder="Span Type" />
8790
</SelectTrigger>
8891
<SelectContent>
89-
<SelectItem value="">All Types</SelectItem>
92+
<SelectItem value="all">All Types</SelectItem>
9093
<SelectItem value="agent">Agent</SelectItem>
9194
<SelectItem value="tool">Tool</SelectItem>
9295
<SelectItem value="workflow">Workflow</SelectItem>
@@ -98,7 +101,7 @@ export default function ObservabilityPage() {
98101
<SelectValue placeholder="Entity Type" />
99102
</SelectTrigger>
100103
<SelectContent>
101-
<SelectItem value="">All Entities</SelectItem>
104+
<SelectItem value="all">All Entities</SelectItem>
102105
<SelectItem value="agent">Agent</SelectItem>
103106
<SelectItem value="tool">Tool</SelectItem>
104107
<SelectItem value="workflow">Workflow</SelectItem>
@@ -132,27 +135,27 @@ export default function ObservabilityPage() {
132135
<div className="flex items-start gap-3">
133136
<Activity className="h-5 w-5 mt-0.5 text-muted-foreground" />
134137
<div className="flex-1 min-w-0">
135-
<div className="font-medium truncate">{span.name || span.traceId}</div>
138+
<div className="font-medium truncate">{span.name ?? span.traceId}</div>
136139
<div className="flex items-center gap-2 mt-1">
137140
<Badge variant="secondary" className="text-xs">
138-
{span.spanType || "unknown"}
141+
{span.spanType ?? "unknown"}
139142
</Badge>
140-
{span.duration && (
143+
{(Boolean(span.duration)) && (
141144
<span className="text-xs text-muted-foreground flex items-center gap-1">
142145
<Clock className="h-3 w-3" />
143146
{span.duration}ms
144147
</span>
145148
)}
146149
</div>
147150
<div className="text-xs text-muted-foreground mt-1">
148-
{span.startTime ? new Date(span.startTime).toLocaleString() : "No timestamp"}
151+
{(span.startTime) ? new Date(span.startTime).toLocaleString() : "No timestamp"}
149152
</div>
150153
</div>
151154
<ChevronRight className="h-4 w-4 text-muted-foreground shrink-0" />
152155
</div>
153156
</button>
154157
))}
155-
{(!traces || !(traces as any)?.spans?.length) && (
158+
{(!traces || !((traces as any)?.spans?.length)) && (
156159
<div className="p-4 text-center text-sm text-muted-foreground">
157160
No traces found
158161
</div>
@@ -191,7 +194,7 @@ export default function ObservabilityPage() {
191194

192195
{/* Trace Details */}
193196
<div className="flex-1 overflow-auto">
194-
{selectedTraceId ? (
197+
{(selectedTraceId) ? (
195198
<TraceDetails traceId={selectedTraceId} />
196199
) : (
197200
<div className="flex h-full items-center justify-center text-muted-foreground">
@@ -250,7 +253,7 @@ function TraceDetails({ traceId }: { traceId: string }) {
250253
{/* Header */}
251254
<div className="flex items-start justify-between">
252255
<div>
253-
<h1 className="text-2xl font-bold">{traceData?.name || traceId}</h1>
256+
<h1 className="text-2xl font-bold">{traceData?.name ?? traceId}</h1>
254257
<p className="text-muted-foreground mt-1">
255258
Trace ID: <code className="text-xs bg-muted px-1 py-0.5 rounded">{traceId}</code>
256259
</p>
@@ -279,7 +282,7 @@ function TraceDetails({ traceId }: { traceId: string }) {
279282
className="mt-1"
280283
/>
281284
</div>
282-
{scoreResult && (
285+
{(Boolean(scoreResult)) && (
283286
<div className="space-y-2">
284287
<Label>Result</Label>
285288
<pre className="text-sm bg-muted p-3 rounded-md overflow-auto max-h-48">
@@ -312,7 +315,7 @@ function TraceDetails({ traceId }: { traceId: string }) {
312315
</CardHeader>
313316
<CardContent>
314317
<div className="text-2xl font-bold">
315-
{traceData?.duration ? `${traceData.duration}ms` : "N/A"}
318+
{(traceData?.duration) ? `${traceData.duration}ms` : "N/A"}
316319
</div>
317320
</CardContent>
318321
</Card>
@@ -338,7 +341,7 @@ function TraceDetails({ traceId }: { traceId: string }) {
338341
</CardHeader>
339342
<CardContent>
340343
<Badge variant="secondary">
341-
{traceData?.spanType || "Unknown"}
344+
{traceData?.spanType ?? "Unknown"}
342345
</Badge>
343346
</CardContent>
344347
</Card>
@@ -353,7 +356,7 @@ function TraceDetails({ traceId }: { traceId: string }) {
353356
<Badge
354357
variant={traceData?.status === "ok" || traceData?.status === "success" ? "default" : "destructive"}
355358
>
356-
{traceData?.status || "Unknown"}
359+
{traceData?.status ?? "Unknown"}
357360
</Badge>
358361
</CardContent>
359362
</Card>
@@ -381,29 +384,29 @@ function TraceDetails({ traceId }: { traceId: string }) {
381384
<div className="space-y-2">
382385
{traceData.spans.map((span: any, index: number) => (
383386
<div
384-
key={span.spanId || index}
387+
key={span.spanId ?? index}
385388
className="p-4 bg-muted rounded-md"
386-
style={{ marginLeft: `${(span.depth || 0) * 20}px` }}
389+
style={{ marginLeft: `${(span.depth ?? 0) * 20}px` }}
387390
>
388391
<div className="flex items-start justify-between">
389392
<div>
390-
<div className="font-medium">{span.name || `Span ${index + 1}`}</div>
393+
<div className="font-medium">{span.name ?? `Span ${index + 1}`}</div>
391394
<div className="text-sm text-muted-foreground">
392395
{span.spanId}
393396
</div>
394397
</div>
395398
<div className="flex items-center gap-2">
396-
{span.duration && (
399+
{(Boolean(span.duration)) && (
397400
<span className="text-xs text-muted-foreground">
398401
{span.duration}ms
399402
</span>
400403
)}
401404
<Badge variant="outline" className="text-xs">
402-
{span.spanType || span.kind || "unknown"}
405+
{(span.spanType ?? span.kind) ?? "unknown"}
403406
</Badge>
404407
</div>
405408
</div>
406-
{span.attributes && Object.keys(span.attributes).length > 0 && (
409+
{(Boolean(span.attributes)) && Object.keys(span.attributes).length > 0 && (
407410
<details className="mt-2">
408411
<summary className="text-xs text-muted-foreground cursor-pointer">
409412
Attributes
@@ -433,7 +436,7 @@ function TraceDetails({ traceId }: { traceId: string }) {
433436
</CardDescription>
434437
</CardHeader>
435438
<CardContent>
436-
{traceData?.attributes ? (
439+
{(traceData?.attributes) ? (
437440
<pre className="whitespace-pre-wrap text-sm bg-muted p-4 rounded-md overflow-auto max-h-96">
438441
{JSON.stringify(traceData.attributes, null, 2)}
439442
</pre>

app/dashboard/page.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,8 @@ export default function DashboardPage() {
190190
<CardHeader className="bg-muted/30">
191191
<div className="flex items-center justify-between">
192192
<div className="flex items-center gap-2">
193-
<div className="flex h-8 w-8 items-center justify-center rounded-lg bg-blue-500/10">
194-
<Workflow className="h-4 w-4 text-blue-500" />
193+
<div className="flex h-8 w-8 items-center justify-center rounded-lg bg-primary/10 text-primary dark:bg-primary/30 dark:text-primary-foreground">
194+
<Workflow className="h-4 w-4" />
195195
</div>
196196
<div>
197197
<CardTitle className="text-base">Workflows</CardTitle>
@@ -258,8 +258,8 @@ export default function DashboardPage() {
258258
<CardHeader className="bg-muted/30">
259259
<div className="flex items-center justify-between">
260260
<div className="flex items-center gap-2">
261-
<div className="flex h-8 w-8 items-center justify-center rounded-lg bg-green-500/10">
262-
<Activity className="h-4 w-4 text-green-500" />
261+
<div className="flex h-8 w-8 items-center justify-center rounded-lg bg-accent/10 text-accent dark:bg-accent/30 dark:text-accent-foreground">
262+
<Activity className="h-4 w-4" />
263263
</div>
264264
<div>
265265
<CardTitle className="text-base">Recent Traces</CardTitle>
@@ -374,10 +374,10 @@ export default function DashboardPage() {
374374
}
375375

376376
const colorVariants = {
377-
purple: "bg-purple-500/10 text-purple-500",
378-
pink: "bg-pink-500/10 text-pink-500",
379-
orange: "bg-orange-500/10 text-orange-500",
380-
cyan: "bg-cyan-500/10 text-cyan-500",
377+
purple: "bg-primary/10 text-primary dark:bg-primary/30 dark:text-primary-foreground",
378+
pink: "bg-accent/10 text-accent dark:bg-accent/30 dark:text-accent-foreground",
379+
orange: "bg-secondary/10 text-secondary dark:bg-secondary/30 dark:text-secondary-foreground",
380+
cyan: "bg-muted/10 text-muted-foreground dark:bg-muted/30 dark:text-muted-foreground",
381381
}
382382

383383
function QuickLinkCard({

src/mastra/index.ts

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -640,33 +640,35 @@ export const mastra = new Mastra({
640640
cors: {
641641
origin: ["*"], // Allow specific origins or '*' for all
642642
allowMethods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
643-
allowHeaders: ["Content-Type", "Authorization"],
643+
allowHeaders: ["Content-Type", "Authorization", 'x-mastra-client-type'],
644+
exposeHeaders: ["Content-Length", "X-Requested-With"],
644645
credentials: false,
645646
},
646647
middleware: [
647-
async (c, next) => {
648-
const runtimeContext = c.get("runtimeContext");
649-
650-
if (c.req.method === "POST") {
651-
try {
652-
const clonedReq = c.req.raw.clone();
653-
const body = await clonedReq.json();
654-
648+
// Middleware to extract data from the request body
649+
// async (c, next) => {
650+
// const runtimeContext = c.get("runtimeContext");
651+
//
652+
// if (c.req.method === "POST") {
653+
// try {
654+
// const clonedReq = c.req.raw.clone();
655+
/// const body = await clonedReq.json();
656+
//
655657
// Ensure body and body.data are objects before using them
656-
if (body !== null && typeof body === 'object' && body.data !== null && typeof body.data === 'object') {
657-
const data = body.data as Record<string, unknown>;
658-
for (const [key, value] of Object.entries(data)) {
659-
runtimeContext.set(key, value);
660-
}
661-
}
662-
} catch {
663-
log.error("Failed to parse request body for middleware");
664-
}
665-
}
666-
await next();
667-
},
668-
],
669-
}
658+
// if (body !== null && typeof body === 'object' && body.data !== null && typeof body.data === 'object') {
659+
// const data = body.data as Record<string, unknown>;
660+
// for (const [key, value] of Object.entries(data)) {
661+
// runtimeContext.set(key, value);
662+
// }
663+
// }
664+
// } catch {
665+
// log.error("Failed to parse request body for middleware");
666+
// }
667+
// }
668+
// await next();
669+
// },
670+
],
671+
}
670672
});
671673

672674
log.info("Mastra instance created");

0 commit comments

Comments
 (0)