@plusonelabs/cue 0.0.8 → 0.0.9
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/cue-v0.0.9.tar.gz +0 -0
- package/dist/cli.mjs +1 -1
- package/package.json +5 -30
- package/cue-v0.0.8.tar.gz +0 -0
|
Binary file
|
package/dist/cli.mjs
CHANGED
|
@@ -555,7 +555,7 @@ Options:
|
|
|
555
555
|
--kill <id> Terminate session`}]);return}try{i(!0),a("Running Claude Code"),r(Date.now());let h=await H0.execute({prompt:l,sessionId:m?void 0:d||void 0,cwd:process.cwd()});if(i(!1),h.error){n(y=>[...y,{role:"assistant",content:`\u274C Claude Code error: ${h.error}`}]);return}h.sessionId&&(O5=h.sessionId);let E=h.result||"[No result returned]";if(h.sessionInfo){let y=h.sessionInfo.projectPath||process.cwd();E=`Session: ${h.sessionInfo.sessionId}
|
|
556
556
|
Project: ${y}
|
|
557
557
|
|
|
558
|
-
RESULT: ${E}`}else E=`RESULT: ${E}`;n(y=>[...y,{role:"user",content:`/claude ${l}`},{role:"assistant",content:E}])}catch(h){i(!1),n(E=>[...E,{role:"assistant",content:`\u274C Error: ${h instanceof Error?h.message:String(h)}`}])}}},mce=BCe});var xL={};Kr(xL,{commandList:()=>k5,commands:()=>EB,enabledCommands:()=>Ace,getCommand:()=>VP,hasCommand:()=>SCe});function SCe(t){return EB.some(e=>e.name===t||e.aliases?.includes(t))}function VP(t){return EB.find(e=>e.name===t||e.aliases?.includes(t))}var EB,Ace,k5,v6=Q(async()=>{"use strict";are();dre();hre();vre();await Wue();ece();ice();lce();cce();dce();fce();EB=[rce,oce,...nre,gre,Zue,Xue,sce,ace,mce,tce,nce,uce,pre,pce,Are];Ace=EB.filter(t=>t.isEnabled),k5=Ace.map(t=>({name:t.name,description:t.description}))});var Sce={};Kr(Sce,{getActualModelName:()=>M5,getCurrentModel:()=>Hu,getCurrentProvider:()=>Hs,getModelDisplayName:()=>IB,getProviderDisplayName:()=>xB,setCurrentModel:()=>az,setCurrentProvider:()=>iz});function Hu(){return xce}function az(t){xce=t}function IB(t){return{sonnet:"Sonnet 4 (claude-sonnet-4-20250514)",opus:"Opus 4 (claude-opus-4-20250514)",haiku:"Haiku 3.5 (claude-3-5-haiku-20241022)","gpt-5":"GPT-5 (gpt-5-2025-08-07)","gpt-5-mini":"GPT-5 Mini (gpt-5-mini-2025-08-07)","gpt-5-nano":"GPT-5 Nano (gpt-5-nano-2025-08-07)"}[t]||t}function Hs(){return Bce}function iz(t){Bce=t}function xB(t){return{anthropic:"Anthropic",openai:"OpenAI",cue:"Cue"}[t]||t}function M5(t){return{sonnet:"claude-sonnet-4-20250514",opus:"claude-opus-4-20250514",haiku:"claude-3-5-haiku-20241022","gpt-5":"gpt-5-2025-08-07","gpt-5-mini":"gpt-5-mini-2025-08-07","gpt-5-nano":"gpt-5-nano-2025-08-07"}[t]||t}var xce,Bce,q0=Q(()=>{"use strict";xce="sonnet",Bce="cue"});var lz={};Kr(lz,{default:()=>NCe});var NCe,uz=Q(()=>{NCe={name:"@plusonelabs/cue",version:"0.0.8",description:"Cue CLI",main:"./dist/cli.mjs",bin:{cue:"dist/cli.mjs"},type:"module",scripts:{build:"tsc",dev:"NODE_OPTIONS='--disable-warning=DEP0040' tsx src/cli.tsx",test:"NODE_OPTIONS='--disable-warning=DEP0040' vitest",typecheck:"tsc --noEmit",format:"prettier --write .",lint:"eslint ."},dependencies:{"@cue/core":"file:../core",axios:"^1.11.0",chalk:"^5.4.1","cli-highlight":"^2.1.11",dotenv:"^17.2.1",ink:"^6.0.1",inquirer:"^12.8.2",marked:"^16.1.1","qrcode-terminal":"^0.12.0",react:"^19.1.0"},devDependencies:{"@types/inquirer":"^9.0.8","@types/node":"^24.1.0","@types/qrcode-terminal":"^0.12.2","@types/react":"^19.1.8",prettier:"^3.2.5",tsx:"^4.20.3",typescript:"^5.1.6",vitest:"^3.2.4"}}});var Yce=re((mWe,OCe)=>{OCe.exports={name:"@plusonelabs/cue",version:"0.0.8",description:"Cue CLI",main:"./dist/cli.mjs",bin:{cue:"dist/cli.mjs"},type:"module",scripts:{build:"tsc",dev:"NODE_OPTIONS='--disable-warning=DEP0040' tsx src/cli.tsx",test:"NODE_OPTIONS='--disable-warning=DEP0040' vitest",typecheck:"tsc --noEmit",format:"prettier --write .",lint:"eslint ."},dependencies:{"@cue/core":"file:../core",axios:"^1.11.0",chalk:"^5.4.1","cli-highlight":"^2.1.11",dotenv:"^17.2.1",ink:"^6.0.1",inquirer:"^12.8.2",marked:"^16.1.1","qrcode-terminal":"^0.12.0",react:"^19.1.0"},devDependencies:{"@types/inquirer":"^9.0.8","@types/node":"^24.1.0","@types/qrcode-terminal":"^0.12.2","@types/react":"^19.1.8",prettier:"^3.2.5",tsx:"^4.20.3",typescript:"^5.1.6",vitest:"^3.2.4"}}});var Zce={};Kr(Zce,{CLIManagerService:()=>TB,getCLIManagerService:()=>dz});import{spawn as kCe}from"child_process";import{existsSync as Wd,writeFileSync as z5,readFileSync as wB,mkdirSync as _B,readdirSync as UCe,unlinkSync as QB,openSync as MCe}from"fs";import{join as rp}from"path";import{homedir as LCe}from"os";function M6(t,e){T.error(t,e instanceof Error?{message:e.message,stack:e.stack}:{error:String(e)})}function K0(t,e){T.warn(t,e instanceof Error?{message:e.message,stack:e.stack}:{error:String(e)})}function dz(){return pz||(pz=new TB),pz}var TB,pz,mz=Q(()=>{"use strict";Zn();TB=class{instances=new Map;stateFile;logDir;managerPid;managerClientId;requestDir;responseDir;constructor(){let e=rp(LCe(),".cue");Wd(e)||_B(e,{recursive:!0}),this.logDir=rp(e,"manager-logs"),Wd(this.logDir)||_B(this.logDir,{recursive:!0}),this.requestDir=rp(e,"manager-requests"),Wd(this.requestDir)||_B(this.requestDir,{recursive:!0}),this.responseDir=rp(e,"manager-responses"),Wd(this.responseDir)||_B(this.responseDir,{recursive:!0}),this.stateFile=rp(e,"manager-state.json"),this.managerPid=process.pid,this.loadState(),process.env.CLI_MANAGER_DAEMON==="true"&&(process.on("exit",()=>this.cleanup()),process.on("SIGINT",()=>this.shutdown()),process.on("SIGTERM",()=>this.shutdown()))}async startManager(){let e=this.getManagerStatus();if(e.isRunning)return{success:!1,message:`Manager already running with PID ${e.pid}`,pid:e.pid};T.info("Starting CLI Manager Service...");let{spawn:n}=await import("child_process"),i=rp(process.cwd(),"src/cli.tsx");n("tsx",[i,"--manager-daemon"],{detached:!0,stdio:"ignore",env:{...process.env,CLI_MANAGER_DAEMON:"true"}}).unref(),await new Promise(l=>setTimeout(l,1e3));let r=this.getManagerStatus();return r.isRunning?{success:!0,message:`CLI Manager daemon started with PID ${r.pid}`,pid:r.pid}:{success:!1,message:"Failed to start manager daemon"}}async startDaemon(){return T.info("Starting CLI Manager Daemon..."),this.managerClientId=`cli-manager-${Date.now()}-${Math.random().toString(36).substring(7)}`,this.saveState(),this.startHeartbeat(),T.info(`CLI Manager daemon running with PID ${this.managerPid}`),{success:!0,message:`CLI Manager daemon started with PID ${this.managerPid}`,pid:this.managerPid}}async stopManager(){T.info("Stopping CLI Manager Service...");let e=this.getManagerStatus();if(!e.isRunning||!e.pid)return{success:!1,message:"No manager daemon is currently running"};try{if(process.kill(e.pid,"SIGTERM"),await new Promise(n=>setTimeout(n,2e3)),this.isProcessAlive(e.pid)&&(process.kill(e.pid,"SIGKILL"),await new Promise(n=>setTimeout(n,1e3))),Wd(this.stateFile))try{await(await import("fs/promises")).unlink(this.stateFile)}catch(n){K0("Failed to remove state file:",n)}return{success:!0,message:`CLI Manager daemon (PID: ${e.pid}) stopped and all instances terminated`}}catch(n){return{success:!1,message:`Failed to stop manager daemon: ${n instanceof Error?n.message:String(n)}`}}}getManagerStatus(){if(!Wd(this.stateFile))return{isRunning:!1,instanceCount:0};try{let e=wB(this.stateFile,"utf8"),n=JSON.parse(e),i=this.isProcessAlive(n.pid);if(!i){T.warn(`Manager process ${n.pid} is dead, cleaning up state file`);try{QB(this.stateFile)}catch(a){K0("Failed to clean up stale state file:",a)}return{isRunning:!1,instanceCount:0}}return{isRunning:i,pid:n.pid,clientId:n.clientId,startTime:new Date(n.startTime),instanceCount:Object.keys(n.instances).length,authStatus:n.authStatus}}catch(e){return K0("Failed to read manager state:",e),{isRunning:!1,instanceCount:0}}}async spawnInstance(e,n={}){if(T.info(`\u{1F50D} SPAWN START: ${e}`),this.instances.has(e)){let l=this.instances.get(e);if(l.status==="running")return T.debug("\u{1F50D} SPAWN EARLY EXIT: Instance already running"),{success:!1,message:`Instance ${e} already running with PID ${l.pid}`,pid:l.pid}}let i=n.cwd||process.cwd(),a=n.clientId||Ru(),r=rp(this.logDir,`${e}.log`);if(T.debug(`\u{1F50D} SPAWN VALIDATION: cwd=${i}, clientId=${a}`),!Wd(i))return T.debug("\u{1F50D} SPAWN EARLY EXIT: Directory doesn't exist"),{success:!1,message:`Working directory does not exist: ${i}`};T.info(`Spawning CLI instance: ${e} in ${i}`);try{T.info("\u{1F50D} SPAWN TRY BLOCK START");let d=[rp(process.cwd(),"src/cli.tsx"),"--resume",e,"--client-id",a],m=Qo();if(!m.cueApiKey&&!m.accessToken)return T.error(`\u274C No authentication available - cannot spawn instance ${e}`),{success:!1,message:"No authentication credentials available. Please set CUE_API_KEY or login with access token."};let h={...process.env,...n.env,CLI_BACKGROUND_MODE:"true",CUE_LOG_DIR:this.logDir};m.cueApiKey?(h.CUE_API_KEY=m.cueApiKey,T.info(`\u{1F511} Using CUE API key for instance ${e}`)):m.accessToken&&(h.CUE_ACCESS_TOKEN=m.accessToken,T.info(`\u{1F510} Using access token for instance ${e}`)),T.info("\u{1F50D} SPAWN BEFORE spawn() call");let E=MCe(r,"a");T.info(`\u{1F4C4} Opened log file: ${r}`);let y=kCe("tsx",d,{cwd:i,env:h,stdio:["ignore",E,E],detached:!0});T.debug(`\u{1F50D} SPAWN AFTER spawn() call, PID: ${y.pid}`),T.debug(`\u{1F50D} SPAWN STDIO redirected to ${r}`);let I={sessionId:e,pid:y.pid,clientId:a,cwd:i,startTime:new Date,status:"starting",lastHeartbeat:new Date,process:y,logFile:r};if(this.instances.set(e,I),T.debug("\u{1F50D} SPAWN INSTANCE ADDED TO MAP"),T.debug("\u{1F50D} SPAWN BEFORE 1s WAIT"),await new Promise(x=>setTimeout(x,1e3)),T.debug("\u{1F50D} SPAWN AFTER 1s WAIT"),y.killed||y.exitCode!==null)return T.debug(`\u{1F50D} SPAWN CHILD FAILED: killed=${y.killed}, exitCode=${y.exitCode}`),I.status="error",this.instances.delete(e),{success:!1,message:`Failed to start instance ${e} - process exited`};I.status="running",T.debug("\u{1F50D} SPAWN BEFORE saveState()");let C=process.env.CLI_MANAGER_DAEMON==="true";return T.info(`\u{1F50D} SPAWN isDaemon check: CLI_MANAGER_DAEMON=${process.env.CLI_MANAGER_DAEMON}, isDaemon=${C}`),C?(T.info("\u{1F50D} SPAWN: Calling saveState() (daemon mode)"),this.saveState()):(T.info("\u{1F50D} SPAWN: Calling saveInstanceToState() (non-daemon mode)"),this.saveInstanceToState(I)),T.debug("\u{1F50D} SPAWN AFTER saveState()"),y.on("exit",x=>{T.info(`Instance ${e} exited with code ${x}`),I.status="stopped",this.instances.delete(e),this.saveState()}),T.debug("\u{1F50D} SPAWN SUCCESS RETURN"),{success:!0,message:`Instance ${e} started successfully`,pid:y.pid}}catch(l){return M6(`Failed to spawn instance ${e}:`,l),{success:!1,message:`Failed to spawn instance: ${l instanceof Error?l.message:String(l)}`}}}async killInstance(e){let n=this.instances.get(e);if(!n)return{success:!1,message:`Instance ${e} not found`};T.info(`Killing instance ${e} (PID: ${n.pid})`);try{return n.process&&!n.process.killed?(n.process.kill("SIGTERM"),await new Promise(i=>setTimeout(i,2e3)),n.process.killed||n.process.kill("SIGKILL")):process.kill(n.pid,"SIGTERM"),n.status="stopped",this.instances.delete(e),this.saveState(),{success:!0,message:`Instance ${e} terminated`}}catch(i){return M6(`Failed to kill instance ${e}:`,i),{success:!1,message:`Failed to kill instance: ${i instanceof Error?i.message:String(i)}`}}}async killAllInstances(){let e=[];for(let[n]of this.instances)(await this.killInstance(n)).success&&e.push(n);return{success:!0,message:`Terminated ${e.length} instances`,killed:e}}listInstances(){return Array.from(this.instances.values()).map(n=>({sessionId:n.sessionId,pid:n.pid,clientId:n.clientId,cwd:n.cwd,startTime:n.startTime,status:n.status,lastHeartbeat:n.lastHeartbeat,uptime:this.formatUptime(n.startTime)}))}async getInstanceLogs(e,n=50){let i=this.instances.get(e);if(!i||!i.logFile)return{success:!1,message:`Instance ${e} not found or no log file`};try{let{execSync:a}=await import("child_process");return{success:!0,logs:a(`tail -n ${n} "${i.logFile}"`,{encoding:"utf8"})}}catch(a){return{success:!1,message:`Failed to read logs: ${a instanceof Error?a.message:String(a)}`}}}async healthCheck(){return{managerHealth:"healthy",instances:this.listInstances().map(n=>({sessionId:n.sessionId,health:this.isProcessAlive(n.pid)?"healthy":"unhealthy",pid:n.pid,uptime:n.uptime}))}}isProcessAlive(e){try{return process.kill(e,0),!0}catch{return!1}}formatUptime(e){let i=new Date().getTime()-e.getTime(),a=Math.floor(i/1e3),r=Math.floor(a/60),l=Math.floor(r/60),d=Math.floor(l/24);return d>0?`${d}d ${l%24}h`:l>0?`${l}h ${r%60}m`:r>0?`${r}m ${a%60}s`:`${a}s`}saveInstanceToState(e){if(T.info(`\u{1F50D} SAVE INSTANCE START: ${e.sessionId}`),!Wd(this.stateFile)){T.info("\u{1F50D} SAVE INSTANCE: Creating new state file");let n={pid:0,startTime:new Date,instances:{}};z5(this.stateFile,JSON.stringify(n,null,2))}try{T.info("\u{1F50D} SAVE INSTANCE: Reading existing state");let n=wB(this.stateFile,"utf8"),i=JSON.parse(n);T.info(`\u{1F50D} SAVE INSTANCE: Current instances count = ${Object.keys(i.instances).length}`),i.instances[e.sessionId]={sessionId:e.sessionId,pid:e.pid,clientId:e.clientId,cwd:e.cwd,startTime:e.startTime,status:e.status,lastHeartbeat:e.lastHeartbeat,logFile:e.logFile},T.info(`\u{1F50D} SAVE INSTANCE: Writing state with ${Object.keys(i.instances).length} instances`),z5(this.stateFile,JSON.stringify(i,null,2)),T.info(`\u{1F50D} SAVE INSTANCE: Successfully saved ${e.sessionId}`)}catch(n){M6("\u{1F50D} SAVE INSTANCE: ERROR:",n)}}saveState(){if(!(process.env.CLI_MANAGER_DAEMON==="true")){T.debug("Skipping state save - not daemon process");return}let n=this.instances.size;T.info(`\u{1F50D} DAEMON SAVE STATE: PID ${this.managerPid}, instances = ${n}`);let i=Qo(),a={pid:this.managerPid,clientId:this.managerClientId,startTime:new Date,authStatus:{hasCueApiKey:!!i.cueApiKey,hasAccessToken:!!i.accessToken,hasAnthropicKey:!!i.anthropicApiKey},instances:Object.fromEntries(Array.from(this.instances.entries()).map(([r,l])=>[r,{sessionId:l.sessionId,pid:l.pid,clientId:l.clientId,cwd:l.cwd,startTime:l.startTime,status:l.status,lastHeartbeat:l.lastHeartbeat,logFile:l.logFile}]))};try{z5(this.stateFile,JSON.stringify(a,null,2)),T.info(`\u{1F50D} DAEMON SAVE STATE: Saved ${n} instances to state file`)}catch(r){M6("Failed to save manager state:",r)}}loadState(e=!1){if(Wd(this.stateFile))try{let n=wB(this.stateFile,"utf8"),i=JSON.parse(n);for(let[a,r]of Object.entries(i.instances))if(this.isProcessAlive(r.pid)){let l={...r,startTime:new Date(r.startTime),lastHeartbeat:r.lastHeartbeat?new Date(r.lastHeartbeat):void 0};this.instances.set(a,l)}e||T.info(`Loaded ${this.instances.size} existing instances from state`)}catch(n){K0("Failed to load manager state:",n)}}startHeartbeat(){setInterval(()=>{this.loadState(!0);for(let[e,n]of this.instances)this.isProcessAlive(n.pid)||(T.warn(`Instance ${e} appears to be dead, removing from manager`),n.status="stopped",this.instances.delete(e));this.saveState(),this.processRequests()},1e3)}processRequests(){try{let e=UCe(this.requestDir).filter(n=>n.endsWith(".json"));for(let n of e){let i=rp(this.requestDir,n),a=rp(this.responseDir,n);try{let r=wB(i,"utf8"),l=JSON.parse(r);T.debug(`Processing manager request: ${l.command}`,{id:l.id}),this.handleRequest(l).then(d=>{z5(a,JSON.stringify(d,null,2));try{QB(i)}catch(m){K0("Failed to clean up request file:",m)}}).catch(d=>{let m={id:l.id,success:!1,message:d instanceof Error?d.message:String(d),timestamp:new Date().toISOString()};z5(a,JSON.stringify(m,null,2));try{QB(i)}catch(h){K0("Failed to clean up request file:",h)}})}catch(r){M6("Failed to process request file:",r);try{QB(i)}catch(l){K0("Failed to clean up malformed request file:",l)}}}}catch(e){M6("Failed to process requests:",e)}}async handleRequest(e){let n={id:e.id,timestamp:new Date().toISOString()};try{switch(e.command){case"spawn":{let{sessionId:i,cwd:a,clientId:r,env:l}=e.args,d=await this.spawnInstance(i,{cwd:a,clientId:r,env:l});return{...n,success:d.success,message:d.message,data:{pid:d.pid}}}case"kill":{let{sessionId:i}=e.args,a=await this.killInstance(i);return{...n,success:a.success,message:a.message}}case"killall":{let i=await this.killAllInstances();return{...n,success:i.success,message:i.message,data:{killed:i.killed}}}case"list":{let i=this.listInstances();return{...n,success:!0,message:"Instance list retrieved",data:{instances:i}}}case"logs":{let{sessionId:i,lines:a=50}=e.args,r=await this.getInstanceLogs(i,a);return{...n,success:r.success,message:r.message||"Logs retrieved",data:{logs:r.logs}}}case"health":{let i=await this.healthCheck();return{...n,success:!0,message:"Health check completed",data:i}}default:return{...n,success:!1,message:`Unknown command: ${e.command}`}}}catch(i){return{...n,success:!1,message:i instanceof Error?i.message:String(i)}}}cleanup(){T.info("CLI Manager shutting down..."),this.saveState()}shutdown(){this.cleanup(),process.exit(0)}},pz=null});var Xce={};Kr(Xce,{handleManagerCommand:()=>PCe});async function PCe(t,e=[]){let n=dz();try{switch(t){case"help":zCe();break;case"start":await jCe(n);break;case"stop":await $Ce(n);break;case"status":await HCe(n);break;case"list":await Wce(n);break;case"spawn":await GCe(n,e);break;case"kill":await qCe(n,e);break;case"killall":await KCe(n);break;case"health":await VCe(n);break;case"logs":await JCe(n,e);break;default:console.error(`\u274C Unknown manager command: ${t}`),console.log("Valid commands: help, start, stop, status, list, spawn, kill, killall, health, logs"),process.exit(1)}}catch(i){T.error("Manager command failed:",i instanceof Error?{message:i.message,stack:i.stack}:{error:String(i)}),console.error(`\u274C Manager command failed: ${i instanceof Error?i.message:String(i)}`),process.exit(1)}}function zCe(){process.stderr.write(`
|
|
558
|
+
RESULT: ${E}`}else E=`RESULT: ${E}`;n(y=>[...y,{role:"user",content:`/claude ${l}`},{role:"assistant",content:E}])}catch(h){i(!1),n(E=>[...E,{role:"assistant",content:`\u274C Error: ${h instanceof Error?h.message:String(h)}`}])}}},mce=BCe});var xL={};Kr(xL,{commandList:()=>k5,commands:()=>EB,enabledCommands:()=>Ace,getCommand:()=>VP,hasCommand:()=>SCe});function SCe(t){return EB.some(e=>e.name===t||e.aliases?.includes(t))}function VP(t){return EB.find(e=>e.name===t||e.aliases?.includes(t))}var EB,Ace,k5,v6=Q(async()=>{"use strict";are();dre();hre();vre();await Wue();ece();ice();lce();cce();dce();fce();EB=[rce,oce,...nre,gre,Zue,Xue,sce,ace,mce,tce,nce,uce,pre,pce,Are];Ace=EB.filter(t=>t.isEnabled),k5=Ace.map(t=>({name:t.name,description:t.description}))});var Sce={};Kr(Sce,{getActualModelName:()=>M5,getCurrentModel:()=>Hu,getCurrentProvider:()=>Hs,getModelDisplayName:()=>IB,getProviderDisplayName:()=>xB,setCurrentModel:()=>az,setCurrentProvider:()=>iz});function Hu(){return xce}function az(t){xce=t}function IB(t){return{sonnet:"Sonnet 4 (claude-sonnet-4-20250514)",opus:"Opus 4 (claude-opus-4-20250514)",haiku:"Haiku 3.5 (claude-3-5-haiku-20241022)","gpt-5":"GPT-5 (gpt-5-2025-08-07)","gpt-5-mini":"GPT-5 Mini (gpt-5-mini-2025-08-07)","gpt-5-nano":"GPT-5 Nano (gpt-5-nano-2025-08-07)"}[t]||t}function Hs(){return Bce}function iz(t){Bce=t}function xB(t){return{anthropic:"Anthropic",openai:"OpenAI",cue:"Cue"}[t]||t}function M5(t){return{sonnet:"claude-sonnet-4-20250514",opus:"claude-opus-4-20250514",haiku:"claude-3-5-haiku-20241022","gpt-5":"gpt-5-2025-08-07","gpt-5-mini":"gpt-5-mini-2025-08-07","gpt-5-nano":"gpt-5-nano-2025-08-07"}[t]||t}var xce,Bce,q0=Q(()=>{"use strict";xce="sonnet",Bce="cue"});var lz={};Kr(lz,{default:()=>NCe});var NCe,uz=Q(()=>{NCe={name:"@plusonelabs/cue",version:"0.0.9",description:"Cue CLI",main:"./dist/cli.mjs",bin:{cue:"dist/cli.mjs"},type:"module",scripts:{build:"tsc",dev:"NODE_OPTIONS='--disable-warning=DEP0040' tsx src/cli.tsx",test:"NODE_OPTIONS='--disable-warning=DEP0040' vitest",typecheck:"tsc --noEmit",format:"prettier --write .",lint:"eslint ."},dependencies:{"@cue/core":"file:../core",axios:"^1.11.0",chalk:"^5.4.1","cli-highlight":"^2.1.11",dotenv:"^17.2.1",ink:"^6.0.1",inquirer:"^12.8.2",marked:"^16.1.1","qrcode-terminal":"^0.12.0",react:"^19.1.0"},devDependencies:{"@types/inquirer":"^9.0.8","@types/node":"^24.1.0","@types/qrcode-terminal":"^0.12.2","@types/react":"^19.1.8",prettier:"^3.2.5",tsx:"^4.20.3",typescript:"^5.1.6",vitest:"^3.2.4"}}});var Yce=re((mWe,OCe)=>{OCe.exports={name:"@plusonelabs/cue",version:"0.0.9",description:"Cue CLI",main:"./dist/cli.mjs",bin:{cue:"dist/cli.mjs"},type:"module",scripts:{build:"tsc",dev:"NODE_OPTIONS='--disable-warning=DEP0040' tsx src/cli.tsx",test:"NODE_OPTIONS='--disable-warning=DEP0040' vitest",typecheck:"tsc --noEmit",format:"prettier --write .",lint:"eslint ."},dependencies:{"@cue/core":"file:../core",axios:"^1.11.0",chalk:"^5.4.1","cli-highlight":"^2.1.11",dotenv:"^17.2.1",ink:"^6.0.1",inquirer:"^12.8.2",marked:"^16.1.1","qrcode-terminal":"^0.12.0",react:"^19.1.0"},devDependencies:{"@types/inquirer":"^9.0.8","@types/node":"^24.1.0","@types/qrcode-terminal":"^0.12.2","@types/react":"^19.1.8",prettier:"^3.2.5",tsx:"^4.20.3",typescript:"^5.1.6",vitest:"^3.2.4"}}});var Zce={};Kr(Zce,{CLIManagerService:()=>TB,getCLIManagerService:()=>dz});import{spawn as kCe}from"child_process";import{existsSync as Wd,writeFileSync as z5,readFileSync as wB,mkdirSync as _B,readdirSync as UCe,unlinkSync as QB,openSync as MCe}from"fs";import{join as rp}from"path";import{homedir as LCe}from"os";function M6(t,e){T.error(t,e instanceof Error?{message:e.message,stack:e.stack}:{error:String(e)})}function K0(t,e){T.warn(t,e instanceof Error?{message:e.message,stack:e.stack}:{error:String(e)})}function dz(){return pz||(pz=new TB),pz}var TB,pz,mz=Q(()=>{"use strict";Zn();TB=class{instances=new Map;stateFile;logDir;managerPid;managerClientId;requestDir;responseDir;constructor(){let e=rp(LCe(),".cue");Wd(e)||_B(e,{recursive:!0}),this.logDir=rp(e,"manager-logs"),Wd(this.logDir)||_B(this.logDir,{recursive:!0}),this.requestDir=rp(e,"manager-requests"),Wd(this.requestDir)||_B(this.requestDir,{recursive:!0}),this.responseDir=rp(e,"manager-responses"),Wd(this.responseDir)||_B(this.responseDir,{recursive:!0}),this.stateFile=rp(e,"manager-state.json"),this.managerPid=process.pid,this.loadState(),process.env.CLI_MANAGER_DAEMON==="true"&&(process.on("exit",()=>this.cleanup()),process.on("SIGINT",()=>this.shutdown()),process.on("SIGTERM",()=>this.shutdown()))}async startManager(){let e=this.getManagerStatus();if(e.isRunning)return{success:!1,message:`Manager already running with PID ${e.pid}`,pid:e.pid};T.info("Starting CLI Manager Service...");let{spawn:n}=await import("child_process"),i=rp(process.cwd(),"src/cli.tsx");n("tsx",[i,"--manager-daemon"],{detached:!0,stdio:"ignore",env:{...process.env,CLI_MANAGER_DAEMON:"true"}}).unref(),await new Promise(l=>setTimeout(l,1e3));let r=this.getManagerStatus();return r.isRunning?{success:!0,message:`CLI Manager daemon started with PID ${r.pid}`,pid:r.pid}:{success:!1,message:"Failed to start manager daemon"}}async startDaemon(){return T.info("Starting CLI Manager Daemon..."),this.managerClientId=`cli-manager-${Date.now()}-${Math.random().toString(36).substring(7)}`,this.saveState(),this.startHeartbeat(),T.info(`CLI Manager daemon running with PID ${this.managerPid}`),{success:!0,message:`CLI Manager daemon started with PID ${this.managerPid}`,pid:this.managerPid}}async stopManager(){T.info("Stopping CLI Manager Service...");let e=this.getManagerStatus();if(!e.isRunning||!e.pid)return{success:!1,message:"No manager daemon is currently running"};try{if(process.kill(e.pid,"SIGTERM"),await new Promise(n=>setTimeout(n,2e3)),this.isProcessAlive(e.pid)&&(process.kill(e.pid,"SIGKILL"),await new Promise(n=>setTimeout(n,1e3))),Wd(this.stateFile))try{await(await import("fs/promises")).unlink(this.stateFile)}catch(n){K0("Failed to remove state file:",n)}return{success:!0,message:`CLI Manager daemon (PID: ${e.pid}) stopped and all instances terminated`}}catch(n){return{success:!1,message:`Failed to stop manager daemon: ${n instanceof Error?n.message:String(n)}`}}}getManagerStatus(){if(!Wd(this.stateFile))return{isRunning:!1,instanceCount:0};try{let e=wB(this.stateFile,"utf8"),n=JSON.parse(e),i=this.isProcessAlive(n.pid);if(!i){T.warn(`Manager process ${n.pid} is dead, cleaning up state file`);try{QB(this.stateFile)}catch(a){K0("Failed to clean up stale state file:",a)}return{isRunning:!1,instanceCount:0}}return{isRunning:i,pid:n.pid,clientId:n.clientId,startTime:new Date(n.startTime),instanceCount:Object.keys(n.instances).length,authStatus:n.authStatus}}catch(e){return K0("Failed to read manager state:",e),{isRunning:!1,instanceCount:0}}}async spawnInstance(e,n={}){if(T.info(`\u{1F50D} SPAWN START: ${e}`),this.instances.has(e)){let l=this.instances.get(e);if(l.status==="running")return T.debug("\u{1F50D} SPAWN EARLY EXIT: Instance already running"),{success:!1,message:`Instance ${e} already running with PID ${l.pid}`,pid:l.pid}}let i=n.cwd||process.cwd(),a=n.clientId||Ru(),r=rp(this.logDir,`${e}.log`);if(T.debug(`\u{1F50D} SPAWN VALIDATION: cwd=${i}, clientId=${a}`),!Wd(i))return T.debug("\u{1F50D} SPAWN EARLY EXIT: Directory doesn't exist"),{success:!1,message:`Working directory does not exist: ${i}`};T.info(`Spawning CLI instance: ${e} in ${i}`);try{T.info("\u{1F50D} SPAWN TRY BLOCK START");let d=[rp(process.cwd(),"src/cli.tsx"),"--resume",e,"--client-id",a],m=Qo();if(!m.cueApiKey&&!m.accessToken)return T.error(`\u274C No authentication available - cannot spawn instance ${e}`),{success:!1,message:"No authentication credentials available. Please set CUE_API_KEY or login with access token."};let h={...process.env,...n.env,CLI_BACKGROUND_MODE:"true",CUE_LOG_DIR:this.logDir};m.cueApiKey?(h.CUE_API_KEY=m.cueApiKey,T.info(`\u{1F511} Using CUE API key for instance ${e}`)):m.accessToken&&(h.CUE_ACCESS_TOKEN=m.accessToken,T.info(`\u{1F510} Using access token for instance ${e}`)),T.info("\u{1F50D} SPAWN BEFORE spawn() call");let E=MCe(r,"a");T.info(`\u{1F4C4} Opened log file: ${r}`);let y=kCe("tsx",d,{cwd:i,env:h,stdio:["ignore",E,E],detached:!0});T.debug(`\u{1F50D} SPAWN AFTER spawn() call, PID: ${y.pid}`),T.debug(`\u{1F50D} SPAWN STDIO redirected to ${r}`);let I={sessionId:e,pid:y.pid,clientId:a,cwd:i,startTime:new Date,status:"starting",lastHeartbeat:new Date,process:y,logFile:r};if(this.instances.set(e,I),T.debug("\u{1F50D} SPAWN INSTANCE ADDED TO MAP"),T.debug("\u{1F50D} SPAWN BEFORE 1s WAIT"),await new Promise(x=>setTimeout(x,1e3)),T.debug("\u{1F50D} SPAWN AFTER 1s WAIT"),y.killed||y.exitCode!==null)return T.debug(`\u{1F50D} SPAWN CHILD FAILED: killed=${y.killed}, exitCode=${y.exitCode}`),I.status="error",this.instances.delete(e),{success:!1,message:`Failed to start instance ${e} - process exited`};I.status="running",T.debug("\u{1F50D} SPAWN BEFORE saveState()");let C=process.env.CLI_MANAGER_DAEMON==="true";return T.info(`\u{1F50D} SPAWN isDaemon check: CLI_MANAGER_DAEMON=${process.env.CLI_MANAGER_DAEMON}, isDaemon=${C}`),C?(T.info("\u{1F50D} SPAWN: Calling saveState() (daemon mode)"),this.saveState()):(T.info("\u{1F50D} SPAWN: Calling saveInstanceToState() (non-daemon mode)"),this.saveInstanceToState(I)),T.debug("\u{1F50D} SPAWN AFTER saveState()"),y.on("exit",x=>{T.info(`Instance ${e} exited with code ${x}`),I.status="stopped",this.instances.delete(e),this.saveState()}),T.debug("\u{1F50D} SPAWN SUCCESS RETURN"),{success:!0,message:`Instance ${e} started successfully`,pid:y.pid}}catch(l){return M6(`Failed to spawn instance ${e}:`,l),{success:!1,message:`Failed to spawn instance: ${l instanceof Error?l.message:String(l)}`}}}async killInstance(e){let n=this.instances.get(e);if(!n)return{success:!1,message:`Instance ${e} not found`};T.info(`Killing instance ${e} (PID: ${n.pid})`);try{return n.process&&!n.process.killed?(n.process.kill("SIGTERM"),await new Promise(i=>setTimeout(i,2e3)),n.process.killed||n.process.kill("SIGKILL")):process.kill(n.pid,"SIGTERM"),n.status="stopped",this.instances.delete(e),this.saveState(),{success:!0,message:`Instance ${e} terminated`}}catch(i){return M6(`Failed to kill instance ${e}:`,i),{success:!1,message:`Failed to kill instance: ${i instanceof Error?i.message:String(i)}`}}}async killAllInstances(){let e=[];for(let[n]of this.instances)(await this.killInstance(n)).success&&e.push(n);return{success:!0,message:`Terminated ${e.length} instances`,killed:e}}listInstances(){return Array.from(this.instances.values()).map(n=>({sessionId:n.sessionId,pid:n.pid,clientId:n.clientId,cwd:n.cwd,startTime:n.startTime,status:n.status,lastHeartbeat:n.lastHeartbeat,uptime:this.formatUptime(n.startTime)}))}async getInstanceLogs(e,n=50){let i=this.instances.get(e);if(!i||!i.logFile)return{success:!1,message:`Instance ${e} not found or no log file`};try{let{execSync:a}=await import("child_process");return{success:!0,logs:a(`tail -n ${n} "${i.logFile}"`,{encoding:"utf8"})}}catch(a){return{success:!1,message:`Failed to read logs: ${a instanceof Error?a.message:String(a)}`}}}async healthCheck(){return{managerHealth:"healthy",instances:this.listInstances().map(n=>({sessionId:n.sessionId,health:this.isProcessAlive(n.pid)?"healthy":"unhealthy",pid:n.pid,uptime:n.uptime}))}}isProcessAlive(e){try{return process.kill(e,0),!0}catch{return!1}}formatUptime(e){let i=new Date().getTime()-e.getTime(),a=Math.floor(i/1e3),r=Math.floor(a/60),l=Math.floor(r/60),d=Math.floor(l/24);return d>0?`${d}d ${l%24}h`:l>0?`${l}h ${r%60}m`:r>0?`${r}m ${a%60}s`:`${a}s`}saveInstanceToState(e){if(T.info(`\u{1F50D} SAVE INSTANCE START: ${e.sessionId}`),!Wd(this.stateFile)){T.info("\u{1F50D} SAVE INSTANCE: Creating new state file");let n={pid:0,startTime:new Date,instances:{}};z5(this.stateFile,JSON.stringify(n,null,2))}try{T.info("\u{1F50D} SAVE INSTANCE: Reading existing state");let n=wB(this.stateFile,"utf8"),i=JSON.parse(n);T.info(`\u{1F50D} SAVE INSTANCE: Current instances count = ${Object.keys(i.instances).length}`),i.instances[e.sessionId]={sessionId:e.sessionId,pid:e.pid,clientId:e.clientId,cwd:e.cwd,startTime:e.startTime,status:e.status,lastHeartbeat:e.lastHeartbeat,logFile:e.logFile},T.info(`\u{1F50D} SAVE INSTANCE: Writing state with ${Object.keys(i.instances).length} instances`),z5(this.stateFile,JSON.stringify(i,null,2)),T.info(`\u{1F50D} SAVE INSTANCE: Successfully saved ${e.sessionId}`)}catch(n){M6("\u{1F50D} SAVE INSTANCE: ERROR:",n)}}saveState(){if(!(process.env.CLI_MANAGER_DAEMON==="true")){T.debug("Skipping state save - not daemon process");return}let n=this.instances.size;T.info(`\u{1F50D} DAEMON SAVE STATE: PID ${this.managerPid}, instances = ${n}`);let i=Qo(),a={pid:this.managerPid,clientId:this.managerClientId,startTime:new Date,authStatus:{hasCueApiKey:!!i.cueApiKey,hasAccessToken:!!i.accessToken,hasAnthropicKey:!!i.anthropicApiKey},instances:Object.fromEntries(Array.from(this.instances.entries()).map(([r,l])=>[r,{sessionId:l.sessionId,pid:l.pid,clientId:l.clientId,cwd:l.cwd,startTime:l.startTime,status:l.status,lastHeartbeat:l.lastHeartbeat,logFile:l.logFile}]))};try{z5(this.stateFile,JSON.stringify(a,null,2)),T.info(`\u{1F50D} DAEMON SAVE STATE: Saved ${n} instances to state file`)}catch(r){M6("Failed to save manager state:",r)}}loadState(e=!1){if(Wd(this.stateFile))try{let n=wB(this.stateFile,"utf8"),i=JSON.parse(n);for(let[a,r]of Object.entries(i.instances))if(this.isProcessAlive(r.pid)){let l={...r,startTime:new Date(r.startTime),lastHeartbeat:r.lastHeartbeat?new Date(r.lastHeartbeat):void 0};this.instances.set(a,l)}e||T.info(`Loaded ${this.instances.size} existing instances from state`)}catch(n){K0("Failed to load manager state:",n)}}startHeartbeat(){setInterval(()=>{this.loadState(!0);for(let[e,n]of this.instances)this.isProcessAlive(n.pid)||(T.warn(`Instance ${e} appears to be dead, removing from manager`),n.status="stopped",this.instances.delete(e));this.saveState(),this.processRequests()},1e3)}processRequests(){try{let e=UCe(this.requestDir).filter(n=>n.endsWith(".json"));for(let n of e){let i=rp(this.requestDir,n),a=rp(this.responseDir,n);try{let r=wB(i,"utf8"),l=JSON.parse(r);T.debug(`Processing manager request: ${l.command}`,{id:l.id}),this.handleRequest(l).then(d=>{z5(a,JSON.stringify(d,null,2));try{QB(i)}catch(m){K0("Failed to clean up request file:",m)}}).catch(d=>{let m={id:l.id,success:!1,message:d instanceof Error?d.message:String(d),timestamp:new Date().toISOString()};z5(a,JSON.stringify(m,null,2));try{QB(i)}catch(h){K0("Failed to clean up request file:",h)}})}catch(r){M6("Failed to process request file:",r);try{QB(i)}catch(l){K0("Failed to clean up malformed request file:",l)}}}}catch(e){M6("Failed to process requests:",e)}}async handleRequest(e){let n={id:e.id,timestamp:new Date().toISOString()};try{switch(e.command){case"spawn":{let{sessionId:i,cwd:a,clientId:r,env:l}=e.args,d=await this.spawnInstance(i,{cwd:a,clientId:r,env:l});return{...n,success:d.success,message:d.message,data:{pid:d.pid}}}case"kill":{let{sessionId:i}=e.args,a=await this.killInstance(i);return{...n,success:a.success,message:a.message}}case"killall":{let i=await this.killAllInstances();return{...n,success:i.success,message:i.message,data:{killed:i.killed}}}case"list":{let i=this.listInstances();return{...n,success:!0,message:"Instance list retrieved",data:{instances:i}}}case"logs":{let{sessionId:i,lines:a=50}=e.args,r=await this.getInstanceLogs(i,a);return{...n,success:r.success,message:r.message||"Logs retrieved",data:{logs:r.logs}}}case"health":{let i=await this.healthCheck();return{...n,success:!0,message:"Health check completed",data:i}}default:return{...n,success:!1,message:`Unknown command: ${e.command}`}}}catch(i){return{...n,success:!1,message:i instanceof Error?i.message:String(i)}}}cleanup(){T.info("CLI Manager shutting down..."),this.saveState()}shutdown(){this.cleanup(),process.exit(0)}},pz=null});var Xce={};Kr(Xce,{handleManagerCommand:()=>PCe});async function PCe(t,e=[]){let n=dz();try{switch(t){case"help":zCe();break;case"start":await jCe(n);break;case"stop":await $Ce(n);break;case"status":await HCe(n);break;case"list":await Wce(n);break;case"spawn":await GCe(n,e);break;case"kill":await qCe(n,e);break;case"killall":await KCe(n);break;case"health":await VCe(n);break;case"logs":await JCe(n,e);break;default:console.error(`\u274C Unknown manager command: ${t}`),console.log("Valid commands: help, start, stop, status, list, spawn, kill, killall, health, logs"),process.exit(1)}}catch(i){T.error("Manager command failed:",i instanceof Error?{message:i.message,stack:i.stack}:{error:String(i)}),console.error(`\u274C Manager command failed: ${i instanceof Error?i.message:String(i)}`),process.exit(1)}}function zCe(){process.stderr.write(`
|
|
559
559
|
\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557
|
|
560
560
|
\u2551 CLI Manager - Help \u2551
|
|
561
561
|
\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D
|
package/package.json
CHANGED
|
@@ -1,40 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plusonelabs/cue",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.9",
|
|
4
4
|
"description": "Cue CLI",
|
|
5
5
|
"main": "./dist/cli.mjs",
|
|
6
6
|
"bin": {
|
|
7
7
|
"cue": "dist/cli.mjs"
|
|
8
8
|
},
|
|
9
9
|
"type": "module",
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"dev": "NODE_OPTIONS='--disable-warning=DEP0040' tsx src/cli.tsx",
|
|
13
|
-
"test": "NODE_OPTIONS='--disable-warning=DEP0040' vitest",
|
|
14
|
-
"typecheck": "tsc --noEmit",
|
|
15
|
-
"format": "prettier --write .",
|
|
16
|
-
"lint": "eslint ."
|
|
10
|
+
"engines": {
|
|
11
|
+
"node": ">=18.0.0"
|
|
17
12
|
},
|
|
18
|
-
"
|
|
19
|
-
|
|
20
|
-
"axios": "^1.11.0",
|
|
21
|
-
"chalk": "^5.4.1",
|
|
22
|
-
"cli-highlight": "^2.1.11",
|
|
23
|
-
"dotenv": "^17.2.1",
|
|
24
|
-
"ink": "^6.0.1",
|
|
25
|
-
"inquirer": "^12.8.2",
|
|
26
|
-
"marked": "^16.1.1",
|
|
27
|
-
"qrcode-terminal": "^0.12.0",
|
|
28
|
-
"react": "^19.1.0"
|
|
29
|
-
},
|
|
30
|
-
"devDependencies": {
|
|
31
|
-
"@types/inquirer": "^9.0.8",
|
|
32
|
-
"@types/node": "^24.1.0",
|
|
33
|
-
"@types/qrcode-terminal": "^0.12.2",
|
|
34
|
-
"@types/react": "^19.1.8",
|
|
35
|
-
"prettier": "^3.2.5",
|
|
36
|
-
"tsx": "^4.20.3",
|
|
37
|
-
"typescript": "^5.1.6",
|
|
38
|
-
"vitest": "^3.2.4"
|
|
39
|
-
}
|
|
13
|
+
"keywords": ["cli", "ai", "claude code", "terminal"],
|
|
14
|
+
"author": "PlusOneLabs"
|
|
40
15
|
}
|
package/cue-v0.0.8.tar.gz
DELETED
|
Binary file
|