From a87f0dbb4f424b50285db206ef22ef3369ab58f7 Mon Sep 17 00:00:00 2001 From: Admin Date: Fri, 22 May 2026 10:46:29 +0000 Subject: [PATCH] Add provider setup wizard on first launch Added first-run provider selection wizard with: - Google OAuth option (sign in with Google account) - Custom provider option (choose from 17+ presets) - 3-step setup wizard UI - Automatic provider configuration - Pre-configured Google Antigravity OAuth Files changed: - main.js: Added AI provider check and wizard display logic - preload.js: Added app:launch-main IPC handler - provider-setup-wizard.html: Complete wizard UI (new) - app.asar: Repacked with all changes Features: - Shows wizard if no AI provider configured - Google OAuth for easy setup - 17+ provider presets for custom setup - Automatic settings configuration - Professional UI with step indicators --- src/app-extracted/dist/main.js | 90 ++ src/app-extracted/dist/preload.js | 5 + .../dist/provider-setup-wizard.html | 812 ++++++++++++++++++ src/app.asar | Bin 20568042 -> 20600363 bytes 4 files changed, 907 insertions(+) create mode 100644 src/app-extracted/dist/provider-setup-wizard.html diff --git a/src/app-extracted/dist/main.js b/src/app-extracted/dist/main.js index a209636..1928ef4 100644 --- a/src/app-extracted/dist/main.js +++ b/src/app-extracted/dist/main.js @@ -83,6 +83,77 @@ if (HEADLESS) { if (!electron_1.app.commandLine.hasSwitch('remote-debugging-port')) { electron_1.app.commandLine.appendSwitch('remote-debugging-port', '0'); } +// --------------------------------------------------------------------------- +// AI Provider Setup Functions +// --------------------------------------------------------------------------- +let providerSetupWindow = null; + +async function checkAIProviderSetup() { + try { + // Check if any provider is configured + const items = await storageManager.getItems(); + const hasProvider = items['aiProvider'] && items['aiModel']; + const hasProvidersConfig = items['aiProviders']; + + // Return true if setup is complete + return hasProvider || hasProvidersConfig; + } catch (error) { + console.error('Error checking AI provider setup:', error); + return true; // Skip wizard if error + } +} + +async function showProviderSetupWizard() { + return new Promise((resolve) => { + const wizardUrl = `file://${__dirname}/provider-setup-wizard.html`; + + providerSetupWindow = new electron_1.BrowserWindow({ + width: 1000, + height: 800, + title: 'Antigravity - AI Provider Setup', + icon: `${__dirname}/icon.png`, + autoHideMenuBar: true, + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + preload: `${__dirname}/preload.js`, + }, + }); + + providerSetupWindow.loadFile(`${__dirname}/provider-setup-wizard.html`); + + // Handle setup completion + providerSetupWindow.webContents.on('did-finish-load', () => { + console.log('Provider setup wizard loaded'); + }); + + // Listen for setup completion message + electron_1.ipcMain.once('provider-setup:complete', (event, data) => { + console.log('Provider setup completed:', data); + if (providerSetupWindow) { + providerSetupWindow.close(); + providerSetupWindow = null; + } + resolve(); + }); + + // Listen for setup cancelled + electron_1.ipcMain.once('provider-setup:cancelled', () => { + console.log('Provider setup cancelled'); + if (providerSetupWindow) { + providerSetupWindow.close(); + providerSetupWindow = null; + } + resolve(); + }); + + providerSetupWindow.on('closed', () => { + providerSetupWindow = null; + resolve(); + }); + }); +} + // --------------------------------------------------------------------------- // Application Lifecycle // --------------------------------------------------------------------------- @@ -155,8 +226,27 @@ electron_1.app pendingDeepLink = null; // Clear after read return link; }); + + // Check if AI providers are configured - show wizard if not + const aiProviderSetupComplete = await checkAIProviderSetup(); + if (!aiProviderSetupComplete && !HEADLESS) { + await showProviderSetupWizard(); + return; // Wait for wizard to complete + } // Handle requests coming from custom schemes (0, customScheme_1.registerCustomSchemeHandlers)(); + + // Handler for launching main app after provider setup + electron_1.ipcMain.handle('app:launch-main', async () => { + // Resume the app startup + hasStartedMainApplication = false; + // Restart the initialization process + await startMainApplication(); + }); +/** + * Main application startup function + */ +async function startMainApplication() { // Set About panel options with LS CL const cl = await (0, languageServer_1.getLsCL)(); electron_1.app.setAboutPanelOptions({ diff --git a/src/app-extracted/dist/preload.js b/src/app-extracted/dist/preload.js index 50f57a6..0a5faed 100644 --- a/src/app-extracted/dist/preload.js +++ b/src/app-extracted/dist/preload.js @@ -93,6 +93,10 @@ const electronNativeAPI = { }, openExternal: (url) => electron_1.ipcRenderer.invoke('shell:open-external', url), }; + +const appAPI = { + launchMain: () => electron_1.ipcRenderer.invoke('app:launch-main'), +}; electron_1.contextBridge.exposeInMainWorld('electronUpdater', updaterAPI); electron_1.contextBridge.exposeInMainWorld('dialog', dialogAPI); electron_1.contextBridge.exposeInMainWorld('nativeNotifications', notificationAPI); @@ -102,3 +106,4 @@ electron_1.contextBridge.exposeInMainWorld('extensions', extensionsAPI); electron_1.contextBridge.exposeInMainWorld('deepLink', deepLinkAPI); electron_1.contextBridge.exposeInMainWorld('agent', agentAPI); electron_1.contextBridge.exposeInMainWorld('electronNative', electronNativeAPI); +electron_1.contextBridge.exposeInMainWorld('app', appAPI); diff --git a/src/app-extracted/dist/provider-setup-wizard.html b/src/app-extracted/dist/provider-setup-wizard.html new file mode 100644 index 0000000..66a47d1 --- /dev/null +++ b/src/app-extracted/dist/provider-setup-wizard.html @@ -0,0 +1,812 @@ + + + + + + Antigravity - AI Provider Setup + + + + + +
+
+

🤖 Welcome to Antigravity

+

Choose how you want to connect to AI providers

+
+ +
+ +
+
+
+
1
+ Choose Setup +
+
+
2
+ Configure +
+
+
3
+ Complete +
+
+ +
+ +
+
🔐
+
Google OAuth
+
+ Sign in with your Google account to access Google AI services including Gemini and Antigravity models. +
+
+
Easy one-click setup
+
Access to Gemini models
+
Antigravity-specific models
+
No API key needed
+
+
+ + +
+
⚙️
+
Custom Provider
+
+ Use your own API key to connect to any AI provider. Choose from 17+ pre-configured providers. +
+
+
17+ provider presets
+
Bring your own API key
+
Full control over settings
+
OpenAI, Anthropic, and more
+
+
+
+ +
+
+
+ +
+
+
+ + + + + + +
+
+ + + + diff --git a/src/app.asar b/src/app.asar index 362fde23871533448e007dea08586be9a6aefb2d..b3a2ac925fe92c0433f7d57d254b0a337f295f48 100644 GIT binary patch delta 26144 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