@vibelet/cli 1.1.4 → 1.2.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/dist/index.cjs CHANGED
@@ -85,7 +85,7 @@ process.stdin.resume();
85
85
  `)}function yy(t){return Array.isArray(t)?t.map(e=>!e||typeof e!="object"?"":typeof e.text=="string"?e.text:typeof e.content=="string"?e.content:"").filter(Boolean).join(`
86
86
  `):""}function vy(t){return Array.isArray(t)&&t.length>0&&t.every(e=>e&&typeof e=="object"&&e.type==="tool_reference")}function Sy(t){if(typeof t=="string")return t;let e=yy(t);return e||(vy(t)?"":JSON.stringify(t))}function _y(t){return/requested permissions|haven't granted/i.test(t)}function bu(t){return t.replace(gy,"").replace(/\s+/g," ").trim()}function by(t){let e=t.toLowerCase();return e==="error"||e==="failed"||e==="unknown error"}function wy(t){return/\brate limit\b/i.test(t)||/\busage limit\b/i.test(t)||/\bquota\b/i.test(t)||/\btoo many requests\b/i.test(t)||/\bcredit balance\b/i.test(t)||/\bcredits? remaining\b/i.test(t)||/\bmax(?:imum)? usage\b/i.test(t)}function Iy(t){return t.toLowerCase().startsWith("claude ")?t:`Claude usage limit reached. ${t}`}function wu(t){let e=bu(t.resultText??""),n=(t.stderrLines??[]).map(bu).filter(Boolean).slice(-3),s=[e,...n].find(i=>!!i&&wy(i));if(s)return Iy(s);let r=[e,...n].find(i=>!!i&&!by(i));return r?t.exitCode!=null&&r!==e?`Claude exited with code ${t.exitCode}: ${r}`:r:t.exitCode!=null?`Claude exited with code ${t.exitCode}`:"Claude returned an error result."}function Ms(t){return t.startsWith(Au)}var In=class{proc=null;handler=null;sessionId="";buffer="";cwd="";approvalMode;sawFinalResult=!1;interrupted=!1;exitHandler=null;lastStderr=[];pendingPermissionDescriptions=new Map;emittedToolCallIds=new Set;toolCallContext=new Map;replayPhase=!1;hookPort=null;hookSecret=null;hookFiles=null;buildClaudeEnv(){let e=S.buildSanitizedEnv();for(let n of Object.keys(e))n.startsWith("CMUX_")&&delete e[n];return e}async start(e,n,s){return this.cwd=e,this.approvalMode=s,n&&(this.sessionId=n),this.sessionId||(this.sessionId=`pending_${Date.now()}`),ee.info({sessionId:this.sessionId,cwd:e},"session initialized"),w.emit("driver.spawn",{agent:"claude",sessionId:this.sessionId,cwd:e}),this.sessionId}configureHookBridge(e,n){this.hookPort=e,this.hookSecret=n}sendPrompt(e,n){let s=["-p",e,"--output-format","stream-json","--verbose","--include-partial-messages"];n&&s.push("--model",n),this.sessionId&&!this.sessionId.startsWith("pending_")&&s.push("--resume",this.sessionId),xs(this.hookFiles),this.hookFiles=null,this.approvalMode!=="plan"&&this.approvalMode!=="acceptEdits"&&this.approvalMode!=="autoApprove"&&this.hookPort&&this.hookSecret&&(this.hookFiles=hu(this.hookPort,this.hookSecret),s.push("--settings",this.hookFiles.settingsPath)),this.approvalMode==="plan"&&s.push("--permission-mode","plan"),this.approvalMode==="acceptEdits"&&s.push("--permission-mode","acceptEdits"),this.approvalMode==="autoApprove"&&s.push("--dangerously-skip-permissions");let r=this.sessionId.startsWith("pending_")?"(new)":`(resume ${this.sessionId.slice(0,8)})`;ee.info({sessionId:this.sessionId,label:r,promptPreview:e.slice(0,50)},"running claude"),Bi(`New message: ${e.slice(0,60)}`),this.sawFinalResult=!1,this.interrupted=!1,this.lastStderr=[],this.pendingPermissionDescriptions.clear(),this.emittedToolCallIds.clear(),this.toolCallContext.clear(),this.replayPhase=!0;let i=S.claudePath,o,a=s;if(S.isTransientPath(i)||i==="claude"){let c=S.execViaLoginShell("claude",s);o=c.command,a=c.args}else o=i;this.proc=(0,Iu.spawn)(o,a,{cwd:this.cwd||void 0,stdio:["ignore","pipe","pipe"],env:this.buildClaudeEnv(),...process.platform==="win32"?{shell:!0,windowsHide:!0}:{}});let u=this.proc;u.on("error",c=>{if(this.proc!==u)return;let d=c.message;c.code==="ENOENT"&&this.cwd&&!(0,Ps.existsSync)(this.cwd)&&(d=`Working directory does not exist: ${this.cwd}`),ee.error({sessionId:this.sessionId,error:d,cwd:this.cwd},"spawn error"),w.emit("driver.error",{agent:"claude",sessionId:this.sessionId,error:d}),this.handler?.({type:"error",sessionId:this.sessionId,message:d})}),this.buffer="",u.stdout.on("data",c=>{if(this.proc!==u)return;this.buffer+=c.toString();let d=this.buffer.split(`
87
87
  `);this.buffer=d.pop();for(let f of d)if(f.trim())try{this.handleRaw(JSON.parse(f))}catch{ee.warn({sessionId:this.sessionId,linePreview:f.slice(0,100)},"failed to parse stdout line")}}),u.stderr.on("data",c=>{if(this.proc!==u)return;let d=c.toString().trim();d&&(ee.debug({sessionId:this.sessionId,stderr:d},"stderr"),this.lastStderr.push(d),this.lastStderr.length>10&&this.lastStderr.shift())}),u.on("exit",(c,d)=>{if(this.proc!==u){ee.debug({sessionId:this.sessionId,exitCode:c,signal:d},"stale proc exit ignored, current proc was replaced");return}ee.info({sessionId:this.sessionId,exitCode:c,signal:d},"process exited");let f=this.interrupted;this.proc=null,xs(this.hookFiles),this.hookFiles=null,this.interrupted=!1,this.toolCallContext.clear(),f&&!this.sawFinalResult?this.handler?.({type:"session.interrupted",sessionId:this.sessionId}):c&&c!==0&&!this.sawFinalResult&&(ee.error({sessionId:this.sessionId,exitCode:c,lastStderr:this.lastStderr.slice(-3)},"abnormal exit"),this.handler?.({type:"error",sessionId:this.sessionId,message:wu({stderrLines:this.lastStderr,exitCode:c})})),this.exitHandler?.(c)})}respondApproval(e,n){if(ee.info({sessionId:this.sessionId,requestId:e,approved:n},"approval response"),!this.proc?.stdin?.writable)return ee.error({sessionId:this.sessionId},"cannot send approval: stdin not writable"),!1;let s=JSON.stringify({type:"control_response",request_id:e,permission_granted:n});return this.proc.stdin.write(s+`
88
- `),!0}getRespondingLivenessHint(){return!this.proc||this.proc.exitCode!==null||this.proc.signalCode!==null||this.proc.killed?"dead":"alive"}setApprovalMode(e){this.approvalMode=e,ee.info({sessionId:this.sessionId,approvalMode:e},"approval mode updated")}interrupt(){this.proc&&!this.proc.killed&&(this.interrupted=!0,this.proc.kill("SIGTERM"),ee.info({sessionId:this.sessionId},"interrupted"))}stop(){if(!this.proc)return;this.proc.kill("SIGTERM");let e=this.proc;setTimeout(()=>{e.killed||e.kill("SIGKILL")},5e3).unref(),this.proc=null,xs(this.hookFiles),this.hookFiles=null,this.toolCallContext.clear()}onMessage(e){this.handler=e}onExit(e){this.exitHandler=e}handleRaw(e){let n=e.type;if(n==="system"&&e.subtype==="init"){let s=e.session_id??"";s&&s!==this.sessionId&&(ee.info({oldSessionId:this.sessionId,newSessionId:s},"session ID resolved"),w.emit("driver.init",{agent:"claude",sessionId:s}),this.sessionId=s);return}if(this.handler)switch(n){case"assistant":{if(this.replayPhase)break;let s=e.message?.content;if(!Array.isArray(s))break;for(let r of s)if(r.type==="tool_use"&&!this.emittedToolCallIds.has(r.id)){this.emittedToolCallIds.add(r.id);let i=r.input??{},o=Rs(r.name,i,this.cwd);this.toolCallContext.set(r.id,{toolName:r.name,...o?{generatedFilePath:o,fileExistedAtStart:(0,Ps.existsSync)(o)}:{}}),this.handler({type:"tool.call",sessionId:this.sessionId,toolName:r.name,input:i,toolCallId:r.id})}break}case"user":{if(this.replayPhase)break;let s=e.message?.content;if(!Array.isArray(s))break;for(let r of s)if(r.type==="tool_result"){let i=typeof r.tool_use_id=="string"?r.tool_use_id:"",o=i?this.toolCallContext.get(i):void 0,a=Sy(r.content);if(!r.is_error&&o?.generatedFilePath&&o.fileExistedAtStart===!1&&(0,Ps.existsSync)(o.generatedFilePath)){let l=Ae([o.generatedFilePath]);l&&this.handler({type:"tool.result",sessionId:this.sessionId,toolCallId:i,output:l})}else if(!r.is_error&&o?.generatedFilePath&&o.fileExistedAtStart==null&&Es(e.toolUseResult,a)){let l=Ae([o.generatedFilePath]);l&&this.handler({type:"tool.result",sessionId:this.sessionId,toolCallId:i,output:l})}if(!a){i&&this.toolCallContext.delete(i);continue}if(r.is_error===!0&&i&&_y(a)){this.pendingPermissionDescriptions.set(i,a);continue}this.handler({type:"tool.result",sessionId:this.sessionId,toolCallId:i,output:a}),i&&this.toolCallContext.delete(i)}break}case"control_request":{this.replayPhase=!1;let s=e.request;s?.subtype==="can_use_tool"&&(w.emit("approval.request",{agent:"claude",sessionId:this.sessionId,toolName:s.tool_name}),this.handler({type:"approval.request",sessionId:this.sessionId,requestId:e.request_id,toolName:s.tool_name??"unknown",input:s.input??{},description:s.description??s.title??""}));break}case"stream_event":{this.replayPhase=!1;let s=e.event;s?.type==="content_block_delta"&&s?.delta?.type==="text_delta"&&s?.delta?.text&&this.handler({type:"text.delta",sessionId:this.sessionId,content:s.delta.text});break}case"result":{this.replayPhase=!1,this.sawFinalResult=!0;let s=typeof e.result=="string"?e.result:"";if(e.is_error){Bi("Claude failed."),this.handler({type:"error",sessionId:this.sessionId,message:wu({resultText:s,stderrLines:this.lastStderr})});break}let r=Array.isArray(e.permission_denials)?e.permission_denials:[];if(r.length>0){let a=r[0]??{},l=typeof a.tool_use_id=="string"?a.tool_use_id:`missing_${Date.now()}`,u=typeof a.tool_name=="string"?a.tool_name:"unknown",c=a.tool_input&&typeof a.tool_input=="object"?a.tool_input:{},d=this.pendingPermissionDescriptions.get(l)??`Claude requested permissions to use ${u}.`;w.emit("approval.request",{agent:"claude",sessionId:this.sessionId,toolName:u}),this.handler({type:"approval.request",sessionId:this.sessionId,requestId:`${Au}${l}`,toolName:u,input:c,description:d})}this.pendingPermissionDescriptions.clear();let i=e.total_cost_usd,o=e.usage?{inputTokens:e.usage.input_tokens,outputTokens:e.usage.output_tokens,...Number.isFinite(e.usage.cache_creation_input_tokens)?{cacheCreationInputTokens:e.usage.cache_creation_input_tokens}:{},...Number.isFinite(e.usage.cache_read_input_tokens)?{cacheReadInputTokens:e.usage.cache_read_input_tokens}:{}}:void 0;Bi("Claude finished. Run `claude --continue` to continue on desktop."),w.emit("session.done",{agent:"claude",sessionId:this.sessionId,cost:i,usage:o}),this.handler({type:"session.done",sessionId:this.sessionId,cost:i,usage:o});break}}}};var xu=require("child_process"),Ru=require("fs");var Fi=class{counters=new Map;timers=new Map;gauges=new Map;startTime=Date.now();logInterval=null;increment(e,n={}){this.counters.has(e)||this.counters.set(e,[]);let s=this.counters.get(e),r=JSON.stringify(n),i=s.find(o=>JSON.stringify(o.labels)===r);i?i.value++:s.push({value:1,labels:n})}gauge(e,n){this.gauges.set(e,n)}startTimer(e){let n=performance.now();return()=>{let s=Math.round(performance.now()-n),r=this.timers.get(e)??{count:0,totalMs:0,minMs:1/0,maxMs:0,lastMs:0};return r.count++,r.totalMs+=s,r.minMs=Math.min(r.minMs,s),r.maxMs=Math.max(r.maxMs,s),r.lastMs=s,this.timers.set(e,r),s}}snapshot(){let e={};for(let[r,i]of this.counters)e[r]=i.map(o=>({...o}));let n={};for(let[r,i]of this.timers)n[r]={...i,minMs:i.minMs===1/0?0:i.minMs};let s={};for(let[r,i]of this.gauges)s[r]=i;return{uptimeMs:Date.now()-this.startTime,counters:e,timers:n,gauges:s}}startPeriodicLog(e=6e4){this.logInterval||(this.logInterval=setInterval(()=>{let n=this.snapshot();M.info({metrics:n},"periodic metrics snapshot")},e),this.logInterval.unref())}stopPeriodicLog(){this.logInterval&&(clearInterval(this.logInterval),this.logInterval=null)}},_=new Fi;var Tu=require("node:fs"),Hi=require("node:path"),Ay="@vibelet/cli";function Ty(t){try{let e=JSON.parse((0,Tu.readFileSync)(t,"utf8"));if(e.name===Ay&&typeof e.version=="string"&&e.version.length>0)return e.version}catch{}return null}function Cy(){return"1.1.4"}var Pt=Cy();var P=M.child({module:"codex"});function ky(t){switch(t.kind){case"request-user-input-approval":return{provider:"codex",kind:t.kind,rpcId:t.rpcId,questionId:t.questionId,approveLabel:t.approveLabel,denyLabel:t.denyLabel};default:return{provider:"codex",kind:t.kind,rpcId:t.rpcId}}}function xy(t){let e=t.approvalContext;if(!e||e.provider!=="codex")return null;switch(e.kind){case"command-execution":return{kind:e.kind,responseKind:"v2",rpcId:e.rpcId,toolName:t.toolName,input:t.input};case"file-change":return{kind:e.kind,responseKind:"v2",rpcId:e.rpcId,toolName:t.toolName,input:t.input};case"request-user-input-approval":return!e.questionId||!e.approveLabel||!e.denyLabel?null:{kind:e.kind,rpcId:e.rpcId,questionId:e.questionId,approveLabel:e.approveLabel,denyLabel:e.denyLabel,toolName:t.toolName,input:t.input};case"exec-command-legacy":return{kind:e.kind,rpcId:e.rpcId,toolName:t.toolName,input:t.input};case"apply-patch-legacy":return{kind:e.kind,rpcId:e.rpcId,toolName:t.toolName,input:t.input};default:return null}}function $(t){return!t||typeof t!="object"||Array.isArray(t)?null:t}function L(t){return typeof t=="string"&&t.trim().length>0?t.trim():null}function Ui(t){let e=Number(t);return!Number.isFinite(e)||e<=0?null:Math.trunc(e)}var Ry=new Set(["aborted","interrupted","cancelled","canceled"]);function Ey(t){let e=L(t);return e?e.toLowerCase():null}function Py(t){let e=L(t);return e?e.replace(/[^a-z0-9]/gi,"").toLowerCase():null}function Wi(t){return t?L(t.itemId)??L(t.id)??L(t.callId)??L(t.call_id):null}function qi(t,e){let n={};for(let[s,r]of Object.entries(t))e.includes(s)||(n[s]=r);return n}function Eu(t){return/\bapprove\b|\ballow\b|\baccept\b|\byes\b|\bcontinue\b|\bproceed\b|\brun\b|\bapply\b/i.test(t)}function Pu(t){return/\bdeny\b|\breject\b|\bdecline\b|\bno\b|\bcancel\b|\babort\b|\bstop\b/i.test(t)}function My(t){if(!Array.isArray(t))return null;for(let e of t){let n=$(e);if(!n)continue;let s=L(n.id),r=Array.isArray(n.options)?n.options.map(l=>$(l)).filter(l=>!!l):[];if(!s||r.length===0)continue;let i=r.map(l=>L(l.label)).filter(l=>!!l);if(i.length<2)continue;let o=i.find(l=>Eu(l))??i[0],a=i.find(l=>Pu(l))??i[i.length-1];if(!(!o||!a||o===a))return{questionId:s,approveLabel:o,denyLabel:a}}return null}function Ly(t){if(!Array.isArray(t)||t.length===0)return!1;let e=t.map(r=>$(r)).filter(r=>!!r).flatMap(r=>(Array.isArray(r.options)?r.options:[]).map(o=>$(o)).filter(o=>!!o).map(o=>L(o.label)).filter(o=>!!o)),n=e.some(r=>Eu(r)),s=e.some(r=>Pu(r));return n&&s}function Cu(t){let e=Py(t.type??t.itemType);if(e==="commandexecution")return{toolName:"Bash",input:qi(t,["id","itemId","type","itemType","stdout","stderr","exitCode","exit_code","status","success","error"])};if(e==="filechange")return{toolName:"Patch",input:qi(t,["id","itemId","type","itemType","stdout","stderr","exitCode","exit_code","status","success","error"])};if(e==="mcptoolcall"){let n=L(t.server),s=L(t.tool)??L(t.name);return s?{toolName:n?`mcp__${n}__${s}`:s,input:$(t.arguments)??$(t.input)??{}}:null}return null}function Ny(t,e){let n=L(t.path);if(!n||!(Array.isArray(t.changes)?t.changes:[]).some(o=>$(o)?.kind==="create"))return null;let i=nt(n,e);return Et(i)?i:null}function Oy(t){if(!Array.isArray(t))return"";for(let e of t){let n=$(e);if(!n)continue;let s=L(n.question)??L(n.header);if(s)return s}return""}function Dy(t){let e=$(t);if(!e)return;let n=Ui(e.input_tokens??e.inputTokens)??0,s=Ui(e.output_tokens??e.outputTokens)??0,r=Ui(e.modelContextWindow??e.model_context_window??e.contextWindowTokens);if(!(n<=0&&s<=0&&!r))return{inputTokens:n,outputTokens:s,...r?{contextWindowTokens:r}:{}}}function ku(t,e){return t==="autoApprove"?{approvalPolicy:"never",sandbox:"danger-full-access",sandboxPolicy:{type:"dangerFullAccess"}}:t==="plan"?{approvalPolicy:"on-request",sandbox:"workspace-write",sandboxPolicy:{type:"workspaceWrite",writableRoots:[],readOnlyAccess:{type:"fullAccess"},networkAccess:!0,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1}}:{approvalPolicy:"on-request",sandbox:"workspace-write",sandboxPolicy:{type:"workspaceWrite",writableRoots:[e],readOnlyAccess:{type:"fullAccess"},networkAccess:!0,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1}}}var An=class{proc=null;handler=null;exitHandler=null;buffer="";rpcId=0;pending=new Map;threadId="";lastStderr=[];approvalRequests=new Map;toolContextByCallId=new Map;turnStartInFlight=!1;interruptRequestedDuringTurnStart=!1;latestTurnUsage;approvalMode;cwd="";model;async start(e,n,s){this.approvalMode=s,this.cwd=e,this.approvalRequests.clear(),this.toolContextByCallId.clear(),this.turnStartInFlight=!1,this.interruptRequestedDuringTurnStart=!1,this.latestTurnUsage=void 0;let r=S.codexPath,i,o=this.buildSpawnArgs();if(S.isTransientPath(r)||r==="codex"){let c=S.execViaLoginShell("codex",o);i=c.command,o=c.args,P.info({spawnCmd:i,argsPreview:o.slice(0,2)},"spawning via login shell")}else i=r,P.info({spawnCmd:i,args:o},"spawning");w.emit("driver.spawn",{agent:"codex",cwd:e,resumeSessionId:n}),this.lastStderr=[],this.proc=(0,xu.spawn)(i,o,{cwd:e||void 0,stdio:["pipe","pipe","pipe"],env:S.buildSanitizedEnv(),...process.platform==="win32"?{shell:!0,windowsHide:!0}:{}}),this.proc.on("error",c=>{let d=c.message;c.code==="ENOENT"&&e&&!(0,Ru.existsSync)(e)&&(d=`Working directory does not exist: ${e}`),P.error({error:d,cwd:e},"spawn error"),w.emit("driver.error",{agent:"codex",error:d})}),this.proc.stdout.on("data",c=>{this.buffer+=c.toString();let d=this.buffer.split(`
88
+ `),!0}getRespondingLivenessHint(){return!this.proc||this.proc.exitCode!==null||this.proc.signalCode!==null||this.proc.killed?"dead":"alive"}setApprovalMode(e){this.approvalMode=e,ee.info({sessionId:this.sessionId,approvalMode:e},"approval mode updated")}interrupt(){this.proc&&!this.proc.killed&&(this.interrupted=!0,this.proc.kill("SIGTERM"),ee.info({sessionId:this.sessionId},"interrupted"))}stop(){if(!this.proc)return;this.proc.kill("SIGTERM");let e=this.proc;setTimeout(()=>{e.killed||e.kill("SIGKILL")},5e3).unref(),this.proc=null,xs(this.hookFiles),this.hookFiles=null,this.toolCallContext.clear()}onMessage(e){this.handler=e}onExit(e){this.exitHandler=e}handleRaw(e){let n=e.type;if(n==="system"&&e.subtype==="init"){let s=e.session_id??"";s&&s!==this.sessionId&&(ee.info({oldSessionId:this.sessionId,newSessionId:s},"session ID resolved"),w.emit("driver.init",{agent:"claude",sessionId:s}),this.sessionId=s);return}if(this.handler)switch(n){case"assistant":{if(this.replayPhase)break;let s=e.message?.content;if(!Array.isArray(s))break;for(let r of s)if(r.type==="tool_use"&&!this.emittedToolCallIds.has(r.id)){this.emittedToolCallIds.add(r.id);let i=r.input??{},o=Rs(r.name,i,this.cwd);this.toolCallContext.set(r.id,{toolName:r.name,...o?{generatedFilePath:o,fileExistedAtStart:(0,Ps.existsSync)(o)}:{}}),this.handler({type:"tool.call",sessionId:this.sessionId,toolName:r.name,input:i,toolCallId:r.id})}break}case"user":{if(this.replayPhase)break;let s=e.message?.content;if(!Array.isArray(s))break;for(let r of s)if(r.type==="tool_result"){let i=typeof r.tool_use_id=="string"?r.tool_use_id:"",o=i?this.toolCallContext.get(i):void 0,a=Sy(r.content);if(!r.is_error&&o?.generatedFilePath&&o.fileExistedAtStart===!1&&(0,Ps.existsSync)(o.generatedFilePath)){let l=Ae([o.generatedFilePath]);l&&this.handler({type:"tool.result",sessionId:this.sessionId,toolCallId:i,output:l})}else if(!r.is_error&&o?.generatedFilePath&&o.fileExistedAtStart==null&&Es(e.toolUseResult,a)){let l=Ae([o.generatedFilePath]);l&&this.handler({type:"tool.result",sessionId:this.sessionId,toolCallId:i,output:l})}if(!a){i&&this.toolCallContext.delete(i);continue}if(r.is_error===!0&&i&&_y(a)){this.pendingPermissionDescriptions.set(i,a);continue}this.handler({type:"tool.result",sessionId:this.sessionId,toolCallId:i,output:a}),i&&this.toolCallContext.delete(i)}break}case"control_request":{this.replayPhase=!1;let s=e.request;s?.subtype==="can_use_tool"&&(w.emit("approval.request",{agent:"claude",sessionId:this.sessionId,toolName:s.tool_name}),this.handler({type:"approval.request",sessionId:this.sessionId,requestId:e.request_id,toolName:s.tool_name??"unknown",input:s.input??{},description:s.description??s.title??""}));break}case"stream_event":{this.replayPhase=!1;let s=e.event;s?.type==="content_block_delta"&&s?.delta?.type==="text_delta"&&s?.delta?.text&&this.handler({type:"text.delta",sessionId:this.sessionId,content:s.delta.text});break}case"result":{this.replayPhase=!1,this.sawFinalResult=!0;let s=typeof e.result=="string"?e.result:"";if(e.is_error){Bi("Claude failed."),this.handler({type:"error",sessionId:this.sessionId,message:wu({resultText:s,stderrLines:this.lastStderr})});break}let r=Array.isArray(e.permission_denials)?e.permission_denials:[];if(r.length>0){let a=r[0]??{},l=typeof a.tool_use_id=="string"?a.tool_use_id:`missing_${Date.now()}`,u=typeof a.tool_name=="string"?a.tool_name:"unknown",c=a.tool_input&&typeof a.tool_input=="object"?a.tool_input:{},d=this.pendingPermissionDescriptions.get(l)??`Claude requested permissions to use ${u}.`;w.emit("approval.request",{agent:"claude",sessionId:this.sessionId,toolName:u}),this.handler({type:"approval.request",sessionId:this.sessionId,requestId:`${Au}${l}`,toolName:u,input:c,description:d})}this.pendingPermissionDescriptions.clear();let i=e.total_cost_usd,o=e.usage?{inputTokens:e.usage.input_tokens,outputTokens:e.usage.output_tokens,...Number.isFinite(e.usage.cache_creation_input_tokens)?{cacheCreationInputTokens:e.usage.cache_creation_input_tokens}:{},...Number.isFinite(e.usage.cache_read_input_tokens)?{cacheReadInputTokens:e.usage.cache_read_input_tokens}:{}}:void 0;Bi("Claude finished. Run `claude --continue` to continue on desktop."),w.emit("session.done",{agent:"claude",sessionId:this.sessionId,cost:i,usage:o}),this.handler({type:"session.done",sessionId:this.sessionId,cost:i,usage:o});break}}}};var xu=require("child_process"),Ru=require("fs");var Fi=class{counters=new Map;timers=new Map;gauges=new Map;startTime=Date.now();logInterval=null;increment(e,n={}){this.counters.has(e)||this.counters.set(e,[]);let s=this.counters.get(e),r=JSON.stringify(n),i=s.find(o=>JSON.stringify(o.labels)===r);i?i.value++:s.push({value:1,labels:n})}gauge(e,n){this.gauges.set(e,n)}startTimer(e){let n=performance.now();return()=>{let s=Math.round(performance.now()-n),r=this.timers.get(e)??{count:0,totalMs:0,minMs:1/0,maxMs:0,lastMs:0};return r.count++,r.totalMs+=s,r.minMs=Math.min(r.minMs,s),r.maxMs=Math.max(r.maxMs,s),r.lastMs=s,this.timers.set(e,r),s}}snapshot(){let e={};for(let[r,i]of this.counters)e[r]=i.map(o=>({...o}));let n={};for(let[r,i]of this.timers)n[r]={...i,minMs:i.minMs===1/0?0:i.minMs};let s={};for(let[r,i]of this.gauges)s[r]=i;return{uptimeMs:Date.now()-this.startTime,counters:e,timers:n,gauges:s}}startPeriodicLog(e=6e4){this.logInterval||(this.logInterval=setInterval(()=>{let n=this.snapshot();M.info({metrics:n},"periodic metrics snapshot")},e),this.logInterval.unref())}stopPeriodicLog(){this.logInterval&&(clearInterval(this.logInterval),this.logInterval=null)}},_=new Fi;var Tu=require("node:fs"),Hi=require("node:path"),Ay="@vibelet/cli";function Ty(t){try{let e=JSON.parse((0,Tu.readFileSync)(t,"utf8"));if(e.name===Ay&&typeof e.version=="string"&&e.version.length>0)return e.version}catch{}return null}function Cy(){return"1.2.0"}var Pt=Cy();var P=M.child({module:"codex"});function ky(t){switch(t.kind){case"request-user-input-approval":return{provider:"codex",kind:t.kind,rpcId:t.rpcId,questionId:t.questionId,approveLabel:t.approveLabel,denyLabel:t.denyLabel};default:return{provider:"codex",kind:t.kind,rpcId:t.rpcId}}}function xy(t){let e=t.approvalContext;if(!e||e.provider!=="codex")return null;switch(e.kind){case"command-execution":return{kind:e.kind,responseKind:"v2",rpcId:e.rpcId,toolName:t.toolName,input:t.input};case"file-change":return{kind:e.kind,responseKind:"v2",rpcId:e.rpcId,toolName:t.toolName,input:t.input};case"request-user-input-approval":return!e.questionId||!e.approveLabel||!e.denyLabel?null:{kind:e.kind,rpcId:e.rpcId,questionId:e.questionId,approveLabel:e.approveLabel,denyLabel:e.denyLabel,toolName:t.toolName,input:t.input};case"exec-command-legacy":return{kind:e.kind,rpcId:e.rpcId,toolName:t.toolName,input:t.input};case"apply-patch-legacy":return{kind:e.kind,rpcId:e.rpcId,toolName:t.toolName,input:t.input};default:return null}}function $(t){return!t||typeof t!="object"||Array.isArray(t)?null:t}function L(t){return typeof t=="string"&&t.trim().length>0?t.trim():null}function Ui(t){let e=Number(t);return!Number.isFinite(e)||e<=0?null:Math.trunc(e)}var Ry=new Set(["aborted","interrupted","cancelled","canceled"]);function Ey(t){let e=L(t);return e?e.toLowerCase():null}function Py(t){let e=L(t);return e?e.replace(/[^a-z0-9]/gi,"").toLowerCase():null}function Wi(t){return t?L(t.itemId)??L(t.id)??L(t.callId)??L(t.call_id):null}function qi(t,e){let n={};for(let[s,r]of Object.entries(t))e.includes(s)||(n[s]=r);return n}function Eu(t){return/\bapprove\b|\ballow\b|\baccept\b|\byes\b|\bcontinue\b|\bproceed\b|\brun\b|\bapply\b/i.test(t)}function Pu(t){return/\bdeny\b|\breject\b|\bdecline\b|\bno\b|\bcancel\b|\babort\b|\bstop\b/i.test(t)}function My(t){if(!Array.isArray(t))return null;for(let e of t){let n=$(e);if(!n)continue;let s=L(n.id),r=Array.isArray(n.options)?n.options.map(l=>$(l)).filter(l=>!!l):[];if(!s||r.length===0)continue;let i=r.map(l=>L(l.label)).filter(l=>!!l);if(i.length<2)continue;let o=i.find(l=>Eu(l))??i[0],a=i.find(l=>Pu(l))??i[i.length-1];if(!(!o||!a||o===a))return{questionId:s,approveLabel:o,denyLabel:a}}return null}function Ly(t){if(!Array.isArray(t)||t.length===0)return!1;let e=t.map(r=>$(r)).filter(r=>!!r).flatMap(r=>(Array.isArray(r.options)?r.options:[]).map(o=>$(o)).filter(o=>!!o).map(o=>L(o.label)).filter(o=>!!o)),n=e.some(r=>Eu(r)),s=e.some(r=>Pu(r));return n&&s}function Cu(t){let e=Py(t.type??t.itemType);if(e==="commandexecution")return{toolName:"Bash",input:qi(t,["id","itemId","type","itemType","stdout","stderr","exitCode","exit_code","status","success","error"])};if(e==="filechange")return{toolName:"Patch",input:qi(t,["id","itemId","type","itemType","stdout","stderr","exitCode","exit_code","status","success","error"])};if(e==="mcptoolcall"){let n=L(t.server),s=L(t.tool)??L(t.name);return s?{toolName:n?`mcp__${n}__${s}`:s,input:$(t.arguments)??$(t.input)??{}}:null}return null}function Ny(t,e){let n=L(t.path);if(!n||!(Array.isArray(t.changes)?t.changes:[]).some(o=>$(o)?.kind==="create"))return null;let i=nt(n,e);return Et(i)?i:null}function Oy(t){if(!Array.isArray(t))return"";for(let e of t){let n=$(e);if(!n)continue;let s=L(n.question)??L(n.header);if(s)return s}return""}function Dy(t){let e=$(t);if(!e)return;let n=Ui(e.input_tokens??e.inputTokens)??0,s=Ui(e.output_tokens??e.outputTokens)??0,r=Ui(e.modelContextWindow??e.model_context_window??e.contextWindowTokens);if(!(n<=0&&s<=0&&!r))return{inputTokens:n,outputTokens:s,...r?{contextWindowTokens:r}:{}}}function ku(t,e){return t==="autoApprove"?{approvalPolicy:"never",sandbox:"danger-full-access",sandboxPolicy:{type:"dangerFullAccess"}}:t==="plan"?{approvalPolicy:"on-request",sandbox:"workspace-write",sandboxPolicy:{type:"workspaceWrite",writableRoots:[],readOnlyAccess:{type:"fullAccess"},networkAccess:!0,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1}}:{approvalPolicy:"on-request",sandbox:"workspace-write",sandboxPolicy:{type:"workspaceWrite",writableRoots:[e],readOnlyAccess:{type:"fullAccess"},networkAccess:!0,excludeTmpdirEnvVar:!1,excludeSlashTmp:!1}}}var An=class{proc=null;handler=null;exitHandler=null;buffer="";rpcId=0;pending=new Map;threadId="";lastStderr=[];approvalRequests=new Map;toolContextByCallId=new Map;turnStartInFlight=!1;interruptRequestedDuringTurnStart=!1;latestTurnUsage;approvalMode;cwd="";model;async start(e,n,s){this.approvalMode=s,this.cwd=e,this.approvalRequests.clear(),this.toolContextByCallId.clear(),this.turnStartInFlight=!1,this.interruptRequestedDuringTurnStart=!1,this.latestTurnUsage=void 0;let r=S.codexPath,i,o=this.buildSpawnArgs();if(S.isTransientPath(r)||r==="codex"){let c=S.execViaLoginShell("codex",o);i=c.command,o=c.args,P.info({spawnCmd:i,argsPreview:o.slice(0,2)},"spawning via login shell")}else i=r,P.info({spawnCmd:i,args:o},"spawning");w.emit("driver.spawn",{agent:"codex",cwd:e,resumeSessionId:n}),this.lastStderr=[],this.proc=(0,xu.spawn)(i,o,{cwd:e||void 0,stdio:["pipe","pipe","pipe"],env:S.buildSanitizedEnv(),...process.platform==="win32"?{shell:!0,windowsHide:!0}:{}}),this.proc.on("error",c=>{let d=c.message;c.code==="ENOENT"&&e&&!(0,Ru.existsSync)(e)&&(d=`Working directory does not exist: ${e}`),P.error({error:d,cwd:e},"spawn error"),w.emit("driver.error",{agent:"codex",error:d})}),this.proc.stdout.on("data",c=>{this.buffer+=c.toString();let d=this.buffer.split(`
89
89
  `);this.buffer=d.pop();for(let f of d)if(f.trim())try{this.handleRaw(JSON.parse(f))}catch{P.warn({linePreview:f.slice(0,200)},"failed to parse stdout line")}}),this.proc.stderr.on("data",c=>{let d=c.toString().trim();d&&(P.debug({stderr:d},"stderr"),this.lastStderr.push(d),this.lastStderr.length>10&&this.lastStderr.shift())}),this.proc.on("exit",c=>{P.info({threadId:this.threadId,exitCode:c},"process exited"),c&&c!==0&&P.error({threadId:this.threadId,exitCode:c,lastStderr:this.lastStderr.slice(-3)},"abnormal exit"),this.proc=null,this.approvalRequests.clear(),this.toolContextByCallId.clear(),this.turnStartInFlight=!1,this.interruptRequestedDuringTurnStart=!1;for(let[,{reject:d}]of this.pending)d(new Error(`Codex process exited with code ${c}`));this.pending.clear(),this.exitHandler?.(c),c&&this.handler&&this.threadId&&this.handler({type:"error",sessionId:this.threadId,message:`Codex process exited with code ${c}`})});let l=_.startTimer("rpc.duration");await this.rpc("initialize",{clientInfo:{name:"@vibelet/cli",version:Pt},capabilities:{experimentalApi:!0}}),l(),this.rpcNotify("initialized",{});let u=ku(this.approvalMode,e);if(n){let c=await this.rpc("thread/resume",{threadId:n,approvalPolicy:u.approvalPolicy,sandbox:u.sandbox,persistExtendedHistory:!0});this.threadId=c?.thread?.id??n,P.info({threadId:this.threadId},"thread resumed"),w.emit("driver.init",{agent:"codex",sessionId:this.threadId})}else{let c=await this.rpc("thread/start",{cwd:e,approvalPolicy:u.approvalPolicy,sandbox:u.sandbox,experimentalRawEvents:!0,persistExtendedHistory:!0});this.threadId=c?.thread?.id??c?.threadId??"",P.info({threadId:this.threadId},"thread created"),w.emit("driver.init",{agent:"codex",sessionId:this.threadId})}return this.threadId}setModel(e){this.model=e}buildSpawnArgs(){let e=["app-server","--listen","stdio://"];return this.model&&e.push("-m",this.model),e}sendPrompt(e,n){let s=ku(this.approvalMode,this.cwd||process.cwd());this.latestTurnUsage=void 0,this.turnStartInFlight=!0,this.interruptRequestedDuringTurnStart=!1,P.info({threadId:this.threadId,promptPreview:e.slice(0,50)},"turn/start"),this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}],approvalPolicy:s.approvalPolicy,sandboxPolicy:s.sandboxPolicy,...n?{model:n}:{}}).then(r=>{P.debug({resultPreview:JSON.stringify(r).slice(0,200)},"turn/start result"),this.turnStartInFlight=!1,this.interruptRequestedDuringTurnStart&&(this.interruptRequestedDuringTurnStart=!1,this.requestTurnInterrupt())}).catch(r=>{this.turnStartInFlight=!1,this.interruptRequestedDuringTurnStart=!1,P.error({threadId:this.threadId,error:r.message},"sendPrompt error"),this.handler?.({type:"error",sessionId:this.threadId,message:r.message})})}respondApproval(e,n){if(!this.proc?.stdin?.writable)return!1;let s=this.approvalRequests.get(e),r=s?.rpcId??Number(e);if(!Number.isFinite(r))return!1;let i;if(!s)i=n?{decision:"approve"}:{decision:"deny",reason:"User denied from Vibelet"};else{switch(s.kind){case"command-execution":case"file-change":i={decision:n?"accept":"decline"};break;case"request-user-input-approval":i={answers:{[s.questionId]:{answers:[n?s.approveLabel:s.denyLabel]}}};break;case"exec-command-legacy":case"apply-patch-legacy":i={decision:n?"approved":"denied"};break;default:i={decision:n?"accept":"decline"};break}this.approvalRequests.delete(e)}return P.info({threadId:this.threadId,rpcId:r,approved:n},"approval response"),this.proc.stdin.write(JSON.stringify({jsonrpc:"2.0",id:r,result:i})+`
90
90
  `),!0}restorePendingApproval(e){let n=xy(e);n&&this.approvalRequests.set(e.requestId,n)}getRespondingLivenessHint(){return!this.proc||this.proc.exitCode!==null||this.proc.signalCode!==null||this.proc.killed?"dead":"alive"}interrupt(){this.turnStartInFlight&&(this.interruptRequestedDuringTurnStart=!0),this.requestTurnInterrupt()}setApprovalMode(e){this.approvalMode=e,P.info({approvalMode:e},"approval mode updated (takes effect on subsequent turns)")}stop(){if(!this.proc)return;this.proc.kill("SIGTERM");let e=this.proc;setTimeout(()=>{e.killed||e.kill("SIGKILL")},5e3).unref(),this.proc=null,this.approvalRequests.clear(),this.toolContextByCallId.clear(),this.turnStartInFlight=!1,this.interruptRequestedDuringTurnStart=!1,this.latestTurnUsage=void 0;for(let[,{reject:n}]of this.pending)n(new Error("Process stopped"));this.pending.clear()}onMessage(e){this.handler=e}onExit(e){this.exitHandler=e}rpc(e,n){let s=++this.rpcId,r=_.startTimer("rpc.duration");return new Promise((i,o)=>{if(this.pending.set(s,{resolve:a=>{r(),i(a)},reject:a=>{r(),o(a)}}),!this.proc?.stdin?.writable){this.pending.delete(s),r(),o(new Error("Process not available"));return}this.proc.stdin.write(JSON.stringify({jsonrpc:"2.0",method:e,id:s,params:n})+`
91
91
  `),setTimeout(()=>{this.pending.has(s)&&(this.pending.delete(s),P.error({method:e,rpcId:s,threadId:this.threadId},"RPC timeout"),r(),o(new Error(`RPC timeout: ${e}`)))},3e4).unref()})}requestTurnInterrupt(){this.rpc("turn/interrupt",{threadId:this.threadId}).catch(()=>{})}rpcNotify(e,n){this.proc?.stdin?.writable&&this.proc.stdin.write(JSON.stringify({jsonrpc:"2.0",method:e,params:n})+`
@@ -1,2 +1,2 @@
1
- var s=require("node:fs"),n=require("node:path"),c="@vibelet/cli";function a(e){try{let r=JSON.parse((0,s.readFileSync)(e,"utf8"));if(r.name===c&&typeof r.version=="string"&&r.version.length>0)return r.version}catch{}return null}function p(){return"1.1.4"}var i=p();process.stdout.write(`${i}
1
+ var s=require("node:fs"),n=require("node:path"),c="@vibelet/cli";function a(e){try{let r=JSON.parse((0,s.readFileSync)(e,"utf8"));if(r.name===c&&typeof r.version=="string"&&r.version.length>0)return r.version}catch{}return null}function p(){return"1.2.0"}var i=p();process.stdout.write(`${i}
2
2
  `);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibelet/cli",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
4
4
  "description": "Cross-platform CLI for installing and running the Vibelet daemon",
5
5
  "homepage": "https://vibelet.icu",
6
6
  "files": [