bashio 0.6.0 → 0.7.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 +29 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// src/cli/index.ts
|
|
4
4
|
import { Builtins, Cli } from "clipanion";
|
|
5
|
+
import pc17 from "picocolors";
|
|
5
6
|
import updateNotifier from "update-notifier";
|
|
6
7
|
|
|
7
8
|
// src/core/config.ts
|
|
@@ -2545,24 +2546,40 @@ var SuggestShortcutsCommand = class extends Command12 {
|
|
|
2545
2546
|
// src/cli/index.ts
|
|
2546
2547
|
var pkg = {
|
|
2547
2548
|
name: "bashio",
|
|
2548
|
-
version: "0.
|
|
2549
|
+
version: "0.7.0"
|
|
2549
2550
|
};
|
|
2550
2551
|
var notifier = updateNotifier({
|
|
2551
2552
|
pkg,
|
|
2552
2553
|
updateCheckInterval: 1e3 * 60 * 60 * 24
|
|
2553
2554
|
// 1 day
|
|
2554
2555
|
});
|
|
2555
|
-
notifier.
|
|
2556
|
-
|
|
2557
|
-
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2556
|
+
if (notifier.update) {
|
|
2557
|
+
const { current, latest } = notifier.update;
|
|
2558
|
+
const cyan = pc17.cyan;
|
|
2559
|
+
const width = 44;
|
|
2560
|
+
const ansiRegex = new RegExp(
|
|
2561
|
+
`${String.fromCharCode(27)}\\[[0-9;]*[a-zA-Z]`,
|
|
2562
|
+
"g"
|
|
2563
|
+
);
|
|
2564
|
+
const stripAnsi2 = (str) => str.replace(ansiRegex, "");
|
|
2565
|
+
const visibleLength = (str) => stripAnsi2(str).length;
|
|
2566
|
+
const pad = (text, len) => {
|
|
2567
|
+
const padding = len - visibleLength(text);
|
|
2568
|
+
return text + " ".repeat(Math.max(0, padding));
|
|
2569
|
+
};
|
|
2570
|
+
const line = (content) => cyan(" \u2502") + pad(content, width) + cyan("\u2502");
|
|
2571
|
+
console.log();
|
|
2572
|
+
console.log(cyan(` \u250C${"\u2500".repeat(width)}\u2510`));
|
|
2573
|
+
console.log(line(""));
|
|
2574
|
+
console.log(line(pc17.bold(" Bashio Update Available!")));
|
|
2575
|
+
console.log(line(""));
|
|
2576
|
+
console.log(line(` ${pc17.dim(current)} \u2192 ${pc17.green(pc17.bold(latest))}`));
|
|
2577
|
+
console.log(line(""));
|
|
2578
|
+
console.log(line(` Run: ${pc17.cyan("npm i -g bashio@latest")}`));
|
|
2579
|
+
console.log(line(""));
|
|
2580
|
+
console.log(cyan(` \u2514${"\u2500".repeat(width)}\u2518`));
|
|
2581
|
+
console.log();
|
|
2582
|
+
}
|
|
2566
2583
|
initDatabase();
|
|
2567
2584
|
if (shouldRunCleanup()) {
|
|
2568
2585
|
const config = loadConfig();
|
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 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.6.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// Show update notification if available\nnotifier.notify({\n message:\n 'Bashio update available: {currentVersion} → {latestVersion}\\n' +\n 'Run: {updateCommand}',\n boxenOptions: {\n padding: 1,\n margin: 1,\n borderStyle: 'round',\n borderColor: 'cyan',\n title: '✨ Update Available',\n titleAlignment: 'center',\n },\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":["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"]}
|
|
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"]}
|