diff --git a/src/acp-agent.ts b/src/acp-agent.ts index 617fff67..e34fc9f4 100644 --- a/src/acp-agent.ts +++ b/src/acp-agent.ts @@ -732,7 +732,23 @@ export class ClaudeAcpAgent implements Agent { PostToolUse: [ ...(userProvidedOptions?.hooks?.PostToolUse || []), { - hooks: [createPostToolUseHook(this.logger)], + hooks: [ + createPostToolUseHook(this.logger, { + onEnterPlanMode: async () => { + const session = this.sessions[sessionId]; + if (session) { + session.permissionMode = "plan"; + } + await this.client.sessionUpdate({ + sessionId, + update: { + sessionUpdate: "current_mode_update", + currentModeId: "plan", + }, + }); + }, + }), + ], }, ], }, diff --git a/src/tools.ts b/src/tools.ts index ff5f2f23..8e7accfc 100644 --- a/src/tools.ts +++ b/src/tools.ts @@ -752,16 +752,28 @@ export const registerHookCallback = ( /* A callback for Claude Code that is called when receiving a PostToolUse hook */ export const createPostToolUseHook = - (logger: Logger = console): HookCallback => + ( + logger: Logger = console, + options?: { + onEnterPlanMode?: () => Promise; + }, + ): HookCallback => async (input: any, toolUseID: string | undefined): Promise<{ continue: boolean }> => { - if (input.hook_event_name === "PostToolUse" && toolUseID) { - const onPostToolUseHook = toolUseCallbacks[toolUseID]?.onPostToolUseHook; - if (onPostToolUseHook) { - await onPostToolUseHook(toolUseID, input.tool_input, input.tool_response); - delete toolUseCallbacks[toolUseID]; // Cleanup after execution - } else { - logger.error(`No onPostToolUseHook found for tool use ID: ${toolUseID}`); - delete toolUseCallbacks[toolUseID]; + if (input.hook_event_name === "PostToolUse") { + // Handle EnterPlanMode tool - notify client of mode change after successful execution + if (input.tool_name === "EnterPlanMode" && options?.onEnterPlanMode) { + await options.onEnterPlanMode(); + } + + if (toolUseID) { + const onPostToolUseHook = toolUseCallbacks[toolUseID]?.onPostToolUseHook; + if (onPostToolUseHook) { + await onPostToolUseHook(toolUseID, input.tool_input, input.tool_response); + delete toolUseCallbacks[toolUseID]; // Cleanup after execution + } else { + logger.error(`No onPostToolUseHook found for tool use ID: ${toolUseID}`); + delete toolUseCallbacks[toolUseID]; + } } } return { continue: true };