bashio 2.1.0 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -216
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,35 +1,35 @@
|
|
|
1
|
-
<!-- SEO
|
|
2
|
-
<!--
|
|
3
|
-
<!-- Description: Transform plain English into shell commands instantly. Stop Googling syntax, start doing. Supports Claude, OpenAI, GitHub Copilot, Ollama, and more. -->
|
|
4
|
-
<!-- Keywords: CLI tool, AI terminal, natural language shell, command line AI, bash assistant, shell commands, terminal productivity, developer tools -->
|
|
1
|
+
<!-- SEO: Bashio - AI CLI Tool | Natural Language to Shell Commands -->
|
|
2
|
+
<!-- Transform plain English into shell commands. Supports Claude, OpenAI, GitHub Copilot, Ollama. -->
|
|
5
3
|
|
|
6
4
|
<p align="center">
|
|
7
5
|
<a href="https://github.com/VrandaaGarg/bashio">
|
|
8
|
-
<img src="https://res.cloudinary.com/dyetf2h9n/image/upload/
|
|
6
|
+
<img src="https://res.cloudinary.com/dyetf2h9n/image/upload/v1769023957/Natural_language_to_shell_commands._Stop_Googling_start_doing._1_u8e0qd.png" alt="Bashio" width="100%" />
|
|
9
7
|
</a>
|
|
10
8
|
</p>
|
|
11
9
|
|
|
12
|
-
<h1 align="center">Bashio</h1>
|
|
13
|
-
|
|
14
10
|
<p align="center">
|
|
15
|
-
<
|
|
11
|
+
<a href="https://www.npmjs.com/package/bashio"><img src="https://img.shields.io/npm/v/bashio.svg" alt="npm" /></a>
|
|
12
|
+
<a href="https://github.com/VrandaaGarg/bashio/blob/main/LICENSE"><img src="https://img.shields.io/badge/License-Apache%202.0-blue.svg" alt="License" /></a>
|
|
13
|
+
<a href="https://github.com/VrandaaGarg/bashio"><img src="https://img.shields.io/github/stars/VrandaaGarg/bashio?style=social" alt="Stars" /></a>
|
|
16
14
|
</p>
|
|
17
15
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
<a href="https://github.com/VrandaaGarg/bashio"><img src="https://img.shields.io/github/stars/VrandaaGarg/bashio?style=social" alt="GitHub stars" /></a>
|
|
22
|
-
</p>
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Quick Start
|
|
23
19
|
|
|
24
20
|
```bash
|
|
25
|
-
npm i -g bashio
|
|
21
|
+
npm i -g bashio # Install globally
|
|
22
|
+
b --auth # Setup your AI provider
|
|
23
|
+
b show disk usage # Start using!
|
|
26
24
|
```
|
|
27
25
|
|
|
26
|
+
Requires Node.js 20.12.0+
|
|
27
|
+
|
|
28
28
|
---
|
|
29
29
|
|
|
30
30
|
## What is Bashio?
|
|
31
31
|
|
|
32
|
-
Bashio
|
|
32
|
+
Bashio converts plain English into shell commands. Describe what you want, review the command, then execute.
|
|
33
33
|
|
|
34
34
|
```bash
|
|
35
35
|
$ b find all files larger than 100mb and delete them
|
|
@@ -40,47 +40,14 @@ $ b find all files larger than 100mb and delete them
|
|
|
40
40
|
? Execute? (y/n/e/c/edit)
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## Getting Started
|
|
48
|
-
|
|
49
|
-
### 1. Install
|
|
50
|
-
|
|
51
|
-
```bash
|
|
52
|
-
npm i -g bashio
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Requires Node.js 20.12.0 or higher.
|
|
56
|
-
|
|
57
|
-
### 2. Setup your AI provider
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
b --auth
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
Choose from multiple providers:
|
|
64
|
-
- **Claude** (Anthropic) - API Key or Pro/Max subscription
|
|
65
|
-
- **OpenAI** (ChatGPT) - API Key or Plus/Pro subscription
|
|
66
|
-
- **GitHub Copilot** - Free with Copilot subscription
|
|
67
|
-
- **Ollama** - Free, runs locally
|
|
68
|
-
- **OpenRouter** - Pay-per-use, multiple models
|
|
69
|
-
|
|
70
|
-
### 3. Start using it
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
b show disk usage sorted by size
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
That's it. You're ready to go.
|
|
43
|
+
**Options:** `y` execute · `n` cancel · `e` explain · `c` copy · `edit` modify
|
|
77
44
|
|
|
78
45
|
---
|
|
79
46
|
|
|
80
47
|
## Examples
|
|
81
48
|
|
|
82
49
|
```bash
|
|
83
|
-
#
|
|
50
|
+
# Files
|
|
84
51
|
b find all javascript files modified today
|
|
85
52
|
b delete all node_modules folders recursively
|
|
86
53
|
b compress all png images in this folder
|
|
@@ -93,155 +60,105 @@ b show commits from last week by john
|
|
|
93
60
|
b kill whatever is running on port 3000
|
|
94
61
|
b what is my public ip address
|
|
95
62
|
b list all running docker containers
|
|
96
|
-
|
|
97
|
-
# Network
|
|
98
|
-
b download this url and save as data.json
|
|
99
63
|
```
|
|
100
64
|
|
|
101
65
|
---
|
|
102
66
|
|
|
103
|
-
##
|
|
67
|
+
## Chat Mode
|
|
104
68
|
|
|
105
|
-
|
|
69
|
+
Full-screen AI chat with streaming responses:
|
|
106
70
|
|
|
107
71
|
```bash
|
|
108
72
|
b --chat
|
|
109
73
|
```
|
|
110
74
|
|
|
111
|
-
**
|
|
112
|
-
- Full-screen TUI with streaming responses
|
|
113
|
-
- Session management (save, load, switch sessions)
|
|
114
|
-
- Slash commands for quick actions
|
|
115
|
-
- Theme customization
|
|
116
|
-
- Model switching mid-conversation
|
|
75
|
+
**Features:** Session history · Slash commands · Themes · Model switching
|
|
117
76
|
|
|
118
|
-
**Keyboard Shortcuts (in chat):**
|
|
119
77
|
| Shortcut | Action |
|
|
120
78
|
|----------|--------|
|
|
121
|
-
| `Ctrl+
|
|
122
|
-
| `Ctrl+O` | Open
|
|
79
|
+
| `Ctrl+P` | Switch model |
|
|
80
|
+
| `Ctrl+O` | Open sessions |
|
|
123
81
|
| `Ctrl+T` | Change theme |
|
|
124
|
-
| `Ctrl+C` | Exit
|
|
125
|
-
|
|
126
|
-
**Slash Commands:**
|
|
127
|
-
| Command | Action |
|
|
128
|
-
|---------|--------|
|
|
129
|
-
| `/models` | Switch AI model |
|
|
130
|
-
| `/sessions` | Browse chat sessions |
|
|
131
|
-
| `/theme` | Change color theme |
|
|
132
|
-
| `/new` | Start new chat session |
|
|
133
|
-
| `/clear` | Clear current chat |
|
|
134
|
-
| `/exit` | Exit chat |
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## Confirmation Options
|
|
139
|
-
|
|
140
|
-
When a command is generated, you can:
|
|
141
|
-
|
|
142
|
-
| Key | Action |
|
|
143
|
-
|-----|--------|
|
|
144
|
-
| `y` or Enter | Execute the command |
|
|
145
|
-
| `n` | Cancel |
|
|
146
|
-
| `e` | Explain what the command does |
|
|
147
|
-
| `c` | Copy to clipboard |
|
|
148
|
-
| `edit` | Edit the command before running |
|
|
82
|
+
| `Ctrl+C` | Exit |
|
|
149
83
|
|
|
150
84
|
---
|
|
151
85
|
|
|
152
86
|
## Shortcuts
|
|
153
87
|
|
|
154
|
-
Save
|
|
155
|
-
|
|
156
|
-
### Create a shortcut
|
|
88
|
+
Save frequently used commands with placeholders:
|
|
157
89
|
|
|
158
90
|
```bash
|
|
159
|
-
# Interactive
|
|
160
|
-
b --add-shortcut
|
|
161
|
-
|
|
162
|
-
# One-liner
|
|
163
91
|
b --add-shortcut killport "lsof -ti:{{port}} | xargs kill -9" port
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
### Use it
|
|
167
|
-
|
|
168
|
-
```bash
|
|
169
|
-
b killport 3000
|
|
170
|
-
```
|
|
171
|
-
```
|
|
172
|
-
[shortcut: killport]
|
|
173
|
-
> lsof -ti:3000 | xargs kill -9
|
|
174
|
-
|
|
175
|
-
? Execute? (y/n/e/c/edit)
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### Manage shortcuts
|
|
179
|
-
|
|
180
|
-
```bash
|
|
181
|
-
b --shortcuts # List all
|
|
182
|
-
b --edit-shortcuts # Edit in your editor
|
|
183
|
-
b --remove-shortcut name # Delete one
|
|
92
|
+
b killport 3000 # Uses the shortcut
|
|
184
93
|
```
|
|
185
94
|
|
|
186
95
|
---
|
|
187
96
|
|
|
188
97
|
## AI Providers
|
|
189
98
|
|
|
190
|
-
Configure with `b --auth
|
|
191
|
-
|
|
192
|
-
| Provider | Auth Method | Cost |
|
|
193
|
-
|----------|-------------|------|
|
|
194
|
-
| **Claude** (Anthropic) | API Key | Paid |
|
|
195
|
-
| **Claude** (Subscription) | OAuth (Pro/Max) | Subscription |
|
|
196
|
-
| **OpenAI** (ChatGPT) | API Key | Paid |
|
|
197
|
-
| **ChatGPT** (Subscription) | OAuth (Plus/Pro) | Subscription |
|
|
198
|
-
| **GitHub Copilot** | OAuth | Free with subscription |
|
|
199
|
-
| **Ollama** | None (local) | Free |
|
|
200
|
-
| **OpenRouter** | API Key | Pay per use |
|
|
99
|
+
Configure with `b --auth`:
|
|
201
100
|
|
|
202
|
-
|
|
101
|
+
| Provider | Type |
|
|
102
|
+
|----------|------|
|
|
103
|
+
| **Claude** (Anthropic) | API Key or Pro/Max subscription |
|
|
104
|
+
| **OpenAI** (ChatGPT) | API Key or Plus/Pro subscription |
|
|
105
|
+
| **GitHub Copilot** | Free with Copilot subscription |
|
|
106
|
+
| **Ollama** | Free, runs locally |
|
|
107
|
+
| **OpenRouter** | Pay-per-use, multiple models |
|
|
203
108
|
|
|
204
|
-
|
|
205
|
-
b --model
|
|
206
|
-
```
|
|
109
|
+
Switch anytime: `b --model`
|
|
207
110
|
|
|
208
111
|
---
|
|
209
112
|
|
|
210
|
-
##
|
|
211
|
-
|
|
212
|
-
Customize the color theme:
|
|
213
|
-
|
|
214
|
-
```bash
|
|
215
|
-
b --theme
|
|
216
|
-
```
|
|
113
|
+
## All Commands
|
|
217
114
|
|
|
218
|
-
|
|
115
|
+
### Core
|
|
116
|
+
| Command | Description |
|
|
117
|
+
|---------|-------------|
|
|
118
|
+
| `b <query>` | Convert natural language to shell command |
|
|
119
|
+
| `b --chat` | Start interactive AI chat session |
|
|
219
120
|
|
|
220
|
-
|
|
121
|
+
### Configuration
|
|
122
|
+
| Command | Description |
|
|
123
|
+
|---------|-------------|
|
|
124
|
+
| `b --auth` | Configure AI provider |
|
|
125
|
+
| `b --config` | View current configuration |
|
|
126
|
+
| `b --model` | Change AI provider/model |
|
|
127
|
+
| `b --theme` | Change color theme |
|
|
221
128
|
|
|
222
|
-
|
|
129
|
+
### Shortcuts
|
|
130
|
+
| Command | Description |
|
|
131
|
+
|---------|-------------|
|
|
132
|
+
| `b --shortcuts` | List all shortcuts |
|
|
133
|
+
| `b --add-shortcut` | Add a new shortcut |
|
|
134
|
+
| `b --remove-shortcut <name>` | Remove a shortcut |
|
|
135
|
+
| `b --edit-shortcuts` | Edit shortcuts in editor |
|
|
223
136
|
|
|
224
|
-
|
|
137
|
+
### History & Stats
|
|
138
|
+
| Command | Description |
|
|
139
|
+
|---------|-------------|
|
|
140
|
+
| `b --history` | View command history |
|
|
141
|
+
| `b --history --search <term>` | Search history |
|
|
142
|
+
| `b --stats` | View usage statistics |
|
|
143
|
+
| `b --suggest-shortcuts` | Suggest shortcuts from history |
|
|
144
|
+
| `b --clear-history` | Clear command history |
|
|
225
145
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
b --
|
|
230
|
-
b --
|
|
231
|
-
b --clear-history # Clear history
|
|
232
|
-
```
|
|
146
|
+
### Help
|
|
147
|
+
| Command | Description |
|
|
148
|
+
|---------|-------------|
|
|
149
|
+
| `b --help` | Show help message |
|
|
150
|
+
| `b --version` | Show version (with update check) |
|
|
233
151
|
|
|
234
152
|
---
|
|
235
153
|
|
|
236
154
|
## Safety
|
|
237
155
|
|
|
238
|
-
Bashio
|
|
156
|
+
Bashio warns you about dangerous commands:
|
|
239
157
|
|
|
240
158
|
```
|
|
241
159
|
> rm -rf ~/*
|
|
242
160
|
|
|
243
161
|
WARNING: This command may cause irreversible changes.
|
|
244
|
-
Reasons:
|
|
245
162
|
- Uses recursive force delete (rm -rf)
|
|
246
163
|
- Targets home directory
|
|
247
164
|
|
|
@@ -252,84 +169,26 @@ Every command requires confirmation before execution.
|
|
|
252
169
|
|
|
253
170
|
---
|
|
254
171
|
|
|
255
|
-
## All Commands
|
|
256
|
-
|
|
257
|
-
| Command | Description |
|
|
258
|
-
|---------|-------------|
|
|
259
|
-
| `b <query>` | Convert natural language to command |
|
|
260
|
-
| `b <shortcut> [args]` | Run a saved shortcut |
|
|
261
|
-
| `b --chat` | Start interactive chat mode |
|
|
262
|
-
| `b --auth` | Setup AI provider |
|
|
263
|
-
| `b --model` | Change AI model |
|
|
264
|
-
| `b --config` | View current config |
|
|
265
|
-
| `b --theme` | Change color theme |
|
|
266
|
-
| `b --shortcuts` | List shortcuts |
|
|
267
|
-
| `b --add-shortcut` | Create shortcut |
|
|
268
|
-
| `b --remove-shortcut <name>` | Delete shortcut |
|
|
269
|
-
| `b --edit-shortcuts` | Edit shortcuts file |
|
|
270
|
-
| `b --history` | View command history |
|
|
271
|
-
| `b --stats` | Usage statistics |
|
|
272
|
-
| `b --suggest-shortcuts` | Get shortcut suggestions |
|
|
273
|
-
| `b --clear-history` | Clear history |
|
|
274
|
-
| `b --help` | Show help |
|
|
275
|
-
| `b --version` | Show version (with update check) |
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
## Configuration
|
|
280
|
-
|
|
281
|
-
All data is stored locally at `~/.bashio/`:
|
|
282
|
-
|
|
283
|
-
```
|
|
284
|
-
~/.bashio/
|
|
285
|
-
├── config.json # Settings and API keys
|
|
286
|
-
├── shortcuts.json # Your shortcuts
|
|
287
|
-
├── sessions/ # Chat sessions
|
|
288
|
-
└── history.db # Command history
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
View your config:
|
|
292
|
-
|
|
293
|
-
```bash
|
|
294
|
-
b --config
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
---
|
|
298
|
-
|
|
299
172
|
## Privacy
|
|
300
173
|
|
|
301
|
-
- All data
|
|
174
|
+
- All data stored locally at `~/.bashio/`
|
|
302
175
|
- No telemetry or tracking
|
|
303
176
|
- Queries only sent to your chosen AI provider
|
|
304
177
|
|
|
305
178
|
---
|
|
306
179
|
|
|
307
|
-
## Contributing
|
|
308
|
-
|
|
309
|
-
Contributions are welcome! Please feel free to submit a Pull Request on [GitHub](https://github.com/VrandaaGarg/bashio).
|
|
310
|
-
|
|
311
|
-
---
|
|
312
|
-
|
|
313
180
|
## License
|
|
314
181
|
|
|
315
|
-
Copyright 2025 Vranda Garg
|
|
316
|
-
|
|
317
|
-
### Additional Terms
|
|
318
|
-
|
|
319
|
-
If you use, modify, or distribute this project or any part of it, you MUST:
|
|
182
|
+
Copyright 2025 [Vranda Garg](https://vrandagarg.in)
|
|
320
183
|
|
|
321
|
-
|
|
322
|
-
|
|
184
|
+
**If you use, modify, or distribute this project, you must:**
|
|
185
|
+
1. Give credit to **Vranda Garg** as the original author
|
|
186
|
+
2. Link to [github.com/VrandaaGarg/bashio](https://github.com/VrandaaGarg/bashio)
|
|
323
187
|
|
|
324
|
-
Licensed under
|
|
188
|
+
Licensed under Apache 2.0 · [View LICENSE](https://github.com/VrandaaGarg/bashio/blob/main/LICENSE)
|
|
325
189
|
|
|
326
190
|
---
|
|
327
191
|
|
|
328
192
|
<p align="center">
|
|
329
|
-
<a href="https://github.com/VrandaaGarg/bashio">GitHub</a> ·
|
|
330
|
-
<a href="https://www.npmjs.com/package/bashio">npm</a>
|
|
331
|
-
</p>
|
|
332
|
-
|
|
333
|
-
<p align="center">
|
|
334
|
-
<sub>Built with AI for developers who prefer doing over searching.</sub>
|
|
193
|
+
<a href="https://github.com/VrandaaGarg/bashio">GitHub</a> · <a href="https://www.npmjs.com/package/bashio">npm</a> · <a href="https://vrandagarg.in">Author</a>
|
|
335
194
|
</p>
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/index.ts","../src/core/constants.ts","../src/core/database.ts","../src/core/history.ts","../src/cli/commands/AddShortcutCommand.ts","../src/core/shortcuts.ts","../src/cli/commands/AuthCommand.ts","../src/cli/commands/ChatCommand.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/HelpCommand.ts","../src/utils/table.ts","../src/cli/commands/HistoryCommand.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/cli/commands/ThemeCommand.ts","../src/cli/commands/VersionCommand.ts","../src/index.ts"],"sourcesContent":["import { Cli } from 'clipanion';\nimport pc from 'picocolors';\nimport updateNotifier from 'update-notifier';\nimport { loadConfig } from '../core/config.js';\nimport { PACKAGE_NAME, PACKAGE_VERSION } from '../core/constants.js';\nimport { initDatabase } from '../core/database.js';\nimport { cleanupHistory, shouldRunCleanup } from '../core/history.js';\nimport { accent } from '../utils/colors.js';\n\nconst pkg = {\n name: PACKAGE_NAME,\n version: PACKAGE_VERSION,\n};\n\n// Check for updates (runs in background, cached for 1 day)\nconst notifier = updateNotifier({\n pkg,\n updateCheckInterval: 1000 * 60 * 60 * 24, // 1 day\n});\n\n// Custom update notification matching welcome banner theme\nif (notifier.update) {\n const { current, latest } = notifier.update;\n const width = 44;\n const accentColor = accent;\n\n const ansiRegex = new RegExp(\n `${String.fromCharCode(27)}\\\\[[0-9;]*[a-zA-Z]`,\n 'g',\n );\n const stripAnsi = (str: string): string => str.replace(ansiRegex, '');\n 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 accentColor(' │') + pad(content, width) + accentColor('│');\n\n console.log();\n console.log(accentColor(` ┌${'─'.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)} → ${accentColor(pc.bold(latest))}`));\n console.log(line(''));\n console.log(line(` Run: ${accentColor('npm i -g bashio@latest')}`));\n console.log(line(''));\n console.log(accentColor(` └${'─'.repeat(width)}┘`));\n console.log();\n}\n\nimport { AddShortcutCommand } from './commands/AddShortcutCommand.js';\nimport { AuthCommand } from './commands/AuthCommand.js';\nimport { ChatCommand } from './commands/ChatCommand.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 { HelpCommand } from './commands/HelpCommand.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';\nimport { ThemeCommand } from './commands/ThemeCommand.js';\nimport { VersionCommand } from './commands/VersionCommand.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(ChatCommand);\ncli.register(ConfigCommand);\ncli.register(ModelCommand);\ncli.register(ThemeCommand);\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(HelpCommand);\ncli.register(VersionCommand);\n\nexport { cli };\n","// Centralized package info - update version here only\nexport const PACKAGE_NAME = 'bashio';\nexport const PACKAGE_VERSION = '2.1.0';\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 { bashioTheme } from '../../utils/inquirerTheme.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 theme: bashioTheme,\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 theme: bashioTheme,\n });\n\n const argsInput = await input({\n message: 'Arguments (comma-separated, or leave empty):',\n theme: bashioTheme,\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 theme: bashioTheme,\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 { bashioTheme } from '../utils/inquirerTheme.js';\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 theme: bashioTheme,\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 { Command } from 'clipanion';\nimport { runAuthSetup } from '../../core/auth.js';\nimport { accent } from '../../utils/colors.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 accent(\"You're all set! Try:\"),\n accent('b find all png files'),\n );\n console.log();\n }\n\n return success ? 0 : 1;\n }\n}\n","import { Command } from 'clipanion';\n\nexport class ChatCommand extends Command {\n static paths = [['chat'], ['--chat']];\n\n static usage = Command.Usage({\n description: 'Start an interactive AI chat session',\n examples: [\n ['Start chat', '$0 chat'],\n ['Start chat (alternate)', '$0 --chat'],\n ],\n });\n\n async execute(): Promise<number> {\n const { runChat } = await import('../../chat/App.js');\n return runChat();\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 { bashioTheme } from '../../utils/inquirerTheme.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 theme: bashioTheme,\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 theme: bashioTheme,\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 { PROVIDER_DISPLAY_NAMES } from '../../core/auth.js';\nimport { configExists, getConfigPath, loadConfig } from '../../core/config.js';\nimport type { ProviderName } from '../../core/types.js';\nimport { accent } from '../../utils/colors.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 const activeSettings = config.providers[config.activeProvider];\n const configuredProviders = Object.keys(config.providers) as ProviderName[];\n\n console.log(pc.bold('\\n Bashio Configuration\\n'));\n console.log(\n ` Active Provider: ${pc.yellow(PROVIDER_DISPLAY_NAMES[config.activeProvider])}`,\n );\n console.log(\n ` Model: ${pc.yellow(activeSettings?.model || 'N/A')}`,\n );\n\n // Show all configured providers\n if (configuredProviders.length > 1) {\n console.log();\n console.log(pc.bold(' Configured Providers'));\n for (const p of configuredProviders) {\n const settings = config.providers[p];\n const isActive = p === config.activeProvider;\n const marker = isActive ? accent('●') : pc.dim('○');\n console.log(\n ` ${marker} ${PROVIDER_DISPLAY_NAMES[p]} - ${pc.dim(settings?.model || 'N/A')}`,\n );\n }\n }\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 ? accent('enabled') : pc.gray('disabled')}`,\n );\n console.log(\n ` Auto-confirm shortcuts: ${settings?.autoConfirmShortcuts ? accent('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 { accent } from '../../utils/colors.js';\nimport { detectDangerousShellCommand } from '../../utils/danger.js';\nimport { renderDangerBanner } from '../../utils/danger-ui.js';\nimport { getBashioTheme } from '../../utils/inquirerTheme.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(accent('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.yellow(' b <natural language query>'));\n console.log(pc.yellow(' 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.yellow(' (shortcut)'));\n console.log();\n console.log(' Commands:');\n console.log(pc.gray(' b --chat Start interactive chat'));\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 --theme Change color theme'));\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 theme: getBashioTheme(),\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.yellow(` ${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(`${accent('?')} ${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 } from 'clipanion';\nimport pc from 'picocolors';\nimport { PACKAGE_VERSION } from '../../core/constants.js';\nimport { accent, renderTable } from '../../utils/table.js';\n\nexport class HelpCommand extends Command {\n static paths = [['help'], ['--help'], ['-h']];\n\n static usage = Command.Usage({\n description: 'Show help information',\n });\n\n async execute(): Promise<number> {\n console.log();\n console.log(pc.bold(` Bashio v${PACKAGE_VERSION}`));\n console.log(pc.dim(' Natural language to shell commands\\n'));\n\n renderTable({\n title: 'Commands',\n columns: [\n { header: 'Command', key: 'command', width: 24, color: accent },\n { header: 'Description', key: 'description', width: 42 },\n ],\n data: [\n // Core\n {\n command: 'b <query>',\n description: 'Convert natural language to shell commands',\n },\n {\n command: 'b --chat',\n description: 'Start interactive AI chat session',\n },\n\n // Configuration\n { command: 'b --auth', description: 'Configure AI provider' },\n { command: 'b --config', description: 'View current configuration' },\n { command: 'b --model', description: 'Change AI provider/model' },\n { command: 'b --theme', description: 'Change color theme' },\n\n // Shortcuts\n { command: 'b --shortcuts', description: 'List all shortcuts' },\n { command: 'b --add-shortcut', description: 'Add a new shortcut' },\n { command: 'b --remove-shortcut', description: 'Remove a shortcut' },\n {\n command: 'b --edit-shortcuts',\n description: 'Edit shortcuts in editor',\n },\n\n // History & Stats\n { command: 'b --history', description: 'View command history' },\n { command: 'b --stats', description: 'View usage statistics' },\n { command: 'b --clear-history', description: 'Clear command history' },\n {\n command: 'b --suggest-shortcuts',\n description: 'Suggest shortcuts from history',\n },\n\n // Help\n { command: 'b --help', description: 'Show this help message' },\n { command: 'b --version', description: 'Show version number' },\n ],\n });\n\n console.log();\n console.log(pc.dim(' 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 --chat') + pc.dim(' (interactive mode)'));\n console.log();\n\n return 0;\n }\n}\n","import pc from 'picocolors';\nimport { accent } from './colors.js';\n\nexport { accent };\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 { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { getRecentHistory, searchHistory } from '../../core/history.js';\nimport type { HistoryEntry } from '../../core/types.js';\nimport { accent, 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: accent },\n { header: 'Query', key: 'query', width: 25, color: pc.gray },\n {\n header: 'Source',\n key: 'source',\n width: 8,\n color: (v) => pc.yellow(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 `${accent('✓')} 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 * as readline from 'node:readline';\nimport { select } from '@inquirer/prompts';\nimport { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { PROVIDER_DISPLAY_NAMES } from '../../core/auth.js';\nimport { configExists, loadConfig, saveConfig } from '../../core/config.js';\nimport type { ConfigV2, ProviderName } from '../../core/types.js';\nimport {\n CHATGPT_SUBSCRIPTION_MODELS,\n CLAUDE_MODELS,\n CLAUDE_SUBSCRIPTION_MODELS,\n COPILOT_MODELS,\n OllamaProvider,\n OPENAI_MODELS,\n OPENROUTER_MODELS,\n} from '../../providers/index.js';\nimport { accent } from '../../utils/colors.js';\nimport { getBashioTheme } from '../../utils/inquirerTheme.js';\nimport { logger } from '../../utils/logger.js';\nimport { createSpinner } from '../../utils/spinner.js';\n\ntype SelectConfig<Value> = Parameters<typeof select<Value>>[0];\ntype KeypressHandler = (input: string, key: readline.Key) => void;\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)) return false;\n return (\n error.name === 'ExitPromptError' ||\n error.name === 'AbortPromptError' ||\n error.name === 'CancelPromptError' ||\n error.message.includes('SIGINT') ||\n error.message.includes('force closed')\n );\n};\n\nfunction getModelsForProvider(\n provider: ProviderName,\n): Array<{ value: string; label: string }> {\n switch (provider) {\n case 'claude':\n return CLAUDE_MODELS;\n case 'claude-subscription':\n return CLAUDE_SUBSCRIPTION_MODELS;\n case 'openai':\n return OPENAI_MODELS;\n case 'chatgpt-subscription':\n return CHATGPT_SUBSCRIPTION_MODELS;\n case 'copilot':\n return COPILOT_MODELS;\n case 'openrouter':\n return OPENROUTER_MODELS;\n case 'ollama':\n return []; // Handled separately\n default:\n return [];\n }\n}\n\nexport class ModelCommand extends Command {\n static paths = [['model'], ['--model']];\n\n static usage = Command.Usage({\n description: 'Change the AI provider and model',\n examples: [['Change provider/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 const configuredProviders = Object.keys(config.providers) as ProviderName[];\n\n if (configuredProviders.length === 0) {\n logger.warn('No providers configured.');\n console.log(pc.gray(\"Run 'b --auth' to set up a provider.\\n\"));\n return 1;\n }\n\n const activeSettings = config.providers[config.activeProvider];\n console.log(pc.bold('\\n Change Provider & Model\\n'));\n console.log(\n pc.gray(\n ` Current: ${PROVIDER_DISPLAY_NAMES[config.activeProvider]} / ${activeSettings?.model}`,\n ),\n );\n console.log(pc.dim(' Press Esc to cancel\\n'));\n\n try {\n // Step 1: Select provider (show configured providers with their models)\n const providerChoices = configuredProviders.map((p) => {\n const settings = config.providers[p];\n const isActive = p === config.activeProvider;\n const marker = isActive ? accent('●') : pc.dim('○');\n const name = `${marker} ${PROVIDER_DISPLAY_NAMES[p]}`;\n const description = settings?.model || 'Not configured';\n return { value: p, name, description };\n });\n\n // Add option to configure new provider\n providerChoices.push({\n value: '__add_new__' as ProviderName,\n name: pc.yellow('+ Add new provider...'),\n description: 'Configure a new AI provider',\n });\n\n const selectedProvider = await selectWithEsc<\n ProviderName | '__add_new__'\n >({\n message: 'Select provider:',\n choices: providerChoices,\n theme: getBashioTheme(),\n });\n\n if (selectedProvider === '__add_new__') {\n console.log(pc.dim(\"\\n Run 'b --auth' to add a new provider.\\n\"));\n return 0;\n }\n\n // Step 2: Select model for the chosen provider\n const currentModel = config.providers[selectedProvider]?.model;\n let newModel: string;\n\n if (selectedProvider === 'ollama') {\n const host =\n config.providers.ollama?.credentials.type === 'local'\n ? config.providers.ollama.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 model:',\n choices: availableModels.map((m) => ({ value: m, name: m })),\n default: currentModel,\n theme: getBashioTheme(),\n });\n } else {\n const models = getModelsForProvider(selectedProvider);\n newModel = await selectWithEsc<string>({\n message: 'Select model:',\n choices: models.map((m) => ({ value: m.value, name: m.label })),\n default: currentModel,\n theme: getBashioTheme(),\n });\n }\n\n // Update config\n const providerSettings = config.providers[selectedProvider];\n if (!providerSettings) {\n logger.error('Provider not configured.');\n return 1;\n }\n\n const updatedConfig: ConfigV2 = {\n ...config,\n activeProvider: selectedProvider,\n providers: {\n ...config.providers,\n [selectedProvider]: {\n ...providerSettings,\n model: newModel,\n },\n },\n };\n\n saveConfig(updatedConfig);\n\n const changed =\n selectedProvider !== config.activeProvider || newModel !== currentModel;\n\n if (changed) {\n console.log();\n logger.success(\n `Switched to: ${PROVIDER_DISPLAY_NAMES[selectedProvider]} / ${newModel}`,\n );\n } else {\n logger.info('No changes made.');\n }\n console.log();\n\n return 0;\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}\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 { bashioTheme } from '../../utils/inquirerTheme.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 theme: bashioTheme,\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 { accent, 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: accent },\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 { accent, 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: accent },\n { header: 'Uses', key: 'uses', width: 8, align: 'right' },\n {\n header: 'Source',\n key: 'source',\n width: 10,\n color: (v) => pc.yellow(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 { bashioTheme } from '../../utils/inquirerTheme.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.white(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 theme: bashioTheme,\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 theme: bashioTheme,\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 theme: bashioTheme,\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.yellow(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 * as readline from 'node:readline';\nimport chalk from 'chalk';\nimport { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { getThemeByName, THEMES, type Theme } from '../../chat/utils/themes.js';\nimport { configExists, loadConfig, saveConfig } from '../../core/config.js';\nimport type { ConfigV2 } from '../../core/types.js';\nimport { clearThemeCache } from '../../utils/cliTheme.js';\nimport { logger } from '../../utils/logger.js';\n\nconst MAX_VISIBLE = 10;\n\ninterface ThemePickerResult {\n theme: string | null;\n cancelled: boolean;\n}\n\nfunction renderThemePicker(\n themes: Theme[],\n selectedIndex: number,\n currentThemeName: string,\n scrollOffset: number,\n): string[] {\n const lines: string[] = [];\n const selectedTheme = themes[selectedIndex];\n const accentColor = chalk.hex(selectedTheme.accent);\n\n lines.push(accentColor('?') + pc.bold(' Select theme:'));\n\n const visibleThemes = themes.slice(scrollOffset, scrollOffset + MAX_VISIBLE);\n\n for (let i = 0; i < visibleThemes.length; i++) {\n const theme = visibleThemes[i];\n const actualIndex = scrollOffset + i;\n const isSelected = actualIndex === selectedIndex;\n const isCurrent = theme.name === currentThemeName;\n\n const cursor = isSelected ? accentColor('❯') : ' ';\n const marker = isCurrent ? accentColor('●') : pc.dim('○');\n const colorPreview = chalk.hex(theme.accent)('■');\n const name = isSelected\n ? accentColor(theme.displayName)\n : theme.displayName;\n\n lines.push(`${cursor} ${marker} ${colorPreview} ${name}`);\n }\n\n // Show scroll indicators\n if (scrollOffset > 0) {\n lines.push(pc.dim(' ↑ more themes above'));\n }\n if (scrollOffset + MAX_VISIBLE < themes.length) {\n lines.push(pc.dim(' ↓ more themes below'));\n }\n\n lines.push('');\n lines.push(pc.dim('↑↓ navigate • ↵ select • esc cancel'));\n\n return lines;\n}\n\nasync function interactiveThemePicker(\n currentThemeName: string,\n): Promise<ThemePickerResult> {\n return new Promise((resolve) => {\n const themes = THEMES;\n let selectedIndex = themes.findIndex((t) => t.name === currentThemeName);\n if (selectedIndex === -1) selectedIndex = 0;\n\n let scrollOffset = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(MAX_VISIBLE / 2),\n themes.length - MAX_VISIBLE,\n ),\n );\n\n let renderedLines = 0;\n\n const clearRenderedLines = () => {\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n process.stdout.write('\\x1b[0J');\n }\n };\n\n const render = () => {\n clearRenderedLines();\n\n const lines = renderThemePicker(\n themes,\n selectedIndex,\n currentThemeName,\n scrollOffset,\n );\n renderedLines = lines.length;\n\n for (const line of lines) {\n console.log(line);\n }\n };\n\n const input = process.stdin;\n\n readline.emitKeypressEvents(input);\n if (input.isTTY) {\n input.setRawMode(true);\n }\n\n const cleanup = () => {\n input.removeListener('keypress', onKeypress);\n if (input.isTTY) {\n input.setRawMode(false);\n }\n input.pause();\n clearRenderedLines();\n };\n\n const onKeypress = (_str: string, key: readline.Key) => {\n if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {\n cleanup();\n resolve({ theme: null, cancelled: true });\n return;\n }\n\n if (key.name === 'return') {\n cleanup();\n resolve({ theme: themes[selectedIndex].name, cancelled: false });\n return;\n }\n\n if (key.name === 'up' || (key.ctrl && key.name === 'p')) {\n if (selectedIndex > 0) {\n selectedIndex--;\n if (selectedIndex < scrollOffset) {\n scrollOffset = selectedIndex;\n }\n render();\n }\n }\n\n if (key.name === 'down' || (key.ctrl && key.name === 'n')) {\n if (selectedIndex < themes.length - 1) {\n selectedIndex++;\n if (selectedIndex >= scrollOffset + MAX_VISIBLE) {\n scrollOffset = selectedIndex - MAX_VISIBLE + 1;\n }\n render();\n }\n }\n\n // Page up/down for faster navigation\n if (key.name === 'pageup') {\n selectedIndex = Math.max(0, selectedIndex - MAX_VISIBLE);\n scrollOffset = Math.max(0, scrollOffset - MAX_VISIBLE);\n render();\n }\n\n if (key.name === 'pagedown') {\n selectedIndex = Math.min(\n themes.length - 1,\n selectedIndex + MAX_VISIBLE,\n );\n scrollOffset = Math.min(\n themes.length - MAX_VISIBLE,\n scrollOffset + MAX_VISIBLE,\n );\n render();\n }\n\n // Home/End\n if (key.name === 'home') {\n selectedIndex = 0;\n scrollOffset = 0;\n render();\n }\n\n if (key.name === 'end') {\n selectedIndex = themes.length - 1;\n scrollOffset = Math.max(0, themes.length - MAX_VISIBLE);\n render();\n }\n };\n\n input.on('keypress', onKeypress);\n render();\n });\n}\n\nexport class ThemeCommand extends Command {\n static paths = [['theme'], ['--theme']];\n\n static usage = Command.Usage({\n description: 'Change the color theme',\n examples: [['Change theme', '$0 --theme']],\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 const currentThemeName = config.settings?.theme ?? 'bashio';\n const currentTheme = getThemeByName(currentThemeName);\n\n console.log(pc.bold('\\n Change Theme\\n'));\n console.log(pc.gray(` Current: ${currentTheme.displayName}\\n`));\n\n const result = await interactiveThemePicker(currentThemeName);\n\n if (result.cancelled || !result.theme) {\n console.log(pc.dim(' Cancelled.\\n'));\n return 0;\n }\n\n if (result.theme === currentThemeName) {\n logger.info('No changes made.');\n console.log();\n return 0;\n }\n\n const updatedConfig: ConfigV2 = {\n ...config,\n settings: {\n confirmBeforeExecute: config.settings?.confirmBeforeExecute ?? true,\n historyEnabled: config.settings?.historyEnabled ?? true,\n historyRetentionDays: config.settings?.historyRetentionDays ?? 30,\n historyMaxEntries: config.settings?.historyMaxEntries ?? 2000,\n autoConfirmShortcuts: config.settings?.autoConfirmShortcuts ?? false,\n theme: result.theme,\n },\n };\n\n saveConfig(updatedConfig);\n clearThemeCache();\n\n const newTheme = getThemeByName(result.theme);\n logger.success(`Theme changed to: ${newTheme.displayName}`);\n console.log(\n pc.dim(' Restart chat (b --chat) to see full theme changes.\\n'),\n );\n\n return 0;\n }\n}\n","import { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { PACKAGE_NAME, PACKAGE_VERSION } from '../../core/constants.js';\nimport { accent } from '../../utils/colors.js';\n\ninterface NpmRegistryResponse {\n version: string;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const response = await fetch(\n `https://registry.npmjs.org/${PACKAGE_NAME}/latest`,\n {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(5000),\n },\n );\n\n if (!response.ok) {\n return null;\n }\n\n const data = (await response.json()) as NpmRegistryResponse;\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction compareVersions(current: string, latest: string): number {\n const currentParts = current.split('.').map(Number);\n const latestParts = latest.split('.').map(Number);\n\n for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n const c = currentParts[i] ?? 0;\n const l = latestParts[i] ?? 0;\n if (c < l) return -1;\n if (c > l) return 1;\n }\n return 0;\n}\n\nfunction renderUpdateBanner(current: string, latest: string): void {\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 accent(' │') + pad(content, width) + accent('│');\n\n console.log();\n console.log(accent(` ┌${'─'.repeat(width)}┐`));\n console.log(line(''));\n console.log(line(pc.bold(' Update Available!')));\n console.log(line(''));\n console.log(line(` ${pc.dim(current)} → ${accent(pc.bold(latest))}`));\n console.log(line(''));\n console.log(line(` Run: ${accent('npm i -g bashio@latest')}`));\n console.log(line(''));\n console.log(accent(` └${'─'.repeat(width)}┘`));\n console.log();\n}\n\nexport class VersionCommand extends Command {\n static paths = [['--version'], ['-v']];\n\n static usage = Command.Usage({\n description: 'Show version and check for updates',\n examples: [['Show version', '$0 --version']],\n });\n\n async execute(): Promise<number> {\n console.log(`${pc.bold('Bashio')} v${PACKAGE_VERSION}`);\n\n const latestVersion = await fetchLatestVersion();\n\n if (latestVersion && compareVersions(PACKAGE_VERSION, latestVersion) < 0) {\n renderUpdateBanner(PACKAGE_VERSION, latestVersion);\n } else if (latestVersion) {\n console.log(pc.green('✓ You are on the latest version'));\n } else {\n console.log(pc.dim('Could not check for updates'));\n }\n\n return 0;\n }\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","db","db","input","chmodSync","existsSync","existsSync","chmodSync","input","Command","Command","Command","Command","Option","pc","pc","Command","Option","pc","Command","pc","Command","pc","settings","confirm","input","Command","Option","pc","Command","Option","historyId","pc","input","confirm","spawn","Command","pc","Command","pc","spawn","Command","pc","pc","pc","Command","pc","Command","Option","pc","Command","Option","pc","readline","Command","pc","input","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","readline","Command","pc","pc","input","Command","Command","pc","stripAnsi","pc","Command","stripAnsi","pc"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/index.ts","../src/core/constants.ts","../src/core/database.ts","../src/core/history.ts","../src/cli/commands/AddShortcutCommand.ts","../src/core/shortcuts.ts","../src/cli/commands/AuthCommand.ts","../src/cli/commands/ChatCommand.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/HelpCommand.ts","../src/utils/table.ts","../src/cli/commands/HistoryCommand.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/cli/commands/ThemeCommand.ts","../src/cli/commands/VersionCommand.ts","../src/index.ts"],"sourcesContent":["import { Cli } from 'clipanion';\nimport pc from 'picocolors';\nimport updateNotifier from 'update-notifier';\nimport { loadConfig } from '../core/config.js';\nimport { PACKAGE_NAME, PACKAGE_VERSION } from '../core/constants.js';\nimport { initDatabase } from '../core/database.js';\nimport { cleanupHistory, shouldRunCleanup } from '../core/history.js';\nimport { accent } from '../utils/colors.js';\n\nconst pkg = {\n name: PACKAGE_NAME,\n version: PACKAGE_VERSION,\n};\n\n// Check for updates (runs in background, cached for 1 day)\nconst notifier = updateNotifier({\n pkg,\n updateCheckInterval: 1000 * 60 * 60 * 24, // 1 day\n});\n\n// Custom update notification matching welcome banner theme\nif (notifier.update) {\n const { current, latest } = notifier.update;\n const width = 44;\n const accentColor = accent;\n\n const ansiRegex = new RegExp(\n `${String.fromCharCode(27)}\\\\[[0-9;]*[a-zA-Z]`,\n 'g',\n );\n const stripAnsi = (str: string): string => str.replace(ansiRegex, '');\n 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 accentColor(' │') + pad(content, width) + accentColor('│');\n\n console.log();\n console.log(accentColor(` ┌${'─'.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)} → ${accentColor(pc.bold(latest))}`));\n console.log(line(''));\n console.log(line(` Run: ${accentColor('npm i -g bashio@latest')}`));\n console.log(line(''));\n console.log(accentColor(` └${'─'.repeat(width)}┘`));\n console.log();\n}\n\nimport { AddShortcutCommand } from './commands/AddShortcutCommand.js';\nimport { AuthCommand } from './commands/AuthCommand.js';\nimport { ChatCommand } from './commands/ChatCommand.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 { HelpCommand } from './commands/HelpCommand.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';\nimport { ThemeCommand } from './commands/ThemeCommand.js';\nimport { VersionCommand } from './commands/VersionCommand.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(ChatCommand);\ncli.register(ConfigCommand);\ncli.register(ModelCommand);\ncli.register(ThemeCommand);\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(HelpCommand);\ncli.register(VersionCommand);\n\nexport { cli };\n","// Centralized package info - update version here only\nexport const PACKAGE_NAME = 'bashio';\nexport const PACKAGE_VERSION = '2.1.1';\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 { bashioTheme } from '../../utils/inquirerTheme.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 theme: bashioTheme,\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 theme: bashioTheme,\n });\n\n const argsInput = await input({\n message: 'Arguments (comma-separated, or leave empty):',\n theme: bashioTheme,\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 theme: bashioTheme,\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 { bashioTheme } from '../utils/inquirerTheme.js';\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 theme: bashioTheme,\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 { Command } from 'clipanion';\nimport { runAuthSetup } from '../../core/auth.js';\nimport { accent } from '../../utils/colors.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 accent(\"You're all set! Try:\"),\n accent('b find all png files'),\n );\n console.log();\n }\n\n return success ? 0 : 1;\n }\n}\n","import { Command } from 'clipanion';\n\nexport class ChatCommand extends Command {\n static paths = [['chat'], ['--chat']];\n\n static usage = Command.Usage({\n description: 'Start an interactive AI chat session',\n examples: [\n ['Start chat', '$0 chat'],\n ['Start chat (alternate)', '$0 --chat'],\n ],\n });\n\n async execute(): Promise<number> {\n const { runChat } = await import('../../chat/App.js');\n return runChat();\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 { bashioTheme } from '../../utils/inquirerTheme.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 theme: bashioTheme,\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 theme: bashioTheme,\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 { PROVIDER_DISPLAY_NAMES } from '../../core/auth.js';\nimport { configExists, getConfigPath, loadConfig } from '../../core/config.js';\nimport type { ProviderName } from '../../core/types.js';\nimport { accent } from '../../utils/colors.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 const activeSettings = config.providers[config.activeProvider];\n const configuredProviders = Object.keys(config.providers) as ProviderName[];\n\n console.log(pc.bold('\\n Bashio Configuration\\n'));\n console.log(\n ` Active Provider: ${pc.yellow(PROVIDER_DISPLAY_NAMES[config.activeProvider])}`,\n );\n console.log(\n ` Model: ${pc.yellow(activeSettings?.model || 'N/A')}`,\n );\n\n // Show all configured providers\n if (configuredProviders.length > 1) {\n console.log();\n console.log(pc.bold(' Configured Providers'));\n for (const p of configuredProviders) {\n const settings = config.providers[p];\n const isActive = p === config.activeProvider;\n const marker = isActive ? accent('●') : pc.dim('○');\n console.log(\n ` ${marker} ${PROVIDER_DISPLAY_NAMES[p]} - ${pc.dim(settings?.model || 'N/A')}`,\n );\n }\n }\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 ? accent('enabled') : pc.gray('disabled')}`,\n );\n console.log(\n ` Auto-confirm shortcuts: ${settings?.autoConfirmShortcuts ? accent('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 { accent } from '../../utils/colors.js';\nimport { detectDangerousShellCommand } from '../../utils/danger.js';\nimport { renderDangerBanner } from '../../utils/danger-ui.js';\nimport { getBashioTheme } from '../../utils/inquirerTheme.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(accent('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.yellow(' b <natural language query>'));\n console.log(pc.yellow(' 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.yellow(' (shortcut)'));\n console.log();\n console.log(' Commands:');\n console.log(pc.gray(' b --chat Start interactive chat'));\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 --theme Change color theme'));\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 theme: getBashioTheme(),\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.yellow(` ${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(`${accent('?')} ${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 } from 'clipanion';\nimport pc from 'picocolors';\nimport { PACKAGE_VERSION } from '../../core/constants.js';\nimport { accent, renderTable } from '../../utils/table.js';\n\nexport class HelpCommand extends Command {\n static paths = [['help'], ['--help'], ['-h']];\n\n static usage = Command.Usage({\n description: 'Show help information',\n });\n\n async execute(): Promise<number> {\n console.log();\n console.log(pc.bold(` Bashio v${PACKAGE_VERSION}`));\n console.log(pc.dim(' Natural language to shell commands\\n'));\n\n renderTable({\n title: 'Commands',\n columns: [\n { header: 'Command', key: 'command', width: 24, color: accent },\n { header: 'Description', key: 'description', width: 42 },\n ],\n data: [\n // Core\n {\n command: 'b <query>',\n description: 'Convert natural language to shell commands',\n },\n {\n command: 'b --chat',\n description: 'Start interactive AI chat session',\n },\n\n // Configuration\n { command: 'b --auth', description: 'Configure AI provider' },\n { command: 'b --config', description: 'View current configuration' },\n { command: 'b --model', description: 'Change AI provider/model' },\n { command: 'b --theme', description: 'Change color theme' },\n\n // Shortcuts\n { command: 'b --shortcuts', description: 'List all shortcuts' },\n { command: 'b --add-shortcut', description: 'Add a new shortcut' },\n { command: 'b --remove-shortcut', description: 'Remove a shortcut' },\n {\n command: 'b --edit-shortcuts',\n description: 'Edit shortcuts in editor',\n },\n\n // History & Stats\n { command: 'b --history', description: 'View command history' },\n { command: 'b --stats', description: 'View usage statistics' },\n { command: 'b --clear-history', description: 'Clear command history' },\n {\n command: 'b --suggest-shortcuts',\n description: 'Suggest shortcuts from history',\n },\n\n // Help\n { command: 'b --help', description: 'Show this help message' },\n { command: 'b --version', description: 'Show version number' },\n ],\n });\n\n console.log();\n console.log(pc.dim(' 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 --chat') + pc.dim(' (interactive mode)'));\n console.log();\n\n return 0;\n }\n}\n","import pc from 'picocolors';\nimport { accent } from './colors.js';\n\nexport { accent };\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 { Command, Option } from 'clipanion';\nimport pc from 'picocolors';\nimport { getRecentHistory, searchHistory } from '../../core/history.js';\nimport type { HistoryEntry } from '../../core/types.js';\nimport { accent, 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: accent },\n { header: 'Query', key: 'query', width: 25, color: pc.gray },\n {\n header: 'Source',\n key: 'source',\n width: 8,\n color: (v) => pc.yellow(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 `${accent('✓')} 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 * as readline from 'node:readline';\nimport { select } from '@inquirer/prompts';\nimport { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { PROVIDER_DISPLAY_NAMES } from '../../core/auth.js';\nimport { configExists, loadConfig, saveConfig } from '../../core/config.js';\nimport type { ConfigV2, ProviderName } from '../../core/types.js';\nimport {\n CHATGPT_SUBSCRIPTION_MODELS,\n CLAUDE_MODELS,\n CLAUDE_SUBSCRIPTION_MODELS,\n COPILOT_MODELS,\n OllamaProvider,\n OPENAI_MODELS,\n OPENROUTER_MODELS,\n} from '../../providers/index.js';\nimport { accent } from '../../utils/colors.js';\nimport { getBashioTheme } from '../../utils/inquirerTheme.js';\nimport { logger } from '../../utils/logger.js';\nimport { createSpinner } from '../../utils/spinner.js';\n\ntype SelectConfig<Value> = Parameters<typeof select<Value>>[0];\ntype KeypressHandler = (input: string, key: readline.Key) => void;\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)) return false;\n return (\n error.name === 'ExitPromptError' ||\n error.name === 'AbortPromptError' ||\n error.name === 'CancelPromptError' ||\n error.message.includes('SIGINT') ||\n error.message.includes('force closed')\n );\n};\n\nfunction getModelsForProvider(\n provider: ProviderName,\n): Array<{ value: string; label: string }> {\n switch (provider) {\n case 'claude':\n return CLAUDE_MODELS;\n case 'claude-subscription':\n return CLAUDE_SUBSCRIPTION_MODELS;\n case 'openai':\n return OPENAI_MODELS;\n case 'chatgpt-subscription':\n return CHATGPT_SUBSCRIPTION_MODELS;\n case 'copilot':\n return COPILOT_MODELS;\n case 'openrouter':\n return OPENROUTER_MODELS;\n case 'ollama':\n return []; // Handled separately\n default:\n return [];\n }\n}\n\nexport class ModelCommand extends Command {\n static paths = [['model'], ['--model']];\n\n static usage = Command.Usage({\n description: 'Change the AI provider and model',\n examples: [['Change provider/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 const configuredProviders = Object.keys(config.providers) as ProviderName[];\n\n if (configuredProviders.length === 0) {\n logger.warn('No providers configured.');\n console.log(pc.gray(\"Run 'b --auth' to set up a provider.\\n\"));\n return 1;\n }\n\n const activeSettings = config.providers[config.activeProvider];\n console.log(pc.bold('\\n Change Provider & Model\\n'));\n console.log(\n pc.gray(\n ` Current: ${PROVIDER_DISPLAY_NAMES[config.activeProvider]} / ${activeSettings?.model}`,\n ),\n );\n console.log(pc.dim(' Press Esc to cancel\\n'));\n\n try {\n // Step 1: Select provider (show configured providers with their models)\n const providerChoices = configuredProviders.map((p) => {\n const settings = config.providers[p];\n const isActive = p === config.activeProvider;\n const marker = isActive ? accent('●') : pc.dim('○');\n const name = `${marker} ${PROVIDER_DISPLAY_NAMES[p]}`;\n const description = settings?.model || 'Not configured';\n return { value: p, name, description };\n });\n\n // Add option to configure new provider\n providerChoices.push({\n value: '__add_new__' as ProviderName,\n name: pc.yellow('+ Add new provider...'),\n description: 'Configure a new AI provider',\n });\n\n const selectedProvider = await selectWithEsc<\n ProviderName | '__add_new__'\n >({\n message: 'Select provider:',\n choices: providerChoices,\n theme: getBashioTheme(),\n });\n\n if (selectedProvider === '__add_new__') {\n console.log(pc.dim(\"\\n Run 'b --auth' to add a new provider.\\n\"));\n return 0;\n }\n\n // Step 2: Select model for the chosen provider\n const currentModel = config.providers[selectedProvider]?.model;\n let newModel: string;\n\n if (selectedProvider === 'ollama') {\n const host =\n config.providers.ollama?.credentials.type === 'local'\n ? config.providers.ollama.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 model:',\n choices: availableModels.map((m) => ({ value: m, name: m })),\n default: currentModel,\n theme: getBashioTheme(),\n });\n } else {\n const models = getModelsForProvider(selectedProvider);\n newModel = await selectWithEsc<string>({\n message: 'Select model:',\n choices: models.map((m) => ({ value: m.value, name: m.label })),\n default: currentModel,\n theme: getBashioTheme(),\n });\n }\n\n // Update config\n const providerSettings = config.providers[selectedProvider];\n if (!providerSettings) {\n logger.error('Provider not configured.');\n return 1;\n }\n\n const updatedConfig: ConfigV2 = {\n ...config,\n activeProvider: selectedProvider,\n providers: {\n ...config.providers,\n [selectedProvider]: {\n ...providerSettings,\n model: newModel,\n },\n },\n };\n\n saveConfig(updatedConfig);\n\n const changed =\n selectedProvider !== config.activeProvider || newModel !== currentModel;\n\n if (changed) {\n console.log();\n logger.success(\n `Switched to: ${PROVIDER_DISPLAY_NAMES[selectedProvider]} / ${newModel}`,\n );\n } else {\n logger.info('No changes made.');\n }\n console.log();\n\n return 0;\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}\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 { bashioTheme } from '../../utils/inquirerTheme.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 theme: bashioTheme,\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 { accent, 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: accent },\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 { accent, 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: accent },\n { header: 'Uses', key: 'uses', width: 8, align: 'right' },\n {\n header: 'Source',\n key: 'source',\n width: 10,\n color: (v) => pc.yellow(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 { bashioTheme } from '../../utils/inquirerTheme.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.white(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 theme: bashioTheme,\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 theme: bashioTheme,\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 theme: bashioTheme,\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.yellow(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 * as readline from 'node:readline';\nimport chalk from 'chalk';\nimport { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { getThemeByName, THEMES, type Theme } from '../../chat/utils/themes.js';\nimport { configExists, loadConfig, saveConfig } from '../../core/config.js';\nimport type { ConfigV2 } from '../../core/types.js';\nimport { clearThemeCache } from '../../utils/cliTheme.js';\nimport { logger } from '../../utils/logger.js';\n\nconst MAX_VISIBLE = 10;\n\ninterface ThemePickerResult {\n theme: string | null;\n cancelled: boolean;\n}\n\nfunction renderThemePicker(\n themes: Theme[],\n selectedIndex: number,\n currentThemeName: string,\n scrollOffset: number,\n): string[] {\n const lines: string[] = [];\n const selectedTheme = themes[selectedIndex];\n const accentColor = chalk.hex(selectedTheme.accent);\n\n lines.push(accentColor('?') + pc.bold(' Select theme:'));\n\n const visibleThemes = themes.slice(scrollOffset, scrollOffset + MAX_VISIBLE);\n\n for (let i = 0; i < visibleThemes.length; i++) {\n const theme = visibleThemes[i];\n const actualIndex = scrollOffset + i;\n const isSelected = actualIndex === selectedIndex;\n const isCurrent = theme.name === currentThemeName;\n\n const cursor = isSelected ? accentColor('❯') : ' ';\n const marker = isCurrent ? accentColor('●') : pc.dim('○');\n const colorPreview = chalk.hex(theme.accent)('■');\n const name = isSelected\n ? accentColor(theme.displayName)\n : theme.displayName;\n\n lines.push(`${cursor} ${marker} ${colorPreview} ${name}`);\n }\n\n // Show scroll indicators\n if (scrollOffset > 0) {\n lines.push(pc.dim(' ↑ more themes above'));\n }\n if (scrollOffset + MAX_VISIBLE < themes.length) {\n lines.push(pc.dim(' ↓ more themes below'));\n }\n\n lines.push('');\n lines.push(pc.dim('↑↓ navigate • ↵ select • esc cancel'));\n\n return lines;\n}\n\nasync function interactiveThemePicker(\n currentThemeName: string,\n): Promise<ThemePickerResult> {\n return new Promise((resolve) => {\n const themes = THEMES;\n let selectedIndex = themes.findIndex((t) => t.name === currentThemeName);\n if (selectedIndex === -1) selectedIndex = 0;\n\n let scrollOffset = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(MAX_VISIBLE / 2),\n themes.length - MAX_VISIBLE,\n ),\n );\n\n let renderedLines = 0;\n\n const clearRenderedLines = () => {\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n process.stdout.write('\\x1b[0J');\n }\n };\n\n const render = () => {\n clearRenderedLines();\n\n const lines = renderThemePicker(\n themes,\n selectedIndex,\n currentThemeName,\n scrollOffset,\n );\n renderedLines = lines.length;\n\n for (const line of lines) {\n console.log(line);\n }\n };\n\n const input = process.stdin;\n\n readline.emitKeypressEvents(input);\n if (input.isTTY) {\n input.setRawMode(true);\n }\n\n const cleanup = () => {\n input.removeListener('keypress', onKeypress);\n if (input.isTTY) {\n input.setRawMode(false);\n }\n input.pause();\n clearRenderedLines();\n };\n\n const onKeypress = (_str: string, key: readline.Key) => {\n if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {\n cleanup();\n resolve({ theme: null, cancelled: true });\n return;\n }\n\n if (key.name === 'return') {\n cleanup();\n resolve({ theme: themes[selectedIndex].name, cancelled: false });\n return;\n }\n\n if (key.name === 'up' || (key.ctrl && key.name === 'p')) {\n if (selectedIndex > 0) {\n selectedIndex--;\n if (selectedIndex < scrollOffset) {\n scrollOffset = selectedIndex;\n }\n render();\n }\n }\n\n if (key.name === 'down' || (key.ctrl && key.name === 'n')) {\n if (selectedIndex < themes.length - 1) {\n selectedIndex++;\n if (selectedIndex >= scrollOffset + MAX_VISIBLE) {\n scrollOffset = selectedIndex - MAX_VISIBLE + 1;\n }\n render();\n }\n }\n\n // Page up/down for faster navigation\n if (key.name === 'pageup') {\n selectedIndex = Math.max(0, selectedIndex - MAX_VISIBLE);\n scrollOffset = Math.max(0, scrollOffset - MAX_VISIBLE);\n render();\n }\n\n if (key.name === 'pagedown') {\n selectedIndex = Math.min(\n themes.length - 1,\n selectedIndex + MAX_VISIBLE,\n );\n scrollOffset = Math.min(\n themes.length - MAX_VISIBLE,\n scrollOffset + MAX_VISIBLE,\n );\n render();\n }\n\n // Home/End\n if (key.name === 'home') {\n selectedIndex = 0;\n scrollOffset = 0;\n render();\n }\n\n if (key.name === 'end') {\n selectedIndex = themes.length - 1;\n scrollOffset = Math.max(0, themes.length - MAX_VISIBLE);\n render();\n }\n };\n\n input.on('keypress', onKeypress);\n render();\n });\n}\n\nexport class ThemeCommand extends Command {\n static paths = [['theme'], ['--theme']];\n\n static usage = Command.Usage({\n description: 'Change the color theme',\n examples: [['Change theme', '$0 --theme']],\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 const currentThemeName = config.settings?.theme ?? 'bashio';\n const currentTheme = getThemeByName(currentThemeName);\n\n console.log(pc.bold('\\n Change Theme\\n'));\n console.log(pc.gray(` Current: ${currentTheme.displayName}\\n`));\n\n const result = await interactiveThemePicker(currentThemeName);\n\n if (result.cancelled || !result.theme) {\n console.log(pc.dim(' Cancelled.\\n'));\n return 0;\n }\n\n if (result.theme === currentThemeName) {\n logger.info('No changes made.');\n console.log();\n return 0;\n }\n\n const updatedConfig: ConfigV2 = {\n ...config,\n settings: {\n confirmBeforeExecute: config.settings?.confirmBeforeExecute ?? true,\n historyEnabled: config.settings?.historyEnabled ?? true,\n historyRetentionDays: config.settings?.historyRetentionDays ?? 30,\n historyMaxEntries: config.settings?.historyMaxEntries ?? 2000,\n autoConfirmShortcuts: config.settings?.autoConfirmShortcuts ?? false,\n theme: result.theme,\n },\n };\n\n saveConfig(updatedConfig);\n clearThemeCache();\n\n const newTheme = getThemeByName(result.theme);\n logger.success(`Theme changed to: ${newTheme.displayName}`);\n console.log(\n pc.dim(' Restart chat (b --chat) to see full theme changes.\\n'),\n );\n\n return 0;\n }\n}\n","import { Command } from 'clipanion';\nimport pc from 'picocolors';\nimport { PACKAGE_NAME, PACKAGE_VERSION } from '../../core/constants.js';\nimport { accent } from '../../utils/colors.js';\n\ninterface NpmRegistryResponse {\n version: string;\n}\n\nasync function fetchLatestVersion(): Promise<string | null> {\n try {\n const response = await fetch(\n `https://registry.npmjs.org/${PACKAGE_NAME}/latest`,\n {\n headers: { Accept: 'application/json' },\n signal: AbortSignal.timeout(5000),\n },\n );\n\n if (!response.ok) {\n return null;\n }\n\n const data = (await response.json()) as NpmRegistryResponse;\n return data.version ?? null;\n } catch {\n return null;\n }\n}\n\nfunction compareVersions(current: string, latest: string): number {\n const currentParts = current.split('.').map(Number);\n const latestParts = latest.split('.').map(Number);\n\n for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {\n const c = currentParts[i] ?? 0;\n const l = latestParts[i] ?? 0;\n if (c < l) return -1;\n if (c > l) return 1;\n }\n return 0;\n}\n\nfunction renderUpdateBanner(current: string, latest: string): void {\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 accent(' │') + pad(content, width) + accent('│');\n\n console.log();\n console.log(accent(` ┌${'─'.repeat(width)}┐`));\n console.log(line(''));\n console.log(line(pc.bold(' Update Available!')));\n console.log(line(''));\n console.log(line(` ${pc.dim(current)} → ${accent(pc.bold(latest))}`));\n console.log(line(''));\n console.log(line(` Run: ${accent('npm i -g bashio@latest')}`));\n console.log(line(''));\n console.log(accent(` └${'─'.repeat(width)}┘`));\n console.log();\n}\n\nexport class VersionCommand extends Command {\n static paths = [['--version'], ['-v']];\n\n static usage = Command.Usage({\n description: 'Show version and check for updates',\n examples: [['Show version', '$0 --version']],\n });\n\n async execute(): Promise<number> {\n console.log(`${pc.bold('Bashio')} v${PACKAGE_VERSION}`);\n\n const latestVersion = await fetchLatestVersion();\n\n if (latestVersion && compareVersions(PACKAGE_VERSION, latestVersion) < 0) {\n renderUpdateBanner(PACKAGE_VERSION, latestVersion);\n } else if (latestVersion) {\n console.log(pc.green('✓ You are on the latest version'));\n } else {\n console.log(pc.dim('Could not check for updates'));\n }\n\n return 0;\n }\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","db","db","input","chmodSync","existsSync","existsSync","chmodSync","input","Command","Command","Command","Command","Option","pc","pc","Command","Option","pc","Command","pc","Command","pc","settings","confirm","input","Command","Option","pc","Command","Option","historyId","pc","input","confirm","spawn","Command","pc","Command","pc","spawn","Command","pc","pc","pc","Command","pc","Command","Option","pc","Command","Option","pc","readline","Command","pc","input","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","readline","Command","pc","pc","input","Command","Command","pc","stripAnsi","pc","Command","stripAnsi","pc"]}
|