From 4d31b1ecee38e576377b8ded65f309ae8f76ee86 Mon Sep 17 00:00:00 2001 From: Cocoon-Break <54054995+kuishou68@users.noreply.github.com> Date: Mon, 13 Apr 2026 15:47:28 +0800 Subject: [PATCH] fix: handle control_request messages in claude backend (auto-approve was dead code) (#811) * fix: handle control_request messages in claude backend to enable auto-approve (Closes #810) Signed-off-by: cocoon <54054995+kuishou68@users.noreply.github.com> * fix: defer stdin.Close() inside goroutine so control_request writes can succeed Signed-off-by: Cocoon-Break <54054995+kuishou68@users.noreply.github.com> --------- Signed-off-by: cocoon <54054995+kuishou68@users.noreply.github.com> Signed-off-by: Cocoon-Break <54054995+kuishou68@users.noreply.github.com> --- server/pkg/agent/claude.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/server/pkg/agent/claude.go b/server/pkg/agent/claude.go index 3cbf747197..3c5c19a947 100644 --- a/server/pkg/agent/claude.go +++ b/server/pkg/agent/claude.go @@ -64,18 +64,13 @@ func (b *claudeBackend) Execute(ctx context.Context, prompt string, opts ExecOpt _ = cmd.Wait() return nil, fmt.Errorf("write claude input: %w", err) } - if err := stdin.Close(); err != nil { - cancel() - _ = cmd.Wait() - return nil, fmt.Errorf("close claude stdin: %w", err) - } - b.cfg.Logger.Info("claude started", "pid", cmd.Process.Pid, "cwd", opts.Cwd, "model", opts.Model) msgCh := make(chan Message, 256) resCh := make(chan Result, 1) go func() { + defer stdin.Close() defer cancel() defer close(msgCh) defer close(resCh) @@ -129,6 +124,10 @@ func (b *claudeBackend) Execute(ctx context.Context, prompt string, opts ExecOpt Content: msg.Log.Message, }) } + case "control_request": + // Auto-approve tool-use permission requests so that Claude + // can proceed in daemon / bypass-permissions mode. + b.handleControlRequest(msg, stdin) } }