feat(sdk): upgrade to @github/copilot-sdk 1.0.0-beta.8 + remote-session support#189
Conversation
Consolidates 9 dependabot PRs and migrates to the latest beta SDK so we can
expose cloud / remote-session control (the feature behind 'copilot --remote' /
'/remote' in the official CLI).
Dependency bumps
- @github/copilot-sdk 0.2.2 -> 1.0.0-beta.8 (pinned exact; beta API)
- @sveltejs/kit ^2.57.1 -> ^2.61.1
- svelte ^5.55.4 -> ^5.55.9
- vite ^8.0.8 -> ^8.0.14, ws ^8.18 -> ^8.21
- dompurify ^3.4 -> ^3.4.7, marked ^18.0.2 -> ^18.0.4
- dev-deps group: @playwright/test, vite-plugin-svelte, @types/node,
@vitest/coverage-v8, jsdom, lint-staged, svelte-check
SDK breaking-change migration
- CopilotClient now takes a RuntimeConnection (forStdio/forUri/forTcp)
- githubToken -> gitHubToken; cwd -> workingDirectory
- COPILOT_HOME env -> baseDirectory option
- SystemPromptSection -> SystemMessageSection
- onPermissionRequest optional; getQuota({}) takes params object
- hook input shapes: timestamp is Date; cwd dropped from session/error hooks;
workingDirectory required on Pre/Post tool hook inputs
- session-fs.ts removed (runtime writes session-state under baseDirectory)
New SDK features wired in (all unit tested)
- Per-session remoteSession mode (off | export | on), threaded through
CreateSessionOptions and the WS new-session handler; persisted setting field
added (default off).
- Cloud sessions REST wrapper (cloud-sessions.ts) talking to
api.individual.githubcopilot.com/agents/sessions (the same endpoint the
official CLI uses for the remote-sessions view), with timeout + graceful
error handling.
- New GET /api/sessions/remote returns authenticated user's cloud sessions
(passes through 401/403, 502 on other upstream errors).
- New GET /api/sessions/last using client.getLastSessionId() +
getSessionMetadata() for one-tap resume.
- Graceful + forceful shutdown: destroyPoolEntry races client.stop() against
a 5s timer and falls back to client.forceStop() to prevent hung CLI subs.
Config
- New ENABLE_REMOTE_SESSIONS env var (default true) wired into
CopilotClient.enableRemoteSessions; sessions still need per-session opt-in.
Verification
- svelte-check: 0 errors / 0 warnings
- vitest: 430 passed (41 files); +21 new tests covering cloud-sessions,
/api/sessions/remote, /api/sessions/last, remoteSession threading, and
forceStop fallback
- npm run build succeeds; smoke boot: /health returns 200
Supersedes dependabot PRs #170, #172, #177, #178, #181, #182, #185, #186, #188.
Out of scope (left open with comments): #176 (node:26-slim too new),
#167 (release-please v5 breaking inputs), #187 (@github/copilot CLI is not a
direct dep). Playwright E2E should be run in CI.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Investigating node_modules/@github/copilot/app.js (the official CLI we
ship in node_modules via @github/copilot-sdk peer) showed that the
hostname I guessed earlier — api.individual.githubcopilot.com — is not
present anywhere in the bundle. The CLI only uses:
- api.githubcopilot.com (default)
- api.enterprise.githubcopilot.com (enterprise plan)
And the agents endpoint is per-session (PUT/GET /agents/sessions/{id}),
not a list. There is no 'list all my remote sessions' REST endpoint in
the public CLI; that view is rendered on github.com using a different,
internal API path that requires a Copilot bearer (exchanged from the GH
OAuth token via a CLI-internal endpoint not exposed to integrators).
Rather than ship a route that returns 502/empty results, I'm removing:
- src/lib/server/copilot/cloud-sessions.ts
- src/lib/server/copilot/cloud-sessions.test.ts
- src/routes/api/sessions/remote/+server.ts
- src/routes/api/sessions/remote/server.test.ts
What stays (and is fully tested):
- Per-session remoteSession mode wired through CreateSessionOptions
and the WS new-session handler — the SDK takes care of publishing
to api.githubcopilot.com under the hood when this is set.
- GET /api/sessions/last (uses real SDK getLastSessionId + getSessionMetadata)
- destroyPoolEntry forceStop fallback
- ENABLE_REMOTE_SESSIONS env var
New Playwright spec tests/sessions-endpoints.spec.ts hits the new
/api/sessions/last on a real built server and verifies the 401 path
end-to-end. Full suite: 57 desktop Playwright tests + 419 unit tests
all pass.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Update after Playwright runRan the full Playwright suite ( Also discovered (and fixed) one wrong assumption during E2E investigation: Removed What stays (and is now Playwright-tested):
Why no live remote-session E2E test: would publish real sessions to production Copilot infrastructure under a test account, can't be hermetic. The unit tests cover the wiring; manual smoke procedure is in the README diff. |
- Bump copilot-sdk badge & tech-stack line to v1.0.0-beta.8. - New Features bullets for remote session publishing and resume-last-session. - New 'Remote session publishing' subsection under CLI <-> Browser Sync explaining what off/export/on do AND being explicit about what's NOT in this release (no in-app remote session browser, no steering of other remote sessions) so future users don't expect that capability. - Add ENABLE_REMOTE_SESSIONS env var to the All-options table. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
@copilot please review this PR — the SDK 1.0.0-beta.8 upgrade, the new |
- MCP server config: rename cwd → workingDirectory (SDK 1.0 rename) - /api/sessions/last: pass copilotConfigDir to createCopilotClient so the SDK reads from the correct baseDirectory - new-session handler: honor ENABLE_REMOTE_SESSIONS server kill-switch; ignore client-supplied remoteSession when the feature is disabled - destroyPoolEntry: clear timeout on stop() resolve, attach .catch() to the in-flight stop promise (no unhandled rejection), guard forceStop with a settled flag so it cannot race a clean stop Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Rubber-duck review pass — summaryI ran a local critique pass on this PR (since the Copilot reviewer doesn't appear to be enabled on this repo — the REST request to add it returned 200 but never produced a 🔴 Fixed in b973d59
🟢 Deferred (out of scope / cosmetic)
Verified
|
Reviewed current HEAD (
I also re-ran focused validation locally: |
The Playwright desktop suite grew to 126 tests. With 1 CI worker and 2 retries (CI defaults from playwright.config.ts), the worst- case wall clock now exceeds the prior 15-minute budget — every recent CI run on this repo (including dependabot PRs) has been hitting the job timeout during the Playwright step. This is a narrow infra fix: extend the budget so the suite can actually finish. It does not skip, disable, or weaken any tests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Description
Migrates copilot-unleashed to
@github/copilot-sdk1.0.0-beta.8, consolidates the open Dependabot bumps, and adds the supported remote-session pieces from the new SDK: per-sessionremoteSessionwiring, theENABLE_REMOTE_SESSIONSserver flag, andGET /api/sessions/lastfor one-tap resume.This PR no longer ships an in-app remote-session listing API. During verification, the earlier
/api/sessions/remoteroute andcloud-sessions.tswrapper were removed after confirming the assumed public listing endpoint was not actually available to integrators. The README now documents that limitation instead of advertising a non-working viewer.Additional follow-up fixes included in this PR:
cwd→workingDirectory)copilotConfigDirinto/api/sessions/lastso it reads the configured session state directoryENABLE_REMOTE_SESSIONSkill-switch server-sidedestroyPoolEntryso the graceful-stop timeout cleanup is leak-safe and only falls back toforceStop()when neededType of Change
Testing
npm run test:unit)npx playwright test)docs/TEST-MATRIX.mdif this PR adds or modifies a featureQuality Checklist
npm run checkwith no new errorsnpm run buildsuccessfullyconsole.logor debug code left inSecurity (for public repo)
Screenshots / Recordings