From f46fa72a9285a0e8479e25d400f7026bfd8fe5c8 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Wed, 30 Sep 2026 15:14:20 -0500 Subject: [PATCH] fix(core): add namespaced session identity headers (#52368) --- packages/core/src/session/model-request.ts | 2 ++ packages/core/test/session-compaction.test.ts | 2 ++ packages/core/test/session-runner.test.ts | 3 +++ packages/core/test/session-title.test.ts | 1 + 4 files changed, 8 insertions(+) diff --git a/packages/core/src/session/model-request.ts b/packages/core/src/session/model-request.ts index 90071ceecb6..26cecde25d0 100644 --- a/packages/core/src/session/model-request.ts +++ b/packages/core/src/session/model-request.ts @@ -276,6 +276,8 @@ export const layer = Layer.effect( model: model.model, http: { headers: { + "x-opencode-session-id": session.id, + ...(session.parentID ? { "x-opencode-parent-session-id": session.parentID } : {}), "x-session-affinity": affinity, "X-Session-Id": affinity, ...(session.parentID ? { "x-parent-session-id": session.parentID } : {}), diff --git a/packages/core/test/session-compaction.test.ts b/packages/core/test/session-compaction.test.ts index dab84f42c62..329b891d2e6 100644 --- a/packages/core/test/session-compaction.test.ts +++ b/packages/core/test/session-compaction.test.ts @@ -445,6 +445,8 @@ it.effect("manual compaction summarizes short context instead of no-op", () => expect(requests).toHaveLength(1) expect(requests[0]?.promptCacheKey).toBe(parentID) expect(requests[0]?.http?.headers).toEqual({ + "x-opencode-session-id": session.id, + "x-opencode-parent-session-id": parentID, "x-session-affinity": parentID, "X-Session-Id": parentID, "x-parent-session-id": parentID, diff --git a/packages/core/test/session-runner.test.ts b/packages/core/test/session-runner.test.ts index 5023d5c397e..ce6058c3720 100644 --- a/packages/core/test/session-runner.test.ts +++ b/packages/core/test/session-runner.test.ts @@ -4682,6 +4682,7 @@ describe("SessionRunnerLLM", () => { yield* s.runPrompt("Run correlated request") expect(s.requests[0]?.http?.headers).toEqual({ + "x-opencode-session-id": sessionID, "x-session-affinity": sessionID, "X-Session-Id": sessionID, "User-Agent": App.useragent(App.make()), @@ -4703,6 +4704,8 @@ describe("SessionRunnerLLM", () => { yield* s.runPrompt("Run child request") expect(s.requests[0]?.http?.headers).toMatchObject({ + "x-opencode-session-id": sessionID, + "x-opencode-parent-session-id": parentID, "x-session-affinity": parentID, "X-Session-Id": parentID, "x-parent-session-id": parentID, diff --git a/packages/core/test/session-title.test.ts b/packages/core/test/session-title.test.ts index 7775cfee886..82a1f4ee73a 100644 --- a/packages/core/test/session-title.test.ts +++ b/packages/core/test/session-title.test.ts @@ -211,6 +211,7 @@ it.effect("generates a title from the sole user message and renames the session" expect(requests).toHaveLength(1) expect(requests[0]?.http?.headers).toEqual({ + "x-opencode-session-id": sessionID, "x-session-affinity": sessionID, "X-Session-Id": sessionID, "User-Agent": App.useragent(App.make()),