@quantiya/codevibe-codex-plugin 2.0.103 → 2.0.105

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.
@@ -0,0 +1,5 @@
1
+ "use strict";var et=Object.create;var ee=Object.defineProperty;var tt=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var nt=Object.getPrototypeOf,rt=Object.prototype.hasOwnProperty;var ot=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),st=(i,e)=>{for(var t in e)ee(i,t,{get:e[t],enumerable:!0})},Oe=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of it(e))!rt.call(i,r)&&r!==t&&ee(i,r,{get:()=>e[r],enumerable:!(n=tt(e,r))||n.enumerable});return i};var H=(i,e,t)=>(t=i!=null?et(nt(i)):{},Oe(e||!i||!i.__esModule?ee(t,"default",{value:i,enumerable:!0}):t,i)),at=i=>Oe(ee({},"__esModule",{value:!0}),i);var je=ot((_t,pt)=>{pt.exports={name:"@quantiya/codevibe-codex-plugin",version:"2.0.105",description:"Control OpenAI Codex CLI from your iPhone and Android \u2014 real-time sync, approve file edits, send prompts by voice. Part of CodeVibe.",main:"dist/server.js",codevibe:{companionLauncher:"./libexec/companion-launcher"},files:["dist/**/*.js","libexec","hooks","README.md",".env.example"],scripts:{typecheck:"tsc --noEmit",build:"rm -rf dist && npm run typecheck && esbuild src/server.ts src/native-launch.ts --bundle --platform=node --target=node18 --minify --packages=external --outdir=dist",prepack:"node scripts/prepare-publish.js && npm run build",postpack:"node scripts/restore-dev.js",dev:"ts-node src/server.ts",start:"node dist/server.js",test:"jest --config jest.config.js"},keywords:["codex","codex-cli","openai","plugin","extension","mobile","ios","android","codevibe","companion","remote-control","ai","developer-tools"],author:"Quantiya <support@quantiya.ai>",license:"MIT",bugs:{email:"support@quantiya.ai"},homepage:"https://quantiya.ai/codevibe",engines:{node:">=22.0.0"},dependencies:{"@quantiya/codevibe-core":"^2.0.90","@quantiya/quorum-core":"^1.0.1",chokidar:"^4.0.0",dotenv:"^16.6.1",express:"^5.1.0",graphql:"^16.12.0","shell-quote":"1.9.0",uuid:"^13.0.0",ws:"^8.18.3"},bundledDependencies:["@quantiya/codevibe-core","@quantiya/quorum-core","chokidar","dotenv","express","graphql","shell-quote","uuid","ws"],devDependencies:{"@types/express":"^5.0.5","@types/jest":"^30.0.0","@types/node":"^24.10.1","@types/uuid":"^10.0.0","@types/ws":"^8.18.1",esbuild:"^0.28.0",jest:"^30.3.0","ts-jest":"^29.4.9","ts-node":"^10.9.2",typescript:"^5.9.3"},bundleDependencies:["@quantiya/codevibe-core","@quantiya/quorum-core","chokidar","dotenv","express","graphql","shell-quote","uuid","ws"]}});var vt={};st(vt,{NATIVE_STARTUP_RESUME_TIMEOUT_MS:()=>Xe,consumeTmuxBootstrap:()=>ze,findNativeCodex:()=>me,launchNativeCompanion:()=>Ke,launchNativeInsideTmux:()=>ve,missingTmuxSession:()=>We,nativeChildEnvironment:()=>fe,nativeExitStatus:()=>Ge,nativeStartupStep:()=>he,nativeTmuxSocket:()=>Ye,waitExit:()=>q});module.exports=at(vt);var c=require("node:fs"),y=H(require("node:path")),Be=H(require("node:os")),B=require("node:crypto"),x=require("node:child_process"),Je=require("node:util");var F=H(require("node:path")),K=class extends Error{constructor(t){super(`${t}: run plain codex for unsupported native launch forms.`);this.code=t;this.name="NativeLaunchError"}};function L(){throw new K("NATIVE_ARGUMENT_UNSUPPORTED")}function le(i){return typeof i=="string"&&i.length>0&&!i.includes("\0")}function dt(i){let e=i.split("-");return e.length===5&&e.every((t,n)=>t.length===[8,4,4,4,12][n]&&[...t].every(r=>"0123456789abcdef".includes(r)))}var ct=new Set(["agents","exec","e","review","login","logout","mcp","plugin","app-server","remote-control","app","completion","update","doctor","sandbox","debug","apply","a","queue","archive","delete","migrate-rollouts","migrate-nfs-db","unarchive","fork","cloud","exec-server","features","help"]);function Ce(i,e,t,n){if(i.trim()!=="codex-cli 0.165.0")throw new K("NATIVE_VERSION_UNSUPPORTED");if(!F.isAbsolute(t)||!F.isAbsolute(n)||F.normalize(n)!==n||n.includes(":")||n.includes("\0")||Buffer.byteLength(n)>100)throw new K("NATIVE_LAUNCH_INVALID");let r={workingDirectory:F.resolve(t),cwdOverride:!1,resumeThreadId:null,model:null,policy:{},appServerArgs:[],tuiArgs:[]},o=null,d=!1,a=!1,s=new Set,l=N=>{s.has(N)&&L(),s.add(N)};for(let N=0;N<e.length;N++){let E=e[N];if(le(E)||L(),!d&&E==="--"){d=!0;continue}if(!d&&E.startsWith("-")){let h=E.indexOf("="),m=h<0?E:E.slice(0,h);if(m==="--no-alt-screen"&&h<0){l("renderer"),r.tuiArgs.push(m);continue}let g=["--model","-m"].includes(m)?"model":["--cd","-C"].includes(m)?"cwd":["--sandbox","-s"].includes(m)?"sandbox":["--ask-for-approval","-a"].includes(m)?"approval":null;g||L(),l(g);let w=h<0?e[++N]:E.slice(h+1);(!le(w)||w.startsWith("-"))&&L(),g==="model"&&(r.model=w),g==="cwd"&&(r.workingDirectory=F.resolve(t,w),r.cwdOverride=!0),g==="sandbox"&&(["read-only","workspace-write","danger-full-access"].includes(w)||L(),r.policy.sandbox=w),g==="approval"&&(["on-request","never"].includes(w)||L(),r.policy.approvalPolicy=w);continue}if(!d&&E==="resume"&&o===null&&!a){a=!0;let h=e[++N];(!le(h)||!dt(h))&&L(),r.resumeThreadId=h;continue}!d&&!a&&ct.has(E)&&L(),o!==null&&L(),o=E}let u=[];r.model!==null&&u.push("-c","model="+JSON.stringify(r.model)),r.policy.sandbox&&u.push("-c","sandbox_mode="+JSON.stringify(r.policy.sandbox)),r.policy.approvalPolicy&&u.push("-c","approval_policy="+JSON.stringify(r.policy.approvalPolicy)),r.appServerArgs=[...u,"app-server","--listen","unix://"+n];let f=r.tuiArgs;return r.tuiArgs=["--remote","unix://"+n,...f],r.model!==null&&r.tuiArgs.push("--model",r.model),a||(r.policy.sandbox&&r.tuiArgs.push("--sandbox",r.policy.sandbox),r.policy.approvalPolicy&&r.tuiArgs.push("--ask-for-approval",r.policy.approvalPolicy)),a&&r.tuiArgs.push("resume",r.resumeThreadId),o!==null&&r.tuiArgs.push("--",o),r}var te=H(require("ws")),O=require("node:fs"),D=H(require("node:path")),Se=require("node:crypto");async function Ve(i,e){if(!D.isAbsolute(i)||D.normalize(i)!==i||i.includes(":")||i.includes("\0"))throw new v("NATIVE_SOCKET_UNSAFE");let t=await O.promises.lstat(D.dirname(i)),n=await O.promises.lstat(i),r=typeof process.getuid=="function"?process.getuid():void 0;if(!t.isDirectory()||t.isSymbolicLink()||(t.mode&63)!==0||t.dev!==e.dev||t.ino!==e.ino||r!==void 0&&(t.uid!==r||n.uid!==r))throw new v("NATIVE_SOCKET_UNSAFE");let o=i,d;if(n.isSymbolicLink()){let u=await O.promises.readlink(i);o=await O.promises.realpath(i),d={path:i,dev:n.dev,ino:n.ino,target:u,rootDev:t.dev,rootIno:t.ino}}let a=await O.promises.lstat(o),s=await O.promises.lstat(D.dirname(o));if(!a.isSocket()||a.isSymbolicLink()||!s.isDirectory()||s.isSymbolicLink()||(s.mode&63)!==0||r!==void 0&&(a.uid!==r||s.uid!==r))throw new v("NATIVE_SOCKET_UNSAFE");let l=await O.promises.lstat(i);if(l.dev!==n.dev||l.ino!==n.ino||d&&(await O.promises.readlink(i)!==d.target||await O.promises.realpath(i)!==o))throw new v("NATIVE_SOCKET_UNSAFE");return{socketPath:o,socketIdentity:{dev:a.dev,ino:a.ino},...d?{alias:d}:{}}}var v=class extends Error{constructor(t,n,r,o){super(t);this.code=t;this.rpcCode=n;this.diagnostic=r;this.handlerFailure=o;this.name="NativeClientError"}};function be(i,e){let t=i.length<=128&&[...i].every(s=>"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/_.-".includes(s))?i:"UNKNOWN_NATIVE_METHOD",n=e instanceof Error?e:null,r=["Error","TypeError","RangeError","NativeClientError","NativeRuntimeError","NativeControlError","SyncEventClientError","SyncJournalError","ZodError"],o=e?.code??n?.message,d=typeof o=="string"&&o.length<=96&&(o.startsWith("NATIVE_")||o.startsWith("SYNC_")||["ENOENT","EACCES","EPERM","EIO"].includes(o))&&[...o].every(s=>"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_".includes(s))?o:null,a=null;for(let s of(n?.stack??"").split(`
2
+ `).slice(1)){for(let[l,u]of[["server.js","server"],["index.js","core"],["native-launch.js","native-launch"]]){let f="/dist/"+l+":",N=s.lastIndexOf(f);if(N<0)continue;let E=s.slice(N+f.length).split(")")[0].trim().split(":");if(E.length===2&&E.every(h=>h.length>0&&[...h].every(m=>"0123456789".includes(m)))){let[h,m]=E.map(Number);h>0&&h<1e5&&m>0&&m<1e7&&(a={module:u,line:h,column:m})}if(a)break}if(a)break}return new v("NATIVE_HANDLER_FAILED",void 0,void 0,{method:t,errorName:n&&r.includes(n.name)?n.name:"Error",causeCode:d,site:a})}var Y=class{constructor(e){this.options=e;this.socket=null;this.pending=new Map;this.handlers=new Set;this.accepting=!1;this.intentionalClose=!1;this.initialized=!1;this.requestPrefix="codevibe-"+(0,Se.randomUUID)()+"-";this.sequence=0;this.instanceId=e.instanceId,this.endpoint={socketPath:e.socketPath,socketIdentity:{...e.socketIdentity},...e.alias?{alias:{...e.alias}}:{}}}async assertSocket(){this.options.assertOwner();let e=this.endpoint.socketPath;if(!D.isAbsolute(e)||D.normalize(e)!==e||e.includes(":")||e.includes("\0"))throw new v("NATIVE_SOCKET_UNSAFE");let t=await O.promises.lstat(D.dirname(e)),n=await O.promises.lstat(e),r=typeof process.getuid=="function"?process.getuid():void 0,o={rootDirectory:t.isDirectory(),rootNotSymlink:!t.isSymbolicLink(),rootPrivate:(t.mode&63)===0,ownerMatches:r===void 0||t.uid===r&&n.uid===r,socketType:n.isSocket(),socketNotSymlink:!n.isSymbolicLink(),socketIdentityMatches:n.dev===this.endpoint.socketIdentity.dev&&n.ino===this.endpoint.socketIdentity.ino};if(Object.values(o).some(a=>!a))throw new v("NATIVE_SOCKET_UNSAFE",void 0,o);let d=this.endpoint.alias;if(d){let a=await O.promises.lstat(D.dirname(d.path)),s=await O.promises.lstat(d.path);if(!a.isDirectory()||a.isSymbolicLink()||(a.mode&63)!==0||a.dev!==d.rootDev||a.ino!==d.rootIno||!s.isSymbolicLink()||s.dev!==d.dev||s.ino!==d.ino||r!==void 0&&(a.uid!==r||s.uid!==r)||await O.promises.readlink(d.path)!==d.target||await O.promises.realpath(d.path)!==e)throw new v("NATIVE_SOCKET_UNSAFE",void 0,{originalAliasMatches:!1})}this.options.assertOwner()}async connect(){try{await this.connectOnce()}catch(e){throw await this.close(),e}}async connectOnce(){if(this.socket||this.intentionalClose)throw new v("NATIVE_DISCONNECTED");await this.assertSocket();let e=new te.default("ws+unix://"+this.endpoint.socketPath+":/");this.socket=e,this.accepting=!0,e.on("message",t=>this.receive(t.toString())),e.on("error",()=>this.fail(new v("NATIVE_DISCONNECTED"))),e.on("close",()=>{this.initialized=!1,this.accepting=!1,this.rejectPending(),this.intentionalClose||this.report(new v("NATIVE_DISCONNECTED"))}),await new Promise((t,n)=>{let r=setTimeout(()=>{a(new v("NATIVE_RPC_TIMEOUT",void 0,{webSocketOpenTimedOut:!0})),e.terminate()},2e3),o=()=>a(),d=()=>a(new v("NATIVE_DISCONNECTED")),a=s=>{clearTimeout(r),e.off("open",o),e.off("error",d),e.off("close",d),s?n(s):t()};e.once("open",o),e.once("error",d),e.once("close",d)}),await this.assertSocket(),await this.request("initialize",{clientInfo:{name:"codevibe-codex",version:this.options.pluginVersion},capabilities:{experimentalApi:!0,requestAttestation:!1}},2e3),await this.notify("initialized"),this.initialized=!0}report(e){try{Promise.resolve(this.options.onFailure(e)).catch(()=>{})}catch{}}rejectPending(){for(let e of this.pending.values())clearTimeout(e.timer),e.reject(new v("NATIVE_DISCONNECTED"));this.pending.clear()}fail(e){this.accepting=!1,this.initialized=!1,this.rejectPending(),this.intentionalClose||this.report(e),this.socket?.terminate()}receive(e){if(!this.accepting)return;let t;try{let r=JSON.parse(e);if(!r||typeof r!="object"||Array.isArray(r))throw Error();t=r}catch{this.fail(new v("NATIVE_PROTOCOL_INVALID"));return}if(typeof t.method=="string"){if(t.id!==void 0&&typeof t.id!="string"&&typeof t.id!="number"){this.fail(new v("NATIVE_PROTOCOL_INVALID"));return}let r;try{this.options.assertOwner(),r=this.options.onMessage(t)}catch(d){this.report(be(t.method,d));return}let o=Promise.resolve(r).catch(d=>this.report(be(t.method,d)));this.handlers.add(o),o.then(()=>this.handlers.delete(o));return}if(typeof t.id!="string")return;let n=this.pending.get(t.id);if(n)if(this.pending.delete(t.id),clearTimeout(n.timer),t.error!==void 0){let r=t.error?.code;n.reject(new v("NATIVE_RPC_REJECTED",typeof r=="number"?r:void 0))}else Object.prototype.hasOwnProperty.call(t,"result")?n.resolve(t.result):n.reject(new v("NATIVE_PROTOCOL_INVALID"))}async write(e){this.options.assertOwner();let t=this.socket;if(!t||t.readyState!==te.default.OPEN||!this.accepting)throw new v("NATIVE_DISCONNECTED");await new Promise((n,r)=>t.send(JSON.stringify(e),o=>o?r(new v("NATIVE_DISCONNECTED")):n())),this.options.assertOwner()}async request(e,t,n=1e4){if(!this.initialized&&e!=="initialize")throw new v("NATIVE_DISCONNECTED");if(!Number.isFinite(n)||n<=0||n>1e4)throw new v("NATIVE_PROTOCOL_INVALID");let r=this.requestPrefix+ ++this.sequence,d=new Promise((s,l)=>{let u=setTimeout(()=>{this.pending.delete(r),l(new v("NATIVE_RPC_TIMEOUT",void 0,{initializeTimedOut:e==="initialize",threadResumeTimedOut:e==="thread/resume",otherRpcTimedOut:e!=="initialize"&&e!=="thread/resume"}))},n);this.pending.set(r,{resolve:s,reject:l,timer:u})}).then(s=>({value:s}),s=>({error:s}));try{await this.write({id:r,method:e,params:t})}catch(s){let l=this.pending.get(r);throw l&&(clearTimeout(l.timer),this.pending.delete(r),l.reject(new v("NATIVE_DISCONNECTED"))),await d,s}let a=await d;if("error"in a)throw a.error;return a.value}async notify(e,t){await this.write({method:e,...t===void 0?{}:{params:t}})}async respond(e,t){if(!this.initialized)throw new v("NATIVE_DISCONNECTED");await this.write({id:e,result:t})}async close(){this.intentionalClose=!0,this.accepting=!1,this.initialized=!1,this.rejectPending();let e=this.socket;e&&e.readyState!==te.default.CLOSED&&await new Promise(t=>{let n=setTimeout(()=>{e.terminate(),t()},2e3);e.once("close",()=>{clearTimeout(n),t()}),e.close()}),await this.joinHandlers(),this.socket=null}async joinHandlers(){await Promise.allSettled([...this.handlers])}};var j=require("node:fs"),R=H(require("node:path")),Pe=H(require("node:os")),pe=require("node:util");var A=class extends Error{constructor(t){super(t);this.code=t;this.name="NativeRuntimeError"}},z=()=>{throw new A("NATIVE_LAUNCH_AUTHORITY_INVALID")};function ie(i){return!i||typeof i!="object"||Array.isArray(i)?z():i}function lt(i,e){return Object.keys(i).sort().join(",")===e.sort().join(",")}function Re(i){return typeof i=="number"&&Number.isSafeInteger(i)&&i>0}function De(i){try{process.kill(i,0)}catch{z()}}async function ke(i,e){if(!R.isAbsolute(i)||R.normalize(i)!==i||R.basename(i)!=="launch.json")return z();let t=typeof process.getuid=="function"?process.getuid():void 0,n=await j.promises.open(i,j.constants.O_RDONLY|j.constants.O_NOFOLLOW),r,o;try{let a=await n.stat();if(!a.isFile()||a.nlink!==1||(a.mode&63)!==0||a.size>2*1024*1024||t!==void 0&&a.uid!==t)return z();let s=ie(JSON.parse(await n.readFile("utf8")));if(!lt(s,["version","instanceId","root","launcher","server","endpoint","plan"])||s.version!==1||s.instanceId!==e||typeof e!="string"||!e.length||!Re(s.launcher?.pid)||s.launcher.host!==Pe.hostname()||!Re(s.server?.pid)||s.root?.path!==R.dirname(i)||!Number.isSafeInteger(s.root.dev)||!Number.isSafeInteger(s.root.ino)||s.root.uid!==t||!R.isAbsolute(s.endpoint?.socketPath??"")||!Number.isSafeInteger(s.endpoint?.socketIdentity?.dev)||!Number.isSafeInteger(s.endpoint?.socketIdentity?.ino)||!R.isAbsolute(s.plan?.workingDirectory??"")||s.plan.resumeThreadId!==null&&typeof s.plan.resumeThreadId!="string")return z();let l=await n.stat();if(a.dev!==l.dev||a.ino!==l.ino||a.size!==l.size||a.mtimeMs!==l.mtimeMs)return z();r=s,o={dev:a.dev,ino:a.ino,size:a.size,mtimeMs:a.mtimeMs}}finally{await n.close()}let d=()=>{let a=(0,j.lstatSync)(r.root.path),s=(0,j.lstatSync)(i);if(!a.isDirectory()||a.isSymbolicLink()||(a.mode&63)!==0||a.dev!==r.root.dev||a.ino!==r.root.ino||a.uid!==r.root.uid||!s.isFile()||s.isSymbolicLink()||s.nlink!==1||(s.mode&63)!==0||s.dev!==o.dev||s.ino!==o.ino||s.size!==o.size||s.mtimeMs!==o.mtimeMs||s.uid!==r.root.uid)return z();De(r.launcher.pid),De(r.server.pid)};return d(),{record:JSON.parse(JSON.stringify(r)),assertCurrent:d}}function ue(i){let e=ie(i);if(typeof e.id!="string"||!e.id.length)throw new A("NATIVE_ROOT_INVALID_ID");if(e.sessionId!==e.id||e.parentThreadId!=null)throw new A("NATIVE_ROOT_INVALID_SESSION");if(e.ephemeral!==!1)throw new A("NATIVE_ROOT_INVALID_PERSISTENCE");if(typeof e.cwd!="string"||!R.isAbsolute(e.cwd))throw new A("NATIVE_ROOT_INVALID_CWD");if(!Number.isFinite(e.createdAt)||e.createdAt<0)throw new A("NATIVE_ROOT_INVALID_TIMESTAMP");if(e.path!==null&&(typeof e.path!="string"||!R.isAbsolute(e.path)))throw new A("NATIVE_ROOT_INVALID_PATH");if(typeof e.cliVersion!="string")throw new A("NATIVE_ROOT_INVALID_VERSION");if(typeof e.modelProvider!="string")throw new A("NATIVE_ROOT_INVALID_PROVIDER");return{id:e.id,sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,path:e.path,cliVersion:e.cliVersion,modelProvider:e.modelProvider}}var ne=class{constructor(e){this.options=e;this.root=null;this.ready=!1;this.generation=0;this.bindingDepth=0;this.binding=Promise.resolve();this.closed=!1;this.refreshPending=null;this.pendingControls=new Map;this.pendingFiles=new Map;this.client=new Y({...e.authority.record.endpoint,instanceId:e.authority.record.instanceId,pluginVersion:e.pluginVersion,assertOwner:e.authority.assertCurrent,onMessage:t=>this.observe(t),onFailure:t=>t.handlerFailure?e.onFailure(t.code,t.handlerFailure):e.onFailure(t.code)})}get thread(){return this.root?{...this.root}:null}controlFacts(){return JSON.parse(JSON.stringify([...this.pendingFiles.values(),...this.pendingControls.values()]))}isCurrentControl(e){let t=e.id===void 0?void 0:this.pendingControls.get(e.id);return!this.closed&&!!t&&t.method===e.method&&(0,pe.isDeepStrictEqual)(t.params,e.params)}hasPendingControl(){return this.pendingControls.size>0}async start(){await this.client.connect();let e=this.options.authority.record.plan.resumeThreadId??this.options.recoveryThreadId;e&&await this.bind(await this.readMetadata(e))}bind(e){let t=this.options.authority.record.plan.resumeThreadId??this.options.recoveryThreadId;if(!this.root&&t&&e.id!==t)return Promise.reject(new A("NATIVE_ROOT_INVALID"));if(this.root&&e.id===this.root.id&&e.cwd!==this.root.cwd)return Promise.reject(new A("NATIVE_ROOT_INVALID"));if(this.root&&(0,pe.isDeepStrictEqual)(this.root,e)&&(this.ready||this.bindingDepth>0))return this.binding;(!this.root||this.root.id!==e.id)&&(this.generation++,this.ready=!1,this.pendingControls.clear(),this.pendingFiles.clear());let n=this.generation;this.root={...e},this.bindingDepth++;let r=this.binding.then(async()=>{if(this.closed)throw new A("NATIVE_BINDING_FAILED");await this.options.onRoot({...e}),n===this.generation&&!this.closed&&(this.ready=!0)});return this.binding=r.catch(()=>{}),r.then(()=>{this.bindingDepth--},()=>{this.bindingDepth--}),r}observe(e){if(this.closed)return;let t=e.params;if(e.method==="thread/started"){let r=t?.thread;return r?.ephemeral===!0||r?.parentThreadId!=null||r?.sessionId!==r?.id?void 0:this.bind(ue(r))}if(!this.root||t?.threadId!==this.root.id)return;if(e.id!==void 0&&this.pendingControls.set(e.id,JSON.parse(JSON.stringify(e))),e.method==="serverRequest/resolved"&&this.pendingControls.delete(t.requestId),["item/started","item/completed"].includes(e.method)&&t.item?.type==="fileChange"&&this.pendingFiles.set(t.item.id,JSON.parse(JSON.stringify(e))),e.method==="item/completed"&&["commandExecution","fileChange"].includes(t.item?.type)){for(let[r,o]of this.pendingControls){let d=o.params;d.turnId===t.turnId&&d.itemId===t.item.id&&this.pendingControls.delete(r)}this.pendingFiles.delete(t.item.id)}if(!this.ready&&this.bindingDepth===0&&e.method==="turn/started"&&this.bind(this.root).catch(()=>{}),["item/agentMessage/delta","item/reasoning/textDelta","item/commandExecution/outputDelta"].includes(e.method))return;if(this.ready)return this.options.onMessage(e);let n=this.generation;return this.binding.then(()=>{if(!this.ready||this.closed||n!==this.generation)throw new A("NATIVE_BINDING_FAILED");return this.options.onMessage(e)})}async readMetadata(e){let t=await this.client.request("thread/resume",{threadId:e,excludeTurns:!0},2e3),n=ue(ie(t).thread);if(n.id!==e)throw new A("NATIVE_ROOT_INVALID");return n}refreshMetadata(){if(this.refreshPending)return this.refreshPending;if(!this.root||this.closed)return Promise.resolve(null);let e=this.root.id,t=(async()=>{let n=Date.now()+2e3;for(let r=0;r<10&&Date.now()<n;r++)try{let o=await this.client.request("thread/resume",{threadId:e,excludeTurns:!0},Math.max(1,n-Date.now())),d=ue(ie(o).thread);if(d.id!==e||this.root?.id!==e||this.closed)throw new A("NATIVE_ROOT_INVALID");return await this.bind(d),d}catch(o){if(!(o instanceof v)||o.code!=="NATIVE_RPC_REJECTED"||![-32600,-32601].includes(o.rpcCode??0))throw o;r<9&&Date.now()<n&&await new Promise(d=>setTimeout(d,Math.min(100,n-Date.now())))}return null})();return this.refreshPending=t,t.then(()=>{this.refreshPending=null},()=>{this.refreshPending=null}),t}async close(){this.closed=!0,await this.client.close(),await this.binding,await this.refreshPending?.catch(()=>{})}};var xe=require("node:crypto"),re=require("node:util"),Le=2*1024*1024,oe=i=>JSON.parse(JSON.stringify(i)),Me=i=>(0,xe.createHash)("sha256").update(JSON.stringify(i)).digest("hex");function _(i){if(!i||typeof i!="object"||Array.isArray(i))throw Error("NATIVE_RECEIPT_INVALID");return i}function G(i){return typeof i=="string"&&i.length>0&&i.length<=512}function Ue(i){return G(i)||typeof i=="number"&&Number.isSafeInteger(i)&&i>=0}function Fe(i){return{nativeInstanceId:i.nativeInstanceId,request:i.request,resolved:i.resolved,completed:i.completed,turnCompleted:i.turnCompleted}}function ut(i,e){let t=_(i);if(Buffer.byteLength(JSON.stringify(t))>Le||Object.keys(t).sort().join(",")!=="completed,digest,nativeInstanceId,request,resolved,turnCompleted"||t.nativeInstanceId!==e||!G(e))throw Error("NATIVE_RECEIPT_INVALID");let n=_(t.request),r=_(t.resolved),o=_(t.completed),d=_(t.turnCompleted),a=_(n.params),s=_(r.params),l=_(o.params),u=_(d.params),f=_(l.item),N=_(u.turn),E=n.method==="item/commandExecution/requestApproval"?"commandExecution":n.method==="item/fileChange/requestApproval"?"fileChange":null;if(!E||!Ue(n.id)||![a.threadId,a.turnId,a.itemId].every(G)||r.method!=="serverRequest/resolved"||s.threadId!==a.threadId||s.requestId!==n.id||o.method!=="item/completed"||l.threadId!==a.threadId||l.turnId!==a.turnId||f.id!==a.itemId||f.type!==E||!["completed","failed","declined"].includes(f.status)||d.method!=="turn/completed"||u.threadId!==a.threadId||N.id!==a.turnId||!["completed","failed","interrupted"].includes(N.status))throw Error("NATIVE_RECEIPT_INVALID");let h=Fe(t);if(t.digest!==Me(h))throw Error("NATIVE_RECEIPT_INVALID");return{...oe(h),digest:t.digest}}var se=class{constructor(e){this.instanceId=e;this.rows=new Map;this.unavailable=!1;if(!G(e))throw Error("NATIVE_RECEIPT_INVALID")}invalidate(){this.unavailable=!0}get isUnavailable(){return this.unavailable}key(e,t){return JSON.stringify([e,t])}observe(e){if(!this.unavailable)try{let t=oe(e),n=_(t.params);if(!G(n.threadId)||!["item/commandExecution/requestApproval","item/fileChange/requestApproval","serverRequest/resolved","turn/completed"].includes(t.method)&&!(t.method==="item/completed"&&["commandExecution","fileChange"].includes(n.item?.type)))return;let r=new Map(oe([...this.rows]));if(t.id!==void 0&&["item/commandExecution/requestApproval","item/fileChange/requestApproval"].includes(t.method)){if(!Ue(t.id)||!G(n.turnId)||!G(n.itemId))throw Error("NATIVE_RECEIPT_INVALID");let o=this.key(n.threadId,t.id),d=r.get(o);if(d){if(d.request.method!==t.method||!(0,re.isDeepStrictEqual)(d.request.params,t.params))throw Error("NATIVE_RECEIPT_COLLISION");return}r.set(o,{request:t,resolved:null,completed:null,turnCompleted:null})}else for(let o of r.values()){let d=_(o.request.params);if(d.threadId===n.threadId){if(t.method==="serverRequest/resolved"&&n.requestId===o.request.id&&!o.resolved&&(o.resolved=t),t.method==="item/completed"&&n.turnId===d.turnId&&n.item?.id===d.itemId&&n.item.type===(o.request.method==="item/commandExecution/requestApproval"?"commandExecution":"fileChange")){let a=oe(t);if(delete _(_(a.params).item).aggregatedOutput,o.completed&&!(0,re.isDeepStrictEqual)(_(o.completed.params).item,_(a.params).item))throw Error("NATIVE_RECEIPT_COLLISION");o.completed??=a}if(t.method==="turn/completed"&&n.turn?.id===d.turnId){let a={method:t.method,params:{threadId:n.threadId,turn:{id:n.turn.id,status:n.turn.status}}};if(o.turnCompleted&&!(0,re.isDeepStrictEqual)(o.turnCompleted,a))throw Error("NATIVE_RECEIPT_COLLISION");o.turnCompleted??=a}}}if(Buffer.byteLength(JSON.stringify([...r]))>Le)throw Error("NATIVE_RECEIPT_WINDOW_FULL");this.rows=r}catch{this.invalidate()}}receipts(){if(this.unavailable)throw Error("NATIVE_RECEIPTS_UNAVAILABLE");return[...this.rows.values()].flatMap(e=>{if(!e.resolved||!e.completed||!e.turnCompleted)return[];let t=Fe({nativeInstanceId:this.instanceId,request:e.request,resolved:e.resolved,completed:e.completed,turnCompleted:e.turnCompleted});return[ut({...t,digest:Me(t)},this.instanceId)]})}acknowledge(e){let t=this.receipts().find(n=>n.digest===e);if(!t)throw Error("NATIVE_RECEIPT_ACK_INVALID");this.rows.delete(this.key(_(t.request.params).threadId,t.request.id))}},ae=class{constructor(e){this.window=e;this.current=null;this.sent=new Set;this.warned=!1;this.ready=!1}attach(e){this.current=e,this.sent.clear(),this.warned=!1,this.ready=!1}close(){this.current=null,this.sent.clear(),this.ready=!1}handle(e,t){let n=t;if(!n||!["CODEVIBE_NATIVE_RECEIPTS_POLL","CODEVIBE_NATIVE_RECEIPT_ACK"].includes(String(n.type)))return!1;if(e!==this.current||n.instanceId!==this.window.instanceId||e.connected!==!0)return!0;if(n.type==="CODEVIBE_NATIVE_RECEIPTS_POLL")this.ready=!0,this.flush();else if(typeof n.digest=="string"&&this.sent.has(n.digest)&&typeof n.consumed=="boolean"){if(n.consumed)try{this.window.acknowledge(n.digest)}catch{this.window.invalidate()}this.sent.delete(n.digest)}return!0}flush(){let e=this.current;if(!(!this.ready||!e||e.connected!==!0)){if(this.window.isUnavailable){this.warned||(this.warned=!0,this.send(e,{type:"CODEVIBE_NATIVE_RECEIPTS_UNAVAILABLE",instanceId:this.window.instanceId}));return}try{for(let t of this.window.receipts())this.sent.has(t.digest)||(this.sent.add(t.digest),this.send(e,{type:"CODEVIBE_NATIVE_RECEIPT",instanceId:this.window.instanceId,receipt:t}))}catch{this.window.invalidate(),this.flush()}}}send(e,t){try{e.send(t,n=>{n&&this.current===e&&this.window.invalidate()})}catch{this.current===e&&this.window.invalidate()}}};var ht=i=>new Promise(e=>setTimeout(e,i)),Xe=1e4;async function he(i,e,t=n=>console.error("CodeVibe: native startup failed",n)){let n=Date.now();try{return await e()}catch(r){try{t({stage:i,elapsedMs:Date.now()-n,code:r instanceof v?r.code:"NATIVE_STARTUP_FAILED",...r instanceof v&&r.diagnostic?{diagnostic:r.diagnostic}:{}})}catch{}throw r}}var C=i=>!i.pid||i.exitCode!==null||i.signalCode!==null;async function q(i,e){return C(i)?!0:new Promise(t=>{let n=setTimeout(()=>o(!1),e);n.unref();let r=()=>o(!0),o=d=>{clearTimeout(n),i.off("close",r),t(d)};i.once("close",r)})}async function He(i,e,t){for(let n of(e.PATH??"").split(y.delimiter).filter(Boolean)){let r=y.resolve(t,n,i);try{await c.promises.access(r,c.constants.X_OK);let o=await c.promises.realpath(r);if((await c.promises.stat(o)).isFile())return o}catch{}}throw Error(i==="codex"?"Codex executable not found;install Codex,then retry.":"tmux executable not found;install tmux,then retry.")}var me=(i,e)=>He("codex",i,e);function fe(i){let e={...i};return delete e.CODEVIBE_CODEX_TMUX_SESSION,delete e.CODEVIBE_CODEX_PRIMARY_COMPANION,delete e.QUORUM_REVIEWER_SUBPROCESS,e}async function ve(i,e=process.env){let t=e.TMUX?.split(",")[0];if(!t||!y.isAbsolute(t)||!process.stdin.isTTY||!process.stdout.isTTY)throw Error("Native Companion requires its terminal launcher.");let n=await c.promises.mkdtemp(y.join(await c.promises.realpath("/tmp"),"cvcd-")),r=await c.promises.lstat(n),o=(0,B.randomUUID)(),d={root:n,dev:r.dev,ino:r.ino,uid:r.uid,instanceId:o,pid:process.pid};await c.promises.writeFile(n+"/OWNER.json",JSON.stringify(d),{flag:"wx",mode:384});let a=await c.promises.open(n+"/lifecycle.jsonl","wx",384),s=(p,b={})=>a.appendFile(JSON.stringify({utc:new Date().toISOString(),kind:p,...b})+`
3
+ `);await s("RESOURCE",d);let l,u,f,N,E,h=new se(o),m=new ae(h),g=null,w=!1,Q=0,M=!1,J=null,P=[],Z=async()=>{let p=await c.promises.lstat(n);if(!p.isDirectory()||p.isSymbolicLink()||p.dev!==r.dev||p.ino!==r.ino||p.uid!==r.uid||JSON.parse(await c.promises.readFile(n+"/OWNER.json","utf8")).instanceId!==o)throw Error("NATIVE_LAUNCH_ROOT_CHANGED")};try{let p=await me(e,process.cwd()),b=fe(e),S=(0,x.spawn)(p,["--version"],{env:b,stdio:["ignore","pipe","pipe"]});P.push(S),S.on("error",()=>{}),await s("VERSION_PROCESS",{pid:S.pid,executable:p});let X="",W="";if(S.stdout.on("data",T=>{X=(X+T.toString()).slice(0,1025)}),S.stderr.on("data",T=>{W=(W+T.toString()).slice(0,65537)}),!await q(S,1e4)||S.exitCode!==0||X.length>1024||W.length>64*1024)throw Error("NATIVE_VERSION_UNAVAILABLE");let I=Ce(X,i,process.cwd(),n+"/native.sock");I.workingDirectory=await c.promises.realpath(I.workingDirectory),g=I.resumeThreadId;let Ee=(0,B.createHash)("sha256").update(await c.promises.readFile(p)).digest("hex");await s("PLAN",{nativeVersion:X.trim(),cli:p,cliSha256:Ee,argvSha256:(0,B.createHash)("sha256").update(JSON.stringify(i)).digest("hex")}),await c.promises.mkdir(n+"/tmp",{mode:448});let Ie={...b,TMPDIR:n+"/tmp"},Ne=(0,c.openSync)(n+"/native.log","wx",384);l=(0,x.spawn)(p,I.appServerArgs,{cwd:I.workingDirectory,env:Ie,detached:!0,stdio:["pipe","ignore",Ne]}),l.on("error",()=>{}),(0,c.closeSync)(Ne),P.push(l),await s("NATIVE_SERVER",{pid:l.pid});let Qe=Date.now()+2e3,we=!1;for(;Date.now()<Qe&&!C(l);){try{await c.promises.lstat(n+"/native.sock"),we=!0;break}catch(T){if(T.code!=="ENOENT")throw T}await ht(20)}if(!we||!l.pid)throw Error("NATIVE_LISTENER_UNAVAILABLE");let de=await Ve(n+"/native.sock",r);if(J=de.socketPath,I.resumeThreadId){N=new Y({...de,instanceId:o,pluginVersion:"launcher",assertOwner:()=>{if(!l||C(l))throw Error("NATIVE_OWNER_ENDED")},onMessage:()=>{},onFailure:()=>{}}),await he("connect",()=>N.connect());let T=await he("resume",()=>N.request("thread/resume",{threadId:I.resumeThreadId,excludeTurns:!0,...I.policy,...I.model!==null?{model:I.model}:{},...I.cwdOverride?{cwd:I.workingDirectory}:{}},Xe));if(T?.thread?.id!==I.resumeThreadId||I.policy.approvalPolicy&&T.approvalPolicy!==I.policy.approvalPolicy||I.policy.sandbox&&T.sandbox?.type!=={"read-only":"readOnly","workspace-write":"workspaceWrite","danger-full-access":"dangerFullAccess"}[I.policy.sandbox])throw Error("NATIVE_RESUME_POLICY_MISMATCH");await N.close(),N=void 0}let Ze={version:1,instanceId:o,root:{path:n,dev:r.dev,ino:r.ino,uid:r.uid},launcher:{pid:process.pid,host:Be.hostname()},server:{pid:l.pid},endpoint:de,plan:I};await c.promises.writeFile(n+"/launch.json",JSON.stringify(Ze),{flag:"wx",mode:384});try{let T=await ke(n+"/launch.json",o);E=new ne({authority:T,pluginVersion:"launcher-receipts",onRoot:async k=>{g=k.id},onMessage:async k=>{h.observe(k),m.flush(),k.method==="thread/status/changed"&&await E.refreshMetadata()},onFailure:()=>{h.invalidate(),m.flush()}}),await E.start()}catch{h.invalidate(),await E?.close().catch(()=>{}),E=void 0,console.error("CodeVibe: native receipt recovery unavailable;desktop Codex remains independent.")}let ge=T=>{let k=(0,c.openSync)(n+"/observer.log","a",384),V=(0,x.fork)(y.join(__dirname,"server.js"),[],{cwd:I.workingDirectory,detached:!0,stdio:["ignore",k,k,"ipc"],env:{...b,TMPDIR:n+"/tmp",CODEX_WORKING_DIRECTORY:I.workingDirectory,CODEVIBE_CODEX_TMUX_SESSION:"native-"+o,CODEVIBE_CODEX_NATIVE_DESCRIPTOR:n+"/launch.json",CODEVIBE_CODEX_NATIVE_INSTANCE:o,CODEVIBE_CODEX_DAEMON_RECOVERY:T?"1":"0",CODEVIBE_CODEX_NATIVE_THREAD:T?g??"":""}});(0,c.closeSync)(k),P.push(V),s("OBSERVER",{pid:V.pid,recovery:T}).catch(()=>{}),m.attach(V),V.on("error",()=>{});let Ae,$e=new Promise(ce=>{Ae=ce});return V.on("message",ce=>{let U=ce;U?.instanceId===o&&(m.handle(V,U)||V===f&&(U.type==="CODEVIBE_NATIVE_READY"&&(Ae(),m.handle(V,{type:"CODEVIBE_NATIVE_RECEIPTS_POLL",instanceId:o})),U.type==="CODEVIBE_NATIVE_BOUND"&&typeof U.threadId=="string"&&(g=U.threadId),U.type==="CODEVIBE_NATIVE_OBSERVER_DEGRADED"&&!C(V)&&V.kill("SIGTERM"),U.type==="CODEVIBE_NATIVE_MOBILE_END"&&u&&!C(u)&&u.kill("SIGTERM")))}),V.on("exit",()=>{if(!w&&u&&!C(u))if(g&&Q++===0)try{f=ge(!0).child}catch{console.error("CodeVibe: mobile observer restart failed;desktop remains available.")}else console.error("CodeVibe: mobile sync unavailable;desktop Codex remains available.")}),{child:V,initialized:$e}},ye=ge(!1);if(f=ye.child,await Promise.race([ye.initialized,q(f,1e4)]),C(f)&&console.error("CodeVibe: mobile sync unavailable;desktop Codex remains available."),await Z(),(0,B.createHash)("sha256").update(await c.promises.readFile(p)).digest("hex")!==Ee)throw Error("NATIVE_EXECUTABLE_CHANGED");u=(0,x.spawn)(p,I.tuiArgs,{cwd:I.workingDirectory,env:Ie,stdio:"inherit"}),P.push(u);let Te=new Promise((T,k)=>{u.once("error",k),u.once("close",()=>T())});Te.catch(()=>{}),await s("FRONTEND",{pid:u.pid});let _e=()=>{},$=()=>{u&&!C(u)&&u.kill("SIGTERM")};if(process.on("SIGINT",_e),process.on("SIGTERM",$),process.on("SIGHUP",$),await Te,process.off("SIGINT",_e),process.off("SIGTERM",$),process.off("SIGHUP",$),w=!0,await s("FRONTEND_ENDED",{code:u.exitCode,signal:u.signalCode}),f&&!C(f)&&f.connected&&f.send({type:"CODEVIBE_NATIVE_TERMINAL_END",instanceId:o}),!(!f||await q(f,29e3)))throw Error("NATIVE_OBSERVER_TEARDOWN_INCOMPLETE");return(u.exitCode??1)||(f?.exitCode??0)}finally{if(w=!0,await N?.close().catch(()=>{}),m.close(),await E?.close().catch(()=>{}),u&&!C(u))await s("RETAINED_FRONTEND",{pid:u.pid});else{f&&!C(f)&&(f.kill("SIGTERM"),await q(f,29e3)),l&&!C(l)&&(l.stdin?.end(),await q(l,2e3)||(l.kill("SIGTERM"),await q(l,5e3)));for(let p of P)p!==l&&p!==f&&!C(p)&&(p.kill("SIGTERM"),await q(p,2e3));if(M=P.every(C),J)try{await c.promises.lstat(J),M=!1}catch(p){if(p.code!=="ENOENT")throw p}}if(await s("CLEANUP",{allCreatedChildrenEnded:M,children:P.map(p=>({pid:p.pid,code:p.exitCode,signal:p.signalCode}))}),await a.close(),M){await Z();let p=0,b=async S=>{for(let X of await c.promises.readdir(S)){if(++p>4096)throw Error("NATIVE_ROOT_CLEANUP_INVENTORY_EXCEEDED");let W=y.join(S,X),I=await c.promises.lstat(W);if(I.isDirectory()&&!I.isSymbolicLink())await b(W);else if(!I.isFile()&&!I.isSocket()&&!I.isSymbolicLink())throw Error("NATIVE_ROOT_CLEANUP_TYPE_CHANGED")}};await b(n),await c.promises.rm(n,{recursive:!0})}else{console.error("CodeVibe: teardown incomplete;owned recovery files retained at "+n);for(let p of P)C(p)||(p.unref(),p.stdin?.destroy(),p.stdout?.destroy(),p.stderr?.destroy(),p.connected&&p.disconnect());throw Error("NATIVE_LAUNCH_CLEANUP_INCOMPLETE")}}}function qe(i){return i.isFile()&&!i.isSymbolicLink()&&i.nlink===1&&(i.mode&63)===0&&i.uid===process.getuid?.()}async function ze(i,e,t){if(!y.isAbsolute(i)||y.normalize(i)!==i||y.basename(i)!=="bootstrap.json")throw Error("NATIVE_TMUX_BOOTSTRAP_INVALID");let n=y.dirname(i),r=await c.promises.open(i,c.constants.O_RDONLY|c.constants.O_NOFOLLOW),o;try{let d=await r.stat();if(!qe(d)||d.size>2*1024*1024)throw Error("NATIVE_TMUX_BOOTSTRAP_INVALID");o=JSON.parse(await r.readFile("utf8"));let a=await r.stat();if(d.dev!==a.dev||d.ino!==a.ino||d.size!==a.size||d.mtimeMs!==a.mtimeMs||o.version!==1||o.nonce!==e||o.root?.path!==n||!Array.isArray(o.args)||!o.args.every(u=>typeof u=="string")||!o.environment||typeof o.environment!="object"||Array.isArray(o.environment)||!Object.values(o.environment).every(u=>typeof u=="string"))throw Error("NATIVE_TMUX_BOOTSTRAP_INVALID");let s=await c.promises.lstat(n);if(!s.isDirectory()||s.isSymbolicLink()||(s.mode&63)!==0||s.uid!==process.getuid?.()||s.dev!==o.root.dev||s.ino!==o.root.ino||s.uid!==o.root.uid)throw Error("NATIVE_TMUX_BOOTSTRAP_INVALID");let l=await c.promises.open(n+"/status",c.constants.O_WRONLY|c.constants.O_NOFOLLOW);try{let u=await l.stat(),f=(await c.promises.readdir(n)).sort();if(!qe(u)||u.size!==0||u.dev!==o.status?.dev||u.ino!==o.status?.ino||f.join(",")!=="bootstrap.json,status")throw Error("NATIVE_TMUX_BOOTSTRAP_INVALID");let N=await c.promises.lstat(n),E=await c.promises.lstat(i),h=await c.promises.lstat(n+"/status");if(N.dev!==s.dev||N.ino!==s.ino||E.dev!==d.dev||E.ino!==d.ino||h.dev!==u.dev||h.ino!==u.ino)throw Error("NATIVE_TMUX_BOOTSTRAP_INVALID");await c.promises.unlink(i),await c.promises.unlink(n+"/status"),await c.promises.rmdir(n);let m={...o.environment};return delete m.TMUX,delete m.TMUX_PANE,t.TMUX&&(m.TMUX=t.TMUX),t.TMUX_PANE&&(m.TMUX_PANE=t.TMUX_PANE),{args:o.args,environment:m,status:l}}catch(u){throw await l.close(),u}}finally{await r.close()}}var mt=i=>"'"+i.split("'").join("'\\''")+"'";function Ge(i){let e=Number(i.slice(0,-1));return Number.isInteger(e)&&e>=0&&e<=255&&i===String(e)+`
4
+ `?e:null}function We(i){let e=i;return e?.code===1&&typeof e.stderr=="string"&&(e.stderr.startsWith("can't find session:")||e.stderr.startsWith("no server running on ")||e.stderr.startsWith("error connecting to ")&&(e.stderr.includes("No such file or directory")||e.stderr.includes("Connection refused")))}async function Ye(i,e){let t=i.TMUX_TMPDIR?await c.promises.realpath(i.TMUX_TMPDIR):e,n=y.join(t,"tmux-"+process.getuid?.());try{await c.promises.mkdir(n,{mode:448})}catch(o){if(o.code!=="EEXIST")throw o}let r=await c.promises.lstat(n);if(!r.isDirectory()||r.isSymbolicLink()||r.uid!==process.getuid?.()||(r.mode&63)!==0)throw Error("NATIVE_TMUX_NAMESPACE_UNSAFE");return y.join(n,"default")}async function Ke(i,e=process.env){if(["--version","-v","--help","-h"].includes(i[0])||e.CODEVIBE_COMPANION_DIAGNOSTIC==="version"){let h=await me(e,process.cwd());e.CODEVIBE_COMPANION_DIAGNOSTIC==="version"&&console.log("codevibe companion codex "+je().version);let m=(0,x.spawn)(h,e.CODEVIBE_COMPANION_DIAGNOSTIC==="version"?["--version"]:i,{env:fe(e),stdio:"inherit"});return new Promise(g=>{m.once("error",()=>g(127)),m.once("close",w=>g(w??1))})}if(e.TMUX)return ve(i,e);if(!process.stdin.isTTY||!process.stdout.isTTY)throw Error("Codex Companion requires an interactive terminal;use plain codex for non-interactive commands.");let t=await He("tmux",e,process.cwd()),n=await c.promises.realpath("/tmp"),r=await Ye(e,n),o={...e};delete o.TMUX,delete o.TMUX_PANE;let d=(0,Je.promisify)(x.execFile),a="codevibe-codex-"+process.pid+"-"+(0,B.randomUUID)().slice(0,8),s=await c.promises.mkdtemp(n+"/cvcd-tmux-"),l=await c.promises.lstat(s),u=(0,B.randomUUID)(),f,N=!1,E=[process.execPath,y.join(__dirname,"native-launch.js"),"--native-bootstrap",s+"/bootstrap.json",u].map(mt).join(" ");try{f=await c.promises.open(s+"/status","wx+",384);let h=await f.stat(),m={version:1,nonce:u,root:{path:s,dev:l.dev,ino:l.ino,uid:l.uid},status:{dev:h.dev,ino:h.ino},args:i,environment:Object.fromEntries(Object.entries(e).filter(b=>typeof b[1]=="string"))};await c.promises.writeFile(s+"/bootstrap.json",JSON.stringify(m),{flag:"wx",mode:384});let g=["-x",String(process.stdout.columns||120),"-y",String(process.stdout.rows||40)];await d(t,["-S",r,"new-session","-d","-s",a,"-c",process.cwd(),...g,"exec "+E],{env:o,timeout:1e4}),N=!0,await d(t,["-S",r,"set-option","-t",a,"mouse","on"],{env:o,timeout:1e4}).catch(()=>{});let w=(0,x.spawn)(t,["-S",r,"attach-session","-t",a],{env:o,stdio:"inherit"}),Q=()=>{};process.on("SIGINT",Q);let M;try{M=await new Promise(b=>{w.once("error",()=>b(1)),w.once("close",S=>b(S??1))})}finally{process.off("SIGINT",Q)}let J=Buffer.alloc(16),P=await f.read(J,0,J.length,0),Z=J.subarray(0,P.bytesRead).toString(),p=Ge(Z);if(p!==null)return p;try{return await d(t,["-S",r,"has-session","-t",a],{env:o,timeout:1e4}),M}catch{return M||1}}finally{if(await f?.close(),!N){let h=!1;try{await d(t,["-S",r,"has-session","-t",a],{env:o,timeout:1e4})}catch(m){h=We(m)}if(h){let m=await c.promises.lstat(s);if(m.dev!==l.dev||m.ino!==l.ino)throw Error("NATIVE_TMUX_BOOTSTRAP_INVALID");let g=await c.promises.readdir(s);if(g.some(w=>!["bootstrap.json","status"].includes(w))||g.includes("bootstrap.json")&&JSON.parse(await c.promises.readFile(s+"/bootstrap.json","utf8")).nonce!==u)throw Error("NATIVE_TMUX_BOOTSTRAP_INVALID");for(let w of g)await c.promises.unlink(s+"/"+w);await c.promises.rmdir(s)}else console.error("CodeVibe: launcher setup incomplete;recovery files retained at "+s)}}}async function ft(){let i=process.argv.slice(2);if(i[0]!=="--native-bootstrap")return Ke(i);if(i.length!==3)throw Error("NATIVE_TMUX_BOOTSTRAP_INVALID");let e=await ze(i[1],i[2],process.env),t=1;try{return t=await ve(e.args,e.environment),t}finally{await e.status.writeFile(String(t)+`
5
+ `),await e.status.close()}}require.main===module&&ft().then(i=>{process.exitCode=i},i=>{console.error(i instanceof Error?i.message:"Native launch failed"),process.exitCode=1});0&&(module.exports={NATIVE_STARTUP_RESUME_TIMEOUT_MS,consumeTmuxBootstrap,findNativeCodex,launchNativeCompanion,launchNativeInsideTmux,missingTmuxSession,nativeChildEnvironment,nativeExitStatus,nativeStartupStep,nativeTmuxSocket,waitExit});