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. diff --git a/packages/agents-desktop/src/cloud/cloud-agent-servers.ts b/packages/agents-desktop/src/cloud/cloud-agent-servers.ts index 4a98c9cf76..ead7741175 100644 --- a/packages/agents-desktop/src/cloud/cloud-agent-servers.ts +++ b/packages/agents-desktop/src/cloud/cloud-agent-servers.ts @@ -263,6 +263,9 @@ export class CloudAgentServers { 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/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() diff --git a/packages/agents-desktop/src/runtime/lifecycle.ts b/packages/agents-desktop/src/runtime/lifecycle.ts index fdefba0c47..c3453af354 100644 --- a/packages/agents-desktop/src/runtime/lifecycle.ts +++ b/packages/agents-desktop/src/runtime/lifecycle.ts @@ -205,6 +205,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() @@ -214,18 +223,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 } }