From 0acaeaec1612185c706fb0c522ba023a4c8f73a5 Mon Sep 17 00:00:00 2001 From: Belal Taher Date: Sat, 27 Jun 2026 23:46:22 -0400 Subject: [PATCH] Forward internalCorrelationIds through session create/resume Add an internal `internalCorrelationIds` field to `SessionConfigBase` and forward it in the `session.create` and `session.resume` payloads, mirroring the existing `expAssignments` passthrough. The field is tagged `@internal` so it is stripped from the published type declarations. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- nodejs/src/client.ts | 2 ++ nodejs/src/types.ts | 3 ++ nodejs/test/client.test.ts | 64 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/nodejs/src/client.ts b/nodejs/src/client.ts index 53686a6ca..73e8476c1 100644 --- a/nodejs/src/client.ts +++ b/nodejs/src/client.ts @@ -1448,6 +1448,7 @@ export class CopilotClient { remoteSession: config.remoteSession, cloud: config.cloud, expAssignments: config.expAssignments, + internalCorrelationIds: config.internalCorrelationIds, }); const { @@ -1646,6 +1647,7 @@ export class CopilotClient { remoteSession: config.remoteSession, openCanvases: config.openCanvases, expAssignments: config.expAssignments, + internalCorrelationIds: config.internalCorrelationIds, }); const { workspacePath, capabilities, openCanvases } = response as { diff --git a/nodejs/src/types.ts b/nodejs/src/types.ts index e354bd821..3e753d924 100644 --- a/nodejs/src/types.ts +++ b/nodejs/src/types.ts @@ -2165,6 +2165,9 @@ export interface SessionConfigBase { * @internal */ expAssignments?: Record; + + /** @internal */ + internalCorrelationIds?: Record; } /** diff --git a/nodejs/test/client.test.ts b/nodejs/test/client.test.ts index 96d7da30c..ecd6792d0 100644 --- a/nodejs/test/client.test.ts +++ b/nodejs/test/client.test.ts @@ -251,6 +251,70 @@ describe("CopilotClient", () => { expect(resumePayload.expAssignments).toBeUndefined(); }); + it("forwards internalCorrelationIds in session.create and session.resume", async () => { + const client = new CopilotClient(); + await client.start(); + onTestFinished(() => client.forceStop()); + + const spy = vi + .spyOn((client as any).connection!, "sendRequest") + .mockImplementation(async (method: string, params: any) => { + if (method === "session.create") return { sessionId: params.sessionId }; + if (method === "session.resume") return { sessionId: params.sessionId }; + throw new Error(`Unexpected method: ${method}`); + }); + + const correlationIds = { + cca_job_id: "job-123", + owner_id: "1", + repo_id: "2", + }; + + const session = await client.createSession({ + onPermissionRequest: approveAll, + internalCorrelationIds: correlationIds, + }); + await client.resumeSession(session.sessionId, { + onPermissionRequest: approveAll, + internalCorrelationIds: correlationIds, + }); + + const createPayload = spy.mock.calls.find( + ([method]) => method === "session.create" + )![1] as any; + const resumePayload = spy.mock.calls.find( + ([method]) => method === "session.resume" + )![1] as any; + expect(createPayload.internalCorrelationIds).toEqual(correlationIds); + expect(resumePayload.internalCorrelationIds).toEqual(correlationIds); + }); + + it("omits internalCorrelationIds from session.create and session.resume when unset", async () => { + const client = new CopilotClient(); + await client.start(); + onTestFinished(() => client.forceStop()); + + const spy = vi + .spyOn((client as any).connection!, "sendRequest") + .mockImplementation(async (method: string, params: any) => { + if (method === "session.create") return { sessionId: params.sessionId }; + if (method === "session.resume") return { sessionId: params.sessionId }; + throw new Error(`Unexpected method: ${method}`); + }); + + const session = await client.createSession({ onPermissionRequest: approveAll }); + await client.resumeSession(session.sessionId, { onPermissionRequest: approveAll }); + + const createPayload = spy.mock.calls.find( + ([method]) => method === "session.create" + )![1] as any; + const resumePayload = spy.mock.calls.find( + ([method]) => method === "session.resume" + )![1] as any; + expect(createPayload.internalCorrelationIds).toBeUndefined(); + expect(resumePayload.internalCorrelationIds).toBeUndefined(); + }); + it("forwards capi options in session.create and session.resume", async () => { const client = new CopilotClient(); await client.start();