@xeno-corporation/xeno-agent-cli 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -30,7 +30,7 @@ ${ne}${J("Goodbye.")}
30
30
  `)}
31
31
  `}var xm,Pm,Tm,_m,On=kt(()=>{"use strict";hn();xm=1,Pm="credentials.json",Tm="logout.json",_m=6e4});import dl from"chalk";function $m(t,e){let n=Math.max(40,e??process.stdout.columns??80),s=d.clearScreen();s+=d.hideCursor();let r=1,o=i=>{s+=d.moveTo(r,1)+d.eraseLine()+i,r++};o(` ${Vo(ul("Welcome to XENO"))}${Vo(", the AI-native command-line agent")}`),o(""),o(` ${ns("Sign in with your XENO Studio account to use XENO with your plan")}`),o(` ${ns("or paste an API token for usage-based billing")}`),o("");for(let i=0;i<yn.length;i++){let a=yn[i];i===t?(o(`${ul("> ")}${Vo(`${a.number}. ${a.title}`)}`),o(` ${ns(a.detail)}`)):(o(` ${ns(`${a.number}. ${a.title}`)}`),o(` ${ns(a.detail)}`)),o("")}return o(` ${ns("Press enter to continue \xB7 Up/Down to choose \xB7 Esc to exit")}`),s}function qo(){return process.stdin.isTTY?new Promise(t=>{let e=0,n=null,s=()=>{n?.release(),n=null,process.stdout.removeListener("resize",o),process.stdout.write(d.showCursor()),process.stdout.write(d.resetScrollRegion()),process.stdout.write(d.clearScreen())},r=()=>{process.stdout.write($m(e))},o=()=>{r()};n=Ct(a=>{let l=typeof a=="string"?a:a.toString("utf8");if(l===""){s(),t({choice:"exit"});return}if(l==="\x1B"){s(),t({choice:"exit"});return}if(l==="\x1B[A"){e=(e-1+yn.length)%yn.length,r();return}if(l==="\x1B[B"){e=(e+1)%yn.length,r();return}if(l==="\r"||l===`
32
32
  `){let u=yn[e].value;s(),t({choice:u});return}let c=Number.parseInt(l,10);Number.isFinite(c)&&c>=1&&c<=yn.length&&(s(),t({choice:yn[c-1].value}))}),process.stdout.on("resize",o),r()}):Promise.resolve({choice:"exit"})}var ul,ns,Vo,yn,pl=kt(()=>{"use strict";fn();It();At();ul=t=>Ke()(t),ns=dl.dim,Vo=dl.bold,yn=[{value:"browser",number:1,title:"Sign in with XENO Account",detail:"Browser-based login with your XENO Studio account"},{value:"device-code",number:2,title:"Sign in with Device Code",detail:"Sign in from another device with a one-time code"},{value:"token",number:3,title:"Provide your own API token",detail:"Paste an existing XENO token"}]});import zo from"chalk";function Dm(t,e){let n=Math.max(40,e??process.stdout.columns??80),s=d.clearScreen();s+=d.hideCursor();let r=1,o=a=>{s+=d.moveTo(r,1)+d.eraseLine()+a,r++};o(""),o(""),o(` ${Ho(Lm("Welcome to XENO"))}${Ho(", the AI-native command-line agent")}`),o(""),o("");let i=t.email??t.displayName??"your XENO account";return o(` ${Nm("\u2713")} ${Ho(`Signed in as ${i}`)}`),o(""),o(` ${Is(Bm[t.via])}`),o(""),o(""),o(` ${Is("You're all set. The CLI is now authenticated against your XENO")}`),o(` ${Is("Studio account on this machine.")}`),o(""),o(""),o(` ${Is("Press any key to continue \xB7 Esc to exit")}`),s}function ml(t){return process.stdin.isTTY?new Promise(e=>{let n=null,s=a=>{if(n?.release(),n=null,process.stdout.removeListener("resize",o),process.stdout.write(d.showCursor()),process.stdout.write(d.resetScrollRegion()),process.stdout.write(d.clearScreen()),a.mode==="loading"){let l=process.stdout.columns??80,c=process.stdout.rows??24,u="Starting XENO\u2026",p=Math.max(0,Math.floor((l-u.length)/2)),f=Math.max(1,Math.floor(c/2));process.stdout.write(d.moveTo(f,1)+d.eraseLine()+" ".repeat(p)+Is(u)+`
33
- `)}},r=()=>{process.stdout.write(Dm(t))},o=()=>{r()};n=Ct(a=>{let l=typeof a=="string"?a:a.toString("utf8");if(l===""){s({mode:"exit"}),e({outcome:"exit"});return}if(l==="\x1B"||l==="\x1B"){s({mode:"exit"}),e({outcome:"exit"});return}s({mode:"loading"}),e({outcome:"continue"})}),process.stdout.on("resize",o),r()}):Promise.resolve({outcome:"continue"})}var Lm,Is,Ho,Nm,Bm,fl=kt(()=>{"use strict";fn();It();At();Lm=t=>Ke()(t),Is=zo.dim,Ho=zo.bold,Nm=zo.green,Bm={browser:"Browser-based login","device-code":"Device-code login",token:"API token"}});var Ze,$n=kt(()=>{"use strict";Ze="0.3.0"});import{spawn as Wo}from"child_process";import{createServer as Fm}from"http";import bl from"chalk";function Hm(t){try{process.platform==="win32"?Wo("cmd",["/c","start","",t],{detached:!0,stdio:"ignore"}).unref():process.platform==="darwin"?Wo("open",[t],{detached:!0,stdio:"ignore"}).unref():Wo("xdg-open",[t],{detached:!0,stdio:"ignore"}).unref()}catch{}}async function zm(t){let e=Fm((r,o)=>{if(!r.url){o.statusCode=404,o.end();return}let i=new URL(r.url,"http://127.0.0.1");if(i.pathname!=="/callback"){o.statusCode=404,o.end();return}let a=i.searchParams.get("session")??void 0;o.statusCode=200,o.setHeader("content-type","text/html; charset=utf-8"),o.setHeader("cache-control","no-store"),o.end(qm),t.onCallback(a)}),n=await new Promise((r,o)=>{let i=a=>{a.code==="EADDRINUSE"?(e.removeListener("error",i),e.once("error",o),e.listen(0,"127.0.0.1",()=>{let l=e.address();l&&typeof l=="object"?r(l.port):o(new Error("Failed to bind localhost callback server"))})):o(a)};e.once("error",i),e.listen(Um,"127.0.0.1",()=>{e.removeListener("error",i);let a=e.address();a&&typeof a=="object"?r(a.port):o(new Error("Failed to bind localhost callback server"))})}),s=r=>new Promise(o=>{r.close(()=>o()),r.closeAllConnections?.()});return{url:`http://127.0.0.1:${n}/callback`,close:()=>s(e)}}function Wm(t){return new Promise(e=>{if(!process.stdin.isTTY){let i=()=>{t.removeEventListener("abort",i),e("complete")};t.addEventListener("abort",i);return}let n=()=>{o(),e("complete")},s=null,r=i=>{(i==="\x1B"||i==="")&&(o(),e("cancel"))},o=()=>{s?.release(),s=null,t.removeEventListener("abort",n)};s=Ct(r),t.addEventListener("abort",n)})}function Xm(t){let e=d.clearScreen();e+=d.hideCursor();let n=1,s=r=>{e+=d.moveTo(n,1)+d.eraseLine()+r,n++};return s(` ${Ko(hl("Welcome to XENO"))}${Ko(", the AI-native command-line agent")}`),s(""),s(` ${Ko("Finish signing in via your browser")}`),s(""),s(` ${Xo("If the link doesn't open automatically, open the following link to authenticate:")}`),s(""),s(` ${hl(t)}`),s(""),s(` ${Xo("On a remote or headless machine? Press esc and choose Sign in with Device Code.")}`),s(""),s(` ${Xo("Press esc to cancel")}`),e}function gl(t){let e=t?.trim();if(e)return e.replace(/\/+$/,"")}async function Go(t={}){let e=t.fetchImpl??fetch,n=gl(t.authBaseURL)??ot,s=gl(t.apiBaseURL)??we.XENO_API_BASE,r=t.cliVersion??Ze,o=t.timeoutMs??Vm,i=t.log??($=>process.stdout.write($)),a=t.openBrowser??Hm,l=t.startCallbackServer??zm,c=t.waitForCancel??Wm,u=t.pollIntervalMs??jm,p={resolved:!1},f=new AbortController,m,g=new Promise($=>{m=E=>{p.resolved||(p.resolved=!0,f.abort(),p.pollTimer&&clearTimeout(p.pollTimer),p.timeoutTimer&&clearTimeout(p.timeoutTimer),$(E))}}),b=async()=>{if(p.pollTimer&&clearTimeout(p.pollTimer),p.timeoutTimer&&clearTimeout(p.timeoutTimer),p.server)try{await p.server.close()}catch{}},v={onCallback:$=>{$&&$!==p.sessionId||p.pollTrigger?.()}};try{p.server=await l(v)}catch($){return{kind:"error",message:`Failed to start localhost callback server: ${$ instanceof Error?$.message:String($)}`}}let w;try{let $=await e(`${n}/api/auth/cli/start`,{method:"POST",headers:{"content-type":"application/json","user-agent":"xeno-agent-cli"},body:JSON.stringify({redirect_uri:p.server.url,cli_version:r})});if(!$.ok){let E=await $.text();return await b(),{kind:"error",message:`Failed to start CLI auth session (${$.status}): ${E.slice(0,200)}`}}w=await $.json()}catch($){return await b(),{kind:"error",message:`Failed to start CLI auth session: ${$ instanceof Error?$.message:String($)}`}}p.sessionId=w.session_id,t.onStarted?.({...w,redirect_uri:p.server.url}),t.silent||i(Xm(w.auth_url)),a(w.auth_url);let P=async()=>{if(!p.resolved){try{let $=await e(`${n}/api/auth/cli/poll?session_id=${encodeURIComponent(p.sessionId)}`,{method:"GET",headers:{"user-agent":"xeno-agent-cli"}});if(!$.ok&&$.status!==200){if($.status===404){m({kind:"error",message:"Sign-in session not found."});return}}else{let E=await $.json();if(E.status==="complete"&&E.token){let T={accountToken:E.token,apiKey:E.token,authBaseURL:n,apiBaseURL:s,...E.user?{user:E.user}:{},source:"browser-oauth"},I=bt(T,t.homePath);m({kind:"success",user:E.user,credentials:I});return}if(E.status==="not_found"){m({kind:"error",message:"Sign-in session not found."});return}}}catch{}p.resolved||(p.pollTimer=setTimeout(()=>{P()},u))}};p.pollTrigger=()=>{p.pollTimer&&clearTimeout(p.pollTimer),P()},p.pollTimer=setTimeout(()=>{P()},u),p.timeoutTimer=setTimeout(()=>{m({kind:"timeout",message:"Sign-in timed out. Please try again."})},o),(async()=>{try{if(await c(f.signal)==="cancel"){try{await e(`${n}/api/auth/cli/cancel`,{method:"POST",headers:{"content-type":"application/json","user-agent":"xeno-agent-cli"},body:JSON.stringify({session_id:p.sessionId})})}catch{}m({kind:"cancelled"})}}catch($){let E=$ instanceof Error?$.message:String($);m({kind:"error",message:`Sign-in cancel watcher failed: ${E}`})}})();let C=await g;return await b(),C}var hl,Xo,Ko,Um,jm,Vm,qm,yl=kt(()=>{"use strict";On();hn();fn();It();At();$n();hl=t=>Ke()(t),Xo=bl.dim,Ko=bl.bold,Um=1455,jm=2e3,Vm=600*1e3,qm=`<!doctype html>
33
+ `)}},r=()=>{process.stdout.write(Dm(t))},o=()=>{r()};n=Ct(a=>{let l=typeof a=="string"?a:a.toString("utf8");if(l===""){s({mode:"exit"}),e({outcome:"exit"});return}if(l==="\x1B"||l==="\x1B"){s({mode:"exit"}),e({outcome:"exit"});return}s({mode:"loading"}),e({outcome:"continue"})}),process.stdout.on("resize",o),r()}):Promise.resolve({outcome:"continue"})}var Lm,Is,Ho,Nm,Bm,fl=kt(()=>{"use strict";fn();It();At();Lm=t=>Ke()(t),Is=zo.dim,Ho=zo.bold,Nm=zo.green,Bm={browser:"Browser-based login","device-code":"Device-code login",token:"API token"}});var Ze,$n=kt(()=>{"use strict";Ze="0.4.1"});import{spawn as Wo}from"child_process";import{createServer as Fm}from"http";import bl from"chalk";function Hm(t){try{process.platform==="win32"?Wo("cmd",["/c","start","",t],{detached:!0,stdio:"ignore"}).unref():process.platform==="darwin"?Wo("open",[t],{detached:!0,stdio:"ignore"}).unref():Wo("xdg-open",[t],{detached:!0,stdio:"ignore"}).unref()}catch{}}async function zm(t){let e=Fm((r,o)=>{if(!r.url){o.statusCode=404,o.end();return}let i=new URL(r.url,"http://127.0.0.1");if(i.pathname!=="/callback"){o.statusCode=404,o.end();return}let a=i.searchParams.get("session")??void 0;o.statusCode=200,o.setHeader("content-type","text/html; charset=utf-8"),o.setHeader("cache-control","no-store"),o.end(qm),t.onCallback(a)}),n=await new Promise((r,o)=>{let i=a=>{a.code==="EADDRINUSE"?(e.removeListener("error",i),e.once("error",o),e.listen(0,"127.0.0.1",()=>{let l=e.address();l&&typeof l=="object"?r(l.port):o(new Error("Failed to bind localhost callback server"))})):o(a)};e.once("error",i),e.listen(Um,"127.0.0.1",()=>{e.removeListener("error",i);let a=e.address();a&&typeof a=="object"?r(a.port):o(new Error("Failed to bind localhost callback server"))})}),s=r=>new Promise(o=>{r.close(()=>o()),r.closeAllConnections?.()});return{url:`http://127.0.0.1:${n}/callback`,close:()=>s(e)}}function Wm(t){return new Promise(e=>{if(!process.stdin.isTTY){let i=()=>{t.removeEventListener("abort",i),e("complete")};t.addEventListener("abort",i);return}let n=()=>{o(),e("complete")},s=null,r=i=>{(i==="\x1B"||i==="")&&(o(),e("cancel"))},o=()=>{s?.release(),s=null,t.removeEventListener("abort",n)};s=Ct(r),t.addEventListener("abort",n)})}function Xm(t){let e=d.clearScreen();e+=d.hideCursor();let n=1,s=r=>{e+=d.moveTo(n,1)+d.eraseLine()+r,n++};return s(` ${Ko(hl("Welcome to XENO"))}${Ko(", the AI-native command-line agent")}`),s(""),s(` ${Ko("Finish signing in via your browser")}`),s(""),s(` ${Xo("If the link doesn't open automatically, open the following link to authenticate:")}`),s(""),s(` ${hl(t)}`),s(""),s(` ${Xo("On a remote or headless machine? Press esc and choose Sign in with Device Code.")}`),s(""),s(` ${Xo("Press esc to cancel")}`),e}function gl(t){let e=t?.trim();if(e)return e.replace(/\/+$/,"")}async function Go(t={}){let e=t.fetchImpl??fetch,n=gl(t.authBaseURL)??ot,s=gl(t.apiBaseURL)??we.XENO_API_BASE,r=t.cliVersion??Ze,o=t.timeoutMs??Vm,i=t.log??($=>process.stdout.write($)),a=t.openBrowser??Hm,l=t.startCallbackServer??zm,c=t.waitForCancel??Wm,u=t.pollIntervalMs??jm,p={resolved:!1},f=new AbortController,m,g=new Promise($=>{m=E=>{p.resolved||(p.resolved=!0,f.abort(),p.pollTimer&&clearTimeout(p.pollTimer),p.timeoutTimer&&clearTimeout(p.timeoutTimer),$(E))}}),b=async()=>{if(p.pollTimer&&clearTimeout(p.pollTimer),p.timeoutTimer&&clearTimeout(p.timeoutTimer),p.server)try{await p.server.close()}catch{}},v={onCallback:$=>{$&&$!==p.sessionId||p.pollTrigger?.()}};try{p.server=await l(v)}catch($){return{kind:"error",message:`Failed to start localhost callback server: ${$ instanceof Error?$.message:String($)}`}}let w;try{let $=await e(`${n}/api/auth/cli/start`,{method:"POST",headers:{"content-type":"application/json","user-agent":"xeno-agent-cli"},body:JSON.stringify({redirect_uri:p.server.url,cli_version:r})});if(!$.ok){let E=await $.text();return await b(),{kind:"error",message:`Failed to start CLI auth session (${$.status}): ${E.slice(0,200)}`}}w=await $.json()}catch($){return await b(),{kind:"error",message:`Failed to start CLI auth session: ${$ instanceof Error?$.message:String($)}`}}p.sessionId=w.session_id,t.onStarted?.({...w,redirect_uri:p.server.url}),t.silent||i(Xm(w.auth_url)),a(w.auth_url);let P=async()=>{if(!p.resolved){try{let $=await e(`${n}/api/auth/cli/poll?session_id=${encodeURIComponent(p.sessionId)}`,{method:"GET",headers:{"user-agent":"xeno-agent-cli"}});if(!$.ok&&$.status!==200){if($.status===404){m({kind:"error",message:"Sign-in session not found."});return}}else{let E=await $.json();if(E.status==="complete"&&E.token){let T={accountToken:E.token,apiKey:E.token,authBaseURL:n,apiBaseURL:s,...E.user?{user:E.user}:{},source:"browser-oauth"},I=bt(T,t.homePath);m({kind:"success",user:E.user,credentials:I});return}if(E.status==="not_found"){m({kind:"error",message:"Sign-in session not found."});return}}}catch{}p.resolved||(p.pollTimer=setTimeout(()=>{P()},u))}};p.pollTrigger=()=>{p.pollTimer&&clearTimeout(p.pollTimer),P()},p.pollTimer=setTimeout(()=>{P()},u),p.timeoutTimer=setTimeout(()=>{m({kind:"timeout",message:"Sign-in timed out. Please try again."})},o),(async()=>{try{if(await c(f.signal)==="cancel"){try{await e(`${n}/api/auth/cli/cancel`,{method:"POST",headers:{"content-type":"application/json","user-agent":"xeno-agent-cli"},body:JSON.stringify({session_id:p.sessionId})})}catch{}m({kind:"cancelled"})}}catch($){let E=$ instanceof Error?$.message:String($);m({kind:"error",message:`Sign-in cancel watcher failed: ${E}`})}})();let C=await g;return await b(),C}var hl,Xo,Ko,Um,jm,Vm,qm,yl=kt(()=>{"use strict";On();hn();fn();It();At();$n();hl=t=>Ke()(t),Xo=bl.dim,Ko=bl.bold,Um=1455,jm=2e3,Vm=600*1e3,qm=`<!doctype html>
34
34
  <html lang="en">
35
35
  <head>
36
36
  <meta charset="utf-8">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xeno-corporation/xeno-agent-cli",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "XENO AGENT - AI-powered terminal agent CLI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -8,9 +8,9 @@
8
8
  ".": "./dist/index.js"
9
9
  },
10
10
  "bin": {
11
- "xeno": "./dist/index.js",
12
- "xeno-agent": "./dist/index.js",
13
- "xeno-code": "./dist/index.js"
11
+ "xeno": "dist/index.js",
12
+ "xeno-agent": "dist/index.js",
13
+ "xeno-code": "dist/index.js"
14
14
  },
15
15
  "files": [
16
16
  "dist/",