@iamharshil/aix-cli 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # AIX CLI
2
2
 
3
- > AI-powered CLI tool that integrates LM Studio with Claude Code for enhanced local development assistance
3
+ > AI-powered CLI tool that integrates LM Studio with Claude Code or OpenCode for enhanced local development assistance
4
4
 
5
5
  <div align="center">
6
6
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  ## Overview
19
19
 
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.
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) or [OpenCode](https://opencode.ai). No API keys, no cloud dependencies, complete privacy.
21
21
 
22
22
  ### Why AIX?
23
23
 
@@ -33,7 +33,7 @@
33
33
 
34
34
  - [Node.js](https://nodejs.org/) 18.0.0 or higher
35
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
36
+ - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) **or** [OpenCode](https://opencode.ai) - AI coding assistant
37
37
 
38
38
  ## Quick Start
39
39
 
@@ -93,24 +93,31 @@ aix-cli doctor
93
93
  Load a model from your local LM Studio models:
94
94
 
95
95
  ```bash
96
- # Interactive selection
96
+ # Interactive selection (prompts for provider)
97
97
  aix-cli init
98
98
 
99
99
  # Specific model
100
100
  aix-cli init -m llama-3-8b
101
+
102
+ # With provider
103
+ aix-cli init -m llama-3-8b --provider opencode
101
104
  ```
102
105
 
103
- ### Run Claude Code
106
+ ### Run with Provider
104
107
 
105
- Start coding with Claude Code and your local model:
108
+ Start coding with your local model using Claude Code or OpenCode:
106
109
 
107
110
  ```bash
108
- # Interactive session
111
+ # Interactive session (uses default provider)
109
112
  aix-cli run
110
113
 
111
114
  # With specific model
112
115
  aix-cli run -m llama-3-8b
113
116
 
117
+ # With OpenCode instead of Claude Code
118
+ aix-cli run --provider opencode
119
+ aix-cli run -p opencode -m llama-3-8b
120
+
114
121
  # With arguments
115
122
  aix-cli run -m llama-3-8b -- "Write a hello world in Python"
116
123
  ```
@@ -142,7 +149,8 @@ AIX CLI stores configuration in your system's app data directory:
142
149
  "lmStudioUrl": "http://localhost",
143
150
  "lmStudioPort": 1234,
144
151
  "defaultTimeout": 30000,
145
- "model": "lmstudio/llama-3-8b"
152
+ "model": "lmstudio/llama-3-8b",
153
+ "defaultProvider": "claude"
146
154
  }
147
155
  ```
148
156
 
@@ -169,11 +177,14 @@ AIX CLI stores configuration in your system's app data directory:
169
177
  │ │ │ (port 1234) │ │
170
178
  │ │ └──────────────┘ │
171
179
  │ │ │ │
172
- │ ▼
173
- ┌─────────────────────────────────┐
174
- │ │ Claude Code
175
- │ │ --model lmstudio/model │ │
176
- └─────────────────────────────────┘
180
+ │ ▼ ┌─────────┴─────────┐
181
+ ┌─────────────┴─────────────┐
182
+ │ │
183
+ ▼ ▼ ▼
184
+ ┌──────────┐ ┌──────────┐
185
+ │ │Claude Code│ │OpenCode │ │
186
+ │ │--model │ │--model │ │
187
+ │ └──────────┘ └──────────┘ │
177
188
  │ │
178
189
  └─────────────────────────────────────────────────────┘
179
190
  ```
@@ -247,6 +258,7 @@ npm run build
247
258
 
248
259
  - [LM Studio](https://lmstudio.ai) - Run local AI models
249
260
  - [Claude Code](https://docs.anthropic.com/en/docs/claude-code) - AI coding assistant
261
+ - [OpenCode](https://opencode.ai) - Open-source AI coding assistant
250
262
 
251
263
  ## License
252
264
 
package/dist/bin/aix.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- var ne=Object.defineProperty;var ie=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});var b=(o,e)=>()=>(o&&(e=o(o=0)),e);var L=(o,e)=>{for(var t in e)ne(o,t,{get:e[t],enumerable:!0})};var W={};L(W,{ConfigService:()=>O,configService:()=>c});import se from"conf";var O,c,M=b(()=>{"use strict";O=class{store;constructor(){this.store=new se({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,defaultTimeout:3e4,autoStartServer:!1,defaultProvider:"claude"},clearInvalidConfig:!0})}get(e){return this.store.get(e)}set(e,t){this.store.set(e,t)}setModel(e){this.store.set("model",e)}getLastUsedModel(){return this.store.get("model")}setDefaultProvider(e){this.store.set("defaultProvider",e)}getDefaultProvider(){return this.store.get("defaultProvider")??"claude"}getLMStudioUrl(){let e=this.store.get("lmStudioUrl"),t=this.store.get("lmStudioPort");return`${e}:${t}`}reset(){this.store.clear()}},c=new O});var Q={};L(Q,{LMStudioService:()=>E,lmStudioService:()=>f});import{execa as A}from"execa";import H from"ora";import V from"chalk";var J,E,f,x=b(()=>{"use strict";M();J=[1234,1235,1236,1237],E=class{baseUrl;constructor(){this.baseUrl=c.getLMStudioUrl()}getApiUrl(e){return`${this.baseUrl}${e}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){let e=["/api/v1/models","/api/models","/v1/models","/api/ls-model/list"];for(let t of e)try{let n=await fetch(this.getApiUrl(t),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!n.ok)continue;let r=await n.json(),i=[];return Array.isArray(r)?i=r:r.models&&Array.isArray(r.models)?i=r.models:r.data&&Array.isArray(r.data)&&(i=r.data),i.map(a=>{let s=a;return{id:String(s.key||s.id||s.model||""),name:String(s.display_name||s.name||s.id||s.model||""),size:Number(s.size_bytes||s.size||s.file_size||0),quantization:String(s.quantization?typeof s.quantization=="object"?s.quantization.name:s.quantization:"")}}).filter(a=>a.id&&a.name)}catch{continue}return[]}async getStatus(){if(!await this.checkStatus())return{running:!1,port:c.get("lmStudioPort"),models:[]};try{let t=await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!t.ok)return{running:!1,port:c.get("lmStudioPort"),models:[]};let n=await t.json();return{running:!0,port:c.get("lmStudioPort"),models:n.models??[],activeModel:n.active_model}}catch{return{running:!1,port:c.get("lmStudioPort"),models:[]}}}async loadModel(e,t){let n=t??H({text:`Loading model: ${V.cyan(e)}`,color:"cyan"}).start();try{let r=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e}),signal:AbortSignal.timeout(3e5)});if(!r.ok)throw new Error(`Failed to load model: ${r.statusText}`);return n.succeed(`Model ${V.green(e)} loaded successfully`),c.setModel(e),{loadSpinner:n}}catch(r){throw n.fail(`Failed to load model: ${r instanceof Error?r.message:"Unknown error"}`),r}}async startServer(e){let t=e??H({text:"Starting LM Studio server...",color:"cyan"}).start();try{let n=process.platform==="darwin",r=process.platform==="linux",i=process.platform==="win32",a;if(n){let s=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let l of s)try{let{existsSync:m}=await import("fs");if(m(l)){a=`open "${l}" --args --server`;break}}catch{}if(a?.startsWith("open")){await A("open",[s.find(l=>{try{let{existsSync:m}=ie("fs");return m(l)}catch{return!1}})||"/Applications/LM Studio.app","--args","--server"],{detached:!0,stdio:"ignore"}),t.succeed("LM Studio server started"),await this.waitForServer(6e4);return}}else r?a=await this.findLinuxBinary():i&&(a=await this.findWindowsExecutable());if(!a)throw t.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await A(a,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(c.get("lmStudioPort"))}}),t.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(n){throw t.fail(`Failed to start LM Studio: ${n instanceof Error?n.message:"Unknown error"}`),n}}async findLinuxBinary(){let e=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let t of e)try{return await A("test",["-x",t]),t}catch{continue}}async findWindowsExecutable(){let e=process.env.LOCALAPPDATA,t=process.env.PROGRAMFILES,n=[e?`${e}\\Programs\\LM Studio\\lm-studio.exe`:"",t?`${t}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let r of n)try{return await A("cmd",["/c","if exist",`"${r}"`,"echo","yes"]),r}catch{continue}}async waitForServer(e=6e4){let t=Date.now();for(;Date.now()-t<e;){if(await this.checkStatus())return!0;await this.sleep(2e3)}return!1}sleep(e){return new Promise(t=>setTimeout(t,e))}async findAvailablePort(){for(let e of J)try{if((await fetch(`http://localhost:${e}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return e}catch{return c.set("lmStudioPort",e),e}return J[0]??1234}},f=new E});var oe={};L(oe,{ClaudeService:()=>N,claudeService:()=>R});import{execa as _}from"execa";import le from"chalk";var N,R,F=b(()=>{"use strict";N=class{async isClaudeCodeInstalled(){try{return await _("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:t,args:n=[],verbose:r=!1}=e,i=this.extractProvider(t),a=this.extractModelName(t);if(!i||!a)throw new Error(`Invalid model format: ${t}. Expected format: provider/model-name`);let s=`${i}/${a}`,l=["--model",s,...n];r&&console.log(le.dim(`
2
+ var ne=Object.defineProperty;var ie=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,o)=>(typeof require<"u"?require:e)[o]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var O=(t,e)=>()=>(t&&(e=t(t=0)),e);var A=(t,e)=>{for(var o in e)ne(t,o,{get:e[o],enumerable:!0})};var W={};A(W,{ConfigService:()=>E,configService:()=>c});import se from"conf";var E,c,M=O(()=>{"use strict";E=class{store;constructor(){this.store=new se({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,defaultTimeout:3e4,autoStartServer:!1},clearInvalidConfig:!0})}get(e){return this.store.get(e)}set(e,o){this.store.set(e,o)}setModel(e){this.store.set("model",e)}getLastUsedModel(){return this.store.get("model")}setDefaultProvider(e){this.store.set("defaultProvider",e)}getDefaultProvider(){return this.store.get("defaultProvider")}getLMStudioUrl(){let e=this.store.get("lmStudioUrl"),o=this.store.get("lmStudioPort");return`${e}:${o}`}reset(){this.store.clear()}},c=new E});var Q={};A(Q,{LMStudioService:()=>I,lmStudioService:()=>g});import{execa as k}from"execa";import H from"ora";import V from"chalk";var J,I,g,C=O(()=>{"use strict";M();J=[1234,1235,1236,1237],I=class{baseUrl;constructor(){this.baseUrl=c.getLMStudioUrl()}getApiUrl(e){return`${this.baseUrl}${e}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){let e=["/api/v1/models","/api/models","/v1/models","/api/ls-model/list"];for(let o of e)try{let n=await fetch(this.getApiUrl(o),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!n.ok)continue;let r=await n.json(),i=[];return Array.isArray(r)?i=r:r.models&&Array.isArray(r.models)?i=r.models:r.data&&Array.isArray(r.data)&&(i=r.data),i.map(a=>{let s=a;return{id:String(s.key||s.id||s.model||""),name:String(s.display_name||s.name||s.id||s.model||""),size:Number(s.size_bytes||s.size||s.file_size||0),quantization:String(s.quantization?typeof s.quantization=="object"?s.quantization.name:s.quantization:"")}}).filter(a=>a.id&&a.name)}catch{continue}return[]}async getStatus(){if(!await this.checkStatus())return{running:!1,port:c.get("lmStudioPort"),models:[]};try{let o=await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!o.ok)return{running:!1,port:c.get("lmStudioPort"),models:[]};let n=await o.json();return{running:!0,port:c.get("lmStudioPort"),models:n.models??[],activeModel:n.active_model}}catch{return{running:!1,port:c.get("lmStudioPort"),models:[]}}}async loadModel(e,o){let n=o??H({text:`Loading model: ${V.cyan(e)}`,color:"cyan"}).start();try{let r=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e}),signal:AbortSignal.timeout(3e5)});if(!r.ok)throw new Error(`Failed to load model: ${r.statusText}`);return n.succeed(`Model ${V.green(e)} loaded successfully`),c.setModel(e),{loadSpinner:n}}catch(r){throw n.fail(`Failed to load model: ${r instanceof Error?r.message:"Unknown error"}`),r}}async startServer(e){let o=e??H({text:"Starting LM Studio server...",color:"cyan"}).start();try{let n=process.platform==="darwin",r=process.platform==="linux",i=process.platform==="win32",a;if(n){let s=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let l of s)try{let{existsSync:p}=await import("fs");if(p(l)){a=`open "${l}" --args --server`;break}}catch{}if(a?.startsWith("open")){await k("open",[s.find(l=>{try{let{existsSync:p}=ie("fs");return p(l)}catch{return!1}})||"/Applications/LM Studio.app","--args","--server"],{detached:!0,stdio:"ignore"}),o.succeed("LM Studio server started"),await this.waitForServer(6e4);return}}else r?a=await this.findLinuxBinary():i&&(a=await this.findWindowsExecutable());if(!a)throw o.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await k(a,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(c.get("lmStudioPort"))}}),o.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(n){throw o.fail(`Failed to start LM Studio: ${n instanceof Error?n.message:"Unknown error"}`),n}}async findLinuxBinary(){let e=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let o of e)try{return await k("test",["-x",o]),o}catch{continue}}async findWindowsExecutable(){let e=process.env.LOCALAPPDATA,o=process.env.PROGRAMFILES,n=[e?`${e}\\Programs\\LM Studio\\lm-studio.exe`:"",o?`${o}\\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(e=6e4){let o=Date.now();for(;Date.now()-o<e;){if(await this.checkStatus())return!0;await this.sleep(2e3)}return!1}sleep(e){return new Promise(o=>setTimeout(o,e))}async findAvailablePort(){for(let e of J)try{if((await fetch(`http://localhost:${e}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return e}catch{return c.set("lmStudioPort",e),e}return J[0]??1234}},g=new I});var oe={};A(oe,{ClaudeService:()=>U,claudeService:()=>P});import{execa as _}from"execa";import le from"chalk";var U,P,F=O(()=>{"use strict";U=class{async isClaudeCodeInstalled(){try{return await _("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:o,args:n=[],verbose:r=!1}=e,i=this.extractProvider(o),a=this.extractModelName(o);if(!i||!a)throw new Error(`Invalid model format: ${o}. Expected format: provider/model-name`);let s=`${i}/${a}`,l=["--model",s,...n];r&&console.log(le.dim(`
3
3
  Running: claude ${l.join(" ")}
4
- `));try{await _("claude",l,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:s}})}catch(m){if(m instanceof Error&&"exitCode"in m){let P=m.exitCode;process.exit(P??1)}throw m}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let t=e.split("/");if(!(t.length<2))return t.slice(1).join("/")}async getVersion(){try{return(await _("claude",["--version"])).stdout}catch{return}}},R=new N});var te={};L(te,{OpenCodeService:()=>U,openCodeService:()=>z});import{execa as B}from"execa";import de from"chalk";var U,z,q=b(()=>{"use strict";U=class{async isOpenCodeInstalled(){try{return await B("opencode",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:t,args:n=[],verbose:r=!1}=e,i=this.extractProvider(t),a=this.extractModelName(t);if(!i||!a)throw new Error(`Invalid model format: ${t}. Expected format: provider/model-name`);let s=["--model",t,...n];r&&console.log(de.dim(`
4
+ `));try{await _("claude",l,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:s}})}catch(p){if(p instanceof Error&&"exitCode"in p){let L=p.exitCode;process.exit(L??1)}throw p}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let o=e.split("/");if(!(o.length<2))return o.slice(1).join("/")}async getVersion(){try{return(await _("claude",["--version"])).stdout}catch{return}}},P=new U});var te={};A(te,{OpenCodeService:()=>z,openCodeService:()=>$});import{execa as q}from"execa";import de from"chalk";var z,$,B=O(()=>{"use strict";z=class{async isOpenCodeInstalled(){try{return await q("opencode",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:o,args:n=[],verbose:r=!1}=e,i=this.extractProvider(o),a=this.extractModelName(o);if(!i||!a)throw new Error(`Invalid model format: ${o}. Expected format: provider/model-name`);let s=["--model",o,...n];r&&console.log(de.dim(`
5
5
  Running: opencode ${s.join(" ")}
6
- `));try{await B("opencode",s,{stdio:"inherit",env:{...process.env,OPENCODE_MODEL_NAME:a,OPENCODE_MODEL_PROVIDER:i}})}catch(l){if(l instanceof Error&&"exitCode"in l){let m=l.exitCode;process.exit(m??1)}throw l}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let t=e.split("/");if(!(t.length<2))return t.slice(1).join("/")}async getVersion(){try{return(await B("opencode",["--version"])).stdout}catch{return}}},z=new U});import{Command as ce}from"commander";import u from"chalk";x();M();import Z from"ora";import h from"chalk";import ee from"inquirer";import X from"inquirer";async function k(o,e){let t=o.map(i=>({name:`${i.name} (${i.id})`,value:i,short:i.name})),n=e?t.findIndex(i=>i.value.id===e):0;return(await X.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:t,default:Math.max(0,n),pageSize:Math.min(o.length,15)}])).model}async function I(o,e=!0){return(await X.prompt([{type:"confirm",name:"confirm",message:o,default:e}])).confirm}import Y from"chalk";function D(o){if(o===0)return"0 B";let e=1024,t=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(o)/Math.log(e));return`${parseFloat((o/Math.pow(e,n)).toFixed(2))} ${t[n]}`}function C(o){console.log(Y.green("\u2713")+" "+o)}function ae(o){console.error(Y.red("\u2717")+" "+o)}function v(o,e=1){ae(o),process.exit(e)}async function j(o={}){let e;if(o.provider)e=o.provider;else{let p=c.getDefaultProvider(),{providerSelection:w}=await ee.prompt([{type:"list",name:"providerSelection",message:"Select provider:",default:p,choices:[{name:"Claude Code",value:"claude"},{name:"OpenCode",value:"opencode"}]}]);e=w;let{saveDefault:g}=await ee.prompt([{type:"confirm",name:"saveDefault",message:"Save as default provider?",default:!1}]);g&&(c.setDefaultProvider(e),C(`Default provider set to ${h.cyan(e)}`))}let t=Z({text:"Checking LM Studio status...",color:"cyan"}).start(),n=await f.checkStatus();n||(t.info("LM Studio server not running"),t.stop(),await I("Would you like to start the LM Studio server?")||v("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await f.startServer(),n=!0),t.succeed("Connected to LM Studio");let r=Z({text:"Fetching available models...",color:"cyan"}).start(),i=await f.getAvailableModels();i.length===0&&(r.fail("No models found. Download some models in LM Studio first."),v("No models available")),r.succeed(`Found ${h.bold(i.length)} model${i.length===1?"":"s"}`),console.log(),console.log(h.bold("Available Models:")),console.log(h.dim("\u2500".repeat(process.stdout.columns||80))),i.forEach((p,w)=>{let g=D(p.size),S=p.loaded?h.green(" [LOADED]"):"";console.log(` ${h.dim(String(w+1).padStart(2))}. ${p.name} ${h.dim(`(${g})`)}${S}`)}),console.log();let a=c.getLastUsedModel(),s=o.model,l=s?i.find(p=>p.id===s||p.name.includes(s)):await k(i,a);l||v("No model selected"),await f.loadModel(l.id,t);let m=l.id.replace("/","--"),P=e==="opencode"?"OpenCode":"Claude Code";C(h.bold(`
7
- Model ready: ${l.name}`)),console.log(),console.log(`Run ${P} with this model:`),console.log(` ${h.cyan((e==="opencode"?"opencode":"claude")+" --model lmstudio/"+m)}`),console.log(),console.log(`Or use ${h.cyan("aix-cli run")} to start an interactive session`)}x();F();q();M();import T from"ora";import re from"chalk";async function G(o={}){let e=o.provider??c.getDefaultProvider(),t=T({text:`Checking ${e==="opencode"?"OpenCode":"Claude Code"} installation...`,color:"cyan"}).start();(e==="opencode"?await z.isOpenCodeInstalled():await R.isClaudeCodeInstalled())||(t.fail(`${e==="opencode"?"OpenCode":"Claude Code"} is not installed.`),v(`Please install ${e==="opencode"?"OpenCode":"Claude Code"} first.`)),t.succeed(`${e==="opencode"?"OpenCode":"Claude Code"} is installed`);let r=T({text:"Checking LM Studio status...",color:"cyan"}).start(),i=await f.checkStatus();i||(r.info("LM Studio server not running"),r.stop(),await I("Would you like to start the LM Studio server?")||v("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await f.startServer(),i=!0),r.succeed("Connected to LM Studio");let a=T({text:"Fetching available models...",color:"cyan"}).start(),s=await f.getAvailableModels();s.length===0&&(a.fail("No models found. Download some models in LM Studio first."),v("No models available")),a.stop();let l;if(o.model){let g=s.find(S=>S.id===o.model||S.name.toLowerCase().includes(o.model.toLowerCase()));g||v(`Model "${o.model}" not found. Available models: ${s.map(S=>S.name).join(", ")}`),l=g.id}else{let g=c.getLastUsedModel();l=(await k(s,g)).id}let m=T({text:`Loading model: ${re.cyan(l)}`,color:"cyan"}).start();await f.loadModel(l,m);let p=`lmstudio/${l.replace("/","--")}`,w=e==="opencode"?"OpenCode":"Claude Code";C(re.green(`
8
- Starting ${w} with model: ${p}
9
- `));try{e==="opencode"?await z.run({model:p,args:o.args??[],verbose:o.verbose}):await R.run({model:p,args:o.args??[],verbose:o.verbose})}catch(g){v(`Failed to run ${w}: ${g instanceof Error?g.message:"Unknown error"}`)}}x();import d from"chalk";async function K(){let o=await f.getStatus();console.log(),console.log(d.bold("LM Studio Status")),console.log(d.dim("\u2500".repeat(50))),console.log(` ${o.running?d.green("\u25CF"):d.red("\u25CB")} Server: ${o.running?d.green("Running"):d.red("Stopped")}`),console.log(` ${d.dim("\u25B8")} Port: ${d.cyan(String(o.port))}`),console.log(` ${d.dim("\u25B8")} URL: ${d.cyan(`http://localhost:${o.port}`)}`),o.activeModel?console.log(` ${d.dim("\u25B8")} Active Model: ${d.green(o.activeModel)}`):console.log(` ${d.dim("\u25B8")} Active Model: ${d.dim("None")}`),console.log(),console.log(d.bold("Models")),console.log(d.dim("\u2500".repeat(50))),o.models.length===0?console.log(` ${d.dim("No models available")}`):o.models.forEach((e,t)=>{let n=D(e.size),r=e.id===o.activeModel?` ${d.green("[LOADED]")}`:"";console.log(` ${d.dim(String(t+1)+".")} ${e.name}${r}`),console.log(` ${d.dim("ID:")} ${e.id}`),console.log(` ${d.dim("Size:")} ${n}`),e.quantization&&console.log(` ${d.dim("Quantization:")} ${e.quantization}`),console.log()})}var y=new ce;y.name("aix-cli").description("AI CLI tool that integrates LM Studio with Claude Code or OpenCode for local AI-powered development").version("2.0.0").showHelpAfterError();function $(o=0){console.log(),console.log(u.dim(o===0?"\u{1F44B} Goodbye!":"\u274C Cancelled.")),process.exit(o)}process.on("SIGINT",()=>$(0));process.on("SIGTERM",()=>$(0));process.on("uncaughtException",o=>{o.message?.includes("ExitPromptError")||o.message?.includes("User force closed")||o.message?.includes("prompt")?$(0):(console.error(u.red("Error:"),o.message),process.exit(1))});process.on("unhandledRejection",o=>{let e=String(o);(e.includes("ExitPromptError")||e.includes("User force closed")||e.includes("prompt"))&&$(0)});y.command("init",{isDefault:!1}).aliases(["i","load"]).description("Initialize and load a model into LM Studio").option("-m, --model <name>","Model name or ID to load","").option("-p, --provider <provider>","Provider to use (claude or opencode)","").action(j);y.command("run",{isDefault:!1}).aliases(["r"]).description("Run Claude Code or OpenCode with a model from LM Studio").option("-m, --model <name>","Model name or ID to use","").option("-p, --provider <provider>","Provider to use (claude or opencode)","").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for the provider").action(async(o,e)=>{await G({...e,args:o})});y.command("status",{isDefault:!1}).aliases(["s","stats"]).description("Show LM Studio status and available models").action(K);y.command("doctor",{isDefault:!1}).aliases(["d","check"]).description("Check system requirements and configuration").action(async()=>{let{lmStudioService:o}=await Promise.resolve().then(()=>(x(),Q)),{claudeService:e}=await Promise.resolve().then(()=>(F(),oe)),{openCodeService:t}=await Promise.resolve().then(()=>(q(),te)),{configService:n}=await Promise.resolve().then(()=>(M(),W));console.log(u.bold.cyan("\u{1F527} AIX CLI System Check")),console.log(u.dim("\u2500".repeat(40)));let r=await o.checkStatus(),i=await e.isClaudeCodeInstalled(),a=await t.isOpenCodeInstalled(),s=n.getDefaultProvider(),l=n.get("lmStudioPort");console.log(),console.log(`${r?"\u2705":"\u26A0\uFE0F"} LM Studio: ${r?u.green("Running"):u.yellow("Not running")}`),console.log(`${i?"\u2705":"\u274C"} Claude Code: ${i?u.green("Installed"):u.red("Not installed")}`),console.log(`${a?"\u2705":"\u274C"} OpenCode: ${a?u.green("Installed"):u.red("Not installed")}`),console.log(`\u{1F310} Server: ${u.cyan(`http://localhost:${l}`)}`),console.log(`\u{1F4CC} Default provider: ${u.cyan(s)}`),(!i||!a||!r)&&(console.log(),console.log(u.bold("\u{1F4CB} Next Steps:")),i||console.log(` 1. ${u.cyan("npm install -g @anthropic-ai/claude-code")}`),a||console.log(` 2. ${u.cyan("npm install -g opencode")}`),r||console.log(" 3. Open LM Studio and start the server")),console.log(),console.log(u.dim("\u{1F4D6} Docs: ")+u.cyan("https://lmstudio.ai"))});y.parse();
6
+ `));try{await q("opencode",s,{stdio:"inherit",env:{...process.env,OPENCODE_MODEL_NAME:a,OPENCODE_MODEL_PROVIDER:i}})}catch(l){if(l instanceof Error&&"exitCode"in l){let p=l.exitCode;process.exit(p??1)}throw l}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let o=e.split("/");if(!(o.length<2))return o.slice(1).join("/")}async getVersion(){try{return(await q("opencode",["--version"])).stdout}catch{return}}},$=new z});import{Command as me}from"commander";import u from"chalk";C();M();import Z from"ora";import h from"chalk";import ee from"inquirer";import X from"inquirer";async function D(t,e){let o=t.map(i=>({name:`${i.name} (${i.id})`,value:i,short:i.name})),n=e?o.findIndex(i=>i.value.id===e):0;return(await X.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:o,default:Math.max(0,n),pageSize:Math.min(t.length,15)}])).model}async function N(t,e=!0){return(await X.prompt([{type:"confirm",name:"confirm",message:t,default:e}])).confirm}import Y from"chalk";function R(t){if(t===0)return"0 B";let e=1024,o=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(t)/Math.log(e));return`${parseFloat((t/Math.pow(e,n)).toFixed(2))} ${o[n]}`}function x(t){console.log(Y.green("\u2713")+" "+t)}function ae(t){console.error(Y.red("\u2717")+" "+t)}function v(t,e=1){ae(t),process.exit(e)}async function j(t={}){let e;if(t.provider)e=t.provider;else{let f=c.getDefaultProvider(),{providerSelection:w}=await ee.prompt([{type:"list",name:"providerSelection",message:"Select provider:",default:f,choices:[{name:"Claude Code",value:"claude"},{name:"OpenCode",value:"opencode"}]}]);e=w;let{saveDefault:m}=await ee.prompt([{type:"confirm",name:"saveDefault",message:"Save as default provider?",default:!1}]);m&&(c.setDefaultProvider(e),x(`Default provider set to ${h.cyan(e)}`))}let o=Z({text:"Checking LM Studio status...",color:"cyan"}).start(),n=await g.checkStatus();n||(o.info("LM Studio server not running"),o.stop(),await N("Would you like to start the LM Studio server?")||v("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),n=!0),o.succeed("Connected to LM Studio");let r=Z({text:"Fetching available models...",color:"cyan"}).start(),i=await g.getAvailableModels();i.length===0&&(r.fail("No models found. Download some models in LM Studio first."),v("No models available")),r.succeed(`Found ${h.bold(i.length)} model${i.length===1?"":"s"}`),console.log(),console.log(h.bold("Available Models:")),console.log(h.dim("\u2500".repeat(process.stdout.columns||80))),i.forEach((f,w)=>{let m=R(f.size),S=f.loaded?h.green(" [LOADED]"):"";console.log(` ${h.dim(String(w+1).padStart(2))}. ${f.name} ${h.dim(`(${m})`)}${S}`)}),console.log();let a=c.getLastUsedModel(),s=t.model,l=s?i.find(f=>f.id===s||f.name.includes(s)):await D(i,a);l||v("No model selected"),await g.loadModel(l.id,o);let p=l.id.replace("/","--"),L=e==="opencode"?"OpenCode":"Claude Code";x(h.bold(`
7
+ Model ready: ${l.name}`)),console.log(),console.log(`Run ${L} with this model:`),console.log(` ${h.cyan((e==="opencode"?"opencode":"claude")+" --model lmstudio/"+p)}`),console.log(),console.log(`Or use ${h.cyan("aix-cli run")} to start an interactive session`)}C();F();B();M();import T from"ora";import re from"chalk";import ce from"inquirer";async function ue(){let t=await P.isClaudeCodeInstalled(),e=await $.isOpenCodeInstalled(),o=[];if(t&&o.push({name:"Claude Code",value:"claude"}),e&&o.push({name:"OpenCode",value:"opencode"}),o.length===0&&v("Neither Claude Code nor OpenCode is installed."),o.length===1)return o[0].value;let{providerSelection:n}=await ce.prompt([{type:"list",name:"providerSelection",message:"Select coding tool:",choices:o}]);return n}async function G(t={}){let e;if(t.provider)e=t.provider;else{let m=c.getDefaultProvider();m?e=m:e=await ue()}let o=T({text:`Checking ${e==="opencode"?"OpenCode":"Claude Code"} installation...`,color:"cyan"}).start();(e==="opencode"?await $.isOpenCodeInstalled():await P.isClaudeCodeInstalled())||(o.fail(`${e==="opencode"?"OpenCode":"Claude Code"} is not installed.`),v(`Please install ${e==="opencode"?"OpenCode":"Claude Code"} first.`)),o.succeed(`${e==="opencode"?"OpenCode":"Claude Code"} is installed`);let r=T({text:"Checking LM Studio status...",color:"cyan"}).start(),i=await g.checkStatus();i||(r.info("LM Studio server not running"),r.stop(),await N("Would you like to start the LM Studio server?")||v("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),i=!0),r.succeed("Connected to LM Studio");let a=T({text:"Fetching available models...",color:"cyan"}).start(),s=await g.getAvailableModels();s.length===0&&(a.fail("No models found. Download some models in LM Studio first."),v("No models available")),a.stop();let l;if(t.model){let m=s.find(S=>S.id===t.model||S.name.toLowerCase().includes(t.model.toLowerCase()));m||v(`Model "${t.model}" not found. Available models: ${s.map(S=>S.name).join(", ")}`),l=m.id}else{let m=c.getLastUsedModel();l=(await D(s,m)).id}let p=T({text:`Loading model: ${re.cyan(l)}`,color:"cyan"}).start();await g.loadModel(l,p);let f=`lmstudio/${l.replace("/","--")}`,w=e==="opencode"?"OpenCode":"Claude Code";x(re.green(`
8
+ Starting ${w} with model: ${f}
9
+ `));try{e==="opencode"?await $.run({model:f,args:t.args??[],verbose:t.verbose}):await P.run({model:f,args:t.args??[],verbose:t.verbose})}catch(m){v(`Failed to run ${w}: ${m instanceof Error?m.message:"Unknown error"}`)}}C();import d from"chalk";async function K(){let t=await g.getStatus();console.log(),console.log(d.bold("LM Studio Status")),console.log(d.dim("\u2500".repeat(50))),console.log(` ${t.running?d.green("\u25CF"):d.red("\u25CB")} Server: ${t.running?d.green("Running"):d.red("Stopped")}`),console.log(` ${d.dim("\u25B8")} Port: ${d.cyan(String(t.port))}`),console.log(` ${d.dim("\u25B8")} URL: ${d.cyan(`http://localhost:${t.port}`)}`),t.activeModel?console.log(` ${d.dim("\u25B8")} Active Model: ${d.green(t.activeModel)}`):console.log(` ${d.dim("\u25B8")} Active Model: ${d.dim("None")}`),console.log(),console.log(d.bold("Models")),console.log(d.dim("\u2500".repeat(50))),t.models.length===0?console.log(` ${d.dim("No models available")}`):t.models.forEach((e,o)=>{let n=R(e.size),r=e.id===t.activeModel?` ${d.green("[LOADED]")}`:"";console.log(` ${d.dim(String(o+1)+".")} ${e.name}${r}`),console.log(` ${d.dim("ID:")} ${e.id}`),console.log(` ${d.dim("Size:")} ${n}`),e.quantization&&console.log(` ${d.dim("Quantization:")} ${e.quantization}`),console.log()})}var y=new me;y.name("aix-cli").description("AI CLI tool that integrates LM Studio with Claude Code or OpenCode for local AI-powered development").version("2.0.0").showHelpAfterError();function b(t=0){console.log(),console.log(u.dim(t===0?"\u{1F44B} Goodbye!":"\u274C Cancelled.")),process.exit(t)}process.on("SIGINT",()=>b(0));process.on("SIGTERM",()=>b(0));process.on("uncaughtException",t=>{t.message?.includes("ExitPromptError")||t.message?.includes("User force closed")||t.message?.includes("prompt")?b(0):(console.error(u.red("Error:"),t.message),process.exit(1))});process.on("unhandledRejection",t=>{let e=String(t);(e.includes("ExitPromptError")||e.includes("User force closed")||e.includes("prompt"))&&b(0)});y.command("init",{isDefault:!1}).aliases(["i","load"]).description("Initialize and load a model into LM Studio").option("-m, --model <name>","Model name or ID to load","").option("-p, --provider <provider>","Provider to use (claude or opencode)","").action(j);y.command("run",{isDefault:!1}).aliases(["r"]).description("Run Claude Code or OpenCode with a model from LM Studio").option("-m, --model <name>","Model name or ID to use","").option("-p, --provider <provider>","Provider to use (claude or opencode)","").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for the provider").action(async(t,e)=>{await G({...e,args:t})});y.command("status",{isDefault:!1}).aliases(["s","stats"]).description("Show LM Studio status and available models").action(K);y.command("doctor",{isDefault:!1}).aliases(["d","check"]).description("Check system requirements and configuration").action(async()=>{let{lmStudioService:t}=await Promise.resolve().then(()=>(C(),Q)),{claudeService:e}=await Promise.resolve().then(()=>(F(),oe)),{openCodeService:o}=await Promise.resolve().then(()=>(B(),te)),{configService:n}=await Promise.resolve().then(()=>(M(),W));console.log(u.bold.cyan("\u{1F527} AIX CLI System Check")),console.log(u.dim("\u2500".repeat(40)));let r=await t.checkStatus(),i=await e.isClaudeCodeInstalled(),a=await o.isOpenCodeInstalled(),s=n.getDefaultProvider(),l=n.get("lmStudioPort");console.log(),console.log(`${r?"\u2705":"\u26A0\uFE0F"} LM Studio: ${r?u.green("Running"):u.yellow("Not running")}`),console.log(`${i?"\u2705":"\u274C"} Claude Code: ${i?u.green("Installed"):u.red("Not installed")}`),console.log(`${a?"\u2705":"\u274C"} OpenCode: ${a?u.green("Installed"):u.red("Not installed")}`),console.log(`\u{1F310} Server: ${u.cyan(`http://localhost:${l}`)}`),console.log(`\u{1F4CC} Default provider: ${u.cyan(s)}`),(!i||!a||!r)&&(console.log(),console.log(u.bold("\u{1F4CB} Next Steps:")),i||console.log(` 1. ${u.cyan("npm install -g @anthropic-ai/claude-code")}`),a||console.log(` 2. ${u.cyan("npm install -g opencode")}`),r||console.log(" 3. Open LM Studio and start the server")),console.log(),console.log(u.dim("\u{1F4D6} Docs: ")+u.cyan("https://lmstudio.ai"))});y.parse();
10
10
  //# 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/services/opencode.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, Provider } 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 defaultProvider: 'claude',\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 setDefaultProvider(provider: Provider): void {\n this.store.set('defaultProvider', provider);\n }\n\n getDefaultProvider(): Provider {\n return this.store.get('defaultProvider') ?? 'claude';\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 const endpoints = ['/api/v1/models', '/api/models', '/v1/models', '/api/ls-model/list'];\n\n for (const endpoint of endpoints) {\n try {\n const response = await fetch(this.getApiUrl(endpoint), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) continue;\n\n const json = (await response.json()) as Record<string, unknown>;\n\n let models: unknown[] = [];\n\n // Try different response formats\n if (Array.isArray(json)) {\n models = json;\n } else if (json.models && Array.isArray(json.models)) {\n models = json.models;\n } else if (json.data && Array.isArray(json.data)) {\n models = json.data;\n }\n\n return (models as Record<string, unknown>[])\n .map((m) => {\n const model = m as Record<string, unknown>;\n return {\n id: String(model.key || model.id || model.model || ''),\n name: String(model.display_name || model.name || model.id || model.model || ''),\n size: Number(model.size_bytes || model.size || model.file_size || 0),\n quantization: String(\n model.quantization\n ? typeof model.quantization === 'object'\n ? (model.quantization as Record<string, unknown>).name\n : model.quantization\n : ''\n ),\n };\n })\n .filter((m) => m.id && m.name);\n } catch {\n continue;\n }\n }\n\n return [];\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", "import { execa } from 'execa';\nimport chalk from 'chalk';\n\nexport interface OpenCodeOptions {\n model: string;\n args?: string[];\n verbose?: boolean;\n}\n\nexport class OpenCodeService {\n async isOpenCodeInstalled(): Promise<boolean> {\n try {\n await execa('opencode', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async run(options: OpenCodeOptions): 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 openCodeArgs = ['--model', model, ...args];\n\n if (verbose) {\n console.log(chalk.dim(`\\nRunning: opencode ${openCodeArgs.join(' ')}\\n`));\n }\n\n try {\n await execa('opencode', openCodeArgs, {\n stdio: 'inherit',\n env: {\n ...process.env,\n OPENCODE_MODEL_NAME: modelName,\n OPENCODE_MODEL_PROVIDER: provider,\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('opencode', ['--version']);\n return result.stdout;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const openCodeService = new OpenCodeService();\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-cli')\n .description(\n 'AI CLI tool that integrates LM Studio with Claude Code or OpenCode for local AI-powered development'\n )\n .version('2.0.0')\n .showHelpAfterError();\n\nfunction handleExit(code: number = 0) {\n console.log();\n console.log(chalk.dim(code === 0 ? '\uD83D\uDC4B Goodbye!' : '\u274C Cancelled.'));\n process.exit(code);\n}\n\nprocess.on('SIGINT', () => handleExit(0));\nprocess.on('SIGTERM', () => handleExit(0));\n\nprocess.on('uncaughtException', (err) => {\n if (err.message?.includes('ExitPromptError') || err.message?.includes('User force closed')) {\n handleExit(0);\n } else if (err.message?.includes('prompt')) {\n handleExit(0);\n } else {\n console.error(chalk.red('Error:'), err.message);\n process.exit(1);\n }\n});\n\nprocess.on('unhandledRejection', (reason) => {\n const r = String(reason);\n if (r.includes('ExitPromptError') || r.includes('User force closed') || r.includes('prompt')) {\n handleExit(0);\n }\n});\n\nprogram\n .command('init', { isDefault: false })\n .aliases(['i', 'load'])\n .description('Initialize and load a model into LM Studio')\n .option('-m, --model <name>', 'Model name or ID to load', '')\n .option('-p, --provider <provider>', 'Provider to use (claude or opencode)', '')\n .action(initCommand);\n\nprogram\n .command('run', { isDefault: false })\n .aliases(['r'])\n .description('Run Claude Code or OpenCode with a model from LM Studio')\n .option('-m, --model <name>', 'Model name or ID to use', '')\n .option('-p, --provider <provider>', 'Provider to use (claude or opencode)', '')\n .option('-v, --verbose', 'Show verbose output')\n .argument('[args...]', 'Additional arguments for the provider')\n .action(async (args: string[], options: Record<string, unknown>) => {\n await runCommand({\n ...options,\n args,\n });\n });\n\nprogram\n .command('status', { isDefault: false })\n .aliases(['s', 'stats'])\n .description('Show LM Studio status and available models')\n .action(statusCommand);\n\nprogram\n .command('doctor', { isDefault: false })\n .aliases(['d', 'check'])\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 { openCodeService } = await import('./services/opencode.js');\n const { configService } = await import('./services/config.js');\n\n console.log(chalk.bold.cyan('\uD83D\uDD27 AIX CLI System Check'));\n console.log(chalk.dim('\u2500'.repeat(40)));\n\n const lmStudioRunning = await lmStudioService.checkStatus();\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n const openCodeInstalled = await openCodeService.isOpenCodeInstalled();\n const defaultProvider = configService.getDefaultProvider();\n const port = configService.get('lmStudioPort');\n\n console.log();\n console.log(\n `${lmStudioRunning ? '\u2705' : '\u26A0\uFE0F'} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')}`\n );\n console.log(\n `${claudeInstalled ? '\u2705' : '\u274C'} Claude Code: ${claudeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n console.log(\n `${openCodeInstalled ? '\u2705' : '\u274C'} OpenCode: ${openCodeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n console.log(`\uD83C\uDF10 Server: ${chalk.cyan(`http://localhost:${port}`)}`);\n console.log(`\uD83D\uDCCC Default provider: ${chalk.cyan(defaultProvider)}`);\n\n if (!claudeInstalled || !openCodeInstalled || !lmStudioRunning) {\n console.log();\n console.log(chalk.bold('\uD83D\uDCCB Next Steps:'));\n if (!claudeInstalled) {\n console.log(` 1. ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n }\n if (!openCodeInstalled) {\n console.log(` 2. ${chalk.cyan('npm install -g opencode')}`);\n }\n if (!lmStudioRunning) {\n console.log(` 3. Open LM Studio and start the server`);\n }\n }\n\n console.log();\n console.log(chalk.dim('\uD83D\uDCD6 Docs: ') + chalk.cyan('https://lmstudio.ai'));\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\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, Provider } from '../types/index.js';\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n let provider: Provider;\n\n if (options.provider) {\n provider = options.provider;\n } else {\n const defaultProvider = configService.getDefaultProvider();\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select provider:',\n default: defaultProvider,\n choices: [\n { name: 'Claude Code', value: 'claude' as Provider },\n { name: 'OpenCode', value: 'opencode' as Provider },\n ],\n },\n ]);\n provider = providerSelection;\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default provider?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultProvider(provider);\n success(`Default provider set to ${chalk.cyan(provider)}`);\n }\n }\n\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 const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n\n success(chalk.bold(`\\nModel ready: ${selectedModel.name}`));\n console.log();\n console.log(`Run ${providerName} with this model:`);\n console.log(\n ` ${chalk.cyan((provider === 'opencode' ? 'opencode' : 'claude') + ' --model lmstudio/' + modelIdentifier)}`\n );\n console.log();\n console.log(`Or use ${chalk.cyan('aix-cli 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 { openCodeService } from '../services/opencode.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { exitWithError, success } from '../utils/format.js';\nimport type { Provider } from '../types/index.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n provider?: Provider;\n}\n\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n const provider = options.provider ?? configService.getDefaultProvider();\n\n const providerSpinner = ora({\n text: `Checking ${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} installation...`,\n color: 'cyan',\n }).start();\n\n const isInstalled =\n provider === 'opencode'\n ? await openCodeService.isOpenCodeInstalled()\n : await claudeService.isClaudeCodeInstalled();\n\n if (!isInstalled) {\n providerSpinner.fail(\n `${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} is not installed.`\n );\n exitWithError(`Please install ${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} first.`);\n }\n\n providerSpinner.succeed(`${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} is installed`);\n\n const serverSpinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n serverSpinner.info('LM Studio server not running');\n serverSpinner.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 serverSpinner.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.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 const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n success(chalk.green(`\\nStarting ${providerName} with model: ${fullModelName}\\n`));\n\n try {\n if (provider === 'opencode') {\n await openCodeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n } else {\n await claudeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to run ${providerName}: ${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", "provider", "host", "port", "lmstudio_exports", "__export", "LMStudioService", "lmStudioService", "execa", "ora", "chalk", "LMSTUDIO_PORTS", "init_lmstudio", "__esmMin", "init_config", "configService", "path", "endpoints", "endpoint", "response", "json", "models", "m", "model", "data", "modelId", "spinner", "loadSpinner", "error", "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", "opencode_exports", "__export", "OpenCodeService", "openCodeService", "execa", "chalk", "init_opencode", "__esmMin", "options", "model", "args", "verbose", "provider", "modelName", "openCodeArgs", "error", "exitCode", "parts", "Command", "chalk", "init_lmstudio", "init_config", "ora", "chalk", "inquirer", "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", "provider", "defaultProvider", "configService", "providerSelection", "inquirer", "saveDefault", "success", "chalk", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "modelSearch", "selectedModel", "m", "selectModel", "modelIdentifier", "providerName", "init_lmstudio", "init_claude", "init_opencode", "init_config", "ora", "chalk", "runCommand", "options", "provider", "configService", "providerSpinner", "ora", "openCodeService", "claudeService", "exitWithError", "serverSpinner", "isRunning", "lmStudioService", "confirmAction", "modelsSpinner", "models", "selectedModelId", "foundModel", "m", "lastUsedModel", "selectModel", "loadSpinner", "chalk", "fullModelName", "providerName", "success", "error", "init_lmstudio", "chalk", "statusCommand", "status", "lmStudioService", "chalk", "model", "index", "size", "formatBytes", "loaded", "program", "Command", "handleExit", "code", "chalk", "err", "reason", "r", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "claudeService", "openCodeService", "configService", "lmStudioRunning", "claudeInstalled", "openCodeInstalled", "defaultProvider", "port"]
4
+ "sourcesContent": ["import Conf from 'conf';\nimport type { Config, Provider } 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 setDefaultProvider(provider: Provider): void {\n this.store.set('defaultProvider', provider);\n }\n\n getDefaultProvider(): Provider | undefined {\n const stored = this.store.get('defaultProvider');\n return stored as Provider | undefined;\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 const endpoints = ['/api/v1/models', '/api/models', '/v1/models', '/api/ls-model/list'];\n\n for (const endpoint of endpoints) {\n try {\n const response = await fetch(this.getApiUrl(endpoint), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) continue;\n\n const json = (await response.json()) as Record<string, unknown>;\n\n let models: unknown[] = [];\n\n // Try different response formats\n if (Array.isArray(json)) {\n models = json;\n } else if (json.models && Array.isArray(json.models)) {\n models = json.models;\n } else if (json.data && Array.isArray(json.data)) {\n models = json.data;\n }\n\n return (models as Record<string, unknown>[])\n .map((m) => {\n const model = m as Record<string, unknown>;\n return {\n id: String(model.key || model.id || model.model || ''),\n name: String(model.display_name || model.name || model.id || model.model || ''),\n size: Number(model.size_bytes || model.size || model.file_size || 0),\n quantization: String(\n model.quantization\n ? typeof model.quantization === 'object'\n ? (model.quantization as Record<string, unknown>).name\n : model.quantization\n : ''\n ),\n };\n })\n .filter((m) => m.id && m.name);\n } catch {\n continue;\n }\n }\n\n return [];\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", "import { execa } from 'execa';\nimport chalk from 'chalk';\n\nexport interface OpenCodeOptions {\n model: string;\n args?: string[];\n verbose?: boolean;\n}\n\nexport class OpenCodeService {\n async isOpenCodeInstalled(): Promise<boolean> {\n try {\n await execa('opencode', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async run(options: OpenCodeOptions): 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 openCodeArgs = ['--model', model, ...args];\n\n if (verbose) {\n console.log(chalk.dim(`\\nRunning: opencode ${openCodeArgs.join(' ')}\\n`));\n }\n\n try {\n await execa('opencode', openCodeArgs, {\n stdio: 'inherit',\n env: {\n ...process.env,\n OPENCODE_MODEL_NAME: modelName,\n OPENCODE_MODEL_PROVIDER: provider,\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('opencode', ['--version']);\n return result.stdout;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const openCodeService = new OpenCodeService();\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-cli')\n .description(\n 'AI CLI tool that integrates LM Studio with Claude Code or OpenCode for local AI-powered development'\n )\n .version('2.0.0')\n .showHelpAfterError();\n\nfunction handleExit(code: number = 0) {\n console.log();\n console.log(chalk.dim(code === 0 ? '\uD83D\uDC4B Goodbye!' : '\u274C Cancelled.'));\n process.exit(code);\n}\n\nprocess.on('SIGINT', () => handleExit(0));\nprocess.on('SIGTERM', () => handleExit(0));\n\nprocess.on('uncaughtException', (err) => {\n if (err.message?.includes('ExitPromptError') || err.message?.includes('User force closed')) {\n handleExit(0);\n } else if (err.message?.includes('prompt')) {\n handleExit(0);\n } else {\n console.error(chalk.red('Error:'), err.message);\n process.exit(1);\n }\n});\n\nprocess.on('unhandledRejection', (reason) => {\n const r = String(reason);\n if (r.includes('ExitPromptError') || r.includes('User force closed') || r.includes('prompt')) {\n handleExit(0);\n }\n});\n\nprogram\n .command('init', { isDefault: false })\n .aliases(['i', 'load'])\n .description('Initialize and load a model into LM Studio')\n .option('-m, --model <name>', 'Model name or ID to load', '')\n .option('-p, --provider <provider>', 'Provider to use (claude or opencode)', '')\n .action(initCommand);\n\nprogram\n .command('run', { isDefault: false })\n .aliases(['r'])\n .description('Run Claude Code or OpenCode with a model from LM Studio')\n .option('-m, --model <name>', 'Model name or ID to use', '')\n .option('-p, --provider <provider>', 'Provider to use (claude or opencode)', '')\n .option('-v, --verbose', 'Show verbose output')\n .argument('[args...]', 'Additional arguments for the provider')\n .action(async (args: string[], options: Record<string, unknown>) => {\n await runCommand({\n ...options,\n args,\n });\n });\n\nprogram\n .command('status', { isDefault: false })\n .aliases(['s', 'stats'])\n .description('Show LM Studio status and available models')\n .action(statusCommand);\n\nprogram\n .command('doctor', { isDefault: false })\n .aliases(['d', 'check'])\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 { openCodeService } = await import('./services/opencode.js');\n const { configService } = await import('./services/config.js');\n\n console.log(chalk.bold.cyan('\uD83D\uDD27 AIX CLI System Check'));\n console.log(chalk.dim('\u2500'.repeat(40)));\n\n const lmStudioRunning = await lmStudioService.checkStatus();\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n const openCodeInstalled = await openCodeService.isOpenCodeInstalled();\n const defaultProvider = configService.getDefaultProvider();\n const port = configService.get('lmStudioPort');\n\n console.log();\n console.log(\n `${lmStudioRunning ? '\u2705' : '\u26A0\uFE0F'} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')}`\n );\n console.log(\n `${claudeInstalled ? '\u2705' : '\u274C'} Claude Code: ${claudeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n console.log(\n `${openCodeInstalled ? '\u2705' : '\u274C'} OpenCode: ${openCodeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n console.log(`\uD83C\uDF10 Server: ${chalk.cyan(`http://localhost:${port}`)}`);\n console.log(`\uD83D\uDCCC Default provider: ${chalk.cyan(defaultProvider)}`);\n\n if (!claudeInstalled || !openCodeInstalled || !lmStudioRunning) {\n console.log();\n console.log(chalk.bold('\uD83D\uDCCB Next Steps:'));\n if (!claudeInstalled) {\n console.log(` 1. ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n }\n if (!openCodeInstalled) {\n console.log(` 2. ${chalk.cyan('npm install -g opencode')}`);\n }\n if (!lmStudioRunning) {\n console.log(` 3. Open LM Studio and start the server`);\n }\n }\n\n console.log();\n console.log(chalk.dim('\uD83D\uDCD6 Docs: ') + chalk.cyan('https://lmstudio.ai'));\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\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, Provider } from '../types/index.js';\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n let provider: Provider;\n\n if (options.provider) {\n provider = options.provider;\n } else {\n const defaultProvider = configService.getDefaultProvider();\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select provider:',\n default: defaultProvider,\n choices: [\n { name: 'Claude Code', value: 'claude' as Provider },\n { name: 'OpenCode', value: 'opencode' as Provider },\n ],\n },\n ]);\n provider = providerSelection;\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default provider?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultProvider(provider);\n success(`Default provider set to ${chalk.cyan(provider)}`);\n }\n }\n\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 const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n\n success(chalk.bold(`\\nModel ready: ${selectedModel.name}`));\n console.log();\n console.log(`Run ${providerName} with this model:`);\n console.log(\n ` ${chalk.cyan((provider === 'opencode' ? 'opencode' : 'claude') + ' --model lmstudio/' + modelIdentifier)}`\n );\n console.log();\n console.log(`Or use ${chalk.cyan('aix-cli 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 inquirer from 'inquirer';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { claudeService } from '../services/claude.js';\nimport { openCodeService } from '../services/opencode.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { exitWithError, success } from '../utils/format.js';\nimport type { Provider } from '../types/index.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n provider?: Provider;\n}\n\nasync function selectProvider(): Promise<Provider> {\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n const openCodeInstalled = await openCodeService.isOpenCodeInstalled();\n\n const choices = [];\n if (claudeInstalled) {\n choices.push({ name: 'Claude Code', value: 'claude' as Provider });\n }\n if (openCodeInstalled) {\n choices.push({ name: 'OpenCode', value: 'opencode' as Provider });\n }\n\n if (choices.length === 0) {\n exitWithError('Neither Claude Code nor OpenCode is installed.');\n }\n\n if (choices.length === 1) {\n return choices[0]!.value;\n }\n\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select coding tool:',\n choices,\n },\n ]);\n\n return providerSelection;\n}\n\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n let provider: Provider;\n\n if (options.provider) {\n provider = options.provider;\n } else {\n const storedProvider = configService.getDefaultProvider();\n if (storedProvider) {\n provider = storedProvider;\n } else {\n provider = await selectProvider();\n }\n }\n\n const providerSpinner = ora({\n text: `Checking ${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} installation...`,\n color: 'cyan',\n }).start();\n\n const isInstalled =\n provider === 'opencode'\n ? await openCodeService.isOpenCodeInstalled()\n : await claudeService.isClaudeCodeInstalled();\n\n if (!isInstalled) {\n providerSpinner.fail(\n `${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} is not installed.`\n );\n exitWithError(`Please install ${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} first.`);\n }\n\n providerSpinner.succeed(`${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} is installed`);\n\n const serverSpinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n serverSpinner.info('LM Studio server not running');\n serverSpinner.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 serverSpinner.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.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 const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n success(chalk.green(`\\nStarting ${providerName} with model: ${fullModelName}\\n`));\n\n try {\n if (provider === 'opencode') {\n await openCodeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n } else {\n await claudeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to run ${providerName}: ${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", "provider", "host", "port", "lmstudio_exports", "__export", "LMStudioService", "lmStudioService", "execa", "ora", "chalk", "LMSTUDIO_PORTS", "init_lmstudio", "__esmMin", "init_config", "configService", "path", "endpoints", "endpoint", "response", "json", "models", "m", "model", "data", "modelId", "spinner", "loadSpinner", "error", "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", "opencode_exports", "__export", "OpenCodeService", "openCodeService", "execa", "chalk", "init_opencode", "__esmMin", "options", "model", "args", "verbose", "provider", "modelName", "openCodeArgs", "error", "exitCode", "parts", "Command", "chalk", "init_lmstudio", "init_config", "ora", "chalk", "inquirer", "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", "provider", "defaultProvider", "configService", "providerSelection", "inquirer", "saveDefault", "success", "chalk", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "modelSearch", "selectedModel", "m", "selectModel", "modelIdentifier", "providerName", "init_lmstudio", "init_claude", "init_opencode", "init_config", "ora", "chalk", "inquirer", "selectProvider", "claudeInstalled", "claudeService", "openCodeInstalled", "openCodeService", "choices", "exitWithError", "providerSelection", "inquirer", "runCommand", "options", "provider", "storedProvider", "configService", "providerSpinner", "ora", "serverSpinner", "isRunning", "lmStudioService", "confirmAction", "modelsSpinner", "models", "selectedModelId", "foundModel", "m", "lastUsedModel", "selectModel", "loadSpinner", "chalk", "fullModelName", "providerName", "success", "error", "init_lmstudio", "chalk", "statusCommand", "status", "lmStudioService", "chalk", "model", "index", "size", "formatBytes", "loaded", "program", "Command", "handleExit", "code", "chalk", "err", "reason", "r", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "claudeService", "openCodeService", "configService", "lmStudioRunning", "claudeInstalled", "openCodeInstalled", "defaultProvider", "port"]
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,wBAAsB,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAiHxE"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAkCD,wBAAsB,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA4HxE"}
@@ -7,7 +7,7 @@ export declare class ConfigService {
7
7
  setModel(model: string): void;
8
8
  getLastUsedModel(): string | undefined;
9
9
  setDefaultProvider(provider: Provider): void;
10
- getDefaultProvider(): Provider;
10
+ getDefaultProvider(): Provider | undefined;
11
11
  getLMStudioUrl(): string;
12
12
  reset(): void;
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE1D,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAe;;IAgB5B,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAI9C,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAItC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAI5C,kBAAkB,IAAI,QAAQ;IAI9B,cAAc,IAAI,MAAM;IAMxB,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/services/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE1D,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAe;;IAe5B,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAI9C,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAI3D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI7B,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAItC,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAI5C,kBAAkB,IAAI,QAAQ,GAAG,SAAS;IAK1C,cAAc,IAAI,MAAM;IAMxB,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
package/dist/src/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- var ne=Object.defineProperty;var ie=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});var b=(o,e)=>()=>(o&&(e=o(o=0)),e);var L=(o,e)=>{for(var t in e)ne(o,t,{get:e[t],enumerable:!0})};var W={};L(W,{ConfigService:()=>O,configService:()=>c});import se from"conf";var O,c,M=b(()=>{"use strict";O=class{store;constructor(){this.store=new se({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,defaultTimeout:3e4,autoStartServer:!1,defaultProvider:"claude"},clearInvalidConfig:!0})}get(e){return this.store.get(e)}set(e,t){this.store.set(e,t)}setModel(e){this.store.set("model",e)}getLastUsedModel(){return this.store.get("model")}setDefaultProvider(e){this.store.set("defaultProvider",e)}getDefaultProvider(){return this.store.get("defaultProvider")??"claude"}getLMStudioUrl(){let e=this.store.get("lmStudioUrl"),t=this.store.get("lmStudioPort");return`${e}:${t}`}reset(){this.store.clear()}},c=new O});var Q={};L(Q,{LMStudioService:()=>E,lmStudioService:()=>f});import{execa as A}from"execa";import H from"ora";import V from"chalk";var J,E,f,x=b(()=>{"use strict";M();J=[1234,1235,1236,1237],E=class{baseUrl;constructor(){this.baseUrl=c.getLMStudioUrl()}getApiUrl(e){return`${this.baseUrl}${e}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){let e=["/api/v1/models","/api/models","/v1/models","/api/ls-model/list"];for(let t of e)try{let n=await fetch(this.getApiUrl(t),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!n.ok)continue;let r=await n.json(),i=[];return Array.isArray(r)?i=r:r.models&&Array.isArray(r.models)?i=r.models:r.data&&Array.isArray(r.data)&&(i=r.data),i.map(a=>{let s=a;return{id:String(s.key||s.id||s.model||""),name:String(s.display_name||s.name||s.id||s.model||""),size:Number(s.size_bytes||s.size||s.file_size||0),quantization:String(s.quantization?typeof s.quantization=="object"?s.quantization.name:s.quantization:"")}}).filter(a=>a.id&&a.name)}catch{continue}return[]}async getStatus(){if(!await this.checkStatus())return{running:!1,port:c.get("lmStudioPort"),models:[]};try{let t=await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!t.ok)return{running:!1,port:c.get("lmStudioPort"),models:[]};let n=await t.json();return{running:!0,port:c.get("lmStudioPort"),models:n.models??[],activeModel:n.active_model}}catch{return{running:!1,port:c.get("lmStudioPort"),models:[]}}}async loadModel(e,t){let n=t??H({text:`Loading model: ${V.cyan(e)}`,color:"cyan"}).start();try{let r=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e}),signal:AbortSignal.timeout(3e5)});if(!r.ok)throw new Error(`Failed to load model: ${r.statusText}`);return n.succeed(`Model ${V.green(e)} loaded successfully`),c.setModel(e),{loadSpinner:n}}catch(r){throw n.fail(`Failed to load model: ${r instanceof Error?r.message:"Unknown error"}`),r}}async startServer(e){let t=e??H({text:"Starting LM Studio server...",color:"cyan"}).start();try{let n=process.platform==="darwin",r=process.platform==="linux",i=process.platform==="win32",a;if(n){let s=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let l of s)try{let{existsSync:m}=await import("fs");if(m(l)){a=`open "${l}" --args --server`;break}}catch{}if(a?.startsWith("open")){await A("open",[s.find(l=>{try{let{existsSync:m}=ie("fs");return m(l)}catch{return!1}})||"/Applications/LM Studio.app","--args","--server"],{detached:!0,stdio:"ignore"}),t.succeed("LM Studio server started"),await this.waitForServer(6e4);return}}else r?a=await this.findLinuxBinary():i&&(a=await this.findWindowsExecutable());if(!a)throw t.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await A(a,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(c.get("lmStudioPort"))}}),t.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(n){throw t.fail(`Failed to start LM Studio: ${n instanceof Error?n.message:"Unknown error"}`),n}}async findLinuxBinary(){let e=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let t of e)try{return await A("test",["-x",t]),t}catch{continue}}async findWindowsExecutable(){let e=process.env.LOCALAPPDATA,t=process.env.PROGRAMFILES,n=[e?`${e}\\Programs\\LM Studio\\lm-studio.exe`:"",t?`${t}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let r of n)try{return await A("cmd",["/c","if exist",`"${r}"`,"echo","yes"]),r}catch{continue}}async waitForServer(e=6e4){let t=Date.now();for(;Date.now()-t<e;){if(await this.checkStatus())return!0;await this.sleep(2e3)}return!1}sleep(e){return new Promise(t=>setTimeout(t,e))}async findAvailablePort(){for(let e of J)try{if((await fetch(`http://localhost:${e}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return e}catch{return c.set("lmStudioPort",e),e}return J[0]??1234}},f=new E});var oe={};L(oe,{ClaudeService:()=>N,claudeService:()=>R});import{execa as _}from"execa";import le from"chalk";var N,R,F=b(()=>{"use strict";N=class{async isClaudeCodeInstalled(){try{return await _("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:t,args:n=[],verbose:r=!1}=e,i=this.extractProvider(t),a=this.extractModelName(t);if(!i||!a)throw new Error(`Invalid model format: ${t}. Expected format: provider/model-name`);let s=`${i}/${a}`,l=["--model",s,...n];r&&console.log(le.dim(`
2
+ var ne=Object.defineProperty;var ie=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,o)=>(typeof require<"u"?require:e)[o]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var O=(t,e)=>()=>(t&&(e=t(t=0)),e);var A=(t,e)=>{for(var o in e)ne(t,o,{get:e[o],enumerable:!0})};var W={};A(W,{ConfigService:()=>E,configService:()=>c});import se from"conf";var E,c,M=O(()=>{"use strict";E=class{store;constructor(){this.store=new se({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,defaultTimeout:3e4,autoStartServer:!1},clearInvalidConfig:!0})}get(e){return this.store.get(e)}set(e,o){this.store.set(e,o)}setModel(e){this.store.set("model",e)}getLastUsedModel(){return this.store.get("model")}setDefaultProvider(e){this.store.set("defaultProvider",e)}getDefaultProvider(){return this.store.get("defaultProvider")}getLMStudioUrl(){let e=this.store.get("lmStudioUrl"),o=this.store.get("lmStudioPort");return`${e}:${o}`}reset(){this.store.clear()}},c=new E});var Q={};A(Q,{LMStudioService:()=>I,lmStudioService:()=>g});import{execa as k}from"execa";import H from"ora";import V from"chalk";var J,I,g,C=O(()=>{"use strict";M();J=[1234,1235,1236,1237],I=class{baseUrl;constructor(){this.baseUrl=c.getLMStudioUrl()}getApiUrl(e){return`${this.baseUrl}${e}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){let e=["/api/v1/models","/api/models","/v1/models","/api/ls-model/list"];for(let o of e)try{let n=await fetch(this.getApiUrl(o),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!n.ok)continue;let r=await n.json(),i=[];return Array.isArray(r)?i=r:r.models&&Array.isArray(r.models)?i=r.models:r.data&&Array.isArray(r.data)&&(i=r.data),i.map(a=>{let s=a;return{id:String(s.key||s.id||s.model||""),name:String(s.display_name||s.name||s.id||s.model||""),size:Number(s.size_bytes||s.size||s.file_size||0),quantization:String(s.quantization?typeof s.quantization=="object"?s.quantization.name:s.quantization:"")}}).filter(a=>a.id&&a.name)}catch{continue}return[]}async getStatus(){if(!await this.checkStatus())return{running:!1,port:c.get("lmStudioPort"),models:[]};try{let o=await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!o.ok)return{running:!1,port:c.get("lmStudioPort"),models:[]};let n=await o.json();return{running:!0,port:c.get("lmStudioPort"),models:n.models??[],activeModel:n.active_model}}catch{return{running:!1,port:c.get("lmStudioPort"),models:[]}}}async loadModel(e,o){let n=o??H({text:`Loading model: ${V.cyan(e)}`,color:"cyan"}).start();try{let r=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e}),signal:AbortSignal.timeout(3e5)});if(!r.ok)throw new Error(`Failed to load model: ${r.statusText}`);return n.succeed(`Model ${V.green(e)} loaded successfully`),c.setModel(e),{loadSpinner:n}}catch(r){throw n.fail(`Failed to load model: ${r instanceof Error?r.message:"Unknown error"}`),r}}async startServer(e){let o=e??H({text:"Starting LM Studio server...",color:"cyan"}).start();try{let n=process.platform==="darwin",r=process.platform==="linux",i=process.platform==="win32",a;if(n){let s=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let l of s)try{let{existsSync:p}=await import("fs");if(p(l)){a=`open "${l}" --args --server`;break}}catch{}if(a?.startsWith("open")){await k("open",[s.find(l=>{try{let{existsSync:p}=ie("fs");return p(l)}catch{return!1}})||"/Applications/LM Studio.app","--args","--server"],{detached:!0,stdio:"ignore"}),o.succeed("LM Studio server started"),await this.waitForServer(6e4);return}}else r?a=await this.findLinuxBinary():i&&(a=await this.findWindowsExecutable());if(!a)throw o.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await k(a,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(c.get("lmStudioPort"))}}),o.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(n){throw o.fail(`Failed to start LM Studio: ${n instanceof Error?n.message:"Unknown error"}`),n}}async findLinuxBinary(){let e=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let o of e)try{return await k("test",["-x",o]),o}catch{continue}}async findWindowsExecutable(){let e=process.env.LOCALAPPDATA,o=process.env.PROGRAMFILES,n=[e?`${e}\\Programs\\LM Studio\\lm-studio.exe`:"",o?`${o}\\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(e=6e4){let o=Date.now();for(;Date.now()-o<e;){if(await this.checkStatus())return!0;await this.sleep(2e3)}return!1}sleep(e){return new Promise(o=>setTimeout(o,e))}async findAvailablePort(){for(let e of J)try{if((await fetch(`http://localhost:${e}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return e}catch{return c.set("lmStudioPort",e),e}return J[0]??1234}},g=new I});var oe={};A(oe,{ClaudeService:()=>U,claudeService:()=>P});import{execa as _}from"execa";import le from"chalk";var U,P,F=O(()=>{"use strict";U=class{async isClaudeCodeInstalled(){try{return await _("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:o,args:n=[],verbose:r=!1}=e,i=this.extractProvider(o),a=this.extractModelName(o);if(!i||!a)throw new Error(`Invalid model format: ${o}. Expected format: provider/model-name`);let s=`${i}/${a}`,l=["--model",s,...n];r&&console.log(le.dim(`
3
3
  Running: claude ${l.join(" ")}
4
- `));try{await _("claude",l,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:s}})}catch(m){if(m instanceof Error&&"exitCode"in m){let P=m.exitCode;process.exit(P??1)}throw m}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let t=e.split("/");if(!(t.length<2))return t.slice(1).join("/")}async getVersion(){try{return(await _("claude",["--version"])).stdout}catch{return}}},R=new N});var te={};L(te,{OpenCodeService:()=>U,openCodeService:()=>z});import{execa as B}from"execa";import de from"chalk";var U,z,q=b(()=>{"use strict";U=class{async isOpenCodeInstalled(){try{return await B("opencode",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:t,args:n=[],verbose:r=!1}=e,i=this.extractProvider(t),a=this.extractModelName(t);if(!i||!a)throw new Error(`Invalid model format: ${t}. Expected format: provider/model-name`);let s=["--model",t,...n];r&&console.log(de.dim(`
4
+ `));try{await _("claude",l,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:s}})}catch(p){if(p instanceof Error&&"exitCode"in p){let L=p.exitCode;process.exit(L??1)}throw p}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let o=e.split("/");if(!(o.length<2))return o.slice(1).join("/")}async getVersion(){try{return(await _("claude",["--version"])).stdout}catch{return}}},P=new U});var te={};A(te,{OpenCodeService:()=>z,openCodeService:()=>$});import{execa as q}from"execa";import de from"chalk";var z,$,B=O(()=>{"use strict";z=class{async isOpenCodeInstalled(){try{return await q("opencode",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:o,args:n=[],verbose:r=!1}=e,i=this.extractProvider(o),a=this.extractModelName(o);if(!i||!a)throw new Error(`Invalid model format: ${o}. Expected format: provider/model-name`);let s=["--model",o,...n];r&&console.log(de.dim(`
5
5
  Running: opencode ${s.join(" ")}
6
- `));try{await B("opencode",s,{stdio:"inherit",env:{...process.env,OPENCODE_MODEL_NAME:a,OPENCODE_MODEL_PROVIDER:i}})}catch(l){if(l instanceof Error&&"exitCode"in l){let m=l.exitCode;process.exit(m??1)}throw l}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let t=e.split("/");if(!(t.length<2))return t.slice(1).join("/")}async getVersion(){try{return(await B("opencode",["--version"])).stdout}catch{return}}},z=new U});import{Command as ce}from"commander";import u from"chalk";x();M();import Z from"ora";import h from"chalk";import ee from"inquirer";import X from"inquirer";async function k(o,e){let t=o.map(i=>({name:`${i.name} (${i.id})`,value:i,short:i.name})),n=e?t.findIndex(i=>i.value.id===e):0;return(await X.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:t,default:Math.max(0,n),pageSize:Math.min(o.length,15)}])).model}async function I(o,e=!0){return(await X.prompt([{type:"confirm",name:"confirm",message:o,default:e}])).confirm}import Y from"chalk";function D(o){if(o===0)return"0 B";let e=1024,t=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(o)/Math.log(e));return`${parseFloat((o/Math.pow(e,n)).toFixed(2))} ${t[n]}`}function C(o){console.log(Y.green("\u2713")+" "+o)}function ae(o){console.error(Y.red("\u2717")+" "+o)}function v(o,e=1){ae(o),process.exit(e)}async function j(o={}){let e;if(o.provider)e=o.provider;else{let p=c.getDefaultProvider(),{providerSelection:w}=await ee.prompt([{type:"list",name:"providerSelection",message:"Select provider:",default:p,choices:[{name:"Claude Code",value:"claude"},{name:"OpenCode",value:"opencode"}]}]);e=w;let{saveDefault:g}=await ee.prompt([{type:"confirm",name:"saveDefault",message:"Save as default provider?",default:!1}]);g&&(c.setDefaultProvider(e),C(`Default provider set to ${h.cyan(e)}`))}let t=Z({text:"Checking LM Studio status...",color:"cyan"}).start(),n=await f.checkStatus();n||(t.info("LM Studio server not running"),t.stop(),await I("Would you like to start the LM Studio server?")||v("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await f.startServer(),n=!0),t.succeed("Connected to LM Studio");let r=Z({text:"Fetching available models...",color:"cyan"}).start(),i=await f.getAvailableModels();i.length===0&&(r.fail("No models found. Download some models in LM Studio first."),v("No models available")),r.succeed(`Found ${h.bold(i.length)} model${i.length===1?"":"s"}`),console.log(),console.log(h.bold("Available Models:")),console.log(h.dim("\u2500".repeat(process.stdout.columns||80))),i.forEach((p,w)=>{let g=D(p.size),S=p.loaded?h.green(" [LOADED]"):"";console.log(` ${h.dim(String(w+1).padStart(2))}. ${p.name} ${h.dim(`(${g})`)}${S}`)}),console.log();let a=c.getLastUsedModel(),s=o.model,l=s?i.find(p=>p.id===s||p.name.includes(s)):await k(i,a);l||v("No model selected"),await f.loadModel(l.id,t);let m=l.id.replace("/","--"),P=e==="opencode"?"OpenCode":"Claude Code";C(h.bold(`
7
- Model ready: ${l.name}`)),console.log(),console.log(`Run ${P} with this model:`),console.log(` ${h.cyan((e==="opencode"?"opencode":"claude")+" --model lmstudio/"+m)}`),console.log(),console.log(`Or use ${h.cyan("aix-cli run")} to start an interactive session`)}x();F();q();M();import T from"ora";import re from"chalk";async function G(o={}){let e=o.provider??c.getDefaultProvider(),t=T({text:`Checking ${e==="opencode"?"OpenCode":"Claude Code"} installation...`,color:"cyan"}).start();(e==="opencode"?await z.isOpenCodeInstalled():await R.isClaudeCodeInstalled())||(t.fail(`${e==="opencode"?"OpenCode":"Claude Code"} is not installed.`),v(`Please install ${e==="opencode"?"OpenCode":"Claude Code"} first.`)),t.succeed(`${e==="opencode"?"OpenCode":"Claude Code"} is installed`);let r=T({text:"Checking LM Studio status...",color:"cyan"}).start(),i=await f.checkStatus();i||(r.info("LM Studio server not running"),r.stop(),await I("Would you like to start the LM Studio server?")||v("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await f.startServer(),i=!0),r.succeed("Connected to LM Studio");let a=T({text:"Fetching available models...",color:"cyan"}).start(),s=await f.getAvailableModels();s.length===0&&(a.fail("No models found. Download some models in LM Studio first."),v("No models available")),a.stop();let l;if(o.model){let g=s.find(S=>S.id===o.model||S.name.toLowerCase().includes(o.model.toLowerCase()));g||v(`Model "${o.model}" not found. Available models: ${s.map(S=>S.name).join(", ")}`),l=g.id}else{let g=c.getLastUsedModel();l=(await k(s,g)).id}let m=T({text:`Loading model: ${re.cyan(l)}`,color:"cyan"}).start();await f.loadModel(l,m);let p=`lmstudio/${l.replace("/","--")}`,w=e==="opencode"?"OpenCode":"Claude Code";C(re.green(`
8
- Starting ${w} with model: ${p}
9
- `));try{e==="opencode"?await z.run({model:p,args:o.args??[],verbose:o.verbose}):await R.run({model:p,args:o.args??[],verbose:o.verbose})}catch(g){v(`Failed to run ${w}: ${g instanceof Error?g.message:"Unknown error"}`)}}x();import d from"chalk";async function K(){let o=await f.getStatus();console.log(),console.log(d.bold("LM Studio Status")),console.log(d.dim("\u2500".repeat(50))),console.log(` ${o.running?d.green("\u25CF"):d.red("\u25CB")} Server: ${o.running?d.green("Running"):d.red("Stopped")}`),console.log(` ${d.dim("\u25B8")} Port: ${d.cyan(String(o.port))}`),console.log(` ${d.dim("\u25B8")} URL: ${d.cyan(`http://localhost:${o.port}`)}`),o.activeModel?console.log(` ${d.dim("\u25B8")} Active Model: ${d.green(o.activeModel)}`):console.log(` ${d.dim("\u25B8")} Active Model: ${d.dim("None")}`),console.log(),console.log(d.bold("Models")),console.log(d.dim("\u2500".repeat(50))),o.models.length===0?console.log(` ${d.dim("No models available")}`):o.models.forEach((e,t)=>{let n=D(e.size),r=e.id===o.activeModel?` ${d.green("[LOADED]")}`:"";console.log(` ${d.dim(String(t+1)+".")} ${e.name}${r}`),console.log(` ${d.dim("ID:")} ${e.id}`),console.log(` ${d.dim("Size:")} ${n}`),e.quantization&&console.log(` ${d.dim("Quantization:")} ${e.quantization}`),console.log()})}var y=new ce;y.name("aix-cli").description("AI CLI tool that integrates LM Studio with Claude Code or OpenCode for local AI-powered development").version("2.0.0").showHelpAfterError();function $(o=0){console.log(),console.log(u.dim(o===0?"\u{1F44B} Goodbye!":"\u274C Cancelled.")),process.exit(o)}process.on("SIGINT",()=>$(0));process.on("SIGTERM",()=>$(0));process.on("uncaughtException",o=>{o.message?.includes("ExitPromptError")||o.message?.includes("User force closed")||o.message?.includes("prompt")?$(0):(console.error(u.red("Error:"),o.message),process.exit(1))});process.on("unhandledRejection",o=>{let e=String(o);(e.includes("ExitPromptError")||e.includes("User force closed")||e.includes("prompt"))&&$(0)});y.command("init",{isDefault:!1}).aliases(["i","load"]).description("Initialize and load a model into LM Studio").option("-m, --model <name>","Model name or ID to load","").option("-p, --provider <provider>","Provider to use (claude or opencode)","").action(j);y.command("run",{isDefault:!1}).aliases(["r"]).description("Run Claude Code or OpenCode with a model from LM Studio").option("-m, --model <name>","Model name or ID to use","").option("-p, --provider <provider>","Provider to use (claude or opencode)","").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for the provider").action(async(o,e)=>{await G({...e,args:o})});y.command("status",{isDefault:!1}).aliases(["s","stats"]).description("Show LM Studio status and available models").action(K);y.command("doctor",{isDefault:!1}).aliases(["d","check"]).description("Check system requirements and configuration").action(async()=>{let{lmStudioService:o}=await Promise.resolve().then(()=>(x(),Q)),{claudeService:e}=await Promise.resolve().then(()=>(F(),oe)),{openCodeService:t}=await Promise.resolve().then(()=>(q(),te)),{configService:n}=await Promise.resolve().then(()=>(M(),W));console.log(u.bold.cyan("\u{1F527} AIX CLI System Check")),console.log(u.dim("\u2500".repeat(40)));let r=await o.checkStatus(),i=await e.isClaudeCodeInstalled(),a=await t.isOpenCodeInstalled(),s=n.getDefaultProvider(),l=n.get("lmStudioPort");console.log(),console.log(`${r?"\u2705":"\u26A0\uFE0F"} LM Studio: ${r?u.green("Running"):u.yellow("Not running")}`),console.log(`${i?"\u2705":"\u274C"} Claude Code: ${i?u.green("Installed"):u.red("Not installed")}`),console.log(`${a?"\u2705":"\u274C"} OpenCode: ${a?u.green("Installed"):u.red("Not installed")}`),console.log(`\u{1F310} Server: ${u.cyan(`http://localhost:${l}`)}`),console.log(`\u{1F4CC} Default provider: ${u.cyan(s)}`),(!i||!a||!r)&&(console.log(),console.log(u.bold("\u{1F4CB} Next Steps:")),i||console.log(` 1. ${u.cyan("npm install -g @anthropic-ai/claude-code")}`),a||console.log(` 2. ${u.cyan("npm install -g opencode")}`),r||console.log(" 3. Open LM Studio and start the server")),console.log(),console.log(u.dim("\u{1F4D6} Docs: ")+u.cyan("https://lmstudio.ai"))});y.parse();
6
+ `));try{await q("opencode",s,{stdio:"inherit",env:{...process.env,OPENCODE_MODEL_NAME:a,OPENCODE_MODEL_PROVIDER:i}})}catch(l){if(l instanceof Error&&"exitCode"in l){let p=l.exitCode;process.exit(p??1)}throw l}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let o=e.split("/");if(!(o.length<2))return o.slice(1).join("/")}async getVersion(){try{return(await q("opencode",["--version"])).stdout}catch{return}}},$=new z});import{Command as me}from"commander";import u from"chalk";C();M();import Z from"ora";import h from"chalk";import ee from"inquirer";import X from"inquirer";async function D(t,e){let o=t.map(i=>({name:`${i.name} (${i.id})`,value:i,short:i.name})),n=e?o.findIndex(i=>i.value.id===e):0;return(await X.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:o,default:Math.max(0,n),pageSize:Math.min(t.length,15)}])).model}async function N(t,e=!0){return(await X.prompt([{type:"confirm",name:"confirm",message:t,default:e}])).confirm}import Y from"chalk";function R(t){if(t===0)return"0 B";let e=1024,o=["B","KB","MB","GB","TB"],n=Math.floor(Math.log(t)/Math.log(e));return`${parseFloat((t/Math.pow(e,n)).toFixed(2))} ${o[n]}`}function x(t){console.log(Y.green("\u2713")+" "+t)}function ae(t){console.error(Y.red("\u2717")+" "+t)}function v(t,e=1){ae(t),process.exit(e)}async function j(t={}){let e;if(t.provider)e=t.provider;else{let f=c.getDefaultProvider(),{providerSelection:w}=await ee.prompt([{type:"list",name:"providerSelection",message:"Select provider:",default:f,choices:[{name:"Claude Code",value:"claude"},{name:"OpenCode",value:"opencode"}]}]);e=w;let{saveDefault:m}=await ee.prompt([{type:"confirm",name:"saveDefault",message:"Save as default provider?",default:!1}]);m&&(c.setDefaultProvider(e),x(`Default provider set to ${h.cyan(e)}`))}let o=Z({text:"Checking LM Studio status...",color:"cyan"}).start(),n=await g.checkStatus();n||(o.info("LM Studio server not running"),o.stop(),await N("Would you like to start the LM Studio server?")||v("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),n=!0),o.succeed("Connected to LM Studio");let r=Z({text:"Fetching available models...",color:"cyan"}).start(),i=await g.getAvailableModels();i.length===0&&(r.fail("No models found. Download some models in LM Studio first."),v("No models available")),r.succeed(`Found ${h.bold(i.length)} model${i.length===1?"":"s"}`),console.log(),console.log(h.bold("Available Models:")),console.log(h.dim("\u2500".repeat(process.stdout.columns||80))),i.forEach((f,w)=>{let m=R(f.size),S=f.loaded?h.green(" [LOADED]"):"";console.log(` ${h.dim(String(w+1).padStart(2))}. ${f.name} ${h.dim(`(${m})`)}${S}`)}),console.log();let a=c.getLastUsedModel(),s=t.model,l=s?i.find(f=>f.id===s||f.name.includes(s)):await D(i,a);l||v("No model selected"),await g.loadModel(l.id,o);let p=l.id.replace("/","--"),L=e==="opencode"?"OpenCode":"Claude Code";x(h.bold(`
7
+ Model ready: ${l.name}`)),console.log(),console.log(`Run ${L} with this model:`),console.log(` ${h.cyan((e==="opencode"?"opencode":"claude")+" --model lmstudio/"+p)}`),console.log(),console.log(`Or use ${h.cyan("aix-cli run")} to start an interactive session`)}C();F();B();M();import T from"ora";import re from"chalk";import ce from"inquirer";async function ue(){let t=await P.isClaudeCodeInstalled(),e=await $.isOpenCodeInstalled(),o=[];if(t&&o.push({name:"Claude Code",value:"claude"}),e&&o.push({name:"OpenCode",value:"opencode"}),o.length===0&&v("Neither Claude Code nor OpenCode is installed."),o.length===1)return o[0].value;let{providerSelection:n}=await ce.prompt([{type:"list",name:"providerSelection",message:"Select coding tool:",choices:o}]);return n}async function G(t={}){let e;if(t.provider)e=t.provider;else{let m=c.getDefaultProvider();m?e=m:e=await ue()}let o=T({text:`Checking ${e==="opencode"?"OpenCode":"Claude Code"} installation...`,color:"cyan"}).start();(e==="opencode"?await $.isOpenCodeInstalled():await P.isClaudeCodeInstalled())||(o.fail(`${e==="opencode"?"OpenCode":"Claude Code"} is not installed.`),v(`Please install ${e==="opencode"?"OpenCode":"Claude Code"} first.`)),o.succeed(`${e==="opencode"?"OpenCode":"Claude Code"} is installed`);let r=T({text:"Checking LM Studio status...",color:"cyan"}).start(),i=await g.checkStatus();i||(r.info("LM Studio server not running"),r.stop(),await N("Would you like to start the LM Studio server?")||v("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),i=!0),r.succeed("Connected to LM Studio");let a=T({text:"Fetching available models...",color:"cyan"}).start(),s=await g.getAvailableModels();s.length===0&&(a.fail("No models found. Download some models in LM Studio first."),v("No models available")),a.stop();let l;if(t.model){let m=s.find(S=>S.id===t.model||S.name.toLowerCase().includes(t.model.toLowerCase()));m||v(`Model "${t.model}" not found. Available models: ${s.map(S=>S.name).join(", ")}`),l=m.id}else{let m=c.getLastUsedModel();l=(await D(s,m)).id}let p=T({text:`Loading model: ${re.cyan(l)}`,color:"cyan"}).start();await g.loadModel(l,p);let f=`lmstudio/${l.replace("/","--")}`,w=e==="opencode"?"OpenCode":"Claude Code";x(re.green(`
8
+ Starting ${w} with model: ${f}
9
+ `));try{e==="opencode"?await $.run({model:f,args:t.args??[],verbose:t.verbose}):await P.run({model:f,args:t.args??[],verbose:t.verbose})}catch(m){v(`Failed to run ${w}: ${m instanceof Error?m.message:"Unknown error"}`)}}C();import d from"chalk";async function K(){let t=await g.getStatus();console.log(),console.log(d.bold("LM Studio Status")),console.log(d.dim("\u2500".repeat(50))),console.log(` ${t.running?d.green("\u25CF"):d.red("\u25CB")} Server: ${t.running?d.green("Running"):d.red("Stopped")}`),console.log(` ${d.dim("\u25B8")} Port: ${d.cyan(String(t.port))}`),console.log(` ${d.dim("\u25B8")} URL: ${d.cyan(`http://localhost:${t.port}`)}`),t.activeModel?console.log(` ${d.dim("\u25B8")} Active Model: ${d.green(t.activeModel)}`):console.log(` ${d.dim("\u25B8")} Active Model: ${d.dim("None")}`),console.log(),console.log(d.bold("Models")),console.log(d.dim("\u2500".repeat(50))),t.models.length===0?console.log(` ${d.dim("No models available")}`):t.models.forEach((e,o)=>{let n=R(e.size),r=e.id===t.activeModel?` ${d.green("[LOADED]")}`:"";console.log(` ${d.dim(String(o+1)+".")} ${e.name}${r}`),console.log(` ${d.dim("ID:")} ${e.id}`),console.log(` ${d.dim("Size:")} ${n}`),e.quantization&&console.log(` ${d.dim("Quantization:")} ${e.quantization}`),console.log()})}var y=new me;y.name("aix-cli").description("AI CLI tool that integrates LM Studio with Claude Code or OpenCode for local AI-powered development").version("2.0.0").showHelpAfterError();function b(t=0){console.log(),console.log(u.dim(t===0?"\u{1F44B} Goodbye!":"\u274C Cancelled.")),process.exit(t)}process.on("SIGINT",()=>b(0));process.on("SIGTERM",()=>b(0));process.on("uncaughtException",t=>{t.message?.includes("ExitPromptError")||t.message?.includes("User force closed")||t.message?.includes("prompt")?b(0):(console.error(u.red("Error:"),t.message),process.exit(1))});process.on("unhandledRejection",t=>{let e=String(t);(e.includes("ExitPromptError")||e.includes("User force closed")||e.includes("prompt"))&&b(0)});y.command("init",{isDefault:!1}).aliases(["i","load"]).description("Initialize and load a model into LM Studio").option("-m, --model <name>","Model name or ID to load","").option("-p, --provider <provider>","Provider to use (claude or opencode)","").action(j);y.command("run",{isDefault:!1}).aliases(["r"]).description("Run Claude Code or OpenCode with a model from LM Studio").option("-m, --model <name>","Model name or ID to use","").option("-p, --provider <provider>","Provider to use (claude or opencode)","").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for the provider").action(async(t,e)=>{await G({...e,args:t})});y.command("status",{isDefault:!1}).aliases(["s","stats"]).description("Show LM Studio status and available models").action(K);y.command("doctor",{isDefault:!1}).aliases(["d","check"]).description("Check system requirements and configuration").action(async()=>{let{lmStudioService:t}=await Promise.resolve().then(()=>(C(),Q)),{claudeService:e}=await Promise.resolve().then(()=>(F(),oe)),{openCodeService:o}=await Promise.resolve().then(()=>(B(),te)),{configService:n}=await Promise.resolve().then(()=>(M(),W));console.log(u.bold.cyan("\u{1F527} AIX CLI System Check")),console.log(u.dim("\u2500".repeat(40)));let r=await t.checkStatus(),i=await e.isClaudeCodeInstalled(),a=await o.isOpenCodeInstalled(),s=n.getDefaultProvider(),l=n.get("lmStudioPort");console.log(),console.log(`${r?"\u2705":"\u26A0\uFE0F"} LM Studio: ${r?u.green("Running"):u.yellow("Not running")}`),console.log(`${i?"\u2705":"\u274C"} Claude Code: ${i?u.green("Installed"):u.red("Not installed")}`),console.log(`${a?"\u2705":"\u274C"} OpenCode: ${a?u.green("Installed"):u.red("Not installed")}`),console.log(`\u{1F310} Server: ${u.cyan(`http://localhost:${l}`)}`),console.log(`\u{1F4CC} Default provider: ${u.cyan(s)}`),(!i||!a||!r)&&(console.log(),console.log(u.bold("\u{1F4CB} Next Steps:")),i||console.log(` 1. ${u.cyan("npm install -g @anthropic-ai/claude-code")}`),a||console.log(` 2. ${u.cyan("npm install -g opencode")}`),r||console.log(" 3. Open LM Studio and start the server")),console.log(),console.log(u.dim("\u{1F4D6} Docs: ")+u.cyan("https://lmstudio.ai"))});y.parse();
10
10
  //# 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/services/opencode.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, Provider } 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 defaultProvider: 'claude',\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 setDefaultProvider(provider: Provider): void {\n this.store.set('defaultProvider', provider);\n }\n\n getDefaultProvider(): Provider {\n return this.store.get('defaultProvider') ?? 'claude';\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 const endpoints = ['/api/v1/models', '/api/models', '/v1/models', '/api/ls-model/list'];\n\n for (const endpoint of endpoints) {\n try {\n const response = await fetch(this.getApiUrl(endpoint), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) continue;\n\n const json = (await response.json()) as Record<string, unknown>;\n\n let models: unknown[] = [];\n\n // Try different response formats\n if (Array.isArray(json)) {\n models = json;\n } else if (json.models && Array.isArray(json.models)) {\n models = json.models;\n } else if (json.data && Array.isArray(json.data)) {\n models = json.data;\n }\n\n return (models as Record<string, unknown>[])\n .map((m) => {\n const model = m as Record<string, unknown>;\n return {\n id: String(model.key || model.id || model.model || ''),\n name: String(model.display_name || model.name || model.id || model.model || ''),\n size: Number(model.size_bytes || model.size || model.file_size || 0),\n quantization: String(\n model.quantization\n ? typeof model.quantization === 'object'\n ? (model.quantization as Record<string, unknown>).name\n : model.quantization\n : ''\n ),\n };\n })\n .filter((m) => m.id && m.name);\n } catch {\n continue;\n }\n }\n\n return [];\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", "import { execa } from 'execa';\nimport chalk from 'chalk';\n\nexport interface OpenCodeOptions {\n model: string;\n args?: string[];\n verbose?: boolean;\n}\n\nexport class OpenCodeService {\n async isOpenCodeInstalled(): Promise<boolean> {\n try {\n await execa('opencode', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async run(options: OpenCodeOptions): 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 openCodeArgs = ['--model', model, ...args];\n\n if (verbose) {\n console.log(chalk.dim(`\\nRunning: opencode ${openCodeArgs.join(' ')}\\n`));\n }\n\n try {\n await execa('opencode', openCodeArgs, {\n stdio: 'inherit',\n env: {\n ...process.env,\n OPENCODE_MODEL_NAME: modelName,\n OPENCODE_MODEL_PROVIDER: provider,\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('opencode', ['--version']);\n return result.stdout;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const openCodeService = new OpenCodeService();\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-cli')\n .description(\n 'AI CLI tool that integrates LM Studio with Claude Code or OpenCode for local AI-powered development'\n )\n .version('2.0.0')\n .showHelpAfterError();\n\nfunction handleExit(code: number = 0) {\n console.log();\n console.log(chalk.dim(code === 0 ? '\uD83D\uDC4B Goodbye!' : '\u274C Cancelled.'));\n process.exit(code);\n}\n\nprocess.on('SIGINT', () => handleExit(0));\nprocess.on('SIGTERM', () => handleExit(0));\n\nprocess.on('uncaughtException', (err) => {\n if (err.message?.includes('ExitPromptError') || err.message?.includes('User force closed')) {\n handleExit(0);\n } else if (err.message?.includes('prompt')) {\n handleExit(0);\n } else {\n console.error(chalk.red('Error:'), err.message);\n process.exit(1);\n }\n});\n\nprocess.on('unhandledRejection', (reason) => {\n const r = String(reason);\n if (r.includes('ExitPromptError') || r.includes('User force closed') || r.includes('prompt')) {\n handleExit(0);\n }\n});\n\nprogram\n .command('init', { isDefault: false })\n .aliases(['i', 'load'])\n .description('Initialize and load a model into LM Studio')\n .option('-m, --model <name>', 'Model name or ID to load', '')\n .option('-p, --provider <provider>', 'Provider to use (claude or opencode)', '')\n .action(initCommand);\n\nprogram\n .command('run', { isDefault: false })\n .aliases(['r'])\n .description('Run Claude Code or OpenCode with a model from LM Studio')\n .option('-m, --model <name>', 'Model name or ID to use', '')\n .option('-p, --provider <provider>', 'Provider to use (claude or opencode)', '')\n .option('-v, --verbose', 'Show verbose output')\n .argument('[args...]', 'Additional arguments for the provider')\n .action(async (args: string[], options: Record<string, unknown>) => {\n await runCommand({\n ...options,\n args,\n });\n });\n\nprogram\n .command('status', { isDefault: false })\n .aliases(['s', 'stats'])\n .description('Show LM Studio status and available models')\n .action(statusCommand);\n\nprogram\n .command('doctor', { isDefault: false })\n .aliases(['d', 'check'])\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 { openCodeService } = await import('./services/opencode.js');\n const { configService } = await import('./services/config.js');\n\n console.log(chalk.bold.cyan('\uD83D\uDD27 AIX CLI System Check'));\n console.log(chalk.dim('\u2500'.repeat(40)));\n\n const lmStudioRunning = await lmStudioService.checkStatus();\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n const openCodeInstalled = await openCodeService.isOpenCodeInstalled();\n const defaultProvider = configService.getDefaultProvider();\n const port = configService.get('lmStudioPort');\n\n console.log();\n console.log(\n `${lmStudioRunning ? '\u2705' : '\u26A0\uFE0F'} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')}`\n );\n console.log(\n `${claudeInstalled ? '\u2705' : '\u274C'} Claude Code: ${claudeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n console.log(\n `${openCodeInstalled ? '\u2705' : '\u274C'} OpenCode: ${openCodeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n console.log(`\uD83C\uDF10 Server: ${chalk.cyan(`http://localhost:${port}`)}`);\n console.log(`\uD83D\uDCCC Default provider: ${chalk.cyan(defaultProvider)}`);\n\n if (!claudeInstalled || !openCodeInstalled || !lmStudioRunning) {\n console.log();\n console.log(chalk.bold('\uD83D\uDCCB Next Steps:'));\n if (!claudeInstalled) {\n console.log(` 1. ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n }\n if (!openCodeInstalled) {\n console.log(` 2. ${chalk.cyan('npm install -g opencode')}`);\n }\n if (!lmStudioRunning) {\n console.log(` 3. Open LM Studio and start the server`);\n }\n }\n\n console.log();\n console.log(chalk.dim('\uD83D\uDCD6 Docs: ') + chalk.cyan('https://lmstudio.ai'));\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\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, Provider } from '../types/index.js';\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n let provider: Provider;\n\n if (options.provider) {\n provider = options.provider;\n } else {\n const defaultProvider = configService.getDefaultProvider();\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select provider:',\n default: defaultProvider,\n choices: [\n { name: 'Claude Code', value: 'claude' as Provider },\n { name: 'OpenCode', value: 'opencode' as Provider },\n ],\n },\n ]);\n provider = providerSelection;\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default provider?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultProvider(provider);\n success(`Default provider set to ${chalk.cyan(provider)}`);\n }\n }\n\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 const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n\n success(chalk.bold(`\\nModel ready: ${selectedModel.name}`));\n console.log();\n console.log(`Run ${providerName} with this model:`);\n console.log(\n ` ${chalk.cyan((provider === 'opencode' ? 'opencode' : 'claude') + ' --model lmstudio/' + modelIdentifier)}`\n );\n console.log();\n console.log(`Or use ${chalk.cyan('aix-cli 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 { openCodeService } from '../services/opencode.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { exitWithError, success } from '../utils/format.js';\nimport type { Provider } from '../types/index.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n provider?: Provider;\n}\n\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n const provider = options.provider ?? configService.getDefaultProvider();\n\n const providerSpinner = ora({\n text: `Checking ${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} installation...`,\n color: 'cyan',\n }).start();\n\n const isInstalled =\n provider === 'opencode'\n ? await openCodeService.isOpenCodeInstalled()\n : await claudeService.isClaudeCodeInstalled();\n\n if (!isInstalled) {\n providerSpinner.fail(\n `${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} is not installed.`\n );\n exitWithError(`Please install ${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} first.`);\n }\n\n providerSpinner.succeed(`${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} is installed`);\n\n const serverSpinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n serverSpinner.info('LM Studio server not running');\n serverSpinner.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 serverSpinner.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.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 const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n success(chalk.green(`\\nStarting ${providerName} with model: ${fullModelName}\\n`));\n\n try {\n if (provider === 'opencode') {\n await openCodeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n } else {\n await claudeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to run ${providerName}: ${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", "provider", "host", "port", "lmstudio_exports", "__export", "LMStudioService", "lmStudioService", "execa", "ora", "chalk", "LMSTUDIO_PORTS", "init_lmstudio", "__esmMin", "init_config", "configService", "path", "endpoints", "endpoint", "response", "json", "models", "m", "model", "data", "modelId", "spinner", "loadSpinner", "error", "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", "opencode_exports", "__export", "OpenCodeService", "openCodeService", "execa", "chalk", "init_opencode", "__esmMin", "options", "model", "args", "verbose", "provider", "modelName", "openCodeArgs", "error", "exitCode", "parts", "Command", "chalk", "init_lmstudio", "init_config", "ora", "chalk", "inquirer", "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", "provider", "defaultProvider", "configService", "providerSelection", "inquirer", "saveDefault", "success", "chalk", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "modelSearch", "selectedModel", "m", "selectModel", "modelIdentifier", "providerName", "init_lmstudio", "init_claude", "init_opencode", "init_config", "ora", "chalk", "runCommand", "options", "provider", "configService", "providerSpinner", "ora", "openCodeService", "claudeService", "exitWithError", "serverSpinner", "isRunning", "lmStudioService", "confirmAction", "modelsSpinner", "models", "selectedModelId", "foundModel", "m", "lastUsedModel", "selectModel", "loadSpinner", "chalk", "fullModelName", "providerName", "success", "error", "init_lmstudio", "chalk", "statusCommand", "status", "lmStudioService", "chalk", "model", "index", "size", "formatBytes", "loaded", "program", "Command", "handleExit", "code", "chalk", "err", "reason", "r", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "claudeService", "openCodeService", "configService", "lmStudioRunning", "claudeInstalled", "openCodeInstalled", "defaultProvider", "port"]
4
+ "sourcesContent": ["import Conf from 'conf';\nimport type { Config, Provider } 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 setDefaultProvider(provider: Provider): void {\n this.store.set('defaultProvider', provider);\n }\n\n getDefaultProvider(): Provider | undefined {\n const stored = this.store.get('defaultProvider');\n return stored as Provider | undefined;\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 const endpoints = ['/api/v1/models', '/api/models', '/v1/models', '/api/ls-model/list'];\n\n for (const endpoint of endpoints) {\n try {\n const response = await fetch(this.getApiUrl(endpoint), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) continue;\n\n const json = (await response.json()) as Record<string, unknown>;\n\n let models: unknown[] = [];\n\n // Try different response formats\n if (Array.isArray(json)) {\n models = json;\n } else if (json.models && Array.isArray(json.models)) {\n models = json.models;\n } else if (json.data && Array.isArray(json.data)) {\n models = json.data;\n }\n\n return (models as Record<string, unknown>[])\n .map((m) => {\n const model = m as Record<string, unknown>;\n return {\n id: String(model.key || model.id || model.model || ''),\n name: String(model.display_name || model.name || model.id || model.model || ''),\n size: Number(model.size_bytes || model.size || model.file_size || 0),\n quantization: String(\n model.quantization\n ? typeof model.quantization === 'object'\n ? (model.quantization as Record<string, unknown>).name\n : model.quantization\n : ''\n ),\n };\n })\n .filter((m) => m.id && m.name);\n } catch {\n continue;\n }\n }\n\n return [];\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", "import { execa } from 'execa';\nimport chalk from 'chalk';\n\nexport interface OpenCodeOptions {\n model: string;\n args?: string[];\n verbose?: boolean;\n}\n\nexport class OpenCodeService {\n async isOpenCodeInstalled(): Promise<boolean> {\n try {\n await execa('opencode', ['--version'], { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n }\n\n async run(options: OpenCodeOptions): 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 openCodeArgs = ['--model', model, ...args];\n\n if (verbose) {\n console.log(chalk.dim(`\\nRunning: opencode ${openCodeArgs.join(' ')}\\n`));\n }\n\n try {\n await execa('opencode', openCodeArgs, {\n stdio: 'inherit',\n env: {\n ...process.env,\n OPENCODE_MODEL_NAME: modelName,\n OPENCODE_MODEL_PROVIDER: provider,\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('opencode', ['--version']);\n return result.stdout;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const openCodeService = new OpenCodeService();\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-cli')\n .description(\n 'AI CLI tool that integrates LM Studio with Claude Code or OpenCode for local AI-powered development'\n )\n .version('2.0.0')\n .showHelpAfterError();\n\nfunction handleExit(code: number = 0) {\n console.log();\n console.log(chalk.dim(code === 0 ? '\uD83D\uDC4B Goodbye!' : '\u274C Cancelled.'));\n process.exit(code);\n}\n\nprocess.on('SIGINT', () => handleExit(0));\nprocess.on('SIGTERM', () => handleExit(0));\n\nprocess.on('uncaughtException', (err) => {\n if (err.message?.includes('ExitPromptError') || err.message?.includes('User force closed')) {\n handleExit(0);\n } else if (err.message?.includes('prompt')) {\n handleExit(0);\n } else {\n console.error(chalk.red('Error:'), err.message);\n process.exit(1);\n }\n});\n\nprocess.on('unhandledRejection', (reason) => {\n const r = String(reason);\n if (r.includes('ExitPromptError') || r.includes('User force closed') || r.includes('prompt')) {\n handleExit(0);\n }\n});\n\nprogram\n .command('init', { isDefault: false })\n .aliases(['i', 'load'])\n .description('Initialize and load a model into LM Studio')\n .option('-m, --model <name>', 'Model name or ID to load', '')\n .option('-p, --provider <provider>', 'Provider to use (claude or opencode)', '')\n .action(initCommand);\n\nprogram\n .command('run', { isDefault: false })\n .aliases(['r'])\n .description('Run Claude Code or OpenCode with a model from LM Studio')\n .option('-m, --model <name>', 'Model name or ID to use', '')\n .option('-p, --provider <provider>', 'Provider to use (claude or opencode)', '')\n .option('-v, --verbose', 'Show verbose output')\n .argument('[args...]', 'Additional arguments for the provider')\n .action(async (args: string[], options: Record<string, unknown>) => {\n await runCommand({\n ...options,\n args,\n });\n });\n\nprogram\n .command('status', { isDefault: false })\n .aliases(['s', 'stats'])\n .description('Show LM Studio status and available models')\n .action(statusCommand);\n\nprogram\n .command('doctor', { isDefault: false })\n .aliases(['d', 'check'])\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 { openCodeService } = await import('./services/opencode.js');\n const { configService } = await import('./services/config.js');\n\n console.log(chalk.bold.cyan('\uD83D\uDD27 AIX CLI System Check'));\n console.log(chalk.dim('\u2500'.repeat(40)));\n\n const lmStudioRunning = await lmStudioService.checkStatus();\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n const openCodeInstalled = await openCodeService.isOpenCodeInstalled();\n const defaultProvider = configService.getDefaultProvider();\n const port = configService.get('lmStudioPort');\n\n console.log();\n console.log(\n `${lmStudioRunning ? '\u2705' : '\u26A0\uFE0F'} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')}`\n );\n console.log(\n `${claudeInstalled ? '\u2705' : '\u274C'} Claude Code: ${claudeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n console.log(\n `${openCodeInstalled ? '\u2705' : '\u274C'} OpenCode: ${openCodeInstalled ? chalk.green('Installed') : chalk.red('Not installed')}`\n );\n console.log(`\uD83C\uDF10 Server: ${chalk.cyan(`http://localhost:${port}`)}`);\n console.log(`\uD83D\uDCCC Default provider: ${chalk.cyan(defaultProvider)}`);\n\n if (!claudeInstalled || !openCodeInstalled || !lmStudioRunning) {\n console.log();\n console.log(chalk.bold('\uD83D\uDCCB Next Steps:'));\n if (!claudeInstalled) {\n console.log(` 1. ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n }\n if (!openCodeInstalled) {\n console.log(` 2. ${chalk.cyan('npm install -g opencode')}`);\n }\n if (!lmStudioRunning) {\n console.log(` 3. Open LM Studio and start the server`);\n }\n }\n\n console.log();\n console.log(chalk.dim('\uD83D\uDCD6 Docs: ') + chalk.cyan('https://lmstudio.ai'));\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\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, Provider } from '../types/index.js';\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n let provider: Provider;\n\n if (options.provider) {\n provider = options.provider;\n } else {\n const defaultProvider = configService.getDefaultProvider();\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select provider:',\n default: defaultProvider,\n choices: [\n { name: 'Claude Code', value: 'claude' as Provider },\n { name: 'OpenCode', value: 'opencode' as Provider },\n ],\n },\n ]);\n provider = providerSelection;\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default provider?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultProvider(provider);\n success(`Default provider set to ${chalk.cyan(provider)}`);\n }\n }\n\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 const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n\n success(chalk.bold(`\\nModel ready: ${selectedModel.name}`));\n console.log();\n console.log(`Run ${providerName} with this model:`);\n console.log(\n ` ${chalk.cyan((provider === 'opencode' ? 'opencode' : 'claude') + ' --model lmstudio/' + modelIdentifier)}`\n );\n console.log();\n console.log(`Or use ${chalk.cyan('aix-cli 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 inquirer from 'inquirer';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { claudeService } from '../services/claude.js';\nimport { openCodeService } from '../services/opencode.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { exitWithError, success } from '../utils/format.js';\nimport type { Provider } from '../types/index.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n provider?: Provider;\n}\n\nasync function selectProvider(): Promise<Provider> {\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n const openCodeInstalled = await openCodeService.isOpenCodeInstalled();\n\n const choices = [];\n if (claudeInstalled) {\n choices.push({ name: 'Claude Code', value: 'claude' as Provider });\n }\n if (openCodeInstalled) {\n choices.push({ name: 'OpenCode', value: 'opencode' as Provider });\n }\n\n if (choices.length === 0) {\n exitWithError('Neither Claude Code nor OpenCode is installed.');\n }\n\n if (choices.length === 1) {\n return choices[0]!.value;\n }\n\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select coding tool:',\n choices,\n },\n ]);\n\n return providerSelection;\n}\n\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n let provider: Provider;\n\n if (options.provider) {\n provider = options.provider;\n } else {\n const storedProvider = configService.getDefaultProvider();\n if (storedProvider) {\n provider = storedProvider;\n } else {\n provider = await selectProvider();\n }\n }\n\n const providerSpinner = ora({\n text: `Checking ${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} installation...`,\n color: 'cyan',\n }).start();\n\n const isInstalled =\n provider === 'opencode'\n ? await openCodeService.isOpenCodeInstalled()\n : await claudeService.isClaudeCodeInstalled();\n\n if (!isInstalled) {\n providerSpinner.fail(\n `${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} is not installed.`\n );\n exitWithError(`Please install ${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} first.`);\n }\n\n providerSpinner.succeed(`${provider === 'opencode' ? 'OpenCode' : 'Claude Code'} is installed`);\n\n const serverSpinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n serverSpinner.info('LM Studio server not running');\n serverSpinner.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 serverSpinner.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.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 const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n success(chalk.green(`\\nStarting ${providerName} with model: ${fullModelName}\\n`));\n\n try {\n if (provider === 'opencode') {\n await openCodeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n } else {\n await claudeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to run ${providerName}: ${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", "provider", "host", "port", "lmstudio_exports", "__export", "LMStudioService", "lmStudioService", "execa", "ora", "chalk", "LMSTUDIO_PORTS", "init_lmstudio", "__esmMin", "init_config", "configService", "path", "endpoints", "endpoint", "response", "json", "models", "m", "model", "data", "modelId", "spinner", "loadSpinner", "error", "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", "opencode_exports", "__export", "OpenCodeService", "openCodeService", "execa", "chalk", "init_opencode", "__esmMin", "options", "model", "args", "verbose", "provider", "modelName", "openCodeArgs", "error", "exitCode", "parts", "Command", "chalk", "init_lmstudio", "init_config", "ora", "chalk", "inquirer", "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", "provider", "defaultProvider", "configService", "providerSelection", "inquirer", "saveDefault", "success", "chalk", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "modelSearch", "selectedModel", "m", "selectModel", "modelIdentifier", "providerName", "init_lmstudio", "init_claude", "init_opencode", "init_config", "ora", "chalk", "inquirer", "selectProvider", "claudeInstalled", "claudeService", "openCodeInstalled", "openCodeService", "choices", "exitWithError", "providerSelection", "inquirer", "runCommand", "options", "provider", "storedProvider", "configService", "providerSpinner", "ora", "serverSpinner", "isRunning", "lmStudioService", "confirmAction", "modelsSpinner", "models", "selectedModelId", "foundModel", "m", "lastUsedModel", "selectModel", "loadSpinner", "chalk", "fullModelName", "providerName", "success", "error", "init_lmstudio", "chalk", "statusCommand", "status", "lmStudioService", "chalk", "model", "index", "size", "formatBytes", "loaded", "program", "Command", "handleExit", "code", "chalk", "err", "reason", "r", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "claudeService", "openCodeService", "configService", "lmStudioRunning", "claudeInstalled", "openCodeInstalled", "defaultProvider", "port"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamharshil/aix-cli",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "AI CLI tool that integrates LM Studio with Claude Code for enhanced development assistance",
5
5
  "keywords": [
6
6
  "cli",