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:
@@ -61,6 +61,12 @@ interface AfterCompactionEvent {
|
|||||||
compactedCount: number;
|
compactedCount: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface SessionEndEvent {
|
||||||
|
sessionId: string;
|
||||||
|
messageCount: number;
|
||||||
|
durationMs?: number;
|
||||||
|
}
|
||||||
|
|
||||||
interface EventContext {
|
interface EventContext {
|
||||||
sessionKey?: string;
|
sessionKey?: string;
|
||||||
workspaceDir?: string;
|
workspaceDir?: string;
|
||||||
@@ -93,6 +99,7 @@ interface OpenClawPluginApi {
|
|||||||
((event: "tool_result_persist", callback: EventCallback<ToolResultPersistEvent>) => void) &
|
((event: "tool_result_persist", callback: EventCallback<ToolResultPersistEvent>) => void) &
|
||||||
((event: "agent_end", callback: EventCallback<AgentEndEvent>) => void) &
|
((event: "agent_end", callback: EventCallback<AgentEndEvent>) => void) &
|
||||||
((event: "session_start", callback: EventCallback<SessionStartEvent>) => void) &
|
((event: "session_start", callback: EventCallback<SessionStartEvent>) => void) &
|
||||||
|
((event: "session_end", callback: EventCallback<SessionEndEvent>) => void) &
|
||||||
((event: "after_compaction", callback: EventCallback<AfterCompactionEvent>) => void) &
|
((event: "after_compaction", callback: EventCallback<AfterCompactionEvent>) => void) &
|
||||||
((event: "gateway_start", callback: EventCallback<Record<string, never>>) => void);
|
((event: "gateway_start", callback: EventCallback<Record<string, never>>) => void);
|
||||||
runtime: {
|
runtime: {
|
||||||
@@ -528,6 +535,15 @@ export default function claudeMemPlugin(api: OpenClawPluginApi): void {
|
|||||||
}, api.logger);
|
}, 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
|
// Event: gateway_start — clear session tracking for fresh start
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user