> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Remote Sessions

> 說明如何在 Laravel Copilot SDK 中啟用 Remote Sessions,透過 GitHub 的 Mission Control 從網頁或行動裝置存取相同 Session。

## Remote Sessions

啟用 Remote Sessions 後,可透過 GitHub 的 Mission Control 從網頁或行動裝置存取相同 Session。
啟用後每個 Session 都會連線到 Mission Control,並發行可以透過連結或 QR Code 分享的 URL。

若希望 Session 本身在 GitHub 主機環境上執行,而非在本機或自建伺服器,請使用 [Cloud Sessions](/zh-TW/packages/laravel-copilot-sdk/cloud-sessions)。

## 前置條件

* 使用者已通過驗證(GitHub Token 或已登入的使用者)
* `workingDirectory` 是 GitHub 儲存庫

## 在 Client 層級啟用(常時 ON)

啟用 `remote: true` 後,GitHub 儲存庫內的所有 Session 都會自動發行遠端 URL。

比起固定寫入 `config/copilot.php`,只在需要的處理中透過 `useStdio()` 啟用 `remote: true` 會更好用。

<Info>
  `remote` 選項僅在 SDK 啟動 CLI 程序時有效,也就是 **僅限 stdio 模式**。連線至外部伺服器(例如 `useTcp()`)時會被忽略。
</Info>

```php theme={null}
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Enums\SessionEventType;
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Support\PermissionHandler;
use Revolution\Copilot\Types\SessionConfig;
use Revolution\Copilot\Types\SessionEvent;

$config = new SessionConfig(
    workingDirectory: '/path/to/github-repo',
    onPermissionRequest: PermissionHandler::approveAll(),
);

$stdioConfig = config('copilot');
$stdioConfig['remote'] = true;

Copilot::useStdio($stdioConfig)->start(function (CopilotSession $session): void {
    $session->on(SessionEventType::SESSION_INFO, function (SessionEvent $event): void {
        if ($event->data('infoType') === 'remote') {
            echo 'Remote URL: '.$event->data('url').PHP_EOL;
        }
    });
}, config: $config);
```

## 在每個 Session 啟用(隨選)

若想在中途開始遠端共享,可透過 RPC 切換。
這等同於 CLI 的 `/remote on` 與 `/remote off` 指令。

```php theme={null}
use Revolution\Copilot\Contracts\CopilotSession;
use Revolution\Copilot\Facades\Copilot;

Copilot::start(function (CopilotSession $session): void {
    $result = $session->rpc()->remote()->enable();

    if ($result->url !== null) {
        echo 'Remote URL: '.$result->url.PHP_EOL;
    }

    // 停止共享
    $session->rpc()->remote()->disable();
});
```

## 產生 QR Code

取得的遠端 URL 可以做成 QR Code 傳給行動裝置。
可以使用 Laravel Fortify 也採用的 [BaconQrCode](https://github.com/Bacon/BaconQRCode)。

```php theme={null}
use BaconQrCode\Renderer\Image\SvgImageBackEnd;
use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
use BaconQrCode\Writer;

$writer = new Writer(
    new ImageRenderer(
        new RendererStyle(256),
        new SvgImageBackEnd(),
    ),
);

$svg = $writer->writeString($result->url ?? '');
```

## 注意事項

* `remote` 選項僅在 SDK 啟動 CLI 程序時有效。連線至外部伺服器(例如 `useTcp()`)時會被忽略。
* 若 `workingDirectory` 不是 GitHub 儲存庫,在常時 ON 模式下遠端設定會被略過。在隨選啟用(`remote()->enable()`)時可能會產生錯誤。
* 請正確設定認證資訊(`github_token` 或 `use_logged_in_user`)。

## 參考

* [Cloud Sessions](/zh-TW/packages/laravel-copilot-sdk/cloud-sessions)
* [RPC](/zh-TW/packages/laravel-copilot-sdk/rpc)
* [TCP 模式](/zh-TW/packages/laravel-copilot-sdk/tcp-mode)

<Info>
  最新資訊請參閱 [GitHub 儲存庫](https://github.com/invokable/laravel-copilot-sdk)。
</Info>


## Related topics

- [Cloud Sessions](/zh-TW/packages/laravel-copilot-sdk/cloud-sessions.md)
- [Streaming Events](/zh-TW/packages/laravel-copilot-sdk/streaming-events.md)
- [RPC(Remote Procedure Call)](/zh-TW/packages/laravel-copilot-sdk/rpc.md)
- [Session](/zh-TW/session.md)
- [在 WSL 中安裝 PHP、Composer 與 Node.js（Windows）](/zh-TW/blog/windows-setup.md)
