fix(claude-code-session-state): clear session-agent map on delete and sync cleanup
External review on PR #4074 noted that adding setSessionAgent for child sessions left sessionAgentMap holding entries after the session was deleted or after the sync call_omo_agent executor cleaned up other owned state. The map only grows; entries never get reused but they do accumulate across long-running plugin instances. Close both gaps: - BackgroundManager.handleEvent for session.deleted now calls clearSessionAgent for the deleted session id on both the early-return no-task branch and the cascade tail. This pairs with the existing clearDelegatedChildSessionBootstrap and SessionCategoryRegistry.remove so all owned session state is dropped together. - sync-executor finally for createdSessionForExecution now calls clearSessionAgent alongside the existing subagentSessions, syncSubagentSessions, and deleteSessionTools cleanup so sessions this executor created cannot leak their agent mapping. Adds focused tests: - BackgroundManager.handleEvent - session.deleted cascade > should clear session agent state for deleted sessions to prevent map leak - executeSync > registers child-session bootstrap and tracked prompt state before sync prompt dispatch (extended assertion for cleanup)
This commit is contained in:
@@ -394,6 +394,8 @@ describe("executeSync", () => {
|
||||
expect(observed[0]?.bootstrap?.tools?.question).toBe(false)
|
||||
expect(observed[0]?.bootstrap?.fallbackChain?.[0]?.model).toBe("gpt-5.4")
|
||||
expect(getDelegatedChildSessionBootstrap("ses-call-bootstrap")).toBeUndefined()
|
||||
// session-agent state for a sync session we created must be cleared after dispatch
|
||||
expect(getSessionAgent("ses-call-bootstrap")).toBeUndefined()
|
||||
} finally {
|
||||
clearAllDelegatedChildSessionBootstrap()
|
||||
clearSessionTools()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import type { PluginInput } from "@opencode-ai/plugin"
|
||||
import { setSessionAgent, subagentSessions, syncSubagentSessions } from "../../features/claude-code-session-state"
|
||||
import { clearSessionAgent, setSessionAgent, subagentSessions, syncSubagentSessions } from "../../features/claude-code-session-state"
|
||||
import { promptAsyncAfterSessionIdle } from "../../hooks/shared/prompt-async-gate"
|
||||
import { getAgentToolRestrictions, log } from "../../shared"
|
||||
import { getAgentDisplayName, stripAgentListSortPrefix } from "../../shared/agent-display-names"
|
||||
@@ -187,6 +187,7 @@ export async function executeSync(
|
||||
subagentSessions.delete(sessionID)
|
||||
syncSubagentSessions.delete(sessionID)
|
||||
deleteSessionTools(sessionID)
|
||||
clearSessionAgent(sessionID)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user