From d5772286544b1c627a2861f271a8633cddf7bd97 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:33:38 +0000 Subject: [PATCH 1/6] Initial plan From 848982c2be173599de0701d76a4a75e018bd22c7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:41:48 +0000 Subject: [PATCH 2/6] fix: add BYOK provider support to copilot sample node driver Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../copilot_sdk_driver_sample_node.cjs | 35 ++++++++++++++----- .../copilot_sdk_driver_sample_node.test.cjs | 20 +++++++++++ 2 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 actions/setup/js/copilot_sdk_driver_sample_node.test.cjs diff --git a/.github/drivers/copilot_sdk_driver_sample_node.cjs b/.github/drivers/copilot_sdk_driver_sample_node.cjs index d3da3f581aa..bf26c3ba2b4 100644 --- a/.github/drivers/copilot_sdk_driver_sample_node.cjs +++ b/.github/drivers/copilot_sdk_driver_sample_node.cjs @@ -2,7 +2,6 @@ "use strict"; const fs = require("node:fs"); -const { CopilotClient, RuntimeConnection, approveAll } = require("@github/copilot-sdk"); function readRequiredEnv(name) { const value = process.env[name]; @@ -26,7 +25,22 @@ function extractAssistantContent(message) { return ""; } +function buildSessionConfig(model, onPermissionRequest) { + const config = { + onPermissionRequest, + model, + }; + + const providerBaseUrl = process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; + if (providerBaseUrl) { + config.provider = { type: "openai", baseUrl: providerBaseUrl }; + } + + return config; +} + async function main() { + const { CopilotClient, RuntimeConnection, approveAll } = require("@github/copilot-sdk"); const promptPath = readRequiredEnv("GH_AW_PROMPT"); const sdkUri = readRequiredEnv("COPILOT_SDK_URI"); const connectionToken = readRequiredEnv("COPILOT_CONNECTION_TOKEN"); @@ -41,10 +55,7 @@ async function main() { let session; await client.start(); try { - session = await client.createSession({ - onPermissionRequest: approveAll, - model, - }); + session = await client.createSession(buildSessionConfig(model, approveAll)); const response = await session.sendAndWait({ prompt }); const content = extractAssistantContent(response); if (content) { @@ -58,7 +69,13 @@ async function main() { } } -main().catch(error => { - process.stderr.write(`[copilot-sdk-driver-sample-node] ${error instanceof Error ? error.message : String(error)}\n`); - process.exit(1); -}); +if (require.main === module) { + main().catch(error => { + process.stderr.write(`[copilot-sdk-driver-sample-node] ${error instanceof Error ? error.message : String(error)}\n`); + process.exit(1); + }); +} + +module.exports = { + buildSessionConfig, +}; diff --git a/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs b/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs new file mode 100644 index 00000000000..26cc29e6a75 --- /dev/null +++ b/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs @@ -0,0 +1,20 @@ +import { describe, it, expect } from "vitest"; +import { createRequire } from "module"; + +const require = createRequire(import.meta.url); +const { buildSessionConfig } = require("../../../.github/drivers/copilot_sdk_driver_sample_node.cjs"); + +describe("copilot_sdk_driver_sample_node", () => { + it("includes provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is set", () => { + process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL = "http://api-proxy:10002"; + const config = buildSessionConfig("claude-sonnet-4.6", () => {}); + expect(config.provider).toEqual({ type: "openai", baseUrl: "http://api-proxy:10002" }); + delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; + }); + + it("omits provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is unset", () => { + delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; + const config = buildSessionConfig("claude-sonnet-4.6", () => {}); + expect(config.provider).toBeUndefined(); + }); +}); From 74efa1a470d44ce9d0cade06fc2f1e7943390ce8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:42:22 +0000 Subject: [PATCH 3/6] test: clarify sample driver fixture model name Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/copilot_sdk_driver_sample_node.test.cjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs b/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs index 26cc29e6a75..3eeb89f93e6 100644 --- a/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs +++ b/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs @@ -7,14 +7,14 @@ const { buildSessionConfig } = require("../../../.github/drivers/copilot_sdk_dri describe("copilot_sdk_driver_sample_node", () => { it("includes provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is set", () => { process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL = "http://api-proxy:10002"; - const config = buildSessionConfig("claude-sonnet-4.6", () => {}); + const config = buildSessionConfig("test-model", () => {}); expect(config.provider).toEqual({ type: "openai", baseUrl: "http://api-proxy:10002" }); delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; }); it("omits provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is unset", () => { delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; - const config = buildSessionConfig("claude-sonnet-4.6", () => {}); + const config = buildSessionConfig("test-model", () => {}); expect(config.provider).toBeUndefined(); }); }); From 7cf449a11194ecb357502d5cb74d558db1b7d527 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:42:59 +0000 Subject: [PATCH 4/6] refactor: tighten sample driver config tests and cleanup import Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .github/drivers/copilot_sdk_driver_sample_node.cjs | 2 +- .../setup/js/copilot_sdk_driver_sample_node.test.cjs | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/drivers/copilot_sdk_driver_sample_node.cjs b/.github/drivers/copilot_sdk_driver_sample_node.cjs index bf26c3ba2b4..0d9d6ca4b5d 100644 --- a/.github/drivers/copilot_sdk_driver_sample_node.cjs +++ b/.github/drivers/copilot_sdk_driver_sample_node.cjs @@ -40,7 +40,7 @@ function buildSessionConfig(model, onPermissionRequest) { } async function main() { - const { CopilotClient, RuntimeConnection, approveAll } = require("@github/copilot-sdk"); + const { CopilotClient, approveAll } = require("@github/copilot-sdk"); const promptPath = readRequiredEnv("GH_AW_PROMPT"); const sdkUri = readRequiredEnv("COPILOT_SDK_URI"); const connectionToken = readRequiredEnv("COPILOT_CONNECTION_TOKEN"); diff --git a/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs b/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs index 3eeb89f93e6..447c6666ac5 100644 --- a/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs +++ b/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs @@ -7,14 +7,20 @@ const { buildSessionConfig } = require("../../../.github/drivers/copilot_sdk_dri describe("copilot_sdk_driver_sample_node", () => { it("includes provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is set", () => { process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL = "http://api-proxy:10002"; - const config = buildSessionConfig("test-model", () => {}); + const onPermissionRequest = () => {}; + const config = buildSessionConfig("test-model", onPermissionRequest); expect(config.provider).toEqual({ type: "openai", baseUrl: "http://api-proxy:10002" }); + expect(config.model).toBe("test-model"); + expect(config.onPermissionRequest).toBe(onPermissionRequest); delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; }); it("omits provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is unset", () => { delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; - const config = buildSessionConfig("test-model", () => {}); + const onPermissionRequest = () => {}; + const config = buildSessionConfig("test-model", onPermissionRequest); expect(config.provider).toBeUndefined(); + expect(config.model).toBe("test-model"); + expect(config.onPermissionRequest).toBe(onPermissionRequest); }); }); From 0a3085ddeb77aa2096dad95972ad1d17d87327d4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:43:32 +0000 Subject: [PATCH 5/6] test: isolate sample driver env cleanup between tests Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- actions/setup/js/copilot_sdk_driver_sample_node.test.cjs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs b/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs index 447c6666ac5..dec09a145d3 100644 --- a/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs +++ b/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs @@ -1,9 +1,13 @@ -import { describe, it, expect } from "vitest"; +import { describe, it, expect, afterEach } from "vitest"; import { createRequire } from "module"; const require = createRequire(import.meta.url); const { buildSessionConfig } = require("../../../.github/drivers/copilot_sdk_driver_sample_node.cjs"); +afterEach(() => { + delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; +}); + describe("copilot_sdk_driver_sample_node", () => { it("includes provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is set", () => { process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL = "http://api-proxy:10002"; @@ -12,7 +16,6 @@ describe("copilot_sdk_driver_sample_node", () => { expect(config.provider).toEqual({ type: "openai", baseUrl: "http://api-proxy:10002" }); expect(config.model).toBe("test-model"); expect(config.onPermissionRequest).toBe(onPermissionRequest); - delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; }); it("omits provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is unset", () => { From 573e0b74d1c7b95d19dadf025aac169a3c5547dc Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 7 Jun 2026 00:57:24 +0000 Subject: [PATCH 6/6] chore: remove sample driver unit test per PR feedback Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../copilot_sdk_driver_sample_node.test.cjs | 29 ------------------- 1 file changed, 29 deletions(-) delete mode 100644 actions/setup/js/copilot_sdk_driver_sample_node.test.cjs diff --git a/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs b/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs deleted file mode 100644 index dec09a145d3..00000000000 --- a/actions/setup/js/copilot_sdk_driver_sample_node.test.cjs +++ /dev/null @@ -1,29 +0,0 @@ -import { describe, it, expect, afterEach } from "vitest"; -import { createRequire } from "module"; - -const require = createRequire(import.meta.url); -const { buildSessionConfig } = require("../../../.github/drivers/copilot_sdk_driver_sample_node.cjs"); - -afterEach(() => { - delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; -}); - -describe("copilot_sdk_driver_sample_node", () => { - it("includes provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is set", () => { - process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL = "http://api-proxy:10002"; - const onPermissionRequest = () => {}; - const config = buildSessionConfig("test-model", onPermissionRequest); - expect(config.provider).toEqual({ type: "openai", baseUrl: "http://api-proxy:10002" }); - expect(config.model).toBe("test-model"); - expect(config.onPermissionRequest).toBe(onPermissionRequest); - }); - - it("omits provider config when GH_AW_COPILOT_SDK_PROVIDER_BASE_URL is unset", () => { - delete process.env.GH_AW_COPILOT_SDK_PROVIDER_BASE_URL; - const onPermissionRequest = () => {}; - const config = buildSessionConfig("test-model", onPermissionRequest); - expect(config.provider).toBeUndefined(); - expect(config.model).toBe("test-model"); - expect(config.onPermissionRequest).toBe(onPermissionRequest); - }); -});