bashio 0.7.0 → 1.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/core/config.ts","../src/core/types.ts","../src/core/database.ts","../src/core/history.ts","../src/cli/commands/AddShortcutCommand.ts","../src/core/shortcuts.ts","../src/utils/logger.ts","../src/cli/commands/AuthCommand.ts","../src/core/auth.ts","../src/providers/base.ts","../src/providers/claude.ts","../src/providers/ollama.ts","../src/providers/openai.ts","../src/providers/openrouter.ts","../src/providers/index.ts","../src/utils/spinner.ts","../src/cli/commands/ClearHistoryCommand.ts","../src/utils/danger-ui.ts","../src/cli/commands/ConfigCommand.ts","../src/cli/commands/DefaultCommand.ts","../src/core/executor.ts","../src/utils/clipboard.ts","../src/utils/danger.ts","../src/cli/commands/EditShortcutsCommand.ts","../src/cli/commands/HistoryCommand.ts","../src/utils/table.ts","../src/cli/commands/ModelCommand.ts","../src/cli/commands/RemoveShortcutCommand.ts","../src/cli/commands/ShortcutsCommand.ts","../src/cli/commands/StatsCommand.ts","../src/cli/commands/SuggestShortcutsCommand.ts","../src/core/learning.ts","../src/index.ts"],"sourcesContent":["import { Builtins, Cli } from 'clipanion';\nimport pc from 'picocolors';\nimport updateNotifier from 'update-notifier';\nimport { loadConfig } from '../core/config.js';\nimport { initDatabase } from '../core/database.js';\nimport { cleanupHistory, shouldRunCleanup } from '../core/history.js';\n\nconst pkg = {\n name: 'bashio',\n version: '0.7.0',\n};\n\n// Check for updates (runs in background, cached for 1 day)\nconst notifier = updateNotifier({\n pkg,\n updateCheckInterval: 1000 * 60 * 60 * 24, // 1 day\n});\n\n// Custom update notification matching welcome banner theme\nif (notifier.update) {\n const { current, latest } = notifier.update;\n const cyan = pc.cyan;\n const width = 44;\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 const visibleLength = (str: string): number => stripAnsi(str).length;\n const pad = (text: string, len: number): string => {\n const padding = len - visibleLength(text);\n return text + ' '.repeat(Math.max(0, padding));\n };\n const line = (content: string): string =>\n cyan(' │') + pad(content, width) + cyan('│');\n\n console.log();\n console.log(cyan(` ┌${'─'.repeat(width)}┐`));\n console.log(line(''));\n console.log(line(pc.bold(' Bashio Update Available!')));\n console.log(line(''));\n console.log(line(` ${pc.dim(current)} → ${pc.green(pc.bold(latest))}`));\n console.log(line(''));\n console.log(line(` Run: ${pc.cyan('npm i -g bashio@latest')}`));\n console.log(line(''));\n console.log(cyan(` └${'─'.repeat(width)}┘`));\n console.log();\n}\n\nimport { AddShortcutCommand } from './commands/AddShortcutCommand.js';\nimport { AuthCommand } from './commands/AuthCommand.js';\nimport { ClearHistoryCommand } from './commands/ClearHistoryCommand.js';\nimport { ConfigCommand } from './commands/ConfigCommand.js';\nimport { DefaultCommand } from './commands/DefaultCommand.js';\nimport { EditShortcutsCommand } from './commands/EditShortcutsCommand.js';\nimport { HistoryCommand } from './commands/HistoryCommand.js';\nimport { ModelCommand } from './commands/ModelCommand.js';\nimport { RemoveShortcutCommand } from './commands/RemoveShortcutCommand.js';\nimport { ShortcutsCommand } from './commands/ShortcutsCommand.js';\nimport { StatsCommand } from './commands/StatsCommand.js';\nimport { SuggestShortcutsCommand } from './commands/SuggestShortcutsCommand.js';\n\n// Initialize database on startup\ninitDatabase();\n\n// Run cleanup if needed (once per day)\nif (shouldRunCleanup()) {\n const config = loadConfig();\n const retentionDays = config?.settings?.historyRetentionDays ?? 30;\n const maxEntries = config?.settings?.historyMaxEntries ?? 2000;\n cleanupHistory({ retentionDays, maxEntries });\n}\n\nconst cli = new Cli({\n binaryLabel: 'Bashio',\n binaryName: 'b',\n binaryVersion: pkg.version,\n});\n\ncli.register(DefaultCommand);\ncli.register(AuthCommand);\ncli.register(ConfigCommand);\ncli.register(ModelCommand);\ncli.register(ShortcutsCommand);\ncli.register(AddShortcutCommand);\ncli.register(RemoveShortcutCommand);\ncli.register(EditShortcutsCommand);\ncli.register(HistoryCommand);\ncli.register(StatsCommand);\ncli.register(ClearHistoryCommand);\ncli.register(SuggestShortcutsCommand);\ncli.register(Builtins.HelpCommand);\ncli.register(Builtins.VersionCommand);\n\nexport { cli };\n","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 { Config } 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\nexport function loadConfig(): Config | 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 return Config.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function saveConfig(config: Config): 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","import { z } from 'zod';\n\nexport const ProviderName = z.enum([\n 'claude',\n 'openai',\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 Credentials = z.discriminatedUnion('type', [\n SessionCredentials,\n ApiKeyCredentials,\n LocalCredentials,\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});\nexport type Settings = z.infer<typeof Settings>;\n\nexport const Config = z.object({\n version: z.number().default(1),\n provider: ProviderName,\n model: z.string(),\n credentials: Credentials,\n settings: Settings.optional(),\n});\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","import { chmodSync, existsSync } from 'node:fs';\nimport Database from 'better-sqlite3';\nimport { ensureConfigDir, getConfigDir } from './config.js';\n\nconst DB_PATH = `${getConfigDir()}/history.db`;\n\nlet db: Database.Database | null = null;\n\nconst SCHEMA = `\n-- History table: stores recent command history (auto-cleaned based on retention)\nCREATE TABLE IF NOT EXISTS history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n query TEXT NOT NULL,\n command TEXT NOT NULL,\n source TEXT NOT NULL CHECK(source IN ('ai', 'shortcut')),\n working_directory TEXT NOT NULL,\n executed INTEGER DEFAULT 0,\n exit_code INTEGER,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Query stats table: aggregated stats (never deleted, stays tiny)\n-- Keyed by command to handle query variations (typos, synonyms, different phrasings)\nCREATE TABLE IF NOT EXISTS query_stats (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n command TEXT UNIQUE NOT NULL,\n source TEXT NOT NULL CHECK(source IN ('ai', 'shortcut')),\n use_count INTEGER DEFAULT 1,\n success_count INTEGER DEFAULT 0,\n suggested INTEGER DEFAULT 0,\n first_used TEXT NOT NULL,\n last_used TEXT NOT NULL\n);\n\n-- Metadata table for DB version and settings\nCREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- Indexes for performance\nCREATE INDEX IF NOT EXISTS idx_history_created ON history(created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_history_query ON history(query);\nCREATE INDEX IF NOT EXISTS idx_history_working_dir ON history(working_directory);\nCREATE INDEX IF NOT EXISTS idx_stats_use_count ON query_stats(use_count DESC);\n\n-- Initial metadata\nINSERT OR IGNORE INTO metadata (key, value) VALUES ('db_version', '1');\nINSERT OR IGNORE INTO metadata (key, value) VALUES ('last_cleanup', '0');\n`;\n\nexport function initDatabase(): Database.Database {\n if (db) {\n return db;\n }\n\n ensureConfigDir();\n\n const isNew = !existsSync(DB_PATH);\n\n db = new Database(DB_PATH);\n\n // Set secure file permissions (owner read/write only)\n if (isNew) {\n chmodSync(DB_PATH, 0o600);\n }\n\n // Enable WAL mode for better performance\n db.pragma('journal_mode = WAL');\n\n // Create schema\n db.exec(SCHEMA);\n\n return db;\n}\n\nexport function getDatabase(): Database.Database {\n if (!db) {\n return initDatabase();\n }\n return db;\n}\n\nexport function closeDatabase(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n\nexport function getMetadata(key: string): string | null {\n const database = getDatabase();\n const row = database\n .prepare('SELECT value FROM metadata WHERE key = ?')\n .get(key) as { value: string } | undefined;\n return row?.value ?? null;\n}\n\nexport function setMetadata(key: string, value: string): void {\n const database = getDatabase();\n database\n .prepare('INSERT OR REPLACE INTO metadata (key, value) VALUES (?, ?)')\n .run(key, value);\n}\n\nexport function getDatabasePath(): string {\n return DB_PATH;\n}\n","import { getDatabase, getMetadata, setMetadata } from './database.js';\nimport type { HistoryEntry, HistoryStats } from './types.js';\n\ninterface HistoryRow {\n id: number;\n query: string;\n command: string;\n source: string;\n working_directory: string;\n executed: number;\n exit_code: number | null;\n created_at: string;\n}\n\ninterface CountResult {\n count: number;\n}\n\ninterface TopCommandRow {\n command: string;\n use_count: number;\n source: string;\n}\n\nfunction rowToHistoryEntry(row: HistoryRow): HistoryEntry {\n return {\n id: row.id,\n query: row.query,\n command: row.command,\n source: row.source as 'ai' | 'shortcut',\n workingDirectory: row.working_directory,\n executed: row.executed,\n exitCode: row.exit_code,\n createdAt: row.created_at,\n };\n}\n\nexport function recordCommand(data: {\n query: string;\n command: string;\n source: 'ai' | 'shortcut';\n workingDirectory?: string;\n}): number {\n const db = getDatabase();\n const now = new Date().toISOString();\n const workingDir = data.workingDirectory || process.cwd();\n\n // Insert into history table\n const historyResult = db\n .prepare(\n `INSERT INTO history (query, command, source, working_directory, executed, created_at) \n VALUES (?, ?, ?, ?, 0, ?)`,\n )\n .run(data.query, data.command, data.source, workingDir, now);\n\n // Update or insert into query_stats table (keyed by COMMAND, not query)\n const existingStats = db\n .prepare('SELECT id FROM query_stats WHERE command = ?')\n .get(data.command) as { id: number } | undefined;\n\n if (existingStats) {\n // Command already exists, just increment use_count\n db.prepare(\n `UPDATE query_stats \n SET use_count = use_count + 1, \n last_used = ?\n WHERE command = ?`,\n ).run(now, data.command);\n } else {\n // New command, insert into stats\n db.prepare(\n `INSERT INTO query_stats (command, source, use_count, success_count, suggested, first_used, last_used)\n VALUES (?, ?, 1, 0, 0, ?, ?)`,\n ).run(data.command, data.source, now, now);\n }\n\n return historyResult.lastInsertRowid as number;\n}\n\nexport function markExecuted(historyId: number, exitCode: number): void {\n const db = getDatabase();\n\n // Update history entry\n db.prepare('UPDATE history SET executed = 1, exit_code = ? WHERE id = ?').run(\n exitCode,\n historyId,\n );\n\n // Get the command to update query_stats\n const historyRow = db\n .prepare('SELECT command FROM history WHERE id = ?')\n .get(historyId) as { command: string } | undefined;\n\n if (historyRow && exitCode === 0) {\n db.prepare(\n 'UPDATE query_stats SET success_count = success_count + 1 WHERE command = ?',\n ).run(historyRow.command);\n }\n}\n\nexport function getRecentHistory(limit = 20): HistoryEntry[] {\n const db = getDatabase();\n const rows = db\n .prepare('SELECT * FROM history ORDER BY created_at DESC LIMIT ?')\n .all(limit) as HistoryRow[];\n\n return rows.map(rowToHistoryEntry);\n}\n\nexport function searchHistory(searchTerm: string, limit = 20): HistoryEntry[] {\n const db = getDatabase();\n const pattern = `%${searchTerm}%`;\n const rows = db\n .prepare(\n `SELECT * FROM history \n WHERE query LIKE ? OR command LIKE ?\n ORDER BY created_at DESC \n LIMIT ?`,\n )\n .all(pattern, pattern, limit) as HistoryRow[];\n\n return rows.map(rowToHistoryEntry);\n}\n\nexport function getHistoryByDirectory(\n directory: string,\n limit = 20,\n): HistoryEntry[] {\n const db = getDatabase();\n const rows = db\n .prepare(\n `SELECT * FROM history \n WHERE working_directory = ?\n ORDER BY created_at DESC \n LIMIT ?`,\n )\n .all(directory, limit) as HistoryRow[];\n\n return rows.map(rowToHistoryEntry);\n}\n\nexport function getStats(): HistoryStats {\n const db = getDatabase();\n\n const totalResult = db\n .prepare('SELECT COUNT(*) as count FROM history')\n .get() as CountResult;\n\n const todayResult = db\n .prepare(\n `SELECT COUNT(*) as count FROM history \n WHERE date(created_at) = date('now')`,\n )\n .get() as CountResult;\n\n const thisWeekResult = db\n .prepare(\n `SELECT COUNT(*) as count FROM history \n WHERE created_at >= datetime('now', '-7 days')`,\n )\n .get() as CountResult;\n\n const executedResult = db\n .prepare('SELECT COUNT(*) as count FROM history WHERE executed = 1')\n .get() as CountResult;\n\n const aiResult = db\n .prepare(\"SELECT COUNT(*) as count FROM history WHERE source = 'ai'\")\n .get() as CountResult;\n\n const shortcutResult = db\n .prepare(\"SELECT COUNT(*) as count FROM history WHERE source = 'shortcut'\")\n .get() as CountResult;\n\n const topCommands = db\n .prepare(\n `SELECT command, use_count, source FROM query_stats \n ORDER BY use_count DESC \n LIMIT 5`,\n )\n .all() as TopCommandRow[];\n\n const total = totalResult.count;\n const executed = executedResult.count;\n\n return {\n totalCommands: total,\n todayCommands: todayResult.count,\n thisWeekCommands: thisWeekResult.count,\n totalExecuted: executed,\n executionRate: total > 0 ? Math.round((executed / total) * 100) : 0,\n aiCount: aiResult.count,\n shortcutCount: shortcutResult.count,\n topQueries: topCommands.map((c) => ({\n query: c.command,\n useCount: c.use_count,\n source: c.source,\n })),\n };\n}\n\nexport function cleanupHistory(config: {\n retentionDays: number;\n maxEntries: number;\n}): number {\n const db = getDatabase();\n\n // Delete old entries based on retention days\n const deleteByAgeResult = db\n .prepare(\n `DELETE FROM history \n WHERE created_at < datetime('now', '-' || ? || ' days')`,\n )\n .run(config.retentionDays);\n\n // Delete excess entries beyond max\n const deleteExcessResult = db\n .prepare(\n `DELETE FROM history \n WHERE id NOT IN (\n SELECT id FROM history \n ORDER BY created_at DESC \n LIMIT ?\n )`,\n )\n .run(config.maxEntries);\n\n // Update last cleanup timestamp\n setMetadata('last_cleanup', new Date().toISOString());\n\n return deleteByAgeResult.changes + deleteExcessResult.changes;\n}\n\nexport function clearAllHistory(): number {\n const db = getDatabase();\n const result = db.prepare('DELETE FROM history').run();\n return result.changes;\n}\n\nexport function clearHistoryOlderThan(days: number): number {\n const db = getDatabase();\n const result = db\n .prepare(\n `DELETE FROM history \n WHERE created_at < datetime('now', '-' || ? || ' days')`,\n )\n .run(days);\n return result.changes;\n}\n\nexport function shouldRunCleanup(): boolean {\n const lastCleanup = getMetadata('last_cleanup');\n if (!lastCleanup || lastCleanup === '0') {\n return true;\n }\n\n const lastCleanupDate = new Date(lastCleanup);\n const now = new Date();\n const oneDayMs = 24 * 60 * 60 * 1000;\n\n return now.getTime() - lastCleanupDate.getTime() > oneDayMs;\n}\n\nexport function getHistoryCount(): number {\n const db = getDatabase();\n const result = db\n .prepare('SELECT COUNT(*) as count FROM history')\n .get() as CountResult;\n return result.count;\n}\n","import { input } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { addShortcut, getShortcut } from '../../core/shortcuts.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class AddShortcutCommand extends Command {\n static paths = [['add-shortcut'], ['--add-shortcut']];\n\n static usage = Command.Usage({\n description: 'Add a new shortcut',\n examples: [\n ['Interactive mode', '$0 --add-shortcut'],\n [\n 'One-liner',\n '$0 --add-shortcut killport \"lsof -ti:{{port}} | xargs kill -9\" port',\n ],\n ],\n });\n\n // Optional positional args for one-liner mode\n name = Option.String({ required: false });\n template = Option.String({ required: false });\n args = Option.String({ required: false });\n\n async execute(): Promise<number> {\n let shortcutName: string;\n let shortcutTemplate: string;\n let shortcutArgs: string[];\n let shortcutDescription: string | undefined;\n\n // One-liner mode: b --add-shortcut \"name\" \"template\" \"args\"\n if (this.name && this.template) {\n shortcutName = this.name;\n shortcutTemplate = this.template;\n shortcutArgs = this.args ? this.args.split(',').map((a) => a.trim()) : [];\n } else {\n // Interactive mode\n console.log(pc.bold('\\n Add New Shortcut\\n'));\n\n shortcutName = await input({\n message: 'Shortcut name:',\n validate: (value) => {\n if (!value.trim()) return 'Name is required';\n if (value.includes(' ')) return 'Name cannot contain spaces';\n return true;\n },\n });\n\n // Check if shortcut already exists\n if (getShortcut(shortcutName)) {\n logger.warn(\n `Shortcut \"${shortcutName}\" already exists. It will be overwritten.`,\n );\n }\n\n shortcutTemplate = await input({\n message: 'Command template (use {{arg}} for placeholders):',\n validate: (value) => {\n if (!value.trim()) return 'Template is required';\n return true;\n },\n });\n\n const argsInput = await input({\n message: 'Arguments (comma-separated, or leave empty):',\n });\n\n shortcutArgs = argsInput\n ? argsInput\n .split(',')\n .map((a) => a.trim())\n .filter(Boolean)\n : [];\n\n shortcutDescription = await input({\n message: 'Description (optional):',\n });\n }\n\n // Validate that template placeholders match args\n const placeholders = shortcutTemplate.match(/\\{\\{(\\w+)\\}\\}/g) || [];\n const placeholderNames = placeholders.map((p) => p.replace(/[{}]/g, ''));\n\n for (const ph of placeholderNames) {\n if (!shortcutArgs.includes(ph)) {\n logger.warn(\n `Placeholder \"{{${ph}}}\" found but not in arguments list. Adding it.`,\n );\n shortcutArgs.push(ph);\n }\n }\n\n addShortcut(shortcutName, {\n template: shortcutTemplate,\n args: shortcutArgs,\n description: shortcutDescription || undefined,\n });\n\n console.log();\n logger.success(`Shortcut \"${shortcutName}\" added!`);\n\n if (shortcutArgs.length > 0) {\n console.log(\n pc.gray(\n ` Usage: b ${shortcutName} ${shortcutArgs.map((a) => `<${a}>`).join(' ')}`,\n ),\n );\n } else {\n console.log(pc.gray(` Usage: b ${shortcutName}`));\n }\n console.log();\n\n return 0;\n }\n}\n","import { chmodSync, existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { input } from '@inquirer/prompts';\nimport { ensureConfigDir, getConfigDir } from './config.js';\nimport type {\n ResolvedShortcut,\n ShortcutDefinition,\n ShortcutsFile,\n} from './types.js';\nimport { ShortcutsFile as ShortcutsFileSchema } from './types.js';\n\nconst SHORTCUTS_FILE = join(getConfigDir(), 'shortcuts.json');\n\nexport function shortcutsFileExists(): boolean {\n return existsSync(SHORTCUTS_FILE);\n}\n\nexport function loadShortcuts(): ShortcutsFile {\n if (!shortcutsFileExists()) {\n return { version: 1, shortcuts: {} };\n }\n\n try {\n const raw = readFileSync(SHORTCUTS_FILE, 'utf-8');\n const data = JSON.parse(raw);\n return ShortcutsFileSchema.parse(data);\n } catch {\n return { version: 1, shortcuts: {} };\n }\n}\n\nexport function saveShortcuts(shortcuts: ShortcutsFile): void {\n ensureConfigDir();\n const data = JSON.stringify(shortcuts, null, 2);\n writeFileSync(SHORTCUTS_FILE, data, { encoding: 'utf-8', mode: 0o600 });\n chmodSync(SHORTCUTS_FILE, 0o600);\n}\n\nexport function getShortcut(name: string): ShortcutDefinition | null {\n const file = loadShortcuts();\n return file.shortcuts[name] || null;\n}\n\nexport function addShortcut(\n name: string,\n definition: ShortcutDefinition,\n): void {\n const file = loadShortcuts();\n file.shortcuts[name] = definition;\n saveShortcuts(file);\n}\n\nexport function removeShortcut(name: string): boolean {\n const file = loadShortcuts();\n if (!file.shortcuts[name]) {\n return false;\n }\n delete file.shortcuts[name];\n saveShortcuts(file);\n return true;\n}\n\nexport function listShortcuts(): Record<string, ShortcutDefinition> {\n const file = loadShortcuts();\n return file.shortcuts;\n}\n\nexport function getShortcutsFilePath(): string {\n return SHORTCUTS_FILE;\n}\n\n/**\n * Parses user input to extract shortcut name and arguments\n * For single-arg shortcuts, join all remaining parts as one argument\n */\nfunction parseInput(\n queryParts: string[],\n expectedArgCount: number,\n): { name: string; args: string[] } {\n if (queryParts.length === 0) {\n return { name: '', args: [] };\n }\n\n const name = queryParts[0];\n const remainingParts = queryParts.slice(1);\n\n if (remainingParts.length === 0) {\n return { name, args: [] };\n }\n\n // If shortcut expects only 1 argument, join all remaining parts as one\n // This handles: b commit my commit message -> message = \"my commit message\"\n if (expectedArgCount === 1) {\n return { name, args: [remainingParts.join(' ')] };\n }\n\n // For multi-arg shortcuts, each part is a separate argument\n return { name, args: remainingParts };\n}\n\n/**\n * Replaces {{placeholder}} in template with provided arguments\n */\nfunction fillTemplate(\n template: string,\n argNames: string[],\n argValues: string[],\n): string {\n let result = template;\n\n for (let i = 0; i < argNames.length; i++) {\n const placeholder = `{{${argNames[i]}}}`;\n const value = argValues[i] || '';\n result = result.split(placeholder).join(value);\n }\n\n return result;\n}\n\n/**\n * Tries to resolve a shortcut from user input\n * Returns null if no matching shortcut found\n */\nexport async function tryResolveShortcut(\n queryParts: string[],\n): Promise<ResolvedShortcut | null> {\n if (queryParts.length === 0) {\n return null;\n }\n\n // First check if the first word matches a shortcut\n const shortcutName = queryParts[0];\n const shortcut = getShortcut(shortcutName);\n\n if (!shortcut) {\n return null;\n }\n\n const requiredArgs = shortcut.args || [];\n const { args: providedArgs } = parseInput(queryParts, requiredArgs.length);\n const finalArgs: string[] = [...providedArgs];\n\n // If not enough args provided, prompt for missing ones\n if (finalArgs.length < requiredArgs.length) {\n for (let i = finalArgs.length; i < requiredArgs.length; i++) {\n const argName = requiredArgs[i];\n const value = await input({\n message: `Enter ${argName}:`,\n });\n finalArgs.push(value);\n }\n }\n\n const command = fillTemplate(shortcut.template, requiredArgs, finalArgs);\n\n return {\n name: shortcutName,\n command,\n source: 'shortcut',\n };\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (msg: string) => console.log(pc.blue('i'), msg),\n success: (msg: string) => console.log(pc.green('✓'), msg),\n warn: (msg: string) => console.log(pc.yellow('⚠'), msg),\n error: (msg: string) => console.log(pc.red('✗'), msg),\n\n command: (cmd: string) => {\n console.log(pc.gray('>'), pc.cyan('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(pc.green('✓'), 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 { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { runAuthSetup } from '../../core/auth.js';\n\nexport class AuthCommand extends Command {\n static paths = [['auth'], ['--auth']];\n\n static usage = Command.Usage({\n description: 'Configure AI provider for Bashio',\n examples: [['Configure AI provider', '$0 --auth']],\n });\n\n async execute(): Promise<number> {\n const success = await runAuthSetup();\n\n if (success) {\n console.log(\n pc.green(\"You're all set! Try:\"),\n pc.cyan('b find all png files'),\n );\n console.log();\n }\n\n return success ? 0 : 1;\n }\n}\n","import { input, password, select } from '@inquirer/prompts';\nimport pc from 'picocolors';\nimport {\n CLAUDE_MODELS,\n createProvider,\n OllamaProvider,\n OPENAI_MODELS,\n OPENROUTER_MODELS,\n} from '../providers/index.js';\nimport { logger } from '../utils/logger.js';\nimport { createSpinner } from '../utils/spinner.js';\nimport { saveConfig } from './config.js';\nimport type { Config, Credentials, ProviderName } from './types.js';\n\nfunction showWelcomeBanner(): void {\n const cyan = pc.cyan;\n const dim = pc.dim;\n const width = 58;\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 cyan(' │') + pad(content, width) + cyan('│');\n\n console.log();\n console.log(cyan(` ┌${'─'.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(cyan(` └${'─'.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 provider = await select<ProviderName>({\n message: 'Select your AI provider:',\n choices: [\n {\n value: 'claude' as const,\n name: 'Claude (Anthropic)',\n description: 'Use Anthropic API key',\n },\n {\n value: 'openai' as const,\n name: 'ChatGPT (OpenAI)',\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 });\n\n let credentials: Credentials;\n let model: string;\n\n switch (provider) {\n case 'claude': {\n const apiKey = await password({\n message: 'Enter your Anthropic API key:',\n mask: '*',\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 });\n break;\n }\n\n case 'openai': {\n const apiKey = await password({\n message: 'Enter your OpenAI API key:',\n mask: '*',\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 });\n break;\n }\n\n case 'ollama': {\n const host = await input({\n message: 'Ollama host:',\n default: 'http://localhost:11434',\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 });\n break;\n }\n\n case 'openrouter': {\n const apiKey = await password({\n message: 'Enter your OpenRouter API key:',\n mask: '*',\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 });\n break;\n }\n\n default:\n throw new Error(`Unknown provider: ${provider}`);\n }\n\n const config: Config = {\n version: 1,\n provider,\n model,\n credentials,\n settings: {\n confirmBeforeExecute: true,\n historyEnabled: true,\n historyRetentionDays: 30,\n historyMaxEntries: 2000,\n autoConfirmShortcuts: false,\n },\n };\n\n const spinner = createSpinner('Validating credentials...').start();\n\n try {\n const providerInstance = createProvider(config);\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 saveConfig(config);\n\n console.log();\n logger.success('Configuration saved!');\n console.log(pc.gray(` Provider: ${provider}`));\n console.log(pc.gray(` Model: ${model}`));\n console.log();\n\n return true;\n}\n","import type { Credentials } from '../core/types.js';\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}\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","import type { AIProvider, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 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: 1024,\n system: systemPrompt,\n messages,\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 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\nexport const CLAUDE_MODELS = [\n { value: 'claude-sonnet-4-20250514', label: 'Claude Sonnet 4 (recommended)' },\n { value: 'claude-3-5-sonnet-20241022', label: 'Claude 3.5 Sonnet' },\n { value: 'claude-3-5-haiku-20241022', label: 'Claude 3.5 Haiku (fast)' },\n];\n","import type { AIProvider, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 const 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\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ollama error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as OllamaResponse;\n\n if (data.error) {\n throw new Error(`Ollama error: ${data.error}`);\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\nexport const OLLAMA_RECOMMENDED_MODELS = [\n 'llama3.2',\n 'llama3.1',\n 'codellama',\n 'mistral',\n 'gemma2',\n];\n","import type { AIProvider, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 const 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\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\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\nexport const OPENAI_MODELS = [\n { value: 'gpt-4o', label: 'GPT-4o (recommended)' },\n { value: 'gpt-4o-mini', label: 'GPT-4o Mini (fast)' },\n { value: 'gpt-4-turbo', label: 'GPT-4 Turbo' },\n];\n","import type { AIProvider, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 const response = await fetch(\n 'https://openrouter.ai/api/v1/chat/completions',\n {\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 );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenRouter API error: ${response.status} - ${error}`);\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\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 { Config } from '../core/types.js';\nimport type { AIProvider, ProviderConfig } from './base.js';\nimport { CLAUDE_MODELS, ClaudeProvider } from './claude.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: Config): AIProvider {\n const providerConfig: ProviderConfig = {\n model: config.model,\n credentials: config.credentials,\n };\n\n switch (config.provider) {\n case 'claude':\n return new ClaudeProvider(providerConfig);\n case 'openai':\n return new OpenAIProvider(providerConfig);\n case 'ollama':\n return new OllamaProvider(providerConfig);\n case 'openrouter':\n return new OpenRouterProvider(providerConfig);\n default:\n throw new Error(`Unknown provider: ${config.provider}`);\n }\n}\n\nexport {\n CLAUDE_MODELS,\n OPENAI_MODELS,\n OLLAMA_RECOMMENDED_MODELS,\n OPENROUTER_MODELS,\n};\nexport type { AIProvider } from './base.js';\nexport { OllamaProvider } from './ollama.js';\n","import ora, { type Ora } from 'ora';\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n spinner: 'dots',\n });\n}\n","import { confirm } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport {\n clearAllHistory,\n clearHistoryOlderThan,\n getHistoryCount,\n} from '../../core/history.js';\nimport { renderDangerBanner } from '../../utils/danger-ui.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class ClearHistoryCommand extends Command {\n static paths = [['--clear-history']];\n\n static usage = Command.Usage({\n description: 'Clear command history',\n examples: [\n ['Clear all history', '$0 --clear-history --all'],\n ['Clear entries older than 7 days', '$0 --clear-history --older-than 7'],\n ],\n });\n\n all = Option.Boolean('--all,-a', false, {\n description: 'Clear all history entries',\n });\n\n olderThan = Option.String('--older-than,-o', {\n description: 'Clear entries older than N days',\n });\n\n async execute(): Promise<number> {\n if (!this.all && !this.olderThan) {\n console.log(pc.bold('\\n Clear History\\n'));\n console.log(pc.gray(' Options:'));\n console.log(pc.gray(' --all Clear all history'));\n console.log(\n pc.gray(' --older-than N Clear entries older than N days'),\n );\n console.log();\n console.log(pc.dim(' Example: b --clear-history --older-than 30\\n'));\n return 1;\n }\n\n const currentCount = getHistoryCount();\n\n if (currentCount === 0) {\n logger.info('History is already empty.');\n return 0;\n }\n\n if (this.all) {\n console.log();\n for (const line of renderDangerBanner(\n `This will permanently delete ${currentCount} history entries.`,\n )) {\n console.log(line);\n }\n console.log();\n\n const confirmed = await confirm({\n message: 'Proceed with clearing all history?',\n default: false,\n });\n\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n\n const deleted = clearAllHistory();\n logger.success(`Cleared ${deleted} history entries.`);\n return 0;\n }\n\n if (this.olderThan) {\n const days = Number.parseInt(this.olderThan, 10);\n\n if (Number.isNaN(days) || days < 1) {\n logger.error('Invalid number of days.');\n return 1;\n }\n\n console.log();\n for (const line of renderDangerBanner(\n `This will permanently delete entries older than ${days} days.`,\n )) {\n console.log(line);\n }\n console.log();\n\n const confirmed = await confirm({\n message: `Proceed with clearing entries older than ${days} days?`,\n default: false,\n });\n\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n\n const deleted = clearHistoryOlderThan(days);\n\n if (deleted === 0) {\n logger.info(`No entries older than ${days} days.`);\n } else {\n logger.success(`Cleared ${deleted} entries older than ${days} days.`);\n }\n\n return 0;\n }\n\n return 0;\n }\n}\n","import pc from 'picocolors';\n\nexport const renderDangerBanner = (\n message: string,\n label: string = 'DANGER',\n): string[] => {\n const labelText = ` ${label} `;\n const spacer = ' ';\n const contentLength = labelText.length + spacer.length + message.length;\n const innerWidth = contentLength + 2;\n const border = '─'.repeat(innerWidth);\n\n const top = pc.red(` ┌${border}┐`);\n const middle =\n ` ${pc.red('│ ')}` +\n pc.bgRed(pc.white(labelText)) +\n pc.red(`${spacer}${message}`) +\n pc.red(' │');\n const bottom = pc.red(` └${border}┘`);\n\n return [top, middle, bottom];\n};\n","import { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { configExists, getConfigPath, loadConfig } from '../../core/config.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class ConfigCommand extends Command {\n static paths = [['config'], ['--config']];\n\n static usage = Command.Usage({\n description: 'View current Bashio configuration',\n examples: [['View config', '$0 --config']],\n });\n\n async execute(): Promise<number> {\n if (!configExists()) {\n logger.warn('Bashio is not configured yet.');\n console.log(pc.gray(\"Run 'b --auth' to set up your AI provider.\\n\"));\n return 1;\n }\n\n const config = loadConfig();\n if (!config) {\n logger.error('Failed to load configuration.');\n return 1;\n }\n\n console.log(pc.bold('\\n Bashio Configuration\\n'));\n console.log(` Provider: ${pc.cyan(config.provider)}`);\n console.log(` Model: ${pc.cyan(config.model)}`);\n console.log(` Auth: ${pc.green('Configured')}`);\n\n // Settings section\n const settings = config.settings;\n console.log();\n console.log(pc.bold(' Settings'));\n console.log(\n ` History: ${settings?.historyEnabled !== false ? pc.green('enabled') : pc.gray('disabled')}`,\n );\n console.log(\n ` Auto-confirm shortcuts: ${settings?.autoConfirmShortcuts ? pc.green('enabled') : pc.gray('disabled')}`,\n );\n\n console.log();\n console.log(pc.gray(` Config file: ${getConfigPath()}`));\n console.log();\n\n return 0;\n }\n}\n","import * as readline from 'node:readline';\nimport { confirm, input } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { runAuthSetup } from '../../core/auth.js';\nimport { configExists, loadConfig } from '../../core/config.js';\nimport { executeCommand } from '../../core/executor.js';\nimport { markExecuted, recordCommand } from '../../core/history.js';\nimport { tryResolveShortcut } from '../../core/shortcuts.js';\nimport { createProvider } from '../../providers/index.js';\nimport { copyToClipboard } from '../../utils/clipboard.js';\nimport { detectDangerousShellCommand } from '../../utils/danger.js';\nimport { renderDangerBanner } from '../../utils/danger-ui.js';\nimport { logger } from '../../utils/logger.js';\nimport { createSpinner } from '../../utils/spinner.js';\n\ntype ConfirmAction = 'yes' | 'no' | 'explain' | 'copy' | 'edit';\ntype CommandSource = 'shortcut' | 'ai';\n\ninterface ExecutionContext {\n queryText: string;\n historyId: number | null;\n historyEnabled: boolean;\n shortcutName?: string;\n}\n\nexport class DefaultCommand extends Command {\n static paths = [Command.Default];\n\n static usage = Command.Usage({\n description: 'Convert natural language to shell commands',\n examples: [\n ['Find large files', '$0 find files larger than 100mb'],\n ['Kill a port', '$0 kill whatever is running on port 3000'],\n ['Use a shortcut', '$0 killport 3000'],\n ],\n });\n\n query = Option.Rest({ required: 0 });\n\n async execute(): Promise<number> {\n if (this.query.length === 0) {\n this.showHelp();\n return 0;\n }\n\n // Load config for history settings\n const config = loadConfig();\n const historyEnabled = config?.settings?.historyEnabled !== false;\n\n // Step 1: Check if it's a shortcut\n const shortcut = await tryResolveShortcut(this.query);\n\n if (shortcut) {\n let historyId: number | null = null;\n\n if (historyEnabled) {\n historyId = recordCommand({\n query: this.query.join(' '),\n command: shortcut.command,\n source: 'shortcut',\n });\n }\n\n const context: ExecutionContext = {\n queryText: this.query.join(' '),\n historyId,\n historyEnabled,\n shortcutName: shortcut.name,\n };\n\n // Check if auto-confirm shortcuts is enabled\n if (config?.settings?.autoConfirmShortcuts) {\n return this.executeShortcutAutoConfirm(shortcut.command, context);\n }\n\n return this.executeWithConfirmation(\n shortcut.command,\n 'shortcut',\n context,\n );\n }\n\n // Step 2: Not a shortcut, use AI provider\n let currentConfig = config;\n if (!configExists() || !currentConfig) {\n const success = await runAuthSetup();\n if (!success) {\n return 1;\n }\n console.log(pc.green('Setup complete! Running your command...\\n'));\n currentConfig = loadConfig();\n if (!currentConfig) {\n logger.error('Failed to load configuration after setup.');\n return 1;\n }\n }\n\n const queryText = this.query.join(' ').trim();\n const provider = createProvider(currentConfig);\n const spinner = createSpinner('Generating command...').start();\n\n let generatedCommand: string;\n\n try {\n generatedCommand = await provider.generateCommand(queryText);\n spinner.stop();\n } catch (err) {\n spinner.fail('Failed to generate command');\n logger.error(err instanceof Error ? err.message : 'Unknown error');\n return 1;\n }\n\n generatedCommand = this.cleanCommand(generatedCommand);\n\n // Record history for AI command\n let historyId: number | null = null;\n if (historyEnabled) {\n historyId = recordCommand({\n query: queryText,\n command: generatedCommand,\n source: 'ai',\n });\n }\n\n return this.executeWithConfirmation(generatedCommand, 'ai', {\n queryText,\n historyId,\n historyEnabled,\n });\n }\n\n private showHelp(): void {\n console.log(pc.bold('\\n Bashio - Natural language to shell commands\\n'));\n console.log(' Usage:');\n console.log(pc.cyan(' b <natural language query>'));\n console.log(pc.cyan(' b <shortcut> [arguments]'));\n console.log();\n console.log(' Examples:');\n console.log(pc.gray(' b find all files larger than 100mb'));\n console.log(pc.gray(' b kill whatever is running on port 3000'));\n console.log(pc.gray(' b killport 3000') + pc.cyan(' (shortcut)'));\n console.log();\n console.log(' Commands:');\n console.log(pc.gray(' b --auth Configure AI provider'));\n console.log(\n pc.gray(' b --config View current configuration'),\n );\n console.log(pc.gray(' b --model Change AI model'));\n console.log(pc.gray(' b --shortcuts List all shortcuts'));\n console.log(pc.gray(' b --add-shortcut Add a new shortcut'));\n console.log(pc.gray(' b --remove-shortcut Remove a shortcut'));\n console.log(pc.gray(' b --edit-shortcuts Edit shortcuts in editor'));\n console.log();\n console.log(' History & Stats:');\n console.log(pc.gray(' b --history View command history'));\n console.log(pc.gray(' b --stats View usage statistics'));\n console.log(pc.gray(' b --clear-history Clear command history'));\n console.log(pc.gray(' b --suggest-shortcuts Suggest new shortcuts'));\n console.log();\n console.log(pc.gray(' b --help Show help'));\n console.log();\n }\n\n private async executeWithConfirmation(\n command: string,\n source: CommandSource,\n context: ExecutionContext,\n ): Promise<number> {\n let currentCommand = command;\n\n console.log();\n\n if (source === 'shortcut' && context.shortcutName) {\n console.log(pc.gray(` [shortcut: ${context.shortcutName}]`));\n }\n\n logger.command(currentCommand);\n console.log();\n\n let action = await this.promptConfirmation();\n\n while (action !== 'yes' && action !== 'no' && action !== 'copy') {\n if (action === 'explain') {\n if (source === 'shortcut') {\n console.log(\n pc.gray('\\n This command comes from a shortcut, not AI.\\n'),\n );\n } else {\n const explainConfig = loadConfig();\n if (explainConfig) {\n const provider = createProvider(explainConfig);\n const explainSpinner = createSpinner(\n 'Getting explanation...',\n ).start();\n try {\n const explanation = await provider.explainCommand(currentCommand);\n explainSpinner.stop();\n console.log();\n console.log(pc.bold(' Explanation:'));\n console.log(pc.gray(` ${explanation.split('\\n').join('\\n ')}`));\n console.log();\n } catch {\n explainSpinner.fail('Failed to get explanation');\n }\n }\n }\n } else if (action === 'edit') {\n try {\n const edited = await this.editCommandInline(currentCommand);\n currentCommand = edited.trim();\n console.log();\n logger.command(currentCommand);\n console.log();\n } catch {\n logger.error('Edit cancelled');\n }\n }\n\n action = await this.promptConfirmation();\n }\n\n // Handle copy - just copy and exit\n if (action === 'copy') {\n const success = await copyToClipboard(currentCommand);\n if (success) {\n logger.success('Copied to clipboard!');\n } else {\n logger.error('Failed to copy to clipboard');\n }\n console.log();\n return 0;\n }\n\n if (action === 'no') {\n logger.info('Cancelled.');\n return 0;\n }\n\n const danger = detectDangerousShellCommand(currentCommand);\n if (danger) {\n const confirmed = await this.promptDangerConfirmation(\n currentCommand,\n danger.reasons,\n );\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n }\n\n console.log();\n\n const result = await executeCommand(currentCommand);\n\n // Only show exit code if command failed\n if (result.exitCode !== 0) {\n console.log();\n logger.exitCode(result.exitCode);\n }\n console.log();\n\n // Update history with execution result\n if (context.historyEnabled && context.historyId !== null) {\n markExecuted(context.historyId, result.exitCode);\n }\n\n return result.exitCode;\n }\n\n private async executeShortcutAutoConfirm(\n command: string,\n context: ExecutionContext,\n ): Promise<number> {\n // Still check for dangerous commands even with auto-confirm\n const danger = detectDangerousShellCommand(command);\n if (danger) {\n console.log();\n if (context.shortcutName) {\n console.log(pc.gray(` [shortcut: ${context.shortcutName}]`));\n }\n logger.command(command);\n console.log();\n\n const confirmed = await this.promptDangerConfirmation(\n command,\n danger.reasons,\n );\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n }\n\n console.log();\n\n const result = await executeCommand(command);\n\n // Only show exit code if command failed\n if (result.exitCode !== 0) {\n console.log();\n logger.exitCode(result.exitCode);\n }\n console.log();\n\n // Update history with execution result\n if (context.historyEnabled && context.historyId !== null) {\n markExecuted(context.historyId, result.exitCode);\n }\n\n return result.exitCode;\n }\n\n private cleanCommand(command: string): string {\n let cleaned = command.trim();\n\n if (cleaned.startsWith('```')) {\n const lines = cleaned.split('\\n');\n const startIdx = lines[0].startsWith('```') ? 1 : 0;\n const endIdx =\n lines[lines.length - 1] === '```' ? lines.length - 1 : lines.length;\n cleaned = lines.slice(startIdx, endIdx).join('\\n');\n }\n\n cleaned = cleaned.replace(/^`|`$/g, '');\n\n return cleaned.trim();\n }\n\n private async promptConfirmation(): Promise<ConfirmAction> {\n const answer = await input({\n message: 'Execute? (y/n/e/c/edit)',\n default: 'y',\n });\n\n const normalized = answer.toLowerCase().trim();\n\n if (['y', 'yes', ''].includes(normalized)) {\n return 'yes';\n }\n if (['e', 'explain'].includes(normalized)) {\n return 'explain';\n }\n if (['c', 'copy'].includes(normalized)) {\n return 'copy';\n }\n if (['edit'].includes(normalized)) {\n return 'edit';\n }\n return 'no';\n }\n\n private async promptDangerConfirmation(\n command: string,\n reasons: string[],\n ): Promise<boolean> {\n for (const line of renderDangerBanner(\n 'This command may cause irreversible changes.',\n )) {\n console.log(line);\n }\n console.log();\n console.log(pc.yellow(' Reasons:'));\n for (const reason of reasons) {\n console.log(pc.yellow(` - ${reason}`));\n }\n console.log();\n console.log(pc.gray(' Command:'));\n console.log(pc.cyan(` ${command}`));\n console.log();\n\n return confirm({\n message: 'Proceed with this command?',\n default: false,\n });\n }\n\n private editCommandInline(currentCommand: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n // Show the prompt\n process.stdout.write(`${pc.green('?')} ${pc.bold('Edit command:')} `);\n\n // Pre-fill the input with current command\n rl.write(currentCommand);\n\n rl.on('line', (answer) => {\n rl.close();\n resolve(answer || currentCommand);\n });\n\n rl.on('close', () => {\n resolve(currentCommand);\n });\n\n rl.on('SIGINT', () => {\n rl.close();\n reject(new Error('Edit cancelled'));\n });\n });\n }\n}\n","import { spawn } from 'node:child_process';\n\nexport interface ExecutionResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\nexport function executeCommand(command: string): Promise<ExecutionResult> {\n return new Promise((resolve) => {\n const shell = process.platform === 'win32' ? 'cmd' : '/bin/sh';\n const shellArg = process.platform === 'win32' ? '/c' : '-c';\n\n // Use 'inherit' for all stdio to allow TUI apps (like opencode)\n // direct TTY access for proper terminal size detection and rendering\n const child = spawn(shell, [shellArg, command], {\n stdio: 'inherit',\n cwd: process.cwd(),\n env: process.env,\n });\n\n child.on('close', (code) => {\n resolve({\n exitCode: code ?? 1,\n stdout: '',\n stderr: '',\n });\n });\n\n child.on('error', (err) => {\n resolve({\n exitCode: 1,\n stdout: '',\n stderr: err.message,\n });\n });\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","export interface DangerMatch {\n reasons: string[];\n}\n\ninterface DangerPattern {\n pattern: RegExp;\n reason: string;\n}\n\nconst DANGEROUS_PATTERNS: DangerPattern[] = [\n {\n pattern: /\\b(?:rm|rmdir)\\b[^\\n]*(?:-rf|-fr|--recursive|--force|-r\\b)/i,\n reason: 'Recursively removes files or directories',\n },\n {\n pattern:\n /\\b(?:mkfs|mkfs\\.[a-z0-9]+|format|diskpart|diskutil|fdisk|parted)\\b/i,\n reason: 'Formats or repartitions disks/filesystems',\n },\n {\n pattern: /\\bdd\\b/i,\n reason: 'Writes raw data to disks or devices',\n },\n {\n pattern: /\\b(?:shutdown|reboot|poweroff|halt)\\b/i,\n reason: 'Shuts down or reboots the system',\n },\n {\n pattern:\n /\\b(?:userdel|deluser|groupdel|dscl\\b[^\\n]*-delete|net\\s+user\\b[^\\n]*\\/delete)\\b/i,\n reason: 'Deletes system users or groups',\n },\n {\n pattern: /:\\s*\\(\\s*\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;\\s*:/,\n reason: 'Fork bomb pattern',\n },\n {\n pattern: /\\b(?:chmod|chown)\\b[^\\n]*\\s-?R\\b/i,\n reason: 'Recursively changes permissions or ownership',\n },\n {\n pattern: /\\b(?:git\\s+reset\\s+--hard|git\\s+clean\\s+-fd)\\b/i,\n reason: 'Discards uncommitted changes',\n },\n {\n pattern: /\\b(?:rd|rmdir)\\b[^\\n]*\\s\\/s\\b/i,\n reason: 'Recursively removes directories (Windows)',\n },\n {\n pattern: /\\bdel\\b[^\\n]*\\s\\/f\\b/i,\n reason: 'Force deletes files (Windows)',\n },\n];\n\nexport const detectDangerousShellCommand = (\n command: string,\n): DangerMatch | null => {\n const trimmed = command.trim();\n if (!trimmed) {\n return null;\n }\n\n const reasons: string[] = [];\n\n for (const entry of DANGEROUS_PATTERNS) {\n if (entry.pattern.test(trimmed)) {\n reasons.push(entry.reason);\n }\n }\n\n if (reasons.length === 0) {\n return null;\n }\n\n return { reasons };\n};\n","import { spawn } from 'node:child_process';\nimport { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport {\n getShortcutsFilePath,\n saveShortcuts,\n shortcutsFileExists,\n} from '../../core/shortcuts.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class EditShortcutsCommand extends Command {\n static paths = [['edit-shortcuts'], ['--edit-shortcuts']];\n\n static usage = Command.Usage({\n description: 'Open shortcuts file in your default editor',\n examples: [['Edit shortcuts', '$0 --edit-shortcuts']],\n });\n\n async execute(): Promise<number> {\n const filePath = getShortcutsFilePath();\n\n // Create file with empty shortcuts if it doesn't exist\n if (!shortcutsFileExists()) {\n saveShortcuts({ version: 1, shortcuts: {} });\n logger.info('Created new shortcuts file.');\n }\n\n // Get editor from environment\n const editor =\n process.env.EDITOR || process.env.VISUAL || this.getDefaultEditor();\n\n if (!editor) {\n logger.error('No editor found. Set $EDITOR environment variable.');\n console.log(pc.gray(`\\n Example: export EDITOR=vim`));\n console.log(pc.gray(` Or: export EDITOR=\"code --wait\"`));\n console.log(pc.gray(`\\n File location: ${filePath}\\n`));\n return 1;\n }\n\n console.log(pc.gray(`\\n Opening ${filePath} in ${editor}...\\n`));\n\n return new Promise((resolve) => {\n // Parse editor command (handle \"code --wait\" style)\n const parts = editor.split(' ');\n const editorCmd = parts[0];\n const editorArgs = [...parts.slice(1), filePath];\n\n const child = spawn(editorCmd, editorArgs, {\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n logger.success('Shortcuts file saved.');\n } else {\n logger.warn('Editor closed with non-zero exit code.');\n }\n console.log();\n resolve(code ?? 0);\n });\n\n child.on('error', (err) => {\n logger.error(`Failed to open editor: ${err.message}`);\n console.log(pc.gray(`\\n File location: ${filePath}\\n`));\n resolve(1);\n });\n });\n }\n\n private getDefaultEditor(): string | null {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return 'nano';\n }\n if (platform === 'win32') {\n return 'notepad';\n }\n // Linux\n return 'nano';\n }\n}\n","import { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { getRecentHistory, searchHistory } from '../../core/history.js';\nimport type { HistoryEntry } from '../../core/types.js';\nimport { renderTable } from '../../utils/table.js';\n\nexport class HistoryCommand extends Command {\n static paths = [['--history']];\n\n static usage = Command.Usage({\n description: 'View command history',\n examples: [\n ['View recent history', '$0 --history'],\n ['Limit results', '$0 --history --limit 10'],\n ['Search history', '$0 --history --search git'],\n ],\n });\n\n limit = Option.String('--limit,-l', '20', {\n description: 'Number of entries to show',\n });\n\n search = Option.String('--search,-s', {\n description: 'Search term to filter history',\n });\n\n async execute(): Promise<number> {\n const limitNum = Number.parseInt(this.limit, 10) || 20;\n\n let entries: HistoryEntry[];\n let title: string;\n\n if (this.search) {\n entries = searchHistory(this.search, limitNum);\n title = `Command History (search: \"${this.search}\")`;\n } else {\n entries = getRecentHistory(limitNum);\n title = 'Recent Command History';\n }\n\n if (entries.length === 0) {\n console.log(pc.bold(`\\n ${title}\\n`));\n console.log(pc.gray(' No history entries found.\\n'));\n return 0;\n }\n\n // Prepare data for table\n const data = entries.map((entry, index) => ({\n num: (index + 1).toString(),\n command: entry.command,\n query: entry.source === 'ai' ? entry.query : '-',\n source: entry.source,\n status: this.getStatusDisplay(entry),\n time: this.getTimeAgo(entry.createdAt),\n }));\n\n // Render table\n renderTable({\n title,\n columns: [\n { header: '#', key: 'num', width: 3, align: 'right' },\n { header: 'Command', key: 'command', width: 35, color: pc.yellow },\n { header: 'Query', key: 'query', width: 25, color: pc.gray },\n {\n header: 'Source',\n key: 'source',\n width: 8,\n color: (v) => (v.trim() === 'ai' ? pc.blue(v) : pc.cyan(v)),\n },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Time', key: 'time', width: 10 },\n ],\n data,\n });\n\n console.log(pc.dim(`\\n Showing ${entries.length} entries\\n`));\n\n return 0;\n }\n\n private getStatusDisplay(entry: HistoryEntry): string {\n if (entry.executed === 0) {\n return `${pc.gray('○')} skipped`;\n }\n if (entry.exitCode === 0) {\n return `${pc.green('✓')} success`;\n }\n return `${pc.red('✗')} exit:${entry.exitCode}`;\n }\n\n private getTimeAgo(isoString: string): string {\n const date = new Date(isoString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n\n const minutes = Math.floor(diffMs / (1000 * 60));\n const hours = Math.floor(diffMs / (1000 * 60 * 60));\n const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return date.toLocaleDateString();\n }\n}\n","import pc from 'picocolors';\n\ninterface Column {\n header: string;\n key: string;\n width: number;\n align?: 'left' | 'right' | 'center';\n color?: (value: string) => string;\n}\n\ninterface TableOptions {\n columns: Column[];\n data: Record<string, string>[];\n title?: string;\n}\n\nconst BOX = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n topMid: '┬',\n bottomMid: '┴',\n leftMid: '├',\n rightMid: '┤',\n midMid: '┼',\n};\n\nfunction padString(\n str: string,\n width: number,\n align: 'left' | 'right' | 'center' = 'left',\n): string {\n const strippedLength = stripAnsi(str).length;\n const padding = Math.max(0, width - strippedLength);\n\n if (align === 'right') {\n return ' '.repeat(padding) + str;\n }\n if (align === 'center') {\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n return ' '.repeat(leftPad) + str + ' '.repeat(rightPad);\n }\n return str + ' '.repeat(padding);\n}\n\nfunction stripAnsi(str: string): string {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Required for ANSI escape code stripping\n return str.replace(/\\x1B\\[[0-9;]*m/g, '');\n}\n\nfunction wrapText(text: string, maxWidth: number): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let currentLine = '';\n\n for (const word of words) {\n const testLine = currentLine ? `${currentLine} ${word}` : word;\n\n if (stripAnsi(testLine).length <= maxWidth) {\n currentLine = testLine;\n } else {\n if (currentLine) {\n lines.push(currentLine);\n }\n // If single word is longer than maxWidth, truncate it\n if (stripAnsi(word).length > maxWidth) {\n currentLine = `${word.slice(0, maxWidth - 3)}...`;\n } else {\n currentLine = word;\n }\n }\n }\n\n if (currentLine) {\n lines.push(currentLine);\n }\n\n return lines.length > 0 ? lines : [''];\n}\n\nexport function renderTable(options: TableOptions): void {\n const { columns, data, title } = options;\n\n // Print title if provided\n if (title) {\n console.log(pc.bold(`\\n ${title}\\n`));\n }\n\n // Top border\n let topBorder = ` ${BOX.topLeft}`;\n for (let i = 0; i < columns.length; i++) {\n topBorder += BOX.horizontal.repeat(columns[i].width + 2);\n topBorder += i < columns.length - 1 ? BOX.topMid : BOX.topRight;\n }\n console.log(pc.dim(topBorder));\n\n // Header row\n let headerRow = ` ${BOX.vertical}`;\n for (const col of columns) {\n headerRow += ` ${pc.bold(padString(col.header, col.width, col.align))} ${BOX.vertical}`;\n }\n console.log(\n pc.dim(headerRow.slice(0, 2)) +\n headerRow.slice(2, -1) +\n pc.dim(BOX.vertical),\n );\n\n // Header separator\n let headerSep = ` ${BOX.leftMid}`;\n for (let i = 0; i < columns.length; i++) {\n headerSep += BOX.horizontal.repeat(columns[i].width + 2);\n headerSep += i < columns.length - 1 ? BOX.midMid : BOX.rightMid;\n }\n console.log(pc.dim(headerSep));\n\n // Data rows\n for (const row of data) {\n // Wrap text for each column that needs it\n const wrappedColumns: string[][] = columns.map((col) => {\n const value = row[col.key] || '';\n return wrapText(value, col.width);\n });\n\n // Find max lines needed for this row\n const maxLines = Math.max(...wrappedColumns.map((lines) => lines.length));\n\n // Print each line of the row\n for (let lineIdx = 0; lineIdx < maxLines; lineIdx++) {\n let dataRow = ` ${BOX.vertical}`;\n\n for (let colIdx = 0; colIdx < columns.length; colIdx++) {\n const col = columns[colIdx];\n const lines = wrappedColumns[colIdx];\n const lineValue = lines[lineIdx] || '';\n\n let cellValue = padString(lineValue, col.width, col.align);\n\n // Apply color if provided and this is not an empty continuation line\n if (col.color && lineValue) {\n cellValue = col.color(cellValue);\n }\n\n dataRow += ` ${cellValue} ${BOX.vertical}`;\n }\n\n console.log(\n pc.dim(dataRow.slice(0, 2)) +\n dataRow.slice(2, -1) +\n pc.dim(BOX.vertical),\n );\n }\n }\n\n // Bottom border\n let bottomBorder = ` ${BOX.bottomLeft}`;\n for (let i = 0; i < columns.length; i++) {\n bottomBorder += BOX.horizontal.repeat(columns[i].width + 2);\n bottomBorder += i < columns.length - 1 ? BOX.bottomMid : BOX.bottomRight;\n }\n console.log(pc.dim(bottomBorder));\n}\n\nexport function renderSimpleTable(\n headers: string[],\n rows: string[][],\n title?: string,\n): void {\n const columns: Column[] = headers.map((header, idx) => {\n const maxDataWidth = Math.max(\n ...rows.map((row) => stripAnsi(row[idx] || '').length),\n );\n const width = Math.max(header.length, maxDataWidth, 5);\n return { header, key: `col${idx}`, width: Math.min(width, 40) };\n });\n\n const data = rows.map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((_, idx) => {\n obj[`col${idx}`] = row[idx] || '';\n });\n return obj;\n });\n\n renderTable({ columns, data, title });\n}\n","import * as readline from 'node:readline';\nimport { select } from '@inquirer/prompts';\nimport { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { configExists, loadConfig, saveConfig } from '../../core/config.js';\nimport {\n CLAUDE_MODELS,\n OllamaProvider,\n OPENAI_MODELS,\n OPENROUTER_MODELS,\n} from '../../providers/index.js';\nimport { logger } from '../../utils/logger.js';\nimport { createSpinner } from '../../utils/spinner.js';\n\ntype SelectConfig<Value> = Parameters<typeof select<Value>>[0];\n\ntype KeypressHandler = (input: string, key: readline.Key) => void;\n\ntype KeypressInput = NodeJS.ReadStream & {\n on(event: 'keypress', listener: KeypressHandler): void;\n off(event: 'keypress', listener: KeypressHandler): void;\n setRawMode?: (mode: boolean) => void;\n isTTY?: boolean;\n isRaw?: boolean;\n};\n\nconst selectWithEsc = async <Value>(\n config: SelectConfig<Value>,\n): Promise<Value> => {\n const controller = new AbortController();\n const input = process.stdin as KeypressInput;\n const previousRawMode: boolean | null =\n input.isTTY && typeof input.isRaw === 'boolean' ? input.isRaw : null;\n\n const onKeypress: KeypressHandler = (_input, key) => {\n if (key.name === 'escape') {\n controller.abort();\n }\n };\n\n readline.emitKeypressEvents(input);\n\n if (input.isTTY && typeof input.setRawMode === 'function') {\n input.setRawMode(true);\n }\n\n input.on('keypress', onKeypress);\n\n try {\n return await select<Value>(config, { signal: controller.signal });\n } finally {\n input.off('keypress', onKeypress);\n if (\n input.isTTY &&\n typeof input.setRawMode === 'function' &&\n previousRawMode !== null\n ) {\n input.setRawMode(previousRawMode);\n }\n }\n};\n\nconst isPromptExit = (error: unknown): boolean => {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return (\n error.name === 'ExitPromptError' ||\n error.name === 'AbortPromptError' ||\n error.name === 'CancelPromptError'\n );\n};\n\nexport class ModelCommand extends Command {\n static paths = [['model'], ['--model']];\n\n static usage = Command.Usage({\n description: 'Change the AI model for current provider',\n examples: [['Change model', '$0 --model']],\n });\n\n async execute(): Promise<number> {\n if (!configExists()) {\n logger.warn('Bashio is not configured yet.');\n console.log(\n pc.gray(\"Run 'b --auth' to set up your AI provider first.\\n\"),\n );\n return 1;\n }\n\n const config = loadConfig();\n if (!config) {\n logger.error('Failed to load configuration.');\n return 1;\n }\n\n console.log(pc.bold('\\n Change AI Model\\n'));\n console.log(pc.gray(` Current provider: ${config.provider}`));\n console.log(pc.gray(` Current model: ${config.model}`));\n console.log(pc.dim(' Press Esc to cancel\\n'));\n\n let newModel: string;\n\n try {\n switch (config.provider) {\n case 'claude': {\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: CLAUDE_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n default: config.model,\n });\n break;\n }\n\n case 'openai': {\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: OPENAI_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n default: config.model,\n });\n break;\n }\n\n case 'ollama': {\n const host =\n config.credentials.type === 'local'\n ? config.credentials.host\n : 'http://localhost:11434';\n\n const spinner = createSpinner('Fetching available models...').start();\n const availableModels = await OllamaProvider.getAvailableModels(host);\n spinner.stop();\n\n if (availableModels.length === 0) {\n logger.warn('No models found. Make sure Ollama is running.');\n console.log(pc.gray('\\n Install a model: ollama pull llama3.2\\n'));\n return 1;\n }\n\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: availableModels.map((m) => ({\n value: m,\n name: m,\n })),\n default: config.model,\n });\n break;\n }\n\n case 'openrouter': {\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: OPENROUTER_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n default: config.model,\n });\n break;\n }\n\n default:\n logger.error(`Unknown provider: ${config.provider}`);\n return 1;\n }\n } catch (error) {\n if (isPromptExit(error)) {\n console.log(pc.dim('\\n Cancelled.\\n'));\n return 0;\n }\n throw error;\n }\n\n if (newModel === config.model) {\n logger.info('Model unchanged.');\n return 0;\n }\n\n config.model = newModel;\n saveConfig(config);\n\n console.log();\n logger.success(`Model changed to: ${newModel}`);\n console.log();\n\n return 0;\n }\n}\n","import { confirm } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { getShortcut, removeShortcut } from '../../core/shortcuts.js';\nimport { renderDangerBanner } from '../../utils/danger-ui.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class RemoveShortcutCommand extends Command {\n static paths = [['remove-shortcut'], ['--remove-shortcut']];\n\n static usage = Command.Usage({\n description: 'Remove a shortcut',\n examples: [['Remove shortcut', '$0 --remove-shortcut killport']],\n });\n\n name = Option.String({ required: true });\n\n async execute(): Promise<number> {\n const shortcut = getShortcut(this.name);\n\n if (!shortcut) {\n logger.error(`Shortcut \"${this.name}\" not found.`);\n return 1;\n }\n\n console.log();\n console.log(pc.gray(` Template: ${shortcut.template}`));\n if (shortcut.description) {\n console.log(pc.gray(` Description: ${shortcut.description}`));\n }\n console.log();\n\n for (const line of renderDangerBanner(\n `This will permanently remove shortcut \"${this.name}\".`,\n )) {\n console.log(line);\n }\n console.log();\n\n const confirmed = await confirm({\n message: `Proceed with removing \"${this.name}\"?`,\n default: false,\n });\n\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n\n removeShortcut(this.name);\n logger.success(`Shortcut \"${this.name}\" removed.`);\n console.log();\n\n return 0;\n }\n}\n","import { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { listShortcuts } from '../../core/shortcuts.js';\nimport { renderTable } from '../../utils/table.js';\n\nexport class ShortcutsCommand extends Command {\n static paths = [['shortcuts'], ['--shortcuts']];\n\n static usage = Command.Usage({\n description: 'List all configured shortcuts',\n examples: [['List shortcuts', '$0 --shortcuts']],\n });\n\n async execute(): Promise<number> {\n const shortcuts = listShortcuts();\n const names = Object.keys(shortcuts);\n\n if (names.length === 0) {\n console.log(pc.yellow('\\n No shortcuts configured yet.\\n'));\n console.log(pc.gray(' Add one with: b --add-shortcut\\n'));\n return 0;\n }\n\n const data = names.map((name) => {\n const shortcut = shortcuts[name];\n return {\n name,\n template: shortcut.template,\n args: shortcut.args?.length ? shortcut.args.join(', ') : '-',\n };\n });\n\n renderTable({\n title: 'Your Shortcuts',\n columns: [\n { header: 'Name', key: 'name', width: 15, color: pc.cyan },\n {\n header: 'Command Template',\n key: 'template',\n width: 45,\n color: pc.white,\n },\n { header: 'Arguments', key: 'args', width: 15, color: pc.gray },\n ],\n data,\n });\n\n console.log(\n pc.dim(\n `\\n Total: ${names.length} shortcut${names.length === 1 ? '' : 's'}\\n`,\n ),\n );\n\n return 0;\n }\n}\n","import { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { getStats } from '../../core/history.js';\nimport { renderTable } from '../../utils/table.js';\n\nexport class StatsCommand extends Command {\n static paths = [['--stats']];\n\n static usage = Command.Usage({\n description: 'View usage statistics',\n examples: [['View stats', '$0 --stats']],\n });\n\n async execute(): Promise<number> {\n const stats = getStats();\n\n console.log(pc.bold('\\n Bashio Usage Statistics\\n'));\n\n // Overview stats table\n renderTable({\n title: 'Overview',\n columns: [\n { header: 'Metric', key: 'metric', width: 20 },\n { header: 'Value', key: 'value', width: 15, align: 'right' },\n ],\n data: [\n { metric: 'Commands Generated', value: stats.totalCommands.toString() },\n {\n metric: 'Executed',\n value: `${stats.totalExecuted} (${stats.executionRate}%)`,\n },\n { metric: 'Today', value: stats.todayCommands.toString() },\n { metric: 'This Week', value: stats.thisWeekCommands.toString() },\n ],\n });\n\n console.log();\n\n // Source breakdown table\n const total = stats.aiCount + stats.shortcutCount;\n const aiPercent = total > 0 ? Math.round((stats.aiCount / total) * 100) : 0;\n const shortcutPercent =\n total > 0 ? Math.round((stats.shortcutCount / total) * 100) : 0;\n\n renderTable({\n title: 'Source Breakdown',\n columns: [\n { header: 'Source', key: 'source', width: 15 },\n { header: 'Count', key: 'count', width: 10, align: 'right' },\n { header: 'Percentage', key: 'percent', width: 12, align: 'right' },\n ],\n data: [\n {\n source: 'AI Generated',\n count: stats.aiCount.toString(),\n percent: `${aiPercent}%`,\n },\n {\n source: 'Shortcuts',\n count: stats.shortcutCount.toString(),\n percent: `${shortcutPercent}%`,\n },\n ],\n });\n\n // Top queries table (if any)\n if (stats.topQueries.length > 0) {\n console.log();\n\n renderTable({\n title: 'Most Used Commands',\n columns: [\n { header: '#', key: 'rank', width: 3, align: 'right' },\n { header: 'Command', key: 'command', width: 45, color: pc.cyan },\n { header: 'Uses', key: 'uses', width: 8, align: 'right' },\n {\n header: 'Source',\n key: 'source',\n width: 10,\n color: (v) => (v.trim() === 'ai' ? pc.blue(v) : pc.cyan(v)),\n },\n ],\n data: stats.topQueries.map((q, i) => ({\n rank: (i + 1).toString(),\n command: q.query.length > 42 ? `${q.query.slice(0, 39)}...` : q.query,\n uses: q.useCount.toString(),\n source: q.source,\n })),\n });\n }\n\n console.log();\n\n return 0;\n }\n}\n","import { confirm, input } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport {\n getShortcutSuggestions,\n markPatternAsSuggested,\n} from '../../core/learning.js';\nimport { addShortcut, getShortcut } from '../../core/shortcuts.js';\nimport type { ShortcutDefinition } from '../../core/types.js';\nimport { logger } from '../../utils/logger.js';\n\ntype SuggestionAction = 'yes' | 'no' | 'exit';\n\nexport class SuggestShortcutsCommand extends Command {\n static paths = [['--suggest-shortcuts']];\n\n static usage = Command.Usage({\n description: 'Suggest shortcuts based on frequently used commands',\n examples: [\n ['Get suggestions', '$0 --suggest-shortcuts'],\n ['Set minimum use count', '$0 --suggest-shortcuts --threshold 5'],\n ],\n });\n\n threshold = Option.String('--threshold,-t', '3', {\n description: 'Minimum use count to suggest (default: 3)',\n });\n\n async execute(): Promise<number> {\n const thresholdNum = Number.parseInt(this.threshold, 10) || 3;\n const suggestions = getShortcutSuggestions(thresholdNum);\n\n console.log(pc.bold('\\n Shortcut Suggestions\\n'));\n\n if (suggestions.length === 0) {\n console.log(\n pc.gray(\n ' No suggestions yet. Use Bashio more to get personalized suggestions.',\n ),\n );\n console.log(\n pc.dim(` (Commands need to be used ${thresholdNum}+ times)\\n`),\n );\n return 0;\n }\n\n console.log(\n pc.dim(\n ` Found ${suggestions.length} frequently used commands that could be shortcuts:\\n`,\n ),\n );\n\n for (const suggestion of suggestions) {\n console.log(pc.dim(' ────────────────────────────────────────'));\n console.log(` ${pc.yellow('Command:')} ${pc.cyan(suggestion.command)}`);\n console.log(\n ` ${pc.yellow('Used:')} ${pc.white(suggestion.useCount.toString())} times`,\n );\n console.log();\n\n const action = await this.promptCreateShortcut();\n\n if (action === 'exit') {\n console.log(pc.dim('\\n Exiting suggestions.\\n'));\n return 0;\n }\n\n if (action === 'yes') {\n // Step 1: Get unique shortcut name from user (with validation loop)\n const finalName = await this.getUniqueShortcutName(\n suggestion.suggestedName,\n );\n\n if (!finalName) {\n // User cancelled\n markPatternAsSuggested(suggestion.command);\n console.log();\n continue;\n }\n\n // Step 2: Check if command has numbers/parameters\n const hasNumbers = /\\d+/.test(suggestion.command);\n let template = suggestion.command;\n const args: string[] = [];\n\n if (hasNumbers) {\n const parameterize = await confirm({\n message: 'Make numbers into parameters?',\n default: true,\n });\n\n if (parameterize) {\n const numbers = suggestion.command.match(/\\d+/g) || [];\n const uniqueNumbers = [...new Set(numbers)];\n\n for (let i = 0; i < uniqueNumbers.length; i++) {\n const argName = `arg${i + 1}`;\n args.push(argName);\n template = template.replace(\n new RegExp(uniqueNumbers[i], 'g'),\n `{{${argName}}}`,\n );\n }\n }\n }\n\n // Step 3: Create the shortcut\n addShortcut(finalName, {\n template,\n args,\n description: `Auto-suggested shortcut for: ${suggestion.command}`,\n });\n\n markPatternAsSuggested(suggestion.command);\n\n logger.success(`✓ Created shortcut: ${finalName}`);\n console.log(\n pc.dim(\n ` Usage: b ${finalName}${args.length > 0 ? ` ${args.map((a) => `<${a}>`).join(' ')}` : ''}`,\n ),\n );\n console.log();\n } else {\n // action === 'no'\n markPatternAsSuggested(suggestion.command);\n console.log();\n }\n }\n\n console.log(pc.dim(' ────────────────────────────────────────\\n'));\n\n return 0;\n }\n\n private async promptCreateShortcut(): Promise<SuggestionAction> {\n const answer = await input({\n message: 'Create shortcut? (y/n/e)',\n default: 'y',\n });\n\n const normalized = answer.toLowerCase().trim();\n\n if (['y', 'yes', ''].includes(normalized)) {\n return 'yes';\n }\n if (['e', 'exit'].includes(normalized)) {\n return 'exit';\n }\n return 'no';\n }\n\n private async getUniqueShortcutName(\n defaultName: string,\n ): Promise<string | null> {\n let attempts = 0;\n const maxAttempts = 5;\n\n while (attempts < maxAttempts) {\n const enteredName = await input({\n message: 'Shortcut name:',\n default: defaultName,\n });\n\n const finalName = enteredName.trim();\n\n if (!finalName) {\n logger.error('Shortcut name cannot be empty.');\n attempts++;\n continue;\n }\n\n // Check if shortcut already exists\n const existingShortcut = getShortcut(finalName);\n\n if (existingShortcut) {\n // Show table with existing shortcut details\n this.showExistingShortcutTable(finalName, existingShortcut);\n attempts++;\n continue;\n }\n\n // Name is valid and unique\n return finalName;\n }\n\n // Max attempts reached\n logger.error('Too many invalid attempts. Skipping this suggestion.');\n return null;\n }\n\n private showExistingShortcutTable(\n name: string,\n shortcut: ShortcutDefinition,\n ): void {\n const boxWidth = 50;\n const line = '─'.repeat(boxWidth);\n\n console.log();\n console.log(pc.red(` ┌${line}┐`));\n console.log(\n pc.red(' │') +\n pc.bold(pc.red(' ❌ Shortcut Already Exists')) +\n ' '.repeat(boxWidth - 27) +\n pc.red('│'),\n );\n console.log(pc.red(` ├${line}┤`));\n\n // Name row\n const nameLabel = ' Name: ';\n const nameValue = name;\n const namePadding = boxWidth - nameLabel.length - nameValue.length + 2;\n console.log(\n pc.red(' │') +\n pc.gray(nameLabel) +\n pc.white(nameValue) +\n ' '.repeat(Math.max(0, namePadding)) +\n pc.red('│'),\n );\n\n // Command row (may wrap if too long)\n const cmdLabel = ' Command: ';\n const cmdValue =\n shortcut.template.length > 35\n ? `${shortcut.template.slice(0, 32)}...`\n : shortcut.template;\n const cmdPadding = boxWidth - cmdLabel.length - cmdValue.length + 2;\n console.log(\n pc.red(' │') +\n pc.gray(cmdLabel) +\n pc.cyan(cmdValue) +\n ' '.repeat(Math.max(0, cmdPadding)) +\n pc.red('│'),\n );\n\n // Args row (if any)\n if (shortcut.args && shortcut.args.length > 0) {\n const argsLabel = ' Args: ';\n const argsValue = shortcut.args.join(', ');\n const argsPadding = boxWidth - argsLabel.length - argsValue.length + 2;\n console.log(\n pc.red(' │') +\n pc.gray(argsLabel) +\n pc.yellow(argsValue) +\n ' '.repeat(Math.max(0, argsPadding)) +\n pc.red('│'),\n );\n }\n\n console.log(pc.red(` └${line}┘`));\n console.log();\n console.log(pc.yellow(' Please enter a different name:\\n'));\n }\n}\n","import { getDatabase } from './database.js';\nimport { listShortcuts } from './shortcuts.js';\nimport type { ShortcutSuggestion } from './types.js';\n\ninterface QueryStatsRow {\n id: number;\n command: string;\n source: string;\n use_count: number;\n success_count: number;\n suggested: number;\n}\n\nexport function suggestShortcutNameFromCommand(command: string): string {\n // Extract meaningful parts from the command\n // Examples:\n // \"find . -size +100M\" → \"largefiles\"\n // \"lsof -ti:3000 | xargs kill -9\" → \"killport\"\n // \"git add . && git commit -m\" → \"commit\"\n\n // Simple heuristic: take first 2-3 significant words/operators\n const parts = command\n .split(/[\\s\\-&|;()]+/)\n .filter((p) => p.length > 0 && !p.match(/^[.+]/));\n\n if (parts.length === 0) {\n return 'cmd';\n }\n\n // Common command names\n const mainCmd = parts[0];\n\n // For compound commands, combine main cmd with key argument\n if (parts.length > 1) {\n const keyArg = parts[1];\n if (keyArg && keyArg.length > 0) {\n const combined = `${mainCmd}${keyArg}`.slice(0, 12);\n return combined;\n }\n }\n\n return mainCmd.slice(0, 12);\n}\n\nexport function getShortcutSuggestions(threshold = 3): ShortcutSuggestion[] {\n const db = getDatabase();\n\n // Get frequently used AI commands that haven't been suggested yet\n // Keyed by COMMAND, not query, to handle variations (typos, synonyms)\n const rows = db\n .prepare(\n `SELECT id, command, source, use_count, success_count, suggested\n FROM query_stats \n WHERE source = 'ai' \n AND use_count >= ?\n AND suggested = 0\n ORDER BY use_count DESC\n LIMIT 10`,\n )\n .all(threshold) as QueryStatsRow[];\n\n // Get existing shortcuts to filter out conflicts\n const existingShortcuts = listShortcuts();\n const existingNames = new Set(Object.keys(existingShortcuts));\n\n const suggestions: ShortcutSuggestion[] = [];\n\n for (const row of rows) {\n // Generate shortcut name from COMMAND, not query\n let suggestedName = suggestShortcutNameFromCommand(row.command);\n\n // Ensure unique name\n let counter = 1;\n const baseName = suggestedName;\n while (existingNames.has(suggestedName)) {\n suggestedName = `${baseName}${counter}`;\n counter++;\n }\n\n suggestions.push({\n query: row.command, // Store command as \"query\" for now (for interface compatibility)\n command: row.command,\n useCount: row.use_count,\n suggestedName,\n });\n }\n\n return suggestions;\n}\n\nexport function markPatternAsSuggested(command: string): void {\n const db = getDatabase();\n // Now marking by COMMAND instead of query\n db.prepare('UPDATE query_stats SET suggested = 1 WHERE command = ?').run(\n command,\n );\n}\n\nexport function resetSuggestionFlags(): void {\n const db = getDatabase();\n db.prepare('UPDATE query_stats SET suggested = 0').run();\n}\n\nexport function getCommandStats(command: string): QueryStatsRow | null {\n const db = getDatabase();\n const row = db\n .prepare('SELECT * FROM query_stats WHERE command = ?')\n .get(command) as QueryStatsRow | undefined;\n return row ?? null;\n}\n","import { cli } from './cli/index.js';\n\nconst args = process.argv.slice(2);\ncli.runExit(args);\n"],"mappings":"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","names":["pc","chmodSync","existsSync","existsSync","chmodSync","db","db","input","pc","chmodSync","existsSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","writeFileSync","chmodSync","pc","input","Command","pc","input","pc","pc","stripAnsi","input","spinner","Command","pc","Command","Option","pc","pc","Command","Option","pc","Command","pc","Command","pc","confirm","input","Command","Option","pc","Command","Option","historyId","pc","input","confirm","spawn","Command","pc","Command","pc","spawn","Command","Option","pc","pc","Command","Option","pc","readline","select","Command","pc","input","select","Command","pc","confirm","Command","Option","pc","Command","Option","pc","confirm","Command","pc","Command","pc","Command","pc","Command","pc","confirm","input","Command","Option","pc","db","Command","Option","pc","args","confirm","input","pc","stripAnsi"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/core/config.ts","../src/core/types.ts","../src/core/database.ts","../src/core/history.ts","../src/cli/commands/AddShortcutCommand.ts","../src/core/shortcuts.ts","../src/utils/logger.ts","../src/cli/commands/AuthCommand.ts","../src/core/auth.ts","../src/core/oauth.ts","../src/providers/base.ts","../src/providers/chatgpt-subscription.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/utils/spinner.ts","../src/cli/commands/ClearHistoryCommand.ts","../src/utils/danger-ui.ts","../src/cli/commands/ConfigCommand.ts","../src/cli/commands/DefaultCommand.ts","../src/core/executor.ts","../src/utils/clipboard.ts","../src/utils/danger.ts","../src/cli/commands/EditShortcutsCommand.ts","../src/cli/commands/HistoryCommand.ts","../src/utils/table.ts","../src/cli/commands/ModelCommand.ts","../src/cli/commands/RemoveShortcutCommand.ts","../src/cli/commands/ShortcutsCommand.ts","../src/cli/commands/StatsCommand.ts","../src/cli/commands/SuggestShortcutsCommand.ts","../src/core/learning.ts","../src/index.ts"],"sourcesContent":["import { createRequire } from 'node:module';\nimport { Builtins, Cli } from 'clipanion';\nimport pc from 'picocolors';\nimport updateNotifier from 'update-notifier';\nimport { loadConfig } from '../core/config.js';\nimport { initDatabase } from '../core/database.js';\nimport { cleanupHistory, shouldRunCleanup } from '../core/history.js';\n\nconst require = createRequire(import.meta.url);\nconst packageJson = require('../../package.json') as {\n name: string;\n version: string;\n};\n\nconst pkg = {\n name: packageJson.name,\n version: packageJson.version,\n};\n\n// Check for updates (runs in background, cached for 1 day)\nconst notifier = updateNotifier({\n pkg,\n updateCheckInterval: 1000 * 60 * 60 * 24, // 1 day\n});\n\n// Custom update notification matching welcome banner theme\nif (notifier.update) {\n const { current, latest } = notifier.update;\n const cyan = pc.cyan;\n const width = 44;\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 const visibleLength = (str: string): number => stripAnsi(str).length;\n const pad = (text: string, len: number): string => {\n const padding = len - visibleLength(text);\n return text + ' '.repeat(Math.max(0, padding));\n };\n const line = (content: string): string =>\n cyan(' │') + pad(content, width) + cyan('│');\n\n console.log();\n console.log(cyan(` ┌${'─'.repeat(width)}┐`));\n console.log(line(''));\n console.log(line(pc.bold(' Bashio Update Available!')));\n console.log(line(''));\n console.log(line(` ${pc.dim(current)} → ${pc.green(pc.bold(latest))}`));\n console.log(line(''));\n console.log(line(` Run: ${pc.cyan('npm i -g bashio@latest')}`));\n console.log(line(''));\n console.log(cyan(` └${'─'.repeat(width)}┘`));\n console.log();\n}\n\nimport { AddShortcutCommand } from './commands/AddShortcutCommand.js';\nimport { AuthCommand } from './commands/AuthCommand.js';\nimport { ClearHistoryCommand } from './commands/ClearHistoryCommand.js';\nimport { ConfigCommand } from './commands/ConfigCommand.js';\nimport { DefaultCommand } from './commands/DefaultCommand.js';\nimport { EditShortcutsCommand } from './commands/EditShortcutsCommand.js';\nimport { HistoryCommand } from './commands/HistoryCommand.js';\nimport { ModelCommand } from './commands/ModelCommand.js';\nimport { RemoveShortcutCommand } from './commands/RemoveShortcutCommand.js';\nimport { ShortcutsCommand } from './commands/ShortcutsCommand.js';\nimport { StatsCommand } from './commands/StatsCommand.js';\nimport { SuggestShortcutsCommand } from './commands/SuggestShortcutsCommand.js';\n\n// Initialize database on startup\ninitDatabase();\n\n// Run cleanup if needed (once per day)\nif (shouldRunCleanup()) {\n const config = loadConfig();\n const retentionDays = config?.settings?.historyRetentionDays ?? 30;\n const maxEntries = config?.settings?.historyMaxEntries ?? 2000;\n cleanupHistory({ retentionDays, maxEntries });\n}\n\nconst cli = new Cli({\n binaryLabel: 'Bashio',\n binaryName: 'b',\n binaryVersion: pkg.version,\n});\n\ncli.register(DefaultCommand);\ncli.register(AuthCommand);\ncli.register(ConfigCommand);\ncli.register(ModelCommand);\ncli.register(ShortcutsCommand);\ncli.register(AddShortcutCommand);\ncli.register(RemoveShortcutCommand);\ncli.register(EditShortcutsCommand);\ncli.register(HistoryCommand);\ncli.register(StatsCommand);\ncli.register(ClearHistoryCommand);\ncli.register(SuggestShortcutsCommand);\ncli.register(Builtins.HelpCommand);\ncli.register(Builtins.VersionCommand);\n\nexport { cli };\n","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 { Config } 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\nexport function loadConfig(): Config | 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 return Config.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function saveConfig(config: Config): 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","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});\nexport type Settings = z.infer<typeof Settings>;\n\nexport const Config = z.object({\n version: z.number().default(1),\n provider: ProviderName,\n model: z.string(),\n credentials: Credentials,\n settings: Settings.optional(),\n});\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","import { chmodSync, existsSync } from 'node:fs';\nimport Database from 'better-sqlite3';\nimport { ensureConfigDir, getConfigDir } from './config.js';\n\nconst DB_PATH = `${getConfigDir()}/history.db`;\n\nlet db: Database.Database | null = null;\n\nconst SCHEMA = `\n-- History table: stores recent command history (auto-cleaned based on retention)\nCREATE TABLE IF NOT EXISTS history (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n query TEXT NOT NULL,\n command TEXT NOT NULL,\n source TEXT NOT NULL CHECK(source IN ('ai', 'shortcut')),\n working_directory TEXT NOT NULL,\n executed INTEGER DEFAULT 0,\n exit_code INTEGER,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n);\n\n-- Query stats table: aggregated stats (never deleted, stays tiny)\n-- Keyed by command to handle query variations (typos, synonyms, different phrasings)\nCREATE TABLE IF NOT EXISTS query_stats (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n command TEXT UNIQUE NOT NULL,\n source TEXT NOT NULL CHECK(source IN ('ai', 'shortcut')),\n use_count INTEGER DEFAULT 1,\n success_count INTEGER DEFAULT 0,\n suggested INTEGER DEFAULT 0,\n first_used TEXT NOT NULL,\n last_used TEXT NOT NULL\n);\n\n-- Metadata table for DB version and settings\nCREATE TABLE IF NOT EXISTS metadata (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n);\n\n-- Indexes for performance\nCREATE INDEX IF NOT EXISTS idx_history_created ON history(created_at DESC);\nCREATE INDEX IF NOT EXISTS idx_history_query ON history(query);\nCREATE INDEX IF NOT EXISTS idx_history_working_dir ON history(working_directory);\nCREATE INDEX IF NOT EXISTS idx_stats_use_count ON query_stats(use_count DESC);\n\n-- Initial metadata\nINSERT OR IGNORE INTO metadata (key, value) VALUES ('db_version', '1');\nINSERT OR IGNORE INTO metadata (key, value) VALUES ('last_cleanup', '0');\n`;\n\nexport function initDatabase(): Database.Database {\n if (db) {\n return db;\n }\n\n ensureConfigDir();\n\n const isNew = !existsSync(DB_PATH);\n\n db = new Database(DB_PATH);\n\n // Set secure file permissions (owner read/write only)\n if (isNew) {\n chmodSync(DB_PATH, 0o600);\n }\n\n // Enable WAL mode for better performance\n db.pragma('journal_mode = WAL');\n\n // Create schema\n db.exec(SCHEMA);\n\n return db;\n}\n\nexport function getDatabase(): Database.Database {\n if (!db) {\n return initDatabase();\n }\n return db;\n}\n\nexport function closeDatabase(): void {\n if (db) {\n db.close();\n db = null;\n }\n}\n\nexport function getMetadata(key: string): string | null {\n const database = getDatabase();\n const row = database\n .prepare('SELECT value FROM metadata WHERE key = ?')\n .get(key) as { value: string } | undefined;\n return row?.value ?? null;\n}\n\nexport function setMetadata(key: string, value: string): void {\n const database = getDatabase();\n database\n .prepare('INSERT OR REPLACE INTO metadata (key, value) VALUES (?, ?)')\n .run(key, value);\n}\n\nexport function getDatabasePath(): string {\n return DB_PATH;\n}\n","import { getDatabase, getMetadata, setMetadata } from './database.js';\nimport type { HistoryEntry, HistoryStats } from './types.js';\n\ninterface HistoryRow {\n id: number;\n query: string;\n command: string;\n source: string;\n working_directory: string;\n executed: number;\n exit_code: number | null;\n created_at: string;\n}\n\ninterface CountResult {\n count: number;\n}\n\ninterface TopCommandRow {\n command: string;\n use_count: number;\n source: string;\n}\n\nfunction rowToHistoryEntry(row: HistoryRow): HistoryEntry {\n return {\n id: row.id,\n query: row.query,\n command: row.command,\n source: row.source as 'ai' | 'shortcut',\n workingDirectory: row.working_directory,\n executed: row.executed,\n exitCode: row.exit_code,\n createdAt: row.created_at,\n };\n}\n\nexport function recordCommand(data: {\n query: string;\n command: string;\n source: 'ai' | 'shortcut';\n workingDirectory?: string;\n}): number {\n const db = getDatabase();\n const now = new Date().toISOString();\n const workingDir = data.workingDirectory || process.cwd();\n\n // Insert into history table\n const historyResult = db\n .prepare(\n `INSERT INTO history (query, command, source, working_directory, executed, created_at) \n VALUES (?, ?, ?, ?, 0, ?)`,\n )\n .run(data.query, data.command, data.source, workingDir, now);\n\n // Update or insert into query_stats table (keyed by COMMAND, not query)\n const existingStats = db\n .prepare('SELECT id FROM query_stats WHERE command = ?')\n .get(data.command) as { id: number } | undefined;\n\n if (existingStats) {\n // Command already exists, just increment use_count\n db.prepare(\n `UPDATE query_stats \n SET use_count = use_count + 1, \n last_used = ?\n WHERE command = ?`,\n ).run(now, data.command);\n } else {\n // New command, insert into stats\n db.prepare(\n `INSERT INTO query_stats (command, source, use_count, success_count, suggested, first_used, last_used)\n VALUES (?, ?, 1, 0, 0, ?, ?)`,\n ).run(data.command, data.source, now, now);\n }\n\n return historyResult.lastInsertRowid as number;\n}\n\nexport function markExecuted(historyId: number, exitCode: number): void {\n const db = getDatabase();\n\n // Update history entry\n db.prepare('UPDATE history SET executed = 1, exit_code = ? WHERE id = ?').run(\n exitCode,\n historyId,\n );\n\n // Get the command to update query_stats\n const historyRow = db\n .prepare('SELECT command FROM history WHERE id = ?')\n .get(historyId) as { command: string } | undefined;\n\n if (historyRow && exitCode === 0) {\n db.prepare(\n 'UPDATE query_stats SET success_count = success_count + 1 WHERE command = ?',\n ).run(historyRow.command);\n }\n}\n\nexport function getRecentHistory(limit = 20): HistoryEntry[] {\n const db = getDatabase();\n const rows = db\n .prepare('SELECT * FROM history ORDER BY created_at DESC LIMIT ?')\n .all(limit) as HistoryRow[];\n\n return rows.map(rowToHistoryEntry);\n}\n\nexport function searchHistory(searchTerm: string, limit = 20): HistoryEntry[] {\n const db = getDatabase();\n const pattern = `%${searchTerm}%`;\n const rows = db\n .prepare(\n `SELECT * FROM history \n WHERE query LIKE ? OR command LIKE ?\n ORDER BY created_at DESC \n LIMIT ?`,\n )\n .all(pattern, pattern, limit) as HistoryRow[];\n\n return rows.map(rowToHistoryEntry);\n}\n\nexport function getHistoryByDirectory(\n directory: string,\n limit = 20,\n): HistoryEntry[] {\n const db = getDatabase();\n const rows = db\n .prepare(\n `SELECT * FROM history \n WHERE working_directory = ?\n ORDER BY created_at DESC \n LIMIT ?`,\n )\n .all(directory, limit) as HistoryRow[];\n\n return rows.map(rowToHistoryEntry);\n}\n\nexport function getStats(): HistoryStats {\n const db = getDatabase();\n\n const totalResult = db\n .prepare('SELECT COUNT(*) as count FROM history')\n .get() as CountResult;\n\n const todayResult = db\n .prepare(\n `SELECT COUNT(*) as count FROM history \n WHERE date(created_at) = date('now')`,\n )\n .get() as CountResult;\n\n const thisWeekResult = db\n .prepare(\n `SELECT COUNT(*) as count FROM history \n WHERE created_at >= datetime('now', '-7 days')`,\n )\n .get() as CountResult;\n\n const executedResult = db\n .prepare('SELECT COUNT(*) as count FROM history WHERE executed = 1')\n .get() as CountResult;\n\n const aiResult = db\n .prepare(\"SELECT COUNT(*) as count FROM history WHERE source = 'ai'\")\n .get() as CountResult;\n\n const shortcutResult = db\n .prepare(\"SELECT COUNT(*) as count FROM history WHERE source = 'shortcut'\")\n .get() as CountResult;\n\n const topCommands = db\n .prepare(\n `SELECT command, use_count, source FROM query_stats \n ORDER BY use_count DESC \n LIMIT 5`,\n )\n .all() as TopCommandRow[];\n\n const total = totalResult.count;\n const executed = executedResult.count;\n\n return {\n totalCommands: total,\n todayCommands: todayResult.count,\n thisWeekCommands: thisWeekResult.count,\n totalExecuted: executed,\n executionRate: total > 0 ? Math.round((executed / total) * 100) : 0,\n aiCount: aiResult.count,\n shortcutCount: shortcutResult.count,\n topQueries: topCommands.map((c) => ({\n query: c.command,\n useCount: c.use_count,\n source: c.source,\n })),\n };\n}\n\nexport function cleanupHistory(config: {\n retentionDays: number;\n maxEntries: number;\n}): number {\n const db = getDatabase();\n\n // Delete old entries based on retention days\n const deleteByAgeResult = db\n .prepare(\n `DELETE FROM history \n WHERE created_at < datetime('now', '-' || ? || ' days')`,\n )\n .run(config.retentionDays);\n\n // Delete excess entries beyond max\n const deleteExcessResult = db\n .prepare(\n `DELETE FROM history \n WHERE id NOT IN (\n SELECT id FROM history \n ORDER BY created_at DESC \n LIMIT ?\n )`,\n )\n .run(config.maxEntries);\n\n // Update last cleanup timestamp\n setMetadata('last_cleanup', new Date().toISOString());\n\n return deleteByAgeResult.changes + deleteExcessResult.changes;\n}\n\nexport function clearAllHistory(): number {\n const db = getDatabase();\n const result = db.prepare('DELETE FROM history').run();\n return result.changes;\n}\n\nexport function clearHistoryOlderThan(days: number): number {\n const db = getDatabase();\n const result = db\n .prepare(\n `DELETE FROM history \n WHERE created_at < datetime('now', '-' || ? || ' days')`,\n )\n .run(days);\n return result.changes;\n}\n\nexport function shouldRunCleanup(): boolean {\n const lastCleanup = getMetadata('last_cleanup');\n if (!lastCleanup || lastCleanup === '0') {\n return true;\n }\n\n const lastCleanupDate = new Date(lastCleanup);\n const now = new Date();\n const oneDayMs = 24 * 60 * 60 * 1000;\n\n return now.getTime() - lastCleanupDate.getTime() > oneDayMs;\n}\n\nexport function getHistoryCount(): number {\n const db = getDatabase();\n const result = db\n .prepare('SELECT COUNT(*) as count FROM history')\n .get() as CountResult;\n return result.count;\n}\n","import { input } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { addShortcut, getShortcut } from '../../core/shortcuts.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class AddShortcutCommand extends Command {\n static paths = [['add-shortcut'], ['--add-shortcut']];\n\n static usage = Command.Usage({\n description: 'Add a new shortcut',\n examples: [\n ['Interactive mode', '$0 --add-shortcut'],\n [\n 'One-liner',\n '$0 --add-shortcut killport \"lsof -ti:{{port}} | xargs kill -9\" port',\n ],\n ],\n });\n\n // Optional positional args for one-liner mode\n name = Option.String({ required: false });\n template = Option.String({ required: false });\n args = Option.String({ required: false });\n\n async execute(): Promise<number> {\n let shortcutName: string;\n let shortcutTemplate: string;\n let shortcutArgs: string[];\n let shortcutDescription: string | undefined;\n\n // One-liner mode: b --add-shortcut \"name\" \"template\" \"args\"\n if (this.name && this.template) {\n shortcutName = this.name;\n shortcutTemplate = this.template;\n shortcutArgs = this.args ? this.args.split(',').map((a) => a.trim()) : [];\n } else {\n // Interactive mode\n console.log(pc.bold('\\n Add New Shortcut\\n'));\n\n shortcutName = await input({\n message: 'Shortcut name:',\n validate: (value) => {\n if (!value.trim()) return 'Name is required';\n if (value.includes(' ')) return 'Name cannot contain spaces';\n return true;\n },\n });\n\n // Check if shortcut already exists\n if (getShortcut(shortcutName)) {\n logger.warn(\n `Shortcut \"${shortcutName}\" already exists. It will be overwritten.`,\n );\n }\n\n shortcutTemplate = await input({\n message: 'Command template (use {{arg}} for placeholders):',\n validate: (value) => {\n if (!value.trim()) return 'Template is required';\n return true;\n },\n });\n\n const argsInput = await input({\n message: 'Arguments (comma-separated, or leave empty):',\n });\n\n shortcutArgs = argsInput\n ? argsInput\n .split(',')\n .map((a) => a.trim())\n .filter(Boolean)\n : [];\n\n shortcutDescription = await input({\n message: 'Description (optional):',\n });\n }\n\n // Validate that template placeholders match args\n const placeholders = shortcutTemplate.match(/\\{\\{(\\w+)\\}\\}/g) || [];\n const placeholderNames = placeholders.map((p) => p.replace(/[{}]/g, ''));\n\n for (const ph of placeholderNames) {\n if (!shortcutArgs.includes(ph)) {\n logger.warn(\n `Placeholder \"{{${ph}}}\" found but not in arguments list. Adding it.`,\n );\n shortcutArgs.push(ph);\n }\n }\n\n addShortcut(shortcutName, {\n template: shortcutTemplate,\n args: shortcutArgs,\n description: shortcutDescription || undefined,\n });\n\n console.log();\n logger.success(`Shortcut \"${shortcutName}\" added!`);\n\n if (shortcutArgs.length > 0) {\n console.log(\n pc.gray(\n ` Usage: b ${shortcutName} ${shortcutArgs.map((a) => `<${a}>`).join(' ')}`,\n ),\n );\n } else {\n console.log(pc.gray(` Usage: b ${shortcutName}`));\n }\n console.log();\n\n return 0;\n }\n}\n","import { chmodSync, existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { input } from '@inquirer/prompts';\nimport { ensureConfigDir, getConfigDir } from './config.js';\nimport type {\n ResolvedShortcut,\n ShortcutDefinition,\n ShortcutsFile,\n} from './types.js';\nimport { ShortcutsFile as ShortcutsFileSchema } from './types.js';\n\nconst SHORTCUTS_FILE = join(getConfigDir(), 'shortcuts.json');\n\nexport function shortcutsFileExists(): boolean {\n return existsSync(SHORTCUTS_FILE);\n}\n\nexport function loadShortcuts(): ShortcutsFile {\n if (!shortcutsFileExists()) {\n return { version: 1, shortcuts: {} };\n }\n\n try {\n const raw = readFileSync(SHORTCUTS_FILE, 'utf-8');\n const data = JSON.parse(raw);\n return ShortcutsFileSchema.parse(data);\n } catch {\n return { version: 1, shortcuts: {} };\n }\n}\n\nexport function saveShortcuts(shortcuts: ShortcutsFile): void {\n ensureConfigDir();\n const data = JSON.stringify(shortcuts, null, 2);\n writeFileSync(SHORTCUTS_FILE, data, { encoding: 'utf-8', mode: 0o600 });\n chmodSync(SHORTCUTS_FILE, 0o600);\n}\n\nexport function getShortcut(name: string): ShortcutDefinition | null {\n const file = loadShortcuts();\n return file.shortcuts[name] || null;\n}\n\nexport function addShortcut(\n name: string,\n definition: ShortcutDefinition,\n): void {\n const file = loadShortcuts();\n file.shortcuts[name] = definition;\n saveShortcuts(file);\n}\n\nexport function removeShortcut(name: string): boolean {\n const file = loadShortcuts();\n if (!file.shortcuts[name]) {\n return false;\n }\n delete file.shortcuts[name];\n saveShortcuts(file);\n return true;\n}\n\nexport function listShortcuts(): Record<string, ShortcutDefinition> {\n const file = loadShortcuts();\n return file.shortcuts;\n}\n\nexport function getShortcutsFilePath(): string {\n return SHORTCUTS_FILE;\n}\n\n/**\n * Parses user input to extract shortcut name and arguments\n * For single-arg shortcuts, join all remaining parts as one argument\n */\nfunction parseInput(\n queryParts: string[],\n expectedArgCount: number,\n): { name: string; args: string[] } {\n if (queryParts.length === 0) {\n return { name: '', args: [] };\n }\n\n const name = queryParts[0];\n const remainingParts = queryParts.slice(1);\n\n if (remainingParts.length === 0) {\n return { name, args: [] };\n }\n\n // If shortcut expects only 1 argument, join all remaining parts as one\n // This handles: b commit my commit message -> message = \"my commit message\"\n if (expectedArgCount === 1) {\n return { name, args: [remainingParts.join(' ')] };\n }\n\n // For multi-arg shortcuts, each part is a separate argument\n return { name, args: remainingParts };\n}\n\n/**\n * Replaces {{placeholder}} in template with provided arguments\n */\nfunction fillTemplate(\n template: string,\n argNames: string[],\n argValues: string[],\n): string {\n let result = template;\n\n for (let i = 0; i < argNames.length; i++) {\n const placeholder = `{{${argNames[i]}}}`;\n const value = argValues[i] || '';\n result = result.split(placeholder).join(value);\n }\n\n return result;\n}\n\n/**\n * Tries to resolve a shortcut from user input\n * Returns null if no matching shortcut found\n */\nexport async function tryResolveShortcut(\n queryParts: string[],\n): Promise<ResolvedShortcut | null> {\n if (queryParts.length === 0) {\n return null;\n }\n\n // First check if the first word matches a shortcut\n const shortcutName = queryParts[0];\n const shortcut = getShortcut(shortcutName);\n\n if (!shortcut) {\n return null;\n }\n\n const requiredArgs = shortcut.args || [];\n const { args: providedArgs } = parseInput(queryParts, requiredArgs.length);\n const finalArgs: string[] = [...providedArgs];\n\n // If not enough args provided, prompt for missing ones\n if (finalArgs.length < requiredArgs.length) {\n for (let i = finalArgs.length; i < requiredArgs.length; i++) {\n const argName = requiredArgs[i];\n const value = await input({\n message: `Enter ${argName}:`,\n });\n finalArgs.push(value);\n }\n }\n\n const command = fillTemplate(shortcut.template, requiredArgs, finalArgs);\n\n return {\n name: shortcutName,\n command,\n source: 'shortcut',\n };\n}\n","import pc from 'picocolors';\n\nexport const logger = {\n info: (msg: string) => console.log(pc.blue('i'), msg),\n success: (msg: string) => console.log(pc.green('✓'), msg),\n warn: (msg: string) => console.log(pc.yellow('⚠'), msg),\n error: (msg: string) => console.log(pc.red('✗'), msg),\n\n command: (cmd: string) => {\n console.log(pc.gray('>'), pc.cyan('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(pc.green('✓'), 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 { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { runAuthSetup } from '../../core/auth.js';\n\nexport class AuthCommand extends Command {\n static paths = [['auth'], ['--auth']];\n\n static usage = Command.Usage({\n description: 'Configure AI provider for Bashio',\n examples: [['Configure AI provider', '$0 --auth']],\n });\n\n async execute(): Promise<number> {\n const success = await runAuthSetup();\n\n if (success) {\n console.log(\n pc.green(\"You're all set! Try:\"),\n pc.cyan('b find all png files'),\n );\n console.log();\n }\n\n return success ? 0 : 1;\n }\n}\n","import { 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 { logger } from '../utils/logger.js';\nimport { createSpinner } from '../utils/spinner.js';\nimport { saveConfig } from './config.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 { Config, Credentials, ProviderName } from './types.js';\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 cyan = pc.cyan;\n const dim = pc.dim;\n const width = 58;\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 cyan(' │') + pad(content, width) + cyan('│');\n\n console.log();\n console.log(cyan(` ┌${'─'.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(cyan(` └${'─'.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 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 });\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 });\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 });\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 });\n break;\n }\n\n case 'claude': {\n const apiKey = await password({\n message: 'Enter your Anthropic API key:',\n mask: '*',\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 });\n break;\n }\n\n case 'openai': {\n const apiKey = await password({\n message: 'Enter your OpenAI API key:',\n mask: '*',\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 });\n break;\n }\n\n case 'ollama': {\n const host = await input({\n message: 'Ollama host:',\n default: 'http://localhost:11434',\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 });\n break;\n }\n\n case 'openrouter': {\n const apiKey = await password({\n message: 'Enter your OpenRouter API key:',\n mask: '*',\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 });\n break;\n }\n\n default:\n throw new Error(`Unknown provider: ${provider}`);\n }\n\n const config: Config = {\n version: 1,\n provider,\n model,\n credentials,\n settings: {\n confirmBeforeExecute: true,\n historyEnabled: true,\n historyRetentionDays: 30,\n historyMaxEntries: 2000,\n autoConfirmShortcuts: false,\n },\n };\n\n const spinner = createSpinner('Validating credentials...').start();\n\n try {\n const providerInstance = createProvider(config);\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 saveConfig(config);\n\n console.log();\n logger.success('Configuration saved!');\n console.log(pc.gray(` Provider: ${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 });\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 });\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(\n pc.green(` Browser opened. Please log in to ${providerName}.`),\n );\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.cyan(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 });\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.cyan(pc.underline(deviceCode.verification_uri))}`,\n );\n console.log(` 2. Enter code: ${pc.bold(pc.green(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 * 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 AIProvider {\n name: string;\n generateCommand(query: string, context?: string): Promise<string>;\n explainCommand(command: string): Promise<string>;\n validateCredentials(): Promise<boolean>;\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","import { loadConfig, saveConfig } from '../core/config.js';\nimport {\n CHATGPT_OAUTH_CONFIG,\n extractAccountIdFromToken,\n refreshChatGPTToken,\n} from '../core/oauth.js';\nimport type { AIProvider, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } from './base.js';\n\n// Codex backend API message format (input must be array of messages)\ninterface CodexInputMessage {\n type: 'message';\n role: 'user' | 'assistant';\n content: Array<{ type: 'input_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 if (\n currentConfig &&\n currentConfig.credentials.type === 'chatgpt_subscription'\n ) {\n currentConfig.credentials.accessToken = newTokens.accessToken;\n if (newTokens.refreshToken) {\n currentConfig.credentials.refreshToken = newTokens.refreshToken;\n }\n if (newTokens.expiresAt) {\n currentConfig.credentials.expiresAt = newTokens.expiresAt;\n }\n if (this.accountId) {\n currentConfig.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\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","import type { AIProvider, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 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: 1024,\n system: systemPrompt,\n messages,\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 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\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, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 if (\n currentConfig &&\n currentConfig.credentials.type === 'claude_subscription'\n ) {\n currentConfig.credentials.accessToken = newTokens.accessToken;\n currentConfig.credentials.refreshToken = newTokens.refreshToken;\n currentConfig.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\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, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 if (currentConfig && currentConfig.credentials.type === 'copilot') {\n currentConfig.credentials.copilotToken = newTokenData.token;\n currentConfig.credentials.copilotTokenExpiresAt = parsed.expiresAt;\n currentConfig.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 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\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 type { AIProvider, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 const 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\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Ollama error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as OllamaResponse;\n\n if (data.error) {\n throw new Error(`Ollama error: ${data.error}`);\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\nexport const OLLAMA_RECOMMENDED_MODELS = [\n 'llama3.2',\n 'llama3.1',\n 'codellama',\n 'mistral',\n 'gemma2',\n];\n","import type { AIProvider, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 const 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\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\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\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 type { AIProvider, ProviderConfig } from './base.js';\nimport { SYSTEM_PROMPT_EXPLAIN, SYSTEM_PROMPT_GENERATE } 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 const response = await fetch(\n 'https://openrouter.ai/api/v1/chat/completions',\n {\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 );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenRouter API error: ${response.status} - ${error}`);\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\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 { Config } 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: Config): AIProvider {\n const providerConfig: ProviderConfig = {\n model: config.model,\n credentials: config.credentials,\n };\n\n switch (config.provider) {\n case 'claude':\n return new ClaudeProvider(providerConfig);\n case 'claude-subscription':\n return new ClaudeSubscriptionProvider(providerConfig);\n case 'openai':\n return new OpenAIProvider(providerConfig);\n case 'chatgpt-subscription':\n return new ChatGPTSubscriptionProvider(providerConfig);\n case 'copilot':\n return new CopilotProvider(providerConfig);\n case 'ollama':\n return new OllamaProvider(providerConfig);\n case 'openrouter':\n return new OpenRouterProvider(providerConfig);\n default:\n throw new Error(`Unknown provider: ${config.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 ora, { type Ora } from 'ora';\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n spinner: 'dots',\n });\n}\n","import { confirm } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport {\n clearAllHistory,\n clearHistoryOlderThan,\n getHistoryCount,\n} from '../../core/history.js';\nimport { renderDangerBanner } from '../../utils/danger-ui.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class ClearHistoryCommand extends Command {\n static paths = [['--clear-history']];\n\n static usage = Command.Usage({\n description: 'Clear command history',\n examples: [\n ['Clear all history', '$0 --clear-history --all'],\n ['Clear entries older than 7 days', '$0 --clear-history --older-than 7'],\n ],\n });\n\n all = Option.Boolean('--all,-a', false, {\n description: 'Clear all history entries',\n });\n\n olderThan = Option.String('--older-than,-o', {\n description: 'Clear entries older than N days',\n });\n\n async execute(): Promise<number> {\n if (!this.all && !this.olderThan) {\n console.log(pc.bold('\\n Clear History\\n'));\n console.log(pc.gray(' Options:'));\n console.log(pc.gray(' --all Clear all history'));\n console.log(\n pc.gray(' --older-than N Clear entries older than N days'),\n );\n console.log();\n console.log(pc.dim(' Example: b --clear-history --older-than 30\\n'));\n return 1;\n }\n\n const currentCount = getHistoryCount();\n\n if (currentCount === 0) {\n logger.info('History is already empty.');\n return 0;\n }\n\n if (this.all) {\n console.log();\n for (const line of renderDangerBanner(\n `This will permanently delete ${currentCount} history entries.`,\n )) {\n console.log(line);\n }\n console.log();\n\n const confirmed = await confirm({\n message: 'Proceed with clearing all history?',\n default: false,\n });\n\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n\n const deleted = clearAllHistory();\n logger.success(`Cleared ${deleted} history entries.`);\n return 0;\n }\n\n if (this.olderThan) {\n const days = Number.parseInt(this.olderThan, 10);\n\n if (Number.isNaN(days) || days < 1) {\n logger.error('Invalid number of days.');\n return 1;\n }\n\n console.log();\n for (const line of renderDangerBanner(\n `This will permanently delete entries older than ${days} days.`,\n )) {\n console.log(line);\n }\n console.log();\n\n const confirmed = await confirm({\n message: `Proceed with clearing entries older than ${days} days?`,\n default: false,\n });\n\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n\n const deleted = clearHistoryOlderThan(days);\n\n if (deleted === 0) {\n logger.info(`No entries older than ${days} days.`);\n } else {\n logger.success(`Cleared ${deleted} entries older than ${days} days.`);\n }\n\n return 0;\n }\n\n return 0;\n }\n}\n","import pc from 'picocolors';\n\nexport const renderDangerBanner = (\n message: string,\n label: string = 'DANGER',\n): string[] => {\n const labelText = ` ${label} `;\n const spacer = ' ';\n const contentLength = labelText.length + spacer.length + message.length;\n const innerWidth = contentLength + 2;\n const border = '─'.repeat(innerWidth);\n\n const top = pc.red(` ┌${border}┐`);\n const middle =\n ` ${pc.red('│ ')}` +\n pc.bgRed(pc.white(labelText)) +\n pc.red(`${spacer}${message}`) +\n pc.red(' │');\n const bottom = pc.red(` └${border}┘`);\n\n return [top, middle, bottom];\n};\n","import { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { configExists, getConfigPath, loadConfig } from '../../core/config.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class ConfigCommand extends Command {\n static paths = [['config'], ['--config']];\n\n static usage = Command.Usage({\n description: 'View current Bashio configuration',\n examples: [['View config', '$0 --config']],\n });\n\n async execute(): Promise<number> {\n if (!configExists()) {\n logger.warn('Bashio is not configured yet.');\n console.log(pc.gray(\"Run 'b --auth' to set up your AI provider.\\n\"));\n return 1;\n }\n\n const config = loadConfig();\n if (!config) {\n logger.error('Failed to load configuration.');\n return 1;\n }\n\n console.log(pc.bold('\\n Bashio Configuration\\n'));\n console.log(` Provider: ${pc.cyan(config.provider)}`);\n console.log(` Model: ${pc.cyan(config.model)}`);\n console.log(` Auth: ${pc.green('Configured')}`);\n\n // Settings section\n const settings = config.settings;\n console.log();\n console.log(pc.bold(' Settings'));\n console.log(\n ` History: ${settings?.historyEnabled !== false ? pc.green('enabled') : pc.gray('disabled')}`,\n );\n console.log(\n ` Auto-confirm shortcuts: ${settings?.autoConfirmShortcuts ? pc.green('enabled') : pc.gray('disabled')}`,\n );\n\n console.log();\n console.log(pc.gray(` Config file: ${getConfigPath()}`));\n console.log();\n\n return 0;\n }\n}\n","import * as readline from 'node:readline';\nimport { confirm, input } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { runAuthSetup } from '../../core/auth.js';\nimport { configExists, loadConfig } from '../../core/config.js';\nimport { executeCommand } from '../../core/executor.js';\nimport { markExecuted, recordCommand } from '../../core/history.js';\nimport { tryResolveShortcut } from '../../core/shortcuts.js';\nimport { createProvider } from '../../providers/index.js';\nimport { copyToClipboard } from '../../utils/clipboard.js';\nimport { detectDangerousShellCommand } from '../../utils/danger.js';\nimport { renderDangerBanner } from '../../utils/danger-ui.js';\nimport { logger } from '../../utils/logger.js';\nimport { createSpinner } from '../../utils/spinner.js';\n\ntype ConfirmAction = 'yes' | 'no' | 'explain' | 'copy' | 'edit';\ntype CommandSource = 'shortcut' | 'ai';\n\ninterface ExecutionContext {\n queryText: string;\n historyId: number | null;\n historyEnabled: boolean;\n shortcutName?: string;\n}\n\nexport class DefaultCommand extends Command {\n static paths = [Command.Default];\n\n static usage = Command.Usage({\n description: 'Convert natural language to shell commands',\n examples: [\n ['Find large files', '$0 find files larger than 100mb'],\n ['Kill a port', '$0 kill whatever is running on port 3000'],\n ['Use a shortcut', '$0 killport 3000'],\n ],\n });\n\n query = Option.Rest({ required: 0 });\n\n async execute(): Promise<number> {\n if (this.query.length === 0) {\n this.showHelp();\n return 0;\n }\n\n // Load config for history settings\n const config = loadConfig();\n const historyEnabled = config?.settings?.historyEnabled !== false;\n\n // Step 1: Check if it's a shortcut\n const shortcut = await tryResolveShortcut(this.query);\n\n if (shortcut) {\n let historyId: number | null = null;\n\n if (historyEnabled) {\n historyId = recordCommand({\n query: this.query.join(' '),\n command: shortcut.command,\n source: 'shortcut',\n });\n }\n\n const context: ExecutionContext = {\n queryText: this.query.join(' '),\n historyId,\n historyEnabled,\n shortcutName: shortcut.name,\n };\n\n // Check if auto-confirm shortcuts is enabled\n if (config?.settings?.autoConfirmShortcuts) {\n return this.executeShortcutAutoConfirm(shortcut.command, context);\n }\n\n return this.executeWithConfirmation(\n shortcut.command,\n 'shortcut',\n context,\n );\n }\n\n // Step 2: Not a shortcut, use AI provider\n let currentConfig = config;\n if (!configExists() || !currentConfig) {\n const success = await runAuthSetup();\n if (!success) {\n return 1;\n }\n console.log(pc.green('Setup complete! Running your command...\\n'));\n currentConfig = loadConfig();\n if (!currentConfig) {\n logger.error('Failed to load configuration after setup.');\n return 1;\n }\n }\n\n const queryText = this.query.join(' ').trim();\n const provider = createProvider(currentConfig);\n const spinner = createSpinner('Generating command...').start();\n\n let generatedCommand: string;\n\n try {\n generatedCommand = await provider.generateCommand(queryText);\n spinner.stop();\n } catch (err) {\n spinner.fail('Failed to generate command');\n logger.error(err instanceof Error ? err.message : 'Unknown error');\n return 1;\n }\n\n generatedCommand = this.cleanCommand(generatedCommand);\n\n // Record history for AI command\n let historyId: number | null = null;\n if (historyEnabled) {\n historyId = recordCommand({\n query: queryText,\n command: generatedCommand,\n source: 'ai',\n });\n }\n\n return this.executeWithConfirmation(generatedCommand, 'ai', {\n queryText,\n historyId,\n historyEnabled,\n });\n }\n\n private showHelp(): void {\n console.log(pc.bold('\\n Bashio - Natural language to shell commands\\n'));\n console.log(' Usage:');\n console.log(pc.cyan(' b <natural language query>'));\n console.log(pc.cyan(' b <shortcut> [arguments]'));\n console.log();\n console.log(' Examples:');\n console.log(pc.gray(' b find all files larger than 100mb'));\n console.log(pc.gray(' b kill whatever is running on port 3000'));\n console.log(pc.gray(' b killport 3000') + pc.cyan(' (shortcut)'));\n console.log();\n console.log(' Commands:');\n console.log(pc.gray(' b --auth Configure AI provider'));\n console.log(\n pc.gray(' b --config View current configuration'),\n );\n console.log(pc.gray(' b --model Change AI model'));\n console.log(pc.gray(' b --shortcuts List all shortcuts'));\n console.log(pc.gray(' b --add-shortcut Add a new shortcut'));\n console.log(pc.gray(' b --remove-shortcut Remove a shortcut'));\n console.log(pc.gray(' b --edit-shortcuts Edit shortcuts in editor'));\n console.log();\n console.log(' History & Stats:');\n console.log(pc.gray(' b --history View command history'));\n console.log(pc.gray(' b --stats View usage statistics'));\n console.log(pc.gray(' b --clear-history Clear command history'));\n console.log(pc.gray(' b --suggest-shortcuts Suggest new shortcuts'));\n console.log();\n console.log(pc.gray(' b --help Show help'));\n console.log();\n }\n\n private async executeWithConfirmation(\n command: string,\n source: CommandSource,\n context: ExecutionContext,\n ): Promise<number> {\n let currentCommand = command;\n\n console.log();\n\n if (source === 'shortcut' && context.shortcutName) {\n console.log(pc.gray(` [shortcut: ${context.shortcutName}]`));\n }\n\n logger.command(currentCommand);\n console.log();\n\n let action = await this.promptConfirmation();\n\n while (action !== 'yes' && action !== 'no' && action !== 'copy') {\n if (action === 'explain') {\n if (source === 'shortcut') {\n console.log(\n pc.gray('\\n This command comes from a shortcut, not AI.\\n'),\n );\n } else {\n const explainConfig = loadConfig();\n if (explainConfig) {\n const provider = createProvider(explainConfig);\n const explainSpinner = createSpinner(\n 'Getting explanation...',\n ).start();\n try {\n const explanation = await provider.explainCommand(currentCommand);\n explainSpinner.stop();\n console.log();\n console.log(pc.bold(' Explanation:'));\n console.log(pc.gray(` ${explanation.split('\\n').join('\\n ')}`));\n console.log();\n } catch {\n explainSpinner.fail('Failed to get explanation');\n }\n }\n }\n } else if (action === 'edit') {\n try {\n const edited = await this.editCommandInline(currentCommand);\n currentCommand = edited.trim();\n console.log();\n logger.command(currentCommand);\n console.log();\n } catch {\n logger.error('Edit cancelled');\n }\n }\n\n action = await this.promptConfirmation();\n }\n\n // Handle copy - just copy and exit\n if (action === 'copy') {\n const success = await copyToClipboard(currentCommand);\n if (success) {\n logger.success('Copied to clipboard!');\n } else {\n logger.error('Failed to copy to clipboard');\n }\n console.log();\n return 0;\n }\n\n if (action === 'no') {\n logger.info('Cancelled.');\n return 0;\n }\n\n const danger = detectDangerousShellCommand(currentCommand);\n if (danger) {\n const confirmed = await this.promptDangerConfirmation(\n currentCommand,\n danger.reasons,\n );\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n }\n\n console.log();\n\n const result = await executeCommand(currentCommand);\n\n // Only show exit code if command failed\n if (result.exitCode !== 0) {\n console.log();\n logger.exitCode(result.exitCode);\n }\n console.log();\n\n // Update history with execution result\n if (context.historyEnabled && context.historyId !== null) {\n markExecuted(context.historyId, result.exitCode);\n }\n\n return result.exitCode;\n }\n\n private async executeShortcutAutoConfirm(\n command: string,\n context: ExecutionContext,\n ): Promise<number> {\n // Still check for dangerous commands even with auto-confirm\n const danger = detectDangerousShellCommand(command);\n if (danger) {\n console.log();\n if (context.shortcutName) {\n console.log(pc.gray(` [shortcut: ${context.shortcutName}]`));\n }\n logger.command(command);\n console.log();\n\n const confirmed = await this.promptDangerConfirmation(\n command,\n danger.reasons,\n );\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n }\n\n console.log();\n\n const result = await executeCommand(command);\n\n // Only show exit code if command failed\n if (result.exitCode !== 0) {\n console.log();\n logger.exitCode(result.exitCode);\n }\n console.log();\n\n // Update history with execution result\n if (context.historyEnabled && context.historyId !== null) {\n markExecuted(context.historyId, result.exitCode);\n }\n\n return result.exitCode;\n }\n\n private cleanCommand(command: string): string {\n let cleaned = command.trim();\n\n if (cleaned.startsWith('```')) {\n const lines = cleaned.split('\\n');\n const startIdx = lines[0].startsWith('```') ? 1 : 0;\n const endIdx =\n lines[lines.length - 1] === '```' ? lines.length - 1 : lines.length;\n cleaned = lines.slice(startIdx, endIdx).join('\\n');\n }\n\n cleaned = cleaned.replace(/^`|`$/g, '');\n\n return cleaned.trim();\n }\n\n private async promptConfirmation(): Promise<ConfirmAction> {\n const answer = await input({\n message: 'Execute? (y/n/e/c/edit)',\n default: 'y',\n });\n\n const normalized = answer.toLowerCase().trim();\n\n if (['y', 'yes', ''].includes(normalized)) {\n return 'yes';\n }\n if (['e', 'explain'].includes(normalized)) {\n return 'explain';\n }\n if (['c', 'copy'].includes(normalized)) {\n return 'copy';\n }\n if (['edit'].includes(normalized)) {\n return 'edit';\n }\n return 'no';\n }\n\n private async promptDangerConfirmation(\n command: string,\n reasons: string[],\n ): Promise<boolean> {\n for (const line of renderDangerBanner(\n 'This command may cause irreversible changes.',\n )) {\n console.log(line);\n }\n console.log();\n console.log(pc.yellow(' Reasons:'));\n for (const reason of reasons) {\n console.log(pc.yellow(` - ${reason}`));\n }\n console.log();\n console.log(pc.gray(' Command:'));\n console.log(pc.cyan(` ${command}`));\n console.log();\n\n return confirm({\n message: 'Proceed with this command?',\n default: false,\n });\n }\n\n private editCommandInline(currentCommand: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n // Show the prompt\n process.stdout.write(`${pc.green('?')} ${pc.bold('Edit command:')} `);\n\n // Pre-fill the input with current command\n rl.write(currentCommand);\n\n rl.on('line', (answer) => {\n rl.close();\n resolve(answer || currentCommand);\n });\n\n rl.on('close', () => {\n resolve(currentCommand);\n });\n\n rl.on('SIGINT', () => {\n rl.close();\n reject(new Error('Edit cancelled'));\n });\n });\n }\n}\n","import { spawn } from 'node:child_process';\n\nexport interface ExecutionResult {\n exitCode: number;\n stdout: string;\n stderr: string;\n}\n\nexport function executeCommand(command: string): Promise<ExecutionResult> {\n return new Promise((resolve) => {\n const shell = process.platform === 'win32' ? 'cmd' : '/bin/sh';\n const shellArg = process.platform === 'win32' ? '/c' : '-c';\n\n // Use 'inherit' for all stdio to allow TUI apps (like opencode)\n // direct TTY access for proper terminal size detection and rendering\n const child = spawn(shell, [shellArg, command], {\n stdio: 'inherit',\n cwd: process.cwd(),\n env: process.env,\n });\n\n child.on('close', (code) => {\n resolve({\n exitCode: code ?? 1,\n stdout: '',\n stderr: '',\n });\n });\n\n child.on('error', (err) => {\n resolve({\n exitCode: 1,\n stdout: '',\n stderr: err.message,\n });\n });\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","export interface DangerMatch {\n reasons: string[];\n}\n\ninterface DangerPattern {\n pattern: RegExp;\n reason: string;\n}\n\nconst DANGEROUS_PATTERNS: DangerPattern[] = [\n {\n pattern: /\\b(?:rm|rmdir)\\b[^\\n]*(?:-rf|-fr|--recursive|--force|-r\\b)/i,\n reason: 'Recursively removes files or directories',\n },\n {\n pattern:\n /\\b(?:mkfs|mkfs\\.[a-z0-9]+|format|diskpart|diskutil|fdisk|parted)\\b/i,\n reason: 'Formats or repartitions disks/filesystems',\n },\n {\n pattern: /\\bdd\\b/i,\n reason: 'Writes raw data to disks or devices',\n },\n {\n pattern: /\\b(?:shutdown|reboot|poweroff|halt)\\b/i,\n reason: 'Shuts down or reboots the system',\n },\n {\n pattern:\n /\\b(?:userdel|deluser|groupdel|dscl\\b[^\\n]*-delete|net\\s+user\\b[^\\n]*\\/delete)\\b/i,\n reason: 'Deletes system users or groups',\n },\n {\n pattern: /:\\s*\\(\\s*\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;\\s*:/,\n reason: 'Fork bomb pattern',\n },\n {\n pattern: /\\b(?:chmod|chown)\\b[^\\n]*\\s-?R\\b/i,\n reason: 'Recursively changes permissions or ownership',\n },\n {\n pattern: /\\b(?:git\\s+reset\\s+--hard|git\\s+clean\\s+-fd)\\b/i,\n reason: 'Discards uncommitted changes',\n },\n {\n pattern: /\\b(?:rd|rmdir)\\b[^\\n]*\\s\\/s\\b/i,\n reason: 'Recursively removes directories (Windows)',\n },\n {\n pattern: /\\bdel\\b[^\\n]*\\s\\/f\\b/i,\n reason: 'Force deletes files (Windows)',\n },\n];\n\nexport const detectDangerousShellCommand = (\n command: string,\n): DangerMatch | null => {\n const trimmed = command.trim();\n if (!trimmed) {\n return null;\n }\n\n const reasons: string[] = [];\n\n for (const entry of DANGEROUS_PATTERNS) {\n if (entry.pattern.test(trimmed)) {\n reasons.push(entry.reason);\n }\n }\n\n if (reasons.length === 0) {\n return null;\n }\n\n return { reasons };\n};\n","import { spawn } from 'node:child_process';\nimport { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport {\n getShortcutsFilePath,\n saveShortcuts,\n shortcutsFileExists,\n} from '../../core/shortcuts.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class EditShortcutsCommand extends Command {\n static paths = [['edit-shortcuts'], ['--edit-shortcuts']];\n\n static usage = Command.Usage({\n description: 'Open shortcuts file in your default editor',\n examples: [['Edit shortcuts', '$0 --edit-shortcuts']],\n });\n\n async execute(): Promise<number> {\n const filePath = getShortcutsFilePath();\n\n // Create file with empty shortcuts if it doesn't exist\n if (!shortcutsFileExists()) {\n saveShortcuts({ version: 1, shortcuts: {} });\n logger.info('Created new shortcuts file.');\n }\n\n // Get editor from environment\n const editor =\n process.env.EDITOR || process.env.VISUAL || this.getDefaultEditor();\n\n if (!editor) {\n logger.error('No editor found. Set $EDITOR environment variable.');\n console.log(pc.gray(`\\n Example: export EDITOR=vim`));\n console.log(pc.gray(` Or: export EDITOR=\"code --wait\"`));\n console.log(pc.gray(`\\n File location: ${filePath}\\n`));\n return 1;\n }\n\n console.log(pc.gray(`\\n Opening ${filePath} in ${editor}...\\n`));\n\n return new Promise((resolve) => {\n // Parse editor command (handle \"code --wait\" style)\n const parts = editor.split(' ');\n const editorCmd = parts[0];\n const editorArgs = [...parts.slice(1), filePath];\n\n const child = spawn(editorCmd, editorArgs, {\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('close', (code) => {\n if (code === 0) {\n logger.success('Shortcuts file saved.');\n } else {\n logger.warn('Editor closed with non-zero exit code.');\n }\n console.log();\n resolve(code ?? 0);\n });\n\n child.on('error', (err) => {\n logger.error(`Failed to open editor: ${err.message}`);\n console.log(pc.gray(`\\n File location: ${filePath}\\n`));\n resolve(1);\n });\n });\n }\n\n private getDefaultEditor(): string | null {\n const platform = process.platform;\n\n if (platform === 'darwin') {\n return 'nano';\n }\n if (platform === 'win32') {\n return 'notepad';\n }\n // Linux\n return 'nano';\n }\n}\n","import { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { getRecentHistory, searchHistory } from '../../core/history.js';\nimport type { HistoryEntry } from '../../core/types.js';\nimport { renderTable } from '../../utils/table.js';\n\nexport class HistoryCommand extends Command {\n static paths = [['--history']];\n\n static usage = Command.Usage({\n description: 'View command history',\n examples: [\n ['View recent history', '$0 --history'],\n ['Limit results', '$0 --history --limit 10'],\n ['Search history', '$0 --history --search git'],\n ],\n });\n\n limit = Option.String('--limit,-l', '20', {\n description: 'Number of entries to show',\n });\n\n search = Option.String('--search,-s', {\n description: 'Search term to filter history',\n });\n\n async execute(): Promise<number> {\n const limitNum = Number.parseInt(this.limit, 10) || 20;\n\n let entries: HistoryEntry[];\n let title: string;\n\n if (this.search) {\n entries = searchHistory(this.search, limitNum);\n title = `Command History (search: \"${this.search}\")`;\n } else {\n entries = getRecentHistory(limitNum);\n title = 'Recent Command History';\n }\n\n if (entries.length === 0) {\n console.log(pc.bold(`\\n ${title}\\n`));\n console.log(pc.gray(' No history entries found.\\n'));\n return 0;\n }\n\n // Prepare data for table\n const data = entries.map((entry, index) => ({\n num: (index + 1).toString(),\n command: entry.command,\n query: entry.source === 'ai' ? entry.query : '-',\n source: entry.source,\n status: this.getStatusDisplay(entry),\n time: this.getTimeAgo(entry.createdAt),\n }));\n\n // Render table\n renderTable({\n title,\n columns: [\n { header: '#', key: 'num', width: 3, align: 'right' },\n { header: 'Command', key: 'command', width: 35, color: pc.yellow },\n { header: 'Query', key: 'query', width: 25, color: pc.gray },\n {\n header: 'Source',\n key: 'source',\n width: 8,\n color: (v) => (v.trim() === 'ai' ? pc.blue(v) : pc.cyan(v)),\n },\n { header: 'Status', key: 'status', width: 10 },\n { header: 'Time', key: 'time', width: 10 },\n ],\n data,\n });\n\n console.log(pc.dim(`\\n Showing ${entries.length} entries\\n`));\n\n return 0;\n }\n\n private getStatusDisplay(entry: HistoryEntry): string {\n if (entry.executed === 0) {\n return `${pc.gray('○')} skipped`;\n }\n if (entry.exitCode === 0) {\n return `${pc.green('✓')} success`;\n }\n return `${pc.red('✗')} exit:${entry.exitCode}`;\n }\n\n private getTimeAgo(isoString: string): string {\n const date = new Date(isoString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n\n const minutes = Math.floor(diffMs / (1000 * 60));\n const hours = Math.floor(diffMs / (1000 * 60 * 60));\n const days = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (minutes < 1) return 'just now';\n if (minutes < 60) return `${minutes}m ago`;\n if (hours < 24) return `${hours}h ago`;\n if (days < 7) return `${days}d ago`;\n\n return date.toLocaleDateString();\n }\n}\n","import pc from 'picocolors';\n\ninterface Column {\n header: string;\n key: string;\n width: number;\n align?: 'left' | 'right' | 'center';\n color?: (value: string) => string;\n}\n\ninterface TableOptions {\n columns: Column[];\n data: Record<string, string>[];\n title?: string;\n}\n\nconst BOX = {\n topLeft: '┌',\n topRight: '┐',\n bottomLeft: '└',\n bottomRight: '┘',\n horizontal: '─',\n vertical: '│',\n topMid: '┬',\n bottomMid: '┴',\n leftMid: '├',\n rightMid: '┤',\n midMid: '┼',\n};\n\nfunction padString(\n str: string,\n width: number,\n align: 'left' | 'right' | 'center' = 'left',\n): string {\n const strippedLength = stripAnsi(str).length;\n const padding = Math.max(0, width - strippedLength);\n\n if (align === 'right') {\n return ' '.repeat(padding) + str;\n }\n if (align === 'center') {\n const leftPad = Math.floor(padding / 2);\n const rightPad = padding - leftPad;\n return ' '.repeat(leftPad) + str + ' '.repeat(rightPad);\n }\n return str + ' '.repeat(padding);\n}\n\nfunction stripAnsi(str: string): string {\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Required for ANSI escape code stripping\n return str.replace(/\\x1B\\[[0-9;]*m/g, '');\n}\n\nfunction wrapText(text: string, maxWidth: number): string[] {\n const words = text.split(' ');\n const lines: string[] = [];\n let currentLine = '';\n\n for (const word of words) {\n const testLine = currentLine ? `${currentLine} ${word}` : word;\n\n if (stripAnsi(testLine).length <= maxWidth) {\n currentLine = testLine;\n } else {\n if (currentLine) {\n lines.push(currentLine);\n }\n // If single word is longer than maxWidth, truncate it\n if (stripAnsi(word).length > maxWidth) {\n currentLine = `${word.slice(0, maxWidth - 3)}...`;\n } else {\n currentLine = word;\n }\n }\n }\n\n if (currentLine) {\n lines.push(currentLine);\n }\n\n return lines.length > 0 ? lines : [''];\n}\n\nexport function renderTable(options: TableOptions): void {\n const { columns, data, title } = options;\n\n // Print title if provided\n if (title) {\n console.log(pc.bold(`\\n ${title}\\n`));\n }\n\n // Top border\n let topBorder = ` ${BOX.topLeft}`;\n for (let i = 0; i < columns.length; i++) {\n topBorder += BOX.horizontal.repeat(columns[i].width + 2);\n topBorder += i < columns.length - 1 ? BOX.topMid : BOX.topRight;\n }\n console.log(pc.dim(topBorder));\n\n // Header row\n let headerRow = ` ${BOX.vertical}`;\n for (const col of columns) {\n headerRow += ` ${pc.bold(padString(col.header, col.width, col.align))} ${BOX.vertical}`;\n }\n console.log(\n pc.dim(headerRow.slice(0, 2)) +\n headerRow.slice(2, -1) +\n pc.dim(BOX.vertical),\n );\n\n // Header separator\n let headerSep = ` ${BOX.leftMid}`;\n for (let i = 0; i < columns.length; i++) {\n headerSep += BOX.horizontal.repeat(columns[i].width + 2);\n headerSep += i < columns.length - 1 ? BOX.midMid : BOX.rightMid;\n }\n console.log(pc.dim(headerSep));\n\n // Data rows\n for (const row of data) {\n // Wrap text for each column that needs it\n const wrappedColumns: string[][] = columns.map((col) => {\n const value = row[col.key] || '';\n return wrapText(value, col.width);\n });\n\n // Find max lines needed for this row\n const maxLines = Math.max(...wrappedColumns.map((lines) => lines.length));\n\n // Print each line of the row\n for (let lineIdx = 0; lineIdx < maxLines; lineIdx++) {\n let dataRow = ` ${BOX.vertical}`;\n\n for (let colIdx = 0; colIdx < columns.length; colIdx++) {\n const col = columns[colIdx];\n const lines = wrappedColumns[colIdx];\n const lineValue = lines[lineIdx] || '';\n\n let cellValue = padString(lineValue, col.width, col.align);\n\n // Apply color if provided and this is not an empty continuation line\n if (col.color && lineValue) {\n cellValue = col.color(cellValue);\n }\n\n dataRow += ` ${cellValue} ${BOX.vertical}`;\n }\n\n console.log(\n pc.dim(dataRow.slice(0, 2)) +\n dataRow.slice(2, -1) +\n pc.dim(BOX.vertical),\n );\n }\n }\n\n // Bottom border\n let bottomBorder = ` ${BOX.bottomLeft}`;\n for (let i = 0; i < columns.length; i++) {\n bottomBorder += BOX.horizontal.repeat(columns[i].width + 2);\n bottomBorder += i < columns.length - 1 ? BOX.bottomMid : BOX.bottomRight;\n }\n console.log(pc.dim(bottomBorder));\n}\n\nexport function renderSimpleTable(\n headers: string[],\n rows: string[][],\n title?: string,\n): void {\n const columns: Column[] = headers.map((header, idx) => {\n const maxDataWidth = Math.max(\n ...rows.map((row) => stripAnsi(row[idx] || '').length),\n );\n const width = Math.max(header.length, maxDataWidth, 5);\n return { header, key: `col${idx}`, width: Math.min(width, 40) };\n });\n\n const data = rows.map((row) => {\n const obj: Record<string, string> = {};\n headers.forEach((_, idx) => {\n obj[`col${idx}`] = row[idx] || '';\n });\n return obj;\n });\n\n renderTable({ columns, data, title });\n}\n","import * as readline from 'node:readline';\nimport { select } from '@inquirer/prompts';\nimport { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { configExists, loadConfig, saveConfig } from '../../core/config.js';\nimport {\n CHATGPT_SUBSCRIPTION_MODELS,\n CLAUDE_MODELS,\n CLAUDE_SUBSCRIPTION_MODELS,\n COPILOT_MODELS,\n OllamaProvider,\n OPENAI_MODELS,\n OPENROUTER_MODELS,\n} from '../../providers/index.js';\nimport { logger } from '../../utils/logger.js';\nimport { createSpinner } from '../../utils/spinner.js';\n\ntype SelectConfig<Value> = Parameters<typeof select<Value>>[0];\n\ntype KeypressHandler = (input: string, key: readline.Key) => void;\n\ntype KeypressInput = NodeJS.ReadStream & {\n on(event: 'keypress', listener: KeypressHandler): void;\n off(event: 'keypress', listener: KeypressHandler): void;\n setRawMode?: (mode: boolean) => void;\n isTTY?: boolean;\n isRaw?: boolean;\n};\n\nconst selectWithEsc = async <Value>(\n config: SelectConfig<Value>,\n): Promise<Value> => {\n const controller = new AbortController();\n const input = process.stdin as KeypressInput;\n const previousRawMode: boolean | null =\n input.isTTY && typeof input.isRaw === 'boolean' ? input.isRaw : null;\n\n const onKeypress: KeypressHandler = (_input, key) => {\n if (key.name === 'escape') {\n controller.abort();\n }\n };\n\n readline.emitKeypressEvents(input);\n\n if (input.isTTY && typeof input.setRawMode === 'function') {\n input.setRawMode(true);\n }\n\n input.on('keypress', onKeypress);\n\n try {\n return await select<Value>(config, { signal: controller.signal });\n } finally {\n input.off('keypress', onKeypress);\n if (\n input.isTTY &&\n typeof input.setRawMode === 'function' &&\n previousRawMode !== null\n ) {\n input.setRawMode(previousRawMode);\n }\n }\n};\n\nconst isPromptExit = (error: unknown): boolean => {\n if (!(error instanceof Error)) {\n return false;\n }\n\n return (\n error.name === 'ExitPromptError' ||\n error.name === 'AbortPromptError' ||\n error.name === 'CancelPromptError'\n );\n};\n\nexport class ModelCommand extends Command {\n static paths = [['model'], ['--model']];\n\n static usage = Command.Usage({\n description: 'Change the AI model for current provider',\n examples: [['Change model', '$0 --model']],\n });\n\n async execute(): Promise<number> {\n if (!configExists()) {\n logger.warn('Bashio is not configured yet.');\n console.log(\n pc.gray(\"Run 'b --auth' to set up your AI provider first.\\n\"),\n );\n return 1;\n }\n\n const config = loadConfig();\n if (!config) {\n logger.error('Failed to load configuration.');\n return 1;\n }\n\n console.log(pc.bold('\\n Change AI Model\\n'));\n console.log(pc.gray(` Current provider: ${config.provider}`));\n console.log(pc.gray(` Current model: ${config.model}`));\n console.log(pc.dim(' Press Esc to cancel\\n'));\n\n let newModel: string;\n\n try {\n switch (config.provider) {\n case 'claude': {\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: CLAUDE_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n default: config.model,\n });\n break;\n }\n\n case 'openai': {\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: OPENAI_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n default: config.model,\n });\n break;\n }\n\n case 'ollama': {\n const host =\n config.credentials.type === 'local'\n ? config.credentials.host\n : 'http://localhost:11434';\n\n const spinner = createSpinner('Fetching available models...').start();\n const availableModels = await OllamaProvider.getAvailableModels(host);\n spinner.stop();\n\n if (availableModels.length === 0) {\n logger.warn('No models found. Make sure Ollama is running.');\n console.log(pc.gray('\\n Install a model: ollama pull llama3.2\\n'));\n return 1;\n }\n\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: availableModels.map((m) => ({\n value: m,\n name: m,\n })),\n default: config.model,\n });\n break;\n }\n\n case 'openrouter': {\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: OPENROUTER_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n default: config.model,\n });\n break;\n }\n\n case 'claude-subscription': {\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: CLAUDE_SUBSCRIPTION_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n default: config.model,\n });\n break;\n }\n\n case 'chatgpt-subscription': {\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: CHATGPT_SUBSCRIPTION_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n default: config.model,\n });\n break;\n }\n\n case 'copilot': {\n newModel = await selectWithEsc<string>({\n message: 'Select new model:',\n choices: COPILOT_MODELS.map((m) => ({\n value: m.value,\n name: m.label,\n })),\n default: config.model,\n });\n break;\n }\n\n default:\n logger.error(`Unknown provider: ${config.provider}`);\n return 1;\n }\n } catch (error) {\n if (isPromptExit(error)) {\n console.log(pc.dim('\\n Cancelled.\\n'));\n return 0;\n }\n throw error;\n }\n\n if (newModel === config.model) {\n logger.info('Model unchanged.');\n return 0;\n }\n\n config.model = newModel;\n saveConfig(config);\n\n console.log();\n logger.success(`Model changed to: ${newModel}`);\n console.log();\n\n return 0;\n }\n}\n","import { confirm } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { getShortcut, removeShortcut } from '../../core/shortcuts.js';\nimport { renderDangerBanner } from '../../utils/danger-ui.js';\nimport { logger } from '../../utils/logger.js';\n\nexport class RemoveShortcutCommand extends Command {\n static paths = [['remove-shortcut'], ['--remove-shortcut']];\n\n static usage = Command.Usage({\n description: 'Remove a shortcut',\n examples: [['Remove shortcut', '$0 --remove-shortcut killport']],\n });\n\n name = Option.String({ required: true });\n\n async execute(): Promise<number> {\n const shortcut = getShortcut(this.name);\n\n if (!shortcut) {\n logger.error(`Shortcut \"${this.name}\" not found.`);\n return 1;\n }\n\n console.log();\n console.log(pc.gray(` Template: ${shortcut.template}`));\n if (shortcut.description) {\n console.log(pc.gray(` Description: ${shortcut.description}`));\n }\n console.log();\n\n for (const line of renderDangerBanner(\n `This will permanently remove shortcut \"${this.name}\".`,\n )) {\n console.log(line);\n }\n console.log();\n\n const confirmed = await confirm({\n message: `Proceed with removing \"${this.name}\"?`,\n default: false,\n });\n\n if (!confirmed) {\n logger.info('Cancelled.');\n return 0;\n }\n\n removeShortcut(this.name);\n logger.success(`Shortcut \"${this.name}\" removed.`);\n console.log();\n\n return 0;\n }\n}\n","import { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { listShortcuts } from '../../core/shortcuts.js';\nimport { renderTable } from '../../utils/table.js';\n\nexport class ShortcutsCommand extends Command {\n static paths = [['shortcuts'], ['--shortcuts']];\n\n static usage = Command.Usage({\n description: 'List all configured shortcuts',\n examples: [['List shortcuts', '$0 --shortcuts']],\n });\n\n async execute(): Promise<number> {\n const shortcuts = listShortcuts();\n const names = Object.keys(shortcuts);\n\n if (names.length === 0) {\n console.log(pc.yellow('\\n No shortcuts configured yet.\\n'));\n console.log(pc.gray(' Add one with: b --add-shortcut\\n'));\n return 0;\n }\n\n const data = names.map((name) => {\n const shortcut = shortcuts[name];\n return {\n name,\n template: shortcut.template,\n args: shortcut.args?.length ? shortcut.args.join(', ') : '-',\n };\n });\n\n renderTable({\n title: 'Your Shortcuts',\n columns: [\n { header: 'Name', key: 'name', width: 15, color: pc.cyan },\n {\n header: 'Command Template',\n key: 'template',\n width: 45,\n color: pc.white,\n },\n { header: 'Arguments', key: 'args', width: 15, color: pc.gray },\n ],\n data,\n });\n\n console.log(\n pc.dim(\n `\\n Total: ${names.length} shortcut${names.length === 1 ? '' : 's'}\\n`,\n ),\n );\n\n return 0;\n }\n}\n","import { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { getStats } from '../../core/history.js';\nimport { renderTable } from '../../utils/table.js';\n\nexport class StatsCommand extends Command {\n static paths = [['--stats']];\n\n static usage = Command.Usage({\n description: 'View usage statistics',\n examples: [['View stats', '$0 --stats']],\n });\n\n async execute(): Promise<number> {\n const stats = getStats();\n\n console.log(pc.bold('\\n Bashio Usage Statistics\\n'));\n\n // Overview stats table\n renderTable({\n title: 'Overview',\n columns: [\n { header: 'Metric', key: 'metric', width: 20 },\n { header: 'Value', key: 'value', width: 15, align: 'right' },\n ],\n data: [\n { metric: 'Commands Generated', value: stats.totalCommands.toString() },\n {\n metric: 'Executed',\n value: `${stats.totalExecuted} (${stats.executionRate}%)`,\n },\n { metric: 'Today', value: stats.todayCommands.toString() },\n { metric: 'This Week', value: stats.thisWeekCommands.toString() },\n ],\n });\n\n console.log();\n\n // Source breakdown table\n const total = stats.aiCount + stats.shortcutCount;\n const aiPercent = total > 0 ? Math.round((stats.aiCount / total) * 100) : 0;\n const shortcutPercent =\n total > 0 ? Math.round((stats.shortcutCount / total) * 100) : 0;\n\n renderTable({\n title: 'Source Breakdown',\n columns: [\n { header: 'Source', key: 'source', width: 15 },\n { header: 'Count', key: 'count', width: 10, align: 'right' },\n { header: 'Percentage', key: 'percent', width: 12, align: 'right' },\n ],\n data: [\n {\n source: 'AI Generated',\n count: stats.aiCount.toString(),\n percent: `${aiPercent}%`,\n },\n {\n source: 'Shortcuts',\n count: stats.shortcutCount.toString(),\n percent: `${shortcutPercent}%`,\n },\n ],\n });\n\n // Top queries table (if any)\n if (stats.topQueries.length > 0) {\n console.log();\n\n renderTable({\n title: 'Most Used Commands',\n columns: [\n { header: '#', key: 'rank', width: 3, align: 'right' },\n { header: 'Command', key: 'command', width: 45, color: pc.cyan },\n { header: 'Uses', key: 'uses', width: 8, align: 'right' },\n {\n header: 'Source',\n key: 'source',\n width: 10,\n color: (v) => (v.trim() === 'ai' ? pc.blue(v) : pc.cyan(v)),\n },\n ],\n data: stats.topQueries.map((q, i) => ({\n rank: (i + 1).toString(),\n command: q.query.length > 42 ? `${q.query.slice(0, 39)}...` : q.query,\n uses: q.useCount.toString(),\n source: q.source,\n })),\n });\n }\n\n console.log();\n\n return 0;\n }\n}\n","import { confirm, input } from '@inquirer/prompts';\nimport { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport {\n getShortcutSuggestions,\n markPatternAsSuggested,\n} from '../../core/learning.js';\nimport { addShortcut, getShortcut } from '../../core/shortcuts.js';\nimport type { ShortcutDefinition } from '../../core/types.js';\nimport { logger } from '../../utils/logger.js';\n\ntype SuggestionAction = 'yes' | 'no' | 'exit';\n\nexport class SuggestShortcutsCommand extends Command {\n static paths = [['--suggest-shortcuts']];\n\n static usage = Command.Usage({\n description: 'Suggest shortcuts based on frequently used commands',\n examples: [\n ['Get suggestions', '$0 --suggest-shortcuts'],\n ['Set minimum use count', '$0 --suggest-shortcuts --threshold 5'],\n ],\n });\n\n threshold = Option.String('--threshold,-t', '3', {\n description: 'Minimum use count to suggest (default: 3)',\n });\n\n async execute(): Promise<number> {\n const thresholdNum = Number.parseInt(this.threshold, 10) || 3;\n const suggestions = getShortcutSuggestions(thresholdNum);\n\n console.log(pc.bold('\\n Shortcut Suggestions\\n'));\n\n if (suggestions.length === 0) {\n console.log(\n pc.gray(\n ' No suggestions yet. Use Bashio more to get personalized suggestions.',\n ),\n );\n console.log(\n pc.dim(` (Commands need to be used ${thresholdNum}+ times)\\n`),\n );\n return 0;\n }\n\n console.log(\n pc.dim(\n ` Found ${suggestions.length} frequently used commands that could be shortcuts:\\n`,\n ),\n );\n\n for (const suggestion of suggestions) {\n console.log(pc.dim(' ────────────────────────────────────────'));\n console.log(` ${pc.yellow('Command:')} ${pc.cyan(suggestion.command)}`);\n console.log(\n ` ${pc.yellow('Used:')} ${pc.white(suggestion.useCount.toString())} times`,\n );\n console.log();\n\n const action = await this.promptCreateShortcut();\n\n if (action === 'exit') {\n console.log(pc.dim('\\n Exiting suggestions.\\n'));\n return 0;\n }\n\n if (action === 'yes') {\n // Step 1: Get unique shortcut name from user (with validation loop)\n const finalName = await this.getUniqueShortcutName(\n suggestion.suggestedName,\n );\n\n if (!finalName) {\n // User cancelled\n markPatternAsSuggested(suggestion.command);\n console.log();\n continue;\n }\n\n // Step 2: Check if command has numbers/parameters\n const hasNumbers = /\\d+/.test(suggestion.command);\n let template = suggestion.command;\n const args: string[] = [];\n\n if (hasNumbers) {\n const parameterize = await confirm({\n message: 'Make numbers into parameters?',\n default: true,\n });\n\n if (parameterize) {\n const numbers = suggestion.command.match(/\\d+/g) || [];\n const uniqueNumbers = [...new Set(numbers)];\n\n for (let i = 0; i < uniqueNumbers.length; i++) {\n const argName = `arg${i + 1}`;\n args.push(argName);\n template = template.replace(\n new RegExp(uniqueNumbers[i], 'g'),\n `{{${argName}}}`,\n );\n }\n }\n }\n\n // Step 3: Create the shortcut\n addShortcut(finalName, {\n template,\n args,\n description: `Auto-suggested shortcut for: ${suggestion.command}`,\n });\n\n markPatternAsSuggested(suggestion.command);\n\n logger.success(`✓ Created shortcut: ${finalName}`);\n console.log(\n pc.dim(\n ` Usage: b ${finalName}${args.length > 0 ? ` ${args.map((a) => `<${a}>`).join(' ')}` : ''}`,\n ),\n );\n console.log();\n } else {\n // action === 'no'\n markPatternAsSuggested(suggestion.command);\n console.log();\n }\n }\n\n console.log(pc.dim(' ────────────────────────────────────────\\n'));\n\n return 0;\n }\n\n private async promptCreateShortcut(): Promise<SuggestionAction> {\n const answer = await input({\n message: 'Create shortcut? (y/n/e)',\n default: 'y',\n });\n\n const normalized = answer.toLowerCase().trim();\n\n if (['y', 'yes', ''].includes(normalized)) {\n return 'yes';\n }\n if (['e', 'exit'].includes(normalized)) {\n return 'exit';\n }\n return 'no';\n }\n\n private async getUniqueShortcutName(\n defaultName: string,\n ): Promise<string | null> {\n let attempts = 0;\n const maxAttempts = 5;\n\n while (attempts < maxAttempts) {\n const enteredName = await input({\n message: 'Shortcut name:',\n default: defaultName,\n });\n\n const finalName = enteredName.trim();\n\n if (!finalName) {\n logger.error('Shortcut name cannot be empty.');\n attempts++;\n continue;\n }\n\n // Check if shortcut already exists\n const existingShortcut = getShortcut(finalName);\n\n if (existingShortcut) {\n // Show table with existing shortcut details\n this.showExistingShortcutTable(finalName, existingShortcut);\n attempts++;\n continue;\n }\n\n // Name is valid and unique\n return finalName;\n }\n\n // Max attempts reached\n logger.error('Too many invalid attempts. Skipping this suggestion.');\n return null;\n }\n\n private showExistingShortcutTable(\n name: string,\n shortcut: ShortcutDefinition,\n ): void {\n const boxWidth = 50;\n const line = '─'.repeat(boxWidth);\n\n console.log();\n console.log(pc.red(` ┌${line}┐`));\n console.log(\n pc.red(' │') +\n pc.bold(pc.red(' ❌ Shortcut Already Exists')) +\n ' '.repeat(boxWidth - 27) +\n pc.red('│'),\n );\n console.log(pc.red(` ├${line}┤`));\n\n // Name row\n const nameLabel = ' Name: ';\n const nameValue = name;\n const namePadding = boxWidth - nameLabel.length - nameValue.length + 2;\n console.log(\n pc.red(' │') +\n pc.gray(nameLabel) +\n pc.white(nameValue) +\n ' '.repeat(Math.max(0, namePadding)) +\n pc.red('│'),\n );\n\n // Command row (may wrap if too long)\n const cmdLabel = ' Command: ';\n const cmdValue =\n shortcut.template.length > 35\n ? `${shortcut.template.slice(0, 32)}...`\n : shortcut.template;\n const cmdPadding = boxWidth - cmdLabel.length - cmdValue.length + 2;\n console.log(\n pc.red(' │') +\n pc.gray(cmdLabel) +\n pc.cyan(cmdValue) +\n ' '.repeat(Math.max(0, cmdPadding)) +\n pc.red('│'),\n );\n\n // Args row (if any)\n if (shortcut.args && shortcut.args.length > 0) {\n const argsLabel = ' Args: ';\n const argsValue = shortcut.args.join(', ');\n const argsPadding = boxWidth - argsLabel.length - argsValue.length + 2;\n console.log(\n pc.red(' │') +\n pc.gray(argsLabel) +\n pc.yellow(argsValue) +\n ' '.repeat(Math.max(0, argsPadding)) +\n pc.red('│'),\n );\n }\n\n console.log(pc.red(` └${line}┘`));\n console.log();\n console.log(pc.yellow(' Please enter a different name:\\n'));\n }\n}\n","import { getDatabase } from './database.js';\nimport { listShortcuts } from './shortcuts.js';\nimport type { ShortcutSuggestion } from './types.js';\n\ninterface QueryStatsRow {\n id: number;\n command: string;\n source: string;\n use_count: number;\n success_count: number;\n suggested: number;\n}\n\nexport function suggestShortcutNameFromCommand(command: string): string {\n // Extract meaningful parts from the command\n // Examples:\n // \"find . -size +100M\" → \"largefiles\"\n // \"lsof -ti:3000 | xargs kill -9\" → \"killport\"\n // \"git add . && git commit -m\" → \"commit\"\n\n // Simple heuristic: take first 2-3 significant words/operators\n const parts = command\n .split(/[\\s\\-&|;()]+/)\n .filter((p) => p.length > 0 && !p.match(/^[.+]/));\n\n if (parts.length === 0) {\n return 'cmd';\n }\n\n // Common command names\n const mainCmd = parts[0];\n\n // For compound commands, combine main cmd with key argument\n if (parts.length > 1) {\n const keyArg = parts[1];\n if (keyArg && keyArg.length > 0) {\n const combined = `${mainCmd}${keyArg}`.slice(0, 12);\n return combined;\n }\n }\n\n return mainCmd.slice(0, 12);\n}\n\nexport function getShortcutSuggestions(threshold = 3): ShortcutSuggestion[] {\n const db = getDatabase();\n\n // Get frequently used AI commands that haven't been suggested yet\n // Keyed by COMMAND, not query, to handle variations (typos, synonyms)\n const rows = db\n .prepare(\n `SELECT id, command, source, use_count, success_count, suggested\n FROM query_stats \n WHERE source = 'ai' \n AND use_count >= ?\n AND suggested = 0\n ORDER BY use_count DESC\n LIMIT 10`,\n )\n .all(threshold) as QueryStatsRow[];\n\n // Get existing shortcuts to filter out conflicts\n const existingShortcuts = listShortcuts();\n const existingNames = new Set(Object.keys(existingShortcuts));\n\n const suggestions: ShortcutSuggestion[] = [];\n\n for (const row of rows) {\n // Generate shortcut name from COMMAND, not query\n let suggestedName = suggestShortcutNameFromCommand(row.command);\n\n // Ensure unique name\n let counter = 1;\n const baseName = suggestedName;\n while (existingNames.has(suggestedName)) {\n suggestedName = `${baseName}${counter}`;\n counter++;\n }\n\n suggestions.push({\n query: row.command, // Store command as \"query\" for now (for interface compatibility)\n command: row.command,\n useCount: row.use_count,\n suggestedName,\n });\n }\n\n return suggestions;\n}\n\nexport function markPatternAsSuggested(command: string): void {\n const db = getDatabase();\n // Now marking by COMMAND instead of query\n db.prepare('UPDATE query_stats SET suggested = 1 WHERE command = ?').run(\n command,\n );\n}\n\nexport function resetSuggestionFlags(): void {\n const db = getDatabase();\n db.prepare('UPDATE query_stats SET suggested = 0').run();\n}\n\nexport function getCommandStats(command: string): QueryStatsRow | null {\n const db = getDatabase();\n const row = db\n .prepare('SELECT * FROM query_stats WHERE command = ?')\n .get(command) as QueryStatsRow | undefined;\n return row ?? null;\n}\n","import { cli } from './cli/index.js';\n\nconst args = process.argv.slice(2);\ncli.runExit(args);\n"],"mappings":"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","names":["pc","chmodSync","existsSync","existsSync","chmodSync","db","db","input","pc","chmodSync","existsSync","readFileSync","writeFileSync","join","join","existsSync","readFileSync","writeFileSync","chmodSync","pc","input","Command","pc","input","pc","URL","exec","promisify","execAsync","pc","stripAnsi","input","spinner","Command","pc","Command","Option","pc","pc","Command","Option","pc","Command","pc","Command","pc","confirm","input","Command","Option","pc","Command","Option","historyId","pc","input","confirm","spawn","Command","pc","Command","pc","spawn","Command","Option","pc","pc","Command","Option","pc","readline","select","Command","pc","input","select","Command","pc","confirm","Command","Option","pc","Command","Option","pc","confirm","Command","pc","Command","pc","Command","pc","Command","pc","confirm","input","Command","Option","pc","db","Command","Option","pc","args","confirm","input","require","pc","stripAnsi"]}