fix(plugins): keep empty session extension pins authoritative

Pinned session-extension registries now remain the owner even when empty, preventing later active registry churn from leaking agent-owned extensions into the gateway surface.
This commit is contained in:
杨浩宇0668001029
2026-06-16 11:36:43 +08:00
committed by Vincent Koc
parent 0e71ce1174
commit 0fb0c2cb8e
2 changed files with 5 additions and 16 deletions
+4 -3
View File
@@ -198,7 +198,7 @@ describe("plugin runtime route registry", () => {
expect(isPluginRegistryRetired(startupRegistry)).toBe(true);
});
it("falls through from an empty pinned session extension registry to the active surface", () => {
it("keeps empty pinned session extension registries authoritative over active extensions", () => {
const startupRegistry = createEmptyPluginRegistry();
const laterRegistry = createRegistryWithSessionExtension("later", "presence");
@@ -207,8 +207,9 @@ describe("plugin runtime route registry", () => {
const sessionExtensionVersionBeforeSwap = getActivePluginSessionExtensionRegistryVersion();
setActivePluginRegistry(laterRegistry);
expect(getActivePluginSessionExtensionRegistry()).toBe(laterRegistry);
expect(getActivePluginSessionExtensionRegistryVersion()).not.toBe(
expect(getActivePluginSessionExtensionRegistry()).toBe(startupRegistry);
expect(getActivePluginSessionExtensionRegistry()?.sessionExtensions).toHaveLength(0);
expect(getActivePluginSessionExtensionRegistryVersion()).toBe(
sessionExtensionVersionBeforeSwap,
);
});
+1 -13
View File
@@ -353,10 +353,6 @@ export function requireActivePluginChannelRegistry(): PluginRegistry {
return created;
}
function countSessionExtensionSurface(registry: PluginRegistry | null): number {
return registry?.sessionExtensions?.length ?? 0;
}
export function pinActivePluginSessionExtensionRegistry(registry: PluginRegistry) {
const previousRegistry = asPluginRegistry(state.sessionExtension.registry);
installSurfaceRegistry(state.sessionExtension, registry, true);
@@ -380,15 +376,7 @@ export function releasePinnedPluginSessionExtensionRegistry(registry?: PluginReg
}
export function getActivePluginSessionExtensionRegistry(): PluginRegistry | null {
const surfaceRegistry = asPluginRegistry(state.sessionExtension.registry ?? state.activeRegistry);
if (!state.sessionExtension.pinned) {
return surfaceRegistry;
}
const activeRegistry = asPluginRegistry(state.activeRegistry);
return countSessionExtensionSurface(surfaceRegistry) > 0 ||
countSessionExtensionSurface(activeRegistry) === 0
? surfaceRegistry
: activeRegistry;
return asPluginRegistry(state.sessionExtension.registry ?? state.activeRegistry);
}
export function getActivePluginSessionExtensionRegistryVersion(): number {