[codex] Add runtime lifecycle recovery and live issue visibility (#4419)

This commit is contained in:
Dotta 2026-04-24 15:50:32 -05:00 committed by GitHub
parent 9a8d219949
commit 5a0c1979cf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
121 changed files with 9625 additions and 2044 deletions

View file

@ -25,16 +25,36 @@ function isRunActive(run: LiveRunForIssue): boolean {
interface ActiveAgentsPanelProps {
companyId: string;
title?: string;
minRunCount?: number;
fetchLimit?: number;
cardLimit?: number;
gridClassName?: string;
cardClassName?: string;
emptyMessage?: string;
queryScope?: string;
showMoreLink?: boolean;
}
export function ActiveAgentsPanel({ companyId }: ActiveAgentsPanelProps) {
export function ActiveAgentsPanel({
companyId,
title = "Agents",
minRunCount = MIN_DASHBOARD_RUNS,
fetchLimit,
cardLimit = DASHBOARD_RUN_CARD_LIMIT,
gridClassName,
cardClassName,
emptyMessage = "No recent agent runs.",
queryScope = "dashboard",
showMoreLink = true,
}: ActiveAgentsPanelProps) {
const { data: liveRuns } = useQuery({
queryKey: [...queryKeys.liveRuns(companyId), "dashboard"],
queryFn: () => heartbeatsApi.liveRunsForCompany(companyId, MIN_DASHBOARD_RUNS),
queryKey: [...queryKeys.liveRuns(companyId), queryScope, { minRunCount, fetchLimit }],
queryFn: () => heartbeatsApi.liveRunsForCompany(companyId, { minCount: minRunCount, limit: fetchLimit }),
});
const runs = liveRuns ?? [];
const visibleRuns = useMemo(() => runs.slice(0, DASHBOARD_RUN_CARD_LIMIT), [runs]);
const visibleRuns = useMemo(() => runs.slice(0, cardLimit), [cardLimit, runs]);
const hiddenRunCount = Math.max(0, runs.length - visibleRuns.length);
const { data: issues } = useQuery({
queryKey: [...queryKeys.issues.list(companyId), "with-routine-executions"],
@ -62,14 +82,14 @@ export function ActiveAgentsPanel({ companyId }: ActiveAgentsPanelProps) {
return (
<div>
<h3 className="mb-3 text-sm font-semibold uppercase tracking-wide text-muted-foreground">
Agents
{title}
</h3>
{runs.length === 0 ? (
<div className="rounded-xl border border-border p-4">
<p className="text-sm text-muted-foreground">No recent agent runs.</p>
<p className="text-sm text-muted-foreground">{emptyMessage}</p>
</div>
) : (
<div className="grid grid-cols-1 gap-2 sm:grid-cols-2 sm:gap-4 xl:grid-cols-4">
<div className={cn("grid grid-cols-1 gap-2 sm:grid-cols-2 sm:gap-4 xl:grid-cols-4", gridClassName)}>
{visibleRuns.map((run) => (
<AgentRunCard
key={run.id}
@ -79,13 +99,14 @@ export function ActiveAgentsPanel({ companyId }: ActiveAgentsPanelProps) {
transcript={transcriptByRun.get(run.id) ?? EMPTY_TRANSCRIPT}
hasOutput={hasOutputForRun(run.id)}
isActive={isRunActive(run)}
className={cardClassName}
/>
))}
</div>
)}
{hiddenRunCount > 0 && (
{showMoreLink && hiddenRunCount > 0 && (
<div className="mt-3 flex justify-end text-xs text-muted-foreground">
<Link to="/agents" className="hover:text-foreground hover:underline">
<Link to="/dashboard/live" className="hover:text-foreground hover:underline">
{hiddenRunCount} more active/recent run{hiddenRunCount === 1 ? "" : "s"}
</Link>
</div>
@ -101,6 +122,7 @@ const AgentRunCard = memo(function AgentRunCard({
transcript,
hasOutput,
isActive,
className,
}: {
companyId: string;
run: LiveRunForIssue;
@ -108,6 +130,7 @@ const AgentRunCard = memo(function AgentRunCard({
transcript: TranscriptEntry[];
hasOutput: boolean;
isActive: boolean;
className?: string;
}) {
return (
<div className={cn(
@ -115,6 +138,7 @@ const AgentRunCard = memo(function AgentRunCard({
isActive
? "border-cyan-500/25 bg-cyan-500/[0.04] shadow-[0_16px_40px_rgba(6,182,212,0.08)]"
: "border-border bg-background/70",
className,
)}>
<div className="border-b border-border/60 px-3 py-3">
<div className="flex items-start justify-between gap-2">