boten-gemma 0.2.0 → 0.2.1

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/llm/auth/oauth-callback.ts", "../../src/llm/auth/oauth.ts", "../../src/llm/auth/token-store.ts", "../../src/llm/auth/resolver.ts", "../../src/setup/copy-templates.ts", "../../src/daemon/launchd.ts", "../../src/daemon/systemd.ts", "../../src/daemon/service.ts", "../../src/setup/wizard.tsx", "../../src/setup/components/Banner.tsx", "../../src/shared/ascii-art.ts", "../../src/setup/components/StepHeader.tsx", "../../src/setup/steps/StepAuth.tsx", "../../src/setup/components/StatusLine.tsx", "../../src/setup/steps/StepChannels.tsx", "../../src/setup/steps/StepWorkspace.tsx", "../../src/setup/steps/StepService.tsx"],
4
- "sourcesContent": ["// src/llm/auth/oauth-callback.ts \u2014 Temporary local HTTP server for OAuth redirect\n\nimport http from 'node:http';\nimport { URL } from 'node:url';\n\nexport interface CallbackResult {\n code: string;\n state?: string;\n}\n\n/**\n * Starts a temporary HTTP server on a random port, waits for the OAuth callback,\n * extracts the authorization code, then shuts down.\n */\nexport const OAUTH_CALLBACK_PORT = 18788;\n\nexport function startCallbackServer(port: number = OAUTH_CALLBACK_PORT): {\n port: number;\n result: Promise<CallbackResult>;\n close: () => void;\n} {\n let resolveResult: (result: CallbackResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<CallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = http.createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400);\n res.end('Bad request');\n return;\n }\n\n const url = new URL(req.url, `http://localhost`);\n\n if (url.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n\n const code = url.searchParams.get('code');\n const error = url.searchParams.get('error');\n const state = url.searchParams.get('state') ?? undefined;\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(errorPage(error));\n rejectResult(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (!code) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(errorPage('No authorization code received'));\n rejectResult(new Error('No authorization code in callback'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(successPage());\n resolveResult({ code, state });\n });\n\n server.listen(port, 'localhost');\n\n // Auto-close after 5 minutes to avoid leaking\n const timeout = setTimeout(() => {\n server.close();\n rejectResult(new Error('OAuth callback timed out after 5 minutes'));\n }, 5 * 60 * 1000);\n\n // Clean up timeout when result resolves\n resultPromise.finally(() => {\n clearTimeout(timeout);\n server.close();\n });\n\n return {\n port,\n result: resultPromise,\n close: () => {\n clearTimeout(timeout);\n server.close();\n },\n };\n}\n\n/**\n * Extracts the authorization code from a pasted redirect URL.\n * Used in headless/VPS mode when there's no local browser.\n */\nexport function extractCodeFromUrl(redirectUrl: string): CallbackResult {\n const url = new URL(redirectUrl);\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state') ?? undefined;\n\n if (!code) {\n throw new Error('No authorization code found in the URL. Make sure you copied the full URL.');\n }\n\n return { code, state };\n}\n\nfunction successPage(): string {\n return `<!DOCTYPE html>\n<html><body style=\"font-family:system-ui;text-align:center;padding:60px\">\n<h1>Authenticated!</h1>\n<p>You can close this window and return to your terminal.</p>\n</body></html>`;\n}\n\nfunction errorPage(error: string): string {\n return `<!DOCTYPE html>\n<html><body style=\"font-family:system-ui;text-align:center;padding:60px\">\n<h1>Authentication Failed</h1>\n<p>${error}</p>\n<p>Please try again.</p>\n</body></html>`;\n}\n", "// src/llm/auth/oauth.ts \u2014 Full Google OAuth2 authorization code flow\n\nimport { existsSync, readFileSync, readdirSync, realpathSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { delimiter, dirname, join } from 'node:path';\nimport { startCallbackServer, extractCodeFromUrl, OAUTH_CALLBACK_PORT } from './oauth-callback.js';\nimport { TokenStore } from './token-store.js';\nimport type { OAuthClientConfig, StoredTokens } from './types.js';\n\n// OAuth client resolution order:\n// 1. Environment variables (GEMMA_OAUTH_CLIENT_ID / GEMMA_OAUTH_CLIENT_SECRET)\n// 2. Extract from @google/gemini-cli-core (own dependency \u2192 local node_modules \u2192 global CLI)\n// 3. Config file (gemma.json model.oauth.clientId / clientSecret)\n// 4. Fail with helpful error message\n\nconst SCOPES = [\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/userinfo.email',\n 'https://www.googleapis.com/auth/userinfo.profile',\n];\nconst AUTH_ENDPOINT = 'https://accounts.google.com/o/oauth2/v2/auth';\nconst TOKEN_ENDPOINT = 'https://oauth2.googleapis.com/token';\n\n// \u2500\u2500 Gemini CLI credential extraction \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet cachedGeminiCliCredentials: OAuthClientConfig | null = null;\n\n/**\n * Find an executable by name in PATH, handling Windows extensions.\n */\nfunction findInPath(name: string): string | null {\n const exts = process.platform === 'win32' ? ['.cmd', '.bat', '.exe', ''] : [''];\n for (const dir of (process.env.PATH ?? '').split(delimiter)) {\n for (const ext of exts) {\n const p = join(dir, name + ext);\n if (existsSync(p)) {\n return p;\n }\n }\n }\n return null;\n}\n\n/**\n * Recursively search for a file by name within a directory tree.\n */\nfunction findFile(dir: string, name: string, depth: number): string | null {\n if (depth <= 0) return null;\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const p = join(dir, entry.name);\n if (entry.isFile() && entry.name === name) return p;\n if (entry.isDirectory() && !entry.name.startsWith('.')) {\n const found = findFile(p, name, depth - 1);\n if (found) return found;\n }\n }\n } catch {\n // Permission denied or other FS errors\n }\n return null;\n}\n\n/**\n * Extract OAuth client credentials from the installed Gemini CLI.\n *\n * Locates the `gemini` binary in PATH, resolves symlinks to find the\n * CLI installation directory, then reads the bundled oauth2.js file\n * and extracts the client ID and secret via regex.\n *\n * Based on OpenClaw's google-gemini-cli-auth extension (MIT license).\n */\nexport function extractGeminiCliCredentials(): OAuthClientConfig | null {\n if (cachedGeminiCliCredentials) return cachedGeminiCliCredentials;\n\n const result = extractFromOwnDependency() ?? extractFromLocalNodeModules() ?? extractFromGlobalCli();\n if (result) {\n cachedGeminiCliCredentials = result;\n }\n return result;\n}\n\n/**\n * Resolve @google/gemini-cli-core from Gemma's own dependency tree.\n * Works for global npm installs, Docker, and any scenario where\n * gemini-cli-core is a direct dependency of boten-gemma.\n */\nfunction extractFromOwnDependency(): OAuthClientConfig | null {\n try {\n const require = createRequire(import.meta.url);\n const corePkg = require.resolve('@google/gemini-cli-core/package.json');\n const coreDir = dirname(corePkg);\n const oauth2Path = join(coreDir, 'dist', 'src', 'code_assist', 'oauth2.js');\n if (existsSync(oauth2Path)) {\n return parseOAuth2File(readFileSync(oauth2Path, 'utf8'));\n }\n } catch {\n // @google/gemini-cli-core not in our dependency tree\n }\n return null;\n}\n\n/**\n * Try reading oauth2.js from the project's local node_modules.\n * Works on VPS deployments where @google/gemini-cli-core is a project dependency.\n */\nfunction extractFromLocalNodeModules(): OAuthClientConfig | null {\n try {\n // Look relative to CWD (project root)\n const localPath = join(\n process.cwd(), 'node_modules', '@google', 'gemini-cli-core',\n 'dist', 'src', 'code_assist', 'oauth2.js',\n );\n if (existsSync(localPath)) {\n return parseOAuth2File(readFileSync(localPath, 'utf8'));\n }\n } catch {\n // Not installed locally\n }\n return null;\n}\n\n/**\n * Try extracting credentials from a globally installed Gemini CLI.\n * Finds the `gemini` binary on PATH, resolves to the package directory,\n * and reads the bundled oauth2.js file.\n */\nfunction extractFromGlobalCli(): OAuthClientConfig | null {\n try {\n const geminiPath = findInPath('gemini');\n if (!geminiPath) return null;\n\n const resolvedPath = realpathSync(geminiPath);\n const geminiCliDir = dirname(dirname(resolvedPath));\n\n const searchPaths = [\n join(geminiCliDir, 'node_modules', '@google', 'gemini-cli-core', 'dist', 'src', 'code_assist', 'oauth2.js'),\n join(geminiCliDir, 'node_modules', '@google', 'gemini-cli-core', 'dist', 'code_assist', 'oauth2.js'),\n ];\n\n for (const p of searchPaths) {\n if (existsSync(p)) {\n const result = parseOAuth2File(readFileSync(p, 'utf8'));\n if (result) return result;\n }\n }\n\n // Fallback: recursive search for oauth2.js (depth-limited)\n const found = findFile(geminiCliDir, 'oauth2.js', 10);\n if (found) {\n return parseOAuth2File(readFileSync(found, 'utf8'));\n }\n } catch {\n // Gemini CLI not installed or extraction failed\n }\n return null;\n}\n\n/** Extract client ID and secret from the content of oauth2.js via regex. */\nfunction parseOAuth2File(content: string): OAuthClientConfig | null {\n const idMatch = content.match(/(\\d+-[a-z0-9]+\\.apps\\.googleusercontent\\.com)/);\n const secretMatch = content.match(/(GOCSPX-[A-Za-z0-9_-]+)/);\n if (idMatch && secretMatch) {\n return { clientId: idMatch[1], clientSecret: secretMatch[1] };\n }\n return null;\n}\n\n// \u2500\u2500 OAuth client resolution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getOAuthClient(config?: Partial<OAuthClientConfig>): OAuthClientConfig {\n // 1. Environment variables (user override)\n const envClientId = process.env.GEMMA_OAUTH_CLIENT_ID?.trim();\n const envClientSecret = process.env.GEMMA_OAUTH_CLIENT_SECRET?.trim();\n if (envClientId && envClientSecret) {\n return { clientId: envClientId, clientSecret: envClientSecret };\n }\n\n // 2. Extract from installed Gemini CLI\n const extracted = extractGeminiCliCredentials();\n if (extracted) {\n return extracted;\n }\n\n // 3. Config file (gemma.json model.oauth)\n if (config?.clientId && config?.clientSecret) {\n return { clientId: config.clientId, clientSecret: config.clientSecret };\n }\n\n // 4. No credentials available\n throw new Error(\n 'Missing OAuth client credentials.\\n\\n' +\n 'Gemma borrows OAuth credentials from the Gemini CLI.\\n' +\n 'Install it first:\\n\\n' +\n ' npm install -g @google/gemini-cli\\n\\n' +\n 'Or set credentials manually:\\n' +\n ' - Environment: GEMMA_OAUTH_CLIENT_ID + GEMMA_OAUTH_CLIENT_SECRET\\n' +\n ' - Config: model.oauth.clientId + model.oauth.clientSecret in gemma.json',\n );\n}\n\n/**\n * Build the Google OAuth2 authorization URL.\n */\nfunction buildAuthUrl(clientId: string, redirectUri: string, state?: string): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: SCOPES.join(' '),\n access_type: 'offline',\n prompt: 'consent',\n });\n if (state) {\n params.set('state', state);\n }\n return `${AUTH_ENDPOINT}?${params.toString()}`;\n}\n\n/**\n * Exchange an authorization code for tokens.\n */\nasync function exchangeCode(\n code: string,\n redirectUri: string,\n client: OAuthClientConfig,\n): Promise<StoredTokens> {\n const response = await fetch(TOKEN_ENDPOINT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n code,\n client_id: client.clientId,\n client_secret: client.clientSecret,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code',\n }),\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Token exchange failed (${response.status}): ${body}`);\n }\n\n const data = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n scope: string;\n token_type: string;\n id_token?: string;\n };\n\n if (!data.refresh_token) {\n throw new Error(\n 'No refresh token received. This can happen if you already authorized this app. ' +\n 'Revoke access at https://myaccount.google.com/permissions and try again.',\n );\n }\n\n // Try to extract email from id_token if present (JWT payload)\n let email: string | undefined;\n if (data.id_token) {\n try {\n const payload = JSON.parse(\n Buffer.from(data.id_token.split('.')[1], 'base64url').toString(),\n );\n email = payload.email;\n } catch {\n // Not critical\n }\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expiry_date: Date.now() + data.expires_in * 1000,\n scope: data.scope,\n email,\n obtained_at: new Date().toISOString(),\n };\n}\n\n/**\n * Detect whether we're in a headless environment (no browser available).\n */\nfunction isHeadless(): boolean {\n // SSH session, no DISPLAY on Linux, CI environments\n if (process.env.SSH_CONNECTION || process.env.SSH_CLIENT) return true;\n if (process.platform === 'linux' && !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY) return true;\n if (process.env.CI) return true;\n return false;\n}\n\nexport interface OAuthFlowOptions {\n client: OAuthClientConfig;\n tokenStore: TokenStore;\n /** Override headless detection (for testing) */\n forceHeadless?: boolean;\n /** readline interface for headless mode input */\n readline?: { question(prompt: string): Promise<string> };\n /** Logger function */\n log?: (msg: string) => void;\n}\n\n/**\n * Run the full OAuth flow: open browser (or print URL), exchange code, save tokens.\n */\nexport async function runOAuthFlow(options: OAuthFlowOptions): Promise<StoredTokens> {\n const { client, tokenStore, log = console.log } = options;\n const headless = options.forceHeadless ?? isHeadless();\n\n if (headless) {\n return runHeadlessFlow(options);\n }\n\n return runDesktopFlow(options);\n}\n\nasync function runDesktopFlow(options: OAuthFlowOptions): Promise<StoredTokens> {\n const { client, tokenStore, log = console.log, readline } = options;\n\n const redirectUri = `http://localhost:${OAUTH_CALLBACK_PORT}/callback`;\n const authUrl = buildAuthUrl(client.clientId, redirectUri);\n\n // Try to start callback server\n let callback: ReturnType<typeof startCallbackServer> | undefined;\n try {\n callback = startCallbackServer();\n } catch {\n log(' Could not start callback server (port in use?).');\n }\n\n // Open browser\n log('\\n Opening browser for Google sign-in...\\n');\n try {\n const open = (await import('open')).default;\n await open(authUrl);\n } catch {\n log(' Could not open browser. Open this URL manually:');\n log(`\\n ${authUrl}\\n`);\n }\n\n let code: string;\n\n if (callback) {\n // Race: callback server vs manual paste\n log(' Waiting for callback... If the page shows an error,');\n log(' paste the full URL from your browser here instead.\\n');\n\n const callbackPromise = callback.result.then(r => r.code);\n const pastePromise = readline\n ? readline.question(' Paste redirect URL (or wait for auto-callback): ').then(url => {\n const trimmed = url.trim();\n if (!trimmed) throw new Error('empty');\n return extractCodeFromUrl(trimmed).code;\n })\n : new Promise<string>(() => {}); // never resolves if no readline\n\n try {\n code = await Promise.race([callbackPromise, pastePromise]);\n } finally {\n callback.close();\n }\n } else {\n // No callback server \u2014 manual paste only\n log(' After signing in, copy the full URL from your browser\\n');\n if (!readline) {\n throw new Error('No callback server and no readline available.');\n }\n const pastedUrl = await readline.question(' Paste redirect URL: ');\n code = extractCodeFromUrl(pastedUrl.trim()).code;\n }\n\n const tokens = await exchangeCode(code, redirectUri, client);\n await tokenStore.save(tokens);\n\n log(`\\n Authenticated as ${tokens.email ?? 'unknown'}`);\n log(' Tokens saved to ~/.gemma/auth/tokens.json\\n');\n return tokens;\n}\n\nasync function runHeadlessFlow(options: OAuthFlowOptions): Promise<StoredTokens> {\n const { client, tokenStore, log = console.log, readline } = options;\n\n const redirectUri = `http://localhost:${OAUTH_CALLBACK_PORT}/callback`;\n const authUrl = buildAuthUrl(client.clientId, redirectUri);\n\n log('');\n log(' No browser detected. Open this URL on any device:');\n log('');\n log(` ${authUrl}`);\n log('');\n log(' After approving, your browser will redirect to a URL');\n log(` starting with ${redirectUri}?code=...`);\n log(' The page will show an error \u2014 that\\'s expected.');\n log('');\n log(' Copy the FULL URL from your browser\\'s address bar');\n log(' and paste it below.');\n log('');\n\n if (!readline) {\n throw new Error(\n 'Headless OAuth flow requires a readline interface to accept the pasted URL.',\n );\n }\n\n const pastedUrl = await readline.question(' Paste redirect URL: ');\n const { code } = extractCodeFromUrl(pastedUrl.trim());\n\n const tokens = await exchangeCode(code, redirectUri, client);\n await tokenStore.save(tokens);\n\n log(`\\n Authenticated as ${tokens.email ?? 'unknown'}`);\n log(' Tokens saved to ~/.gemma/auth/tokens.json\\n');\n return tokens;\n}\n", "// src/llm/auth/token-store.ts \u2014 Read/write/refresh cached OAuth tokens\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { StoredTokens, OAuthClientConfig } from './types.js';\n\nconst REFRESH_BUFFER_MS = 5 * 60 * 1000; // Refresh 5 minutes before expiry\n\nconst TOKEN_REFRESH_TIMEOUT_MS = 15_000;\nconst TOKEN_REFRESH_RETRIES = 3;\n\nclass TokenRefreshError extends Error {\n readonly status: number;\n constructor(status: number, body: string) {\n super(`Token refresh failed (${status}): ${body}`);\n this.name = 'TokenRefreshError';\n this.status = status;\n }\n}\n\nexport class TokenStore {\n private tokens: StoredTokens | null = null;\n private tokensPath: string;\n private client: OAuthClientConfig;\n private refreshPromise: Promise<void> | null = null;\n\n constructor(gemmaHome: string, client: OAuthClientConfig) {\n this.tokensPath = path.join(gemmaHome, 'auth', 'tokens.json');\n this.client = client;\n }\n\n async load(): Promise<boolean> {\n try {\n const raw = await fs.readFile(this.tokensPath, 'utf-8');\n this.tokens = JSON.parse(raw) as StoredTokens;\n return true;\n } catch {\n return false;\n }\n }\n\n async save(tokens: StoredTokens): Promise<void> {\n this.tokens = tokens;\n const dir = path.dirname(this.tokensPath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(this.tokensPath, JSON.stringify(tokens, null, 2), 'utf-8');\n // chmod 600 \u2014 owner read/write only (best-effort on Windows)\n try {\n await fs.chmod(this.tokensPath, 0o600);\n } catch {\n // chmod may not work on Windows; that's acceptable\n }\n }\n\n async getAccessToken(): Promise<string> {\n if (!this.tokens) {\n throw new Error('No OAuth tokens loaded. Run \"gemma auth --google\" first.');\n }\n\n // Refresh if expired or expiring within 5 minutes\n if (Date.now() > this.tokens.expiry_date - REFRESH_BUFFER_MS) {\n await this.refresh();\n }\n\n return this.tokens.access_token;\n }\n\n getEmail(): string | undefined {\n return this.tokens?.email;\n }\n\n hasTokens(): boolean {\n return this.tokens !== null;\n }\n\n /**\n * Refresh the access token. Uses a mutex so concurrent callers coalesce\n * into a single refresh request, and retries transient network failures.\n */\n private async refresh(): Promise<void> {\n // Coalesce concurrent refresh calls into a single request\n if (this.refreshPromise) return this.refreshPromise;\n this.refreshPromise = this.doRefresh().finally(() => {\n this.refreshPromise = null;\n });\n return this.refreshPromise;\n }\n\n private async doRefresh(): Promise<void> {\n if (!this.tokens?.refresh_token) {\n throw new Error('No refresh token available. Run \"gemma auth --google\" to re-authenticate.');\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < TOKEN_REFRESH_RETRIES; attempt++) {\n try {\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: this.client.clientId,\n client_secret: this.client.clientSecret,\n refresh_token: this.tokens!.refresh_token,\n grant_type: 'refresh_token',\n }),\n signal: AbortSignal.timeout(TOKEN_REFRESH_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n const body = await response.text();\n const err = new TokenRefreshError(response.status, body);\n // Client errors (400 invalid_grant, 401, 403) won't resolve on retry \u2014 fail fast\n if (response.status >= 400 && response.status < 500) throw err;\n // Server errors (5xx) are retryable\n lastError = err;\n if (attempt < TOKEN_REFRESH_RETRIES - 1) {\n const delay = 1000 * Math.pow(2, attempt);\n console.log(`[TokenStore] Refresh failed (${response.status}), retry in ${delay / 1000}s...`);\n await new Promise((r) => setTimeout(r, delay));\n }\n continue;\n }\n\n const data = (await response.json()) as {\n access_token: string;\n expires_in: number;\n token_type: string;\n };\n\n this.tokens!.access_token = data.access_token;\n this.tokens!.expiry_date = Date.now() + data.expires_in * 1000;\n\n await this.save(this.tokens!);\n return;\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n // Non-retryable errors (including 4xx re-thrown above) \u2014 fail immediately\n if (lastError instanceof TokenRefreshError && lastError.status >= 400 && lastError.status < 500) throw lastError;\n if (attempt < TOKEN_REFRESH_RETRIES - 1) {\n const delay = 1000 * Math.pow(2, attempt);\n console.log(`[TokenStore] Refresh failed (${lastError.message}), retry in ${delay / 1000}s...`);\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n }\n\n throw lastError ?? new Error('Token refresh failed after retries');\n }\n\n async revoke(): Promise<void> {\n if (this.tokens?.refresh_token) {\n try {\n await fetch(\n `https://oauth2.googleapis.com/revoke?token=${this.tokens.refresh_token}`,\n { method: 'POST' },\n );\n } catch {\n // Best-effort revocation\n }\n }\n\n // Delete the tokens file\n try {\n await fs.unlink(this.tokensPath);\n } catch {\n // File may not exist\n }\n\n this.tokens = null;\n }\n}\n", "// src/llm/auth/resolver.ts \u2014 Auto-detect auth mode from config/env/cached tokens\n\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { GoogleAuth } from 'google-auth-library';\nimport { TokenStore } from './token-store.js';\nimport { getOAuthClient } from './oauth.js';\nimport type { AuthMode, ResolvedAuth, OAuthClientConfig } from './types.js';\n\nexport interface AuthResolverConfig {\n gemmaHome: string;\n /** Explicit auth mode from config */\n auth?: AuthMode;\n /** API key from config */\n apiKey?: string;\n /** Custom OAuth client from config */\n oauth?: Partial<OAuthClientConfig>;\n}\n\n/**\n * Resolve authentication mode. Priority:\n * 1. Explicit config choice\n * 2. Cached OAuth tokens exist\n * 3. API key in env or config\n * 4. ADC (Application Default Credentials)\n */\nexport function resolveAuth(config: AuthResolverConfig): ResolvedAuth {\n if (config.auth) {\n return initAuth(config.auth, config);\n }\n\n // Auto-detect priority order:\n\n // 1. Cached OAuth tokens exist?\n const tokensPath = path.join(config.gemmaHome, 'auth', 'tokens.json');\n if (existsSync(tokensPath)) {\n return initAuth('oauth', config);\n }\n\n // 2. API key in env or config? (ignore empty strings)\n const envKey = process.env.GEMINI_API_KEY?.trim();\n if (envKey || config.apiKey) {\n return initAuth('api-key', config);\n }\n\n // 3. Try ADC (only in GCP environments \u2014 skip in Docker/VPS)\n if (!process.env.GEMMA_HOME && !process.env.container) {\n return initAuth('adc', config);\n }\n\n // 4. No auth configured \u2014 return helpful error\n return {\n mode: 'api-key',\n async getCredential(): Promise<string> {\n throw new Error(\n 'No authentication configured.\\n\\n' +\n 'Options:\\n' +\n ' gemma auth --google Sign in with Google (free, recommended)\\n' +\n ' Set GEMINI_API_KEY Use an API key from aistudio.google.com\\n',\n );\n },\n };\n}\n\nfunction initAuth(mode: AuthMode, config: AuthResolverConfig): ResolvedAuth {\n switch (mode) {\n case 'oauth': {\n const client = getOAuthClient(config.oauth);\n const store = new TokenStore(config.gemmaHome, client);\n\n // Load tokens eagerly (but don't fail if missing \u2014 getCredential will fail)\n const loadPromise = store.load();\n\n return {\n mode: 'oauth',\n async getCredential(): Promise<string> {\n await loadPromise;\n if (!store.hasTokens()) {\n throw new Error(\n 'No OAuth tokens found. Run \"gemma auth --google\" to authenticate.',\n );\n }\n return store.getAccessToken();\n },\n };\n }\n\n case 'api-key': {\n const key = config.apiKey || process.env.GEMINI_API_KEY?.trim();\n if (!key) {\n throw new Error(\n 'No Gemini API key found.\\n' +\n 'Set GEMINI_API_KEY environment variable or config.model.apiKey.',\n );\n }\n\n return {\n mode: 'api-key',\n async getCredential(): Promise<string> {\n return key;\n },\n };\n }\n\n case 'adc': {\n const googleAuth = new GoogleAuth({\n scopes: ['https://www.googleapis.com/auth/cloud-platform'],\n });\n\n return {\n mode: 'adc',\n async getCredential(): Promise<GoogleAuth> {\n // Validate that credentials can be obtained\n await googleAuth.getClient();\n return googleAuth;\n },\n };\n }\n }\n}\n\n/**\n * Create a TokenStore for use by the OAuth flow (auth CLI command).\n */\nexport function createTokenStore(gemmaHome: string, oauthConfig?: Partial<OAuthClientConfig>): TokenStore {\n const client = getOAuthClient(oauthConfig);\n return new TokenStore(gemmaHome, client);\n}\n", "// src/setup/copy-templates.ts \u2014 Workspace template sync (shared between wizard and readline fallback)\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { copyFile, mkdir } from 'node:fs/promises';\r\nimport { join } from 'node:path';\r\n\r\nconst WORKSPACE_TEMPLATES = [\r\n 'SOUL.md', 'INSTRUCTIONS.md', 'IDENTITY.md', 'USER.md',\r\n 'TOOLS.md', 'MEMORY.md', 'HEARTBEAT.md', 'BOOTSTRAP.md',\r\n];\r\n\r\n/**\r\n * Ensure workspace directories exist and copy template files that don't exist yet.\r\n * Returns the number of templates copied.\r\n */\r\nexport async function copyWorkspaceTemplates(gemmaHome: string, pkgRoot: string): Promise<number> {\r\n const workspaceDir = join(gemmaHome, 'workspace');\r\n const templatesDir = join(pkgRoot, 'templates');\r\n\r\n // Ensure directories\r\n await mkdir(join(workspaceDir, 'memory'), { recursive: true });\r\n await mkdir(join(gemmaHome, 'sessions'), { recursive: true });\r\n await mkdir(join(gemmaHome, 'logs'), { recursive: true });\r\n await mkdir(join(gemmaHome, 'auth'), { recursive: true });\r\n\r\n let count = 0;\r\n for (const file of WORKSPACE_TEMPLATES) {\r\n const dest = join(workspaceDir, file);\r\n const src = join(templatesDir, file);\r\n if (!existsSync(dest) && existsSync(src)) {\r\n await copyFile(src, dest);\r\n count++;\r\n }\r\n }\r\n return count;\r\n}\r\n", "import { execFile } from 'node:child_process';\nimport { writeFile, unlink, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { ServiceConfig, ServiceStatus } from './types.js';\n\nconst LABEL = 'ai.gemma.gateway';\nconst PLIST_PATH = join(homedir(), 'Library/LaunchAgents/ai.gemma.gateway.plist');\n\nfunction exec(cmd: string, args: string[]): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, (error, stdout, stderr) => {\n if (error) {\n reject(Object.assign(error, { stdout, stderr }));\n } else {\n resolve({ stdout, stderr });\n }\n });\n });\n}\n\nfunction getUid(): number {\n try {\n return process.getuid!();\n } catch {\n return 501; // fallback for environments without getuid\n }\n}\n\nexport function buildLaunchdPlist(config: ServiceConfig): string {\n const envEntries = config.env\n ? Object.entries(config.env)\n .map(\n ([k, v]) =>\n ` <key>${escapeXml(k)}</key>\\n <string>${escapeXml(v)}</string>`,\n )\n .join('\\n')\n : '';\n\n const envSection = config.env\n ? ` <key>EnvironmentVariables</key>\n <dict>\n <key>GEMMA_HOME</key>\n <string>${escapeXml(config.gemmaHome)}</string>\n <key>NODE_ENV</key>\n <string>production</string>\n${envEntries}\n </dict>`\n : ` <key>EnvironmentVariables</key>\n <dict>\n <key>GEMMA_HOME</key>\n <string>${escapeXml(config.gemmaHome)}</string>\n <key>NODE_ENV</key>\n <string>production</string>\n </dict>`;\n\n const logsDir = join(config.gemmaHome, 'logs');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${LABEL}</string>\n\n <key>ProgramArguments</key>\n <array>\n <string>${escapeXml(config.nodePath)}</string>\n <string>${escapeXml(config.entryPath)}</string>\n <string>start</string>\n </array>\n\n <key>WorkingDirectory</key>\n <string>${escapeXml(config.gemmaHome)}</string>\n\n${envSection}\n\n <key>KeepAlive</key>\n <true/>\n\n <key>RunAtLoad</key>\n <true/>\n\n <key>StandardOutPath</key>\n <string>${escapeXml(join(logsDir, 'gateway.stdout.log'))}</string>\n\n <key>StandardErrorPath</key>\n <string>${escapeXml(join(logsDir, 'gateway.stderr.log'))}</string>\n</dict>\n</plist>\n`;\n}\n\nexport async function installLaunchdService(config: ServiceConfig): Promise<void> {\n // Ensure logs directory exists\n await mkdir(join(config.gemmaHome, 'logs'), { recursive: true });\n\n // Ensure LaunchAgents directory exists\n await mkdir(dirname(PLIST_PATH), { recursive: true });\n\n // Write plist file\n const plist = buildLaunchdPlist(config);\n await writeFile(PLIST_PATH, plist, 'utf-8');\n\n const uid = getUid();\n const domain = `gui/${uid}`;\n\n // Bootstrap the service (register it with launchd)\n await exec('launchctl', ['bootstrap', domain, PLIST_PATH]);\n\n // Kick-start it immediately\n await exec('launchctl', ['kickstart', '-k', `${domain}/${LABEL}`]);\n}\n\nexport async function uninstallLaunchdService(): Promise<void> {\n const uid = getUid();\n const domain = `gui/${uid}`;\n\n // Bootout the service (deregister it)\n try {\n await exec('launchctl', ['bootout', `${domain}/${LABEL}`]);\n } catch {\n // May already be unloaded\n }\n\n // Remove the plist file\n if (existsSync(PLIST_PATH)) {\n await unlink(PLIST_PATH);\n }\n}\n\nexport async function startLaunchdService(): Promise<void> {\n const uid = getUid();\n await exec('launchctl', ['kickstart', '-k', `gui/${uid}/${LABEL}`]);\n}\n\nexport async function stopLaunchdService(): Promise<void> {\n const uid = getUid();\n await exec('launchctl', ['kill', 'SIGTERM', `gui/${uid}/${LABEL}`]);\n}\n\nexport async function getLaunchdServiceStatus(): Promise<ServiceStatus> {\n const uid = getUid();\n const status: ServiceStatus = {\n installed: existsSync(PLIST_PATH),\n running: false,\n platform: 'darwin',\n };\n\n if (!status.installed) return status;\n\n try {\n const { stdout } = await exec('launchctl', ['print', `gui/${uid}/${LABEL}`]);\n // Parse pid from output like \"pid = 12345\"\n const pidMatch = stdout.match(/pid\\s*=\\s*(\\d+)/);\n if (pidMatch) {\n status.running = true;\n status.pid = parseInt(pidMatch[1], 10);\n }\n // If no pid match but the command succeeded, the service is registered but not running\n } catch {\n // Service is not loaded\n }\n\n return status;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n", "import { execFile } from 'node:child_process';\nimport { writeFile, unlink, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { ServiceConfig, ServiceStatus } from './types.js';\n\nconst UNIT_NAME = 'gemma-gateway';\n\nfunction getUnitPath(): string {\n return join(homedir(), '.config/systemd/user/gemma-gateway.service');\n}\n\nfunction exec(cmd: string, args: string[]): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, (error, stdout, stderr) => {\n if (error) {\n reject(Object.assign(error, { stdout, stderr }));\n } else {\n resolve({ stdout, stderr });\n }\n });\n });\n}\n\nexport function buildSystemdUnit(config: ServiceConfig): string {\n const envLines = config.env\n ? Object.entries(config.env)\n .map(([k, v]) => `Environment=${k}=${v}`)\n .join('\\n')\n : '';\n\n return `[Unit]\nDescription=Gemma AI Gateway\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nExecStart=${config.nodePath} ${config.entryPath} start\nWorkingDirectory=${config.gemmaHome}\nRestart=always\nRestartSec=5\nKillMode=process\nEnvironment=GEMMA_HOME=${config.gemmaHome}\nEnvironment=NODE_ENV=production\n${envLines}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nexport async function installSystemdService(config: ServiceConfig): Promise<void> {\n const unitPath = getUnitPath();\n\n // Ensure the systemd user directory exists\n await mkdir(dirname(unitPath), { recursive: true });\n\n // Ensure logs directory exists\n await mkdir(join(config.gemmaHome, 'logs'), { recursive: true });\n\n // Write the unit file\n const unit = buildSystemdUnit(config);\n await writeFile(unitPath, unit, 'utf-8');\n\n // Reload systemd and enable + start the service\n await exec('systemctl', ['--user', 'daemon-reload']);\n await exec('systemctl', ['--user', 'enable', '--now', `${UNIT_NAME}.service`]);\n}\n\nexport async function uninstallSystemdService(): Promise<void> {\n const unitPath = getUnitPath();\n\n // Disable and stop the service\n try {\n await exec('systemctl', ['--user', 'disable', '--now', `${UNIT_NAME}.service`]);\n } catch {\n // May already be disabled/stopped\n }\n\n // Remove the unit file\n if (existsSync(unitPath)) {\n await unlink(unitPath);\n }\n\n // Reload daemon so systemd forgets the unit\n try {\n await exec('systemctl', ['--user', 'daemon-reload']);\n } catch {\n // Best effort\n }\n}\n\nexport async function startSystemdService(): Promise<void> {\n await exec('systemctl', ['--user', 'start', `${UNIT_NAME}.service`]);\n}\n\nexport async function stopSystemdService(): Promise<void> {\n await exec('systemctl', ['--user', 'stop', `${UNIT_NAME}.service`]);\n}\n\nexport async function restartSystemdService(): Promise<void> {\n await exec('systemctl', ['--user', 'restart', `${UNIT_NAME}.service`]);\n}\n\nexport async function getSystemdServiceStatus(): Promise<ServiceStatus> {\n const unitPath = getUnitPath();\n const status: ServiceStatus = {\n installed: existsSync(unitPath),\n running: false,\n platform: 'linux',\n };\n\n if (!status.installed) return status;\n\n try {\n const { stdout } = await exec('systemctl', [\n '--user',\n 'is-active',\n `${UNIT_NAME}.service`,\n ]);\n status.running = stdout.trim() === 'active';\n } catch {\n // is-active returns exit code 3 when inactive\n status.running = false;\n }\n\n if (status.running) {\n try {\n const { stdout } = await exec('systemctl', [\n '--user',\n 'show',\n '--property=MainPID',\n `${UNIT_NAME}.service`,\n ]);\n const match = stdout.match(/MainPID=(\\d+)/);\n if (match && match[1] !== '0') {\n status.pid = parseInt(match[1], 10);\n }\n } catch {\n // PID lookup is best-effort\n }\n }\n\n return status;\n}\n\nexport async function isSystemdAvailable(): Promise<boolean> {\n try {\n await exec('systemctl', ['--user', '--no-pager', 'status']);\n return true;\n } catch (err: unknown) {\n // Exit code 1 means systemd is available but no unit was specified\n // Exit code 127 means systemctl is not found\n const code = (err as { code?: number }).code;\n return code !== 127;\n }\n}\n\nexport async function enableLinger(): Promise<void> {\n await exec('loginctl', ['enable-linger']);\n}\n", "import { resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { ServiceConfig, ServiceStatus } from './types.js';\n\nexport interface GemmaService {\n install(config: ServiceConfig): Promise<void>;\n uninstall(): Promise<void>;\n start(): Promise<void>;\n stop(): Promise<void>;\n restart(): Promise<void>;\n status(): Promise<ServiceStatus>;\n}\n\nexport function resolveServiceConfig(gemmaHome: string, port?: number): ServiceConfig {\n const entryPath = resolve(fileURLToPath(new URL('../../index.js', import.meta.url)));\n\n return {\n nodePath: process.execPath,\n entryPath,\n gemmaHome,\n port: port ?? 18789,\n };\n}\n\nexport async function resolveService(): Promise<GemmaService> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n const {\n installLaunchdService,\n uninstallLaunchdService,\n startLaunchdService,\n stopLaunchdService,\n getLaunchdServiceStatus,\n } = await import('./launchd.js');\n\n return {\n install: installLaunchdService,\n uninstall: uninstallLaunchdService,\n start: startLaunchdService,\n stop: stopLaunchdService,\n restart: async () => {\n await stopLaunchdService();\n await startLaunchdService();\n },\n status: getLaunchdServiceStatus,\n };\n }\n\n if (platform === 'linux') {\n const {\n installSystemdService,\n uninstallSystemdService,\n startSystemdService,\n stopSystemdService,\n restartSystemdService,\n getSystemdServiceStatus,\n } = await import('./systemd.js');\n\n return {\n install: installSystemdService,\n uninstall: uninstallSystemdService,\n start: startSystemdService,\n stop: stopSystemdService,\n restart: restartSystemdService,\n status: getSystemdServiceStatus,\n };\n }\n\n throw new Error(\n `Daemon service management is not supported on ${platform}. ` +\n `Supported platforms: macOS (launchd), Linux (systemd).`,\n );\n}\n", "// src/setup/wizard.tsx \u2014 Root Ink wizard component and entry point\r\n\r\nimport { useState } from 'react';\r\nimport { render, Box, Text, useApp } from 'ink';\r\nimport { writeFile } from 'node:fs/promises';\r\n\r\nimport type { WizardState, ExistingConfig, AuthMode } from './types.js';\r\nimport { Banner } from './components/Banner.js';\r\nimport { StepHeader } from './components/StepHeader.js';\r\nimport { StepAuth } from './steps/StepAuth.js';\r\nimport { StepChannels } from './steps/StepChannels.js';\r\nimport { StepWorkspace } from './steps/StepWorkspace.js';\r\nimport { StepService } from './steps/StepService.js';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Config extraction / writing helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Read an existing gemma.json (if any) and extract fields the wizard cares about.\r\n */\r\nexport function extractWizardConfig(raw: Record<string, unknown>): ExistingConfig {\r\n const out: ExistingConfig = {};\r\n const model = raw['model'] as Record<string, unknown> | undefined;\r\n if (model) {\r\n if (model['auth'] === 'oauth' || model['auth'] === 'api-key') {\r\n out.authMode = model['auth'] as AuthMode;\r\n }\r\n if (typeof model['apiKey'] === 'string') out.apiKey = model['apiKey'];\r\n }\r\n const channels = raw['channels'] as Record<string, unknown> | undefined;\r\n if (channels) {\r\n const tg = channels['telegram'] as Record<string, unknown> | undefined;\r\n if (tg) {\r\n out.telegramEnabled = tg['enabled'] === true;\r\n if (typeof tg['token'] === 'string') out.telegramToken = tg['token'];\r\n }\r\n const web = channels['web'] as Record<string, unknown> | undefined;\r\n if (web) out.webEnabled = web['enabled'] !== false;\r\n }\r\n const gateway = raw['gateway'] as Record<string, unknown> | undefined;\r\n if (gateway) {\r\n const auth = gateway['auth'] as Record<string, unknown> | undefined;\r\n if (auth && typeof auth['token'] === 'string') out.webPassword = auth['token'];\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Build initial WizardState, optionally pre-populated from an existing config.\r\n */\r\nexport function buildInitialState(gemmaHome: string, existing?: ExistingConfig): WizardState {\r\n return {\r\n authMode: existing?.authMode ?? 'skip',\r\n apiKey: existing?.apiKey ?? '',\r\n oauthDone: false,\r\n\r\n telegramEnabled: existing?.telegramEnabled ?? false,\r\n telegramToken: existing?.telegramToken ?? '',\r\n webEnabled: existing?.webEnabled ?? true,\r\n webPassword: existing?.webPassword ?? '',\r\n\r\n gemmaHome,\r\n workspaceCopied: 0,\r\n\r\n installService: null,\r\n serviceInstalled: false,\r\n serviceError: null,\r\n\r\n currentStep: 1,\r\n done: false,\r\n };\r\n}\r\n\r\n/**\r\n * Build a gemma.json config object from the completed wizard state.\r\n * Mirrors the shape produced by the readline wizard in src/index.ts lines 550-575.\r\n */\r\nexport function writeWizardConfig(state: WizardState): Record<string, unknown> {\r\n return {\r\n model: {\r\n provider: 'gemini',\r\n model: 'gemini-2.5-flash',\r\n ...(state.authMode !== 'skip' ? { auth: state.authMode } : {}),\r\n ...(state.apiKey ? { apiKey: state.apiKey } : {}),\r\n },\r\n gateway: {\r\n port: 18789,\r\n bind: 'auto',\r\n ...(state.webPassword ? { auth: { token: state.webPassword } } : {}),\r\n },\r\n channels: {\r\n telegram: {\r\n enabled: state.telegramEnabled,\r\n ...(state.telegramToken ? { token: state.telegramToken } : {}),\r\n },\r\n web: { enabled: state.webEnabled },\r\n cli: { enabled: false },\r\n },\r\n confirm: {\r\n timeout: 300,\r\n autoApprove: { internalReads: true, memoryWrites: false },\r\n },\r\n workspace: { path: `${state.gemmaHome}/workspace` },\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Root Wizard component\r\n// ---------------------------------------------------------------------------\r\n\r\ninterface WizardProps {\r\n gemmaHome: string;\r\n configPath: string;\r\n pkgRoot: string;\r\n existing?: ExistingConfig;\r\n}\r\n\r\nfunction Wizard({ gemmaHome, configPath, pkgRoot, existing }: WizardProps) {\r\n const { exit } = useApp();\r\n const [state, setState] = useState<WizardState>(() => buildInitialState(gemmaHome, existing));\r\n\r\n /**\r\n * Each step calls onDone(patch) when it finishes.\r\n * We merge the patch, advance to the next step,\r\n * and on the final step write config + exit.\r\n */\r\n const handleStepDone = async (patch: Partial<WizardState>) => {\r\n const merged = { ...state, ...patch };\r\n\r\n if (merged.currentStep >= 4) {\r\n // Final step \u2014 write config and finish\r\n const config = writeWizardConfig(merged);\r\n await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\r\n setState({ ...merged, done: true });\r\n setTimeout(() => exit(), 50);\r\n return;\r\n }\r\n\r\n // Advance to next step\r\n const next = (merged.currentStep + 1) as WizardState['currentStep'];\r\n setState({ ...merged, currentStep: next });\r\n };\r\n\r\n if (state.done) {\r\n return (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text color=\"green\" bold> Gemma is set up! Starting gateway...</Text>\r\n <Text dimColor> Config written to {configPath}</Text>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Banner />\r\n <StepHeader step={state.currentStep} />\r\n\r\n {state.currentStep === 1 && (\r\n <StepAuth state={state} onDone={handleStepDone} gemmaHome={gemmaHome} />\r\n )}\r\n {state.currentStep === 2 && (\r\n <StepChannels state={state} onDone={handleStepDone} />\r\n )}\r\n {state.currentStep === 3 && (\r\n <StepWorkspace\r\n state={state}\r\n onDone={handleStepDone}\r\n gemmaHome={gemmaHome}\r\n pkgRoot={pkgRoot}\r\n />\r\n )}\r\n {state.currentStep === 4 && (\r\n <StepService\r\n state={state}\r\n onDone={handleStepDone}\r\n gemmaHome={gemmaHome}\r\n />\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Public entry point \u2014 called from src/index.ts\r\n// ---------------------------------------------------------------------------\r\n\r\nexport async function runSetupWizard(\r\n gemmaHome: string,\r\n configPath: string,\r\n pkgRoot: string,\r\n): Promise<void> {\r\n // Pre-populate from existing config if available\r\n let existing: ExistingConfig | undefined;\r\n try {\r\n const { existsSync } = await import('node:fs');\r\n const { readFile } = await import('node:fs/promises');\r\n if (existsSync(configPath)) {\r\n const raw = JSON.parse(await readFile(configPath, 'utf-8')) as Record<string, unknown>;\r\n existing = extractWizardConfig(raw);\r\n }\r\n } catch {\r\n // Ignore parse errors \u2014 start fresh\r\n }\r\n\r\n const { waitUntilExit } = render(\r\n <Wizard gemmaHome={gemmaHome} configPath={configPath} pkgRoot={pkgRoot} existing={existing} />,\r\n );\r\n await waitUntilExit();\r\n}\r\n", "import { Text, useStdout } from 'ink';\nimport Gradient from 'ink-gradient';\nimport { GEMMA_COLORS, selectBanner } from '../../shared/ascii-art.js';\n\nexport function Banner() {\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const art = selectBanner(cols);\n\n return (\n <>\n <Gradient colors={GEMMA_COLORS}>\n <Text>{art}</Text>\n </Gradient>\n <Text dimColor> Your personal AI assistant</Text>\n </>\n );\n}\n", "/**\n * ASCII art banners for Gemma CLI.\n * Three responsive variants selected by terminal width.\n */\n\n/** Get the display width of a multi-line ASCII art string. */\nexport function getArtWidth(art: string): number {\n return Math.max(...art.split('\\n').map(l => l.length));\n}\n\n/** Long banner: cat mascot (left) + GEMMA block text (right), ~95 chars wide */\nexport const longBanner = [\n ' \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ',\n ' /\\\\ /\\\\ \u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588',\n ' { `---\\' } \u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2588 \u2591 \u2591\u2588\u2588\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588',\n ' { - - } \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588',\n ' \\\\ =w= / \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588',\n ' /` `-----\\' `\\\\ \u2591\u2591\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591 \u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588',\n ' / / \\\\ \\\\ \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588',\n ' (__/ \\\\__)~) \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591',\n].join('\\n');\n\n/** Short banner: GEMMA block text only (~70 chars wide) */\nexport const shortBanner = [\n ' \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ',\n ' \u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588',\n ' \u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2588 \u2591 \u2591\u2588\u2588\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588',\n '\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588',\n '\u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588',\n '\u2591\u2591\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591 \u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588',\n ' \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588',\n ' \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591',\n].join('\\n');\n\n/** Tiny banner: cat face + GEMMA for narrow terminals */\nexport const tinyBanner = [\n ' /\\\\_/\\\\',\n '( -.- ) GEMMA',\n ' > ^ <',\n].join('\\n');\n\n/** Gemma Warm gradient: bright violet -> fuchsia -> coral */\nexport const GEMMA_COLORS = ['#A78BFA', '#E879F9', '#FB7185'];\n\n/**\n * Select the appropriate banner variant for a given terminal width.\n */\nexport function selectBanner(cols: number): string {\n if (cols >= getArtWidth(longBanner) + 2) return longBanner;\n if (cols >= getArtWidth(shortBanner) + 2) return shortBanner;\n return tinyBanner;\n}\n", "import { Box, Text } from 'ink';\r\n\r\nconst LABELS = ['Auth', 'Channels', 'Workspace', 'Service'];\r\n\r\ninterface Props {\r\n step: number;\r\n}\r\n\r\nexport function StepHeader({ step }: Props) {\r\n return (\r\n <Box flexDirection=\"column\" marginBottom={1}>\r\n <Box gap={1}>\r\n {LABELS.map((label, i) => {\r\n const num = i + 1;\r\n const isDone = num < step;\r\n const isActive = num === step;\r\n return (\r\n <Box key={label}>\r\n <Text\r\n color={isDone ? 'green' : isActive ? 'cyan' : 'gray'}\r\n bold={isActive}\r\n >\r\n {isDone ? '\u2713' : String(num)}\r\n </Text>\r\n <Text color={isActive ? 'cyan' : 'gray'} bold={isActive}>\r\n {` ${label}`}\r\n </Text>\r\n {num < LABELS.length && <Text dimColor> \u2192 </Text>}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n", "import React, { useState, useCallback, useRef } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { Select, TextInput, Spinner } from '@inkjs/ui';\r\nimport type { WizardState } from '../types.js';\r\n\r\nimport { StatusLine } from '../components/StatusLine.js';\r\n\r\ninterface Props {\r\n state: WizardState;\r\n onDone: (patch: Partial<WizardState>) => void;\r\n gemmaHome: string;\r\n}\r\n\r\ntype Phase = 'select' | 'oauth-running' | 'oauth-input' | 'api-key';\r\n\r\nconst AUTH_OPTIONS = [\r\n { label: 'Google OAuth (recommended)', value: 'oauth' },\r\n { label: 'API key', value: 'api-key' },\r\n { label: 'Skip for now', value: 'skip' },\r\n];\r\n\r\nexport function StepAuth({ state, onDone, gemmaHome }: Props) {\r\n const [phase, setPhase] = useState<Phase>('select');\r\n const [error, setError] = useState('');\r\n const [oauthPrompt, setOauthPrompt] = useState('');\r\n const resolverRef = useRef<((value: string) => void) | null>(null);\r\n\r\n const handleSelect = useCallback((value: string) => {\r\n if (value === 'skip') {\r\n onDone({ authMode: 'skip' });\r\n return;\r\n }\r\n\r\n if (value === 'api-key') {\r\n setPhase('api-key');\r\n return;\r\n }\r\n\r\n // OAuth flow\r\n setPhase('oauth-running');\r\n setError('');\r\n\r\n (async () => {\r\n try {\r\n const { getOAuthClient, runOAuthFlow } = await import('../../llm/auth/oauth.js');\r\n const { createTokenStore } = await import('../../llm/auth/resolver.js');\r\n\r\n const client = getOAuthClient();\r\n const tokenStore = createTokenStore(gemmaHome);\r\n\r\n const readline = {\r\n question(prompt: string): Promise<string> {\r\n return new Promise<string>((resolve) => {\r\n resolverRef.current = resolve;\r\n setOauthPrompt(prompt);\r\n setPhase('oauth-input');\r\n });\r\n },\r\n };\r\n\r\n await runOAuthFlow({\r\n client,\r\n tokenStore,\r\n readline,\r\n log: () => {},\r\n });\r\n\r\n onDone({ authMode: 'oauth', oauthDone: true });\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n setError(msg);\r\n setPhase('select');\r\n }\r\n })();\r\n }, [onDone, gemmaHome]);\r\n\r\n const handleOauthInput = useCallback((value: string) => {\r\n if (resolverRef.current) {\r\n resolverRef.current(value);\r\n resolverRef.current = null;\r\n setOauthPrompt('');\r\n setPhase('oauth-running');\r\n }\r\n }, []);\r\n\r\n const handleApiKey = useCallback((value: string) => {\r\n if (!value.trim()) return;\r\n onDone({ authMode: 'api-key', apiKey: value.trim() });\r\n }, [onDone]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"column\" paddingLeft={2}>\r\n <Text bold>Authentication</Text>\r\n\r\n {phase === 'select' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>How would you like to authenticate with Google?</Text>\r\n <Box marginTop={1}>\r\n <Select options={AUTH_OPTIONS} onChange={handleSelect} />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'oauth-running' && (\r\n <Box marginTop={1}>\r\n <Spinner label=\"Running OAuth flow...\" />\r\n </Box>\r\n )}\r\n\r\n {phase === 'oauth-input' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text>{oauthPrompt}</Text>\r\n <TextInput onSubmit={handleOauthInput} placeholder=\"Paste URL here\" />\r\n </Box>\r\n )}\r\n\r\n {phase === 'api-key' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Enter your Gemini API key (from aistudio.google.com):</Text>\r\n <Box marginTop={1}>\r\n <TextInput onSubmit={handleApiKey} placeholder=\"AI...\" />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n <StatusLine error={error} />\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n", "import { Text } from 'ink';\r\n\r\ninterface Props {\r\n message?: string;\r\n error?: string;\r\n}\r\n\r\nexport function StatusLine({ message, error }: Props) {\r\n if (error) return <Text color=\"red\"> {error}</Text>;\r\n if (message) return <Text dimColor> {message}</Text>;\r\n return null;\r\n}\r\n", "import React, { useState, useCallback } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { ConfirmInput, TextInput } from '@inkjs/ui';\r\nimport type { WizardState } from '../types.js';\r\n\r\n\r\ninterface Props {\r\n state: WizardState;\r\n onDone: (patch: Partial<WizardState>) => void;\r\n}\r\n\r\ntype Phase = 'telegram-ask' | 'telegram-token' | 'web-ask' | 'web-password';\r\n\r\nexport function StepChannels({ state, onDone }: Props) {\r\n const [phase, setPhase] = useState<Phase>('telegram-ask');\r\n const [telegramEnabled, setTelegramEnabled] = useState(state.telegramEnabled);\r\n const [telegramToken, setTelegramToken] = useState(state.telegramToken);\r\n const [webEnabled, setWebEnabled] = useState(state.webEnabled);\r\n\r\n const handleTelegramYes = useCallback(() => {\r\n setTelegramEnabled(true);\r\n setPhase('telegram-token');\r\n }, []);\r\n\r\n const handleTelegramNo = useCallback(() => {\r\n setTelegramEnabled(false);\r\n setPhase('web-ask');\r\n }, []);\r\n\r\n const handleTelegramToken = useCallback((value: string) => {\r\n if (!value.trim()) return; // token is required if Telegram is enabled\r\n setTelegramToken(value.trim());\r\n setPhase('web-ask');\r\n }, []);\r\n\r\n const handleWebYes = useCallback(() => {\r\n setWebEnabled(true);\r\n setPhase('web-password');\r\n }, []);\r\n\r\n const handleWebNo = useCallback(() => {\r\n onDone({\r\n telegramEnabled,\r\n telegramToken,\r\n webEnabled: false,\r\n webPassword: '',\r\n });\r\n }, [onDone, telegramEnabled, telegramToken]);\r\n\r\n const handleWebPassword = useCallback((value: string) => {\r\n onDone({\r\n telegramEnabled,\r\n telegramToken,\r\n webEnabled: true,\r\n webPassword: value.trim(),\r\n });\r\n }, [onDone, telegramEnabled, telegramToken]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"column\" paddingLeft={2}>\r\n <Text bold>Channels</Text>\r\n\r\n {phase === 'telegram-ask' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Enable Telegram bot? (Y/n)</Text>\r\n <Box marginTop={1}>\r\n <ConfirmInput onConfirm={handleTelegramYes} onCancel={handleTelegramNo} />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'telegram-token' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Enter your Telegram bot token (from @BotFather):</Text>\r\n <Box marginTop={1}>\r\n <TextInput onSubmit={handleTelegramToken} placeholder=\"123456:ABC-DEF...\" />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'web-ask' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Enable Web UI? (Y/n)</Text>\r\n <Box marginTop={1}>\r\n <ConfirmInput onConfirm={handleWebYes} onCancel={handleWebNo} />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'web-password' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Set a Web UI password (Enter to skip):</Text>\r\n <Box marginTop={1}>\r\n <TextInput onSubmit={handleWebPassword} placeholder=\"optional\" />\r\n </Box>\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n", "import React, { useState, useEffect, useRef } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { Spinner } from '@inkjs/ui';\r\nimport type { WizardState } from '../types.js';\r\n\r\nimport { StatusLine } from '../components/StatusLine.js';\r\n\r\ninterface Props {\r\n state: WizardState;\r\n onDone: (patch: Partial<WizardState>) => void;\r\n gemmaHome: string;\r\n pkgRoot: string;\r\n}\r\n\r\nexport function StepWorkspace({ state, onDone, gemmaHome, pkgRoot }: Props) {\r\n const [copying, setCopying] = useState(true);\r\n const [count, setCount] = useState(0);\r\n const [error, setError] = useState('');\r\n const started = useRef(false);\r\n\r\n useEffect(() => {\r\n if (started.current) return;\r\n started.current = true;\r\n\r\n (async () => {\r\n try {\r\n const { copyWorkspaceTemplates } = await import('../copy-templates.js');\r\n const n = await copyWorkspaceTemplates(gemmaHome, pkgRoot);\r\n setCount(n);\r\n setCopying(false);\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n setError(msg);\r\n setCopying(false);\r\n }\r\n })();\r\n }, [gemmaHome, pkgRoot]);\r\n\r\n useEffect(() => {\r\n if (copying) return;\r\n // Advance even on error \u2014 workspace template copy is non-fatal\r\n const timer = setTimeout(() => {\r\n onDone({ workspaceCopied: count });\r\n }, error ? 3000 : 1000);\r\n return () => clearTimeout(timer);\r\n }, [copying, error, count, onDone]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"column\" paddingLeft={2}>\r\n <Text bold>Workspace</Text>\r\n\r\n {copying && (\r\n <Box marginTop={1}>\r\n <Spinner label=\"Copying workspace templates...\" />\r\n </Box>\r\n )}\r\n\r\n {!copying && !error && (\r\n <Box marginTop={1}>\r\n <Text color=\"green\">{count} template{count !== 1 ? 's' : ''} copied to {gemmaHome}/workspace</Text>\r\n </Box>\r\n )}\r\n\r\n <StatusLine error={error} />\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n", "import React, { useState, useEffect, useCallback, useRef } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { ConfirmInput, Spinner } from '@inkjs/ui';\r\nimport type { WizardState } from '../types.js';\r\n\r\nimport { StatusLine } from '../components/StatusLine.js';\r\n\r\ninterface Props {\r\n state: WizardState;\r\n onDone: (patch: Partial<WizardState>) => void;\r\n gemmaHome: string;\r\n}\r\n\r\ntype Phase = 'ask' | 'installing' | 'done';\r\n\r\nexport function StepService({ state, onDone, gemmaHome }: Props) {\r\n const [phase, setPhase] = useState<Phase>('ask');\r\n const [error, setError] = useState('');\r\n const installing = useRef(false);\r\n\r\n const handleConfirm = useCallback(() => {\r\n setPhase('installing');\r\n }, []);\r\n\r\n const handleCancel = useCallback(() => {\r\n onDone({ installService: false });\r\n }, [onDone]);\r\n\r\n useEffect(() => {\r\n if (phase !== 'installing' || installing.current) return;\r\n installing.current = true;\r\n\r\n (async () => {\r\n try {\r\n const { resolveService, resolveServiceConfig } = await import('../../daemon/service.js');\r\n const service = await resolveService();\r\n const config = resolveServiceConfig(gemmaHome);\r\n await service.install(config);\r\n setPhase('done');\r\n onDone({ installService: true, serviceInstalled: true });\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n setError(msg);\r\n setPhase('done');\r\n onDone({ installService: true, serviceInstalled: false, serviceError: msg });\r\n }\r\n })();\r\n }, [phase, onDone, gemmaHome]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"column\" paddingLeft={2}>\r\n <Text bold>Background Service</Text>\r\n\r\n {phase === 'ask' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Install Gemma as a background service? (Y/n)</Text>\r\n <Box marginTop={1}>\r\n <ConfirmInput onConfirm={handleConfirm} onCancel={handleCancel} />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'installing' && (\r\n <Box marginTop={1}>\r\n <Spinner label=\"Installing service...\" />\r\n </Box>\r\n )}\r\n\r\n {phase === 'done' && !error && (\r\n <Box marginTop={1}>\r\n <Text color=\"green\">Service installed successfully.</Text>\r\n </Box>\r\n )}\r\n\r\n <StatusLine error={error} />\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n"],
5
- "mappings": ";;;;;;;;;;;AAEA,OAAO,UAAU;AACjB,SAAS,OAAAA,YAAW;AAab,SAAS,oBAAoB,OAAe,qBAIjD;AACA,MAAI;AACJ,MAAI;AAEJ,QAAM,gBAAgB,IAAI,QAAwB,CAACC,UAAS,WAAW;AACrE,oBAAgBA;AAChB,mBAAe;AAAA,EACjB,CAAC;AAED,QAAM,SAAS,KAAK,aAAa,CAAC,KAAK,QAAQ;AAC7C,QAAI,CAAC,IAAI,KAAK;AACZ,UAAI,UAAU,GAAG;AACjB,UAAI,IAAI,aAAa;AACrB;AAAA,IACF;AAEA,UAAM,MAAM,IAAID,KAAI,IAAI,KAAK,kBAAkB;AAE/C,QAAI,IAAI,aAAa,aAAa;AAChC,UAAI,UAAU,GAAG;AACjB,UAAI,IAAI,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,OAAO,IAAI,aAAa,IAAI,MAAM;AACxC,UAAM,QAAQ,IAAI,aAAa,IAAI,OAAO;AAC1C,UAAM,QAAQ,IAAI,aAAa,IAAI,OAAO,KAAK;AAE/C,QAAI,OAAO;AACT,UAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,UAAI,IAAI,UAAU,KAAK,CAAC;AACxB,mBAAa,IAAI,MAAM,gBAAgB,KAAK,EAAE,CAAC;AAC/C;AAAA,IACF;AAEA,QAAI,CAAC,MAAM;AACT,UAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,UAAI,IAAI,UAAU,gCAAgC,CAAC;AACnD,mBAAa,IAAI,MAAM,mCAAmC,CAAC;AAC3D;AAAA,IACF;AAEA,QAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,QAAI,IAAI,YAAY,CAAC;AACrB,kBAAc,EAAE,MAAM,MAAM,CAAC;AAAA,EAC/B,CAAC;AAED,SAAO,OAAO,MAAM,WAAW;AAG/B,QAAM,UAAU,WAAW,MAAM;AAC/B,WAAO,MAAM;AACb,iBAAa,IAAI,MAAM,0CAA0C,CAAC;AAAA,EACpE,GAAG,IAAI,KAAK,GAAI;AAGhB,gBAAc,QAAQ,MAAM;AAC1B,iBAAa,OAAO;AACpB,WAAO,MAAM;AAAA,EACf,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,OAAO,MAAM;AACX,mBAAa,OAAO;AACpB,aAAO,MAAM;AAAA,IACf;AAAA,EACF;AACF;AAMO,SAAS,mBAAmB,aAAqC;AACtE,QAAM,MAAM,IAAIA,KAAI,WAAW;AAC/B,QAAM,OAAO,IAAI,aAAa,IAAI,MAAM;AACxC,QAAM,QAAQ,IAAI,aAAa,IAAI,OAAO,KAAK;AAE/C,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,4EAA4E;AAAA,EAC9F;AAEA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,SAAS,cAAsB;AAC7B,SAAO;AAAA;AAAA;AAAA;AAAA;AAKT;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO;AAAA;AAAA;AAAA,KAGJ,KAAK;AAAA;AAAA;AAGV;AA1HA,IAca;AAdb;AAAA;AAAA;AAcO,IAAM,sBAAsB;AAAA;AAAA;;;ACdnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,SAAS,YAAY,cAAc,aAAa,oBAAoB;AACpE,SAAS,qBAAqB;AAC9B,SAAS,WAAW,SAAS,YAAY;AA0BzC,SAAS,WAAW,MAA6B;AAC/C,QAAM,OAAO,QAAQ,aAAa,UAAU,CAAC,QAAQ,QAAQ,QAAQ,EAAE,IAAI,CAAC,EAAE;AAC9E,aAAW,QAAQ,QAAQ,IAAI,QAAQ,IAAI,MAAM,SAAS,GAAG;AAC3D,eAAW,OAAO,MAAM;AACtB,YAAM,IAAI,KAAK,KAAK,OAAO,GAAG;AAC9B,UAAI,WAAW,CAAC,GAAG;AACjB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,SAAS,KAAa,MAAc,OAA8B;AACzE,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI;AACF,eAAW,SAAS,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC7D,YAAM,IAAI,KAAK,KAAK,MAAM,IAAI;AAC9B,UAAI,MAAM,OAAO,KAAK,MAAM,SAAS,KAAM,QAAO;AAClD,UAAI,MAAM,YAAY,KAAK,CAAC,MAAM,KAAK,WAAW,GAAG,GAAG;AACtD,cAAM,QAAQ,SAAS,GAAG,MAAM,QAAQ,CAAC;AACzC,YAAI,MAAO,QAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAWO,SAAS,8BAAwD;AACtE,MAAI,2BAA4B,QAAO;AAEvC,QAAM,SAAS,yBAAyB,KAAK,4BAA4B,KAAK,qBAAqB;AACnG,MAAI,QAAQ;AACV,iCAA6B;AAAA,EAC/B;AACA,SAAO;AACT;AAOA,SAAS,2BAAqD;AAC5D,MAAI;AACF,UAAME,WAAU,cAAc,YAAY,GAAG;AAC7C,UAAM,UAAUA,SAAQ,QAAQ,sCAAsC;AACtE,UAAM,UAAU,QAAQ,OAAO;AAC/B,UAAM,aAAa,KAAK,SAAS,QAAQ,OAAO,eAAe,WAAW;AAC1E,QAAI,WAAW,UAAU,GAAG;AAC1B,aAAO,gBAAgB,aAAa,YAAY,MAAM,CAAC;AAAA,IACzD;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAMA,SAAS,8BAAwD;AAC/D,MAAI;AAEF,UAAM,YAAY;AAAA,MAChB,QAAQ,IAAI;AAAA,MAAG;AAAA,MAAgB;AAAA,MAAW;AAAA,MAC1C;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAe;AAAA,IAChC;AACA,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO,gBAAgB,aAAa,WAAW,MAAM,CAAC;AAAA,IACxD;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAOA,SAAS,uBAAiD;AACxD,MAAI;AACF,UAAM,aAAa,WAAW,QAAQ;AACtC,QAAI,CAAC,WAAY,QAAO;AAExB,UAAM,eAAe,aAAa,UAAU;AAC5C,UAAM,eAAe,QAAQ,QAAQ,YAAY,CAAC;AAElD,UAAM,cAAc;AAAA,MAClB,KAAK,cAAc,gBAAgB,WAAW,mBAAmB,QAAQ,OAAO,eAAe,WAAW;AAAA,MAC1G,KAAK,cAAc,gBAAgB,WAAW,mBAAmB,QAAQ,eAAe,WAAW;AAAA,IACrG;AAEA,eAAW,KAAK,aAAa;AAC3B,UAAI,WAAW,CAAC,GAAG;AACjB,cAAM,SAAS,gBAAgB,aAAa,GAAG,MAAM,CAAC;AACtD,YAAI,OAAQ,QAAO;AAAA,MACrB;AAAA,IACF;AAGA,UAAM,QAAQ,SAAS,cAAc,aAAa,EAAE;AACpD,QAAI,OAAO;AACT,aAAO,gBAAgB,aAAa,OAAO,MAAM,CAAC;AAAA,IACpD;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAGA,SAAS,gBAAgB,SAA2C;AAClE,QAAM,UAAU,QAAQ,MAAM,+CAA+C;AAC7E,QAAM,cAAc,QAAQ,MAAM,yBAAyB;AAC3D,MAAI,WAAW,aAAa;AAC1B,WAAO,EAAE,UAAU,QAAQ,CAAC,GAAG,cAAc,YAAY,CAAC,EAAE;AAAA,EAC9D;AACA,SAAO;AACT;AAIO,SAAS,eAAe,QAAwD;AAErF,QAAM,cAAc,QAAQ,IAAI,uBAAuB,KAAK;AAC5D,QAAM,kBAAkB,QAAQ,IAAI,2BAA2B,KAAK;AACpE,MAAI,eAAe,iBAAiB;AAClC,WAAO,EAAE,UAAU,aAAa,cAAc,gBAAgB;AAAA,EAChE;AAGA,QAAM,YAAY,4BAA4B;AAC9C,MAAI,WAAW;AACb,WAAO;AAAA,EACT;AAGA,MAAI,QAAQ,YAAY,QAAQ,cAAc;AAC5C,WAAO,EAAE,UAAU,OAAO,UAAU,cAAc,OAAO,aAAa;AAAA,EACxE;AAGA,QAAM,IAAI;AAAA,IACR;AAAA,EAOF;AACF;AAKA,SAAS,aAAa,UAAkB,aAAqB,OAAwB;AACnF,QAAM,SAAS,IAAI,gBAAgB;AAAA,IACjC,WAAW;AAAA,IACX,cAAc;AAAA,IACd,eAAe;AAAA,IACf,OAAO,OAAO,KAAK,GAAG;AAAA,IACtB,aAAa;AAAA,IACb,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,OAAO;AACT,WAAO,IAAI,SAAS,KAAK;AAAA,EAC3B;AACA,SAAO,GAAG,aAAa,IAAI,OAAO,SAAS,CAAC;AAC9C;AAKA,eAAe,aACb,MACA,aACA,QACuB;AACvB,QAAM,WAAW,MAAM,MAAM,gBAAgB;AAAA,IAC3C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,IAC/D,MAAM,IAAI,gBAAgB;AAAA,MACxB;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,eAAe,OAAO;AAAA,MACtB,cAAc;AAAA,MACd,YAAY;AAAA,IACd,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,IAAI,MAAM,0BAA0B,SAAS,MAAM,MAAM,IAAI,EAAE;AAAA,EACvE;AAEA,QAAM,OAAQ,MAAM,SAAS,KAAK;AASlC,MAAI,CAAC,KAAK,eAAe;AACvB,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,KAAK,UAAU;AACjB,QAAI;AACF,YAAM,UAAU,KAAK;AAAA,QACnB,OAAO,KAAK,KAAK,SAAS,MAAM,GAAG,EAAE,CAAC,GAAG,WAAW,EAAE,SAAS;AAAA,MACjE;AACA,cAAQ,QAAQ;AAAA,IAClB,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAc,KAAK;AAAA,IACnB,eAAe,KAAK;AAAA,IACpB,aAAa,KAAK,IAAI,IAAI,KAAK,aAAa;AAAA,IAC5C,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACF;AAKA,SAAS,aAAsB;AAE7B,MAAI,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,WAAY,QAAO;AACjE,MAAI,QAAQ,aAAa,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,IAAI,gBAAiB,QAAO;AACjG,MAAI,QAAQ,IAAI,GAAI,QAAO;AAC3B,SAAO;AACT;AAgBA,eAAsB,aAAa,SAAkD;AACnF,QAAM,EAAE,QAAQ,YAAY,MAAM,QAAQ,IAAI,IAAI;AAClD,QAAM,WAAW,QAAQ,iBAAiB,WAAW;AAErD,MAAI,UAAU;AACZ,WAAO,gBAAgB,OAAO;AAAA,EAChC;AAEA,SAAO,eAAe,OAAO;AAC/B;AAEA,eAAe,eAAe,SAAkD;AAC9E,QAAM,EAAE,QAAQ,YAAY,MAAM,QAAQ,KAAK,SAAS,IAAI;AAE5D,QAAM,cAAc,oBAAoB,mBAAmB;AAC3D,QAAM,UAAU,aAAa,OAAO,UAAU,WAAW;AAGzD,MAAI;AACJ,MAAI;AACF,eAAW,oBAAoB;AAAA,EACjC,QAAQ;AACN,QAAI,mDAAmD;AAAA,EACzD;AAGA,MAAI,6CAA6C;AACjD,MAAI;AACF,UAAM,QAAQ,MAAM,OAAO,MAAM,GAAG;AACpC,UAAM,KAAK,OAAO;AAAA,EACpB,QAAQ;AACN,QAAI,mDAAmD;AACvD,QAAI;AAAA,IAAO,OAAO;AAAA,CAAI;AAAA,EACxB;AAEA,MAAI;AAEJ,MAAI,UAAU;AAEZ,QAAI,uDAAuD;AAC3D,QAAI,wDAAwD;AAE5D,UAAM,kBAAkB,SAAS,OAAO,KAAK,OAAK,EAAE,IAAI;AACxD,UAAM,eAAe,WACjB,SAAS,SAAS,oDAAoD,EAAE,KAAK,SAAO;AAClF,YAAM,UAAU,IAAI,KAAK;AACzB,UAAI,CAAC,QAAS,OAAM,IAAI,MAAM,OAAO;AACrC,aAAO,mBAAmB,OAAO,EAAE;AAAA,IACrC,CAAC,IACD,IAAI,QAAgB,MAAM;AAAA,IAAC,CAAC;AAEhC,QAAI;AACF,aAAO,MAAM,QAAQ,KAAK,CAAC,iBAAiB,YAAY,CAAC;AAAA,IAC3D,UAAE;AACA,eAAS,MAAM;AAAA,IACjB;AAAA,EACF,OAAO;AAEL,QAAI,2DAA2D;AAC/D,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,+CAA+C;AAAA,IACjE;AACA,UAAM,YAAY,MAAM,SAAS,SAAS,wBAAwB;AAClE,WAAO,mBAAmB,UAAU,KAAK,CAAC,EAAE;AAAA,EAC9C;AAEA,QAAM,SAAS,MAAM,aAAa,MAAM,aAAa,MAAM;AAC3D,QAAM,WAAW,KAAK,MAAM;AAE5B,MAAI;AAAA,qBAAwB,OAAO,SAAS,SAAS,EAAE;AACvD,MAAI,+CAA+C;AACnD,SAAO;AACT;AAEA,eAAe,gBAAgB,SAAkD;AAC/E,QAAM,EAAE,QAAQ,YAAY,MAAM,QAAQ,KAAK,SAAS,IAAI;AAE5D,QAAM,cAAc,oBAAoB,mBAAmB;AAC3D,QAAM,UAAU,aAAa,OAAO,UAAU,WAAW;AAEzD,MAAI,EAAE;AACN,MAAI,qDAAqD;AACzD,MAAI,EAAE;AACN,MAAI,KAAK,OAAO,EAAE;AAClB,MAAI,EAAE;AACN,MAAI,wDAAwD;AAC5D,MAAI,mBAAmB,WAAW,WAAW;AAC7C,MAAI,uDAAmD;AACvD,MAAI,EAAE;AACN,MAAI,qDAAsD;AAC1D,MAAI,uBAAuB;AAC3B,MAAI,EAAE;AAEN,MAAI,CAAC,UAAU;AACb,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,SAAS,SAAS,wBAAwB;AAClE,QAAM,EAAE,KAAK,IAAI,mBAAmB,UAAU,KAAK,CAAC;AAEpD,QAAM,SAAS,MAAM,aAAa,MAAM,aAAa,MAAM;AAC3D,QAAM,WAAW,KAAK,MAAM;AAE5B,MAAI;AAAA,qBAAwB,OAAO,SAAS,SAAS,EAAE;AACvD,MAAI,+CAA+C;AACnD,SAAO;AACT;AAhaA,IAeM,QAKA,eACA,gBAIF;AAzBJ;AAAA;AAAA;AAKA;AAUA,IAAM,SAAS;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAIvB,IAAI,6BAAuD;AAAA;AAAA;;;ACvB3D,OAAO,QAAQ;AACf,OAAO,UAAU;AAHjB,IAMM,mBAEA,0BACA,uBAEA,mBASO;AApBb;AAAA;AAAA;AAMA,IAAM,oBAAoB,IAAI,KAAK;AAEnC,IAAM,2BAA2B;AACjC,IAAM,wBAAwB;AAE9B,IAAM,oBAAN,cAAgC,MAAM;AAAA,MAC3B;AAAA,MACT,YAAY,QAAgB,MAAc;AACxC,cAAM,yBAAyB,MAAM,MAAM,IAAI,EAAE;AACjD,aAAK,OAAO;AACZ,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAEO,IAAM,aAAN,MAAiB;AAAA,MACd,SAA8B;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,iBAAuC;AAAA,MAE/C,YAAY,WAAmB,QAA2B;AACxD,aAAK,aAAa,KAAK,KAAK,WAAW,QAAQ,aAAa;AAC5D,aAAK,SAAS;AAAA,MAChB;AAAA,MAEA,MAAM,OAAyB;AAC7B,YAAI;AACF,gBAAM,MAAM,MAAM,GAAG,SAAS,KAAK,YAAY,OAAO;AACtD,eAAK,SAAS,KAAK,MAAM,GAAG;AAC5B,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,QAAqC;AAC9C,aAAK,SAAS;AACd,cAAM,MAAM,KAAK,QAAQ,KAAK,UAAU;AACxC,cAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,cAAM,GAAG,UAAU,KAAK,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAE5E,YAAI;AACF,gBAAM,GAAG,MAAM,KAAK,YAAY,GAAK;AAAA,QACvC,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,MAEA,MAAM,iBAAkC;AACtC,YAAI,CAAC,KAAK,QAAQ;AAChB,gBAAM,IAAI,MAAM,0DAA0D;AAAA,QAC5E;AAGA,YAAI,KAAK,IAAI,IAAI,KAAK,OAAO,cAAc,mBAAmB;AAC5D,gBAAM,KAAK,QAAQ;AAAA,QACrB;AAEA,eAAO,KAAK,OAAO;AAAA,MACrB;AAAA,MAEA,WAA+B;AAC7B,eAAO,KAAK,QAAQ;AAAA,MACtB;AAAA,MAEA,YAAqB;AACnB,eAAO,KAAK,WAAW;AAAA,MACzB;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,MAAc,UAAyB;AAErC,YAAI,KAAK,eAAgB,QAAO,KAAK;AACrC,aAAK,iBAAiB,KAAK,UAAU,EAAE,QAAQ,MAAM;AACnD,eAAK,iBAAiB;AAAA,QACxB,CAAC;AACD,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,MAAc,YAA2B;AACvC,YAAI,CAAC,KAAK,QAAQ,eAAe;AAC/B,gBAAM,IAAI,MAAM,2EAA2E;AAAA,QAC7F;AAEA,YAAI;AAEJ,iBAAS,UAAU,GAAG,UAAU,uBAAuB,WAAW;AAChE,cAAI;AACF,kBAAM,WAAW,MAAM,MAAM,uCAAuC;AAAA,cAClE,QAAQ;AAAA,cACR,SAAS,EAAE,gBAAgB,oCAAoC;AAAA,cAC/D,MAAM,IAAI,gBAAgB;AAAA,gBACxB,WAAW,KAAK,OAAO;AAAA,gBACvB,eAAe,KAAK,OAAO;AAAA,gBAC3B,eAAe,KAAK,OAAQ;AAAA,gBAC5B,YAAY;AAAA,cACd,CAAC;AAAA,cACD,QAAQ,YAAY,QAAQ,wBAAwB;AAAA,YACtD,CAAC;AAED,gBAAI,CAAC,SAAS,IAAI;AAChB,oBAAM,OAAO,MAAM,SAAS,KAAK;AACjC,oBAAM,MAAM,IAAI,kBAAkB,SAAS,QAAQ,IAAI;AAEvD,kBAAI,SAAS,UAAU,OAAO,SAAS,SAAS,IAAK,OAAM;AAE3D,0BAAY;AACZ,kBAAI,UAAU,wBAAwB,GAAG;AACvC,sBAAM,QAAQ,MAAO,KAAK,IAAI,GAAG,OAAO;AACxC,wBAAQ,IAAI,gCAAgC,SAAS,MAAM,eAAe,QAAQ,GAAI,MAAM;AAC5F,sBAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAAA,cAC/C;AACA;AAAA,YACF;AAEA,kBAAM,OAAQ,MAAM,SAAS,KAAK;AAMlC,iBAAK,OAAQ,eAAe,KAAK;AACjC,iBAAK,OAAQ,cAAc,KAAK,IAAI,IAAI,KAAK,aAAa;AAE1D,kBAAM,KAAK,KAAK,KAAK,MAAO;AAC5B;AAAA,UACF,SAAS,KAAK;AACZ,wBAAY,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAE9D,gBAAI,qBAAqB,qBAAqB,UAAU,UAAU,OAAO,UAAU,SAAS,IAAK,OAAM;AACvG,gBAAI,UAAU,wBAAwB,GAAG;AACvC,oBAAM,QAAQ,MAAO,KAAK,IAAI,GAAG,OAAO;AACxC,sBAAQ,IAAI,gCAAgC,UAAU,OAAO,eAAe,QAAQ,GAAI,MAAM;AAC9F,oBAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAAA,YAC/C;AAAA,UACF;AAAA,QACF;AAEA,cAAM,aAAa,IAAI,MAAM,oCAAoC;AAAA,MACnE;AAAA,MAEA,MAAM,SAAwB;AAC5B,YAAI,KAAK,QAAQ,eAAe;AAC9B,cAAI;AACF,kBAAM;AAAA,cACJ,8CAA8C,KAAK,OAAO,aAAa;AAAA,cACvE,EAAE,QAAQ,OAAO;AAAA,YACnB;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAGA,YAAI;AACF,gBAAM,GAAG,OAAO,KAAK,UAAU;AAAA,QACjC,QAAQ;AAAA,QAER;AAEA,aAAK,SAAS;AAAA,MAChB;AAAA,IACF;AAAA;AAAA;;;AC3KA;AAAA;AAAA;AAAA;AAAA;AAEA,SAAS,cAAAC,mBAAkB;AAC3B,OAAOC,WAAU;AACjB,SAAS,kBAAkB;AAsBpB,SAAS,YAAY,QAA0C;AACpE,MAAI,OAAO,MAAM;AACf,WAAO,SAAS,OAAO,MAAM,MAAM;AAAA,EACrC;AAKA,QAAM,aAAaA,MAAK,KAAK,OAAO,WAAW,QAAQ,aAAa;AACpE,MAAID,YAAW,UAAU,GAAG;AAC1B,WAAO,SAAS,SAAS,MAAM;AAAA,EACjC;AAGA,QAAM,SAAS,QAAQ,IAAI,gBAAgB,KAAK;AAChD,MAAI,UAAU,OAAO,QAAQ;AAC3B,WAAO,SAAS,WAAW,MAAM;AAAA,EACnC;AAGA,MAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,QAAQ,IAAI,WAAW;AACrD,WAAO,SAAS,OAAO,MAAM;AAAA,EAC/B;AAGA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,gBAAiC;AACrC,YAAM,IAAI;AAAA,QACR;AAAA,MAIF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,SAAS,MAAgB,QAA0C;AAC1E,UAAQ,MAAM;AAAA,IACZ,KAAK,SAAS;AACZ,YAAM,SAAS,eAAe,OAAO,KAAK;AAC1C,YAAM,QAAQ,IAAI,WAAW,OAAO,WAAW,MAAM;AAGrD,YAAM,cAAc,MAAM,KAAK;AAE/B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,gBAAiC;AACrC,gBAAM;AACN,cAAI,CAAC,MAAM,UAAU,GAAG;AACtB,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,iBAAO,MAAM,eAAe;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,WAAW;AACd,YAAM,MAAM,OAAO,UAAU,QAAQ,IAAI,gBAAgB,KAAK;AAC9D,UAAI,CAAC,KAAK;AACR,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,gBAAiC;AACrC,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK,OAAO;AACV,YAAM,aAAa,IAAI,WAAW;AAAA,QAChC,QAAQ,CAAC,gDAAgD;AAAA,MAC3D,CAAC;AAED,aAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM,gBAAqC;AAEzC,gBAAM,WAAW,UAAU;AAC3B,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,iBAAiB,WAAmB,aAAsD;AACxG,QAAM,SAAS,eAAe,WAAW;AACzC,SAAO,IAAI,WAAW,WAAW,MAAM;AACzC;AA/HA;AAAA;AAAA;AAKA;AACA;AAAA;AAAA;;;ACNA;AAAA;AAAA;AAAA;AAEA,SAAS,cAAAE,mBAAkB;AAC3B,SAAS,UAAU,aAAa;AAChC,SAAS,QAAAC,aAAY;AAWrB,eAAsB,uBAAuB,WAAmB,SAAkC;AAChG,QAAM,eAAeA,MAAK,WAAW,WAAW;AAChD,QAAM,eAAeA,MAAK,SAAS,WAAW;AAG9C,QAAM,MAAMA,MAAK,cAAc,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC7D,QAAM,MAAMA,MAAK,WAAW,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,QAAM,MAAMA,MAAK,WAAW,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,QAAM,MAAMA,MAAK,WAAW,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAExD,MAAI,QAAQ;AACZ,aAAW,QAAQ,qBAAqB;AACtC,UAAM,OAAOA,MAAK,cAAc,IAAI;AACpC,UAAM,MAAMA,MAAK,cAAc,IAAI;AACnC,QAAI,CAACD,YAAW,IAAI,KAAKA,YAAW,GAAG,GAAG;AACxC,YAAM,SAAS,KAAK,IAAI;AACxB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAnCA,IAMM;AANN;AAAA;AAAA;AAMA,IAAM,sBAAsB;AAAA,MAC1B;AAAA,MAAW;AAAA,MAAmB;AAAA,MAAe;AAAA,MAC7C;AAAA,MAAY;AAAA,MAAa;AAAA,MAAgB;AAAA,IAC3C;AAAA;AAAA;;;ACTA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,gBAAgB;AACzB,SAAS,WAAW,QAAQ,SAAAE,cAAa;AACzC,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,eAAe;AAMxB,SAAS,KAAK,KAAa,MAA6D;AACtF,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,aAAS,KAAK,MAAM,CAAC,OAAO,QAAQ,WAAW;AAC7C,UAAI,OAAO;AACT,eAAO,OAAO,OAAO,OAAO,EAAE,QAAQ,OAAO,CAAC,CAAC;AAAA,MACjD,OAAO;AACL,QAAAA,SAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,SAAiB;AACxB,MAAI;AACF,WAAO,QAAQ,OAAQ;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,kBAAkB,QAA+B;AAC/D,QAAM,aAAa,OAAO,MACtB,OAAO,QAAQ,OAAO,GAAG,EACtB;AAAA,IACC,CAAC,CAAC,GAAG,CAAC,MACJ,cAAc,UAAU,CAAC,CAAC;AAAA,gBAAyB,UAAU,CAAC,CAAC;AAAA,EACnE,EACC,KAAK,IAAI,IACZ;AAEJ,QAAM,aAAa,OAAO,MACtB;AAAA;AAAA;AAAA,gBAGU,UAAU,OAAO,SAAS,CAAC;AAAA;AAAA;AAAA,EAGzC,UAAU;AAAA,eAEN;AAAA;AAAA;AAAA,gBAGU,UAAU,OAAO,SAAS,CAAC;AAAA;AAAA;AAAA;AAKzC,QAAM,UAAUF,MAAK,OAAO,WAAW,MAAM;AAE7C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,cAKK,KAAK;AAAA;AAAA;AAAA;AAAA,kBAID,UAAU,OAAO,QAAQ,CAAC;AAAA,kBAC1B,UAAU,OAAO,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,cAK/B,UAAU,OAAO,SAAS,CAAC;AAAA;AAAA,EAEvC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cASE,UAAUA,MAAK,SAAS,oBAAoB,CAAC,CAAC;AAAA;AAAA;AAAA,cAG9C,UAAUA,MAAK,SAAS,oBAAoB,CAAC,CAAC;AAAA;AAAA;AAAA;AAI5D;AAEA,eAAsB,sBAAsB,QAAsC;AAEhF,QAAMF,OAAME,MAAK,OAAO,WAAW,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAG/D,QAAMF,OAAMG,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAGpD,QAAM,QAAQ,kBAAkB,MAAM;AACtC,QAAM,UAAU,YAAY,OAAO,OAAO;AAE1C,QAAM,MAAM,OAAO;AACnB,QAAM,SAAS,OAAO,GAAG;AAGzB,QAAM,KAAK,aAAa,CAAC,aAAa,QAAQ,UAAU,CAAC;AAGzD,QAAM,KAAK,aAAa,CAAC,aAAa,MAAM,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;AACnE;AAEA,eAAsB,0BAAyC;AAC7D,QAAM,MAAM,OAAO;AACnB,QAAM,SAAS,OAAO,GAAG;AAGzB,MAAI;AACF,UAAM,KAAK,aAAa,CAAC,WAAW,GAAG,MAAM,IAAI,KAAK,EAAE,CAAC;AAAA,EAC3D,QAAQ;AAAA,EAER;AAGA,MAAIF,YAAW,UAAU,GAAG;AAC1B,UAAM,OAAO,UAAU;AAAA,EACzB;AACF;AAEA,eAAsB,sBAAqC;AACzD,QAAM,MAAM,OAAO;AACnB,QAAM,KAAK,aAAa,CAAC,aAAa,MAAM,OAAO,GAAG,IAAI,KAAK,EAAE,CAAC;AACpE;AAEA,eAAsB,qBAAoC;AACxD,QAAM,MAAM,OAAO;AACnB,QAAM,KAAK,aAAa,CAAC,QAAQ,WAAW,OAAO,GAAG,IAAI,KAAK,EAAE,CAAC;AACpE;AAEA,eAAsB,0BAAkD;AACtE,QAAM,MAAM,OAAO;AACnB,QAAM,SAAwB;AAAA,IAC5B,WAAWA,YAAW,UAAU;AAAA,IAChC,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AAEA,MAAI,CAAC,OAAO,UAAW,QAAO;AAE9B,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,aAAa,CAAC,SAAS,OAAO,GAAG,IAAI,KAAK,EAAE,CAAC;AAE3E,UAAM,WAAW,OAAO,MAAM,iBAAiB;AAC/C,QAAI,UAAU;AACZ,aAAO,UAAU;AACjB,aAAO,MAAM,SAAS,SAAS,CAAC,GAAG,EAAE;AAAA,IACvC;AAAA,EAEF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,KAAqB;AACtC,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;AA/KA,IAOM,OACA;AARN;AAAA;AAAA;AAOA,IAAM,QAAQ;AACd,IAAM,aAAaC,MAAK,QAAQ,GAAG,6CAA6C;AAAA;AAAA;;;ACRhF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,YAAAG,iBAAgB;AACzB,SAAS,aAAAC,YAAW,UAAAC,SAAQ,SAAAC,cAAa;AACzC,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,WAAAC,gBAAe;AAKxB,SAAS,cAAsB;AAC7B,SAAOF,MAAKE,SAAQ,GAAG,4CAA4C;AACrE;AAEA,SAASC,MAAK,KAAa,MAA6D;AACtF,SAAO,IAAI,QAAQ,CAACC,UAAS,WAAW;AACtC,IAAAT,UAAS,KAAK,MAAM,CAAC,OAAO,QAAQ,WAAW;AAC7C,UAAI,OAAO;AACT,eAAO,OAAO,OAAO,OAAO,EAAE,QAAQ,OAAO,CAAC,CAAC;AAAA,MACjD,OAAO;AACL,QAAAS,SAAQ,EAAE,QAAQ,OAAO,CAAC;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,iBAAiB,QAA+B;AAC9D,QAAM,WAAW,OAAO,MACpB,OAAO,QAAQ,OAAO,GAAG,EACtB,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,EAAE,EACvC,KAAK,IAAI,IACZ;AAEJ,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAMG,OAAO,QAAQ,IAAI,OAAO,SAAS;AAAA,mBAC5B,OAAO,SAAS;AAAA;AAAA;AAAA;AAAA,yBAIV,OAAO,SAAS;AAAA;AAAA,EAEvC,QAAQ;AAAA;AAAA;AAAA;AAAA;AAKV;AAEA,eAAsB,sBAAsB,QAAsC;AAChF,QAAM,WAAW,YAAY;AAG7B,QAAMN,OAAMG,SAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAGlD,QAAMH,OAAME,MAAK,OAAO,WAAW,MAAM,GAAG,EAAE,WAAW,KAAK,CAAC;AAG/D,QAAM,OAAO,iBAAiB,MAAM;AACpC,QAAMJ,WAAU,UAAU,MAAM,OAAO;AAGvC,QAAMO,MAAK,aAAa,CAAC,UAAU,eAAe,CAAC;AACnD,QAAMA,MAAK,aAAa,CAAC,UAAU,UAAU,SAAS,GAAG,SAAS,UAAU,CAAC;AAC/E;AAEA,eAAsB,0BAAyC;AAC7D,QAAM,WAAW,YAAY;AAG7B,MAAI;AACF,UAAMA,MAAK,aAAa,CAAC,UAAU,WAAW,SAAS,GAAG,SAAS,UAAU,CAAC;AAAA,EAChF,QAAQ;AAAA,EAER;AAGA,MAAIJ,YAAW,QAAQ,GAAG;AACxB,UAAMF,QAAO,QAAQ;AAAA,EACvB;AAGA,MAAI;AACF,UAAMM,MAAK,aAAa,CAAC,UAAU,eAAe,CAAC;AAAA,EACrD,QAAQ;AAAA,EAER;AACF;AAEA,eAAsB,sBAAqC;AACzD,QAAMA,MAAK,aAAa,CAAC,UAAU,SAAS,GAAG,SAAS,UAAU,CAAC;AACrE;AAEA,eAAsB,qBAAoC;AACxD,QAAMA,MAAK,aAAa,CAAC,UAAU,QAAQ,GAAG,SAAS,UAAU,CAAC;AACpE;AAEA,eAAsB,wBAAuC;AAC3D,QAAMA,MAAK,aAAa,CAAC,UAAU,WAAW,GAAG,SAAS,UAAU,CAAC;AACvE;AAEA,eAAsB,0BAAkD;AACtE,QAAM,WAAW,YAAY;AAC7B,QAAM,SAAwB;AAAA,IAC5B,WAAWJ,YAAW,QAAQ;AAAA,IAC9B,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AAEA,MAAI,CAAC,OAAO,UAAW,QAAO;AAE9B,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAMI,MAAK,aAAa;AAAA,MACzC;AAAA,MACA;AAAA,MACA,GAAG,SAAS;AAAA,IACd,CAAC;AACD,WAAO,UAAU,OAAO,KAAK,MAAM;AAAA,EACrC,QAAQ;AAEN,WAAO,UAAU;AAAA,EACnB;AAEA,MAAI,OAAO,SAAS;AAClB,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,MAAMA,MAAK,aAAa;AAAA,QACzC;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAG,SAAS;AAAA,MACd,CAAC;AACD,YAAM,QAAQ,OAAO,MAAM,eAAe;AAC1C,UAAI,SAAS,MAAM,CAAC,MAAM,KAAK;AAC7B,eAAO,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE;AAAA,MACpC;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,qBAAuC;AAC3D,MAAI;AACF,UAAMA,MAAK,aAAa,CAAC,UAAU,cAAc,QAAQ,CAAC;AAC1D,WAAO;AAAA,EACT,SAAS,KAAc;AAGrB,UAAM,OAAQ,IAA0B;AACxC,WAAO,SAAS;AAAA,EAClB;AACF;AAEA,eAAsB,eAA8B;AAClD,QAAMA,MAAK,YAAY,CAAC,eAAe,CAAC;AAC1C;AAjKA,IAOM;AAPN;AAAA;AAAA;AAOA,IAAM,YAAY;AAAA;AAAA;;;ACPlB;AAAA;AAAA;AAAA;AAAA;AAAA,SAAS,eAAe;AACxB,SAAS,qBAAqB;AAYvB,SAAS,qBAAqB,WAAmB,MAA8B;AACpF,QAAM,YAAY,QAAQ,cAAc,IAAI,IAAI,kBAAkB,YAAY,GAAG,CAAC,CAAC;AAEnF,SAAO;AAAA,IACL,UAAU,QAAQ;AAAA,IAClB;AAAA,IACA;AAAA,IACA,MAAM,QAAQ;AAAA,EAChB;AACF;AAEA,eAAsB,iBAAwC;AAC5D,QAAM,WAAW,QAAQ;AAEzB,MAAI,aAAa,UAAU;AACzB,UAAM;AAAA,MACJ,uBAAAE;AAAA,MACA,yBAAAC;AAAA,MACA,qBAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,yBAAAC;AAAA,IACF,IAAI,MAAM;AAEV,WAAO;AAAA,MACL,SAASJ;AAAA,MACT,WAAWC;AAAA,MACX,OAAOC;AAAA,MACP,MAAMC;AAAA,MACN,SAAS,YAAY;AACnB,cAAMA,oBAAmB;AACzB,cAAMD,qBAAoB;AAAA,MAC5B;AAAA,MACA,QAAQE;AAAA,IACV;AAAA,EACF;AAEA,MAAI,aAAa,SAAS;AACxB,UAAM;AAAA,MACJ,uBAAAC;AAAA,MACA,yBAAAC;AAAA,MACA,qBAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,uBAAAC;AAAA,MACA,yBAAAC;AAAA,IACF,IAAI,MAAM;AAEV,WAAO;AAAA,MACL,SAASL;AAAA,MACT,WAAWC;AAAA,MACX,OAAOC;AAAA,MACP,MAAMC;AAAA,MACN,SAASC;AAAA,MACT,QAAQC;AAAA,IACV;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR,iDAAiD,QAAQ;AAAA,EAE3D;AACF;AAzEA;AAAA;AAAA;AAAA;AAAA;;;ACEA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,QAAQ,OAAAC,MAAK,QAAAC,OAAM,cAAc;AAC1C,SAAS,aAAAC,kBAAiB;;;ACJ1B,SAAS,MAAM,iBAAiB;AAChC,OAAO,cAAc;;;ACKd,SAAS,YAAY,KAAqB;AAC/C,SAAO,KAAK,IAAI,GAAG,IAAI,MAAM,IAAI,EAAE,IAAI,OAAK,EAAE,MAAM,CAAC;AACvD;AAGO,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAGJ,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAGJ,IAAM,aAAa;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAGJ,IAAM,eAAe,CAAC,WAAW,WAAW,SAAS;AAKrD,SAAS,aAAa,MAAsB;AACjD,MAAI,QAAQ,YAAY,UAAU,IAAI,EAAG,QAAO;AAChD,MAAI,QAAQ,YAAY,WAAW,IAAI,EAAG,QAAO;AACjD,SAAO;AACT;;;ADzCI,mBAEI,KAFJ;AANG,SAAS,SAAS;AACvB,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,OAAO,QAAQ,WAAW;AAChC,QAAM,MAAM,aAAa,IAAI;AAE7B,SACE,iCACE;AAAA,wBAAC,YAAS,QAAQ,cAChB,8BAAC,QAAM,eAAI,GACb;AAAA,IACA,oBAAC,QAAK,UAAQ,MAAC,0CAA4B;AAAA,KAC7C;AAEJ;;;AEjBA,SAAS,KAAK,QAAAC,aAAY;AAiBd,SACE,OAAAC,MADF,QAAAC,aAAA;AAfZ,IAAM,SAAS,CAAC,QAAQ,YAAY,aAAa,SAAS;AAMnD,SAAS,WAAW,EAAE,KAAK,GAAU;AAC1C,SACE,gBAAAD,KAAC,OAAI,eAAc,UAAS,cAAc,GACxC,0BAAAA,KAAC,OAAI,KAAK,GACP,iBAAO,IAAI,CAAC,OAAO,MAAM;AACxB,UAAM,MAAM,IAAI;AAChB,UAAM,SAAS,MAAM;AACrB,UAAM,WAAW,QAAQ;AACzB,WACE,gBAAAC,MAAC,OACC;AAAA,sBAAAD;AAAA,QAACD;AAAA,QAAA;AAAA,UACC,OAAO,SAAS,UAAU,WAAW,SAAS;AAAA,UAC9C,MAAM;AAAA,UAEL,mBAAS,WAAM,OAAO,GAAG;AAAA;AAAA,MAC5B;AAAA,MACA,gBAAAC,KAACD,OAAA,EAAK,OAAO,WAAW,SAAS,QAAQ,MAAM,UAC5C,cAAI,KAAK,IACZ;AAAA,MACC,MAAM,OAAO,UAAU,gBAAAC,KAACD,OAAA,EAAK,UAAQ,MAAC,sBAAG;AAAA,SAVlC,KAWV;AAAA,EAEJ,CAAC,GACH,GACF;AAEJ;;;AClCA,SAAgB,UAAU,aAAa,cAAc;AACrD,SAAS,OAAAG,MAAK,QAAAC,aAAY;AAC1B,SAAS,QAAQ,WAAW,eAAe;;;ACF3C,SAAS,QAAAC,aAAY;AAQD,iBAAAC,aAAA;AADb,SAAS,WAAW,EAAE,SAAS,MAAM,GAAU;AACpD,MAAI,MAAO,QAAO,gBAAAA,MAACD,OAAA,EAAK,OAAM,OAAM;AAAA;AAAA,IAAG;AAAA,KAAM;AAC7C,MAAI,QAAS,QAAO,gBAAAC,MAACD,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,IAAG;AAAA,KAAQ;AAC9C,SAAO;AACT;;;ADkFQ,gBAAAE,MAGE,QAAAC,aAHF;AA9ER,IAAM,eAAe;AAAA,EACnB,EAAE,OAAO,8BAA8B,OAAO,QAAQ;AAAA,EACtD,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,gBAAgB,OAAO,OAAO;AACzC;AAEO,SAAS,SAAS,EAAE,OAAO,QAAQ,UAAU,GAAU;AAC5D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgB,QAAQ;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,cAAc,OAAyC,IAAI;AAEjE,QAAM,eAAe,YAAY,CAAC,UAAkB;AAClD,QAAI,UAAU,QAAQ;AACpB,aAAO,EAAE,UAAU,OAAO,CAAC;AAC3B;AAAA,IACF;AAEA,QAAI,UAAU,WAAW;AACvB,eAAS,SAAS;AAClB;AAAA,IACF;AAGA,aAAS,eAAe;AACxB,aAAS,EAAE;AAEX,KAAC,YAAY;AACX,UAAI;AACF,cAAM,EAAE,gBAAAC,iBAAgB,cAAAC,cAAa,IAAI,MAAM;AAC/C,cAAM,EAAE,kBAAAC,kBAAiB,IAAI,MAAM;AAEnC,cAAM,SAASF,gBAAe;AAC9B,cAAM,aAAaE,kBAAiB,SAAS;AAE7C,cAAM,WAAW;AAAA,UACf,SAAS,QAAiC;AACxC,mBAAO,IAAI,QAAgB,CAACC,aAAY;AACtC,0BAAY,UAAUA;AACtB,6BAAe,MAAM;AACrB,uBAAS,aAAa;AAAA,YACxB,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAMF,cAAa;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,MAAM;AAAA,UAAC;AAAA,QACd,CAAC;AAED,eAAO,EAAE,UAAU,SAAS,WAAW,KAAK,CAAC;AAAA,MAC/C,SAAS,KAAc;AACrB,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,iBAAS,GAAG;AACZ,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF,GAAG;AAAA,EACL,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,QAAM,mBAAmB,YAAY,CAAC,UAAkB;AACtD,QAAI,YAAY,SAAS;AACvB,kBAAY,QAAQ,KAAK;AACzB,kBAAY,UAAU;AACtB,qBAAe,EAAE;AACjB,eAAS,eAAe;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,YAAY,CAAC,UAAkB;AAClD,QAAI,CAAC,MAAM,KAAK,EAAG;AACnB,WAAO,EAAE,UAAU,WAAW,QAAQ,MAAM,KAAK,EAAE,CAAC;AAAA,EACtD,GAAG,CAAC,MAAM,CAAC;AAEX,SACE,gBAAAH,KAACM,MAAA,EAAI,eAAc,UACjB,0BAAAL,MAACK,MAAA,EAAI,eAAc,UAAS,aAAa,GACvC;AAAA,oBAAAN,KAACO,OAAA,EAAK,MAAI,MAAC,4BAAc;AAAA,IAExB,UAAU,YACT,gBAAAN,MAACK,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAN,KAACO,OAAA,EAAK,UAAQ,MAAC,6DAA+C;AAAA,MAC9D,gBAAAP,KAACM,MAAA,EAAI,WAAW,GACd,0BAAAN,KAAC,UAAO,SAAS,cAAc,UAAU,cAAc,GACzD;AAAA,OACF;AAAA,IAGD,UAAU,mBACT,gBAAAA,KAACM,MAAA,EAAI,WAAW,GACd,0BAAAN,KAAC,WAAQ,OAAM,yBAAwB,GACzC;AAAA,IAGD,UAAU,iBACT,gBAAAC,MAACK,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAN,KAACO,OAAA,EAAM,uBAAY;AAAA,MACnB,gBAAAP,KAAC,aAAU,UAAU,kBAAkB,aAAY,kBAAiB;AAAA,OACtE;AAAA,IAGD,UAAU,aACT,gBAAAC,MAACK,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAN,KAACO,OAAA,EAAK,UAAQ,MAAC,mEAAqD;AAAA,MACpE,gBAAAP,KAACM,MAAA,EAAI,WAAW,GACd,0BAAAN,KAAC,aAAU,UAAU,cAAc,aAAY,SAAQ,GACzD;AAAA,OACF;AAAA,IAGF,gBAAAA,KAAC,cAAW,OAAc;AAAA,KAC5B,GACF;AAEJ;;;AElIA,SAAgB,YAAAQ,WAAU,eAAAC,oBAAmB;AAC7C,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAS,cAAc,aAAAC,kBAAiB;AA2DhC,gBAAAC,MAGE,QAAAC,aAHF;AAhDD,SAAS,aAAa,EAAE,OAAO,OAAO,GAAU;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAIN,UAAgB,cAAc;AACxD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAS,MAAM,eAAe;AAC5E,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,MAAM,aAAa;AACtE,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,MAAM,UAAU;AAE7D,QAAM,oBAAoBC,aAAY,MAAM;AAC1C,uBAAmB,IAAI;AACvB,aAAS,gBAAgB;AAAA,EAC3B,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmBA,aAAY,MAAM;AACzC,uBAAmB,KAAK;AACxB,aAAS,SAAS;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsBA,aAAY,CAAC,UAAkB;AACzD,QAAI,CAAC,MAAM,KAAK,EAAG;AACnB,qBAAiB,MAAM,KAAK,CAAC;AAC7B,aAAS,SAAS;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA,aAAY,MAAM;AACrC,kBAAc,IAAI;AAClB,aAAS,cAAc;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,cAAcA,aAAY,MAAM;AACpC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,aAAa;AAAA,IACf,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,iBAAiB,aAAa,CAAC;AAE3C,QAAM,oBAAoBA,aAAY,CAAC,UAAkB;AACvD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,YAAY;AAAA,MACZ,aAAa,MAAM,KAAK;AAAA,IAC1B,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,iBAAiB,aAAa,CAAC;AAE3C,SACE,gBAAAI,KAACH,MAAA,EAAI,eAAc,UACjB,0BAAAI,MAACJ,MAAA,EAAI,eAAc,UAAS,aAAa,GACvC;AAAA,oBAAAG,KAACF,OAAA,EAAK,MAAI,MAAC,sBAAQ;AAAA,IAElB,UAAU,kBACT,gBAAAG,MAACJ,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAG,KAACF,OAAA,EAAK,UAAQ,MAAC,wCAA0B;AAAA,MACzC,gBAAAE,KAACH,MAAA,EAAI,WAAW,GACd,0BAAAG,KAAC,gBAAa,WAAW,mBAAmB,UAAU,kBAAkB,GAC1E;AAAA,OACF;AAAA,IAGD,UAAU,oBACT,gBAAAC,MAACJ,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAG,KAACF,OAAA,EAAK,UAAQ,MAAC,8DAAgD;AAAA,MAC/D,gBAAAE,KAACH,MAAA,EAAI,WAAW,GACd,0BAAAG,KAACD,YAAA,EAAU,UAAU,qBAAqB,aAAY,qBAAoB,GAC5E;AAAA,OACF;AAAA,IAGD,UAAU,aACT,gBAAAE,MAACJ,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAG,KAACF,OAAA,EAAK,UAAQ,MAAC,kCAAoB;AAAA,MACnC,gBAAAE,KAACH,MAAA,EAAI,WAAW,GACd,0BAAAG,KAAC,gBAAa,WAAW,cAAc,UAAU,aAAa,GAChE;AAAA,OACF;AAAA,IAGD,UAAU,kBACT,gBAAAC,MAACJ,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAG,KAACF,OAAA,EAAK,UAAQ,MAAC,oDAAsC;AAAA,MACrD,gBAAAE,KAACH,MAAA,EAAI,WAAW,GACd,0BAAAG,KAACD,YAAA,EAAU,UAAU,mBAAmB,aAAY,YAAW,GACjE;AAAA,OACF;AAAA,KAEJ,GACF;AAEJ;;;ACrGA,SAAgB,YAAAG,WAAU,WAAW,UAAAC,eAAc;AACnD,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAS,WAAAC,gBAAe;AAgDhB,gBAAAC,MAUI,QAAAC,aAVJ;AApCD,SAAS,cAAc,EAAE,OAAO,QAAQ,WAAW,QAAQ,GAAU;AAC1E,QAAM,CAAC,SAAS,UAAU,IAAIC,UAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,CAAC;AACpC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,UAAUC,QAAO,KAAK;AAE5B,YAAU,MAAM;AACd,QAAI,QAAQ,QAAS;AACrB,YAAQ,UAAU;AAElB,KAAC,YAAY;AACX,UAAI;AACF,cAAM,EAAE,wBAAAC,wBAAuB,IAAI,MAAM;AACzC,cAAM,IAAI,MAAMA,wBAAuB,WAAW,OAAO;AACzD,iBAAS,CAAC;AACV,mBAAW,KAAK;AAAA,MAClB,SAAS,KAAc;AACrB,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,iBAAS,GAAG;AACZ,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF,GAAG;AAAA,EACL,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,YAAU,MAAM;AACd,QAAI,QAAS;AAEb,UAAM,QAAQ,WAAW,MAAM;AAC7B,aAAO,EAAE,iBAAiB,MAAM,CAAC;AAAA,IACnC,GAAG,QAAQ,MAAO,GAAI;AACtB,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,SAAS,OAAO,OAAO,MAAM,CAAC;AAElC,SACE,gBAAAJ,KAACK,MAAA,EAAI,eAAc,UACjB,0BAAAJ,MAACI,MAAA,EAAI,eAAc,UAAS,aAAa,GACvC;AAAA,oBAAAL,KAACM,OAAA,EAAK,MAAI,MAAC,uBAAS;AAAA,IAEnB,WACC,gBAAAN,KAACK,MAAA,EAAI,WAAW,GACd,0BAAAL,KAACO,UAAA,EAAQ,OAAM,kCAAiC,GAClD;AAAA,IAGD,CAAC,WAAW,CAAC,SACZ,gBAAAP,KAACK,MAAA,EAAI,WAAW,GACd,0BAAAJ,MAACK,OAAA,EAAK,OAAM,SAAS;AAAA;AAAA,MAAM;AAAA,MAAU,UAAU,IAAI,MAAM;AAAA,MAAG;AAAA,MAAY;AAAA,MAAU;AAAA,OAAU,GAC9F;AAAA,IAGF,gBAAAN,KAAC,cAAW,OAAc;AAAA,KAC5B,GACF;AAEJ;;;ACpEA,SAAgB,YAAAQ,WAAU,aAAAC,YAAW,eAAAC,cAAa,UAAAC,eAAc;AAChE,SAAS,OAAAC,MAAK,QAAAC,aAAY;AAC1B,SAAS,gBAAAC,eAAc,WAAAC,gBAAe;AAkD9B,gBAAAC,MAGE,QAAAC,aAHF;AArCD,SAAS,YAAY,EAAE,OAAO,QAAQ,UAAU,GAAU;AAC/D,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAgB,KAAK;AAC/C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,aAAaC,QAAO,KAAK;AAE/B,QAAM,gBAAgBC,aAAY,MAAM;AACtC,aAAS,YAAY;AAAA,EACvB,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA,aAAY,MAAM;AACrC,WAAO,EAAE,gBAAgB,MAAM,CAAC;AAAA,EAClC,GAAG,CAAC,MAAM,CAAC;AAEX,EAAAC,WAAU,MAAM;AACd,QAAI,UAAU,gBAAgB,WAAW,QAAS;AAClD,eAAW,UAAU;AAErB,KAAC,YAAY;AACX,UAAI;AACF,cAAM,EAAE,gBAAAC,iBAAgB,sBAAAC,sBAAqB,IAAI,MAAM;AACvD,cAAM,UAAU,MAAMD,gBAAe;AACrC,cAAM,SAASC,sBAAqB,SAAS;AAC7C,cAAM,QAAQ,QAAQ,MAAM;AAC5B,iBAAS,MAAM;AACf,eAAO,EAAE,gBAAgB,MAAM,kBAAkB,KAAK,CAAC;AAAA,MACzD,SAAS,KAAc;AACrB,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,iBAAS,GAAG;AACZ,iBAAS,MAAM;AACf,eAAO,EAAE,gBAAgB,MAAM,kBAAkB,OAAO,cAAc,IAAI,CAAC;AAAA,MAC7E;AAAA,IACF,GAAG;AAAA,EACL,GAAG,CAAC,OAAO,QAAQ,SAAS,CAAC;AAE7B,SACE,gBAAAP,KAACQ,MAAA,EAAI,eAAc,UACjB,0BAAAP,MAACO,MAAA,EAAI,eAAc,UAAS,aAAa,GACvC;AAAA,oBAAAR,KAACS,OAAA,EAAK,MAAI,MAAC,gCAAkB;AAAA,IAE5B,UAAU,SACT,gBAAAR,MAACO,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAR,KAACS,OAAA,EAAK,UAAQ,MAAC,0DAA4C;AAAA,MAC3D,gBAAAT,KAACQ,MAAA,EAAI,WAAW,GACd,0BAAAR,KAACU,eAAA,EAAa,WAAW,eAAe,UAAU,cAAc,GAClE;AAAA,OACF;AAAA,IAGD,UAAU,gBACT,gBAAAV,KAACQ,MAAA,EAAI,WAAW,GACd,0BAAAR,KAACW,UAAA,EAAQ,OAAM,yBAAwB,GACzC;AAAA,IAGD,UAAU,UAAU,CAAC,SACpB,gBAAAX,KAACQ,MAAA,EAAI,WAAW,GACd,0BAAAR,KAACS,OAAA,EAAK,OAAM,SAAQ,6CAA+B,GACrD;AAAA,IAGF,gBAAAT,KAAC,cAAW,OAAc;AAAA,KAC5B,GACF;AAEJ;;;ARoEQ,gBAAAY,MACA,QAAAC,aADA;AA9HD,SAAS,oBAAoB,KAA8C;AAChF,QAAM,MAAsB,CAAC;AAC7B,QAAM,QAAQ,IAAI,OAAO;AACzB,MAAI,OAAO;AACT,QAAI,MAAM,MAAM,MAAM,WAAW,MAAM,MAAM,MAAM,WAAW;AAC5D,UAAI,WAAW,MAAM,MAAM;AAAA,IAC7B;AACA,QAAI,OAAO,MAAM,QAAQ,MAAM,SAAU,KAAI,SAAS,MAAM,QAAQ;AAAA,EACtE;AACA,QAAM,WAAW,IAAI,UAAU;AAC/B,MAAI,UAAU;AACZ,UAAM,KAAK,SAAS,UAAU;AAC9B,QAAI,IAAI;AACN,UAAI,kBAAkB,GAAG,SAAS,MAAM;AACxC,UAAI,OAAO,GAAG,OAAO,MAAM,SAAU,KAAI,gBAAgB,GAAG,OAAO;AAAA,IACrE;AACA,UAAM,MAAM,SAAS,KAAK;AAC1B,QAAI,IAAK,KAAI,aAAa,IAAI,SAAS,MAAM;AAAA,EAC/C;AACA,QAAM,UAAU,IAAI,SAAS;AAC7B,MAAI,SAAS;AACX,UAAM,OAAO,QAAQ,MAAM;AAC3B,QAAI,QAAQ,OAAO,KAAK,OAAO,MAAM,SAAU,KAAI,cAAc,KAAK,OAAO;AAAA,EAC/E;AACA,SAAO;AACT;AAKO,SAAS,kBAAkB,WAAmB,UAAwC;AAC3F,SAAO;AAAA,IACL,UAAU,UAAU,YAAY;AAAA,IAChC,QAAQ,UAAU,UAAU;AAAA,IAC5B,WAAW;AAAA,IAEX,iBAAiB,UAAU,mBAAmB;AAAA,IAC9C,eAAe,UAAU,iBAAiB;AAAA,IAC1C,YAAY,UAAU,cAAc;AAAA,IACpC,aAAa,UAAU,eAAe;AAAA,IAEtC;AAAA,IACA,iBAAiB;AAAA,IAEjB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,cAAc;AAAA,IAEd,aAAa;AAAA,IACb,MAAM;AAAA,EACR;AACF;AAMO,SAAS,kBAAkB,OAA6C;AAC7E,SAAO;AAAA,IACL,OAAO;AAAA,MACL,UAAU;AAAA,MACV,OAAO;AAAA,MACP,GAAI,MAAM,aAAa,SAAS,EAAE,MAAM,MAAM,SAAS,IAAI,CAAC;AAAA,MAC5D,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,IACjD;AAAA,IACA,SAAS;AAAA,MACP,MAAM;AAAA,MACN,MAAM;AAAA,MACN,GAAI,MAAM,cAAc,EAAE,MAAM,EAAE,OAAO,MAAM,YAAY,EAAE,IAAI,CAAC;AAAA,IACpE;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,QACR,SAAS,MAAM;AAAA,QACf,GAAI,MAAM,gBAAgB,EAAE,OAAO,MAAM,cAAc,IAAI,CAAC;AAAA,MAC9D;AAAA,MACA,KAAK,EAAE,SAAS,MAAM,WAAW;AAAA,MACjC,KAAK,EAAE,SAAS,MAAM;AAAA,IACxB;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa,EAAE,eAAe,MAAM,cAAc,MAAM;AAAA,IAC1D;AAAA,IACA,WAAW,EAAE,MAAM,GAAG,MAAM,SAAS,aAAa;AAAA,EACpD;AACF;AAaA,SAAS,OAAO,EAAE,WAAW,YAAY,SAAS,SAAS,GAAgB;AACzE,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAsB,MAAM,kBAAkB,WAAW,QAAQ,CAAC;AAO5F,QAAM,iBAAiB,OAAO,UAAgC;AAC5D,UAAM,SAAS,EAAE,GAAG,OAAO,GAAG,MAAM;AAEpC,QAAI,OAAO,eAAe,GAAG;AAE3B,YAAM,SAAS,kBAAkB,MAAM;AACvC,YAAMC,WAAU,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACpE,eAAS,EAAE,GAAG,QAAQ,MAAM,KAAK,CAAC;AAClC,iBAAW,MAAM,KAAK,GAAG,EAAE;AAC3B;AAAA,IACF;AAGA,UAAM,OAAQ,OAAO,cAAc;AACnC,aAAS,EAAE,GAAG,QAAQ,aAAa,KAAK,CAAC;AAAA,EAC3C;AAEA,MAAI,MAAM,MAAM;AACd,WACE,gBAAAF,MAACG,MAAA,EAAI,eAAc,UAAS,WAAW,GACrC;AAAA,sBAAAJ,KAACK,OAAA,EAAK,OAAM,SAAQ,MAAI,MAAC,oDAAsC;AAAA,MAC/D,gBAAAJ,MAACI,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,QAAqB;AAAA,SAAW;AAAA,OACjD;AAAA,EAEJ;AAEA,SACE,gBAAAJ,MAACG,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAJ,KAAC,UAAO;AAAA,IACR,gBAAAA,KAAC,cAAW,MAAM,MAAM,aAAa;AAAA,IAEpC,MAAM,gBAAgB,KACrB,gBAAAA,KAAC,YAAS,OAAc,QAAQ,gBAAgB,WAAsB;AAAA,IAEvE,MAAM,gBAAgB,KACrB,gBAAAA,KAAC,gBAAa,OAAc,QAAQ,gBAAgB;AAAA,IAErD,MAAM,gBAAgB,KACrB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ;AAAA,QACR;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAED,MAAM,gBAAgB,KACrB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,QAAQ;AAAA,QACR;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;AAMA,eAAsB,eACpB,WACA,YACA,SACe;AAEf,MAAI;AACJ,MAAI;AACF,UAAM,EAAE,YAAAM,YAAW,IAAI,MAAM,OAAO,SAAS;AAC7C,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,kBAAkB;AACpD,QAAIA,YAAW,UAAU,GAAG;AAC1B,YAAM,MAAM,KAAK,MAAM,MAAM,SAAS,YAAY,OAAO,CAAC;AAC1D,iBAAW,oBAAoB,GAAG;AAAA,IACpC;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,EAAE,cAAc,IAAI;AAAA,IACxB,gBAAAN,KAAC,UAAO,WAAsB,YAAwB,SAAkB,UAAoB;AAAA,EAC9F;AACA,QAAM,cAAc;AACtB;",
4
+ "sourcesContent": ["// src/llm/auth/oauth-callback.ts \u2014 Temporary local HTTP server for OAuth redirect\n\nimport http from 'node:http';\nimport { URL } from 'node:url';\n\nexport interface CallbackResult {\n code: string;\n state?: string;\n}\n\n/**\n * Starts a temporary HTTP server on a random port, waits for the OAuth callback,\n * extracts the authorization code, then shuts down.\n */\nexport const OAUTH_CALLBACK_PORT = 18788;\n\nexport function startCallbackServer(port: number = OAUTH_CALLBACK_PORT): {\n port: number;\n result: Promise<CallbackResult>;\n close: () => void;\n} {\n let resolveResult: (result: CallbackResult) => void;\n let rejectResult: (error: Error) => void;\n\n const resultPromise = new Promise<CallbackResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const server = http.createServer((req, res) => {\n if (!req.url) {\n res.writeHead(400);\n res.end('Bad request');\n return;\n }\n\n const url = new URL(req.url, `http://localhost`);\n\n if (url.pathname !== '/callback') {\n res.writeHead(404);\n res.end('Not found');\n return;\n }\n\n const code = url.searchParams.get('code');\n const error = url.searchParams.get('error');\n const state = url.searchParams.get('state') ?? undefined;\n\n if (error) {\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(errorPage(error));\n rejectResult(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (!code) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(errorPage('No authorization code received'));\n rejectResult(new Error('No authorization code in callback'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(successPage());\n resolveResult({ code, state });\n });\n\n server.listen(port, 'localhost');\n\n // Auto-close after 5 minutes to avoid leaking\n const timeout = setTimeout(() => {\n server.close();\n rejectResult(new Error('OAuth callback timed out after 5 minutes'));\n }, 5 * 60 * 1000);\n\n // Clean up timeout when result resolves\n resultPromise.finally(() => {\n clearTimeout(timeout);\n server.close();\n });\n\n return {\n port,\n result: resultPromise,\n close: () => {\n clearTimeout(timeout);\n server.close();\n },\n };\n}\n\n/**\n * Extracts the authorization code from a pasted redirect URL.\n * Used in headless/VPS mode when there's no local browser.\n */\nexport function extractCodeFromUrl(redirectUrl: string): CallbackResult {\n const url = new URL(redirectUrl);\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state') ?? undefined;\n\n if (!code) {\n throw new Error('No authorization code found in the URL. Make sure you copied the full URL.');\n }\n\n return { code, state };\n}\n\nfunction successPage(): string {\n return `<!DOCTYPE html>\n<html><body style=\"font-family:system-ui;text-align:center;padding:60px\">\n<h1>Authenticated!</h1>\n<p>You can close this window and return to your terminal.</p>\n</body></html>`;\n}\n\nfunction errorPage(error: string): string {\n return `<!DOCTYPE html>\n<html><body style=\"font-family:system-ui;text-align:center;padding:60px\">\n<h1>Authentication Failed</h1>\n<p>${error}</p>\n<p>Please try again.</p>\n</body></html>`;\n}\n", "// src/llm/auth/oauth.ts \u2014 Full Google OAuth2 authorization code flow\n\nimport { existsSync, readFileSync, readdirSync, realpathSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { delimiter, dirname, join } from 'node:path';\nimport { startCallbackServer, extractCodeFromUrl, OAUTH_CALLBACK_PORT } from './oauth-callback.js';\nimport { TokenStore } from './token-store.js';\nimport type { OAuthClientConfig, StoredTokens } from './types.js';\n\n// OAuth client resolution order:\n// 1. Environment variables (GEMMA_OAUTH_CLIENT_ID / GEMMA_OAUTH_CLIENT_SECRET)\n// 2. Extract from @google/gemini-cli-core (own dependency \u2192 local node_modules \u2192 global CLI)\n// 3. Config file (gemma.json model.oauth.clientId / clientSecret)\n// 4. Fail with helpful error message\n\nconst SCOPES = [\n 'https://www.googleapis.com/auth/cloud-platform',\n 'https://www.googleapis.com/auth/userinfo.email',\n 'https://www.googleapis.com/auth/userinfo.profile',\n];\nconst AUTH_ENDPOINT = 'https://accounts.google.com/o/oauth2/v2/auth';\nconst TOKEN_ENDPOINT = 'https://oauth2.googleapis.com/token';\n\n// \u2500\u2500 Gemini CLI credential extraction \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet cachedGeminiCliCredentials: OAuthClientConfig | null = null;\n\n/**\n * Find an executable by name in PATH, handling Windows extensions.\n */\nfunction findInPath(name: string): string | null {\n const exts = process.platform === 'win32' ? ['.cmd', '.bat', '.exe', ''] : [''];\n for (const dir of (process.env.PATH ?? '').split(delimiter)) {\n for (const ext of exts) {\n const p = join(dir, name + ext);\n if (existsSync(p)) {\n return p;\n }\n }\n }\n return null;\n}\n\n/**\n * Recursively search for a file by name within a directory tree.\n */\nfunction findFile(dir: string, name: string, depth: number): string | null {\n if (depth <= 0) return null;\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const p = join(dir, entry.name);\n if (entry.isFile() && entry.name === name) return p;\n if (entry.isDirectory() && !entry.name.startsWith('.')) {\n const found = findFile(p, name, depth - 1);\n if (found) return found;\n }\n }\n } catch {\n // Permission denied or other FS errors\n }\n return null;\n}\n\n/**\n * Extract OAuth client credentials from the installed Gemini CLI.\n *\n * Locates the `gemini` binary in PATH, resolves symlinks to find the\n * CLI installation directory, then reads the bundled oauth2.js file\n * and extracts the client ID and secret via regex.\n *\n * Based on OpenClaw's google-gemini-cli-auth extension (MIT license).\n */\nexport function extractGeminiCliCredentials(): OAuthClientConfig | null {\n if (cachedGeminiCliCredentials) return cachedGeminiCliCredentials;\n\n const result = extractFromOwnDependency() ?? extractFromLocalNodeModules() ?? extractFromGlobalCli();\n if (result) {\n cachedGeminiCliCredentials = result;\n }\n return result;\n}\n\n/**\n * Resolve @google/gemini-cli-core from Gemma's own dependency tree.\n * Works for global npm installs, Docker, and any scenario where\n * gemini-cli-core is a direct dependency of boten-gemma.\n */\nfunction extractFromOwnDependency(): OAuthClientConfig | null {\n try {\n const require = createRequire(import.meta.url);\n const corePkg = require.resolve('@google/gemini-cli-core/package.json');\n const coreDir = dirname(corePkg);\n const oauth2Path = join(coreDir, 'dist', 'src', 'code_assist', 'oauth2.js');\n if (existsSync(oauth2Path)) {\n return parseOAuth2File(readFileSync(oauth2Path, 'utf8'));\n }\n } catch {\n // @google/gemini-cli-core not in our dependency tree\n }\n return null;\n}\n\n/**\n * Try reading oauth2.js from the project's local node_modules.\n * Works on VPS deployments where @google/gemini-cli-core is a project dependency.\n */\nfunction extractFromLocalNodeModules(): OAuthClientConfig | null {\n try {\n // Look relative to CWD (project root)\n const localPath = join(\n process.cwd(), 'node_modules', '@google', 'gemini-cli-core',\n 'dist', 'src', 'code_assist', 'oauth2.js',\n );\n if (existsSync(localPath)) {\n return parseOAuth2File(readFileSync(localPath, 'utf8'));\n }\n } catch {\n // Not installed locally\n }\n return null;\n}\n\n/**\n * Try extracting credentials from a globally installed Gemini CLI.\n * Finds the `gemini` binary on PATH, resolves to the package directory,\n * and reads the bundled oauth2.js file.\n */\nfunction extractFromGlobalCli(): OAuthClientConfig | null {\n try {\n const geminiPath = findInPath('gemini');\n if (!geminiPath) return null;\n\n const resolvedPath = realpathSync(geminiPath);\n const geminiCliDir = dirname(dirname(resolvedPath));\n\n const searchPaths = [\n join(geminiCliDir, 'node_modules', '@google', 'gemini-cli-core', 'dist', 'src', 'code_assist', 'oauth2.js'),\n join(geminiCliDir, 'node_modules', '@google', 'gemini-cli-core', 'dist', 'code_assist', 'oauth2.js'),\n ];\n\n for (const p of searchPaths) {\n if (existsSync(p)) {\n const result = parseOAuth2File(readFileSync(p, 'utf8'));\n if (result) return result;\n }\n }\n\n // Fallback: recursive search for oauth2.js (depth-limited)\n const found = findFile(geminiCliDir, 'oauth2.js', 10);\n if (found) {\n return parseOAuth2File(readFileSync(found, 'utf8'));\n }\n } catch {\n // Gemini CLI not installed or extraction failed\n }\n return null;\n}\n\n/** Extract client ID and secret from the content of oauth2.js via regex. */\nfunction parseOAuth2File(content: string): OAuthClientConfig | null {\n const idMatch = content.match(/(\\d+-[a-z0-9]+\\.apps\\.googleusercontent\\.com)/);\n const secretMatch = content.match(/(GOCSPX-[A-Za-z0-9_-]+)/);\n if (idMatch && secretMatch) {\n return { clientId: idMatch[1], clientSecret: secretMatch[1] };\n }\n return null;\n}\n\n// \u2500\u2500 OAuth client resolution \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function getOAuthClient(config?: Partial<OAuthClientConfig>): OAuthClientConfig {\n // 1. Environment variables (user override)\n const envClientId = process.env.GEMMA_OAUTH_CLIENT_ID?.trim();\n const envClientSecret = process.env.GEMMA_OAUTH_CLIENT_SECRET?.trim();\n if (envClientId && envClientSecret) {\n return { clientId: envClientId, clientSecret: envClientSecret };\n }\n\n // 2. Extract from installed Gemini CLI\n const extracted = extractGeminiCliCredentials();\n if (extracted) {\n return extracted;\n }\n\n // 3. Config file (gemma.json model.oauth)\n if (config?.clientId && config?.clientSecret) {\n return { clientId: config.clientId, clientSecret: config.clientSecret };\n }\n\n // 4. No credentials available\n throw new Error(\n 'Missing OAuth client credentials.\\n\\n' +\n 'Gemma borrows OAuth credentials from the Gemini CLI.\\n' +\n 'Install it first:\\n\\n' +\n ' npm install -g @google/gemini-cli\\n\\n' +\n 'Or set credentials manually:\\n' +\n ' - Environment: GEMMA_OAUTH_CLIENT_ID + GEMMA_OAUTH_CLIENT_SECRET\\n' +\n ' - Config: model.oauth.clientId + model.oauth.clientSecret in gemma.json',\n );\n}\n\n/**\n * Build the Google OAuth2 authorization URL.\n */\nfunction buildAuthUrl(clientId: string, redirectUri: string, state?: string): string {\n const params = new URLSearchParams({\n client_id: clientId,\n redirect_uri: redirectUri,\n response_type: 'code',\n scope: SCOPES.join(' '),\n access_type: 'offline',\n prompt: 'consent',\n });\n if (state) {\n params.set('state', state);\n }\n return `${AUTH_ENDPOINT}?${params.toString()}`;\n}\n\n/**\n * Exchange an authorization code for tokens.\n */\nasync function exchangeCode(\n code: string,\n redirectUri: string,\n client: OAuthClientConfig,\n): Promise<StoredTokens> {\n const response = await fetch(TOKEN_ENDPOINT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n code,\n client_id: client.clientId,\n client_secret: client.clientSecret,\n redirect_uri: redirectUri,\n grant_type: 'authorization_code',\n }),\n });\n\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`Token exchange failed (${response.status}): ${body}`);\n }\n\n const data = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n scope: string;\n token_type: string;\n id_token?: string;\n };\n\n if (!data.refresh_token) {\n throw new Error(\n 'No refresh token received. This can happen if you already authorized this app. ' +\n 'Revoke access at https://myaccount.google.com/permissions and try again.',\n );\n }\n\n // Try to extract email from id_token if present (JWT payload)\n let email: string | undefined;\n if (data.id_token) {\n try {\n const payload = JSON.parse(\n Buffer.from(data.id_token.split('.')[1], 'base64url').toString(),\n );\n email = payload.email;\n } catch {\n // Not critical\n }\n }\n\n return {\n access_token: data.access_token,\n refresh_token: data.refresh_token,\n expiry_date: Date.now() + data.expires_in * 1000,\n scope: data.scope,\n email,\n obtained_at: new Date().toISOString(),\n };\n}\n\n/**\n * Detect whether we're in a headless environment (no browser available).\n */\nfunction isHeadless(): boolean {\n // SSH session, no DISPLAY on Linux, CI environments\n if (process.env.SSH_CONNECTION || process.env.SSH_CLIENT) return true;\n if (process.platform === 'linux' && !process.env.DISPLAY && !process.env.WAYLAND_DISPLAY) return true;\n if (process.env.CI) return true;\n return false;\n}\n\nexport interface OAuthFlowOptions {\n client: OAuthClientConfig;\n tokenStore: TokenStore;\n /** Override headless detection (for testing) */\n forceHeadless?: boolean;\n /** readline interface for headless mode input */\n readline?: { question(prompt: string): Promise<string> };\n /** Logger function */\n log?: (msg: string) => void;\n}\n\n/**\n * Run the full OAuth flow: open browser (or print URL), exchange code, save tokens.\n */\nexport async function runOAuthFlow(options: OAuthFlowOptions): Promise<StoredTokens> {\n const { client, tokenStore, log = console.log } = options;\n const headless = options.forceHeadless ?? isHeadless();\n\n if (headless) {\n return runHeadlessFlow(options);\n }\n\n return runDesktopFlow(options);\n}\n\nasync function runDesktopFlow(options: OAuthFlowOptions): Promise<StoredTokens> {\n const { client, tokenStore, log = console.log, readline } = options;\n\n const redirectUri = `http://localhost:${OAUTH_CALLBACK_PORT}/callback`;\n const authUrl = buildAuthUrl(client.clientId, redirectUri);\n\n // Try to start callback server\n let callback: ReturnType<typeof startCallbackServer> | undefined;\n try {\n callback = startCallbackServer();\n } catch {\n log(' Could not start callback server (port in use?).');\n }\n\n // Open browser\n log('\\n Opening browser for Google sign-in...\\n');\n try {\n const open = (await import('open')).default;\n await open(authUrl);\n } catch {\n log(' Could not open browser. Open this URL manually:');\n log(`\\n ${authUrl}\\n`);\n }\n\n let code: string;\n\n if (callback) {\n // Race: callback server vs manual paste\n log(' Waiting for callback... If the page shows an error,');\n log(' paste the full URL from your browser here instead.\\n');\n\n const callbackPromise = callback.result.then(r => r.code);\n const pastePromise = readline\n ? readline.question(' Paste redirect URL (or wait for auto-callback): ').then(url => {\n const trimmed = url.trim();\n if (!trimmed) throw new Error('empty');\n return extractCodeFromUrl(trimmed).code;\n })\n : new Promise<string>(() => {}); // never resolves if no readline\n\n try {\n code = await Promise.race([callbackPromise, pastePromise]);\n } finally {\n callback.close();\n }\n } else {\n // No callback server \u2014 manual paste only\n log(' After signing in, copy the full URL from your browser\\n');\n if (!readline) {\n throw new Error('No callback server and no readline available.');\n }\n const pastedUrl = await readline.question(' Paste redirect URL: ');\n code = extractCodeFromUrl(pastedUrl.trim()).code;\n }\n\n const tokens = await exchangeCode(code, redirectUri, client);\n await tokenStore.save(tokens);\n\n log(`\\n Authenticated as ${tokens.email ?? 'unknown'}`);\n log(' Tokens saved to ~/.gemma/auth/tokens.json\\n');\n return tokens;\n}\n\nasync function runHeadlessFlow(options: OAuthFlowOptions): Promise<StoredTokens> {\n const { client, tokenStore, log = console.log, readline } = options;\n\n const redirectUri = `http://localhost:${OAUTH_CALLBACK_PORT}/callback`;\n const authUrl = buildAuthUrl(client.clientId, redirectUri);\n\n log('');\n log(' No browser detected. Open this URL on any device:');\n log('');\n log(` ${authUrl}`);\n log('');\n log(' After approving, your browser will redirect to a URL');\n log(` starting with ${redirectUri}?code=...`);\n log(' The page will show an error \u2014 that\\'s expected.');\n log('');\n log(' Copy the FULL URL from your browser\\'s address bar');\n log(' and paste it below.');\n log('');\n\n if (!readline) {\n throw new Error(\n 'Headless OAuth flow requires a readline interface to accept the pasted URL.',\n );\n }\n\n const pastedUrl = await readline.question(' Paste redirect URL: ');\n const { code } = extractCodeFromUrl(pastedUrl.trim());\n\n const tokens = await exchangeCode(code, redirectUri, client);\n await tokenStore.save(tokens);\n\n log(`\\n Authenticated as ${tokens.email ?? 'unknown'}`);\n log(' Tokens saved to ~/.gemma/auth/tokens.json\\n');\n return tokens;\n}\n", "// src/llm/auth/token-store.ts \u2014 Read/write/refresh cached OAuth tokens\n\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { StoredTokens, OAuthClientConfig } from './types.js';\n\nconst REFRESH_BUFFER_MS = 5 * 60 * 1000; // Refresh 5 minutes before expiry\n\nconst TOKEN_REFRESH_TIMEOUT_MS = 15_000;\nconst TOKEN_REFRESH_RETRIES = 3;\n\nclass TokenRefreshError extends Error {\n readonly status: number;\n constructor(status: number, body: string) {\n super(`Token refresh failed (${status}): ${body}`);\n this.name = 'TokenRefreshError';\n this.status = status;\n }\n}\n\nexport class TokenStore {\n private tokens: StoredTokens | null = null;\n private tokensPath: string;\n private client: OAuthClientConfig;\n private refreshPromise: Promise<void> | null = null;\n\n constructor(gemmaHome: string, client: OAuthClientConfig) {\n this.tokensPath = path.join(gemmaHome, 'auth', 'tokens.json');\n this.client = client;\n }\n\n async load(): Promise<boolean> {\n try {\n const raw = await fs.readFile(this.tokensPath, 'utf-8');\n this.tokens = JSON.parse(raw) as StoredTokens;\n return true;\n } catch {\n return false;\n }\n }\n\n async save(tokens: StoredTokens): Promise<void> {\n this.tokens = tokens;\n const dir = path.dirname(this.tokensPath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(this.tokensPath, JSON.stringify(tokens, null, 2), 'utf-8');\n // chmod 600 \u2014 owner read/write only (best-effort on Windows)\n try {\n await fs.chmod(this.tokensPath, 0o600);\n } catch {\n // chmod may not work on Windows; that's acceptable\n }\n }\n\n async getAccessToken(): Promise<string> {\n if (!this.tokens) {\n throw new Error('No OAuth tokens loaded. Run \"gemma auth --google\" first.');\n }\n\n // Refresh if expired or expiring within 5 minutes\n if (Date.now() > this.tokens.expiry_date - REFRESH_BUFFER_MS) {\n await this.refresh();\n }\n\n return this.tokens.access_token;\n }\n\n getEmail(): string | undefined {\n return this.tokens?.email;\n }\n\n hasTokens(): boolean {\n return this.tokens !== null;\n }\n\n /**\n * Refresh the access token. Uses a mutex so concurrent callers coalesce\n * into a single refresh request, and retries transient network failures.\n */\n private async refresh(): Promise<void> {\n // Coalesce concurrent refresh calls into a single request\n if (this.refreshPromise) return this.refreshPromise;\n this.refreshPromise = this.doRefresh().finally(() => {\n this.refreshPromise = null;\n });\n return this.refreshPromise;\n }\n\n private async doRefresh(): Promise<void> {\n if (!this.tokens?.refresh_token) {\n throw new Error('No refresh token available. Run \"gemma auth --google\" to re-authenticate.');\n }\n\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt < TOKEN_REFRESH_RETRIES; attempt++) {\n try {\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n client_id: this.client.clientId,\n client_secret: this.client.clientSecret,\n refresh_token: this.tokens!.refresh_token,\n grant_type: 'refresh_token',\n }),\n signal: AbortSignal.timeout(TOKEN_REFRESH_TIMEOUT_MS),\n });\n\n if (!response.ok) {\n const body = await response.text();\n const err = new TokenRefreshError(response.status, body);\n // Client errors (400 invalid_grant, 401, 403) won't resolve on retry \u2014 fail fast\n if (response.status >= 400 && response.status < 500) throw err;\n // Server errors (5xx) are retryable\n lastError = err;\n if (attempt < TOKEN_REFRESH_RETRIES - 1) {\n const delay = 1000 * Math.pow(2, attempt);\n console.log(`[TokenStore] Refresh failed (${response.status}), retry in ${delay / 1000}s...`);\n await new Promise((r) => setTimeout(r, delay));\n }\n continue;\n }\n\n const data = (await response.json()) as {\n access_token: string;\n expires_in: number;\n token_type: string;\n };\n\n this.tokens!.access_token = data.access_token;\n this.tokens!.expiry_date = Date.now() + data.expires_in * 1000;\n\n await this.save(this.tokens!);\n return;\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n // Non-retryable errors (including 4xx re-thrown above) \u2014 fail immediately\n if (lastError instanceof TokenRefreshError && lastError.status >= 400 && lastError.status < 500) throw lastError;\n if (attempt < TOKEN_REFRESH_RETRIES - 1) {\n const delay = 1000 * Math.pow(2, attempt);\n console.log(`[TokenStore] Refresh failed (${lastError.message}), retry in ${delay / 1000}s...`);\n await new Promise((r) => setTimeout(r, delay));\n }\n }\n }\n\n throw lastError ?? new Error('Token refresh failed after retries');\n }\n\n async revoke(): Promise<void> {\n if (this.tokens?.refresh_token) {\n try {\n await fetch(\n `https://oauth2.googleapis.com/revoke?token=${this.tokens.refresh_token}`,\n { method: 'POST' },\n );\n } catch {\n // Best-effort revocation\n }\n }\n\n // Delete the tokens file\n try {\n await fs.unlink(this.tokensPath);\n } catch {\n // File may not exist\n }\n\n this.tokens = null;\n }\n}\n", "// src/llm/auth/resolver.ts \u2014 Auto-detect auth mode from config/env/cached tokens\n\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { GoogleAuth } from 'google-auth-library';\nimport { TokenStore } from './token-store.js';\nimport { getOAuthClient } from './oauth.js';\nimport type { AuthMode, ResolvedAuth, OAuthClientConfig } from './types.js';\n\nexport interface AuthResolverConfig {\n gemmaHome: string;\n /** Explicit auth mode from config */\n auth?: AuthMode;\n /** API key from config */\n apiKey?: string;\n /** Custom OAuth client from config */\n oauth?: Partial<OAuthClientConfig>;\n}\n\n/**\n * Resolve authentication mode. Priority:\n * 1. Explicit config choice\n * 2. Cached OAuth tokens exist\n * 3. API key in env or config\n * 4. ADC (Application Default Credentials)\n */\nexport function resolveAuth(config: AuthResolverConfig): ResolvedAuth {\n if (config.auth) {\n return initAuth(config.auth, config);\n }\n\n // Auto-detect priority order:\n\n // 1. Cached OAuth tokens exist?\n const tokensPath = path.join(config.gemmaHome, 'auth', 'tokens.json');\n if (existsSync(tokensPath)) {\n return initAuth('oauth', config);\n }\n\n // 2. API key in env or config? (ignore empty strings)\n const envKey = process.env.GEMINI_API_KEY?.trim();\n if (envKey || config.apiKey) {\n return initAuth('api-key', config);\n }\n\n // 3. Try ADC (only in GCP environments \u2014 skip in Docker/VPS)\n if (!process.env.GEMMA_HOME && !process.env.container) {\n return initAuth('adc', config);\n }\n\n // 4. No auth configured \u2014 return helpful error\n return {\n mode: 'api-key',\n async getCredential(): Promise<string> {\n throw new Error(\n 'No authentication configured.\\n\\n' +\n 'Options:\\n' +\n ' gemma auth --google Sign in with Google (free, recommended)\\n' +\n ' Set GEMINI_API_KEY Use an API key from aistudio.google.com\\n',\n );\n },\n };\n}\n\nfunction initAuth(mode: AuthMode, config: AuthResolverConfig): ResolvedAuth {\n switch (mode) {\n case 'oauth': {\n const client = getOAuthClient(config.oauth);\n const store = new TokenStore(config.gemmaHome, client);\n\n // Load tokens eagerly (but don't fail if missing \u2014 getCredential will fail)\n const loadPromise = store.load();\n\n return {\n mode: 'oauth',\n async getCredential(): Promise<string> {\n await loadPromise;\n if (!store.hasTokens()) {\n throw new Error(\n 'No OAuth tokens found. Run \"gemma auth --google\" to authenticate.',\n );\n }\n return store.getAccessToken();\n },\n };\n }\n\n case 'api-key': {\n const key = config.apiKey || process.env.GEMINI_API_KEY?.trim();\n if (!key) {\n throw new Error(\n 'No Gemini API key found.\\n' +\n 'Set GEMINI_API_KEY environment variable or config.model.apiKey.',\n );\n }\n\n return {\n mode: 'api-key',\n async getCredential(): Promise<string> {\n return key;\n },\n };\n }\n\n case 'adc': {\n const googleAuth = new GoogleAuth({\n scopes: ['https://www.googleapis.com/auth/cloud-platform'],\n });\n\n return {\n mode: 'adc',\n async getCredential(): Promise<GoogleAuth> {\n // Validate that credentials can be obtained\n await googleAuth.getClient();\n return googleAuth;\n },\n };\n }\n }\n}\n\n/**\n * Create a TokenStore for use by the OAuth flow (auth CLI command).\n */\nexport function createTokenStore(gemmaHome: string, oauthConfig?: Partial<OAuthClientConfig>): TokenStore {\n const client = getOAuthClient(oauthConfig);\n return new TokenStore(gemmaHome, client);\n}\n", "// src/setup/copy-templates.ts \u2014 Workspace template sync (shared between wizard and readline fallback)\r\n\r\nimport { existsSync } from 'node:fs';\r\nimport { copyFile, mkdir } from 'node:fs/promises';\r\nimport { join } from 'node:path';\r\n\r\nconst WORKSPACE_TEMPLATES = [\r\n 'SOUL.md', 'INSTRUCTIONS.md', 'IDENTITY.md', 'USER.md',\r\n 'TOOLS.md', 'MEMORY.md', 'HEARTBEAT.md', 'BOOTSTRAP.md',\r\n];\r\n\r\n/**\r\n * Ensure workspace directories exist and copy template files that don't exist yet.\r\n * Returns the number of templates copied.\r\n */\r\nexport async function copyWorkspaceTemplates(gemmaHome: string, pkgRoot: string): Promise<number> {\r\n const workspaceDir = join(gemmaHome, 'workspace');\r\n const templatesDir = join(pkgRoot, 'templates');\r\n\r\n // Ensure directories\r\n await mkdir(join(workspaceDir, 'memory'), { recursive: true });\r\n await mkdir(join(gemmaHome, 'sessions'), { recursive: true });\r\n await mkdir(join(gemmaHome, 'logs'), { recursive: true });\r\n await mkdir(join(gemmaHome, 'auth'), { recursive: true });\r\n\r\n let count = 0;\r\n for (const file of WORKSPACE_TEMPLATES) {\r\n const dest = join(workspaceDir, file);\r\n const src = join(templatesDir, file);\r\n if (!existsSync(dest) && existsSync(src)) {\r\n await copyFile(src, dest);\r\n count++;\r\n }\r\n }\r\n return count;\r\n}\r\n", "import { execFile } from 'node:child_process';\nimport { writeFile, unlink, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { ServiceConfig, ServiceStatus } from './types.js';\n\nconst LABEL = 'ai.gemma.gateway';\nconst PLIST_PATH = join(homedir(), 'Library/LaunchAgents/ai.gemma.gateway.plist');\n\nfunction exec(cmd: string, args: string[]): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, (error, stdout, stderr) => {\n if (error) {\n reject(Object.assign(error, { stdout, stderr }));\n } else {\n resolve({ stdout, stderr });\n }\n });\n });\n}\n\nfunction getUid(): number {\n try {\n return process.getuid!();\n } catch {\n return 501; // fallback for environments without getuid\n }\n}\n\nexport function buildLaunchdPlist(config: ServiceConfig): string {\n const envEntries = config.env\n ? Object.entries(config.env)\n .map(\n ([k, v]) =>\n ` <key>${escapeXml(k)}</key>\\n <string>${escapeXml(v)}</string>`,\n )\n .join('\\n')\n : '';\n\n const envSection = config.env\n ? ` <key>EnvironmentVariables</key>\n <dict>\n <key>GEMMA_HOME</key>\n <string>${escapeXml(config.gemmaHome)}</string>\n <key>NODE_ENV</key>\n <string>production</string>\n${envEntries}\n </dict>`\n : ` <key>EnvironmentVariables</key>\n <dict>\n <key>GEMMA_HOME</key>\n <string>${escapeXml(config.gemmaHome)}</string>\n <key>NODE_ENV</key>\n <string>production</string>\n </dict>`;\n\n const logsDir = join(config.gemmaHome, 'logs');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n <key>Label</key>\n <string>${LABEL}</string>\n\n <key>ProgramArguments</key>\n <array>\n <string>${escapeXml(config.nodePath)}</string>\n <string>${escapeXml(config.entryPath)}</string>\n <string>start</string>\n </array>\n\n <key>WorkingDirectory</key>\n <string>${escapeXml(config.gemmaHome)}</string>\n\n${envSection}\n\n <key>KeepAlive</key>\n <true/>\n\n <key>RunAtLoad</key>\n <true/>\n\n <key>StandardOutPath</key>\n <string>${escapeXml(join(logsDir, 'gateway.stdout.log'))}</string>\n\n <key>StandardErrorPath</key>\n <string>${escapeXml(join(logsDir, 'gateway.stderr.log'))}</string>\n</dict>\n</plist>\n`;\n}\n\nexport async function installLaunchdService(config: ServiceConfig): Promise<void> {\n // Ensure logs directory exists\n await mkdir(join(config.gemmaHome, 'logs'), { recursive: true });\n\n // Ensure LaunchAgents directory exists\n await mkdir(dirname(PLIST_PATH), { recursive: true });\n\n // Write plist file\n const plist = buildLaunchdPlist(config);\n await writeFile(PLIST_PATH, plist, 'utf-8');\n\n const uid = getUid();\n const domain = `gui/${uid}`;\n\n // Bootstrap the service (register it with launchd)\n await exec('launchctl', ['bootstrap', domain, PLIST_PATH]);\n\n // Kick-start it immediately\n await exec('launchctl', ['kickstart', '-k', `${domain}/${LABEL}`]);\n}\n\nexport async function uninstallLaunchdService(): Promise<void> {\n const uid = getUid();\n const domain = `gui/${uid}`;\n\n // Bootout the service (deregister it)\n try {\n await exec('launchctl', ['bootout', `${domain}/${LABEL}`]);\n } catch {\n // May already be unloaded\n }\n\n // Remove the plist file\n if (existsSync(PLIST_PATH)) {\n await unlink(PLIST_PATH);\n }\n}\n\nexport async function startLaunchdService(): Promise<void> {\n const uid = getUid();\n await exec('launchctl', ['kickstart', '-k', `gui/${uid}/${LABEL}`]);\n}\n\nexport async function stopLaunchdService(): Promise<void> {\n const uid = getUid();\n await exec('launchctl', ['kill', 'SIGTERM', `gui/${uid}/${LABEL}`]);\n}\n\nexport async function getLaunchdServiceStatus(): Promise<ServiceStatus> {\n const uid = getUid();\n const status: ServiceStatus = {\n installed: existsSync(PLIST_PATH),\n running: false,\n platform: 'darwin',\n };\n\n if (!status.installed) return status;\n\n try {\n const { stdout } = await exec('launchctl', ['print', `gui/${uid}/${LABEL}`]);\n // Parse pid from output like \"pid = 12345\"\n const pidMatch = stdout.match(/pid\\s*=\\s*(\\d+)/);\n if (pidMatch) {\n status.running = true;\n status.pid = parseInt(pidMatch[1], 10);\n }\n // If no pid match but the command succeeded, the service is registered but not running\n } catch {\n // Service is not loaded\n }\n\n return status;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n", "import { execFile } from 'node:child_process';\nimport { writeFile, unlink, mkdir } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { ServiceConfig, ServiceStatus } from './types.js';\n\nconst UNIT_NAME = 'gemma-gateway';\n\nfunction getUnitPath(): string {\n return join(homedir(), '.config/systemd/user/gemma-gateway.service');\n}\n\nfunction exec(cmd: string, args: string[]): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, (error, stdout, stderr) => {\n if (error) {\n reject(Object.assign(error, { stdout, stderr }));\n } else {\n resolve({ stdout, stderr });\n }\n });\n });\n}\n\nexport function buildSystemdUnit(config: ServiceConfig): string {\n const envLines = config.env\n ? Object.entries(config.env)\n .map(([k, v]) => `Environment=${k}=${v}`)\n .join('\\n')\n : '';\n\n return `[Unit]\nDescription=Gemma AI Gateway\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nExecStart=${config.nodePath} ${config.entryPath} start\nWorkingDirectory=${config.gemmaHome}\nRestart=always\nRestartSec=5\nKillMode=process\nEnvironment=GEMMA_HOME=${config.gemmaHome}\nEnvironment=NODE_ENV=production\n${envLines}\n\n[Install]\nWantedBy=default.target\n`;\n}\n\nexport async function installSystemdService(config: ServiceConfig): Promise<void> {\n const unitPath = getUnitPath();\n\n // Ensure the systemd user directory exists\n await mkdir(dirname(unitPath), { recursive: true });\n\n // Ensure logs directory exists\n await mkdir(join(config.gemmaHome, 'logs'), { recursive: true });\n\n // Write the unit file\n const unit = buildSystemdUnit(config);\n await writeFile(unitPath, unit, 'utf-8');\n\n // Reload systemd and enable + start the service\n await exec('systemctl', ['--user', 'daemon-reload']);\n await exec('systemctl', ['--user', 'enable', '--now', `${UNIT_NAME}.service`]);\n}\n\nexport async function uninstallSystemdService(): Promise<void> {\n const unitPath = getUnitPath();\n\n // Disable and stop the service\n try {\n await exec('systemctl', ['--user', 'disable', '--now', `${UNIT_NAME}.service`]);\n } catch {\n // May already be disabled/stopped\n }\n\n // Remove the unit file\n if (existsSync(unitPath)) {\n await unlink(unitPath);\n }\n\n // Reload daemon so systemd forgets the unit\n try {\n await exec('systemctl', ['--user', 'daemon-reload']);\n } catch {\n // Best effort\n }\n}\n\nexport async function startSystemdService(): Promise<void> {\n await exec('systemctl', ['--user', 'start', `${UNIT_NAME}.service`]);\n}\n\nexport async function stopSystemdService(): Promise<void> {\n await exec('systemctl', ['--user', 'stop', `${UNIT_NAME}.service`]);\n}\n\nexport async function restartSystemdService(): Promise<void> {\n await exec('systemctl', ['--user', 'restart', `${UNIT_NAME}.service`]);\n}\n\nexport async function getSystemdServiceStatus(): Promise<ServiceStatus> {\n const unitPath = getUnitPath();\n const status: ServiceStatus = {\n installed: existsSync(unitPath),\n running: false,\n platform: 'linux',\n };\n\n if (!status.installed) return status;\n\n try {\n const { stdout } = await exec('systemctl', [\n '--user',\n 'is-active',\n `${UNIT_NAME}.service`,\n ]);\n status.running = stdout.trim() === 'active';\n } catch {\n // is-active returns exit code 3 when inactive\n status.running = false;\n }\n\n if (status.running) {\n try {\n const { stdout } = await exec('systemctl', [\n '--user',\n 'show',\n '--property=MainPID',\n `${UNIT_NAME}.service`,\n ]);\n const match = stdout.match(/MainPID=(\\d+)/);\n if (match && match[1] !== '0') {\n status.pid = parseInt(match[1], 10);\n }\n } catch {\n // PID lookup is best-effort\n }\n }\n\n return status;\n}\n\nexport async function isSystemdAvailable(): Promise<boolean> {\n try {\n await exec('systemctl', ['--user', '--no-pager', 'status']);\n return true;\n } catch (err: unknown) {\n // Exit code 1 means systemd is available but no unit was specified\n // Exit code 127 means systemctl is not found\n const code = (err as { code?: number }).code;\n return code !== 127;\n }\n}\n\nexport async function enableLinger(): Promise<void> {\n await exec('loginctl', ['enable-linger']);\n}\n", "import { resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { ServiceConfig, ServiceStatus } from './types.js';\n\nexport interface GemmaService {\n install(config: ServiceConfig): Promise<void>;\n uninstall(): Promise<void>;\n start(): Promise<void>;\n stop(): Promise<void>;\n restart(): Promise<void>;\n status(): Promise<ServiceStatus>;\n}\n\nexport function resolveServiceConfig(gemmaHome: string, port?: number): ServiceConfig {\n const entryPath = resolve(fileURLToPath(new URL('../../index.js', import.meta.url)));\n\n return {\n nodePath: process.execPath,\n entryPath,\n gemmaHome,\n port: port ?? 18789,\n };\n}\n\nexport async function resolveService(): Promise<GemmaService> {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n const {\n installLaunchdService,\n uninstallLaunchdService,\n startLaunchdService,\n stopLaunchdService,\n getLaunchdServiceStatus,\n } = await import('./launchd.js');\n\n return {\n install: installLaunchdService,\n uninstall: uninstallLaunchdService,\n start: startLaunchdService,\n stop: stopLaunchdService,\n restart: async () => {\n await stopLaunchdService();\n await startLaunchdService();\n },\n status: getLaunchdServiceStatus,\n };\n }\n\n if (platform === 'linux') {\n const {\n installSystemdService,\n uninstallSystemdService,\n startSystemdService,\n stopSystemdService,\n restartSystemdService,\n getSystemdServiceStatus,\n } = await import('./systemd.js');\n\n return {\n install: installSystemdService,\n uninstall: uninstallSystemdService,\n start: startSystemdService,\n stop: stopSystemdService,\n restart: restartSystemdService,\n status: getSystemdServiceStatus,\n };\n }\n\n throw new Error(\n `Daemon service management is not supported on ${platform}. ` +\n `Supported platforms: macOS (launchd), Linux (systemd).`,\n );\n}\n", "// src/setup/wizard.tsx \u2014 Root Ink wizard component and entry point\r\n\r\nimport { useState } from 'react';\r\nimport { render, Box, Text, useApp } from 'ink';\r\nimport { writeFile } from 'node:fs/promises';\r\n\r\nimport type { WizardState, ExistingConfig, AuthMode } from './types.js';\r\nimport { Banner } from './components/Banner.js';\r\nimport { StepHeader } from './components/StepHeader.js';\r\nimport { StepAuth } from './steps/StepAuth.js';\r\nimport { StepChannels } from './steps/StepChannels.js';\r\nimport { StepWorkspace } from './steps/StepWorkspace.js';\r\nimport { StepService } from './steps/StepService.js';\r\n\r\n// ---------------------------------------------------------------------------\r\n// Config extraction / writing helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Read an existing gemma.json (if any) and extract fields the wizard cares about.\r\n */\r\nexport function extractWizardConfig(raw: Record<string, unknown>): ExistingConfig {\r\n const out: ExistingConfig = {};\r\n const model = raw['model'] as Record<string, unknown> | undefined;\r\n if (model) {\r\n if (model['auth'] === 'oauth' || model['auth'] === 'api-key') {\r\n out.authMode = model['auth'] as AuthMode;\r\n }\r\n if (typeof model['apiKey'] === 'string') out.apiKey = model['apiKey'];\r\n }\r\n const channels = raw['channels'] as Record<string, unknown> | undefined;\r\n if (channels) {\r\n const tg = channels['telegram'] as Record<string, unknown> | undefined;\r\n if (tg) {\r\n out.telegramEnabled = tg['enabled'] === true;\r\n if (typeof tg['token'] === 'string') out.telegramToken = tg['token'];\r\n }\r\n const web = channels['web'] as Record<string, unknown> | undefined;\r\n if (web) out.webEnabled = web['enabled'] !== false;\r\n }\r\n const gateway = raw['gateway'] as Record<string, unknown> | undefined;\r\n if (gateway) {\r\n const auth = gateway['auth'] as Record<string, unknown> | undefined;\r\n if (auth && typeof auth['token'] === 'string') out.webPassword = auth['token'];\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Build initial WizardState, optionally pre-populated from an existing config.\r\n */\r\nexport function buildInitialState(gemmaHome: string, existing?: ExistingConfig): WizardState {\r\n return {\r\n authMode: existing?.authMode ?? 'skip',\r\n apiKey: existing?.apiKey ?? '',\r\n oauthDone: false,\r\n\r\n telegramEnabled: existing?.telegramEnabled ?? false,\r\n telegramToken: existing?.telegramToken ?? '',\r\n webEnabled: existing?.webEnabled ?? true,\r\n webPassword: existing?.webPassword ?? '',\r\n\r\n gemmaHome,\r\n workspaceCopied: 0,\r\n\r\n installService: null,\r\n serviceInstalled: false,\r\n serviceError: null,\r\n\r\n currentStep: 1,\r\n done: false,\r\n };\r\n}\r\n\r\n/**\r\n * Build a gemma.json config object from the completed wizard state.\r\n * Mirrors the shape produced by the readline wizard in src/index.ts lines 550-575.\r\n */\r\nexport function writeWizardConfig(state: WizardState): Record<string, unknown> {\r\n return {\r\n model: {\r\n provider: 'gemini',\r\n model: 'gemini-2.5-flash',\r\n ...(state.authMode !== 'skip' ? { auth: state.authMode } : {}),\r\n ...(state.apiKey ? { apiKey: state.apiKey } : {}),\r\n },\r\n gateway: {\r\n port: 18789,\r\n bind: 'auto',\r\n ...(state.webPassword ? { auth: { token: state.webPassword } } : {}),\r\n },\r\n channels: {\r\n telegram: {\r\n enabled: state.telegramEnabled,\r\n ...(state.telegramToken ? { token: state.telegramToken } : {}),\r\n },\r\n web: { enabled: state.webEnabled },\r\n cli: { enabled: false },\r\n },\r\n confirm: {\r\n timeout: 300,\r\n autoApprove: { internalReads: true, memoryWrites: false },\r\n },\r\n workspace: { path: `${state.gemmaHome}/workspace` },\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Root Wizard component\r\n// ---------------------------------------------------------------------------\r\n\r\ninterface WizardProps {\r\n gemmaHome: string;\r\n configPath: string;\r\n pkgRoot: string;\r\n existing?: ExistingConfig;\r\n}\r\n\r\nfunction Wizard({ gemmaHome, configPath, pkgRoot, existing }: WizardProps) {\r\n const { exit } = useApp();\r\n const [state, setState] = useState<WizardState>(() => buildInitialState(gemmaHome, existing));\r\n\r\n /**\r\n * Each step calls onDone(patch) when it finishes.\r\n * We merge the patch, advance to the next step,\r\n * and on the final step write config + exit.\r\n */\r\n const handleStepDone = async (patch: Partial<WizardState>) => {\r\n const merged = { ...state, ...patch };\r\n\r\n if (merged.currentStep >= 4) {\r\n // Final step \u2014 write config and finish\r\n const config = writeWizardConfig(merged);\r\n await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');\r\n setState({ ...merged, done: true });\r\n setTimeout(() => exit(), 50);\r\n return;\r\n }\r\n\r\n // Advance to next step\r\n const next = (merged.currentStep + 1) as WizardState['currentStep'];\r\n setState({ ...merged, currentStep: next });\r\n };\r\n\r\n if (state.done) {\r\n return (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text color=\"green\" bold> Gemma is set up! Starting gateway...</Text>\r\n <Text dimColor> Config written to {configPath}</Text>\r\n </Box>\r\n );\r\n }\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Banner />\r\n <StepHeader step={state.currentStep} />\r\n\r\n {state.currentStep === 1 && (\r\n <StepAuth state={state} onDone={handleStepDone} gemmaHome={gemmaHome} />\r\n )}\r\n {state.currentStep === 2 && (\r\n <StepChannels state={state} onDone={handleStepDone} />\r\n )}\r\n {state.currentStep === 3 && (\r\n <StepWorkspace\r\n state={state}\r\n onDone={handleStepDone}\r\n gemmaHome={gemmaHome}\r\n pkgRoot={pkgRoot}\r\n />\r\n )}\r\n {state.currentStep === 4 && (\r\n <StepService\r\n state={state}\r\n onDone={handleStepDone}\r\n gemmaHome={gemmaHome}\r\n />\r\n )}\r\n </Box>\r\n );\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Public entry point \u2014 called from src/index.ts\r\n// ---------------------------------------------------------------------------\r\n\r\nexport async function runSetupWizard(\r\n gemmaHome: string,\r\n configPath: string,\r\n pkgRoot: string,\r\n): Promise<void> {\r\n // Pre-populate from existing config if available\r\n let existing: ExistingConfig | undefined;\r\n try {\r\n const { existsSync } = await import('node:fs');\r\n const { readFile } = await import('node:fs/promises');\r\n if (existsSync(configPath)) {\r\n const raw = JSON.parse(await readFile(configPath, 'utf-8')) as Record<string, unknown>;\r\n existing = extractWizardConfig(raw);\r\n }\r\n } catch {\r\n // Ignore parse errors \u2014 start fresh\r\n }\r\n\r\n const { waitUntilExit } = render(\r\n <Wizard gemmaHome={gemmaHome} configPath={configPath} pkgRoot={pkgRoot} existing={existing} />,\r\n );\r\n await waitUntilExit();\r\n}\r\n", "import { Text, useStdout } from 'ink';\nimport Gradient from 'ink-gradient';\nimport { GEMMA_COLORS, selectBanner } from '../../shared/ascii-art.js';\n\nexport function Banner() {\n const { stdout } = useStdout();\n const cols = stdout?.columns ?? 80;\n const art = selectBanner(cols);\n\n return (\n <>\n <Gradient colors={GEMMA_COLORS}>\n <Text>{art}</Text>\n </Gradient>\n <Text dimColor> Your personal AI assistant</Text>\n </>\n );\n}\n", "/**\n * ASCII art banners for Gemma CLI.\n * Three responsive variants selected by terminal width.\n */\n\n/** Get the display width of a multi-line ASCII art string. */\nexport function getArtWidth(art: string): number {\n return Math.max(...art.split('\\n').map(l => l.length));\n}\n\n/** Long banner: cat mascot (left) + GEMMA block text (right), ~95 chars wide */\nexport const longBanner = [\n ' \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ',\n ' /\\\\ /\\\\ \u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588',\n ' { `---\\' } \u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2588 \u2591 \u2591\u2588\u2588\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588',\n ' { - - } \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588',\n ' \\\\ =w= / \u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588',\n ' /` `-----\\' `\\\\ \u2591\u2591\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591 \u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588',\n ' / / \\\\ \\\\ \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588',\n ' (__/ \\\\__)~) \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591',\n].join('\\n');\n\n/** Short banner: GEMMA block text only (~70 chars wide) */\nexport const shortBanner = [\n ' \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ',\n ' \u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588',\n ' \u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2588 \u2591 \u2591\u2588\u2588\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2588\u2588\u2588\u2588\u2588\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588',\n '\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588',\n '\u2591\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2591\u2591 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588\u2591\u2591\u2591\u2591\u2591\u2588\u2588\u2588',\n '\u2591\u2591\u2588\u2588\u2588 \u2591\u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591 \u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588 \u2591\u2588\u2588\u2588',\n ' \u2591\u2591\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588 \u2588\u2588\u2588\u2588\u2588',\n ' \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591 \u2591\u2591\u2591\u2591\u2591',\n].join('\\n');\n\n/** Tiny banner: cat face + GEMMA for narrow terminals */\nexport const tinyBanner = [\n ' /\\\\_/\\\\',\n '( -.- ) GEMMA',\n ' > ^ <',\n].join('\\n');\n\n/** Gemma Warm gradient: bright violet -> fuchsia -> coral */\nexport const GEMMA_COLORS = ['#A78BFA', '#E879F9', '#FB7185'];\n\n/**\n * Select the appropriate banner variant for a given terminal width.\n */\nexport function selectBanner(cols: number): string {\n if (cols >= getArtWidth(longBanner) + 2) return longBanner;\n if (cols >= getArtWidth(shortBanner) + 2) return shortBanner;\n return tinyBanner;\n}\n", "import { Box, Text } from 'ink';\r\n\r\nconst LABELS = ['Auth', 'Channels', 'Workspace', 'Service'];\r\n\r\ninterface Props {\r\n step: number;\r\n}\r\n\r\nexport function StepHeader({ step }: Props) {\r\n return (\r\n <Box flexDirection=\"column\" marginBottom={1}>\r\n <Box gap={1}>\r\n {LABELS.map((label, i) => {\r\n const num = i + 1;\r\n const isDone = num < step;\r\n const isActive = num === step;\r\n return (\r\n <Box key={label}>\r\n <Text\r\n color={isDone ? 'green' : isActive ? 'cyan' : 'gray'}\r\n bold={isActive}\r\n >\r\n {isDone ? '\u2713' : String(num)}\r\n </Text>\r\n <Text color={isActive ? 'cyan' : 'gray'} bold={isActive}>\r\n {` ${label}`}\r\n </Text>\r\n {num < LABELS.length && <Text dimColor> \u2192 </Text>}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n", "import React, { useState, useCallback, useRef } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { Select, TextInput, Spinner } from '@inkjs/ui';\r\nimport type { WizardState } from '../types.js';\r\n\r\nimport { StatusLine } from '../components/StatusLine.js';\r\n\r\ninterface Props {\r\n state: WizardState;\r\n onDone: (patch: Partial<WizardState>) => void;\r\n gemmaHome: string;\r\n}\r\n\r\ntype Phase = 'select' | 'oauth-running' | 'oauth-input' | 'api-key';\r\n\r\nconst AUTH_OPTIONS = [\r\n { label: 'Google OAuth (recommended)', value: 'oauth' },\r\n { label: 'API key', value: 'api-key' },\r\n { label: 'Skip for now', value: 'skip' },\r\n];\r\n\r\nexport function StepAuth({ state, onDone, gemmaHome }: Props) {\r\n const [phase, setPhase] = useState<Phase>('select');\r\n const [error, setError] = useState('');\r\n const [oauthPrompt, setOauthPrompt] = useState('');\r\n const [oauthLogs, setOauthLogs] = useState<string[]>([]);\r\n const resolverRef = useRef<((value: string) => void) | null>(null);\r\n\r\n const handleSelect = useCallback((value: string) => {\r\n if (value === 'skip') {\r\n onDone({ authMode: 'skip' });\r\n return;\r\n }\r\n\r\n if (value === 'api-key') {\r\n setPhase('api-key');\r\n return;\r\n }\r\n\r\n // OAuth flow\r\n setPhase('oauth-running');\r\n setError('');\r\n\r\n (async () => {\r\n try {\r\n const { getOAuthClient, runOAuthFlow } = await import('../../llm/auth/oauth.js');\r\n const { createTokenStore } = await import('../../llm/auth/resolver.js');\r\n\r\n const client = getOAuthClient();\r\n const tokenStore = createTokenStore(gemmaHome);\r\n\r\n const readline = {\r\n question(prompt: string): Promise<string> {\r\n return new Promise<string>((resolve) => {\r\n resolverRef.current = resolve;\r\n setOauthPrompt(prompt);\r\n setPhase('oauth-input');\r\n });\r\n },\r\n };\r\n\r\n await runOAuthFlow({\r\n client,\r\n tokenStore,\r\n readline,\r\n log: (msg: string) => { setOauthLogs(prev => [...prev, msg]); },\r\n });\r\n\r\n onDone({ authMode: 'oauth', oauthDone: true });\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n setError(msg);\r\n setPhase('select');\r\n }\r\n })();\r\n }, [onDone, gemmaHome]);\r\n\r\n const handleOauthInput = useCallback((value: string) => {\r\n if (resolverRef.current) {\r\n resolverRef.current(value);\r\n resolverRef.current = null;\r\n setOauthPrompt('');\r\n setPhase('oauth-running');\r\n }\r\n }, []);\r\n\r\n const handleApiKey = useCallback((value: string) => {\r\n if (!value.trim()) return;\r\n onDone({ authMode: 'api-key', apiKey: value.trim() });\r\n }, [onDone]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"column\" paddingLeft={2}>\r\n <Text bold>Authentication</Text>\r\n\r\n {phase === 'select' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>How would you like to authenticate with Google?</Text>\r\n <Box marginTop={1}>\r\n <Select options={AUTH_OPTIONS} onChange={handleSelect} />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'oauth-running' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n {oauthLogs.map((msg, i) => (\r\n <Text key={i}>{msg}</Text>\r\n ))}\r\n <Box marginTop={1}>\r\n <Spinner label=\"Running OAuth flow...\" />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'oauth-input' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n {oauthLogs.map((msg, i) => (\r\n <Text key={i}>{msg}</Text>\r\n ))}\r\n <Box marginTop={1}>\r\n <Text>{oauthPrompt}</Text>\r\n <TextInput onSubmit={handleOauthInput} placeholder=\"Paste URL here\" />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'api-key' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Enter your Gemini API key (from aistudio.google.com):</Text>\r\n <Box marginTop={1}>\r\n <TextInput onSubmit={handleApiKey} placeholder=\"AI...\" />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n <StatusLine error={error} />\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n", "import { Text } from 'ink';\r\n\r\ninterface Props {\r\n message?: string;\r\n error?: string;\r\n}\r\n\r\nexport function StatusLine({ message, error }: Props) {\r\n if (error) return <Text color=\"red\"> {error}</Text>;\r\n if (message) return <Text dimColor> {message}</Text>;\r\n return null;\r\n}\r\n", "import React, { useState, useCallback } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { ConfirmInput, TextInput } from '@inkjs/ui';\r\nimport type { WizardState } from '../types.js';\r\n\r\n\r\ninterface Props {\r\n state: WizardState;\r\n onDone: (patch: Partial<WizardState>) => void;\r\n}\r\n\r\ntype Phase = 'telegram-ask' | 'telegram-token' | 'web-ask' | 'web-password';\r\n\r\nexport function StepChannels({ state, onDone }: Props) {\r\n const [phase, setPhase] = useState<Phase>('telegram-ask');\r\n const [telegramEnabled, setTelegramEnabled] = useState(state.telegramEnabled);\r\n const [telegramToken, setTelegramToken] = useState(state.telegramToken);\r\n const [webEnabled, setWebEnabled] = useState(state.webEnabled);\r\n\r\n const handleTelegramYes = useCallback(() => {\r\n setTelegramEnabled(true);\r\n setPhase('telegram-token');\r\n }, []);\r\n\r\n const handleTelegramNo = useCallback(() => {\r\n setTelegramEnabled(false);\r\n setPhase('web-ask');\r\n }, []);\r\n\r\n const handleTelegramToken = useCallback((value: string) => {\r\n if (!value.trim()) return; // token is required if Telegram is enabled\r\n setTelegramToken(value.trim());\r\n setPhase('web-ask');\r\n }, []);\r\n\r\n const handleWebYes = useCallback(() => {\r\n setWebEnabled(true);\r\n setPhase('web-password');\r\n }, []);\r\n\r\n const handleWebNo = useCallback(() => {\r\n onDone({\r\n telegramEnabled,\r\n telegramToken,\r\n webEnabled: false,\r\n webPassword: '',\r\n });\r\n }, [onDone, telegramEnabled, telegramToken]);\r\n\r\n const handleWebPassword = useCallback((value: string) => {\r\n onDone({\r\n telegramEnabled,\r\n telegramToken,\r\n webEnabled: true,\r\n webPassword: value.trim(),\r\n });\r\n }, [onDone, telegramEnabled, telegramToken]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"column\" paddingLeft={2}>\r\n <Text bold>Channels</Text>\r\n\r\n {phase === 'telegram-ask' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Enable Telegram bot? (Y/n)</Text>\r\n <Box marginTop={1}>\r\n <ConfirmInput onConfirm={handleTelegramYes} onCancel={handleTelegramNo} />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'telegram-token' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Enter your Telegram bot token (from @BotFather):</Text>\r\n <Box marginTop={1}>\r\n <TextInput onSubmit={handleTelegramToken} placeholder=\"123456:ABC-DEF...\" />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'web-ask' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Enable Web UI? (Y/n)</Text>\r\n <Box marginTop={1}>\r\n <ConfirmInput onConfirm={handleWebYes} onCancel={handleWebNo} />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'web-password' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Set a Web UI password (Enter to skip):</Text>\r\n <Box marginTop={1}>\r\n <TextInput onSubmit={handleWebPassword} placeholder=\"optional\" />\r\n </Box>\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n", "import React, { useState, useEffect, useRef } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { Spinner } from '@inkjs/ui';\r\nimport type { WizardState } from '../types.js';\r\n\r\nimport { StatusLine } from '../components/StatusLine.js';\r\n\r\ninterface Props {\r\n state: WizardState;\r\n onDone: (patch: Partial<WizardState>) => void;\r\n gemmaHome: string;\r\n pkgRoot: string;\r\n}\r\n\r\nexport function StepWorkspace({ state, onDone, gemmaHome, pkgRoot }: Props) {\r\n const [copying, setCopying] = useState(true);\r\n const [count, setCount] = useState(0);\r\n const [error, setError] = useState('');\r\n const started = useRef(false);\r\n\r\n useEffect(() => {\r\n if (started.current) return;\r\n started.current = true;\r\n\r\n (async () => {\r\n try {\r\n const { copyWorkspaceTemplates } = await import('../copy-templates.js');\r\n const n = await copyWorkspaceTemplates(gemmaHome, pkgRoot);\r\n setCount(n);\r\n setCopying(false);\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n setError(msg);\r\n setCopying(false);\r\n }\r\n })();\r\n }, [gemmaHome, pkgRoot]);\r\n\r\n useEffect(() => {\r\n if (copying) return;\r\n // Advance even on error \u2014 workspace template copy is non-fatal\r\n const timer = setTimeout(() => {\r\n onDone({ workspaceCopied: count });\r\n }, error ? 3000 : 1000);\r\n return () => clearTimeout(timer);\r\n }, [copying, error, count, onDone]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"column\" paddingLeft={2}>\r\n <Text bold>Workspace</Text>\r\n\r\n {copying && (\r\n <Box marginTop={1}>\r\n <Spinner label=\"Copying workspace templates...\" />\r\n </Box>\r\n )}\r\n\r\n {!copying && !error && (\r\n <Box marginTop={1}>\r\n <Text color=\"green\">{count} template{count !== 1 ? 's' : ''} copied to {gemmaHome}/workspace</Text>\r\n </Box>\r\n )}\r\n\r\n <StatusLine error={error} />\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n", "import React, { useState, useEffect, useCallback, useRef } from 'react';\r\nimport { Box, Text } from 'ink';\r\nimport { ConfirmInput, Spinner } from '@inkjs/ui';\r\nimport type { WizardState } from '../types.js';\r\n\r\nimport { StatusLine } from '../components/StatusLine.js';\r\n\r\ninterface Props {\r\n state: WizardState;\r\n onDone: (patch: Partial<WizardState>) => void;\r\n gemmaHome: string;\r\n}\r\n\r\ntype Phase = 'ask' | 'installing' | 'done';\r\n\r\nexport function StepService({ state, onDone, gemmaHome }: Props) {\r\n const [phase, setPhase] = useState<Phase>('ask');\r\n const [error, setError] = useState('');\r\n const installing = useRef(false);\r\n\r\n const handleConfirm = useCallback(() => {\r\n setPhase('installing');\r\n }, []);\r\n\r\n const handleCancel = useCallback(() => {\r\n onDone({ installService: false });\r\n }, [onDone]);\r\n\r\n useEffect(() => {\r\n if (phase !== 'installing' || installing.current) return;\r\n installing.current = true;\r\n\r\n (async () => {\r\n try {\r\n const { resolveService, resolveServiceConfig } = await import('../../daemon/service.js');\r\n const service = await resolveService();\r\n const config = resolveServiceConfig(gemmaHome);\r\n await service.install(config);\r\n setPhase('done');\r\n onDone({ installService: true, serviceInstalled: true });\r\n } catch (err: unknown) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n setError(msg);\r\n setPhase('done');\r\n onDone({ installService: true, serviceInstalled: false, serviceError: msg });\r\n }\r\n })();\r\n }, [phase, onDone, gemmaHome]);\r\n\r\n return (\r\n <Box flexDirection=\"column\">\r\n <Box flexDirection=\"column\" paddingLeft={2}>\r\n <Text bold>Background Service</Text>\r\n\r\n {phase === 'ask' && (\r\n <Box flexDirection=\"column\" marginTop={1}>\r\n <Text dimColor>Install Gemma as a background service? (Y/n)</Text>\r\n <Box marginTop={1}>\r\n <ConfirmInput onConfirm={handleConfirm} onCancel={handleCancel} />\r\n </Box>\r\n </Box>\r\n )}\r\n\r\n {phase === 'installing' && (\r\n <Box marginTop={1}>\r\n <Spinner label=\"Installing service...\" />\r\n </Box>\r\n )}\r\n\r\n {phase === 'done' && !error && (\r\n <Box marginTop={1}>\r\n <Text color=\"green\">Service installed successfully.</Text>\r\n </Box>\r\n )}\r\n\r\n <StatusLine error={error} />\r\n </Box>\r\n </Box>\r\n );\r\n}\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["URL", "resolve", "require", "existsSync", "path", "existsSync", "join", "mkdir", "existsSync", "join", "dirname", "resolve", "execFile", "writeFile", "unlink", "mkdir", "existsSync", "join", "dirname", "homedir", "exec", "resolve", "installLaunchdService", "uninstallLaunchdService", "startLaunchdService", "stopLaunchdService", "getLaunchdServiceStatus", "installSystemdService", "uninstallSystemdService", "startSystemdService", "stopSystemdService", "restartSystemdService", "getSystemdServiceStatus", "useState", "Box", "Text", "writeFile", "Text", "jsx", "jsxs", "Box", "Text", "Text", "jsxs", "jsx", "jsxs", "getOAuthClient", "runOAuthFlow", "createTokenStore", "resolve", "Box", "Text", "useState", "useCallback", "Box", "Text", "TextInput", "jsx", "jsxs", "useState", "useRef", "Box", "Text", "Spinner", "jsx", "jsxs", "useState", "useRef", "copyWorkspaceTemplates", "Box", "Text", "Spinner", "useState", "useEffect", "useCallback", "useRef", "Box", "Text", "ConfirmInput", "Spinner", "jsx", "jsxs", "useState", "useRef", "useCallback", "useEffect", "resolveService", "resolveServiceConfig", "Box", "Text", "ConfirmInput", "Spinner", "jsx", "jsxs", "useState", "writeFile", "Box", "Text", "existsSync"]
7
7
  }
@@ -215,6 +215,10 @@ export interface WSSessionRestoredMessage {
215
215
  title: string;
216
216
  history: WSSessionHistoryEntry[];
217
217
  cowboyMode?: boolean;
218
+ /** Persisted model override for this session (undefined = use config default) */
219
+ model?: string;
220
+ /** Persisted thinking/reasoning toggle for this session */
221
+ thinkingEnabled?: boolean;
218
222
  usage?: {
219
223
  totalInputTokens: number;
220
224
  totalOutputTokens: number;
@@ -1 +1 @@
1
- {"version":3,"file":"ws-types.d.ts","sourceRoot":"","sources":["../../src/shared/ws-types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ws-types.d.ts","sourceRoot":"","sources":["../../src/shared/ws-types.ts"],"names":[],"mappings":"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"}