From d3cf4ae3dea3790bf0616b925b4f56e042a536b6 Mon Sep 17 00:00:00 2001 From: harshitsinghbhandari <24b4506@iitb.ac.in> Date: Fri, 17 Apr 2026 13:32:02 +0530 Subject: [PATCH] fix: address PR review comments on stage 5 rollout (#119) --- packages/core/src/lifecycle-manager.ts | 7 ++++++- packages/web/src/components/SessionDetail.tsx | 10 +++++++--- packages/web/src/lib/serialize.ts | 12 ++++++------ packages/web/src/lib/types.ts | 12 ++++++++++++ 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/core/src/lifecycle-manager.ts b/packages/core/src/lifecycle-manager.ts index 1ced00474..3d8d5e7d7 100644 --- a/packages/core/src/lifecycle-manager.ts +++ b/packages/core/src/lifecycle-manager.ts @@ -224,11 +224,13 @@ function buildTransitionObservabilityData( newStatus: SessionStatus, evidence: string, detectingAttempts: number, + statusTransition: boolean, reaction?: { key: string; result: ReactionResult | null }, ): Record { return { oldStatus, newStatus, + statusTransition, previousSessionState: previous.session.state, newSessionState: next.session.state, previousSessionReason: previous.session.reason, @@ -1583,6 +1585,7 @@ export function createLifecycleManager(deps: LifecycleManagerDeps): LifecycleMan newStatus, assessment.evidence, assessment.detectingAttempts, + true, ), level: transitionLogLevel(newStatus), }); @@ -1635,6 +1638,7 @@ export function createLifecycleManager(deps: LifecycleManagerDeps): LifecycleMan newStatus, assessment.evidence, assessment.detectingAttempts, + true, transitionReaction, ), level: reactionResult.success ? "info" : "warn", @@ -1669,7 +1673,7 @@ export function createLifecycleManager(deps: LifecycleManagerDeps): LifecycleMan updateSessionMetadata(session, { status: newStatus }); observer.recordOperation({ metric: "lifecycle_poll", - operation: "lifecycle.transition", + operation: "lifecycle.sync", outcome: "success", correlationId: createCorrelationId("lifecycle-sync"), projectId: session.projectId, @@ -1682,6 +1686,7 @@ export function createLifecycleManager(deps: LifecycleManagerDeps): LifecycleMan newStatus, assessment.evidence, assessment.detectingAttempts, + false, ), level: transitionLogLevel(newStatus), }); diff --git a/packages/web/src/components/SessionDetail.tsx b/packages/web/src/components/SessionDetail.tsx index 9adb868bd..8d1c29e89 100644 --- a/packages/web/src/components/SessionDetail.tsx +++ b/packages/web/src/components/SessionDetail.tsx @@ -18,7 +18,8 @@ import { getRuntimeTruthReasonLabel, getLifecycleGuidance, getLifecycleEvidence, - isDashboardSessionTerminal, + isDashboardRuntimeEnded, + isDashboardSessionRestorable, } from "@/lib/types"; import { CI_STATUS } from "@aoagents/ao-core/types"; import { cn } from "@/lib/cn"; @@ -546,8 +547,11 @@ export function SessionDetail({ const [sidebarCollapsed, setSidebarCollapsed] = useState(false); const [showTerminal, setShowTerminal] = useState(false); const pr = session.pr; - const terminalEnded = isDashboardSessionTerminal(session); - const isRestorable = terminalEnded && !NON_RESTORABLE_STATUSES.has(session.status); + const terminalEnded = isDashboardRuntimeEnded(session); + const isRestorable = + !isOrchestrator && + isDashboardSessionRestorable(session) && + !NON_RESTORABLE_STATUSES.has(session.status); const activity = (session.activity && activityMeta[session.activity]) ?? { label: session.activity ?? "unknown", color: "var(--color-text-muted)", diff --git a/packages/web/src/lib/serialize.ts b/packages/web/src/lib/serialize.ts index a22011571..a0fe6896b 100644 --- a/packages/web/src/lib/serialize.ts +++ b/packages/web/src/lib/serialize.ts @@ -18,13 +18,13 @@ import { type OrchestratorConfig, type PluginRegistry, } from "@aoagents/ao-core"; -import type { - DashboardSession, - DashboardPR, - DashboardStats, - DashboardOrchestratorLink, +import { + type DashboardSession, + type DashboardPR, + type DashboardStats, + type DashboardOrchestratorLink, + getAttentionLevel, } from "./types.js"; -import { getAttentionLevel } from "@/lib/types"; import { TTLCache, prCache, prCacheKey, type PREnrichmentData } from "./cache"; /** Cache for issue titles (5 min TTL — issue titles rarely change) */ diff --git a/packages/web/src/lib/types.ts b/packages/web/src/lib/types.ts index 8605563eb..e0282bb61 100644 --- a/packages/web/src/lib/types.ts +++ b/packages/web/src/lib/types.ts @@ -316,6 +316,18 @@ export function isDashboardSessionTerminal(session: DashboardSession): boolean { ); } +export function isDashboardRuntimeEnded(session: DashboardSession): boolean { + if (session.lifecycle) { + return ( + session.lifecycle.runtimeState === "missing" || session.lifecycle.runtimeState === "exited" + ); + } + return ( + TERMINAL_STATUSES.has(session.status) || + (session.activity !== null && TERMINAL_ACTIVITIES.has(session.activity)) + ); +} + export function isDashboardSessionRestorable(session: DashboardSession): boolean { if (!isDashboardSessionTerminal(session)) return false; return session.lifecycle?.prState !== "merged" && session.status !== "merged";