@iamharshil/aix-cli 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/bin/aix.js +7 -7
- package/dist/bin/aix.js.map +4 -4
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/src/index.js +7 -7
- package/dist/src/index.js.map +4 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -153,6 +153,7 @@ aix-cli doctor
|
|
|
153
153
|
| `init` | `i`, `load` | Set up backend, select model, configure provider |
|
|
154
154
|
| `status` | `s`, `stats` | Show LM Studio & Ollama status |
|
|
155
155
|
| `doctor` | `d`, `check` | Run system diagnostics |
|
|
156
|
+
| `update` | `upgrade`, `u` | Update AIX CLI to the latest version |
|
|
156
157
|
|
|
157
158
|
### Global Options
|
|
158
159
|
|
package/dist/bin/aix.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
2
|
+
var we=Object.defineProperty;var ye=(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 C=(t,e)=>()=>(t&&(e=t(t=0)),e);var O=(t,e)=>{for(var o in e)we(t,o,{get:e[o],enumerable:!0})};var ne={};O(ne,{ConfigService:()=>N,configService:()=>c});import Me from"conf";var N,c,$=C(()=>{"use strict";N=class{store;constructor(){this.store=new Me({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,ollamaUrl:"http://localhost",ollamaPort:11434,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")}setDefaultBackend(e){this.store.set("defaultBackend",e)}getDefaultBackend(){return this.store.get("defaultBackend")}getLMStudioUrl(){let e=this.store.get("lmStudioUrl"),o=this.store.get("lmStudioPort");return`${e}:${o}`}getOllamaUrl(){let e=this.store.get("ollamaUrl"),o=this.store.get("ollamaPort");return`${e}:${o}`}reset(){this.store.clear()}},c=new N});var ae={};O(ae,{LMStudioService:()=>j,lmStudioService:()=>h});import{execa as z}from"execa";import re from"ora";import ie from"chalk";var se,j,h,L=C(()=>{"use strict";$();se=[1234,1235,1236,1237],j=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 i=await fetch(this.getApiUrl(o),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!i.ok)continue;let n=await i.json(),r=[];return Array.isArray(n)?r=n:n.models&&Array.isArray(n.models)?r=n.models:n.data&&Array.isArray(n.data)&&(r=n.data),r.map(l=>{let s=l;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(l=>l.id&&l.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 i=await o.json();return{running:!0,port:c.get("lmStudioPort"),models:i.models??[],activeModel:i.active_model}}catch{return{running:!1,port:c.get("lmStudioPort"),models:[]}}}async loadModel(e,o){let i=o??re({text:`Loading model: ${ie.cyan(e)}`,color:"cyan"}).start();try{let n=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e}),signal:AbortSignal.timeout(3e5)});if(!n.ok)throw new Error(`Failed to load model: ${n.statusText}`);return i.succeed(`Model ${ie.green(e)} loaded successfully`),c.setModel(e),{loadSpinner:i}}catch(n){throw i.fail(`Failed to load model: ${n instanceof Error?n.message:"Unknown error"}`),n}}async startServer(e){let o=e??re({text:"Starting LM Studio server...",color:"cyan"}).start();try{let i=process.platform==="darwin",n=process.platform==="linux",r=process.platform==="win32",l;if(i){let s=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let d of s)try{let{existsSync:u}=await import("fs");if(u(d)){l=`open "${d}" --args --server`;break}}catch{}if(l?.startsWith("open")){await z("open",[s.find(d=>{try{let{existsSync:u}=ye("fs");return u(d)}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 n?l=await this.findLinuxBinary():r&&(l=await this.findWindowsExecutable());if(!l)throw o.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await z(l,["--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(i){throw o.fail(`Failed to start LM Studio: ${i instanceof Error?i.message:"Unknown error"}`),i}}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 z("test",["-x",o]),o}catch{continue}}async findWindowsExecutable(){let e=process.env.LOCALAPPDATA,o=process.env.PROGRAMFILES,i=[e?`${e}\\Programs\\LM Studio\\lm-studio.exe`:"",o?`${o}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let n of i)try{return await z("cmd",["/c","if exist",`"${n}"`,"echo","yes"]),n}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 se)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 se[0]??1234}},h=new j});var le={};O(le,{OllamaService:()=>T,ollamaService:()=>S});var T,S,A=C(()=>{"use strict";$();T=class{getBaseUrl(){return c.getOllamaUrl()}getApiUrl(e){return`${this.getBaseUrl()}${e}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/tags"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){try{let e=await fetch(this.getApiUrl("/api/tags"),{method:"GET",signal:AbortSignal.timeout(1e4)});return e.ok?((await e.json()).models??[]).map(n=>{let r=n.details??{};return{id:String(n.name??n.model??""),name:String(n.name??n.model??""),size:Number(n.size??0),quantization:String(r.quantization_level??""),family:String(r.family??""),parameterSize:String(r.parameter_size??"")}}).filter(n=>n.id&&n.name):[]}catch{return[]}}async getRunningModels(){try{let e=await fetch(this.getApiUrl("/api/ps"),{method:"GET",signal:AbortSignal.timeout(5e3)});return e.ok?((await e.json()).models??[]).map(n=>String(n.name??n.model??"")).filter(Boolean):[]}catch{return[]}}async getStatus(){if(!await this.checkStatus())return{running:!1,port:c.get("ollamaPort"),models:[],runningModels:[]};let[o,i]=await Promise.all([this.getAvailableModels(),this.getRunningModels()]);return{running:!0,port:c.get("ollamaPort"),models:o,runningModels:i}}},S=new T});var ue={};O(ue,{ClaudeService:()=>G,claudeService:()=>R});import{execa as J}from"execa";import xe from"chalk";var G,R,Q=C(()=>{"use strict";G=class{async isClaudeCodeInstalled(){try{return await J("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:o,args:i=[],verbose:n=!1}=e,r=this.extractProvider(o),l=this.extractModelName(o);if(!r||!l)throw new Error(`Invalid model format: ${o}. Expected format: provider/model-name`);let s=`${r}/${l}`,d=["--model",s,...i];n&&console.log(xe.dim(`
|
|
3
3
|
Running: claude ${d.join(" ")}
|
|
4
|
-
`));try{await
|
|
4
|
+
`));try{await J("claude",d,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:s}})}catch(u){if(u instanceof Error&&"exitCode"in u){let v=u.exitCode;process.exit(v??1)}throw u}}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 J("claude",["--version"])).stdout}catch{return}}},R=new G});var me={};O(me,{OpenCodeService:()=>W,openCodeService:()=>E});import{execa as X}from"execa";import Ce from"chalk";var W,E,Y=C(()=>{"use strict";W=class{async isOpenCodeInstalled(){try{return await X("opencode",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:o,args:i=[],verbose:n=!1}=e,r=this.extractProvider(o),l=this.extractModelName(o);if(!r||!l)throw new Error(`Invalid model format: ${o}. Expected format: provider/model-name`);let s=["--model",o,...i];n&&console.log(Ce.dim(`
|
|
5
5
|
Running: opencode ${s.join(" ")}
|
|
6
|
-
`));try{await
|
|
7
|
-
Model ready: ${d.name}`)),console.log(),console.log(`Run ${v} with this model:`),console.log(` ${
|
|
8
|
-
Model selected: ${u.name}`)),console.log(),console.log(`Run ${v} with this model:`),console.log(` ${
|
|
9
|
-
Starting ${
|
|
10
|
-
`));try{t==="opencode"?await E.run({model:e,args:o.args??[],verbose:o.verbose}):await R.run({model:e,args:o.args??[],verbose:o.verbose})}catch(n){f(`Failed to run ${
|
|
6
|
+
`));try{await X("opencode",s,{stdio:"inherit",env:{...process.env,OPENCODE_MODEL_NAME:l,OPENCODE_MODEL_PROVIDER:r}})}catch(d){if(d instanceof Error&&"exitCode"in d){let u=d.exitCode;process.exit(u??1)}throw d}}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 X("opencode",["--version"])).stdout}catch{return}}},E=new W});import{Command as Be}from"commander";import p from"chalk";L();A();$();import _ from"ora";import g from"chalk";import q from"inquirer";import de from"inquirer";async function b(t,e){let o=t.map(r=>({name:`${r.name} (${r.id})`,value:r,short:r.name})),i=e?o.findIndex(r=>r.value.id===e):0;return(await de.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:o,default:Math.max(0,i),pageSize:Math.min(t.length,15)}])).model}async function F(t,e=!0){return(await de.prompt([{type:"confirm",name:"confirm",message:t,default:e}])).confirm}import K from"chalk";function P(t){if(t===0)return"0 B";let e=1024,o=["B","KB","MB","GB","TB"],i=Math.floor(Math.log(t)/Math.log(e));return`${parseFloat((t/Math.pow(e,i)).toFixed(2))} ${o[i]}`}function y(t){console.log(K.green("\u2713")+" "+t)}function V(t){console.error(K.red("\u2717")+" "+t)}function ce(t){console.log(K.blue("\u2139")+" "+t)}function f(t,e=1){V(t),process.exit(e)}async function $e(){let t=c.getDefaultBackend(),{backendSelection:e}=await q.prompt([{type:"list",name:"backendSelection",message:"Select model backend:",default:t??"lmstudio",choices:[{name:"\u{1F5A5}\uFE0F LM Studio",value:"lmstudio"},{name:"\u{1F999} Ollama",value:"ollama"}]}]),{saveDefault:o}=await q.prompt([{type:"confirm",name:"saveDefault",message:"Save as default backend?",default:!1}]);return o&&(c.setDefaultBackend(e),y(`Default backend set to ${g.cyan(e)}`)),e}async function be(){let t=c.getDefaultProvider(),{providerSelection:e}=await q.prompt([{type:"list",name:"providerSelection",message:"Select coding tool:",default:t??"claude",choices:[{name:"Claude Code",value:"claude"},{name:"OpenCode",value:"opencode"}]}]),{saveDefault:o}=await q.prompt([{type:"confirm",name:"saveDefault",message:"Save as default coding tool?",default:!1}]);return o&&(c.setDefaultProvider(e),y(`Default coding tool set to ${g.cyan(e)}`)),e}async function Pe(t,e){let o=_({text:"Checking LM Studio status...",color:"cyan"}).start(),i=await h.checkStatus();i||(o.info("LM Studio server not running"),o.stop(),await F("Would you like to start the LM Studio server?")||f("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await h.startServer(),i=!0),o.succeed("Connected to LM Studio");let n=_({text:"Fetching available models...",color:"cyan"}).start(),r=await h.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),f("No models available")),n.succeed(`Found ${g.bold(r.length)} model${r.length===1?"":"s"}`),console.log(),console.log(g.bold("Available Models:")),console.log(g.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((m,x)=>{let w=P(m.size),I=m.loaded?g.green(" [LOADED]"):"";console.log(` ${g.dim(String(x+1).padStart(2))}. ${m.name} ${g.dim(`(${w})`)}${I}`)}),console.log();let l=c.getLastUsedModel(),s=t.model,d=s?r.find(m=>m.id===s||m.name.includes(s)):await b(r,l);d||f("No model selected"),await h.loadModel(d.id,o);let u=d.id.replace("/","--"),v=e==="opencode"?"OpenCode":"Claude Code";y(g.bold(`
|
|
7
|
+
Model ready: ${d.name}`)),console.log(),console.log(`Run ${v} with this model:`),console.log(` ${g.cyan((e==="opencode"?"opencode":"claude")+" --model lmstudio/"+u)}`),console.log(),console.log(`Or use ${g.cyan("aix-cli run")} to start an interactive session`)}async function ke(t,e){let o=_({text:"Checking Ollama status...",color:"cyan"}).start();await S.checkStatus()||(o.fail("Ollama is not running"),f("Ollama must be running. Start it with: ollama serve")),o.succeed("Connected to Ollama");let n=_({text:"Fetching available models...",color:"cyan"}).start(),r=await S.getAvailableModels();r.length===0&&(n.fail("No models found. Pull a model first: ollama pull <model>"),f("No models available")),n.succeed(`Found ${g.bold(r.length)} model${r.length===1?"":"s"}`);let l=await S.getRunningModels();console.log(),console.log(g.bold("Available Models:")),console.log(g.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((m,x)=>{let w=P(m.size),he=l.includes(m.id)?g.green(" [RUNNING]"):"",Se=m.parameterSize?g.dim(` ${m.parameterSize}`):"";console.log(` ${g.dim(String(x+1).padStart(2))}. ${m.name}${Se} ${g.dim(`(${w})`)}${he}`)}),console.log();let s=c.getLastUsedModel(),d=t.model,u=d?r.find(m=>m.id===d||m.name.includes(d)):await b(r,s);u||f("No model selected"),c.setModel(u.id);let v=e==="opencode"?"OpenCode":"Claude Code";y(g.bold(`
|
|
8
|
+
Model selected: ${u.name}`)),console.log(),console.log(`Run ${v} with this model:`),console.log(` ${g.cyan((e==="opencode"?"opencode":"claude")+" --model ollama/"+u.id)}`),console.log(),console.log(`Or use ${g.cyan("aix-cli run")} to start an interactive session`)}async function H(t={}){let e=t.backend??await $e(),o=t.provider??await be();e==="ollama"?await ke(t,o):await Pe(t,o)}L();A();Q();Y();$();import k from"ora";import pe from"chalk";import ge from"inquirer";async function Oe(){let t=c.getDefaultBackend();if(t)return t;let{backendSelection:e}=await ge.prompt([{type:"list",name:"backendSelection",message:"Select model backend:",choices:[{name:"\u{1F5A5}\uFE0F LM Studio",value:"lmstudio"},{name:"\u{1F999} Ollama",value:"ollama"}]}]);return e}async function Le(){let t=await R.isClaudeCodeInstalled(),e=await E.isOpenCodeInstalled(),o=[];if(t&&o.push({name:"Claude Code",value:"claude"}),e&&o.push({name:"OpenCode",value:"opencode"}),o.length===0&&f("Neither Claude Code nor OpenCode is installed."),o.length===1)return o[0].value;let{providerSelection:i}=await ge.prompt([{type:"list",name:"providerSelection",message:"Select coding tool:",choices:o}]);return i}function U(t){return t==="opencode"?"OpenCode":"Claude Code"}async function Ae(t,e){let o=k({text:"Checking LM Studio status...",color:"cyan"}).start(),i=await h.checkStatus();i||(o.info("LM Studio server not running"),o.stop(),await F("Would you like to start the LM Studio server?")||f("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await h.startServer(),i=!0),o.succeed("Connected to LM Studio");let n=k({text:"Fetching available models...",color:"cyan"}).start(),r=await h.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),f("No models available")),n.stop();let l;if(t.model){let v=r.find(m=>m.id===t.model||m.name.toLowerCase().includes(t.model.toLowerCase()));v||f(`Model "${t.model}" not found. Available models: ${r.map(m=>m.name).join(", ")}`),l=v.id}else{let v=c.getLastUsedModel();l=(await b(r,v)).id}let s=k({text:`Loading model: ${pe.cyan(l)}`,color:"cyan"}).start();await h.loadModel(l,s);let u=`lmstudio/${l.replace("/","--")}`;await fe(e,u,t)}async function Re(t,e){let o=k({text:"Checking Ollama status...",color:"cyan"}).start();await S.checkStatus()||(o.fail("Ollama is not running"),f("Ollama must be running. Start it with: ollama serve")),o.succeed("Connected to Ollama");let n=k({text:"Fetching available models...",color:"cyan"}).start(),r=await S.getAvailableModels();r.length===0&&(n.fail("No models found. Pull a model first: ollama pull <model>"),f("No models available")),n.stop();let l;if(t.model){let d=r.find(u=>u.id===t.model||u.name.toLowerCase().includes(t.model.toLowerCase()));d||f(`Model "${t.model}" not found. Available models: ${r.map(u=>u.name).join(", ")}`),l=d.id}else{let d=c.getLastUsedModel();l=(await b(r,d)).id}c.setModel(l);let s=`ollama/${l}`;await fe(e,s,t)}async function fe(t,e,o){let i=U(t);y(pe.green(`
|
|
9
|
+
Starting ${i} with model: ${e}
|
|
10
|
+
`));try{t==="opencode"?await E.run({model:e,args:o.args??[],verbose:o.verbose}):await R.run({model:e,args:o.args??[],verbose:o.verbose})}catch(n){f(`Failed to run ${i}: ${n instanceof Error?n.message:"Unknown error"}`)}}async function Z(t={}){let e;if(t.provider)e=t.provider;else{let r=c.getDefaultProvider();r?e=r:e=await Le()}let o=k({text:`Checking ${U(e)} installation...`,color:"cyan"}).start();(e==="opencode"?await E.isOpenCodeInstalled():await R.isClaudeCodeInstalled())||(o.fail(`${U(e)} is not installed.`),f(`Please install ${U(e)} first.`)),o.succeed(`${U(e)} is installed`),(t.backend??await Oe())==="ollama"?await Re(t,e):await Ae(t,e)}L();A();import a from"chalk";async function ee(){let[t,e]=await Promise.all([h.getStatus(),S.getStatus()]);console.log(),console.log(a.bold("LM Studio")),console.log(a.dim("\u2500".repeat(50))),console.log(` ${t.running?a.green("\u25CF"):a.red("\u25CB")} Server: ${t.running?a.green("Running"):a.red("Stopped")}`),console.log(` ${a.dim("\u25B8")} Port: ${a.cyan(String(t.port))}`),console.log(` ${a.dim("\u25B8")} URL: ${a.cyan(`http://localhost:${t.port}`)}`),t.activeModel&&console.log(` ${a.dim("\u25B8")} Active Model: ${a.green(t.activeModel)}`),t.running&&t.models.length>0?(console.log(),console.log(a.bold(" Models")),t.models.forEach((o,i)=>{let n=P(o.size),r=o.id===t.activeModel?` ${a.green("[LOADED]")}`:"";console.log(` ${a.dim(String(i+1)+".")} ${o.name}${r}`),console.log(` ${a.dim("ID:")} ${o.id}`),console.log(` ${a.dim("Size:")} ${n}`),o.quantization&&console.log(` ${a.dim("Quantization:")} ${o.quantization}`)})):t.running&&console.log(` ${a.dim("No models available")}`),console.log(),console.log(a.bold("Ollama")),console.log(a.dim("\u2500".repeat(50))),console.log(` ${e.running?a.green("\u25CF"):a.red("\u25CB")} Server: ${e.running?a.green("Running"):a.red("Stopped")}`),console.log(` ${a.dim("\u25B8")} Port: ${a.cyan(String(e.port))}`),console.log(` ${a.dim("\u25B8")} URL: ${a.cyan(`http://localhost:${e.port}`)}`),e.running&&e.runningModels.length>0&&console.log(` ${a.dim("\u25B8")} Running: ${a.green(e.runningModels.join(", "))}`),e.running&&e.models.length>0?(console.log(),console.log(a.bold(" Models")),e.models.forEach((o,i)=>{let n=P(o.size),l=e.runningModels.includes(o.id)?` ${a.green("[RUNNING]")}`:"",s=o.parameterSize?` ${a.dim(o.parameterSize)}`:"";console.log(` ${a.dim(String(i+1)+".")} ${o.name}${s}${l}`),console.log(` ${a.dim("Size:")} ${n}`),o.family&&console.log(` ${a.dim("Family:")} ${o.family}`),o.quantization&&console.log(` ${a.dim("Quantization:")} ${o.quantization}`)})):e.running&&console.log(` ${a.dim("No models available")}`),console.log()}import Ee from"ora";import D from"chalk";import{execa as ve}from"execa";import{readFileSync as Ue}from"fs";import{fileURLToPath as De}from"url";function oe(){try{let t=De(new URL("../../package.json",import.meta.url)),e=JSON.parse(Ue(t,"utf8"));return String(e.version)}catch{return"unknown"}}async function te(){let t=Ee({text:"Checking for updates...",color:"cyan"}).start();try{let e=oe();if(e==="unknown"){t.fail("Could not determine current version.");return}let{stdout:o}=await ve("npm",["view","@iamharshil/aix-cli","version"]),i=o.trim();if(e===i){t.succeed(`You're already on the latest version: ${D.green(`v${e}`)}`);return}t.text=`Updating: ${D.yellow(`v${e}`)} \u2192 ${D.green(`v${i}`)}...`,await ve("npm",["install","-g","@iamharshil/aix-cli@latest"]),t.succeed(`Successfully updated to ${D.green(`v${i}`)}! \u{1F680}`),ce(`Restart your terminal or run ${D.cyan("aix-cli --help")} to see what's new.`)}catch(e){t.fail("Failed to update."),V(e instanceof Error?e.message:String(e))}}var M=new Be;M.name("aix-cli").description("Run Claude Code or OpenCode with local AI models from LM Studio or Ollama").version(oe()).showHelpAfterError();function B(t=0){console.log(),console.log(p.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(p.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)});M.command("init",{isDefault:!1}).aliases(["i","load"]).description("Select a backend, load a model, and configure your provider").option("-m, --model <name>","Model name or ID to load","").option("-p, --provider <provider>","Coding tool to use (claude or opencode)","").option("-b, --backend <backend>","Model backend to use (lmstudio or ollama)","").action(H);M.command("run",{isDefault:!1}).aliases(["r"]).description("Run Claude Code or OpenCode with a model from LM Studio or Ollama").option("-m, --model <name>","Model name or ID to use","").option("-p, --provider <provider>","Coding tool to use (claude or opencode)","").option("-b, --backend <backend>","Model backend to use (lmstudio or ollama)","").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for the provider").action(async(t,e)=>{await Z({...e,args:t})});M.command("status",{isDefault:!1}).aliases(["s","stats"]).description("Show LM Studio and Ollama status and available models").action(ee);M.command("doctor",{isDefault:!1}).aliases(["d","check"]).description("Check system requirements and configuration").action(async()=>{let{lmStudioService:t}=await Promise.resolve().then(()=>(L(),ae)),{ollamaService:e}=await Promise.resolve().then(()=>(A(),le)),{claudeService:o}=await Promise.resolve().then(()=>(Q(),ue)),{openCodeService:i}=await Promise.resolve().then(()=>(Y(),me)),{configService:n}=await Promise.resolve().then(()=>($(),ne));console.log(p.bold.cyan("\u{1F527} AIX CLI System Check")),console.log(p.dim("\u2500".repeat(40)));let[r,l,s,d]=await Promise.all([t.checkStatus(),e.checkStatus(),o.isClaudeCodeInstalled(),i.isOpenCodeInstalled()]),u=n.getDefaultProvider(),v=n.getDefaultBackend(),m=n.get("lmStudioPort"),x=n.get("ollamaPort");console.log(),console.log(p.bold("Backends")),console.log(` ${r?"\u2705":"\u26A0\uFE0F"} LM Studio: ${r?p.green("Running"):p.yellow("Not running")} ${p.dim(`(port ${m})`)}`),console.log(` ${l?"\u2705":"\u26A0\uFE0F"} Ollama: ${l?p.green("Running"):p.yellow("Not running")} ${p.dim(`(port ${x})`)}`),console.log(),console.log(p.bold("Coding Tools")),console.log(` ${s?"\u2705":"\u274C"} Claude Code: ${s?p.green("Installed"):p.red("Not installed")}`),console.log(` ${d?"\u2705":"\u274C"} OpenCode: ${d?p.green("Installed"):p.red("Not installed")}`),console.log(),console.log(p.bold("Defaults")),console.log(` \u{1F4CC} Backend: ${p.cyan(v??"not set")}`),console.log(` \u{1F4CC} Coding tool: ${p.cyan(u??"not set")}`);let w=[];s||w.push(` \u2192 ${p.cyan("npm install -g @anthropic-ai/claude-code")}`),d||w.push(` \u2192 ${p.cyan("npm install -g opencode")}`),!r&&!l&&w.push(` \u2192 Start LM Studio or run ${p.cyan("ollama serve")}`),w.length>0&&(console.log(),console.log(p.bold("\u{1F4CB} Next Steps:")),w.forEach(I=>console.log(I))),console.log()});M.command("update",{isDefault:!1}).aliases(["upgrade","u"]).description("Update AIX CLI to the latest version").action(te);M.parse();
|
|
11
11
|
//# sourceMappingURL=aix.js.map
|
package/dist/bin/aix.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/services/config.ts", "../../src/services/lmstudio.ts", "../../src/services/ollama.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, Backend } 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 ollamaUrl: 'http://localhost',\n ollamaPort: 11434,\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 setDefaultBackend(backend: Backend): void {\n this.store.set('defaultBackend', backend);\n }\n\n getDefaultBackend(): Backend | undefined {\n const stored = this.store.get('defaultBackend');\n return stored as Backend | 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 getOllamaUrl(): string {\n const host = this.store.get('ollamaUrl');\n const port = this.store.get('ollamaPort');\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 { configService } from './config.js';\nimport type { OllamaStatus, OllamaModel } from '../types/index.js';\n\nexport class OllamaService {\n private getBaseUrl(): string {\n return configService.getOllamaUrl();\n }\n\n private getApiUrl(path: string): string {\n return `${this.getBaseUrl()}${path}`;\n }\n\n async checkStatus(): Promise<boolean> {\n try {\n const response = await fetch(this.getApiUrl('/api/tags'), {\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<OllamaModel[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/tags'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return [];\n\n const json = (await response.json()) as { models?: unknown[] };\n const models = json.models ?? [];\n\n return (models as Record<string, unknown>[])\n .map((m) => {\n const details = (m.details ?? {}) as Record<string, unknown>;\n return {\n id: String(m.name ?? m.model ?? ''),\n name: String(m.name ?? m.model ?? ''),\n size: Number(m.size ?? 0),\n quantization: String(details.quantization_level ?? ''),\n family: String(details.family ?? ''),\n parameterSize: String(details.parameter_size ?? ''),\n };\n })\n .filter((m) => m.id && m.name);\n } catch {\n return [];\n }\n }\n\n async getRunningModels(): Promise<string[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/ps'), {\n method: 'GET',\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) return [];\n\n const json = (await response.json()) as { models?: unknown[] };\n const models = json.models ?? [];\n\n return (models as Record<string, unknown>[])\n .map((m) => String(m.name ?? m.model ?? ''))\n .filter(Boolean);\n } catch {\n return [];\n }\n }\n\n async getStatus(): Promise<OllamaStatus> {\n const running = await this.checkStatus();\n\n if (!running) {\n return {\n running: false,\n port: configService.get('ollamaPort'),\n models: [],\n runningModels: [],\n };\n }\n\n const [models, runningModels] = await Promise.all([\n this.getAvailableModels(),\n this.getRunningModels(),\n ]);\n\n return {\n running: true,\n port: configService.get('ollamaPort'),\n models,\n runningModels,\n };\n }\n}\n\nexport const ollamaService = new OllamaService();\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 'Run Claude Code or OpenCode with local AI models from LM Studio or Ollama'\n )\n .version('3.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('Select a backend, load a model, and configure your provider')\n .option('-m, --model <name>', 'Model name or ID to load', '')\n .option('-p, --provider <provider>', 'Coding tool to use (claude or opencode)', '')\n .option('-b, --backend <backend>', 'Model backend to use (lmstudio or ollama)', '')\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 or Ollama')\n .option('-m, --model <name>', 'Model name or ID to use', '')\n .option('-p, --provider <provider>', 'Coding tool to use (claude or opencode)', '')\n .option('-b, --backend <backend>', 'Model backend to use (lmstudio or ollama)', '')\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 and Ollama 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 { ollamaService } = await import('./services/ollama.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, ollamaRunning, claudeInstalled, openCodeInstalled] = await Promise.all([\n lmStudioService.checkStatus(),\n ollamaService.checkStatus(),\n claudeService.isClaudeCodeInstalled(),\n openCodeService.isOpenCodeInstalled(),\n ]);\n\n const defaultProvider = configService.getDefaultProvider();\n const defaultBackend = configService.getDefaultBackend();\n const lmPort = configService.get('lmStudioPort');\n const ollamaPort = configService.get('ollamaPort');\n\n console.log();\n console.log(chalk.bold('Backends'));\n console.log(\n ` ${lmStudioRunning ? '\u2705' : '\u26A0\uFE0F'} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')} ${chalk.dim(`(port ${lmPort})`)}`\n );\n console.log(\n ` ${ollamaRunning ? '\u2705' : '\u26A0\uFE0F'} Ollama: ${ollamaRunning ? chalk.green('Running') : chalk.yellow('Not running')} ${chalk.dim(`(port ${ollamaPort})`)}`\n );\n\n console.log();\n console.log(chalk.bold('Coding Tools'));\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\n console.log();\n console.log(chalk.bold('Defaults'));\n console.log(` \uD83D\uDCCC Backend: ${chalk.cyan(defaultBackend ?? 'not set')}`);\n console.log(` \uD83D\uDCCC Coding tool: ${chalk.cyan(defaultProvider ?? 'not set')}`);\n\n const issues = [];\n if (!claudeInstalled) issues.push(` \u2192 ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n if (!openCodeInstalled) issues.push(` \u2192 ${chalk.cyan('npm install -g opencode')}`);\n if (!lmStudioRunning && !ollamaRunning) {\n issues.push(` \u2192 Start LM Studio or run ${chalk.cyan('ollama serve')}`);\n }\n\n if (issues.length > 0) {\n console.log();\n console.log(chalk.bold('\uD83D\uDCCB Next Steps:'));\n issues.forEach((issue) => console.log(issue));\n }\n\n console.log();\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { ollamaService } from '../services/ollama.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, Backend } from '../types/index.js';\n\nasync function selectBackend(): Promise<Backend> {\n const defaultBackend = configService.getDefaultBackend();\n const { backendSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'backendSelection',\n message: 'Select model backend:',\n default: defaultBackend ?? 'lmstudio',\n choices: [\n { name: '\uD83D\uDDA5\uFE0F LM Studio', value: 'lmstudio' as Backend },\n { name: '\uD83E\uDD99 Ollama', value: 'ollama' as Backend },\n ],\n },\n ]);\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default backend?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultBackend(backendSelection);\n success(`Default backend set to ${chalk.cyan(backendSelection)}`);\n }\n\n return backendSelection;\n}\n\nasync function selectProviderPrompt(): Promise<Provider> {\n const defaultProvider = configService.getDefaultProvider();\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select coding tool:',\n default: defaultProvider ?? 'claude',\n choices: [\n { name: 'Claude Code', value: 'claude' as Provider },\n { name: 'OpenCode', value: 'opencode' as Provider },\n ],\n },\n ]);\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default coding tool?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultProvider(providerSelection);\n success(`Default coding tool set to ${chalk.cyan(providerSelection)}`);\n }\n\n return providerSelection;\n}\n\nasync function initLMStudio(options: InitOptions, provider: Provider): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n console.log();\n console.log(chalk.bold('Available Models:'));\n console.log(chalk.dim('\u2500'.repeat(process.stdout.columns || 80)));\n\n models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded = model.loaded ? chalk.green(' [LOADED]') : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name} ${chalk.dim(`(${size})`)}${loaded}`\n );\n });\n console.log();\n\n const lastUsedModel = configService.getLastUsedModel();\n const modelSearch = options.model;\n const selectedModel = modelSearch\n ? models.find((m) => m.id === modelSearch || m.name.includes(modelSearch))\n : await selectModel(models, lastUsedModel);\n\n if (!selectedModel) {\n exitWithError('No model selected');\n }\n\n await lmStudioService.loadModel(selectedModel.id, spinner);\n\n const modelIdentifier = selectedModel.id.replace('/', '--');\n 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\nasync function initOllama(options: InitOptions, provider: Provider): Promise<void> {\n const spinner = ora({\n text: 'Checking Ollama status...',\n color: 'cyan',\n }).start();\n\n const isRunning = await ollamaService.checkStatus();\n\n if (!isRunning) {\n spinner.fail('Ollama is not running');\n exitWithError(\n 'Ollama must be running. Start it with: ollama serve'\n );\n }\n\n spinner.succeed('Connected to Ollama');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await ollamaService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Pull a model first: ollama pull <model>');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n const runningModels = await ollamaService.getRunningModels();\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 isRunningModel = runningModels.includes(model.id);\n const status = isRunningModel ? chalk.green(' [RUNNING]') : '';\n const info = model.parameterSize ? chalk.dim(` ${model.parameterSize}`) : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name}${info} ${chalk.dim(`(${size})`)}${status}`\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 configService.setModel(selectedModel.id);\n\n const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n\n success(chalk.bold(`\\nModel selected: ${selectedModel.name}`));\n console.log();\n console.log(`Run ${providerName} with this model:`);\n console.log(\n ` ${chalk.cyan((provider === 'opencode' ? 'opencode' : 'claude') + ' --model ollama/' + selectedModel.id)}`\n );\n console.log();\n console.log(`Or use ${chalk.cyan('aix-cli run')} to start an interactive session`);\n}\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n // Select backend\n const backend: Backend = options.backend ?? (await selectBackend());\n\n // Select provider\n const provider: Provider = options.provider ?? (await selectProviderPrompt());\n\n if (backend === 'ollama') {\n await initOllama(options, provider);\n } else {\n await initLMStudio(options, provider);\n }\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 { ollamaService } from '../services/ollama.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, Backend } from '../types/index.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n provider?: Provider;\n backend?: Backend;\n}\n\nasync function selectBackend(): Promise<Backend> {\n const defaultBackend = configService.getDefaultBackend();\n\n if (defaultBackend) {\n return defaultBackend;\n }\n\n const { backendSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'backendSelection',\n message: 'Select model backend:',\n choices: [\n { name: '\uD83D\uDDA5\uFE0F LM Studio', value: 'lmstudio' as Backend },\n { name: '\uD83E\uDD99 Ollama', value: 'ollama' as Backend },\n ],\n },\n ]);\n\n return backendSelection;\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\nfunction getProviderDisplayName(provider: Provider): string {\n return provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n}\n\nasync function runWithLMStudio(options: RunOptions, provider: Provider): Promise<void> {\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 await launchProvider(provider, fullModelName, options);\n}\n\nasync function runWithOllama(options: RunOptions, provider: Provider): Promise<void> {\n const serverSpinner = ora({\n text: 'Checking Ollama status...',\n color: 'cyan',\n }).start();\n\n const isRunning = await ollamaService.checkStatus();\n\n if (!isRunning) {\n serverSpinner.fail('Ollama is not running');\n exitWithError('Ollama must be running. Start it with: ollama serve');\n }\n\n serverSpinner.succeed('Connected to Ollama');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await ollamaService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Pull a model first: ollama pull <model>');\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 configService.setModel(selectedModelId);\n\n const fullModelName = `ollama/${selectedModelId}`;\n\n await launchProvider(provider, fullModelName, options);\n}\n\nasync function launchProvider(\n provider: Provider,\n fullModelName: string,\n options: RunOptions\n): Promise<void> {\n const providerName = getProviderDisplayName(provider);\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\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n // Resolve provider\n let provider: Provider;\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 // Check provider is installed\n const providerSpinner = ora({\n text: `Checking ${getProviderDisplayName(provider)} 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(`${getProviderDisplayName(provider)} is not installed.`);\n exitWithError(`Please install ${getProviderDisplayName(provider)} first.`);\n }\n\n providerSpinner.succeed(`${getProviderDisplayName(provider)} is installed`);\n\n // Resolve backend\n const backend: Backend = options.backend ?? (await selectBackend());\n\n if (backend === 'ollama') {\n await runWithOllama(options, provider);\n } else {\n await runWithLMStudio(options, provider);\n }\n}\n", "import chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { ollamaService } from '../services/ollama.js';\nimport { formatBytes } from '../utils/format.js';\n\nexport async function statusCommand(): Promise<void> {\n const [lmStatus, ollamaStatus] = await Promise.all([\n lmStudioService.getStatus(),\n ollamaService.getStatus(),\n ]);\n\n // LM Studio section\n console.log();\n console.log(chalk.bold('LM Studio'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(\n ` ${lmStatus.running ? chalk.green('\u25CF') : chalk.red('\u25CB')} Server: ${lmStatus.running ? chalk.green('Running') : chalk.red('Stopped')}`\n );\n console.log(` ${chalk.dim('\u25B8')} Port: ${chalk.cyan(String(lmStatus.port))}`);\n console.log(\n ` ${chalk.dim('\u25B8')} URL: ${chalk.cyan(`http://localhost:${lmStatus.port}`)}`\n );\n\n if (lmStatus.activeModel) {\n console.log(\n ` ${chalk.dim('\u25B8')} Active Model: ${chalk.green(lmStatus.activeModel)}`\n );\n }\n\n if (lmStatus.running && lmStatus.models.length > 0) {\n console.log();\n console.log(chalk.bold(' Models'));\n lmStatus.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded =\n model.id === lmStatus.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 });\n } else if (lmStatus.running) {\n console.log(` ${chalk.dim('No models available')}`);\n }\n\n // Ollama section\n console.log();\n console.log(chalk.bold('Ollama'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(\n ` ${ollamaStatus.running ? chalk.green('\u25CF') : chalk.red('\u25CB')} Server: ${ollamaStatus.running ? chalk.green('Running') : chalk.red('Stopped')}`\n );\n console.log(` ${chalk.dim('\u25B8')} Port: ${chalk.cyan(String(ollamaStatus.port))}`);\n console.log(\n ` ${chalk.dim('\u25B8')} URL: ${chalk.cyan(`http://localhost:${ollamaStatus.port}`)}`\n );\n\n if (ollamaStatus.running && ollamaStatus.runningModels.length > 0) {\n console.log(\n ` ${chalk.dim('\u25B8')} Running: ${chalk.green(ollamaStatus.runningModels.join(', '))}`\n );\n }\n\n if (ollamaStatus.running && ollamaStatus.models.length > 0) {\n console.log();\n console.log(chalk.bold(' Models'));\n ollamaStatus.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const isRunning = ollamaStatus.runningModels.includes(model.id);\n const status = isRunning ? ` ${chalk.green('[RUNNING]')}` : '';\n const info = model.parameterSize ? ` ${chalk.dim(model.parameterSize)}` : '';\n console.log(\n ` ${chalk.dim(String(index + 1) + '.')} ${model.name}${info}${status}`\n );\n console.log(` ${chalk.dim('Size:')} ${size}`);\n if (model.family) {\n console.log(` ${chalk.dim('Family:')} ${model.family}`);\n }\n if (model.quantization) {\n console.log(` ${chalk.dim('Quantization:')} ${model.quantization}`);\n }\n });\n } else if (ollamaStatus.running) {\n console.log(` ${chalk.dim('No models available')}`);\n }\n\n console.log();\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["config_exports", "__export", "ConfigService", "configService", "Conf", "init_config", "__esmMin", "key", "value", "model", "provider", "backend", "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", "ollama_exports", "__export", "OllamaService", "ollamaService", "init_ollama", "__esmMin", "init_config", "configService", "path", "response", "m", "details", "models", "runningModels", "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_ollama", "init_config", "ora", "chalk", "inquirer", "inquirer", "selectModel", "models", "defaultModel", "choices", "model", "defaultIndex", "m", "confirmAction", "message", "defaultValue", "chalk", "formatBytes", "bytes", "k", "sizes", "
|
|
3
|
+
"sources": ["../../src/services/config.ts", "../../src/services/lmstudio.ts", "../../src/services/ollama.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", "../../src/commands/update.ts"],
|
|
4
|
+
"sourcesContent": ["import Conf from 'conf';\nimport type { Config, Provider, Backend } 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 ollamaUrl: 'http://localhost',\n ollamaPort: 11434,\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 setDefaultBackend(backend: Backend): void {\n this.store.set('defaultBackend', backend);\n }\n\n getDefaultBackend(): Backend | undefined {\n const stored = this.store.get('defaultBackend');\n return stored as Backend | 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 getOllamaUrl(): string {\n const host = this.store.get('ollamaUrl');\n const port = this.store.get('ollamaPort');\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 { configService } from './config.js';\nimport type { OllamaStatus, OllamaModel } from '../types/index.js';\n\nexport class OllamaService {\n private getBaseUrl(): string {\n return configService.getOllamaUrl();\n }\n\n private getApiUrl(path: string): string {\n return `${this.getBaseUrl()}${path}`;\n }\n\n async checkStatus(): Promise<boolean> {\n try {\n const response = await fetch(this.getApiUrl('/api/tags'), {\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<OllamaModel[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/tags'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return [];\n\n const json = (await response.json()) as { models?: unknown[] };\n const models = json.models ?? [];\n\n return (models as Record<string, unknown>[])\n .map((m) => {\n const details = (m.details ?? {}) as Record<string, unknown>;\n return {\n id: String(m.name ?? m.model ?? ''),\n name: String(m.name ?? m.model ?? ''),\n size: Number(m.size ?? 0),\n quantization: String(details.quantization_level ?? ''),\n family: String(details.family ?? ''),\n parameterSize: String(details.parameter_size ?? ''),\n };\n })\n .filter((m) => m.id && m.name);\n } catch {\n return [];\n }\n }\n\n async getRunningModels(): Promise<string[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/ps'), {\n method: 'GET',\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) return [];\n\n const json = (await response.json()) as { models?: unknown[] };\n const models = json.models ?? [];\n\n return (models as Record<string, unknown>[])\n .map((m) => String(m.name ?? m.model ?? ''))\n .filter(Boolean);\n } catch {\n return [];\n }\n }\n\n async getStatus(): Promise<OllamaStatus> {\n const running = await this.checkStatus();\n\n if (!running) {\n return {\n running: false,\n port: configService.get('ollamaPort'),\n models: [],\n runningModels: [],\n };\n }\n\n const [models, runningModels] = await Promise.all([\n this.getAvailableModels(),\n this.getRunningModels(),\n ]);\n\n return {\n running: true,\n port: configService.get('ollamaPort'),\n models,\n runningModels,\n };\n }\n}\n\nexport const ollamaService = new OllamaService();\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, updateCommand } from './commands/index.js';\nimport { getCurrentVersion } from './commands/update.js';\n\nconst program = new Command();\n\nprogram\n .name('aix-cli')\n .description(\n 'Run Claude Code or OpenCode with local AI models from LM Studio or Ollama'\n )\n .version(getCurrentVersion())\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('Select a backend, load a model, and configure your provider')\n .option('-m, --model <name>', 'Model name or ID to load', '')\n .option('-p, --provider <provider>', 'Coding tool to use (claude or opencode)', '')\n .option('-b, --backend <backend>', 'Model backend to use (lmstudio or ollama)', '')\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 or Ollama')\n .option('-m, --model <name>', 'Model name or ID to use', '')\n .option('-p, --provider <provider>', 'Coding tool to use (claude or opencode)', '')\n .option('-b, --backend <backend>', 'Model backend to use (lmstudio or ollama)', '')\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 and Ollama 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 { ollamaService } = await import('./services/ollama.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, ollamaRunning, claudeInstalled, openCodeInstalled] = await Promise.all([\n lmStudioService.checkStatus(),\n ollamaService.checkStatus(),\n claudeService.isClaudeCodeInstalled(),\n openCodeService.isOpenCodeInstalled(),\n ]);\n\n const defaultProvider = configService.getDefaultProvider();\n const defaultBackend = configService.getDefaultBackend();\n const lmPort = configService.get('lmStudioPort');\n const ollamaPort = configService.get('ollamaPort');\n\n console.log();\n console.log(chalk.bold('Backends'));\n console.log(\n ` ${lmStudioRunning ? '\u2705' : '\u26A0\uFE0F'} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')} ${chalk.dim(`(port ${lmPort})`)}`\n );\n console.log(\n ` ${ollamaRunning ? '\u2705' : '\u26A0\uFE0F'} Ollama: ${ollamaRunning ? chalk.green('Running') : chalk.yellow('Not running')} ${chalk.dim(`(port ${ollamaPort})`)}`\n );\n\n console.log();\n console.log(chalk.bold('Coding Tools'));\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\n console.log();\n console.log(chalk.bold('Defaults'));\n console.log(` \uD83D\uDCCC Backend: ${chalk.cyan(defaultBackend ?? 'not set')}`);\n console.log(` \uD83D\uDCCC Coding tool: ${chalk.cyan(defaultProvider ?? 'not set')}`);\n\n const issues = [];\n if (!claudeInstalled) issues.push(` \u2192 ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n if (!openCodeInstalled) issues.push(` \u2192 ${chalk.cyan('npm install -g opencode')}`);\n if (!lmStudioRunning && !ollamaRunning) {\n issues.push(` \u2192 Start LM Studio or run ${chalk.cyan('ollama serve')}`);\n }\n\n if (issues.length > 0) {\n console.log();\n console.log(chalk.bold('\uD83D\uDCCB Next Steps:'));\n issues.forEach((issue) => console.log(issue));\n }\n\n console.log();\n });\n\nprogram\n .command('update', { isDefault: false })\n .aliases(['upgrade', 'u'])\n .description('Update AIX CLI to the latest version')\n .action(updateCommand);\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { ollamaService } from '../services/ollama.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, Backend } from '../types/index.js';\n\nasync function selectBackend(): Promise<Backend> {\n const defaultBackend = configService.getDefaultBackend();\n const { backendSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'backendSelection',\n message: 'Select model backend:',\n default: defaultBackend ?? 'lmstudio',\n choices: [\n { name: '\uD83D\uDDA5\uFE0F LM Studio', value: 'lmstudio' as Backend },\n { name: '\uD83E\uDD99 Ollama', value: 'ollama' as Backend },\n ],\n },\n ]);\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default backend?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultBackend(backendSelection);\n success(`Default backend set to ${chalk.cyan(backendSelection)}`);\n }\n\n return backendSelection;\n}\n\nasync function selectProviderPrompt(): Promise<Provider> {\n const defaultProvider = configService.getDefaultProvider();\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select coding tool:',\n default: defaultProvider ?? 'claude',\n choices: [\n { name: 'Claude Code', value: 'claude' as Provider },\n { name: 'OpenCode', value: 'opencode' as Provider },\n ],\n },\n ]);\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default coding tool?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultProvider(providerSelection);\n success(`Default coding tool set to ${chalk.cyan(providerSelection)}`);\n }\n\n return providerSelection;\n}\n\nasync function initLMStudio(options: InitOptions, provider: Provider): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n console.log();\n console.log(chalk.bold('Available Models:'));\n console.log(chalk.dim('\u2500'.repeat(process.stdout.columns || 80)));\n\n models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded = model.loaded ? chalk.green(' [LOADED]') : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name} ${chalk.dim(`(${size})`)}${loaded}`\n );\n });\n console.log();\n\n const lastUsedModel = configService.getLastUsedModel();\n const modelSearch = options.model;\n const selectedModel = modelSearch\n ? models.find((m) => m.id === modelSearch || m.name.includes(modelSearch))\n : await selectModel(models, lastUsedModel);\n\n if (!selectedModel) {\n exitWithError('No model selected');\n }\n\n await lmStudioService.loadModel(selectedModel.id, spinner);\n\n const modelIdentifier = selectedModel.id.replace('/', '--');\n 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\nasync function initOllama(options: InitOptions, provider: Provider): Promise<void> {\n const spinner = ora({\n text: 'Checking Ollama status...',\n color: 'cyan',\n }).start();\n\n const isRunning = await ollamaService.checkStatus();\n\n if (!isRunning) {\n spinner.fail('Ollama is not running');\n exitWithError(\n 'Ollama must be running. Start it with: ollama serve'\n );\n }\n\n spinner.succeed('Connected to Ollama');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await ollamaService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Pull a model first: ollama pull <model>');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n const runningModels = await ollamaService.getRunningModels();\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 isRunningModel = runningModels.includes(model.id);\n const status = isRunningModel ? chalk.green(' [RUNNING]') : '';\n const info = model.parameterSize ? chalk.dim(` ${model.parameterSize}`) : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name}${info} ${chalk.dim(`(${size})`)}${status}`\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 configService.setModel(selectedModel.id);\n\n const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n\n success(chalk.bold(`\\nModel selected: ${selectedModel.name}`));\n console.log();\n console.log(`Run ${providerName} with this model:`);\n console.log(\n ` ${chalk.cyan((provider === 'opencode' ? 'opencode' : 'claude') + ' --model ollama/' + selectedModel.id)}`\n );\n console.log();\n console.log(`Or use ${chalk.cyan('aix-cli run')} to start an interactive session`);\n}\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n // Select backend\n const backend: Backend = options.backend ?? (await selectBackend());\n\n // Select provider\n const provider: Provider = options.provider ?? (await selectProviderPrompt());\n\n if (backend === 'ollama') {\n await initOllama(options, provider);\n } else {\n await initLMStudio(options, provider);\n }\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 { ollamaService } from '../services/ollama.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, Backend } from '../types/index.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n provider?: Provider;\n backend?: Backend;\n}\n\nasync function selectBackend(): Promise<Backend> {\n const defaultBackend = configService.getDefaultBackend();\n\n if (defaultBackend) {\n return defaultBackend;\n }\n\n const { backendSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'backendSelection',\n message: 'Select model backend:',\n choices: [\n { name: '\uD83D\uDDA5\uFE0F LM Studio', value: 'lmstudio' as Backend },\n { name: '\uD83E\uDD99 Ollama', value: 'ollama' as Backend },\n ],\n },\n ]);\n\n return backendSelection;\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\nfunction getProviderDisplayName(provider: Provider): string {\n return provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n}\n\nasync function runWithLMStudio(options: RunOptions, provider: Provider): Promise<void> {\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 await launchProvider(provider, fullModelName, options);\n}\n\nasync function runWithOllama(options: RunOptions, provider: Provider): Promise<void> {\n const serverSpinner = ora({\n text: 'Checking Ollama status...',\n color: 'cyan',\n }).start();\n\n const isRunning = await ollamaService.checkStatus();\n\n if (!isRunning) {\n serverSpinner.fail('Ollama is not running');\n exitWithError('Ollama must be running. Start it with: ollama serve');\n }\n\n serverSpinner.succeed('Connected to Ollama');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await ollamaService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Pull a model first: ollama pull <model>');\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 configService.setModel(selectedModelId);\n\n const fullModelName = `ollama/${selectedModelId}`;\n\n await launchProvider(provider, fullModelName, options);\n}\n\nasync function launchProvider(\n provider: Provider,\n fullModelName: string,\n options: RunOptions\n): Promise<void> {\n const providerName = getProviderDisplayName(provider);\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\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n // Resolve provider\n let provider: Provider;\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 // Check provider is installed\n const providerSpinner = ora({\n text: `Checking ${getProviderDisplayName(provider)} 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(`${getProviderDisplayName(provider)} is not installed.`);\n exitWithError(`Please install ${getProviderDisplayName(provider)} first.`);\n }\n\n providerSpinner.succeed(`${getProviderDisplayName(provider)} is installed`);\n\n // Resolve backend\n const backend: Backend = options.backend ?? (await selectBackend());\n\n if (backend === 'ollama') {\n await runWithOllama(options, provider);\n } else {\n await runWithLMStudio(options, provider);\n }\n}\n", "import chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { ollamaService } from '../services/ollama.js';\nimport { formatBytes } from '../utils/format.js';\n\nexport async function statusCommand(): Promise<void> {\n const [lmStatus, ollamaStatus] = await Promise.all([\n lmStudioService.getStatus(),\n ollamaService.getStatus(),\n ]);\n\n // LM Studio section\n console.log();\n console.log(chalk.bold('LM Studio'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(\n ` ${lmStatus.running ? chalk.green('\u25CF') : chalk.red('\u25CB')} Server: ${lmStatus.running ? chalk.green('Running') : chalk.red('Stopped')}`\n );\n console.log(` ${chalk.dim('\u25B8')} Port: ${chalk.cyan(String(lmStatus.port))}`);\n console.log(\n ` ${chalk.dim('\u25B8')} URL: ${chalk.cyan(`http://localhost:${lmStatus.port}`)}`\n );\n\n if (lmStatus.activeModel) {\n console.log(\n ` ${chalk.dim('\u25B8')} Active Model: ${chalk.green(lmStatus.activeModel)}`\n );\n }\n\n if (lmStatus.running && lmStatus.models.length > 0) {\n console.log();\n console.log(chalk.bold(' Models'));\n lmStatus.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded =\n model.id === lmStatus.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 });\n } else if (lmStatus.running) {\n console.log(` ${chalk.dim('No models available')}`);\n }\n\n // Ollama section\n console.log();\n console.log(chalk.bold('Ollama'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(\n ` ${ollamaStatus.running ? chalk.green('\u25CF') : chalk.red('\u25CB')} Server: ${ollamaStatus.running ? chalk.green('Running') : chalk.red('Stopped')}`\n );\n console.log(` ${chalk.dim('\u25B8')} Port: ${chalk.cyan(String(ollamaStatus.port))}`);\n console.log(\n ` ${chalk.dim('\u25B8')} URL: ${chalk.cyan(`http://localhost:${ollamaStatus.port}`)}`\n );\n\n if (ollamaStatus.running && ollamaStatus.runningModels.length > 0) {\n console.log(\n ` ${chalk.dim('\u25B8')} Running: ${chalk.green(ollamaStatus.runningModels.join(', '))}`\n );\n }\n\n if (ollamaStatus.running && ollamaStatus.models.length > 0) {\n console.log();\n console.log(chalk.bold(' Models'));\n ollamaStatus.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const isRunning = ollamaStatus.runningModels.includes(model.id);\n const status = isRunning ? ` ${chalk.green('[RUNNING]')}` : '';\n const info = model.parameterSize ? ` ${chalk.dim(model.parameterSize)}` : '';\n console.log(\n ` ${chalk.dim(String(index + 1) + '.')} ${model.name}${info}${status}`\n );\n console.log(` ${chalk.dim('Size:')} ${size}`);\n if (model.family) {\n console.log(` ${chalk.dim('Family:')} ${model.family}`);\n }\n if (model.quantization) {\n console.log(` ${chalk.dim('Quantization:')} ${model.quantization}`);\n }\n });\n } else if (ollamaStatus.running) {\n console.log(` ${chalk.dim('No models available')}`);\n }\n\n console.log();\n}\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { error as logError, info } from '../utils/format.js';\n\nexport function getCurrentVersion(): string {\n try {\n // Note: since this is bundled by esbuild into dist/src/index.js,\n // the relative path from import.meta.url to project root is ../../\n const pkgPath = fileURLToPath(new URL('../../package.json', import.meta.url));\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n return String(pkg.version);\n } catch {\n return 'unknown';\n }\n}\n\nexport async function updateCommand(): Promise<void> {\n const spinner = ora({\n text: 'Checking for updates...',\n color: 'cyan',\n }).start();\n\n try {\n const currentVersion = getCurrentVersion();\n \n if (currentVersion === 'unknown') {\n spinner.fail('Could not determine current version.');\n return;\n }\n\n const { stdout: latestVersion } = await execa('npm', ['view', '@iamharshil/aix-cli', 'version']);\n const latest = latestVersion.trim();\n\n if (currentVersion === latest) {\n spinner.succeed(`You're already on the latest version: ${chalk.green(`v${currentVersion}`)}`);\n return;\n }\n\n spinner.text = `Updating: ${chalk.yellow(`v${currentVersion}`)} \u2192 ${chalk.green(`v${latest}`)}...`;\n \n await execa('npm', ['install', '-g', '@iamharshil/aix-cli@latest']);\n \n spinner.succeed(`Successfully updated to ${chalk.green(`v${latest}`)}! \uD83D\uDE80`);\n info(`Restart your terminal or run ${chalk.cyan('aix-cli --help')} to see what's new.`);\n \n } catch (err) {\n spinner.fail('Failed to update.');\n logError(err instanceof Error ? err.message : String(err));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["config_exports", "__export", "ConfigService", "configService", "Conf", "init_config", "__esmMin", "key", "value", "model", "provider", "backend", "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", "ollama_exports", "__export", "OllamaService", "ollamaService", "init_ollama", "__esmMin", "init_config", "configService", "path", "response", "m", "details", "models", "runningModels", "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_ollama", "init_config", "ora", "chalk", "inquirer", "inquirer", "selectModel", "models", "defaultModel", "choices", "model", "defaultIndex", "m", "confirmAction", "message", "defaultValue", "chalk", "formatBytes", "bytes", "k", "sizes", "success", "message", "chalk", "error", "info", "exitWithError", "message", "code", "error", "selectBackend", "defaultBackend", "configService", "backendSelection", "inquirer", "saveDefault", "success", "chalk", "selectProviderPrompt", "defaultProvider", "providerSelection", "initLMStudio", "options", "provider", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "modelSearch", "selectedModel", "selectModel", "modelIdentifier", "providerName", "initOllama", "ollamaService", "runningModels", "status", "info", "initCommand", "backend", "init_lmstudio", "init_ollama", "init_claude", "init_opencode", "init_config", "ora", "chalk", "inquirer", "selectBackend", "defaultBackend", "configService", "backendSelection", "inquirer", "selectProvider", "claudeInstalled", "claudeService", "openCodeInstalled", "openCodeService", "choices", "exitWithError", "providerSelection", "getProviderDisplayName", "provider", "runWithLMStudio", "options", "serverSpinner", "ora", "isRunning", "lmStudioService", "confirmAction", "modelsSpinner", "models", "selectedModelId", "foundModel", "lastUsedModel", "selectModel", "loadSpinner", "chalk", "fullModelName", "launchProvider", "runWithOllama", "ollamaService", "m", "providerName", "success", "error", "runCommand", "storedProvider", "providerSpinner", "init_lmstudio", "init_ollama", "chalk", "statusCommand", "lmStatus", "ollamaStatus", "lmStudioService", "ollamaService", "chalk", "model", "index", "size", "formatBytes", "loaded", "status", "info", "ora", "chalk", "execa", "readFileSync", "fileURLToPath", "getCurrentVersion", "pkgPath", "fileURLToPath", "pkg", "readFileSync", "updateCommand", "spinner", "ora", "currentVersion", "latestVersion", "execa", "latest", "chalk", "info", "err", "error", "program", "Command", "getCurrentVersion", "handleExit", "code", "chalk", "err", "reason", "r", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "ollamaService", "claudeService", "openCodeService", "configService", "lmStudioRunning", "ollamaRunning", "claudeInstalled", "openCodeInstalled", "defaultProvider", "defaultBackend", "lmPort", "ollamaPort", "issues", "issue", "updateCommand"]
|
|
7
7
|
}
|
package/dist/commands/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/commands/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAOA,wBAAgB,iBAAiB,IAAI,MAAM,CAU1C;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiCnD"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
2
|
+
var we=Object.defineProperty;var ye=(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 C=(t,e)=>()=>(t&&(e=t(t=0)),e);var O=(t,e)=>{for(var o in e)we(t,o,{get:e[o],enumerable:!0})};var ne={};O(ne,{ConfigService:()=>N,configService:()=>c});import Me from"conf";var N,c,$=C(()=>{"use strict";N=class{store;constructor(){this.store=new Me({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,ollamaUrl:"http://localhost",ollamaPort:11434,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")}setDefaultBackend(e){this.store.set("defaultBackend",e)}getDefaultBackend(){return this.store.get("defaultBackend")}getLMStudioUrl(){let e=this.store.get("lmStudioUrl"),o=this.store.get("lmStudioPort");return`${e}:${o}`}getOllamaUrl(){let e=this.store.get("ollamaUrl"),o=this.store.get("ollamaPort");return`${e}:${o}`}reset(){this.store.clear()}},c=new N});var ae={};O(ae,{LMStudioService:()=>j,lmStudioService:()=>h});import{execa as z}from"execa";import re from"ora";import ie from"chalk";var se,j,h,L=C(()=>{"use strict";$();se=[1234,1235,1236,1237],j=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 i=await fetch(this.getApiUrl(o),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!i.ok)continue;let n=await i.json(),r=[];return Array.isArray(n)?r=n:n.models&&Array.isArray(n.models)?r=n.models:n.data&&Array.isArray(n.data)&&(r=n.data),r.map(l=>{let s=l;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(l=>l.id&&l.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 i=await o.json();return{running:!0,port:c.get("lmStudioPort"),models:i.models??[],activeModel:i.active_model}}catch{return{running:!1,port:c.get("lmStudioPort"),models:[]}}}async loadModel(e,o){let i=o??re({text:`Loading model: ${ie.cyan(e)}`,color:"cyan"}).start();try{let n=await fetch(this.getApiUrl("/api/model/load"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:e}),signal:AbortSignal.timeout(3e5)});if(!n.ok)throw new Error(`Failed to load model: ${n.statusText}`);return i.succeed(`Model ${ie.green(e)} loaded successfully`),c.setModel(e),{loadSpinner:i}}catch(n){throw i.fail(`Failed to load model: ${n instanceof Error?n.message:"Unknown error"}`),n}}async startServer(e){let o=e??re({text:"Starting LM Studio server...",color:"cyan"}).start();try{let i=process.platform==="darwin",n=process.platform==="linux",r=process.platform==="win32",l;if(i){let s=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let d of s)try{let{existsSync:u}=await import("fs");if(u(d)){l=`open "${d}" --args --server`;break}}catch{}if(l?.startsWith("open")){await z("open",[s.find(d=>{try{let{existsSync:u}=ye("fs");return u(d)}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 n?l=await this.findLinuxBinary():r&&(l=await this.findWindowsExecutable());if(!l)throw o.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await z(l,["--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(i){throw o.fail(`Failed to start LM Studio: ${i instanceof Error?i.message:"Unknown error"}`),i}}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 z("test",["-x",o]),o}catch{continue}}async findWindowsExecutable(){let e=process.env.LOCALAPPDATA,o=process.env.PROGRAMFILES,i=[e?`${e}\\Programs\\LM Studio\\lm-studio.exe`:"",o?`${o}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let n of i)try{return await z("cmd",["/c","if exist",`"${n}"`,"echo","yes"]),n}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 se)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 se[0]??1234}},h=new j});var le={};O(le,{OllamaService:()=>T,ollamaService:()=>S});var T,S,A=C(()=>{"use strict";$();T=class{getBaseUrl(){return c.getOllamaUrl()}getApiUrl(e){return`${this.getBaseUrl()}${e}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/tags"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){try{let e=await fetch(this.getApiUrl("/api/tags"),{method:"GET",signal:AbortSignal.timeout(1e4)});return e.ok?((await e.json()).models??[]).map(n=>{let r=n.details??{};return{id:String(n.name??n.model??""),name:String(n.name??n.model??""),size:Number(n.size??0),quantization:String(r.quantization_level??""),family:String(r.family??""),parameterSize:String(r.parameter_size??"")}}).filter(n=>n.id&&n.name):[]}catch{return[]}}async getRunningModels(){try{let e=await fetch(this.getApiUrl("/api/ps"),{method:"GET",signal:AbortSignal.timeout(5e3)});return e.ok?((await e.json()).models??[]).map(n=>String(n.name??n.model??"")).filter(Boolean):[]}catch{return[]}}async getStatus(){if(!await this.checkStatus())return{running:!1,port:c.get("ollamaPort"),models:[],runningModels:[]};let[o,i]=await Promise.all([this.getAvailableModels(),this.getRunningModels()]);return{running:!0,port:c.get("ollamaPort"),models:o,runningModels:i}}},S=new T});var ue={};O(ue,{ClaudeService:()=>G,claudeService:()=>R});import{execa as J}from"execa";import xe from"chalk";var G,R,Q=C(()=>{"use strict";G=class{async isClaudeCodeInstalled(){try{return await J("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:o,args:i=[],verbose:n=!1}=e,r=this.extractProvider(o),l=this.extractModelName(o);if(!r||!l)throw new Error(`Invalid model format: ${o}. Expected format: provider/model-name`);let s=`${r}/${l}`,d=["--model",s,...i];n&&console.log(xe.dim(`
|
|
3
3
|
Running: claude ${d.join(" ")}
|
|
4
|
-
`));try{await
|
|
4
|
+
`));try{await J("claude",d,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:s}})}catch(u){if(u instanceof Error&&"exitCode"in u){let v=u.exitCode;process.exit(v??1)}throw u}}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 J("claude",["--version"])).stdout}catch{return}}},R=new G});var me={};O(me,{OpenCodeService:()=>W,openCodeService:()=>E});import{execa as X}from"execa";import Ce from"chalk";var W,E,Y=C(()=>{"use strict";W=class{async isOpenCodeInstalled(){try{return await X("opencode",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:o,args:i=[],verbose:n=!1}=e,r=this.extractProvider(o),l=this.extractModelName(o);if(!r||!l)throw new Error(`Invalid model format: ${o}. Expected format: provider/model-name`);let s=["--model",o,...i];n&&console.log(Ce.dim(`
|
|
5
5
|
Running: opencode ${s.join(" ")}
|
|
6
|
-
`));try{await
|
|
7
|
-
Model ready: ${d.name}`)),console.log(),console.log(`Run ${v} with this model:`),console.log(` ${
|
|
8
|
-
Model selected: ${u.name}`)),console.log(),console.log(`Run ${v} with this model:`),console.log(` ${
|
|
9
|
-
Starting ${
|
|
10
|
-
`));try{t==="opencode"?await E.run({model:e,args:o.args??[],verbose:o.verbose}):await R.run({model:e,args:o.args??[],verbose:o.verbose})}catch(n){f(`Failed to run ${
|
|
6
|
+
`));try{await X("opencode",s,{stdio:"inherit",env:{...process.env,OPENCODE_MODEL_NAME:l,OPENCODE_MODEL_PROVIDER:r}})}catch(d){if(d instanceof Error&&"exitCode"in d){let u=d.exitCode;process.exit(u??1)}throw d}}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 X("opencode",["--version"])).stdout}catch{return}}},E=new W});import{Command as Be}from"commander";import p from"chalk";L();A();$();import _ from"ora";import g from"chalk";import q from"inquirer";import de from"inquirer";async function b(t,e){let o=t.map(r=>({name:`${r.name} (${r.id})`,value:r,short:r.name})),i=e?o.findIndex(r=>r.value.id===e):0;return(await de.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:o,default:Math.max(0,i),pageSize:Math.min(t.length,15)}])).model}async function F(t,e=!0){return(await de.prompt([{type:"confirm",name:"confirm",message:t,default:e}])).confirm}import K from"chalk";function P(t){if(t===0)return"0 B";let e=1024,o=["B","KB","MB","GB","TB"],i=Math.floor(Math.log(t)/Math.log(e));return`${parseFloat((t/Math.pow(e,i)).toFixed(2))} ${o[i]}`}function y(t){console.log(K.green("\u2713")+" "+t)}function V(t){console.error(K.red("\u2717")+" "+t)}function ce(t){console.log(K.blue("\u2139")+" "+t)}function f(t,e=1){V(t),process.exit(e)}async function $e(){let t=c.getDefaultBackend(),{backendSelection:e}=await q.prompt([{type:"list",name:"backendSelection",message:"Select model backend:",default:t??"lmstudio",choices:[{name:"\u{1F5A5}\uFE0F LM Studio",value:"lmstudio"},{name:"\u{1F999} Ollama",value:"ollama"}]}]),{saveDefault:o}=await q.prompt([{type:"confirm",name:"saveDefault",message:"Save as default backend?",default:!1}]);return o&&(c.setDefaultBackend(e),y(`Default backend set to ${g.cyan(e)}`)),e}async function be(){let t=c.getDefaultProvider(),{providerSelection:e}=await q.prompt([{type:"list",name:"providerSelection",message:"Select coding tool:",default:t??"claude",choices:[{name:"Claude Code",value:"claude"},{name:"OpenCode",value:"opencode"}]}]),{saveDefault:o}=await q.prompt([{type:"confirm",name:"saveDefault",message:"Save as default coding tool?",default:!1}]);return o&&(c.setDefaultProvider(e),y(`Default coding tool set to ${g.cyan(e)}`)),e}async function Pe(t,e){let o=_({text:"Checking LM Studio status...",color:"cyan"}).start(),i=await h.checkStatus();i||(o.info("LM Studio server not running"),o.stop(),await F("Would you like to start the LM Studio server?")||f("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await h.startServer(),i=!0),o.succeed("Connected to LM Studio");let n=_({text:"Fetching available models...",color:"cyan"}).start(),r=await h.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),f("No models available")),n.succeed(`Found ${g.bold(r.length)} model${r.length===1?"":"s"}`),console.log(),console.log(g.bold("Available Models:")),console.log(g.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((m,x)=>{let w=P(m.size),I=m.loaded?g.green(" [LOADED]"):"";console.log(` ${g.dim(String(x+1).padStart(2))}. ${m.name} ${g.dim(`(${w})`)}${I}`)}),console.log();let l=c.getLastUsedModel(),s=t.model,d=s?r.find(m=>m.id===s||m.name.includes(s)):await b(r,l);d||f("No model selected"),await h.loadModel(d.id,o);let u=d.id.replace("/","--"),v=e==="opencode"?"OpenCode":"Claude Code";y(g.bold(`
|
|
7
|
+
Model ready: ${d.name}`)),console.log(),console.log(`Run ${v} with this model:`),console.log(` ${g.cyan((e==="opencode"?"opencode":"claude")+" --model lmstudio/"+u)}`),console.log(),console.log(`Or use ${g.cyan("aix-cli run")} to start an interactive session`)}async function ke(t,e){let o=_({text:"Checking Ollama status...",color:"cyan"}).start();await S.checkStatus()||(o.fail("Ollama is not running"),f("Ollama must be running. Start it with: ollama serve")),o.succeed("Connected to Ollama");let n=_({text:"Fetching available models...",color:"cyan"}).start(),r=await S.getAvailableModels();r.length===0&&(n.fail("No models found. Pull a model first: ollama pull <model>"),f("No models available")),n.succeed(`Found ${g.bold(r.length)} model${r.length===1?"":"s"}`);let l=await S.getRunningModels();console.log(),console.log(g.bold("Available Models:")),console.log(g.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((m,x)=>{let w=P(m.size),he=l.includes(m.id)?g.green(" [RUNNING]"):"",Se=m.parameterSize?g.dim(` ${m.parameterSize}`):"";console.log(` ${g.dim(String(x+1).padStart(2))}. ${m.name}${Se} ${g.dim(`(${w})`)}${he}`)}),console.log();let s=c.getLastUsedModel(),d=t.model,u=d?r.find(m=>m.id===d||m.name.includes(d)):await b(r,s);u||f("No model selected"),c.setModel(u.id);let v=e==="opencode"?"OpenCode":"Claude Code";y(g.bold(`
|
|
8
|
+
Model selected: ${u.name}`)),console.log(),console.log(`Run ${v} with this model:`),console.log(` ${g.cyan((e==="opencode"?"opencode":"claude")+" --model ollama/"+u.id)}`),console.log(),console.log(`Or use ${g.cyan("aix-cli run")} to start an interactive session`)}async function H(t={}){let e=t.backend??await $e(),o=t.provider??await be();e==="ollama"?await ke(t,o):await Pe(t,o)}L();A();Q();Y();$();import k from"ora";import pe from"chalk";import ge from"inquirer";async function Oe(){let t=c.getDefaultBackend();if(t)return t;let{backendSelection:e}=await ge.prompt([{type:"list",name:"backendSelection",message:"Select model backend:",choices:[{name:"\u{1F5A5}\uFE0F LM Studio",value:"lmstudio"},{name:"\u{1F999} Ollama",value:"ollama"}]}]);return e}async function Le(){let t=await R.isClaudeCodeInstalled(),e=await E.isOpenCodeInstalled(),o=[];if(t&&o.push({name:"Claude Code",value:"claude"}),e&&o.push({name:"OpenCode",value:"opencode"}),o.length===0&&f("Neither Claude Code nor OpenCode is installed."),o.length===1)return o[0].value;let{providerSelection:i}=await ge.prompt([{type:"list",name:"providerSelection",message:"Select coding tool:",choices:o}]);return i}function U(t){return t==="opencode"?"OpenCode":"Claude Code"}async function Ae(t,e){let o=k({text:"Checking LM Studio status...",color:"cyan"}).start(),i=await h.checkStatus();i||(o.info("LM Studio server not running"),o.stop(),await F("Would you like to start the LM Studio server?")||f("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await h.startServer(),i=!0),o.succeed("Connected to LM Studio");let n=k({text:"Fetching available models...",color:"cyan"}).start(),r=await h.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),f("No models available")),n.stop();let l;if(t.model){let v=r.find(m=>m.id===t.model||m.name.toLowerCase().includes(t.model.toLowerCase()));v||f(`Model "${t.model}" not found. Available models: ${r.map(m=>m.name).join(", ")}`),l=v.id}else{let v=c.getLastUsedModel();l=(await b(r,v)).id}let s=k({text:`Loading model: ${pe.cyan(l)}`,color:"cyan"}).start();await h.loadModel(l,s);let u=`lmstudio/${l.replace("/","--")}`;await fe(e,u,t)}async function Re(t,e){let o=k({text:"Checking Ollama status...",color:"cyan"}).start();await S.checkStatus()||(o.fail("Ollama is not running"),f("Ollama must be running. Start it with: ollama serve")),o.succeed("Connected to Ollama");let n=k({text:"Fetching available models...",color:"cyan"}).start(),r=await S.getAvailableModels();r.length===0&&(n.fail("No models found. Pull a model first: ollama pull <model>"),f("No models available")),n.stop();let l;if(t.model){let d=r.find(u=>u.id===t.model||u.name.toLowerCase().includes(t.model.toLowerCase()));d||f(`Model "${t.model}" not found. Available models: ${r.map(u=>u.name).join(", ")}`),l=d.id}else{let d=c.getLastUsedModel();l=(await b(r,d)).id}c.setModel(l);let s=`ollama/${l}`;await fe(e,s,t)}async function fe(t,e,o){let i=U(t);y(pe.green(`
|
|
9
|
+
Starting ${i} with model: ${e}
|
|
10
|
+
`));try{t==="opencode"?await E.run({model:e,args:o.args??[],verbose:o.verbose}):await R.run({model:e,args:o.args??[],verbose:o.verbose})}catch(n){f(`Failed to run ${i}: ${n instanceof Error?n.message:"Unknown error"}`)}}async function Z(t={}){let e;if(t.provider)e=t.provider;else{let r=c.getDefaultProvider();r?e=r:e=await Le()}let o=k({text:`Checking ${U(e)} installation...`,color:"cyan"}).start();(e==="opencode"?await E.isOpenCodeInstalled():await R.isClaudeCodeInstalled())||(o.fail(`${U(e)} is not installed.`),f(`Please install ${U(e)} first.`)),o.succeed(`${U(e)} is installed`),(t.backend??await Oe())==="ollama"?await Re(t,e):await Ae(t,e)}L();A();import a from"chalk";async function ee(){let[t,e]=await Promise.all([h.getStatus(),S.getStatus()]);console.log(),console.log(a.bold("LM Studio")),console.log(a.dim("\u2500".repeat(50))),console.log(` ${t.running?a.green("\u25CF"):a.red("\u25CB")} Server: ${t.running?a.green("Running"):a.red("Stopped")}`),console.log(` ${a.dim("\u25B8")} Port: ${a.cyan(String(t.port))}`),console.log(` ${a.dim("\u25B8")} URL: ${a.cyan(`http://localhost:${t.port}`)}`),t.activeModel&&console.log(` ${a.dim("\u25B8")} Active Model: ${a.green(t.activeModel)}`),t.running&&t.models.length>0?(console.log(),console.log(a.bold(" Models")),t.models.forEach((o,i)=>{let n=P(o.size),r=o.id===t.activeModel?` ${a.green("[LOADED]")}`:"";console.log(` ${a.dim(String(i+1)+".")} ${o.name}${r}`),console.log(` ${a.dim("ID:")} ${o.id}`),console.log(` ${a.dim("Size:")} ${n}`),o.quantization&&console.log(` ${a.dim("Quantization:")} ${o.quantization}`)})):t.running&&console.log(` ${a.dim("No models available")}`),console.log(),console.log(a.bold("Ollama")),console.log(a.dim("\u2500".repeat(50))),console.log(` ${e.running?a.green("\u25CF"):a.red("\u25CB")} Server: ${e.running?a.green("Running"):a.red("Stopped")}`),console.log(` ${a.dim("\u25B8")} Port: ${a.cyan(String(e.port))}`),console.log(` ${a.dim("\u25B8")} URL: ${a.cyan(`http://localhost:${e.port}`)}`),e.running&&e.runningModels.length>0&&console.log(` ${a.dim("\u25B8")} Running: ${a.green(e.runningModels.join(", "))}`),e.running&&e.models.length>0?(console.log(),console.log(a.bold(" Models")),e.models.forEach((o,i)=>{let n=P(o.size),l=e.runningModels.includes(o.id)?` ${a.green("[RUNNING]")}`:"",s=o.parameterSize?` ${a.dim(o.parameterSize)}`:"";console.log(` ${a.dim(String(i+1)+".")} ${o.name}${s}${l}`),console.log(` ${a.dim("Size:")} ${n}`),o.family&&console.log(` ${a.dim("Family:")} ${o.family}`),o.quantization&&console.log(` ${a.dim("Quantization:")} ${o.quantization}`)})):e.running&&console.log(` ${a.dim("No models available")}`),console.log()}import Ee from"ora";import D from"chalk";import{execa as ve}from"execa";import{readFileSync as Ue}from"fs";import{fileURLToPath as De}from"url";function oe(){try{let t=De(new URL("../../package.json",import.meta.url)),e=JSON.parse(Ue(t,"utf8"));return String(e.version)}catch{return"unknown"}}async function te(){let t=Ee({text:"Checking for updates...",color:"cyan"}).start();try{let e=oe();if(e==="unknown"){t.fail("Could not determine current version.");return}let{stdout:o}=await ve("npm",["view","@iamharshil/aix-cli","version"]),i=o.trim();if(e===i){t.succeed(`You're already on the latest version: ${D.green(`v${e}`)}`);return}t.text=`Updating: ${D.yellow(`v${e}`)} \u2192 ${D.green(`v${i}`)}...`,await ve("npm",["install","-g","@iamharshil/aix-cli@latest"]),t.succeed(`Successfully updated to ${D.green(`v${i}`)}! \u{1F680}`),ce(`Restart your terminal or run ${D.cyan("aix-cli --help")} to see what's new.`)}catch(e){t.fail("Failed to update."),V(e instanceof Error?e.message:String(e))}}var M=new Be;M.name("aix-cli").description("Run Claude Code or OpenCode with local AI models from LM Studio or Ollama").version(oe()).showHelpAfterError();function B(t=0){console.log(),console.log(p.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(p.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)});M.command("init",{isDefault:!1}).aliases(["i","load"]).description("Select a backend, load a model, and configure your provider").option("-m, --model <name>","Model name or ID to load","").option("-p, --provider <provider>","Coding tool to use (claude or opencode)","").option("-b, --backend <backend>","Model backend to use (lmstudio or ollama)","").action(H);M.command("run",{isDefault:!1}).aliases(["r"]).description("Run Claude Code or OpenCode with a model from LM Studio or Ollama").option("-m, --model <name>","Model name or ID to use","").option("-p, --provider <provider>","Coding tool to use (claude or opencode)","").option("-b, --backend <backend>","Model backend to use (lmstudio or ollama)","").option("-v, --verbose","Show verbose output").argument("[args...]","Additional arguments for the provider").action(async(t,e)=>{await Z({...e,args:t})});M.command("status",{isDefault:!1}).aliases(["s","stats"]).description("Show LM Studio and Ollama status and available models").action(ee);M.command("doctor",{isDefault:!1}).aliases(["d","check"]).description("Check system requirements and configuration").action(async()=>{let{lmStudioService:t}=await Promise.resolve().then(()=>(L(),ae)),{ollamaService:e}=await Promise.resolve().then(()=>(A(),le)),{claudeService:o}=await Promise.resolve().then(()=>(Q(),ue)),{openCodeService:i}=await Promise.resolve().then(()=>(Y(),me)),{configService:n}=await Promise.resolve().then(()=>($(),ne));console.log(p.bold.cyan("\u{1F527} AIX CLI System Check")),console.log(p.dim("\u2500".repeat(40)));let[r,l,s,d]=await Promise.all([t.checkStatus(),e.checkStatus(),o.isClaudeCodeInstalled(),i.isOpenCodeInstalled()]),u=n.getDefaultProvider(),v=n.getDefaultBackend(),m=n.get("lmStudioPort"),x=n.get("ollamaPort");console.log(),console.log(p.bold("Backends")),console.log(` ${r?"\u2705":"\u26A0\uFE0F"} LM Studio: ${r?p.green("Running"):p.yellow("Not running")} ${p.dim(`(port ${m})`)}`),console.log(` ${l?"\u2705":"\u26A0\uFE0F"} Ollama: ${l?p.green("Running"):p.yellow("Not running")} ${p.dim(`(port ${x})`)}`),console.log(),console.log(p.bold("Coding Tools")),console.log(` ${s?"\u2705":"\u274C"} Claude Code: ${s?p.green("Installed"):p.red("Not installed")}`),console.log(` ${d?"\u2705":"\u274C"} OpenCode: ${d?p.green("Installed"):p.red("Not installed")}`),console.log(),console.log(p.bold("Defaults")),console.log(` \u{1F4CC} Backend: ${p.cyan(v??"not set")}`),console.log(` \u{1F4CC} Coding tool: ${p.cyan(u??"not set")}`);let w=[];s||w.push(` \u2192 ${p.cyan("npm install -g @anthropic-ai/claude-code")}`),d||w.push(` \u2192 ${p.cyan("npm install -g opencode")}`),!r&&!l&&w.push(` \u2192 Start LM Studio or run ${p.cyan("ollama serve")}`),w.length>0&&(console.log(),console.log(p.bold("\u{1F4CB} Next Steps:")),w.forEach(I=>console.log(I))),console.log()});M.command("update",{isDefault:!1}).aliases(["upgrade","u"]).description("Update AIX CLI to the latest version").action(te);M.parse();
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../src/services/config.ts", "../../src/services/lmstudio.ts", "../../src/services/ollama.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, Backend } 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 ollamaUrl: 'http://localhost',\n ollamaPort: 11434,\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 setDefaultBackend(backend: Backend): void {\n this.store.set('defaultBackend', backend);\n }\n\n getDefaultBackend(): Backend | undefined {\n const stored = this.store.get('defaultBackend');\n return stored as Backend | 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 getOllamaUrl(): string {\n const host = this.store.get('ollamaUrl');\n const port = this.store.get('ollamaPort');\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 { configService } from './config.js';\nimport type { OllamaStatus, OllamaModel } from '../types/index.js';\n\nexport class OllamaService {\n private getBaseUrl(): string {\n return configService.getOllamaUrl();\n }\n\n private getApiUrl(path: string): string {\n return `${this.getBaseUrl()}${path}`;\n }\n\n async checkStatus(): Promise<boolean> {\n try {\n const response = await fetch(this.getApiUrl('/api/tags'), {\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<OllamaModel[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/tags'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return [];\n\n const json = (await response.json()) as { models?: unknown[] };\n const models = json.models ?? [];\n\n return (models as Record<string, unknown>[])\n .map((m) => {\n const details = (m.details ?? {}) as Record<string, unknown>;\n return {\n id: String(m.name ?? m.model ?? ''),\n name: String(m.name ?? m.model ?? ''),\n size: Number(m.size ?? 0),\n quantization: String(details.quantization_level ?? ''),\n family: String(details.family ?? ''),\n parameterSize: String(details.parameter_size ?? ''),\n };\n })\n .filter((m) => m.id && m.name);\n } catch {\n return [];\n }\n }\n\n async getRunningModels(): Promise<string[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/ps'), {\n method: 'GET',\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) return [];\n\n const json = (await response.json()) as { models?: unknown[] };\n const models = json.models ?? [];\n\n return (models as Record<string, unknown>[])\n .map((m) => String(m.name ?? m.model ?? ''))\n .filter(Boolean);\n } catch {\n return [];\n }\n }\n\n async getStatus(): Promise<OllamaStatus> {\n const running = await this.checkStatus();\n\n if (!running) {\n return {\n running: false,\n port: configService.get('ollamaPort'),\n models: [],\n runningModels: [],\n };\n }\n\n const [models, runningModels] = await Promise.all([\n this.getAvailableModels(),\n this.getRunningModels(),\n ]);\n\n return {\n running: true,\n port: configService.get('ollamaPort'),\n models,\n runningModels,\n };\n }\n}\n\nexport const ollamaService = new OllamaService();\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 'Run Claude Code or OpenCode with local AI models from LM Studio or Ollama'\n )\n .version('3.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('Select a backend, load a model, and configure your provider')\n .option('-m, --model <name>', 'Model name or ID to load', '')\n .option('-p, --provider <provider>', 'Coding tool to use (claude or opencode)', '')\n .option('-b, --backend <backend>', 'Model backend to use (lmstudio or ollama)', '')\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 or Ollama')\n .option('-m, --model <name>', 'Model name or ID to use', '')\n .option('-p, --provider <provider>', 'Coding tool to use (claude or opencode)', '')\n .option('-b, --backend <backend>', 'Model backend to use (lmstudio or ollama)', '')\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 and Ollama 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 { ollamaService } = await import('./services/ollama.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, ollamaRunning, claudeInstalled, openCodeInstalled] = await Promise.all([\n lmStudioService.checkStatus(),\n ollamaService.checkStatus(),\n claudeService.isClaudeCodeInstalled(),\n openCodeService.isOpenCodeInstalled(),\n ]);\n\n const defaultProvider = configService.getDefaultProvider();\n const defaultBackend = configService.getDefaultBackend();\n const lmPort = configService.get('lmStudioPort');\n const ollamaPort = configService.get('ollamaPort');\n\n console.log();\n console.log(chalk.bold('Backends'));\n console.log(\n ` ${lmStudioRunning ? '\u2705' : '\u26A0\uFE0F'} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')} ${chalk.dim(`(port ${lmPort})`)}`\n );\n console.log(\n ` ${ollamaRunning ? '\u2705' : '\u26A0\uFE0F'} Ollama: ${ollamaRunning ? chalk.green('Running') : chalk.yellow('Not running')} ${chalk.dim(`(port ${ollamaPort})`)}`\n );\n\n console.log();\n console.log(chalk.bold('Coding Tools'));\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\n console.log();\n console.log(chalk.bold('Defaults'));\n console.log(` \uD83D\uDCCC Backend: ${chalk.cyan(defaultBackend ?? 'not set')}`);\n console.log(` \uD83D\uDCCC Coding tool: ${chalk.cyan(defaultProvider ?? 'not set')}`);\n\n const issues = [];\n if (!claudeInstalled) issues.push(` \u2192 ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n if (!openCodeInstalled) issues.push(` \u2192 ${chalk.cyan('npm install -g opencode')}`);\n if (!lmStudioRunning && !ollamaRunning) {\n issues.push(` \u2192 Start LM Studio or run ${chalk.cyan('ollama serve')}`);\n }\n\n if (issues.length > 0) {\n console.log();\n console.log(chalk.bold('\uD83D\uDCCB Next Steps:'));\n issues.forEach((issue) => console.log(issue));\n }\n\n console.log();\n });\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { ollamaService } from '../services/ollama.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, Backend } from '../types/index.js';\n\nasync function selectBackend(): Promise<Backend> {\n const defaultBackend = configService.getDefaultBackend();\n const { backendSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'backendSelection',\n message: 'Select model backend:',\n default: defaultBackend ?? 'lmstudio',\n choices: [\n { name: '\uD83D\uDDA5\uFE0F LM Studio', value: 'lmstudio' as Backend },\n { name: '\uD83E\uDD99 Ollama', value: 'ollama' as Backend },\n ],\n },\n ]);\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default backend?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultBackend(backendSelection);\n success(`Default backend set to ${chalk.cyan(backendSelection)}`);\n }\n\n return backendSelection;\n}\n\nasync function selectProviderPrompt(): Promise<Provider> {\n const defaultProvider = configService.getDefaultProvider();\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select coding tool:',\n default: defaultProvider ?? 'claude',\n choices: [\n { name: 'Claude Code', value: 'claude' as Provider },\n { name: 'OpenCode', value: 'opencode' as Provider },\n ],\n },\n ]);\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default coding tool?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultProvider(providerSelection);\n success(`Default coding tool set to ${chalk.cyan(providerSelection)}`);\n }\n\n return providerSelection;\n}\n\nasync function initLMStudio(options: InitOptions, provider: Provider): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n console.log();\n console.log(chalk.bold('Available Models:'));\n console.log(chalk.dim('\u2500'.repeat(process.stdout.columns || 80)));\n\n models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded = model.loaded ? chalk.green(' [LOADED]') : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name} ${chalk.dim(`(${size})`)}${loaded}`\n );\n });\n console.log();\n\n const lastUsedModel = configService.getLastUsedModel();\n const modelSearch = options.model;\n const selectedModel = modelSearch\n ? models.find((m) => m.id === modelSearch || m.name.includes(modelSearch))\n : await selectModel(models, lastUsedModel);\n\n if (!selectedModel) {\n exitWithError('No model selected');\n }\n\n await lmStudioService.loadModel(selectedModel.id, spinner);\n\n const modelIdentifier = selectedModel.id.replace('/', '--');\n 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\nasync function initOllama(options: InitOptions, provider: Provider): Promise<void> {\n const spinner = ora({\n text: 'Checking Ollama status...',\n color: 'cyan',\n }).start();\n\n const isRunning = await ollamaService.checkStatus();\n\n if (!isRunning) {\n spinner.fail('Ollama is not running');\n exitWithError(\n 'Ollama must be running. Start it with: ollama serve'\n );\n }\n\n spinner.succeed('Connected to Ollama');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await ollamaService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Pull a model first: ollama pull <model>');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n const runningModels = await ollamaService.getRunningModels();\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 isRunningModel = runningModels.includes(model.id);\n const status = isRunningModel ? chalk.green(' [RUNNING]') : '';\n const info = model.parameterSize ? chalk.dim(` ${model.parameterSize}`) : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name}${info} ${chalk.dim(`(${size})`)}${status}`\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 configService.setModel(selectedModel.id);\n\n const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n\n success(chalk.bold(`\\nModel selected: ${selectedModel.name}`));\n console.log();\n console.log(`Run ${providerName} with this model:`);\n console.log(\n ` ${chalk.cyan((provider === 'opencode' ? 'opencode' : 'claude') + ' --model ollama/' + selectedModel.id)}`\n );\n console.log();\n console.log(`Or use ${chalk.cyan('aix-cli run')} to start an interactive session`);\n}\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n // Select backend\n const backend: Backend = options.backend ?? (await selectBackend());\n\n // Select provider\n const provider: Provider = options.provider ?? (await selectProviderPrompt());\n\n if (backend === 'ollama') {\n await initOllama(options, provider);\n } else {\n await initLMStudio(options, provider);\n }\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 { ollamaService } from '../services/ollama.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, Backend } from '../types/index.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n provider?: Provider;\n backend?: Backend;\n}\n\nasync function selectBackend(): Promise<Backend> {\n const defaultBackend = configService.getDefaultBackend();\n\n if (defaultBackend) {\n return defaultBackend;\n }\n\n const { backendSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'backendSelection',\n message: 'Select model backend:',\n choices: [\n { name: '\uD83D\uDDA5\uFE0F LM Studio', value: 'lmstudio' as Backend },\n { name: '\uD83E\uDD99 Ollama', value: 'ollama' as Backend },\n ],\n },\n ]);\n\n return backendSelection;\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\nfunction getProviderDisplayName(provider: Provider): string {\n return provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n}\n\nasync function runWithLMStudio(options: RunOptions, provider: Provider): Promise<void> {\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 await launchProvider(provider, fullModelName, options);\n}\n\nasync function runWithOllama(options: RunOptions, provider: Provider): Promise<void> {\n const serverSpinner = ora({\n text: 'Checking Ollama status...',\n color: 'cyan',\n }).start();\n\n const isRunning = await ollamaService.checkStatus();\n\n if (!isRunning) {\n serverSpinner.fail('Ollama is not running');\n exitWithError('Ollama must be running. Start it with: ollama serve');\n }\n\n serverSpinner.succeed('Connected to Ollama');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await ollamaService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Pull a model first: ollama pull <model>');\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 configService.setModel(selectedModelId);\n\n const fullModelName = `ollama/${selectedModelId}`;\n\n await launchProvider(provider, fullModelName, options);\n}\n\nasync function launchProvider(\n provider: Provider,\n fullModelName: string,\n options: RunOptions\n): Promise<void> {\n const providerName = getProviderDisplayName(provider);\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\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n // Resolve provider\n let provider: Provider;\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 // Check provider is installed\n const providerSpinner = ora({\n text: `Checking ${getProviderDisplayName(provider)} 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(`${getProviderDisplayName(provider)} is not installed.`);\n exitWithError(`Please install ${getProviderDisplayName(provider)} first.`);\n }\n\n providerSpinner.succeed(`${getProviderDisplayName(provider)} is installed`);\n\n // Resolve backend\n const backend: Backend = options.backend ?? (await selectBackend());\n\n if (backend === 'ollama') {\n await runWithOllama(options, provider);\n } else {\n await runWithLMStudio(options, provider);\n }\n}\n", "import chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { ollamaService } from '../services/ollama.js';\nimport { formatBytes } from '../utils/format.js';\n\nexport async function statusCommand(): Promise<void> {\n const [lmStatus, ollamaStatus] = await Promise.all([\n lmStudioService.getStatus(),\n ollamaService.getStatus(),\n ]);\n\n // LM Studio section\n console.log();\n console.log(chalk.bold('LM Studio'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(\n ` ${lmStatus.running ? chalk.green('\u25CF') : chalk.red('\u25CB')} Server: ${lmStatus.running ? chalk.green('Running') : chalk.red('Stopped')}`\n );\n console.log(` ${chalk.dim('\u25B8')} Port: ${chalk.cyan(String(lmStatus.port))}`);\n console.log(\n ` ${chalk.dim('\u25B8')} URL: ${chalk.cyan(`http://localhost:${lmStatus.port}`)}`\n );\n\n if (lmStatus.activeModel) {\n console.log(\n ` ${chalk.dim('\u25B8')} Active Model: ${chalk.green(lmStatus.activeModel)}`\n );\n }\n\n if (lmStatus.running && lmStatus.models.length > 0) {\n console.log();\n console.log(chalk.bold(' Models'));\n lmStatus.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded =\n model.id === lmStatus.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 });\n } else if (lmStatus.running) {\n console.log(` ${chalk.dim('No models available')}`);\n }\n\n // Ollama section\n console.log();\n console.log(chalk.bold('Ollama'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(\n ` ${ollamaStatus.running ? chalk.green('\u25CF') : chalk.red('\u25CB')} Server: ${ollamaStatus.running ? chalk.green('Running') : chalk.red('Stopped')}`\n );\n console.log(` ${chalk.dim('\u25B8')} Port: ${chalk.cyan(String(ollamaStatus.port))}`);\n console.log(\n ` ${chalk.dim('\u25B8')} URL: ${chalk.cyan(`http://localhost:${ollamaStatus.port}`)}`\n );\n\n if (ollamaStatus.running && ollamaStatus.runningModels.length > 0) {\n console.log(\n ` ${chalk.dim('\u25B8')} Running: ${chalk.green(ollamaStatus.runningModels.join(', '))}`\n );\n }\n\n if (ollamaStatus.running && ollamaStatus.models.length > 0) {\n console.log();\n console.log(chalk.bold(' Models'));\n ollamaStatus.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const isRunning = ollamaStatus.runningModels.includes(model.id);\n const status = isRunning ? ` ${chalk.green('[RUNNING]')}` : '';\n const info = model.parameterSize ? ` ${chalk.dim(model.parameterSize)}` : '';\n console.log(\n ` ${chalk.dim(String(index + 1) + '.')} ${model.name}${info}${status}`\n );\n console.log(` ${chalk.dim('Size:')} ${size}`);\n if (model.family) {\n console.log(` ${chalk.dim('Family:')} ${model.family}`);\n }\n if (model.quantization) {\n console.log(` ${chalk.dim('Quantization:')} ${model.quantization}`);\n }\n });\n } else if (ollamaStatus.running) {\n console.log(` ${chalk.dim('No models available')}`);\n }\n\n console.log();\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["config_exports", "__export", "ConfigService", "configService", "Conf", "init_config", "__esmMin", "key", "value", "model", "provider", "backend", "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", "ollama_exports", "__export", "OllamaService", "ollamaService", "init_ollama", "__esmMin", "init_config", "configService", "path", "response", "m", "details", "models", "runningModels", "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_ollama", "init_config", "ora", "chalk", "inquirer", "inquirer", "selectModel", "models", "defaultModel", "choices", "model", "defaultIndex", "m", "confirmAction", "message", "defaultValue", "chalk", "formatBytes", "bytes", "k", "sizes", "
|
|
3
|
+
"sources": ["../../src/services/config.ts", "../../src/services/lmstudio.ts", "../../src/services/ollama.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", "../../src/commands/update.ts"],
|
|
4
|
+
"sourcesContent": ["import Conf from 'conf';\nimport type { Config, Provider, Backend } 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 ollamaUrl: 'http://localhost',\n ollamaPort: 11434,\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 setDefaultBackend(backend: Backend): void {\n this.store.set('defaultBackend', backend);\n }\n\n getDefaultBackend(): Backend | undefined {\n const stored = this.store.get('defaultBackend');\n return stored as Backend | 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 getOllamaUrl(): string {\n const host = this.store.get('ollamaUrl');\n const port = this.store.get('ollamaPort');\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 { configService } from './config.js';\nimport type { OllamaStatus, OllamaModel } from '../types/index.js';\n\nexport class OllamaService {\n private getBaseUrl(): string {\n return configService.getOllamaUrl();\n }\n\n private getApiUrl(path: string): string {\n return `${this.getBaseUrl()}${path}`;\n }\n\n async checkStatus(): Promise<boolean> {\n try {\n const response = await fetch(this.getApiUrl('/api/tags'), {\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<OllamaModel[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/tags'), {\n method: 'GET',\n signal: AbortSignal.timeout(10000),\n });\n\n if (!response.ok) return [];\n\n const json = (await response.json()) as { models?: unknown[] };\n const models = json.models ?? [];\n\n return (models as Record<string, unknown>[])\n .map((m) => {\n const details = (m.details ?? {}) as Record<string, unknown>;\n return {\n id: String(m.name ?? m.model ?? ''),\n name: String(m.name ?? m.model ?? ''),\n size: Number(m.size ?? 0),\n quantization: String(details.quantization_level ?? ''),\n family: String(details.family ?? ''),\n parameterSize: String(details.parameter_size ?? ''),\n };\n })\n .filter((m) => m.id && m.name);\n } catch {\n return [];\n }\n }\n\n async getRunningModels(): Promise<string[]> {\n try {\n const response = await fetch(this.getApiUrl('/api/ps'), {\n method: 'GET',\n signal: AbortSignal.timeout(5000),\n });\n\n if (!response.ok) return [];\n\n const json = (await response.json()) as { models?: unknown[] };\n const models = json.models ?? [];\n\n return (models as Record<string, unknown>[])\n .map((m) => String(m.name ?? m.model ?? ''))\n .filter(Boolean);\n } catch {\n return [];\n }\n }\n\n async getStatus(): Promise<OllamaStatus> {\n const running = await this.checkStatus();\n\n if (!running) {\n return {\n running: false,\n port: configService.get('ollamaPort'),\n models: [],\n runningModels: [],\n };\n }\n\n const [models, runningModels] = await Promise.all([\n this.getAvailableModels(),\n this.getRunningModels(),\n ]);\n\n return {\n running: true,\n port: configService.get('ollamaPort'),\n models,\n runningModels,\n };\n }\n}\n\nexport const ollamaService = new OllamaService();\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, updateCommand } from './commands/index.js';\nimport { getCurrentVersion } from './commands/update.js';\n\nconst program = new Command();\n\nprogram\n .name('aix-cli')\n .description(\n 'Run Claude Code or OpenCode with local AI models from LM Studio or Ollama'\n )\n .version(getCurrentVersion())\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('Select a backend, load a model, and configure your provider')\n .option('-m, --model <name>', 'Model name or ID to load', '')\n .option('-p, --provider <provider>', 'Coding tool to use (claude or opencode)', '')\n .option('-b, --backend <backend>', 'Model backend to use (lmstudio or ollama)', '')\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 or Ollama')\n .option('-m, --model <name>', 'Model name or ID to use', '')\n .option('-p, --provider <provider>', 'Coding tool to use (claude or opencode)', '')\n .option('-b, --backend <backend>', 'Model backend to use (lmstudio or ollama)', '')\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 and Ollama 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 { ollamaService } = await import('./services/ollama.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, ollamaRunning, claudeInstalled, openCodeInstalled] = await Promise.all([\n lmStudioService.checkStatus(),\n ollamaService.checkStatus(),\n claudeService.isClaudeCodeInstalled(),\n openCodeService.isOpenCodeInstalled(),\n ]);\n\n const defaultProvider = configService.getDefaultProvider();\n const defaultBackend = configService.getDefaultBackend();\n const lmPort = configService.get('lmStudioPort');\n const ollamaPort = configService.get('ollamaPort');\n\n console.log();\n console.log(chalk.bold('Backends'));\n console.log(\n ` ${lmStudioRunning ? '\u2705' : '\u26A0\uFE0F'} LM Studio: ${lmStudioRunning ? chalk.green('Running') : chalk.yellow('Not running')} ${chalk.dim(`(port ${lmPort})`)}`\n );\n console.log(\n ` ${ollamaRunning ? '\u2705' : '\u26A0\uFE0F'} Ollama: ${ollamaRunning ? chalk.green('Running') : chalk.yellow('Not running')} ${chalk.dim(`(port ${ollamaPort})`)}`\n );\n\n console.log();\n console.log(chalk.bold('Coding Tools'));\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\n console.log();\n console.log(chalk.bold('Defaults'));\n console.log(` \uD83D\uDCCC Backend: ${chalk.cyan(defaultBackend ?? 'not set')}`);\n console.log(` \uD83D\uDCCC Coding tool: ${chalk.cyan(defaultProvider ?? 'not set')}`);\n\n const issues = [];\n if (!claudeInstalled) issues.push(` \u2192 ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\n if (!openCodeInstalled) issues.push(` \u2192 ${chalk.cyan('npm install -g opencode')}`);\n if (!lmStudioRunning && !ollamaRunning) {\n issues.push(` \u2192 Start LM Studio or run ${chalk.cyan('ollama serve')}`);\n }\n\n if (issues.length > 0) {\n console.log();\n console.log(chalk.bold('\uD83D\uDCCB Next Steps:'));\n issues.forEach((issue) => console.log(issue));\n }\n\n console.log();\n });\n\nprogram\n .command('update', { isDefault: false })\n .aliases(['upgrade', 'u'])\n .description('Update AIX CLI to the latest version')\n .action(updateCommand);\n\nprogram.parse();\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { ollamaService } from '../services/ollama.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, Backend } from '../types/index.js';\n\nasync function selectBackend(): Promise<Backend> {\n const defaultBackend = configService.getDefaultBackend();\n const { backendSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'backendSelection',\n message: 'Select model backend:',\n default: defaultBackend ?? 'lmstudio',\n choices: [\n { name: '\uD83D\uDDA5\uFE0F LM Studio', value: 'lmstudio' as Backend },\n { name: '\uD83E\uDD99 Ollama', value: 'ollama' as Backend },\n ],\n },\n ]);\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default backend?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultBackend(backendSelection);\n success(`Default backend set to ${chalk.cyan(backendSelection)}`);\n }\n\n return backendSelection;\n}\n\nasync function selectProviderPrompt(): Promise<Provider> {\n const defaultProvider = configService.getDefaultProvider();\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select coding tool:',\n default: defaultProvider ?? 'claude',\n choices: [\n { name: 'Claude Code', value: 'claude' as Provider },\n { name: 'OpenCode', value: 'opencode' as Provider },\n ],\n },\n ]);\n\n const { saveDefault } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'saveDefault',\n message: 'Save as default coding tool?',\n default: false,\n },\n ]);\n\n if (saveDefault) {\n configService.setDefaultProvider(providerSelection);\n success(`Default coding tool set to ${chalk.cyan(providerSelection)}`);\n }\n\n return providerSelection;\n}\n\nasync function initLMStudio(options: InitOptions, provider: Provider): Promise<void> {\n const spinner = ora({\n text: 'Checking LM Studio status...',\n color: 'cyan',\n }).start();\n\n let isRunning = await lmStudioService.checkStatus();\n\n if (!isRunning) {\n spinner.info('LM Studio server not running');\n spinner.stop();\n\n const shouldStart = await confirmAction('Would you like to start the LM Studio server?');\n\n if (!shouldStart) {\n exitWithError(\n 'LM Studio server must be running. Start it manually or use the Server tab in LM Studio.'\n );\n }\n\n await lmStudioService.startServer();\n isRunning = true;\n }\n\n spinner.succeed('Connected to LM Studio');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await lmStudioService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Download some models in LM Studio first.');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n console.log();\n console.log(chalk.bold('Available Models:'));\n console.log(chalk.dim('\u2500'.repeat(process.stdout.columns || 80)));\n\n models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded = model.loaded ? chalk.green(' [LOADED]') : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name} ${chalk.dim(`(${size})`)}${loaded}`\n );\n });\n console.log();\n\n const lastUsedModel = configService.getLastUsedModel();\n const modelSearch = options.model;\n const selectedModel = modelSearch\n ? models.find((m) => m.id === modelSearch || m.name.includes(modelSearch))\n : await selectModel(models, lastUsedModel);\n\n if (!selectedModel) {\n exitWithError('No model selected');\n }\n\n await lmStudioService.loadModel(selectedModel.id, spinner);\n\n const modelIdentifier = selectedModel.id.replace('/', '--');\n 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\nasync function initOllama(options: InitOptions, provider: Provider): Promise<void> {\n const spinner = ora({\n text: 'Checking Ollama status...',\n color: 'cyan',\n }).start();\n\n const isRunning = await ollamaService.checkStatus();\n\n if (!isRunning) {\n spinner.fail('Ollama is not running');\n exitWithError(\n 'Ollama must be running. Start it with: ollama serve'\n );\n }\n\n spinner.succeed('Connected to Ollama');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await ollamaService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Pull a model first: ollama pull <model>');\n exitWithError('No models available');\n }\n\n modelsSpinner.succeed(\n `Found ${chalk.bold(models.length)} model${models.length === 1 ? '' : 's'}`\n );\n\n const runningModels = await ollamaService.getRunningModels();\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 isRunningModel = runningModels.includes(model.id);\n const status = isRunningModel ? chalk.green(' [RUNNING]') : '';\n const info = model.parameterSize ? chalk.dim(` ${model.parameterSize}`) : '';\n console.log(\n ` ${chalk.dim(String(index + 1).padStart(2))}. ${model.name}${info} ${chalk.dim(`(${size})`)}${status}`\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 configService.setModel(selectedModel.id);\n\n const providerName = provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n\n success(chalk.bold(`\\nModel selected: ${selectedModel.name}`));\n console.log();\n console.log(`Run ${providerName} with this model:`);\n console.log(\n ` ${chalk.cyan((provider === 'opencode' ? 'opencode' : 'claude') + ' --model ollama/' + selectedModel.id)}`\n );\n console.log();\n console.log(`Or use ${chalk.cyan('aix-cli run')} to start an interactive session`);\n}\n\nexport async function initCommand(options: InitOptions = {}): Promise<void> {\n // Select backend\n const backend: Backend = options.backend ?? (await selectBackend());\n\n // Select provider\n const provider: Provider = options.provider ?? (await selectProviderPrompt());\n\n if (backend === 'ollama') {\n await initOllama(options, provider);\n } else {\n await initLMStudio(options, provider);\n }\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 { ollamaService } from '../services/ollama.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, Backend } from '../types/index.js';\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n provider?: Provider;\n backend?: Backend;\n}\n\nasync function selectBackend(): Promise<Backend> {\n const defaultBackend = configService.getDefaultBackend();\n\n if (defaultBackend) {\n return defaultBackend;\n }\n\n const { backendSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'backendSelection',\n message: 'Select model backend:',\n choices: [\n { name: '\uD83D\uDDA5\uFE0F LM Studio', value: 'lmstudio' as Backend },\n { name: '\uD83E\uDD99 Ollama', value: 'ollama' as Backend },\n ],\n },\n ]);\n\n return backendSelection;\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\nfunction getProviderDisplayName(provider: Provider): string {\n return provider === 'opencode' ? 'OpenCode' : 'Claude Code';\n}\n\nasync function runWithLMStudio(options: RunOptions, provider: Provider): Promise<void> {\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 await launchProvider(provider, fullModelName, options);\n}\n\nasync function runWithOllama(options: RunOptions, provider: Provider): Promise<void> {\n const serverSpinner = ora({\n text: 'Checking Ollama status...',\n color: 'cyan',\n }).start();\n\n const isRunning = await ollamaService.checkStatus();\n\n if (!isRunning) {\n serverSpinner.fail('Ollama is not running');\n exitWithError('Ollama must be running. Start it with: ollama serve');\n }\n\n serverSpinner.succeed('Connected to Ollama');\n\n const modelsSpinner = ora({\n text: 'Fetching available models...',\n color: 'cyan',\n }).start();\n\n const models = await ollamaService.getAvailableModels();\n\n if (models.length === 0) {\n modelsSpinner.fail('No models found. Pull a model first: ollama pull <model>');\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 configService.setModel(selectedModelId);\n\n const fullModelName = `ollama/${selectedModelId}`;\n\n await launchProvider(provider, fullModelName, options);\n}\n\nasync function launchProvider(\n provider: Provider,\n fullModelName: string,\n options: RunOptions\n): Promise<void> {\n const providerName = getProviderDisplayName(provider);\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\nexport async function runCommand(options: RunOptions = {}): Promise<void> {\n // Resolve provider\n let provider: Provider;\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 // Check provider is installed\n const providerSpinner = ora({\n text: `Checking ${getProviderDisplayName(provider)} 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(`${getProviderDisplayName(provider)} is not installed.`);\n exitWithError(`Please install ${getProviderDisplayName(provider)} first.`);\n }\n\n providerSpinner.succeed(`${getProviderDisplayName(provider)} is installed`);\n\n // Resolve backend\n const backend: Backend = options.backend ?? (await selectBackend());\n\n if (backend === 'ollama') {\n await runWithOllama(options, provider);\n } else {\n await runWithLMStudio(options, provider);\n }\n}\n", "import chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { ollamaService } from '../services/ollama.js';\nimport { formatBytes } from '../utils/format.js';\n\nexport async function statusCommand(): Promise<void> {\n const [lmStatus, ollamaStatus] = await Promise.all([\n lmStudioService.getStatus(),\n ollamaService.getStatus(),\n ]);\n\n // LM Studio section\n console.log();\n console.log(chalk.bold('LM Studio'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(\n ` ${lmStatus.running ? chalk.green('\u25CF') : chalk.red('\u25CB')} Server: ${lmStatus.running ? chalk.green('Running') : chalk.red('Stopped')}`\n );\n console.log(` ${chalk.dim('\u25B8')} Port: ${chalk.cyan(String(lmStatus.port))}`);\n console.log(\n ` ${chalk.dim('\u25B8')} URL: ${chalk.cyan(`http://localhost:${lmStatus.port}`)}`\n );\n\n if (lmStatus.activeModel) {\n console.log(\n ` ${chalk.dim('\u25B8')} Active Model: ${chalk.green(lmStatus.activeModel)}`\n );\n }\n\n if (lmStatus.running && lmStatus.models.length > 0) {\n console.log();\n console.log(chalk.bold(' Models'));\n lmStatus.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const loaded =\n model.id === lmStatus.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 });\n } else if (lmStatus.running) {\n console.log(` ${chalk.dim('No models available')}`);\n }\n\n // Ollama section\n console.log();\n console.log(chalk.bold('Ollama'));\n console.log(chalk.dim('\u2500'.repeat(50)));\n console.log(\n ` ${ollamaStatus.running ? chalk.green('\u25CF') : chalk.red('\u25CB')} Server: ${ollamaStatus.running ? chalk.green('Running') : chalk.red('Stopped')}`\n );\n console.log(` ${chalk.dim('\u25B8')} Port: ${chalk.cyan(String(ollamaStatus.port))}`);\n console.log(\n ` ${chalk.dim('\u25B8')} URL: ${chalk.cyan(`http://localhost:${ollamaStatus.port}`)}`\n );\n\n if (ollamaStatus.running && ollamaStatus.runningModels.length > 0) {\n console.log(\n ` ${chalk.dim('\u25B8')} Running: ${chalk.green(ollamaStatus.runningModels.join(', '))}`\n );\n }\n\n if (ollamaStatus.running && ollamaStatus.models.length > 0) {\n console.log();\n console.log(chalk.bold(' Models'));\n ollamaStatus.models.forEach((model, index) => {\n const size = formatBytes(model.size);\n const isRunning = ollamaStatus.runningModels.includes(model.id);\n const status = isRunning ? ` ${chalk.green('[RUNNING]')}` : '';\n const info = model.parameterSize ? ` ${chalk.dim(model.parameterSize)}` : '';\n console.log(\n ` ${chalk.dim(String(index + 1) + '.')} ${model.name}${info}${status}`\n );\n console.log(` ${chalk.dim('Size:')} ${size}`);\n if (model.family) {\n console.log(` ${chalk.dim('Family:')} ${model.family}`);\n }\n if (model.quantization) {\n console.log(` ${chalk.dim('Quantization:')} ${model.quantization}`);\n }\n });\n } else if (ollamaStatus.running) {\n console.log(` ${chalk.dim('No models available')}`);\n }\n\n console.log();\n}\n", "import ora from 'ora';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { error as logError, info } from '../utils/format.js';\n\nexport function getCurrentVersion(): string {\n try {\n // Note: since this is bundled by esbuild into dist/src/index.js,\n // the relative path from import.meta.url to project root is ../../\n const pkgPath = fileURLToPath(new URL('../../package.json', import.meta.url));\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));\n return String(pkg.version);\n } catch {\n return 'unknown';\n }\n}\n\nexport async function updateCommand(): Promise<void> {\n const spinner = ora({\n text: 'Checking for updates...',\n color: 'cyan',\n }).start();\n\n try {\n const currentVersion = getCurrentVersion();\n \n if (currentVersion === 'unknown') {\n spinner.fail('Could not determine current version.');\n return;\n }\n\n const { stdout: latestVersion } = await execa('npm', ['view', '@iamharshil/aix-cli', 'version']);\n const latest = latestVersion.trim();\n\n if (currentVersion === latest) {\n spinner.succeed(`You're already on the latest version: ${chalk.green(`v${currentVersion}`)}`);\n return;\n }\n\n spinner.text = `Updating: ${chalk.yellow(`v${currentVersion}`)} \u2192 ${chalk.green(`v${latest}`)}...`;\n \n await execa('npm', ['install', '-g', '@iamharshil/aix-cli@latest']);\n \n spinner.succeed(`Successfully updated to ${chalk.green(`v${latest}`)}! \uD83D\uDE80`);\n info(`Restart your terminal or run ${chalk.cyan('aix-cli --help')} to see what's new.`);\n \n } catch (err) {\n spinner.fail('Failed to update.');\n logError(err instanceof Error ? err.message : String(err));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["config_exports", "__export", "ConfigService", "configService", "Conf", "init_config", "__esmMin", "key", "value", "model", "provider", "backend", "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", "ollama_exports", "__export", "OllamaService", "ollamaService", "init_ollama", "__esmMin", "init_config", "configService", "path", "response", "m", "details", "models", "runningModels", "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_ollama", "init_config", "ora", "chalk", "inquirer", "inquirer", "selectModel", "models", "defaultModel", "choices", "model", "defaultIndex", "m", "confirmAction", "message", "defaultValue", "chalk", "formatBytes", "bytes", "k", "sizes", "success", "message", "chalk", "error", "info", "exitWithError", "message", "code", "error", "selectBackend", "defaultBackend", "configService", "backendSelection", "inquirer", "saveDefault", "success", "chalk", "selectProviderPrompt", "defaultProvider", "providerSelection", "initLMStudio", "options", "provider", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "modelSearch", "selectedModel", "selectModel", "modelIdentifier", "providerName", "initOllama", "ollamaService", "runningModels", "status", "info", "initCommand", "backend", "init_lmstudio", "init_ollama", "init_claude", "init_opencode", "init_config", "ora", "chalk", "inquirer", "selectBackend", "defaultBackend", "configService", "backendSelection", "inquirer", "selectProvider", "claudeInstalled", "claudeService", "openCodeInstalled", "openCodeService", "choices", "exitWithError", "providerSelection", "getProviderDisplayName", "provider", "runWithLMStudio", "options", "serverSpinner", "ora", "isRunning", "lmStudioService", "confirmAction", "modelsSpinner", "models", "selectedModelId", "foundModel", "lastUsedModel", "selectModel", "loadSpinner", "chalk", "fullModelName", "launchProvider", "runWithOllama", "ollamaService", "m", "providerName", "success", "error", "runCommand", "storedProvider", "providerSpinner", "init_lmstudio", "init_ollama", "chalk", "statusCommand", "lmStatus", "ollamaStatus", "lmStudioService", "ollamaService", "chalk", "model", "index", "size", "formatBytes", "loaded", "status", "info", "ora", "chalk", "execa", "readFileSync", "fileURLToPath", "getCurrentVersion", "pkgPath", "fileURLToPath", "pkg", "readFileSync", "updateCommand", "spinner", "ora", "currentVersion", "latestVersion", "execa", "latest", "chalk", "info", "err", "error", "program", "Command", "getCurrentVersion", "handleExit", "code", "chalk", "err", "reason", "r", "initCommand", "args", "options", "runCommand", "statusCommand", "lmStudioService", "ollamaService", "claudeService", "openCodeService", "configService", "lmStudioRunning", "ollamaRunning", "claudeInstalled", "openCodeInstalled", "defaultProvider", "defaultBackend", "lmPort", "ollamaPort", "issues", "issue", "updateCommand"]
|
|
7
7
|
}
|
package/package.json
CHANGED