Clean up session tracking on session_end to prevent unbounded map growth

gateway_start only fires on full process restart. Without cleanup,
sessionIds and workspaceDirsBySessionKey grow indefinitely across
/new and /reset cycles. session_end now deletes entries for the
completed session key.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Alex Newman
2026-02-09 21:42:23 -05:00
parent c7f7f87321
commit e13562e4cb
+16
View File
@@ -61,6 +61,12 @@ interface AfterCompactionEvent {
compactedCount: number;
}
interface SessionEndEvent {
sessionId: string;
messageCount: number;
durationMs?: number;
}
interface EventContext {
sessionKey?: string;
workspaceDir?: string;
@@ -93,6 +99,7 @@ interface OpenClawPluginApi {
((event: "tool_result_persist", callback: EventCallback<ToolResultPersistEvent>) => void) &
((event: "agent_end", callback: EventCallback<AgentEndEvent>) => void) &
((event: "session_start", callback: EventCallback<SessionStartEvent>) => void) &
((event: "session_end", callback: EventCallback<SessionEndEvent>) => void) &
((event: "after_compaction", callback: EventCallback<AfterCompactionEvent>) => void) &
((event: "gateway_start", callback: EventCallback<Record<string, never>>) => void);
runtime: {
@@ -528,6 +535,15 @@ export default function claudeMemPlugin(api: OpenClawPluginApi): void {
}, api.logger);
});
// ------------------------------------------------------------------
// Event: session_end — clean up session tracking to prevent unbounded growth
// ------------------------------------------------------------------
api.on("session_end", async (_event, ctx) => {
const key = ctx.sessionKey || "default";
sessionIds.delete(key);
workspaceDirsBySessionKey.delete(key);
});
// ------------------------------------------------------------------
// Event: gateway_start — clear session tracking for fresh start
// ------------------------------------------------------------------