Desktop app: an extension joinSession() call removes all plugin skills from the session
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 45/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Aktiv
- Tech-Stack
- javascript
Rechercherichtung
Start by reproducing the issue with the minimal ~/.copilot/extensions/noop-join/extension.mjs example and compare session.rpc.skills.list() before and after joinSession(). Trace the join, extension relaunch, and session resume paths, then verify that enabled plugin skills remain available after each path without requiring a later plugins.reload({ reloadMcp: false, reloadCustomAgents: true, reloadHooks: false, reloadExtensions: false }) workaround.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Describe the bug
In the GitHub Copilot desktop app, when any extension calls joinSession() from @github/copilot-sdk/extension, the session loses every skill whose source is plugin. session.rpc.plugins.list() still lists every enabled plugin, and user skills, custom agents, plugin MCP servers, and custom instructions all stay. So the plugins look installed and enabled, but <available_skills> has none of their skills and the skill tool returns Skill not found for them.
I think this is one concrete trigger for the symptom in github/copilot-cli#2753.
Affected version
- GitHub Copilot desktop app 1.1.23, bundled runtime 1.0.87-0
- Windows 11 x64
- Not yet tested on runtime 1.0.88-0 or later
Steps to reproduce the behavior
- Install and enable one or more plugins that contribute skills.
- Create a user extension at
~/.copilot/extensions/noop-join/extension.mjs:import { joinSession } from "@github/copilot-sdk/extension"; await joinSession({}); - Start a new session in the desktop app, or run
extensions_reloadin an existing session. - Ask the agent to list its available skills, or call
session.rpc.skills.list()from an extension after the join and count the entries withsource: "plugin". - Disable the extension and start another new session for comparison.
Result: with the extension, the count of plugin skills is zero and stays at zero. session.rpc.plugins.list() is unchanged. Without the extension, the plugin skills are present.
Expected behavior
The session keeps the skills of its enabled plugins after an extension joins.
Additional context
Join paths that reproduce it. Each of these relaunches the extensions, and each one removed the plugin skills in my tests: a new session, extensions_reload, creating an extension in the middle of a session, reopening an idle session (session.resume with sessionWasActive: false), and a full app restart followed by a session resume.
Control. With no extensions enabled, sessions kept their plugin skills through a one-hour soak.
Hourly re-trigger. On a machine with a Copilot device policy (HKLM\SOFTWARE\Policies\GitHubCopilot), the runtime runs a managed-settings refresh about every 60 minutes. The log shows this sequence:
[managedSettings] self-fetch
session.managed_settings_resolved
mcp graph load: reload {"force":true} (policy_already_applied: true)
full replace_host path
About 4 seconds later every extension in every session relaunches and joins again, so the plugin skills disappear again, also in idle sessions. Honestly I feel like this explains the "healthy at first, degraded later" pattern in github/copilot-cli#2753. The policy did not change between refreshes, so the forced host replace looks unnecessary to me. I have not checked whether machines without a device policy do this too.
What did not work. joinSession({ enableConfigDiscovery: true }) keeps the plugin skills, but the extension then relaunched about 35 times in 80 seconds and the plugin list changed from 17 to 14 plugins.
Contrast. A standalone runtime of the same version, with an isolated home directory, did not lose plugin skills on join. My guess is that the resume that a join sends rebuilds the skill catalog without a discovery source that the desktop host depends on, but I have not confirmed that in source, so please treat it as an inference.
Workaround. Calling this from an extension a few seconds after each join restores the plugin skills within a few seconds:
await session.rpc.plugins.reload({
reloadMcp: false,
reloadCustomAgents: true,
reloadHooks: false,
reloadExtensions: false,
});
It is a band-aid, because the next join removes the skills again. Also, when many sessions relaunched at the same time (the hourly refresh), some of these reloads took longer than 35 seconds.
Impact. Plugin skills can be missing from the first prompt, after any extension relaunch, and about every hour. plugins.list() still looks complete, so the loss is hard to notice.
- Vorherrschende Sprache
- Keine Sprachdaten
- Sterne
- 2.1k
- Forks
- 157
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus github/app
-
triage
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 65/100
-
When using GPT-5.Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Ähnliche Issues
-
Schwierigkeit 1/5 1-3 Stunden Anfängerfreundlichkeit 88/100
-
bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
AvaloniaUI/Avalonia#22323 ·
Maintainer antworten meist innerhalb von 1 Tag
-
mapper bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
Maintainer antworten meist innerhalb von 1 Tag
-
clawsweeper:not-repro-on-main impact:ux-friction issue-rating: 🦪 silver shellfish P2
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 64/100
steipete/CodexBar#4040 · 1 Kommentar · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
-
Zenmap CrashOffenZenmap
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
Maintainer antworten meist innerhalb von 2 Tagen