From e1f51592b1a7c39288334393fd5663f0d16e62af Mon Sep 17 00:00:00 2001 From: Lex Christopherson Date: Wed, 25 Mar 2026 22:20:43 -0600 Subject: [PATCH] fix(gsd): handle session_switch event so /resume restores GSD state (#2587) The GSD extension only listened for session_start, not session_switch. When /resume switched to a previous session, GSD's write-gate, loop guard, discussion flow, service tier, and tool API keys were never re-initialized, leaving GSD in stale state from the prior session. Co-Authored-By: Claude Opus 4.6 (1M context) --- src/resources/extensions/gsd/bootstrap/register-hooks.ts | 8 ++++++++ src/resources/extensions/gsd/extension-manifest.json | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/resources/extensions/gsd/bootstrap/register-hooks.ts b/src/resources/extensions/gsd/bootstrap/register-hooks.ts index 0cdc0353f..9de7759e8 100644 --- a/src/resources/extensions/gsd/bootstrap/register-hooks.ts +++ b/src/resources/extensions/gsd/bootstrap/register-hooks.ts @@ -69,6 +69,14 @@ export function registerHooks(pi: ExtensionAPI): void { } }); + pi.on("session_switch", async (_event, ctx) => { + resetWriteGateState(); + resetToolCallLoopGuard(); + clearDiscussionFlowState(); + await syncServiceTierStatus(ctx); + loadToolApiKeys(); + }); + pi.on("before_agent_start", async (event, ctx: ExtensionContext) => { return buildBeforeAgentStartResult(event, ctx); }); diff --git a/src/resources/extensions/gsd/extension-manifest.json b/src/resources/extensions/gsd/extension-manifest.json index a1b2877be..2c01ab4ee 100644 --- a/src/resources/extensions/gsd/extension-manifest.json +++ b/src/resources/extensions/gsd/extension-manifest.json @@ -12,7 +12,7 @@ "gsd_requirement_update", "gsd_milestone_generate_id" ], "commands": ["gsd", "kill", "worktree", "exit"], - "hooks": ["session_start"], + "hooks": ["session_start", "session_switch"], "shortcuts": ["Ctrl+Alt+G"] } }