bashio 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +217 -21
- package/README.md +48 -3
- package/dist/{App-SRRDMIMW.js → App-MVOM7NMT.js} +304 -430
- package/dist/App-MVOM7NMT.js.map +1 -0
- package/dist/{chunk-PYTBTPZN.js → chunk-6OLRZLFB.js} +6 -37
- package/dist/chunk-6OLRZLFB.js.map +1 -0
- package/dist/index.js +33 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/App-SRRDMIMW.js.map +0 -1
- package/dist/chunk-PYTBTPZN.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/config.ts","../src/core/types.ts","../src/chat/utils/themes.ts","../src/core/oauth.ts","../src/providers/base.ts","../src/providers/chatgpt-subscription.ts","../src/core/errors.ts","../src/providers/claude.ts","../src/providers/claude-subscription.ts","../src/providers/copilot.ts","../src/providers/ollama.ts","../src/providers/openai.ts","../src/providers/openrouter.ts","../src/providers/index.ts","../src/core/auth.ts","../src/utils/colors.ts","../src/utils/cliTheme.ts","../src/utils/inquirerTheme.ts","../src/utils/logger.ts","../src/utils/spinner.ts","../src/utils/clipboard.ts"],"sourcesContent":["import {\n chmodSync,\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n} from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport {\n ConfigV1,\n ConfigV2,\n type ProviderName,\n type ProviderSettings,\n} from './types.js';\n\nconst CONFIG_DIR = join(homedir(), '.bashio');\nconst CONFIG_FILE = join(CONFIG_DIR, 'config.json');\n\nexport function ensureConfigDir(): void {\n if (!existsSync(CONFIG_DIR)) {\n mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });\n }\n}\n\nexport function configExists(): boolean {\n return existsSync(CONFIG_FILE);\n}\n\nfunction migrateV1toV2(v1: ConfigV1): ConfigV2 {\n return {\n version: 2,\n activeProvider: v1.provider,\n providers: {\n [v1.provider]: {\n model: v1.model,\n credentials: v1.credentials,\n },\n },\n settings: v1.settings,\n };\n}\n\nexport function loadConfig(): ConfigV2 | null {\n if (!configExists()) {\n return null;\n }\n\n try {\n const raw = readFileSync(CONFIG_FILE, 'utf-8');\n const data = JSON.parse(raw);\n\n // Try V2 first\n const v2Result = ConfigV2.safeParse(data);\n if (v2Result.success) {\n return v2Result.data;\n }\n\n // Try V1 and migrate\n const v1Result = ConfigV1.safeParse(data);\n if (v1Result.success) {\n const migrated = migrateV1toV2(v1Result.data);\n saveConfig(migrated); // Auto-save migrated config\n return migrated;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport function saveConfig(config: ConfigV2): void {\n ensureConfigDir();\n const data = JSON.stringify(config, null, 2);\n writeFileSync(CONFIG_FILE, data, { encoding: 'utf-8', mode: 0o600 });\n chmodSync(CONFIG_FILE, 0o600);\n}\n\nexport function getConfigPath(): string {\n return CONFIG_FILE;\n}\n\nexport function getConfigDir(): string {\n return CONFIG_DIR;\n}\n\n// Helper to get active provider config\nexport function getActiveProviderConfig(\n config: ConfigV2,\n): { provider: ProviderName; settings: ProviderSettings } | null {\n const settings = config.providers[config.activeProvider];\n if (!settings) return null;\n return { provider: config.activeProvider, settings };\n}\n\n// Helper to check if a provider is configured\nexport function isProviderConfigured(\n config: ConfigV2,\n provider: ProviderName,\n): boolean {\n return provider in config.providers;\n}\n\n// Helper to add/update a provider\nexport function setProviderConfig(\n config: ConfigV2,\n provider: ProviderName,\n settings: ProviderSettings,\n setActive = true,\n): ConfigV2 {\n return {\n ...config,\n activeProvider: setActive ? provider : config.activeProvider,\n providers: {\n ...config.providers,\n [provider]: settings,\n },\n };\n}\n","import { z } from 'zod';\n\nexport const ProviderName = z.enum([\n 'claude',\n 'claude-subscription',\n 'openai',\n 'chatgpt-subscription',\n 'copilot',\n 'ollama',\n 'openrouter',\n]);\nexport type ProviderName = z.infer<typeof ProviderName>;\n\nexport const SessionCredentials = z.object({\n type: z.literal('session'),\n sessionToken: z.string(),\n});\n\nexport const ApiKeyCredentials = z.object({\n type: z.literal('api_key'),\n apiKey: z.string(),\n});\n\nexport const LocalCredentials = z.object({\n type: z.literal('local'),\n host: z.string().default('http://localhost:11434'),\n});\n\nexport const ClaudeSubscriptionCredentials = z.object({\n type: z.literal('claude_subscription'),\n accessToken: z.string(),\n refreshToken: z.string(),\n expiresAt: z.number(), // Unix timestamp in ms\n email: z.string().optional(),\n});\n\nexport const ChatGPTSubscriptionCredentials = z.object({\n type: z.literal('chatgpt_subscription'),\n accessToken: z.string(),\n refreshToken: z.string().optional(),\n expiresAt: z.number().optional(), // Unix timestamp in ms\n accountId: z.string().optional(), // ChatGPT account ID for API requests\n});\n\nexport const CopilotCredentials = z.object({\n type: z.literal('copilot'),\n githubToken: z.string(), // GitHub OAuth access token (gho_xxx)\n copilotToken: z.string(), // Copilot API token (short-lived)\n copilotTokenExpiresAt: z.number(), // Unix timestamp in ms\n apiEndpoint: z.string().optional(), // Derived from token (api.individual/business.githubcopilot.com)\n});\n\nexport const Credentials = z.discriminatedUnion('type', [\n SessionCredentials,\n ApiKeyCredentials,\n LocalCredentials,\n ClaudeSubscriptionCredentials,\n ChatGPTSubscriptionCredentials,\n CopilotCredentials,\n]);\nexport type Credentials = z.infer<typeof Credentials>;\n\nexport const Settings = z.object({\n confirmBeforeExecute: z.boolean().default(true),\n historyEnabled: z.boolean().default(true),\n historyRetentionDays: z.number().default(30),\n historyMaxEntries: z.number().default(2000),\n autoConfirmShortcuts: z.boolean().default(false),\n theme: z.string().default('bashio'),\n});\nexport type Settings = z.infer<typeof Settings>;\n\n// V1 Config (legacy, for migration)\nexport const ConfigV1 = z.object({\n version: z.literal(1).default(1),\n provider: ProviderName,\n model: z.string(),\n credentials: Credentials,\n settings: Settings.optional(),\n});\nexport type ConfigV1 = z.infer<typeof ConfigV1>;\n\n// Provider-specific config stored in providers object\nexport const ProviderSettings = z.object({\n model: z.string(),\n credentials: Credentials,\n});\nexport type ProviderSettings = z.infer<typeof ProviderSettings>;\n\n// V2 Config (multi-provider support)\nexport const ConfigV2 = z.object({\n version: z.literal(2),\n activeProvider: ProviderName,\n providers: z.record(z.string(), ProviderSettings),\n settings: Settings.optional(),\n});\nexport type ConfigV2 = Omit<z.infer<typeof ConfigV2>, 'providers'> & {\n providers: Partial<Record<ProviderName, ProviderSettings>>;\n};\n\n// Union type for loading\nexport const Config = z.union([ConfigV2, ConfigV1]);\nexport type Config = z.infer<typeof Config>;\n\nexport interface CommandResult {\n command: string;\n success: boolean;\n}\n\nexport interface ExplanationResult {\n explanation: string;\n}\n\n// Shortcuts types\nexport const ShortcutDefinition = z.object({\n template: z.string(),\n args: z.array(z.string()).default([]),\n description: z.string().optional(),\n});\nexport type ShortcutDefinition = z.infer<typeof ShortcutDefinition>;\n\nexport const ShortcutsFile = z.object({\n version: z.number().default(1),\n shortcuts: z.record(z.string(), ShortcutDefinition),\n});\nexport type ShortcutsFile = z.infer<typeof ShortcutsFile>;\n\nexport interface ResolvedShortcut {\n name: string;\n command: string;\n source: 'shortcut';\n}\n\n// History types\nexport const CommandSource = z.enum(['ai', 'shortcut']);\nexport type CommandSource = z.infer<typeof CommandSource>;\n\nexport const HistoryEntry = z.object({\n id: z.number(),\n query: z.string(),\n command: z.string(),\n source: CommandSource,\n workingDirectory: z.string(),\n executed: z.number(),\n exitCode: z.number().nullable(),\n createdAt: z.string(),\n});\nexport type HistoryEntry = z.infer<typeof HistoryEntry>;\n\nexport const QueryStats = z.object({\n id: z.number(),\n query: z.string(),\n command: z.string(),\n source: CommandSource,\n useCount: z.number(),\n successCount: z.number(),\n suggested: z.number(),\n firstUsed: z.string(),\n lastUsed: z.string(),\n});\nexport type QueryStats = z.infer<typeof QueryStats>;\n\nexport interface HistoryStats {\n totalCommands: number;\n todayCommands: number;\n thisWeekCommands: number;\n totalExecuted: number;\n executionRate: number;\n aiCount: number;\n shortcutCount: number;\n topQueries: Array<{ query: string; useCount: number; source: string }>;\n}\n\nexport interface ShortcutSuggestion {\n query: string;\n command: string;\n useCount: number;\n suggestedName: string;\n}\n","export interface Theme {\n name: string;\n displayName: string;\n accent: string;\n background: string;\n secondaryBg: string;\n textPrimary: string;\n textDim: string;\n}\n\nexport const THEMES: Theme[] = [\n // Default\n {\n name: 'bashio',\n displayName: 'Bashio',\n accent: '#eea154',\n background: '#1e1e1e',\n secondaryBg: '#2a2a2a',\n textPrimary: 'white',\n textDim: 'gray',\n },\n // A\n {\n name: 'aura',\n displayName: 'Aura',\n accent: '#a277ff',\n background: '#15141b',\n secondaryBg: '#1c1b22',\n textPrimary: '#edecee',\n textDim: '#6d6d6d',\n },\n {\n name: 'ayu-dark',\n displayName: 'Ayu Dark',\n accent: '#ffb454',\n background: '#0a0e14',\n secondaryBg: '#0d1117',\n textPrimary: '#bfbdb6',\n textDim: '#565b66',\n },\n // C\n {\n name: 'catppuccin',\n displayName: 'Catppuccin Mocha',\n accent: '#cba6f7',\n background: '#1e1e2e',\n secondaryBg: '#313244',\n textPrimary: '#cdd6f4',\n textDim: '#6c7086',\n },\n {\n name: 'catppuccin-frappe',\n displayName: 'Catppuccin Frappe',\n accent: '#ca9ee6',\n background: '#303446',\n secondaryBg: '#414559',\n textPrimary: '#c6d0f5',\n textDim: '#737994',\n },\n {\n name: 'catppuccin-macchiato',\n displayName: 'Catppuccin Macchiato',\n accent: '#c6a0f6',\n background: '#24273a',\n secondaryBg: '#363a4f',\n textPrimary: '#cad3f5',\n textDim: '#6e738d',\n },\n {\n name: 'cobalt2',\n displayName: 'Cobalt2',\n accent: '#ffc600',\n background: '#193549',\n secondaryBg: '#15232d',\n textPrimary: '#ffffff',\n textDim: '#0088ff',\n },\n {\n name: 'cursor',\n displayName: 'Cursor',\n accent: '#007acc',\n background: '#1e1e1e',\n secondaryBg: '#252526',\n textPrimary: '#cccccc',\n textDim: '#808080',\n },\n // D\n {\n name: 'dracula',\n displayName: 'Dracula',\n accent: '#bd93f9',\n background: '#282a36',\n secondaryBg: '#44475a',\n textPrimary: '#f8f8f2',\n textDim: '#6272a4',\n },\n // E\n {\n name: 'everforest',\n displayName: 'Everforest',\n accent: '#a7c080',\n background: '#2d353b',\n secondaryBg: '#343f44',\n textPrimary: '#d3c6aa',\n textDim: '#859289',\n },\n // F\n {\n name: 'flexoki',\n displayName: 'Flexoki',\n accent: '#d0a215',\n background: '#100f0f',\n secondaryBg: '#1c1b1a',\n textPrimary: '#cecdc3',\n textDim: '#878580',\n },\n // G\n {\n name: 'github-dark',\n displayName: 'GitHub Dark',\n accent: '#58a6ff',\n background: '#0d1117',\n secondaryBg: '#161b22',\n textPrimary: '#c9d1d9',\n textDim: '#8b949e',\n },\n {\n name: 'gruvbox',\n displayName: 'Gruvbox',\n accent: '#fe8019',\n background: '#282828',\n secondaryBg: '#3c3836',\n textPrimary: '#ebdbb2',\n textDim: '#928374',\n },\n // H\n {\n name: 'high-contrast',\n displayName: 'High Contrast',\n accent: '#ffffff',\n background: '#000000',\n secondaryBg: '#1a1a1a',\n textPrimary: '#ffffff',\n textDim: '#888888',\n },\n // K\n {\n name: 'kanagawa',\n displayName: 'Kanagawa',\n accent: '#7e9cd8',\n background: '#1f1f28',\n secondaryBg: '#2a2a37',\n textPrimary: '#dcd7ba',\n textDim: '#727169',\n },\n // L\n {\n name: 'light',\n displayName: 'Light',\n accent: '#0066cc',\n background: '#ffffff',\n secondaryBg: '#f5f5f5',\n textPrimary: '#1f1f1f',\n textDim: '#6e6e6e',\n },\n // M\n {\n name: 'material',\n displayName: 'Material',\n accent: '#89ddff',\n background: '#263238',\n secondaryBg: '#37474f',\n textPrimary: '#eeffff',\n textDim: '#546e7a',\n },\n {\n name: 'monokai',\n displayName: 'Monokai',\n accent: '#a6e22e',\n background: '#272822',\n secondaryBg: '#3e3d32',\n textPrimary: '#f8f8f2',\n textDim: '#75715e',\n },\n // N\n {\n name: 'night-owl',\n displayName: 'Night Owl',\n accent: '#82aaff',\n background: '#011627',\n secondaryBg: '#0b2942',\n textPrimary: '#d6deeb',\n textDim: '#637777',\n },\n {\n name: 'nord',\n displayName: 'Nord',\n accent: '#88c0d0',\n background: '#2e3440',\n secondaryBg: '#3b4252',\n textPrimary: '#eceff4',\n textDim: '#4c566a',\n },\n // O\n {\n name: 'one-dark',\n displayName: 'One Dark',\n accent: '#61afef',\n background: '#282c34',\n secondaryBg: '#21252b',\n textPrimary: '#abb2bf',\n textDim: '#5c6370',\n },\n // P\n {\n name: 'poimandres',\n displayName: 'Poimandres',\n accent: '#add7ff',\n background: '#1b1e28',\n secondaryBg: '#252b37',\n textPrimary: '#e4f0fb',\n textDim: '#767c9d',\n },\n // R\n {\n name: 'rose-pine',\n displayName: 'Rose Pine',\n accent: '#c4a7e7',\n background: '#191724',\n secondaryBg: '#1f1d2e',\n textPrimary: '#e0def4',\n textDim: '#6e6a86',\n },\n {\n name: 'rose-pine-moon',\n displayName: 'Rose Pine Moon',\n accent: '#c4a7e7',\n background: '#232136',\n secondaryBg: '#2a273f',\n textPrimary: '#e0def4',\n textDim: '#6e6a86',\n },\n // S\n {\n name: 'solarized-dark',\n displayName: 'Solarized Dark',\n accent: '#268bd2',\n background: '#002b36',\n secondaryBg: '#073642',\n textPrimary: '#839496',\n textDim: '#586e75',\n },\n {\n name: 'synthwave',\n displayName: 'Synthwave 84',\n accent: '#ff7edb',\n background: '#262335',\n secondaryBg: '#34294f',\n textPrimary: '#ffffff',\n textDim: '#848bbd',\n },\n // T\n {\n name: 'tokyo-night',\n displayName: 'Tokyo Night',\n accent: '#7aa2f7',\n background: '#1a1b26',\n secondaryBg: '#24283b',\n textPrimary: '#c0caf5',\n textDim: '#565f89',\n },\n // V\n {\n name: 'vesper',\n displayName: 'Vesper',\n accent: '#ffc799',\n background: '#101010',\n secondaryBg: '#1a1a1a',\n textPrimary: '#b8b8b8',\n textDim: '#5c5c5c',\n },\n {\n name: 'vitesse',\n displayName: 'Vitesse Dark',\n accent: '#4d9375',\n background: '#121212',\n secondaryBg: '#1e1e1e',\n textPrimary: '#dbd7ca',\n textDim: '#758575',\n },\n];\n\nexport const DEFAULT_THEME = 'bashio';\n\nexport function getThemeByName(name: string): Theme {\n return THEMES.find((t) => t.name === name) ?? THEMES[0];\n}\n\nexport function getThemeNames(): string[] {\n return THEMES.map((t) => t.name);\n}\n","import * as crypto from 'node:crypto';\nimport * as http from 'node:http';\nimport { URL } from 'node:url';\n\n// Claude OAuth Configuration (same as claude-code-proxy, ClawdBot, Roo-Code)\nexport const CLAUDE_OAUTH_CONFIG = {\n clientId: '9d1c250a-e61b-44d9-88ed-5944d1962f5e',\n authorizationUrl: 'https://claude.ai/oauth/authorize',\n tokenUrl: 'https://console.anthropic.com/v1/oauth/token',\n redirectUri: 'http://localhost:8765/callback',\n scopes: 'org:create_api_key user:profile user:inference',\n callbackPort: 8765,\n} as const;\n\n// GitHub Copilot OAuth Configuration (Device Flow)\nexport const COPILOT_OAUTH_CONFIG = {\n clientId: 'Iv1.b507a08c87ecfe98', // Official GitHub Copilot client ID\n deviceCodeUrl: 'https://github.com/login/device/code',\n accessTokenUrl: 'https://github.com/login/oauth/access_token',\n copilotTokenUrl: 'https://api.github.com/copilot_internal/v2/token',\n apiEndpoint: 'https://api.githubcopilot.com/chat/completions',\n scope: 'read:user',\n} as const;\n\n// ChatGPT OAuth Configuration (official Codex CLI values)\nexport const CHATGPT_OAUTH_CONFIG = {\n clientId: 'app_EMoamEEZ73f0CkXaXp7hrann', // Official Codex CLI client ID\n authorizationUrl: 'https://auth.openai.com/oauth/authorize',\n tokenUrl: 'https://auth.openai.com/oauth/token',\n redirectUri: 'http://localhost:1455/auth/callback',\n scopes: 'openid profile email offline_access',\n callbackPort: 1455,\n audience: 'https://api.openai.com/v1',\n // Backend API endpoint (subscription OAuth uses this, NOT api.openai.com)\n apiEndpoint: 'https://chatgpt.com/backend-api/codex/responses',\n} as const;\n\nexport interface OAuthTokens {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n email?: string;\n accountId?: string; // ChatGPT account ID extracted from JWT\n}\n\nexport interface PKCEParams {\n codeVerifier: string;\n codeChallenge: string;\n state: string;\n}\n\n// PKCE Utilities (standard implementation used by all OAuth tools)\nexport function generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString('base64url');\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return crypto.createHash('sha256').update(verifier).digest('base64url');\n}\n\nexport function generateState(): string {\n return crypto.randomBytes(16).toString('hex');\n}\n\nexport function generatePKCE(): PKCEParams {\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n const state = generateState();\n return { codeVerifier, codeChallenge, state };\n}\n\n// Claude OAuth Functions\nexport function buildClaudeAuthUrl(pkce: PKCEParams): string {\n const params = new URLSearchParams({\n client_id: CLAUDE_OAUTH_CONFIG.clientId,\n redirect_uri: CLAUDE_OAUTH_CONFIG.redirectUri,\n scope: CLAUDE_OAUTH_CONFIG.scopes,\n code_challenge: pkce.codeChallenge,\n code_challenge_method: 'S256',\n response_type: 'code',\n state: pkce.state,\n });\n\n return `${CLAUDE_OAUTH_CONFIG.authorizationUrl}?${params.toString()}`;\n}\n\nexport async function exchangeClaudeCode(\n code: string,\n codeVerifier: string,\n state: string,\n): Promise<OAuthTokens> {\n const body = {\n code,\n state,\n grant_type: 'authorization_code',\n client_id: CLAUDE_OAUTH_CONFIG.clientId,\n redirect_uri: CLAUDE_OAUTH_CONFIG.redirectUri,\n code_verifier: codeVerifier,\n };\n\n const response = await fetch(CLAUDE_OAUTH_CONFIG.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Claude token exchange failed: ${response.status} - ${errorText}`,\n );\n }\n\n const data = (await response.json()) as {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n email?: string;\n };\n\n if (!data.refresh_token) {\n throw new Error('Claude token exchange did not return a refresh_token');\n }\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresAt: Date.now() + data.expires_in * 1000,\n email: data.email,\n };\n}\n\nexport async function refreshClaudeToken(\n refreshToken: string,\n): Promise<OAuthTokens> {\n const body = {\n grant_type: 'refresh_token',\n client_id: CLAUDE_OAUTH_CONFIG.clientId,\n refresh_token: refreshToken,\n };\n\n const response = await fetch(CLAUDE_OAUTH_CONFIG.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Claude token refresh failed: ${response.status} - ${errorText}`,\n );\n }\n\n const data = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n email?: string;\n };\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token || refreshToken,\n expiresAt: Date.now() + data.expires_in * 1000,\n email: data.email,\n };\n}\n\nexport function isClaudeTokenExpired(expiresAt: number): boolean {\n const bufferMs = 5 * 60 * 1000; // 5 minutes buffer (standard practice)\n return Date.now() >= expiresAt - bufferMs;\n}\n\n// JWT Parsing for ChatGPT account ID extraction\ninterface JWTClaims {\n chatgpt_account_id?: string;\n 'https://api.openai.com/auth'?: {\n chatgpt_account_id?: string;\n };\n organizations?: Array<{ id: string }>;\n}\n\nfunction parseJWTClaims(token: string): JWTClaims | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = parts[1];\n const decoded = Buffer.from(payload, 'base64url').toString('utf-8');\n return JSON.parse(decoded) as JWTClaims;\n } catch {\n return null;\n }\n}\n\nexport function extractAccountIdFromToken(\n accessToken: string,\n idToken?: string,\n): string | undefined {\n // Try id_token first, then access_token\n const tokens = idToken ? [idToken, accessToken] : [accessToken];\n\n for (const token of tokens) {\n const claims = parseJWTClaims(token);\n if (!claims) continue;\n\n // Check various claim locations\n const accountId =\n claims.chatgpt_account_id ||\n claims['https://api.openai.com/auth']?.chatgpt_account_id ||\n claims.organizations?.[0]?.id;\n\n if (accountId) return accountId;\n }\n\n return undefined;\n}\n\n// ChatGPT OAuth Functions\nexport function buildChatGPTAuthUrl(pkce: PKCEParams): string {\n const params = new URLSearchParams({\n client_id: CHATGPT_OAUTH_CONFIG.clientId,\n redirect_uri: CHATGPT_OAUTH_CONFIG.redirectUri,\n scope: CHATGPT_OAUTH_CONFIG.scopes,\n code_challenge: pkce.codeChallenge,\n code_challenge_method: 'S256',\n response_type: 'code',\n state: pkce.state,\n audience: CHATGPT_OAUTH_CONFIG.audience,\n });\n\n return `${CHATGPT_OAUTH_CONFIG.authorizationUrl}?${params.toString()}`;\n}\n\nexport async function exchangeChatGPTCode(\n code: string,\n codeVerifier: string,\n): Promise<OAuthTokens> {\n const body = new URLSearchParams({\n grant_type: 'authorization_code',\n client_id: CHATGPT_OAUTH_CONFIG.clientId,\n code,\n redirect_uri: CHATGPT_OAUTH_CONFIG.redirectUri,\n code_verifier: codeVerifier,\n });\n\n const response = await fetch(CHATGPT_OAUTH_CONFIG.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `ChatGPT token exchange failed: ${response.status} - ${errorText}`,\n );\n }\n\n const data = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n id_token?: string;\n };\n\n // Extract account ID from JWT tokens\n const accountId = extractAccountIdFromToken(data.access_token, data.id_token);\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token || '',\n expiresAt: data.expires_in ? Date.now() + data.expires_in * 1000 : 0,\n accountId,\n };\n}\n\nexport async function refreshChatGPTToken(\n refreshToken: string,\n): Promise<OAuthTokens> {\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: CHATGPT_OAUTH_CONFIG.clientId,\n refresh_token: refreshToken,\n });\n\n const response = await fetch(CHATGPT_OAUTH_CONFIG.tokenUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `ChatGPT token refresh failed: ${response.status} - ${errorText}`,\n );\n }\n\n const data = (await response.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token || refreshToken,\n expiresAt: data.expires_in ? Date.now() + data.expires_in * 1000 : 0,\n };\n}\n\n// Local OAuth Callback Server\nexport function startCallbackServer(\n port: number,\n expectedState: string,\n timeoutMs = 5 * 60 * 1000,\n): Promise<{ code: string; state: string }> {\n return new Promise((resolve, reject) => {\n const server = http.createServer((req, res) => {\n const parsedUrl = new URL(req.url || '', `http://localhost:${port}`);\n\n // Accept both /callback and /auth/callback paths\n if (\n parsedUrl.pathname !== '/callback' &&\n parsedUrl.pathname !== '/auth/callback'\n ) {\n res.writeHead(404);\n res.end('Not Found');\n return;\n }\n\n const code = parsedUrl.searchParams.get('code');\n const state = parsedUrl.searchParams.get('state');\n const error = parsedUrl.searchParams.get('error');\n\n if (error) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(\n `<html><body><h1>Authentication Failed</h1><p>${error}</p></body></html>`,\n );\n server.close();\n reject(new Error(`OAuth error: ${error}`));\n return;\n }\n\n if (!code || !state) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end('<html><body><h1>Missing Parameters</h1></body></html>');\n server.close();\n reject(new Error('Missing code or state parameter'));\n return;\n }\n\n if (state !== expectedState) {\n res.writeHead(400, { 'Content-Type': 'text/html' });\n res.end(\n '<html><body><h1>Invalid State</h1><p>Possible CSRF attack.</p></body></html>',\n );\n server.close();\n reject(new Error('State mismatch - possible CSRF attack'));\n return;\n }\n\n res.writeHead(200, { 'Content-Type': 'text/html' });\n res.end(`\n <!DOCTYPE html>\n <html>\n <head><title>Authentication Successful</title></head>\n <body style=\"font-family: system-ui; text-align: center; padding: 50px;\">\n <h1>Authentication Successful!</h1>\n <p>You can close this window and return to your terminal.</p>\n <script>setTimeout(() => window.close(), 2000);</script>\n </body>\n </html>\n `);\n\n server.close();\n resolve({ code, state });\n });\n\n server.on('error', (err: NodeJS.ErrnoException) => {\n if (err.code === 'EADDRINUSE') {\n reject(\n new Error(\n `Port ${port} is already in use. Close other applications using this port.`,\n ),\n );\n } else {\n reject(err);\n }\n });\n\n const timeout = setTimeout(() => {\n server.close();\n reject(new Error('Authentication timed out after 5 minutes'));\n }, timeoutMs);\n\n server.on('close', () => clearTimeout(timeout));\n\n server.listen(port, '127.0.0.1');\n });\n}\n\n// GitHub Copilot Device Flow Types\nexport interface DeviceCodeResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n expires_in: number;\n interval: number;\n}\n\nexport interface CopilotTokenResponse {\n token: string;\n expires_at: number;\n}\n\n// GitHub Copilot Device Flow Functions\nexport async function requestCopilotDeviceCode(): Promise<DeviceCodeResponse> {\n const body = new URLSearchParams({\n client_id: COPILOT_OAUTH_CONFIG.clientId,\n scope: COPILOT_OAUTH_CONFIG.scope,\n });\n\n const response = await fetch(COPILOT_OAUTH_CONFIG.deviceCodeUrl, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body.toString(),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `Failed to request device code: ${response.status} - ${errorText}`,\n );\n }\n\n return (await response.json()) as DeviceCodeResponse;\n}\n\nexport async function pollForCopilotAccessToken(\n deviceCode: string,\n intervalMs: number,\n expiresAt: number,\n): Promise<string> {\n const body = new URLSearchParams({\n client_id: COPILOT_OAUTH_CONFIG.clientId,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n });\n\n while (Date.now() < expiresAt) {\n const response = await fetch(COPILOT_OAUTH_CONFIG.accessTokenUrl, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body.toString(),\n });\n\n const data = (await response.json()) as {\n access_token?: string;\n error?: string;\n };\n\n if (data.access_token) {\n return data.access_token;\n }\n\n if (data.error === 'authorization_pending') {\n await new Promise((r) => setTimeout(r, intervalMs));\n continue;\n }\n\n if (data.error === 'slow_down') {\n await new Promise((r) => setTimeout(r, intervalMs + 5000));\n continue;\n }\n\n if (data.error === 'expired_token') {\n throw new Error('Device code expired. Please try again.');\n }\n\n if (data.error === 'access_denied') {\n throw new Error('Access denied. User cancelled authorization.');\n }\n\n throw new Error(`GitHub OAuth error: ${data.error || 'Unknown error'}`);\n }\n\n throw new Error('Authorization timed out. Please try again.');\n}\n\nexport async function exchangeGitHubTokenForCopilot(\n githubToken: string,\n): Promise<CopilotTokenResponse> {\n const response = await fetch(COPILOT_OAUTH_CONFIG.copilotTokenUrl, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n Authorization: `Bearer ${githubToken}`,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 401) {\n throw new Error('GitHub token is invalid or expired.');\n }\n if (response.status === 403) {\n throw new Error(\n 'You do not have access to GitHub Copilot. Please ensure you have an active Copilot subscription.',\n );\n }\n throw new Error(\n `Failed to get Copilot token: ${response.status} - ${errorText}`,\n );\n }\n\n return (await response.json()) as CopilotTokenResponse;\n}\n\nexport function parseCopilotToken(token: string): {\n expiresAt: number;\n apiEndpoint: string;\n} {\n let expiresAt = Date.now() + 30 * 60 * 1000; // Default 30 min\n let apiEndpoint: string = COPILOT_OAUTH_CONFIG.apiEndpoint;\n\n const pairs = token.split(';');\n for (const pair of pairs) {\n const [key, value] = pair.split('=');\n if (key?.trim() === 'exp' && value) {\n expiresAt = Number.parseInt(value.trim(), 10) * 1000;\n }\n if (key?.trim() === 'proxy-ep' && value) {\n // Convert proxy.* to api.* and ensure https:// prefix\n let proxyUrl = value.trim();\n // Add https:// if missing\n if (!proxyUrl.startsWith('http')) {\n proxyUrl = `https://${proxyUrl}`;\n }\n // Convert proxy subdomain to api subdomain\n apiEndpoint = proxyUrl.replace(/\\/\\/proxy\\./i, '//api.');\n // Append /chat/completions if not present\n if (!apiEndpoint.includes('/chat/completions')) {\n apiEndpoint = `${apiEndpoint}/chat/completions`;\n }\n }\n }\n\n return { expiresAt, apiEndpoint };\n}\n\nexport function isCopilotTokenExpired(expiresAt: number): boolean {\n const bufferMs = 5 * 60 * 1000; // 5 minutes buffer\n return Date.now() >= expiresAt - bufferMs;\n}\n","import type { Credentials } from '../core/types.js';\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\nexport interface AIProvider {\n name: string;\n generateCommand(query: string, context?: string): Promise<string>;\n explainCommand(command: string): Promise<string>;\n validateCredentials(): Promise<boolean>;\n streamChat?(\n messages: ChatMessage[],\n onChunk: (chunk: string) => void,\n signal?: AbortSignal,\n ): Promise<void>;\n}\n\nexport interface ProviderConfig {\n model: string;\n credentials: Credentials;\n}\n\nexport const SYSTEM_PROMPT_GENERATE = `You are a shell command generator for macOS/Linux terminals.\nGiven a natural language description, return ONLY the shell command.\nRules:\n- Return ONLY the raw command, nothing else\n- No markdown formatting, no backticks, no explanation\n- No \"Here's the command:\" or similar prefixes\n- If multiple commands are needed, chain them with && or ;\n- Use common Unix utilities (find, grep, awk, sed, curl, etc.)\n- Prefer simple, portable commands over complex ones`;\n\nexport const SYSTEM_PROMPT_EXPLAIN = `You are a shell command expert.\nExplain the given shell command in simple terms.\nBreak down each part of the command concisely.\nFormat as a simple list without markdown.`;\n\nexport const SYSTEM_PROMPT_CHAT = `You are a helpful AI assistant for terminal users.\nYou help with shell commands, programming, system administration, and general questions.\nWhen providing code examples, use markdown code blocks with the appropriate language.\nBe concise but thorough in your explanations.`;\n","import { loadConfig, saveConfig } from '../core/config.js';\nimport {\n CHATGPT_OAUTH_CONFIG,\n extractAccountIdFromToken,\n refreshChatGPTToken,\n} from '../core/oauth.js';\nimport type { AIProvider, ChatMessage, ProviderConfig } from './base.js';\nimport {\n SYSTEM_PROMPT_CHAT,\n SYSTEM_PROMPT_EXPLAIN,\n SYSTEM_PROMPT_GENERATE,\n} from './base.js';\n\n// Codex backend API message format (input must be array of messages)\n// User messages use 'input_text', assistant messages use 'output_text'\ninterface CodexInputMessage {\n type: 'message';\n role: 'user' | 'assistant';\n content: Array<{ type: 'input_text' | 'output_text'; text: string }>;\n}\n\n// Codex backend API request format\ninterface CodexRequest {\n model: string;\n instructions: string;\n input: CodexInputMessage[];\n store: boolean;\n stream: boolean;\n}\n\n// Codex streaming chunk format\ninterface StreamChunk {\n type?: string;\n delta?: string;\n item?: {\n content?: Array<{\n type: string;\n text?: string;\n }>;\n };\n choices?: Array<{\n delta: {\n content?: string;\n };\n }>;\n}\n\nexport class ChatGPTSubscriptionProvider implements AIProvider {\n name = 'ChatGPT (Subscription)';\n private model: string;\n private accessToken: string;\n private refreshToken: string | undefined;\n private expiresAt: number | undefined;\n private accountId: string | undefined;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n if (config.credentials.type === 'chatgpt_subscription') {\n this.accessToken = config.credentials.accessToken;\n this.refreshToken = config.credentials.refreshToken;\n this.expiresAt = config.credentials.expiresAt;\n this.accountId = config.credentials.accountId;\n\n // Try to extract account ID if not stored\n if (!this.accountId) {\n this.accountId = extractAccountIdFromToken(this.accessToken);\n }\n } else {\n throw new Error('ChatGPT Subscription requires subscription credentials');\n }\n }\n\n private isTokenExpired(): boolean {\n if (!this.expiresAt) return false;\n const bufferMs = 5 * 60 * 1000; // 5 minutes buffer\n return Date.now() >= this.expiresAt - bufferMs;\n }\n\n private async ensureValidToken(): Promise<string> {\n if (this.isTokenExpired() && this.refreshToken) {\n try {\n const newTokens = await refreshChatGPTToken(this.refreshToken);\n this.accessToken = newTokens.accessToken;\n this.refreshToken = newTokens.refreshToken || this.refreshToken;\n this.expiresAt = newTokens.expiresAt || this.expiresAt;\n\n // Update account ID from new token\n if (newTokens.accountId) {\n this.accountId = newTokens.accountId;\n } else if (!this.accountId) {\n this.accountId = extractAccountIdFromToken(this.accessToken);\n }\n\n // Update stored config with new tokens\n const currentConfig = loadConfig();\n const providerSettings =\n currentConfig?.providers['chatgpt-subscription'];\n if (\n currentConfig &&\n providerSettings?.credentials.type === 'chatgpt_subscription'\n ) {\n providerSettings.credentials.accessToken = newTokens.accessToken;\n if (newTokens.refreshToken) {\n providerSettings.credentials.refreshToken = newTokens.refreshToken;\n }\n if (newTokens.expiresAt) {\n providerSettings.credentials.expiresAt = newTokens.expiresAt;\n }\n if (this.accountId) {\n providerSettings.credentials.accountId = this.accountId;\n }\n saveConfig(currentConfig);\n }\n } catch (error) {\n throw new Error(\n `Token refresh failed. Please re-authenticate with: b --auth\\n` +\n `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n }\n return this.accessToken;\n }\n\n private async call(\n systemPrompt: string,\n userMessage: string,\n ): Promise<string> {\n const token = await this.ensureValidToken();\n\n // Build request for Codex backend API\n // Input must be an array of message objects with content as array\n // Codex API REQUIRES stream: true\n const requestBody: CodexRequest = {\n model: this.model,\n instructions: systemPrompt,\n input: [\n {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: userMessage }],\n },\n ],\n store: false,\n stream: true,\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'OpenAI-Beta': 'responses=experimental',\n originator: 'bashio',\n };\n\n // Add account ID if available (ChatGPT-Account-Id header for organization subscriptions)\n if (this.accountId) {\n headers['ChatGPT-Account-Id'] = this.accountId;\n }\n\n const response = await fetch(CHATGPT_OAUTH_CONFIG.apiEndpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 401) {\n throw new Error(\n 'Authentication failed. Please re-authenticate with: b --auth',\n );\n }\n if (response.status === 403) {\n throw new Error(\n 'Access forbidden. Your ChatGPT subscription may not have access to this model.\\n' +\n `Error: ${errorText}`,\n );\n }\n throw new Error(`ChatGPT API error: ${response.status} - ${errorText}`);\n }\n\n // Parse SSE streaming response\n return this.parseStreamingResponse(response);\n }\n\n private async parseStreamingResponse(response: Response): Promise<string> {\n if (!response.body) {\n throw new Error('No response body from ChatGPT');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let fullText = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n // Process complete lines\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim() || !line.startsWith('data:')) continue;\n\n const data = line.substring(5).trim();\n\n // Check for end signal\n if (data === '[DONE]') {\n return fullText.trim();\n }\n\n try {\n const chunk = JSON.parse(data) as StreamChunk;\n\n // Handle text delta events only (avoid double-counting from .done events)\n if (chunk.type === 'response.output_text.delta' && chunk.delta) {\n fullText += chunk.delta;\n } else if (chunk.choices?.[0]?.delta?.content) {\n // Standard OpenAI streaming format fallback\n fullText += chunk.choices[0].delta.content;\n }\n } catch {\n // Skip malformed JSON chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (!fullText) {\n throw new Error('No response content from ChatGPT');\n }\n\n return fullText.trim();\n }\n\n async generateCommand(query: string, context?: string): Promise<string> {\n const userMessage = context\n ? `Context: ${context}\\n\\nTask: ${query}`\n : query;\n return this.call(SYSTEM_PROMPT_GENERATE, userMessage);\n }\n\n async explainCommand(command: string): Promise<string> {\n return this.call(SYSTEM_PROMPT_EXPLAIN, `Explain this command: ${command}`);\n }\n\n async validateCredentials(): Promise<boolean> {\n // Skip heavy API validation for Codex - just verify we have a token\n // The Codex backend API doesn't have a lightweight validation endpoint\n // Real validation happens on first actual API call\n try {\n const token = await this.ensureValidToken();\n // Basic check: token exists and is not empty\n return !!token && token.length > 0;\n } catch {\n return false;\n }\n }\n\n async streamChat(\n messages: ChatMessage[],\n onChunk: (chunk: string) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n const token = await this.ensureValidToken();\n\n const requestBody: CodexRequest = {\n model: this.model,\n instructions: SYSTEM_PROMPT_CHAT,\n input: messages.map((m) => ({\n type: 'message' as const,\n role: m.role,\n content: [\n {\n type: m.role === 'user' ? 'input_text' : 'output_text',\n text: m.content,\n },\n ],\n })),\n store: false,\n stream: true,\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'OpenAI-Beta': 'responses=experimental',\n originator: 'bashio',\n };\n\n if (this.accountId) {\n headers['ChatGPT-Account-Id'] = this.accountId;\n }\n\n const response = await fetch(CHATGPT_OAUTH_CONFIG.apiEndpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`ChatGPT API error: ${response.status} - ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim() || !line.startsWith('data:')) continue;\n const data = line.substring(5).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data) as StreamChunk;\n if (chunk.type === 'response.output_text.delta' && chunk.delta) {\n onChunk(chunk.delta);\n } else if (chunk.choices?.[0]?.delta?.content) {\n onChunk(chunk.choices[0].delta.content);\n }\n } catch {\n // Skip malformed JSON\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// Models available with ChatGPT Plus/Pro subscription via Codex OAuth (as of Jan 2026)\n// Note: Only specific models are allowed with Codex OAuth - see opencode plugin\nexport const CHATGPT_SUBSCRIPTION_MODELS = [\n { value: 'gpt-5.2-codex', label: 'GPT-5.2-Codex (recommended for coding)' },\n { value: 'gpt-5.2', label: 'GPT-5.2 (most intelligent)' },\n { value: 'gpt-5.1-codex-max', label: 'GPT-5.1-Codex-Max (long tasks)' },\n { value: 'gpt-5.1-codex-mini', label: 'GPT-5.1-Codex-Mini (fast)' },\n { value: 'o4-mini', label: 'o4-mini (reasoning)' },\n { value: 'gpt-4o', label: 'GPT-4o (legacy)' },\n];\n","/**\n * Centralized error handling for API providers\n * Provides user-friendly error messages for common API errors\n */\n\nexport interface ApiErrorContext {\n provider: string;\n model?: string;\n status?: number;\n errorText?: string;\n}\n\n/**\n * HTTP status codes with specific handling\n */\nexport const HTTP_STATUS = {\n BAD_REQUEST: 400,\n UNAUTHORIZED: 401,\n FORBIDDEN: 403,\n NOT_FOUND: 404,\n RATE_LIMITED: 429,\n SERVER_ERROR: 500,\n OVERLOADED: 529, // Claude-specific\n} as const;\n\n/**\n * API key format patterns for validation\n */\nexport const API_KEY_PATTERNS: Record<\n string,\n { prefix: string; name: string }\n> = {\n openai: { prefix: 'sk-', name: 'OpenAI' },\n claude: { prefix: 'sk-ant-', name: 'Claude/Anthropic' },\n openrouter: { prefix: 'sk-or-', name: 'OpenRouter' },\n};\n\n/**\n * Validates API key format and returns a warning message if invalid\n * Returns null if the key format is valid\n */\nexport function validateApiKeyFormat(\n key: string,\n provider: 'openai' | 'claude' | 'openrouter',\n): string | null {\n const pattern = API_KEY_PATTERNS[provider];\n if (!pattern) return null;\n\n if (!key.startsWith(pattern.prefix)) {\n return `Warning: ${pattern.name} API keys typically start with \"${pattern.prefix}\". Your key may be invalid.`;\n }\n\n return null;\n}\n\n/**\n * Creates a user-friendly error message based on HTTP status code\n */\nexport function createHttpError(ctx: ApiErrorContext): Error {\n const { provider, model, status, errorText } = ctx;\n\n switch (status) {\n case HTTP_STATUS.UNAUTHORIZED:\n return new Error(\n `Invalid API key for ${provider}. Please check your credentials with: b --auth`,\n );\n\n case HTTP_STATUS.FORBIDDEN:\n return new Error(\n `Access forbidden for ${provider}. Check your API key permissions or subscription status.`,\n );\n\n case HTTP_STATUS.NOT_FOUND:\n if (model) {\n return new Error(\n `Model \"${model}\" not found on ${provider}. Check available models or update your selection with: b --model`,\n );\n }\n return new Error(`Resource not found on ${provider}. ${errorText || ''}`);\n\n case HTTP_STATUS.RATE_LIMITED:\n return new Error(\n `Rate limited by ${provider}. Please wait a moment and try again.`,\n );\n\n case HTTP_STATUS.OVERLOADED:\n return new Error(\n `${provider} is currently overloaded. Please try again in a few moments.`,\n );\n\n case HTTP_STATUS.BAD_REQUEST:\n // Check for specific error patterns\n if (errorText?.includes('model_not_supported')) {\n return new Error(\n `Model not supported by your ${provider} subscription. Check your plan or try a different model.`,\n );\n }\n return new Error(`${provider} API error: Bad request - ${errorText}`);\n\n default:\n if (status && status >= 500) {\n return new Error(\n `${provider} server error (${status}). Please try again later.`,\n );\n }\n return new Error(\n `${provider} API error: ${status || 'Unknown'} - ${errorText || 'Unknown error'}`,\n );\n }\n}\n\n/**\n * Handles network/connection errors with user-friendly messages\n */\nexport function createNetworkError(\n error: unknown,\n provider: string,\n host?: string,\n): Error {\n if (!(error instanceof Error)) {\n return new Error(`${provider} connection failed: Unknown error`);\n }\n\n const message = error.message.toLowerCase();\n\n // Connection refused - service not running\n if (\n message.includes('econnrefused') ||\n message.includes('connection refused')\n ) {\n if (provider === 'Ollama') {\n return new Error(\n `Ollama is not running. Start it with: ollama serve\\n\\nHost: ${host || 'http://localhost:11434'}`,\n );\n }\n return new Error(\n `Cannot connect to ${provider}. Please check if the service is running.`,\n );\n }\n\n // Timeout\n if (message.includes('etimedout') || message.includes('timeout')) {\n return new Error(\n `Connection to ${provider} timed out. Check your network connection.`,\n );\n }\n\n // DNS resolution failed\n if (message.includes('enotfound') || message.includes('getaddrinfo')) {\n return new Error(\n `Cannot resolve ${provider} hostname. Check your network connection.`,\n );\n }\n\n // SSL/TLS errors\n if (\n message.includes('ssl') ||\n message.includes('certificate') ||\n message.includes('tls')\n ) {\n return new Error(\n `SSL/TLS error connecting to ${provider}. Check your system certificates.`,\n );\n }\n\n return new Error(`${provider} connection error: ${error.message}`);\n}\n\n/**\n * Handles Ollama-specific errors (model not found, etc.)\n */\nexport function createOllamaError(\n errorText: string,\n model: string,\n status?: number,\n): Error {\n const lowerError = errorText.toLowerCase();\n\n // Model not found\n if (\n lowerError.includes('model') &&\n (lowerError.includes('not found') || lowerError.includes('does not exist'))\n ) {\n return new Error(\n `Model \"${model}\" not found. Pull it with: ollama pull ${model}`,\n );\n }\n\n // Fallback to HTTP error handling\n return createHttpError({\n provider: 'Ollama',\n model,\n status,\n errorText,\n });\n}\n\n/**\n * Type guard for fetch errors\n */\nexport function isFetchError(error: unknown): error is TypeError {\n return error instanceof TypeError && error.message.includes('fetch');\n}\n\n/**\n * Wraps a fetch call with proper error handling\n * Use this to standardize error handling across providers\n */\nexport async function handleProviderResponse(\n response: Response,\n ctx: Omit<ApiErrorContext, 'status' | 'errorText'>,\n): Promise<void> {\n if (!response.ok) {\n const errorText = await response.text();\n throw createHttpError({\n ...ctx,\n status: response.status,\n errorText,\n });\n }\n}\n","import {\n createHttpError,\n createNetworkError,\n isFetchError,\n} from '../core/errors.js';\nimport type { AIProvider, ChatMessage, ProviderConfig } from './base.js';\nimport {\n SYSTEM_PROMPT_CHAT,\n SYSTEM_PROMPT_EXPLAIN,\n SYSTEM_PROMPT_GENERATE,\n} from './base.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\ninterface AnthropicResponse {\n content: Array<{ type: string; text: string }>;\n error?: { message: string };\n}\n\nexport class ClaudeProvider implements AIProvider {\n name = 'Claude';\n private model: string;\n private apiKey: string;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n if (config.credentials.type === 'api_key') {\n this.apiKey = config.credentials.apiKey;\n } else if (config.credentials.type === 'session') {\n this.apiKey = config.credentials.sessionToken;\n } else {\n throw new Error('Claude requires API key or session token');\n }\n }\n\n private async call(\n systemPrompt: string,\n userMessage: string,\n ): Promise<string> {\n const messages: AnthropicMessage[] = [\n { role: 'user', content: userMessage },\n ];\n\n let response: Response;\n try {\n response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: 1024,\n system: systemPrompt,\n messages,\n }),\n });\n } catch (error) {\n if (isFetchError(error)) {\n throw createNetworkError(error, 'Claude');\n }\n throw error;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw createHttpError({\n provider: 'Claude',\n model: this.model,\n status: response.status,\n errorText,\n });\n }\n\n const data = (await response.json()) as AnthropicResponse;\n\n if (data.error) {\n throw new Error(`Claude API error: ${data.error.message}`);\n }\n\n const textContent = data.content.find((c) => c.type === 'text');\n if (!textContent) {\n throw new Error('No text response from Claude');\n }\n\n return textContent.text.trim();\n }\n\n async generateCommand(query: string, context?: string): Promise<string> {\n const userMessage = context\n ? `Context: ${context}\\n\\nTask: ${query}`\n : query;\n return this.call(SYSTEM_PROMPT_GENERATE, userMessage);\n }\n\n async explainCommand(command: string): Promise<string> {\n return this.call(SYSTEM_PROMPT_EXPLAIN, `Explain this command: ${command}`);\n }\n\n async validateCredentials(): Promise<boolean> {\n try {\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: 10,\n messages: [{ role: 'user', content: 'hi' }],\n }),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async streamChat(\n messages: ChatMessage[],\n onChunk: (chunk: string) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n let response: Response;\n try {\n response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: 4096,\n system: SYSTEM_PROMPT_CHAT,\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n stream: true,\n }),\n signal,\n });\n } catch (error) {\n if (isFetchError(error)) {\n throw createNetworkError(error, 'Claude');\n }\n throw error;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw createHttpError({\n provider: 'Claude',\n model: this.model,\n status: response.status,\n errorText,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6);\n if (jsonStr === '[DONE]') continue;\n\n try {\n const data = JSON.parse(jsonStr) as {\n type: string;\n delta?: { type: string; text?: string };\n };\n if (\n data.type === 'content_block_delta' &&\n data.delta?.type === 'text_delta' &&\n data.delta?.text\n ) {\n onChunk(data.delta.text);\n }\n } catch {\n // Ignore parse errors for incomplete JSON\n }\n }\n }\n }\n }\n}\n\n// Latest Claude models available via API key (as of Jan 2026)\nexport const CLAUDE_MODELS = [\n {\n value: 'claude-opus-4-5-20251101',\n label: 'Claude Opus 4.5 (most intelligent)',\n },\n {\n value: 'claude-sonnet-4-5-20250929',\n label: 'Claude Sonnet 4.5 (recommended)',\n },\n { value: 'claude-haiku-4-5-20251001', label: 'Claude Haiku 4.5 (fast)' },\n { value: 'claude-sonnet-4-20250514', label: 'Claude Sonnet 4' },\n { value: 'claude-opus-4-20250514', label: 'Claude Opus 4' },\n];\n","import { loadConfig, saveConfig } from '../core/config.js';\nimport { isClaudeTokenExpired, refreshClaudeToken } from '../core/oauth.js';\nimport type { AIProvider, ChatMessage, ProviderConfig } from './base.js';\nimport {\n SYSTEM_PROMPT_CHAT,\n SYSTEM_PROMPT_EXPLAIN,\n SYSTEM_PROMPT_GENERATE,\n} from './base.js';\n\ninterface AnthropicMessage {\n role: 'user' | 'assistant';\n content: string;\n}\n\ninterface AnthropicResponse {\n content: Array<{ type: string; text: string }>;\n error?: { message: string };\n}\n\n// Required prefix for Claude Code API (enforced by Anthropic)\nconst CLAUDE_CODE_PREFIX =\n \"You are Claude Code, Anthropic's official CLI for Claude.\";\n\n// Claude Code beta features for OAuth authentication\nconst CLAUDE_CODE_BETAS = [\n 'oauth-2025-04-20',\n 'claude-code-20250219',\n 'interleaved-thinking-2025-05-14',\n 'fine-grained-tool-streaming-2025-05-14',\n].join(',');\n\nexport class ClaudeSubscriptionProvider implements AIProvider {\n name = 'Claude (Subscription)';\n private model: string;\n private accessToken: string;\n private refreshToken: string;\n private expiresAt: number;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n if (config.credentials.type === 'claude_subscription') {\n this.accessToken = config.credentials.accessToken;\n this.refreshToken = config.credentials.refreshToken;\n this.expiresAt = config.credentials.expiresAt;\n } else {\n throw new Error('Claude Subscription requires subscription credentials');\n }\n }\n\n private async ensureValidToken(): Promise<string> {\n if (isClaudeTokenExpired(this.expiresAt)) {\n try {\n const newTokens = await refreshClaudeToken(this.refreshToken);\n this.accessToken = newTokens.accessToken;\n this.refreshToken = newTokens.refreshToken;\n this.expiresAt = newTokens.expiresAt;\n\n // Update stored config with new tokens\n const currentConfig = loadConfig();\n const providerSettings =\n currentConfig?.providers['claude-subscription'];\n if (\n currentConfig &&\n providerSettings?.credentials.type === 'claude_subscription'\n ) {\n providerSettings.credentials.accessToken = newTokens.accessToken;\n providerSettings.credentials.refreshToken = newTokens.refreshToken;\n providerSettings.credentials.expiresAt = newTokens.expiresAt;\n saveConfig(currentConfig);\n }\n } catch (error) {\n throw new Error(\n `Token refresh failed. Please re-authenticate with: b --auth\\n` +\n `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n }\n return this.accessToken;\n }\n\n private async call(\n systemPrompt: string,\n userMessage: string,\n ): Promise<string> {\n const token = await this.ensureValidToken();\n const messages: AnthropicMessage[] = [\n { role: 'user', content: userMessage },\n ];\n\n // System prompt MUST be an array of content blocks for OAuth tokens\n // First block must be the Claude Code identity prefix\n const systemBlocks = [\n { type: 'text', text: CLAUDE_CODE_PREFIX },\n { type: 'text', text: systemPrompt },\n ];\n\n // Build headers exactly like Claude Code CLI\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'anthropic-beta': CLAUDE_CODE_BETAS,\n 'anthropic-dangerous-direct-browser-access': 'true',\n 'user-agent': 'claude-cli/1.0.119 (external, cli)',\n 'x-app': 'cli',\n accept: 'application/json',\n };\n\n const response = await fetch(\n 'https://api.anthropic.com/v1/messages?beta=true',\n {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model: this.model,\n max_tokens: 1024,\n system: systemBlocks,\n messages,\n }),\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n if (response.status === 401) {\n throw new Error(\n 'Authentication failed. Please re-authenticate with: b --auth',\n );\n }\n throw new Error(`Claude API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as AnthropicResponse;\n\n if (data.error) {\n throw new Error(`Claude API error: ${data.error.message}`);\n }\n\n const textContent = data.content.find((c) => c.type === 'text');\n if (!textContent) {\n throw new Error('No text response from Claude');\n }\n\n return textContent.text.trim();\n }\n\n async generateCommand(query: string, context?: string): Promise<string> {\n const userMessage = context\n ? `Context: ${context}\\n\\nTask: ${query}`\n : query;\n return this.call(SYSTEM_PROMPT_GENERATE, userMessage);\n }\n\n async explainCommand(command: string): Promise<string> {\n return this.call(SYSTEM_PROMPT_EXPLAIN, `Explain this command: ${command}`);\n }\n\n async validateCredentials(): Promise<boolean> {\n try {\n const token = await this.ensureValidToken();\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'anthropic-beta': CLAUDE_CODE_BETAS,\n 'anthropic-dangerous-direct-browser-access': 'true',\n 'user-agent': 'claude-cli/1.0.119 (external, cli)',\n 'x-app': 'cli',\n accept: 'application/json',\n };\n\n const response = await fetch(\n 'https://api.anthropic.com/v1/messages?beta=true',\n {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model: this.model,\n max_tokens: 10,\n system: [{ type: 'text', text: CLAUDE_CODE_PREFIX }],\n messages: [{ role: 'user', content: 'hi' }],\n }),\n },\n );\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async streamChat(\n messages: ChatMessage[],\n onChunk: (chunk: string) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n const token = await this.ensureValidToken();\n\n const systemBlocks = [\n { type: 'text', text: CLAUDE_CODE_PREFIX },\n { type: 'text', text: SYSTEM_PROMPT_CHAT },\n ];\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'anthropic-version': '2023-06-01',\n 'anthropic-beta': CLAUDE_CODE_BETAS,\n 'anthropic-dangerous-direct-browser-access': 'true',\n 'user-agent': 'claude-cli/1.0.119 (external, cli)',\n 'x-app': 'cli',\n accept: 'text/event-stream',\n };\n\n const response = await fetch(\n 'https://api.anthropic.com/v1/messages?beta=true',\n {\n method: 'POST',\n headers,\n body: JSON.stringify({\n model: this.model,\n max_tokens: 4096,\n system: systemBlocks,\n messages: messages.map((m) => ({\n role: m.role,\n content: m.content,\n })),\n stream: true,\n }),\n signal,\n },\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Claude API error: ${response.status} - ${error}`);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6);\n if (jsonStr === '[DONE]') continue;\n\n try {\n const data = JSON.parse(jsonStr) as {\n type: string;\n delta?: { type: string; text?: string };\n };\n if (\n data.type === 'content_block_delta' &&\n data.delta?.type === 'text_delta' &&\n data.delta?.text\n ) {\n onChunk(data.delta.text);\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n }\n}\n\n// Latest Claude models available with Pro/Max subscription (as of Jan 2026)\nexport const CLAUDE_SUBSCRIPTION_MODELS = [\n {\n value: 'claude-opus-4-5-20251101',\n label: 'Claude Opus 4.5 (most intelligent)',\n },\n {\n value: 'claude-sonnet-4-5-20250929',\n label: 'Claude Sonnet 4.5 (recommended)',\n },\n { value: 'claude-haiku-4-5-20251001', label: 'Claude Haiku 4.5 (fast)' },\n { value: 'claude-sonnet-4-20250514', label: 'Claude Sonnet 4' },\n { value: 'claude-opus-4-20250514', label: 'Claude Opus 4 (Max plan only)' },\n];\n","import { loadConfig, saveConfig } from '../core/config.js';\nimport {\n COPILOT_OAUTH_CONFIG,\n exchangeGitHubTokenForCopilot,\n isCopilotTokenExpired,\n parseCopilotToken,\n} from '../core/oauth.js';\nimport type { AIProvider, ChatMessage, ProviderConfig } from './base.js';\nimport {\n SYSTEM_PROMPT_CHAT,\n SYSTEM_PROMPT_EXPLAIN,\n SYSTEM_PROMPT_GENERATE,\n} from './base.js';\n\n// Streaming chunk format from Copilot API\ninterface StreamChunk {\n choices?: Array<{\n delta: {\n content?: string;\n };\n finish_reason?: string;\n }>;\n}\n\nexport class CopilotProvider implements AIProvider {\n name = 'GitHub Copilot';\n private model: string;\n private githubToken: string;\n private copilotToken: string;\n private copilotTokenExpiresAt: number;\n private apiEndpoint: string;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n if (config.credentials.type === 'copilot') {\n this.githubToken = config.credentials.githubToken;\n this.copilotToken = config.credentials.copilotToken;\n this.copilotTokenExpiresAt = config.credentials.copilotTokenExpiresAt;\n this.apiEndpoint = this.normalizeEndpoint(\n config.credentials.apiEndpoint || COPILOT_OAUTH_CONFIG.apiEndpoint,\n );\n } else {\n throw new Error('Copilot requires copilot credentials');\n }\n }\n\n private normalizeEndpoint(endpoint: string): string {\n let url = endpoint;\n // Add https:// if missing\n if (!url.startsWith('http')) {\n url = `https://${url}`;\n }\n // Convert proxy subdomain to api subdomain\n url = url.replace(/\\/\\/proxy\\./i, '//api.');\n // Append /chat/completions if not present\n if (!url.includes('/chat/completions')) {\n url = `${url}/chat/completions`;\n }\n return url;\n }\n\n private async ensureValidToken(): Promise<string> {\n if (isCopilotTokenExpired(this.copilotTokenExpiresAt)) {\n try {\n const newTokenData = await exchangeGitHubTokenForCopilot(\n this.githubToken,\n );\n this.copilotToken = newTokenData.token;\n\n const parsed = parseCopilotToken(newTokenData.token);\n this.copilotTokenExpiresAt = parsed.expiresAt;\n this.apiEndpoint = parsed.apiEndpoint;\n\n // Update stored config with new Copilot token\n const currentConfig = loadConfig();\n const providerSettings = currentConfig?.providers.copilot;\n if (currentConfig && providerSettings?.credentials.type === 'copilot') {\n providerSettings.credentials.copilotToken = newTokenData.token;\n providerSettings.credentials.copilotTokenExpiresAt = parsed.expiresAt;\n providerSettings.credentials.apiEndpoint = parsed.apiEndpoint;\n saveConfig(currentConfig);\n }\n } catch (error) {\n throw new Error(\n `Copilot token refresh failed. Please re-authenticate with: b --auth\\n` +\n `Error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n }\n }\n return this.copilotToken;\n }\n\n private async call(\n systemPrompt: string,\n userMessage: string,\n ): Promise<string> {\n const token = await this.ensureValidToken();\n\n const requestBody = {\n model: this.model,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userMessage },\n ],\n temperature: 0.1,\n top_p: 1,\n n: 1,\n stream: true,\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${token}`,\n 'User-Agent': 'GitHubCopilotChat/0.35.0',\n 'Editor-Version': 'vscode/1.107.0',\n 'Editor-Plugin-Version': 'copilot-chat/0.35.0',\n 'Copilot-Integration-Id': 'vscode-chat',\n };\n\n const response = await fetch(this.apiEndpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (response.status === 401) {\n throw new Error(\n 'Authentication failed. Please re-authenticate with: b --auth',\n );\n }\n if (response.status === 403) {\n throw new Error(\n 'Access forbidden. Please ensure you have an active GitHub Copilot subscription.',\n );\n }\n if (\n response.status === 400 &&\n errorText.includes('model_not_supported')\n ) {\n throw new Error(\n `Model not supported by your Copilot subscription.\\n\\nTo enable this model, visit:\\nhttps://github.com/settings/copilot\\n\\nThen go to \"Models\" section and enable the model you want to use and restart the chat using b --chat`,\n );\n }\n throw new Error(`Copilot API error: ${response.status} - ${errorText}`);\n }\n\n return this.parseStreamingResponse(response);\n }\n\n private async parseStreamingResponse(response: Response): Promise<string> {\n if (!response.body) {\n throw new Error('No response body from Copilot');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let fullText = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim() || !line.startsWith('data:')) continue;\n\n const data = line.substring(5).trim();\n\n if (data === '[DONE]') {\n return fullText.trim();\n }\n\n try {\n const chunk = JSON.parse(data) as StreamChunk;\n const content = chunk.choices?.[0]?.delta?.content;\n if (content) {\n fullText += content;\n }\n } catch {\n // Skip malformed chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n\n if (!fullText) {\n throw new Error('No response content from Copilot');\n }\n\n return fullText.trim();\n }\n\n async generateCommand(query: string, context?: string): Promise<string> {\n const userMessage = context\n ? `Context: ${context}\\n\\nTask: ${query}`\n : query;\n return this.call(SYSTEM_PROMPT_GENERATE, userMessage);\n }\n\n async explainCommand(command: string): Promise<string> {\n return this.call(SYSTEM_PROMPT_EXPLAIN, `Explain this command: ${command}`);\n }\n\n async validateCredentials(): Promise<boolean> {\n try {\n const token = await this.ensureValidToken();\n return !!token && token.length > 0;\n } catch {\n return false;\n }\n }\n\n async streamChat(\n messages: ChatMessage[],\n onChunk: (chunk: string) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n const token = await this.ensureValidToken();\n\n const requestBody = {\n model: this.model,\n messages: [\n { role: 'system', content: SYSTEM_PROMPT_CHAT },\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n ],\n temperature: 0.1,\n top_p: 1,\n n: 1,\n stream: true,\n };\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n Authorization: `Bearer ${token}`,\n 'User-Agent': 'GitHubCopilotChat/0.35.0',\n 'Editor-Version': 'vscode/1.107.0',\n 'Editor-Plugin-Version': 'copilot-chat/0.35.0',\n 'Copilot-Integration-Id': 'vscode-chat',\n };\n\n const response = await fetch(this.apiEndpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n signal,\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n if (\n response.status === 400 &&\n errorText.includes('model_not_supported')\n ) {\n throw new Error(\n `Model not supported by your Copilot subscription.\\n\\nTo enable this model, visit:\\nhttps://github.com/settings/copilot\\n\\nThen go to \"Models\" section and enable the model you want to use.`,\n );\n }\n throw new Error(`Copilot API error: ${response.status} - ${errorText}`);\n }\n\n if (!response.body) {\n throw new Error('No response body');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim() || !line.startsWith('data:')) continue;\n const data = line.substring(5).trim();\n if (data === '[DONE]') return;\n\n try {\n const chunk = JSON.parse(data) as StreamChunk;\n const content = chunk.choices?.[0]?.delta?.content;\n if (content) {\n onChunk(content);\n }\n } catch {\n // Skip malformed chunks\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\n// Models available with GitHub Copilot (as of Jan 2026)\n// Based on GitHub's supported models documentation\nexport const COPILOT_MODELS = [\n { value: 'gpt-4.1', label: 'GPT-4.1 (default)' },\n { value: 'gpt-5.1', label: 'GPT-5.1 (latest)' },\n { value: 'gpt-5-mini', label: 'GPT-5 Mini (fast)' },\n { value: 'claude-sonnet-4', label: 'Claude Sonnet 4' },\n { value: 'claude-sonnet-4.5', label: 'Claude Sonnet 4.5 (latest)' },\n { value: 'gpt-4o', label: 'GPT-4o' },\n];\n","import { createNetworkError, createOllamaError } from '../core/errors.js';\nimport type { AIProvider, ChatMessage, ProviderConfig } from './base.js';\nimport {\n SYSTEM_PROMPT_CHAT,\n SYSTEM_PROMPT_EXPLAIN,\n SYSTEM_PROMPT_GENERATE,\n} from './base.js';\n\ninterface OllamaResponse {\n response?: string;\n message?: { content: string };\n error?: string;\n}\n\ninterface OllamaTagsResponse {\n models: Array<{ name: string }>;\n}\n\nexport class OllamaProvider implements AIProvider {\n name = 'Ollama';\n private model: string;\n private host: string;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n if (config.credentials.type === 'local') {\n this.host = config.credentials.host;\n } else {\n this.host = 'http://localhost:11434';\n }\n }\n\n private async call(\n systemPrompt: string,\n userMessage: string,\n ): Promise<string> {\n let response: Response;\n try {\n response = await fetch(`${this.host}/api/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: this.model,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userMessage },\n ],\n stream: false,\n }),\n });\n } catch (error) {\n throw createNetworkError(error, 'Ollama', this.host);\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw createOllamaError(errorText, this.model, response.status);\n }\n\n const data = (await response.json()) as OllamaResponse;\n\n if (data.error) {\n throw createOllamaError(data.error, this.model);\n }\n\n const content = data.message?.content || data.response;\n if (!content) {\n throw new Error('No response from Ollama');\n }\n\n return content.trim();\n }\n\n async generateCommand(query: string, context?: string): Promise<string> {\n const userMessage = context\n ? `Context: ${context}\\n\\nTask: ${query}`\n : query;\n return this.call(SYSTEM_PROMPT_GENERATE, userMessage);\n }\n\n async explainCommand(command: string): Promise<string> {\n return this.call(SYSTEM_PROMPT_EXPLAIN, `Explain this command: ${command}`);\n }\n\n async validateCredentials(): Promise<boolean> {\n try {\n const response = await fetch(`${this.host}/api/tags`);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n static async getAvailableModels(\n host = 'http://localhost:11434',\n ): Promise<string[]> {\n try {\n const response = await fetch(`${host}/api/tags`);\n if (!response.ok) return [];\n const data = (await response.json()) as OllamaTagsResponse;\n return data.models.map((m) => m.name);\n } catch {\n return [];\n }\n }\n\n async streamChat(\n messages: ChatMessage[],\n onChunk: (chunk: string) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n let response: Response;\n try {\n response = await fetch(`${this.host}/api/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: this.model,\n messages: [\n { role: 'system', content: SYSTEM_PROMPT_CHAT },\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n ],\n stream: true,\n }),\n signal,\n });\n } catch (error) {\n throw createNetworkError(error, 'Ollama', this.host);\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw createOllamaError(errorText, this.model, response.status);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const data = JSON.parse(line) as {\n message?: { content?: string };\n done?: boolean;\n };\n if (data.message?.content) {\n onChunk(data.message.content);\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n}\n\nexport const OLLAMA_RECOMMENDED_MODELS = [\n 'llama3.2',\n 'llama3.1',\n 'codellama',\n 'mistral',\n 'gemma2',\n];\n","import {\n createHttpError,\n createNetworkError,\n isFetchError,\n} from '../core/errors.js';\nimport type { AIProvider, ChatMessage, ProviderConfig } from './base.js';\nimport {\n SYSTEM_PROMPT_CHAT,\n SYSTEM_PROMPT_EXPLAIN,\n SYSTEM_PROMPT_GENERATE,\n} from './base.js';\n\ninterface OpenAIMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\ninterface OpenAIResponse {\n choices: Array<{ message: { content: string } }>;\n error?: { message: string };\n}\n\nexport class OpenAIProvider implements AIProvider {\n name = 'OpenAI';\n private model: string;\n private apiKey: string;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n if (config.credentials.type === 'api_key') {\n this.apiKey = config.credentials.apiKey;\n } else {\n throw new Error('OpenAI requires API key');\n }\n }\n\n private async call(\n systemPrompt: string,\n userMessage: string,\n ): Promise<string> {\n const messages: OpenAIMessage[] = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userMessage },\n ];\n\n let response: Response;\n try {\n response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: 1024,\n messages,\n }),\n });\n } catch (error) {\n if (isFetchError(error)) {\n throw createNetworkError(error, 'OpenAI');\n }\n throw error;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw createHttpError({\n provider: 'OpenAI',\n model: this.model,\n status: response.status,\n errorText,\n });\n }\n\n const data = (await response.json()) as OpenAIResponse;\n\n if (data.error) {\n throw new Error(`OpenAI API error: ${data.error.message}`);\n }\n\n const content = data.choices[0]?.message?.content;\n if (!content) {\n throw new Error('No response from OpenAI');\n }\n\n return content.trim();\n }\n\n async generateCommand(query: string, context?: string): Promise<string> {\n const userMessage = context\n ? `Context: ${context}\\n\\nTask: ${query}`\n : query;\n return this.call(SYSTEM_PROMPT_GENERATE, userMessage);\n }\n\n async explainCommand(command: string): Promise<string> {\n return this.call(SYSTEM_PROMPT_EXPLAIN, `Explain this command: ${command}`);\n }\n\n async validateCredentials(): Promise<boolean> {\n try {\n const response = await fetch('https://api.openai.com/v1/models', {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async streamChat(\n messages: ChatMessage[],\n onChunk: (chunk: string) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n let response: Response;\n try {\n response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: 4096,\n messages: [\n { role: 'system', content: SYSTEM_PROMPT_CHAT },\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n ],\n stream: true,\n }),\n signal,\n });\n } catch (error) {\n if (isFetchError(error)) {\n throw createNetworkError(error, 'OpenAI');\n }\n throw error;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw createHttpError({\n provider: 'OpenAI',\n model: this.model,\n status: response.status,\n errorText,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6);\n if (jsonStr === '[DONE]') continue;\n\n try {\n const data = JSON.parse(jsonStr) as {\n choices?: Array<{ delta?: { content?: string } }>;\n };\n const content = data.choices?.[0]?.delta?.content;\n if (content) {\n onChunk(content);\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n }\n}\n\n// Latest OpenAI models available via API key (as of Jan 2026)\nexport const OPENAI_MODELS = [\n { value: 'gpt-5.2', label: 'GPT-5.2 (most intelligent)' },\n { value: 'gpt-5.1', label: 'GPT-5.1 (recommended)' },\n { value: 'gpt-5-mini', label: 'GPT-5 Mini (fast)' },\n { value: 'gpt-5-nano', label: 'GPT-5 Nano (fastest)' },\n { value: 'gpt-4.1', label: 'GPT-4.1' },\n { value: 'gpt-4o', label: 'GPT-4o (legacy)' },\n];\n","import {\n createHttpError,\n createNetworkError,\n isFetchError,\n} from '../core/errors.js';\nimport type { AIProvider, ChatMessage, ProviderConfig } from './base.js';\nimport {\n SYSTEM_PROMPT_CHAT,\n SYSTEM_PROMPT_EXPLAIN,\n SYSTEM_PROMPT_GENERATE,\n} from './base.js';\n\ninterface OpenRouterMessage {\n role: 'system' | 'user' | 'assistant';\n content: string;\n}\n\ninterface OpenRouterResponse {\n choices: Array<{ message: { content: string } }>;\n error?: { message: string };\n}\n\nexport class OpenRouterProvider implements AIProvider {\n name = 'OpenRouter';\n private model: string;\n private apiKey: string;\n\n constructor(config: ProviderConfig) {\n this.model = config.model;\n if (config.credentials.type === 'api_key') {\n this.apiKey = config.credentials.apiKey;\n } else {\n throw new Error('OpenRouter requires API key');\n }\n }\n\n private async call(\n systemPrompt: string,\n userMessage: string,\n ): Promise<string> {\n const messages: OpenRouterMessage[] = [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userMessage },\n ];\n\n let response: Response;\n try {\n response = await fetch('https://openrouter.ai/api/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n 'HTTP-Referer': 'https://github.com/bashio',\n 'X-Title': 'Bashio',\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: 1024,\n messages,\n }),\n });\n } catch (error) {\n if (isFetchError(error)) {\n throw createNetworkError(error, 'OpenRouter');\n }\n throw error;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw createHttpError({\n provider: 'OpenRouter',\n model: this.model,\n status: response.status,\n errorText,\n });\n }\n\n const data = (await response.json()) as OpenRouterResponse;\n\n if (data.error) {\n throw new Error(`OpenRouter API error: ${data.error.message}`);\n }\n\n const content = data.choices[0]?.message?.content;\n if (!content) {\n throw new Error('No response from OpenRouter');\n }\n\n return content.trim();\n }\n\n async generateCommand(query: string, context?: string): Promise<string> {\n const userMessage = context\n ? `Context: ${context}\\n\\nTask: ${query}`\n : query;\n return this.call(SYSTEM_PROMPT_GENERATE, userMessage);\n }\n\n async explainCommand(command: string): Promise<string> {\n return this.call(SYSTEM_PROMPT_EXPLAIN, `Explain this command: ${command}`);\n }\n\n async validateCredentials(): Promise<boolean> {\n try {\n const response = await fetch('https://openrouter.ai/api/v1/models', {\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n },\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async streamChat(\n messages: ChatMessage[],\n onChunk: (chunk: string) => void,\n signal?: AbortSignal,\n ): Promise<void> {\n let response: Response;\n try {\n response = await fetch('https://openrouter.ai/api/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n 'HTTP-Referer': 'https://github.com/bashio',\n 'X-Title': 'Bashio',\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: 4096,\n messages: [\n { role: 'system', content: SYSTEM_PROMPT_CHAT },\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n ],\n stream: true,\n }),\n signal,\n });\n } catch (error) {\n if (isFetchError(error)) {\n throw createNetworkError(error, 'OpenRouter');\n }\n throw error;\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n throw createHttpError({\n provider: 'OpenRouter',\n model: this.model,\n status: response.status,\n errorText,\n });\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6);\n if (jsonStr === '[DONE]') continue;\n\n try {\n const data = JSON.parse(jsonStr) as {\n choices?: Array<{ delta?: { content?: string } }>;\n };\n const content = data.choices?.[0]?.delta?.content;\n if (content) {\n onChunk(content);\n }\n } catch {\n // Ignore parse errors\n }\n }\n }\n }\n }\n}\n\nexport const OPENROUTER_MODELS = [\n { value: 'anthropic/claude-sonnet-4', label: 'Claude Sonnet 4' },\n { value: 'anthropic/claude-3.5-sonnet', label: 'Claude 3.5 Sonnet' },\n { value: 'openai/gpt-4o', label: 'GPT-4o' },\n { value: 'google/gemini-pro-1.5', label: 'Gemini Pro 1.5' },\n { value: 'meta-llama/llama-3.1-70b-instruct', label: 'Llama 3.1 70B' },\n];\n","import type { ConfigV2, ProviderName } from '../core/types.js';\nimport type { AIProvider, ProviderConfig } from './base.js';\nimport {\n CHATGPT_SUBSCRIPTION_MODELS,\n ChatGPTSubscriptionProvider,\n} from './chatgpt-subscription.js';\nimport { CLAUDE_MODELS, ClaudeProvider } from './claude.js';\nimport {\n CLAUDE_SUBSCRIPTION_MODELS,\n ClaudeSubscriptionProvider,\n} from './claude-subscription.js';\nimport { COPILOT_MODELS, CopilotProvider } from './copilot.js';\nimport { OLLAMA_RECOMMENDED_MODELS, OllamaProvider } from './ollama.js';\nimport { OPENAI_MODELS, OpenAIProvider } from './openai.js';\nimport { OPENROUTER_MODELS, OpenRouterProvider } from './openrouter.js';\n\nexport function createProvider(config: ConfigV2): AIProvider {\n const activeProvider = config.activeProvider;\n const settings = config.providers[activeProvider];\n\n if (!settings) {\n throw new Error(`Provider ${activeProvider} not configured`);\n }\n\n const providerConfig: ProviderConfig = {\n model: settings.model,\n credentials: settings.credentials,\n };\n\n return createProviderFromType(activeProvider, providerConfig);\n}\n\nfunction createProviderFromType(\n provider: ProviderName,\n config: ProviderConfig,\n): AIProvider {\n switch (provider) {\n case 'claude':\n return new ClaudeProvider(config);\n case 'claude-subscription':\n return new ClaudeSubscriptionProvider(config);\n case 'openai':\n return new OpenAIProvider(config);\n case 'chatgpt-subscription':\n return new ChatGPTSubscriptionProvider(config);\n case 'copilot':\n return new CopilotProvider(config);\n case 'ollama':\n return new OllamaProvider(config);\n case 'openrouter':\n return new OpenRouterProvider(config);\n default:\n throw new Error(`Unknown provider: ${provider}`);\n }\n}\n\nexport {\n CLAUDE_MODELS,\n CLAUDE_SUBSCRIPTION_MODELS,\n OPENAI_MODELS,\n CHATGPT_SUBSCRIPTION_MODELS,\n COPILOT_MODELS,\n OLLAMA_RECOMMENDED_MODELS,\n OPENROUTER_MODELS,\n};\nexport type { AIProvider } from './base.js';\nexport { OllamaProvider } from './ollama.js';\n","import { confirm, input, password, select } from '@inquirer/prompts';\nimport pc from 'picocolors';\nimport {\n CHATGPT_SUBSCRIPTION_MODELS,\n CLAUDE_MODELS,\n CLAUDE_SUBSCRIPTION_MODELS,\n COPILOT_MODELS,\n createProvider,\n OllamaProvider,\n OPENAI_MODELS,\n OPENROUTER_MODELS,\n} from '../providers/index.js';\nimport { accent } from '../utils/colors.js';\nimport { getBashioTheme } from '../utils/inquirerTheme.js';\nimport { logger } from '../utils/logger.js';\nimport { createSpinner } from '../utils/spinner.js';\nimport {\n isProviderConfigured,\n loadConfig,\n saveConfig,\n setProviderConfig,\n} from './config.js';\nimport { validateApiKeyFormat } from './errors.js';\nimport {\n buildChatGPTAuthUrl,\n buildClaudeAuthUrl,\n CHATGPT_OAUTH_CONFIG,\n CLAUDE_OAUTH_CONFIG,\n exchangeChatGPTCode,\n exchangeClaudeCode,\n exchangeGitHubTokenForCopilot,\n generatePKCE,\n parseCopilotToken,\n pollForCopilotAccessToken,\n requestCopilotDeviceCode,\n startCallbackServer,\n} from './oauth.js';\nimport type { ConfigV2, Credentials, ProviderName } from './types.js';\n\n// Provider display names\nexport const PROVIDER_DISPLAY_NAMES: Record<ProviderName, string> = {\n 'claude-subscription': 'Claude Pro/Max',\n 'chatgpt-subscription': 'ChatGPT Plus/Pro',\n copilot: 'GitHub Copilot',\n claude: 'Claude (API Key)',\n openai: 'ChatGPT (API Key)',\n ollama: 'Ollama (Local)',\n openrouter: 'OpenRouter',\n};\n\nasync function openBrowser(url: string): Promise<boolean> {\n try {\n const { exec } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execAsync = promisify(exec);\n\n const platform = process.platform;\n const command =\n platform === 'darwin'\n ? `open \"${url}\"`\n : platform === 'win32'\n ? `start \"\" \"${url}\"`\n : `xdg-open \"${url}\"`;\n\n await execAsync(command);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction showWelcomeBanner(): void {\n const dim = pc.dim;\n const width = 58;\n const accentColor = accent;\n\n const ansiRegex = new RegExp(\n `${String.fromCharCode(27)}\\\\[[0-9;]*[a-zA-Z]`,\n 'g',\n );\n const stripAnsi = (str: string): string => str.replace(ansiRegex, '');\n\n const visibleLength = (str: string): number => stripAnsi(str).length;\n\n const pad = (text: string, len: number): string => {\n const padding = len - visibleLength(text);\n return text + ' '.repeat(Math.max(0, padding));\n };\n\n const line = (content: string): string =>\n accentColor(' │') + pad(content, width) + accentColor('│');\n\n console.log();\n console.log(accentColor(` ┌${'─'.repeat(width)}┐`));\n console.log(line(''));\n console.log(\n line(\n ` ${pc.bold(pc.white('██████╗ █████╗ ███████╗██╗ ██╗██╗ ██████╗'))}`,\n ),\n );\n console.log(\n line(\n ` ${pc.bold(pc.white('██╔══██╗██╔══██╗██╔════╝██║ ██║██║██╔═══██╗'))}`,\n ),\n );\n console.log(\n line(\n ` ${pc.bold(pc.white('██████╔╝███████║███████╗███████║██║██║ ██║'))}`,\n ),\n );\n console.log(\n line(\n ` ${pc.bold(pc.white('██╔══██╗██╔══██║╚════██║██╔══██║██║██║ ██║'))}`,\n ),\n );\n console.log(\n line(\n ` ${pc.bold(pc.white('██████╔╝██║ ██║███████║██║ ██║██║╚██████╔╝'))}`,\n ),\n );\n console.log(\n line(\n ` ${pc.bold(pc.white('╚═════╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═════╝'))}`,\n ),\n );\n console.log(line(''));\n console.log(line(dim(' Natural language to shell commands.')));\n console.log(line(dim(' Stop Googling, start doing.')));\n console.log(line(''));\n console.log(accentColor(` └${'─'.repeat(width)}┘`));\n console.log();\n}\n\nexport async function runAuthSetup(showBanner = true): Promise<boolean> {\n if (showBanner) {\n showWelcomeBanner();\n }\n console.log(pc.bold(' Bashio Setup\\n'));\n\n const existingConfig = loadConfig();\n\n const provider = await select<ProviderName>({\n message: 'Select your AI provider:',\n choices: [\n {\n value: 'claude-subscription' as const,\n name: 'Claude Pro/Max (Subscription)',\n description: 'Use your existing Claude subscription',\n },\n {\n value: 'chatgpt-subscription' as const,\n name: 'ChatGPT Plus/Pro (Subscription)',\n description: 'Use your existing ChatGPT subscription',\n },\n {\n value: 'copilot' as const,\n name: 'GitHub Copilot',\n description: 'Use your GitHub Copilot subscription',\n },\n {\n value: 'claude' as const,\n name: 'Claude (API Key)',\n description: 'Use Anthropic API key',\n },\n {\n value: 'openai' as const,\n name: 'ChatGPT (API Key)',\n description: 'Use OpenAI API key',\n },\n {\n value: 'ollama' as const,\n name: 'Ollama (Local)',\n description: 'Free, runs on your machine',\n },\n {\n value: 'openrouter' as const,\n name: 'OpenRouter',\n description: 'Pay per use, multiple models',\n },\n ],\n theme: getBashioTheme(),\n });\n\n // Check if provider already configured\n if (existingConfig && isProviderConfigured(existingConfig, provider)) {\n const currentModel = existingConfig.providers[provider]?.model;\n console.log();\n console.log(\n pc.yellow(` ${PROVIDER_DISPLAY_NAMES[provider]} is already configured.`),\n );\n console.log(pc.dim(` Current model: ${currentModel}`));\n console.log();\n\n const action = await select({\n message: 'What would you like to do?',\n choices: [\n { value: 'reauth', name: 'Update credentials (re-authenticate)' },\n { value: 'cancel', name: 'Cancel' },\n ],\n theme: getBashioTheme(),\n });\n\n if (action === 'cancel') {\n console.log(pc.dim('\\n Cancelled.\\n'));\n return false;\n }\n }\n\n let credentials: Credentials;\n let model: string;\n\n switch (provider) {\n case 'claude-subscription': {\n console.log();\n console.log(\n pc.yellow(\n ' Note: This uses your Claude Pro/Max subscription via OAuth.',\n ),\n );\n console.log(\n pc.dim(\n ' Your credentials are stored locally and refreshed automatically.',\n ),\n );\n console.log();\n\n const tokens = await performClaudeOAuth();\n if (!tokens) {\n return false;\n }\n\n credentials = {\n type: 'claude_subscription',\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken,\n expiresAt: tokens.expiresAt,\n email: tokens.email,\n };\n\n model = await select({\n message: 'Select model:',\n choices: CLAUDE_SUBSCRIPTION_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n theme: getBashioTheme(),\n });\n break;\n }\n\n case 'chatgpt-subscription': {\n console.log();\n console.log(\n pc.yellow(\n ' Note: This uses your ChatGPT Plus/Pro subscription via OAuth.',\n ),\n );\n console.log(\n pc.red(' WARNING: This is EXPERIMENTAL and uses an unofficial API.'),\n );\n console.log(\n pc.dim(' The API may change or stop working without notice.'),\n );\n console.log(\n pc.dim(' For stable usage, consider using an API key instead.'),\n );\n console.log();\n\n const tokens = await performChatGPTOAuth();\n if (!tokens) {\n return false;\n }\n\n credentials = {\n type: 'chatgpt_subscription',\n accessToken: tokens.accessToken,\n refreshToken: tokens.refreshToken || undefined,\n expiresAt: tokens.expiresAt || undefined,\n accountId: tokens.accountId,\n };\n\n model = await select({\n message: 'Select model:',\n choices: CHATGPT_SUBSCRIPTION_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n theme: getBashioTheme(),\n });\n break;\n }\n\n case 'copilot': {\n console.log();\n console.log(\n pc.yellow(' Note: This uses your GitHub Copilot subscription.'),\n );\n console.log(\n pc.dim(' You need an active GitHub Copilot subscription to use this.'),\n );\n console.log();\n\n const copilotResult = await performCopilotDeviceFlow();\n if (!copilotResult) {\n return false;\n }\n\n credentials = {\n type: 'copilot',\n githubToken: copilotResult.githubToken,\n copilotToken: copilotResult.copilotToken,\n copilotTokenExpiresAt: copilotResult.copilotTokenExpiresAt,\n apiEndpoint: copilotResult.apiEndpoint,\n };\n\n model = await select({\n message: 'Select model:',\n choices: COPILOT_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n theme: getBashioTheme(),\n });\n break;\n }\n\n case 'claude': {\n let apiKey = await password({\n message: 'Enter your Anthropic API key:',\n mask: '*',\n theme: getBashioTheme(),\n });\n\n let keyWarning = validateApiKeyFormat(apiKey, 'claude');\n while (keyWarning) {\n console.log(pc.yellow(`\\n ${keyWarning}`));\n const continueAnyway = await confirm({\n message: 'Continue anyway?',\n default: false,\n theme: getBashioTheme(),\n });\n\n if (continueAnyway) {\n break;\n }\n\n apiKey = await password({\n message: 'Enter your Anthropic API key:',\n mask: '*',\n theme: getBashioTheme(),\n });\n keyWarning = validateApiKeyFormat(apiKey, 'claude');\n }\n\n credentials = { type: 'api_key', apiKey };\n\n model = await select({\n message: 'Select model:',\n choices: CLAUDE_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n theme: getBashioTheme(),\n });\n break;\n }\n\n case 'openai': {\n let apiKey = await password({\n message: 'Enter your OpenAI API key:',\n mask: '*',\n theme: getBashioTheme(),\n });\n\n let keyWarning = validateApiKeyFormat(apiKey, 'openai');\n while (keyWarning) {\n console.log(pc.yellow(`\\n ${keyWarning}`));\n const continueAnyway = await confirm({\n message: 'Continue anyway?',\n default: false,\n theme: getBashioTheme(),\n });\n\n if (continueAnyway) {\n break;\n }\n\n apiKey = await password({\n message: 'Enter your OpenAI API key:',\n mask: '*',\n theme: getBashioTheme(),\n });\n keyWarning = validateApiKeyFormat(apiKey, 'openai');\n }\n\n credentials = { type: 'api_key', apiKey };\n\n model = await select({\n message: 'Select model:',\n choices: OPENAI_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n theme: getBashioTheme(),\n });\n break;\n }\n\n case 'ollama': {\n const host = await input({\n message: 'Ollama host:',\n default: 'http://localhost:11434',\n theme: getBashioTheme(),\n });\n credentials = { type: 'local', host };\n\n const spinner = createSpinner('Checking Ollama connection...').start();\n const availableModels = await OllamaProvider.getAvailableModels(host);\n\n if (availableModels.length === 0) {\n spinner.fail('Could not connect to Ollama or no models installed');\n console.log(pc.yellow('\\nMake sure Ollama is running: ollama serve'));\n console.log(pc.yellow('Install a model: ollama pull llama3.2\\n'));\n return false;\n }\n\n spinner.succeed(`Found ${availableModels.length} models`);\n\n const modelChoices = availableModels.map((m) => ({\n value: m,\n name: m,\n }));\n\n model = await select({\n message: 'Select model:',\n choices: modelChoices,\n theme: getBashioTheme(),\n });\n break;\n }\n\n case 'openrouter': {\n let apiKey = await password({\n message: 'Enter your OpenRouter API key:',\n mask: '*',\n theme: getBashioTheme(),\n });\n\n let keyWarning = validateApiKeyFormat(apiKey, 'openrouter');\n while (keyWarning) {\n console.log(pc.yellow(`\\n ${keyWarning}`));\n const continueAnyway = await confirm({\n message: 'Continue anyway?',\n default: false,\n theme: getBashioTheme(),\n });\n\n if (continueAnyway) {\n break;\n }\n\n apiKey = await password({\n message: 'Enter your OpenRouter API key:',\n mask: '*',\n theme: getBashioTheme(),\n });\n keyWarning = validateApiKeyFormat(apiKey, 'openrouter');\n }\n\n credentials = { type: 'api_key', apiKey };\n\n model = await select({\n message: 'Select model:',\n choices: OPENROUTER_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n theme: getBashioTheme(),\n });\n break;\n }\n\n default:\n throw new Error(`Unknown provider: ${provider}`);\n }\n\n const providerSettings = { model, credentials };\n\n // Build config for validation\n const tempConfig: ConfigV2 = {\n version: 2,\n activeProvider: provider,\n providers: { [provider]: providerSettings },\n settings: existingConfig?.settings || {\n confirmBeforeExecute: true,\n historyEnabled: true,\n historyRetentionDays: 30,\n historyMaxEntries: 2000,\n autoConfirmShortcuts: false,\n theme: 'bashio',\n },\n };\n\n const spinner = createSpinner('Validating credentials...').start();\n\n try {\n const providerInstance = createProvider(tempConfig);\n const valid = await providerInstance.validateCredentials();\n\n if (!valid) {\n spinner.fail('Invalid credentials');\n return false;\n }\n\n spinner.succeed('Credentials valid');\n } catch (err) {\n spinner.fail(\n `Validation failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n );\n return false;\n }\n\n // Merge with existing config or create new\n const finalConfig = existingConfig\n ? setProviderConfig(existingConfig, provider, providerSettings, true)\n : tempConfig;\n\n saveConfig(finalConfig);\n\n console.log();\n logger.success('Configuration saved!');\n console.log(pc.gray(` Provider: ${PROVIDER_DISPLAY_NAMES[provider]}`));\n console.log(pc.gray(` Model: ${model}`));\n console.log();\n\n return true;\n}\n\ninterface OAuthResult {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n email?: string;\n accountId?: string; // ChatGPT account ID\n}\n\nasync function performClaudeOAuth(): Promise<OAuthResult | null> {\n const authMethod = await select({\n message: 'How would you like to authenticate?',\n choices: [\n {\n value: 'browser' as const,\n name: 'Open browser automatically',\n description: 'Recommended - opens browser and waits for callback',\n },\n {\n value: 'manual' as const,\n name: 'Manual URL copy/paste',\n description: 'Copy URL to browser, then paste the callback URL',\n },\n ],\n theme: getBashioTheme(),\n });\n\n const pkce = generatePKCE();\n const authUrl = buildClaudeAuthUrl(pkce);\n\n if (authMethod === 'browser') {\n return performBrowserOAuth(\n 'Claude',\n authUrl,\n pkce,\n CLAUDE_OAUTH_CONFIG.callbackPort,\n async (code: string) =>\n exchangeClaudeCode(code, pkce.codeVerifier, pkce.state),\n );\n }\n return performManualOAuth('Claude', authUrl, pkce, async (code: string) =>\n exchangeClaudeCode(code, pkce.codeVerifier, pkce.state),\n );\n}\n\nasync function performChatGPTOAuth(): Promise<OAuthResult | null> {\n const authMethod = await select({\n message: 'How would you like to authenticate?',\n choices: [\n {\n value: 'browser' as const,\n name: 'Open browser automatically',\n description: 'Recommended - opens browser and waits for callback',\n },\n {\n value: 'manual' as const,\n name: 'Manual URL copy/paste',\n description: 'Copy URL to browser, then paste the callback URL',\n },\n ],\n theme: getBashioTheme(),\n });\n\n const pkce = generatePKCE();\n const authUrl = buildChatGPTAuthUrl(pkce);\n\n if (authMethod === 'browser') {\n return performBrowserOAuth(\n 'ChatGPT',\n authUrl,\n pkce,\n CHATGPT_OAUTH_CONFIG.callbackPort,\n async (code: string) => exchangeChatGPTCode(code, pkce.codeVerifier),\n );\n }\n return performManualOAuth('ChatGPT', authUrl, pkce, async (code: string) =>\n exchangeChatGPTCode(code, pkce.codeVerifier),\n );\n}\n\nasync function performBrowserOAuth(\n providerName: string,\n authUrl: string,\n pkce: { state: string },\n port: number,\n exchangeCode: (code: string) => Promise<OAuthResult>,\n): Promise<OAuthResult | null> {\n console.log();\n console.log(pc.dim(' Starting local callback server...'));\n\n const serverPromise = startCallbackServer(port, pkce.state);\n\n const browserOpened = await openBrowser(authUrl);\n\n if (browserOpened) {\n console.log(accent(` Browser opened. Please log in to ${providerName}.`));\n } else {\n console.log(pc.yellow(' Could not open browser automatically.'));\n console.log(pc.dim(' Please open this URL manually:'));\n console.log();\n console.log(` ${pc.yellow(authUrl)}`);\n }\n\n console.log();\n console.log(pc.dim(' Waiting for authentication (5 minute timeout)...'));\n\n try {\n const { code } = await serverPromise;\n\n const spinner = createSpinner('Exchanging authorization code...').start();\n\n try {\n const tokens = await exchangeCode(code);\n spinner.succeed('Authentication successful!');\n return tokens;\n } catch (error) {\n spinner.fail(\n `Token exchange failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n return null;\n }\n } catch (error) {\n logger.error(\n `Authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n return null;\n }\n}\n\nasync function performManualOAuth(\n providerName: string,\n authUrl: string,\n pkce: { codeVerifier: string; state: string },\n exchangeCode: (code: string) => Promise<OAuthResult>,\n): Promise<OAuthResult | null> {\n console.log();\n console.log(\n pc.dim(\n ` Open this URL in your browser to authenticate with ${providerName}:`,\n ),\n );\n console.log();\n console.log(` ${pc.cyan(authUrl)}`);\n console.log();\n console.log(\n pc.dim(' After logging in, you will be redirected to a localhost URL.'),\n );\n console.log(pc.dim(' Copy the full redirect URL and paste it below.'));\n console.log();\n\n const callbackUrl = await input({\n message: 'Paste the callback URL here:',\n theme: getBashioTheme(),\n });\n\n try {\n const url = new URL(callbackUrl);\n const code = url.searchParams.get('code');\n const state = url.searchParams.get('state');\n const error = url.searchParams.get('error');\n\n if (error) {\n logger.error(`OAuth error: ${error}`);\n return null;\n }\n\n if (!code) {\n logger.error('No authorization code found in URL');\n return null;\n }\n\n if (state !== pkce.state) {\n logger.error('State mismatch - possible security issue');\n return null;\n }\n\n const spinner = createSpinner('Exchanging authorization code...').start();\n\n try {\n const tokens = await exchangeCode(code);\n spinner.succeed('Authentication successful!');\n return tokens;\n } catch (err) {\n spinner.fail(\n `Token exchange failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n );\n return null;\n }\n } catch {\n logger.error('Invalid URL format');\n return null;\n }\n}\n\ninterface CopilotAuthResult {\n githubToken: string;\n copilotToken: string;\n copilotTokenExpiresAt: number;\n apiEndpoint: string;\n}\n\nasync function performCopilotDeviceFlow(): Promise<CopilotAuthResult | null> {\n try {\n const spinner = createSpinner('Requesting device code...').start();\n const deviceCode = await requestCopilotDeviceCode();\n spinner.stop();\n\n console.log();\n console.log(pc.bold(' To authenticate with GitHub Copilot:'));\n console.log();\n console.log(\n ` 1. Visit: ${pc.yellow(pc.underline(deviceCode.verification_uri))}`,\n );\n console.log(` 2. Enter code: ${pc.bold(accent(deviceCode.user_code))}`);\n console.log();\n\n const browserOpened = await openBrowser(deviceCode.verification_uri);\n if (browserOpened) {\n console.log(pc.dim(' Browser opened automatically.'));\n }\n\n console.log(pc.dim(' Waiting for authorization...'));\n console.log();\n\n const expiresAt = Date.now() + deviceCode.expires_in * 1000;\n const intervalMs = (deviceCode.interval || 5) * 1000;\n\n const githubToken = await pollForCopilotAccessToken(\n deviceCode.device_code,\n intervalMs,\n expiresAt,\n );\n\n const exchangeSpinner = createSpinner(\n 'Getting Copilot access token...',\n ).start();\n\n try {\n const copilotTokenData = await exchangeGitHubTokenForCopilot(githubToken);\n const parsed = parseCopilotToken(copilotTokenData.token);\n\n exchangeSpinner.succeed('Authentication successful!');\n\n return {\n githubToken,\n copilotToken: copilotTokenData.token,\n copilotTokenExpiresAt: parsed.expiresAt,\n apiEndpoint: parsed.apiEndpoint,\n };\n } catch (error) {\n exchangeSpinner.fail(\n `Failed to get Copilot token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n return null;\n }\n } catch (error) {\n logger.error(\n `GitHub authentication failed: ${error instanceof Error ? error.message : 'Unknown error'}`,\n );\n return null;\n }\n}\n","import chalk from 'chalk';\n\n// Bashio brand orange color (deprecated - use accent from cliTheme.ts)\nexport const orange = chalk.hex('#eea154');\n\n// Re-export accent for convenience\nexport { accent, getCliTheme } from './cliTheme.js';\n","import chalk from 'chalk';\nimport { getThemeByName, type Theme } from '../chat/utils/themes.js';\nimport { loadConfig } from '../core/config.js';\n\nexport interface CliTheme {\n accent: (text: string) => string;\n textPrimary: (text: string) => string;\n textDim: (text: string) => string;\n raw: Theme;\n}\n\nlet cachedTheme: CliTheme | null = null;\n\nexport function getCliTheme(): CliTheme {\n if (cachedTheme) {\n return cachedTheme;\n }\n\n const config = loadConfig();\n const themeName = config?.settings?.theme ?? 'bashio';\n const theme = getThemeByName(themeName);\n\n cachedTheme = {\n accent: chalk.hex(theme.accent),\n textPrimary:\n theme.textPrimary === 'white'\n ? chalk.white\n : chalk.hex(theme.textPrimary),\n textDim: theme.textDim === 'gray' ? chalk.gray : chalk.hex(theme.textDim),\n raw: theme,\n };\n\n return cachedTheme;\n}\n\nexport function accent(text: string): string {\n return getCliTheme().accent(text);\n}\n\nexport function clearThemeCache(): void {\n cachedTheme = null;\n}\n","import chalk from 'chalk';\nimport { accent } from './colors.js';\n\nexport function getBashioTheme() {\n const accentColor = accent;\n return {\n prefix: {\n idle: accentColor('?'),\n done: accentColor('✔'),\n },\n style: {\n answer: (text: string) => accentColor(text),\n highlight: (text: string) => accentColor(text),\n description: (text: string) => chalk.dim(text),\n },\n icon: {\n cursor: accentColor('❯'),\n },\n };\n}\n\nexport const bashioTheme = getBashioTheme();\n","import pc from 'picocolors';\nimport { accent } from './colors.js';\n\nexport const logger = {\n info: (msg: string) => console.log(pc.blue('i'), msg),\n success: (msg: string) => console.log(accent('✓'), msg),\n warn: (msg: string) => console.log(accent('⚠'), msg),\n error: (msg: string) => console.log(pc.red('✗'), msg),\n\n command: (cmd: string) => {\n console.log(pc.gray('>'), accent('Will run:'), pc.white(cmd));\n },\n\n output: (text: string) => {\n console.log(pc.gray('─'.repeat(50)));\n console.log(text);\n console.log(pc.gray('─'.repeat(50)));\n },\n\n exitCode: (code: number) => {\n if (code === 0) {\n console.log(accent('✓'), pc.gray(`Done (exit code: ${code})`));\n } else {\n console.log(pc.red('✗'), pc.gray(`Failed (exit code: ${code})`));\n }\n },\n\n box: (title: string, content: string) => {\n const lines = content.split('\\n');\n const maxLen = Math.max(title.length, ...lines.map((l) => l.length));\n const border = '─'.repeat(maxLen + 4);\n\n console.log(pc.gray(`┌${border}┐`));\n console.log(pc.gray('│'), pc.bold(title.padEnd(maxLen + 2)), pc.gray('│'));\n console.log(pc.gray(`├${border}┤`));\n for (const line of lines) {\n console.log(pc.gray('│'), line.padEnd(maxLen + 2), pc.gray('│'));\n }\n console.log(pc.gray(`└${border}┘`));\n },\n};\n","import ora, { type Ora } from 'ora';\nimport { accent } from './colors.js';\n\nexport function createSpinner(text: string): Ora {\n const accentColor = accent;\n const themedSpinner = {\n interval: 80,\n frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'].map((f) =>\n accentColor(f),\n ),\n };\n\n return ora({\n text: accentColor(text),\n spinner: themedSpinner,\n });\n}\n","import { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst execAsync = promisify(exec);\n\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n // macOS\n await execAsync(`echo ${JSON.stringify(text)} | pbcopy`);\n } else if (platform === 'linux') {\n // Linux (requires xclip or xsel)\n try {\n await execAsync(\n `echo ${JSON.stringify(text)} | xclip -selection clipboard`,\n );\n } catch {\n await execAsync(\n `echo ${JSON.stringify(text)} | xsel --clipboard --input`,\n );\n }\n } else if (platform === 'win32') {\n // Windows\n await execAsync(`echo ${text} | clip`);\n } else {\n return false;\n }\n\n return true;\n } catch {\n return false;\n }\n}\n"],"mappings":"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","names":["URL","pc","chalk","chalk","chalk","chalk","exec","promisify","execAsync","pc","spinner"]}
|