@openbuilder/cli 0.50.11 → 0.50.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/chunks/{auto-update-BvDYQPBr.js → auto-update-Cr7SnKwX.js} +3 -3
- package/dist/chunks/auto-update-Cr7SnKwX.js.map +1 -0
- package/dist/chunks/{cli-auth-DL098GpW.js → cli-auth-CHooQYR9.js} +3 -3
- package/dist/chunks/cli-auth-CHooQYR9.js.map +1 -0
- package/dist/chunks/{login-CxIFa4OV.js → login-XrUC43gE.js} +3 -3
- package/dist/chunks/login-XrUC43gE.js.map +1 -0
- package/dist/chunks/{logout-BeoZSsNe.js → logout-Dib2ZEQL.js} +2 -2
- package/dist/chunks/{logout-BeoZSsNe.js.map → logout-Dib2ZEQL.js.map} +1 -1
- package/dist/chunks/{main-tui-CI-fhhsm.js → main-tui-1ygCKH67.js} +2 -2
- package/dist/chunks/{main-tui-CI-fhhsm.js.map → main-tui-1ygCKH67.js.map} +1 -1
- package/dist/chunks/{run-CXf8t7aQ.js → run-ImqaRH0K.js} +2 -2
- package/dist/chunks/{run-CXf8t7aQ.js.map → run-ImqaRH0K.js.map} +1 -1
- package/dist/chunks/{upgrade-BXI69MKW.js → upgrade-CKjl4HlB.js} +2 -2
- package/dist/chunks/upgrade-CKjl4HlB.js.map +1 -0
- package/dist/cli/index.js +8 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/instrument.js +2 -0
- package/dist/instrument.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/auto-update-BvDYQPBr.js.map +0 -1
- package/dist/chunks/cli-auth-DL098GpW.js.map +0 -1
- package/dist/chunks/login-CxIFa4OV.js.map +0 -1
- package/dist/chunks/upgrade-BXI69MKW.js.map +0 -1
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update-BvDYQPBr.js","sources":["../../src/cli/utils/auto-update.ts"],"sourcesContent":["/**\n * Auto-update utility for OpenBuilder CLI\n * \n * Checks GitHub Releases for newer versions and automatically\n * updates both:\n * 1. The CLI itself (globally installed npm package)\n * 2. The app/monorepo (local installation that runs the web app)\n */\n\nimport { execSync, spawnSync } from 'node:child_process';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport pc from 'picocolors';\nimport { configManager } from './config-manager.js';\n\n// GitHub API endpoint for releases\nconst GITHUB_RELEASES_URL = 'https://api.github.com/repos/codyde/openbuilder/releases/latest';\n\n// Install command for CLI\nconst INSTALL_COMMAND = 'curl -fsSL https://openbuilder.app/install | bash';\n\n// Cache settings\nconst CACHE_DIR = join(homedir(), '.config', 'openbuilder');\nconst CACHE_FILE = join(CACHE_DIR, 'update-cache.json');\nconst CACHE_TTL_MS = 60 * 60 * 1000; // 1 hour\n\ninterface UpdateCache {\n lastCheck: number;\n latestVersion: string;\n // Track if we need to upgrade the app after CLI update\n pendingAppUpgrade?: boolean;\n}\n\n/**\n * Read the update cache file\n */\nfunction readUpdateCache(): UpdateCache | null {\n try {\n if (existsSync(CACHE_FILE)) {\n const content = readFileSync(CACHE_FILE, 'utf-8');\n return JSON.parse(content);\n }\n } catch {\n // Cache read failed, that's fine\n }\n return null;\n}\n\n/**\n * Write to the update cache file\n */\nfunction saveUpdateCache(cache: UpdateCache): void {\n try {\n if (!existsSync(CACHE_DIR)) {\n mkdirSync(CACHE_DIR, { recursive: true });\n }\n writeFileSync(CACHE_FILE, JSON.stringify(cache, null, 2));\n } catch {\n // Cache write failed, that's fine\n }\n}\n\n/**\n * Fetch the latest release version from GitHub\n * Returns version string (e.g., \"0.28.0\") or null on failure\n */\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000); // 5s timeout\n\n const response = await fetch(GITHUB_RELEASES_URL, {\n headers: {\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'OpenBuilder-CLI-AutoUpdate',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as { tag_name: string };\n // Remove 'v' prefix if present (e.g., \"v0.28.0\" -> \"0.28.0\")\n return data.tag_name.replace(/^v/, '');\n } catch {\n // Network error, timeout, or parse error\n return null;\n }\n}\n\n/**\n * Compare two semver versions\n * Returns true if version1 < version2 (i.e., version2 is newer)\n */\nfunction isNewerVersion(current: string, latest: string): boolean {\n const parseVersion = (v: string) => {\n const parts = v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0);\n return { major: parts[0] || 0, minor: parts[1] || 0, patch: parts[2] || 0 };\n };\n\n const c = parseVersion(current);\n const l = parseVersion(latest);\n\n if (l.major > c.major) return true;\n if (l.major < c.major) return false;\n if (l.minor > c.minor) return true;\n if (l.minor < c.minor) return false;\n return l.patch > c.patch;\n}\n\n/**\n * Perform the CLI update by running the install script\n */\nfunction performCLIUpdate(): boolean {\n try {\n // Run the install command with quiet mode to avoid banner spam\n execSync(INSTALL_COMMAND, {\n stdio: 'inherit',\n shell: '/bin/bash',\n env: {\n ...process.env,\n OPENBUILDER_QUIET_INSTALL: '1', // Suppress banner in installer\n },\n });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if the app/monorepo needs upgrading and perform the upgrade\n * This updates the local OpenBuilder installation that runs the web app\n */\nfunction performAppUpgrade(): boolean {\n const config = configManager.get();\n const monorepoPath = config.monorepoPath;\n\n // No monorepo configured, skip app upgrade\n if (!monorepoPath || !existsSync(monorepoPath)) {\n return true; // Not an error, just nothing to upgrade\n }\n\n console.log();\n console.log(` ${pc.cyan('⬆')} ${pc.bold('Upgrading app installation...')}`);\n console.log(` ${pc.dim(monorepoPath)}`);\n console.log();\n\n try {\n // Run openbuilder upgrade --force to upgrade the monorepo\n // Use --force to skip prompts since we're in auto-update mode\n const result = spawnSync('openbuilder', ['upgrade', '--force'], {\n stdio: 'inherit',\n env: {\n ...process.env,\n OPENBUILDER_SKIP_UPDATE_CHECK: '1', // Don't re-check for CLI updates\n },\n shell: true,\n });\n\n return result.status === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Re-launch the CLI with original arguments after update\n */\nfunction relaunchCLI(): void {\n const args = process.argv.slice(2);\n \n try {\n // Get the actual path to openbuilder to avoid shell hash caching issues\n // This ensures we run the newly installed version, not a cached path\n let openbuilderPath = 'openbuilder';\n try {\n // Use 'command -v' to get the actual path, bypassing shell hash\n openbuilderPath = execSync('command -v openbuilder', { encoding: 'utf-8' }).trim();\n } catch {\n // Fallback to just 'openbuilder' if command -v fails\n }\n \n // Use spawnSync with the explicit path to ensure we get the new version\n const result = spawnSync(openbuilderPath, args, {\n stdio: 'inherit',\n env: { \n ...process.env, \n OPENBUILDER_SKIP_UPDATE_CHECK: '1', // Prevent update loop\n OPENBUILDER_SKIP_BANNER: '1', // Suppress banner after restart (already shown before update)\n },\n // Don't use shell: true to avoid shell hash caching\n });\n \n // Exit with the same code as the relaunched process\n process.exit(result.status ?? 0);\n } catch {\n // If relaunch fails, just exit - user can run command again\n process.exit(0);\n }\n}\n\n/**\n * Main auto-update check function\n * Call this early in CLI startup\n * \n * Updates both:\n * 1. The CLI itself (globally installed)\n * 2. The app/monorepo (if configured)\n * \n * @param currentVersion - Current CLI version from package.json\n * @returns true if update was performed and CLI should exit\n */\nexport async function checkAndAutoUpdate(currentVersion: string): Promise<boolean> {\n // Skip if update check is disabled via env var\n if (process.env.OPENBUILDER_NO_UPDATE === '1' || process.env.OPENBUILDER_SKIP_UPDATE_CHECK === '1') {\n // But check if we have a pending app upgrade from a previous CLI update\n const cache = readUpdateCache();\n if (cache?.pendingAppUpgrade) {\n console.log();\n console.log(` ${pc.cyan('⬆')} ${pc.bold('Completing app upgrade...')}`);\n \n const appSuccess = performAppUpgrade();\n \n if (appSuccess) {\n // Clear the pending flag\n saveUpdateCache({ ...cache, pendingAppUpgrade: false });\n console.log(` ${pc.green('✓')} ${pc.bold('App upgrade complete!')}`);\n } else {\n console.log(` ${pc.yellow('⚠')} ${pc.dim('App upgrade failed. Run manually:')} ${pc.cyan('openbuilder upgrade')}`);\n }\n console.log();\n }\n return false;\n }\n\n // Skip if disabled in config\n const config = configManager.get();\n if (config.autoUpdate === false) {\n return false;\n }\n\n let latestVersion: string | null = null;\n\n // Check cache first to avoid hitting GitHub API too often\n const cache = readUpdateCache();\n const now = Date.now();\n\n if (cache && (now - cache.lastCheck) < CACHE_TTL_MS) {\n // Use cached version\n latestVersion = cache.latestVersion;\n } else {\n // Fetch from GitHub (with timeout)\n latestVersion = await fetchLatestVersion();\n \n if (latestVersion) {\n // Update cache\n saveUpdateCache({\n lastCheck: now,\n latestVersion,\n });\n } else if (cache) {\n // Fetch failed, use stale cache\n latestVersion = cache.latestVersion;\n }\n }\n\n // If we couldn't determine latest version, skip update\n if (!latestVersion) {\n return false;\n }\n\n // Check if update is needed\n if (!isNewerVersion(currentVersion, latestVersion)) {\n return false;\n }\n\n // Update available! Show message and perform update\n console.log();\n console.log(` ${pc.cyan('⬆')} ${pc.bold('Update available:')} ${pc.dim(currentVersion)} → ${pc.green(latestVersion)}`);\n console.log();\n\n // Step 1: Update the CLI\n console.log(` ${pc.dim('Step 1/2:')} Updating CLI...`);\n const cliSuccess = performCLIUpdate();\n\n if (!cliSuccess) {\n // CLI update failed, continue with current version\n console.log();\n console.log(` ${pc.yellow('⚠')} ${pc.dim('CLI update failed. Continuing with current version.')}`);\n console.log(` ${pc.dim('You can manually update with:')} ${pc.cyan('curl -fsSL https://openbuilder.app/install | bash')}`);\n console.log();\n return false;\n }\n\n console.log(` ${pc.green('✓')} CLI updated to ${pc.green(latestVersion)}`);\n \n // Step 2: Check if we need to upgrade the app\n const monorepoPath = config.monorepoPath;\n const hasMonorepo = monorepoPath && existsSync(monorepoPath);\n\n if (hasMonorepo) {\n // Mark that we need to upgrade the app after CLI restart\n // The new CLI version will handle the app upgrade\n saveUpdateCache({\n lastCheck: now,\n latestVersion,\n pendingAppUpgrade: true,\n });\n \n console.log();\n console.log(` ${pc.dim('Step 2/2:')} App upgrade will continue after restart...`);\n }\n\n console.log();\n console.log(` ${pc.green('✓')} ${pc.bold('CLI update complete!')} Restarting...`);\n console.log();\n \n // Relaunch CLI with original args\n // The new CLI will pick up the pendingAppUpgrade flag and complete step 2\n relaunchCLI();\n \n return true; // CLI will exit via relaunchCLI\n}\n\n/**\n * Check for updates without auto-updating (for TUI modes)\n * Returns version info that can be displayed in the TUI\n * \n * @param currentVersion - Current CLI version from package.json\n * @returns Update info or null if no update available\n */\nexport async function checkForUpdate(currentVersion: string): Promise<{\n currentVersion: string;\n latestVersion: string;\n updateAvailable: boolean;\n} | null> {\n // Skip if update check is disabled via env var\n if (process.env.OPENBUILDER_NO_UPDATE === '1' || process.env.OPENBUILDER_SKIP_UPDATE_CHECK === '1') {\n return null;\n }\n\n // Skip if disabled in config\n const config = configManager.get();\n if (config.autoUpdate === false) {\n return null;\n }\n\n let latestVersion: string | null = null;\n\n // Check cache first to avoid hitting GitHub API too often\n const cache = readUpdateCache();\n const now = Date.now();\n\n if (cache && (now - cache.lastCheck) < CACHE_TTL_MS) {\n // Use cached version\n latestVersion = cache.latestVersion;\n } else {\n // Fetch from GitHub (with timeout)\n latestVersion = await fetchLatestVersion();\n \n if (latestVersion) {\n // Update cache\n saveUpdateCache({\n lastCheck: now,\n latestVersion,\n pendingAppUpgrade: cache?.pendingAppUpgrade,\n });\n } else if (cache) {\n // Fetch failed, use stale cache\n latestVersion = cache.latestVersion;\n }\n }\n\n // If we couldn't determine latest version, return null\n if (!latestVersion) {\n return null;\n }\n\n const updateAvailable = isNewerVersion(currentVersion, latestVersion);\n \n return {\n currentVersion,\n latestVersion,\n updateAvailable,\n };\n}\n\n/**\n * Clear the update cache (useful for testing or forcing a fresh check)\n */\nexport function clearUpdateCache(): void {\n try {\n if (existsSync(CACHE_FILE)) {\n unlinkSync(CACHE_FILE);\n }\n } catch {\n // Ignore errors\n }\n}\n\n/**\n * Get the current update status (for debugging/status commands)\n */\nexport function getUpdateStatus(): { \n cacheFile: string;\n cache: UpdateCache | null;\n monorepoPath: string | undefined;\n hasMonorepo: boolean;\n} {\n const config = configManager.get();\n const monorepoPath = config.monorepoPath;\n \n return {\n cacheFile: CACHE_FILE,\n cache: readUpdateCache(),\n monorepoPath,\n hasMonorepo: !!(monorepoPath && existsSync(monorepoPath)),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-auth-DL098GpW.js","sources":["../../src/cli/utils/cli-auth.ts"],"sourcesContent":["import http from 'node:http';\nimport { URL } from 'node:url';\nimport { hostname, platform } from 'node:os';\nimport { exec } from 'node:child_process';\nimport chalk from 'chalk';\nimport { configManager } from './config-manager.js';\n\n/**\n * Open a URL in the default browser (cross-platform)\n */\nasync function openBrowser(url: string): Promise<void> {\n const os = platform();\n \n return new Promise((resolve, reject) => {\n let command: string;\n \n switch (os) {\n case 'darwin':\n command = `open \"${url}\"`;\n break;\n case 'win32':\n command = `start \"\" \"${url}\"`;\n break;\n default: // Linux and others\n command = `xdg-open \"${url}\"`;\n }\n \n exec(command, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\ninterface AuthResult {\n success: boolean;\n token?: string;\n error?: string;\n}\n\ninterface CLIAuthOptions {\n apiUrl?: string;\n deviceName?: string;\n silent?: boolean;\n}\n\n/**\n * Find an available port for the callback server\n */\nasync function findAvailablePort(startPort: number = 9876, endPort: number = 9999): Promise<number> {\n for (let port = startPort; port <= endPort; port++) {\n const isAvailable = await new Promise<boolean>((resolve) => {\n const server = http.createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close();\n resolve(true);\n });\n server.listen(port, '127.0.0.1');\n });\n \n if (isAvailable) {\n return port;\n }\n }\n \n throw new Error('No available ports found for OAuth callback server');\n}\n\n/**\n * Get a device name for the runner key\n */\nfunction getDeviceName(): string {\n const host = hostname();\n const date = new Date().toLocaleDateString();\n return `CLI - ${host} - ${date}`;\n}\n\n/**\n * Start a local HTTP server to receive the OAuth callback\n */\nfunction startCallbackServer(port: number): Promise<AuthResult> {\n return new Promise((resolve) => {\n const server = http.createServer((req, res) => {\n const url = new URL(req.url || '/', `http://localhost:${port}`);\n \n if (url.pathname === '/callback') {\n const token = url.searchParams.get('token');\n const status = url.searchParams.get('status');\n const error = url.searchParams.get('error');\n \n // Send response to browser\n res.writeHead(200, { 'Content-Type': 'text/html' });\n \n if (status === 'success' && token) {\n res.end(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Authentication Successful</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: #09090b;\n color: white;\n }\n .container {\n text-align: center;\n padding: 40px;\n }\n .success {\n color: #22c55e;\n font-size: 48px;\n margin-bottom: 20px;\n }\n h1 { margin: 0 0 10px; }\n p { color: #a1a1aa; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"success\">✓</div>\n <h1>Authentication Successful!</h1>\n <p>You can close this window and return to your terminal.</p>\n </div>\n </body>\n </html>\n `);\n \n // Close server and resolve\n server.close();\n resolve({ success: true, token });\n } else {\n res.end(`\n <!DOCTYPE html>\n <html>\n <head>\n <title>Authentication Failed</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n margin: 0;\n background: #09090b;\n color: white;\n }\n .container {\n text-align: center;\n padding: 40px;\n }\n .error {\n color: #ef4444;\n font-size: 48px;\n margin-bottom: 20px;\n }\n h1 { margin: 0 0 10px; }\n p { color: #a1a1aa; }\n </style>\n </head>\n <body>\n <div class=\"container\">\n <div class=\"error\">✗</div>\n <h1>Authentication Failed</h1>\n <p>${error || 'An error occurred during authentication.'}</p>\n <p>Please close this window and try again.</p>\n </div>\n </body>\n </html>\n `);\n \n server.close();\n resolve({ success: false, error: error || 'Authentication failed' });\n }\n } else {\n // Handle other paths\n res.writeHead(404, { 'Content-Type': 'text/plain' });\n res.end('Not found');\n }\n });\n \n // Timeout after 5 minutes\n const timeout = setTimeout(() => {\n server.close();\n resolve({ success: false, error: 'Authentication timed out' });\n }, 5 * 60 * 1000);\n \n server.on('close', () => {\n clearTimeout(timeout);\n });\n \n // Handle server errors (e.g., port became unavailable due to race condition)\n server.on('error', (err: NodeJS.ErrnoException) => {\n clearTimeout(timeout);\n if (err.code === 'EADDRINUSE') {\n resolve({ success: false, error: `Port ${port} is no longer available. Please try again.` });\n } else {\n resolve({ success: false, error: `Server error: ${err.message}` });\n }\n });\n \n server.listen(port, '127.0.0.1');\n });\n}\n\n/**\n * Perform CLI OAuth authentication flow\n * \n * 1. Find an available port\n * 2. Start local callback server\n * 3. Request auth session from API\n * 4. Open browser to auth page\n * 5. Wait for callback\n * 6. Return token\n */\nexport async function performOAuthLogin(options: CLIAuthOptions = {}): Promise<AuthResult> {\n const apiUrl = options.apiUrl || 'https://openbuilder.app';\n const deviceName = options.deviceName || getDeviceName();\n const silent = options.silent || false;\n \n try {\n // Find available port\n if (!silent) {\n console.log(chalk.dim('Finding available port for callback...'));\n }\n const port = await findAvailablePort();\n \n // Start callback server before requesting auth (so it's ready when browser redirects)\n const callbackPromise = startCallbackServer(port);\n \n // Request auth session from API\n if (!silent) {\n console.log(chalk.dim('Initiating authentication...'));\n }\n \n const response = await fetch(`${apiUrl}/api/auth/cli/start`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n callbackPort: port,\n callbackHost: 'localhost',\n deviceName,\n }),\n });\n \n if (!response.ok) {\n const data = await response.json();\n return { success: false, error: data.error || 'Failed to start authentication' };\n }\n \n const { authUrl } = await response.json();\n \n // Open browser\n if (!silent) {\n console.log('');\n console.log(chalk.cyan('Opening browser for authentication...'));\n console.log(chalk.dim(`If the browser doesn't open, visit:`));\n console.log(chalk.underline(authUrl));\n console.log('');\n }\n \n try {\n await openBrowser(authUrl);\n } catch {\n // Browser failed to open - user will need to copy/paste URL\n if (!silent) {\n console.log(chalk.yellow('Could not open browser automatically.'));\n }\n }\n \n if (!silent) {\n console.log(chalk.yellow('Waiting for authentication...'));\n console.log(chalk.dim('(Press Ctrl+C to cancel)'));\n }\n \n // Wait for callback\n const result = await callbackPromise;\n \n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Authentication failed',\n };\n }\n}\n\n/**\n * Check if we have a valid stored token\n */\nexport function hasStoredToken(): boolean {\n const token = getStoredToken();\n return token !== null && token.startsWith('sv_');\n}\n\n/**\n * Get the stored runner token\n */\nexport function getStoredToken(): string | null {\n const config = configManager.get();\n \n // Check for runner token in config\n if (config.server?.secret && config.server.secret.startsWith('sv_')) {\n return config.server.secret;\n }\n \n // Legacy: check broker config\n if (config.broker?.secret && config.broker.secret.startsWith('sv_')) {\n return config.broker.secret;\n }\n \n return null;\n}\n\n/**\n * Store the runner token in config\n */\nexport function storeToken(token: string, apiUrl?: string): void {\n // Determine the WebSocket URL from the API URL\n let wsUrl = 'wss://openbuilder.app/ws/runner';\n if (apiUrl) {\n const url = new URL(apiUrl);\n const protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';\n wsUrl = `${protocol}//${url.host}/ws/runner`;\n }\n \n // Store in the server config\n configManager.set('server', {\n wsUrl,\n secret: token,\n });\n \n // Also set the apiUrl if provided\n if (apiUrl) {\n configManager.set('apiUrl', apiUrl);\n }\n}\n\n/**\n * Clear the stored token\n */\nexport function clearToken(): void {\n const config = configManager.get();\n \n // Clear server secret\n if (config.server) {\n configManager.set('server', {\n ...config.server,\n secret: '',\n });\n }\n \n // Clear legacy broker secret\n if (config.broker) {\n configManager.set('broker', {\n ...config.broker,\n secret: '',\n });\n }\n}\n\n/**\n * Validate the stored token against the server\n */\nexport async function validateToken(token: string, apiUrl: string): Promise<boolean> {\n try {\n // Try to fetch user's runner keys - this will fail if token is invalid\n const response = await fetch(`${apiUrl}/api/runner-keys`, {\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n \n return response.ok;\n } catch {\n return false;\n }\n}\n"],"names":["http"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-CxIFa4OV.js","sources":["../../src/cli/commands/login.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { performOAuthLogin, hasStoredToken, getStoredToken, storeToken } from '../utils/cli-auth.js';\nimport { logger } from '../utils/logger.js';\n\ninterface LoginOptions {\n url?: string;\n force?: boolean;\n}\n\n/**\n * Login command - authenticate with OpenBuilder via OAuth\n * \n * Usage:\n * openbuilder login [--url <server-url>] [--force]\n * \n * This command:\n * 1. Opens a browser for OAuth authentication (GitHub or Sentry)\n * 2. Creates a runner token automatically\n * 3. Stores the token locally for future use\n */\nexport async function loginCommand(options: LoginOptions = {}) {\n const apiUrl = options.url || 'https://openbuilder.app';\n \n logger.section('OpenBuilder Login');\n \n // Check if already logged in\n if (!options.force && hasStoredToken()) {\n const existingToken = getStoredToken();\n logger.info(`Already logged in with token: ${chalk.cyan(existingToken?.substring(0, 12) + '...')}`);\n logger.info('');\n logger.info('Use --force to re-authenticate, or run:');\n logger.info(` ${chalk.cyan('openbuilder logout')} to clear credentials`);\n logger.info(` ${chalk.cyan('openbuilder runner')} to start the runner`);\n return;\n }\n \n logger.info(`Server: ${chalk.cyan(apiUrl)}`);\n logger.info('');\n \n // Perform OAuth flow\n const result = await performOAuthLogin({\n apiUrl,\n silent: false,\n });\n \n if (result.success && result.token) {\n // Store the token\n storeToken(result.token, apiUrl);\n \n logger.log('');\n logger.success('Authentication successful!');\n logger.info('');\n logger.info(`Token stored: ${chalk.cyan(result.token.substring(0, 12) + '...')}`);\n logger.info('');\n logger.info('You can now run:');\n logger.info(` ${chalk.cyan('openbuilder runner')} to start the runner`);\n } else {\n logger.error(result.error || 'Authentication failed');\n process.exit(1);\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AASA;;;;;;;;;;AAUG;AACI,eAAe,YAAY,CAAC,UAAwB,EAAE,EAAA;AAC3D,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,yBAAyB;AAEvD,IAAA,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC;;IAGnC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,cAAc,EAAE,EAAE;AACtC,QAAA,MAAM,aAAa,GAAG,cAAc,EAAE;QACtC,MAAM,CAAC,IAAI,CAAC,CAAA,8BAAA,EAAiC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAA,CAAE,CAAC;AACnG,QAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACf,QAAA,MAAM,CAAC,IAAI,CAAC,yCAAyC,CAAC;AACtD,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA,qBAAA,CAAuB,CAAC;AACzE,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA,oBAAA,CAAsB,CAAC;QACxE;IACF;AAEA,IAAA,MAAM,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA,CAAE,CAAC;AAC5C,IAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;;AAGf,IAAA,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;QACrC,MAAM;AACN,QAAA,MAAM,EAAE,KAAK;AACd,KAAA,CAAC;IAEF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE;;AAElC,QAAA,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;AAEhC,QAAA,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACd,QAAA,MAAM,CAAC,OAAO,CAAC,4BAA4B,CAAC;AAC5C,QAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,CAAA,cAAA,EAAiB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAA,CAAE,CAAC;AACjF,QAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACf,QAAA,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;AAC/B,QAAA,MAAM,CAAC,IAAI,CAAC,CAAA,EAAA,EAAK,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA,oBAAA,CAAsB,CAAC;IAC1E;SAAO;QACL,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,uBAAuB,CAAC;AACrD,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade-BXI69MKW.js","sources":["../../src/cli/commands/upgrade.ts"],"sourcesContent":["/**\n * Upgrade command - In-place upgrade to latest version\n * \n * This command upgrades both:\n * 1. The CLI itself (globally installed npm package)\n * 2. The app/monorepo (local installation that runs the web app)\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, renameSync, copyFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { CLIError, errors } from '../utils/cli-error.js';\nimport { isInsideMonorepo } from '../utils/repo-detector.js';\nimport { configManager } from '../utils/config-manager.js';\n\n// GitHub API endpoint for releases\nconst GITHUB_RELEASES_URL = 'https://api.github.com/repos/codyde/openbuilder/releases/latest';\n\n// Install command for CLI\nconst INSTALL_COMMAND = 'curl -fsSL https://openbuilder.app/install | bash';\n\ninterface UpgradeOptions {\n branch?: string;\n force?: boolean;\n}\n\ninterface EnvBackup {\n runner: { env?: string; envLocal?: string };\n openbuilder: { env?: string; envLocal?: string };\n}\n\n/**\n * Fetch the latest release version from GitHub\n */\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(GITHUB_RELEASES_URL, {\n headers: {\n 'Accept': 'application/vnd.github.v3+json',\n 'User-Agent': 'OpenBuilder-CLI-Upgrade',\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return null;\n }\n\n const data = await response.json() as { tag_name: string };\n return data.tag_name.replace(/^v/, '');\n } catch {\n return null;\n }\n}\n\n/**\n * Compare two semver versions\n * Returns true if version1 < version2 (i.e., version2 is newer)\n */\nfunction isNewerVersion(current: string, latest: string): boolean {\n const parseVersion = (v: string) => {\n const parts = v.replace(/^v/, '').split('.').map(n => parseInt(n, 10) || 0);\n return { major: parts[0] || 0, minor: parts[1] || 0, patch: parts[2] || 0 };\n };\n\n const c = parseVersion(current);\n const l = parseVersion(latest);\n\n if (l.major > c.major) return true;\n if (l.major < c.major) return false;\n if (l.minor > c.minor) return true;\n if (l.minor < c.minor) return false;\n return l.patch > c.patch;\n}\n\n/**\n * Perform the CLI update by running the install script\n */\nfunction performCLIUpdate(): boolean {\n try {\n execSync(INSTALL_COMMAND, {\n stdio: 'inherit',\n shell: '/bin/bash',\n env: {\n ...process.env,\n OPENBUILDER_QUIET_INSTALL: '1',\n },\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function upgradeCommand(options: UpgradeOptions) {\n const s = p.spinner();\n \n // Get current CLI version\n let currentVersion = '0.0.0';\n try {\n // Try to find package.json by traversing up\n let searchDir = dirname(new URL(import.meta.url).pathname);\n for (let i = 0; i < 5; i++) {\n const pkgPath = join(searchDir, 'package.json');\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n currentVersion = pkg.version || '0.0.0';\n break;\n }\n searchDir = dirname(searchDir);\n }\n } catch {\n // Ignore errors reading package.json\n }\n \n // ========================================\n // STEP 1: Always update CLI automatically\n // ========================================\n s.start('Checking for CLI updates');\n \n const latestVersion = await fetchLatestVersion();\n \n if (latestVersion && isNewerVersion(currentVersion, latestVersion)) {\n s.stop(pc.cyan('⬆') + ` CLI update available: ${pc.dim(currentVersion)} → ${pc.green(latestVersion)}`);\n \n console.log();\n console.log(` ${pc.dim('Updating CLI...')}`);\n \n const cliSuccess = performCLIUpdate();\n \n if (cliSuccess) {\n console.log(` ${pc.green('✓')} CLI updated to ${pc.green(latestVersion)}`);\n console.log();\n } else {\n console.log(` ${pc.yellow('⚠')} CLI update failed`);\n console.log(` ${pc.dim('Run manually:')} ${pc.cyan(INSTALL_COMMAND)}`);\n console.log();\n }\n } else if (latestVersion) {\n s.stop(pc.green('✓') + ` CLI is up to date (${currentVersion})`);\n } else {\n s.stop(pc.yellow('⚠') + ' Could not check for CLI updates');\n }\n\n // ========================================\n // STEP 2: Find app installation and prompt\n // ========================================\n s.start('Locating OpenBuilder app installation');\n\n let monorepoRoot: string | undefined;\n const config = configManager.get();\n\n // Try config first\n if (config.monorepoPath && existsSync(config.monorepoPath)) {\n monorepoRoot = config.monorepoPath;\n }\n\n // Try detection if not in config\n if (!monorepoRoot) {\n const repoCheck = await isInsideMonorepo();\n if (repoCheck.inside && repoCheck.root) {\n monorepoRoot = repoCheck.root;\n }\n }\n\n if (!monorepoRoot) {\n s.stop(pc.dim('ℹ') + ' No OpenBuilder app installation found');\n console.log();\n console.log(pc.dim(' The CLI has been updated. No local app installation to upgrade.'));\n console.log(pc.dim(' Run ') + pc.cyan('openbuilder init') + pc.dim(' to set up a local installation.'));\n console.log();\n return;\n }\n\n s.stop(pc.green('✓') + ` Found app installation`);\n \n // Prompt user about upgrading the app\n console.log();\n console.log(` ${pc.bold('App installation found:')}`);\n console.log(` ${pc.cyan(monorepoRoot)}`);\n console.log();\n \n // Skip prompt if --force is used\n if (!options.force) {\n const shouldUpgradeApp = await p.confirm({\n message: 'Would you like to upgrade the app installation as well?',\n initialValue: true,\n });\n \n if (p.isCancel(shouldUpgradeApp) || !shouldUpgradeApp) {\n console.log();\n console.log(pc.dim(' Skipping app upgrade. CLI has been updated.'));\n console.log();\n return;\n }\n }\n \n console.log();\n\n // Check git status before upgrading\n if (!options.force) {\n s.start('Checking for uncommitted changes');\n\n try {\n const gitStatus = execSync('git status --porcelain', {\n cwd: monorepoRoot,\n encoding: 'utf-8',\n }).trim();\n\n if (gitStatus.length > 0) {\n s.stop(pc.yellow('⚠') + ' Uncommitted changes detected');\n\n const changes = gitStatus.split('\\n').slice(0, 5);\n console.log(pc.dim(' Modified files:'));\n changes.forEach(line => console.log(pc.dim(` ${line}`)));\n\n if (!options.force) {\n const confirm = await p.confirm({\n message: 'Continue upgrade? This will discard local changes.',\n initialValue: false,\n });\n\n if (!confirm || p.isCancel(confirm)) {\n console.log(pc.dim('\\nUpgrade cancelled'));\n process.exit(0);\n }\n }\n } else {\n s.stop(pc.green('✓') + ' No uncommitted changes');\n }\n } catch (error) {\n s.stop(pc.yellow('⚠') + ' Not a git repository');\n // Continue anyway - user might have extracted from tarball\n }\n }\n\n // Backup configuration files\n s.start('Backing up configuration files');\n\n const envBackup: EnvBackup = {\n runner: {},\n openbuilder: {},\n };\n\n // Define paths to check\n const envPaths = [\n { app: 'runner', path: join(monorepoRoot, 'apps/runner/.env') },\n { app: 'runner', pathLocal: join(monorepoRoot, 'apps/runner/.env.local') },\n { app: 'openbuilder', path: join(monorepoRoot, 'apps/openbuilder/.env') },\n { app: 'openbuilder', pathLocal: join(monorepoRoot, 'apps/openbuilder/.env.local') },\n ];\n\n let backedUpCount = 0;\n\n for (const item of envPaths) {\n const app = item.app as keyof EnvBackup;\n const filePath = item.path || item.pathLocal!;\n const isLocal = !!item.pathLocal;\n\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, 'utf-8');\n if (isLocal) {\n envBackup[app].envLocal = content;\n } else {\n envBackup[app].env = content;\n }\n backedUpCount++;\n }\n }\n\n s.stop(pc.green('✓') + ` Backed up ${backedUpCount} configuration file(s)`);\n\n // Determine branch and clone\n const branch = options.branch || 'main';\n\n s.start(`Cloning fresh copy from ${pc.cyan(branch)}`);\n\n const parentDir = dirname(monorepoRoot);\n const repoName = monorepoRoot.split('/').pop();\n const tempDir = join(parentDir, `${repoName}-upgrade-temp`);\n\n // Remove temp directory if it exists from failed previous upgrade\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n try {\n execSync(\n `git clone --branch ${branch} --depth 1 https://github.com/codyde/openbuilder.git \"${tempDir}\"`,\n {\n cwd: parentDir,\n stdio: 'pipe', // Silent\n }\n );\n\n s.stop(pc.green('✓') + ' Cloned successfully');\n } catch (error) {\n s.stop(pc.red('✗') + ' Clone failed');\n\n // Cleanup temp dir\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n throw new CLIError({\n code: 'UPGRADE_CLONE_FAILED',\n message: `Failed to clone branch \"${branch}\"`,\n suggestions: [\n 'Check your internet connection',\n 'Verify the branch exists: https://github.com/codyde/openbuilder/tree/' + branch,\n 'Try upgrading to main: openbuilder upgrade',\n ],\n });\n }\n\n // Restore configuration files\n s.start('Restoring configuration files');\n\n let restoredCount = 0;\n\n const restorePaths = [\n { app: 'runner' as const, file: '.env', dir: join(tempDir, 'apps/runner') },\n { app: 'runner' as const, file: '.env.local', dir: join(tempDir, 'apps/runner') },\n { app: 'openbuilder' as const, file: '.env', dir: join(tempDir, 'apps/openbuilder') },\n { app: 'openbuilder' as const, file: '.env.local', dir: join(tempDir, 'apps/openbuilder') },\n ];\n\n for (const item of restorePaths) {\n const isLocal = item.file === '.env.local';\n const backupContent = isLocal ? envBackup[item.app].envLocal : envBackup[item.app].env;\n\n if (backupContent) {\n const targetPath = join(item.dir, item.file);\n writeFileSync(targetPath, backupContent, 'utf-8');\n restoredCount++;\n }\n }\n\n s.stop(pc.green('✓') + ` Restored ${restoredCount} configuration file(s)`);\n\n // Install dependencies\n s.start('Installing dependencies');\n\n try {\n execSync('pnpm install', {\n cwd: tempDir,\n stdio: 'pipe',\n env: { ...process.env, TURBO_TELEMETRY_DISABLED: '1' },\n });\n\n s.stop(pc.green('✓') + ' Dependencies installed');\n } catch (error) {\n s.stop(pc.red('✗') + ' Dependency installation failed');\n\n // Cleanup\n rmSync(tempDir, { recursive: true, force: true });\n\n throw new CLIError({\n code: 'UPGRADE_INSTALL_FAILED',\n message: 'Failed to install dependencies in new version',\n suggestions: [\n 'Check if the branch is stable',\n 'Try upgrading to main instead',\n 'Check disk space',\n ],\n });\n }\n\n // Build services\n s.start('Building services (this may take a moment)');\n\n try {\n execSync('pnpm turbo build', {\n cwd: tempDir,\n stdio: 'pipe',\n env: { ...process.env, TURBO_TELEMETRY_DISABLED: '1' },\n });\n\n s.stop(pc.green('✓') + ' Build successful');\n } catch (error) {\n s.stop(pc.red('✗') + ' Build failed');\n\n // Try to extract error message from execSync error\n let errorOutput = '';\n if (error && typeof error === 'object' && 'stderr' in error) {\n errorOutput = String((error as { stderr?: unknown }).stderr || '');\n }\n if (!errorOutput && error && typeof error === 'object' && 'stdout' in error) {\n errorOutput = String((error as { stdout?: unknown }).stdout || '');\n }\n\n // Show error details if available\n if (errorOutput) {\n console.log(pc.red('\\nBuild errors:'));\n console.log(pc.gray('─'.repeat(60)));\n const lines = errorOutput.split('\\n').slice(-20);\n lines.forEach(line => console.log(pc.red(` ${line}`)));\n console.log(pc.gray('─'.repeat(60)));\n console.log('');\n }\n\n // Cleanup\n rmSync(tempDir, { recursive: true, force: true });\n\n throw new CLIError({\n code: 'UPGRADE_BUILD_FAILED',\n message: 'Failed to build new version',\n suggestions: [\n 'The branch may have build errors',\n 'Try upgrading to a stable release tag',\n 'Check build logs for errors',\n ],\n });\n }\n\n // Apply database migrations (if DATABASE_URL exists)\n const databaseUrl =\n envBackup.openbuilder.env?.match(/DATABASE_URL=[\"']?([^\"'\\n]+)[\"']?/)?.[1] ||\n envBackup.openbuilder.envLocal?.match(/DATABASE_URL=[\"']?([^\"'\\n]+)[\"']?/)?.[1] ||\n process.env.DATABASE_URL;\n\n if (databaseUrl) {\n s.start('Applying database migrations');\n\n try {\n execSync('npx drizzle-kit push --config=drizzle.config.ts', {\n cwd: join(tempDir, 'apps/openbuilder'),\n stdio: 'pipe',\n env: {\n ...process.env,\n DATABASE_URL: databaseUrl,\n },\n });\n\n s.stop(pc.green('✓') + ' Database schema updated');\n } catch (error) {\n s.stop(pc.yellow('⚠') + ' Migration failed');\n console.log(pc.dim(' You may need to run: openbuilder database'));\n console.log(pc.dim(' This won\\'t prevent the upgrade from completing'));\n }\n } else {\n s.start('Skipping database migrations (no DATABASE_URL found)');\n s.stop(pc.yellow('⚠') + ' No database configured');\n }\n\n // Swap directories (atomic operation)\n s.start('Finalizing upgrade');\n\n const backupDir = join(parentDir, `${repoName}-backup-${Date.now()}`);\n\n try {\n // Rename current installation to backup\n renameSync(monorepoRoot, backupDir);\n\n // Rename new installation to production\n renameSync(tempDir, monorepoRoot);\n\n s.stop(pc.green('✓') + ' Upgrade finalized');\n } catch (error) {\n s.stop(pc.red('✗') + ' Failed to swap directories');\n\n // Attempt recovery\n try {\n if (existsSync(backupDir)) {\n renameSync(backupDir, monorepoRoot);\n console.log(pc.yellow('⚠') + ' Restored original installation');\n }\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n } catch (recoveryError) {\n console.error(pc.red('❌') + ' Failed to recover. Manual intervention required.');\n console.error(pc.dim(` Backup location: ${backupDir}`));\n }\n\n throw error;\n }\n\n // Cleanup backup\n s.start('Cleaning up');\n\n try {\n rmSync(backupDir, { recursive: true, force: true });\n s.stop(pc.green('✓') + ' Cleanup complete');\n } catch (error) {\n s.stop(pc.yellow('⚠') + ' Could not remove backup');\n console.log(pc.dim(` You can manually delete: ${backupDir}`));\n }\n\n // Success!\n console.log();\n console.log(pc.green('✓') + pc.bold(' Upgrade complete!'));\n console.log();\n\n // Check if user is currently inside the monorepo directory\n const currentDir = process.cwd();\n const isCurrentlyInMonorepo = currentDir.startsWith(monorepoRoot);\n\n if (isCurrentlyInMonorepo) {\n console.log(pc.yellow('⚠') + pc.bold(' IMPORTANT: Your shell directory is stale'));\n console.log();\n console.log(pc.dim(' The upgrade renamed directories while you were inside them.'));\n console.log(pc.dim(' You need to refresh your shell location:'));\n console.log();\n console.log(pc.cyan(' cd .. && cd ' + monorepoRoot.split('/').pop()));\n console.log();\n console.log(pc.dim(' Or simply close and reopen your terminal.'));\n console.log();\n }\n\n console.log(pc.dim(' Note: Restart your terminal to use the updated CLI'));\n console.log(pc.dim(' Or run: hash -r'));\n console.log();\n\n if (branch !== 'main') {\n console.log(pc.yellow('⚠') + ` You upgraded to branch: ${pc.cyan(branch)}`);\n console.log(pc.dim(' To return to main: openbuilder upgrade'));\n console.log();\n }\n}\n"],"names":[],"mappings":"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"}
|