@ev-ai/agent-hook 1.2.6 → 1.2.8

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.
@@ -1,5 +1,5 @@
1
- import{createHash as pt}from"node:crypto";import{join as W}from"node:path";var M="signed-hook-v1",xe=Buffer.from("ev-ai-hook-release-v1\0","utf8"),D=32;var Xe=64,Q=64;import{sign as Eo,verify as cr}from"node:crypto";var Yt=/^[A-Za-z0-9+/]+=*$/;function O(e){if(e.length===0||!Yt.test(e))return;let t=Buffer.from(e,"base64");if(t.toString("base64")===e)return t}import{createPrivateKey as oo,createPublicKey as Wt,timingSafeEqual as io}from"node:crypto";var Xt=Buffer.from("302a300506032b6570032100","hex"),ao=Buffer.from("302e020100300506032b657004220420","hex");function qt(e){let t=Buffer.from(e,"base64");if(t.byteLength!==D||t.toString("base64")!==e)throw new Error("invalid production public key");return t}var Z=Object.freeze({"release-key-1":qt("jVk7k2gEEcdAiPOFtNZomu36bOpfkk0vgF9dC6FMcS0=")});function qe(e){if(e.byteLength!==D)throw new Error("Ed25519 public key must be 32 bytes");return Wt({key:Buffer.concat([Xt,Buffer.from(e)]),format:"der",type:"spki"})}function Qe(e,t){if(!Object.hasOwn(e,t))return;let r=e[t];if(r?.byteLength===D)return r}var m={UNKNOWN_FORMAT:"unknown_format",UNKNOWN_KEY:"unknown_key",NON_CANONICAL_BASE64:"non_canonical_base64",INVALID_SIGNATURE_LENGTH:"invalid_signature_length",SIGNATURE_INVALID:"signature_invalid",TRAILING_BYTES:"trailing_bytes",UNKNOWN_FIELD:"unknown_field",DUPLICATE_FIELD:"duplicate_field",MISSING_FIELD:"missing_field",INVALID_TYPE:"invalid_type",INVALID_VERSION:"invalid_version",INVALID_URL:"invalid_url",URL_VERSION_MISMATCH:"url_version_mismatch",INVALID_SHA512:"invalid_sha512",INVALID_SIZE:"invalid_size",INVALID_NODE_ENGINE:"invalid_node_engine",INVALID_PROTOCOL:"invalid_protocol",INVALID_PACKAGE:"invalid_package",INVALID_JSON:"invalid_json",INVALID_ENVELOPE:"invalid_envelope",INVALID_KEY_ID:"invalid_key_id"},$={SIZE_MISMATCH:"size_mismatch",HASH_MISMATCH:"hash_mismatch"};function Ze(e){let t;try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return{ok:!1,reason:m.INVALID_JSON}}return Qt(t)}function Qt(e){if(e.length===0)return{ok:!1,reason:m.INVALID_JSON};if(e.trimStart()!==e||e.trimEnd()!==e)return{ok:!1,reason:m.TRAILING_BYTES};let t=new Ae(e);try{let r=t.parseValue();return t.atEnd()?{ok:!0,value:r}:{ok:!1,reason:m.TRAILING_BYTES}}catch(r){return r instanceof ee?{ok:!1,reason:m.DUPLICATE_FIELD}:{ok:!1,reason:m.INVALID_JSON}}}var ee=class extends Error{constructor(){super("duplicate field")}},Ae=class{text;i=0;constructor(t){this.text=t}atEnd(){return this.i>=this.text.length}parseValue(){this.skipWs();let t=this.text[this.i];if(t==="{")return this.parseObject();if(t==="[")return this.parseArray();if(t==='"')return this.parseString();if(t==="t"||t==="f"||t==="n")return this.parseLiteral();if(t==="-"||t!==void 0&&t>="0"&&t<="9")return this.parseNumber();throw new SyntaxError("invalid json")}skipWs(){let{text:t}=this;for(;this.i<t.length;){let r=t.charCodeAt(this.i);if(r!==32&&r!==10&&r!==13&&r!==9)break;this.i+=1}}parseObject(){this.expect("{"),this.skipWs();let t=Object.create(null),r=new Set;if(this.text[this.i]==="}")return this.i+=1,t;for(;;){if(this.skipWs(),this.text[this.i]!=='"')throw new SyntaxError("expected key");let n=this.parseString();if(r.has(n))throw new ee;r.add(n),this.skipWs(),this.expect(":"),t[n]=this.parseValue(),this.skipWs();let o=this.text[this.i];if(o===","){this.i+=1;continue}if(o==="}")return this.i+=1,t;throw new SyntaxError("expected comma or end of object")}}parseArray(){this.expect("["),this.skipWs();let t=[];if(this.text[this.i]==="]")return this.i+=1,t;for(;;){t.push(this.parseValue()),this.skipWs();let r=this.text[this.i];if(r===","){this.i+=1;continue}if(r==="]")return this.i+=1,t;throw new SyntaxError("expected comma or end of array")}}parseString(){this.expect('"');let{text:t}=this,r="";for(;this.i<t.length;){let n=t.charCodeAt(this.i);if(n===34)return this.i+=1,r;if(n===92){this.i+=1,r+=this.parseEscape();continue}if(n<32)throw new SyntaxError("unescaped control");r+=t[this.i],this.i+=1}throw new SyntaxError("unterminated string")}parseEscape(){let t=this.text[this.i];if(t===void 0)throw new SyntaxError("unterminated escape");switch(this.i+=1,t){case'"':case"\\":case"/":return t;case"b":return"\b";case"f":return"\f";case"n":return`
2
- `;case"r":return"\r";case"t":return" ";case"u":{let r=this.text.slice(this.i,this.i+4);if(!/^[0-9a-fA-F]{4}$/.test(r))throw new SyntaxError("invalid unicode escape");return this.i+=4,String.fromCharCode(Number.parseInt(r,16))}default:throw new SyntaxError("invalid escape")}}parseLiteral(){if(this.text.startsWith("true",this.i))return this.i+=4,!0;if(this.text.startsWith("false",this.i))return this.i+=5,!1;if(this.text.startsWith("null",this.i))return this.i+=4,null;throw new SyntaxError("invalid literal")}parseNumber(){let t=this.i,{text:r}=this;if(r[this.i]==="-"&&(this.i+=1),r[this.i]==="0")this.i+=1;else if(this.isDigit(r[this.i]))for(;this.isDigit(r[this.i]);)this.i+=1;else throw new SyntaxError("invalid number");if(r[this.i]==="."){if(this.i+=1,!this.isDigit(r[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(r[this.i]);)this.i+=1}if(r[this.i]==="e"||r[this.i]==="E"){if(this.i+=1,(r[this.i]==="+"||r[this.i]==="-")&&(this.i+=1),!this.isDigit(r[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(r[this.i]);)this.i+=1}let n=Number(r.slice(t,this.i));if(!Number.isFinite(n))throw new SyntaxError("invalid number");return n}expect(t){if(this.text[this.i]!==t)throw new SyntaxError(`expected ${t}`);this.i+=1}isDigit(t){return t!==void 0&&t>="0"&&t<="9"}};var tt=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],Zt=new Set(tt),er=/^\d+\.\d+\.\d+$/,tr=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,rr=/^[@A-Za-z0-9._/~-]{1,214}$/;function Oe(e){let t=Ze(e);return t.ok?nr(t.value):t}function nr(e){if(!ve(e))return{ok:!1,reason:m.INVALID_JSON};for(let l of Object.keys(e))if(!Zt.has(l))return{ok:!1,reason:m.UNKNOWN_FIELD};for(let l of tt)if(!(l in e))return{ok:!1,reason:m.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!rr.test(t)||t.includes(".."))return{ok:!1,reason:m.INVALID_PACKAGE};let r=e.version;if(typeof r!="string"||!er.test(r))return{ok:!1,reason:m.INVALID_VERSION};let n=e.url;if(typeof n!="string")return{ok:!1,reason:m.INVALID_URL};let o=or(n,r);if(o!==void 0)return{ok:!1,reason:o};let s=e.sha512;if(typeof s!="string")return{ok:!1,reason:m.INVALID_SHA512};if(O(s)?.byteLength!==Q)return{ok:!1,reason:m.INVALID_SHA512};let c=e.size;if(typeof c!="number"||!Number.isInteger(c)||c<1||c>4194304)return{ok:!1,reason:m.INVALID_SIZE};let i=e.node_engine;if(typeof i!="string"||tr.exec(i)===null)return{ok:!1,reason:m.INVALID_NODE_ENGINE};let u=e.min_launcher_protocol;return typeof u!="number"||!Number.isInteger(u)||u<1||!Number.isSafeInteger(u)?{ok:!1,reason:m.INVALID_PROTOCOL}:{ok:!0,manifest:{package:t,version:r,url:n,sha512:s,size:c,node_engine:i,min_launcher_protocol:u}}}function ve(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function or(e,t){if(e.includes("..")||/%2e/i.test(e)||/[\\?#]/.test(e))return m.INVALID_URL;let r;try{r=new URL(e)}catch{return m.INVALID_URL}if(r.href!==e)return m.INVALID_URL;if(!sr(r))return m.INVALID_URL;if(r.username!==""||r.password!=="")return m.INVALID_URL;if(r.search!==""||r.hash!=="")return m.INVALID_URL;if(r.hostname===""||r.pathname.includes(".."))return m.INVALID_URL;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(r.pathname)?.[1];if(o===void 0)return m.INVALID_URL;if(o!==t)return m.URL_VERSION_MISMATCH}var ir=new Set(["localhost","127.0.0.1","[::1]"]);function sr(e){return e.protocol==="https:"?!0:e.protocol==="http:"?ir.has(e.hostname):!1}var ur=["format","key_id","payload","signature"],lr=/^[A-Za-z0-9._-]{1,128}$/;function fr(e,t){return Buffer.concat([xe,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function v(e,t){if(!ve(e))return{ok:!1,reason:m.INVALID_ENVELOPE};if(e.format!==M)return{ok:!1,reason:m.UNKNOWN_FORMAT};for(let l of Object.keys(e))if(l!=="format"&&l!=="key_id"&&l!=="payload"&&l!=="signature")return{ok:!1,reason:m.UNKNOWN_FIELD};for(let l of ur)if(!(l in e))return{ok:!1,reason:m.MISSING_FIELD};let n=e.key_id;if(typeof n!="string"||!lr.test(n))return{ok:!1,reason:m.INVALID_KEY_ID};let o=Qe(t,n);if(o===void 0)return{ok:!1,reason:m.UNKNOWN_KEY};let s=e.payload,a=e.signature;if(typeof s!="string"||typeof a!="string")return{ok:!1,reason:m.INVALID_ENVELOPE};let c=O(s),i=O(a);if(c===void 0||i===void 0)return{ok:!1,reason:m.NON_CANONICAL_BASE64};if(i.byteLength!==Xe)return{ok:!1,reason:m.INVALID_SIGNATURE_LENGTH};let u=!1;try{u=cr(null,fr(n,c),qe(o),i)}catch{u=!1}return u?Oe(c):{ok:!1,reason:m.SIGNATURE_INVALID}}import{createHash as dr,timingSafeEqual as pr}from"node:crypto";function te(e,t){if(e.byteLength!==t.size)return{ok:!1,reason:$.SIZE_MISMATCH};let r=O(t.sha512);if(r?.byteLength!==Q)return{ok:!1,reason:$.HASH_MISMATCH};let n=dr("sha512").update(e).digest();return n.byteLength!==r.byteLength||!pr(n,r)?{ok:!1,reason:$.HASH_MISMATCH}:{ok:!0}}var mr=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,hr=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,gr=/^v?(\d+)\.(\d+)\.(\d+)/;function rt(e){let t=mr.exec(e);if(t)return{...Ne(t),prerelease:t[4]?.split(".")}}function nt(e,t){let r=rt(e),n=rt(t);if(!(!r||!n))return r.major!==n.major?r.major-n.major:r.minor!==n.minor?r.minor-n.minor:r.patch!==n.patch?r.patch-n.patch:yr(r.prerelease,n.prerelease)}function re(e,t){let r=nt(e,t);return r!==void 0&&r>=0}function _r(e){let t=hr.exec(e.trim());return t?Ne(t):void 0}function Ne(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function ne(e,t){let r=_r(t),n=gr.exec(e.trim()),o=n?Ne(n):void 0;return!r||!o?!1:o.major!==r.major?o.major>r.major:o.minor!==r.minor?o.minor>r.minor:o.patch>=r.patch}function yr(e,t){if(e===void 0&&t===void 0)return 0;if(e===void 0)return 1;if(t===void 0)return-1;let r=Math.max(e.length,t.length);for(let n=0;n<r;n++){let o=e[n],s=t[n];if(o===void 0)return-1;if(s===void 0)return 1;let a=kr(o,s);if(a!==0)return a}return 0}function kr(e,t){let r=/^\d+$/.test(e),n=/^\d+$/.test(t);if(r&&n){let o=Number(e)-Number(t);return o<0?-1:o>0?1:0}return r?-1:n?1:e<t?-1:e>t?1:0}var ot="EV_AI_LAUNCHER_REFRESH_SCOPE",it="EV_AI_HOOK_UPDATE_TTL_MIN",st="--defer-user-spec",$o=Buffer.from([1]);var Go=1024*1024,Jo=4*1024*1024,Yo=64*1024,zo=64*1024,Wo=64*1024;var U=21600,Ie=604800,at=3e5,Pe=4096,Fe=4*1024*1024;import{randomBytes as Sr}from"node:crypto";import{basename as Er,dirname as br,join as Le}from"node:path";import{open as ct,mkdir as wr,readFile as xr,readdir as Ar,rename as Or,stat as vr,rmdir as Nr,unlink as Ir,utimes as Pr}from"node:fs/promises";var oe=new WeakMap;function Me(e){if(e&&typeof e=="object"&&"code"in e)return e}function R(e){return Me(e)?.code==="ENOENT"}function De(e){return Me(e)?.code==="EEXIST"}function Fr(e){let t=Me(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function E(e,t){try{return await e.readdir(t)}catch(r){if(R(r))return[];throw r}}async function G(e,t){try{await e.unlink(t)}catch(r){if(!R(r))throw r}}async function ie(e,t,r){let n=await e.open(t,"wx");try{await e.write(n,r),await e.fsync(n)}finally{await e.close(n)}}function Ue(){return Sr(8).toString("hex")}function Lr(e){return e.startsWith(".")}async function J(e,t,r){let n=await E(e,t);await Promise.all(n.map(async o=>{if(!Lr(o))return;let s=Le(t,o);try{let a=await e.stat(s);r-a.mtimeMs>36e5&&await e.unlink(s)}catch(a){if(!R(a))throw a}}))}async function N(e,t,r){let n=br(t),o=Ue(),s=`.${Er(t)}.`,a=Le(n,`${s}${o}`),c=()=>e.unlink(a).catch(()=>{});await ie(e,a,r);try{await e.rename(a,t)}catch(i){if(!Fr(i))throw await c(),i;let u=Le(n,`${s}bad.${o}`);try{await e.rename(t,u)}catch(l){if(!R(l))throw await c(),l}await e.rename(a,t)}await e.fsyncDir(n)}function I(){return{async open(e,t){let r=await ct(e,t),n={path:e};return oe.set(n,r),n},async write(e,t){let r=ut(e),n=typeof t=="string"?Buffer.from(t,"utf8"):t;await r.write(n)},async fsync(e){await ut(e).sync()},async close(e){let t=oe.get(e);oe.delete(e),t&&await t.close()},rename:Or,async readdir(e){return Ar(e)},readFile:xr,async stat(e){let t=await vr(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await wr(e,t)},unlink:Ir,rmdir:Nr,utimes:Pr,async fsyncDir(e){if(process.platform==="win32")return;let t=await ct(e,"r");try{await t.sync()}finally{await t.close()}}}}function ut(e){let t=oe.get(e);if(!t)throw new Error("closed");return t}function _(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ft=Object.freeze({"test-key-1":lt("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":lt("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function lt(e){let t=Buffer.from(e,"base64");if(t.byteLength!==D||t.toString("base64")!==e)throw new Error("invalid test public key");return t}function T(e){return e?{...ft,...Z}:Z}import{join as Y}from"node:path";function Te(e){return Y(e,".ev-ai","agent-hook","js","signed-v1")}function He(e){return Y(Te(e),"scopes")}function b(e,t){return Y(He(e),t)}function w(e){return Y(e,"attempts")}function se(e){return Y(e,"scope.json")}function Ce(e){return String(e).padStart(10,"0")}var Mr=64;function x(e,t){return W(Te(e),t?"dev-artifacts":"artifacts")}function Be(e,t){return W(e,t)}function S(e,t){return W(e,t,"hook.mjs")}function ae(e,t){return W(e,t,"release.json")}function Dr(e,t){return W(e,t,"health.json")}function P(e){return pt("sha512").update(e).digest("hex")}function Ve(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Mr||t.toString("base64")!==e))return t.toString("hex")}async function H(e,t,r){try{let n=await e.stat(t);return n.size<=0||n.size>Fe?"bad":P(await e.readFile(t))===r?"ok":"bad"}catch(n){if(R(n))return"missing";throw n}}async function C(e,t,r,n,o,s,a=process.version){let[c,i,u]=await Promise.all([dt(e,S(t,r)),dt(e,ae(t,r)),Ur(e,Dr(t,r))]);if(c===void 0)return{usable:!1,reason:"artifact_missing"};if(i===void 0)return{usable:!1,reason:"signature_invalid"};let l;try{l=JSON.parse(i.toString("utf8"))}catch{return{usable:!1,reason:"signature_invalid"}}let f=v(l,T(s));if(!f.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:d}=f;if(c.byteLength!==d.size||c.byteLength>Fe)return{usable:!1,reason:"hash_mismatch"};let p=pt("sha512").update(c).digest();if(p.toString("hex")!==r)return{usable:!1,reason:"hash_mismatch"};let h=Buffer.from(d.sha512,"base64");if(p.byteLength!==h.byteLength||!p.equals(h))return{usable:!1,reason:"hash_mismatch"};if(!re(d.version,n))return{usable:!1,reason:"below_floor"};if(!ne(a,d.node_engine))return{usable:!1,reason:"incompatible_node"};if(d.min_launcher_protocol>1)return{usable:!1,reason:"incompatible_protocol"};if(u?.quarantined_until){let g=Date.parse(u.quarantined_until);if(Number.isFinite(g)&&g>o)return{usable:!1,reason:"quarantined"}}return{usable:!0,manifest:d,healthFails:u?.consecutive_startup_failures??0}}async function dt(e,t){try{return await e.readFile(t)}catch(r){if(R(r))return;throw r}}async function Ur(e,t){try{let r=await e.readFile(t),n=JSON.parse(r.toString("utf8"));if(!_(n))return;let o=n.consecutive_startup_failures;if(typeof o!="number"||!Number.isInteger(o)||o<0)return;let s={consecutive_startup_failures:o};return typeof n.quarantined_until=="string"&&(s.quarantined_until=n.quarantined_until),s}catch{return}}import{join as mt}from"node:path";var Tr=/^(\d{10})$/,Hr=/^(\d{10})\.done$/,Cr=/^[0-9a-f]{128}$/,Br=64;function F(e){let t=e[it];if(t===void 0||t==="")return U;let r=Number(t);return!Number.isInteger(r)||r<=0?U:Math.min(Math.max(U,r*60),Ie)}async function y(e,t,r=!1){let n=w(t),o=await E(e,n),s=new Map,a=new Map,c=ht(o,Tr),i=ht(o,Hr),u=async d=>{let p=await _t(e,mt(n,ce(d)));return p&&s.set(d,{record:Kr(p.value),mtimeMs:p.mtimeMs}),p!==void 0},l=async d=>{let p=jr((await _t(e,mt(n,ue(d))))?.value);return p&&a.set(d,p),p!==void 0};if(!r)return await Promise.all([...c.map(u),...i.map(l)]),{claims:s,dones:a};await Promise.all([gt(c,u),gt(i,l)]);let f=A(s);return f<A(a)&&i.includes(f)&&await l(f),{claims:s,dones:a}}function ht(e,t){return e.flatMap(r=>{let n=t.exec(r);return n?[Number(n[1])]:[]})}async function gt(e,t){for(let r of[...e].sort((n,o)=>o-n))if(await t(r))return}function A(e){let t=0;for(let r of e.keys())r>t&&(t=r);return t}function L(e,t,r){let n=A(e.claims),o=A(e.dones),s=n===0?{kind:"uninitialized"}:{kind:"bundled",why:"bootstrap_failed"},a;if(o>0){let p=e.dones.get(o);p&&(s=p.selection,a=p.outcome)}let c=n>0?e.claims.get(n):void 0,i=c?Vr(c):void 0,u=n>0?e.dones.get(n):void 0,l=Ke(u?.interval_s,r),f=i!==void 0?i+l*1e3:void 0,d=i!==void 0&&i-t>at;return{latest:n,startMs:i,intervalS:l,deadlineMs:f,selection:s,lastOutcome:a,futureDated:d,highestDone:o}}function Vr(e){if(e.record!=="empty"&&e.record.started_at){let t=Date.parse(e.record.started_at);if(Number.isFinite(t))return t}return e.mtimeMs}function ce(e){return Ce(e)}function ue(e){return`${Ce(e)}.done`}function Ke(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(U,t):Math.min(Math.max(Math.floor(e),U,t),Ie)}async function _t(e,t){let r;try{r=await e.stat(t)}catch(o){if(R(o))return;throw o}let n=r.mtimeMs;if(r.size===0||r.size>Pe)return{mtimeMs:n};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>Pe?{mtimeMs:n}:{mtimeMs:n,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:n}}}function Kr(e){if(!_(e))return"empty";let t={};return typeof e.started_at=="string"&&(t.started_at=e.started_at),(e.owner==="bootstrap"||e.owner==="refresh")&&(t.owner=e.owner),e.resync===!0&&(t.resync=!0),t}function jr(e){if(!_(e))return;let t=e;if(typeof t.finished_at!="string"||typeof t.outcome!="string"||typeof t.interval_s!="number"||!Number.isFinite(t.interval_s))return;let r=$r(t.selection);if(r)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:r}}function $r(e){if(!_(e))return;let t=e;if(t.kind==="bundled")return t.why==="server"||t.why==="bootstrap_failed"?{kind:"bundled",why:t.why}:void 0;if(t.kind==="cached"&&typeof t.digest=="string"&&Cr.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&Gr(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function Gr(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Br||t.toString("base64")!==e))return t.toString("hex")}import{join as le}from"node:path";async function fe(e,t,r){let n=w(t);await e.mkdir(n,{recursive:!0}),await J(e,n,r.nowMs);let o=L(await y(e,t,!0),r.nowMs,r.ttlFloorS);return o.futureDated?yt(e,t,{...r,resync:!0,n:o.latest+1}):o.deadlineMs!==void 0&&r.nowMs<o.deadlineMs?{kind:"too_soon",deadlineMs:o.deadlineMs,latest:o.latest}:yt(e,t,{...r,n:o.latest+1})}var de={kind:"bundled",why:"bootstrap_failed"};function pe(e,t,r,n,o,s){return(a,c,i)=>zr(e,t,{n:r.n,startedAtMs:r.startedAtMs,nowMs:n(),budgetMs:o,intervalS:Ke(i,s),outcome:a,selection:c})}async function zr(e,t,r){if(r.nowMs-r.startedAtMs>r.budgetMs+3e4)return{recorded:!1,why:"expired"};let n=await y(e,t);if(A(n.claims)>r.n)return{recorded:!1,why:"superseded"};if(n.dones.has(r.n))return{recorded:!1,why:"already_done"};let o={finished_at:new Date(r.nowMs).toISOString(),interval_s:r.intervalS,outcome:r.outcome,selection:r.selection};return await J(e,w(t),r.nowMs),await N(e,le(w(t),ue(r.n)),JSON.stringify(o)),await Wr(e,t,r.n),{recorded:!0}}async function Wr(e,t,r){let n=await y(e,t),o=r-8,s=A(n.dones),a=w(t),c=new Set([...n.claims.keys(),...n.dones.keys()]);await Promise.all([...c].map(async i=>{i>=o||i!==s&&(await G(e,le(a,ce(i))),await G(e,le(a,ue(i))))}))}async function yt(e,t,r){if(r.n<1||r.n>9999999999)return{kind:"lost"};let n=w(t),o=le(n,ce(r.n)),s=new Date(r.nowMs).toISOString(),a=Ue(),c={started_at:s,nonce:a,owner:r.owner};r.resync&&(c.resync=!0);try{await ie(e,o,JSON.stringify(c)),await e.fsyncDir(n)}catch(i){if(De(i))return{kind:"lost"};throw i}return r.collectorRedacted!==void 0&&await Xr(e,t,r.collectorRedacted,r.dev===!0),A((await y(e,t)).claims)>r.n?{kind:"lost"}:r.resync?{kind:"resynced",n:r.n,startedAt:s}:{kind:"claimed",n:r.n,startedAt:s,startedAtMs:r.nowMs,nonce:a,owner:r.owner}}async function Xr(e,t,r,n){let o=se(t);try{await ie(e,o,Buffer.from(JSON.stringify({collector:r,dev:n}),"utf8")),await e.fsyncDir(t)}catch(s){if(De(s))return;throw s}}import{readFileSync as kn}from"node:fs";import{homedir as Rn}from"node:os";import{join as Sn}from"node:path";import{createHash as qr}from"node:crypto";import{access as Qr,readFile as Zr,stat as en}from"node:fs/promises";import{homedir as tn}from"node:os";import{dirname as rn,join as je,parse as nn,resolve as kt}from"node:path";var on="https://hooks.ev-ai.ai",sn=".claude/ev-ai-runtime-report.json",an="config.json",cn=1024*1024,wt=new Set(["localhost","127.0.0.1","[::1]","::1"]),un=["claude","cursor","codex"],ln=[sn,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],Rt=/^[A-Za-z0-9._~-]+$/;function fn(e){return e!==void 0&&un.includes(e)}function me(e,t){let r=e[t+1];return r&&!r.startsWith("--")?{value:r,next:t+1}:{next:t}}function dn(e){let t,r,n,o,s,a=!1;for(let c=0;c<e.length;c++){let i=e[c];if(i!==void 0){if(i==="--runner"){let u=me(e,c);t=u.value,c=u.next;continue}if(i.startsWith("--runner=")){t=i.slice(9);continue}if(i==="--url"){let u=me(e,c);u.value&&(n=u.value),c=u.next;continue}if(i.startsWith("--url=")){n=i.slice(6);continue}if(i==="--token"){let u=me(e,c);u.value&&(o=u.value),c=u.next;continue}if(i.startsWith("--token=")){o=i.slice(8);continue}if(i==="--base-url"){let u=me(e,c);u.value&&(s=u.value),c=u.next;continue}if(i.startsWith("--base-url=")){s=i.slice(11);continue}if(i===st){a=!0;continue}!i.startsWith("-")&&r===void 0&&(r=i)}}return{runner:fn(t)?t:void 0,event:r,collectorUrl:n,orgToken:o,baseUrl:s,...a?{deferUserSpec:!0}:{}}}function xt(e,t=on){let r=t.replace(/\/+$/,""),n=e.trim();return`${r}/${n}/hook`}function $e(e=tn()){return je(e,".ev-ai",an)}function pn(e,t){return{...e,...t}}function St(e){for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);if(r<=32||r===127||r===39)return!0}return!1}function At(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?wt.has(t.hostname):!1}catch{return!1}}function Ot(e){try{let r=new URL(e).pathname.split("/").filter(n=>n.length>0);if(r.length>=2&&r[r.length-1]==="hook"){let n=r[r.length-2];return n&&n.length>0?n:void 0}return}catch{return}}function Ge(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!At(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let r=Ot(e);if(!r)return`must end with /{orgToken}/hook (got: ${e})`;if(!Rt.test(r))return`org token must match ${Rt.source} (got: ${r})`;if(St(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(St(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function mn(e){return new URL(e).toString()}function Et(e){if(e.collector_url)return e.collector_url;let t=e.repo_ingest_token,r=typeof t=="string"?t.trim():void 0;return r?xt(r):""}function B(e){try{return wt.has(new URL(e).hostname)}catch{return!1}}function vt(e){try{let t=new URL(e),r=t.pathname.split("/").filter(n=>n.length>0);return r.length>=2&&r[r.length-1]==="hook"&&(r[r.length-2]="***",t.pathname=`/${r.join("/")}`),t.toString()}catch{return"<invalid-url>"}}function hn(e){let t=e.collectorUrl?.trim(),r;if(t)r=t;else{let o=e.orgToken?.trim();o&&(r=xt(o,e.baseUrl?.trim()??void 0))}if(!r)return{};let n=Ge(r);return n?{problem:n}:{url:mn(r)}}var Je={access:Qr,stat:en,readFile:(e,t)=>Zr(e,t)};async function gn(e,t,r=Je){let n=kt(e),{root:o}=nn(n);for(;;){let a=je(n,".git");try{let i=await r.stat(a);if(i.isDirectory()||i.isFile())return n}catch{}if(n===o)break;let c=rn(n);if(c===n)break;n=c}let s=t.CURSOR_PROJECT_DIR??t.CLAUDE_PROJECT_DIR;if(s)try{if((await r.stat(s)).isDirectory())return s}catch{}return kt(e)}async function X(e,t=Je){try{let r=await t.stat(e);if(!r.isFile()||r.size>cn)return;let n=await t.readFile(e,"utf8"),o=JSON.parse(n);return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function bt(e,t){return(await Promise.all(ln.map(async n=>{let o=je(e,n);try{return await t.access(o),o}catch{return}}))).find(n=>n!==void 0)}async function Nt(e){let t=e.fs??Je,r=hn(dn(e.argv));if(r.url)return{url:r.url,source:"argv"};let n=e.env.EV_AI_HOOK_MANIFEST;if(n)try{await t.access(n);let f=await X(n,t),d=f?Et(f):"";return d?{url:d,source:"manifest_override"}:{source:"none"}}catch{}let o=await gn(e.cwd,e.env,t),s=$e(e.home),[a,c]=await Promise.all([X(s,t),bt(o,t).then(async f=>f??bt(e.cwd,t))]),i=c?await X(c,t):void 0,u;a&&i?u=pn(i,a):a?u=a:i&&(u=i);let l=u?Et(u):"";return l?{url:l,source:"manifest"}:{source:"none"}}function It(e){if(Ge(e))return;let t;try{t=new URL(e)}catch{return}let r=Ot(e);if(!r)return;let o=t.pathname.split("/").filter(c=>c.length>0).slice(0,-2),s=o.length>0?`/${o.join("/")}`:"",a=`${t.origin}${s}/${r}`;return qr("sha256").update(a).digest("hex").slice(0,32)}var _n=/^[A-Za-z0-9._~-]+$/;function Pt(e,t){if(!_n.test(t)||Ge(e))return;let r;try{r=new URL(e)}catch{return}let n=r.pathname.split("/").filter(s=>s.length>0);if(n.length<2||n[n.length-1]!=="hook")return;n[n.length-1]=t;let o=new URL(r.origin);if(o.pathname=`/${n.join("/")}`,o.search="",o.hash="",o.username="",o.password="",!(o.username||o.password)&&o.origin===r.origin&&At(o.toString()))return o.toString()}function Ft(e){return Pt(e,"version")}function Lt(e){return Pt(e,"error-report")}var Dt=/^[A-Za-z0-9._-]{8,64}$/;function En(e,t){try{let n=kn(Sn(e,".ev-ai","agent-hook","installation.json"),"utf8"),o=JSON.parse(n);if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o.installation_id;if(typeof s=="string"&&Dt.test(s))return s}}catch{}let r=t.EV_AI_HOOK_INSTALLATION_ID?.trim();return r&&Dt.test(r)?r:void 0}async function he(e,t,r,n,o){if(!t.startsWith("failed:")||!n.postJson)return;let s=Lt(e);if(!s)return;let a;try{a=En(o?.home??Rn(),o?.env??process.env)}catch{}try{await n.postJson(s,{reason:t.slice(0,512),phase:r,...a?{installation_id:a}:{}},{timeoutMs:500,signal:AbortSignal.timeout(500)})}catch{}}import bn from"node:http";import wn from"node:https";import{URL as xn}from"node:url";function ge(){return{getBounded:Ut,postJson:vn}}function _e(e,t){return e==="timeout"||e==="network"?"failed:timeout":e==="http_3xx"?"failed:http_3xx":t}function Ut(e,t){let r;try{r=new xn(e)}catch{return Promise.resolve({ok:!1,reason:"origin_rejected"})}if(r.protocol==="http:"){if(!B(e))return Promise.resolve({ok:!1,reason:"origin_rejected"})}else if(r.protocol!=="https:")return Promise.resolve({ok:!1,reason:"origin_rejected"});let n=r.protocol==="http:"?bn:wn;return new Promise(o=>{let s=!1,a=[],c=0,i=f=>{s||(s=!0,t.signal?.removeEventListener("abort",u),o(f))},u=()=>{l.destroy(),i({ok:!1,reason:"timeout"})},l=n.request(r,{method:t.method??"GET",agent:!1,timeout:t.timeoutMs,headers:t.headers},f=>{let d=f.statusCode??0;if(d>=300&&d<400){f.resume(),i({ok:!1,reason:"http_3xx"});return}let p=f.headers["content-length"];if(typeof p=="string"){let h=Number(p);if(Number.isFinite(h)&&h>t.maxBytes){f.destroy(),i({ok:!1,reason:"too_large"});return}}f.on("data",h=>{if(c+=h.length,c>t.maxBytes){f.destroy(),i({ok:!1,reason:"too_large"});return}a.push(h)}),f.on("end",()=>{i({ok:!0,response:{status:d,headers:f.headers,body:Buffer.concat(a)}})}),f.on("error",()=>{i({ok:!1,reason:"network"})})});if(l.on("timeout",()=>{l.destroy(),i({ok:!1,reason:"timeout"})}),l.on("error",()=>{i({ok:!1,reason:"network"})}),t.signal){if(t.signal.aborted){u();return}t.signal.addEventListener("abort",u,{once:!0})}l.end(t.body)})}var An=2048,On=1024;function vn(e,t,r){let n;try{n=Buffer.from(JSON.stringify(t),"utf8")}catch{return Promise.resolve({ok:!1,reason:"network"})}return n.byteLength>An?Promise.resolve({ok:!1,reason:"too_large"}):Ut(e,{maxBytes:On,timeoutMs:r.timeoutMs,signal:r.signal,method:"POST",body:n,headers:{"content-type":"application/json","content-length":n.byteLength}})}async function q(e,t){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await X($e(t)))?.auto_update===!1}function Ye(e){return!!e.CURSOR_SANDBOX}function ye(e,t,r,n){return{source:"bundled",hookPath:e.bundledHookPath,fallbackReason:t,scopeId:r?.scopeId,dev:r?.dev,...n}}import{join as In}from"node:path";var We=/^[0-9a-f]{128}$/;function Pn(e){return Buffer.from(JSON.stringify({format:e.format,key_id:e.key_id,payload:e.payload,signature:e.signature}),"utf8")}async function ke(e,t,r,n,o,s,a,c){if(!We.test(r)||P(n)!==r)return{ok:!1,reason:"repair_failed"};let i=Be(t,r);await e.mkdir(i,{recursive:!0}),await J(e,i,a);let u=S(t,r),l=ae(t,r),f=Pn(o);if(await H(e,u,r)==="ok"){let p=await Fn(e,l);if(p?.equals(f))return await ze(e,t,r),{ok:!0};let h=await Ln(p,c);return h!==void 0&&h!==s.version?{ok:!1,reason:"metadata_conflict"}:(await N(e,l,f),await ze(e,t,r),{ok:!0})}return await N(e,u,n),await N(e,l,f),await H(e,u,r)!=="ok"?{ok:!1,reason:"repair_failed"}:(await ze(e,t,r),{ok:!0})}async function Ht(e,t,r){let n=Ve(r.sha512);if(!(n===void 0||!We.test(n)))return await H(e,S(t,n),n)==="ok"?n:void 0}async function Fn(e,t){try{return await e.readFile(t)}catch{return}}async function Ln(e,t){if(e===void 0)return;let r;try{r=JSON.parse(e.toString("utf8"))}catch{return}if(!_(r))return;let n=v(r,T(t));return n.ok?n.manifest.version:void 0}async function ze(e,t,r){try{let o=(await E(e,t)).filter(i=>We.test(i));if(o.length<=8)return;let s=o.filter(i=>i!==r),a=await Promise.all(s.map(async i=>{let u=Number.NEGATIVE_INFINITY;try{u=(await e.stat(ae(t,i))).mtimeMs}catch{}return{name:i,mtimeMs:u}}));a.sort((i,u)=>u.mtimeMs-i.mtimeMs);let c=a.slice(7);await Promise.all(c.map(i=>Mn(e,t,i.name)))}catch{}}async function Mn(e,t,r){let n=Be(t,r);try{let o=await E(e,n);await Promise.all(o.map(s=>G(e,In(n,s)))),await e.rmdir(n)}catch{}}function Re(e,t){return{launcher:e,protocol:String(1),current:t,platform:`${process.platform}-${process.arch}`,node:process.version,update_format:M}}function Un(e,t,r=T(t)){if(!_(e))return{ok:!1,reason:"failed:metadata_mismatch"};let n=e.hook_js;if(n===void 0)return{ok:!0,directive:{kind:"none"}};if(!_(n))return{ok:!1,reason:"failed:metadata_mismatch"};if(n.use_bundled===!0)return{ok:!0,directive:{kind:"bundled",intervalS:Cn(n.check_interval_s)}};let o=v(n,r);if(!o.ok)return{ok:!1,reason:"failed:metadata_mismatch"};let s=Hn(o.manifest.url,t);return s?s!==o.manifest.version?{ok:!1,reason:"failed:metadata_mismatch"}:{ok:!0,directive:{kind:"target",manifest:o.manifest,envelope:Tn(n)}}:{ok:!1,reason:"failed:origin_rejected"}}async function Ct(e,t,r,n,o,s){let a=Bn(e,t),c=await n.getBounded(a,{maxBytes:4096,timeoutMs:r,signal:s});if(!c.ok)return{ok:!1,reason:_e(c.reason,"failed:metadata_mismatch")};let{status:i,body:u}=c.response;if(i!==200)return{ok:!1,reason:`failed:http_${i}`};let l;try{l=JSON.parse(u.toString("utf8"))}catch{return{ok:!1,reason:"failed:metadata_mismatch"}}return Un(l,o)}function Tn(e){return{format:M,key_id:String(e.key_id),payload:String(e.payload),signature:String(e.signature)}}function Hn(e,t){let r;try{r=new URL(e)}catch{return}if(r.username!==""||r.password!==""||r.search!==""||r.hash!==""||r.pathname.includes(".."))return;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(r.pathname)?.[1];if(o&&(r.protocol==="https:"||t&&r.protocol==="http:"&&B(e)))return o}function Cn(e){if(typeof e=="number"&&Number.isInteger(e)&&e>0)return e}function Bn(e,t){let r=new URL(e);for(let[n,o]of Object.entries(t))r.searchParams.set(n,o);return r.toString()}async function Se(e,t,r,n,o,s){let a=Ft(e);return a?Ct(a,t,r,n,o,s):{ok:!1,reason:"failed:origin_rejected"}}async function Ee(e,t,r,n,o,s,a,c,i,u){let{manifest:l,envelope:f}=n;if(!re(l.version,o))return{ok:!1,reason:"skipped:below_floor"};if(!ne(process.version,l.node_engine))return{ok:!1,reason:"skipped:incompatible_node"};if(l.min_launcher_protocol>1)return{ok:!1,reason:"skipped:incompatible_protocol"};let d=await Ht(e,r,l);if(d){let h=await C(e,r,d,o,s,i);if(h.usable)return{ok:!0,digest:d,reused:!0};if(h.reason==="quarantined")return{ok:!1,reason:"skipped:quarantined"};if(h.reason==="signature_invalid"){let g=S(r,d);if(await H(e,g,d)==="ok"){let V=await e.readFile(g),K=await ke(e,r,d,V,f,l,s,i);return K.ok?{ok:!0,digest:d,reused:!0}:{ok:!1,reason:`failed:${K.reason}`}}}}let p=await Vn(e,r,n,u,s,i);return p||Kn(e,t,r,n,s,a,c,i)}async function Vn(e,t,r,n,o,s){if(n.length!==0)try{let a=await e.readFile(n);if(!te(a,r.manifest).ok)return;let c=P(a),i=await ke(e,t,c,a,r.envelope,r.manifest,o,s);return i.ok?{ok:!0,digest:c,reused:!1}:{ok:!1,reason:`failed:${i.reason}`}}catch{return}}async function Kn(e,t,r,n,o,s,a,c){let{manifest:i,envelope:u}=n,l=await t.getBounded(i.url,{maxBytes:i.size,timeoutMs:s,signal:a});if(!l.ok)return{ok:!1,reason:_e(l.reason,"failed:extract_failed")};if(l.response.status!==200)return{ok:!1,reason:`failed:http_${l.response.status}`};let f=l.response.body;if(!te(f,i).ok)return{ok:!1,reason:"failed:integrity_mismatch"};let p=P(f),h=await ke(e,r,p,f,u,i,o,c);return h.ok?{ok:!0,digest:p,reused:!1}:{ok:!1,reason:`failed:${h.reason}`}}async function Gn(e){let t=e.fs??I(),r=e.http??ge(),n=b(e.home,e.scope.scopeId),o=x(e.home,e.scope.dev),s=F(e.env),a=AbortSignal.timeout(3e3),c=await fe(t,n,{owner:"bootstrap",nowMs:e.nowMs,ttlFloorS:s,collectorRedacted:e.scope.collectorUrlRedacted,dev:e.scope.dev});if(c.kind!=="claimed"){let h=c.kind==="lost"||c.kind==="too_soon";return ye(e,h?"bootstrap_in_progress":"bootstrap_failed",e.scope,{didBootstrap:!1})}let i=pe(t,n,c,()=>Date.now(),3e3,s),u=async h=>(await i(h,de),ye(e,"bootstrap_failed",e.scope,{didBootstrap:!0}));if(a.aborted)return u("failed:bootstrap");let l=await Se(e.scope.collectorUrl,Re(e.bundledVersion,e.bundledVersion),1e3,r,e.scope.dev,a);if(!l.ok)return u(l.reason);let f=l.directive;if(f.kind==="none")return u("failed:bootstrap");if(f.kind==="bundled")return await i("bundled",{kind:"bundled",why:"server"},f.intervalS),ye(e,"server",e.scope,{didBootstrap:!0});let d=await Ee(t,r,o,{manifest:f.manifest,envelope:f.envelope},e.bundledVersion,e.nowMs,2e3,a,e.scope.dev,e.bundledHookPath);if(!d.ok)return he(e.scope.collectorUrl,d.reason,"bootstrap",r,{home:e.home,env:e.env}),u(d.reason);let{digest:p}=d;return await i("updated",{kind:"cached",digest:p,version:f.manifest.version,sha512:f.manifest.sha512}),{source:"bootstrap",hookPath:S(o,p),scopeId:e.scope.scopeId,digest:p,dev:e.scope.dev,didBootstrap:!0}}async function be(e,t){let r=await Nt({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!r.url)return;let n=It(r.url);if(!(!n||r.source==="none"))return{scopeId:n,collectorUrl:r.url,collectorUrlRedacted:vt(r.url),source:r.source,dev:B(r.url)}}async function zn(e,t,r,n,o){try{await Wn(e,t,r,n,o)}catch{}return 0}async function Wn(e,t,r,n,o){if(Ye(t)||await q(t,n))return;let s=t[ot],a=await be(e,{env:t,cwd:r,home:n});if(!a||!s||a.scopeId!==s)return;let c=o?.fs??I(),i=o?.http??ge(),u=o?.nowMs??Date.now(),l=F(t),f=b(n,a.scopeId),d=await fe(c,f,{owner:"refresh",nowMs:u,ttlFloorS:l,collectorRedacted:a.collectorUrlRedacted,dev:a.dev});if(d.kind!=="claimed")return;let p=pe(c,f,d,()=>Date.now(),6e4,l),h=o?.packageVersion??"",g=L(await y(c,f,!0),u,l).selection,V=g.kind==="uninitialized"?de:g,K=AbortSignal.timeout(6e4),we=await Se(a.collectorUrl,Re(h,g.kind==="cached"?g.version:h),5e3,i,a.dev,K);if(!we.ok){await p(we.reason,V);return}let k=we.directive;if(k.kind==="none"){await p("no_directive",V);return}if(k.kind==="bundled"){await p("bundled",{kind:"bundled",why:"server"},k.intervalS);return}let j=await Ee(c,i,x(n,a.dev),{manifest:k.manifest,envelope:k.envelope},h,u,3e4,K,a.dev,o?.bundledHookPath??"");if(!j.ok){he(a.collectorUrl,j.reason,"refresh",i,{home:n,env:t}),await p(j.reason,V);return}let Gt=g.kind==="cached"&&g.version===k.manifest.version&&g.sha512===k.manifest.sha512,{digest:Jt}=j;await p(Gt?j.reused?"current":"repaired":"updated",{kind:"cached",digest:Jt,version:k.manifest.version,sha512:k.manifest.sha512})}function Xn(e){return`${e.slice(0,4)}\u2026`}async function qn(e,t,r){let n=e.includes("--json"),o=e.includes("--all"),s=e.slice(1).filter(p=>p!=="--json"&&p!=="--all"),a=await be(s,t),c=await q(t.env,t.home),i=I(),u=await $t(t,r,a,i,c),l=await Qn(i,t.home,a?.scopeId),f=o?await Zn(t,r,i,c,l):[];if(n)return t.stdout.write(`${JSON.stringify({...u,otherScopes:f},null,2)}
3
- `),0;let d=[`launcher ${r.version} protocol ${r.evAi.launcherProtocol} revision ${r.evAi.launcherRevision} bundled hook ${r.version}`];if(d.push(...jt(u)),o)for(let p of f)d.push(""),d.push(...jt(p));else d.push(`other scopes ${l.length} (status --all)`);return d.push(`auto-update ${c?"off":"on"}`),t.stdout.write(`${d.join(`
1
+ import{createHash as gt}from"node:crypto";import{join as W}from"node:path";var M="signed-hook-v1",xe=Buffer.from("ev-ai-hook-release-v1\0","utf8"),D=32;var qe=64,Q=64;import{sign as Ao,verify as dr}from"node:crypto";var qt=/^[A-Za-z0-9+/]+=*$/;function O(e){if(e.length===0||!qt.test(e))return;let t=Buffer.from(e,"base64");if(t.toString("base64")===e)return t}import{createPrivateKey as co,createPublicKey as Zt,timingSafeEqual as uo}from"node:crypto";var er=Buffer.from("302a300506032b6570032100","hex"),fo=Buffer.from("302e020100300506032b657004220420","hex");function tr(e){let t=Buffer.from(e,"base64");if(t.byteLength!==D||t.toString("base64")!==e)throw new Error("invalid production public key");return t}var Z=Object.freeze({"release-key-1":tr("jVk7k2gEEcdAiPOFtNZomu36bOpfkk0vgF9dC6FMcS0=")});function Qe(e){if(e.byteLength!==D)throw new Error("Ed25519 public key must be 32 bytes");return Zt({key:Buffer.concat([er,Buffer.from(e)]),format:"der",type:"spki"})}function Ze(e,t){if(!Object.hasOwn(e,t))return;let r=e[t];if(r?.byteLength===D)return r}var m={UNKNOWN_FORMAT:"unknown_format",UNKNOWN_KEY:"unknown_key",NON_CANONICAL_BASE64:"non_canonical_base64",INVALID_SIGNATURE_LENGTH:"invalid_signature_length",SIGNATURE_INVALID:"signature_invalid",TRAILING_BYTES:"trailing_bytes",UNKNOWN_FIELD:"unknown_field",DUPLICATE_FIELD:"duplicate_field",MISSING_FIELD:"missing_field",INVALID_TYPE:"invalid_type",INVALID_VERSION:"invalid_version",INVALID_URL:"invalid_url",URL_VERSION_MISMATCH:"url_version_mismatch",INVALID_SHA512:"invalid_sha512",INVALID_SIZE:"invalid_size",INVALID_NODE_ENGINE:"invalid_node_engine",INVALID_PROTOCOL:"invalid_protocol",INVALID_PACKAGE:"invalid_package",INVALID_JSON:"invalid_json",INVALID_ENVELOPE:"invalid_envelope",INVALID_KEY_ID:"invalid_key_id"},$={SIZE_MISMATCH:"size_mismatch",HASH_MISMATCH:"hash_mismatch"};function et(e){let t;try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return{ok:!1,reason:m.INVALID_JSON}}return rr(t)}function rr(e){if(e.length===0)return{ok:!1,reason:m.INVALID_JSON};if(e.trimStart()!==e||e.trimEnd()!==e)return{ok:!1,reason:m.TRAILING_BYTES};let t=new Ae(e);try{let r=t.parseValue();return t.atEnd()?{ok:!0,value:r}:{ok:!1,reason:m.TRAILING_BYTES}}catch(r){return r instanceof ee?{ok:!1,reason:m.DUPLICATE_FIELD}:{ok:!1,reason:m.INVALID_JSON}}}var ee=class extends Error{constructor(){super("duplicate field")}},Ae=class{text;i=0;constructor(t){this.text=t}atEnd(){return this.i>=this.text.length}parseValue(){this.skipWs();let t=this.text[this.i];if(t==="{")return this.parseObject();if(t==="[")return this.parseArray();if(t==='"')return this.parseString();if(t==="t"||t==="f"||t==="n")return this.parseLiteral();if(t==="-"||t!==void 0&&t>="0"&&t<="9")return this.parseNumber();throw new SyntaxError("invalid json")}skipWs(){let{text:t}=this;for(;this.i<t.length;){let r=t.charCodeAt(this.i);if(r!==32&&r!==10&&r!==13&&r!==9)break;this.i+=1}}parseObject(){this.expect("{"),this.skipWs();let t=Object.create(null),r=new Set;if(this.text[this.i]==="}")return this.i+=1,t;for(;;){if(this.skipWs(),this.text[this.i]!=='"')throw new SyntaxError("expected key");let n=this.parseString();if(r.has(n))throw new ee;r.add(n),this.skipWs(),this.expect(":"),t[n]=this.parseValue(),this.skipWs();let o=this.text[this.i];if(o===","){this.i+=1;continue}if(o==="}")return this.i+=1,t;throw new SyntaxError("expected comma or end of object")}}parseArray(){this.expect("["),this.skipWs();let t=[];if(this.text[this.i]==="]")return this.i+=1,t;for(;;){t.push(this.parseValue()),this.skipWs();let r=this.text[this.i];if(r===","){this.i+=1;continue}if(r==="]")return this.i+=1,t;throw new SyntaxError("expected comma or end of array")}}parseString(){this.expect('"');let{text:t}=this,r="";for(;this.i<t.length;){let n=t.charCodeAt(this.i);if(n===34)return this.i+=1,r;if(n===92){this.i+=1,r+=this.parseEscape();continue}if(n<32)throw new SyntaxError("unescaped control");r+=t[this.i],this.i+=1}throw new SyntaxError("unterminated string")}parseEscape(){let t=this.text[this.i];if(t===void 0)throw new SyntaxError("unterminated escape");switch(this.i+=1,t){case'"':case"\\":case"/":return t;case"b":return"\b";case"f":return"\f";case"n":return`
2
+ `;case"r":return"\r";case"t":return" ";case"u":{let r=this.text.slice(this.i,this.i+4);if(!/^[0-9a-fA-F]{4}$/.test(r))throw new SyntaxError("invalid unicode escape");return this.i+=4,String.fromCharCode(Number.parseInt(r,16))}default:throw new SyntaxError("invalid escape")}}parseLiteral(){if(this.text.startsWith("true",this.i))return this.i+=4,!0;if(this.text.startsWith("false",this.i))return this.i+=5,!1;if(this.text.startsWith("null",this.i))return this.i+=4,null;throw new SyntaxError("invalid literal")}parseNumber(){let t=this.i,{text:r}=this;if(r[this.i]==="-"&&(this.i+=1),r[this.i]==="0")this.i+=1;else if(this.isDigit(r[this.i]))for(;this.isDigit(r[this.i]);)this.i+=1;else throw new SyntaxError("invalid number");if(r[this.i]==="."){if(this.i+=1,!this.isDigit(r[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(r[this.i]);)this.i+=1}if(r[this.i]==="e"||r[this.i]==="E"){if(this.i+=1,(r[this.i]==="+"||r[this.i]==="-")&&(this.i+=1),!this.isDigit(r[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(r[this.i]);)this.i+=1}let n=Number(r.slice(t,this.i));if(!Number.isFinite(n))throw new SyntaxError("invalid number");return n}expect(t){if(this.text[this.i]!==t)throw new SyntaxError(`expected ${t}`);this.i+=1}isDigit(t){return t!==void 0&&t>="0"&&t<="9"}};var rt=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],nr=new Set(rt),or=/^\d+\.\d+\.\d+$/,ir=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,sr=/^[@A-Za-z0-9._/~-]{1,214}$/;function Oe(e){let t=et(e);return t.ok?ar(t.value):t}function ar(e){if(!ve(e))return{ok:!1,reason:m.INVALID_JSON};for(let u of Object.keys(e))if(!nr.has(u))return{ok:!1,reason:m.UNKNOWN_FIELD};for(let u of rt)if(!(u in e))return{ok:!1,reason:m.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!sr.test(t)||t.includes(".."))return{ok:!1,reason:m.INVALID_PACKAGE};let r=e.version;if(typeof r!="string"||!or.test(r))return{ok:!1,reason:m.INVALID_VERSION};let n=e.url;if(typeof n!="string")return{ok:!1,reason:m.INVALID_URL};let o=cr(n,r);if(o!==void 0)return{ok:!1,reason:o};let a=e.sha512;if(typeof a!="string")return{ok:!1,reason:m.INVALID_SHA512};if(O(a)?.byteLength!==Q)return{ok:!1,reason:m.INVALID_SHA512};let c=e.size;if(typeof c!="number"||!Number.isInteger(c)||c<1||c>4194304)return{ok:!1,reason:m.INVALID_SIZE};let i=e.node_engine;if(typeof i!="string"||ir.exec(i)===null)return{ok:!1,reason:m.INVALID_NODE_ENGINE};let l=e.min_launcher_protocol;return typeof l!="number"||!Number.isInteger(l)||l<1||!Number.isSafeInteger(l)?{ok:!1,reason:m.INVALID_PROTOCOL}:{ok:!0,manifest:{package:t,version:r,url:n,sha512:a,size:c,node_engine:i,min_launcher_protocol:l}}}function ve(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function cr(e,t){if(e.includes("..")||/%2e/i.test(e)||/[\\?#]/.test(e))return m.INVALID_URL;let r;try{r=new URL(e)}catch{return m.INVALID_URL}if(r.href!==e)return m.INVALID_URL;if(!lr(r))return m.INVALID_URL;if(r.username!==""||r.password!=="")return m.INVALID_URL;if(r.search!==""||r.hash!=="")return m.INVALID_URL;if(r.hostname===""||r.pathname.includes(".."))return m.INVALID_URL;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(r.pathname)?.[1];if(o===void 0)return m.INVALID_URL;if(o!==t)return m.URL_VERSION_MISMATCH}var ur=new Set(["localhost","127.0.0.1","[::1]"]);function lr(e){return e.protocol==="https:"?!0:e.protocol==="http:"?ur.has(e.hostname):!1}var pr=["format","key_id","payload","signature"],mr=/^[A-Za-z0-9._-]{1,128}$/;function hr(e,t){return Buffer.concat([xe,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function v(e,t){if(!ve(e))return{ok:!1,reason:m.INVALID_ENVELOPE};if(e.format!==M)return{ok:!1,reason:m.UNKNOWN_FORMAT};for(let u of Object.keys(e))if(u!=="format"&&u!=="key_id"&&u!=="payload"&&u!=="signature")return{ok:!1,reason:m.UNKNOWN_FIELD};for(let u of pr)if(!(u in e))return{ok:!1,reason:m.MISSING_FIELD};let n=e.key_id;if(typeof n!="string"||!mr.test(n))return{ok:!1,reason:m.INVALID_KEY_ID};let o=Ze(t,n);if(o===void 0)return{ok:!1,reason:m.UNKNOWN_KEY};let a=e.payload,s=e.signature;if(typeof a!="string"||typeof s!="string")return{ok:!1,reason:m.INVALID_ENVELOPE};let c=O(a),i=O(s);if(c===void 0||i===void 0)return{ok:!1,reason:m.NON_CANONICAL_BASE64};if(i.byteLength!==qe)return{ok:!1,reason:m.INVALID_SIGNATURE_LENGTH};let l=!1;try{l=dr(null,hr(n,c),Qe(o),i)}catch{l=!1}return l?Oe(c):{ok:!1,reason:m.SIGNATURE_INVALID}}import{createHash as gr,timingSafeEqual as _r}from"node:crypto";function te(e,t){if(e.byteLength!==t.size)return{ok:!1,reason:$.SIZE_MISMATCH};let r=O(t.sha512);if(r?.byteLength!==Q)return{ok:!1,reason:$.HASH_MISMATCH};let n=gr("sha512").update(e).digest();return n.byteLength!==r.byteLength||!_r(n,r)?{ok:!1,reason:$.HASH_MISMATCH}:{ok:!0}}var yr=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,Er=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,Rr=/^v?(\d+)\.(\d+)\.(\d+)/;function nt(e){let t=yr.exec(e);if(t)return{...Ne(t),prerelease:t[4]?.split(".")}}function ot(e,t){let r=nt(e),n=nt(t);if(!(!r||!n))return r.major!==n.major?r.major-n.major:r.minor!==n.minor?r.minor-n.minor:r.patch!==n.patch?r.patch-n.patch:Sr(r.prerelease,n.prerelease)}function re(e,t){let r=ot(e,t);return r!==void 0&&r>=0}function kr(e){let t=Er.exec(e.trim());return t?Ne(t):void 0}function Ne(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function ne(e,t){let r=kr(t),n=Rr.exec(e.trim()),o=n?Ne(n):void 0;return!r||!o?!1:o.major!==r.major?o.major>r.major:o.minor!==r.minor?o.minor>r.minor:o.patch>=r.patch}function Sr(e,t){if(e===void 0&&t===void 0)return 0;if(e===void 0)return 1;if(t===void 0)return-1;let r=Math.max(e.length,t.length);for(let n=0;n<r;n++){let o=e[n],a=t[n];if(o===void 0)return-1;if(a===void 0)return 1;let s=br(o,a);if(s!==0)return s}return 0}function br(e,t){let r=/^\d+$/.test(e),n=/^\d+$/.test(t);if(r&&n){let o=Number(e)-Number(t);return o<0?-1:o>0?1:0}return r?-1:n?1:e<t?-1:e>t?1:0}var it="EV_AI_LAUNCHER_REFRESH_SCOPE";var st="EV_AI_HOOK_UPDATE_TTL_MIN",at="--defer-user-spec",zo=Buffer.from([1]);var Wo=1024*1024,Xo=4*1024*1024,qo=64*1024,Qo=64*1024,Zo=64*1024;var ct="handoff-",ut=6e4,H=21600,Ie=604800,lt=3e5,Pe=4096,Fe=4*1024*1024;import{randomBytes as xr}from"node:crypto";import{basename as Ar,dirname as Or,join as Le}from"node:path";import{open as ft,mkdir as vr,readFile as Nr,readdir as Ir,rename as Pr,stat as Fr,rmdir as Lr,unlink as Mr,utimes as Dr}from"node:fs/promises";var oe=new WeakMap;function Me(e){if(e&&typeof e=="object"&&"code"in e)return e}function R(e){return Me(e)?.code==="ENOENT"}function De(e){return Me(e)?.code==="EEXIST"}function Hr(e){let t=Me(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function S(e,t){try{return await e.readdir(t)}catch(r){if(R(r))return[];throw r}}async function G(e,t){try{await e.unlink(t)}catch(r){if(!R(r))throw r}}async function ie(e,t,r){let n=await e.open(t,"wx");try{await e.write(n,r),await e.fsync(n)}finally{await e.close(n)}}function He(){return xr(8).toString("hex")}function Tr(e){return e.startsWith(".")}async function J(e,t,r){await Te(e,t,r,Tr,36e5)}async function Te(e,t,r,n,o){let a=await S(e,t);await Promise.all(a.map(async s=>{if(!n(s))return;let c=Le(t,s);try{let i=await e.stat(c);r-i.mtimeMs>o&&await e.unlink(c)}catch(i){if(!R(i))throw i}}))}async function N(e,t,r){let n=Or(t),o=He(),a=`.${Ar(t)}.`,s=Le(n,`${a}${o}`),c=()=>e.unlink(s).catch(()=>{});await ie(e,s,r);try{await e.rename(s,t)}catch(i){if(!Hr(i))throw await c(),i;let l=Le(n,`${a}bad.${o}`);try{await e.rename(t,l)}catch(u){if(!R(u))throw await c(),u}await e.rename(s,t)}await e.fsyncDir(n)}function I(){return{async open(e,t){let r=await ft(e,t),n={path:e};return oe.set(n,r),n},async write(e,t){let r=dt(e),n=typeof t=="string"?Buffer.from(t,"utf8"):t;await r.write(n)},async fsync(e){await dt(e).sync()},async close(e){let t=oe.get(e);oe.delete(e),t&&await t.close()},rename:Pr,async readdir(e){return Ir(e)},readFile:Nr,async stat(e){let t=await Fr(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await vr(e,t)},unlink:Mr,rmdir:Lr,utimes:Dr,async fsyncDir(e){if(process.platform==="win32")return;let t=await ft(e,"r");try{await t.sync()}finally{await t.close()}}}}function dt(e){let t=oe.get(e);if(!t)throw new Error("closed");return t}function _(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var mt=Object.freeze({"test-key-1":pt("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":pt("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function pt(e){let t=Buffer.from(e,"base64");if(t.byteLength!==D||t.toString("base64")!==e)throw new Error("invalid test public key");return t}function T(e){return e?{...mt,...Z}:Z}import{join as Y}from"node:path";function Ue(e){return Y(e,".ev-ai","agent-hook","js","signed-v1")}function Ce(e){return Y(Ue(e),"scopes")}function b(e,t){return Y(Ce(e),t)}function w(e){return Y(e,"attempts")}function se(e){return Y(e,"scope.json")}function Be(e){return String(e).padStart(10,"0")}var Ur=64;function x(e,t){return W(Ue(e),t?"dev-artifacts":"artifacts")}function Ve(e,t){return W(e,t)}function k(e,t){return W(e,t,"hook.mjs")}function ae(e,t){return W(e,t,"release.json")}function Cr(e,t){return W(e,t,"health.json")}function P(e){return gt("sha512").update(e).digest("hex")}function Ke(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Ur||t.toString("base64")!==e))return t.toString("hex")}async function U(e,t,r){try{let n=await e.stat(t);return n.size<=0||n.size>Fe?"bad":P(await e.readFile(t))===r?"ok":"bad"}catch(n){if(R(n))return"missing";throw n}}async function C(e,t,r,n,o,a,s=process.version){let[c,i,l]=await Promise.all([ht(e,k(t,r)),ht(e,ae(t,r)),Br(e,Cr(t,r))]);if(c===void 0)return{usable:!1,reason:"artifact_missing"};if(i===void 0)return{usable:!1,reason:"signature_invalid"};let u;try{u=JSON.parse(i.toString("utf8"))}catch{return{usable:!1,reason:"signature_invalid"}}let f=v(u,T(a));if(!f.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:d}=f;if(c.byteLength!==d.size||c.byteLength>Fe)return{usable:!1,reason:"hash_mismatch"};let p=gt("sha512").update(c).digest();if(p.toString("hex")!==r)return{usable:!1,reason:"hash_mismatch"};let h=Buffer.from(d.sha512,"base64");if(p.byteLength!==h.byteLength||!p.equals(h))return{usable:!1,reason:"hash_mismatch"};if(!re(d.version,n))return{usable:!1,reason:"below_floor"};if(!ne(s,d.node_engine))return{usable:!1,reason:"incompatible_node"};if(d.min_launcher_protocol>1)return{usable:!1,reason:"incompatible_protocol"};if(l?.quarantined_until){let g=Date.parse(l.quarantined_until);if(Number.isFinite(g)&&g>o)return{usable:!1,reason:"quarantined"}}return{usable:!0,manifest:d,healthFails:l?.consecutive_startup_failures??0}}async function ht(e,t){try{return await e.readFile(t)}catch(r){if(R(r))return;throw r}}async function Br(e,t){try{let r=await e.readFile(t),n=JSON.parse(r.toString("utf8"));if(!_(n))return;let o=n.consecutive_startup_failures;if(typeof o!="number"||!Number.isInteger(o)||o<0)return;let a={consecutive_startup_failures:o};return typeof n.quarantined_until=="string"&&(a.quarantined_until=n.quarantined_until),a}catch{return}}import{join as _t}from"node:path";var Vr=/^(\d{10})$/,Kr=/^(\d{10})\.done$/,jr=/^[0-9a-f]{128}$/,$r=64;function F(e){let t=e[st];if(t===void 0||t==="")return H;let r=Number(t);return!Number.isInteger(r)||r<=0?H:Math.min(Math.max(H,r*60),Ie)}async function y(e,t,r=!1){let n=w(t),o=await S(e,n),a=new Map,s=new Map,c=yt(o,Vr),i=yt(o,Kr),l=async d=>{let p=await Rt(e,_t(n,ce(d)));return p&&a.set(d,{record:Jr(p.value),mtimeMs:p.mtimeMs}),p!==void 0},u=async d=>{let p=Yr((await Rt(e,_t(n,ue(d))))?.value);return p&&s.set(d,p),p!==void 0};if(!r)return await Promise.all([...c.map(l),...i.map(u)]),{claims:a,dones:s};await Promise.all([Et(c,l),Et(i,u)]);let f=A(a);return f<A(s)&&i.includes(f)&&await u(f),{claims:a,dones:s}}function yt(e,t){return e.flatMap(r=>{let n=t.exec(r);return n?[Number(n[1])]:[]})}async function Et(e,t){for(let r of[...e].sort((n,o)=>o-n))if(await t(r))return}function A(e){let t=0;for(let r of e.keys())r>t&&(t=r);return t}function L(e,t,r){let n=A(e.claims),o=A(e.dones),a=n===0?{kind:"uninitialized"}:{kind:"bundled",why:"bootstrap_failed"},s;if(o>0){let p=e.dones.get(o);p&&(a=p.selection,s=p.outcome)}let c=n>0?e.claims.get(n):void 0,i=c?Gr(c):void 0,l=n>0?e.dones.get(n):void 0,u=je(l?.interval_s,r),f=i!==void 0?i+u*1e3:void 0,d=i!==void 0&&i-t>lt;return{latest:n,startMs:i,intervalS:u,deadlineMs:f,selection:a,lastOutcome:s,futureDated:d,highestDone:o}}function Gr(e){if(e.record!=="empty"&&e.record.started_at){let t=Date.parse(e.record.started_at);if(Number.isFinite(t))return t}return e.mtimeMs}function ce(e){return Be(e)}function ue(e){return`${Be(e)}.done`}function je(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(H,t):Math.min(Math.max(Math.floor(e),H,t),Ie)}async function Rt(e,t){let r;try{r=await e.stat(t)}catch(o){if(R(o))return;throw o}let n=r.mtimeMs;if(r.size===0||r.size>Pe)return{mtimeMs:n};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>Pe?{mtimeMs:n}:{mtimeMs:n,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:n}}}function Jr(e){if(!_(e))return"empty";let t={};return typeof e.started_at=="string"&&(t.started_at=e.started_at),(e.owner==="bootstrap"||e.owner==="refresh")&&(t.owner=e.owner),e.resync===!0&&(t.resync=!0),t}function Yr(e){if(!_(e))return;let t=e;if(typeof t.finished_at!="string"||typeof t.outcome!="string"||typeof t.interval_s!="number"||!Number.isFinite(t.interval_s))return;let r=zr(t.selection);if(r)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:r}}function zr(e){if(!_(e))return;let t=e;if(t.kind==="bundled")return t.why==="server"||t.why==="bootstrap_failed"?{kind:"bundled",why:t.why}:void 0;if(t.kind==="cached"&&typeof t.digest=="string"&&jr.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&Wr(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function Wr(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==$r||t.toString("base64")!==e))return t.toString("hex")}import{join as le}from"node:path";async function fe(e,t,r){let n=w(t);await e.mkdir(n,{recursive:!0}),await J(e,n,r.nowMs);let o=L(await y(e,t,!0),r.nowMs,r.ttlFloorS);return o.futureDated?kt(e,t,{...r,resync:!0,n:o.latest+1}):o.deadlineMs!==void 0&&r.nowMs<o.deadlineMs?{kind:"too_soon",deadlineMs:o.deadlineMs,latest:o.latest}:kt(e,t,{...r,n:o.latest+1})}var de={kind:"bundled",why:"bootstrap_failed"};function pe(e,t,r,n,o,a){return(s,c,i)=>Qr(e,t,{n:r.n,startedAtMs:r.startedAtMs,nowMs:n(),budgetMs:o,intervalS:je(i,a),outcome:s,selection:c})}async function Qr(e,t,r){if(r.nowMs-r.startedAtMs>r.budgetMs+3e4)return{recorded:!1,why:"expired"};let n=await y(e,t);if(A(n.claims)>r.n)return{recorded:!1,why:"superseded"};if(n.dones.has(r.n))return{recorded:!1,why:"already_done"};let o={finished_at:new Date(r.nowMs).toISOString(),interval_s:r.intervalS,outcome:r.outcome,selection:r.selection};return await J(e,w(t),r.nowMs),await N(e,le(w(t),ue(r.n)),JSON.stringify(o)),await Zr(e,t,r.n),{recorded:!0}}async function Zr(e,t,r){let n=await y(e,t),o=r-8,a=A(n.dones),s=w(t),c=new Set([...n.claims.keys(),...n.dones.keys()]);await Promise.all([...c].map(async i=>{i>=o||i!==a&&(await G(e,le(s,ce(i))),await G(e,le(s,ue(i))))}))}async function kt(e,t,r){if(r.n<1||r.n>9999999999)return{kind:"lost"};let n=w(t),o=le(n,ce(r.n)),a=new Date(r.nowMs).toISOString(),s=He(),c={started_at:a,nonce:s,owner:r.owner};r.resync&&(c.resync=!0);try{await ie(e,o,JSON.stringify(c)),await e.fsyncDir(n)}catch(i){if(De(i))return{kind:"lost"};throw i}return r.collectorRedacted!==void 0&&await en(e,t,r.collectorRedacted,r.dev===!0),A((await y(e,t)).claims)>r.n?{kind:"lost"}:r.resync?{kind:"resynced",n:r.n,startedAt:a}:{kind:"claimed",n:r.n,startedAt:a,startedAtMs:r.nowMs,nonce:s,owner:r.owner}}async function en(e,t,r,n){let o=se(t);try{await ie(e,o,Buffer.from(JSON.stringify({collector:r,dev:n}),"utf8")),await e.fsyncDir(t)}catch(a){if(De(a))return;throw a}}import{readFileSync as bn}from"node:fs";import{homedir as wn}from"node:os";import{join as xn}from"node:path";import{createHash as tn}from"node:crypto";import{access as rn,readFile as nn,stat as on}from"node:fs/promises";import{homedir as sn}from"node:os";import{dirname as an,join as $e,parse as cn,resolve as St}from"node:path";var un="https://hooks.ev-ai.ai",ln=".claude/ev-ai-runtime-report.json",fn="config.json",dn=1024*1024,Ot=new Set(["localhost","127.0.0.1","[::1]","::1"]),pn=["claude","cursor","codex"],mn=[ln,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],bt=/^[A-Za-z0-9._~-]+$/;function hn(e){return e!==void 0&&pn.includes(e)}function me(e,t){let r=e[t+1];return r&&!r.startsWith("--")?{value:r,next:t+1}:{next:t}}function gn(e){let t,r,n,o,a;for(let s=0;s<e.length;s++){let c=e[s];if(c!==void 0){if(c==="--runner"){let i=me(e,s);t=i.value,s=i.next;continue}if(c.startsWith("--runner=")){t=c.slice(9);continue}if(c==="--url"){let i=me(e,s);i.value&&(n=i.value),s=i.next;continue}if(c.startsWith("--url=")){n=c.slice(6);continue}if(c==="--token"){let i=me(e,s);i.value&&(o=i.value),s=i.next;continue}if(c.startsWith("--token=")){o=c.slice(8);continue}if(c==="--base-url"){let i=me(e,s);i.value&&(a=i.value),s=i.next;continue}if(c.startsWith("--base-url=")){a=c.slice(11);continue}c!==at&&!c.startsWith("-")&&r===void 0&&(r=c)}}return{runner:hn(t)?t:void 0,event:r,collectorUrl:n,orgToken:o,baseUrl:a}}function vt(e,t=un){let r=t.replace(/\/+$/,""),n=e.trim();return`${r}/${n}/hook`}function Ge(e=sn()){return $e(e,".ev-ai",fn)}function _n(e,t){return{...e,...t}}function wt(e){for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);if(r<=32||r===127||r===39)return!0}return!1}function Nt(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?Ot.has(t.hostname):!1}catch{return!1}}function It(e){try{let r=new URL(e).pathname.split("/").filter(n=>n.length>0);if(r.length>=2&&r[r.length-1]==="hook"){let n=r[r.length-2];return n&&n.length>0?n:void 0}return}catch{return}}function Je(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!Nt(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let r=It(e);if(!r)return`must end with /{orgToken}/hook (got: ${e})`;if(!bt.test(r))return`org token must match ${bt.source} (got: ${r})`;if(wt(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(wt(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function yn(e){return new URL(e).toString()}function xt(e){if(e.collector_url)return e.collector_url;let t=e.repo_ingest_token,r=typeof t=="string"?t.trim():void 0;return r?vt(r):""}function B(e){try{return Ot.has(new URL(e).hostname)}catch{return!1}}function Pt(e){try{let t=new URL(e),r=t.pathname.split("/").filter(n=>n.length>0);return r.length>=2&&r[r.length-1]==="hook"&&(r[r.length-2]="***",t.pathname=`/${r.join("/")}`),t.toString()}catch{return"<invalid-url>"}}function En(e){let t=e.collectorUrl?.trim(),r;if(t)r=t;else{let o=e.orgToken?.trim();o&&(r=vt(o,e.baseUrl?.trim()??void 0))}if(!r)return{};let n=Je(r);return n?{problem:n}:{url:yn(r)}}var Ye={access:rn,stat:on,readFile:(e,t)=>nn(e,t)};async function Rn(e,t,r=Ye){let n=St(e),{root:o}=cn(n);for(;;){let s=$e(n,".git");try{let i=await r.stat(s);if(i.isDirectory()||i.isFile())return n}catch{}if(n===o)break;let c=an(n);if(c===n)break;n=c}let a=t.CURSOR_PROJECT_DIR??t.CLAUDE_PROJECT_DIR;if(a)try{if((await r.stat(a)).isDirectory())return a}catch{}return St(e)}async function X(e,t=Ye){try{let r=await t.stat(e);if(!r.isFile()||r.size>dn)return;let n=await t.readFile(e,"utf8"),o=JSON.parse(n);return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function At(e,t){return(await Promise.all(mn.map(async n=>{let o=$e(e,n);try{return await t.access(o),o}catch{return}}))).find(n=>n!==void 0)}async function Ft(e){let t=e.fs??Ye,r=En(gn(e.argv));if(r.url)return{url:r.url,source:"argv"};let n=e.env.EV_AI_HOOK_MANIFEST;if(n)try{await t.access(n);let f=await X(n,t),d=f?xt(f):"";return d?{url:d,source:"manifest_override"}:{source:"none"}}catch{}let o=await Rn(e.cwd,e.env,t),a=Ge(e.home),[s,c]=await Promise.all([X(a,t),At(o,t).then(async f=>f??At(e.cwd,t))]),i=c?await X(c,t):void 0,l;s&&i?l=_n(i,s):s?l=s:i&&(l=i);let u=l?xt(l):"";return u?{url:u,source:"manifest"}:{source:"none"}}function Lt(e){if(Je(e))return;let t;try{t=new URL(e)}catch{return}let r=It(e);if(!r)return;let o=t.pathname.split("/").filter(c=>c.length>0).slice(0,-2),a=o.length>0?`/${o.join("/")}`:"",s=`${t.origin}${a}/${r}`;return tn("sha256").update(s).digest("hex").slice(0,32)}var kn=/^[A-Za-z0-9._~-]+$/;function Mt(e,t){if(!kn.test(t)||Je(e))return;let r;try{r=new URL(e)}catch{return}let n=r.pathname.split("/").filter(a=>a.length>0);if(n.length<2||n[n.length-1]!=="hook")return;n[n.length-1]=t;let o=new URL(r.origin);if(o.pathname=`/${n.join("/")}`,o.search="",o.hash="",o.username="",o.password="",!(o.username||o.password)&&o.origin===r.origin&&Nt(o.toString()))return o.toString()}function Dt(e){return Mt(e,"version")}function Ht(e){return Mt(e,"error-report")}var Ut=/^[A-Za-z0-9._-]{8,64}$/;function An(e,t){try{let n=bn(xn(e,".ev-ai","agent-hook","installation.json"),"utf8"),o=JSON.parse(n);if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o.installation_id;if(typeof a=="string"&&Ut.test(a))return a}}catch{}let r=t.EV_AI_HOOK_INSTALLATION_ID?.trim();return r&&Ut.test(r)?r:void 0}async function he(e,t,r,n,o){if(!t.startsWith("failed:")||!n.postJson)return;let a=Ht(e);if(!a)return;let s;try{s=An(o?.home??wn(),o?.env??process.env)}catch{}try{await n.postJson(a,{reason:t.slice(0,512),phase:r,...s?{installation_id:s}:{}},{timeoutMs:500,signal:AbortSignal.timeout(500)})}catch{}}import On from"node:http";import vn from"node:https";import{URL as Nn}from"node:url";function ge(){return{getBounded:Ct,postJson:Fn}}function _e(e,t){return e==="timeout"||e==="network"?"failed:timeout":e==="http_3xx"?"failed:http_3xx":t}function Ct(e,t){let r;try{r=new Nn(e)}catch{return Promise.resolve({ok:!1,reason:"origin_rejected"})}if(r.protocol==="http:"){if(!B(e))return Promise.resolve({ok:!1,reason:"origin_rejected"})}else if(r.protocol!=="https:")return Promise.resolve({ok:!1,reason:"origin_rejected"});let n=r.protocol==="http:"?On:vn;return new Promise(o=>{let a=!1,s=[],c=0,i=f=>{a||(a=!0,t.signal?.removeEventListener("abort",l),o(f))},l=()=>{u.destroy(),i({ok:!1,reason:"timeout"})},u=n.request(r,{method:t.method??"GET",agent:!1,timeout:t.timeoutMs,headers:t.headers},f=>{let d=f.statusCode??0;if(d>=300&&d<400){f.resume(),i({ok:!1,reason:"http_3xx"});return}let p=f.headers["content-length"];if(typeof p=="string"){let h=Number(p);if(Number.isFinite(h)&&h>t.maxBytes){f.destroy(),i({ok:!1,reason:"too_large"});return}}f.on("data",h=>{if(c+=h.length,c>t.maxBytes){f.destroy(),i({ok:!1,reason:"too_large"});return}s.push(h)}),f.on("end",()=>{i({ok:!0,response:{status:d,headers:f.headers,body:Buffer.concat(s)}})}),f.on("error",()=>{i({ok:!1,reason:"network"})})});if(u.on("timeout",()=>{u.destroy(),i({ok:!1,reason:"timeout"})}),u.on("error",()=>{i({ok:!1,reason:"network"})}),t.signal){if(t.signal.aborted){l();return}t.signal.addEventListener("abort",l,{once:!0})}u.end(t.body)})}var In=2048,Pn=1024;function Fn(e,t,r){let n;try{n=Buffer.from(JSON.stringify(t),"utf8")}catch{return Promise.resolve({ok:!1,reason:"network"})}return n.byteLength>In?Promise.resolve({ok:!1,reason:"too_large"}):Ct(e,{maxBytes:Pn,timeoutMs:r.timeoutMs,signal:r.signal,method:"POST",body:n,headers:{"content-type":"application/json","content-length":n.byteLength}})}async function q(e,t){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await X(Ge(t)))?.auto_update===!1}function ze(e){return!!e.CURSOR_SANDBOX}function ye(e,t,r,n){return{source:"bundled",hookPath:e.bundledHookPath,fallbackReason:t,scopeId:r?.scopeId,dev:r?.dev,...n}}import{join as Mn}from"node:path";var Xe=/^[0-9a-f]{128}$/;function Dn(e){return Buffer.from(JSON.stringify({format:e.format,key_id:e.key_id,payload:e.payload,signature:e.signature}),"utf8")}async function Ee(e,t,r,n,o,a,s,c){if(!Xe.test(r)||P(n)!==r)return{ok:!1,reason:"repair_failed"};let i=Ve(t,r);await e.mkdir(i,{recursive:!0}),await J(e,i,s);let l=k(t,r),u=ae(t,r),f=Dn(o);if(await U(e,l,r)==="ok"){let p=await Hn(e,u);if(p?.equals(f))return await We(e,t,r),{ok:!0};let h=await Tn(p,c);return h!==void 0&&h!==a.version?{ok:!1,reason:"metadata_conflict"}:(await N(e,u,f),await We(e,t,r),{ok:!0})}return await N(e,l,n),await N(e,u,f),await U(e,l,r)!=="ok"?{ok:!1,reason:"repair_failed"}:(await We(e,t,r),{ok:!0})}async function Vt(e,t,r){let n=Ke(r.sha512);if(!(n===void 0||!Xe.test(n)))return await U(e,k(t,n),n)==="ok"?n:void 0}async function Hn(e,t){try{return await e.readFile(t)}catch{return}}async function Tn(e,t){if(e===void 0)return;let r;try{r=JSON.parse(e.toString("utf8"))}catch{return}if(!_(r))return;let n=v(r,T(t));return n.ok?n.manifest.version:void 0}async function We(e,t,r){try{let o=(await S(e,t)).filter(i=>Xe.test(i));if(o.length<=8)return;let a=o.filter(i=>i!==r),s=await Promise.all(a.map(async i=>{let l=Number.NEGATIVE_INFINITY;try{l=(await e.stat(ae(t,i))).mtimeMs}catch{}return{name:i,mtimeMs:l}}));s.sort((i,l)=>l.mtimeMs-i.mtimeMs);let c=s.slice(7);await Promise.all(c.map(i=>Un(e,t,i.name)))}catch{}}async function Un(e,t,r){let n=Ve(t,r);try{let o=await S(e,n);await Promise.all(o.map(a=>G(e,Mn(n,a)))),await e.rmdir(n)}catch{}}function Re(e,t){return{launcher:e,protocol:String(1),current:t,platform:`${process.platform}-${process.arch}`,node:process.version,update_format:M}}function Bn(e,t,r=T(t)){if(!_(e))return{ok:!1,reason:"failed:metadata_mismatch"};let n=e.hook_js;if(n===void 0)return{ok:!0,directive:{kind:"none"}};if(!_(n))return{ok:!1,reason:"failed:metadata_mismatch"};if(n.use_bundled===!0)return{ok:!0,directive:{kind:"bundled",intervalS:jn(n.check_interval_s)}};let o=v(n,r);if(!o.ok)return{ok:!1,reason:"failed:metadata_mismatch"};let a=Kn(o.manifest.url,t);return a?a!==o.manifest.version?{ok:!1,reason:"failed:metadata_mismatch"}:{ok:!0,directive:{kind:"target",manifest:o.manifest,envelope:Vn(n)}}:{ok:!1,reason:"failed:origin_rejected"}}async function Kt(e,t,r,n,o,a){let s=$n(e,t),c=await n.getBounded(s,{maxBytes:4096,timeoutMs:r,signal:a});if(!c.ok)return{ok:!1,reason:_e(c.reason,"failed:metadata_mismatch")};let{status:i,body:l}=c.response;if(i!==200)return{ok:!1,reason:`failed:http_${i}`};let u;try{u=JSON.parse(l.toString("utf8"))}catch{return{ok:!1,reason:"failed:metadata_mismatch"}}return Bn(u,o)}function Vn(e){return{format:M,key_id:String(e.key_id),payload:String(e.payload),signature:String(e.signature)}}function Kn(e,t){let r;try{r=new URL(e)}catch{return}if(r.username!==""||r.password!==""||r.search!==""||r.hash!==""||r.pathname.includes(".."))return;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(r.pathname)?.[1];if(o&&(r.protocol==="https:"||t&&r.protocol==="http:"&&B(e)))return o}function jn(e){if(typeof e=="number"&&Number.isInteger(e)&&e>0)return e}function $n(e,t){let r=new URL(e);for(let[n,o]of Object.entries(t))r.searchParams.set(n,o);return r.toString()}async function ke(e,t,r,n,o,a){let s=Dt(e);return s?Kt(s,t,r,n,o,a):{ok:!1,reason:"failed:origin_rejected"}}async function Se(e,t,r,n,o,a,s,c,i,l){let{manifest:u,envelope:f}=n;if(!re(u.version,o))return{ok:!1,reason:"skipped:below_floor"};if(!ne(process.version,u.node_engine))return{ok:!1,reason:"skipped:incompatible_node"};if(u.min_launcher_protocol>1)return{ok:!1,reason:"skipped:incompatible_protocol"};let d=await Vt(e,r,u);if(d){let h=await C(e,r,d,o,a,i);if(h.usable)return{ok:!0,digest:d,reused:!0};if(h.reason==="quarantined")return{ok:!1,reason:"skipped:quarantined"};if(h.reason==="signature_invalid"){let g=k(r,d);if(await U(e,g,d)==="ok"){let V=await e.readFile(g),K=await Ee(e,r,d,V,f,u,a,i);return K.ok?{ok:!0,digest:d,reused:!0}:{ok:!1,reason:`failed:${K.reason}`}}}}let p=await Gn(e,r,n,l,a,i);return p||Jn(e,t,r,n,a,s,c,i)}async function Gn(e,t,r,n,o,a){if(n.length!==0)try{let s=await e.readFile(n);if(!te(s,r.manifest).ok)return;let c=P(s),i=await Ee(e,t,c,s,r.envelope,r.manifest,o,a);return i.ok?{ok:!0,digest:c,reused:!1}:{ok:!1,reason:`failed:${i.reason}`}}catch{return}}async function Jn(e,t,r,n,o,a,s,c){let{manifest:i,envelope:l}=n,u=await t.getBounded(i.url,{maxBytes:i.size,timeoutMs:a,signal:s});if(!u.ok)return{ok:!1,reason:_e(u.reason,"failed:extract_failed")};if(u.response.status!==200)return{ok:!1,reason:`failed:http_${u.response.status}`};let f=u.response.body;if(!te(f,i).ok)return{ok:!1,reason:"failed:integrity_mismatch"};let p=P(f),h=await Ee(e,r,p,f,l,i,o,c);return h.ok?{ok:!0,digest:p,reused:!1}:{ok:!1,reason:`failed:${h.reason}`}}async function Wn(e){let t=e.fs??I(),r=e.http??ge(),n=b(e.home,e.scope.scopeId),o=x(e.home,e.scope.dev),a=F(e.env),s=AbortSignal.timeout(3e3),c=await fe(t,n,{owner:"bootstrap",nowMs:e.nowMs,ttlFloorS:a,collectorRedacted:e.scope.collectorUrlRedacted,dev:e.scope.dev});if(c.kind!=="claimed"){let h=c.kind==="lost"||c.kind==="too_soon";return ye(e,h?"bootstrap_in_progress":"bootstrap_failed",e.scope,{didBootstrap:!1})}let i=pe(t,n,c,()=>Date.now(),3e3,a),l=async h=>(await i(h,de),ye(e,"bootstrap_failed",e.scope,{didBootstrap:!0}));if(s.aborted)return l("failed:bootstrap");let u=await ke(e.scope.collectorUrl,Re(e.bundledVersion,e.bundledVersion),1e3,r,e.scope.dev,s);if(!u.ok)return l(u.reason);let f=u.directive;if(f.kind==="none")return l("failed:bootstrap");if(f.kind==="bundled")return await i("bundled",{kind:"bundled",why:"server"},f.intervalS),ye(e,"server",e.scope,{didBootstrap:!0});let d=await Se(t,r,o,{manifest:f.manifest,envelope:f.envelope},e.bundledVersion,e.nowMs,2e3,s,e.scope.dev,e.bundledHookPath);if(!d.ok)return he(e.scope.collectorUrl,d.reason,"bootstrap",r,{home:e.home,env:e.env}),l(d.reason);let{digest:p}=d;return await i("updated",{kind:"cached",digest:p,version:f.manifest.version,sha512:f.manifest.sha512}),{source:"bootstrap",hookPath:k(o,p),scopeId:e.scope.scopeId,digest:p,dev:e.scope.dev,didBootstrap:!0}}async function be(e,t){let r=await Ft({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!r.url)return;let n=Lt(r.url);if(!(!n||r.source==="none"))return{scopeId:n,collectorUrl:r.url,collectorUrlRedacted:Pt(r.url),source:r.source,dev:B(r.url)}}async function Qn(e,t,r,n,o){try{await Zn(e,t,r,n,o)}catch{}return 0}async function Zn(e,t,r,n,o){if(ze(t)||await q(t,n))return;let a=t[it],s=await be(e,{env:t,cwd:r,home:n});if(!s||!a||s.scopeId!==a)return;let c=o?.fs??I(),i=o?.http??ge(),l=o?.nowMs??Date.now(),u=F(t),f=b(n,s.scopeId);await Te(c,f,l,Xt=>Xt.startsWith(ct),ut).catch(()=>{});let d=await fe(c,f,{owner:"refresh",nowMs:l,ttlFloorS:u,collectorRedacted:s.collectorUrlRedacted,dev:s.dev});if(d.kind!=="claimed")return;let p=pe(c,f,d,()=>Date.now(),6e4,u),h=o?.packageVersion??"",g=L(await y(c,f,!0),l,u).selection,V=g.kind==="uninitialized"?de:g,K=AbortSignal.timeout(6e4),we=await ke(s.collectorUrl,Re(h,g.kind==="cached"?g.version:h),5e3,i,s.dev,K);if(!we.ok){await p(we.reason,V);return}let E=we.directive;if(E.kind==="none"){await p("no_directive",V);return}if(E.kind==="bundled"){await p("bundled",{kind:"bundled",why:"server"},E.intervalS);return}let j=await Se(c,i,x(n,s.dev),{manifest:E.manifest,envelope:E.envelope},h,l,3e4,K,s.dev,o?.bundledHookPath??"");if(!j.ok){he(s.collectorUrl,j.reason,"refresh",i,{home:n,env:t}),await p(j.reason,V);return}let zt=g.kind==="cached"&&g.version===E.manifest.version&&g.sha512===E.manifest.sha512,{digest:Wt}=j;await p(zt?j.reused?"current":"repaired":"updated",{kind:"cached",digest:Wt,version:E.manifest.version,sha512:E.manifest.sha512})}function eo(e){return`${e.slice(0,4)}\u2026`}async function to(e,t,r){let n=e.includes("--json"),o=e.includes("--all"),a=e.slice(1).filter(p=>p!=="--json"&&p!=="--all"),s=await be(a,t),c=await q(t.env,t.home),i=I(),l=await Yt(t,r,s,i,c),u=await ro(i,t.home,s?.scopeId),f=o?await no(t,r,i,c,u):[];if(n)return t.stdout.write(`${JSON.stringify({...l,otherScopes:f},null,2)}
3
+ `),0;let d=[`launcher ${r.version} protocol ${r.evAi.launcherProtocol} revision ${r.evAi.launcherRevision} bundled hook ${r.version}`];if(d.push(...Jt(l)),o)for(let p of f)d.push(""),d.push(...Jt(p));else d.push(`other scopes ${u.length} (status --all)`);return d.push(`auto-update ${c?"off":"on"}`),t.stdout.write(`${d.join(`
4
4
  `)}
5
- `),0}async function $t(e,t,r,n,o){let s=!o;if(o)return{...Kt(r,s),selection:"bundled",fallbackReason:"kill_switch"};if(!r)return{selection:"bundled",fallbackReason:"no_collector_url",autoUpdate:s};let a=e.now(),c=await y(n,b(e.home,r.scopeId),!0),i=L(c,a,F(e.env)),u="bundled",l,f;if(i.selection.kind==="cached"){let d=x(e.home,r.dev),p=await C(n,d,i.selection.digest,t.version,a,r.dev);p.usable?(u=`cached ${i.selection.version}`,f=`usable (protocol ${p.manifest.min_launcher_protocol})`):l=p.reason}else i.selection.kind==="bundled"?l=i.selection.why:l="uninitialized";return{...Kt(r,s),selection:u,fallbackReason:l,usable:f,lastAttempt:i.startMs!==void 0?new Date(i.startMs).toISOString():void 0,nextNotBefore:i.deadlineMs!==void 0?new Date(i.deadlineMs).toISOString():void 0,intervalS:i.intervalS,lastResult:i.lastOutcome}}function Kt(e,t){return{scopeId:e?.scopeId,collectorUrlRedacted:e?.collectorUrlRedacted,urlSource:e?.source,autoUpdate:t}}function jt(e){let t=[];e.scopeId?t.push(`this repo scope ${Xn(e.scopeId)} ${e.collectorUrlRedacted} (source: ${e.urlSource})`):t.push("this repo (no collector url)");let r=e.fallbackReason?` (${e.fallbackReason})`:e.usable?` ${e.usable}`:"";return t.push(` selection ${e.selection}${r}`),e.lastAttempt&&t.push(` schedule last attempt ${e.lastAttempt} next not before ${e.nextNotBefore} (interval ${Math.round((e.intervalS??0)/3600)} h)`),e.lastResult&&t.push(` last result ${e.lastResult}`),t}async function Qn(e,t,r){return(await E(e,He(t))).filter(n=>n!==r)}function Zn(e,t,r,n,o){return Promise.all(o.map(async s=>{let a=await eo(r,b(e.home,s)),c={scopeId:s,collectorUrl:"",collectorUrlRedacted:a.collector??"",source:"manifest",dev:a.dev};return $t(e,t,c,r,n)}))}async function eo(e,t){try{let r=JSON.parse((await e.readFile(se(t))).toString("utf8"));if(_(r))return{collector:typeof r.collector=="string"?r.collector:void 0,dev:r.dev===!0}}catch{}return{dev:!1}}export{Gn as bootstrap,zn as runRefresh,qn as runStatus};
5
+ `),0}async function Yt(e,t,r,n,o){let a=!o;if(o)return{...Gt(r,a),selection:"bundled",fallbackReason:"kill_switch"};if(!r)return{selection:"bundled",fallbackReason:"no_collector_url",autoUpdate:a};let s=e.now(),c=await y(n,b(e.home,r.scopeId),!0),i=L(c,s,F(e.env)),l="bundled",u,f;if(i.selection.kind==="cached"){let d=x(e.home,r.dev),p=await C(n,d,i.selection.digest,t.version,s,r.dev);p.usable?(l=`cached ${i.selection.version}`,f=`usable (protocol ${p.manifest.min_launcher_protocol})`):u=p.reason}else i.selection.kind==="bundled"?u=i.selection.why:u="uninitialized";return{...Gt(r,a),selection:l,fallbackReason:u,usable:f,lastAttempt:i.startMs!==void 0?new Date(i.startMs).toISOString():void 0,nextNotBefore:i.deadlineMs!==void 0?new Date(i.deadlineMs).toISOString():void 0,intervalS:i.intervalS,lastResult:i.lastOutcome}}function Gt(e,t){return{scopeId:e?.scopeId,collectorUrlRedacted:e?.collectorUrlRedacted,urlSource:e?.source,autoUpdate:t}}function Jt(e){let t=[];e.scopeId?t.push(`this repo scope ${eo(e.scopeId)} ${e.collectorUrlRedacted} (source: ${e.urlSource})`):t.push("this repo (no collector url)");let r=e.fallbackReason?` (${e.fallbackReason})`:e.usable?` ${e.usable}`:"";return t.push(` selection ${e.selection}${r}`),e.lastAttempt&&t.push(` schedule last attempt ${e.lastAttempt} next not before ${e.nextNotBefore} (interval ${Math.round((e.intervalS??0)/3600)} h)`),e.lastResult&&t.push(` last result ${e.lastResult}`),t}async function ro(e,t,r){return(await S(e,Ce(t))).filter(n=>n!==r)}function no(e,t,r,n,o){return Promise.all(o.map(async a=>{let s=await oo(r,b(e.home,a)),c={scopeId:a,collectorUrl:"",collectorUrlRedacted:s.collector??"",source:"manifest",dev:s.dev};return Yt(e,t,c,r,n)}))}async function oo(e,t){try{let r=JSON.parse((await e.readFile(se(t))).toString("utf8"));if(_(r))return{collector:typeof r.collector=="string"?r.collector:void 0,dev:r.dev===!0}}catch{}return{dev:!1}}export{Wn as bootstrap,Qn as runRefresh,to as runStatus};
package/dist/launcher.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import{spawn as Pr}from"node:child_process";import{homedir as Lr}from"node:os";import{fileURLToPath as Zt}from"node:url";import{createHash as yt}from"node:crypto";import{join as H}from"node:path";var ie="signed-hook-v1",se=Buffer.from("ev-ai-hook-release-v1\0","utf8"),T=32;var Fe=64,ae=64;import{sign as oo,verify as _n}from"node:crypto";var tn=/^[A-Za-z0-9+/]+=*$/;function D(e){if(e.length===0||!tn.test(e))return;let t=Buffer.from(e,"base64");if(t.toString("base64")===e)return t}import{createPrivateKey as Vr,createPublicKey as rn,timingSafeEqual as Kr}from"node:crypto";var on=Buffer.from("302a300506032b6570032100","hex"),Gr=Buffer.from("302e020100300506032b657004220420","hex");function sn(e){let t=Buffer.from(e,"base64");if(t.byteLength!==T||t.toString("base64")!==e)throw new Error("invalid production public key");return t}var V=Object.freeze({"release-key-1":sn("jVk7k2gEEcdAiPOFtNZomu36bOpfkk0vgF9dC6FMcS0=")});function Ue(e){if(e.byteLength!==T)throw new Error("Ed25519 public key must be 32 bytes");return rn({key:Buffer.concat([on,Buffer.from(e)]),format:"der",type:"spki"})}function He(e,t){if(!Object.hasOwn(e,t))return;let n=e[t];if(n?.byteLength===T)return n}var p={UNKNOWN_FORMAT:"unknown_format",UNKNOWN_KEY:"unknown_key",NON_CANONICAL_BASE64:"non_canonical_base64",INVALID_SIGNATURE_LENGTH:"invalid_signature_length",SIGNATURE_INVALID:"signature_invalid",TRAILING_BYTES:"trailing_bytes",UNKNOWN_FIELD:"unknown_field",DUPLICATE_FIELD:"duplicate_field",MISSING_FIELD:"missing_field",INVALID_TYPE:"invalid_type",INVALID_VERSION:"invalid_version",INVALID_URL:"invalid_url",URL_VERSION_MISMATCH:"url_version_mismatch",INVALID_SHA512:"invalid_sha512",INVALID_SIZE:"invalid_size",INVALID_NODE_ENGINE:"invalid_node_engine",INVALID_PROTOCOL:"invalid_protocol",INVALID_PACKAGE:"invalid_package",INVALID_JSON:"invalid_json",INVALID_ENVELOPE:"invalid_envelope",INVALID_KEY_ID:"invalid_key_id"};function Be(e){let t;try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return{ok:!1,reason:p.INVALID_JSON}}return an(t)}function an(e){if(e.length===0)return{ok:!1,reason:p.INVALID_JSON};if(e.trimStart()!==e||e.trimEnd()!==e)return{ok:!1,reason:p.TRAILING_BYTES};let t=new ce(e);try{let n=t.parseValue();return t.atEnd()?{ok:!0,value:n}:{ok:!1,reason:p.TRAILING_BYTES}}catch(n){return n instanceof K?{ok:!1,reason:p.DUPLICATE_FIELD}:{ok:!1,reason:p.INVALID_JSON}}}var K=class extends Error{constructor(){super("duplicate field")}},ce=class{text;i=0;constructor(t){this.text=t}atEnd(){return this.i>=this.text.length}parseValue(){this.skipWs();let t=this.text[this.i];if(t==="{")return this.parseObject();if(t==="[")return this.parseArray();if(t==='"')return this.parseString();if(t==="t"||t==="f"||t==="n")return this.parseLiteral();if(t==="-"||t!==void 0&&t>="0"&&t<="9")return this.parseNumber();throw new SyntaxError("invalid json")}skipWs(){let{text:t}=this;for(;this.i<t.length;){let n=t.charCodeAt(this.i);if(n!==32&&n!==10&&n!==13&&n!==9)break;this.i+=1}}parseObject(){this.expect("{"),this.skipWs();let t=Object.create(null),n=new Set;if(this.text[this.i]==="}")return this.i+=1,t;for(;;){if(this.skipWs(),this.text[this.i]!=='"')throw new SyntaxError("expected key");let r=this.parseString();if(n.has(r))throw new K;n.add(r),this.skipWs(),this.expect(":"),t[r]=this.parseValue(),this.skipWs();let o=this.text[this.i];if(o===","){this.i+=1;continue}if(o==="}")return this.i+=1,t;throw new SyntaxError("expected comma or end of object")}}parseArray(){this.expect("["),this.skipWs();let t=[];if(this.text[this.i]==="]")return this.i+=1,t;for(;;){t.push(this.parseValue()),this.skipWs();let n=this.text[this.i];if(n===","){this.i+=1;continue}if(n==="]")return this.i+=1,t;throw new SyntaxError("expected comma or end of array")}}parseString(){this.expect('"');let{text:t}=this,n="";for(;this.i<t.length;){let r=t.charCodeAt(this.i);if(r===34)return this.i+=1,n;if(r===92){this.i+=1,n+=this.parseEscape();continue}if(r<32)throw new SyntaxError("unescaped control");n+=t[this.i],this.i+=1}throw new SyntaxError("unterminated string")}parseEscape(){let t=this.text[this.i];if(t===void 0)throw new SyntaxError("unterminated escape");switch(this.i+=1,t){case'"':case"\\":case"/":return t;case"b":return"\b";case"f":return"\f";case"n":return`
4
- `;case"r":return"\r";case"t":return" ";case"u":{let n=this.text.slice(this.i,this.i+4);if(!/^[0-9a-fA-F]{4}$/.test(n))throw new SyntaxError("invalid unicode escape");return this.i+=4,String.fromCharCode(Number.parseInt(n,16))}default:throw new SyntaxError("invalid escape")}}parseLiteral(){if(this.text.startsWith("true",this.i))return this.i+=4,!0;if(this.text.startsWith("false",this.i))return this.i+=5,!1;if(this.text.startsWith("null",this.i))return this.i+=4,null;throw new SyntaxError("invalid literal")}parseNumber(){let t=this.i,{text:n}=this;if(n[this.i]==="-"&&(this.i+=1),n[this.i]==="0")this.i+=1;else if(this.isDigit(n[this.i]))for(;this.isDigit(n[this.i]);)this.i+=1;else throw new SyntaxError("invalid number");if(n[this.i]==="."){if(this.i+=1,!this.isDigit(n[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(n[this.i]);)this.i+=1}if(n[this.i]==="e"||n[this.i]==="E"){if(this.i+=1,(n[this.i]==="+"||n[this.i]==="-")&&(this.i+=1),!this.isDigit(n[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(n[this.i]);)this.i+=1}let r=Number(n.slice(t,this.i));if(!Number.isFinite(r))throw new SyntaxError("invalid number");return r}expect(t){if(this.text[this.i]!==t)throw new SyntaxError(`expected ${t}`);this.i+=1}isDigit(t){return t!==void 0&&t>="0"&&t<="9"}};var Ke=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],cn=new Set(Ke),un=/^\d+\.\d+\.\d+$/,fn=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,ln=/^[@A-Za-z0-9._/~-]{1,214}$/;function ue(e){let t=Be(e);return t.ok?dn(t.value):t}function dn(e){if(!fe(e))return{ok:!1,reason:p.INVALID_JSON};for(let f of Object.keys(e))if(!cn.has(f))return{ok:!1,reason:p.UNKNOWN_FIELD};for(let f of Ke)if(!(f in e))return{ok:!1,reason:p.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!ln.test(t)||t.includes(".."))return{ok:!1,reason:p.INVALID_PACKAGE};let n=e.version;if(typeof n!="string"||!un.test(n))return{ok:!1,reason:p.INVALID_VERSION};let r=e.url;if(typeof r!="string")return{ok:!1,reason:p.INVALID_URL};let o=pn(r,n);if(o!==void 0)return{ok:!1,reason:o};let c=e.sha512;if(typeof c!="string")return{ok:!1,reason:p.INVALID_SHA512};if(D(c)?.byteLength!==ae)return{ok:!1,reason:p.INVALID_SHA512};let i=e.size;if(typeof i!="number"||!Number.isInteger(i)||i<1||i>4194304)return{ok:!1,reason:p.INVALID_SIZE};let s=e.node_engine;if(typeof s!="string"||fn.exec(s)===null)return{ok:!1,reason:p.INVALID_NODE_ENGINE};let u=e.min_launcher_protocol;return typeof u!="number"||!Number.isInteger(u)||u<1||!Number.isSafeInteger(u)?{ok:!1,reason:p.INVALID_PROTOCOL}:{ok:!0,manifest:{package:t,version:n,url:r,sha512:c,size:i,node_engine:s,min_launcher_protocol:u}}}function fe(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function pn(e,t){if(e.includes("..")||/%2e/i.test(e)||/[\\?#]/.test(e))return p.INVALID_URL;let n;try{n=new URL(e)}catch{return p.INVALID_URL}if(n.href!==e)return p.INVALID_URL;if(!hn(n))return p.INVALID_URL;if(n.username!==""||n.password!=="")return p.INVALID_URL;if(n.search!==""||n.hash!=="")return p.INVALID_URL;if(n.hostname===""||n.pathname.includes(".."))return p.INVALID_URL;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(n.pathname)?.[1];if(o===void 0)return p.INVALID_URL;if(o!==t)return p.URL_VERSION_MISMATCH}var mn=new Set(["localhost","127.0.0.1","[::1]"]);function hn(e){return e.protocol==="https:"?!0:e.protocol==="http:"?mn.has(e.hostname):!1}var yn=["format","key_id","payload","signature"],En=/^[A-Za-z0-9._-]{1,128}$/;function Sn(e,t){return Buffer.concat([se,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function le(e,t){if(!fe(e))return{ok:!1,reason:p.INVALID_ENVELOPE};if(e.format!==ie)return{ok:!1,reason:p.UNKNOWN_FORMAT};for(let f of Object.keys(e))if(f!=="format"&&f!=="key_id"&&f!=="payload"&&f!=="signature")return{ok:!1,reason:p.UNKNOWN_FIELD};for(let f of yn)if(!(f in e))return{ok:!1,reason:p.MISSING_FIELD};let r=e.key_id;if(typeof r!="string"||!En.test(r))return{ok:!1,reason:p.INVALID_KEY_ID};let o=He(t,r);if(o===void 0)return{ok:!1,reason:p.UNKNOWN_KEY};let c=e.payload,a=e.signature;if(typeof c!="string"||typeof a!="string")return{ok:!1,reason:p.INVALID_ENVELOPE};let i=D(c),s=D(a);if(i===void 0||s===void 0)return{ok:!1,reason:p.NON_CANONICAL_BASE64};if(s.byteLength!==Fe)return{ok:!1,reason:p.INVALID_SIGNATURE_LENGTH};let u=!1;try{u=_n(null,Sn(r,i),Ue(o),s)}catch{u=!1}return u?ue(i):{ok:!1,reason:p.SIGNATURE_INVALID}}var An=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,bn=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,xn=/^v?(\d+)\.(\d+)\.(\d+)/;function je(e){let t=An.exec(e);if(t)return{...pe(t),prerelease:t[4]?.split(".")}}function de(e,t){let n=je(e),r=je(t);if(!(!n||!r))return n.major!==r.major?n.major-r.major:n.minor!==r.minor?n.minor-r.minor:n.patch!==r.patch?n.patch-r.patch:wn(n.prerelease,r.prerelease)}function Ge(e,t){let n=de(e,t);return n!==void 0&&n>=0}function kn(e){let t=bn.exec(e.trim());return t?pe(t):void 0}function pe(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function Ye(e,t){let n=kn(t),r=xn.exec(e.trim()),o=r?pe(r):void 0;return!n||!o?!1:o.major!==n.major?o.major>n.major:o.minor!==n.minor?o.minor>n.minor:o.patch>=n.patch}function wn(e,t){if(e===void 0&&t===void 0)return 0;if(e===void 0)return 1;if(t===void 0)return-1;let n=Math.max(e.length,t.length);for(let r=0;r<n;r++){let o=e[r],c=t[r];if(o===void 0)return-1;if(c===void 0)return 1;let a=Nn(o,c);if(a!==0)return a}return 0}function Nn(e,t){let n=/^\d+$/.test(e),r=/^\d+$/.test(t);if(n&&r){let o=Number(e)-Number(t);return o<0?-1:o>0?1:0}return n?-1:r?1:e<t?-1:e>t?1:0}var me="EV_AI_LAUNCHER_VERSION",he="EV_AI_LAUNCHER_PROTOCOL",ge="EV_AI_HOOK_SOURCE",j="EV_AI_HOOK_FALLBACK_REASON",G="EV_AI_LAUNCHER_SCOPE",_e="EV_AI_LAUNCHER_READY_FD",Je="EV_AI_LAUNCHER_REFRESH_SCOPE",We="EV_AI_HOOK_UPDATE_TTL_MIN",Y="--defer-user-spec",$e=Buffer.from([1]),ze='{"continue":true}',Xe=3e3,qe=1024*1024,Ze=4*1024*1024,ye=64*1024,Ee=64*1024,J=64*1024,Qe=2e3,W=250,et=8e3,Se=14e3,tt=1e3,nt=1e3,M=21600,Re=604800,rt=3e5,Ae=4096,$=4*1024*1024,ot=2,it=864e5;import{randomBytes as vn}from"node:crypto";import{basename as In,dirname as On,join as st}from"node:path";import{open as at,mkdir as Pn,readFile as Ln,readdir as Cn,rename as Tn,stat as Dn,rmdir as Mn,unlink as Fn,utimes as Un}from"node:fs/promises";var z=new WeakMap;function ut(e){if(e&&typeof e=="object"&&"code"in e)return e}function C(e){return ut(e)?.code==="ENOENT"}function Hn(e){let t=ut(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function ft(e,t){try{return await e.readdir(t)}catch(n){if(C(n))return[];throw n}}async function Bn(e,t,n){let r=await e.open(t,"wx");try{await e.write(r,n),await e.fsync(r)}finally{await e.close(r)}}function Vn(){return vn(8).toString("hex")}async function U(e,t,n){let r=On(t),o=Vn(),c=`.${In(t)}.`,a=st(r,`${c}${o}`),i=()=>e.unlink(a).catch(()=>{});await Bn(e,a,n);try{await e.rename(a,t)}catch(s){if(!Hn(s))throw await i(),s;let u=st(r,`${c}bad.${o}`);try{await e.rename(t,u)}catch(f){if(!C(f))throw await i(),f}await e.rename(a,t)}await e.fsyncDir(r)}function X(){return{async open(e,t){let n=await at(e,t),r={path:e};return z.set(r,n),r},async write(e,t){let n=ct(e),r=typeof t=="string"?Buffer.from(t,"utf8"):t;await n.write(r)},async fsync(e){await ct(e).sync()},async close(e){let t=z.get(e);z.delete(e),t&&await t.close()},rename:Tn,async readdir(e){return Cn(e)},readFile:Ln,async stat(e){let t=await Dn(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await Pn(e,t)},unlink:Fn,rmdir:Mn,utimes:Un,async fsyncDir(e){if(process.platform==="win32")return;let t=await at(e,"r");try{await t.sync()}finally{await t.close()}}}}function ct(e){let t=z.get(e);if(!t)throw new Error("closed");return t}function v(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var dt=Object.freeze({"test-key-1":lt("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":lt("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function lt(e){let t=Buffer.from(e,"base64");if(t.byteLength!==T||t.toString("base64")!==e)throw new Error("invalid test public key");return t}function pt(e){return e?{...dt,...V}:V}import{join as q}from"node:path";function be(e){return q(e,".ev-ai","agent-hook","js","signed-v1")}function Kn(e){return q(be(e),"scopes")}function mt(e,t){return q(Kn(e),t)}function ht(e){return q(e,"attempts")}function xe(e){return String(e).padStart(10,"0")}function Z(e,t){return H(be(e),t?"dev-artifacts":"artifacts")}function jn(e,t){return H(e,t)}function Q(e,t){return H(e,t,"hook.mjs")}function Gn(e,t){return H(e,t,"release.json")}function we(e,t){return H(e,t,"health.json")}function Et(e){return yt("sha512").update(e).digest("hex")}async function Ne(e,t,n){try{let r=await e.readFile(n);if(r.byteLength<=0||r.byteLength>$)return;let o=Et(r),c=Q(t,o);return await gt(e,c,o)==="ok"?o:(await e.mkdir(jn(t,o),{recursive:!0}),await U(e,c,r),await gt(e,c,o)==="ok"?o:void 0)}catch{return}}async function gt(e,t,n){try{let r=await e.stat(t);return r.size<=0||r.size>$?"bad":Et(await e.readFile(t))===n?"ok":"bad"}catch(r){if(C(r))return"missing";throw r}}async function St(e,t,n,r,o,c,a=process.version){let[i,s,u]=await Promise.all([_t(e,Q(t,n)),_t(e,Gn(t,n)),ve(e,we(t,n))]);if(i===void 0)return{usable:!1,reason:"artifact_missing"};if(s===void 0)return{usable:!1,reason:"signature_invalid"};let f;try{f=JSON.parse(s.toString("utf8"))}catch{return{usable:!1,reason:"signature_invalid"}}let m=le(f,pt(c));if(!m.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:l}=m;if(i.byteLength!==l.size||i.byteLength>$)return{usable:!1,reason:"hash_mismatch"};let d=yt("sha512").update(i).digest();if(d.toString("hex")!==n)return{usable:!1,reason:"hash_mismatch"};let _=Buffer.from(l.sha512,"base64");if(d.byteLength!==_.byteLength||!d.equals(_))return{usable:!1,reason:"hash_mismatch"};if(!Ge(l.version,r))return{usable:!1,reason:"below_floor"};if(!Ye(a,l.node_engine))return{usable:!1,reason:"incompatible_node"};if(l.min_launcher_protocol>1)return{usable:!1,reason:"incompatible_protocol"};if(u?.quarantined_until){let R=Date.parse(u.quarantined_until);if(Number.isFinite(R)&&R>o)return{usable:!1,reason:"quarantined"}}return{usable:!0,manifest:l,healthFails:u?.consecutive_startup_failures??0}}async function _t(e,t){try{return await e.readFile(t)}catch(n){if(C(n))return;throw n}}async function ve(e,t){try{let n=await e.readFile(t),r=JSON.parse(n.toString("utf8"));if(!v(r))return;let o=r.consecutive_startup_failures;if(typeof o!="number"||!Number.isInteger(o)||o<0)return;let c={consecutive_startup_failures:o};return typeof r.quarantined_until=="string"&&(c.quarantined_until=r.quarantined_until),c}catch{return}}import{createHash as Yn}from"node:crypto";import{access as Jn,readFile as Wn,stat as $n}from"node:fs/promises";import{homedir as zn}from"node:os";import{dirname as Xn,join as Ie,parse as qn,resolve as Rt}from"node:path";var Zn="https://hooks.ev-ai.ai",Qn=".claude/ev-ai-runtime-report.json",er="config.json",tr=1024*1024,wt=new Set(["localhost","127.0.0.1","[::1]","::1"]),nr=["claude","cursor","codex"],rr=[Qn,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],At=/^[A-Za-z0-9._~-]+$/;function or(e){return e!==void 0&&nr.includes(e)}function ee(e,t){let n=e[t+1];return n&&!n.startsWith("--")?{value:n,next:t+1}:{next:t}}function Oe(e){let t,n,r,o,c,a=!1;for(let i=0;i<e.length;i++){let s=e[i];if(s!==void 0){if(s==="--runner"){let u=ee(e,i);t=u.value,i=u.next;continue}if(s.startsWith("--runner=")){t=s.slice(9);continue}if(s==="--url"){let u=ee(e,i);u.value&&(r=u.value),i=u.next;continue}if(s.startsWith("--url=")){r=s.slice(6);continue}if(s==="--token"){let u=ee(e,i);u.value&&(o=u.value),i=u.next;continue}if(s.startsWith("--token=")){o=s.slice(8);continue}if(s==="--base-url"){let u=ee(e,i);u.value&&(c=u.value),i=u.next;continue}if(s.startsWith("--base-url=")){c=s.slice(11);continue}if(s===Y){a=!0;continue}!s.startsWith("-")&&n===void 0&&(n=s)}}return{runner:or(t)?t:void 0,event:n,collectorUrl:r,orgToken:o,baseUrl:c,...a?{deferUserSpec:!0}:{}}}function Nt(e,t=Zn){let n=t.replace(/\/+$/,""),r=e.trim();return`${n}/${r}/hook`}function Pe(e=zn()){return Ie(e,".ev-ai",er)}function ir(e,t){return{...e,...t}}function bt(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<=32||n===127||n===39)return!0}return!1}function sr(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?wt.has(t.hostname):!1}catch{return!1}}function vt(e){try{let n=new URL(e).pathname.split("/").filter(r=>r.length>0);if(n.length>=2&&n[n.length-1]==="hook"){let r=n[n.length-2];return r&&r.length>0?r:void 0}return}catch{return}}function It(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!sr(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let n=vt(e);if(!n)return`must end with /{orgToken}/hook (got: ${e})`;if(!At.test(n))return`org token must match ${At.source} (got: ${n})`;if(bt(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(bt(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function ar(e){return new URL(e).toString()}function xt(e){if(e.collector_url)return e.collector_url;let t=e.repo_ingest_token,n=typeof t=="string"?t.trim():void 0;return n?Nt(n):""}function Ot(e){try{return wt.has(new URL(e).hostname)}catch{return!1}}function Pt(e){try{let t=new URL(e),n=t.pathname.split("/").filter(r=>r.length>0);return n.length>=2&&n[n.length-1]==="hook"&&(n[n.length-2]="***",t.pathname=`/${n.join("/")}`),t.toString()}catch{return"<invalid-url>"}}function cr(e){let t=e.collectorUrl?.trim(),n;if(t)n=t;else{let o=e.orgToken?.trim();o&&(n=Nt(o,e.baseUrl?.trim()??void 0))}if(!n)return{};let r=It(n);return r?{problem:r}:{url:ar(n)}}var Le={access:Jn,stat:$n,readFile:(e,t)=>Wn(e,t)};async function ur(e,t,n=Le){let r=Rt(e),{root:o}=qn(r);for(;;){let a=Ie(r,".git");try{let s=await n.stat(a);if(s.isDirectory()||s.isFile())return r}catch{}if(r===o)break;let i=Xn(r);if(i===r)break;r=i}let c=t.CURSOR_PROJECT_DIR??t.CLAUDE_PROJECT_DIR;if(c)try{if((await n.stat(c)).isDirectory())return c}catch{}return Rt(e)}async function B(e,t=Le){try{let n=await t.stat(e);if(!n.isFile()||n.size>tr)return;let r=await t.readFile(e,"utf8"),o=JSON.parse(r);return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function kt(e,t){return(await Promise.all(rr.map(async r=>{let o=Ie(e,r);try{return await t.access(o),o}catch{return}}))).find(r=>r!==void 0)}async function Lt(e){let t=e.fs??Le,n=cr(Oe(e.argv));if(n.url)return{url:n.url,source:"argv"};let r=e.env.EV_AI_HOOK_MANIFEST;if(r)try{await t.access(r);let m=await B(r,t),l=m?xt(m):"";return l?{url:l,source:"manifest_override"}:{source:"none"}}catch{}let o=await ur(e.cwd,e.env,t),c=Pe(e.home),[a,i]=await Promise.all([B(c,t),kt(o,t).then(async m=>m??kt(e.cwd,t))]),s=i?await B(i,t):void 0,u;a&&s?u=ir(s,a):a?u=a:s&&(u=s);let f=u?xt(u):"";return f?{url:f,source:"manifest"}:{source:"none"}}function Ct(e){if(It(e))return;let t;try{t=new URL(e)}catch{return}let n=vt(e);if(!n)return;let o=t.pathname.split("/").filter(i=>i.length>0).slice(0,-2),c=o.length>0?`/${o.join("/")}`:"",a=`${t.origin}${c}/${n}`;return Yn("sha256").update(a).digest("hex").slice(0,32)}async function te(e,t){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await B(Pe(t)))?.auto_update===!1}function F(e){return!!e.CURSOR_SANDBOX}async function Tt(e,t,n,r,o,c){if(F(c))return;let a=we(t,n),i=await ve(e,a),s=i?.consecutive_startup_failures??0;if(!r){s>0&&await U(e,a,JSON.stringify({consecutive_startup_failures:0}));return}let u={consecutive_startup_failures:s+1};s+1>=ot?u.quarantined_until=new Date(o+it).toISOString():i?.quarantined_until&&(u.quarantined_until=i.quarantined_until),await U(e,a,JSON.stringify(u))}function fr(e,t){return new Promise(n=>{try{e.write(t,()=>n())}catch{n()}})}function Dt(e){let t=e.now(),n=Se,r=!1,o=Promise.resolve(),c,a=!1,i=[],s,u,f,m=()=>Math.max(0,t+n-e.now()),l=[],d=(g,A)=>{if(e.installProcessHandlers===!1)return;(e.on??((L,S)=>process.on(L,S)))(g,A),l.push({event:g,handler:A})},_=()=>{let g=e.off??((A,N)=>process.off(A,N));for(let{event:A,handler:N}of l)try{g(A,N)}catch{}l.length=0},R=g=>(r||(r=!0,o=fr(e.stdout,g??ze)),o),E=g=>{if(c)try{c.kill(g)}catch{}},I=()=>{for(let g of i)try{g()}catch{}},x=()=>{a||(I(),E("SIGTERM"),u=e.setTimeout(()=>{E("SIGKILL")},W),R())},k=()=>{R().finally(()=>{e.exit(0)})},O=()=>{a||(I(),k())},P=()=>{s&&e.clearTimeout(s),f&&e.clearTimeout(f),s=e.setTimeout(x,m());let g=Math.max(0,t+n+tt-e.now());f=e.setTimeout(O,g)};P(),d("uncaughtException",k),d("unhandledRejection",k);for(let g of["SIGTERM","SIGINT"])d(g,()=>{E(g),k()});return{ackOnce:R,remainingMs:m,eventBudgetMs:()=>n,onEventClassified(g){let A=g?Se:et;A<n&&(n=A,P())},setChild(g){c=g},onAbort(g){i.push(g)},dispose(){a=!0,s&&e.clearTimeout(s),u&&e.clearTimeout(u),f&&e.clearTimeout(f),_()},waitForAckWrite(){return o}}}function lr(e){let t=e.trim();if(t)try{let n=JSON.parse(t);return v(n)?n:void 0}catch{return}}function Mt(e,t,n,r){if(!t||n!==0||r)return;let o=e.toString("utf8");if(lr(o)!==void 0)return o.trim()}var Ft=[me,he,G,_e,ge,j];function Ce(e){return Buffer.isBuffer(e)?e:Buffer.from(e)}function dr(e,t,n){let r={...e.env};return r[_e]="3",r[me]=n,r[he]=String(1),r[ge]=t.source,t.fallbackReason?r[j]=t.fallbackReason:delete r[j],t.scopeId?r[G]=t.scopeId:delete r[G],r}function pr(e){let t=e.stdio[3];if(t&&typeof t=="object"&&"on"in t)return t}async function Te(e,t,n,r,o,c,a="live"){let i;try{i=o.spawn(o.execPath,[e.hookPath,...t],{cwd:o.cwd,env:dr(o,e,c),stdio:["pipe","pipe","pipe","pipe"],windowsHide:!0})}catch{return{outcome:"spawn_failed",ready:!1}}r.setChild(i);let s=!1,u=i.stdout,f=i.stderr,m=i.stdin,l=pr(i);if(!u||!f||!m){try{i.kill("SIGKILL")}catch{}return n.stopChildWrites(),r.setChild(void 0),{outcome:"spawn_failed",ready:!1}}a==="replay"?n.replayTo(m):n.attachChild(m);let d="pending",_=Buffer.alloc(0),R=!1,E=!1,I=!1,x=0,k=null,O=!1,P=S=>{if(R)return;if(_.length+S.length>ye){_=Buffer.concat([_,S.subarray(0,ye-_.length)]),R=!0;return}_=Buffer.concat([_,S])};u.on("data",S=>{P(Ce(S))}),u.on("end",()=>{E=!0}),u.on("error",()=>{I=!0,E=!0}),f.on("data",S=>{if(x>=Ee)return;let b=Ce(S),h=Ee-x,y=b.length>h?b.subarray(0,h):b;x+=y.length;try{o.stderr.write(y)}catch{}}),f.resume(),l?(l.on("data",S=>{d==="pending"&&Ce(S).includes($e[0]??1)&&(d="byte")}),l.on("end",()=>{d==="pending"&&(d="eof")}),l.on("error",()=>{d==="pending"&&(d="error")})):d="error";let g=o.setTimeout(()=>{if(!(d!=="pending"||O))try{i.kill("SIGKILL")}catch{}},Qe);await new Promise(S=>{let b=!1,h=()=>{b||(b=!0,S())};i.once("exit",y=>{O=!0,k=y,h()}),i.once("error",()=>{s=!0,O=!0,h()})}),n.stopChildWrites(),o.clearTimeout(g);let A=Math.min(W,Math.max(0,r.remainingMs()));await new Promise(S=>{let b=()=>d!=="pending"&&E;if(b()){S();return}let h=o.setTimeout(()=>S(),A),y=()=>{b()&&(o.clearTimeout(h),S())};u.on("end",y),u.on("error",y),l?.on("end",y),l?.on("error",y),l?.on("data",y)}),u.removeAllListeners(),f.removeAllListeners(),l?.removeAllListeners();try{u.destroy()}catch{}try{f.destroy()}catch{}try{l?.destroy()}catch{}if(r.setChild(void 0),s)return{outcome:"spawn_failed",ready:!1};let N=d==="byte",L=Mt(_,N,k,R||I);return L!==void 0?(await r.ackOnce(L),{outcome:"success",ready:!0}):d==="eof"?{outcome:"startup_failure",ready:!1}:{outcome:"runtime_failure",ready:N}}function mr(e){let t=e.charAt(0);return t!==""&&t.toLowerCase()===t}function hr(e,t){let n=e.toLowerCase();return n==="sessionend"||n==="stopfailure"||n==="subagentstop"?!0:n==="stop"&&t==="codex"}function Ut(e,t,n){let r=n.EV_AI_HOOK_SYNC==="1";if(t===void 0||Buffer.byteLength(t,"utf8")>=J)return{isSessionStart:!1,isInProcess:r};let o=Oe(e),c=o.event??"",a=o.runner??"";try{let i=JSON.parse(t);v(i)&&(!c&&typeof i.hook_event_name=="string"?c=i.hook_event_name:!c&&typeof i.event=="string"&&(c=i.event),!a&&(typeof i.conversation_id=="string"||mr(c))&&(a="cursor"))}catch{}return{isSessionStart:c.toLowerCase()==="sessionstart",isInProcess:r||hr(c,a)}}import{readFile as gr}from"node:fs/promises";import{fileURLToPath as _r}from"node:url";async function Ht(e){let t=_r(new URL("../package.json",e)),n=await gr(t,"utf8"),r=JSON.parse(n);return{version:typeof r.version=="string"?r.version:"",evAi:{launcherProtocol:De(r.evAi?.launcherProtocol),minLauncherProtocol:De(r.evAi?.minLauncherProtocol),launcherRevision:De(r.evAi?.launcherRevision)}}}function De(e){return typeof e=="number"&&Number.isInteger(e)?e:0}var yr=new Set(["configure","install","migrate-to-plugin","update","uninstall","--version","-V","help","--help","-h"]);function ne(e){let t=e[0];return t==="status"?"status":t==="__refresh"?"refresh":t==="__work"||t==="__post"?"bundled_cli":t===void 0||yr.has(t)?"cli":"hook"}async function Bt(e,t){let n=await Lt({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!n.url)return;let r=Ct(n.url);if(!(!r||n.source==="none"))return{scopeId:r,collectorUrl:n.url,collectorUrlRedacted:Pt(n.url),source:n.source,dev:Ot(n.url)}}import{join as Vt}from"node:path";var Er=/^(\d{10})$/,Sr=/^(\d{10})\.done$/,Rr=/^[0-9a-f]{128}$/,Ar=64;function Yt(e){let t=e[We];if(t===void 0||t==="")return M;let n=Number(t);return!Number.isInteger(n)||n<=0?M:Math.min(Math.max(M,n*60),Re)}async function Jt(e,t,n=!1){let r=ht(t),o=await ft(e,r),c=new Map,a=new Map,i=Kt(o,Er),s=Kt(o,Sr),u=async l=>{let d=await Gt(e,Vt(r,xr(l)));return d&&c.set(l,{record:Nr(d.value),mtimeMs:d.mtimeMs}),d!==void 0},f=async l=>{let d=vr((await Gt(e,Vt(r,kr(l))))?.value);return d&&a.set(l,d),d!==void 0};if(!n)return await Promise.all([...i.map(u),...s.map(f)]),{claims:c,dones:a};await Promise.all([jt(i,u),jt(s,f)]);let m=re(c);return m<re(a)&&s.includes(m)&&await f(m),{claims:c,dones:a}}function Kt(e,t){return e.flatMap(n=>{let r=t.exec(n);return r?[Number(r[1])]:[]})}async function jt(e,t){for(let n of[...e].sort((r,o)=>o-r))if(await t(n))return}function re(e){let t=0;for(let n of e.keys())n>t&&(t=n);return t}function Wt(e,t,n){let r=re(e.claims),o=re(e.dones),c=r===0?{kind:"uninitialized"}:{kind:"bundled",why:"bootstrap_failed"},a;if(o>0){let d=e.dones.get(o);d&&(c=d.selection,a=d.outcome)}let i=r>0?e.claims.get(r):void 0,s=i?br(i):void 0,u=r>0?e.dones.get(r):void 0,f=wr(u?.interval_s,n),m=s!==void 0?s+f*1e3:void 0,l=s!==void 0&&s-t>rt;return{latest:r,startMs:s,intervalS:f,deadlineMs:m,selection:c,lastOutcome:a,futureDated:l,highestDone:o}}function br(e){if(e.record!=="empty"&&e.record.started_at){let t=Date.parse(e.record.started_at);if(Number.isFinite(t))return t}return e.mtimeMs}function xr(e){return xe(e)}function kr(e){return`${xe(e)}.done`}function wr(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(M,t):Math.min(Math.max(Math.floor(e),M,t),Re)}async function Gt(e,t){let n;try{n=await e.stat(t)}catch(o){if(C(o))return;throw o}let r=n.mtimeMs;if(n.size===0||n.size>Ae)return{mtimeMs:r};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>Ae?{mtimeMs:r}:{mtimeMs:r,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:r}}}function Nr(e){if(!v(e))return"empty";let t={};return typeof e.started_at=="string"&&(t.started_at=e.started_at),(e.owner==="bootstrap"||e.owner==="refresh")&&(t.owner=e.owner),e.resync===!0&&(t.resync=!0),t}function vr(e){if(!v(e))return;let t=e;if(typeof t.finished_at!="string"||typeof t.outcome!="string"||typeof t.interval_s!="number"||!Number.isFinite(t.interval_s))return;let n=Ir(t.selection);if(n)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:n}}function Ir(e){if(!v(e))return;let t=e;if(t.kind==="bundled")return t.why==="server"||t.why==="bootstrap_failed"?{kind:"bundled",why:t.why}:void 0;if(t.kind==="cached"&&typeof t.digest=="string"&&Rr.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&Or(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function Or(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Ar||t.toString("base64")!==e))return t.toString("hex")}function oe(e,t){return new URL(t,e.launcherUrl??import.meta.url)}function w(e,t,n,r){return{source:"bundled",hookPath:e.bundledHookPath,fallbackReason:t,scopeId:n?.scopeId,dev:n?.dev,...r}}async function $t(e,t,n){if(await te(t.env,t.home))return w(t,"kill_switch",n);if(!n)return w(t,"no_collector_url",n);let r=X(),o=Yt(t.env),c=t.now(),a=mt(t.home,n.scopeId),i=Wt(await Jt(r,a,!0),c,o),s={deadlineMs:i.deadlineMs,dev:n.dev};if(i.selection.kind==="cached"){let f=Z(t.home,n.dev),m=await t.readPackageInfo().then(_=>_.version,()=>"");if((de(m,i.selection.version)??0)>0)return await Ne(r,f,t.bundledHookPath),w(t,"below_floor",n,s);let d=await St(r,f,i.selection.digest,m,c,n.dev);return d.usable?{source:"cached",hookPath:Q(f,i.selection.digest),scopeId:n.scopeId,digest:i.selection.digest,healthFails:d.healthFails,...s}:(d.reason==="below_floor"&&await Ne(r,f,t.bundledHookPath),w(t,d.reason,n,s))}if(i.selection.kind==="bundled")return w(t,i.selection.why,n,s);if(F(t.env))return w(t,"sandboxed",n,s);let u=await Me(t);if(!u)return w(t,"bootstrap_failed",n,s);try{let f=await t.readPackageInfo();return await u.bootstrap({home:t.home,scope:n,bundledVersion:f.version,bundledHookPath:t.bundledHookPath,env:t.env,nowMs:c})}catch{return w(t,"bootstrap_failed",n,s)}}async function Me(e){try{return e.importUpdate?await e.importUpdate():await import(oe(e,"./launcher-update.mjs").href)}catch{return}}function zt(e,t){let n=[],r=[],o=0,c=0,a="pending",i,s=!1,u=!1,f=!1,m=!1,l=!1,d=[],_=()=>{!m&&typeof e.pause=="function"&&(e.pause(),m=!0)},R=()=>{m&&typeof e.resume=="function"&&(e.resume(),m=!1)},E=()=>{s=!1,f=!1,u=!0,R()},I=()=>{if(!(l||a==="pending")){l=!0,t.clearTimeout(L);for(let h of d)h();d.length=0}},x=h=>{a==="pending"&&(a=h),I()},k=()=>{if(s&&i)try{i.end()}catch{s=!1}},O=h=>{if(a==="oversize")return;let y=c+h.length;if(y>Ze){x("oversize");return}r.push(h),c=y},P=h=>{if(!(!s||!i))try{if(!i.write(h)){if(i.destroyed||!i.writable){E();return}f=!0,_()}}catch{E()}},g=h=>{let y=Buffer.isBuffer(h)?h:Buffer.from(h);if(!(a==="truncated"||a==="complete")&&(O(y),!u)){if(s){P(y);return}n.push(y),o+=y.length,o>=qe&&_()}},A=()=>{k(),x("complete")},N=()=>{a==="pending"&&(x("truncated"),k(),E())},L=t.setTimeout(()=>{a==="pending"&&(x("truncated"),k(),E())},Xe);"isTTY"in e&&!!e.isTTY?x("complete"):(e.on("data",g),e.on("end",A),e.on("error",N),typeof e.resume=="function"&&e.resume());let b=h=>{h.on("error",()=>{E()}),h.on("drain",()=>{!s||u||(f=!1,R())})};return{get state(){return a},get replayable(){return a==="complete"},get backlogBytes(){return o},get replayBytes(){return c},attachChild(h){i=h,u=!1,s=!0,f=!1,b(h);for(let y of n){if(!s)break;P(y)}if(n.length=0,o=0,f?_():R(),a!=="pending"){try{h.end()}catch{E()}s=!1}},replayTo(h){b(h);try{h.end(r.length>0?Buffer.concat(r,c):Buffer.alloc(0))}catch{}},stopChildWrites(){E()},dispose(){t.clearTimeout(L),e.off?.("data",g),e.off?.("end",A),e.off?.("error",N)},classifiableText(){if(!(a!=="complete"||c>=J))return Buffer.concat(r,c).toString("utf8")},whenSettled(){return l?Promise.resolve():new Promise(h=>{d.push(h)})}}}var Qt={version:"",evAi:{launcherProtocol:1,minLauncherProtocol:1,launcherRevision:1}};function Cr(e){return Zt(new URL("./hook.mjs",e))}function Tr(e){let t;return{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,env:process.env,cwd:process.cwd(),home:Lr(),now:()=>Date.now(),spawn:Pr,exit:n=>{process.exit(n)},setTimeout,clearTimeout,bundledHookPath:Cr(e),execPath:process.execPath,select:$t,readPackageInfo:()=>t??=Ht(e),launcherUrl:e}}async function Xt(e){return e.importCli?e.importCli():import(oe(e,"./cli.mjs").href)}async function en(e=process.argv.slice(2),t=Tr(import.meta.url)){let n=ne(e);if(n==="cli")try{return await(await Xt(t)).main(e)}catch(a){let i=a instanceof Error?a.message:String(a);try{t.stderr.write(`[ev-ai-agent-hook] ${i}
5
- `)}catch{}return 1}if(n==="bundled_cli")return(await Xt(t)).main(e);if(n==="refresh"||n==="status")try{let a=await t.readPackageInfo().catch(()=>Qt),i=await Me(t);return i?n==="refresh"?await i.runRefresh(e.slice(1),t.env,t.cwd,t.home,{packageVersion:a.version,bundledHookPath:t.bundledHookPath}):await i.runStatus(e,t,a):0}catch{return 0}let r=()=>{},o=new Promise(a=>{r=a}),c={...t,exit:a=>{t.exit(a),r(a)}};return Promise.race([Dr(e,c),o])}async function Dr(e,t){let n=Dt(t),r=zt(t.stdin,t),o,c=()=>o??=Ut(e,r.classifiableText(),t.env);r.whenSettled().then(()=>n.onEventClassified(c().isInProcess));let a=!1,i=new Promise(f=>{n.onAbort(()=>{a=!0,f()})}),s=f=>Promise.race([f,i.then(()=>{})]),u=async f=>(await n.ackOnce(),n.dispose(),r.dispose(),f);try{let f=t.readPackageInfo().catch(()=>Qt),m;try{m=await s(Bt(e,t))}catch{m=void 0}if(a)return u(0);let l;try{l=await s(t.select(e,t,m))}catch{l=w(t,"selection_error",m)}let d=await s(f);if(a||!l||!d)return u(0);let _=await s(Mr(t,l,m,r,c).catch(()=>!1));if(a)return u(0);let R=_?[...e,Y]:e,E=await Te(l,R,r,n,t,d.version,"live");if(E.outcome==="success"&&l.source==="cached"&&l.healthFails&&await qt(t,l,!1),E.outcome==="startup_failure"&&l.source!=="bundled"&&(await qt(t,l,!0),r.replayable&&n.remainingMs()>nt)){let I=w(t,"startup_failure",m);await Te(I,R,r,n,t,d.version,"replay")}return _&&m&&r.replayable&&c().isSessionStart&&Fr(e,t,m),u(0)}catch{return u(0)}}async function Mr(e,t,n,r,o){return!n||t.didBootstrap||F(e.env)||t.deadlineMs!==void 0&&t.deadlineMs>e.now()||r.state!=="pending"&&!(r.replayable&&o().isSessionStart)?!1:!await te(e.env,e.home)}function Fr(e,t,n){let r={...t.env};for(let o of Ft)delete r[o];r[Je]=n.scopeId;try{t.spawn(t.execPath,[Zt(oe(t,"./launcher.mjs")),"__refresh",...e],{cwd:t.cwd,env:r,detached:!0,stdio:"ignore",windowsHide:!0}).unref()}catch{}}async function qt(e,t,n){t.digest&&await Tt(X(),Z(e.home,t.dev===!0),t.digest,n,e.now(),e.env).catch(()=>{})}en().then(e=>{process.exit(e)}).catch(e=>{if(ne(process.argv.slice(2))==="cli"){let t=e instanceof Error?e.message:String(e);try{process.stderr.write(`[ev-ai-agent-hook] ${t}
3
+ import{spawn as Ur}from"node:child_process";import{randomBytes as Br}from"node:crypto";import{readFile as Vr,rm as rn,writeFile as Kr}from"node:fs/promises";import{homedir as jr}from"node:os";import{basename as Gr,dirname as Yr,join as Jr}from"node:path";import{Readable as Wr}from"node:stream";import{fileURLToPath as on}from"node:url";import{createHash as At}from"node:crypto";import{join as B}from"node:path";var ce="signed-hook-v1",ue=Buffer.from("ev-ai-hook-release-v1\0","utf8"),C=32;var Be=64,fe=64;import{sign as So,verify as xn}from"node:crypto";var fn=/^[A-Za-z0-9+/]+=*$/;function D(e){if(e.length===0||!fn.test(e))return;let t=Buffer.from(e,"base64");if(t.toString("base64")===e)return t}import{createPrivateKey as no,createPublicKey as dn,timingSafeEqual as ro}from"node:crypto";var pn=Buffer.from("302a300506032b6570032100","hex"),io=Buffer.from("302e020100300506032b657004220420","hex");function mn(e){let t=Buffer.from(e,"base64");if(t.byteLength!==C||t.toString("base64")!==e)throw new Error("invalid production public key");return t}var K=Object.freeze({"release-key-1":mn("jVk7k2gEEcdAiPOFtNZomu36bOpfkk0vgF9dC6FMcS0=")});function Ve(e){if(e.byteLength!==C)throw new Error("Ed25519 public key must be 32 bytes");return dn({key:Buffer.concat([pn,Buffer.from(e)]),format:"der",type:"spki"})}function Ke(e,t){if(!Object.hasOwn(e,t))return;let n=e[t];if(n?.byteLength===C)return n}var p={UNKNOWN_FORMAT:"unknown_format",UNKNOWN_KEY:"unknown_key",NON_CANONICAL_BASE64:"non_canonical_base64",INVALID_SIGNATURE_LENGTH:"invalid_signature_length",SIGNATURE_INVALID:"signature_invalid",TRAILING_BYTES:"trailing_bytes",UNKNOWN_FIELD:"unknown_field",DUPLICATE_FIELD:"duplicate_field",MISSING_FIELD:"missing_field",INVALID_TYPE:"invalid_type",INVALID_VERSION:"invalid_version",INVALID_URL:"invalid_url",URL_VERSION_MISMATCH:"url_version_mismatch",INVALID_SHA512:"invalid_sha512",INVALID_SIZE:"invalid_size",INVALID_NODE_ENGINE:"invalid_node_engine",INVALID_PROTOCOL:"invalid_protocol",INVALID_PACKAGE:"invalid_package",INVALID_JSON:"invalid_json",INVALID_ENVELOPE:"invalid_envelope",INVALID_KEY_ID:"invalid_key_id"};function je(e){let t;try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return{ok:!1,reason:p.INVALID_JSON}}return hn(t)}function hn(e){if(e.length===0)return{ok:!1,reason:p.INVALID_JSON};if(e.trimStart()!==e||e.trimEnd()!==e)return{ok:!1,reason:p.TRAILING_BYTES};let t=new le(e);try{let n=t.parseValue();return t.atEnd()?{ok:!0,value:n}:{ok:!1,reason:p.TRAILING_BYTES}}catch(n){return n instanceof j?{ok:!1,reason:p.DUPLICATE_FIELD}:{ok:!1,reason:p.INVALID_JSON}}}var j=class extends Error{constructor(){super("duplicate field")}},le=class{text;i=0;constructor(t){this.text=t}atEnd(){return this.i>=this.text.length}parseValue(){this.skipWs();let t=this.text[this.i];if(t==="{")return this.parseObject();if(t==="[")return this.parseArray();if(t==='"')return this.parseString();if(t==="t"||t==="f"||t==="n")return this.parseLiteral();if(t==="-"||t!==void 0&&t>="0"&&t<="9")return this.parseNumber();throw new SyntaxError("invalid json")}skipWs(){let{text:t}=this;for(;this.i<t.length;){let n=t.charCodeAt(this.i);if(n!==32&&n!==10&&n!==13&&n!==9)break;this.i+=1}}parseObject(){this.expect("{"),this.skipWs();let t=Object.create(null),n=new Set;if(this.text[this.i]==="}")return this.i+=1,t;for(;;){if(this.skipWs(),this.text[this.i]!=='"')throw new SyntaxError("expected key");let r=this.parseString();if(n.has(r))throw new j;n.add(r),this.skipWs(),this.expect(":"),t[r]=this.parseValue(),this.skipWs();let o=this.text[this.i];if(o===","){this.i+=1;continue}if(o==="}")return this.i+=1,t;throw new SyntaxError("expected comma or end of object")}}parseArray(){this.expect("["),this.skipWs();let t=[];if(this.text[this.i]==="]")return this.i+=1,t;for(;;){t.push(this.parseValue()),this.skipWs();let n=this.text[this.i];if(n===","){this.i+=1;continue}if(n==="]")return this.i+=1,t;throw new SyntaxError("expected comma or end of array")}}parseString(){this.expect('"');let{text:t}=this,n="";for(;this.i<t.length;){let r=t.charCodeAt(this.i);if(r===34)return this.i+=1,n;if(r===92){this.i+=1,n+=this.parseEscape();continue}if(r<32)throw new SyntaxError("unescaped control");n+=t[this.i],this.i+=1}throw new SyntaxError("unterminated string")}parseEscape(){let t=this.text[this.i];if(t===void 0)throw new SyntaxError("unterminated escape");switch(this.i+=1,t){case'"':case"\\":case"/":return t;case"b":return"\b";case"f":return"\f";case"n":return`
4
+ `;case"r":return"\r";case"t":return" ";case"u":{let n=this.text.slice(this.i,this.i+4);if(!/^[0-9a-fA-F]{4}$/.test(n))throw new SyntaxError("invalid unicode escape");return this.i+=4,String.fromCharCode(Number.parseInt(n,16))}default:throw new SyntaxError("invalid escape")}}parseLiteral(){if(this.text.startsWith("true",this.i))return this.i+=4,!0;if(this.text.startsWith("false",this.i))return this.i+=5,!1;if(this.text.startsWith("null",this.i))return this.i+=4,null;throw new SyntaxError("invalid literal")}parseNumber(){let t=this.i,{text:n}=this;if(n[this.i]==="-"&&(this.i+=1),n[this.i]==="0")this.i+=1;else if(this.isDigit(n[this.i]))for(;this.isDigit(n[this.i]);)this.i+=1;else throw new SyntaxError("invalid number");if(n[this.i]==="."){if(this.i+=1,!this.isDigit(n[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(n[this.i]);)this.i+=1}if(n[this.i]==="e"||n[this.i]==="E"){if(this.i+=1,(n[this.i]==="+"||n[this.i]==="-")&&(this.i+=1),!this.isDigit(n[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(n[this.i]);)this.i+=1}let r=Number(n.slice(t,this.i));if(!Number.isFinite(r))throw new SyntaxError("invalid number");return r}expect(t){if(this.text[this.i]!==t)throw new SyntaxError(`expected ${t}`);this.i+=1}isDigit(t){return t!==void 0&&t>="0"&&t<="9"}};var Ye=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],gn=new Set(Ye),_n=/^\d+\.\d+\.\d+$/,yn=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,En=/^[@A-Za-z0-9._/~-]{1,214}$/;function de(e){let t=je(e);return t.ok?Sn(t.value):t}function Sn(e){if(!pe(e))return{ok:!1,reason:p.INVALID_JSON};for(let u of Object.keys(e))if(!gn.has(u))return{ok:!1,reason:p.UNKNOWN_FIELD};for(let u of Ye)if(!(u in e))return{ok:!1,reason:p.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!En.test(t)||t.includes(".."))return{ok:!1,reason:p.INVALID_PACKAGE};let n=e.version;if(typeof n!="string"||!_n.test(n))return{ok:!1,reason:p.INVALID_VERSION};let r=e.url;if(typeof r!="string")return{ok:!1,reason:p.INVALID_URL};let o=Rn(r,n);if(o!==void 0)return{ok:!1,reason:o};let a=e.sha512;if(typeof a!="string")return{ok:!1,reason:p.INVALID_SHA512};if(D(a)?.byteLength!==fe)return{ok:!1,reason:p.INVALID_SHA512};let i=e.size;if(typeof i!="number"||!Number.isInteger(i)||i<1||i>4194304)return{ok:!1,reason:p.INVALID_SIZE};let c=e.node_engine;if(typeof c!="string"||yn.exec(c)===null)return{ok:!1,reason:p.INVALID_NODE_ENGINE};let f=e.min_launcher_protocol;return typeof f!="number"||!Number.isInteger(f)||f<1||!Number.isSafeInteger(f)?{ok:!1,reason:p.INVALID_PROTOCOL}:{ok:!0,manifest:{package:t,version:n,url:r,sha512:a,size:i,node_engine:c,min_launcher_protocol:f}}}function pe(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Rn(e,t){if(e.includes("..")||/%2e/i.test(e)||/[\\?#]/.test(e))return p.INVALID_URL;let n;try{n=new URL(e)}catch{return p.INVALID_URL}if(n.href!==e)return p.INVALID_URL;if(!bn(n))return p.INVALID_URL;if(n.username!==""||n.password!=="")return p.INVALID_URL;if(n.search!==""||n.hash!=="")return p.INVALID_URL;if(n.hostname===""||n.pathname.includes(".."))return p.INVALID_URL;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(n.pathname)?.[1];if(o===void 0)return p.INVALID_URL;if(o!==t)return p.URL_VERSION_MISMATCH}var An=new Set(["localhost","127.0.0.1","[::1]"]);function bn(e){return e.protocol==="https:"?!0:e.protocol==="http:"?An.has(e.hostname):!1}var kn=["format","key_id","payload","signature"],Nn=/^[A-Za-z0-9._-]{1,128}$/;function vn(e,t){return Buffer.concat([ue,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function me(e,t){if(!pe(e))return{ok:!1,reason:p.INVALID_ENVELOPE};if(e.format!==ce)return{ok:!1,reason:p.UNKNOWN_FORMAT};for(let u of Object.keys(e))if(u!=="format"&&u!=="key_id"&&u!=="payload"&&u!=="signature")return{ok:!1,reason:p.UNKNOWN_FIELD};for(let u of kn)if(!(u in e))return{ok:!1,reason:p.MISSING_FIELD};let r=e.key_id;if(typeof r!="string"||!Nn.test(r))return{ok:!1,reason:p.INVALID_KEY_ID};let o=Ke(t,r);if(o===void 0)return{ok:!1,reason:p.UNKNOWN_KEY};let a=e.payload,s=e.signature;if(typeof a!="string"||typeof s!="string")return{ok:!1,reason:p.INVALID_ENVELOPE};let i=D(a),c=D(s);if(i===void 0||c===void 0)return{ok:!1,reason:p.NON_CANONICAL_BASE64};if(c.byteLength!==Be)return{ok:!1,reason:p.INVALID_SIGNATURE_LENGTH};let f=!1;try{f=xn(null,vn(r,i),Ve(o),c)}catch{f=!1}return f?de(i):{ok:!1,reason:p.SIGNATURE_INVALID}}var On=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,Pn=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,Ln=/^v?(\d+)\.(\d+)\.(\d+)/;function Je(e){let t=On.exec(e);if(t)return{...ge(t),prerelease:t[4]?.split(".")}}function he(e,t){let n=Je(e),r=Je(t);if(!(!n||!r))return n.major!==r.major?n.major-r.major:n.minor!==r.minor?n.minor-r.minor:n.patch!==r.patch?n.patch-r.patch:Cn(n.prerelease,r.prerelease)}function We(e,t){let n=he(e,t);return n!==void 0&&n>=0}function Tn(e){let t=Pn.exec(e.trim());return t?ge(t):void 0}function ge(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function $e(e,t){let n=Tn(t),r=Ln.exec(e.trim()),o=r?ge(r):void 0;return!n||!o?!1:o.major!==n.major?o.major>n.major:o.minor!==n.minor?o.minor>n.minor:o.patch>=n.patch}function Cn(e,t){if(e===void 0&&t===void 0)return 0;if(e===void 0)return 1;if(t===void 0)return-1;let n=Math.max(e.length,t.length);for(let r=0;r<n;r++){let o=e[r],a=t[r];if(o===void 0)return-1;if(a===void 0)return 1;let s=Dn(o,a);if(s!==0)return s}return 0}function Dn(e,t){let n=/^\d+$/.test(e),r=/^\d+$/.test(t);if(n&&r){let o=Number(e)-Number(t);return o<0?-1:o>0?1:0}return n?-1:r?1:e<t?-1:e>t?1:0}var _e="EV_AI_LAUNCHER_VERSION",ye="EV_AI_LAUNCHER_PROTOCOL",Ee="EV_AI_HOOK_SOURCE",G="EV_AI_HOOK_FALLBACK_REASON",Y="EV_AI_LAUNCHER_SCOPE",Se="EV_AI_LAUNCHER_READY_FD",J="EV_AI_LAUNCHER_REFRESH_SCOPE",W="EV_AI_LAUNCHER_REFRESH_EVENT",ze="EV_AI_HOOK_UPDATE_TTL_MIN",Xe="--defer-user-spec",qe=Buffer.from([1]),Ze='{"continue":true}',Qe=3e3,et=1024*1024,tt=4*1024*1024,Re=64*1024,Ae=64*1024,$=64*1024,nt=2e3,z=250,rt=8e3,be=14e3,ot=1e3,it=1e3,st=500,at=1e4,we="handoff-";var F=21600,xe=604800,ct=3e5,ke=4096,X=4*1024*1024,ut=2,ft=864e5;import{randomBytes as Fn}from"node:crypto";import{basename as Mn,dirname as Hn,join as lt}from"node:path";import{open as dt,mkdir as Un,readFile as Bn,readdir as Vn,rename as Kn,stat as jn,rmdir as Gn,unlink as Yn,utimes as Jn}from"node:fs/promises";var q=new WeakMap;function mt(e){if(e&&typeof e=="object"&&"code"in e)return e}function T(e){return mt(e)?.code==="ENOENT"}function Wn(e){let t=mt(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function ht(e,t){try{return await e.readdir(t)}catch(n){if(T(n))return[];throw n}}async function $n(e,t,n){let r=await e.open(t,"wx");try{await e.write(r,n),await e.fsync(r)}finally{await e.close(r)}}function zn(){return Fn(8).toString("hex")}async function H(e,t,n){let r=Hn(t),o=zn(),a=`.${Mn(t)}.`,s=lt(r,`${a}${o}`),i=()=>e.unlink(s).catch(()=>{});await $n(e,s,n);try{await e.rename(s,t)}catch(c){if(!Wn(c))throw await i(),c;let f=lt(r,`${a}bad.${o}`);try{await e.rename(t,f)}catch(u){if(!T(u))throw await i(),u}await e.rename(s,t)}await e.fsyncDir(r)}function Z(){return{async open(e,t){let n=await dt(e,t),r={path:e};return q.set(r,n),r},async write(e,t){let n=pt(e),r=typeof t=="string"?Buffer.from(t,"utf8"):t;await n.write(r)},async fsync(e){await pt(e).sync()},async close(e){let t=q.get(e);q.delete(e),t&&await t.close()},rename:Kn,async readdir(e){return Vn(e)},readFile:Bn,async stat(e){let t=await jn(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await Un(e,t)},unlink:Yn,rmdir:Gn,utimes:Jn,async fsyncDir(e){if(process.platform==="win32")return;let t=await dt(e,"r");try{await t.sync()}finally{await t.close()}}}}function pt(e){let t=q.get(e);if(!t)throw new Error("closed");return t}function v(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var _t=Object.freeze({"test-key-1":gt("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":gt("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function gt(e){let t=Buffer.from(e,"base64");if(t.byteLength!==C||t.toString("base64")!==e)throw new Error("invalid test public key");return t}function yt(e){return e?{..._t,...K}:K}import{join as Q}from"node:path";function Ne(e){return Q(e,".ev-ai","agent-hook","js","signed-v1")}function Xn(e){return Q(Ne(e),"scopes")}function U(e,t){return Q(Xn(e),t)}function Et(e){return Q(e,"attempts")}function ve(e){return String(e).padStart(10,"0")}function ee(e,t){return B(Ne(e),t?"dev-artifacts":"artifacts")}function qn(e,t){return B(e,t)}function te(e,t){return B(e,t,"hook.mjs")}function Zn(e,t){return B(e,t,"release.json")}function Oe(e,t){return B(e,t,"health.json")}function bt(e){return At("sha512").update(e).digest("hex")}async function Pe(e,t,n){try{let r=await e.readFile(n);if(r.byteLength<=0||r.byteLength>X)return;let o=bt(r),a=te(t,o);return await St(e,a,o)==="ok"?o:(await e.mkdir(qn(t,o),{recursive:!0}),await H(e,a,r),await St(e,a,o)==="ok"?o:void 0)}catch{return}}async function St(e,t,n){try{let r=await e.stat(t);return r.size<=0||r.size>X?"bad":bt(await e.readFile(t))===n?"ok":"bad"}catch(r){if(T(r))return"missing";throw r}}async function wt(e,t,n,r,o,a,s=process.version){let[i,c,f]=await Promise.all([Rt(e,te(t,n)),Rt(e,Zn(t,n)),Le(e,Oe(t,n))]);if(i===void 0)return{usable:!1,reason:"artifact_missing"};if(c===void 0)return{usable:!1,reason:"signature_invalid"};let u;try{u=JSON.parse(c.toString("utf8"))}catch{return{usable:!1,reason:"signature_invalid"}}let m=me(u,yt(a));if(!m.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:d}=m;if(i.byteLength!==d.size||i.byteLength>X)return{usable:!1,reason:"hash_mismatch"};let l=At("sha512").update(i).digest();if(l.toString("hex")!==n)return{usable:!1,reason:"hash_mismatch"};let _=Buffer.from(d.sha512,"base64");if(l.byteLength!==_.byteLength||!l.equals(_))return{usable:!1,reason:"hash_mismatch"};if(!We(d.version,r))return{usable:!1,reason:"below_floor"};if(!$e(s,d.node_engine))return{usable:!1,reason:"incompatible_node"};if(d.min_launcher_protocol>1)return{usable:!1,reason:"incompatible_protocol"};if(f?.quarantined_until){let E=Date.parse(f.quarantined_until);if(Number.isFinite(E)&&E>o)return{usable:!1,reason:"quarantined"}}return{usable:!0,manifest:d,healthFails:f?.consecutive_startup_failures??0}}async function Rt(e,t){try{return await e.readFile(t)}catch(n){if(T(n))return;throw n}}async function Le(e,t){try{let n=await e.readFile(t),r=JSON.parse(n.toString("utf8"));if(!v(r))return;let o=r.consecutive_startup_failures;if(typeof o!="number"||!Number.isInteger(o)||o<0)return;let a={consecutive_startup_failures:o};return typeof r.quarantined_until=="string"&&(a.quarantined_until=r.quarantined_until),a}catch{return}}import{createHash as Qn}from"node:crypto";import{access as er,readFile as tr,stat as nr}from"node:fs/promises";import{homedir as rr}from"node:os";import{dirname as or,join as Te,parse as ir,resolve as xt}from"node:path";var sr="https://hooks.ev-ai.ai",ar=".claude/ev-ai-runtime-report.json",cr="config.json",ur=1024*1024,Ot=new Set(["localhost","127.0.0.1","[::1]","::1"]),fr=["claude","cursor","codex"],lr=[ar,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],kt=/^[A-Za-z0-9._~-]+$/;function dr(e){return e!==void 0&&fr.includes(e)}function ne(e,t){let n=e[t+1];return n&&!n.startsWith("--")?{value:n,next:t+1}:{next:t}}function Ce(e){let t,n,r,o,a;for(let s=0;s<e.length;s++){let i=e[s];if(i!==void 0){if(i==="--runner"){let c=ne(e,s);t=c.value,s=c.next;continue}if(i.startsWith("--runner=")){t=i.slice(9);continue}if(i==="--url"){let c=ne(e,s);c.value&&(r=c.value),s=c.next;continue}if(i.startsWith("--url=")){r=i.slice(6);continue}if(i==="--token"){let c=ne(e,s);c.value&&(o=c.value),s=c.next;continue}if(i.startsWith("--token=")){o=i.slice(8);continue}if(i==="--base-url"){let c=ne(e,s);c.value&&(a=c.value),s=c.next;continue}if(i.startsWith("--base-url=")){a=i.slice(11);continue}i!==Xe&&!i.startsWith("-")&&n===void 0&&(n=i)}}return{runner:dr(t)?t:void 0,event:n,collectorUrl:r,orgToken:o,baseUrl:a}}function Pt(e,t=sr){let n=t.replace(/\/+$/,""),r=e.trim();return`${n}/${r}/hook`}function De(e=rr()){return Te(e,".ev-ai",cr)}function pr(e,t){return{...e,...t}}function Nt(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<=32||n===127||n===39)return!0}return!1}function mr(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?Ot.has(t.hostname):!1}catch{return!1}}function Lt(e){try{let n=new URL(e).pathname.split("/").filter(r=>r.length>0);if(n.length>=2&&n[n.length-1]==="hook"){let r=n[n.length-2];return r&&r.length>0?r:void 0}return}catch{return}}function Tt(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!mr(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let n=Lt(e);if(!n)return`must end with /{orgToken}/hook (got: ${e})`;if(!kt.test(n))return`org token must match ${kt.source} (got: ${n})`;if(Nt(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(Nt(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function hr(e){return new URL(e).toString()}function vt(e){if(e.collector_url)return e.collector_url;let t=e.repo_ingest_token,n=typeof t=="string"?t.trim():void 0;return n?Pt(n):""}function Ct(e){try{return Ot.has(new URL(e).hostname)}catch{return!1}}function Dt(e){try{let t=new URL(e),n=t.pathname.split("/").filter(r=>r.length>0);return n.length>=2&&n[n.length-1]==="hook"&&(n[n.length-2]="***",t.pathname=`/${n.join("/")}`),t.toString()}catch{return"<invalid-url>"}}function gr(e){let t=e.collectorUrl?.trim(),n;if(t)n=t;else{let o=e.orgToken?.trim();o&&(n=Pt(o,e.baseUrl?.trim()??void 0))}if(!n)return{};let r=Tt(n);return r?{problem:r}:{url:hr(n)}}var Fe={access:er,stat:nr,readFile:(e,t)=>tr(e,t)};async function _r(e,t,n=Fe){let r=xt(e),{root:o}=ir(r);for(;;){let s=Te(r,".git");try{let c=await n.stat(s);if(c.isDirectory()||c.isFile())return r}catch{}if(r===o)break;let i=or(r);if(i===r)break;r=i}let a=t.CURSOR_PROJECT_DIR??t.CLAUDE_PROJECT_DIR;if(a)try{if((await n.stat(a)).isDirectory())return a}catch{}return xt(e)}async function V(e,t=Fe){try{let n=await t.stat(e);if(!n.isFile()||n.size>ur)return;let r=await t.readFile(e,"utf8"),o=JSON.parse(r);return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function It(e,t){return(await Promise.all(lr.map(async r=>{let o=Te(e,r);try{return await t.access(o),o}catch{return}}))).find(r=>r!==void 0)}async function Ft(e){let t=e.fs??Fe,n=gr(Ce(e.argv));if(n.url)return{url:n.url,source:"argv"};let r=e.env.EV_AI_HOOK_MANIFEST;if(r)try{await t.access(r);let m=await V(r,t),d=m?vt(m):"";return d?{url:d,source:"manifest_override"}:{source:"none"}}catch{}let o=await _r(e.cwd,e.env,t),a=De(e.home),[s,i]=await Promise.all([V(a,t),It(o,t).then(async m=>m??It(e.cwd,t))]),c=i?await V(i,t):void 0,f;s&&c?f=pr(c,s):s?f=s:c&&(f=c);let u=f?vt(f):"";return u?{url:u,source:"manifest"}:{source:"none"}}function Mt(e){if(Tt(e))return;let t;try{t=new URL(e)}catch{return}let n=Lt(e);if(!n)return;let o=t.pathname.split("/").filter(i=>i.length>0).slice(0,-2),a=o.length>0?`/${o.join("/")}`:"",s=`${t.origin}${a}/${n}`;return Qn("sha256").update(s).digest("hex").slice(0,32)}async function re(e,t){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await V(De(t)))?.auto_update===!1}function M(e){return!!e.CURSOR_SANDBOX}async function Ht(e,t,n,r,o,a){if(M(a))return;let s=Oe(t,n),i=await Le(e,s),c=i?.consecutive_startup_failures??0;if(!r){c>0&&await H(e,s,JSON.stringify({consecutive_startup_failures:0}));return}let f={consecutive_startup_failures:c+1};c+1>=ut?f.quarantined_until=new Date(o+ft).toISOString():i?.quarantined_until&&(f.quarantined_until=i.quarantined_until),await H(e,s,JSON.stringify(f))}function yr(e,t){return new Promise(n=>{try{e.write(t,()=>n())}catch{n()}})}function Ut(e){let t=e.now(),n=be,r=!1,o=Promise.resolve(),a,s=!1,i=[],c,f,u,m=()=>Math.max(0,t+n-e.now()),d=[],l=(g,A)=>{if(e.installProcessHandlers===!1)return;(e.on??((L,R)=>process.on(L,R)))(g,A),d.push({event:g,handler:A})},_=()=>{let g=e.off??((A,N)=>process.off(A,N));for(let{event:A,handler:N}of d)try{g(A,N)}catch{}d.length=0},E=g=>(r||(r=!0,o=yr(e.stdout,g??Ze)),o),S=g=>{if(a)try{a.kill(g)}catch{}},I=()=>{for(let g of i)try{g()}catch{}},w=()=>{s||(I(),S("SIGTERM"),f=e.setTimeout(()=>{S("SIGKILL")},z),E())},x=()=>{E().finally(()=>{e.exit(0)})},O=()=>{s||(I(),x())},P=()=>{c&&e.clearTimeout(c),u&&e.clearTimeout(u),c=e.setTimeout(w,m());let g=Math.max(0,t+n+ot-e.now());u=e.setTimeout(O,g)};P(),l("uncaughtException",x),l("unhandledRejection",x);for(let g of["SIGTERM","SIGINT"])l(g,()=>{S(g),x()});return{ackOnce:E,remainingMs:m,eventBudgetMs:()=>n,onEventClassified(g){let A=g?be:rt;A<n&&(n=A,P())},setChild(g){a=g},onAbort(g){i.push(g)},dispose(){s=!0,c&&e.clearTimeout(c),f&&e.clearTimeout(f),u&&e.clearTimeout(u),_()},waitForAckWrite(){return o}}}function Er(e){let t=e.trim();if(t)try{let n=JSON.parse(t);return v(n)?n:void 0}catch{return}}function Bt(e,t,n,r){if(!t||n!==0||r)return;let o=e.toString("utf8");if(Er(o)!==void 0)return o.trim()}var Vt=[_e,ye,Y,Se,Ee,G];function Me(e){return Buffer.isBuffer(e)?e:Buffer.from(e)}function Sr(e,t,n){let r={...e.env};return r[Se]="3",r[_e]=n,r[ye]=String(1),r[Ee]=t.source,t.fallbackReason?r[G]=t.fallbackReason:delete r[G],t.scopeId?r[Y]=t.scopeId:delete r[Y],r}function Rr(e){let t=e.stdio[3];if(t&&typeof t=="object"&&"on"in t)return t}async function He(e,t,n,r,o,a,s="live"){let i;try{i=o.spawn(o.execPath,[e.hookPath,...t],{cwd:o.cwd,env:Sr(o,e,a),stdio:["pipe","pipe","pipe","pipe"],windowsHide:!0})}catch{return{outcome:"spawn_failed",ready:!1}}r.setChild(i);let c=!1,f=i.stdout,u=i.stderr,m=i.stdin,d=Rr(i);if(!f||!u||!m){try{i.kill("SIGKILL")}catch{}return n.stopChildWrites(),r.setChild(void 0),{outcome:"spawn_failed",ready:!1}}s==="replay"?n.replayTo(m):n.attachChild(m);let l="pending",_=Buffer.alloc(0),E=!1,S=!1,I=!1,w=0,x=null,O=!1,P=R=>{if(E)return;if(_.length+R.length>Re){_=Buffer.concat([_,R.subarray(0,Re-_.length)]),E=!0;return}_=Buffer.concat([_,R])};f.on("data",R=>{P(Me(R))}),f.on("end",()=>{S=!0}),f.on("error",()=>{I=!0,S=!0}),u.on("data",R=>{if(w>=Ae)return;let b=Me(R),h=Ae-w,y=b.length>h?b.subarray(0,h):b;w+=y.length;try{o.stderr.write(y)}catch{}}),u.resume(),d?(d.on("data",R=>{l==="pending"&&Me(R).includes(qe[0]??1)&&(l="byte")}),d.on("end",()=>{l==="pending"&&(l="eof")}),d.on("error",()=>{l==="pending"&&(l="error")})):l="error";let g=o.setTimeout(()=>{if(!(l!=="pending"||O))try{i.kill("SIGKILL")}catch{}},nt);await new Promise(R=>{let b=!1,h=()=>{b||(b=!0,R())};i.once("exit",y=>{O=!0,x=y,h()}),i.once("error",()=>{c=!0,O=!0,h()})}),n.stopChildWrites(),o.clearTimeout(g);let A=Math.min(z,Math.max(0,r.remainingMs()));await new Promise(R=>{let b=()=>l!=="pending"&&S;if(b()){R();return}let h=o.setTimeout(()=>R(),A),y=()=>{b()&&(o.clearTimeout(h),R())};f.on("end",y),f.on("error",y),d?.on("end",y),d?.on("error",y),d?.on("data",y)}),f.removeAllListeners(),u.removeAllListeners(),d?.removeAllListeners();try{f.destroy()}catch{}try{u.destroy()}catch{}try{d?.destroy()}catch{}if(r.setChild(void 0),c)return{outcome:"spawn_failed",ready:!1};let N=l==="byte",L=Bt(_,N,x,E||I);return L!==void 0?(await r.ackOnce(L),{outcome:"success",ready:!0}):l==="eof"?{outcome:"startup_failure",ready:!1}:{outcome:"runtime_failure",ready:N}}function Ar(e){let t=e.charAt(0);return t!==""&&t.toLowerCase()===t}function br(e,t){let n=e.toLowerCase();return n==="sessionend"||n==="stopfailure"||n==="subagentstop"?!0:n==="stop"&&t==="codex"}function Kt(e,t,n){let r=n.EV_AI_HOOK_SYNC==="1";if(t===void 0||Buffer.byteLength(t,"utf8")>=$)return{isSessionStart:!1,isInProcess:r};let o=Ce(e),a=o.event??"",s=o.runner??"";try{let i=JSON.parse(t);v(i)&&(!a&&typeof i.hook_event_name=="string"?a=i.hook_event_name:!a&&typeof i.event=="string"&&(a=i.event),!s&&(typeof i.conversation_id=="string"||Ar(a))&&(s="cursor"))}catch{}return{isSessionStart:a.toLowerCase()==="sessionstart",isInProcess:r||br(a,s)}}import{readFile as wr}from"node:fs/promises";import{fileURLToPath as xr}from"node:url";async function jt(e){let t=xr(new URL("../package.json",e)),n=await wr(t,"utf8"),r=JSON.parse(n);return{version:typeof r.version=="string"?r.version:"",evAi:{launcherProtocol:Ue(r.evAi?.launcherProtocol),minLauncherProtocol:Ue(r.evAi?.minLauncherProtocol),launcherRevision:Ue(r.evAi?.launcherRevision)}}}function Ue(e){return typeof e=="number"&&Number.isInteger(e)?e:0}var kr=new Set(["configure","install","migrate-to-plugin","update","uninstall","--version","-V","help","--help","-h"]);function oe(e){let t=e[0];return t==="status"?"status":t==="__refresh"?"refresh":t==="__work"||t==="__post"?"bundled_cli":t===void 0||kr.has(t)?"cli":"hook"}async function Gt(e,t){let n=await Ft({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!n.url)return;let r=Mt(n.url);if(!(!r||n.source==="none"))return{scopeId:r,collectorUrl:n.url,collectorUrlRedacted:Dt(n.url),source:n.source,dev:Ct(n.url)}}import{join as Yt}from"node:path";var Nr=/^(\d{10})$/,vr=/^(\d{10})\.done$/,Ir=/^[0-9a-f]{128}$/,Or=64;function zt(e){let t=e[ze];if(t===void 0||t==="")return F;let n=Number(t);return!Number.isInteger(n)||n<=0?F:Math.min(Math.max(F,n*60),xe)}async function Xt(e,t,n=!1){let r=Et(t),o=await ht(e,r),a=new Map,s=new Map,i=Jt(o,Nr),c=Jt(o,vr),f=async d=>{let l=await $t(e,Yt(r,Lr(d)));return l&&a.set(d,{record:Dr(l.value),mtimeMs:l.mtimeMs}),l!==void 0},u=async d=>{let l=Fr((await $t(e,Yt(r,Tr(d))))?.value);return l&&s.set(d,l),l!==void 0};if(!n)return await Promise.all([...i.map(f),...c.map(u)]),{claims:a,dones:s};await Promise.all([Wt(i,f),Wt(c,u)]);let m=ie(a);return m<ie(s)&&c.includes(m)&&await u(m),{claims:a,dones:s}}function Jt(e,t){return e.flatMap(n=>{let r=t.exec(n);return r?[Number(r[1])]:[]})}async function Wt(e,t){for(let n of[...e].sort((r,o)=>o-r))if(await t(n))return}function ie(e){let t=0;for(let n of e.keys())n>t&&(t=n);return t}function qt(e,t,n){let r=ie(e.claims),o=ie(e.dones),a=r===0?{kind:"uninitialized"}:{kind:"bundled",why:"bootstrap_failed"},s;if(o>0){let l=e.dones.get(o);l&&(a=l.selection,s=l.outcome)}let i=r>0?e.claims.get(r):void 0,c=i?Pr(i):void 0,f=r>0?e.dones.get(r):void 0,u=Cr(f?.interval_s,n),m=c!==void 0?c+u*1e3:void 0,d=c!==void 0&&c-t>ct;return{latest:r,startMs:c,intervalS:u,deadlineMs:m,selection:a,lastOutcome:s,futureDated:d,highestDone:o}}function Pr(e){if(e.record!=="empty"&&e.record.started_at){let t=Date.parse(e.record.started_at);if(Number.isFinite(t))return t}return e.mtimeMs}function Lr(e){return ve(e)}function Tr(e){return`${ve(e)}.done`}function Cr(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(F,t):Math.min(Math.max(Math.floor(e),F,t),xe)}async function $t(e,t){let n;try{n=await e.stat(t)}catch(o){if(T(o))return;throw o}let r=n.mtimeMs;if(n.size===0||n.size>ke)return{mtimeMs:r};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>ke?{mtimeMs:r}:{mtimeMs:r,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:r}}}function Dr(e){if(!v(e))return"empty";let t={};return typeof e.started_at=="string"&&(t.started_at=e.started_at),(e.owner==="bootstrap"||e.owner==="refresh")&&(t.owner=e.owner),e.resync===!0&&(t.resync=!0),t}function Fr(e){if(!v(e))return;let t=e;if(typeof t.finished_at!="string"||typeof t.outcome!="string"||typeof t.interval_s!="number"||!Number.isFinite(t.interval_s))return;let n=Mr(t.selection);if(n)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:n}}function Mr(e){if(!v(e))return;let t=e;if(t.kind==="bundled")return t.why==="server"||t.why==="bootstrap_failed"?{kind:"bundled",why:t.why}:void 0;if(t.kind==="cached"&&typeof t.digest=="string"&&Ir.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&Hr(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function Hr(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Or||t.toString("base64")!==e))return t.toString("hex")}function se(e,t){return new URL(t,e.launcherUrl??import.meta.url)}function k(e,t,n,r){return{source:"bundled",hookPath:e.bundledHookPath,fallbackReason:t,scopeId:n?.scopeId,dev:n?.dev,...r}}async function Zt(e,t,n){if(await re(t.env,t.home))return k(t,"kill_switch",n);if(!n)return k(t,"no_collector_url",n);let r=Z(),o=zt(t.env),a=t.now(),s=U(t.home,n.scopeId),i=qt(await Xt(r,s,!0),a,o),c={deadlineMs:i.deadlineMs,dev:n.dev};if(i.selection.kind==="cached"){let u=ee(t.home,n.dev),m=await t.readPackageInfo().then(_=>_.version,()=>"");if((he(m,i.selection.version)??0)>0)return await Pe(r,u,t.bundledHookPath),k(t,"below_floor",n,c);let l=await wt(r,u,i.selection.digest,m,a,n.dev);return l.usable?{source:"cached",hookPath:te(u,i.selection.digest),scopeId:n.scopeId,digest:i.selection.digest,healthFails:l.healthFails,...c}:(l.reason==="below_floor"&&await Pe(r,u,t.bundledHookPath),k(t,l.reason,n,c))}if(i.selection.kind==="bundled")return k(t,i.selection.why,n,c);if(M(t.env))return k(t,"sandboxed",n,c);let f=await ae(t);if(!f)return k(t,"bootstrap_failed",n,c);try{let u=await t.readPackageInfo();return await f.bootstrap({home:t.home,scope:n,bundledVersion:u.version,bundledHookPath:t.bundledHookPath,env:t.env,nowMs:a})}catch{return k(t,"bootstrap_failed",n,c)}}async function ae(e){try{return e.importUpdate?await e.importUpdate():await import(se(e,"./launcher-update.mjs").href)}catch{return}}function Qt(e,t){let n=[],r=[],o=0,a=0,s="pending",i,c=!1,f=!1,u=!1,m=!1,d=!1,l=[],_=()=>{!m&&typeof e.pause=="function"&&(e.pause(),m=!0)},E=()=>{m&&typeof e.resume=="function"&&(e.resume(),m=!1)},S=()=>{c=!1,u=!1,f=!0,E()},I=()=>{if(!(d||s==="pending")){d=!0,t.clearTimeout(L);for(let h of l)h();l.length=0}},w=h=>{s==="pending"&&(s=h),I()},x=()=>{if(c&&i)try{i.end()}catch{c=!1}},O=h=>{if(s==="oversize")return;let y=a+h.length;if(y>tt){w("oversize");return}r.push(h),a=y},P=h=>{if(!(!c||!i))try{if(!i.write(h)){if(i.destroyed||!i.writable){S();return}u=!0,_()}}catch{S()}},g=h=>{let y=Buffer.isBuffer(h)?h:Buffer.from(h);if(!(s==="truncated"||s==="complete")&&(O(y),!f)){if(c){P(y);return}n.push(y),o+=y.length,o>=et&&_()}},A=()=>{x(),w("complete")},N=()=>{s==="pending"&&(w("truncated"),x(),S())},L=t.setTimeout(()=>{s==="pending"&&(w("truncated"),x(),S())},Qe);"isTTY"in e&&!!e.isTTY?w("complete"):(e.on("data",g),e.on("end",A),e.on("error",N),typeof e.resume=="function"&&e.resume());let b=h=>{h.on("error",()=>{S()}),h.on("drain",()=>{!c||f||(u=!1,E())})};return{get state(){return s},get replayable(){return s==="complete"},get backlogBytes(){return o},get replayBytes(){return a},attachChild(h){i=h,f=!1,c=!0,u=!1,b(h);for(let y of n){if(!c)break;P(y)}if(n.length=0,o=0,u?_():E(),s!=="pending"){try{h.end()}catch{S()}c=!1}},replayTo(h){b(h);try{h.end(r.length>0?Buffer.concat(r,a):Buffer.alloc(0))}catch{}},stopChildWrites(){S()},dispose(){t.clearTimeout(L),e.off?.("data",g),e.off?.("end",A),e.off?.("error",N)},classifiableText(){if(!(s!=="complete"||a>=$))return Buffer.concat(r,a).toString("utf8")},whenSettled(){return d?Promise.resolve():new Promise(h=>{l.push(h)})}}}var sn={version:"",evAi:{launcherProtocol:1,minLauncherProtocol:1,launcherRevision:1}};function $r(e){return on(new URL("./hook.mjs",e))}function zr(e){let t;return{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,env:process.env,cwd:process.cwd(),home:jr(),now:()=>Date.now(),spawn:Ur,exit:n=>{process.exit(n)},setTimeout,clearTimeout,bundledHookPath:$r(e),execPath:process.execPath,select:Zt,readPackageInfo:()=>t??=jt(e),launcherUrl:e}}async function en(e){return e.importCli?e.importCli():import(se(e,"./cli.mjs").href)}async function an(e=process.argv.slice(2),t=zr(import.meta.url)){let n=oe(e);if(n==="cli")try{return await(await en(t)).main(e)}catch(s){let i=s instanceof Error?s.message:String(s);try{t.stderr.write(`[ev-ai-agent-hook] ${i}
5
+ `)}catch{}return 1}if(n==="bundled_cli")return(await en(t)).main(e);if(n==="refresh"||n==="status")try{let s=await t.readPackageInfo().catch(()=>sn);if(n==="refresh")return await Xr(e.slice(1),t,s);let i=await ae(t);return i?await i.runStatus(e,t,s):0}catch{return 0}let r=()=>{},o=new Promise(s=>{r=s}),a={...t,exit:s=>{t.exit(s),r(s)}};return Promise.race([un(e,a),o])}async function cn(e,t,n){let r,o=new Promise(a=>{r=n.setTimeout(a,t)});await Promise.race([e,o]),n.clearTimeout(r)}async function Xr(e,t,n){let r=await qr(t),o=ae(t).then(a=>a?.runRefresh(e,t.env,t.cwd,t.home,{packageVersion:n.version,bundledHookPath:t.bundledHookPath})).catch(()=>{});if(r){await cn(o,at,t);let a={...t.env};delete a[J],delete a[W],await un(e,{...t,env:a,stdin:Wr.from([r]),exit:()=>{},installProcessHandlers:!1},!1).catch(()=>0)}return await o,0}async function qr(e){let t=e.env[W],n=e.env[J];if(!(!t||!n||Yr(t)!==U(e.home,n)||!Gr(t).startsWith(we)))try{return await Vr(t)}catch{return}finally{await rn(t,{force:!0}).catch(()=>{})}}async function un(e,t,n=!0){let r=Ut(t),o=Qt(t.stdin,t),a,s=()=>a??=Kt(e,o.classifiableText(),t.env);o.whenSettled().then(()=>r.onEventClassified(s().isInProcess));let i=!1,c=new Promise(m=>{r.onAbort(()=>{i=!0,m()})}),f=m=>Promise.race([m,c.then(()=>{})]),u=async m=>(await r.ackOnce(),r.dispose(),o.dispose(),m);try{let m=t.readPackageInfo().catch(()=>sn),d;try{d=await f(Gt(e,t))}catch{d=void 0}if(i)return u(0);let l;try{l=await f(t.select(e,t,d))}catch{l=k(t,"selection_error",d)}let _=await f(m);if(i||!l||!_)return u(0);let E=n?await f(Zr(t,l,d,o,s).catch(()=>{})):void 0;if(i||E&&await tn(e,t,E,o.classifiableText()))return u(0);let S=await He(l,e,o,r,t,_.version,"live");if(S.outcome==="success"&&l.source==="cached"&&l.healthFails&&await nn(t,l,!1),S.outcome==="startup_failure"&&l.source!=="bundled"&&(await nn(t,l,!0),o.replayable&&r.remainingMs()>it)){let I=k(t,"startup_failure",d);await He(I,e,o,r,t,_.version,"replay")}return E&&await tn(e,t,E),u(0)}catch{return u(0)}}async function Zr(e,t,n,r,o){if(!(!n||t.didBootstrap||M(e.env)||t.deadlineMs!==void 0&&t.deadlineMs>e.now())&&(await cn(r.whenSettled(),st,e),!(!r.replayable||!o().isSessionStart||await re(e.env,e.home))))return n}async function tn(e,t,n,r){let o={...t.env};for(let s of Vt)delete o[s];o[J]=n.scopeId;let a;if(r!==void 0){a=Jr(U(t.home,n.scopeId),`${we}${Br(8).toString("hex")}.json`);try{await Kr(a,r,{mode:384,flag:"wx"})}catch{return!1}o[W]=a}try{let s=t.spawn(t.execPath,[on(se(t,"./launcher.mjs")),"__refresh",...e],{cwd:t.cwd,env:o,detached:!0,stdio:"ignore",windowsHide:!0});return await new Promise((i,c)=>{s.once("spawn",i),s.once("error",c)}),s.unref(),!0}catch{return a&&await rn(a,{force:!0}).catch(()=>{}),!1}}async function nn(e,t,n){t.digest&&await Ht(Z(),ee(e.home,t.dev===!0),t.digest,n,e.now(),e.env).catch(()=>{})}an().then(e=>{process.exit(e)}).catch(e=>{if(oe(process.argv.slice(2))==="cli"){let t=e instanceof Error?e.message:String(e);try{process.stderr.write(`[ev-ai-agent-hook] ${t}
6
6
  `)}catch{}process.exit(1)}try{process.stdout.write('{"continue":true}')}catch{}process.exit(0)});
@@ -53,7 +53,7 @@ var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
53
53
  var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
54
54
  var GZIP_MIN_BYTES = 32 * 1024;
55
55
  var USER_SPEC_COOLDOWN_MS = 14 * 60 * 60 * 1e3;
56
- var PACKAGE_VERSION = "1.2.6";
56
+ var PACKAGE_VERSION = "1.2.8";
57
57
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
58
58
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
59
59
 
@@ -26,7 +26,7 @@ var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
26
26
  var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
27
27
  var GZIP_MIN_BYTES = 32 * 1024;
28
28
  var USER_SPEC_COOLDOWN_MS = 14 * 60 * 60 * 1e3;
29
- var PACKAGE_VERSION = "1.2.6";
29
+ var PACKAGE_VERSION = "1.2.8";
30
30
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
31
31
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
32
32
 
@@ -24,7 +24,7 @@ var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
24
24
  var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
25
25
  var GZIP_MIN_BYTES = 32 * 1024;
26
26
  var USER_SPEC_COOLDOWN_MS = 14 * 60 * 60 * 1e3;
27
- var PACKAGE_VERSION = "1.2.6";
27
+ var PACKAGE_VERSION = "1.2.8";
28
28
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
29
29
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
30
30
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ev-ai/agent-hook",
3
- "version": "1.2.6",
3
+ "version": "1.2.8",
4
4
  "description": "Cross-runner runtime telemetry hook for Claude Code, Cursor, and Codex",
5
5
  "type": "module",
6
6
  "bin": {