Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions .github/drivers/copilot_sdk_driver_sample_node.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#!/usr/bin/env node
"use strict";

const fs = require("node:fs");
const { CopilotClient, RuntimeConnection, approveAll } = require("@github/copilot-sdk");

function readRequiredEnv(name) {
const value = process.env[name];
if (!value) {
throw new Error(`${name} is not set`);
}
return value;
}

function extractAssistantContent(message) {
if (!message || typeof message !== "object") {
return "";
}
const data = message.data;
if (data && typeof data.content === "string") {
return data.content;
}
if (typeof message.content === "string") {
return message.content;
}
return "";
}

async function main() {
const promptPath = readRequiredEnv("GH_AW_PROMPT");
const sdkUri = readRequiredEnv("COPILOT_SDK_URI");
const connectionToken = readRequiredEnv("COPILOT_CONNECTION_TOKEN");
const model = readRequiredEnv("COPILOT_MODEL");
const prompt = fs.readFileSync(promptPath, "utf8");

const client = new CopilotClient({
connection: RuntimeConnection.forUri(sdkUri, { connectionToken }),
workingDirectory: process.env.GITHUB_WORKSPACE || process.cwd(),
});

let session;
await client.start();
try {
session = await client.createSession({
onPermissionRequest: approveAll,
model,
});
const response = await session.sendAndWait({ prompt });
const content = extractAssistantContent(response);
if (content) {
process.stdout.write(content.endsWith("\n") ? content : `${content}\n`);
}
} finally {
if (session) {
await session.disconnect();
}
await client.stop();
}
}

main().catch(error => {
process.stderr.write(`[copilot-sdk-driver-sample-node] ${error instanceof Error ? error.message : String(error)}\n`);
process.exit(1);
});
65 changes: 65 additions & 0 deletions .github/drivers/copilot_sdk_driver_sample_python.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
#!/usr/bin/env python3
import asyncio
import os
import sys

from copilot import CopilotClient, RuntimeConnection
from copilot.session import PermissionHandler


def read_required_env(name: str) -> str:
value = os.getenv(name)
if not value:
raise RuntimeError(f"{name} is not set")
return value


def extract_assistant_content(message: object) -> str:
data = getattr(message, "data", None)
content = getattr(data, "content", None)
if isinstance(content, str):
return content
direct_content = getattr(message, "content", None)
if isinstance(direct_content, str):
return direct_content
return ""


async def main() -> int:
prompt_path = read_required_env("GH_AW_PROMPT")
sdk_uri = read_required_env("COPILOT_SDK_URI")
connection_token = read_required_env("COPILOT_CONNECTION_TOKEN")
model = read_required_env("COPILOT_MODEL")

with open(prompt_path, "r", encoding="utf-8") as prompt_file:
prompt = prompt_file.read()

client = CopilotClient(
connection=RuntimeConnection.for_uri(sdk_uri, connection_token=connection_token),
working_directory=os.getenv("GITHUB_WORKSPACE") or os.getcwd(),
)

await client.start()
session = None
try:
session = await client.create_session(on_permission_request=PermissionHandler.approve_all, model=model)
response = await session.send_and_wait(prompt)
content = extract_assistant_content(response)
if content:
if content.endswith("\n"):
sys.stdout.write(content)
else:
sys.stdout.write(f"{content}\n")
return 0
finally:
if session is not None:
await session.disconnect()
await client.stop()


if __name__ == "__main__":
try:
raise SystemExit(asyncio.run(main()))
except Exception as error:
sys.stderr.write(f"[copilot-sdk-driver-sample-python] {type(error).__name__}: {error}\n")
raise SystemExit(1)
77 changes: 77 additions & 0 deletions .github/drivers/copilot_sdk_driver_sample_ruby.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
#!/usr/bin/env ruby

require "open3"

NODE_DRIVER = <<~'JS'
const fs = require("node:fs");
const { CopilotClient, RuntimeConnection, approveAll } = require("@github/copilot-sdk");

function requiredEnv(name) {
const value = process.env[name];
if (!value) {
throw new Error(`${name} is not set`);
}
return value;
}

function extractAssistantContent(message) {
if (!message || typeof message !== "object") {
return "";
}
const data = message.data;
if (data && typeof data.content === "string") {
return data.content;
}
if (typeof message.content === "string") {
return message.content;
}
return "";
}

async function main() {
const promptPath = requiredEnv("GH_AW_PROMPT");
const sdkUri = requiredEnv("COPILOT_SDK_URI");
const connectionToken = requiredEnv("COPILOT_CONNECTION_TOKEN");
const model = requiredEnv("COPILOT_MODEL");
const prompt = fs.readFileSync(promptPath, "utf8");

const client = new CopilotClient({
connection: RuntimeConnection.forUri(sdkUri, { connectionToken }),
workingDirectory: process.env.GITHUB_WORKSPACE || process.cwd(),
});

let session;
await client.start();
try {
session = await client.createSession({
onPermissionRequest: approveAll,
model,
});
const response = await session.sendAndWait({ prompt });
const content = extractAssistantContent(response);
if (content) {
process.stdout.write(content.endsWith("\n") ? content : `${content}\n`);
}
} finally {
if (session) {
await session.disconnect();
}
await client.stop();
}
}

main().catch(error => {
process.stderr.write(`[copilot-sdk-driver-sample-ruby] ${error instanceof Error ? error.message : String(error)}\n`);
process.exit(1);
});
JS

begin
stdout_str, stderr_str, status = Open3.capture3("node", "-e", NODE_DRIVER)
$stdout.write(stdout_str)
$stderr.write(stderr_str)
exit(status.exitstatus || 1)
rescue StandardError => error
$stderr.write("[copilot-sdk-driver-sample-ruby] #{error.class}: #{error}\n")
exit(1)
end
64 changes: 64 additions & 0 deletions .github/drivers/copilot_sdk_driver_sample_typescript.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { readFileSync } from "node:fs";
import { CopilotClient, RuntimeConnection, approveAll } from "@github/copilot-sdk";

function readRequiredEnv(name: string): string {
const value = process.env[name];
if (!value) {
throw new Error(`${name} is not set`);
}
return value;
}

function extractAssistantContent(message: unknown): string {
if (!message || typeof message !== "object") {
return "";
}

const withData = message as { data?: { content?: unknown }; content?: unknown };
if (typeof withData.data?.content === "string") {
return withData.data.content;
}
if (typeof withData.content === "string") {
return withData.content;
}
return "";
}

async function main(): Promise<void> {
const promptPath = readRequiredEnv("GH_AW_PROMPT");
const sdkUri = readRequiredEnv("COPILOT_SDK_URI");
const connectionToken = readRequiredEnv("COPILOT_CONNECTION_TOKEN");
const model = readRequiredEnv("COPILOT_MODEL");
const prompt = readFileSync(promptPath, "utf8");

const client = new CopilotClient({
connection: RuntimeConnection.forUri(sdkUri, { connectionToken }),
workingDirectory: process.env.GITHUB_WORKSPACE || process.cwd(),
});

let session;
await client.start();
try {
session = await client.createSession({
onPermissionRequest: approveAll,
model,
});

const response = await session.sendAndWait({ prompt });
const content = extractAssistantContent(response);
if (content) {
process.stdout.write(content.endsWith("\n") ? content : `${content}\n`);
}
} finally {
if (session) {
await session.disconnect();
}
await client.stop();
}
}

main().catch(error => {
const message = error instanceof Error ? error.message : String(error);
process.stderr.write(`[copilot-sdk-driver-sample-typescript] ${message}\n`);
process.exit(1);
});
2 changes: 1 addition & 1 deletion .github/workflows/agent-performance-analyzer.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .github/workflows/agentic-token-audit.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .github/workflows/agentic-token-trend-audit.lock.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading