-
Notifications
You must be signed in to change notification settings - Fork 541
Expand file tree
/
Copy pathcopilot_sdk_driver_sample_node.cjs
More file actions
106 lines (93 loc) · 3.01 KB
/
Copy pathcopilot_sdk_driver_sample_node.cjs
File metadata and controls
106 lines (93 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env node
"use strict";
const fs = require("node:fs");
const { isValidProviderConfig, isValidModelConfig, parseMultiProviderJson } = require("../../actions/setup/js/copilot_sdk_multi_provider.cjs");
// Default timeout for a single sendAndWait call: 10 minutes.
// Override via the COPILOT_SDK_SEND_TIMEOUT_MS environment variable.
const DEFAULT_SEND_TIMEOUT_MS = 10 * 60 * 1000;
function readRequiredEnv(name) {
const value = process.env[name];
if (!value) {
throw new Error(`${name} is not set`);
}
return value;
}
function parseSendTimeoutMs() {
const raw = process.env.COPILOT_SDK_SEND_TIMEOUT_MS;
if (typeof raw === "string") {
const trimmed = raw.trim();
if (/^\d+$/.test(trimmed)) {
const parsed = Number.parseInt(trimmed, 10);
if (Number.isSafeInteger(parsed) && parsed > 0) {
return parsed;
}
}
}
return DEFAULT_SEND_TIMEOUT_MS;
}
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 "";
}
function buildSessionConfig(model, onPermissionRequest) {
const config = {
onPermissionRequest,
model,
};
// Multi-provider BYOK configuration (preferred)
const multiProviderJson = process.env.GH_AW_COPILOT_SDK_MULTI_PROVIDER_JSON;
const multiProviderConfig = parseMultiProviderJson(multiProviderJson);
if (multiProviderConfig) {
config.providers = multiProviderConfig.providers;
config.models = multiProviderConfig.models;
}
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");
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(buildSessionConfig(model, approveAll));
const response = await session.sendAndWait({ prompt }, parseSendTimeoutMs());
const content = extractAssistantContent(response);
if (content) {
process.stdout.write(content.endsWith("\n") ? content : `${content}\n`);
}
} finally {
if (session) {
await session.disconnect();
}
await client.stop();
}
}
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,
parseMultiProviderJson,
isValidProviderConfig,
isValidModelConfig,
};