The DataTable wrapper's border-radius created visible gaps when nested
inside a parent container (e.g. tableSection) that already provides its
own border and radius. The new flush prop strips border, radius, and
shadow so the table sits flush against its container.
Applied in Dashboard and RouteDetail "Recent Exchanges" tables.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the TimeRangeDropdown popover with inline FilterPills inside a
new ButtonGroup component. The ButtonGroup merges adjacent children into
a single visual strip with shared borders and rounded end-caps.
The time readout is now an integrated inset display cell at the right end
of the group. Preset ranges show "HH:MM – now"; custom ranges show both
timestamps. Default changed from 3h to 1h.
TopBar reordered to: Breadcrumb | Search | Status pills | Time pills | Right.
FilterPill upgraded to forwardRef with data-active attribute.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
vite-plugin-dts runs tsc to generate declarations and needs explicit
type definitions for .module.css, .css, and .svg imports. Without
these, the DTS step fails with TS2307 for every CSS module import.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace per-page filtering with a single GlobalFilterProvider (time range +
status) consumed by a redesigned TopBar across all pages. Lift CommandPalette
to App level so Cmd-K works globally with filtered results that navigate to
exchanges, routes, agents, and applications. Sidebar auto-reveals and selects
the target entry on Cmd-K navigation via location state.
- Extract shared time preset utilities (computePresetRange, DEFAULT_PRESETS)
- Add GlobalFilterProvider (time range + status) and CommandPaletteProvider
- Add TimeRangeDropdown primitive with Popover preset list
- Redesign TopBar: breadcrumb | time dropdown | status pills | search | env
- Add application category to Cmd-K search
- Remove FilterBar and local DateRangePicker from Dashboard/Metrics pages
- Filter AgentHealth EventFeed by global time range
- Remove shift/onSearchClick props from TopBar
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Route / redirects to /apps, Dashboard serves both /apps and /apps/:id
- When appId is present, exchanges/routes/agents/search are scoped to that app
- Remove Dashboards sidebar link, add Metrics link
- Sidebar section labels (Applications, Agents) are now clickable nav links
with separate chevron for collapse toggle
- Update all breadcrumbs from Dashboard/href:'/' to Applications/href:'/apps'
- Remove AppDetail page (replaced by scoped Dashboard)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- EventFeed: 28px icon circles with severity colors, stacked message/timestamp,
search input with clear button, ReactNode message support with searchText field
- Agent Health: timeline wrapped in card panel, instance listing as proper table,
colored Badge pills for live counts, removed shift pill
- Input primitive: onClear prop with × button for all search fields
- Sidebar: Agents section collapsible like Applications, collapse state persisted
to localStorage
- FilterBar/Sidebar: clear buttons on all search inputs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add URL-driven Agent Health page (/agents, /agents/:appId,
/agents/:appId/:instanceId) that progressively narrows from all
applications to a single instance with trend charts. Create
generic GroupCard composite for grouping instances by application.
Expand mock data to 8 instances across 4 apps with varied states.
Split sidebar Agents header into navigable link + collapse chevron.
Update agent tree paths to /agents/:appId/:instanceId. Add EventFeed
with lifecycle events. Change SidebarAgent.tps from string to number.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace flat app/route/agent lists with expandable tree navigation.
Apps contain their routes and agents hierarchically. Add localStorage-
backed starring with composite keys for uniqueness. Persist expand
state to sessionStorage across page navigations. Add collapsible
section headers, remove button on starred items, and parent app
context labels. Create stub pages for /apps/:id, /agents/:id,
/admin, /api-docs. Consolidate duplicated sidebar data into
shared mock. Widen sidebar from 220px to 260px.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update Inventory page sections and COMPONENT_GUIDE.md to use
"exchange/exchangeCount" instead of "execution/execCount".
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Rename all references from "Execution/executions/execCount" to
"Exchange/exchanges/exchangeCount" to align with Apache Camel's
native Exchange concept. Java class names (CamelExecutionException,
HttpOperationFailedException) are preserved as-is.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use translateX instead of left for indeterminate shimmer (left doesn't
work on non-absolutely-positioned elements)
- Use index-based key in AvatarGroup to prevent duplicate name collisions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add Navigation section (Dashboard, Metrics, Agents) with useNavigate
- Route items now navigate to /routes/:id
- Active state highlights current page based on location.pathname
- Replace inline CamelIcon with actual camel-logo.svg asset
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Wires up all 5 routes in App.tsx (/, /metrics, /routes/:id,
/exchanges/:id, /agents). Fixes pre-existing build errors: vite.config.ts
now uses vitest/config defineConfig so the test property is typed
correctly; removes unused imports in Collapsible.tsx and _chart-utils.ts;
removes unused parameter in metrics.ts generateTimeSeries.
Build: tsc -b && vite build passes clean. Test suite: 72/72 pass.
Bundle: 334kB JS (101kB gzip) + 54kB CSS (10kB gzip).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ExchangeDetail (/exchanges/:id): exchange header card with ID/route/
status/duration, ProcessorTimeline for the specific exchange, step-by-
step exchange inspector using Collapsible+CodeBlock for headers/body at
each processor step, and error details block for failed exchanges.
AgentHealth (/agents): 6-card system overview strip, 2-column grid of
agent cards (StatusDot, name, version, tps, uptime, last-seen, CPU/mem
usage, active routes), expandable per-agent LineCharts for throughput
and error rate trends. Both pages use AppShell + shared Sidebar layout.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implements the /routes/:id route with route header card (name, status
badge, description), 5-card KPI strip (total executions, success rate,
p50/p99 latency, inflight count), ProcessorTimeline showing aggregate
processor stats across all executions, filtered DataTable of recent
executions for the route, and error patterns section grouped by
exception class. Uses useParams() to get route ID and navigates to
/exchanges/:id on row click.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Implements the /metrics route with DateRangePicker bar, 5 KPI StatCards
with sparklines (throughput, latency p99, error rate, success rate,
active routes), per-route DataTable with trend sparklines, and a 2x2
chart grid (AreaChart throughput, LineChart latency with SLA threshold,
BarChart errors, AreaChart volume). Uses AppShell + Sidebar + TopBar
layout with mock data from src/mocks/metrics.ts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>