From 24618a7cd1b0d8ff92728513376217e8681e23c8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:35:14 +0000 Subject: [PATCH 1/4] Initial plan From 48dbcb98f6901f786e0829b4bcc6ecc4447f0390 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:47:36 +0000 Subject: [PATCH 2/4] Fix critical resource management and variable shadowing issues Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- cmd/generate/generate.go | 6 +++--- cmd/generate/llm.go | 14 ++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/cmd/generate/generate.go b/cmd/generate/generate.go index be2cf91f..6610bbd2 100644 --- a/cmd/generate/generate.go +++ b/cmd/generate/generate.go @@ -76,14 +76,14 @@ func NewGenerateCommand(cfg *command.Config) *cobra.Command { sessionFile: util.Ptr(sessionFile), } - // Create context - context, err := handler.CreateContextFromPrompt() + // Create prompt context + promptContext, err := handler.CreateContextFromPrompt() if err != nil { return fmt.Errorf("failed to create context: %w", err) } // Run the PromptPex pipeline - if err := handler.RunTestGenerationPipeline(context); err != nil { + if err := handler.RunTestGenerationPipeline(promptContext); err != nil { // Disable usage help for pipeline failures cmd.SilenceUsage = true return fmt.Errorf("pipeline failed: %w", err) diff --git a/cmd/generate/llm.go b/cmd/generate/llm.go index c539bfc8..c970df12 100644 --- a/cmd/generate/llm.go +++ b/cmd/generate/llm.go @@ -28,11 +28,10 @@ func (h *generateCommandHandler) callModelWithRetry(step string, req azuremodels for attempt := 0; attempt <= maxRetries; attempt++ { sp := spinner.New(spinner.CharSets[14], 100*time.Millisecond, spinner.WithWriter(h.cfg.ErrOut)) sp.Start() - //nolint:gocritic,revive // TODO - defer sp.Stop() resp, err := h.client.GetChatCompletionStream(ctx, req, h.org) if err != nil { + sp.Stop() var rateLimitErr *azuremodels.RateLimitError if errors.As(err, &rateLimitErr) { if attempt < maxRetries { @@ -53,8 +52,6 @@ func (h *generateCommandHandler) callModelWithRetry(step string, req azuremodels return "", err } reader := resp.Reader - //nolint:gocritic,revive // TODO - defer reader.Close() var content strings.Builder for { @@ -63,6 +60,8 @@ func (h *generateCommandHandler) callModelWithRetry(step string, req azuremodels if errors.Is(err, context.Canceled) || strings.Contains(err.Error(), "EOF") { break } + reader.Close() + sp.Stop() return "", err } for _, choice := range completion.Choices { @@ -75,6 +74,13 @@ func (h *generateCommandHandler) callModelWithRetry(step string, req azuremodels } } + // Properly close reader and stop spinner before returning success + err = reader.Close() + sp.Stop() + if err != nil { + return "", fmt.Errorf("failed to close reader: %w", err) + } + res := strings.TrimSpace(content.String()) h.LogLLMResponse(res) return res, nil From 3cdca233c762346a1b732e428b35a3236e0418f3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:54:07 +0000 Subject: [PATCH 3/4] Fix additional variable shadowing and improve error handling Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- cmd/generate/context.go | 10 +++++----- cmd/generate/llm.go | 5 ++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/cmd/generate/context.go b/cmd/generate/context.go index c20a7023..85c4a318 100644 --- a/cmd/generate/context.go +++ b/cmd/generate/context.go @@ -26,7 +26,7 @@ func (h *generateCommandHandler) CreateContextFromPrompt() (*PromptPexContext, e } runID := fmt.Sprintf("run_%d", time.Now().Unix()) - context := &PromptPexContext{ + promptContext := &PromptPexContext{ // Unique identifier for the run RunID: runID, // The prompt content and metadata @@ -50,21 +50,21 @@ func (h *generateCommandHandler) CreateContextFromPrompt() (*PromptPexContext, e } else { sessionInfo = fmt.Sprintf("reloading session file at %s", *h.sessionFile) // Check if prompt hashes match - if existingContext.PromptHash != context.PromptHash { + if existingContext.PromptHash != promptContext.PromptHash { return nil, fmt.Errorf("prompt changed unable to reuse session file") } // Merge existing context data if existingContext != nil { - context = mergeContexts(existingContext, context) + promptContext = mergeContexts(existingContext, promptContext) } } } - h.WriteToParagraph(RenderMessagesToString(context.Prompt.Messages)) + h.WriteToParagraph(RenderMessagesToString(promptContext.Prompt.Messages)) h.WriteEndBox(sessionInfo) - return context, nil + return promptContext, nil } // loadContextFromFile loads a PromptPexContext from a JSON file diff --git a/cmd/generate/llm.go b/cmd/generate/llm.go index c970df12..16e919fe 100644 --- a/cmd/generate/llm.go +++ b/cmd/generate/llm.go @@ -60,7 +60,10 @@ func (h *generateCommandHandler) callModelWithRetry(step string, req azuremodels if errors.Is(err, context.Canceled) || strings.Contains(err.Error(), "EOF") { break } - reader.Close() + if closeErr := reader.Close(); closeErr != nil { + // Log close error but don't override the original error + h.cfg.WriteToOut(fmt.Sprintf("Warning: failed to close reader: %v\n", closeErr)) + } sp.Stop() return "", err } From 5c0684a438c39a0ccf23eda0852f656f44297db6 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Wed, 30 Jul 2025 08:56:10 -0700 Subject: [PATCH 4/4] Update cmd/generate/llm.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- cmd/generate/llm.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/generate/llm.go b/cmd/generate/llm.go index 16e919fe..f679f397 100644 --- a/cmd/generate/llm.go +++ b/cmd/generate/llm.go @@ -62,7 +62,7 @@ func (h *generateCommandHandler) callModelWithRetry(step string, req azuremodels } if closeErr := reader.Close(); closeErr != nil { // Log close error but don't override the original error - h.cfg.WriteToOut(fmt.Sprintf("Warning: failed to close reader: %v\n", closeErr)) + fmt.Fprintf(h.cfg.ErrOut, "Warning: failed to close reader: %v\n", closeErr) } sp.Stop() return "", err