From ccbf450a8d53e57a8c956c1fc6e4e34cba8db7e2 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Tue, 2 Jun 2026 13:43:10 -0600 Subject: [PATCH 1/3] Handle signed-out Cloud runtime connections --- .../src/cloud/auth-injection.ts | 3 ++- .../src/cloud/cloud-agent-servers.ts | 6 ++--- .../agents-desktop/src/runtime/lifecycle.ts | 27 ++++++++++--------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/packages/agents-desktop/src/cloud/auth-injection.ts b/packages/agents-desktop/src/cloud/auth-injection.ts index 4549302e97..0f1f299b3e 100644 --- a/packages/agents-desktop/src/cloud/auth-injection.ts +++ b/packages/agents-desktop/src/cloud/auth-injection.ts @@ -57,12 +57,13 @@ export function buildCloudAuthHeaders( ): Record | null { const server = findCloudServerForUrl(deps.getServers(), url) if (!server || !server.tenantId) return null + const cloudAuthState = deps.getCloudAuthState() + if (cloudAuthState?.status !== `signed-in`) return null const token = deps.getAgentsToken(server.tenantId) if (!token) return null const headers: Record = { Authorization: `Bearer ${token}`, } - const cloudAuthState = deps.getCloudAuthState() if (cloudAuthState?.userId) { headers[`x-electric-asserted-user-id`] = cloudAuthState.userId } diff --git a/packages/agents-desktop/src/cloud/cloud-agent-servers.ts b/packages/agents-desktop/src/cloud/cloud-agent-servers.ts index 311937319e..555a1a1e24 100644 --- a/packages/agents-desktop/src/cloud/cloud-agent-servers.ts +++ b/packages/agents-desktop/src/cloud/cloud-agent-servers.ts @@ -253,13 +253,13 @@ export class CloudAgentServers { tenantId: string ): Promise<{ url: string; tenantId: string }> { const url = cloudAgentServerUrl(tenantId) - const cached = this.getAgentsToken(tenantId) - if (cached) return { url, tenantId } - const token = await this.cloudAuth.getToken() if (!token) { throw new Error(`Not signed in to Electric Cloud`) } + + const cached = this.getAgentsToken(tenantId) + if (cached) return { url, tenantId } const agentsToken = await this.fetchAgentsToken(tenantId, token) this.agentsTokens.set(tenantId, agentsToken) await this.secretStore.set(`${TOKEN_REF_PREFIX}${tenantId}`, agentsToken) diff --git a/packages/agents-desktop/src/runtime/lifecycle.ts b/packages/agents-desktop/src/runtime/lifecycle.ts index 6d00d35173..5297eb51b1 100644 --- a/packages/agents-desktop/src/runtime/lifecycle.ts +++ b/packages/agents-desktop/src/runtime/lifecycle.ts @@ -204,6 +204,15 @@ export async function startRuntime( deps.refreshDesktopState() return } + + const cloudAuthState = deps.getCloudAuthState() + if (cloudAuthState?.status !== `signed-in`) { + entry.status = `error` + entry.lastError = `Sign in to Electric Cloud before connecting to ${activeServer.name}.` + deps.refreshDesktopState() + return + } + try { const prepared = await deps .getCloudAgentServers() @@ -213,18 +222,12 @@ export async function startRuntime( await deps.saveSettings() } } catch (err) { - const cachedToken = deps - .getCloudAgentServers() - .getAgentsToken(activeServer.tenantId) - if (!cachedToken) { - entry.status = `error` - entry.lastError = `Could not prepare cloud agents token for ${activeServer.name}: ${ - err instanceof Error ? err.message : String(err) - }` - deps.refreshDesktopState() - return - } - console.warn(`[agents-desktop] cloud agents token refresh failed:`, err) + entry.status = `error` + entry.lastError = `Could not prepare cloud agents token for ${activeServer.name}: ${ + err instanceof Error ? err.message : String(err) + }` + deps.refreshDesktopState() + return } } From e2228ec4d626b99d8c80b1df3432f3e26b148aae Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Tue, 2 Jun 2026 14:02:30 -0600 Subject: [PATCH 2/3] Add desktop changeset --- .changeset/gentle-cloud-runtimes.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/gentle-cloud-runtimes.md diff --git a/.changeset/gentle-cloud-runtimes.md b/.changeset/gentle-cloud-runtimes.md new file mode 100644 index 0000000000..417c6b0737 --- /dev/null +++ b/.changeset/gentle-cloud-runtimes.md @@ -0,0 +1,5 @@ +--- +"@electric-ax/agents-desktop": patch +--- + +Show a clear sign-in prompt when connecting an Electric Cloud server while signed out instead of surfacing pull-wake runner registration errors. From e306d09c5d0f45570a4f09e108a58f70236b5489 Mon Sep 17 00:00:00 2001 From: Kyle Mathews Date: Thu, 4 Jun 2026 15:51:32 -0600 Subject: [PATCH 3/3] Clear Cloud servers on desktop sign-out --- packages/agents-desktop/src/ipc/cloud.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/agents-desktop/src/ipc/cloud.ts b/packages/agents-desktop/src/ipc/cloud.ts index d91e313534..e54e4a915d 100644 --- a/packages/agents-desktop/src/ipc/cloud.ts +++ b/packages/agents-desktop/src/ipc/cloud.ts @@ -1,10 +1,15 @@ import { BrowserWindow, ipcMain } from 'electron' import type { CloudAgentServers } from '../cloud/cloud-agent-servers' import type { CloudAuth, CloudAuthProvider } from '../cloud/cloud-auth' +import type { ServerConfig } from '../shared/types' export type CloudIpcDeps = { + settings: { + servers: Array + } getCloudAuth: () => CloudAuth getCloudAgentServers: () => CloudAgentServers + forgetServer: (serverId: string) => Promise } export function registerCloudIpcHandlers(deps: CloudIpcDeps): void { @@ -20,6 +25,12 @@ export function registerCloudIpcHandlers(deps: CloudIpcDeps): void { ) ipcMain.handle(`desktop:cloud-auth-sign-out`, async () => { await deps.getCloudAuth().signOut() + const cloudServerIds = deps.settings.servers + .filter((server) => server.source === `electric-cloud`) + .map((server) => server.id) + for (const serverId of cloudServerIds) { + await deps.forgetServer(serverId) + } }) ipcMain.handle(`desktop:cloud-auth-open-dashboard`, () => { deps.getCloudAuth().openDashboard()