Skip to content

Commit 9962222

Browse files
committed
fix(coding-agent): skip extension-removal reporting for partial test runners
Test hosts and partial ExtensionRunner implementations do not expose getExtensionIdentities; teardownCurrent now only captures and reportRemovedExtensions only emits when both runners expose it, so those hosts degrade to the previous behavior instead of throwing during session replacement. Caught by CI's rpc-session-registry suite, which uses a minimal runner stub.
1 parent 3f2ac9f commit 9962222

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

packages/coding-agent/src/core/agent-session-runtime.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,15 @@ export class AgentSessionRuntime {
187187

188188
private async teardownCurrent(reason: SessionShutdownEvent["reason"], targetSessionFile?: string): Promise<void> {
189189
const oldRunner = this.session.extensionRunner;
190-
this._removedOnReplacement = {
191-
oldRunner,
192-
oldIdentities: oldRunner.getExtensionIdentities(),
193-
reason,
194-
};
190+
// Test hosts and partial runner implementations may lack identity introspection;
191+
// skip removal reporting there rather than break the replacement itself.
192+
if (typeof oldRunner.getExtensionIdentities === "function") {
193+
this._removedOnReplacement = {
194+
oldRunner,
195+
oldIdentities: oldRunner.getExtensionIdentities(),
196+
reason,
197+
};
198+
}
195199
await emitSessionShutdownEvent(oldRunner, {
196200
type: "session_shutdown",
197201
reason,
@@ -205,8 +209,10 @@ export class AgentSessionRuntime {
205209
const pending = this._removedOnReplacement;
206210
this._removedOnReplacement = undefined;
207211
if (!pending) return;
212+
const newRunner = this.session.extensionRunner;
213+
if (typeof newRunner.getExtensionIdentities !== "function") return;
208214
const newResolvedPaths = new Set(
209-
this.session.extensionRunner.getExtensionIdentities().map((extension) => extension.resolvedPath),
215+
newRunner.getExtensionIdentities().map((extension) => extension.resolvedPath),
210216
);
211217
const removed = pending.oldIdentities.filter((extension) => !newResolvedPaths.has(extension.resolvedPath));
212218
if (removed.length === 0) return;

0 commit comments

Comments
 (0)