diff --git a/server/pkg/agent/claude.go b/server/pkg/agent/claude.go index 3c5c19a94..ae75c1c18 100644 --- a/server/pkg/agent/claude.go +++ b/server/pkg/agent/claude.go @@ -52,14 +52,21 @@ func (b *claudeBackend) Execute(ctx context.Context, prompt string, opts ExecOpt cancel() return nil, fmt.Errorf("claude stdin pipe: %w", err) } + closeStdin := func() { + if stdin != nil { + _ = stdin.Close() + stdin = nil + } + } cmd.Stderr = newLogWriter(b.cfg.Logger, "[claude:stderr] ") if err := cmd.Start(); err != nil { + closeStdin() cancel() return nil, fmt.Errorf("start claude: %w", err) } if err := writeClaudeInput(stdin, prompt); err != nil { - _ = stdin.Close() + closeStdin() cancel() _ = cmd.Wait() return nil, fmt.Errorf("write claude input: %w", err) @@ -70,7 +77,7 @@ func (b *claudeBackend) Execute(ctx context.Context, prompt string, opts ExecOpt resCh := make(chan Result, 1) go func() { - defer stdin.Close() + defer closeStdin() defer cancel() defer close(msgCh) defer close(resCh) @@ -107,6 +114,7 @@ func (b *claudeBackend) Execute(ctx context.Context, prompt string, opts ExecOpt } trySend(msgCh, Message{Type: MessageStatus, Status: "running"}) case "result": + closeStdin() sessionID = msg.SessionID if msg.ResultText != "" { output.Reset()