fix(engine): dispose completed spawned child sessions
This commit is contained in:
5
.changeset/dispose-spawned-child-sessions.md
Normal file
5
.changeset/dispose-spawned-child-sessions.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@runfusion/fusion": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Dispose completed spawned child agent sessions so execution memory is released promptly after `fn_spawn_agent` children finish.
|
||||||
@@ -709,7 +709,8 @@ describe("Agent Spawning - runSpawnedChild", () => {
|
|||||||
// Should transition: running → active
|
// Should transition: running → active
|
||||||
expect(agentStore.updateAgentState).toHaveBeenCalledWith("agent-test", "running");
|
expect(agentStore.updateAgentState).toHaveBeenCalledWith("agent-test", "running");
|
||||||
expect(agentStore.updateAgentState).toHaveBeenCalledWith("agent-test", "active");
|
expect(agentStore.updateAgentState).toHaveBeenCalledWith("agent-test", "active");
|
||||||
// Should clean up
|
// Should clean up and release session resources
|
||||||
|
expect(mockSession.dispose).toHaveBeenCalledOnce();
|
||||||
expect(internals.childSessions.has("agent-test")).toBe(false);
|
expect(internals.childSessions.has("agent-test")).toBe(false);
|
||||||
expect(internals.totalSpawnedCount).toBe(0);
|
expect(internals.totalSpawnedCount).toBe(0);
|
||||||
});
|
});
|
||||||
@@ -732,7 +733,8 @@ describe("Agent Spawning - runSpawnedChild", () => {
|
|||||||
|
|
||||||
expect(agentStore.updateAgentState).toHaveBeenCalledWith("agent-test", "running");
|
expect(agentStore.updateAgentState).toHaveBeenCalledWith("agent-test", "running");
|
||||||
expect(agentStore.updateAgentState).toHaveBeenCalledWith("agent-test", "error");
|
expect(agentStore.updateAgentState).toHaveBeenCalledWith("agent-test", "error");
|
||||||
// Should still clean up
|
// Should still clean up and release session resources
|
||||||
|
expect(mockSession.dispose).toHaveBeenCalledOnce();
|
||||||
expect(internals.childSessions.has("agent-test")).toBe(false);
|
expect(internals.childSessions.has("agent-test")).toBe(false);
|
||||||
expect(internals.totalSpawnedCount).toBe(0);
|
expect(internals.totalSpawnedCount).toBe(0);
|
||||||
});
|
});
|
||||||
@@ -751,6 +753,7 @@ describe("Agent Spawning - runSpawnedChild", () => {
|
|||||||
// Should not throw even when state updates fail
|
// Should not throw even when state updates fail
|
||||||
await internals.runSpawnedChild("agent-test", mockSession, "Do the research");
|
await internals.runSpawnedChild("agent-test", mockSession, "Do the research");
|
||||||
|
|
||||||
|
expect(mockSession.dispose).toHaveBeenCalledOnce();
|
||||||
expect(internals.childSessions.has("agent-test")).toBe(false);
|
expect(internals.childSessions.has("agent-test")).toBe(false);
|
||||||
expect(internals.totalSpawnedCount).toBe(0);
|
expect(internals.totalSpawnedCount).toBe(0);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -15607,7 +15607,18 @@ You have access to the file system to review changes.${verdictBlock}`;
|
|||||||
const errorMessage = err instanceof Error ? err.message : String(err);
|
const errorMessage = err instanceof Error ? err.message : String(err);
|
||||||
executorLog.warn(`Child agent ${agentId} failed: ${errorMessage}`);
|
executorLog.warn(`Child agent ${agentId} failed: ${errorMessage}`);
|
||||||
} finally {
|
} finally {
|
||||||
this.childSessions.delete(agentId);
|
/*
|
||||||
|
FNXC:AgentSpawning 2026-06-23-12:25:
|
||||||
|
Server memory must return to baseline after spawned child execution. A normally completed child session owns provider/runtime state until disposed; deleting it from childSessions first makes later parent cleanup unable to reach it.
|
||||||
|
*/
|
||||||
|
if (this.childSessions.get(agentId) === childSession) {
|
||||||
|
try {
|
||||||
|
childSession.dispose();
|
||||||
|
} catch (disposeErr) {
|
||||||
|
executorLog.warn(`Child agent ${agentId} session dispose failed: ${disposeErr instanceof Error ? disposeErr.message : String(disposeErr)}`);
|
||||||
|
}
|
||||||
|
this.childSessions.delete(agentId);
|
||||||
|
}
|
||||||
this.totalSpawnedCount = Math.max(0, this.totalSpawnedCount - 1);
|
this.totalSpawnedCount = Math.max(0, this.totalSpawnedCount - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user