{"meta":{"title":"원격 세션","intro":"원격 세션을 사용하면 사용자가 사용 제어 통해 GitHub 웹 및 모바일에서 Copilot 세션에 액세스할 수 있습니다. 사용하도록 설정하면 SDK는 각 세션을 Mission Control에 연결하여 링크 또는 QR 코드로 공유할 수 있는 URL을 생성합니다.","product":"GitHub Copilot","breadcrumbs":[{"href":"/ko/enterprise-cloud@latest/copilot","title":"GitHub Copilot"},{"href":"/ko/enterprise-cloud@latest/copilot/how-tos","title":"방법"},{"href":"/ko/enterprise-cloud@latest/copilot/how-tos/copilot-sdk","title":"코필로트 SDK"},{"href":"/ko/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features","title":"기능"},{"href":"/ko/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/remote-sessions","title":"원격 세션"}],"documentType":"article"},"body":"# 원격 세션\n\n원격 세션을 사용하면 사용자가 사용 제어 통해 GitHub 웹 및 모바일에서 Copilot 세션에 액세스할 수 있습니다. 사용하도록 설정하면 SDK는 각 세션을 Mission Control에 연결하여 링크 또는 QR 코드로 공유할 수 있는 URL을 생성합니다.\n\n<!-- markdownlint-disable GHD046 GHD005 -->\n\n<!-- Suppressed: GHD046 (outdated release terminology), GHD005 (hardcoded data variable) -->\n\nGitHub 호스팅 컴퓨팅에서 세션을 실행하려면 [클라우드 세션](/ko/enterprise-cloud@latest/copilot/how-tos/copilot-sdk/features/cloud-sessions) 참조하세요.\n\n## 사전 요구 사항\n\n* 사용자가 인증되어야 합니다(GitHub 토큰 또는 로그인한 사용자).\n* 세션의 작업 디렉터리는 GitHub 리포지토리여야 합니다.\n\n## 원격 세션 활성화\n\n### 항상 켜짐(클라이언트 수준)\n\n클라이언트를 만들 때 설정합니다 `enableRemoteSessions: true` . GitHub 리포지토리의 모든 세션은 자동으로 원격 URL을 가져옵니다.\n\n<!-- tabs:start -->\n\n#### TypeScript\n\n<!-- docs-validate: skip -->\n\n```typescript\nimport { CopilotClient } from \"@github/copilot-sdk\";\n\nconst client = new CopilotClient({ enableRemoteSessions: true });\nconst session = await client.createSession({\n  workingDirectory: \"/path/to/github-repo\",\n  onPermissionRequest: async () => ({ allowed: true }),\n});\n\nsession.on(\"session.info\", (event) => {\n  if (event.data.infoType === \"remote\") {\n    console.log(\"Remote URL:\", event.data.url);\n  }\n});\n```\n\n#### Python\n\n<!-- docs-validate: skip -->\n\n```python\nfrom copilot import CopilotClient\n\nclient = CopilotClient(enable_remote_sessions=True)\nsession = await client.create_session(\n    working_directory=\"/path/to/github-repo\",\n    on_permission_request=lambda req: {\"allowed\": True},\n)\n\ndef on_event(event):\n    if event.type == \"session.info\" and event.data.info_type == \"remote\":\n        print(f\"Remote URL: {event.data.url}\")\n\nsession.on(on_event)\n```\n\n#### Go\n\n<!-- docs-validate: skip -->\n\n```golang\nclient := copilot.NewClient(&copilot.ClientOptions{EnableRemoteSessions: true})\nsession, _ := client.CreateSession(ctx, &copilot.SessionConfig{\n    WorkingDirectory: \"/path/to/github-repo\",\n    OnPermissionRequest: func(req copilot.PermissionRequest, inv copilot.PermissionInvocation) (rpc.PermissionDecision, error) {\n        return &rpc.PermissionDecisionApproveOnce{}, nil\n    },\n})\n\nsession.On(func(event copilot.SessionEvent) {\n    if event.Type == \"session.info\" {\n        // Check infoType and extract URL\n    }\n})\n```\n\n#### C\\#\n\n<!-- docs-validate: skip -->\n\n```csharp\nvar client = new CopilotClient(new CopilotClientOptions { EnableRemoteSessions = true });\nvar session = await client.CreateSessionAsync(new SessionConfig\n{\n    WorkingDirectory = \"/path/to/github-repo\",\n    OnPermissionRequest = (req, inv) =>\n        Task.FromResult(PermissionDecision.ApproveOnce()),\n});\n\nsession.On((SessionEvent e) =>\n{\n    if (e is SessionInfoEvent info && info.Data.InfoType == \"remote\")\n    {\n        Console.WriteLine($\"Remote URL: {info.Data.Url}\");\n    }\n});\n```\n\n#### 러스트\n\n<!-- docs-validate: skip -->\n\n```rust\nuse github_copilot_sdk::{Client, ClientOptions, SessionConfig};\nuse github_copilot_sdk::handler::PermissionResult;\n\nlet client = Client::start(\n    ClientOptions::new().with_enable_remote_sessions(true)\n).await?;\nlet session = client.create_session(\n    SessionConfig::new(\"/path/to/github-repo\")\n        .with_permission_handler(|_req, _inv| async {\n            Ok(PermissionResult::approve_once())\n        }),\n).await?;\n\nlet mut events = session.subscribe();\nwhile let Ok(event) = events.recv().await {\n    if event.event_type == \"session.info\" {\n        // Check info_type and extract URL\n    }\n}\n```\n\n<!-- tabs:end -->\n\n### 필요 시(세션별로 전환)\n\n세션 `session.rpc.remote.enable()` 중간에 원격 액세스를 시작하고 중지하는 데 사용합니다`session.rpc.remote.disable()`. 이는 CLI의 `/remote on` 및 `/remote off` 명령과 동일합니다.\n\n<!-- tabs:start -->\n\n#### TypeScript\n\n<!-- docs-validate: skip -->\n\n```typescript\nconst result = await session.rpc.remote.enable();\nconsole.log(\"Remote URL:\", result.url);\n\n// Later: stop sharing\nawait session.rpc.remote.disable();\n```\n\n#### Python\n\n<!-- docs-validate: skip -->\n\n```python\nresult = await session.rpc.remote.enable()\nprint(f\"Remote URL: {result.url}\")\n\n# Later: stop sharing\nawait session.rpc.remote.disable()\n```\n\n#### Go\n\n<!-- docs-validate: skip -->\n\n```golang\nresult, err := session.RPC.Remote.Enable(ctx)\nif result.URL != nil {\n    fmt.Println(\"Remote URL:\", *result.URL)\n}\n\n// Later: stop sharing\nerr = session.RPC.Remote.Disable(ctx)\n```\n\n#### C\\#\n\n<!-- docs-validate: skip -->\n\n```csharp\nvar result = await session.Rpc.Remote.EnableAsync();\nConsole.WriteLine($\"Remote URL: {result.Url}\");\n\n// Later: stop sharing\nawait session.Rpc.Remote.DisableAsync();\n```\n\n#### 러스트\n\n<!-- docs-validate: skip -->\n\n```rust\nlet result = session.rpc().remote().enable().await?;\nif let Some(url) = &result.url {\n    println!(\"Remote URL: {url}\");\n}\n\n// Later: stop sharing\nsession.rpc().remote().disable().await?;\n```\n\n<!-- tabs:end -->\n\n## QR 코드 생성\n\n간편한 모바일 액세스를 위해 원격 URL을 QR 코드로 렌더링할 수 있습니다. SDK는 URL을 제공합니다. 기본 QR 코드 라이브러리를 사용합니다.\n\n* **TypeScript**: [qrcode](https://www.npmjs.com/package/qrcode)\n* **Python**: [qrcode](https://pypi.org/project/qrcode/)\n* **Go**: [go-qrcode](https://github.com/skip2/go-qrcode)\n* **C#**: [QRCoder](https://www.nuget.org/packages/QRCoder)\n* **Rust**: [qrcode](https://crates.io/crates/qrcode)\n\n## 비고\n\n* `enableRemoteSessions` 클라이언트 옵션은 SDK가 런타임을 자식 프로세스 또는 In-process 호스트로 시작할 때 적용됩니다. 이미 실행 중인 런타임에 연결할 때 무시됩니다.\n* 작업 디렉터리가 GitHub 리포지토리가 아닌 경우 원격 설정을 자동으로 건너뛰거나(상시 모드) 오류(주문형 모드)를 반환합니다.\n* 원격 세션에는 인증이 필요합니다.\n  `gitHubToken` 또는 `useLoggedInUser`이(가) 구성되었는지 확인합니다."}