Skip to content

feat: enable CDN cache for all sales channels#1562

Merged
igoramf merged 7 commits intomainfrom
feat/enable-segment-cache
Apr 1, 2026
Merged

feat: enable CDN cache for all sales channels#1562
igoramf merged 7 commits intomainfrom
feat/enable-segment-cache

Conversation

@igoramf
Copy link
Copy Markdown
Contributor

@igoramf igoramf commented Mar 25, 2026

Summary

  • Remove isDefautSalesChannel restriction from isCacheableSegment, enabling CDN cache for non-default sales channels (previously only the default channel was cacheable)
  • Expand isCacheableSegment inline instead of delegating to isAnonymous, keeping campaigns/priceTables/regionId as the only blockers
  • Remove unused PAGE_CACHE_ALLOWED_KEY import from VTEX middleware (no consumer in deco runtime)

Test plan

  • Verify pages with non-default sales channel (?sc=X) get Cache-Control: public headers
  • Verify pages with channelPrivacy=private still get no-store headers
  • Verify logged-in users still get no-store headers
  • Verify pages with active campaigns/priceTables/regionId still get no-store headers

🤖 Generated with Claude Code


Summary by cubic

Enable CDN caching for all sales channels using cookie-based vary. Removed the default-channel restriction and UTM checks; always set VTEXSC and vtex_segment so Cloudflare serves the right cache per channel.

  • New Features

    • Pages cache unless campaigns, price tables, or region exist; channels only skip cache when channelPrivacy is "private".
    • Always persist VTEXSC (when ?sc=) and update vtex_segment; removed PAGE_CACHE_ALLOWED_KEY and its import from @deco/deco/blocks.
  • Refactors

    • Replaced @deco/deco RequestInit with local DecoRequestInit in HTTP utils.

Written for commit 3fdf7ae. Summary will update on new commits.

Summary by CodeRabbit

  • Refactor
    • Streamlined cache/middleware behavior and made cache-control decisions consistent for cached vs non-cached responses.
  • Bug Fixes / Behavior Changes
    • Cookie handling adjusted: sales-channel cookie is now persisted whenever present; segment cookie is updated when its token changes. Cookie setting is no longer suppressed based on cacheability.

@github-actions
Copy link
Copy Markdown
Contributor

Tagging Options

Should a new tag be published when this PR is merged?

  • 👍 for Patch 0.142.2 update
  • 🎉 for Minor 0.143.0 update
  • 🚀 for Major 1.0.0 update

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

1 issue found across 2 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="vtex/utils/segment.ts">

<violation number="1" location="vtex/utils/segment.ts:89">
P1: Removing `channel` from `isCacheableSegment` also disables `VTEXSC` cookie persistence for `?sc` requests, which can break sales-channel continuity across page navigation.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread vtex/utils/segment.ts Outdated
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 25, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Removed middleware write of PAGE_CACHE_ALLOWED_KEY; middleware still computes cacheable, marks PAGE_DIRTY_KEY and sets Cache-Control: no-store, no-cache, must-revalidate when not cacheable, then continues. Segment cacheability predicates were simplified and cookie-setting now updates VTEXSC and vtex_segment more eagerly based on channel/token differences.

Changes

Cohort / File(s) Summary
Middleware
vtex/middleware.ts
Removed logic that set PAGE_CACHE_ALLOWED_KEY in ctx.bag and removed its import. Middleware still computes cacheable, marks PAGE_DIRTY_KEY, applies Cache-Control: no-store, no-cache, must-revalidate when !cacheable, and calls ctx.next!().
Segment logic & cookies
vtex/utils/segment.ts
Simplified isCacheableSegment predicates: no branching on removeUTMFromCacheKey, no isAnonymous check, and cacheable if no payload or if payload lacks campaigns, priceTables, and regionId (still false for channelPrivacy === "private"). setSegmentBag no longer gates cookie writes on cacheability: VTEXSC is set whenever segmentFromRequest.channel exists; vtex_segment is updated whenever the serialized token differs from incoming cookie token.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant Middleware
    participant SegmentUtil
    participant CDN_Browser

    Client->>Middleware: Incoming HTTP request
    Middleware->>SegmentUtil: evaluate segment (isCacheableSegment, token, segmentFromRequest)
    SegmentUtil-->>Middleware: { cacheable, token, segmentFromRequest.channel? }
    alt cacheable == false
        Middleware->>CDN_Browser: set Cache-Control: no-store, no-cache, must-revalidate
        Middleware->>Middleware: mark PAGE_DIRTY_KEY
    else cacheable == true
        Middleware->>CDN_Browser: no-store header omitted (allow caching)
    end
    alt segmentFromRequest.channel exists
        Middleware->>CDN_Browser: Set `VTEXSC` cookie
    end
    alt token differs from incoming cookie
        Middleware->>CDN_Browser: Set `vtex_segment` cookie
    end
    Middleware->>Client: continue via ctx.next!()
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • guitavano

Poem

🐰
I hopped through keys and nibbled noisy UTMs,
Left some cookies, changed a few crumbs,
No longer marking that hidden key,
I bounded light — quick, small, and free,
A rabbit patch to tidy outcomes!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The PR description mixes auto-generated content and lacks clear structure; unclear which information is author-provided versus tool-generated, and the description template sections are missing. Restructure the description to follow the template: add 'What is this Contribution About' section, include 'Issue Link' with relevant issue number, and add 'Loom Video' and 'Demonstration Link' sections for better review context.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely summarizes the main objective of the PR: enabling CDN cache for all sales channels by removing default-channel restrictions.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/enable-segment-cache

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.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@vtex/utils/segment.ts`:
- Around line 74-94: The code uses isCacheableSegment(...) to decide both
cacheability and whether to write VTEXSC/vtex_segment in setSegmentBag(...),
causing sales-channel (?sc) to be omitted when channel no longer makes a segment
non-cacheable; split persistence from cacheability by adding a separate
predicate (e.g., shouldPersistSegment or shouldPersistChannel) and update
setSegmentBag(...) to write the VTEXSC/vtex_segment cookie when the new
persistence predicate indicates the sales-channel (channel/SC) must be stored,
while leaving isCacheableSegment(...) unchanged for cache-control decisions;
modify setSegmentBag(...) to call the new predicate for persistence and keep
existing cache logic using isCacheableSegment(...).
- Around line 74-94: isCacheableSegment currently can return true for
non-default channels when channelPrivacy is unknown, allowing a private sales
channel to be cached on first hit; update isCacheableSegment to treat any
non-default channel as uncacheable until privacy is resolved (i.e., if
payload.channel exists and payload.channel !== 'default' and
payload.channelPrivacy is null/undefined then return false), and ensure this
check applies in both the removeUTMFromCacheKey branch and the default branch so
setSegmentBag/buildSegmentFromRequest cannot cache partial segment payloads
before channelPrivacy is known.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 87f85f10-7300-4920-b070-98ad6005e342

📥 Commits

Reviewing files that changed from the base of the PR and between 0b95d39 and d62f9bc.

📒 Files selected for processing (2)
  • vtex/middleware.ts
  • vtex/utils/segment.ts

Comment thread vtex/utils/segment.ts Outdated
- Remove isDefautSalesChannel restriction from isCacheableSegment so
  non-default channels are cacheable (CDN varies by vtex_segment/VTEXSC)
- Always persist VTEXSC cookie for ?sc=X requests regardless of
  cacheability, ensuring sales channel continuity across navigation
- Remove unused PAGE_CACHE_ALLOWED_KEY import from vtex middleware

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
vtex/utils/segment.ts (1)

64-68: ⚠️ Potential issue | 🟡 Minor

Stale docstring: code no longer delegates to isAnonymous.

The comment states "By default, uses isAnonymous" but the implementation now inlines the check and omits the channel condition. Update the comment to reflect the current behavior.

📝 Suggested docstring update
 /**
  * Checks if the segment is cacheable for CDN purposes.
- * By default, uses isAnonymous (UTMs affect cacheability because prices
- * can vary by utm_source). With removeUTMFromCacheKey, UTMs are ignored
- * (opt-in for stores that don't vary prices by UTM).
+ * Caching is allowed when the segment has no campaigns, priceTables, or regionId,
+ * and channelPrivacy is not "private". With removeUTMFromCacheKey disabled (default),
+ * UTM parameters also block caching (since prices can vary by utm_source).
  */
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@vtex/utils/segment.ts` around lines 64 - 68, Update the stale docstring for
the cacheability check in vtex/utils/segment.ts: remove the claim that the code
"uses isAnonymous" and instead describe the current inlined behavior (the
function now directly examines the visitor/session anonymity and no longer
applies any channel condition), and keep the note about removeUTMFromCacheKey
opting out of UTM-based variability; reference the existing symbol names
isAnonymous and removeUTMFromCacheKey in the comment to make the change clear.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@vtex/utils/segment.ts`:
- Around line 64-68: Update the stale docstring for the cacheability check in
vtex/utils/segment.ts: remove the claim that the code "uses isAnonymous" and
instead describe the current inlined behavior (the function now directly
examines the visitor/session anonymity and no longer applies any channel
condition), and keep the note about removeUTMFromCacheKey opting out of
UTM-based variability; reference the existing symbol names isAnonymous and
removeUTMFromCacheKey in the comment to make the change clear.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4960d54f-42ce-426a-95b5-5e7b6f772b4d

📥 Commits

Reviewing files that changed from the base of the PR and between d62f9bc and 05bd523.

📒 Files selected for processing (1)
  • vtex/utils/segment.ts

Copy link
Copy Markdown

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

1 issue found across 1 file (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="vtex/utils/segment.ts">

<violation number="1" location="vtex/utils/segment.ts:275">
P2: Setting VTEXSC unconditionally will still attach Set-Cookie on otherwise cacheable responses, which can prevent CDN caching. Guard this cookie with `isCacheableSegment(ctx)` (or move it into the existing cacheability block) so cacheable responses stay cookie-free.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread vtex/utils/segment.ts Outdated
igoramf added 2 commits March 26, 2026 12:14
…s unknown

Non-default sales channels are only cacheable when channelPrivacy is explicitly
"public". If channelPrivacy is null/undefined (e.g. cold request), skip CDN
cache to avoid serving a private channel response on first hit.
Cloudflare does not cache responses with Set-Cookie headers. Guard both
VTEXSC and vtex_segment cookies inside the !isCacheableSegment block so
cacheable responses stay cookie-free and the CDN can cache them.

Navigation continuity is preserved: the first cold request for a non-default
channel is always non-cacheable (channelPrivacy unknown), so cookies are
set there and carried by the browser on subsequent requests.
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

♻️ Duplicate comments (2)
vtex/utils/segment.ts (2)

287-307: ⚠️ Potential issue | 🟠 Major

Base cookie persistence on the final no-store decision.

vtex/middleware.ts still marks authenticated requests as no-store with isCacheableSegment(ctx) && !isLoggedIn. This branch only checks the segment predicate, so a logged-in ?sc= request on a public channel still skips VTEXSC / vtex_segment, which drops the selected channel on the next request unless the URL keeps sc.

💡 Pass the authenticated no-store signal into `setSegmentBag()`
-export const setSegmentBag = (
+export const setSegmentBag = (
   cookies: Record<string, string>,
   req: Request,
   ctx: AppContext,
+  persistCookies = false,
 ) => {
   ...
-  if (!isCacheableSegment(ctx)) {
+  if (persistCookies || !isCacheableSegment(ctx)) {
-  if (!segment) {
-    setSegmentBag(cookies, req, ctx);
-  }
-
   const isLoggedIn = Boolean(
     cookies[VTEX_ID_CLIENT_COOKIE] ||
       cookies[`${VTEX_ID_CLIENT_COOKIE}_${ctx.account}`],
   );
+
+  if (!segment) {
+    setSegmentBag(cookies, req, ctx, isLoggedIn);
+  }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@vtex/utils/segment.ts` around lines 287 - 307, The cookie persistence logic
in setSegmentBag currently uses isCacheableSegment(ctx) alone and can drop
VTEXSC/vtex_segment for authenticated requests that are later marked no-store;
instead, change setSegmentBag to accept the final "no-store" decision (or a
boolean like shouldNoStore/isAuthenticatedNoStore) from vtex/middleware.ts and
base the cookie branch on that value rather than calling isCacheableSegment(ctx)
directly. Concretely: update the setSegmentBag signature to accept a noStore
flag, pass the computed no-store value from vtex/middleware.ts into
setSegmentBag, and replace the if (!isCacheableSegment(ctx)) checks with if
(!noStore) (or the inverse logic you choose) while keeping references to
setCookie, SALES_CHANNEL_COOKIE, and SEGMENT_COOKIE_NAME unchanged.

74-84: ⚠️ Potential issue | 🔴 Critical

Clear inherited channelPrivacy when ?sc switches channels.

This branch now treats "public" as sufficient to cache a non-default channel, but setSegmentBag() only overrides channel; it keeps channelPrivacy from ctx.defaultSegment / vtex_segment. A shopper moving from a public channel to ?sc=2 can therefore reuse the old "public" flag and make the first response for channel 2 cacheable again.

💡 One safe way to drop stale privacy on channel switches
   const segmentFromRequest = buildSegmentFromRequest(req);
+  const baseSegment = {
+    channel: ctx.salesChannel,
+    ...DEFAULT_SEGMENT,
+    ...ctx.defaultSegment,
+    ...segmentFromCookie,
+    ...segmentFromSalesChannelCookie,
+  };

   const locale = {
     ...(ctx.defaultSegment?.countryCode && {
       countryCode: ctx.defaultSegment.countryCode,
     }),
     ...(ctx.defaultSegment?.cultureInfo && {
       cultureInfo: ctx.defaultSegment.cultureInfo,
     }),
   };

   const segment = {
-    channel: ctx.salesChannel,
-    ...DEFAULT_SEGMENT,
-    ...ctx.defaultSegment,
-    ...segmentFromCookie,
-    ...segmentFromSalesChannelCookie,
+    ...baseSegment,
+    ...(segmentFromRequest.channel &&
+        segmentFromRequest.channel !== baseSegment.channel
+      ? { channelPrivacy: undefined }
+      : {}),
     ...segmentFromRequest,
     ...locale,
   };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@vtex/utils/segment.ts` around lines 74 - 84, When a shopper switches channels
(payload.channel set via setSegmentBag/?sc) we must not inherit a stale
channelPrivacy; update the logic that handles segment updates so that when
payload.channel is present and differs from the active/default sales channel you
clear/reset channelPrivacy (e.g., delete payload.channelPrivacy or set it to
undefined) before caching checks. Concretely, in the code paths around
setSegmentBag and where you evaluate payload.channel and
isDefautSalesChannel(ctx, channel), ensure you explicitly remove or reset
payload.channelPrivacy so a previous "public" value cannot be reused for the new
channel.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@vtex/utils/segment.ts`:
- Around line 287-307: The cookie persistence logic in setSegmentBag currently
uses isCacheableSegment(ctx) alone and can drop VTEXSC/vtex_segment for
authenticated requests that are later marked no-store; instead, change
setSegmentBag to accept the final "no-store" decision (or a boolean like
shouldNoStore/isAuthenticatedNoStore) from vtex/middleware.ts and base the
cookie branch on that value rather than calling isCacheableSegment(ctx)
directly. Concretely: update the setSegmentBag signature to accept a noStore
flag, pass the computed no-store value from vtex/middleware.ts into
setSegmentBag, and replace the if (!isCacheableSegment(ctx)) checks with if
(!noStore) (or the inverse logic you choose) while keeping references to
setCookie, SALES_CHANNEL_COOKIE, and SEGMENT_COOKIE_NAME unchanged.
- Around line 74-84: When a shopper switches channels (payload.channel set via
setSegmentBag/?sc) we must not inherit a stale channelPrivacy; update the logic
that handles segment updates so that when payload.channel is present and differs
from the active/default sales channel you clear/reset channelPrivacy (e.g.,
delete payload.channelPrivacy or set it to undefined) before caching checks.
Concretely, in the code paths around setSegmentBag and where you evaluate
payload.channel and isDefautSalesChannel(ctx, channel), ensure you explicitly
remove or reset payload.channelPrivacy so a previous "public" value cannot be
reused for the new channel.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: b039b2f7-0e22-47fe-9de4-3b24098bcbb2

📥 Commits

Reviewing files that changed from the base of the PR and between 05bd523 and 9006daa.

📒 Files selected for processing (1)
  • vtex/utils/segment.ts

igoramf added 2 commits March 26, 2026 12:46
Remove channel restriction from isCacheableSegment — all non-private
channels are now cacheable. Always set vtex_segment and VTEXSC on every
response so the CDN (Cloudflare) can vary its cache key by them and serve
the correct bucket per sales channel.

Requires deco-cx/deco#XXXX (allowlist vtex_segment/VTEXSC in middleware).
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
vtex/utils/segment.ts (1)

64-70: ⚠️ Potential issue | 🔴 Critical

Require explicit public privacy before caching non-default channels.

A cold ?sc=<non-default> request only has payload.channel at this point. Until channelPrivacy is resolved, this helper returns true, so vtex/middleware.ts leaves the response public. That makes the first hit of a private sales channel eligible for CDN storage.

🔒 Suggested guard
 export const isCacheableSegment = (ctx: AppContext) => {
   const payload = getSegmentFromBag(ctx)?.payload;
-  if (payload?.channelPrivacy === "private") return false;
-
   if (!payload) return true;
-  const { campaigns, priceTables, regionId } = payload;
+  const { channel, channelPrivacy, campaigns, priceTables, regionId } = payload;
+  const defaultChannel = ctx.salesChannel ??
+    ctx.defaultSegment?.channel ??
+    DEFAULT_SEGMENT.channel;
+  if (channel && channel !== defaultChannel && channelPrivacy !== "public") {
+    return false;
+  }
   return !campaigns && !priceTables && !regionId;
 };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@vtex/utils/segment.ts` around lines 64 - 70, isCacheableSegment currently
treats segments with an unresolved channelPrivacy as cacheable (returning true),
which allows a private channel to be served publicly; update isCacheableSegment
(and the payload checks after getSegmentFromBag) so that if payload.channel is
present you only allow caching when payload.channelPrivacy === "public"
(otherwise return false), while keeping the existing fallback logic for
default/no-channel segments and the existing checks for campaigns, priceTables,
and regionId.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@vtex/utils/segment.ts`:
- Around line 263-273: The code currently sets vtex_segment based on the full
serialized token (token) which includes utm/utmi fields and thus fragments the
CDN cache; update the logic in the block that checks vtex_segment !== token to
instead compute a UTM-stripped representation (e.g., call or implement
getSegmentCacheKeyWithoutUTM(token) or use serialize() variant that excludes
utm_*/utmi_*), compare the existing cookie value against that UTM-less cache
key, and write that UTM-less key to the cookie (still using SEGMENT_COOKIE_NAME,
path "/", secure and httpOnly) so marketing params no longer cause edge cache
fragmentation; ensure references to serialize() and isCacheableSegment() are
preserved where needed and only the value written/compared is the non-UTM
segment cache key.

---

Duplicate comments:
In `@vtex/utils/segment.ts`:
- Around line 64-70: isCacheableSegment currently treats segments with an
unresolved channelPrivacy as cacheable (returning true), which allows a private
channel to be served publicly; update isCacheableSegment (and the payload checks
after getSegmentFromBag) so that if payload.channel is present you only allow
caching when payload.channelPrivacy === "public" (otherwise return false), while
keeping the existing fallback logic for default/no-channel segments and the
existing checks for campaigns, priceTables, and regionId.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 727dd0fc-383f-4fd0-a0f2-2d93131eaac7

📥 Commits

Reviewing files that changed from the base of the PR and between 047de9a and 477e611.

📒 Files selected for processing (1)
  • vtex/utils/segment.ts

Comment thread vtex/utils/segment.ts
…uestInit

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
@igoramf igoramf merged commit f7fd981 into main Apr 1, 2026
3 checks passed
@igoramf igoramf deleted the feat/enable-segment-cache branch April 1, 2026 17:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants