refactor: remove unneeded sidecar refresh restart logic

Drop the refresh-time sidecar restart workaround and its helper/tests now that the verified fix is in the sidecar subprocess launcher itself. This keeps the runtime simpler and leaves only the changes required for correct Copilot version detection.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
David Kaya
2026-03-22 18:09:35 +01:00
co-authored by Copilot
parent 64a987b48a
commit 91984e9dca
4 changed files with 4 additions and 83 deletions
+1 -6
View File
@@ -496,12 +496,7 @@ export class KopayaAppService extends EventEmitter<AppServiceEvents> {
}
private async loadSidecarCapabilities(forceRefresh = false): Promise<SidecarCapabilities> {
if (forceRefresh) {
this.sidecarCapabilities = await this.sidecar.refreshCapabilities();
return this.sidecarCapabilities;
}
if (!this.sidecarCapabilities) {
if (forceRefresh || !this.sidecarCapabilities) {
this.sidecarCapabilities = await this.sidecar.describeCapabilities();
}
+3 -36
View File
@@ -1,5 +1,4 @@
import { app } from 'electron';
import { once } from 'node:events';
import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';
import type {
@@ -13,10 +12,6 @@ import type {
} from '@shared/contracts/sidecar';
import type { ChatMessageRecord } from '@shared/domain/session';
import { createSidecarEnvironment } from '@main/sidecar/sidecarEnvironment';
import {
shouldHandleSidecarExit,
shouldRestartSidecarOnCapabilityRefresh,
} from '@main/sidecar/sidecarRefresh';
import {
markRunTurnPendingErrored,
shouldHandleRunTurnEvent,
@@ -51,14 +46,6 @@ export class SidecarClient {
return command;
}
async refreshCapabilities(): Promise<SidecarCapabilities> {
if (shouldRestartSidecarOnCapabilityRefresh(this.hasActiveRunTurn())) {
await this.dispose();
}
return this.describeCapabilities();
}
async validatePattern(pattern: ValidatePatternCommand['pattern']): Promise<unknown> {
return this.dispatch<unknown>({
type: 'validate-pattern',
@@ -76,28 +63,12 @@ export class SidecarClient {
}
async dispose(): Promise<void> {
const sidecar = this.process;
if (!sidecar) {
if (!this.process) {
return;
}
if (sidecar.exitCode !== null || sidecar.signalCode !== null) {
return;
}
const exitPromise = once(sidecar, 'exit');
sidecar.kill();
await exitPromise;
}
hasActiveRunTurn(): boolean {
for (const pending of this.pending.values()) {
if (pending.kind === 'run-turn') {
return true;
}
}
return false;
this.process.kill();
this.process = undefined;
}
private async ensureProcess(): Promise<ChildProcessWithoutNullStreams> {
@@ -131,10 +102,6 @@ export class SidecarClient {
});
childProcess.on('exit', (code) => {
if (!shouldHandleSidecarExit(this.process?.pid, childProcess.pid)) {
return;
}
const error = new Error(`The .NET sidecar exited unexpectedly with code ${code ?? 'unknown'}.`);
for (const pending of this.pending.values()) {
pending.reject(error);
-10
View File
@@ -1,10 +0,0 @@
export function shouldRestartSidecarOnCapabilityRefresh(hasActiveRunTurn: boolean): boolean {
return !hasActiveRunTurn;
}
export function shouldHandleSidecarExit(
activeProcessId: number | undefined,
exitingProcessId: number | undefined,
): boolean {
return activeProcessId !== undefined && exitingProcessId !== undefined && activeProcessId === exitingProcessId;
}
-31
View File
@@ -1,31 +0,0 @@
import { describe, expect, test } from 'bun:test';
import {
shouldHandleSidecarExit,
shouldRestartSidecarOnCapabilityRefresh,
} from '@main/sidecar/sidecarRefresh';
describe('shouldRestartSidecarOnCapabilityRefresh', () => {
test('restarts the sidecar when no run-turn is active', () => {
expect(shouldRestartSidecarOnCapabilityRefresh(false)).toBe(true);
});
test('keeps the existing sidecar when a run-turn is active', () => {
expect(shouldRestartSidecarOnCapabilityRefresh(true)).toBe(false);
});
});
describe('shouldHandleSidecarExit', () => {
test('handles exit events from the currently active sidecar process', () => {
expect(shouldHandleSidecarExit(1234, 1234)).toBe(true);
});
test('ignores exit events from a stale sidecar process', () => {
expect(shouldHandleSidecarExit(1234, 5678)).toBe(false);
});
test('ignores exit events when either process id is missing', () => {
expect(shouldHandleSidecarExit(undefined, 5678)).toBe(false);
expect(shouldHandleSidecarExit(1234, undefined)).toBe(false);
});
});