@iamharshil/aix-cli 1.0.2 → 1.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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024
3
+ Copyright (c) 2026 Harshil
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,43 +1,56 @@
1
1
  # AIX CLI
2
2
 
3
- > AI CLI tool that integrates LM Studio with Claude Code for enhanced development assistance
3
+ > AI-powered CLI tool that integrates LM Studio with Claude Code for enhanced local development assistance
4
+
5
+ <div align="center">
4
6
 
5
7
  [![npm version](https://img.shields.io/npm/v/@iamharshil/aix-cli.svg)](https://www.npmjs.com/package/@iamharshil/aix-cli)
6
8
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
9
  [![Node.js Version](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen)](https://nodejs.org/)
10
+ [![GitHub Release](https://img.shields.io/github/v/release/iamharshil/aix-cli)](https://github.com/iamharshil/aix-cli/releases)
11
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/iamharshil/aix-cli/ci)](https://github.com/iamharshil/aix-cli/actions)
12
+ [![Total Downloads](https://img.shields.io/npm/dt/@iamharshil/aix-cli)](https://www.npmjs.com/package/@iamharshil/aix-cli)
13
+
14
+ </div>
15
+
16
+ ---
8
17
 
9
- **AIX** lets you use locally running AI models from LM Studio directly with Claude Code. No API keys, no cloud dependencies, complete privacy.
18
+ ## Overview
10
19
 
11
- ## Features
20
+ **AIX CLI** enables you to use locally-running AI models from [LM Studio](https://lmstudio.ai) directly with [Claude Code](https://docs.anthropic.com/en/docs/claude-code). No API keys, no cloud dependencies, complete privacy.
12
21
 
13
- - **Privacy-first**: All processing happens locally on your machine
14
- - **Permission-based**: Never makes system changes without asking
15
- - **Interactive model selection**: Browse and choose from your downloaded models
16
- - **Seamless Claude Code integration**: Just run `aix-cli run` and code
17
- - **Cross-platform**: macOS, Linux, and Windows support
22
+ ### Why AIX?
23
+
24
+ | Feature | Description |
25
+ | -------------------- | ---------------------------------------------- |
26
+ | 🔒 **Privacy-First** | All processing happens locally on your machine |
27
+ | 🔑 **No API Keys** | No external services or subscriptions |
28
+ | 🚀 **Fast** | Local inference with your GPU |
29
+ | 🛡️ **Secure** | Your code never leaves your machine |
30
+ | 🔧 **Simple** | Just run `aix-cli run` and start coding |
18
31
 
19
32
  ## Prerequisites
20
33
 
21
34
  - [Node.js](https://nodejs.org/) 18.0.0 or higher
22
- - [LM Studio](https://lmstudio.ai) - Download and install
23
- - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) - Install via `npm install -g @anthropic-ai/claude-code`
35
+ - [LM Studio](https://lmstudio.ai) - Download and run local AI models
36
+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) - AI coding assistant
24
37
 
25
38
  ## Quick Start
26
39
 
27
40
  ```bash
28
- # Install AIX CLI
41
+ # Install
29
42
  npm install -g @iamharshil/aix-cli
30
43
 
31
- # Check if everything is set up
44
+ # Verify setup
32
45
  aix-cli doctor
33
46
 
34
- # Start using (will prompt for model selection)
47
+ # Run with interactive model selection
35
48
  aix-cli run
36
49
  ```
37
50
 
38
51
  ## Installation
39
52
 
40
- ### Using npm (recommended)
53
+ ### Using npm (Recommended)
41
54
 
42
55
  ```bash
43
56
  npm install -g @iamharshil/aix-cli
@@ -55,7 +68,7 @@ yarn global add @iamharshil/aix-cli
55
68
  pnpm add -g @iamharshil/aix-cli
56
69
  ```
57
70
 
58
- ### From source
71
+ ### From Source
59
72
 
60
73
  ```bash
61
74
  git clone https://github.com/iamharshil/aix-cli.git
@@ -69,56 +82,36 @@ npm link
69
82
 
70
83
  ### System Check
71
84
 
72
- Verify your setup:
85
+ Verify your environment is properly configured:
73
86
 
74
87
  ```bash
75
88
  aix-cli doctor
76
89
  ```
77
90
 
78
- Output:
79
-
80
- ```
81
- System Check
82
- ──────────────────────────────────────────────────
83
- ✓ LM Studio: Running
84
- ✓ Claude Code: Installed
85
-
86
- Configuration
87
- ──────────────────────────────────────────────────
88
- ▸ LM Studio URL: http://localhost:1234
89
- ```
90
-
91
- ### Initialize & Load a Model
91
+ ### Initialize Model
92
92
 
93
- Select and load a model from your local LM Studio models:
93
+ Load a model from your local LM Studio models:
94
94
 
95
95
  ```bash
96
+ # Interactive selection
96
97
  aix-cli init
97
- ```
98
-
99
- With a specific model:
100
98
 
101
- ```bash
99
+ # Specific model
102
100
  aix-cli init -m llama-3-8b
103
101
  ```
104
102
 
105
- ### Run Claude Code with a Model
103
+ ### Run Claude Code
106
104
 
107
- Start an interactive Claude Code session with your selected model:
105
+ Start coding with Claude Code and your local model:
108
106
 
109
107
  ```bash
108
+ # Interactive session
110
109
  aix-cli run
111
- ```
112
110
 
113
- With a specific model:
114
-
115
- ```bash
111
+ # With specific model
116
112
  aix-cli run -m llama-3-8b
117
- ```
118
-
119
- With additional Claude Code arguments:
120
113
 
121
- ```bash
114
+ # With arguments
122
115
  aix-cli run -m llama-3-8b -- "Write a hello world in Python"
123
116
  ```
124
117
 
@@ -132,16 +125,18 @@ aix-cli status
132
125
 
133
126
  ## Configuration
134
127
 
128
+ ### Config Location
129
+
135
130
  AIX CLI stores configuration in your system's app data directory:
136
131
 
137
- - **macOS**: `~/Library/Application Support/aix-cli/`
138
- - **Linux**: `~/.config/aix-cli/`
139
- - **Windows**: `%APPDATA%\aix-cli\`
132
+ | Platform | Path |
133
+ | -------- | ---------------------------------------- |
134
+ | macOS | `~/Library/Application Support/aix-cli/` |
135
+ | Linux | `~/.config/aix-cli/` |
136
+ | Windows | `%APPDATA%\aix-cli\` |
140
137
 
141
138
  ### Config File
142
139
 
143
- The config is stored as `config.json`:
144
-
145
140
  ```json
146
141
  {
147
142
  "lmStudioUrl": "http://localhost",
@@ -157,90 +152,87 @@ The config is stored as `config.json`:
157
152
  | ---------------- | --------------------- | ------- |
158
153
  | `LM_STUDIO_PORT` | LM Studio server port | `1234` |
159
154
 
160
- ## How It Works
155
+ ## Architecture
161
156
 
162
157
  ```
163
- ┌─────────────────────────────────────────────────────────────┐
164
- AIX Flow
165
- ├─────────────────────────────────────────────────────────────┤
166
-
167
- │ ┌──────────┐ ┌──────────────┐ ┌─────────────┐
168
- │ │ User │────▶│ LM Studio │────▶│ Models
169
- │ └──────────┘ └──────────────┘ └─────────────┘
170
- │ │ │
171
- │ │ ▼
172
- │ │ ┌──────────────┐
173
- │ │ │ Local API │
174
- │ │ │ (port 1234) │
175
- │ │ └──────────────┘
176
- │ │ │
177
- │ ▼ ▼
178
- ┌──────────────────────────────┐
179
- │ │ Claude Code
180
- │ │ --model lmstudio/model-id
181
- └──────────────────────────────┘
182
-
183
- └─────────────────────────────────────────────────────────────┘
158
+ ┌─────────────────────────────────────────────────────┐
159
+ AIX Flow
160
+ ├─────────────────────────────────────────────────────┤
161
+
162
+ │ ┌──────────┐ ┌──────────────┐
163
+ │ │ User │────▶│ LM Studio │
164
+ │ └──────────┘ └──────────────┘
165
+ │ │ │
166
+ │ │ ▼
167
+ │ │ ┌──────────────┐
168
+ │ │ │ Local API │
169
+ │ │ │ (port 1234) │
170
+ │ │ └──────────────┘
171
+ │ │ │
172
+ │ ▼ ▼
173
+ ┌─────────────────────────────────┐
174
+ │ │ Claude Code
175
+ │ │ --model lmstudio/model
176
+ └─────────────────────────────────┘
177
+
178
+ └─────────────────────────────────────────────────────┘
184
179
  ```
185
180
 
186
181
  ## Troubleshooting
187
182
 
188
- ### "LM Studio server is not running"
189
-
190
- 1. Open LM Studio
191
- 2. Go to the **Server** tab (left sidebar)
192
- 3. Click **Start Server**
193
- 4. Run `aix run` again
194
-
195
- Or let AIX start it for you (it will ask for permission).
196
-
197
- ### "No models found"
183
+ ### LM Studio server not running
198
184
 
199
- 1. Open LM Studio
200
- 2. Go to the **Search** tab
201
- 3. Download a model (e.g., Llama 3, Mistral, Phi-3)
202
- 4. Wait for download to complete
203
- 5. Run `aix init` or `aix run` again
185
+ ```bash
186
+ # 1. Open LM Studio
187
+ # 2. Go to Server tab (left sidebar)
188
+ # 3. Click Start Server
189
+ # 4. Run: aix-cli run
190
+ ```
204
191
 
205
- ### "Claude Code is not installed"
192
+ ### No models found
206
193
 
207
194
  ```bash
208
- npm install -g @anthropic-ai/claude-code
195
+ # 1. Open LM Studio
196
+ # 2. Go to Search tab
197
+ # 3. Download a model (e.g., Llama 3, Mistral)
198
+ # 4. Wait for download to complete
199
+ # 5. Run: aix-cli init
209
200
  ```
210
201
 
211
- ### "Connection refused" on port 1234
202
+ ### Connection refused on port 1234
212
203
 
213
- The default port might be in use. Check LM Studio's server tab for the correct port, then update your config if needed.
204
+ Check LM Studio's server tab for the correct port and update your config.
214
205
 
215
- ## Privacy
206
+ ## Security & Privacy
216
207
 
217
- - All AI processing happens locally on your machine
218
- - No data is sent to external servers
219
- - No telemetry or analytics
220
- - No API keys required
221
- - Your code stays on your machine
208
+ - All AI processing happens locally
209
+ - No data sent to external servers
210
+ - No telemetry or analytics
211
+ - No API keys required
212
+ - Your code stays on your machine
222
213
 
223
214
  ## Contributing
224
215
 
225
- Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) before submitting PRs.
216
+ Contributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md).
226
217
 
227
- ### Development Setup
218
+ ### Development
228
219
 
229
220
  ```bash
230
- # Clone the repository
231
- git clone https://github.com/your-username/aix.git
232
- cd aix
233
-
234
- # Install dependencies
221
+ # Clone and setup
222
+ git clone https://github.com/iamharshil/aix-cli.git
223
+ cd aix-cli
235
224
  npm install
236
225
 
237
- # Run in development mode
226
+ # Development mode
238
227
  npm run dev
239
228
 
240
229
  # Run tests
241
230
  npm test
242
231
 
243
- # Build for production
232
+ # Lint
233
+ npm run lint
234
+
235
+ # Build
244
236
  npm run build
245
237
  ```
246
238
 
@@ -258,15 +250,17 @@ npm run build
258
250
 
259
251
  ## License
260
252
 
261
- MIT License - see [LICENSE](LICENSE) for details.
253
+ [MIT](LICENSE) - © 2024 Harshil
262
254
 
263
255
  ## Support
264
256
 
265
- - [Issue Tracker](https://github.com/your-username/aix/issues) - Report bugs or request features
266
- - [Discussions](https://github.com/your-username/aix/discussions) - Ask questions and share ideas
257
+ - 📋 [Issues](https://github.com/iamharshil/aix-cli/issues) - Report bugs
258
+ - 💬 [Discussions](https://github.com/iamharshil/aix-cli/discussions) - Ask questions
267
259
 
268
260
  ---
269
261
 
270
- <p align="center">
271
- Made with ❤️ for developers who value privacy
272
- </p>
262
+ <div align="center">
263
+
264
+ Built with ❤️ for privacy-conscious developers
265
+
266
+ </div>
package/dist/bin/aix.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- var J=Object.defineProperty;var P=(t,o)=>()=>(t&&(o=t(t=0)),o);var A=(t,o)=>{for(var e in o)J(t,e,{get:o[e],enumerable:!0})};var N={};A(N,{ConfigService:()=>w,configService:()=>d});import Q from"conf";var w,d,S=P(()=>{"use strict";w=class{store;constructor(){this.store=new Q({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,defaultTimeout:3e4,autoStartServer:!1},clearInvalidConfig:!0})}get(o){return this.store.get(o)}set(o,e){this.store.set(o,e)}setModel(o){this.store.set("model",o)}getLastUsedModel(){return this.store.get("model")}getLMStudioUrl(){let o=this.store.get("lmStudioUrl"),e=this.store.get("lmStudioPort");return`${o}:${e}`}reset(){this.store.clear()}},d=new w});var B={};A(B,{LMStudioService:()=>M,lmStudioService:()=>m});import{execa as k}from"execa";import D from"ora";import F from"chalk";var z,M,m,v=P(()=>{"use strict";S();z=[1234,1235,1236,1237],M=class{baseUrl;constructor(){this.baseUrl=d.getLMStudioUrl()}getApiUrl(o){return`${this.baseUrl}${o}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){try{let o=await fetch(this.getApiUrl("/api/models"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!o.ok)throw new Error(`Failed to fetch models: ${o.statusText}`);return(await o.json()).models??[]}catch(o){throw new Error(`Unable to fetch models from LM Studio: ${o instanceof Error?o.message:"Unknown error"}`)}}async getStatus(){if(!await this.checkStatus())return{running:!1,port:d.get("lmStudioPort"),models:[]};try{let e=await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!e.ok)return{running:!1,port:d.get("lmStudioPort"),models:[]};let n=await e.json();return{running:!0,port:d.get("lmStudioPort"),models:n.models??[],activeModel:n.active_model}}catch{return{running:!1,port:d.get("lmStudioPort"),models:[]}}}async loadModel(o,e){let n=e??D({text:`Loading model: ${F.cyan(o)}`,color:"cyan"}).start();try{let r=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:o}),signal:AbortSignal.timeout(3e5)});if(!r.ok)throw new Error(`Failed to load model: ${r.statusText}`);return n.succeed(`Model ${F.green(o)} loaded successfully`),d.setModel(o),{loadSpinner:n}}catch(r){throw n.fail(`Failed to load model: ${r instanceof Error?r.message:"Unknown error"}`),r}}async startServer(o){let e=o??D({text:"Starting LM Studio server...",color:"cyan"}).start();try{let n=process.platform==="darwin",r=process.platform==="linux",l=process.platform==="win32",c;if(n?c="/Applications/LM Studio.app/Contents/MacOS/lm-studio":r?c=await this.findLinuxBinary():l&&(c=await this.findWindowsExecutable()),!c)throw e.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await k(c,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(d.get("lmStudioPort"))}}),e.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(n){throw e.fail(`Failed to start LM Studio: ${n instanceof Error?n.message:"Unknown error"}`),n}}async findLinuxBinary(){let o=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let e of o)try{return await k("test",["-x",e]),e}catch{continue}}async findWindowsExecutable(){let o=process.env.LOCALAPPDATA,e=process.env.PROGRAMFILES,n=[o?`${o}\\Programs\\LM Studio\\lm-studio.exe`:"",e?`${e}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let r of n)try{return await k("cmd",["/c","if exist",`"${r}"`,"echo","yes"]),r}catch{continue}}async waitForServer(o=6e4){let e=Date.now();for(;Date.now()-e<o;){if(await this.checkStatus())return!0;await this.sleep(2e3)}return!1}sleep(o){return new Promise(e=>setTimeout(e,o))}async findAvailablePort(){for(let o of z)try{if((await fetch(`http://localhost:${o}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return o}catch{return d.set("lmStudioPort",o),o}return z[0]??1234}},m=new M});var _={};A(_,{ClaudeService:()=>L,claudeService:()=>O});import{execa as U}from"execa";import Y from"chalk";var L,O,I=P(()=>{"use strict";L=class{async isClaudeCodeInstalled(){try{return await U("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(o){let{model:e,args:n=[],verbose:r=!1}=o,l=this.extractProvider(e),c=this.extractModelName(e);if(!l||!c)throw new Error(`Invalid model format: ${e}. Expected format: provider/model-name`);let g=`${l}/${c}`,u=["--model",g,...n];r&&console.log(Y.dim(`
3
- Running: claude ${u.join(" ")}
4
- `));try{await U("claude",u,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:g}})}catch(s){if(s instanceof Error&&"exitCode"in s){let C=s.exitCode;process.exit(C??1)}throw s}}extractProvider(o){return o.split("/")[0]}extractModelName(o){let e=o.split("/");if(!(e.length<2))return e.slice(1).join("/")}async getVersion(){try{return(await U("claude",["--version"])).stdout}catch{return}}},O=new L});import{Command as Z}from"commander";import a from"chalk";v();S();import W from"ora";import f from"chalk";import j from"inquirer";async function y(t,o){let e=t.map(l=>({name:`${l.name} (${l.id})`,value:l,short:l.name})),n=o?e.findIndex(l=>l.value.id===o):0;return(await j.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:e,default:Math.max(0,n),pageSize:Math.min(t.length,15)}])).model}async function x(t,o=!0){return(await j.prompt([{type:"confirm",name:"confirm",message:t,default:o}])).confirm}import K from"chalk";function $(t){if(t===0)return"0 B";let o=1024,e=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(t)/Math.log(o));return`${parseFloat((t/Math.pow(o,n)).toFixed(2))} ${e[n]}`}function b(t){console.log(K.green("\u2713")+" "+t)}function X(t){console.error(K.red("\u2717")+" "+t)}function p(t,o=1){X(t),process.exit(o)}async function E(t={}){let o=W({text:"Checking LM Studio status...",color:"cyan"}).start(),e=await m.checkStatus();e||(o.info("LM Studio server not running"),o.stop(),await x("Would you like to start the LM Studio server?")||p("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await m.startServer(),e=!0),o.succeed("Connected to LM Studio");let n=W({text:"Fetching available models...",color:"cyan"}).start(),r=await m.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),p("No models available")),n.succeed(`Found ${f.bold(r.length)} model${r.length===1?"":"s"}`),console.log(),console.log(f.bold("Available Models:")),console.log(f.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((s,C)=>{let H=$(s.size),V=s.loaded?f.green(" [LOADED]"):"";console.log(` ${f.dim(String(C+1).padStart(2))}. ${s.name} ${f.dim(`(${H})`)}${V}`)}),console.log();let l=d.getLastUsedModel(),c=t.model,g=c?r.find(s=>s.id===c||s.name.includes(c)):await y(r,l);g||p("No model selected"),await m.loadModel(g.id,o);let u=g.id.replace("/","--");b(f.bold(`
5
- Model ready: ${g.name}`)),console.log(),console.log("Run Claude Code with this model:"),console.log(` ${f.cyan("claude --model lmstudio/"+u)}`),console.log(),console.log(`Or use ${f.cyan("npx aix run")} to start an interactive session`)}v();I();S();import G from"ora";import q from"chalk";async function R(t={}){let o=G({text:"Checking LM Studio status...",color:"cyan"}).start(),e=await m.checkStatus();e||(o.info("LM Studio server not running"),o.stop(),await x("Would you like to start the LM Studio server?")||p("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await m.startServer(),e=!0),o.succeed("Connected to LM Studio"),o.text="Fetching available models...";let n=await m.getAvailableModels();n.length===0&&(o.fail("No models found. Download some models in LM Studio first."),p("No models available")),o.stop();let r;if(t.model){let u=n.find(s=>s.id===t.model||s.name.toLowerCase().includes(t.model.toLowerCase()));u||p(`Model "${t.model}" not found. Available models: ${n.map(s=>s.name).join(", ")}`),r=u.id}else{let u=d.getLastUsedModel();r=(await y(n,u)).id}let l=G({text:`Loading model: ${q.cyan(r)}`,color:"cyan"}).start();await m.loadModel(r,l);let g=`lmstudio/${r.replace("/","--")}`;b(q.green(`
6
- Starting Claude Code with model: ${g}
7
- `));try{await O.run({model:g,args:t.args??[],verbose:t.verbose})}catch(u){p(`Failed to run Claude Code: ${u instanceof Error?u.message:"Unknown error"}`)}}v();import i from"chalk";async function T(){let t=await m.getStatus();console.log(),console.log(i.bold("LM Studio Status")),console.log(i.dim("\u2500".repeat(50))),console.log(` ${t.running?i.green("\u25CF"):i.red("\u25CB")} Server: ${t.running?i.green("Running"):i.red("Stopped")}`),console.log(` ${i.dim("\u25B8")} Port: ${i.cyan(String(t.port))}`),console.log(` ${i.dim("\u25B8")} URL: ${i.cyan(`http://localhost:${t.port}`)}`),t.activeModel?console.log(` ${i.dim("\u25B8")} Active Model: ${i.green(t.activeModel)}`):console.log(` ${i.dim("\u25B8")} Active Model: ${i.dim("None")}`),console.log(),console.log(i.bold("Models")),console.log(i.dim("\u2500".repeat(50))),t.models.length===0?console.log(` ${i.dim("No models available")}`):t.models.forEach((o,e)=>{let n=$(o.size),r=o.id===t.activeModel?` ${i.green("[LOADED]")}`:"";console.log(` ${i.dim(String(e+1)+".")} ${o.name}${r}`),console.log(` ${i.dim("ID:")} ${o.id}`),console.log(` ${i.dim("Size:")} ${n}`),o.quantization&&console.log(` ${i.dim("Quantization:")} ${o.quantization}`),console.log()})}var h=new Z;h.name("aix").description("AI CLI tool integrating LM Studio with Claude Code").version("1.0.0");h.command("init").description("Initialize and load a model into LM Studio").option("-m, --model <name>","Model name or ID to load").action(E);h.command("run").description("Run Claude Code with a model from LM Studio").option("-m, --model <name>","Model name or ID to use").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for Claude Code").action(async(t,o)=>{await R({...o,args:t})});h.command("status").description("Show LM Studio status and available models").action(T);h.command("doctor").description("Check system requirements and configuration").action(async()=>{let{lmStudioService:t}=await Promise.resolve().then(()=>(v(),B)),{claudeService:o}=await Promise.resolve().then(()=>(I(),_)),{configService:e}=await Promise.resolve().then(()=>(S(),N));console.log(),console.log(a.bold("System Check")),console.log(a.dim("\u2500".repeat(50)));let n=await t.checkStatus();console.log(` ${n?a.green("\u2713"):a.yellow("\u26A0")} LM Studio: ${n?a.green("Running"):a.yellow("Not running")}`);let r=await o.isClaudeCodeInstalled();console.log(` ${r?a.green("\u2713"):a.red("\u2717")} Claude Code: ${r?a.green("Installed"):a.red("Not installed")}`),console.log(),console.log(a.bold("Configuration")),console.log(a.dim("\u2500".repeat(50))),console.log(` ${a.dim("\u25B8")} LM Studio URL: ${a.cyan(e.getLMStudioUrl())}`),r||(console.log(),console.log(a.yellow("\u26A0 Claude Code is not installed.")),console.log(` Install it with: ${a.cyan("npm install -g @anthropic-ai/claude-code")}`)),n||(console.log(),console.log(a.yellow("\u26A0 LM Studio is not running.")),console.log(` Start the server from the LM Studio app or download from ${a.cyan("https://lmstudio.ai")}`))});h.parse();
2
+ var J=Object.defineProperty;var Q=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(o,e)=>(typeof require<"u"?require:o)[e]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var A=(t,o)=>()=>(t&&(o=t(t=0)),o);var k=(t,o)=>{for(var e in o)J(t,e,{get:o[e],enumerable:!0})};var N={};k(N,{ConfigService:()=>w,configService:()=>u});import X from"conf";var w,u,S=A(()=>{"use strict";w=class{store;constructor(){this.store=new X({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,defaultTimeout:3e4,autoStartServer:!1},clearInvalidConfig:!0})}get(o){return this.store.get(o)}set(o,e){this.store.set(o,e)}setModel(o){this.store.set("model",o)}getLastUsedModel(){return this.store.get("model")}getLMStudioUrl(){let o=this.store.get("lmStudioUrl"),e=this.store.get("lmStudioPort");return`${o}:${e}`}reset(){this.store.clear()}},u=new w});var B={};k(B,{LMStudioService:()=>y,lmStudioService:()=>g});import{execa as M}from"execa";import D from"ora";import F from"chalk";var z,y,g,v=A(()=>{"use strict";S();z=[1234,1235,1236,1237],y=class{baseUrl;constructor(){this.baseUrl=u.getLMStudioUrl()}getApiUrl(o){return`${this.baseUrl}${o}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){try{let o=await fetch(this.getApiUrl("/api/models"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!o.ok)throw new Error(`Failed to fetch models: ${o.statusText}`);return(await o.json()).models??[]}catch(o){throw new Error(`Unable to fetch models from LM Studio: ${o instanceof Error?o.message:"Unknown error"}`)}}async getStatus(){if(!await this.checkStatus())return{running:!1,port:u.get("lmStudioPort"),models:[]};try{let e=await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!e.ok)return{running:!1,port:u.get("lmStudioPort"),models:[]};let n=await e.json();return{running:!0,port:u.get("lmStudioPort"),models:n.models??[],activeModel:n.active_model}}catch{return{running:!1,port:u.get("lmStudioPort"),models:[]}}}async loadModel(o,e){let n=e??D({text:`Loading model: ${F.cyan(o)}`,color:"cyan"}).start();try{let r=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:o}),signal:AbortSignal.timeout(3e5)});if(!r.ok)throw new Error(`Failed to load model: ${r.statusText}`);return n.succeed(`Model ${F.green(o)} loaded successfully`),u.setModel(o),{loadSpinner:n}}catch(r){throw n.fail(`Failed to load model: ${r instanceof Error?r.message:"Unknown error"}`),r}}async startServer(o){let e=o??D({text:"Starting LM Studio server...",color:"cyan"}).start();try{let n=process.platform==="darwin",r=process.platform==="linux",d=process.platform==="win32",c;if(n){let m=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let a of m)try{let{existsSync:i}=await import("fs");if(i(a)){c=`open "${a}" --args --server`;break}}catch{}if(c?.startsWith("open")){await M("open",[m.find(a=>{try{let{existsSync:i}=Q("fs");return i(a)}catch{return!1}})||"/Applications/LM Studio.app","--args","--server"],{detached:!0,stdio:"ignore"}),e.succeed("LM Studio server started"),await this.waitForServer(6e4);return}}else r?c=await this.findLinuxBinary():d&&(c=await this.findWindowsExecutable());if(!c)throw e.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await M(c,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(u.get("lmStudioPort"))}}),e.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(n){throw e.fail(`Failed to start LM Studio: ${n instanceof Error?n.message:"Unknown error"}`),n}}async findLinuxBinary(){let o=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let e of o)try{return await M("test",["-x",e]),e}catch{continue}}async findWindowsExecutable(){let o=process.env.LOCALAPPDATA,e=process.env.PROGRAMFILES,n=[o?`${o}\\Programs\\LM Studio\\lm-studio.exe`:"",e?`${e}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let r of n)try{return await M("cmd",["/c","if exist",`"${r}"`,"echo","yes"]),r}catch{continue}}async waitForServer(o=6e4){let e=Date.now();for(;Date.now()-e<o;){if(await this.checkStatus())return!0;await this.sleep(2e3)}return!1}sleep(o){return new Promise(e=>setTimeout(e,o))}async findAvailablePort(){for(let o of z)try{if((await fetch(`http://localhost:${o}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return o}catch{return u.set("lmStudioPort",o),o}return z[0]??1234}},g=new y});var _={};k(_,{ClaudeService:()=>C,claudeService:()=>O});import{execa as U}from"execa";import Z from"chalk";var C,O,I=A(()=>{"use strict";C=class{async isClaudeCodeInstalled(){try{return await U("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(o){let{model:e,args:n=[],verbose:r=!1}=o,d=this.extractProvider(e),c=this.extractModelName(e);if(!d||!c)throw new Error(`Invalid model format: ${e}. Expected format: provider/model-name`);let m=`${d}/${c}`,a=["--model",m,...n];r&&console.log(Z.dim(`
3
+ Running: claude ${a.join(" ")}
4
+ `));try{await U("claude",a,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:m}})}catch(i){if(i instanceof Error&&"exitCode"in i){let P=i.exitCode;process.exit(P??1)}throw i}}extractProvider(o){return o.split("/")[0]}extractModelName(o){let e=o.split("/");if(!(e.length<2))return e.slice(1).join("/")}async getVersion(){try{return(await U("claude",["--version"])).stdout}catch{return}}},O=new C});import{Command as oo}from"commander";import l from"chalk";v();S();import W from"ora";import f from"chalk";import j from"inquirer";async function x(t,o){let e=t.map(d=>({name:`${d.name} (${d.id})`,value:d,short:d.name})),n=o?e.findIndex(d=>d.value.id===o):0;return(await j.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:e,default:Math.max(0,n),pageSize:Math.min(t.length,15)}])).model}async function $(t,o=!0){return(await j.prompt([{type:"confirm",name:"confirm",message:t,default:o}])).confirm}import K from"chalk";function b(t){if(t===0)return"0 B";let o=1024,e=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(t)/Math.log(o));return`${parseFloat((t/Math.pow(o,n)).toFixed(2))} ${e[n]}`}function L(t){console.log(K.green("\u2713")+" "+t)}function Y(t){console.error(K.red("\u2717")+" "+t)}function p(t,o=1){Y(t),process.exit(o)}async function E(t={}){let o=W({text:"Checking LM Studio status...",color:"cyan"}).start(),e=await g.checkStatus();e||(o.info("LM Studio server not running"),o.stop(),await $("Would you like to start the LM Studio server?")||p("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),e=!0),o.succeed("Connected to LM Studio");let n=W({text:"Fetching available models...",color:"cyan"}).start(),r=await g.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),p("No models available")),n.succeed(`Found ${f.bold(r.length)} model${r.length===1?"":"s"}`),console.log(),console.log(f.bold("Available Models:")),console.log(f.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((i,P)=>{let H=b(i.size),V=i.loaded?f.green(" [LOADED]"):"";console.log(` ${f.dim(String(P+1).padStart(2))}. ${i.name} ${f.dim(`(${H})`)}${V}`)}),console.log();let d=u.getLastUsedModel(),c=t.model,m=c?r.find(i=>i.id===c||i.name.includes(c)):await x(r,d);m||p("No model selected"),await g.loadModel(m.id,o);let a=m.id.replace("/","--");L(f.bold(`
5
+ Model ready: ${m.name}`)),console.log(),console.log("Run Claude Code with this model:"),console.log(` ${f.cyan("claude --model lmstudio/"+a)}`),console.log(),console.log(`Or use ${f.cyan("npx aix run")} to start an interactive session`)}v();I();S();import q from"ora";import G from"chalk";async function R(t={}){let o=q({text:"Checking LM Studio status...",color:"cyan"}).start(),e=await g.checkStatus();e||(o.info("LM Studio server not running"),o.stop(),await $("Would you like to start the LM Studio server?")||p("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),e=!0),o.succeed("Connected to LM Studio"),o.text="Fetching available models...";let n=await g.getAvailableModels();n.length===0&&(o.fail("No models found. Download some models in LM Studio first."),p("No models available")),o.stop();let r;if(t.model){let a=n.find(i=>i.id===t.model||i.name.toLowerCase().includes(t.model.toLowerCase()));a||p(`Model "${t.model}" not found. Available models: ${n.map(i=>i.name).join(", ")}`),r=a.id}else{let a=u.getLastUsedModel();r=(await x(n,a)).id}let d=q({text:`Loading model: ${G.cyan(r)}`,color:"cyan"}).start();await g.loadModel(r,d);let m=`lmstudio/${r.replace("/","--")}`;L(G.green(`
6
+ Starting Claude Code with model: ${m}
7
+ `));try{await O.run({model:m,args:t.args??[],verbose:t.verbose})}catch(a){p(`Failed to run Claude Code: ${a instanceof Error?a.message:"Unknown error"}`)}}v();import s from"chalk";async function T(){let t=await g.getStatus();console.log(),console.log(s.bold("LM Studio Status")),console.log(s.dim("\u2500".repeat(50))),console.log(` ${t.running?s.green("\u25CF"):s.red("\u25CB")} Server: ${t.running?s.green("Running"):s.red("Stopped")}`),console.log(` ${s.dim("\u25B8")} Port: ${s.cyan(String(t.port))}`),console.log(` ${s.dim("\u25B8")} URL: ${s.cyan(`http://localhost:${t.port}`)}`),t.activeModel?console.log(` ${s.dim("\u25B8")} Active Model: ${s.green(t.activeModel)}`):console.log(` ${s.dim("\u25B8")} Active Model: ${s.dim("None")}`),console.log(),console.log(s.bold("Models")),console.log(s.dim("\u2500".repeat(50))),t.models.length===0?console.log(` ${s.dim("No models available")}`):t.models.forEach((o,e)=>{let n=b(o.size),r=o.id===t.activeModel?` ${s.green("[LOADED]")}`:"";console.log(` ${s.dim(String(e+1)+".")} ${o.name}${r}`),console.log(` ${s.dim("ID:")} ${o.id}`),console.log(` ${s.dim("Size:")} ${n}`),o.quantization&&console.log(` ${s.dim("Quantization:")} ${o.quantization}`),console.log()})}var h=new oo;h.name("aix").description("AI CLI tool integrating LM Studio with Claude Code").version("1.0.0");h.command("init").description("Initialize and load a model into LM Studio").option("-m, --model <name>","Model name or ID to load").action(E);h.command("run").description("Run Claude Code with a model from LM Studio").option("-m, --model <name>","Model name or ID to use").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for Claude Code").action(async(t,o)=>{await R({...o,args:t})});h.command("status").description("Show LM Studio status and available models").action(T);h.command("doctor").description("Check system requirements and configuration").action(async()=>{let{lmStudioService:t}=await Promise.resolve().then(()=>(v(),B)),{claudeService:o}=await Promise.resolve().then(()=>(I(),_)),{configService:e}=await Promise.resolve().then(()=>(S(),N));console.log(),console.log(l.bold("System Check")),console.log(l.dim("\u2500".repeat(50)));let n=await t.checkStatus();console.log(` ${n?l.green("\u2713"):l.yellow("\u26A0")} LM Studio: ${n?l.green("Running"):l.yellow("Not running")}`);let r=await o.isClaudeCodeInstalled();console.log(` ${r?l.green("\u2713"):l.red("\u2717")} Claude Code: ${r?l.green("Installed"):l.red("Not installed")}`),console.log(),console.log(l.bold("Configuration")),console.log(l.dim("\u2500".repeat(50))),console.log(` ${l.dim("\u25B8")} LM Studio URL: ${l.cyan(e.getLMStudioUrl())}`),r||(console.log(),console.log(l.yellow("\u26A0 Claude Code is not installed.")),console.log(` Install it with: ${l.cyan("npm install -g @anthropic-ai/claude-code")}`)),n||(console.log(),console.log(l.yellow("\u26A0 LM Studio is not running.")),console.log(` Start the server from the LM Studio app or download from ${l.cyan("https://lmstudio.ai")}`))});h.parse();
8
8
  //# sourceMappingURL=aix.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/services/config.ts", "../../src/services/lmstudio.ts", "../../src/services/claude.ts", "../../src/index.ts", "../../src/commands/init.ts", "../../src/utils/prompt.ts", "../../src/utils/format.ts", "../../src/commands/run.ts", "../../src/commands/status.ts"],
4
- "sourcesContent": ["import Conf from 'conf';\nimport type { Config } from '../types/index.js';\n\nexport class ConfigService {\n private store: Conf<Config>;\n\n constructor() {\n this.store = new Conf<Config>({\n projectName: 'aix',\n defaults: {\n lmStudioUrl: 'http://localhost',\n lmStudioPort: 1234,\n defaultTimeout: 30000,\n autoStartServer: false,\n },\n clearInvalidConfig: true,\n });\n }\n\n get<K extends keyof Config>(key: K): Config[K] {\n return this.store.get(key) as Config[K];\n }\n\n set<K extends keyof Config>(key: K, value: Config[K]): void {\n this.store.set(key, value as Config[K]);\n }\n\n setModel(model: string): void {\n this.store.set('model', model);\n }\n\n getLastUsedModel(): string | undefined {\n return this.store.get('model');\n }\n\n getLMStudioUrl(): string {\n const host = this.store.get('lmStudioUrl');\n const port = this.store.get('lmStudioPort');\n return `${host}:${port}`;\n }\n\n reset(): void {\n this.store.clear();\n }\n}\n\nexport const configService = new ConfigService();\n", "import { execa } from 'execa';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\nimport { configService } from './config.js';\nimport type { LMStudioStatus, LMStudioModel } from '../types/index.js';\n\nconst LMSTUDIO_PORTS = [1234, 1235, 1236, 1237];\n\nexport class LMStudioService {\n private baseUrl: string;\n\n constructor() {\n this.baseUrl = configService.getLMStudioUrl();\n }\n\n private getApiUrl(path: string): string {\n return `${this.baseUrl}${path}`;\n }\n\n async checkStatus(): Promise<boolean> {\n try {\n const response = await fetch(this.getApiUrl('/api/status'), {\n method: 'GET',\n signal: AbortSignal.timeout(3000),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async getAvailableModels(): Promise<LMStudioModel[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/models'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch models: ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n models: Array<{ id: string; name: string; size: number; quantization?: string }>;\n };\n return data.models ?? [];\n } catch (error) {\n throw new Error(\n `Unable to fetch models from LM Studio: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n async getStatus(): Promise<LMStudioStatus> {\n const running = await this.checkStatus();\n\n if (!running) {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n\n try {\n const response = await fetch(this.getApiUrl('/api/status'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n\n const data = (await response.json()) as {\n models: LMStudioModel[];\n active_model?: string;\n };\n\n return {\n running: true,\n port: configService.get('lmStudioPort'),\n models: data.models ?? [],\n activeModel: data.active_model,\n };\n } catch {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n }\n\n async loadModel(modelId: string, spinner?: Ora): Promise<{ loadSpinner: Ora }> {\n const loadSpinner =\n spinner ??\n ora({\n text: `Loading model: ${chalk.cyan(modelId)}`,\n color: 'cyan',\n }).start();\n\n try {\n const response = await fetch(this.getApiUrl('/api/model/load'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ model: modelId }),\n signal: AbortSignal.timeout(300000),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to load model: ${response.statusText}`);\n }\n\n loadSpinner.succeed(`Model ${chalk.green(modelId)} loaded successfully`);\n configService.setModel(modelId);\n\n return { loadSpinner };\n } catch (error) {\n loadSpinner.fail(\n `Failed to load model: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n throw error;\n }\n }\n\n async startServer(spinner?: Ora): Promise<void> {\n const startSpinner =\n spinner ??\n ora({\n text: 'Starting LM Studio server...',\n color: 'cyan',\n }).start();\n\n try {\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n const isWindows = process.platform === 'win32';\n\n let lmStudioPath: string | undefined;\n\n if (isMac) {\n lmStudioPath = '/Applications/LM Studio.app/Contents/MacOS/lm-studio';\n } else if (isLinux) {\n lmStudioPath = await this.findLinuxBinary();\n } else if (isWindows) {\n lmStudioPath = await this.findWindowsExecutable();\n }\n\n if (!lmStudioPath) {\n startSpinner.fail('LM Studio not found. Please install it from https://lmstudio.ai');\n throw new Error('LM Studio not installed');\n }\n\n await execa(lmStudioPath, ['--server'], {\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n LM_STUDIO_SERVER_PORT: String(configService.get('lmStudioPort')),\n },\n });\n\n startSpinner.succeed('LM Studio server started');\n\n await this.waitForServer(60000);\n } catch (error) {\n startSpinner.fail(\n `Failed to start LM Studio: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n throw error;\n }\n }\n\n private async findLinuxBinary(): Promise<string | undefined> {\n const possiblePaths = [\n '/usr/bin/lm-studio',\n '/usr/local/bin/lm-studio',\n `${process.env.HOME}/.local/bin/lm-studio`,\n ];\n\n for (const path of possiblePaths) {\n try {\n await execa('test', ['-x', path]);\n return path;\n } catch {\n continue;\n }\n }\n\n return undefined;\n }\n\n private async findWindowsExecutable(): Promise<string | undefined> {\n const localAppData = process.env.LOCALAPPDATA;\n const programFiles = process.env.PROGRAMFILES;\n\n const possiblePaths = [\n localAppData ? `${localAppData}\\\\Programs\\\\LM Studio\\\\lm-studio.exe` : '',\n programFiles ? `${programFiles}\\\\LM Studio\\\\lm-studio.exe` : '',\n ].filter(Boolean);\n\n for (const path of possiblePaths) {\n try {\n await execa('cmd', ['/c', 'if exist', `\"${path}\"`, 'echo', 'yes']);\n return path;\n } catch {\n continue;\n }\n }\n\n return undefined;\n }\n\n async waitForServer(timeout: number = 60000): Promise<boolean> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n if (await this.checkStatus()) {\n return true;\n }\n await this.sleep(2000);\n }\n\n return false;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async findAvailablePort(): Promise<number> {\n for (const port of LMSTUDIO_PORTS) {\n try {\n const response = await fetch(`http://localhost:${port}/api/status`, {\n method: 'GET',\n signal: AbortSignal.timeout(1000),\n });\n if (response.ok) {\n return port;\n }\n } catch {\n configService.set('lmStudioPort', port);\n return port;\n }\n }\n\n return LMSTUDIO_PORTS[0] ?? 1234;\n }\n}\n\nexport const lmStudioService = new LMStudioService();\n", "import { execa } from 'execa';\nimport chalk from 'chalk';\n\nexport interface ClaudeOptions {\n model: string;\n args?: string[];\n verbose?: boolean;\n}\n\nexport class ClaudeService {\n async isClaudeCodeInstalled(): Promise<boolean> {\n try {\n await execa('claude', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async run(options: ClaudeOptions): Promise<void> {\n const { model, args = [], verbose = false } = options;\n\n const provider = this.extractProvider(model);\n const modelName = this.extractModelName(model);\n\n if (!provider || !modelName) {\n throw new Error(`Invalid model format: ${model}. Expected format: provider/model-name`);\n }\n\n const modelArg = `${provider}/${modelName}`;\n const claudeArgs = ['--model', modelArg, ...args];\n\n if (verbose) {\n console.log(chalk.dim(`\\nRunning: claude ${claudeArgs.join(' ')}\\n`));\n }\n\n try {\n await execa('claude', claudeArgs, {\n stdio: 'inherit',\n env: {\n ...process.env,\n ANTHROPIC_MODEL: modelArg,\n },\n });\n } catch (error) {\n if (error instanceof Error && 'exitCode' in error) {\n const exitCode = (error as unknown as { exitCode: number }).exitCode;\n process.exit(exitCode ?? 1);\n }\n throw error;\n }\n }\n\n private extractProvider(model: string): string | undefined {\n const parts = model.split('/');\n return parts[0];\n }\n\n private extractModelName(model: string): string | undefined {\n const parts = model.split('/');\n if (parts.length < 2) return undefined;\n return parts.slice(1).join('/');\n }\n\n async getVersion(): Promise<string | undefined> {\n try {\n const result = await execa('claude', ['--version']);\n return result.stdout;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const claudeService = new ClaudeService();\n", "#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { initCommand, runCommand, statusCommand } from './commands/index.js';\n\nconst program = new Command();\n\nprogram\n .name('aix')\n .description('AI CLI tool integrating LM Studio with Claude Code')\n .version('1.0.0');\n\nprogram\n .command('init')\n .description('Initialize and load a model into LM Studio')\n .option('-m, --model <name>', 'Model name or ID to load')\n .action(initCommand);\n\nprogram\n .command('run')\n .description('Run Claude Code with a model from LM Studio')\n .option('-m, --model <name>', 'Model name or ID to use')\n .option('-v, --verbose', 'Show verbose output')\n .argument('[args...]', 'Additional arguments for Claude Code')\n .action(async (args: string[], options: Record<string, unknown>) => {\n await runCommand({\n ...options,\n args,\n });\n });\n\nprogram\n .command('status')\n .description('Show LM Studio status and available models')\n .action(statusCommand);\n\nprogram\n .command('doctor')\n .description('Check system requirements and configuration')\n .action(async () => {\n const { lmStudioService } = await import('./services/lmstudio.js');\n const { claudeService } = await import('./services/claude.js');\n const { configService } = await import('./services/config.js');\n\n console.log();\n console.log(chalk.bold('System Check'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n\n const lmStudioRunning = await lmStudioService.checkStatus();\n console.log(\n ` ${lmStudioRunning ? chalk.green('\u2713') : chalk.yellow('\u26A0')} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')}`\n );\n\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n console.log(\n ` ${claudeInstalled ? chalk.green('\u2713') : chalk.red('\u2717')} Claude Code: ${claudeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n\n console.log();\n console.log(chalk.bold('Configuration'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(` ${chalk.dim('\u25B8')} LM Studio URL: ${chalk.cyan(configService.getLMStudioUrl())}`);\n\n if (!claudeInstalled) {\n console.log();\n console.log(chalk.yellow('\u26A0 Claude Code is not installed.'));\n console.log(` Install it with: ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n }\n\n if (!lmStudioRunning) {\n console.log();\n console.log(chalk.yellow('\u26A0 LM Studio is not running.'));\n console.log(\n ` Start the server from the LM Studio app or download from ${chalk.cyan('https://lmstudio.ai')}`\n );\n }\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { formatBytes, success, exitWithError } from '../utils/format.js';\nimport type { InitOptions } from '../types/index.js';\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n console.log();\n console.log(chalk.bold('Available Models:'));\n console.log(chalk.dim('\u2500'.repeat(process.stdout.columns || 80)));\n\n models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded = model.loaded ? chalk.green(' [LOADED]') : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name} ${chalk.dim(`(${size})`)}${loaded}`\n );\n });\n console.log();\n\n const lastUsedModel = configService.getLastUsedModel();\n const modelSearch = options.model;\n const selectedModel = modelSearch\n ? models.find((m) => m.id === modelSearch || m.name.includes(modelSearch))\n : await selectModel(models, lastUsedModel);\n\n if (!selectedModel) {\n exitWithError('No model selected');\n }\n\n await lmStudioService.loadModel(selectedModel.id, spinner);\n\n const modelIdentifier = selectedModel.id.replace('/', '--');\n\n success(chalk.bold(`\\nModel ready: ${selectedModel.name}`));\n console.log();\n console.log(`Run Claude Code with this model:`);\n console.log(` ${chalk.cyan('claude --model lmstudio/' + modelIdentifier)}`);\n console.log();\n console.log(`Or use ${chalk.cyan('npx aix run')} to start an interactive session`);\n}\n", "import inquirer from 'inquirer';\nimport type { LMStudioModel } from '../types/index.js';\n\nexport async function selectModel(\n models: LMStudioModel[],\n defaultModel?: string\n): Promise<LMStudioModel> {\n const choices = models.map((model) => ({\n name: `${model.name} (${model.id})`,\n value: model,\n short: model.name,\n }));\n\n const defaultIndex = defaultModel ? choices.findIndex((m) => m.value.id === defaultModel) : 0;\n\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Select a model to load:',\n choices,\n default: Math.max(0, defaultIndex),\n pageSize: Math.min(models.length, 15),\n },\n ]);\n\n return answers['model'] as LMStudioModel;\n}\n\nexport async function confirmAction(\n message: string,\n defaultValue: boolean = true\n): Promise<boolean> {\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message,\n default: defaultValue,\n },\n ]);\n\n return answers['confirm'] as boolean;\n}\n\nexport async function enterPrompt(message: string, defaultValue?: string): Promise<string> {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'value',\n message,\n default: defaultValue,\n validate: (input: string) => input.trim().length > 0 || 'Please enter a value',\n },\n ]);\n\n return answers['value'] as string;\n}\n", "import chalk from \"chalk\";\n\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\nexport function formatModelName(modelId: string): string {\n return modelId\n .replace(/^.*\\//, \"\")\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nexport function promptSeparator(): void {\n console.log(chalk.dim(\"\u2500\".repeat(process.stdout.columns || 80)));\n}\n\nexport function success(message: string): void {\n console.log(chalk.green(\"\u2713\") + \" \" + message);\n}\n\nexport function error(message: string): void {\n console.error(chalk.red(\"\u2717\") + \" \" + message);\n}\n\nexport function info(message: string): void {\n console.log(chalk.blue(\"\u2139\") + \" \" + message);\n}\n\nexport function warn(message: string): void {\n console.log(chalk.yellow(\"\u26A0\") + \" \" + message);\n}\n\nexport function exitWithError(message: string, code: number = 1): never {\n error(message);\n process.exit(code);\n}\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { claudeService } from '../services/claude.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { exitWithError, success } from '../utils/format.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n}\n\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n spinner.text = 'Fetching available models...';\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n spinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n spinner.stop();\n\n let selectedModelId: string;\n\n if (options.model) {\n const foundModel = models.find(\n (m) => m.id === options.model || m.name.toLowerCase().includes(options.model!.toLowerCase())\n );\n\n if (!foundModel) {\n exitWithError(\n `Model \"${options.model}\" not found. Available models: ${models.map((m) => m.name).join(', ')}`\n );\n }\n\n selectedModelId = foundModel.id;\n } else {\n const lastUsedModel = configService.getLastUsedModel();\n const selectedModel = await selectModel(models, lastUsedModel);\n selectedModelId = selectedModel.id;\n }\n\n const loadSpinner = ora({\n text: `Loading model: ${chalk.cyan(selectedModelId)}`,\n color: 'cyan',\n }).start();\n\n await lmStudioService.loadModel(selectedModelId, loadSpinner);\n\n const modelIdentifier = selectedModelId.replace('/', '--');\n const fullModelName = `lmstudio/${modelIdentifier}`;\n\n success(chalk.green(`\\nStarting Claude Code with model: ${fullModelName}\\n`));\n\n try {\n await claudeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n } catch (error) {\n exitWithError(\n `Failed to run Claude Code: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n", "import chalk from \"chalk\";\nimport { lmStudioService } from \"../services/lmstudio.js\";\nimport { formatBytes } from \"../utils/format.js\";\n\nexport async function statusCommand(): Promise<void> {\n const status = await lmStudioService.getStatus();\n\n console.log();\n console.log(chalk.bold(\"LM Studio Status\"));\n console.log(chalk.dim(\"\u2500\".repeat(50)));\n console.log(\n ` ${status.running ? chalk.green(\"\u25CF\") : chalk.red(\"\u25CB\")} Server: ${status.running ? chalk.green(\"Running\") : chalk.red(\"Stopped\")}`,\n );\n console.log(` ${chalk.dim(\"\u25B8\")} Port: ${chalk.cyan(String(status.port))}`);\n console.log(\n ` ${chalk.dim(\"\u25B8\")} URL: ${chalk.cyan(`http://localhost:${status.port}`)}`,\n );\n\n if (status.activeModel) {\n console.log(\n ` ${chalk.dim(\"\u25B8\")} Active Model: ${chalk.green(status.activeModel)}`,\n );\n } else {\n console.log(` ${chalk.dim(\"\u25B8\")} Active Model: ${chalk.dim(\"None\")}`);\n }\n\n console.log();\n console.log(chalk.bold(\"Models\"));\n console.log(chalk.dim(\"\u2500\".repeat(50)));\n\n if (status.models.length === 0) {\n console.log(` ${chalk.dim(\"No models available\")}`);\n } else {\n status.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded =\n model.id === status.activeModel ? ` ${chalk.green(\"[LOADED]\")}` : \"\";\n console.log(\n ` ${chalk.dim(String(index + 1) + \".\")} ${model.name}${loaded}`,\n );\n console.log(` ${chalk.dim(\"ID:\")} ${model.id}`);\n console.log(` ${chalk.dim(\"Size:\")} ${size}`);\n if (model.quantization) {\n console.log(` ${chalk.dim(\"Quantization:\")} ${model.quantization}`);\n }\n console.log();\n });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["config_exports", "__export", "ConfigService", "configService", "Conf", "init_config", "__esmMin", "key", "value", "model", "host", "port", "lmstudio_exports", "__export", "LMStudioService", "lmStudioService", "execa", "ora", "chalk", "LMSTUDIO_PORTS", "init_lmstudio", "__esmMin", "init_config", "configService", "path", "response", "error", "data", "modelId", "spinner", "loadSpinner", "startSpinner", "isMac", "isLinux", "isWindows", "lmStudioPath", "possiblePaths", "localAppData", "programFiles", "timeout", "startTime", "ms", "resolve", "port", "claude_exports", "__export", "ClaudeService", "claudeService", "execa", "chalk", "init_claude", "__esmMin", "options", "model", "args", "verbose", "provider", "modelName", "modelArg", "claudeArgs", "error", "exitCode", "parts", "Command", "chalk", "init_lmstudio", "init_config", "ora", "chalk", "inquirer", "selectModel", "models", "defaultModel", "choices", "model", "defaultIndex", "m", "confirmAction", "message", "defaultValue", "chalk", "formatBytes", "bytes", "k", "sizes", "i", "success", "message", "chalk", "error", "exitWithError", "message", "code", "error", "initCommand", "options", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "chalk", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "configService", "modelSearch", "selectedModel", "m", "selectModel", "modelIdentifier", "success", "init_lmstudio", "init_claude", "init_config", "ora", "chalk", "runCommand", "options", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "models", "selectedModelId", "foundModel", "m", "lastUsedModel", "configService", "selectModel", "loadSpinner", "chalk", "fullModelName", "success", "claudeService", "error", "init_lmstudio", "chalk", "statusCommand", "status", "lmStudioService", "chalk", "model", "index", "size", "formatBytes", "loaded", "program", "Command", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "claudeService", "configService", "chalk", "lmStudioRunning", "claudeInstalled"]
4
+ "sourcesContent": ["import Conf from 'conf';\nimport type { Config } from '../types/index.js';\n\nexport class ConfigService {\n private store: Conf<Config>;\n\n constructor() {\n this.store = new Conf<Config>({\n projectName: 'aix',\n defaults: {\n lmStudioUrl: 'http://localhost',\n lmStudioPort: 1234,\n defaultTimeout: 30000,\n autoStartServer: false,\n },\n clearInvalidConfig: true,\n });\n }\n\n get<K extends keyof Config>(key: K): Config[K] {\n return this.store.get(key) as Config[K];\n }\n\n set<K extends keyof Config>(key: K, value: Config[K]): void {\n this.store.set(key, value as Config[K]);\n }\n\n setModel(model: string): void {\n this.store.set('model', model);\n }\n\n getLastUsedModel(): string | undefined {\n return this.store.get('model');\n }\n\n getLMStudioUrl(): string {\n const host = this.store.get('lmStudioUrl');\n const port = this.store.get('lmStudioPort');\n return `${host}:${port}`;\n }\n\n reset(): void {\n this.store.clear();\n }\n}\n\nexport const configService = new ConfigService();\n", "import { execa } from 'execa';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\nimport { configService } from './config.js';\nimport type { LMStudioStatus, LMStudioModel } from '../types/index.js';\n\nconst LMSTUDIO_PORTS = [1234, 1235, 1236, 1237];\n\nexport class LMStudioService {\n private baseUrl: string;\n\n constructor() {\n this.baseUrl = configService.getLMStudioUrl();\n }\n\n private getApiUrl(path: string): string {\n return `${this.baseUrl}${path}`;\n }\n\n async checkStatus(): Promise<boolean> {\n try {\n const response = await fetch(this.getApiUrl('/api/status'), {\n method: 'GET',\n signal: AbortSignal.timeout(3000),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async getAvailableModels(): Promise<LMStudioModel[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/models'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch models: ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n models: Array<{ id: string; name: string; size: number; quantization?: string }>;\n };\n return data.models ?? [];\n } catch (error) {\n throw new Error(\n `Unable to fetch models from LM Studio: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n async getStatus(): Promise<LMStudioStatus> {\n const running = await this.checkStatus();\n\n if (!running) {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n\n try {\n const response = await fetch(this.getApiUrl('/api/status'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n\n const data = (await response.json()) as {\n models: LMStudioModel[];\n active_model?: string;\n };\n\n return {\n running: true,\n port: configService.get('lmStudioPort'),\n models: data.models ?? [],\n activeModel: data.active_model,\n };\n } catch {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n }\n\n async loadModel(modelId: string, spinner?: Ora): Promise<{ loadSpinner: Ora }> {\n const loadSpinner =\n spinner ??\n ora({\n text: `Loading model: ${chalk.cyan(modelId)}`,\n color: 'cyan',\n }).start();\n\n try {\n const response = await fetch(this.getApiUrl('/api/model/load'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ model: modelId }),\n signal: AbortSignal.timeout(300000),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to load model: ${response.statusText}`);\n }\n\n loadSpinner.succeed(`Model ${chalk.green(modelId)} loaded successfully`);\n configService.setModel(modelId);\n\n return { loadSpinner };\n } catch (error) {\n loadSpinner.fail(\n `Failed to load model: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n throw error;\n }\n }\n\n async startServer(spinner?: Ora): Promise<void> {\n const startSpinner =\n spinner ??\n ora({\n text: 'Starting LM Studio server...',\n color: 'cyan',\n }).start();\n\n try {\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n const isWindows = process.platform === 'win32';\n\n let lmStudioPath: string | undefined;\n\n if (isMac) {\n const possiblePaths = [\n '/Applications/LM Studio.app',\n `${process.env.HOME}/Applications/LM Studio.app`,\n ];\n for (const p of possiblePaths) {\n try {\n const { existsSync } = await import('fs');\n if (existsSync(p)) {\n lmStudioPath = `open \"${p}\" --args --server`;\n break;\n }\n } catch {\n // continue\n }\n }\n // Use open command for macOS apps\n if (lmStudioPath?.startsWith('open')) {\n await execa(\n 'open',\n [\n possiblePaths.find((p) => {\n try {\n const { existsSync } = require('fs');\n return existsSync(p);\n } catch {\n return false;\n }\n }) || '/Applications/LM Studio.app',\n '--args',\n '--server',\n ],\n {\n detached: true,\n stdio: 'ignore',\n }\n );\n startSpinner.succeed('LM Studio server started');\n await this.waitForServer(60000);\n return;\n }\n } else if (isLinux) {\n lmStudioPath = await this.findLinuxBinary();\n } else if (isWindows) {\n lmStudioPath = await this.findWindowsExecutable();\n }\n\n if (!lmStudioPath) {\n startSpinner.fail('LM Studio not found. Please install it from https://lmstudio.ai');\n throw new Error('LM Studio not installed');\n }\n\n await execa(lmStudioPath, ['--server'], {\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n LM_STUDIO_SERVER_PORT: String(configService.get('lmStudioPort')),\n },\n });\n\n startSpinner.succeed('LM Studio server started');\n\n await this.waitForServer(60000);\n } catch (error) {\n startSpinner.fail(\n `Failed to start LM Studio: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n throw error;\n }\n }\n\n private async findLinuxBinary(): Promise<string | undefined> {\n const possiblePaths = [\n '/usr/bin/lm-studio',\n '/usr/local/bin/lm-studio',\n `${process.env.HOME}/.local/bin/lm-studio`,\n ];\n\n for (const path of possiblePaths) {\n try {\n await execa('test', ['-x', path]);\n return path;\n } catch {\n continue;\n }\n }\n\n return undefined;\n }\n\n private async findWindowsExecutable(): Promise<string | undefined> {\n const localAppData = process.env.LOCALAPPDATA;\n const programFiles = process.env.PROGRAMFILES;\n\n const possiblePaths = [\n localAppData ? `${localAppData}\\\\Programs\\\\LM Studio\\\\lm-studio.exe` : '',\n programFiles ? `${programFiles}\\\\LM Studio\\\\lm-studio.exe` : '',\n ].filter(Boolean);\n\n for (const path of possiblePaths) {\n try {\n await execa('cmd', ['/c', 'if exist', `\"${path}\"`, 'echo', 'yes']);\n return path;\n } catch {\n continue;\n }\n }\n\n return undefined;\n }\n\n async waitForServer(timeout: number = 60000): Promise<boolean> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n if (await this.checkStatus()) {\n return true;\n }\n await this.sleep(2000);\n }\n\n return false;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async findAvailablePort(): Promise<number> {\n for (const port of LMSTUDIO_PORTS) {\n try {\n const response = await fetch(`http://localhost:${port}/api/status`, {\n method: 'GET',\n signal: AbortSignal.timeout(1000),\n });\n if (response.ok) {\n return port;\n }\n } catch {\n configService.set('lmStudioPort', port);\n return port;\n }\n }\n\n return LMSTUDIO_PORTS[0] ?? 1234;\n }\n}\n\nexport const lmStudioService = new LMStudioService();\n", "import { execa } from 'execa';\nimport chalk from 'chalk';\n\nexport interface ClaudeOptions {\n model: string;\n args?: string[];\n verbose?: boolean;\n}\n\nexport class ClaudeService {\n async isClaudeCodeInstalled(): Promise<boolean> {\n try {\n await execa('claude', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async run(options: ClaudeOptions): Promise<void> {\n const { model, args = [], verbose = false } = options;\n\n const provider = this.extractProvider(model);\n const modelName = this.extractModelName(model);\n\n if (!provider || !modelName) {\n throw new Error(`Invalid model format: ${model}. Expected format: provider/model-name`);\n }\n\n const modelArg = `${provider}/${modelName}`;\n const claudeArgs = ['--model', modelArg, ...args];\n\n if (verbose) {\n console.log(chalk.dim(`\\nRunning: claude ${claudeArgs.join(' ')}\\n`));\n }\n\n try {\n await execa('claude', claudeArgs, {\n stdio: 'inherit',\n env: {\n ...process.env,\n ANTHROPIC_MODEL: modelArg,\n },\n });\n } catch (error) {\n if (error instanceof Error && 'exitCode' in error) {\n const exitCode = (error as unknown as { exitCode: number }).exitCode;\n process.exit(exitCode ?? 1);\n }\n throw error;\n }\n }\n\n private extractProvider(model: string): string | undefined {\n const parts = model.split('/');\n return parts[0];\n }\n\n private extractModelName(model: string): string | undefined {\n const parts = model.split('/');\n if (parts.length < 2) return undefined;\n return parts.slice(1).join('/');\n }\n\n async getVersion(): Promise<string | undefined> {\n try {\n const result = await execa('claude', ['--version']);\n return result.stdout;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const claudeService = new ClaudeService();\n", "#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { initCommand, runCommand, statusCommand } from './commands/index.js';\n\nconst program = new Command();\n\nprogram\n .name('aix')\n .description('AI CLI tool integrating LM Studio with Claude Code')\n .version('1.0.0');\n\nprogram\n .command('init')\n .description('Initialize and load a model into LM Studio')\n .option('-m, --model <name>', 'Model name or ID to load')\n .action(initCommand);\n\nprogram\n .command('run')\n .description('Run Claude Code with a model from LM Studio')\n .option('-m, --model <name>', 'Model name or ID to use')\n .option('-v, --verbose', 'Show verbose output')\n .argument('[args...]', 'Additional arguments for Claude Code')\n .action(async (args: string[], options: Record<string, unknown>) => {\n await runCommand({\n ...options,\n args,\n });\n });\n\nprogram\n .command('status')\n .description('Show LM Studio status and available models')\n .action(statusCommand);\n\nprogram\n .command('doctor')\n .description('Check system requirements and configuration')\n .action(async () => {\n const { lmStudioService } = await import('./services/lmstudio.js');\n const { claudeService } = await import('./services/claude.js');\n const { configService } = await import('./services/config.js');\n\n console.log();\n console.log(chalk.bold('System Check'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n\n const lmStudioRunning = await lmStudioService.checkStatus();\n console.log(\n ` ${lmStudioRunning ? chalk.green('\u2713') : chalk.yellow('\u26A0')} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')}`\n );\n\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n console.log(\n ` ${claudeInstalled ? chalk.green('\u2713') : chalk.red('\u2717')} Claude Code: ${claudeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n\n console.log();\n console.log(chalk.bold('Configuration'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(` ${chalk.dim('\u25B8')} LM Studio URL: ${chalk.cyan(configService.getLMStudioUrl())}`);\n\n if (!claudeInstalled) {\n console.log();\n console.log(chalk.yellow('\u26A0 Claude Code is not installed.'));\n console.log(` Install it with: ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n }\n\n if (!lmStudioRunning) {\n console.log();\n console.log(chalk.yellow('\u26A0 LM Studio is not running.'));\n console.log(\n ` Start the server from the LM Studio app or download from ${chalk.cyan('https://lmstudio.ai')}`\n );\n }\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { formatBytes, success, exitWithError } from '../utils/format.js';\nimport type { InitOptions } from '../types/index.js';\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n console.log();\n console.log(chalk.bold('Available Models:'));\n console.log(chalk.dim('\u2500'.repeat(process.stdout.columns || 80)));\n\n models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded = model.loaded ? chalk.green(' [LOADED]') : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name} ${chalk.dim(`(${size})`)}${loaded}`\n );\n });\n console.log();\n\n const lastUsedModel = configService.getLastUsedModel();\n const modelSearch = options.model;\n const selectedModel = modelSearch\n ? models.find((m) => m.id === modelSearch || m.name.includes(modelSearch))\n : await selectModel(models, lastUsedModel);\n\n if (!selectedModel) {\n exitWithError('No model selected');\n }\n\n await lmStudioService.loadModel(selectedModel.id, spinner);\n\n const modelIdentifier = selectedModel.id.replace('/', '--');\n\n success(chalk.bold(`\\nModel ready: ${selectedModel.name}`));\n console.log();\n console.log(`Run Claude Code with this model:`);\n console.log(` ${chalk.cyan('claude --model lmstudio/' + modelIdentifier)}`);\n console.log();\n console.log(`Or use ${chalk.cyan('npx aix run')} to start an interactive session`);\n}\n", "import inquirer from 'inquirer';\nimport type { LMStudioModel } from '../types/index.js';\n\nexport async function selectModel(\n models: LMStudioModel[],\n defaultModel?: string\n): Promise<LMStudioModel> {\n const choices = models.map((model) => ({\n name: `${model.name} (${model.id})`,\n value: model,\n short: model.name,\n }));\n\n const defaultIndex = defaultModel ? choices.findIndex((m) => m.value.id === defaultModel) : 0;\n\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Select a model to load:',\n choices,\n default: Math.max(0, defaultIndex),\n pageSize: Math.min(models.length, 15),\n },\n ]);\n\n return answers['model'] as LMStudioModel;\n}\n\nexport async function confirmAction(\n message: string,\n defaultValue: boolean = true\n): Promise<boolean> {\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message,\n default: defaultValue,\n },\n ]);\n\n return answers['confirm'] as boolean;\n}\n\nexport async function enterPrompt(message: string, defaultValue?: string): Promise<string> {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'value',\n message,\n default: defaultValue,\n validate: (input: string) => input.trim().length > 0 || 'Please enter a value',\n },\n ]);\n\n return answers['value'] as string;\n}\n", "import chalk from \"chalk\";\n\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\nexport function formatModelName(modelId: string): string {\n return modelId\n .replace(/^.*\\//, \"\")\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nexport function promptSeparator(): void {\n console.log(chalk.dim(\"\u2500\".repeat(process.stdout.columns || 80)));\n}\n\nexport function success(message: string): void {\n console.log(chalk.green(\"\u2713\") + \" \" + message);\n}\n\nexport function error(message: string): void {\n console.error(chalk.red(\"\u2717\") + \" \" + message);\n}\n\nexport function info(message: string): void {\n console.log(chalk.blue(\"\u2139\") + \" \" + message);\n}\n\nexport function warn(message: string): void {\n console.log(chalk.yellow(\"\u26A0\") + \" \" + message);\n}\n\nexport function exitWithError(message: string, code: number = 1): never {\n error(message);\n process.exit(code);\n}\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { claudeService } from '../services/claude.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { exitWithError, success } from '../utils/format.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n}\n\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n spinner.text = 'Fetching available models...';\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n spinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n spinner.stop();\n\n let selectedModelId: string;\n\n if (options.model) {\n const foundModel = models.find(\n (m) => m.id === options.model || m.name.toLowerCase().includes(options.model!.toLowerCase())\n );\n\n if (!foundModel) {\n exitWithError(\n `Model \"${options.model}\" not found. Available models: ${models.map((m) => m.name).join(', ')}`\n );\n }\n\n selectedModelId = foundModel.id;\n } else {\n const lastUsedModel = configService.getLastUsedModel();\n const selectedModel = await selectModel(models, lastUsedModel);\n selectedModelId = selectedModel.id;\n }\n\n const loadSpinner = ora({\n text: `Loading model: ${chalk.cyan(selectedModelId)}`,\n color: 'cyan',\n }).start();\n\n await lmStudioService.loadModel(selectedModelId, loadSpinner);\n\n const modelIdentifier = selectedModelId.replace('/', '--');\n const fullModelName = `lmstudio/${modelIdentifier}`;\n\n success(chalk.green(`\\nStarting Claude Code with model: ${fullModelName}\\n`));\n\n try {\n await claudeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n } catch (error) {\n exitWithError(\n `Failed to run Claude Code: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n", "import chalk from \"chalk\";\nimport { lmStudioService } from \"../services/lmstudio.js\";\nimport { formatBytes } from \"../utils/format.js\";\n\nexport async function statusCommand(): Promise<void> {\n const status = await lmStudioService.getStatus();\n\n console.log();\n console.log(chalk.bold(\"LM Studio Status\"));\n console.log(chalk.dim(\"\u2500\".repeat(50)));\n console.log(\n ` ${status.running ? chalk.green(\"\u25CF\") : chalk.red(\"\u25CB\")} Server: ${status.running ? chalk.green(\"Running\") : chalk.red(\"Stopped\")}`,\n );\n console.log(` ${chalk.dim(\"\u25B8\")} Port: ${chalk.cyan(String(status.port))}`);\n console.log(\n ` ${chalk.dim(\"\u25B8\")} URL: ${chalk.cyan(`http://localhost:${status.port}`)}`,\n );\n\n if (status.activeModel) {\n console.log(\n ` ${chalk.dim(\"\u25B8\")} Active Model: ${chalk.green(status.activeModel)}`,\n );\n } else {\n console.log(` ${chalk.dim(\"\u25B8\")} Active Model: ${chalk.dim(\"None\")}`);\n }\n\n console.log();\n console.log(chalk.bold(\"Models\"));\n console.log(chalk.dim(\"\u2500\".repeat(50)));\n\n if (status.models.length === 0) {\n console.log(` ${chalk.dim(\"No models available\")}`);\n } else {\n status.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded =\n model.id === status.activeModel ? ` ${chalk.green(\"[LOADED]\")}` : \"\";\n console.log(\n ` ${chalk.dim(String(index + 1) + \".\")} ${model.name}${loaded}`,\n );\n console.log(` ${chalk.dim(\"ID:\")} ${model.id}`);\n console.log(` ${chalk.dim(\"Size:\")} ${size}`);\n if (model.quantization) {\n console.log(` ${chalk.dim(\"Quantization:\")} ${model.quantization}`);\n }\n console.log();\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["config_exports", "__export", "ConfigService", "configService", "Conf", "init_config", "__esmMin", "key", "value", "model", "host", "port", "lmstudio_exports", "__export", "LMStudioService", "lmStudioService", "execa", "ora", "chalk", "LMSTUDIO_PORTS", "init_lmstudio", "__esmMin", "init_config", "configService", "path", "response", "error", "data", "modelId", "spinner", "loadSpinner", "startSpinner", "isMac", "isLinux", "isWindows", "lmStudioPath", "possiblePaths", "p", "existsSync", "localAppData", "programFiles", "timeout", "startTime", "ms", "resolve", "port", "claude_exports", "__export", "ClaudeService", "claudeService", "execa", "chalk", "init_claude", "__esmMin", "options", "model", "args", "verbose", "provider", "modelName", "modelArg", "claudeArgs", "error", "exitCode", "parts", "Command", "chalk", "init_lmstudio", "init_config", "ora", "chalk", "inquirer", "selectModel", "models", "defaultModel", "choices", "model", "defaultIndex", "m", "confirmAction", "message", "defaultValue", "chalk", "formatBytes", "bytes", "k", "sizes", "i", "success", "message", "chalk", "error", "exitWithError", "message", "code", "error", "initCommand", "options", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "chalk", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "configService", "modelSearch", "selectedModel", "m", "selectModel", "modelIdentifier", "success", "init_lmstudio", "init_claude", "init_config", "ora", "chalk", "runCommand", "options", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "models", "selectedModelId", "foundModel", "m", "lastUsedModel", "configService", "selectModel", "loadSpinner", "chalk", "fullModelName", "success", "claudeService", "error", "init_lmstudio", "chalk", "statusCommand", "status", "lmStudioService", "chalk", "model", "index", "size", "formatBytes", "loaded", "program", "Command", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "claudeService", "configService", "chalk", "lmStudioRunning", "claudeInstalled"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lmstudio.d.ts","sourceRoot":"","sources":["../../src/services/lmstudio.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAGpC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvE,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;;IAMxB,OAAO,CAAC,SAAS;IAIX,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAY/B,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAsB9C,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IA6CpC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,GAAG,CAAA;KAAE,CAAC;IAkCxE,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAgDjC,eAAe;YAmBf,qBAAqB;IAqB7B,aAAa,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAa9D,OAAO,CAAC,KAAK;IAIP,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;CAkB3C;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
1
+ {"version":3,"file":"lmstudio.d.ts","sourceRoot":"","sources":["../../src/services/lmstudio.ts"],"names":[],"mappings":"AACA,OAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAGpC,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvE,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;;IAMxB,OAAO,CAAC,SAAS;IAIX,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAY/B,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAsB9C,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IA6CpC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,GAAG,CAAA;KAAE,CAAC;IAkCxE,WAAW,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAuFjC,eAAe;YAmBf,qBAAqB;IAqB7B,aAAa,CAAC,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAa9D,OAAO,CAAC,KAAK;IAIP,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;CAkB3C;AAED,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
- var J=Object.defineProperty;var P=(t,o)=>()=>(t&&(o=t(t=0)),o);var A=(t,o)=>{for(var e in o)J(t,e,{get:o[e],enumerable:!0})};var N={};A(N,{ConfigService:()=>w,configService:()=>d});import Q from"conf";var w,d,S=P(()=>{"use strict";w=class{store;constructor(){this.store=new Q({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,defaultTimeout:3e4,autoStartServer:!1},clearInvalidConfig:!0})}get(o){return this.store.get(o)}set(o,e){this.store.set(o,e)}setModel(o){this.store.set("model",o)}getLastUsedModel(){return this.store.get("model")}getLMStudioUrl(){let o=this.store.get("lmStudioUrl"),e=this.store.get("lmStudioPort");return`${o}:${e}`}reset(){this.store.clear()}},d=new w});var B={};A(B,{LMStudioService:()=>M,lmStudioService:()=>m});import{execa as k}from"execa";import D from"ora";import F from"chalk";var z,M,m,v=P(()=>{"use strict";S();z=[1234,1235,1236,1237],M=class{baseUrl;constructor(){this.baseUrl=d.getLMStudioUrl()}getApiUrl(o){return`${this.baseUrl}${o}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){try{let o=await fetch(this.getApiUrl("/api/models"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!o.ok)throw new Error(`Failed to fetch models: ${o.statusText}`);return(await o.json()).models??[]}catch(o){throw new Error(`Unable to fetch models from LM Studio: ${o instanceof Error?o.message:"Unknown error"}`)}}async getStatus(){if(!await this.checkStatus())return{running:!1,port:d.get("lmStudioPort"),models:[]};try{let e=await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!e.ok)return{running:!1,port:d.get("lmStudioPort"),models:[]};let n=await e.json();return{running:!0,port:d.get("lmStudioPort"),models:n.models??[],activeModel:n.active_model}}catch{return{running:!1,port:d.get("lmStudioPort"),models:[]}}}async loadModel(o,e){let n=e??D({text:`Loading model: ${F.cyan(o)}`,color:"cyan"}).start();try{let r=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:o}),signal:AbortSignal.timeout(3e5)});if(!r.ok)throw new Error(`Failed to load model: ${r.statusText}`);return n.succeed(`Model ${F.green(o)} loaded successfully`),d.setModel(o),{loadSpinner:n}}catch(r){throw n.fail(`Failed to load model: ${r instanceof Error?r.message:"Unknown error"}`),r}}async startServer(o){let e=o??D({text:"Starting LM Studio server...",color:"cyan"}).start();try{let n=process.platform==="darwin",r=process.platform==="linux",l=process.platform==="win32",c;if(n?c="/Applications/LM Studio.app/Contents/MacOS/lm-studio":r?c=await this.findLinuxBinary():l&&(c=await this.findWindowsExecutable()),!c)throw e.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await k(c,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(d.get("lmStudioPort"))}}),e.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(n){throw e.fail(`Failed to start LM Studio: ${n instanceof Error?n.message:"Unknown error"}`),n}}async findLinuxBinary(){let o=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let e of o)try{return await k("test",["-x",e]),e}catch{continue}}async findWindowsExecutable(){let o=process.env.LOCALAPPDATA,e=process.env.PROGRAMFILES,n=[o?`${o}\\Programs\\LM Studio\\lm-studio.exe`:"",e?`${e}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let r of n)try{return await k("cmd",["/c","if exist",`"${r}"`,"echo","yes"]),r}catch{continue}}async waitForServer(o=6e4){let e=Date.now();for(;Date.now()-e<o;){if(await this.checkStatus())return!0;await this.sleep(2e3)}return!1}sleep(o){return new Promise(e=>setTimeout(e,o))}async findAvailablePort(){for(let o of z)try{if((await fetch(`http://localhost:${o}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return o}catch{return d.set("lmStudioPort",o),o}return z[0]??1234}},m=new M});var _={};A(_,{ClaudeService:()=>L,claudeService:()=>O});import{execa as U}from"execa";import Y from"chalk";var L,O,I=P(()=>{"use strict";L=class{async isClaudeCodeInstalled(){try{return await U("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(o){let{model:e,args:n=[],verbose:r=!1}=o,l=this.extractProvider(e),c=this.extractModelName(e);if(!l||!c)throw new Error(`Invalid model format: ${e}. Expected format: provider/model-name`);let g=`${l}/${c}`,u=["--model",g,...n];r&&console.log(Y.dim(`
3
- Running: claude ${u.join(" ")}
4
- `));try{await U("claude",u,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:g}})}catch(s){if(s instanceof Error&&"exitCode"in s){let C=s.exitCode;process.exit(C??1)}throw s}}extractProvider(o){return o.split("/")[0]}extractModelName(o){let e=o.split("/");if(!(e.length<2))return e.slice(1).join("/")}async getVersion(){try{return(await U("claude",["--version"])).stdout}catch{return}}},O=new L});import{Command as Z}from"commander";import a from"chalk";v();S();import W from"ora";import f from"chalk";import j from"inquirer";async function y(t,o){let e=t.map(l=>({name:`${l.name} (${l.id})`,value:l,short:l.name})),n=o?e.findIndex(l=>l.value.id===o):0;return(await j.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:e,default:Math.max(0,n),pageSize:Math.min(t.length,15)}])).model}async function x(t,o=!0){return(await j.prompt([{type:"confirm",name:"confirm",message:t,default:o}])).confirm}import K from"chalk";function $(t){if(t===0)return"0 B";let o=1024,e=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(t)/Math.log(o));return`${parseFloat((t/Math.pow(o,n)).toFixed(2))} ${e[n]}`}function b(t){console.log(K.green("\u2713")+" "+t)}function X(t){console.error(K.red("\u2717")+" "+t)}function p(t,o=1){X(t),process.exit(o)}async function E(t={}){let o=W({text:"Checking LM Studio status...",color:"cyan"}).start(),e=await m.checkStatus();e||(o.info("LM Studio server not running"),o.stop(),await x("Would you like to start the LM Studio server?")||p("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await m.startServer(),e=!0),o.succeed("Connected to LM Studio");let n=W({text:"Fetching available models...",color:"cyan"}).start(),r=await m.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),p("No models available")),n.succeed(`Found ${f.bold(r.length)} model${r.length===1?"":"s"}`),console.log(),console.log(f.bold("Available Models:")),console.log(f.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((s,C)=>{let H=$(s.size),V=s.loaded?f.green(" [LOADED]"):"";console.log(` ${f.dim(String(C+1).padStart(2))}. ${s.name} ${f.dim(`(${H})`)}${V}`)}),console.log();let l=d.getLastUsedModel(),c=t.model,g=c?r.find(s=>s.id===c||s.name.includes(c)):await y(r,l);g||p("No model selected"),await m.loadModel(g.id,o);let u=g.id.replace("/","--");b(f.bold(`
5
- Model ready: ${g.name}`)),console.log(),console.log("Run Claude Code with this model:"),console.log(` ${f.cyan("claude --model lmstudio/"+u)}`),console.log(),console.log(`Or use ${f.cyan("npx aix run")} to start an interactive session`)}v();I();S();import G from"ora";import q from"chalk";async function R(t={}){let o=G({text:"Checking LM Studio status...",color:"cyan"}).start(),e=await m.checkStatus();e||(o.info("LM Studio server not running"),o.stop(),await x("Would you like to start the LM Studio server?")||p("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await m.startServer(),e=!0),o.succeed("Connected to LM Studio"),o.text="Fetching available models...";let n=await m.getAvailableModels();n.length===0&&(o.fail("No models found. Download some models in LM Studio first."),p("No models available")),o.stop();let r;if(t.model){let u=n.find(s=>s.id===t.model||s.name.toLowerCase().includes(t.model.toLowerCase()));u||p(`Model "${t.model}" not found. Available models: ${n.map(s=>s.name).join(", ")}`),r=u.id}else{let u=d.getLastUsedModel();r=(await y(n,u)).id}let l=G({text:`Loading model: ${q.cyan(r)}`,color:"cyan"}).start();await m.loadModel(r,l);let g=`lmstudio/${r.replace("/","--")}`;b(q.green(`
6
- Starting Claude Code with model: ${g}
7
- `));try{await O.run({model:g,args:t.args??[],verbose:t.verbose})}catch(u){p(`Failed to run Claude Code: ${u instanceof Error?u.message:"Unknown error"}`)}}v();import i from"chalk";async function T(){let t=await m.getStatus();console.log(),console.log(i.bold("LM Studio Status")),console.log(i.dim("\u2500".repeat(50))),console.log(` ${t.running?i.green("\u25CF"):i.red("\u25CB")} Server: ${t.running?i.green("Running"):i.red("Stopped")}`),console.log(` ${i.dim("\u25B8")} Port: ${i.cyan(String(t.port))}`),console.log(` ${i.dim("\u25B8")} URL: ${i.cyan(`http://localhost:${t.port}`)}`),t.activeModel?console.log(` ${i.dim("\u25B8")} Active Model: ${i.green(t.activeModel)}`):console.log(` ${i.dim("\u25B8")} Active Model: ${i.dim("None")}`),console.log(),console.log(i.bold("Models")),console.log(i.dim("\u2500".repeat(50))),t.models.length===0?console.log(` ${i.dim("No models available")}`):t.models.forEach((o,e)=>{let n=$(o.size),r=o.id===t.activeModel?` ${i.green("[LOADED]")}`:"";console.log(` ${i.dim(String(e+1)+".")} ${o.name}${r}`),console.log(` ${i.dim("ID:")} ${o.id}`),console.log(` ${i.dim("Size:")} ${n}`),o.quantization&&console.log(` ${i.dim("Quantization:")} ${o.quantization}`),console.log()})}var h=new Z;h.name("aix").description("AI CLI tool integrating LM Studio with Claude Code").version("1.0.0");h.command("init").description("Initialize and load a model into LM Studio").option("-m, --model <name>","Model name or ID to load").action(E);h.command("run").description("Run Claude Code with a model from LM Studio").option("-m, --model <name>","Model name or ID to use").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for Claude Code").action(async(t,o)=>{await R({...o,args:t})});h.command("status").description("Show LM Studio status and available models").action(T);h.command("doctor").description("Check system requirements and configuration").action(async()=>{let{lmStudioService:t}=await Promise.resolve().then(()=>(v(),B)),{claudeService:o}=await Promise.resolve().then(()=>(I(),_)),{configService:e}=await Promise.resolve().then(()=>(S(),N));console.log(),console.log(a.bold("System Check")),console.log(a.dim("\u2500".repeat(50)));let n=await t.checkStatus();console.log(` ${n?a.green("\u2713"):a.yellow("\u26A0")} LM Studio: ${n?a.green("Running"):a.yellow("Not running")}`);let r=await o.isClaudeCodeInstalled();console.log(` ${r?a.green("\u2713"):a.red("\u2717")} Claude Code: ${r?a.green("Installed"):a.red("Not installed")}`),console.log(),console.log(a.bold("Configuration")),console.log(a.dim("\u2500".repeat(50))),console.log(` ${a.dim("\u25B8")} LM Studio URL: ${a.cyan(e.getLMStudioUrl())}`),r||(console.log(),console.log(a.yellow("\u26A0 Claude Code is not installed.")),console.log(` Install it with: ${a.cyan("npm install -g @anthropic-ai/claude-code")}`)),n||(console.log(),console.log(a.yellow("\u26A0 LM Studio is not running.")),console.log(` Start the server from the LM Studio app or download from ${a.cyan("https://lmstudio.ai")}`))});h.parse();
2
+ var J=Object.defineProperty;var Q=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(o,e)=>(typeof require<"u"?require:o)[e]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var A=(t,o)=>()=>(t&&(o=t(t=0)),o);var k=(t,o)=>{for(var e in o)J(t,e,{get:o[e],enumerable:!0})};var N={};k(N,{ConfigService:()=>w,configService:()=>u});import X from"conf";var w,u,S=A(()=>{"use strict";w=class{store;constructor(){this.store=new X({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,defaultTimeout:3e4,autoStartServer:!1},clearInvalidConfig:!0})}get(o){return this.store.get(o)}set(o,e){this.store.set(o,e)}setModel(o){this.store.set("model",o)}getLastUsedModel(){return this.store.get("model")}getLMStudioUrl(){let o=this.store.get("lmStudioUrl"),e=this.store.get("lmStudioPort");return`${o}:${e}`}reset(){this.store.clear()}},u=new w});var B={};k(B,{LMStudioService:()=>y,lmStudioService:()=>g});import{execa as M}from"execa";import D from"ora";import F from"chalk";var z,y,g,v=A(()=>{"use strict";S();z=[1234,1235,1236,1237],y=class{baseUrl;constructor(){this.baseUrl=u.getLMStudioUrl()}getApiUrl(o){return`${this.baseUrl}${o}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){try{let o=await fetch(this.getApiUrl("/api/models"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!o.ok)throw new Error(`Failed to fetch models: ${o.statusText}`);return(await o.json()).models??[]}catch(o){throw new Error(`Unable to fetch models from LM Studio: ${o instanceof Error?o.message:"Unknown error"}`)}}async getStatus(){if(!await this.checkStatus())return{running:!1,port:u.get("lmStudioPort"),models:[]};try{let e=await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!e.ok)return{running:!1,port:u.get("lmStudioPort"),models:[]};let n=await e.json();return{running:!0,port:u.get("lmStudioPort"),models:n.models??[],activeModel:n.active_model}}catch{return{running:!1,port:u.get("lmStudioPort"),models:[]}}}async loadModel(o,e){let n=e??D({text:`Loading model: ${F.cyan(o)}`,color:"cyan"}).start();try{let r=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:o}),signal:AbortSignal.timeout(3e5)});if(!r.ok)throw new Error(`Failed to load model: ${r.statusText}`);return n.succeed(`Model ${F.green(o)} loaded successfully`),u.setModel(o),{loadSpinner:n}}catch(r){throw n.fail(`Failed to load model: ${r instanceof Error?r.message:"Unknown error"}`),r}}async startServer(o){let e=o??D({text:"Starting LM Studio server...",color:"cyan"}).start();try{let n=process.platform==="darwin",r=process.platform==="linux",d=process.platform==="win32",c;if(n){let m=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let a of m)try{let{existsSync:i}=await import("fs");if(i(a)){c=`open "${a}" --args --server`;break}}catch{}if(c?.startsWith("open")){await M("open",[m.find(a=>{try{let{existsSync:i}=Q("fs");return i(a)}catch{return!1}})||"/Applications/LM Studio.app","--args","--server"],{detached:!0,stdio:"ignore"}),e.succeed("LM Studio server started"),await this.waitForServer(6e4);return}}else r?c=await this.findLinuxBinary():d&&(c=await this.findWindowsExecutable());if(!c)throw e.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await M(c,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(u.get("lmStudioPort"))}}),e.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(n){throw e.fail(`Failed to start LM Studio: ${n instanceof Error?n.message:"Unknown error"}`),n}}async findLinuxBinary(){let o=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let e of o)try{return await M("test",["-x",e]),e}catch{continue}}async findWindowsExecutable(){let o=process.env.LOCALAPPDATA,e=process.env.PROGRAMFILES,n=[o?`${o}\\Programs\\LM Studio\\lm-studio.exe`:"",e?`${e}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let r of n)try{return await M("cmd",["/c","if exist",`"${r}"`,"echo","yes"]),r}catch{continue}}async waitForServer(o=6e4){let e=Date.now();for(;Date.now()-e<o;){if(await this.checkStatus())return!0;await this.sleep(2e3)}return!1}sleep(o){return new Promise(e=>setTimeout(e,o))}async findAvailablePort(){for(let o of z)try{if((await fetch(`http://localhost:${o}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return o}catch{return u.set("lmStudioPort",o),o}return z[0]??1234}},g=new y});var _={};k(_,{ClaudeService:()=>C,claudeService:()=>O});import{execa as U}from"execa";import Z from"chalk";var C,O,I=A(()=>{"use strict";C=class{async isClaudeCodeInstalled(){try{return await U("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(o){let{model:e,args:n=[],verbose:r=!1}=o,d=this.extractProvider(e),c=this.extractModelName(e);if(!d||!c)throw new Error(`Invalid model format: ${e}. Expected format: provider/model-name`);let m=`${d}/${c}`,a=["--model",m,...n];r&&console.log(Z.dim(`
3
+ Running: claude ${a.join(" ")}
4
+ `));try{await U("claude",a,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:m}})}catch(i){if(i instanceof Error&&"exitCode"in i){let P=i.exitCode;process.exit(P??1)}throw i}}extractProvider(o){return o.split("/")[0]}extractModelName(o){let e=o.split("/");if(!(e.length<2))return e.slice(1).join("/")}async getVersion(){try{return(await U("claude",["--version"])).stdout}catch{return}}},O=new C});import{Command as oo}from"commander";import l from"chalk";v();S();import W from"ora";import f from"chalk";import j from"inquirer";async function x(t,o){let e=t.map(d=>({name:`${d.name} (${d.id})`,value:d,short:d.name})),n=o?e.findIndex(d=>d.value.id===o):0;return(await j.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:e,default:Math.max(0,n),pageSize:Math.min(t.length,15)}])).model}async function $(t,o=!0){return(await j.prompt([{type:"confirm",name:"confirm",message:t,default:o}])).confirm}import K from"chalk";function b(t){if(t===0)return"0 B";let o=1024,e=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(t)/Math.log(o));return`${parseFloat((t/Math.pow(o,n)).toFixed(2))} ${e[n]}`}function L(t){console.log(K.green("\u2713")+" "+t)}function Y(t){console.error(K.red("\u2717")+" "+t)}function p(t,o=1){Y(t),process.exit(o)}async function E(t={}){let o=W({text:"Checking LM Studio status...",color:"cyan"}).start(),e=await g.checkStatus();e||(o.info("LM Studio server not running"),o.stop(),await $("Would you like to start the LM Studio server?")||p("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),e=!0),o.succeed("Connected to LM Studio");let n=W({text:"Fetching available models...",color:"cyan"}).start(),r=await g.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),p("No models available")),n.succeed(`Found ${f.bold(r.length)} model${r.length===1?"":"s"}`),console.log(),console.log(f.bold("Available Models:")),console.log(f.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((i,P)=>{let H=b(i.size),V=i.loaded?f.green(" [LOADED]"):"";console.log(` ${f.dim(String(P+1).padStart(2))}. ${i.name} ${f.dim(`(${H})`)}${V}`)}),console.log();let d=u.getLastUsedModel(),c=t.model,m=c?r.find(i=>i.id===c||i.name.includes(c)):await x(r,d);m||p("No model selected"),await g.loadModel(m.id,o);let a=m.id.replace("/","--");L(f.bold(`
5
+ Model ready: ${m.name}`)),console.log(),console.log("Run Claude Code with this model:"),console.log(` ${f.cyan("claude --model lmstudio/"+a)}`),console.log(),console.log(`Or use ${f.cyan("npx aix run")} to start an interactive session`)}v();I();S();import q from"ora";import G from"chalk";async function R(t={}){let o=q({text:"Checking LM Studio status...",color:"cyan"}).start(),e=await g.checkStatus();e||(o.info("LM Studio server not running"),o.stop(),await $("Would you like to start the LM Studio server?")||p("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),e=!0),o.succeed("Connected to LM Studio"),o.text="Fetching available models...";let n=await g.getAvailableModels();n.length===0&&(o.fail("No models found. Download some models in LM Studio first."),p("No models available")),o.stop();let r;if(t.model){let a=n.find(i=>i.id===t.model||i.name.toLowerCase().includes(t.model.toLowerCase()));a||p(`Model "${t.model}" not found. Available models: ${n.map(i=>i.name).join(", ")}`),r=a.id}else{let a=u.getLastUsedModel();r=(await x(n,a)).id}let d=q({text:`Loading model: ${G.cyan(r)}`,color:"cyan"}).start();await g.loadModel(r,d);let m=`lmstudio/${r.replace("/","--")}`;L(G.green(`
6
+ Starting Claude Code with model: ${m}
7
+ `));try{await O.run({model:m,args:t.args??[],verbose:t.verbose})}catch(a){p(`Failed to run Claude Code: ${a instanceof Error?a.message:"Unknown error"}`)}}v();import s from"chalk";async function T(){let t=await g.getStatus();console.log(),console.log(s.bold("LM Studio Status")),console.log(s.dim("\u2500".repeat(50))),console.log(` ${t.running?s.green("\u25CF"):s.red("\u25CB")} Server: ${t.running?s.green("Running"):s.red("Stopped")}`),console.log(` ${s.dim("\u25B8")} Port: ${s.cyan(String(t.port))}`),console.log(` ${s.dim("\u25B8")} URL: ${s.cyan(`http://localhost:${t.port}`)}`),t.activeModel?console.log(` ${s.dim("\u25B8")} Active Model: ${s.green(t.activeModel)}`):console.log(` ${s.dim("\u25B8")} Active Model: ${s.dim("None")}`),console.log(),console.log(s.bold("Models")),console.log(s.dim("\u2500".repeat(50))),t.models.length===0?console.log(` ${s.dim("No models available")}`):t.models.forEach((o,e)=>{let n=b(o.size),r=o.id===t.activeModel?` ${s.green("[LOADED]")}`:"";console.log(` ${s.dim(String(e+1)+".")} ${o.name}${r}`),console.log(` ${s.dim("ID:")} ${o.id}`),console.log(` ${s.dim("Size:")} ${n}`),o.quantization&&console.log(` ${s.dim("Quantization:")} ${o.quantization}`),console.log()})}var h=new oo;h.name("aix").description("AI CLI tool integrating LM Studio with Claude Code").version("1.0.0");h.command("init").description("Initialize and load a model into LM Studio").option("-m, --model <name>","Model name or ID to load").action(E);h.command("run").description("Run Claude Code with a model from LM Studio").option("-m, --model <name>","Model name or ID to use").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for Claude Code").action(async(t,o)=>{await R({...o,args:t})});h.command("status").description("Show LM Studio status and available models").action(T);h.command("doctor").description("Check system requirements and configuration").action(async()=>{let{lmStudioService:t}=await Promise.resolve().then(()=>(v(),B)),{claudeService:o}=await Promise.resolve().then(()=>(I(),_)),{configService:e}=await Promise.resolve().then(()=>(S(),N));console.log(),console.log(l.bold("System Check")),console.log(l.dim("\u2500".repeat(50)));let n=await t.checkStatus();console.log(` ${n?l.green("\u2713"):l.yellow("\u26A0")} LM Studio: ${n?l.green("Running"):l.yellow("Not running")}`);let r=await o.isClaudeCodeInstalled();console.log(` ${r?l.green("\u2713"):l.red("\u2717")} Claude Code: ${r?l.green("Installed"):l.red("Not installed")}`),console.log(),console.log(l.bold("Configuration")),console.log(l.dim("\u2500".repeat(50))),console.log(` ${l.dim("\u25B8")} LM Studio URL: ${l.cyan(e.getLMStudioUrl())}`),r||(console.log(),console.log(l.yellow("\u26A0 Claude Code is not installed.")),console.log(` Install it with: ${l.cyan("npm install -g @anthropic-ai/claude-code")}`)),n||(console.log(),console.log(l.yellow("\u26A0 LM Studio is not running.")),console.log(` Start the server from the LM Studio app or download from ${l.cyan("https://lmstudio.ai")}`))});h.parse();
8
8
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/services/config.ts", "../../src/services/lmstudio.ts", "../../src/services/claude.ts", "../../src/index.ts", "../../src/commands/init.ts", "../../src/utils/prompt.ts", "../../src/utils/format.ts", "../../src/commands/run.ts", "../../src/commands/status.ts"],
4
- "sourcesContent": ["import Conf from 'conf';\nimport type { Config } from '../types/index.js';\n\nexport class ConfigService {\n private store: Conf<Config>;\n\n constructor() {\n this.store = new Conf<Config>({\n projectName: 'aix',\n defaults: {\n lmStudioUrl: 'http://localhost',\n lmStudioPort: 1234,\n defaultTimeout: 30000,\n autoStartServer: false,\n },\n clearInvalidConfig: true,\n });\n }\n\n get<K extends keyof Config>(key: K): Config[K] {\n return this.store.get(key) as Config[K];\n }\n\n set<K extends keyof Config>(key: K, value: Config[K]): void {\n this.store.set(key, value as Config[K]);\n }\n\n setModel(model: string): void {\n this.store.set('model', model);\n }\n\n getLastUsedModel(): string | undefined {\n return this.store.get('model');\n }\n\n getLMStudioUrl(): string {\n const host = this.store.get('lmStudioUrl');\n const port = this.store.get('lmStudioPort');\n return `${host}:${port}`;\n }\n\n reset(): void {\n this.store.clear();\n }\n}\n\nexport const configService = new ConfigService();\n", "import { execa } from 'execa';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\nimport { configService } from './config.js';\nimport type { LMStudioStatus, LMStudioModel } from '../types/index.js';\n\nconst LMSTUDIO_PORTS = [1234, 1235, 1236, 1237];\n\nexport class LMStudioService {\n private baseUrl: string;\n\n constructor() {\n this.baseUrl = configService.getLMStudioUrl();\n }\n\n private getApiUrl(path: string): string {\n return `${this.baseUrl}${path}`;\n }\n\n async checkStatus(): Promise<boolean> {\n try {\n const response = await fetch(this.getApiUrl('/api/status'), {\n method: 'GET',\n signal: AbortSignal.timeout(3000),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async getAvailableModels(): Promise<LMStudioModel[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/models'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch models: ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n models: Array<{ id: string; name: string; size: number; quantization?: string }>;\n };\n return data.models ?? [];\n } catch (error) {\n throw new Error(\n `Unable to fetch models from LM Studio: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n async getStatus(): Promise<LMStudioStatus> {\n const running = await this.checkStatus();\n\n if (!running) {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n\n try {\n const response = await fetch(this.getApiUrl('/api/status'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n\n const data = (await response.json()) as {\n models: LMStudioModel[];\n active_model?: string;\n };\n\n return {\n running: true,\n port: configService.get('lmStudioPort'),\n models: data.models ?? [],\n activeModel: data.active_model,\n };\n } catch {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n }\n\n async loadModel(modelId: string, spinner?: Ora): Promise<{ loadSpinner: Ora }> {\n const loadSpinner =\n spinner ??\n ora({\n text: `Loading model: ${chalk.cyan(modelId)}`,\n color: 'cyan',\n }).start();\n\n try {\n const response = await fetch(this.getApiUrl('/api/model/load'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ model: modelId }),\n signal: AbortSignal.timeout(300000),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to load model: ${response.statusText}`);\n }\n\n loadSpinner.succeed(`Model ${chalk.green(modelId)} loaded successfully`);\n configService.setModel(modelId);\n\n return { loadSpinner };\n } catch (error) {\n loadSpinner.fail(\n `Failed to load model: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n throw error;\n }\n }\n\n async startServer(spinner?: Ora): Promise<void> {\n const startSpinner =\n spinner ??\n ora({\n text: 'Starting LM Studio server...',\n color: 'cyan',\n }).start();\n\n try {\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n const isWindows = process.platform === 'win32';\n\n let lmStudioPath: string | undefined;\n\n if (isMac) {\n lmStudioPath = '/Applications/LM Studio.app/Contents/MacOS/lm-studio';\n } else if (isLinux) {\n lmStudioPath = await this.findLinuxBinary();\n } else if (isWindows) {\n lmStudioPath = await this.findWindowsExecutable();\n }\n\n if (!lmStudioPath) {\n startSpinner.fail('LM Studio not found. Please install it from https://lmstudio.ai');\n throw new Error('LM Studio not installed');\n }\n\n await execa(lmStudioPath, ['--server'], {\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n LM_STUDIO_SERVER_PORT: String(configService.get('lmStudioPort')),\n },\n });\n\n startSpinner.succeed('LM Studio server started');\n\n await this.waitForServer(60000);\n } catch (error) {\n startSpinner.fail(\n `Failed to start LM Studio: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n throw error;\n }\n }\n\n private async findLinuxBinary(): Promise<string | undefined> {\n const possiblePaths = [\n '/usr/bin/lm-studio',\n '/usr/local/bin/lm-studio',\n `${process.env.HOME}/.local/bin/lm-studio`,\n ];\n\n for (const path of possiblePaths) {\n try {\n await execa('test', ['-x', path]);\n return path;\n } catch {\n continue;\n }\n }\n\n return undefined;\n }\n\n private async findWindowsExecutable(): Promise<string | undefined> {\n const localAppData = process.env.LOCALAPPDATA;\n const programFiles = process.env.PROGRAMFILES;\n\n const possiblePaths = [\n localAppData ? `${localAppData}\\\\Programs\\\\LM Studio\\\\lm-studio.exe` : '',\n programFiles ? `${programFiles}\\\\LM Studio\\\\lm-studio.exe` : '',\n ].filter(Boolean);\n\n for (const path of possiblePaths) {\n try {\n await execa('cmd', ['/c', 'if exist', `\"${path}\"`, 'echo', 'yes']);\n return path;\n } catch {\n continue;\n }\n }\n\n return undefined;\n }\n\n async waitForServer(timeout: number = 60000): Promise<boolean> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n if (await this.checkStatus()) {\n return true;\n }\n await this.sleep(2000);\n }\n\n return false;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async findAvailablePort(): Promise<number> {\n for (const port of LMSTUDIO_PORTS) {\n try {\n const response = await fetch(`http://localhost:${port}/api/status`, {\n method: 'GET',\n signal: AbortSignal.timeout(1000),\n });\n if (response.ok) {\n return port;\n }\n } catch {\n configService.set('lmStudioPort', port);\n return port;\n }\n }\n\n return LMSTUDIO_PORTS[0] ?? 1234;\n }\n}\n\nexport const lmStudioService = new LMStudioService();\n", "import { execa } from 'execa';\nimport chalk from 'chalk';\n\nexport interface ClaudeOptions {\n model: string;\n args?: string[];\n verbose?: boolean;\n}\n\nexport class ClaudeService {\n async isClaudeCodeInstalled(): Promise<boolean> {\n try {\n await execa('claude', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async run(options: ClaudeOptions): Promise<void> {\n const { model, args = [], verbose = false } = options;\n\n const provider = this.extractProvider(model);\n const modelName = this.extractModelName(model);\n\n if (!provider || !modelName) {\n throw new Error(`Invalid model format: ${model}. Expected format: provider/model-name`);\n }\n\n const modelArg = `${provider}/${modelName}`;\n const claudeArgs = ['--model', modelArg, ...args];\n\n if (verbose) {\n console.log(chalk.dim(`\\nRunning: claude ${claudeArgs.join(' ')}\\n`));\n }\n\n try {\n await execa('claude', claudeArgs, {\n stdio: 'inherit',\n env: {\n ...process.env,\n ANTHROPIC_MODEL: modelArg,\n },\n });\n } catch (error) {\n if (error instanceof Error && 'exitCode' in error) {\n const exitCode = (error as unknown as { exitCode: number }).exitCode;\n process.exit(exitCode ?? 1);\n }\n throw error;\n }\n }\n\n private extractProvider(model: string): string | undefined {\n const parts = model.split('/');\n return parts[0];\n }\n\n private extractModelName(model: string): string | undefined {\n const parts = model.split('/');\n if (parts.length < 2) return undefined;\n return parts.slice(1).join('/');\n }\n\n async getVersion(): Promise<string | undefined> {\n try {\n const result = await execa('claude', ['--version']);\n return result.stdout;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const claudeService = new ClaudeService();\n", "#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { initCommand, runCommand, statusCommand } from './commands/index.js';\n\nconst program = new Command();\n\nprogram\n .name('aix')\n .description('AI CLI tool integrating LM Studio with Claude Code')\n .version('1.0.0');\n\nprogram\n .command('init')\n .description('Initialize and load a model into LM Studio')\n .option('-m, --model <name>', 'Model name or ID to load')\n .action(initCommand);\n\nprogram\n .command('run')\n .description('Run Claude Code with a model from LM Studio')\n .option('-m, --model <name>', 'Model name or ID to use')\n .option('-v, --verbose', 'Show verbose output')\n .argument('[args...]', 'Additional arguments for Claude Code')\n .action(async (args: string[], options: Record<string, unknown>) => {\n await runCommand({\n ...options,\n args,\n });\n });\n\nprogram\n .command('status')\n .description('Show LM Studio status and available models')\n .action(statusCommand);\n\nprogram\n .command('doctor')\n .description('Check system requirements and configuration')\n .action(async () => {\n const { lmStudioService } = await import('./services/lmstudio.js');\n const { claudeService } = await import('./services/claude.js');\n const { configService } = await import('./services/config.js');\n\n console.log();\n console.log(chalk.bold('System Check'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n\n const lmStudioRunning = await lmStudioService.checkStatus();\n console.log(\n ` ${lmStudioRunning ? chalk.green('\u2713') : chalk.yellow('\u26A0')} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')}`\n );\n\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n console.log(\n ` ${claudeInstalled ? chalk.green('\u2713') : chalk.red('\u2717')} Claude Code: ${claudeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n\n console.log();\n console.log(chalk.bold('Configuration'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(` ${chalk.dim('\u25B8')} LM Studio URL: ${chalk.cyan(configService.getLMStudioUrl())}`);\n\n if (!claudeInstalled) {\n console.log();\n console.log(chalk.yellow('\u26A0 Claude Code is not installed.'));\n console.log(` Install it with: ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n }\n\n if (!lmStudioRunning) {\n console.log();\n console.log(chalk.yellow('\u26A0 LM Studio is not running.'));\n console.log(\n ` Start the server from the LM Studio app or download from ${chalk.cyan('https://lmstudio.ai')}`\n );\n }\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { formatBytes, success, exitWithError } from '../utils/format.js';\nimport type { InitOptions } from '../types/index.js';\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n console.log();\n console.log(chalk.bold('Available Models:'));\n console.log(chalk.dim('\u2500'.repeat(process.stdout.columns || 80)));\n\n models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded = model.loaded ? chalk.green(' [LOADED]') : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name} ${chalk.dim(`(${size})`)}${loaded}`\n );\n });\n console.log();\n\n const lastUsedModel = configService.getLastUsedModel();\n const modelSearch = options.model;\n const selectedModel = modelSearch\n ? models.find((m) => m.id === modelSearch || m.name.includes(modelSearch))\n : await selectModel(models, lastUsedModel);\n\n if (!selectedModel) {\n exitWithError('No model selected');\n }\n\n await lmStudioService.loadModel(selectedModel.id, spinner);\n\n const modelIdentifier = selectedModel.id.replace('/', '--');\n\n success(chalk.bold(`\\nModel ready: ${selectedModel.name}`));\n console.log();\n console.log(`Run Claude Code with this model:`);\n console.log(` ${chalk.cyan('claude --model lmstudio/' + modelIdentifier)}`);\n console.log();\n console.log(`Or use ${chalk.cyan('npx aix run')} to start an interactive session`);\n}\n", "import inquirer from 'inquirer';\nimport type { LMStudioModel } from '../types/index.js';\n\nexport async function selectModel(\n models: LMStudioModel[],\n defaultModel?: string\n): Promise<LMStudioModel> {\n const choices = models.map((model) => ({\n name: `${model.name} (${model.id})`,\n value: model,\n short: model.name,\n }));\n\n const defaultIndex = defaultModel ? choices.findIndex((m) => m.value.id === defaultModel) : 0;\n\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Select a model to load:',\n choices,\n default: Math.max(0, defaultIndex),\n pageSize: Math.min(models.length, 15),\n },\n ]);\n\n return answers['model'] as LMStudioModel;\n}\n\nexport async function confirmAction(\n message: string,\n defaultValue: boolean = true\n): Promise<boolean> {\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message,\n default: defaultValue,\n },\n ]);\n\n return answers['confirm'] as boolean;\n}\n\nexport async function enterPrompt(message: string, defaultValue?: string): Promise<string> {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'value',\n message,\n default: defaultValue,\n validate: (input: string) => input.trim().length > 0 || 'Please enter a value',\n },\n ]);\n\n return answers['value'] as string;\n}\n", "import chalk from \"chalk\";\n\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\nexport function formatModelName(modelId: string): string {\n return modelId\n .replace(/^.*\\//, \"\")\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nexport function promptSeparator(): void {\n console.log(chalk.dim(\"\u2500\".repeat(process.stdout.columns || 80)));\n}\n\nexport function success(message: string): void {\n console.log(chalk.green(\"\u2713\") + \" \" + message);\n}\n\nexport function error(message: string): void {\n console.error(chalk.red(\"\u2717\") + \" \" + message);\n}\n\nexport function info(message: string): void {\n console.log(chalk.blue(\"\u2139\") + \" \" + message);\n}\n\nexport function warn(message: string): void {\n console.log(chalk.yellow(\"\u26A0\") + \" \" + message);\n}\n\nexport function exitWithError(message: string, code: number = 1): never {\n error(message);\n process.exit(code);\n}\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { claudeService } from '../services/claude.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { exitWithError, success } from '../utils/format.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n}\n\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n spinner.text = 'Fetching available models...';\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n spinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n spinner.stop();\n\n let selectedModelId: string;\n\n if (options.model) {\n const foundModel = models.find(\n (m) => m.id === options.model || m.name.toLowerCase().includes(options.model!.toLowerCase())\n );\n\n if (!foundModel) {\n exitWithError(\n `Model \"${options.model}\" not found. Available models: ${models.map((m) => m.name).join(', ')}`\n );\n }\n\n selectedModelId = foundModel.id;\n } else {\n const lastUsedModel = configService.getLastUsedModel();\n const selectedModel = await selectModel(models, lastUsedModel);\n selectedModelId = selectedModel.id;\n }\n\n const loadSpinner = ora({\n text: `Loading model: ${chalk.cyan(selectedModelId)}`,\n color: 'cyan',\n }).start();\n\n await lmStudioService.loadModel(selectedModelId, loadSpinner);\n\n const modelIdentifier = selectedModelId.replace('/', '--');\n const fullModelName = `lmstudio/${modelIdentifier}`;\n\n success(chalk.green(`\\nStarting Claude Code with model: ${fullModelName}\\n`));\n\n try {\n await claudeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n } catch (error) {\n exitWithError(\n `Failed to run Claude Code: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n", "import chalk from \"chalk\";\nimport { lmStudioService } from \"../services/lmstudio.js\";\nimport { formatBytes } from \"../utils/format.js\";\n\nexport async function statusCommand(): Promise<void> {\n const status = await lmStudioService.getStatus();\n\n console.log();\n console.log(chalk.bold(\"LM Studio Status\"));\n console.log(chalk.dim(\"\u2500\".repeat(50)));\n console.log(\n ` ${status.running ? chalk.green(\"\u25CF\") : chalk.red(\"\u25CB\")} Server: ${status.running ? chalk.green(\"Running\") : chalk.red(\"Stopped\")}`,\n );\n console.log(` ${chalk.dim(\"\u25B8\")} Port: ${chalk.cyan(String(status.port))}`);\n console.log(\n ` ${chalk.dim(\"\u25B8\")} URL: ${chalk.cyan(`http://localhost:${status.port}`)}`,\n );\n\n if (status.activeModel) {\n console.log(\n ` ${chalk.dim(\"\u25B8\")} Active Model: ${chalk.green(status.activeModel)}`,\n );\n } else {\n console.log(` ${chalk.dim(\"\u25B8\")} Active Model: ${chalk.dim(\"None\")}`);\n }\n\n console.log();\n console.log(chalk.bold(\"Models\"));\n console.log(chalk.dim(\"\u2500\".repeat(50)));\n\n if (status.models.length === 0) {\n console.log(` ${chalk.dim(\"No models available\")}`);\n } else {\n status.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded =\n model.id === status.activeModel ? ` ${chalk.green(\"[LOADED]\")}` : \"\";\n console.log(\n ` ${chalk.dim(String(index + 1) + \".\")} ${model.name}${loaded}`,\n );\n console.log(` ${chalk.dim(\"ID:\")} ${model.id}`);\n console.log(` ${chalk.dim(\"Size:\")} ${size}`);\n if (model.quantization) {\n console.log(` ${chalk.dim(\"Quantization:\")} ${model.quantization}`);\n }\n console.log();\n });\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["config_exports", "__export", "ConfigService", "configService", "Conf", "init_config", "__esmMin", "key", "value", "model", "host", "port", "lmstudio_exports", "__export", "LMStudioService", "lmStudioService", "execa", "ora", "chalk", "LMSTUDIO_PORTS", "init_lmstudio", "__esmMin", "init_config", "configService", "path", "response", "error", "data", "modelId", "spinner", "loadSpinner", "startSpinner", "isMac", "isLinux", "isWindows", "lmStudioPath", "possiblePaths", "localAppData", "programFiles", "timeout", "startTime", "ms", "resolve", "port", "claude_exports", "__export", "ClaudeService", "claudeService", "execa", "chalk", "init_claude", "__esmMin", "options", "model", "args", "verbose", "provider", "modelName", "modelArg", "claudeArgs", "error", "exitCode", "parts", "Command", "chalk", "init_lmstudio", "init_config", "ora", "chalk", "inquirer", "selectModel", "models", "defaultModel", "choices", "model", "defaultIndex", "m", "confirmAction", "message", "defaultValue", "chalk", "formatBytes", "bytes", "k", "sizes", "i", "success", "message", "chalk", "error", "exitWithError", "message", "code", "error", "initCommand", "options", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "chalk", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "configService", "modelSearch", "selectedModel", "m", "selectModel", "modelIdentifier", "success", "init_lmstudio", "init_claude", "init_config", "ora", "chalk", "runCommand", "options", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "models", "selectedModelId", "foundModel", "m", "lastUsedModel", "configService", "selectModel", "loadSpinner", "chalk", "fullModelName", "success", "claudeService", "error", "init_lmstudio", "chalk", "statusCommand", "status", "lmStudioService", "chalk", "model", "index", "size", "formatBytes", "loaded", "program", "Command", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "claudeService", "configService", "chalk", "lmStudioRunning", "claudeInstalled"]
4
+ "sourcesContent": ["import Conf from 'conf';\nimport type { Config } from '../types/index.js';\n\nexport class ConfigService {\n private store: Conf<Config>;\n\n constructor() {\n this.store = new Conf<Config>({\n projectName: 'aix',\n defaults: {\n lmStudioUrl: 'http://localhost',\n lmStudioPort: 1234,\n defaultTimeout: 30000,\n autoStartServer: false,\n },\n clearInvalidConfig: true,\n });\n }\n\n get<K extends keyof Config>(key: K): Config[K] {\n return this.store.get(key) as Config[K];\n }\n\n set<K extends keyof Config>(key: K, value: Config[K]): void {\n this.store.set(key, value as Config[K]);\n }\n\n setModel(model: string): void {\n this.store.set('model', model);\n }\n\n getLastUsedModel(): string | undefined {\n return this.store.get('model');\n }\n\n getLMStudioUrl(): string {\n const host = this.store.get('lmStudioUrl');\n const port = this.store.get('lmStudioPort');\n return `${host}:${port}`;\n }\n\n reset(): void {\n this.store.clear();\n }\n}\n\nexport const configService = new ConfigService();\n", "import { execa } from 'execa';\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\nimport { configService } from './config.js';\nimport type { LMStudioStatus, LMStudioModel } from '../types/index.js';\n\nconst LMSTUDIO_PORTS = [1234, 1235, 1236, 1237];\n\nexport class LMStudioService {\n private baseUrl: string;\n\n constructor() {\n this.baseUrl = configService.getLMStudioUrl();\n }\n\n private getApiUrl(path: string): string {\n return `${this.baseUrl}${path}`;\n }\n\n async checkStatus(): Promise<boolean> {\n try {\n const response = await fetch(this.getApiUrl('/api/status'), {\n method: 'GET',\n signal: AbortSignal.timeout(3000),\n });\n return response.ok;\n } catch {\n return false;\n }\n }\n\n async getAvailableModels(): Promise<LMStudioModel[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/models'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch models: ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n models: Array<{ id: string; name: string; size: number; quantization?: string }>;\n };\n return data.models ?? [];\n } catch (error) {\n throw new Error(\n `Unable to fetch models from LM Studio: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n }\n\n async getStatus(): Promise<LMStudioStatus> {\n const running = await this.checkStatus();\n\n if (!running) {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n\n try {\n const response = await fetch(this.getApiUrl('/api/status'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n\n const data = (await response.json()) as {\n models: LMStudioModel[];\n active_model?: string;\n };\n\n return {\n running: true,\n port: configService.get('lmStudioPort'),\n models: data.models ?? [],\n activeModel: data.active_model,\n };\n } catch {\n return {\n running: false,\n port: configService.get('lmStudioPort'),\n models: [],\n };\n }\n }\n\n async loadModel(modelId: string, spinner?: Ora): Promise<{ loadSpinner: Ora }> {\n const loadSpinner =\n spinner ??\n ora({\n text: `Loading model: ${chalk.cyan(modelId)}`,\n color: 'cyan',\n }).start();\n\n try {\n const response = await fetch(this.getApiUrl('/api/model/load'), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ model: modelId }),\n signal: AbortSignal.timeout(300000),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to load model: ${response.statusText}`);\n }\n\n loadSpinner.succeed(`Model ${chalk.green(modelId)} loaded successfully`);\n configService.setModel(modelId);\n\n return { loadSpinner };\n } catch (error) {\n loadSpinner.fail(\n `Failed to load model: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n throw error;\n }\n }\n\n async startServer(spinner?: Ora): Promise<void> {\n const startSpinner =\n spinner ??\n ora({\n text: 'Starting LM Studio server...',\n color: 'cyan',\n }).start();\n\n try {\n const isMac = process.platform === 'darwin';\n const isLinux = process.platform === 'linux';\n const isWindows = process.platform === 'win32';\n\n let lmStudioPath: string | undefined;\n\n if (isMac) {\n const possiblePaths = [\n '/Applications/LM Studio.app',\n `${process.env.HOME}/Applications/LM Studio.app`,\n ];\n for (const p of possiblePaths) {\n try {\n const { existsSync } = await import('fs');\n if (existsSync(p)) {\n lmStudioPath = `open \"${p}\" --args --server`;\n break;\n }\n } catch {\n // continue\n }\n }\n // Use open command for macOS apps\n if (lmStudioPath?.startsWith('open')) {\n await execa(\n 'open',\n [\n possiblePaths.find((p) => {\n try {\n const { existsSync } = require('fs');\n return existsSync(p);\n } catch {\n return false;\n }\n }) || '/Applications/LM Studio.app',\n '--args',\n '--server',\n ],\n {\n detached: true,\n stdio: 'ignore',\n }\n );\n startSpinner.succeed('LM Studio server started');\n await this.waitForServer(60000);\n return;\n }\n } else if (isLinux) {\n lmStudioPath = await this.findLinuxBinary();\n } else if (isWindows) {\n lmStudioPath = await this.findWindowsExecutable();\n }\n\n if (!lmStudioPath) {\n startSpinner.fail('LM Studio not found. Please install it from https://lmstudio.ai');\n throw new Error('LM Studio not installed');\n }\n\n await execa(lmStudioPath, ['--server'], {\n detached: true,\n stdio: 'ignore',\n env: {\n ...process.env,\n LM_STUDIO_SERVER_PORT: String(configService.get('lmStudioPort')),\n },\n });\n\n startSpinner.succeed('LM Studio server started');\n\n await this.waitForServer(60000);\n } catch (error) {\n startSpinner.fail(\n `Failed to start LM Studio: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n throw error;\n }\n }\n\n private async findLinuxBinary(): Promise<string | undefined> {\n const possiblePaths = [\n '/usr/bin/lm-studio',\n '/usr/local/bin/lm-studio',\n `${process.env.HOME}/.local/bin/lm-studio`,\n ];\n\n for (const path of possiblePaths) {\n try {\n await execa('test', ['-x', path]);\n return path;\n } catch {\n continue;\n }\n }\n\n return undefined;\n }\n\n private async findWindowsExecutable(): Promise<string | undefined> {\n const localAppData = process.env.LOCALAPPDATA;\n const programFiles = process.env.PROGRAMFILES;\n\n const possiblePaths = [\n localAppData ? `${localAppData}\\\\Programs\\\\LM Studio\\\\lm-studio.exe` : '',\n programFiles ? `${programFiles}\\\\LM Studio\\\\lm-studio.exe` : '',\n ].filter(Boolean);\n\n for (const path of possiblePaths) {\n try {\n await execa('cmd', ['/c', 'if exist', `\"${path}\"`, 'echo', 'yes']);\n return path;\n } catch {\n continue;\n }\n }\n\n return undefined;\n }\n\n async waitForServer(timeout: number = 60000): Promise<boolean> {\n const startTime = Date.now();\n\n while (Date.now() - startTime < timeout) {\n if (await this.checkStatus()) {\n return true;\n }\n await this.sleep(2000);\n }\n\n return false;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n async findAvailablePort(): Promise<number> {\n for (const port of LMSTUDIO_PORTS) {\n try {\n const response = await fetch(`http://localhost:${port}/api/status`, {\n method: 'GET',\n signal: AbortSignal.timeout(1000),\n });\n if (response.ok) {\n return port;\n }\n } catch {\n configService.set('lmStudioPort', port);\n return port;\n }\n }\n\n return LMSTUDIO_PORTS[0] ?? 1234;\n }\n}\n\nexport const lmStudioService = new LMStudioService();\n", "import { execa } from 'execa';\nimport chalk from 'chalk';\n\nexport interface ClaudeOptions {\n model: string;\n args?: string[];\n verbose?: boolean;\n}\n\nexport class ClaudeService {\n async isClaudeCodeInstalled(): Promise<boolean> {\n try {\n await execa('claude', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async run(options: ClaudeOptions): Promise<void> {\n const { model, args = [], verbose = false } = options;\n\n const provider = this.extractProvider(model);\n const modelName = this.extractModelName(model);\n\n if (!provider || !modelName) {\n throw new Error(`Invalid model format: ${model}. Expected format: provider/model-name`);\n }\n\n const modelArg = `${provider}/${modelName}`;\n const claudeArgs = ['--model', modelArg, ...args];\n\n if (verbose) {\n console.log(chalk.dim(`\\nRunning: claude ${claudeArgs.join(' ')}\\n`));\n }\n\n try {\n await execa('claude', claudeArgs, {\n stdio: 'inherit',\n env: {\n ...process.env,\n ANTHROPIC_MODEL: modelArg,\n },\n });\n } catch (error) {\n if (error instanceof Error && 'exitCode' in error) {\n const exitCode = (error as unknown as { exitCode: number }).exitCode;\n process.exit(exitCode ?? 1);\n }\n throw error;\n }\n }\n\n private extractProvider(model: string): string | undefined {\n const parts = model.split('/');\n return parts[0];\n }\n\n private extractModelName(model: string): string | undefined {\n const parts = model.split('/');\n if (parts.length < 2) return undefined;\n return parts.slice(1).join('/');\n }\n\n async getVersion(): Promise<string | undefined> {\n try {\n const result = await execa('claude', ['--version']);\n return result.stdout;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const claudeService = new ClaudeService();\n", "#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport { initCommand, runCommand, statusCommand } from './commands/index.js';\n\nconst program = new Command();\n\nprogram\n .name('aix')\n .description('AI CLI tool integrating LM Studio with Claude Code')\n .version('1.0.0');\n\nprogram\n .command('init')\n .description('Initialize and load a model into LM Studio')\n .option('-m, --model <name>', 'Model name or ID to load')\n .action(initCommand);\n\nprogram\n .command('run')\n .description('Run Claude Code with a model from LM Studio')\n .option('-m, --model <name>', 'Model name or ID to use')\n .option('-v, --verbose', 'Show verbose output')\n .argument('[args...]', 'Additional arguments for Claude Code')\n .action(async (args: string[], options: Record<string, unknown>) => {\n await runCommand({\n ...options,\n args,\n });\n });\n\nprogram\n .command('status')\n .description('Show LM Studio status and available models')\n .action(statusCommand);\n\nprogram\n .command('doctor')\n .description('Check system requirements and configuration')\n .action(async () => {\n const { lmStudioService } = await import('./services/lmstudio.js');\n const { claudeService } = await import('./services/claude.js');\n const { configService } = await import('./services/config.js');\n\n console.log();\n console.log(chalk.bold('System Check'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n\n const lmStudioRunning = await lmStudioService.checkStatus();\n console.log(\n ` ${lmStudioRunning ? chalk.green('\u2713') : chalk.yellow('\u26A0')} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')}`\n );\n\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n console.log(\n ` ${claudeInstalled ? chalk.green('\u2713') : chalk.red('\u2717')} Claude Code: ${claudeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n\n console.log();\n console.log(chalk.bold('Configuration'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(` ${chalk.dim('\u25B8')} LM Studio URL: ${chalk.cyan(configService.getLMStudioUrl())}`);\n\n if (!claudeInstalled) {\n console.log();\n console.log(chalk.yellow('\u26A0 Claude Code is not installed.'));\n console.log(` Install it with: ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n }\n\n if (!lmStudioRunning) {\n console.log();\n console.log(chalk.yellow('\u26A0 LM Studio is not running.'));\n console.log(\n ` Start the server from the LM Studio app or download from ${chalk.cyan('https://lmstudio.ai')}`\n );\n }\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { formatBytes, success, exitWithError } from '../utils/format.js';\nimport type { InitOptions } from '../types/index.js';\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n console.log();\n console.log(chalk.bold('Available Models:'));\n console.log(chalk.dim('\u2500'.repeat(process.stdout.columns || 80)));\n\n models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded = model.loaded ? chalk.green(' [LOADED]') : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name} ${chalk.dim(`(${size})`)}${loaded}`\n );\n });\n console.log();\n\n const lastUsedModel = configService.getLastUsedModel();\n const modelSearch = options.model;\n const selectedModel = modelSearch\n ? models.find((m) => m.id === modelSearch || m.name.includes(modelSearch))\n : await selectModel(models, lastUsedModel);\n\n if (!selectedModel) {\n exitWithError('No model selected');\n }\n\n await lmStudioService.loadModel(selectedModel.id, spinner);\n\n const modelIdentifier = selectedModel.id.replace('/', '--');\n\n success(chalk.bold(`\\nModel ready: ${selectedModel.name}`));\n console.log();\n console.log(`Run Claude Code with this model:`);\n console.log(` ${chalk.cyan('claude --model lmstudio/' + modelIdentifier)}`);\n console.log();\n console.log(`Or use ${chalk.cyan('npx aix run')} to start an interactive session`);\n}\n", "import inquirer from 'inquirer';\nimport type { LMStudioModel } from '../types/index.js';\n\nexport async function selectModel(\n models: LMStudioModel[],\n defaultModel?: string\n): Promise<LMStudioModel> {\n const choices = models.map((model) => ({\n name: `${model.name} (${model.id})`,\n value: model,\n short: model.name,\n }));\n\n const defaultIndex = defaultModel ? choices.findIndex((m) => m.value.id === defaultModel) : 0;\n\n const answers = await inquirer.prompt([\n {\n type: 'list',\n name: 'model',\n message: 'Select a model to load:',\n choices,\n default: Math.max(0, defaultIndex),\n pageSize: Math.min(models.length, 15),\n },\n ]);\n\n return answers['model'] as LMStudioModel;\n}\n\nexport async function confirmAction(\n message: string,\n defaultValue: boolean = true\n): Promise<boolean> {\n const answers = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message,\n default: defaultValue,\n },\n ]);\n\n return answers['confirm'] as boolean;\n}\n\nexport async function enterPrompt(message: string, defaultValue?: string): Promise<string> {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'value',\n message,\n default: defaultValue,\n validate: (input: string) => input.trim().length > 0 || 'Please enter a value',\n },\n ]);\n\n return answers['value'] as string;\n}\n", "import chalk from \"chalk\";\n\nexport function formatBytes(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;\n}\n\nexport function formatModelName(modelId: string): string {\n return modelId\n .replace(/^.*\\//, \"\")\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nexport function truncate(str: string, maxLength: number): string {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\n\nexport function promptSeparator(): void {\n console.log(chalk.dim(\"\u2500\".repeat(process.stdout.columns || 80)));\n}\n\nexport function success(message: string): void {\n console.log(chalk.green(\"\u2713\") + \" \" + message);\n}\n\nexport function error(message: string): void {\n console.error(chalk.red(\"\u2717\") + \" \" + message);\n}\n\nexport function info(message: string): void {\n console.log(chalk.blue(\"\u2139\") + \" \" + message);\n}\n\nexport function warn(message: string): void {\n console.log(chalk.yellow(\"\u26A0\") + \" \" + message);\n}\n\nexport function exitWithError(message: string, code: number = 1): never {\n error(message);\n process.exit(code);\n}\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { claudeService } from '../services/claude.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { exitWithError, success } from '../utils/format.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n}\n\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n spinner.text = 'Fetching available models...';\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n spinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n spinner.stop();\n\n let selectedModelId: string;\n\n if (options.model) {\n const foundModel = models.find(\n (m) => m.id === options.model || m.name.toLowerCase().includes(options.model!.toLowerCase())\n );\n\n if (!foundModel) {\n exitWithError(\n `Model \"${options.model}\" not found. Available models: ${models.map((m) => m.name).join(', ')}`\n );\n }\n\n selectedModelId = foundModel.id;\n } else {\n const lastUsedModel = configService.getLastUsedModel();\n const selectedModel = await selectModel(models, lastUsedModel);\n selectedModelId = selectedModel.id;\n }\n\n const loadSpinner = ora({\n text: `Loading model: ${chalk.cyan(selectedModelId)}`,\n color: 'cyan',\n }).start();\n\n await lmStudioService.loadModel(selectedModelId, loadSpinner);\n\n const modelIdentifier = selectedModelId.replace('/', '--');\n const fullModelName = `lmstudio/${modelIdentifier}`;\n\n success(chalk.green(`\\nStarting Claude Code with model: ${fullModelName}\\n`));\n\n try {\n await claudeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n } catch (error) {\n exitWithError(\n `Failed to run Claude Code: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n", "import chalk from \"chalk\";\nimport { lmStudioService } from \"../services/lmstudio.js\";\nimport { formatBytes } from \"../utils/format.js\";\n\nexport async function statusCommand(): Promise<void> {\n const status = await lmStudioService.getStatus();\n\n console.log();\n console.log(chalk.bold(\"LM Studio Status\"));\n console.log(chalk.dim(\"\u2500\".repeat(50)));\n console.log(\n ` ${status.running ? chalk.green(\"\u25CF\") : chalk.red(\"\u25CB\")} Server: ${status.running ? chalk.green(\"Running\") : chalk.red(\"Stopped\")}`,\n );\n console.log(` ${chalk.dim(\"\u25B8\")} Port: ${chalk.cyan(String(status.port))}`);\n console.log(\n ` ${chalk.dim(\"\u25B8\")} URL: ${chalk.cyan(`http://localhost:${status.port}`)}`,\n );\n\n if (status.activeModel) {\n console.log(\n ` ${chalk.dim(\"\u25B8\")} Active Model: ${chalk.green(status.activeModel)}`,\n );\n } else {\n console.log(` ${chalk.dim(\"\u25B8\")} Active Model: ${chalk.dim(\"None\")}`);\n }\n\n console.log();\n console.log(chalk.bold(\"Models\"));\n console.log(chalk.dim(\"\u2500\".repeat(50)));\n\n if (status.models.length === 0) {\n console.log(` ${chalk.dim(\"No models available\")}`);\n } else {\n status.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded =\n model.id === status.activeModel ? ` ${chalk.green(\"[LOADED]\")}` : \"\";\n console.log(\n ` ${chalk.dim(String(index + 1) + \".\")} ${model.name}${loaded}`,\n );\n console.log(` ${chalk.dim(\"ID:\")} ${model.id}`);\n console.log(` ${chalk.dim(\"Size:\")} ${size}`);\n if (model.quantization) {\n console.log(` ${chalk.dim(\"Quantization:\")} ${model.quantization}`);\n }\n console.log();\n });\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["config_exports", "__export", "ConfigService", "configService", "Conf", "init_config", "__esmMin", "key", "value", "model", "host", "port", "lmstudio_exports", "__export", "LMStudioService", "lmStudioService", "execa", "ora", "chalk", "LMSTUDIO_PORTS", "init_lmstudio", "__esmMin", "init_config", "configService", "path", "response", "error", "data", "modelId", "spinner", "loadSpinner", "startSpinner", "isMac", "isLinux", "isWindows", "lmStudioPath", "possiblePaths", "p", "existsSync", "localAppData", "programFiles", "timeout", "startTime", "ms", "resolve", "port", "claude_exports", "__export", "ClaudeService", "claudeService", "execa", "chalk", "init_claude", "__esmMin", "options", "model", "args", "verbose", "provider", "modelName", "modelArg", "claudeArgs", "error", "exitCode", "parts", "Command", "chalk", "init_lmstudio", "init_config", "ora", "chalk", "inquirer", "selectModel", "models", "defaultModel", "choices", "model", "defaultIndex", "m", "confirmAction", "message", "defaultValue", "chalk", "formatBytes", "bytes", "k", "sizes", "i", "success", "message", "chalk", "error", "exitWithError", "message", "code", "error", "initCommand", "options", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "chalk", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "configService", "modelSearch", "selectedModel", "m", "selectModel", "modelIdentifier", "success", "init_lmstudio", "init_claude", "init_config", "ora", "chalk", "runCommand", "options", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "models", "selectedModelId", "foundModel", "m", "lastUsedModel", "configService", "selectModel", "loadSpinner", "chalk", "fullModelName", "success", "claudeService", "error", "init_lmstudio", "chalk", "statusCommand", "status", "lmStudioService", "chalk", "model", "index", "size", "formatBytes", "loaded", "program", "Command", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "claudeService", "configService", "chalk", "lmStudioRunning", "claudeInstalled"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamharshil/aix-cli",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "description": "AI CLI tool that integrates LM Studio with Claude Code for enhanced development assistance",
5
5
  "keywords": [
6
6
  "cli",
@@ -42,7 +42,8 @@
42
42
  "test:watch": "vitest",
43
43
  "lint": "eslint src --ext .ts",
44
44
  "format": "prettier --write \"src/**/*.ts\"",
45
- "typecheck": "tsc --noEmit"
45
+ "typecheck": "tsc --noEmit",
46
+ "audit": "node scripts/audit.js"
46
47
  },
47
48
  "dependencies": {
48
49
  "chalk": "^5.3.0",