@iamharshil/aix-cli 3.4.6 → 4.0.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 +69 -10
- package/dist/bin/aix.js +13 -14
- package/dist/commands/config.d.ts +0 -1
- package/dist/commands/disconnect.d.ts +5 -0
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/fix.d.ts +2 -0
- package/dist/commands/index.d.ts +12 -6
- package/dist/commands/init.d.ts +0 -1
- package/dist/commands/models.d.ts +5 -0
- package/dist/commands/providers.d.ts +8 -0
- package/dist/commands/run.d.ts +0 -1
- package/dist/commands/setup.d.ts +6 -0
- package/dist/commands/status.d.ts +0 -1
- package/dist/commands/switch.d.ts +5 -0
- package/dist/commands/update.d.ts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +13 -14
- package/dist/services/claude.d.ts +0 -1
- package/dist/services/config.d.ts +3 -4
- package/dist/services/lmstudio.d.ts +0 -1
- package/dist/services/ollama.d.ts +0 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/utils/format.d.ts +0 -1
- package/dist/utils/prompt.d.ts +0 -1
- package/package.json +1 -1
- package/dist/bin/aix.js.map +0 -7
- package/dist/commands/config.d.ts.map +0 -1
- package/dist/commands/index.d.ts.map +0 -1
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/update.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -7
- package/dist/services/claude.d.ts.map +0 -1
- package/dist/services/config.d.ts.map +0 -1
- package/dist/services/lmstudio.d.ts.map +0 -1
- package/dist/services/ollama.d.ts.map +0 -1
- package/dist/types/index.d.ts.map +0 -1
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/prompt.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
Ollama automatically manages model memory. Session ended.`))}}
|
|
4
|
-
|
|
5
|
-
`))
|
|
6
|
-
|
|
7
|
-
|
|
2
|
+
var Pe=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});import{Command as Xe}from"commander";import ye from"chalk";import j from"ora";import S from"chalk";import q from"inquirer";import{execa as _}from"execa";import fe from"ora";import K from"chalk";import xe from"conf";var G=class{store;constructor(){this.store=new xe({projectName:"aix",defaults:{lmStudioUrl:"http://localhost",lmStudioPort:1234,lmStudioContextLength:65536,ollamaUrl:"http://localhost",ollamaPort:11434,defaultTimeout:3e4,autoStartServer:!1},clearInvalidConfig:!0})}get(e){return this.store.get(e)}set(e,t){this.store.set(e,t)}delete(e){this.store.delete(e)}setModel(e){e===void 0||e===""?this.store.delete("model"):this.store.set("model",e)}getLastUsedModel(){return this.store.get("model")}setDefaultProvider(e){e===void 0?this.store.delete("defaultProvider"):this.store.set("defaultProvider",e)}getDefaultProvider(){return this.store.get("defaultProvider")}setDefaultBackend(e){e===void 0?this.store.delete("defaultBackend"):this.store.set("defaultBackend",e)}getDefaultBackend(){return this.store.get("defaultBackend")}getLMStudioUrl(){let e=this.store.get("lmStudioUrl"),t=this.store.get("lmStudioPort");return`${e}:${t}`}getOllamaUrl(){let e=this.store.get("ollamaUrl"),t=this.store.get("ollamaPort");return`${e}:${t}`}reset(){this.store.clear()}},i=new G;var Ce=[1234,1235,1236,1237],H=class{constructor(){}getBaseUrl(){return i.getLMStudioUrl()}getApiUrl(e){return`${this.getBaseUrl()}${e}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){let e=["/api/v1/models","/api/models","/v1/models","/api/ls-model/list"];for(let t of e)try{let r=await fetch(this.getApiUrl(t),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!r.ok)continue;let n=await r.json(),a=[];return Array.isArray(n)?a=n:n.models&&Array.isArray(n.models)?a=n.models:n.data&&Array.isArray(n.data)&&(a=n.data),a.map(s=>{let l=s;return{id:String(l.key||l.id||l.model||""),name:String(l.display_name||l.name||l.id||l.model||""),size:Number(l.size_bytes||l.size||l.file_size||0),quantization:String(l.quantization?typeof l.quantization=="object"?l.quantization.name:l.quantization:"")}}).filter(s=>s.id&&s.name)}catch{continue}return[]}async getStatus(){if(!await this.checkStatus())return{running:!1,port:i.get("lmStudioPort"),models:[]};try{let t=await fetch(this.getApiUrl("/api/status"),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!t.ok)return{running:!1,port:i.get("lmStudioPort"),models:[]};let r=await t.json();return{running:!0,port:i.get("lmStudioPort"),models:r.models??[],activeModel:r.active_model}}catch{return{running:!1,port:i.get("lmStudioPort"),models:[]}}}async loadModel(e,t){let r=t??fe({text:`Loading model: ${K.cyan(e)}`,color:"cyan"}).start();try{let n=i.get("lmStudioContextLength"),a=["/api/v1/models/load","/api/model/load"],s=async(f,c)=>{let m={model:e};c&&(m.context_length=n);let p=await fetch(this.getApiUrl(f),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m),signal:AbortSignal.timeout(3e5)});if(p.ok)return;let y="";try{y=await p.text()}catch{y=""}let O=y?` ${y}`:"";throw new Error(`Failed to load model: ${p.status} ${p.statusText}${O}`)},l;for(let f of a)try{return await s(f,!0),r.succeed(`Model ${K.green(e)} loaded successfully`),i.setModel(e),{loadSpinner:r}}catch(c){l=c;let m=c instanceof Error?c.message:String(c);if(/context|token|max.*(context|token)|too.*large/i.test(m))try{return r.warn(`Model load failed with context_length=${n}. Retrying with LM Studio defaults...`),await s(f,!1),r.succeed(`Model ${K.green(e)} loaded successfully`),i.setModel(e),{loadSpinner:r}}catch(y){l=y}}throw l instanceof Error?l:new Error(String(l))}catch(n){throw r.fail(`Failed to load model: ${n instanceof Error?n.message:"Unknown error"}`),n}}async startServer(e){let t=e??fe({text:"Starting LM Studio server...",color:"cyan"}).start();try{let r=process.platform==="darwin",n=process.platform==="linux",a=process.platform==="win32",s;if(r){let l=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let f of l)try{let{existsSync:c}=await import("fs");if(c(f)){s=`open "${f}" --args --server`;break}}catch{}if(s?.startsWith("open")){await _("open",[l.find(f=>{try{let{existsSync:c}=Pe("fs");return c(f)}catch{return!1}})||"/Applications/LM Studio.app","--args","--server"],{detached:!0,stdio:"ignore"}),t.succeed("LM Studio server started"),await this.waitForServer(6e4);return}}else n?s=await this.findLinuxBinary():a&&(s=await this.findWindowsExecutable());if(!s)throw t.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await _(s,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(i.get("lmStudioPort"))}}),t.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(r){throw t.fail(`Failed to start LM Studio: ${r instanceof Error?r.message:"Unknown error"}`),r}}async findLinuxBinary(){let e=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let t of e)try{return await _("test",["-x",t]),t}catch{continue}}async findWindowsExecutable(){let e=process.env.LOCALAPPDATA,t=process.env.PROGRAMFILES,r=[e?`${e}\\Programs\\LM Studio\\lm-studio.exe`:"",t?`${t}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let n of r)try{return await _("cmd",["/c","if exist",`"${n}"`,"echo","yes"]),n}catch{continue}}async waitForServer(e=6e4){let t=Date.now();for(;Date.now()-t<e;){if(await this.checkStatus())return!0;await this.sleep(2e3)}return!1}sleep(e){return new Promise(t=>setTimeout(t,e))}async findAvailablePort(){for(let e of Ce)try{if((await fetch(`http://localhost:${e}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return i.set("lmStudioPort",e),e}catch{continue}return i.get("lmStudioPort")}async unloadModel(e){try{await fetch(this.getApiUrl("/api/model/unload"),{method:"POST",signal:AbortSignal.timeout(5e3)})}catch{}}},g=new H;import $e from"chalk";var V=class{getBaseUrl(){return i.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 a=n.details??{};return{id:String(n.name??n.model??""),name:String(n.name??n.model??""),size:Number(n.size??0),quantization:String(a.quantization_level??""),family:String(a.family??""),parameterSize:String(a.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:i.get("ollamaPort"),models:[],runningModels:[]};let[t,r]=await Promise.all([this.getAvailableModels(),this.getRunningModels()]);return{running:!0,port:i.get("ollamaPort"),models:t,runningModels:r}}async unloadModel(e){console.log($e.dim(`
|
|
3
|
+
Ollama automatically manages model memory. Session ended.`))}},v=new V;import ge from"inquirer";async function A(o,e){let t=o.map(a=>({name:`${a.name} (${a.id})`,value:a,short:a.name})),r=e?t.findIndex(a=>a.value.id===e):0;return(await ge.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:t,default:Math.max(0,r),pageSize:Math.min(o.length,15)}])).model}async function z(o,e=!0){return(await ge.prompt([{type:"confirm",name:"confirm",message:o,default:e}])).confirm}import F from"chalk";function R(o){if(o===0)return"0 B";let e=1024,t=["B","KB","MB","GB","TB"],r=Math.floor(Math.log(o)/Math.log(e));return`${parseFloat((o/Math.pow(e,r)).toFixed(2))} ${t[r]}`}function u(o){console.log(F.green("\u2713")+" "+o)}function J(o){console.error(F.red("\u2717")+" "+o)}function M(o){console.log(F.blue("\u2139")+" "+o)}function U(o){console.log(F.yellow("\u26A0")+" "+o)}function d(o,e=1){J(o),process.exit(e)}async function Le(){let o=i.getDefaultBackend(),{backendSelection:e}=await q.prompt([{type:"list",name:"backendSelection",message:"Select model backend:",default:o??"lmstudio",choices:[{name:"\u{1F5A5}\uFE0F LM Studio",value:"lmstudio"},{name:"\u{1F999} Ollama",value:"ollama"}]}]),{saveDefault:t}=await q.prompt([{type:"confirm",name:"saveDefault",message:"Save as default backend?",default:!1}]);return t&&(i.setDefaultBackend(e),u(`Default backend set to ${S.cyan(e)}`)),e}async function Oe(o){let e=i.getDefaultProvider(),t=[{name:"Claude Code",value:"claude"}],r=e??"claude",{providerSelection:n}=await q.prompt([{type:"list",name:"providerSelection",message:"Select coding tool:",default:r,choices:t}]),{saveDefault:a}=await q.prompt([{type:"confirm",name:"saveDefault",message:"Save as default coding tool?",default:!1}]);return a&&(i.setDefaultProvider(n),u(`Default coding tool set to ${S.cyan(n)}`)),n}async function Ae(o,e){let t=j({text:"Checking LM Studio status...",color:"cyan"}).start(),r=await g.checkStatus();r||(t.info("LM Studio server not running"),t.stop(),await z("Would you like to start the LM Studio server?")||d("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),r=!0),t.succeed("Connected to LM Studio");let n=j({text:"Fetching available models...",color:"cyan"}).start(),a=await g.getAvailableModels();a.length===0&&(n.fail("No models found. Download some models in LM Studio first."),d("No models available")),n.succeed(`Found ${S.bold(a.length)} model${a.length===1?"":"s"}`),console.log(),console.log(S.bold("Available Models:")),console.log(S.dim("\u2500".repeat(process.stdout.columns||80))),a.forEach((m,p)=>{let y=R(m.size),O=m.loaded?S.green(" [LOADED]"):"";console.log(` ${S.dim(String(p+1).padStart(2))}. ${m.name} ${S.dim(`(${y})`)}${O}`)}),console.log();let s=i.getLastUsedModel(),l=o.model,f=l?a.find(m=>m.id===l||m.name.includes(l)):await A(a,s);f||d("No model selected"),await g.loadModel(f.id,t);let c=f.id;u(S.bold(`
|
|
4
|
+
Model ready: ${f.name}`)),console.log(),console.log("Start your interactive coding session:"),console.log(` ${S.cyan(`aix-cli run --provider ${e} --backend lmstudio --model ${c}`)}`),console.log()}async function Re(o,e){let t=j({text:"Checking Ollama status...",color:"cyan"}).start();await v.checkStatus()||(t.fail("Ollama is not running"),d("Ollama must be running. Start it with: ollama serve")),t.succeed("Connected to Ollama");let n=j({text:"Fetching available models...",color:"cyan"}).start(),a=await v.getAvailableModels();a.length===0&&(n.fail("No models found. Pull a model first: ollama pull <model>"),d("No models available")),n.succeed(`Found ${S.bold(a.length)} model${a.length===1?"":"s"}`);let s=await v.getRunningModels();console.log(),console.log(S.bold("Available Models:")),console.log(S.dim("\u2500".repeat(process.stdout.columns||80))),a.forEach((m,p)=>{let y=R(m.size),Me=s.includes(m.id)?S.green(" [RUNNING]"):"",be=m.parameterSize?S.dim(` ${m.parameterSize}`):"";console.log(` ${S.dim(String(p+1).padStart(2))}. ${m.name}${be} ${S.dim(`(${y})`)}${Me}`)}),console.log();let l=i.getLastUsedModel(),f=o.model,c=f?a.find(m=>m.id===f||m.name.includes(f)):await A(a,l);c||d("No model selected"),i.setModel(c.id),u(S.bold(`
|
|
5
|
+
Model selected: ${c.name}`)),console.log(),console.log("Start your interactive coding session:"),console.log(` ${S.cyan(`aix-cli run --provider ${e} --backend ollama --model ${c.id}`)}`),console.log()}async function X(o={}){let e=o.backend??await Le(),t=o.provider??await Oe(e);e==="ollama"?await Re(o,t):await Ae(o,t)}import $ from"ora";import D from"chalk";import De from"inquirer";import{execa as Be}from"execa";import{execa as Y}from"execa";import Ue from"chalk";var Q=class{async isClaudeCodeInstalled(){try{return await Y("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:t,args:r=[],verbose:n=!1}=e,a=this.extractProvider(t),s=this.extractModelName(t);if(!a||!s)throw new Error(`Invalid model format: ${t}. Expected format: provider/model-name`);let l=["--model",s,...r];n&&console.log(Ue.dim(`
|
|
6
|
+
Running: claude ${l.join(" ")}
|
|
7
|
+
`));let f=a==="ollama"?i.getOllamaUrl():i.getLMStudioUrl(),c=a==="ollama"?"ollama":"lmstudio",m=`${f}/v1/messages`;try{let p=await fetch(m,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":c},body:JSON.stringify({model:s,max_tokens:1,messages:[{role:"user",content:"test"}]}),signal:AbortSignal.timeout(3e3)});if(!p.ok&&p.status>=500)throw new Error(`HTTP ${p.status} ${p.statusText}`)}catch(p){let y=p instanceof Error?p.message:String(p),O=a==="ollama"?"Claude Code requires an Anthropic-compatible API. Ollama does not support this. Use --native flag to use Ollama's built-in launch, or switch to LM Studio.":"Ensure LM Studio server is running and the Anthropic Compatibility server is enabled. Check the Developer tab in LM Studio.";throw new Error(`Claude Code could not reach an Anthropic-compatible endpoint at ${m} (${y}). ${O}`)}try{await Y("claude",l,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:s,ANTHROPIC_BASE_URL:f,ANTHROPIC_AUTH_TOKEN:c,ANTHROPIC_API_KEY:""}})}catch(p){if(p instanceof Error&&"exitCode"in p){let y=p.exitCode;process.exit(y??1)}throw p}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let t=e.split("/");if(!(t.length<2))return t.slice(1).join("/")}async getVersion(){try{return(await Y("claude",["--version"])).stdout}catch{return}}},x=new Q;var E=null,I=null;function pe(){let o=async()=>{if(I&&E){console.log(D.dim(`
|
|
8
8
|
|
|
9
|
-
Cleaning up...`));try{
|
|
10
|
-
Starting ${
|
|
11
|
-
`));try{await
|
|
12
|
-
Starting Claude Code with Ollama at ${
|
|
13
|
-
`)),t&&(console.log(
|
|
14
|
-
`)),console.log(
|
|
15
|
-
`)));try{await Ce("claude",["--model",o,...e],{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:o,ANTHROPIC_BASE_URL:i,ANTHROPIC_AUTH_TOKEN:"ollama",ANTHROPIC_API_KEY:""}})}catch(n){f(`Failed to run Claude Code: ${n instanceof Error?n.message:"Unknown error"}`)}}A();O();import l from"chalk";async function oe(){let[o,e]=await Promise.all([v.getStatus(),$.getStatus()]);console.log(),console.log(l.bold("LM Studio")),console.log(l.dim("\u2500".repeat(50))),console.log(` ${o.running?l.green("\u25CF"):l.red("\u25CB")} Server: ${o.running?l.green("Running"):l.red("Stopped")}`),console.log(` ${l.dim("\u25B8")} Port: ${l.cyan(String(o.port))}`),console.log(` ${l.dim("\u25B8")} URL: ${l.cyan(`http://localhost:${o.port}`)}`),o.activeModel&&console.log(` ${l.dim("\u25B8")} Active Model: ${l.green(o.activeModel)}`),o.running&&o.models.length>0?(console.log(),console.log(l.bold(" Models")),o.models.forEach((t,i)=>{let n=C(t.size),r=t.id===o.activeModel?` ${l.green("[LOADED]")}`:"";console.log(` ${l.dim(String(i+1)+".")} ${t.name}${r}`),console.log(` ${l.dim("ID:")} ${t.id}`),console.log(` ${l.dim("Size:")} ${n}`),t.quantization&&console.log(` ${l.dim("Quantization:")} ${t.quantization}`)})):o.running&&console.log(` ${l.dim("No models available")}`),console.log(),console.log(l.bold("Ollama")),console.log(l.dim("\u2500".repeat(50))),console.log(` ${e.running?l.green("\u25CF"):l.red("\u25CB")} Server: ${e.running?l.green("Running"):l.red("Stopped")}`),console.log(` ${l.dim("\u25B8")} Port: ${l.cyan(String(e.port))}`),console.log(` ${l.dim("\u25B8")} URL: ${l.cyan(`http://localhost:${e.port}`)}`),e.running&&e.runningModels.length>0&&console.log(` ${l.dim("\u25B8")} Running: ${l.green(e.runningModels.join(", "))}`),e.running&&e.models.length>0?(console.log(),console.log(l.bold(" Models")),e.models.forEach((t,i)=>{let n=C(t.size),d=e.runningModels.includes(t.id)?` ${l.green("[RUNNING]")}`:"",a=t.parameterSize?` ${l.dim(t.parameterSize)}`:"";console.log(` ${l.dim(String(i+1)+".")} ${t.name}${a}${d}`),console.log(` ${l.dim("Size:")} ${n}`),t.family&&console.log(` ${l.dim("Family:")} ${t.family}`),t.quantization&&console.log(` ${l.dim("Quantization:")} ${t.quantization}`)})):e.running&&console.log(` ${l.dim("No models available")}`),console.log()}import Ue from"ora";import B from"chalk";import{execa as ge}from"execa";import{readFileSync as Ie}from"fs";import{fileURLToPath as Be}from"url";function te(){try{let o=Be(new URL("../../package.json",import.meta.url)),e=JSON.parse(Ie(o,"utf8"));return String(e.version)}catch{return"unknown"}}async function ne(){let o=Ue({text:"Checking for updates...",color:"cyan"}).start();try{let e=te();if(e==="unknown"){o.fail("Could not determine current version.");return}let{stdout:t}=await ge("npm",["view","@iamharshil/aix-cli","version"]),i=t.trim();if(e===i){o.succeed(`You're already on the latest version: ${B.green(`v${e}`)}`);return}o.text=`Updating: ${B.yellow(`v${e}`)} \u2192 ${B.green(`v${i}`)}...`,await ge("npm",["install","-g","@iamharshil/aix-cli@latest"]),o.succeed(`Successfully updated to ${B.green(`v${i}`)}! \u{1F680}`),G(`Restart your terminal or run ${B.cyan("aix-cli --help")} to see what's new.`)}catch(e){o.fail("Failed to update."),J(e instanceof Error?e.message:String(e))}}M();import w from"chalk";import Ne from"inquirer";async function re(o,e,t){if(o==="reset"){let{confirm:n}=await Ne.prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to completely reset all configuration to defaults?",default:!1}]);n?(s.reset(),y("Configuration has been reset to defaults.")):G("Reset cancelled.");return}if(o==="set"&&e&&t){let n=t;t==="true"?n=!0:t==="false"?n=!1:Number.isNaN(Number(t))||(n=Number(t)),s.set(e,n),y(`Set ${w.cyan(e)} to ${w.green(t)}`);return}if(o==="unset"&&e){s.delete(e),y(`Unset configuration key ${w.cyan(e)}`);return}console.log(),console.log(w.bold.cyan("\u2699\uFE0F AIX CLI Configuration")),console.log(w.dim("\u2500".repeat(40))),["defaultBackend","defaultProvider","model","lmStudioUrl","lmStudioPort","lmStudioContextLength","ollamaUrl","ollamaPort","defaultTimeout","autoStartServer"].forEach(n=>{let r=s.get(n);console.log(r!==void 0?` ${w.bold(n)}: ${w.green(r)}`:` ${w.bold(n)}: ${w.dim("not set")}`)}),console.log(),console.log(w.dim("Commands:")),console.log(w.dim(" aix-cli config set <key> <value>")),console.log(w.dim(" aix-cli config unset <key>")),console.log(w.dim(" aix-cli config reset")),console.log()}var b=new Te;b.name("aix-cli").description("Run Claude Code with local AI models from LM Studio or Ollama").version(te()).option("--ollama","Shortcut to use Ollama backend").option("--lmstudio","Shortcut to use LM Studio backend").showHelpAfterError();function N(o=0){console.log(),console.log(p.dim(o===0?"\u{1F44B} Goodbye!":"\u274C Cancelled.")),process.exit(o)}process.on("SIGINT",()=>N(0));process.on("SIGTERM",()=>N(0));process.on("uncaughtException",o=>{o.message?.includes("ExitPromptError")||o.message?.includes("User force closed")||o.message?.includes("prompt")?N(0):(console.error(p.red("Error:"),o.message),process.exit(1))});process.on("unhandledRejection",o=>{let e=String(o);(e.includes("ExitPromptError")||e.includes("User force closed")||e.includes("prompt"))&&N(0)});b.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)").option("-b, --backend <backend>","Model backend to use (lmstudio or ollama)").action(o=>{let e=b.opts();return e.ollama&&(o.backend="ollama"),e.lmstudio&&(o.backend="lmstudio"),Y(o)});b.command("run",{isDefault:!1}).aliases(["r"]).description("Run Claude Code 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)").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(o,e)=>{let t=b.opts();t.ollama&&(e.backend="ollama"),t.lmstudio&&(e.backend="lmstudio"),await ee({...e,args:o})});b.command("status",{isDefault:!1}).aliases(["s","stats"]).description("Show LM Studio and Ollama status and available models").action(oe);b.command("doctor",{isDefault:!1}).aliases(["d","check"]).description("Check system requirements and configuration").action(async()=>{let{lmStudioService:o}=await Promise.resolve().then(()=>(A(),se)),{ollamaService:e}=await Promise.resolve().then(()=>(O(),le)),{claudeService:t}=await Promise.resolve().then(()=>(Z(),ce)),{configService:i}=await Promise.resolve().then(()=>(M(),ie));console.log(p.bold.cyan("\u{1F527} AIX CLI System Check")),console.log(p.dim("\u2500".repeat(40)));let[n,r,d]=await Promise.all([o.checkStatus(),e.checkStatus(),t.isClaudeCodeInstalled()]),a=i.getDefaultProvider(),g=i.getDefaultBackend(),u=i.get("lmStudioPort"),c=i.get("ollamaPort");console.log(),console.log(p.bold("Backends")),console.log(` ${n?"\u2705":"\u26A0\uFE0F"} LM Studio: ${n?p.green("Running"):p.yellow("Not running")} ${p.dim(`(port ${u})`)}`),console.log(` ${r?"\u2705":"\u26A0\uFE0F"} Ollama: ${r?p.green("Running"):p.yellow("Not running")} ${p.dim(`(port ${c})`)}`),console.log(),console.log(p.bold("Coding Tools")),console.log(` ${d?"\u2705":"\u274C"} Claude Code: ${d?p.green("Installed"):p.red("Not installed")}`),console.log(),console.log(p.bold("Defaults")),console.log(` \u{1F4CC} Backend: ${p.cyan(g??"not set")}`),console.log(` \u{1F4CC} Coding tool: ${p.cyan(a??"not set")}`);let m=[];if(d||m.push(` \u2192 ${p.cyan("npm install -g @anthropic-ai/claude-code")}`),!n&&!r&&m.push(` \u2192 Start LM Studio or run ${p.cyan("ollama serve")}`),m.length>0){console.log(),console.log(p.bold("\u{1F4CB} Next Steps:"));for(let S of m)console.log(S)}console.log()});b.command("update",{isDefault:!1}).aliases(["upgrade","u"]).description("Update AIX CLI to the latest version").action(ne);b.command("config [action] [key] [value]",{isDefault:!1}).aliases(["c","settings"]).description("View, set, or reset AIX CLI configuration constraints").action(re);b.parse();
|
|
16
|
-
//# sourceMappingURL=index.js.map
|
|
9
|
+
Cleaning up...`));try{E==="ollama"?await v.unloadModel(I):E==="lmstudio"&&await g.unloadModel(),u(`Model "${I}" unloaded`)}catch{}}};process.on("SIGINT",()=>{o().finally(()=>process.exit(0))}),process.on("SIGTERM",()=>{o().finally(()=>process.exit(0))})}function ve(o){return!o||o.trim().length===0||o.length>200?!1:/^[\w\-:.]+$/.test(o)}async function Ee(o){let e=i.getDefaultBackend();if(e)return e;let{backendSelection:t}=await De.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 t}async function Ie(){let o=$({text:"Checking Claude Code installation...",color:"cyan"}).start();return await x.isClaudeCodeInstalled()||(o.fail("Claude Code is not installed"),d("Claude Code is required. Install with: npm install -g @anthropic-ai/claude-code")),o.succeed("Claude Code is installed"),"claude"}function B(o){return"Claude Code"}async function Ne(o,e){let t=$({text:"Checking LM Studio status...",color:"cyan"}).start();await g.findAvailablePort();let r=await g.checkStatus();r||(t.info("LM Studio server not running"),t.stop(),await z("Would you like to start the LM Studio server?")||d("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await g.startServer(),r=!0),t.succeed("Connected to LM Studio");let n=$({text:"Fetching available models...",color:"cyan"}).start(),a=await g.getAvailableModels();a.length===0&&(n.fail("No models found. Download some models in LM Studio first."),d("No models available")),n.succeed(`Found ${a.length} model${a.length===1?"":"s"}`);let s;if(o.model){ve(o.model)||d(`Invalid model name: "${o.model}". Use letters, numbers, dashes, underscores, colon, or dot.`);let c=a.find(m=>m.id===o.model||m.name.toLowerCase().includes(o.model.toLowerCase()));c||d(`Model "${o.model}" not found. Available models: ${a.map(m=>m.name).join(", ")}`),s=c.id}else{let c=i.getLastUsedModel();s=(await A(a,c)).id}let l=$({text:`Loading model: ${D.cyan(s)}`,color:"cyan"}).start();await g.loadModel(s,l),E="lmstudio",I=s;let f=`lmstudio/${s}`;pe(),await Te(e,f,o)}async function Te(o,e,t){let r=B(o);u(D.green(`
|
|
10
|
+
Starting ${r} with model: ${e}
|
|
11
|
+
`));try{await x.run({model:e,args:t.args??[],verbose:t.verbose})}catch(n){d(`Failed to run ${r}: ${n instanceof Error?n.message:"Unknown error"}`)}}async function Z(o={}){let e;if(o.provider)e=o.provider;else{let a=i.getDefaultProvider();a?e=a:e=await Ie()}let t=$({text:`Checking ${B(e)} installation...`,color:"cyan"}).start();if(await x.isClaudeCodeInstalled()||(t.fail(`${B(e)} is not installed.`),d(`Please install ${B(e)} first.`)),t.succeed(`${B(e)} is installed`),(o.backend??await Ee(e))==="ollama"){let a=$({text:"Checking Ollama status...",color:"cyan"}).start();await v.checkStatus()||(a.fail("Ollama is not running"),d("Ollama must be running. Start it with: ollama serve")),a.succeed("Connected to Ollama");let l=$({text:"Fetching available models...",color:"cyan"}).start(),f=await v.getAvailableModels();f.length===0&&(l.fail("No models found"),d("No models available. Pull a model first: ollama pull <model>")),l.succeed(`Found ${f.length} model${f.length===1?"":"s"}`);let c;if(o.model){ve(o.model)||d(`Invalid model name: "${o.model}". Use letters, numbers, dash, underscore, colon, or dot.`);let m=f.find(p=>p.id===o.model||p.name.toLowerCase().includes(o.model.toLowerCase()));m||d(`Model "${o.model}" not found. Available: ${f.map(p=>p.name).join(", ")}`),c=m.id}else{let m=i.getLastUsedModel();c=(await A(f,m)).id}i.setModel(c),E="ollama",I=c,pe(),await _e(c,o.args??[],o.verbose??!1);return}await Ne(o,e)}async function _e(o,e,t){let r=i.getOllamaUrl();u(D.green(`
|
|
12
|
+
Starting Claude Code with Ollama at ${r}...
|
|
13
|
+
`)),t&&(console.log(D.dim(`Running: claude --model ${o}
|
|
14
|
+
`)),console.log(D.dim(`ANTHROPIC_BASE_URL=${r}
|
|
15
|
+
`)));try{await Be("claude",["--model",o,...e],{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:o,ANTHROPIC_BASE_URL:r,ANTHROPIC_AUTH_TOKEN:"ollama",ANTHROPIC_API_KEY:""}})}catch(n){d(`Failed to run Claude Code: ${n instanceof Error?n.message:"Unknown error"}`)}}import h from"chalk";async function ee(){let o=i.getDefaultBackend(),e=i.getDefaultProvider(),t=i.getLastUsedModel(),[r,n,a]=await Promise.all([g.getStatus(),v.getStatus(),x.isClaudeCodeInstalled()]);if(console.log(),console.log(h.bold.cyan("\u25CF Status")),console.log(h.dim("\u2500".repeat(50))),console.log(),console.log(h.bold("Active")),console.log(` ${h.dim("\u25B8")} Provider: ${o?h.cyan(o):h.dim("not set")}`),console.log(` ${h.dim("\u25B8")} Tool: ${e?h.cyan(e):h.dim("not set")}`),o){let m=o==="ollama"?i.getOllamaUrl():i.getLMStudioUrl();console.log(` ${h.dim("\u25B8")} Endpoint: ${h.cyan(m)}`)}t&&console.log(` ${h.dim("\u25B8")} Model: ${h.green(t)}`),console.log(),console.log(h.bold("Tools")),console.log(` Claude Code: ${a?h.green("installed"):h.red("not installed")}`),console.log(),console.log(h.bold("Backends"));let s=r.running?h.green("running"):h.yellow("stopped"),l=n.running?h.green("running"):h.yellow("stopped"),f=o==="lmstudio",c=o==="ollama";console.log(` LM Studio: ${s}${f?h.dim(" (default)"):""}`),console.log(` Ollama: ${l}${c?h.dim(" (default)"):""}`),console.log()}import ze from"ora";import N from"chalk";import{execa as he}from"execa";import{readFileSync as Fe}from"fs";import{fileURLToPath as je}from"url";function oe(){try{let o=je(new URL("../../package.json",import.meta.url)),e=JSON.parse(Fe(o,"utf8"));return String(e.version)}catch{return"unknown"}}async function te(){let o=ze({text:"Checking for updates...",color:"cyan"}).start();try{let e=oe();if(e==="unknown"){o.fail("Could not determine current version.");return}let{stdout:t}=await he("npm",["view","@iamharshil/aix-cli","version"]),r=t.trim();if(e===r){o.succeed(`You're already on the latest version: ${N.green(`v${e}`)}`);return}o.text=`Updating: ${N.yellow(`v${e}`)} \u2192 ${N.green(`v${r}`)}...`,await he("npm",["install","-g","@iamharshil/aix-cli@latest"]),o.succeed(`Successfully updated to ${N.green(`v${r}`)}! \u{1F680}`),M(`Restart your terminal or run ${N.cyan("aix-cli --help")} to see what's new.`)}catch(e){o.fail("Failed to update."),J(e instanceof Error?e.message:String(e))}}import k from"chalk";import qe from"inquirer";async function ne(o,e,t){if(o==="reset"){let{confirm:n}=await qe.prompt([{type:"confirm",name:"confirm",message:"Are you sure you want to completely reset all configuration to defaults?",default:!1}]);n?(i.reset(),u("Configuration has been reset to defaults.")):M("Reset cancelled.");return}if(o==="set"&&e&&t){let n=t;t==="true"?n=!0:t==="false"?n=!1:Number.isNaN(Number(t))||(n=Number(t)),i.set(e,n),u(`Set ${k.cyan(e)} to ${k.green(t)}`);return}if(o==="unset"&&e){i.delete(e),u(`Unset configuration key ${k.cyan(e)}`);return}console.log(),console.log(k.bold.cyan("\u2699\uFE0F AIX CLI Configuration")),console.log(k.dim("\u2500".repeat(40))),["defaultBackend","defaultProvider","model","lmStudioUrl","lmStudioPort","lmStudioContextLength","ollamaUrl","ollamaPort","defaultTimeout","autoStartServer"].forEach(n=>{let a=i.get(n);console.log(a!==void 0?` ${k.bold(n)}: ${k.green(a)}`:` ${k.bold(n)}: ${k.dim("not set")}`)}),console.log(),console.log(k.dim("Commands:")),console.log(k.dim(" aix-cli config set <key> <value>")),console.log(k.dim(" aix-cli config unset <key>")),console.log(k.dim(" aix-cli config reset")),console.log()}import We from"inquirer";async function ie(o){let e=o.force??!1,t=o.provider?.toLowerCase();if(!e&&i.getDefaultBackend()){M("Already configured. Use --force to reconfigure.");return}let[r,n]=await Promise.all([g.checkStatus(),v.checkStatus()]),a=[];r&&a.push({name:"lmstudio",label:"LM Studio"}),n&&a.push({name:"ollama",label:"Ollama"});let s;if(t)t==="lmstudio"&&!r&&d("LM Studio is not running. Please start it first."),t==="ollama"&&!n&&d("Ollama is not running. Please start it first."),t!=="lmstudio"&&t!=="ollama"&&d(`Unknown provider: ${t}. Use 'lmstudio' or 'ollama'.`),s=t,u(`Selected provider: ${s==="lmstudio"?"LM Studio":"Ollama"}`);else if(a.length===0&&d('No backends detected. Please start LM Studio or run "ollama serve" first.'),a.length===1)s=a[0].name,u(`Detected ${a[0].label} running`),u(`Selected provider: ${a[0].label}`);else{let{backendSelection:c}=await We.prompt([{type:"list",name:"backendSelection",message:"Which backend would you like to use?",choices:a.map(m=>({name:m.label,value:m.name}))}]);s=c,u(`Selected provider: ${s==="lmstudio"?"LM Studio":"Ollama"}`)}let l=s==="ollama"?i.getOllamaUrl():i.getLMStudioUrl();if(M(`Configured endpoint: ${l}`),i.setDefaultBackend(s),i.setDefaultProvider("claude"),!await x.isClaudeCodeInstalled()){U('Claude Code is not installed. Install it to use "aix run".');return}u("Claude connected successfully"),u("Test request passed"),console.log(),M('Setup complete! Run "aix run" to start coding.')}import C from"chalk";async function Ge(){let[o,e]=await Promise.all([g.checkStatus(),v.checkStatus()]),t=i.getDefaultBackend();console.log(C.bold.cyan("Providers")),console.log(C.dim("\u2500".repeat(40))),console.log(` LM Studio: ${o?C.green("running"):C.yellow("stopped")} ${t==="lmstudio"?C.dim("(default)"):""}`),console.log(` Ollama: ${e?C.green("running"):C.yellow("stopped")} ${t==="ollama"?C.dim("(default)"):""}`),console.log()}async function Ke(o){let e=o.toLowerCase(),[t,r]=await Promise.all([g.checkStatus(),v.checkStatus()]);if(e==="lmstudio"){t||d("LM Studio is not running. Please start it first."),i.setDefaultBackend("lmstudio"),i.setDefaultProvider("claude"),u("Default provider set to LM Studio");return}if(e==="ollama"){r||d("Ollama is not running. Please start it first."),i.setDefaultBackend("ollama"),i.setDefaultProvider("claude"),u("Default provider set to Ollama");return}d(`Unknown provider: ${o}. Use 'lmstudio' or 'ollama'.`)}async function ae(o){await Ge()}async function re(o){o.default||d("Provider name is required. Use: aix providers set <provider_name>"),await Ke(o.default)}import b from"chalk";import Se from"ora";async function se(o={}){let e=o.provider?.toLowerCase();if(e||(e=i.getDefaultBackend()),e||d('No provider specified. Use --provider flag or run "aix setup" first.'),e==="ollama"){let t=Se({text:"Fetching Ollama models...",color:"cyan"}).start();await v.checkStatus()||(t.fail("Ollama is not running."),d("Start Ollama with: ollama serve"));let n=await v.getAvailableModels();if(t.succeed(`Found ${n.length} model${n.length===1?"":"s"}`),n.length===0){console.log(b.dim("No models available. Pull a model: ollama pull <model>"));return}console.log(),console.log(b.bold.cyan("Available Models")),console.log(b.dim("\u2500".repeat(60)));for(let a of n){let s=R(a.size);console.log(` ${b.white(a.name)} ${b.dim(`(${s})`)}`)}console.log();return}if(e==="lmstudio"){let t=Se({text:"Fetching LM Studio models...",color:"cyan"}).start();await g.checkStatus()||(t.fail("LM Studio is not running."),d("Start LM Studio and enable the local server."));let n=await g.getAvailableModels();if(t.succeed(`Found ${n.length} model${n.length===1?"":"s"}`),n.length===0){console.log(b.dim("No models available. Download models in LM Studio."));return}console.log(),console.log(b.bold.cyan("Available Models")),console.log(b.dim("\u2500".repeat(60)));for(let a of n){let s=R(a.size),l=a.quantization?` ${b.dim(a.quantization)}`:"";console.log(` ${b.white(a.name)} ${b.dim(`(${s})`)}${l}`)}console.log();return}d(`Unknown provider: ${e}. Use 'ollama' or 'lmstudio'.`)}import P from"chalk";import{execa as He}from"execa";async function le(){let o=i.getDefaultBackend(),e=i.getDefaultProvider(),t=i.getLastUsedModel();console.log(),console.log(P.bold.cyan("\u{1F527} Doctor")),console.log(P.dim("\u2500".repeat(40)));let r=[],n=!0;if((!o||!e)&&(n=!1,r.push('No default provider configured. Run "aix setup" first.')),o==="lmstudio"){let s=await g.checkStatus();if(s?(console.log(),console.log(P.green("\u2713")+" LM Studio running")):(n=!1,r.push("LM Studio is not running")),s){let l=await g.getAvailableModels();l.length===0?(n=!1,r.push("No models available in LM Studio")):t&&(l.some(c=>c.id===t||c.name===t)?console.log(P.green("\u2713")+" Model available"):(n=!1,r.push(`Model "${t}" not found`)))}}if(o==="ollama"){let s=await v.checkStatus();if(s?(console.log(),console.log(P.green("\u2713")+" Ollama running")):(n=!1,r.push("Ollama is not running")),s){let l=await v.getAvailableModels();l.length===0?(n=!1,r.push("No models available in Ollama")):t&&(l.some(c=>c.id===t)?console.log(P.green("\u2713")+" Model available"):(n=!1,r.push(`Model "${t}" not found`)))}}let a=o==="ollama"?i.getOllamaUrl():i.getLMStudioUrl();try{(await fetch(`${a}/api/tags`,{method:"GET",signal:AbortSignal.timeout(3e3)})).ok?console.log(P.green("\u2713")+` Port accessible (${a})`):(n=!1,r.push(`Port not accessible at ${a}`))}catch{n=!1,r.push(`Cannot reach ${a}`)}if(o)try{(await He("claude",["--version"])).exitCode===0&&console.log(P.green("\u2713")+" Claude Code installed")}catch{n=!1,r.push("Claude Code not installed")}if(r.length>0){console.log(),console.log(P.bold.red("Issues found:"));for(let s of r)console.log(P.red("\u2717")+" "+s)}console.log(),n&&r.length===0?(console.log(P.green("\u2713 All checks passed")),console.log()):d("Doctor check failed. Fix the issues above and try again.")}import de from"chalk";import L from"inquirer";async function Ve(){let o=i.get("lmStudioPort"),e=i.get("ollamaPort"),t=await g.checkStatus(),r=await v.checkStatus();if(!t&&r){let{fix:n}=await L.prompt([{type:"confirm",name:"fix",message:`LM Studio not running. Ollama is running on port ${e}. Use Ollama instead?`,default:!0}]);n&&(i.setDefaultBackend("ollama"),i.setDefaultProvider("claude"),u("Switched to Ollama as default"))}if(t&&!r){let{fix:n}=await L.prompt([{type:"confirm",name:"fix",message:`Ollama not running. LM Studio is running on port ${o}. Use LM Studio instead?`,default:!0}]);n&&(i.setDefaultBackend("lmstudio"),i.setDefaultProvider("claude"),u("Switched to LM Studio as default"))}if(!t&&!r){let{backend:n}=await L.prompt([{type:"list",name:"backend",message:"No backends running. Which would you like to start?",choices:[{name:"LM Studio",value:"lmstudio"},{name:"Ollama",value:"ollama"}]}]);n==="lmstudio"?(M("Starting LM Studio..."),await g.startServer(),i.setDefaultBackend("lmstudio"),i.setDefaultProvider("claude"),u("LM Studio started and configured")):(M("To start Ollama, run: ollama serve"),U('After starting Ollama, run "aix fix" again'))}}async function Je(){let{reset:o}=await L.prompt([{type:"confirm",name:"reset",message:"Reset all configuration? This will clear default provider and model settings.",default:!1}]);o&&(i.reset(),u("Configuration reset"))}async function ce(){console.log(),console.log(de.bold.cyan("\u{1F527} Fix")),console.log(de.dim("\u2500".repeat(40)));let o=i.getDefaultBackend(),e=i.getLastUsedModel();if(await Ve(),o==="lmstudio"&&await g.checkStatus()){let n=await g.getAvailableModels();if(e&&!n.some(a=>a.id===e)){U(`Last used model "${e}" not found`);let{useModel:a}=await L.prompt([{type:"list",name:"useModel",message:"Select a model to use:",choices:n.map(s=>({name:s.name,value:s.id}))}]);i.setModel(a),u(`Model set to ${a}`)}}if(o==="ollama"&&await v.checkStatus()){let n=await v.getAvailableModels();if(e&&!n.some(a=>a.id===e)){U(`Last used model "${e}" not found`);let{useModel:a}=await L.prompt([{type:"list",name:"useModel",message:"Select a model to use:",choices:n.map(s=>({name:s.name,value:s.id}))}]);i.setModel(a),u(`Model set to ${a}`)}}console.log(),console.log(de.bold("Options:")),console.log(" 1. Reset config (clear all settings)");let{option:t}=await L.prompt([{type:"list",name:"option",message:"What would you like to do?",choices:[{name:"Done / Exit",value:"done"},{name:"Reset config",value:"reset"}]}]);t==="reset"&&await Je(),console.log(),u('Fix complete. Run "aix status" to verify.')}import W from"chalk";async function me(o={}){let e=o.provider?.toLowerCase();e||d('Provider name required. Use "aix switch ollama" or "aix switch lmstudio".');let[t,r]=await Promise.all([g.checkStatus(),v.checkStatus()]);if(e==="ollama"){r||d("Ollama is not running. Start it with: ollama serve"),i.setDefaultBackend("ollama"),i.setDefaultProvider("claude"),u("Switched to Ollama"),console.log(W.dim(` Endpoint: ${i.getOllamaUrl()}`)),console.log(),console.log(W.green('Ready! Run "aix run" to start coding.'));return}if(e==="lmstudio"){t||d("LM Studio is not running. Start it first."),i.setDefaultBackend("lmstudio"),i.setDefaultProvider("claude"),u("Switched to LM Studio"),console.log(W.dim(` Endpoint: ${i.getLMStudioUrl()}`)),console.log(),console.log(W.green('Ready! Run "aix run" to start coding.'));return}d(`Unknown provider: ${e}. Use 'ollama' or 'lmstudio'.`)}import we from"chalk";async function ue(o={}){let e=o.provider?.toLowerCase();e&&e!=="claude"&&d(`Unknown provider: ${e}. Use 'claude'.`);let t=i.getDefaultBackend(),r=i.getDefaultProvider(),n=i.getLastUsedModel();!t&&!r&&!n&&d("No provider connected."),i.setModel(void 0),i.setDefaultBackend(void 0),i.setDefaultProvider(void 0),u("Disconnected from Claude Code"),n&&console.log(we.dim(` Last model: ${n}`)),console.log(),console.log(we.green('Run "aix setup" to connect again.'))}var w=new Xe;w.name("aix-cli").description("Run Claude Code with local AI models from LM Studio or Ollama").version(oe()).option("--ollama","Shortcut to use Ollama backend").option("--lmstudio","Shortcut to use LM Studio backend").showHelpAfterError();function T(o=0){console.log(),console.log(ye.dim(o===0?"\u{1F44B} Goodbye!":"\u274C Cancelled.")),process.exit(o)}process.on("SIGINT",()=>T(0));process.on("SIGTERM",()=>T(0));process.on("uncaughtException",o=>{o.message?.includes("ExitPromptError")||o.message?.includes("User force closed")||o.message?.includes("prompt")?T(0):(console.error(ye.red("Error:"),o.message),process.exit(1))});process.on("unhandledRejection",o=>{let e=String(o);(e.includes("ExitPromptError")||e.includes("User force closed")||e.includes("prompt"))&&T(0)});w.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)").option("-b, --backend <backend>","Model backend to use (lmstudio or ollama)").action(o=>{let e=w.opts();return e.ollama&&(o.backend="ollama"),e.lmstudio&&(o.backend="lmstudio"),X(o)});w.command("run",{isDefault:!1}).aliases(["r"]).description("Run Claude Code 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)").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(o,e)=>{let t=w.opts();t.ollama&&(e.backend="ollama"),t.lmstudio&&(e.backend="lmstudio"),await Z({...e,args:o})});w.command("status",{isDefault:!1}).aliases(["s","stats"]).description("Show LM Studio and Ollama status and available models").action(ee);w.command("doctor",{isDefault:!1}).aliases(["d","check"]).description("Check infrastructure status").action(le);w.command("update",{isDefault:!1}).aliases(["upgrade","u"]).description("Update AIX CLI to the latest version").action(te);w.command("config [action] [key] [value]",{isDefault:!1}).aliases(["c","settings"]).description("View, set, or reset AIX CLI configuration constraints").action(ne);w.command("setup",{isDefault:!1}).description("One-command default setup for first-time users").option("--provider <name>","Provider to use (lmstudio or ollama)").option("--force","Overwrite existing configuration").action(o=>{let e=w.opts();return e.ollama&&(o.provider="ollama"),e.lmstudio&&(o.provider="lmstudio"),ie(o)});var ke=w.command("providers",{isDefault:!1}).description("List or set default provider");ke.command("list",{isDefault:!1}).description("List available providers").action(()=>ae());ke.command("set",{isDefault:!1}).description("Set default provider").argument("<name>","Provider name (lmstudio or ollama)").action(o=>re({default:o}));var Ye=w.command("models",{isDefault:!1}).description("List available models");Ye.command("list",{isDefault:!1}).description("List models from a provider").option("--provider <name>","Provider to use (ollama or lmstudio)").action(o=>se(o));w.command("fix",{isDefault:!1}).description("Fix infrastructure issues").action(ce);w.command("switch",{isDefault:!1}).description("Switch to a different provider").argument("<provider>","Provider name (ollama or lmstudio)").action(o=>me({provider:o}));w.command("disconnect",{isDefault:!1}).description("Disconnect from a provider").argument("[provider]","Provider to disconnect (claude)").action(o=>ue({provider:o}));w.parse();
|
|
@@ -5,15 +5,14 @@ export declare class ConfigService {
|
|
|
5
5
|
get<K extends keyof Config>(key: K): Config[K];
|
|
6
6
|
set<K extends keyof Config>(key: K, value: Config[K]): void;
|
|
7
7
|
delete<K extends keyof Config>(key: K): void;
|
|
8
|
-
setModel(model: string): void;
|
|
8
|
+
setModel(model: string | undefined): void;
|
|
9
9
|
getLastUsedModel(): string | undefined;
|
|
10
|
-
setDefaultProvider(provider: Provider): void;
|
|
10
|
+
setDefaultProvider(provider: Provider | undefined): void;
|
|
11
11
|
getDefaultProvider(): Provider | undefined;
|
|
12
|
-
setDefaultBackend(backend: Backend): void;
|
|
12
|
+
setDefaultBackend(backend: Backend | undefined): void;
|
|
13
13
|
getDefaultBackend(): Backend | undefined;
|
|
14
14
|
getLMStudioUrl(): string;
|
|
15
15
|
getOllamaUrl(): string;
|
|
16
16
|
reset(): void;
|
|
17
17
|
}
|
|
18
18
|
export declare const configService: ConfigService;
|
|
19
|
-
//# sourceMappingURL=config.d.ts.map
|
package/dist/types/index.d.ts
CHANGED
package/dist/utils/format.d.ts
CHANGED
|
@@ -7,4 +7,3 @@ export declare function error(message: string): void;
|
|
|
7
7
|
export declare function info(message: string): void;
|
|
8
8
|
export declare function warn(message: string): void;
|
|
9
9
|
export declare function exitWithError(message: string, code?: number): never;
|
|
10
|
-
//# sourceMappingURL=format.d.ts.map
|
package/dist/utils/prompt.d.ts
CHANGED
|
@@ -2,4 +2,3 @@ import type { LMStudioModel } from '../types/index.js';
|
|
|
2
2
|
export declare function selectModel(models: LMStudioModel[], defaultModel?: string): Promise<LMStudioModel>;
|
|
3
3
|
export declare function confirmAction(message: string, defaultValue?: boolean): Promise<boolean>;
|
|
4
4
|
export declare function enterPrompt(message: string, defaultValue?: string): Promise<string>;
|
|
5
|
-
//# sourceMappingURL=prompt.d.ts.map
|
package/package.json
CHANGED
package/dist/bin/aix.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/services/config.ts", "../../src/services/lmstudio.ts", "../../src/services/ollama.ts", "../../src/services/claude.ts", "../../src/index.ts", "../../src/commands/init.ts", "../../src/utils/prompt.ts", "../../src/utils/format.ts", "../../src/commands/run.ts", "../../src/commands/status.ts", "../../src/commands/update.ts", "../../src/commands/config.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 lmStudioContextLength: 65536,\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 delete<K extends keyof Config>(key: K): void {\n this.store.delete(key);\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 constructor() {\n // Base URL is derived from config; do not cache it because the port may change.\n }\n\n private getBaseUrl(): string {\n return configService.getLMStudioUrl();\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/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 contextLength = configService.get('lmStudioContextLength');\n const endpoints = ['/api/v1/models/load', '/api/model/load'];\n\n const makeRequest = async (endpoint: string, includeContextLength: boolean) => {\n const payload: Record<string, unknown> = { model: modelId };\n if (includeContextLength) payload['context_length'] = contextLength;\n\n const response = await fetch(this.getApiUrl(endpoint), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n signal: AbortSignal.timeout(300000),\n });\n\n if (response.ok) return;\n\n let bodyText = '';\n try {\n bodyText = await response.text();\n } catch {\n bodyText = '';\n }\n\n const details = bodyText ? ` ${bodyText}` : '';\n throw new Error(\n `Failed to load model: ${response.status} ${response.statusText}${details}`\n );\n };\n\n let lastError: unknown;\n\n for (const endpoint of endpoints) {\n try {\n await makeRequest(endpoint, true);\n loadSpinner.succeed(`Model ${chalk.green(modelId)} loaded successfully`);\n configService.setModel(modelId);\n return { loadSpinner };\n } catch (err) {\n lastError = err;\n const msg = err instanceof Error ? err.message : String(err);\n const looksLikeContextError = /context|token|max.*(context|token)|too.*large/i.test(msg);\n\n if (looksLikeContextError) {\n try {\n loadSpinner.warn(\n `Model load failed with context_length=${contextLength}. Retrying with LM Studio defaults...`\n );\n await makeRequest(endpoint, false);\n loadSpinner.succeed(`Model ${chalk.green(modelId)} loaded successfully`);\n configService.setModel(modelId);\n return { loadSpinner };\n } catch (retryErr) {\n lastError = retryErr;\n }\n }\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\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 configService.set('lmStudioPort', port);\n return port;\n }\n } catch {\n continue;\n }\n }\n\n return configService.get('lmStudioPort');\n }\n\n async unloadModel(_modelId?: string): Promise<void> {\n try {\n await fetch(this.getApiUrl('/api/model/unload'), {\n method: 'POST',\n signal: AbortSignal.timeout(5000),\n });\n } catch {\n // Best effort\n }\n }\n}\n\nexport const lmStudioService = new LMStudioService();\n", "import chalk from 'chalk';\nimport { 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 async unloadModel(_modelId: string): Promise<void> {\n console.log(chalk.dim('\\nOllama automatically manages model memory. Session ended.'));\n }\n}\n\nexport const ollamaService = new OllamaService();\n", "import { execa } from 'execa';\nimport chalk from 'chalk';\nimport { configService } from './config.js';\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 claudeArgs = ['--model', modelName, ...args];\n\n if (verbose) {\n console.log(chalk.dim(`\\nRunning: claude ${claudeArgs.join(' ')}\\n`));\n }\n\n const baseUrl =\n provider === 'ollama' ? configService.getOllamaUrl() : configService.getLMStudioUrl();\n const authToken = provider === 'ollama' ? 'ollama' : 'lmstudio';\n\n // Preflight: Claude Code talks to Anthropic-compatible API. Verify endpoint is reachable.\n const messagesUrl = `${baseUrl}/v1/messages`;\n try {\n const resp = await fetch(messagesUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': authToken,\n },\n body: JSON.stringify({\n model: modelName,\n max_tokens: 1,\n messages: [{ role: 'user', content: 'test' }],\n }),\n signal: AbortSignal.timeout(3000),\n });\n // We expect a 4xx error (bad request due to minimal payload) or 200/400, but not connection refused\n if (!resp.ok && resp.status >= 500) {\n throw new Error(`HTTP ${resp.status} ${resp.statusText}`);\n }\n } catch (e) {\n const details = e instanceof Error ? e.message : String(e);\n const backendHint =\n provider === 'ollama'\n ? \"Claude Code requires an Anthropic-compatible API. Ollama does not support this. Use --native flag to use Ollama's built-in launch, or switch to LM Studio.\"\n : 'Ensure LM Studio server is running and the Anthropic Compatibility server is enabled. Check the Developer tab in LM Studio.';\n throw new Error(\n `Claude Code could not reach an Anthropic-compatible endpoint at ${messagesUrl} (${details}). ${backendHint}`\n );\n }\n\n try {\n await execa('claude', claudeArgs, {\n stdio: 'inherit',\n env: {\n ...process.env,\n ANTHROPIC_MODEL: modelName,\n ANTHROPIC_BASE_URL: baseUrl,\n ANTHROPIC_AUTH_TOKEN: authToken,\n ANTHROPIC_API_KEY: '',\n },\n });\n } catch (error) {\n if (error instanceof Error && 'exitCode' in error) {\n const exitCode = (error as unknown as { exitCode: number }).exitCode;\n process.exit(exitCode ?? 1);\n }\n throw error;\n }\n }\n\n private extractProvider(model: string): string | undefined {\n const parts = model.split('/');\n return parts[0];\n }\n\n private extractModelName(model: string): string | undefined {\n const parts = model.split('/');\n if (parts.length < 2) return undefined;\n return parts.slice(1).join('/');\n }\n\n async getVersion(): Promise<string | undefined> {\n try {\n const result = await execa('claude', ['--version']);\n return result.stdout;\n } catch {\n return undefined;\n }\n }\n}\n\nexport const claudeService = new ClaudeService();\n", "#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport {\n initCommand,\n runCommand,\n statusCommand,\n updateCommand,\n configCommand,\n} from './commands/index.js';\nimport { getCurrentVersion } from './commands/update.js';\n\nconst program = new Command();\n\nprogram\n .name('aix-cli')\n .description('Run Claude Code with local AI models from LM Studio or Ollama')\n .version(getCurrentVersion())\n .option('--ollama', 'Shortcut to use Ollama backend')\n .option('--lmstudio', 'Shortcut to use LM Studio backend')\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)')\n .option('-b, --backend <backend>', 'Model backend to use (lmstudio or ollama)')\n .action((options: Record<string, unknown>) => {\n const globalOpts = program.opts();\n if (globalOpts.ollama) options.backend = 'ollama';\n if (globalOpts.lmstudio) options.backend = 'lmstudio';\n return initCommand(options);\n });\n\nprogram\n .command('run', { isDefault: false })\n .aliases(['r'])\n .description('Run Claude Code 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)')\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 const globalOpts = program.opts();\n if (globalOpts.ollama) options.backend = 'ollama';\n if (globalOpts.lmstudio) options.backend = 'lmstudio';\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 { 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] = await Promise.all([\n lmStudioService.checkStatus(),\n ollamaService.checkStatus(),\n claudeService.isClaudeCodeInstalled(),\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\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)\n issues.push(` \u2192 ${chalk.cyan('npm install -g @anthropic-ai/claude-code')}`);\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 for (const issue of issues) {\n console.log(issue);\n }\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\n .command('config [action] [key] [value]', { isDefault: false })\n .aliases(['c', 'settings'])\n .description('View, set, or reset AIX CLI configuration constraints')\n .action(configCommand);\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(_backend: Backend): Promise<Provider> {\n const defaultProvider = configService.getDefaultProvider();\n\n const choices = [{ name: 'Claude Code', value: 'claude' as Provider }];\n\n const defaultSel = defaultProvider ?? 'claude';\n\n const { providerSelection } = await inquirer.prompt([\n {\n type: 'list',\n name: 'providerSelection',\n message: 'Select coding tool:',\n default: defaultSel,\n choices,\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;\n\n success(chalk.bold(`\\nModel ready: ${selectedModel.name}`));\n console.log();\n console.log('Start your interactive coding session:');\n console.log(\n ` ${chalk.cyan(`aix-cli run --provider ${provider} --backend lmstudio --model ${modelIdentifier}`)}`\n );\n console.log();\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('Ollama must be running. Start it with: ollama serve');\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 success(chalk.bold(`\\nModel selected: ${selectedModel.name}`));\n console.log();\n console.log('Start your interactive coding session:');\n console.log(\n ` ${chalk.cyan(`aix-cli run --provider ${provider} --backend ollama --model ${selectedModel.id}`)}`\n );\n console.log();\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(backend));\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 { execa } from 'execa';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { ollamaService } from '../services/ollama.js';\nimport { claudeService } from '../services/claude.js';\nimport { configService } from '../services/config.js';\nimport { selectModel, confirmAction } from '../utils/prompt.js';\nimport { exitWithError, success } from '../utils/format.js';\nimport type { Provider, Backend } from '../types/index.js';\n\nlet currentBackend: 'ollama' | 'lmstudio' | null = null;\nlet currentModelId: string | null = null;\n\nfunction setupGracefulShutdown(): void {\n const cleanup = async () => {\n if (currentModelId && currentBackend) {\n console.log(chalk.dim('\\n\\nCleaning up...'));\n try {\n if (currentBackend === 'ollama') {\n await ollamaService.unloadModel(currentModelId);\n } else if (currentBackend === 'lmstudio') {\n await lmStudioService.unloadModel();\n }\n success(`Model \"${currentModelId}\" unloaded`);\n } catch {\n // Best effort cleanup\n }\n }\n };\n\n process.on('SIGINT', () => {\n cleanup().finally(() => process.exit(0));\n });\n process.on('SIGTERM', () => {\n cleanup().finally(() => process.exit(0));\n });\n}\n\ninterface RunOptions {\n model?: string;\n verbose?: boolean;\n args?: string[];\n provider?: Provider;\n backend?: Backend;\n}\n\nfunction validateModelName(model: string): boolean {\n if (!model || model.trim().length === 0) return false;\n if (model.length > 200) return false;\n return /^[\\w\\-:.]+$/.test(model);\n}\n\nasync function selectBackend(_provider: Provider): 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 spinner = ora({\n text: 'Checking Claude Code installation...',\n color: 'cyan',\n }).start();\n\n const claudeInstalled = await claudeService.isClaudeCodeInstalled();\n\n if (!claudeInstalled) {\n spinner.fail('Claude Code is not installed');\n exitWithError(\n 'Claude Code is required. Install with: npm install -g @anthropic-ai/claude-code'\n );\n }\n\n spinner.succeed('Claude Code is installed');\n return 'claude';\n}\n\nfunction getProviderDisplayName(_provider: Provider): string {\n return '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 await lmStudioService.findAvailablePort();\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.succeed(`Found ${models.length} model${models.length === 1 ? '' : 's'}`);\n\n let selectedModelId: string;\n\n if (options.model) {\n if (!validateModelName(options.model)) {\n exitWithError(\n `Invalid model name: \"${options.model}\". Use letters, numbers, dashes, underscores, colon, or dot.`\n );\n }\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 currentBackend = 'lmstudio';\n currentModelId = selectedModelId;\n\n const fullModelName = `lmstudio/${selectedModelId}`;\n\n setupGracefulShutdown();\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 await claudeService.run({\n model: fullModelName,\n args: options.args ?? [],\n verbose: options.verbose,\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 = 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(provider));\n\n // Handle Ollama - fetch models, let user select, then run Claude Code\n if (backend === 'ollama') {\n const ollamaSpinner = ora({\n text: 'Checking Ollama status...',\n color: 'cyan',\n }).start();\n\n const isRunning = await ollamaService.checkStatus();\n if (!isRunning) {\n ollamaSpinner.fail('Ollama is not running');\n exitWithError('Ollama must be running. Start it with: ollama serve');\n }\n\n ollamaSpinner.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 if (models.length === 0) {\n modelsSpinner.fail('No models found');\n exitWithError('No models available. Pull a model first: ollama pull <model>');\n }\n\n modelsSpinner.succeed(`Found ${models.length} model${models.length === 1 ? '' : 's'}`);\n\n let selectedModelId: string;\n\n if (options.model) {\n if (!validateModelName(options.model)) {\n exitWithError(\n `Invalid model name: \"${options.model}\". Use letters, numbers, dash, underscore, colon, or dot.`\n );\n }\n const foundModel = models.find(\n (m) => m.id === options.model || m.name.toLowerCase().includes(options.model!.toLowerCase())\n );\n if (!foundModel) {\n exitWithError(\n `Model \"${options.model}\" not found. Available: ${models.map((m) => m.name).join(', ')}`\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 currentBackend = 'ollama';\n currentModelId = selectedModelId;\n\n setupGracefulShutdown();\n await runWithOllamaEnv(selectedModelId, options.args ?? [], options.verbose ?? false);\n return;\n }\n\n // LM Studio flow\n await runWithLMStudio(options, provider);\n}\n\nasync function runWithOllamaEnv(model: string, args: string[], verbose: boolean): Promise<void> {\n const ollamaUrl = configService.getOllamaUrl();\n success(chalk.green(`\\nStarting Claude Code with Ollama at ${ollamaUrl}...\\n`));\n\n if (verbose) {\n console.log(chalk.dim(`Running: claude --model ${model}\\n`));\n console.log(chalk.dim(`ANTHROPIC_BASE_URL=${ollamaUrl}\\n`));\n }\n\n try {\n await execa('claude', ['--model', model, ...args], {\n stdio: 'inherit',\n env: {\n ...process.env,\n ANTHROPIC_MODEL: model,\n ANTHROPIC_BASE_URL: ollamaUrl,\n ANTHROPIC_AUTH_TOKEN: 'ollama',\n ANTHROPIC_API_KEY: '',\n },\n });\n } catch (error) {\n exitWithError(\n `Failed to run Claude Code: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n", "import chalk from 'chalk';\nimport { lmStudioService } from '../services/lmstudio.js';\nimport { 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", "import chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport { configService } from '../services/config.js';\nimport { success, info } from '../utils/format.js';\nimport type { Config } from '../types/index.js';\n\nexport async function configCommand(action?: string, key?: string, value?: string): Promise<void> {\n if (action === 'reset') {\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: 'Are you sure you want to completely reset all configuration to defaults?',\n default: false,\n },\n ]);\n\n if (confirm) {\n configService.reset();\n success('Configuration has been reset to defaults.');\n } else {\n info('Reset cancelled.');\n }\n return;\n }\n\n if (action === 'set' && key && value) {\n // Basic type coercion for port/timeout numbers, booleans, and strings\n let parsedValue: string | number | boolean = value;\n \n if (value === 'true') parsedValue = true;\n else if (value === 'false') parsedValue = false;\n else if (!Number.isNaN(Number(value))) parsedValue = Number(value);\n\n // Using any for strict set, we know the fields in Config\n configService.set(key as keyof Config, parsedValue as never);\n success(`Set ${chalk.cyan(key)} to ${chalk.green(value)}`);\n return;\n }\n\n if (action === 'unset' && key) {\n configService.delete(key as keyof Config);\n success(`Unset configuration key ${chalk.cyan(key)}`);\n return;\n }\n\n // Default block: show all configuration\n console.log();\n console.log(chalk.bold.cyan('\u2699\uFE0F AIX CLI Configuration'));\n console.log(chalk.dim('\u2500'.repeat(40)));\n \n const allKeys: Array<keyof Config> = [\n 'defaultBackend', \n 'defaultProvider', \n 'model', \n 'lmStudioUrl', \n 'lmStudioPort', \n 'lmStudioContextLength',\n 'ollamaUrl', \n 'ollamaPort', \n 'defaultTimeout', \n 'autoStartServer'\n ];\n\n allKeys.forEach((k) => {\n const val = configService.get(k);\n if (val !== undefined) {\n console.log(` ${chalk.bold(k)}: ${chalk.green(val)}`);\n } else {\n console.log(` ${chalk.bold(k)}: ${chalk.dim('not set')}`);\n }\n });\n\n console.log();\n console.log(chalk.dim('Commands:'));\n console.log(chalk.dim(' aix-cli config set <key> <value>'));\n console.log(chalk.dim(' aix-cli config unset <key>'));\n console.log(chalk.dim(' aix-cli config reset'));\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", "contextLength", "makeRequest", "includeContextLength", "payload", "bodyText", "details", "lastError", "err", "msg", "retryErr", "error", "startSpinner", "isMac", "isLinux", "isWindows", "lmStudioPath", "possiblePaths", "p", "existsSync", "localAppData", "programFiles", "timeout", "startTime", "ms", "resolve", "port", "_modelId", "ollama_exports", "__export", "OllamaService", "ollamaService", "chalk", "init_ollama", "__esmMin", "init_config", "configService", "path", "response", "m", "details", "models", "runningModels", "_modelId", "claude_exports", "__export", "ClaudeService", "claudeService", "execa", "chalk", "init_claude", "__esmMin", "init_config", "options", "model", "args", "verbose", "provider", "modelName", "claudeArgs", "baseUrl", "configService", "authToken", "messagesUrl", "resp", "e", "details", "backendHint", "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", "_backend", "defaultProvider", "choices", "defaultSel", "providerSelection", "initLMStudio", "options", "provider", "spinner", "ora", "isRunning", "lmStudioService", "confirmAction", "exitWithError", "modelsSpinner", "models", "model", "index", "size", "formatBytes", "loaded", "lastUsedModel", "modelSearch", "selectedModel", "m", "selectModel", "modelIdentifier", "initOllama", "ollamaService", "runningModels", "status", "info", "initCommand", "backend", "init_lmstudio", "init_ollama", "init_claude", "init_config", "ora", "chalk", "inquirer", "execa", "currentBackend", "currentModelId", "setupGracefulShutdown", "cleanup", "chalk", "ollamaService", "lmStudioService", "success", "validateModelName", "model", "selectBackend", "_provider", "defaultBackend", "configService", "backendSelection", "inquirer", "selectProvider", "spinner", "ora", "claudeService", "exitWithError", "getProviderDisplayName", "runWithLMStudio", "options", "provider", "serverSpinner", "isRunning", "confirmAction", "modelsSpinner", "models", "selectedModelId", "foundModel", "m", "lastUsedModel", "selectModel", "loadSpinner", "fullModelName", "launchProvider", "providerName", "error", "runCommand", "storedProvider", "providerSpinner", "ollamaSpinner", "runWithOllamaEnv", "args", "verbose", "ollamaUrl", "execa", "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", "init_config", "chalk", "inquirer", "configCommand", "action", "key", "value", "confirm", "inquirer", "configService", "success", "info", "parsedValue", "chalk", "k", "val", "program", "Command", "getCurrentVersion", "handleExit", "code", "chalk", "err", "reason", "r", "options", "globalOpts", "initCommand", "args", "runCommand", "statusCommand", "lmStudioService", "ollamaService", "claudeService", "configService", "lmStudioRunning", "ollamaRunning", "claudeInstalled", "defaultProvider", "defaultBackend", "lmPort", "ollamaPort", "issues", "issue", "updateCommand", "configCommand"]
|
|
7
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEhG"}
|
|
@@ -1 +0,0 @@
|
|
|
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;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;AAuNxE,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY1E"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AA8B3D,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA6JD,wBAAsB,UAAU,CAAC,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA+FxE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAsFnD"}
|
|
@@ -1 +0,0 @@
|
|
|
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/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|