diff --git a/src/agents/openclaw-tools.sessions.test.ts b/src/agents/openclaw-tools.sessions.test.ts index 172a944e859..7e92397e179 100644 --- a/src/agents/openclaw-tools.sessions.test.ts +++ b/src/agents/openclaw-tools.sessions.test.ts @@ -844,6 +844,16 @@ describe("sessions tools", () => { createdAt: now - 2 * 60_000, startedAt: now - 2 * 60_000, }); + addSubagentRunForTests({ + runId: "run-child", + childSessionKey: "agent:main:subagent:active:subagent:child", + requesterSessionKey: "agent:main:subagent:active", + requesterDisplayKey: "subagent:active", + task: "child worker", + cleanup: "keep", + createdAt: now - 60_000, + startedAt: now - 60_000, + }); addSubagentRunForTests({ runId: "run-recent", childSessionKey: "agent:main:subagent:recent", @@ -880,12 +890,16 @@ describe("sessions tools", () => { const result = await tool.execute("call-subagents-list", { action: "list" }); const details = result.details as { status?: string; - active?: unknown[]; + active?: Array<{ runId?: string; childSessions?: string[] }>; recent?: unknown[]; text?: string; }; expect(details.status).toBe("ok"); expect(details.active).toHaveLength(1); + expect(details.active?.[0]).toMatchObject({ + runId: "run-active", + childSessions: ["agent:main:subagent:active:subagent:child"], + }); expect(details.recent).toHaveLength(1); expect(details.text).toContain("active subagents:"); expect(details.text).toContain("recent (last 30m):"); diff --git a/src/agents/subagent-control.ts b/src/agents/subagent-control.ts index 528a84eebd3..6fe96e11b6e 100644 --- a/src/agents/subagent-control.ts +++ b/src/agents/subagent-control.ts @@ -73,6 +73,7 @@ export type SubagentListItem = { pendingDescendants: number; runtime: string; runtimeMs: number; + childSessions?: string[]; model?: string; totalTokens?: number; startedAt?: number; @@ -273,6 +274,11 @@ export function buildSubagentList(params: { const status = resolveRunStatus(entry, { pendingDescendants, }); + const childSessions = Array.from( + new Set( + listSubagentRunsForController(entry.childSessionKey).map((run) => run.childSessionKey), + ), + ); const runtime = formatDurationCompact(runtimeMs); const label = truncateLine(resolveSubagentLabel(entry), 48); const task = truncateLine(entry.task.trim(), params.taskMaxChars ?? 72); @@ -288,6 +294,7 @@ export function buildSubagentList(params: { pendingDescendants, runtime, runtimeMs, + ...(childSessions.length > 0 ? { childSessions } : {}), model: resolveModelRef(sessionEntry) || entry.model, totalTokens, startedAt: entry.startedAt,