diff --git a/packages/adapter-utils/src/session-compaction.ts b/packages/adapter-utils/src/session-compaction.ts index 308b54a3..90fe544b 100644 --- a/packages/adapter-utils/src/session-compaction.ts +++ b/packages/adapter-utils/src/session-compaction.ts @@ -41,6 +41,7 @@ export const LEGACY_SESSIONED_ADAPTER_TYPES = new Set([ "codex_local", "cursor", "gemini_local", + "hermes_local", "opencode_local", "pi_local", ]); @@ -76,6 +77,11 @@ export const ADAPTER_SESSION_MANAGEMENT: Record { diff --git a/ui/src/pages/AgentDetail.tsx b/ui/src/pages/AgentDetail.tsx index 9d1c5a18..cc238c35 100644 --- a/ui/src/pages/AgentDetail.tsx +++ b/ui/src/pages/AgentDetail.tsx @@ -263,12 +263,16 @@ function runMetrics(run: HeartbeatRun) { ); const cost = visibleRunCostUsd(usage, result); + const provider = asNonEmptyString(usage?.provider) ?? null; + const model = asNonEmptyString(usage?.model) ?? null; return { input, output, cached, cost, totalTokens: input + output, + provider, + model, }; } @@ -1127,6 +1131,7 @@ export function AgentDetail() { agentRouteId={canonicalAgentRef} selectedRunId={urlRunId ?? null} adapterType={agent.adapterType} + adapterConfig={agent.adapterConfig} /> )} @@ -2905,6 +2910,7 @@ function RunsTab({ agentRouteId, selectedRunId, adapterType, + adapterConfig, }: { runs: HeartbeatRun[]; companyId: string; @@ -2912,6 +2918,7 @@ function RunsTab({ agentRouteId: string; selectedRunId: string | null; adapterType: string; + adapterConfig: Record; }) { const { isMobile } = useSidebar(); @@ -2940,7 +2947,7 @@ function RunsTab({ Back to runs - + ); } @@ -2971,7 +2978,7 @@ function RunsTab({ {/* Right: run detail — natural height, page scrolls */} {selectedRun && (
- +
)} @@ -2980,7 +2987,7 @@ function RunsTab({ /* ---- Run Detail (expanded) ---- */ -function RunDetail({ run: initialRun, agentRouteId, adapterType }: { run: HeartbeatRun; agentRouteId: string; adapterType: string }) { +function RunDetail({ run: initialRun, agentRouteId, adapterType, adapterConfig }: { run: HeartbeatRun; agentRouteId: string; adapterType: string; adapterConfig: Record }) { const queryClient = useQueryClient(); const navigate = useNavigate(); const { data: hydratedRun } = useQuery({ @@ -3174,6 +3181,27 @@ function RunDetail({ run: initialRun, agentRouteId, adapterType }: { run: Heartb )} + {/* Adapter type · provider · model */} + {(() => { + const displayProvider = metrics.provider + ?? asNonEmptyString(adapterConfig?.provider); + const displayModel = metrics.model + ?? asNonEmptyString(adapterConfig?.model); + if (!adapterType && !displayProvider && !displayModel) return null; + return ( +
+ {adapterType && ( + {adapterType.replace(/_/g, " ")} + )} + {displayProvider && displayModel && ( + {displayProvider}/{displayModel} + )} + {!displayProvider && displayModel && ( + {displayModel} + )} +
+ ); + })()} {resumeRun.isError && (
{resumeRun.error instanceof Error ? resumeRun.error.message : "Failed to resume run"}