@iamharshil/aix-cli 3.4.5 → 3.4.6
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/dist/bin/aix.js +11 -8
- package/dist/bin/aix.js.map +3 -3
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/index.js +11 -8
- package/dist/index.js.map +3 -3
- package/dist/services/lmstudio.d.ts +1 -0
- package/dist/services/lmstudio.d.ts.map +1 -1
- package/dist/services/ollama.d.ts +1 -0
- package/dist/services/ollama.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
2
|
+
var he=Object.defineProperty;var Se=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(e,t)=>(typeof require<"u"?require:e)[t]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});var T=(o,e)=>()=>(o&&(e=o(o=0)),e);var D=(o,e)=>{for(var t in e)he(o,t,{get:e[t],enumerable:!0})};var ie={};D(ie,{ConfigService:()=>z,configService:()=>s});import ve from"conf";var z,s,M=T(()=>{"use strict";z=class{store;constructor(){this.store=new ve({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){this.store.set("model",e)}getLastUsedModel(){return this.store.get("model")}setDefaultProvider(e){this.store.set("defaultProvider",e)}getDefaultProvider(){return this.store.get("defaultProvider")}setDefaultBackend(e){this.store.set("defaultBackend",e)}getDefaultBackend(){return this.store.get("defaultBackend")}getLMStudioUrl(){let e=this.store.get("lmStudioUrl"),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()}},s=new z});var se={};D(se,{LMStudioService:()=>j,lmStudioService:()=>v});import{execa as _}from"execa";import ae from"ora";import V from"chalk";var ye,j,v,A=T(()=>{"use strict";M();ye=[1234,1235,1236,1237],j=class{constructor(){}getBaseUrl(){return s.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 i=await fetch(this.getApiUrl(t),{method:"GET",signal:AbortSignal.timeout(1e4)});if(!i.ok)continue;let n=await i.json(),r=[];return Array.isArray(n)?r=n:n.models&&Array.isArray(n.models)?r=n.models:n.data&&Array.isArray(n.data)&&(r=n.data),r.map(d=>{let a=d;return{id:String(a.key||a.id||a.model||""),name:String(a.display_name||a.name||a.id||a.model||""),size:Number(a.size_bytes||a.size||a.file_size||0),quantization:String(a.quantization?typeof a.quantization=="object"?a.quantization.name:a.quantization:"")}}).filter(d=>d.id&&d.name)}catch{continue}return[]}async getStatus(){if(!await this.checkStatus())return{running:!1,port:s.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:s.get("lmStudioPort"),models:[]};let i=await t.json();return{running:!0,port:s.get("lmStudioPort"),models:i.models??[],activeModel:i.active_model}}catch{return{running:!1,port:s.get("lmStudioPort"),models:[]}}}async loadModel(e,t){let i=t??ae({text:`Loading model: ${V.cyan(e)}`,color:"cyan"}).start();try{let n=s.get("lmStudioContextLength"),r=["/api/v1/models/load","/api/model/load"],d=async(g,u)=>{let c={model:e};u&&(c.context_length=n);let m=await fetch(this.getApiUrl(g),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c),signal:AbortSignal.timeout(3e5)});if(m.ok)return;let S="";try{S=await m.text()}catch{S=""}let P=S?` ${S}`:"";throw new Error(`Failed to load model: ${m.status} ${m.statusText}${P}`)},a;for(let g of r)try{return await d(g,!0),i.succeed(`Model ${V.green(e)} loaded successfully`),s.setModel(e),{loadSpinner:i}}catch(u){a=u;let c=u instanceof Error?u.message:String(u);if(/context|token|max.*(context|token)|too.*large/i.test(c))try{return i.warn(`Model load failed with context_length=${n}. Retrying with LM Studio defaults...`),await d(g,!1),i.succeed(`Model ${V.green(e)} loaded successfully`),s.setModel(e),{loadSpinner:i}}catch(S){a=S}}throw a instanceof Error?a:new Error(String(a))}catch(n){throw i.fail(`Failed to load model: ${n instanceof Error?n.message:"Unknown error"}`),n}}async startServer(e){let t=e??ae({text:"Starting LM Studio server...",color:"cyan"}).start();try{let i=process.platform==="darwin",n=process.platform==="linux",r=process.platform==="win32",d;if(i){let a=["/Applications/LM Studio.app",`${process.env.HOME}/Applications/LM Studio.app`];for(let g of a)try{let{existsSync:u}=await import("fs");if(u(g)){d=`open "${g}" --args --server`;break}}catch{}if(d?.startsWith("open")){await _("open",[a.find(g=>{try{let{existsSync:u}=Se("fs");return u(g)}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?d=await this.findLinuxBinary():r&&(d=await this.findWindowsExecutable());if(!d)throw t.fail("LM Studio not found. Please install it from https://lmstudio.ai"),new Error("LM Studio not installed");await _(d,["--server"],{detached:!0,stdio:"ignore",env:{...process.env,LM_STUDIO_SERVER_PORT:String(s.get("lmStudioPort"))}}),t.succeed("LM Studio server started"),await this.waitForServer(6e4)}catch(i){throw t.fail(`Failed to start LM Studio: ${i instanceof Error?i.message:"Unknown error"}`),i}}async findLinuxBinary(){let e=["/usr/bin/lm-studio","/usr/local/bin/lm-studio",`${process.env.HOME}/.local/bin/lm-studio`];for(let t of e)try{return await _("test",["-x",t]),t}catch{continue}}async findWindowsExecutable(){let e=process.env.LOCALAPPDATA,t=process.env.PROGRAMFILES,i=[e?`${e}\\Programs\\LM Studio\\lm-studio.exe`:"",t?`${t}\\LM Studio\\lm-studio.exe`:""].filter(Boolean);for(let n of i)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 ye)try{if((await fetch(`http://localhost:${e}/api/status`,{method:"GET",signal:AbortSignal.timeout(1e3)})).ok)return s.set("lmStudioPort",e),e}catch{continue}return s.get("lmStudioPort")}async unloadModel(e){try{await fetch(this.getApiUrl("/api/model/unload"),{method:"POST",signal:AbortSignal.timeout(5e3)})}catch{}}},v=new j});var le={};D(le,{OllamaService:()=>F,ollamaService:()=>$});import we from"chalk";var F,$,O=T(()=>{"use strict";M();F=class{getBaseUrl(){return s.getOllamaUrl()}getApiUrl(e){return`${this.getBaseUrl()}${e}`}async checkStatus(){try{return(await fetch(this.getApiUrl("/api/tags"),{method:"GET",signal:AbortSignal.timeout(3e3)})).ok}catch{return!1}}async getAvailableModels(){try{let e=await fetch(this.getApiUrl("/api/tags"),{method:"GET",signal:AbortSignal.timeout(1e4)});return e.ok?((await e.json()).models??[]).map(n=>{let r=n.details??{};return{id:String(n.name??n.model??""),name:String(n.name??n.model??""),size:Number(n.size??0),quantization:String(r.quantization_level??""),family:String(r.family??""),parameterSize:String(r.parameter_size??"")}}).filter(n=>n.id&&n.name):[]}catch{return[]}}async getRunningModels(){try{let e=await fetch(this.getApiUrl("/api/ps"),{method:"GET",signal:AbortSignal.timeout(5e3)});return e.ok?((await e.json()).models??[]).map(n=>String(n.name??n.model??"")).filter(Boolean):[]}catch{return[]}}async getStatus(){if(!await this.checkStatus())return{running:!1,port:s.get("ollamaPort"),models:[],runningModels:[]};let[t,i]=await Promise.all([this.getAvailableModels(),this.getRunningModels()]);return{running:!0,port:s.get("ollamaPort"),models:t,runningModels:i}}async unloadModel(e){console.log(we.dim(`
|
|
3
|
+
Ollama automatically manages model memory. Session ended.`))}},$=new F});var ce={};D(ce,{ClaudeService:()=>W,claudeService:()=>R});import{execa as Q}from"execa";import Pe from"chalk";var W,R,Z=T(()=>{"use strict";M();W=class{async isClaudeCodeInstalled(){try{return await Q("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}async run(e){let{model:t,args:i=[],verbose:n=!1}=e,r=this.extractProvider(t),d=this.extractModelName(t);if(!r||!d)throw new Error(`Invalid model format: ${t}. Expected format: provider/model-name`);let a=["--model",d,...i];n&&console.log(Pe.dim(`
|
|
3
4
|
Running: claude ${a.join(" ")}
|
|
4
|
-
`));let g=r==="ollama"?s.getOllamaUrl():s.getLMStudioUrl(),
|
|
5
|
-
Model ready: ${g.name}`)),console.log(),console.log("Start your interactive coding session:"),console.log(` ${h.cyan(`aix-cli run --provider ${e} --backend lmstudio --model ${
|
|
6
|
-
Model selected: ${
|
|
5
|
+
`));let g=r==="ollama"?s.getOllamaUrl():s.getLMStudioUrl(),u=r==="ollama"?"ollama":"lmstudio",c=`${g}/v1/messages`;try{let m=await fetch(c,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":u},body:JSON.stringify({model:d,max_tokens:1,messages:[{role:"user",content:"test"}]}),signal:AbortSignal.timeout(3e3)});if(!m.ok&&m.status>=500)throw new Error(`HTTP ${m.status} ${m.statusText}`)}catch(m){let S=m instanceof Error?m.message:String(m),P=r==="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 ${c} (${S}). ${P}`)}try{await Q("claude",a,{stdio:"inherit",env:{...process.env,ANTHROPIC_MODEL:d,ANTHROPIC_BASE_URL:g,ANTHROPIC_AUTH_TOKEN:u,ANTHROPIC_API_KEY:""}})}catch(m){if(m instanceof Error&&"exitCode"in m){let S=m.exitCode;process.exit(S??1)}throw m}}extractProvider(e){return e.split("/")[0]}extractModelName(e){let t=e.split("/");if(!(t.length<2))return t.slice(1).join("/")}async getVersion(){try{return(await Q("claude",["--version"])).stdout}catch{return}}},R=new W});import{Command as Te}from"commander";import p from"chalk";A();O();M();import K from"ora";import h from"chalk";import H from"inquirer";import de from"inquirer";async function x(o,e){let t=o.map(r=>({name:`${r.name} (${r.id})`,value:r,short:r.name})),i=e?t.findIndex(r=>r.value.id===e):0;return(await de.prompt([{type:"list",name:"model",message:"Select a model to load:",choices:t,default:Math.max(0,i),pageSize:Math.min(o.length,15)}])).model}async function q(o,e=!0){return(await de.prompt([{type:"confirm",name:"confirm",message:o,default:e}])).confirm}import X from"chalk";function C(o){if(o===0)return"0 B";let e=1024,t=["B","KB","MB","GB","TB"],i=Math.floor(Math.log(o)/Math.log(e));return`${parseFloat((o/Math.pow(e,i)).toFixed(2))} ${t[i]}`}function y(o){console.log(X.green("\u2713")+" "+o)}function J(o){console.error(X.red("\u2717")+" "+o)}function G(o){console.log(X.blue("\u2139")+" "+o)}function f(o,e=1){J(o),process.exit(e)}async function $e(){let o=s.getDefaultBackend(),{backendSelection:e}=await H.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 H.prompt([{type:"confirm",name:"saveDefault",message:"Save as default backend?",default:!1}]);return t&&(s.setDefaultBackend(e),y(`Default backend set to ${h.cyan(e)}`)),e}async function be(o){let e=s.getDefaultProvider(),t=[{name:"Claude Code",value:"claude"}],i=e??"claude",{providerSelection:n}=await H.prompt([{type:"list",name:"providerSelection",message:"Select coding tool:",default:i,choices:t}]),{saveDefault:r}=await H.prompt([{type:"confirm",name:"saveDefault",message:"Save as default coding tool?",default:!1}]);return r&&(s.setDefaultProvider(n),y(`Default coding tool set to ${h.cyan(n)}`)),n}async function Me(o,e){let t=K({text:"Checking LM Studio status...",color:"cyan"}).start(),i=await v.checkStatus();i||(t.info("LM Studio server not running"),t.stop(),await q("Would you like to start the LM Studio server?")||f("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await v.startServer(),i=!0),t.succeed("Connected to LM Studio");let n=K({text:"Fetching available models...",color:"cyan"}).start(),r=await v.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),f("No models available")),n.succeed(`Found ${h.bold(r.length)} model${r.length===1?"":"s"}`),console.log(),console.log(h.bold("Available Models:")),console.log(h.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((c,m)=>{let S=C(c.size),P=c.loaded?h.green(" [LOADED]"):"";console.log(` ${h.dim(String(m+1).padStart(2))}. ${c.name} ${h.dim(`(${S})`)}${P}`)}),console.log();let d=s.getLastUsedModel(),a=o.model,g=a?r.find(c=>c.id===a||c.name.includes(a)):await x(r,d);g||f("No model selected"),await v.loadModel(g.id,t);let u=g.id;y(h.bold(`
|
|
6
|
+
Model ready: ${g.name}`)),console.log(),console.log("Start your interactive coding session:"),console.log(` ${h.cyan(`aix-cli run --provider ${e} --backend lmstudio --model ${u}`)}`),console.log()}async function ke(o,e){let t=K({text:"Checking Ollama status...",color:"cyan"}).start();await $.checkStatus()||(t.fail("Ollama is not running"),f("Ollama must be running. Start it with: ollama serve")),t.succeed("Connected to Ollama");let n=K({text:"Fetching available models...",color:"cyan"}).start(),r=await $.getAvailableModels();r.length===0&&(n.fail("No models found. Pull a model first: ollama pull <model>"),f("No models available")),n.succeed(`Found ${h.bold(r.length)} model${r.length===1?"":"s"}`);let d=await $.getRunningModels();console.log(),console.log(h.bold("Available Models:")),console.log(h.dim("\u2500".repeat(process.stdout.columns||80))),r.forEach((c,m)=>{let S=C(c.size),fe=d.includes(c.id)?h.green(" [RUNNING]"):"",pe=c.parameterSize?h.dim(` ${c.parameterSize}`):"";console.log(` ${h.dim(String(m+1).padStart(2))}. ${c.name}${pe} ${h.dim(`(${S})`)}${fe}`)}),console.log();let a=s.getLastUsedModel(),g=o.model,u=g?r.find(c=>c.id===g||c.name.includes(g)):await x(r,a);u||f("No model selected"),s.setModel(u.id),y(h.bold(`
|
|
7
|
+
Model selected: ${u.name}`)),console.log(),console.log("Start your interactive coding session:"),console.log(` ${h.cyan(`aix-cli run --provider ${e} --backend ollama --model ${u.id}`)}`),console.log()}async function Y(o={}){let e=o.backend??await $e(),t=o.provider??await be(e);e==="ollama"?await ke(o,t):await Me(o,t)}A();O();Z();M();import k from"ora";import L from"chalk";import xe from"inquirer";import{execa as Ce}from"execa";var U=null,I=null;function ue(){let o=async()=>{if(I&&U){console.log(L.dim(`
|
|
8
|
+
|
|
9
|
+
Cleaning up...`));try{U==="ollama"?await $.unloadModel(I):U==="lmstudio"&&await v.unloadModel(),y(`Model "${I}" unloaded`)}catch{}}};process.on("SIGINT",()=>{o().finally(()=>process.exit(0))}),process.on("SIGTERM",()=>{o().finally(()=>process.exit(0))})}function me(o){return!o||o.trim().length===0||o.length>200?!1:/^[\w\-:.]+$/.test(o)}async function Le(o){let e=s.getDefaultBackend();if(e)return e;let{backendSelection:t}=await xe.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 Ae(){let o=k({text:"Checking Claude Code installation...",color:"cyan"}).start();return await R.isClaudeCodeInstalled()||(o.fail("Claude Code is not installed"),f("Claude Code is required. Install with: npm install -g @anthropic-ai/claude-code")),o.succeed("Claude Code is installed"),"claude"}function E(o){return"Claude Code"}async function Oe(o,e){let t=k({text:"Checking LM Studio status...",color:"cyan"}).start();await v.findAvailablePort();let i=await v.checkStatus();i||(t.info("LM Studio server not running"),t.stop(),await q("Would you like to start the LM Studio server?")||f("LM Studio server must be running. Start it manually or use the Server tab in LM Studio."),await v.startServer(),i=!0),t.succeed("Connected to LM Studio");let n=k({text:"Fetching available models...",color:"cyan"}).start(),r=await v.getAvailableModels();r.length===0&&(n.fail("No models found. Download some models in LM Studio first."),f("No models available")),n.succeed(`Found ${r.length} model${r.length===1?"":"s"}`);let d;if(o.model){me(o.model)||f(`Invalid model name: "${o.model}". Use letters, numbers, dashes, underscores, colon, or dot.`);let u=r.find(c=>c.id===o.model||c.name.toLowerCase().includes(o.model.toLowerCase()));u||f(`Model "${o.model}" not found. Available models: ${r.map(c=>c.name).join(", ")}`),d=u.id}else{let u=s.getLastUsedModel();d=(await x(r,u)).id}let a=k({text:`Loading model: ${L.cyan(d)}`,color:"cyan"}).start();await v.loadModel(d,a),U="lmstudio",I=d;let g=`lmstudio/${d}`;ue(),await Re(e,g,o)}async function Re(o,e,t){let i=E(o);y(L.green(`
|
|
7
10
|
Starting ${i} with model: ${e}
|
|
8
|
-
`));try{await
|
|
11
|
+
`));try{await R.run({model:e,args:t.args??[],verbose:t.verbose})}catch(n){f(`Failed to run ${i}: ${n instanceof Error?n.message:"Unknown error"}`)}}async function ee(o={}){let e;if(o.provider)e=o.provider;else{let r=s.getDefaultProvider();r?e=r:e=await Ae()}let t=k({text:`Checking ${E(e)} installation...`,color:"cyan"}).start();if(await R.isClaudeCodeInstalled()||(t.fail(`${E(e)} is not installed.`),f(`Please install ${E(e)} first.`)),t.succeed(`${E(e)} is installed`),(o.backend??await Le(e))==="ollama"){let r=k({text:"Checking Ollama status...",color:"cyan"}).start();await $.checkStatus()||(r.fail("Ollama is not running"),f("Ollama must be running. Start it with: ollama serve")),r.succeed("Connected to Ollama");let a=k({text:"Fetching available models...",color:"cyan"}).start(),g=await $.getAvailableModels();g.length===0&&(a.fail("No models found"),f("No models available. Pull a model first: ollama pull <model>")),a.succeed(`Found ${g.length} model${g.length===1?"":"s"}`);let u;if(o.model){me(o.model)||f(`Invalid model name: "${o.model}". Use letters, numbers, dash, underscore, colon, or dot.`);let c=g.find(m=>m.id===o.model||m.name.toLowerCase().includes(o.model.toLowerCase()));c||f(`Model "${o.model}" not found. Available: ${g.map(m=>m.name).join(", ")}`),u=c.id}else{let c=s.getLastUsedModel();u=(await x(g,c)).id}s.setModel(u),U="ollama",I=u,ue(),await Ee(u,o.args??[],o.verbose??!1);return}await Oe(o,e)}async function Ee(o,e,t){let i=s.getOllamaUrl();y(L.green(`
|
|
9
12
|
Starting Claude Code with Ollama at ${i}...
|
|
10
|
-
`)),t&&(console.log(
|
|
11
|
-
`)),console.log(
|
|
12
|
-
`)));try{await
|
|
13
|
+
`)),t&&(console.log(L.dim(`Running: claude --model ${o}
|
|
14
|
+
`)),console.log(L.dim(`ANTHROPIC_BASE_URL=${i}
|
|
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();
|
|
13
16
|
//# sourceMappingURL=index.js.map
|