From ec36f3b3a775e11a3af15637d16b74a491978ce6 Mon Sep 17 00:00:00 2001 From: sjd9021 Date: Mon, 16 Feb 2026 01:56:56 +0530 Subject: [PATCH] fix: persist activity state to metadata so API serves real-time activity - lifecycle-manager: write detected activity to metadata on each poll - session-manager: read activity from metadata instead of hardcoding idle - Fixes: API always returned activity=idle because metadataToSession hardcoded it and lifecycle manager never persisted the detected value --- packages/core/src/lifecycle-manager.ts | 9 +++++++++ packages/core/src/session-manager.ts | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/core/src/lifecycle-manager.ts b/packages/core/src/lifecycle-manager.ts index b2930dc98..1827ed97c 100644 --- a/packages/core/src/lifecycle-manager.ts +++ b/packages/core/src/lifecycle-manager.ts @@ -201,6 +201,15 @@ export function createLifecycleManager(deps: LifecycleManagerDeps): LifecycleMan // empty output means the runtime probe failed, not that the agent exited. if (terminalOutput) { const activity = agent.detectActivity(terminalOutput); + console.log("[LIFECYCLE DEBUG] session:", session.id, "activity:", activity, "hasEsc:", /esc to interrupt/i.test(terminalOutput), "terminalLen:", terminalOutput.length); + // Persist detected activity to metadata so the API can serve it + const projectMetaDir2 = session.projectId + ? join(config.dataDir, `${session.projectId}-sessions`) + : config.dataDir; + const metaDir2 = existsSync(join(projectMetaDir2, session.id)) + ? projectMetaDir2 + : config.dataDir; + updateMetadata(metaDir2, session.id, { activity }); if (activity === "waiting_input") return "needs_input"; // Check whether the agent process is still alive. Some agents diff --git a/packages/core/src/session-manager.ts b/packages/core/src/session-manager.ts index 26adb760c..5abfc871f 100644 --- a/packages/core/src/session-manager.ts +++ b/packages/core/src/session-manager.ts @@ -19,6 +19,7 @@ import type { SessionId, SessionSpawnConfig, SessionStatus, + ActivityState, CleanupResult, OrchestratorConfig, ProjectConfig, @@ -106,7 +107,7 @@ function metadataToSession( id: sessionId, projectId: meta["project"] ?? "", status: validateStatus(meta["status"]), - activity: "idle", + activity: (meta["activity"] as ActivityState) || "idle", branch: meta["branch"] || null, issueId: meta["issue"] || null, pr: meta["pr"]