github/copilot-sdk · error

failed to delete session

Error message

failed to delete session %s: %s

What it means

DeleteSession returns this error when the backend explicitly reported the delete failed: deleteSessionResponse.Success was false and the backend supplied an Error string. This is a backend-side failure report, not a transport/decode problem.

Solutions

  1. Read the embedded backend error message after the colon for the root cause
  2. Ensure no running agent process has the session open before deleting
  3. Check filesystem permissions on the backend's session storage directory
  4. Confirm the session still exists (it may already have been deleted)

Example fix

// before
err := client.DeleteSession(ctx, sessionID)
if err != nil { panic(err) }
// after
if err := client.DeleteSession(ctx, sessionID); err != nil {
    log.Printf("could not delete session %s: %v", sessionID, err)
    // inspect whether session was active, then retry
}
Defensive patterns

Strategy: try-catch

Validate before calling

sessions, _ := client.ListSessions(ctx)
exists := slices.ContainsFunc(sessions, func(s *SessionInfo) bool { return s.ID == sessionID })
if !exists { return fmt.Errorf("session %s not found", sessionID) }

Try / catch

if err := client.DeleteSession(ctx, id); err != nil {
    if strings.Contains(err.Error(), "failed to delete session") {
        // backend refused: parse reason after the colon, check active/permissions
        return fmt.Errorf("backend refused delete: %w", err)
    }
    return err
}

Prevention

When it happens

Trigger: Calling DeleteSession and receiving response.Success == false; the wrapped message includes the backend's own error text (or 'unknown error' if none).

Common situations: Deleting a session that is still active/open in the TUI; permission problems on the backend's session storage directory; session already deleted concurrently.

Related errors


AI-assisted analysis of github/copilot-sdk@cd8cf15dc3 (2026-09-09). Data as JSON: /api/errors/1236559055608a0c. Report an issue: GitHub.

Appendix: source

Thrown at go/client.go:1626

		return err
	}

	result, err := c.client.Request(ctx, "session.delete", deleteSessionRequest{SessionID: sessionID})
	if err != nil {
		return err
	}

	var response deleteSessionResponse
	if err := json.Unmarshal(result, &response); err != nil {
		return fmt.Errorf("failed to unmarshal delete response: %w", err)
	}

	if !response.Success {
		errorMsg := "unknown error"
		if response.Error != nil {
			errorMsg = *response.Error
		}
		return fmt.Errorf("failed to delete session %s: %s", sessionID, errorMsg)
	}

	// Remove from local sessions map if present
	c.sessionsMux.Lock()
	session := c.sessions[sessionID]
	delete(c.sessions, sessionID)
	c.sessionsMux.Unlock()
	if session != nil {
		session.releaseGitHubTokenProviderRegistration()
	}

	return nil
}

// GetLastSessionID returns the ID of the most recently updated session.
//
// This is useful for resuming the last conversation when the session ID
// was not stored. Returns nil if no sessions exist.

View on GitHub (pinned to cd8cf15dc3)