feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
import { useMemo } from 'react';
|
|
|
|
|
import { useParams } from 'react-router';
|
|
|
|
|
import {
|
2026-03-23 18:29:25 +01:00
|
|
|
StatCard, StatusDot, Badge, Card,
|
|
|
|
|
LineChart, AreaChart, BarChart, EventFeed, Breadcrumb, Spinner, EmptyState,
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
} from '@cameleer/design-system';
|
2026-03-19 18:16:16 +01:00
|
|
|
import styles from './AgentInstance.module.css';
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
import { useAgents, useAgentEvents } from '../../api/queries/agents';
|
|
|
|
|
import { useStatsTimeseries } from '../../api/queries/executions';
|
2026-03-23 18:29:25 +01:00
|
|
|
import { useAgentMetrics } from '../../api/queries/agent-metrics';
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
import { useGlobalFilters } from '@cameleer/design-system';
|
|
|
|
|
|
|
|
|
|
export default function AgentInstance() {
|
|
|
|
|
const { appId, instanceId } = useParams();
|
|
|
|
|
const { timeRange } = useGlobalFilters();
|
|
|
|
|
const timeFrom = timeRange.start.toISOString();
|
|
|
|
|
const timeTo = timeRange.end.toISOString();
|
|
|
|
|
|
|
|
|
|
const { data: agents, isLoading } = useAgents(undefined, appId);
|
|
|
|
|
const { data: events } = useAgentEvents(appId, instanceId);
|
|
|
|
|
const { data: timeseries } = useStatsTimeseries(timeFrom, timeTo, undefined, appId);
|
|
|
|
|
|
|
|
|
|
const agent = useMemo(() =>
|
2026-03-23 18:29:25 +01:00
|
|
|
(agents || []).find((a: any) => a.id === instanceId) as any,
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
[agents, instanceId],
|
|
|
|
|
);
|
|
|
|
|
|
2026-03-23 18:29:25 +01:00
|
|
|
// Stat card metrics (latest 1 bucket)
|
|
|
|
|
const { data: latestMetrics } = useAgentMetrics(
|
|
|
|
|
agent?.id || null,
|
|
|
|
|
['jvm.cpu.process', 'jvm.memory.heap.used', 'jvm.memory.heap.max'],
|
|
|
|
|
1,
|
|
|
|
|
);
|
|
|
|
|
const cpuPct = latestMetrics?.metrics?.['jvm.cpu.process']?.[0]?.value;
|
|
|
|
|
const heapUsed = latestMetrics?.metrics?.['jvm.memory.heap.used']?.[0]?.value;
|
|
|
|
|
const heapMax = latestMetrics?.metrics?.['jvm.memory.heap.max']?.[0]?.value;
|
|
|
|
|
const memPct = heapMax ? (heapUsed! / heapMax) * 100 : undefined;
|
|
|
|
|
|
|
|
|
|
// Chart metrics (60 buckets)
|
|
|
|
|
const { data: jvmMetrics } = useAgentMetrics(
|
|
|
|
|
agent?.id || null,
|
|
|
|
|
['jvm.cpu.process', 'jvm.memory.heap.used', 'jvm.memory.heap.max', 'jvm.threads.count', 'jvm.gc.time'],
|
|
|
|
|
60,
|
|
|
|
|
);
|
|
|
|
|
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
const chartData = useMemo(() =>
|
|
|
|
|
(timeseries?.buckets || []).map((b: any) => ({
|
|
|
|
|
time: new Date(b.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }),
|
|
|
|
|
throughput: b.totalCount,
|
|
|
|
|
latency: b.avgDurationMs,
|
|
|
|
|
errors: b.failedCount,
|
|
|
|
|
})),
|
|
|
|
|
[timeseries],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const feedEvents = useMemo(() =>
|
|
|
|
|
(events || []).filter((e: any) => !instanceId || e.agentId === instanceId).map((e: any) => ({
|
|
|
|
|
id: String(e.id),
|
|
|
|
|
severity: e.eventType === 'WENT_DEAD' ? 'error' as const
|
|
|
|
|
: e.eventType === 'WENT_STALE' ? 'warning' as const
|
|
|
|
|
: e.eventType === 'RECOVERED' ? 'success' as const
|
|
|
|
|
: 'running' as const,
|
|
|
|
|
message: `${e.eventType}${e.detail ? ' — ' + e.detail : ''}`,
|
|
|
|
|
timestamp: new Date(e.timestamp),
|
|
|
|
|
})),
|
|
|
|
|
[events, instanceId],
|
|
|
|
|
);
|
|
|
|
|
|
2026-03-23 18:29:25 +01:00
|
|
|
// JVM chart series helpers
|
|
|
|
|
const cpuSeries = useMemo(() => {
|
|
|
|
|
const pts = jvmMetrics?.metrics?.['jvm.cpu.process'];
|
|
|
|
|
if (!pts?.length) return null;
|
|
|
|
|
return [{ label: 'CPU %', data: pts.map((p: any, i: number) => ({ x: i, y: p.value * 100 })) }];
|
|
|
|
|
}, [jvmMetrics]);
|
|
|
|
|
|
|
|
|
|
const heapSeries = useMemo(() => {
|
|
|
|
|
const pts = jvmMetrics?.metrics?.['jvm.memory.heap.used'];
|
|
|
|
|
if (!pts?.length) return null;
|
|
|
|
|
return [{ label: 'Heap MB', data: pts.map((p: any, i: number) => ({ x: i, y: p.value / (1024 * 1024) })) }];
|
|
|
|
|
}, [jvmMetrics]);
|
|
|
|
|
|
|
|
|
|
const threadSeries = useMemo(() => {
|
|
|
|
|
const pts = jvmMetrics?.metrics?.['jvm.threads.count'];
|
|
|
|
|
if (!pts?.length) return null;
|
|
|
|
|
return [{ label: 'Threads', data: pts.map((p: any, i: number) => ({ x: i, y: p.value })) }];
|
|
|
|
|
}, [jvmMetrics]);
|
|
|
|
|
|
|
|
|
|
const gcSeries = useMemo(() => {
|
|
|
|
|
const pts = jvmMetrics?.metrics?.['jvm.gc.time'];
|
|
|
|
|
if (!pts?.length) return null;
|
|
|
|
|
return [{ label: 'GC ms', data: pts.map((p: any, i: number) => ({ x: String(i), y: p.value })) }];
|
|
|
|
|
}, [jvmMetrics]);
|
|
|
|
|
|
|
|
|
|
const throughputSeries = useMemo(() =>
|
|
|
|
|
chartData.length ? [{ label: 'Throughput', data: chartData.map((d: any, i: number) => ({ x: i, y: d.throughput })) }] : null,
|
|
|
|
|
[chartData],
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const errorSeries = useMemo(() =>
|
|
|
|
|
chartData.length ? [{ label: 'Errors', data: chartData.map((d: any, i: number) => ({ x: i, y: d.errors })) }] : null,
|
|
|
|
|
[chartData],
|
|
|
|
|
);
|
|
|
|
|
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
if (isLoading) return <Spinner size="lg" />;
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div>
|
|
|
|
|
<Breadcrumb items={[
|
|
|
|
|
{ label: 'Agents', href: '/agents' },
|
|
|
|
|
{ label: appId || '', href: `/agents/${appId}` },
|
|
|
|
|
{ label: agent?.name || instanceId || '' },
|
|
|
|
|
]} />
|
|
|
|
|
|
|
|
|
|
{agent && (
|
|
|
|
|
<>
|
2026-03-19 18:16:16 +01:00
|
|
|
<div className={styles.agentHeader}>
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
<StatusDot variant={agent.status === 'LIVE' ? 'live' : agent.status === 'STALE' ? 'stale' : 'dead'} />
|
|
|
|
|
<h2>{agent.name}</h2>
|
|
|
|
|
<Badge label={agent.status} color={agent.status === 'LIVE' ? 'success' : agent.status === 'STALE' ? 'warning' : 'error'} />
|
2026-03-23 18:29:25 +01:00
|
|
|
{agent.version && <Badge label={agent.version} variant="outlined" />}
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
</div>
|
|
|
|
|
|
2026-03-19 18:16:16 +01:00
|
|
|
<div className={styles.statStrip}>
|
2026-03-23 18:29:25 +01:00
|
|
|
<StatCard label="CPU" value={cpuPct != null ? `${(cpuPct * 100).toFixed(0)}%` : '—'} />
|
fix: align all pages with design system mocks — stat cards, tables, detail panels
Dashboard: correct stat card labels (Exchanges/Success Rate/Errors/Throughput/Latency p99),
add detail text, trends, sparklines on all cards, Agent column, LIVE badge,
expanded detail panel with Agent/Correlation/Timestamp, "Open full details" link.
Agent Health: per-group meta (TPS/routes) in GroupCard header, proper HTML table
with column headers for instance list.
Agent Instance: stat card detail props (heap info, start date), scope trail with
inline status/version/routes badges.
Routes: 5th In-Flight stat card, enriched stat card props (detail/trend/sparkline),
SLA threshold line on latency chart.
Exchange Detail: Agent stat box in header.
Also: vite proxy CORS fix, cross-env dev scripts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 20:28:56 +01:00
|
|
|
<StatCard
|
|
|
|
|
label="Memory"
|
|
|
|
|
value={memPct != null ? `${memPct.toFixed(0)}%` : '—'}
|
|
|
|
|
detail={heapUsed != null && heapMax != null ? `${(heapUsed / (1024 * 1024)).toFixed(0)} MB / ${(heapMax / (1024 * 1024)).toFixed(0)} MB` : undefined}
|
|
|
|
|
/>
|
2026-03-23 18:29:25 +01:00
|
|
|
<StatCard label="Throughput" value={agent?.tps != null ? `${agent.tps.toFixed(1)}/s` : '—'} />
|
|
|
|
|
<StatCard label="Errors" value={agent?.errorRate != null ? `${(agent.errorRate * 100).toFixed(1)}%` : '—'} accent={agent?.errorRate > 0 ? 'error' : undefined} />
|
fix: align all pages with design system mocks — stat cards, tables, detail panels
Dashboard: correct stat card labels (Exchanges/Success Rate/Errors/Throughput/Latency p99),
add detail text, trends, sparklines on all cards, Agent column, LIVE badge,
expanded detail panel with Agent/Correlation/Timestamp, "Open full details" link.
Agent Health: per-group meta (TPS/routes) in GroupCard header, proper HTML table
with column headers for instance list.
Agent Instance: stat card detail props (heap info, start date), scope trail with
inline status/version/routes badges.
Routes: 5th In-Flight stat card, enriched stat card props (detail/trend/sparkline),
SLA threshold line on latency chart.
Exchange Detail: Agent stat box in header.
Also: vite proxy CORS fix, cross-env dev scripts.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-23 20:28:56 +01:00
|
|
|
<StatCard
|
|
|
|
|
label="Uptime"
|
|
|
|
|
value={formatUptime(agent?.uptimeSeconds)}
|
|
|
|
|
detail={agent?.registeredAt ? `since ${new Date(agent.registeredAt).toLocaleDateString()}` : undefined}
|
|
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div className={styles.scopeTrail}>
|
|
|
|
|
<a href="/agents" className={styles.scopeLink}>All Agents</a>
|
|
|
|
|
<span className={styles.scopeSep}>▸</span>
|
|
|
|
|
<a href={`/agents/${appId}`} className={styles.scopeLink}>{appId}</a>
|
|
|
|
|
<span className={styles.scopeSep}>▸</span>
|
|
|
|
|
<span className={styles.scopeCurrent}>{agent.name}</span>
|
|
|
|
|
<Badge
|
|
|
|
|
label={agent.status.toUpperCase()}
|
|
|
|
|
color={agent.status === 'LIVE' ? 'success' : agent.status === 'STALE' ? 'warning' : 'error'}
|
|
|
|
|
/>
|
|
|
|
|
{agent.version && <Badge label={agent.version} variant="outlined" />}
|
|
|
|
|
<Badge
|
|
|
|
|
label={`${agent.activeRoutes ?? (agent.routeIds?.length ?? 0)}/${agent.totalRoutes ?? (agent.routeIds?.length ?? 0)} routes`}
|
|
|
|
|
color={(agent.activeRoutes ?? 0) < (agent.totalRoutes ?? 0) ? 'warning' : 'success'}
|
|
|
|
|
/>
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
</div>
|
|
|
|
|
|
2026-03-23 18:29:25 +01:00
|
|
|
<Card className={styles.infoCard}>
|
|
|
|
|
<div className={styles.paneTitle}>Process Information</div>
|
|
|
|
|
<div className={styles.infoGrid}>
|
|
|
|
|
{agent?.capabilities?.jvmVersion && (
|
|
|
|
|
<div>
|
|
|
|
|
<span className={styles.infoLabel}>JVM</span>
|
|
|
|
|
<span>{agent.capabilities.jvmVersion}</span>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
{agent?.capabilities?.camelVersion && (
|
|
|
|
|
<div>
|
|
|
|
|
<span className={styles.infoLabel}>Camel</span>
|
|
|
|
|
<span>{agent.capabilities.camelVersion}</span>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
{agent?.capabilities?.springBootVersion && (
|
|
|
|
|
<div>
|
|
|
|
|
<span className={styles.infoLabel}>Spring Boot</span>
|
|
|
|
|
<span>{agent.capabilities.springBootVersion}</span>
|
|
|
|
|
</div>
|
|
|
|
|
)}
|
|
|
|
|
<div>
|
|
|
|
|
<span className={styles.infoLabel}>Started</span>
|
|
|
|
|
<span>{agent?.registeredAt ? new Date(agent.registeredAt).toLocaleString() : '—'}</span>
|
|
|
|
|
</div>
|
|
|
|
|
<div>
|
|
|
|
|
<span className={styles.infoLabel}>Capabilities</span>
|
|
|
|
|
<span className={styles.capTags}>
|
|
|
|
|
{Object.entries(agent?.capabilities || {})
|
|
|
|
|
.filter(([, v]) => typeof v === 'boolean' && v)
|
|
|
|
|
.map(([k]) => (
|
|
|
|
|
<Badge key={k} label={k} variant="outlined" />
|
|
|
|
|
))}
|
|
|
|
|
</span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</Card>
|
|
|
|
|
|
2026-03-19 18:16:16 +01:00
|
|
|
<div className={styles.sectionTitle}>Routes</div>
|
|
|
|
|
<div className={styles.routeBadges}>
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
{(agent.routeIds || []).map((r: string) => (
|
|
|
|
|
<Badge key={r} label={r} color="auto" />
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
</>
|
|
|
|
|
)}
|
|
|
|
|
|
2026-03-23 18:29:25 +01:00
|
|
|
<div className={styles.sectionTitle}>Performance</div>
|
|
|
|
|
<div className={styles.chartsGrid}>
|
|
|
|
|
<div className={styles.chartCard}>
|
|
|
|
|
<div className={styles.chartHeader}><div className={styles.chartTitle}>CPU Usage</div></div>
|
|
|
|
|
{cpuSeries
|
|
|
|
|
? <AreaChart series={cpuSeries} yLabel="%" height={200} />
|
|
|
|
|
: <EmptyState title="No data" description="No CPU metrics available" />}
|
|
|
|
|
</div>
|
|
|
|
|
<div className={styles.chartCard}>
|
|
|
|
|
<div className={styles.chartHeader}><div className={styles.chartTitle}>Memory Heap</div></div>
|
|
|
|
|
{heapSeries
|
|
|
|
|
? <AreaChart series={heapSeries} yLabel="MB" height={200} />
|
|
|
|
|
: <EmptyState title="No data" description="No heap metrics available" />}
|
|
|
|
|
</div>
|
|
|
|
|
<div className={styles.chartCard}>
|
|
|
|
|
<div className={styles.chartHeader}><div className={styles.chartTitle}>Throughput</div></div>
|
|
|
|
|
{throughputSeries
|
|
|
|
|
? <AreaChart series={throughputSeries} height={200} />
|
|
|
|
|
: <EmptyState title="No data" description="No throughput data in range" />}
|
|
|
|
|
</div>
|
|
|
|
|
<div className={styles.chartCard}>
|
|
|
|
|
<div className={styles.chartHeader}><div className={styles.chartTitle}>Error Rate</div></div>
|
|
|
|
|
{errorSeries
|
|
|
|
|
? <LineChart series={errorSeries} height={200} />
|
|
|
|
|
: <EmptyState title="No data" description="No error data in range" />}
|
|
|
|
|
</div>
|
|
|
|
|
<div className={styles.chartCard}>
|
|
|
|
|
<div className={styles.chartHeader}><div className={styles.chartTitle}>Thread Count</div></div>
|
|
|
|
|
{threadSeries
|
|
|
|
|
? <LineChart series={threadSeries} height={200} />
|
|
|
|
|
: <EmptyState title="No data" description="No thread metrics available" />}
|
|
|
|
|
</div>
|
|
|
|
|
<div className={styles.chartCard}>
|
|
|
|
|
<div className={styles.chartHeader}><div className={styles.chartTitle}>GC Pauses</div></div>
|
|
|
|
|
{gcSeries
|
|
|
|
|
? <BarChart series={gcSeries} yLabel="ms" height={200} />
|
|
|
|
|
: <EmptyState title="No data" description="No GC metrics available" />}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
|
|
|
|
|
{feedEvents.length > 0 && (
|
2026-03-19 18:16:16 +01:00
|
|
|
<div className={styles.eventCard}>
|
|
|
|
|
<div className={styles.eventCardHeader}>Events</div>
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
<EventFeed events={feedEvents} maxItems={50} />
|
2026-03-19 18:16:16 +01:00
|
|
|
</div>
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
)}
|
|
|
|
|
|
2026-03-23 18:29:25 +01:00
|
|
|
<EmptyState title="Application Logs" description="Application log streaming is not yet available" />
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-23 18:29:25 +01:00
|
|
|
function formatUptime(seconds?: number): string {
|
|
|
|
|
if (!seconds) return '—';
|
|
|
|
|
const days = Math.floor(seconds / 86400);
|
|
|
|
|
const hours = Math.floor((seconds % 86400) / 3600);
|
|
|
|
|
const mins = Math.floor((seconds % 3600) / 60);
|
|
|
|
|
if (days > 0) return `${days}d ${hours}h`;
|
|
|
|
|
if (hours > 0) return `${hours}h ${mins}m`;
|
|
|
|
|
return `${mins}m`;
|
feat: migrate UI to @cameleer/design-system, add backend endpoints
Backend:
- Add agent_events table (V5) and lifecycle event recording
- Add route catalog endpoint (GET /routes/catalog)
- Add route metrics endpoint (GET /routes/metrics)
- Add agent events endpoint (GET /agents/events-log)
- Enrich AgentInstanceResponse with tps, errorRate, activeRoutes, uptimeSeconds
- Add TimescaleDB retention/compression policies (V6)
Frontend:
- Replace custom Mission Control UI with @cameleer/design-system components
- Rebuild all pages: Dashboard, ExchangeDetail, RoutesMetrics, AgentHealth,
AgentInstance, RBAC, AuditLog, OIDC, DatabaseAdmin, OpenSearchAdmin, Swagger
- New LayoutShell with design system AppShell, Sidebar, TopBar, CommandPalette
- Consume design system from Gitea npm registry (@cameleer/design-system@0.0.1)
- Add .npmrc for scoped registry, update Dockerfile with REGISTRY_TOKEN arg
CI:
- Pass REGISTRY_TOKEN build-arg to UI Docker build step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 17:38:39 +01:00
|
|
|
}
|