@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/README.md
CHANGED
|
@@ -18,7 +18,7 @@ The OpenBuilder CLI is a command-line tool for building AI-powered applications
|
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
20
|
# Install via curl
|
|
21
|
-
curl -fsSL https://openbuilder.
|
|
21
|
+
curl -fsSL https://openbuilder.sh/install | bash
|
|
22
22
|
|
|
23
23
|
# Verify installation
|
|
24
24
|
openbuilder --version
|
|
@@ -90,7 +90,7 @@ Before you begin, ensure you have:
|
|
|
90
90
|
#### 1. Install the CLI
|
|
91
91
|
|
|
92
92
|
```bash
|
|
93
|
-
curl -fsSL https://openbuilder.
|
|
93
|
+
curl -fsSL https://openbuilder.sh/install | bash
|
|
94
94
|
```
|
|
95
95
|
|
|
96
96
|
#### 2. Initialize Your Runner
|
|
@@ -18,7 +18,7 @@ import 'conf';
|
|
|
18
18
|
// GitHub API endpoint for releases
|
|
19
19
|
const GITHUB_RELEASES_URL = 'https://api.github.com/repos/codyde/openbuilder/releases/latest';
|
|
20
20
|
// Install command for CLI
|
|
21
|
-
const INSTALL_COMMAND = 'curl -fsSL https://openbuilder.
|
|
21
|
+
const INSTALL_COMMAND = 'curl -fsSL https://openbuilder.sh/install | bash';
|
|
22
22
|
// Cache settings
|
|
23
23
|
const CACHE_DIR = join(homedir(), '.config', 'openbuilder');
|
|
24
24
|
const CACHE_FILE = join(CACHE_DIR, 'update-cache.json');
|
|
@@ -266,7 +266,7 @@ async function checkAndAutoUpdate(currentVersion) {
|
|
|
266
266
|
// CLI update failed, continue with current version
|
|
267
267
|
console.log();
|
|
268
268
|
console.log(` ${pc.yellow('⚠')} ${pc.dim('CLI update failed. Continuing with current version.')}`);
|
|
269
|
-
console.log(` ${pc.dim('You can manually update with:')} ${pc.cyan('curl -fsSL https://openbuilder.
|
|
269
|
+
console.log(` ${pc.dim('You can manually update with:')} ${pc.cyan('curl -fsSL https://openbuilder.sh/install | bash')}`);
|
|
270
270
|
console.log();
|
|
271
271
|
return false;
|
|
272
272
|
}
|
|
@@ -295,4 +295,4 @@ async function checkAndAutoUpdate(currentVersion) {
|
|
|
295
295
|
}
|
|
296
296
|
|
|
297
297
|
export { checkAndAutoUpdate };
|
|
298
|
-
//# sourceMappingURL=auto-update-
|
|
298
|
+
//# sourceMappingURL=auto-update-Cr7SnKwX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update-Cr7SnKwX.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.sh/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.sh/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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"}
|
|
@@ -199,7 +199,7 @@ function startCallbackServer(port) {
|
|
|
199
199
|
* 6. Return token
|
|
200
200
|
*/
|
|
201
201
|
async function performOAuthLogin(options = {}) {
|
|
202
|
-
const apiUrl = options.apiUrl || 'https://openbuilder.
|
|
202
|
+
const apiUrl = options.apiUrl || 'https://openbuilder.sh';
|
|
203
203
|
const deviceName = options.deviceName || getDeviceName();
|
|
204
204
|
const silent = options.silent || false;
|
|
205
205
|
try {
|
|
@@ -289,7 +289,7 @@ function getStoredToken() {
|
|
|
289
289
|
*/
|
|
290
290
|
function storeToken(token, apiUrl) {
|
|
291
291
|
// Determine the WebSocket URL from the API URL
|
|
292
|
-
let wsUrl = 'wss://openbuilder.
|
|
292
|
+
let wsUrl = 'wss://openbuilder.sh/ws/runner';
|
|
293
293
|
if (apiUrl) {
|
|
294
294
|
const url = new URL(apiUrl);
|
|
295
295
|
const protocol = url.protocol === 'https:' ? 'wss:' : 'ws:';
|
|
@@ -327,4 +327,4 @@ function clearToken() {
|
|
|
327
327
|
}
|
|
328
328
|
|
|
329
329
|
export { clearToken as c, getStoredToken as g, hasStoredToken as h, performOAuthLogin as p, storeToken as s };
|
|
330
|
-
//# sourceMappingURL=cli-auth-
|
|
330
|
+
//# sourceMappingURL=cli-auth-CHooQYR9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-auth-CHooQYR9.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.sh';\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.sh/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,6 +1,6 @@
|
|
|
1
1
|
// OpenBuilder CLI - Built with Rollup
|
|
2
2
|
import chalk from 'chalk';
|
|
3
|
-
import { h as hasStoredToken, g as getStoredToken, p as performOAuthLogin, s as storeToken } from './cli-auth-
|
|
3
|
+
import { h as hasStoredToken, g as getStoredToken, p as performOAuthLogin, s as storeToken } from './cli-auth-CHooQYR9.js';
|
|
4
4
|
import { l as logger } from './logger-ZpJi7chw.js';
|
|
5
5
|
import 'node:http';
|
|
6
6
|
import 'node:url';
|
|
@@ -23,7 +23,7 @@ import 'node:fs';
|
|
|
23
23
|
* 3. Stores the token locally for future use
|
|
24
24
|
*/
|
|
25
25
|
async function loginCommand(options = {}) {
|
|
26
|
-
const apiUrl = options.url || 'https://openbuilder.
|
|
26
|
+
const apiUrl = options.url || 'https://openbuilder.sh';
|
|
27
27
|
logger.section('OpenBuilder Login');
|
|
28
28
|
// Check if already logged in
|
|
29
29
|
if (!options.force && hasStoredToken()) {
|
|
@@ -60,4 +60,4 @@ async function loginCommand(options = {}) {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
export { loginCommand };
|
|
63
|
-
//# sourceMappingURL=login-
|
|
63
|
+
//# sourceMappingURL=login-XrUC43gE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-XrUC43gE.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.sh';\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,wBAAwB;AAEtD,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,6 +1,6 @@
|
|
|
1
1
|
// OpenBuilder CLI - Built with Rollup
|
|
2
2
|
import chalk from 'chalk';
|
|
3
|
-
import { h as hasStoredToken, c as clearToken } from './cli-auth-
|
|
3
|
+
import { h as hasStoredToken, c as clearToken } from './cli-auth-CHooQYR9.js';
|
|
4
4
|
import { l as logger } from './logger-ZpJi7chw.js';
|
|
5
5
|
import 'node:http';
|
|
6
6
|
import 'node:url';
|
|
@@ -37,4 +37,4 @@ async function logoutCommand() {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
export { logoutCommand };
|
|
40
|
-
//# sourceMappingURL=logout-
|
|
40
|
+
//# sourceMappingURL=logout-Dib2ZEQL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout-
|
|
1
|
+
{"version":3,"file":"logout-Dib2ZEQL.js","sources":["../../src/cli/commands/logout.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { hasStoredToken, clearToken } from '../utils/cli-auth.js';\nimport { logger } from '../utils/logger.js';\n\n/**\n * Logout command - clear stored credentials\n * \n * Usage:\n * openbuilder logout\n * \n * This command clears the locally stored runner token.\n * The token remains valid on the server - you can revoke it\n * from the OpenBuilder dashboard if needed.\n */\nexport async function logoutCommand() {\n logger.section('OpenBuilder Logout');\n \n if (!hasStoredToken()) {\n logger.info('Not currently logged in.');\n return;\n }\n \n clearToken();\n \n logger.success('Logged out successfully.');\n logger.info('');\n logger.info('Note: The runner token is still valid on the server.');\n logger.info('To revoke it, visit your OpenBuilder dashboard.');\n logger.info('');\n logger.info(`Run ${chalk.cyan('openbuilder login')} to authenticate again.`);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAIA;;;;;;;;;AASG;AACI,eAAe,aAAa,GAAA;AACjC,IAAA,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC;AAEpC,IAAA,IAAI,CAAC,cAAc,EAAE,EAAE;AACrB,QAAA,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC;QACvC;IACF;AAEA,IAAA,UAAU,EAAE;AAEZ,IAAA,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC;AAC1C,IAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACf,IAAA,MAAM,CAAC,IAAI,CAAC,sDAAsD,CAAC;AACnE,IAAA,MAAM,CAAC,IAAI,CAAC,iDAAiD,CAAC;AAC9D,IAAA,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AACf,IAAA,MAAM,CAAC,IAAI,CAAC,CAAA,IAAA,EAAO,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA,uBAAA,CAAyB,CAAC;AAC9E;;;;"}
|
|
@@ -601,7 +601,7 @@ async function startRunner(config) {
|
|
|
601
601
|
console.log('\n Starting OpenBuilder Runner...\n');
|
|
602
602
|
console.log(` Runner ID: ${config.runnerId}`);
|
|
603
603
|
console.log(' Connecting to remote server...\n');
|
|
604
|
-
const { runCommand } = await import('./run-
|
|
604
|
+
const { runCommand } = await import('./run-ImqaRH0K.js');
|
|
605
605
|
await runCommand({
|
|
606
606
|
secret: config.key,
|
|
607
607
|
runnerId: config.runnerId,
|
|
@@ -641,4 +641,4 @@ async function runInitialization(config) {
|
|
|
641
641
|
}
|
|
642
642
|
|
|
643
643
|
export { mainTUICommand };
|
|
644
|
-
//# sourceMappingURL=main-tui-
|
|
644
|
+
//# sourceMappingURL=main-tui-1ygCKH67.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main-tui-CI-fhhsm.js","sources":["../../src/cli/tui/components/Menu.tsx","../../src/cli/tui/components/HorizontalSelector.tsx","../../src/cli/tui/components/MaskedInput.tsx","../../src/cli/tui/components/RadioGroup.tsx","../../src/cli/tui/screens/ModeSelectScreen.tsx","../../src/cli/tui/screens/LocalModeScreen.tsx","../../src/cli/tui/screens/RunnerModeScreen.tsx","../../src/cli/tui/screens/ConfigFormScreen.tsx","../../src/cli/commands/main-tui.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors, symbols } from '../theme.js';\n\nexport interface MenuItem {\n id: string;\n label: string;\n description?: string;\n}\n\ninterface MenuProps {\n items: MenuItem[];\n onSelect: (item: MenuItem) => void;\n}\n\n/**\n * Arrow-key navigable menu component\n * \n * > Initialize OpenBuilder\n * Start Runner\n * Exit\n */\nexport function Menu({ items, onSelect }: MenuProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : items.length - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => (prev < items.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n onSelect(items[selectedIndex]);\n }\n });\n\n return (\n <Box flexDirection=\"column\" alignItems=\"flex-start\">\n {items.map((item, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box key={item.id} marginY={0}>\n <Text color={isSelected ? colors.cyan : colors.gray}>\n {isSelected ? '› ' : ' '}\n </Text>\n <Text color={isSelected ? colors.white : colors.gray} bold={isSelected}>\n {item.label}\n </Text>\n {item.description && (\n <Text color={colors.dimGray}>\n {' '}{item.description}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\nexport interface CardOption {\n id: string;\n title: string;\n description: string;\n}\n\ninterface HorizontalSelectorProps {\n options: CardOption[];\n onSelect: (option: CardOption) => void;\n onEscape?: () => void;\n}\n\n/**\n * Horizontal card selector component\n * \n * ┌─────────────────┐ ┌─────────────────┐\n * │ Local Mode │ │ Runner Mode │\n * │ │ │ │\n * │ Run OpenBuilder │ │ Connect to a │\n * │ locally │ │ remote server │\n * └─────────────────┘ └─────────────────┘\n * [SELECTED]\n */\nexport function HorizontalSelector({ options, onSelect, onEscape }: HorizontalSelectorProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.leftArrow) {\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : options.length - 1));\n } else if (key.rightArrow) {\n setSelectedIndex(prev => (prev < options.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n onSelect(options[selectedIndex]);\n } else if (key.escape && onEscape) {\n onEscape();\n }\n });\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Box flexDirection=\"row\" gap={2}>\n {options.map((option, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box\n key={option.id}\n flexDirection=\"column\"\n alignItems=\"center\"\n borderStyle=\"round\"\n borderColor={isSelected ? colors.cyan : colors.darkGray}\n paddingX={3}\n paddingY={1}\n width={25}\n >\n <Text\n color={isSelected ? colors.white : colors.gray}\n bold={isSelected}\n >\n {option.title}\n </Text>\n <Box marginTop={1}>\n <Text\n color={isSelected ? colors.gray : colors.dimGray}\n wrap=\"wrap\"\n >\n {option.description}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n \n {/* Selection indicator */}\n <Box marginTop={1}>\n {options.map((option, index) => (\n <Box key={option.id} width={25} justifyContent=\"center\" marginX={1}>\n {index === selectedIndex && (\n <Text color={colors.cyan}>{'▲'}</Text>\n )}\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\ninterface MaskedInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n maskChar?: string;\n focused?: boolean;\n visiblePrefixLength?: number; // Number of characters to show unmasked at the start\n}\n\n/**\n * Masked text input for sensitive data like keys/passwords\n * Shows first N characters (default: 5) then mask characters for the rest\n * Supports paste (multi-character input) with buffering to prevent visual glitches\n */\nexport function MaskedInput({\n value,\n onChange,\n placeholder = '',\n maskChar = '*',\n focused = false,\n visiblePrefixLength = 5,\n}: MaskedInputProps) {\n const [cursorVisible, setCursorVisible] = useState(true);\n // Buffer to accumulate rapid input (for paste detection)\n const inputBufferRef = useRef<string>('');\n const flushTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n // Keep current value in ref for use in timeout callbacks\n const valueRef = useRef(value);\n valueRef.current = value;\n\n // Blink cursor when focused\n useEffect(() => {\n if (!focused) {\n setCursorVisible(false);\n return;\n }\n\n setCursorVisible(true);\n const interval = setInterval(() => {\n setCursorVisible(prev => !prev);\n }, 500);\n\n return () => clearInterval(interval);\n }, [focused]);\n\n // Flush buffered input - called after a brief delay to batch paste operations\n const flushBuffer = useCallback(() => {\n if (inputBufferRef.current) {\n onChange(valueRef.current + inputBufferRef.current);\n inputBufferRef.current = '';\n }\n }, [onChange]);\n\n useInput((input, key) => {\n if (!focused) return;\n\n if (key.backspace || key.delete) {\n // Clear any pending buffer on backspace\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n flushTimeoutRef.current = null;\n }\n if (inputBufferRef.current) {\n // Remove from buffer first\n inputBufferRef.current = inputBufferRef.current.slice(0, -1);\n if (!inputBufferRef.current) {\n onChange(value.slice(0, -1));\n }\n } else {\n onChange(value.slice(0, -1));\n }\n } else if (!key.escape && !key.return && !key.tab && \n !key.upArrow && !key.downArrow && !key.leftArrow && !key.rightArrow) {\n // Allow any printable input including pasted text (multi-character)\n // Filter out control characters but allow regular text\n const printable = input.replace(/[\\x00-\\x1F\\x7F]/g, '');\n if (printable.length > 0) {\n // Buffer the input for batching (helps with paste)\n inputBufferRef.current += printable;\n \n // Clear any existing timeout\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n }\n \n // Set a short timeout to flush - if more input comes quickly (paste), \n // it will be batched together\n flushTimeoutRef.current = setTimeout(() => {\n flushBuffer();\n flushTimeoutRef.current = null;\n }, 10);\n }\n }\n }, { isActive: focused });\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n }\n };\n }, []);\n\n // Show first N characters unmasked, mask the rest\n const getDisplayValue = () => {\n if (!value) return '';\n if (value.length <= visiblePrefixLength) {\n return value;\n }\n const visiblePart = value.substring(0, visiblePrefixLength);\n const maskedPart = maskChar.repeat(value.length - visiblePrefixLength);\n return visiblePart + maskedPart;\n };\n \n const displayValue = getDisplayValue();\n const cursor = focused && cursorVisible ? '│' : ' ';\n\n if (!value && !focused) {\n return (\n <Text color={colors.dimGray}>\n {placeholder}\n </Text>\n );\n }\n\n return (\n <Text color={colors.white}>\n {displayValue}\n {focused && <Text color={colors.cyan}>{cursor}</Text>}\n </Text>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { colors, symbols } from '../theme.js';\n\nexport interface RadioOption {\n id: string;\n label: string;\n}\n\ninterface RadioGroupProps {\n options: RadioOption[];\n selected: string;\n onChange: (id: string) => void;\n focused?: boolean;\n}\n\n/**\n * Radio button group component\n * \n * ● Option 1\n * ○ Option 2\n */\nexport function RadioGroup({ options, selected, onChange, focused = false }: RadioGroupProps) {\n useInput((input, key) => {\n if (!focused) return;\n\n const currentIndex = options.findIndex(opt => opt.id === selected);\n \n if (key.upArrow) {\n const newIndex = currentIndex > 0 ? currentIndex - 1 : options.length - 1;\n onChange(options[newIndex].id);\n } else if (key.downArrow) {\n const newIndex = currentIndex < options.length - 1 ? currentIndex + 1 : 0;\n onChange(options[newIndex].id);\n } else if (input === ' ') {\n // Space toggles current selection (useful for single option scenarios)\n // For radio groups, this just confirms current selection\n }\n }, { isActive: focused });\n\n return (\n <Box flexDirection=\"column\">\n {options.map((option) => {\n const isSelected = option.id === selected;\n const isFocusedOption = focused && isSelected;\n \n return (\n <Box key={option.id} marginY={0}>\n <Text color={isSelected ? colors.cyan : colors.gray}>\n {isSelected ? symbols.filledDot : symbols.hollowDot}\n </Text>\n <Text> </Text>\n <Text\n color={isFocusedOption ? colors.white : (isSelected ? colors.gray : colors.dimGray)}\n bold={isFocusedOption}\n >\n {option.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text, useStdout } from 'ink';\nimport { Banner, HorizontalSelector, type CardOption } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport type ModeSelection = 'local' | 'runner';\n\nexport interface ModeSelectScreenProps {\n onSelect: (mode: ModeSelection) => void;\n onEscape?: () => void;\n}\n\nconst modeOptions: CardOption[] = [\n {\n id: 'local',\n title: 'Local Mode',\n description: 'Run OpenBuilder on this machine',\n },\n {\n id: 'runner',\n title: 'Runner Mode',\n description: 'Connect to a remote server',\n },\n];\n\n/**\n * Initial mode selection screen\n * Shows two horizontal cards for Local Mode vs Runner Mode\n */\nexport function ModeSelectScreen({ onSelect, onEscape }: ModeSelectScreenProps) {\n const { stdout } = useStdout();\n \n // Check for available update (set by auto-update check in index.ts)\n const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = updateAvailable ? 20 : 18; // Extra space for update notice\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n const handleSelect = (option: CardOption) => {\n onSelect(option.id as ModeSelection);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Update available notice */}\n {updateAvailable && (\n <Box marginTop={1}>\n <Text color={colors.cyan}>⬆ Update available: </Text>\n <Text color={colors.success}>{updateAvailable}</Text>\n <Text color={colors.dimGray}> — Run </Text>\n <Text color={colors.cyan}>openbuilder upgrade</Text>\n <Text color={colors.dimGray}> to update</Text>\n </Box>\n )}\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Horizontal card selector */}\n <HorizontalSelector\n options={modeOptions}\n onSelect={handleSelect}\n onEscape={onEscape}\n />\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Use {'<-'} {'->'} arrows to navigate, Enter to select, Esc to exit\n </Text>\n </Box>\n );\n}\n","import { Box, Text, useInput, useStdout } from 'ink';\nimport { Banner, Menu, type MenuItem } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport type LocalAction = 'init' | 'start';\n\nexport interface LocalModeScreenProps {\n isInitialized: boolean;\n onSelect: (action: LocalAction) => void;\n onEscape: () => void;\n}\n\n/**\n * Local mode options screen\n * Shows Initialize/Reinitialize and Start options based on config state\n */\nexport function LocalModeScreen({ isInitialized, onSelect, onEscape }: LocalModeScreenProps) {\n const { stdout } = useStdout();\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 16;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n // Handle escape key\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n }\n });\n\n // Build menu items based on initialization state\n const menuItems: MenuItem[] = [];\n \n if (!isInitialized) {\n menuItems.push({\n id: 'init',\n label: 'Initialize OpenBuilder',\n description: 'Set up workspace and configuration',\n });\n } else {\n menuItems.push({\n id: 'init',\n label: 'Reinitialize OpenBuilder',\n description: 'Reset and reconfigure',\n });\n menuItems.push({\n id: 'start',\n label: 'Start OpenBuilder',\n description: 'Launch the full stack',\n });\n }\n\n const handleSelect = (item: MenuItem) => {\n onSelect(item.id as LocalAction);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.cyan} bold>Local Mode</Text>\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Status indicator */}\n {isInitialized ? (\n <Text color={colors.success}>● Configured</Text>\n ) : (\n <Text color={colors.warning}>○ Not configured</Text>\n )}\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Menu */}\n <Menu items={menuItems} onSelect={handleSelect} />\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Use up/down arrows to navigate, Enter to select, Esc to go back\n </Text>\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { Banner, MaskedInput } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport interface RunnerConfig {\n key: string;\n runnerId: string;\n}\n\nexport interface RunnerModeScreenProps {\n initialKey?: string;\n initialRunnerId?: string;\n onStart: (config: RunnerConfig) => void;\n onEscape: () => void;\n}\n\ntype FocusedField = 'key' | 'runnerId';\n\n// Fixed label width for alignment\nconst LABEL_WIDTH = 14;\n\n/**\n * Runner mode screen with key and runner ID inputs\n */\nexport function RunnerModeScreen({\n initialKey = '',\n initialRunnerId = '',\n onStart,\n onEscape,\n}: RunnerModeScreenProps) {\n const { stdout } = useStdout();\n const [runnerId, setRunnerId] = useState(initialRunnerId);\n const [focusedField, setFocusedField] = useState<FocusedField>('key');\n \n // We need a separate state for the actual key value since MaskedInput doesn't use ink-text-input\n const [runnerKey, setRunnerKey] = useState(initialKey);\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 18;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n const isLastField = focusedField === 'runnerId';\n\n const handleSubmit = () => {\n if (runnerKey.trim()) {\n onStart({ key: runnerKey, runnerId: runnerId.trim() || initialRunnerId });\n }\n };\n\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n return;\n }\n\n // Shift+Enter to submit immediately from any field\n if (key.return && key.shift) {\n handleSubmit();\n return;\n }\n\n // Regular Enter moves to next field, or submits if on last field\n if (key.return && !key.shift) {\n if (isLastField) {\n handleSubmit();\n } else {\n setFocusedField('runnerId');\n }\n return;\n }\n\n if (key.tab || key.downArrow) {\n setFocusedField(prev => prev === 'key' ? 'runnerId' : 'key');\n return;\n }\n\n if (key.upArrow) {\n setFocusedField(prev => prev === 'runnerId' ? 'key' : 'runnerId');\n return;\n }\n });\n\n const handleKeyChange = (value: string) => {\n setRunnerKey(value);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.purple} bold>Runner Mode</Text>\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Form fields */}\n <Box flexDirection=\"column\" gap={1}>\n {/* Runner Key (masked) */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'key' ? colors.cyan : colors.gray}>\n Runner Key\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'key' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n <MaskedInput\n value={runnerKey}\n onChange={handleKeyChange}\n placeholder=\"Paste your runner key\"\n focused={focusedField === 'key'}\n />\n </Box>\n </Box>\n \n {/* Auto-fill hint */}\n {initialKey && focusedField === 'key' && (\n <Box marginLeft={LABEL_WIDTH + 2}>\n <Text color={colors.dimGray} italic>\n (auto-filled from previous config)\n </Text>\n </Box>\n )}\n \n {/* Runner ID */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'runnerId' ? colors.cyan : colors.gray}>\n Runner ID\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'runnerId' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n {focusedField === 'runnerId' ? (\n <TextInput\n value={runnerId}\n onChange={setRunnerId}\n placeholder={initialRunnerId || 'Enter runner ID'}\n />\n ) : (\n <Text color={runnerId ? colors.white : colors.dimGray}>\n {runnerId || initialRunnerId || 'Enter runner ID'}\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n \n {/* Spacer */}\n <Box marginTop={3} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Enter: {isLastField ? 'Start runner' : 'Next field'} | Shift+Enter: Start now | Esc: Back\n </Text>\n \n {/* Validation message */}\n {!runnerKey.trim() && (\n <Box marginTop={1}>\n <Text color={colors.warning}>Runner key is required</Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { Banner, RadioGroup, type RadioOption } from '../components/index.js';\nimport { colors, symbols } from '../theme.js';\n\nexport interface InitFormConfig {\n branch: string;\n workspace: string;\n useNeon: boolean;\n databaseUrl?: string;\n}\n\nexport interface ConfigFormScreenProps {\n initialConfig?: Partial<InitFormConfig>;\n onSubmit: (config: InitFormConfig) => void;\n onEscape: () => void;\n error?: string; // Error message to display (e.g., \"Branch not found\")\n}\n\ntype FocusedField = 'branch' | 'workspace' | 'database' | 'databaseUrl';\n\nconst databaseOptions: RadioOption[] = [\n { id: 'neon', label: 'Use Neon (automatic setup)' },\n { id: 'custom', label: 'Custom PostgreSQL' },\n];\n\n// Fixed label width for alignment\nconst LABEL_WIDTH = 14;\n\n/**\n * Interactive configuration form for init/reinit\n */\nexport function ConfigFormScreen({\n initialConfig,\n onSubmit,\n onEscape,\n error,\n}: ConfigFormScreenProps) {\n const { stdout } = useStdout();\n \n // Form state\n const [branch, setBranch] = useState(initialConfig?.branch || 'main');\n \n // Clear error when user starts typing in branch field\n const handleBranchChange = (value: string) => {\n setBranch(value);\n };\n const [workspace, setWorkspace] = useState(\n initialConfig?.workspace || '~/openbuilder-workspace'\n );\n const [databaseType, setDatabaseType] = useState<'neon' | 'custom'>(\n initialConfig?.useNeon === false ? 'custom' : 'neon'\n );\n const [databaseUrl, setDatabaseUrl] = useState(initialConfig?.databaseUrl || '');\n \n const [focusedField, setFocusedField] = useState<FocusedField>('branch');\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 22;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n // Field order for navigation\n const fieldOrder: FocusedField[] = databaseType === 'custom' \n ? ['branch', 'workspace', 'database', 'databaseUrl']\n : ['branch', 'workspace', 'database'];\n\n const currentFieldIndex = fieldOrder.indexOf(focusedField);\n const isLastField = currentFieldIndex === fieldOrder.length - 1;\n\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n return;\n }\n\n // Shift+Enter to submit immediately from any field\n if (key.return && key.shift) {\n handleSubmit();\n return;\n }\n\n // Regular Enter moves to next field, or submits if on last field\n if (key.return && !key.shift) {\n if (isLastField) {\n handleSubmit();\n } else {\n setFocusedField(fieldOrder[currentFieldIndex + 1]);\n }\n return;\n }\n\n // Tab or Down arrow moves to next field\n if (key.tab || key.downArrow) {\n if (focusedField !== 'database') {\n const nextIndex = (currentFieldIndex + 1) % fieldOrder.length;\n setFocusedField(fieldOrder[nextIndex]);\n }\n return;\n }\n\n // Up arrow moves to previous field\n if (key.upArrow) {\n if (focusedField !== 'database') {\n const prevIndex = currentFieldIndex > 0 ? currentFieldIndex - 1 : fieldOrder.length - 1;\n setFocusedField(fieldOrder[prevIndex]);\n }\n return;\n }\n });\n\n const handleSubmit = () => {\n const config: InitFormConfig = {\n branch: branch.trim() || 'main',\n workspace: workspace.trim() || '~/openbuilder-workspace',\n useNeon: databaseType === 'neon',\n databaseUrl: databaseType === 'custom' ? databaseUrl.trim() : undefined,\n };\n onSubmit(config);\n };\n\n const handleDatabaseTypeChange = (id: string) => {\n setDatabaseType(id as 'neon' | 'custom');\n // If switching to custom, focus the URL field\n if (id === 'custom') {\n setFocusedField('databaseUrl');\n }\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.cyan} bold>Configure OpenBuilder</Text>\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Form fields */}\n <Box flexDirection=\"column\" gap={1}>\n {/* Branch - editable branch name */}\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={error ? colors.error : (focusedField === 'branch' ? colors.cyan : colors.gray)}>\n Branch\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={error ? colors.error : (focusedField === 'branch' ? colors.cyan : colors.darkGray)}\n paddingX={1}\n >\n {focusedField === 'branch' ? (\n <TextInput\n value={branch}\n onChange={handleBranchChange}\n placeholder=\"main\"\n />\n ) : (\n <Text color={branch ? colors.white : colors.dimGray}>\n {branch || 'main'}\n </Text>\n )}\n </Box>\n </Box>\n {/* Error message below branch field */}\n {error && (\n <Box marginLeft={LABEL_WIDTH + 2}>\n <Text color={colors.error}>\n {symbols.cross} {error}\n </Text>\n </Box>\n )}\n </Box>\n \n {/* Workspace */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'workspace' ? colors.cyan : colors.gray}>\n Workspace\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'workspace' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n {focusedField === 'workspace' ? (\n <TextInput\n value={workspace}\n onChange={setWorkspace}\n placeholder=\"~/openbuilder-workspace\"\n />\n ) : (\n <Text color={workspace ? colors.white : colors.dimGray}>\n {workspace || '~/openbuilder-workspace'}\n </Text>\n )}\n </Box>\n </Box>\n \n {/* Database type */}\n <Box marginTop={1} flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'database' ? colors.cyan : colors.gray}>\n Database\n </Text>\n </Box>\n <RadioGroup\n options={databaseOptions}\n selected={databaseType}\n onChange={handleDatabaseTypeChange}\n focused={focusedField === 'database'}\n />\n </Box>\n \n {/* Custom database URL (only shown when custom is selected) */}\n {databaseType === 'custom' && (\n <Box marginTop={1} flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'databaseUrl' ? colors.cyan : colors.gray}>\n URL\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'databaseUrl' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={50}\n >\n {focusedField === 'databaseUrl' ? (\n <TextInput\n value={databaseUrl}\n onChange={setDatabaseUrl}\n placeholder=\"postgres://user:pass@host:5432/db\"\n />\n ) : (\n <Text color={databaseUrl ? colors.white : colors.dimGray}>\n {databaseUrl || 'postgres://user:pass@host:5432/db'}\n </Text>\n )}\n </Box>\n </Box>\n )}\n </Box>\n \n {/* Spacer */}\n <Box marginTop={3} />\n \n {/* Help text */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color={colors.dimGray}>\n Enter: {isLastField ? 'Start' : 'Next field'} | Shift+Enter: Start now | Esc: Back\n </Text>\n {databaseType === 'custom' && !databaseUrl.trim() && (\n <Box marginTop={1}>\n <Text color={colors.warning}>\n {symbols.hollowDot} Database URL required for custom PostgreSQL\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * Main TUI entry point - shown when running `openbuilder` without arguments\n * Implements a multi-screen flow: Mode Select -> Local/Runner Mode -> Config/Start\n */\n\nimport { useState } from 'react';\nimport { render } from 'ink';\nimport { userInfo } from 'node:os';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n ModeSelectScreen,\n LocalModeScreen,\n RunnerModeScreen,\n ConfigFormScreen,\n type ModeSelection,\n type LocalAction,\n type RunnerConfig,\n type InitFormConfig,\n} from '../tui/screens/index.js';\nimport { configManager } from '../utils/config-manager.js';\n\n/**\n * Screen state machine types\n */\ntype Screen =\n | { type: 'mode-select' }\n | { type: 'local-mode' }\n | { type: 'runner-mode' }\n | { type: 'config-form'; error?: string; lastBranch?: string };\n\ninterface AppState {\n screen: Screen;\n isInitialized: boolean;\n existingKey: string;\n existingRunnerId: string;\n existingWorkspace: string;\n}\n\n/**\n * Main TUI App component with screen navigation\n */\nfunction App({ \n initialState, \n onExit, \n onRunnerStart, \n onLocalStart, \n onInitStart,\n}: {\n initialState: AppState;\n onExit: () => void;\n onRunnerStart: (config: RunnerConfig) => void;\n onLocalStart: () => void;\n onInitStart: (config: InitFormConfig) => void;\n}) {\n const [state, setState] = useState<AppState>(initialState);\n\n // Screen navigation handlers\n const navigateTo = (screen: Screen) => {\n setState(prev => ({ ...prev, screen }));\n };\n \n // Navigate back to config form with error\n const navigateToConfigWithError = (error: string, lastBranch: string) => {\n setState(prev => ({ \n ...prev, \n screen: { type: 'config-form', error, lastBranch } \n }));\n };\n\n // Mode Select handlers\n const handleModeSelect = (mode: ModeSelection) => {\n if (mode === 'local') {\n navigateTo({ type: 'local-mode' });\n } else {\n navigateTo({ type: 'runner-mode' });\n }\n };\n\n // Local Mode handlers\n const handleLocalAction = (action: LocalAction) => {\n if (action === 'init') {\n navigateTo({ type: 'config-form' });\n } else if (action === 'start') {\n onLocalStart();\n }\n };\n\n // Runner Mode handler\n const handleRunnerStart = (config: RunnerConfig) => {\n onRunnerStart(config);\n };\n\n // Config Form handler - validates branch before proceeding\n const handleConfigSubmit = async (config: InitFormConfig) => {\n // Skip validation if using main branch (always exists)\n if (config.branch === 'main') {\n onInitStart(config);\n return;\n }\n \n // Validate branch exists before proceeding\n const { execSync } = await import('child_process');\n try {\n execSync(\n `git ls-remote --exit-code --heads https://github.com/codyde/openbuilder.git ${config.branch}`,\n { stdio: 'pipe' }\n );\n // Branch exists, proceed with init\n onInitStart(config);\n } catch {\n // Branch doesn't exist, show error\n navigateToConfigWithError(\n `Branch \"${config.branch}\" not found`,\n config.branch\n );\n }\n };\n\n // Render current screen\n switch (state.screen.type) {\n case 'mode-select':\n return (\n <ModeSelectScreen\n onSelect={handleModeSelect}\n onEscape={onExit}\n />\n );\n\n case 'local-mode':\n return (\n <LocalModeScreen\n isInitialized={state.isInitialized}\n onSelect={handleLocalAction}\n onEscape={() => navigateTo({ type: 'mode-select' })}\n />\n );\n\n case 'runner-mode':\n return (\n <RunnerModeScreen\n initialKey={state.existingKey}\n initialRunnerId={state.existingRunnerId}\n onStart={handleRunnerStart}\n onEscape={() => navigateTo({ type: 'mode-select' })}\n />\n );\n\n case 'config-form':\n return (\n <ConfigFormScreen\n initialConfig={{\n branch: state.screen.lastBranch || 'main',\n workspace: state.existingWorkspace || join(homedir(), 'openbuilder-workspace'),\n useNeon: true,\n }}\n onSubmit={handleConfigSubmit}\n onEscape={() => navigateTo({ type: 'local-mode' })}\n error={state.screen.error}\n />\n );\n\n default:\n return null;\n }\n}\n\n/**\n * Get system username for default runner ID\n */\nfunction getSystemUsername(): string {\n try {\n return userInfo().username;\n } catch {\n return process.env.USER || process.env.USERNAME || 'runner';\n }\n}\n\n/**\n * Run the main TUI menu\n */\nexport async function mainTUICommand(): Promise<void> {\n // Clear screen for fullscreen experience\n console.clear();\n\n const isInitialized = configManager.isInitialized();\n const existingKey = configManager.getSecret() || '';\n const config = configManager.get();\n // Use lastRunnerId if available, otherwise fall back to system username\n const existingRunnerId = config.runner?.lastRunnerId || getSystemUsername();\n const existingWorkspace = config.workspace || '';\n\n const initialState: AppState = {\n screen: { type: 'mode-select' },\n isInitialized,\n existingKey,\n existingRunnerId,\n existingWorkspace,\n };\n\n return new Promise((resolve, reject) => {\n let exitReason: 'exit' | 'runner-start' | 'local-start' | 'init-start' | null = null;\n let runnerConfig: RunnerConfig | null = null;\n let initConfig: InitFormConfig | null = null;\n\n const { unmount, waitUntilExit } = render(\n <App\n initialState={initialState}\n onExit={() => {\n exitReason = 'exit';\n unmount();\n }}\n onRunnerStart={(config) => {\n exitReason = 'runner-start';\n runnerConfig = config;\n unmount();\n }}\n onLocalStart={() => {\n exitReason = 'local-start';\n unmount();\n }}\n onInitStart={(config) => {\n exitReason = 'init-start';\n initConfig = config;\n unmount();\n }}\n />,\n {\n exitOnCtrlC: true,\n }\n );\n\n waitUntilExit().then(async () => {\n if (!exitReason) {\n // User pressed Ctrl+C\n console.clear();\n process.exit(0);\n }\n\n switch (exitReason) {\n case 'exit':\n console.clear();\n console.log('\\n Goodbye!\\n');\n process.exit(0);\n break;\n\n case 'runner-start':\n if (runnerConfig) {\n console.clear();\n await startRunner(runnerConfig);\n }\n break;\n\n case 'local-start':\n console.clear();\n await startLocalMode();\n break;\n\n case 'init-start':\n if (initConfig) {\n // Clear screen with ANSI codes to ensure clean slate\n process.stdout.write('\\x1b[2J\\x1b[H');\n await runInitialization(initConfig);\n }\n break;\n }\n\n resolve();\n }).catch(reject);\n });\n}\n\n/**\n * Start runner mode (connects to remote server)\n */\nasync function startRunner(config: RunnerConfig): Promise<void> {\n // Save the key to config for future use\n if (config.key) {\n const serverConfig = configManager.get('server') || {};\n configManager.set('server', {\n ...serverConfig,\n secret: config.key,\n });\n }\n\n // Save the runner ID to config for future use\n if (config.runnerId) {\n const runnerConf = configManager.get('runner') || {};\n configManager.set('runner', {\n ...runnerConf,\n lastRunnerId: config.runnerId,\n });\n }\n\n console.log('\\n Starting OpenBuilder Runner...\\n');\n console.log(` Runner ID: ${config.runnerId}`);\n console.log(' Connecting to remote server...\\n');\n\n const { runCommand } = await import('./run.js');\n await runCommand({\n secret: config.key,\n runnerId: config.runnerId,\n });\n}\n\n/**\n * Start local mode (full stack)\n */\nasync function startLocalMode(): Promise<void> {\n console.log('\\n Starting OpenBuilder in Local Mode...\\n');\n\n const { startCommand } = await import('./start.js');\n await startCommand({});\n}\n\n/**\n * Run initialization with form config\n */\nasync function runInitialization(config: InitFormConfig): Promise<void> {\n // Expand ~ in workspace path\n const workspace = config.workspace.startsWith('~')\n ? config.workspace.replace('~', homedir())\n : config.workspace;\n\n const { initTUICommand } = await import('./init-tui.js');\n \n // Build options based on form input\n const options: {\n workspace: string;\n branch: string;\n database?: string | boolean;\n yes: boolean;\n } = {\n workspace,\n branch: config.branch,\n yes: true,\n };\n\n // Handle database option\n if (config.useNeon) {\n options.database = true; // Use Neon auto-setup\n } else if (config.databaseUrl) {\n options.database = config.databaseUrl; // Custom connection string\n }\n\n await initTUICommand(options);\n}\n"],"names":["_jsx","_jsxs","LABEL_WIDTH"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main-tui-1ygCKH67.js","sources":["../../src/cli/tui/components/Menu.tsx","../../src/cli/tui/components/HorizontalSelector.tsx","../../src/cli/tui/components/MaskedInput.tsx","../../src/cli/tui/components/RadioGroup.tsx","../../src/cli/tui/screens/ModeSelectScreen.tsx","../../src/cli/tui/screens/LocalModeScreen.tsx","../../src/cli/tui/screens/RunnerModeScreen.tsx","../../src/cli/tui/screens/ConfigFormScreen.tsx","../../src/cli/commands/main-tui.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors, symbols } from '../theme.js';\n\nexport interface MenuItem {\n id: string;\n label: string;\n description?: string;\n}\n\ninterface MenuProps {\n items: MenuItem[];\n onSelect: (item: MenuItem) => void;\n}\n\n/**\n * Arrow-key navigable menu component\n * \n * > Initialize OpenBuilder\n * Start Runner\n * Exit\n */\nexport function Menu({ items, onSelect }: MenuProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : items.length - 1));\n } else if (key.downArrow) {\n setSelectedIndex(prev => (prev < items.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n onSelect(items[selectedIndex]);\n }\n });\n\n return (\n <Box flexDirection=\"column\" alignItems=\"flex-start\">\n {items.map((item, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box key={item.id} marginY={0}>\n <Text color={isSelected ? colors.cyan : colors.gray}>\n {isSelected ? '› ' : ' '}\n </Text>\n <Text color={isSelected ? colors.white : colors.gray} bold={isSelected}>\n {item.label}\n </Text>\n {item.description && (\n <Text color={colors.dimGray}>\n {' '}{item.description}\n </Text>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\nexport interface CardOption {\n id: string;\n title: string;\n description: string;\n}\n\ninterface HorizontalSelectorProps {\n options: CardOption[];\n onSelect: (option: CardOption) => void;\n onEscape?: () => void;\n}\n\n/**\n * Horizontal card selector component\n * \n * ┌─────────────────┐ ┌─────────────────┐\n * │ Local Mode │ │ Runner Mode │\n * │ │ │ │\n * │ Run OpenBuilder │ │ Connect to a │\n * │ locally │ │ remote server │\n * └─────────────────┘ └─────────────────┘\n * [SELECTED]\n */\nexport function HorizontalSelector({ options, onSelect, onEscape }: HorizontalSelectorProps) {\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n useInput((input, key) => {\n if (key.leftArrow) {\n setSelectedIndex(prev => (prev > 0 ? prev - 1 : options.length - 1));\n } else if (key.rightArrow) {\n setSelectedIndex(prev => (prev < options.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n onSelect(options[selectedIndex]);\n } else if (key.escape && onEscape) {\n onEscape();\n }\n });\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Box flexDirection=\"row\" gap={2}>\n {options.map((option, index) => {\n const isSelected = index === selectedIndex;\n return (\n <Box\n key={option.id}\n flexDirection=\"column\"\n alignItems=\"center\"\n borderStyle=\"round\"\n borderColor={isSelected ? colors.cyan : colors.darkGray}\n paddingX={3}\n paddingY={1}\n width={25}\n >\n <Text\n color={isSelected ? colors.white : colors.gray}\n bold={isSelected}\n >\n {option.title}\n </Text>\n <Box marginTop={1}>\n <Text\n color={isSelected ? colors.gray : colors.dimGray}\n wrap=\"wrap\"\n >\n {option.description}\n </Text>\n </Box>\n </Box>\n );\n })}\n </Box>\n \n {/* Selection indicator */}\n <Box marginTop={1}>\n {options.map((option, index) => (\n <Box key={option.id} width={25} justifyContent=\"center\" marginX={1}>\n {index === selectedIndex && (\n <Text color={colors.cyan}>{'▲'}</Text>\n )}\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n","import { useState, useEffect, useRef, useCallback } from 'react';\nimport { Text, useInput } from 'ink';\nimport { colors } from '../theme.js';\n\ninterface MaskedInputProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n maskChar?: string;\n focused?: boolean;\n visiblePrefixLength?: number; // Number of characters to show unmasked at the start\n}\n\n/**\n * Masked text input for sensitive data like keys/passwords\n * Shows first N characters (default: 5) then mask characters for the rest\n * Supports paste (multi-character input) with buffering to prevent visual glitches\n */\nexport function MaskedInput({\n value,\n onChange,\n placeholder = '',\n maskChar = '*',\n focused = false,\n visiblePrefixLength = 5,\n}: MaskedInputProps) {\n const [cursorVisible, setCursorVisible] = useState(true);\n // Buffer to accumulate rapid input (for paste detection)\n const inputBufferRef = useRef<string>('');\n const flushTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n // Keep current value in ref for use in timeout callbacks\n const valueRef = useRef(value);\n valueRef.current = value;\n\n // Blink cursor when focused\n useEffect(() => {\n if (!focused) {\n setCursorVisible(false);\n return;\n }\n\n setCursorVisible(true);\n const interval = setInterval(() => {\n setCursorVisible(prev => !prev);\n }, 500);\n\n return () => clearInterval(interval);\n }, [focused]);\n\n // Flush buffered input - called after a brief delay to batch paste operations\n const flushBuffer = useCallback(() => {\n if (inputBufferRef.current) {\n onChange(valueRef.current + inputBufferRef.current);\n inputBufferRef.current = '';\n }\n }, [onChange]);\n\n useInput((input, key) => {\n if (!focused) return;\n\n if (key.backspace || key.delete) {\n // Clear any pending buffer on backspace\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n flushTimeoutRef.current = null;\n }\n if (inputBufferRef.current) {\n // Remove from buffer first\n inputBufferRef.current = inputBufferRef.current.slice(0, -1);\n if (!inputBufferRef.current) {\n onChange(value.slice(0, -1));\n }\n } else {\n onChange(value.slice(0, -1));\n }\n } else if (!key.escape && !key.return && !key.tab && \n !key.upArrow && !key.downArrow && !key.leftArrow && !key.rightArrow) {\n // Allow any printable input including pasted text (multi-character)\n // Filter out control characters but allow regular text\n const printable = input.replace(/[\\x00-\\x1F\\x7F]/g, '');\n if (printable.length > 0) {\n // Buffer the input for batching (helps with paste)\n inputBufferRef.current += printable;\n \n // Clear any existing timeout\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n }\n \n // Set a short timeout to flush - if more input comes quickly (paste), \n // it will be batched together\n flushTimeoutRef.current = setTimeout(() => {\n flushBuffer();\n flushTimeoutRef.current = null;\n }, 10);\n }\n }\n }, { isActive: focused });\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (flushTimeoutRef.current) {\n clearTimeout(flushTimeoutRef.current);\n }\n };\n }, []);\n\n // Show first N characters unmasked, mask the rest\n const getDisplayValue = () => {\n if (!value) return '';\n if (value.length <= visiblePrefixLength) {\n return value;\n }\n const visiblePart = value.substring(0, visiblePrefixLength);\n const maskedPart = maskChar.repeat(value.length - visiblePrefixLength);\n return visiblePart + maskedPart;\n };\n \n const displayValue = getDisplayValue();\n const cursor = focused && cursorVisible ? '│' : ' ';\n\n if (!value && !focused) {\n return (\n <Text color={colors.dimGray}>\n {placeholder}\n </Text>\n );\n }\n\n return (\n <Text color={colors.white}>\n {displayValue}\n {focused && <Text color={colors.cyan}>{cursor}</Text>}\n </Text>\n );\n}\n","import { Box, Text, useInput } from 'ink';\nimport { colors, symbols } from '../theme.js';\n\nexport interface RadioOption {\n id: string;\n label: string;\n}\n\ninterface RadioGroupProps {\n options: RadioOption[];\n selected: string;\n onChange: (id: string) => void;\n focused?: boolean;\n}\n\n/**\n * Radio button group component\n * \n * ● Option 1\n * ○ Option 2\n */\nexport function RadioGroup({ options, selected, onChange, focused = false }: RadioGroupProps) {\n useInput((input, key) => {\n if (!focused) return;\n\n const currentIndex = options.findIndex(opt => opt.id === selected);\n \n if (key.upArrow) {\n const newIndex = currentIndex > 0 ? currentIndex - 1 : options.length - 1;\n onChange(options[newIndex].id);\n } else if (key.downArrow) {\n const newIndex = currentIndex < options.length - 1 ? currentIndex + 1 : 0;\n onChange(options[newIndex].id);\n } else if (input === ' ') {\n // Space toggles current selection (useful for single option scenarios)\n // For radio groups, this just confirms current selection\n }\n }, { isActive: focused });\n\n return (\n <Box flexDirection=\"column\">\n {options.map((option) => {\n const isSelected = option.id === selected;\n const isFocusedOption = focused && isSelected;\n \n return (\n <Box key={option.id} marginY={0}>\n <Text color={isSelected ? colors.cyan : colors.gray}>\n {isSelected ? symbols.filledDot : symbols.hollowDot}\n </Text>\n <Text> </Text>\n <Text\n color={isFocusedOption ? colors.white : (isSelected ? colors.gray : colors.dimGray)}\n bold={isFocusedOption}\n >\n {option.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n","import { Box, Text, useStdout } from 'ink';\nimport { Banner, HorizontalSelector, type CardOption } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport type ModeSelection = 'local' | 'runner';\n\nexport interface ModeSelectScreenProps {\n onSelect: (mode: ModeSelection) => void;\n onEscape?: () => void;\n}\n\nconst modeOptions: CardOption[] = [\n {\n id: 'local',\n title: 'Local Mode',\n description: 'Run OpenBuilder on this machine',\n },\n {\n id: 'runner',\n title: 'Runner Mode',\n description: 'Connect to a remote server',\n },\n];\n\n/**\n * Initial mode selection screen\n * Shows two horizontal cards for Local Mode vs Runner Mode\n */\nexport function ModeSelectScreen({ onSelect, onEscape }: ModeSelectScreenProps) {\n const { stdout } = useStdout();\n \n // Check for available update (set by auto-update check in index.ts)\n const updateAvailable = process.env.OPENBUILDER_UPDATE_AVAILABLE;\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = updateAvailable ? 20 : 18; // Extra space for update notice\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n const handleSelect = (option: CardOption) => {\n onSelect(option.id as ModeSelection);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Update available notice */}\n {updateAvailable && (\n <Box marginTop={1}>\n <Text color={colors.cyan}>⬆ Update available: </Text>\n <Text color={colors.success}>{updateAvailable}</Text>\n <Text color={colors.dimGray}> — Run </Text>\n <Text color={colors.cyan}>openbuilder upgrade</Text>\n <Text color={colors.dimGray}> to update</Text>\n </Box>\n )}\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Horizontal card selector */}\n <HorizontalSelector\n options={modeOptions}\n onSelect={handleSelect}\n onEscape={onEscape}\n />\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Use {'<-'} {'->'} arrows to navigate, Enter to select, Esc to exit\n </Text>\n </Box>\n );\n}\n","import { Box, Text, useInput, useStdout } from 'ink';\nimport { Banner, Menu, type MenuItem } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport type LocalAction = 'init' | 'start';\n\nexport interface LocalModeScreenProps {\n isInitialized: boolean;\n onSelect: (action: LocalAction) => void;\n onEscape: () => void;\n}\n\n/**\n * Local mode options screen\n * Shows Initialize/Reinitialize and Start options based on config state\n */\nexport function LocalModeScreen({ isInitialized, onSelect, onEscape }: LocalModeScreenProps) {\n const { stdout } = useStdout();\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 16;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n // Handle escape key\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n }\n });\n\n // Build menu items based on initialization state\n const menuItems: MenuItem[] = [];\n \n if (!isInitialized) {\n menuItems.push({\n id: 'init',\n label: 'Initialize OpenBuilder',\n description: 'Set up workspace and configuration',\n });\n } else {\n menuItems.push({\n id: 'init',\n label: 'Reinitialize OpenBuilder',\n description: 'Reset and reconfigure',\n });\n menuItems.push({\n id: 'start',\n label: 'Start OpenBuilder',\n description: 'Launch the full stack',\n });\n }\n\n const handleSelect = (item: MenuItem) => {\n onSelect(item.id as LocalAction);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.cyan} bold>Local Mode</Text>\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Status indicator */}\n {isInitialized ? (\n <Text color={colors.success}>● Configured</Text>\n ) : (\n <Text color={colors.warning}>○ Not configured</Text>\n )}\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Menu */}\n <Menu items={menuItems} onSelect={handleSelect} />\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Use up/down arrows to navigate, Enter to select, Esc to go back\n </Text>\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { Banner, MaskedInput } from '../components/index.js';\nimport { colors } from '../theme.js';\n\nexport interface RunnerConfig {\n key: string;\n runnerId: string;\n}\n\nexport interface RunnerModeScreenProps {\n initialKey?: string;\n initialRunnerId?: string;\n onStart: (config: RunnerConfig) => void;\n onEscape: () => void;\n}\n\ntype FocusedField = 'key' | 'runnerId';\n\n// Fixed label width for alignment\nconst LABEL_WIDTH = 14;\n\n/**\n * Runner mode screen with key and runner ID inputs\n */\nexport function RunnerModeScreen({\n initialKey = '',\n initialRunnerId = '',\n onStart,\n onEscape,\n}: RunnerModeScreenProps) {\n const { stdout } = useStdout();\n const [runnerId, setRunnerId] = useState(initialRunnerId);\n const [focusedField, setFocusedField] = useState<FocusedField>('key');\n \n // We need a separate state for the actual key value since MaskedInput doesn't use ink-text-input\n const [runnerKey, setRunnerKey] = useState(initialKey);\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 18;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n const isLastField = focusedField === 'runnerId';\n\n const handleSubmit = () => {\n if (runnerKey.trim()) {\n onStart({ key: runnerKey, runnerId: runnerId.trim() || initialRunnerId });\n }\n };\n\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n return;\n }\n\n // Shift+Enter to submit immediately from any field\n if (key.return && key.shift) {\n handleSubmit();\n return;\n }\n\n // Regular Enter moves to next field, or submits if on last field\n if (key.return && !key.shift) {\n if (isLastField) {\n handleSubmit();\n } else {\n setFocusedField('runnerId');\n }\n return;\n }\n\n if (key.tab || key.downArrow) {\n setFocusedField(prev => prev === 'key' ? 'runnerId' : 'key');\n return;\n }\n\n if (key.upArrow) {\n setFocusedField(prev => prev === 'runnerId' ? 'key' : 'runnerId');\n return;\n }\n });\n\n const handleKeyChange = (value: string) => {\n setRunnerKey(value);\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.purple} bold>Runner Mode</Text>\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Form fields */}\n <Box flexDirection=\"column\" gap={1}>\n {/* Runner Key (masked) */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'key' ? colors.cyan : colors.gray}>\n Runner Key\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'key' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n <MaskedInput\n value={runnerKey}\n onChange={handleKeyChange}\n placeholder=\"Paste your runner key\"\n focused={focusedField === 'key'}\n />\n </Box>\n </Box>\n \n {/* Auto-fill hint */}\n {initialKey && focusedField === 'key' && (\n <Box marginLeft={LABEL_WIDTH + 2}>\n <Text color={colors.dimGray} italic>\n (auto-filled from previous config)\n </Text>\n </Box>\n )}\n \n {/* Runner ID */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'runnerId' ? colors.cyan : colors.gray}>\n Runner ID\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'runnerId' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n {focusedField === 'runnerId' ? (\n <TextInput\n value={runnerId}\n onChange={setRunnerId}\n placeholder={initialRunnerId || 'Enter runner ID'}\n />\n ) : (\n <Text color={runnerId ? colors.white : colors.dimGray}>\n {runnerId || initialRunnerId || 'Enter runner ID'}\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n \n {/* Spacer */}\n <Box marginTop={3} />\n \n {/* Help text */}\n <Text color={colors.dimGray}>\n Enter: {isLastField ? 'Start runner' : 'Next field'} | Shift+Enter: Start now | Esc: Back\n </Text>\n \n {/* Validation message */}\n {!runnerKey.trim() && (\n <Box marginTop={1}>\n <Text color={colors.warning}>Runner key is required</Text>\n </Box>\n )}\n </Box>\n );\n}\n","import { useState } from 'react';\nimport { Box, Text, useInput, useStdout } from 'ink';\nimport TextInput from 'ink-text-input';\nimport { Banner, RadioGroup, type RadioOption } from '../components/index.js';\nimport { colors, symbols } from '../theme.js';\n\nexport interface InitFormConfig {\n branch: string;\n workspace: string;\n useNeon: boolean;\n databaseUrl?: string;\n}\n\nexport interface ConfigFormScreenProps {\n initialConfig?: Partial<InitFormConfig>;\n onSubmit: (config: InitFormConfig) => void;\n onEscape: () => void;\n error?: string; // Error message to display (e.g., \"Branch not found\")\n}\n\ntype FocusedField = 'branch' | 'workspace' | 'database' | 'databaseUrl';\n\nconst databaseOptions: RadioOption[] = [\n { id: 'neon', label: 'Use Neon (automatic setup)' },\n { id: 'custom', label: 'Custom PostgreSQL' },\n];\n\n// Fixed label width for alignment\nconst LABEL_WIDTH = 14;\n\n/**\n * Interactive configuration form for init/reinit\n */\nexport function ConfigFormScreen({\n initialConfig,\n onSubmit,\n onEscape,\n error,\n}: ConfigFormScreenProps) {\n const { stdout } = useStdout();\n \n // Form state\n const [branch, setBranch] = useState(initialConfig?.branch || 'main');\n \n // Clear error when user starts typing in branch field\n const handleBranchChange = (value: string) => {\n setBranch(value);\n };\n const [workspace, setWorkspace] = useState(\n initialConfig?.workspace || '~/openbuilder-workspace'\n );\n const [databaseType, setDatabaseType] = useState<'neon' | 'custom'>(\n initialConfig?.useNeon === false ? 'custom' : 'neon'\n );\n const [databaseUrl, setDatabaseUrl] = useState(initialConfig?.databaseUrl || '');\n \n const [focusedField, setFocusedField] = useState<FocusedField>('branch');\n \n // Calculate vertical centering\n const terminalHeight = stdout?.rows || 24;\n const contentHeight = 22;\n const topPadding = Math.max(0, Math.floor((terminalHeight - contentHeight) / 3));\n\n // Field order for navigation\n const fieldOrder: FocusedField[] = databaseType === 'custom' \n ? ['branch', 'workspace', 'database', 'databaseUrl']\n : ['branch', 'workspace', 'database'];\n\n const currentFieldIndex = fieldOrder.indexOf(focusedField);\n const isLastField = currentFieldIndex === fieldOrder.length - 1;\n\n useInput((input, key) => {\n if (key.escape) {\n onEscape();\n return;\n }\n\n // Shift+Enter to submit immediately from any field\n if (key.return && key.shift) {\n handleSubmit();\n return;\n }\n\n // Regular Enter moves to next field, or submits if on last field\n if (key.return && !key.shift) {\n if (isLastField) {\n handleSubmit();\n } else {\n setFocusedField(fieldOrder[currentFieldIndex + 1]);\n }\n return;\n }\n\n // Tab or Down arrow moves to next field\n if (key.tab || key.downArrow) {\n if (focusedField !== 'database') {\n const nextIndex = (currentFieldIndex + 1) % fieldOrder.length;\n setFocusedField(fieldOrder[nextIndex]);\n }\n return;\n }\n\n // Up arrow moves to previous field\n if (key.upArrow) {\n if (focusedField !== 'database') {\n const prevIndex = currentFieldIndex > 0 ? currentFieldIndex - 1 : fieldOrder.length - 1;\n setFocusedField(fieldOrder[prevIndex]);\n }\n return;\n }\n });\n\n const handleSubmit = () => {\n const config: InitFormConfig = {\n branch: branch.trim() || 'main',\n workspace: workspace.trim() || '~/openbuilder-workspace',\n useNeon: databaseType === 'neon',\n databaseUrl: databaseType === 'custom' ? databaseUrl.trim() : undefined,\n };\n onSubmit(config);\n };\n\n const handleDatabaseTypeChange = (id: string) => {\n setDatabaseType(id as 'neon' | 'custom');\n // If switching to custom, focus the URL field\n if (id === 'custom') {\n setFocusedField('databaseUrl');\n }\n };\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" paddingTop={topPadding}>\n {/* Banner */}\n <Banner />\n \n {/* Spacer */}\n <Box marginTop={1} />\n \n {/* Title */}\n <Text color={colors.cyan} bold>Configure OpenBuilder</Text>\n \n {/* Spacer */}\n <Box marginTop={2} />\n \n {/* Form fields */}\n <Box flexDirection=\"column\" gap={1}>\n {/* Branch - editable branch name */}\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={error ? colors.error : (focusedField === 'branch' ? colors.cyan : colors.gray)}>\n Branch\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={error ? colors.error : (focusedField === 'branch' ? colors.cyan : colors.darkGray)}\n paddingX={1}\n >\n {focusedField === 'branch' ? (\n <TextInput\n value={branch}\n onChange={handleBranchChange}\n placeholder=\"main\"\n />\n ) : (\n <Text color={branch ? colors.white : colors.dimGray}>\n {branch || 'main'}\n </Text>\n )}\n </Box>\n </Box>\n {/* Error message below branch field */}\n {error && (\n <Box marginLeft={LABEL_WIDTH + 2}>\n <Text color={colors.error}>\n {symbols.cross} {error}\n </Text>\n </Box>\n )}\n </Box>\n \n {/* Workspace */}\n <Box flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'workspace' ? colors.cyan : colors.gray}>\n Workspace\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'workspace' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={40}\n >\n {focusedField === 'workspace' ? (\n <TextInput\n value={workspace}\n onChange={setWorkspace}\n placeholder=\"~/openbuilder-workspace\"\n />\n ) : (\n <Text color={workspace ? colors.white : colors.dimGray}>\n {workspace || '~/openbuilder-workspace'}\n </Text>\n )}\n </Box>\n </Box>\n \n {/* Database type */}\n <Box marginTop={1} flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'database' ? colors.cyan : colors.gray}>\n Database\n </Text>\n </Box>\n <RadioGroup\n options={databaseOptions}\n selected={databaseType}\n onChange={handleDatabaseTypeChange}\n focused={focusedField === 'database'}\n />\n </Box>\n \n {/* Custom database URL (only shown when custom is selected) */}\n {databaseType === 'custom' && (\n <Box marginTop={1} flexDirection=\"row\" alignItems=\"center\">\n <Box width={LABEL_WIDTH} justifyContent=\"flex-end\" marginRight={1}>\n <Text color={focusedField === 'databaseUrl' ? colors.cyan : colors.gray}>\n URL\n </Text>\n </Box>\n <Box\n borderStyle=\"round\"\n borderColor={focusedField === 'databaseUrl' ? colors.cyan : colors.darkGray}\n paddingX={1}\n width={50}\n >\n {focusedField === 'databaseUrl' ? (\n <TextInput\n value={databaseUrl}\n onChange={setDatabaseUrl}\n placeholder=\"postgres://user:pass@host:5432/db\"\n />\n ) : (\n <Text color={databaseUrl ? colors.white : colors.dimGray}>\n {databaseUrl || 'postgres://user:pass@host:5432/db'}\n </Text>\n )}\n </Box>\n </Box>\n )}\n </Box>\n \n {/* Spacer */}\n <Box marginTop={3} />\n \n {/* Help text */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color={colors.dimGray}>\n Enter: {isLastField ? 'Start' : 'Next field'} | Shift+Enter: Start now | Esc: Back\n </Text>\n {databaseType === 'custom' && !databaseUrl.trim() && (\n <Box marginTop={1}>\n <Text color={colors.warning}>\n {symbols.hollowDot} Database URL required for custom PostgreSQL\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n","/**\n * Main TUI entry point - shown when running `openbuilder` without arguments\n * Implements a multi-screen flow: Mode Select -> Local/Runner Mode -> Config/Start\n */\n\nimport { useState } from 'react';\nimport { render } from 'ink';\nimport { userInfo } from 'node:os';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n ModeSelectScreen,\n LocalModeScreen,\n RunnerModeScreen,\n ConfigFormScreen,\n type ModeSelection,\n type LocalAction,\n type RunnerConfig,\n type InitFormConfig,\n} from '../tui/screens/index.js';\nimport { configManager } from '../utils/config-manager.js';\n\n/**\n * Screen state machine types\n */\ntype Screen =\n | { type: 'mode-select' }\n | { type: 'local-mode' }\n | { type: 'runner-mode' }\n | { type: 'config-form'; error?: string; lastBranch?: string };\n\ninterface AppState {\n screen: Screen;\n isInitialized: boolean;\n existingKey: string;\n existingRunnerId: string;\n existingWorkspace: string;\n}\n\n/**\n * Main TUI App component with screen navigation\n */\nfunction App({ \n initialState, \n onExit, \n onRunnerStart, \n onLocalStart, \n onInitStart,\n}: {\n initialState: AppState;\n onExit: () => void;\n onRunnerStart: (config: RunnerConfig) => void;\n onLocalStart: () => void;\n onInitStart: (config: InitFormConfig) => void;\n}) {\n const [state, setState] = useState<AppState>(initialState);\n\n // Screen navigation handlers\n const navigateTo = (screen: Screen) => {\n setState(prev => ({ ...prev, screen }));\n };\n \n // Navigate back to config form with error\n const navigateToConfigWithError = (error: string, lastBranch: string) => {\n setState(prev => ({ \n ...prev, \n screen: { type: 'config-form', error, lastBranch } \n }));\n };\n\n // Mode Select handlers\n const handleModeSelect = (mode: ModeSelection) => {\n if (mode === 'local') {\n navigateTo({ type: 'local-mode' });\n } else {\n navigateTo({ type: 'runner-mode' });\n }\n };\n\n // Local Mode handlers\n const handleLocalAction = (action: LocalAction) => {\n if (action === 'init') {\n navigateTo({ type: 'config-form' });\n } else if (action === 'start') {\n onLocalStart();\n }\n };\n\n // Runner Mode handler\n const handleRunnerStart = (config: RunnerConfig) => {\n onRunnerStart(config);\n };\n\n // Config Form handler - validates branch before proceeding\n const handleConfigSubmit = async (config: InitFormConfig) => {\n // Skip validation if using main branch (always exists)\n if (config.branch === 'main') {\n onInitStart(config);\n return;\n }\n \n // Validate branch exists before proceeding\n const { execSync } = await import('child_process');\n try {\n execSync(\n `git ls-remote --exit-code --heads https://github.com/codyde/openbuilder.git ${config.branch}`,\n { stdio: 'pipe' }\n );\n // Branch exists, proceed with init\n onInitStart(config);\n } catch {\n // Branch doesn't exist, show error\n navigateToConfigWithError(\n `Branch \"${config.branch}\" not found`,\n config.branch\n );\n }\n };\n\n // Render current screen\n switch (state.screen.type) {\n case 'mode-select':\n return (\n <ModeSelectScreen\n onSelect={handleModeSelect}\n onEscape={onExit}\n />\n );\n\n case 'local-mode':\n return (\n <LocalModeScreen\n isInitialized={state.isInitialized}\n onSelect={handleLocalAction}\n onEscape={() => navigateTo({ type: 'mode-select' })}\n />\n );\n\n case 'runner-mode':\n return (\n <RunnerModeScreen\n initialKey={state.existingKey}\n initialRunnerId={state.existingRunnerId}\n onStart={handleRunnerStart}\n onEscape={() => navigateTo({ type: 'mode-select' })}\n />\n );\n\n case 'config-form':\n return (\n <ConfigFormScreen\n initialConfig={{\n branch: state.screen.lastBranch || 'main',\n workspace: state.existingWorkspace || join(homedir(), 'openbuilder-workspace'),\n useNeon: true,\n }}\n onSubmit={handleConfigSubmit}\n onEscape={() => navigateTo({ type: 'local-mode' })}\n error={state.screen.error}\n />\n );\n\n default:\n return null;\n }\n}\n\n/**\n * Get system username for default runner ID\n */\nfunction getSystemUsername(): string {\n try {\n return userInfo().username;\n } catch {\n return process.env.USER || process.env.USERNAME || 'runner';\n }\n}\n\n/**\n * Run the main TUI menu\n */\nexport async function mainTUICommand(): Promise<void> {\n // Clear screen for fullscreen experience\n console.clear();\n\n const isInitialized = configManager.isInitialized();\n const existingKey = configManager.getSecret() || '';\n const config = configManager.get();\n // Use lastRunnerId if available, otherwise fall back to system username\n const existingRunnerId = config.runner?.lastRunnerId || getSystemUsername();\n const existingWorkspace = config.workspace || '';\n\n const initialState: AppState = {\n screen: { type: 'mode-select' },\n isInitialized,\n existingKey,\n existingRunnerId,\n existingWorkspace,\n };\n\n return new Promise((resolve, reject) => {\n let exitReason: 'exit' | 'runner-start' | 'local-start' | 'init-start' | null = null;\n let runnerConfig: RunnerConfig | null = null;\n let initConfig: InitFormConfig | null = null;\n\n const { unmount, waitUntilExit } = render(\n <App\n initialState={initialState}\n onExit={() => {\n exitReason = 'exit';\n unmount();\n }}\n onRunnerStart={(config) => {\n exitReason = 'runner-start';\n runnerConfig = config;\n unmount();\n }}\n onLocalStart={() => {\n exitReason = 'local-start';\n unmount();\n }}\n onInitStart={(config) => {\n exitReason = 'init-start';\n initConfig = config;\n unmount();\n }}\n />,\n {\n exitOnCtrlC: true,\n }\n );\n\n waitUntilExit().then(async () => {\n if (!exitReason) {\n // User pressed Ctrl+C\n console.clear();\n process.exit(0);\n }\n\n switch (exitReason) {\n case 'exit':\n console.clear();\n console.log('\\n Goodbye!\\n');\n process.exit(0);\n break;\n\n case 'runner-start':\n if (runnerConfig) {\n console.clear();\n await startRunner(runnerConfig);\n }\n break;\n\n case 'local-start':\n console.clear();\n await startLocalMode();\n break;\n\n case 'init-start':\n if (initConfig) {\n // Clear screen with ANSI codes to ensure clean slate\n process.stdout.write('\\x1b[2J\\x1b[H');\n await runInitialization(initConfig);\n }\n break;\n }\n\n resolve();\n }).catch(reject);\n });\n}\n\n/**\n * Start runner mode (connects to remote server)\n */\nasync function startRunner(config: RunnerConfig): Promise<void> {\n // Save the key to config for future use\n if (config.key) {\n const serverConfig = configManager.get('server') || {};\n configManager.set('server', {\n ...serverConfig,\n secret: config.key,\n });\n }\n\n // Save the runner ID to config for future use\n if (config.runnerId) {\n const runnerConf = configManager.get('runner') || {};\n configManager.set('runner', {\n ...runnerConf,\n lastRunnerId: config.runnerId,\n });\n }\n\n console.log('\\n Starting OpenBuilder Runner...\\n');\n console.log(` Runner ID: ${config.runnerId}`);\n console.log(' Connecting to remote server...\\n');\n\n const { runCommand } = await import('./run.js');\n await runCommand({\n secret: config.key,\n runnerId: config.runnerId,\n });\n}\n\n/**\n * Start local mode (full stack)\n */\nasync function startLocalMode(): Promise<void> {\n console.log('\\n Starting OpenBuilder in Local Mode...\\n');\n\n const { startCommand } = await import('./start.js');\n await startCommand({});\n}\n\n/**\n * Run initialization with form config\n */\nasync function runInitialization(config: InitFormConfig): Promise<void> {\n // Expand ~ in workspace path\n const workspace = config.workspace.startsWith('~')\n ? config.workspace.replace('~', homedir())\n : config.workspace;\n\n const { initTUICommand } = await import('./init-tui.js');\n \n // Build options based on form input\n const options: {\n workspace: string;\n branch: string;\n database?: string | boolean;\n yes: boolean;\n } = {\n workspace,\n branch: config.branch,\n yes: true,\n };\n\n // Handle database option\n if (config.useNeon) {\n options.database = true; // Use Neon auto-setup\n } else if (config.databaseUrl) {\n options.database = config.databaseUrl; // Custom connection string\n }\n\n await initTUICommand(options);\n}\n"],"names":["_jsx","_jsxs","LABEL_WIDTH"],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ import TextInput from 'ink-text-input';
|
|
|
15
15
|
import { g as getLogBuffer, i as initRunnerLogger, s as setFileLoggerTuiMode } from './runner-logger-instance-nDWv2h2T.js';
|
|
16
16
|
import 'node:fs';
|
|
17
17
|
import 'node:events';
|
|
18
|
-
import { h as hasStoredToken, g as getStoredToken, p as performOAuthLogin, s as storeToken } from './cli-auth-
|
|
18
|
+
import { h as hasStoredToken, g as getStoredToken, p as performOAuthLogin, s as storeToken } from './cli-auth-CHooQYR9.js';
|
|
19
19
|
import 'conf';
|
|
20
20
|
import '@anthropic-ai/claude-agent-sdk';
|
|
21
21
|
import '@openai/codex-sdk';
|
|
@@ -668,4 +668,4 @@ async function runCommand(options) {
|
|
|
668
668
|
}
|
|
669
669
|
|
|
670
670
|
export { runCommand };
|
|
671
|
-
//# sourceMappingURL=run-
|
|
671
|
+
//# sourceMappingURL=run-ImqaRH0K.js.map
|