3697
}
3698
}
3700
>
const parentState = this._stateManager.getSessionState(parentSessionKey);
3701
>
if (!parentState) {
3702
return;
3703
}
3705
>
// Search completed turns and active turn for the subagent content metadata
3706
>
const allTurns = [...parentState.turns];
3707
>
if (parentState.activeTurn) {
3708
allTurns.push(parentState.activeTurn as Turn);
3709
}
3711
>
let subagentContent: ToolResultSubagentContent | undefined;
3712
>
for (const turn of allTurns) {
3713
>
for (const part of turn.responseParts) {
3714
>
if (part.kind === ResponsePartKind.ToolCall) {
3715
>
const tc = part.toolCall;
3716
>
// Check both completed and running tool calls — running
3717
>
// tool calls receive subagent content via ContentChanged
3718
>
const content = tc.status === ToolCallStatus.Completed
3719
>
? tc.content
3720
: (tc.status === ToolCallStatus.Running ? tc.content : undefined);
3722
>
for (const c of content) {
3723
>
if (c.type === ToolResultContentType.Subagent && c.resource === subagentUri) {
3724
>
subagentContent = c;
3725
>
break;
3726
>
}
3727
>
}
3728
>
}
3729
>
}
3730
>
}
3731
>
if (subagentContent) {
3732
>
break;
3733
>
}
3734
>
}
3735
>
3736
>
// Load the subagent's turns from the agent (which knows how to
3737
>
// extract them from the parent session's event log).
3738
>
let childTurns: readonly Turn[] = [];
3739
>
const agent = this._findProviderForSession(parentSession);
3740
>
if (agent) {
3741
>
try {
3742
>
childTurns = await this._getChatMessages(agent, URI.parse(subagentUri));
3743
>
} catch (err) {
3744
this._logService.warn(`[AgentService] Failed to load subagent turns for ${subagentUri}`, err);
3745
}
3747
>
3748
>
// Use metadata from subagent content if available, otherwise synthesize
3749
>
const title = subagentContent?.title ?? 'Subagent';
3750
>
3751
>
const subagentNow = new Date().toISOString();
3752
>
// Local turns for a subagent chat are persisted in the parent session's
3753
>
// database (its chat URI resolves to the parent session), keyed by the
3754
>
// subagent chat URI.
3755
>
const mergedChildTurns = await this._interleaveLocalTurns(parentSession.toString(), subagentUri, childTurns);
3756
>
this._stateManager.restoreSession(
3757
>
{
3758
>
resource: subagentUri,
3759
>
provider: 'subagent',
3760
>
title,
3761
>
status: SessionStatus.Idle,
3762
>
createdAt: subagentNow,
3763
>
modifiedAt: subagentNow,
3764
>
...(parentState?.project ? { project: parentState.project } : {}),
3765
>
},
3766
>
mergedChildTurns,
3767
>
);
3768
>
this._logService.info(`[AgentService] Restored subagent session: ${subagentUri} with ${childTurns.length} turn(s)`);
3769
>
}
3770
3771
/**