Remote sessions let users access their Copilot session from GitHub web and mobile via Mission Control. When enabled, the SDK connects each session to Mission Control, producing a URL that can be shared as a link or QR code.
Set remote: true when creating the client. Every session in a GitHub repo automatically gets a remote URL.
import { CopilotClient } from "@github/copilot-sdk";
const client = new CopilotClient({ remote: true });
const session = await client.createSession({
workingDirectory: "/path/to/github-repo",
onPermissionRequest: async () => ({ allowed: true }),
});
session.on("session.info", (event) => {
if (event.data.infoType === "remote") {
console.log("Remote URL:", event.data.url);
}
});
from copilot import CopilotClient
client = CopilotClient(enable_remote_sessions=True)
session = await client.create_session(
working_directory="/path/to/github-repo",
on_permission_request=lambda req: {"allowed": True},
)
def on_event(event):
if event.type == "session.info" and event.data.info_type == "remote":
print(f"Remote URL: {event.data.url}")
session.on(on_event)
client, _ := copilot.NewClient(&copilot.ClientOptions{Remote: true})
session, _ := client.CreateSession(ctx, &copilot.SessionConfig{
WorkingDirectory: "/path/to/github-repo",
OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {
return &rpc.PermissionDecisionApproveOnce{}, nil
},
})
session.On(func(event copilot.SessionEvent) {
if event.Type == "session.info" {
// Check infoType and extract URL
}
})
var client = new CopilotClient(new CopilotClientOptions { Remote = true });
var session = await client.CreateSessionAsync(new SessionConfig
{
WorkingDirectory = "/path/to/github-repo",
OnPermissionRequest = (req, inv) =>
Task.FromResult(PermissionDecision.ApproveOnce()),
});
session.On((SessionEvent e) =>
{
if (e is SessionInfoEvent info && info.Data.InfoType == "remote")
{
Console.WriteLine($"Remote URL: {info.Data.Url}");
}
});
use github_copilot_sdk::{Client, ClientOptions, SessionConfig};
use github_copilot_sdk::handler::PermissionResult;
let client = Client::start(
ClientOptions::new().with_enable_remote_sessions(true)
).await?;
let session = client.create_session(
SessionConfig::new("/path/to/github-repo")
.with_permission_handler(|_req, _inv| async {
Ok(PermissionResult::approve_once())
}),
).await?;
let mut events = session.subscribe();
while let Ok(event) = events.recv().await {
if event.event_type == "session.info" {
// Check info_type and extract URL
}
}
Set the create-session cloud option to create a remote session in the cloud instead of a local session. You can include repository metadata to associate the cloud session with a GitHub repository.
const session = await client.createSession({
onPermissionRequest: async () => ({ allowed: true }),
cloud: {
repository: { owner: "github", name: "copilot-sdk", branch: "main" },
},
});
from copilot import CloudSessionOptions, CloudSessionRepository
session = await client.create_session(
on_permission_request=PermissionHandler.approve_all,
cloud=CloudSessionOptions(
repository=CloudSessionRepository(
owner="github",
name="copilot-sdk",
branch="main",
)
),
)
session, err := client.CreateSession(ctx, &copilot.SessionConfig{
Cloud: &copilot.CloudSessionOptions{
Repository: &copilot.CloudSessionRepository{
Owner: "github",
Name: "copilot-sdk",
Branch: "main",
},
},
})
var session = await client.CreateSessionAsync(new SessionConfig
{
Cloud = new CloudSessionOptions
{
Repository = new CloudSessionRepository
{
Owner = "github",
Name = "copilot-sdk",
Branch = "main"
}
}
});
use github_copilot_sdk::{CloudSessionOptions, CloudSessionRepository, SessionConfig};
let session = client.create_session(
SessionConfig::default().with_cloud(
CloudSessionOptions::with_repository(
CloudSessionRepository::new("github", "copilot-sdk").with_branch("main"),
),
),
).await?;
Use session.rpc.remote.enable() to start remote access mid-session, and session.rpc.remote.disable() to stop it. This is equivalent to the CLI's /remote on and /remote off commands.
const result = await session.rpc.remote.enable();
console.log("Remote URL:", result.url);
// Later: stop sharing
await session.rpc.remote.disable();
result = await session.rpc.remote.enable()
print(f"Remote URL: {result.url}")
# Later: stop sharing
await session.rpc.remote.disable()
result, err := session.RPC.Remote.Enable(ctx)
if result.URL != nil {
fmt.Println("Remote URL:", *result.URL)
}
// Later: stop sharing
err = session.RPC.Remote.Disable(ctx)
var result = await session.Rpc.Remote.EnableAsync();
Console.WriteLine($"Remote URL: {result.Url}");
// Later: stop sharing
await session.Rpc.Remote.DisableAsync();
let result = session.rpc().remote().enable().await?;
if let Some(url) = &result.url {
println!("Remote URL: {url}");
}
// Later: stop sharing
session.rpc().remote().disable().await?;
The remote URL can be rendered as a QR code for easy mobile access. The SDK provides the URL—use your preferred QR code library:
remote client option only applies when the SDK spawns the CLI process. It is ignored when connecting to an external server via cliUrl.cloud session option applies only to new sessions created with session.create; it is not used when resuming an existing session.gitHubToken or useLoggedInUser is configured.Can you improve this documentation? These fine people already did:
Steve Sanderson, Tiago Botelho, Sunbrye Ly & Patrick NikoletichEdit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |