Skip to content

πŸ› fix(session): redesign read-only extractor handling β€” opt-in trust + cached source#4235

Closed
ReneWerner87 with Copilot wants to merge 8 commits into
mainfrom
copilot/fix-query-extractor-failure
Closed

πŸ› fix(session): redesign read-only extractor handling β€” opt-in trust + cached source#4235
ReneWerner87 with Copilot wants to merge 8 commits into
mainfrom
copilot/fix-query-extractor-failure

Conversation

Copilot AI commented Apr 25, 2026

Copy link
Copy Markdown
Contributor

Description

Fixes a bug where session IDs supplied via read-only extractors (query, form, URL param, custom) were silently discarded when no session data existed in storage for that ID. A new random ID was generated instead β€” but never communicated back to the client (these sources are write-only; no Set-Cookie/response header is written), so every request created an orphaned session.

The initial fix preserved client-supplied IDs unconditionally, which introduced a session-fixation vector and a chain-aware writability inconsistency between the first and subsequent Store.Get calls within the same request. This revision keeps the bug fix while making the behaviour explicit, opt-in, and validated, and centralises source tracking so the chain decision is cached together with the resolved ID.

Changes introduced

extractors/extractors.go

  • Add Source.IsWritable() helper. Cookie and header sources are writable; query, form, param, custom, and auth-header sources are not. Removes open-coded src == SourceCookie || src == SourceHeader checks that the prior revision duplicated across callers.

middleware/session/store.go

  • Replace the prior (string, bool) return with a sessionIDInfo{id, source} struct cached in request locals. resolveSessionID walks chained sub-extractors and reports the actual source that produced the value.
  • A second Store.Get within the same request reuses the cached sessionIDInfo instead of re-deriving writability from the chain wrapper, fixing a regression where two Store.Get calls would yield different source decisions (and therefore different discard/preserve outcomes).
  • New acceptClientID(info) consolidates the read-only-trust decision: writable sources are never accepted here; read-only sources require both TrustClientSessionID and a ClientSessionIDValidator that accepts the supplied ID.
  • The rawData == nil branch becomes a clean three-way switch: already-resolved (keep), opt-in trusted client ID (keep + fresh), otherwise discard + regenerate.

middleware/session/config.go

Two new optional fields:

  • TrustClientSessionID bool β€” default false. Allows client-supplied IDs from read-only sources to be preserved.
  • ClientSessionIDValidator func(id string) bool β€” required when TrustClientSessionID is true; nil rejects all.

Defaults are unchanged for cookie/header users. Read-only-source users keep safe-by-default behaviour (KeyGenerator() regeneration) and must explicitly opt in; preserving client-controlled IDs is a security-relevant decision and should not be silent.

docs/middleware/session.md

  • Add the two new fields to the Config Properties table.
  • New "Trusting Client-Supplied IDs from Read-Only Sources" section explaining the trade-offs, the session-fixation and storage-poisoning risks, and the recommended HMAC/allow-list validator pattern.

middleware/session/store_test.go and extractors/extractors_test.go

  • Test_Store_resolveSessionID updated for the new return type; new sub-tests assert the chain reports the source of the actually-providing extractor, skips nil Extract funcs, returns wrapper source when no value is found.
  • Test_Source_IsWritable covers every Source value.
  • Test_Store_Get extended: default rejects client query ID; opt-in + permissive validator preserves it; opt-in + rejecting validator discards it; opt-in without validator fails closed; opt-in roundtrip persists data across requests; chain cookie-first still discards unknown cookie even with opt-in; chain query fallback preserved when cookie absent; two Store.Get calls in same request return the same ID for both query and cookie sources; empty client query ID falls through to server generation; storage GetWithContext error is propagated.
  • Test_Store_DeleteSession now models the realistic cross-request delete + re-Get path.

Behaviour Matrix

Source Unknown ID, defaults Unknown ID, TrustClientSessionID=true + validator passes
Cookie / Header discarded, fresh server ID (fixation safe) unchanged (still discarded)
Query / Form / Param / Custom discarded, fresh server ID preserved, fresh session under client ID

Compatibility

  • Cookie/header users: no behaviour change.

  • Read-only-source users must set TrustClientSessionID: true and provide a ClientSessionIDValidator to preserve client-supplied IDs.

  • Benchmarks: Hot path: one extra interface boxing per request (already present for the existing locals key). No measurable impact.

  • Documentation Update: docs/middleware/session.md updated with new config fields and security guidance.

  • Changelog/What's New: Bug fix β€” session middleware now correctly handles read-only extractor sources with explicit, validated opt-in for client-supplied ID trust.

  • Migration Guide: No breaking changes for cookie/header users. Read-only-source users who relied on implicit ID preservation must add TrustClientSessionID: true and a ClientSessionIDValidator.

  • API Alignment with Express: N/A.

  • API Longevity: New config fields are additive and default to safe behaviour; no existing API is modified.

  • Examples: See TrustClientSessionID / ClientSessionIDValidator in docs/middleware/session.md.

Type of change

  • New feature (non-breaking change which adds functionality)
  • Enhancement (improvement to existing features and functionality)
  • Documentation update (changes to documentation)

Checklist

  • Followed the inspiration of the Express.js framework for new functionalities, making them similar in usage.
  • Conducted a self-review of the code and provided comments for complex or critical parts.
  • Updated the documentation in the /docs/ directory for Fiber's documentation.
  • Added or updated unit tests to validate the effectiveness of the changes or new features.
  • Ensured that new and existing unit tests pass locally with the changes.
  • Verified that any new dependencies are essential and have been agreed upon by the maintainers/community.
  • Aimed for optimal performance with minimal allocations in the new code.
  • Provided benchmarks for the new code to analyze and improve upon.

Copilot AI linked an issue Apr 25, 2026 that may be closed by this pull request
3 tasks
Copilot AI and others added 2 commits April 25, 2026 20:59
… no data found in store

Agent-Logs-Url: https://github.com/gofiber/fiber/sessions/eb400386-f910-4188-a7b8-33bb8fba5d4f

Co-authored-by: ReneWerner87 <7063188+ReneWerner87@users.noreply.github.com>
…curity note

Agent-Logs-Url: https://github.com/gofiber/fiber/sessions/eb400386-f910-4188-a7b8-33bb8fba5d4f

Co-authored-by: ReneWerner87 <7063188+ReneWerner87@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix query extractor failure for session ID πŸ› bug: fix query/form/param/custom extractor session IDs being discarded on first use Apr 25, 2026
Copilot AI requested a review from ReneWerner87 April 25, 2026 21:02
@gaby

gaby commented Apr 25, 2026

Copy link
Copy Markdown
Member

@ReneWerner87 The solution it implemented seems kind of weird

@ReneWerner87 ReneWerner87 added this to v3 Apr 25, 2026
@ReneWerner87 ReneWerner87 added this to the v3 milestone Apr 25, 2026
@codecov

codecov Bot commented Apr 25, 2026

Copy link
Copy Markdown

Codecov Report

βœ… All modified and coverable lines are covered by tests.
βœ… Project coverage is 91.29%. Comparing base (6bf3888) to head (2ea429e).
⚠️ Report is 3 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #4235      +/-   ##
==========================================
+ Coverage   91.25%   91.29%   +0.03%     
==========================================
  Files         127      127              
  Lines       12556    12589      +33     
==========================================
+ Hits        11458    11493      +35     
+ Misses        687      686       -1     
+ Partials      411      410       -1     
Flag Coverage Ξ”
unittests 91.29% <100.00%> (+0.03%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

β˜” View full report in Codecov by Sentry.
πŸ“’ Have feedback on the report? Share it here.

πŸš€ New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@ReneWerner87

Copy link
Copy Markdown
Member

I will check it tomorrow

…cached source

Replaces the implicit "preserve query/form/param/custom session IDs" behaviour
with an explicit, validated opt-in and centralizes source tracking so chained
extractors stay consistent across multiple Store.Get calls in the same request.

Changes:

- extractors: add Source.IsWritable() so callers no longer hand-roll the
  cookie/header check.
- session.Store: cache the resolved session ID together with its originating
  Source in request locals (sessionIDInfo). resolveSessionID iterates chain
  sub-extractors and reports the source that actually produced the value;
  subsequent Store.Get calls in the same request reuse that decision instead
  of re-deriving it from the chain wrapper.
- session.Config: add TrustClientSessionID (default false) and
  ClientSessionIDValidator. Read-only sources (query/form/param/custom) only
  preserve a client-supplied unknown ID when both flags are set and the
  validator accepts it; otherwise the ID is discarded and a fresh server ID
  is generated, matching cookie/header fixation protection. Cookie/header
  sources are unaffected and always discard unknown IDs.
- docs/middleware/session.md: document the new flags, the security
  trade-offs, and the recommended HMAC/allow-list validator pattern.
- store_test.go: update Test_Store_resolveSessionID to the new signature,
  cover trust-on/off, validator rejects, opt-in roundtrip, chain source
  resolution, two-Get-same-request consistency for both query and cookie
  sources, and empty client ID. Test_Store_DeleteSession now models the
  cross-request delete + re-Get path instead of relying on the previous
  regenerate-loop bug.

Closes #4234
@ReneWerner87 ReneWerner87 changed the title πŸ› bug: fix query/form/param/custom extractor session IDs being discarded on first use πŸ› fix(session): redesign read-only extractor handling β€” opt-in trust + cached source May 4, 2026
@ReneWerner87

ReneWerner87 commented May 4, 2026

Copy link
Copy Markdown
Member

@gaby - agree, the original approach was off. Pushed a redesign in fb5450f1 that addresses both your concern and the structural issues underneath:

Why the first cut was weird

  • It silently changed read-only-extractor semantics for every existing user, no opt-in. Anyone using FromQuery/FromForm/FromCustom would suddenly persist client-controlled IDs.
  • That opens session fixation (?SESSIONID=ATTACKER_KNOWN) and storage poisoning (any caller can populate the store with arbitrary keys).
  • The writability check was duplicated in three spots and the chain-source decision was re-derived from Extractor.Source on the Locals-cache path - different result vs. the first call's chain iteration.

What the new commit does

  1. extractors.Source.IsWritable() - single helper, no more open-coded src == SourceCookie || src == SourceHeader in callers.
  2. sessionIDInfo{id, source} cached together in request locals. resolveSessionID walks the chain, the source decision sticks for any subsequent Store.Get in the same request. Fixes a regression where two Store.Get calls would yield different IDs.
  3. Config.TrustClientSessionID bool (default false) + ClientSessionIDValidator func(string) bool. Read-only sources only persist a client-supplied ID when both are set and the validator accepts it. Cookie/header behaviour is unchanged - unknown IDs are still discarded.
  4. Docs updated with the security trade-offs and the recommended HMAC/allow-list validator pattern.
  5. Tests cover: default rejects, opt-in accepts, validator rejects, opt-in-without-validator fails closed, opt-in roundtrip across requests, chain cookie-first still discards unknown cookies even with opt-in, two-Get-same-request consistency for both query (chain) and cookie sources, empty client ID is regenerated. Old Test_Store_DeleteSession now models the realistic cross-request delete path instead of relying on the old regenerate-loop.

PR title + body updated to match. Ready for another look.

…and docs

Pure prose cleanup. No behaviour change.
- Reorder Config fields so the bool TrustClientSessionID joins the trailing
  bool group; ClientSessionIDValidator moves into the function-pointer
  cluster. Sizeof(Config) drops from 208 to 200 bytes (fieldalignment).
- Spelling: behaviour -> behavior in Config doc comment.
- Tests: cover Source.IsWritable for every Source value, the resolveSessionID
  chain skip-nil-Extract path, the chain/single no-value wrapper-source
  fallback, and the Storage.GetWithContext error propagation in getSession.
@ReneWerner87

Copy link
Copy Markdown
Member

/gemini review

@ReneWerner87
ReneWerner87 marked this pull request as ready for review May 4, 2026 11:15
@ReneWerner87
ReneWerner87 requested a review from a team as a code owner May 4, 2026 11:15
@ReneWerner87
ReneWerner87 requested review from Copilot, gaby and sixcolors May 4, 2026 11:15
@ReneWerner87
ReneWerner87 requested a review from efectn May 4, 2026 11:15
@ReneWerner87

Copy link
Copy Markdown
Member

@coderabbitai review

@coderabbitai

coderabbitai Bot commented May 4, 2026

Copy link
Copy Markdown
Contributor
βœ… Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai

coderabbitai Bot commented May 4, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

βš™οΈ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 8be193cd-4552-4135-8d54-81c969ccfc40

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • πŸ” Trigger review

Walkthrough

This PR resolves issue #4234 by implementing opt-in support for persisting client-supplied session IDs from read-only sources (query, form, param, custom). It introduces Source.IsWritable() to distinguish writable sources, adds config flags TrustClientSessionID and ClientSessionIDValidator for security control, and refactors session ID resolution to cache source metadata and apply fixation/poisoning protections.

Changes

Client-Supplied Session ID Trust & Security

Layer / File(s) Summary
Source Abstraction
extractors/extractors.go
Source.IsWritable() distinguishes writable sources (cookie/header) from read-only sources to inform ID trust decisions.
Config & Validation
middleware/session/config.go
Adds TrustClientSessionID (bool) and ClientSessionIDValidator (func) fields to enable and validate client-supplied IDs from read-only sources.
Session ID Resolution
middleware/session/store.go
Refactors ID resolution to cache {id, source} info; introduces resolveSessionID (extractor-aware extraction) and acceptClientID (validation + fixation protection); regenerates untrusted/invalid IDs and marks them as server-issued (SourceCookie).
Testing
extractors/extractors_test.go, middleware/session/store_test.go
Tests IsWritable() behavior; expands session tests with security-focused subtests covering trust configuration, validator rejection, cross-request persistence, chain-extractor prioritization, and storage error handling.
Documentation
docs/middleware/session.md
Documents the new "Trusting Client-Supplied IDs from Read-Only Sources" section with examples, security implications (session fixation, storage poisoning), and configuration table updates.

Sequence Diagram

sequenceDiagram
    participant Client
    participant Middleware as Session Middleware
    participant Extractor as Extractors
    participant Validator as ClientSessionIDValidator
    participant Store as Session Store
    participant Storage as Backend Storage

    Client->>Middleware: Request with query SESSIONID=abc
    Middleware->>Store: Get(ctx)
    activate Store
    Store->>Extractor: resolveSessionID(extractors, ctx)
    Extractor-->>Store: {id: "abc", source: SourceQuery}
    Store->>Store: acceptClientID(id, source, config)
    alt TrustClientSessionID=true
        Store->>Validator: ClientSessionIDValidator("abc")
        alt Valid
            Validator-->>Store: true
            Store->>Storage: Load session "abc"
            Storage-->>Store: session data
        else Invalid
            Validator-->>Store: false
            Store->>Store: Generate new ID
            Store->>Storage: Load session (new ID)
        end
    else TrustClientSessionID=false
        Store->>Store: Generate new ID
        Store->>Storage: Load session (new ID)
    end
    deactivate Store
    Store-->>Middleware: session data
    Middleware-->>Client: Response with Set-Cookie or persisted session
Loading

Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly Related PRs

  • PR #3625 β€” Introduced the foundational extractor pattern and Source constants that this PR extends with writability awareness and trust logic.
  • PR #3630 β€” Also modifies the Source abstraction and extractor metadata, sharing the same source-aware infrastructure.
  • PR #3043 β€” Prior modifications to session ID resolution logic in middleware/session/store.go; this PR refactors similar code paths with enhanced security.

Suggested Labels

SessionMW, πŸ“’ Documentation

Suggested Reviewers

  • gaby
  • ReneWerner87
  • efectn

Poem

🐰 A rabbit hops through sessions bright,
Client IDs now trusted rightβ€”
Query strings may pass the gate,
When validators seal their fate.
Fixation vanquished, safety won! πŸ”

πŸš₯ Pre-merge checks | βœ… 5
βœ… Passed checks (5 passed)
Check name Status Explanation
Title check βœ… Passed The title clearly describes the main change: a fix that redesigns read-only session extractor handling with opt-in trust mechanism and cached source tracking, directly addressing issue #4234.
Linked Issues check βœ… Passed The PR fully addresses the #4234 objective by enabling read-only extractors to preserve client-supplied session IDs through explicit opt-in (TrustClientSessionID + ClientSessionIDValidator), while fixing security regressions from prior attempts and centralizing source tracking.
Out of Scope Changes check βœ… Passed All changes are directly scoped to the #4234 fix objective: extractors.go adds IsWritable() helper, store.go implements opt-in trust and caching logic, config.go adds required fields, docs explain the feature, and tests validate the new behavior. No unrelated changes detected.
Docstring Coverage βœ… Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check βœ… Passed The PR description is comprehensive and complete, covering problem statement, detailed changes, behavior matrix, compatibility notes, and type of change.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
πŸ§ͺ Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch copilot/fix-query-extractor-failure

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❀️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ReneWerner87

Copy link
Copy Markdown
Member

@copilot review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the ability to trust client-supplied session IDs from read-only sources, such as query parameters or form data, by adding TrustClientSessionID and ClientSessionIDValidator to the session configuration. It implements logic to track the source of extracted IDs, ensuring that unknown IDs from read-only sources are discarded by default to prevent session fixation unless explicitly validated. The update also includes comprehensive tests and documentation regarding the security implications of these new settings. I have no feedback to provide.

@ReneWerner87

Copy link
Copy Markdown
Member

@gaby @sixcolors can you check this

Copilot AI commented May 4, 2026

Copy link
Copy Markdown
Contributor Author

@copilot review

Reviewed fb5450f + 2cc374e + 7e73117. The redesign is solid:

  • Source.IsWritable() cleanly eliminates the duplicated src == SourceCookie || src == SourceHeader checks.
  • sessionIDInfo{id, source} cached together in locals is the right fix - the original code re-derived writability from Extractor.Source on cache-hit paths, which gave a different (wrong) answer for chained extractors on the 2nd Store.Get in the same request.
  • acceptClientID + TrustClientSessionID/ClientSessionIDValidator is the correct opt-in gate - defaults stay safe (discard + regenerate), and the security note in the TrustClientSessionID doc comment is appropriately direct about the session fixation / storage poisoning risks.
  • The three-way switch in the rawData == nil branch (alreadyResolved / acceptClientID / default) is clear and each case is independently correct.
  • Test coverage is comprehensive: trust on/off, validator accept/reject, nil validator fails-closed, opt-in roundtrip, cookie-first chain still discards with opt-in on, chain source resolution, two-Get-same-request consistency for both writable and read-only sources, storage error propagation, empty client ID regenerated.

All tests pass (go test ./middleware/session/... ./extractors/... -race -count=1), lint is clean.

Copilot AI requested a review from ReneWerner87 May 4, 2026 11:22

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR redesigns session ID handling for read-only extractors (query/form/param/custom/auth-header) to address #4234 while making client-supplied ID acceptance explicit and opt-in, and ensuring consistent behavior across multiple Store.Get calls within the same request.

Changes:

  • Adds extractors.Source.IsWritable() to centralize β€œwritable vs read-only” source classification.
  • Updates session store ID resolution to cache {id, source} in request locals, adds opt-in TrustClientSessionID + ClientSessionIDValidator, and adjusts unknown-ID handling accordingly.
  • Extends docs and tests to cover the new configuration and expected behaviors (including chained extractor behavior and per-request caching).

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
middleware/session/store.go Caches resolved session ID + originating source; adds opt-in trusted client ID acceptance for read-only sources.
middleware/session/store_test.go Updates and expands tests for new ID resolution/caching behavior and opt-in trust/validator logic.
middleware/session/config.go Adds TrustClientSessionID and ClientSessionIDValidator configuration fields and documentation.
extractors/extractors.go Adds Source.IsWritable() helper for consistent source classification.
extractors/extractors_test.go Adds unit tests for Source.IsWritable().
docs/middleware/session.md Documents new trust/validator options and security implications; updates config properties table.

Comment thread middleware/session/store.go
Comment thread docs/middleware/session.md Outdated
Comment thread middleware/session/config.go Outdated
@ReneWerner87
ReneWerner87 requested review from gaby and sixcolors and removed request for ReneWerner87 May 5, 2026 07:55
@sixcolors

sixcolors commented May 6, 2026

Copy link
Copy Markdown
Member

Thanks for working on this. Appreciate the redesign effort to make this safe-by-default, but I still don't think client-supplied session IDs belong in session middleware regardless of gating.

Session IDs should be server-issued and opaque. OWASP is clear that they should not be user-controllable, since they effectively become credentials. Allowing client-supplied IDs, even behind a flag and callback, turns them into user-influenced lookup keys and weakens the trust boundary.

The earlier fix (GHSA-98j2-3j3p-fw2v) treated unknown client IDs as untrusted. This weakens that protection. The callback pushes responsibility to user code with framework blessing.

This would also be an outlier. Express.js, Django, Rails, ASP.NET Core, and Spring all keep session IDs server-generated via cookies or headers. None support client-generated IDs through extractors.

Adding IsWritable() to the shared extractors package affects the whole middleware ecosystem (CSRF, JWT, etc.). Session policy should stay local, not push new security semantics into cross-cutting packages.

If someone needs to key off an external token, that's an app/auth concern, not session middleware. It can already be handled without framework changes:

	 app.Use(func(c fiber.Ctx) error {
		// Check for a session
		handler := session.FromContext(c)
		if handler == nil {
			return c.SendStatus(fiber.StatusInternalServerError)
		}

		if v, ok := handler.Get("authorized").(bool); !ok || !v {
			// Return a 401 Unauthorized with session info for debugging
			return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
				"authorized":       false,
				"session_id":      handler.ID(),
				"session_timeout": sessionTimeout.Seconds(),
			})
			// Or a redirected to the /init route to initialize the session
		}

		// Continue to the next handler
		return c.Next()
	})

	app.Get("/init", func(c fiber.Ctx) error {
		handler := session.FromContext(c)
		if handler == nil {
			return c.SendStatus(fiber.StatusInternalServerError)
		}

		if !validateAPIToken(c.Query("api_token")) {
			return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
				"error":           "Invalid API token",
				"session_id":      handler.ID(),
				"session_timeout": sessionTimeout.Seconds(),
			})
		}

		// Regenerate session ID to prevent session fixation attacks
		 if err := handler.Regenerate(); err != nil {
			 return c.SendStatus(fiber.StatusInternalServerError)
		}

		handler.Set("authorized", true)
		handler.Set("user_id", lookupUserID(c.Query("api_token")))

		return c.JSON(fiber.Map{
			"session_id":      handler.ID(),
			"session_timeout": sessionTimeout.Seconds(),
		})
	})

I'd recommend keeping the current behavior.

@github-project-automation github-project-automation Bot moved this to Done in v3 May 7, 2026
@ReneWerner87 ReneWerner87 modified the milestones: v3, v3.3.0 May 22, 2026
@ReneWerner87
ReneWerner87 deleted the copilot/fix-query-extractor-failure branch June 4, 2026 09:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

πŸ› [Bug]: Query Extractor Failing

5 participants