feat: add Copilot connection diagnostics

Add backend support for Copilot connection and account-status UX without introducing raw provider credential management.

This change extends sidecar capabilities with explicit connection diagnostics, adds a refreshable capabilities IPC path, classifies common Copilot CLI failure modes, and includes a frontend handover document describing the new payload and expected UI states.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
David Kaya
2026-03-22 12:58:40 +01:00
co-authored by Copilot
parent e25518a4c5
commit d68b1b99f3
11 changed files with 438 additions and 22 deletions
+12 -4
View File
@@ -54,11 +54,11 @@ export class KopayaAppService extends EventEmitter<AppServiceEvents> {
private sidecarCapabilities?: SidecarCapabilities;
async describeSidecarCapabilities(): Promise<SidecarCapabilities> {
if (!this.sidecarCapabilities) {
this.sidecarCapabilities = await this.sidecar.describeCapabilities();
}
return this.loadSidecarCapabilities();
}
return this.sidecarCapabilities;
async refreshSidecarCapabilities(): Promise<SidecarCapabilities> {
return this.loadSidecarCapabilities(true);
}
async loadWorkspace(): Promise<WorkspaceState> {
@@ -494,4 +494,12 @@ export class KopayaAppService extends EventEmitter<AppServiceEvents> {
private emitSessionEvent(event: SessionEventRecord): void {
this.emit('session-event', event);
}
private async loadSidecarCapabilities(forceRefresh = false): Promise<SidecarCapabilities> {
if (forceRefresh || !this.sidecarCapabilities) {
this.sidecarCapabilities = await this.sidecar.describeCapabilities();
}
return this.sidecarCapabilities;
}
}
+1
View File
@@ -12,6 +12,7 @@ import { KopayaAppService } from '@main/KopayaAppService';
export function registerIpcHandlers(window: BrowserWindow, service: KopayaAppService): void {
ipcMain.handle(ipcChannels.describeSidecarCapabilities, () => service.describeSidecarCapabilities());
ipcMain.handle(ipcChannels.refreshSidecarCapabilities, () => service.refreshSidecarCapabilities());
ipcMain.handle(ipcChannels.loadWorkspace, () => service.loadWorkspace());
ipcMain.handle(ipcChannels.addProject, () => service.addProject());
ipcMain.handle(ipcChannels.removeProject, (_event, projectId: string) => service.removeProject(projectId));