@ev-ai/agent-hook 1.3.3 → 1.3.5

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 yt}from"node:crypto";import{join as X}from"node:path";var M="signed-hook-v1",Ae=Buffer.from("ev-ai-hook-release-v1\0","utf8"),D=32;var Qe=64,ee=64;import{sign as Io,verify as gn}from"node:crypto";var en=/^[A-Za-z0-9+/]+=*$/;function O(e){if(e.length===0||!en.test(e))return;let t=Buffer.from(e,"base64");if(t.toString("base64")===e)return t}import{createPrivateKey as po,createPublicKey as nn,timingSafeEqual as mo}from"node:crypto";var rn=Buffer.from("302a300506032b6570032100","hex"),go=Buffer.from("302e020100300506032b657004220420","hex");function on(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 te=Object.freeze({"release-key-1":on("jVk7k2gEEcdAiPOFtNZomu36bOpfkk0vgF9dC6FMcS0=")});function Ze(e){if(e.byteLength!==D)throw new Error("Ed25519 public key must be 32 bytes");return nn({key:Buffer.concat([rn,Buffer.from(e)]),format:"der",type:"spki"})}function et(e,t){if(!Object.hasOwn(e,t))return;let n=e[t];if(n?.byteLength===D)return n}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 tt(e){let t;try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return{ok:!1,reason:m.INVALID_JSON}}return sn(t)}function sn(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 Oe(e);try{let n=t.parseValue();return t.atEnd()?{ok:!0,value:n}:{ok:!1,reason:m.TRAILING_BYTES}}catch(n){return n instanceof ne?{ok:!1,reason:m.DUPLICATE_FIELD}:{ok:!1,reason:m.INVALID_JSON}}}var ne=class extends Error{constructor(){super("duplicate field")}},Oe=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 ne;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`
2
- `;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 rt=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],an=new Set(rt),cn=/^\d+\.\d+\.\d+$/,un=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,fn=/^[@A-Za-z0-9._/~-]{1,214}$/;function ve(e){let t=tt(e);return t.ok?dn(t.value):t}function dn(e){if(!Ne(e))return{ok:!1,reason:m.INVALID_JSON};for(let f of Object.keys(e))if(!an.has(f))return{ok:!1,reason:m.UNKNOWN_FIELD};for(let f of rt)if(!(f in e))return{ok:!1,reason:m.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!fn.test(t)||t.includes(".."))return{ok:!1,reason:m.INVALID_PACKAGE};let n=e.version;if(typeof n!="string"||!cn.test(n))return{ok:!1,reason:m.INVALID_VERSION};let r=e.url;if(typeof r!="string")return{ok:!1,reason:m.INVALID_URL};let o=ln(r,n);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!==ee)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"||un.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:n,url:r,sha512:s,size:c,node_engine:i,min_launcher_protocol:u}}}function Ne(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function ln(e,t){if(e.includes("..")||/%2e/i.test(e)||/[\\?#]/.test(e))return m.INVALID_URL;let n;try{n=new URL(e)}catch{return m.INVALID_URL}if(n.href!==e)return m.INVALID_URL;if(!mn(n))return m.INVALID_URL;if(n.username!==""||n.password!=="")return m.INVALID_URL;if(n.search!==""||n.hash!=="")return m.INVALID_URL;if(n.hostname===""||n.pathname.includes(".."))return m.INVALID_URL;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(n.pathname)?.[1];if(o===void 0)return m.INVALID_URL;if(o!==t)return m.URL_VERSION_MISMATCH}var pn=new Set(["localhost","127.0.0.1","[::1]"]);function mn(e){return e.protocol==="https:"?!0:e.protocol==="http:"?pn.has(e.hostname):!1}var yn=["format","key_id","payload","signature"],_n=/^[A-Za-z0-9._-]{1,128}$/;function kn(e,t){return Buffer.concat([Ae,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function v(e,t){if(!Ne(e))return{ok:!1,reason:m.INVALID_ENVELOPE};if(e.format!==M)return{ok:!1,reason:m.UNKNOWN_FORMAT};for(let f of Object.keys(e))if(f!=="format"&&f!=="key_id"&&f!=="payload"&&f!=="signature")return{ok:!1,reason:m.UNKNOWN_FIELD};for(let f of yn)if(!(f in e))return{ok:!1,reason:m.MISSING_FIELD};let r=e.key_id;if(typeof r!="string"||!_n.test(r))return{ok:!1,reason:m.INVALID_KEY_ID};let o=et(t,r);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!==Qe)return{ok:!1,reason:m.INVALID_SIGNATURE_LENGTH};let u=!1;try{u=gn(null,kn(r,c),Ze(o),i)}catch{u=!1}return u?ve(c):{ok:!1,reason:m.SIGNATURE_INVALID}}import{createHash as En,timingSafeEqual as Sn}from"node:crypto";function re(e,t){if(e.byteLength!==t.size)return{ok:!1,reason:$.SIZE_MISMATCH};let n=O(t.sha512);if(n?.byteLength!==ee)return{ok:!1,reason:$.HASH_MISMATCH};let r=En("sha512").update(e).digest();return r.byteLength!==n.byteLength||!Sn(r,n)?{ok:!1,reason:$.HASH_MISMATCH}:{ok:!0}}var Rn=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,wn=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,xn=/^v?(\d+)\.(\d+)\.(\d+)/;function ot(e){let t=Rn.exec(e);if(t)return{...Ie(t),prerelease:t[4]?.split(".")}}function it(e,t){let n=ot(e),r=ot(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:An(n.prerelease,r.prerelease)}function oe(e,t){let n=it(e,t);return n!==void 0&&n>=0}function bn(e){let t=wn.exec(e.trim());return t?Ie(t):void 0}function Ie(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function ie(e,t){let n=bn(t),r=xn.exec(e.trim()),o=r?Ie(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 An(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],s=t[r];if(o===void 0)return-1;if(s===void 0)return 1;let a=On(o,s);if(a!==0)return a}return 0}function On(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 st="EV_AI_LAUNCHER_REFRESH_SCOPE";var at="EV_AI_HOOK_UPDATE_TTL_MIN",ct="--defer-user-spec",G="--cap",Qo=Buffer.from([1]);var Zo=1024*1024,ei=4*1024*1024,ti=64*1024,ni=64*1024,ri=64*1024;var ut="handoff-",ft=6e4,T=1800,Fe=604800,dt=3e5,Pe=4096,Le=4*1024*1024;import{randomBytes as Nn}from"node:crypto";import{basename as In,dirname as Fn,join as Me}from"node:path";import{open as lt,mkdir as Pn,readFile as Ln,readdir as Mn,rename as Dn,stat as Tn,rmdir as Hn,unlink as Un,utimes as Cn}from"node:fs/promises";var se=new WeakMap;function De(e){if(e&&typeof e=="object"&&"code"in e)return e}function E(e){return De(e)?.code==="ENOENT"}function Te(e){return De(e)?.code==="EEXIST"}function Bn(e){let t=De(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function R(e,t){try{return await e.readdir(t)}catch(n){if(E(n))return[];throw n}}async function J(e,t){try{await e.unlink(t)}catch(n){if(!E(n))throw n}}async function ae(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 He(){return Nn(8).toString("hex")}function Vn(e){return e.startsWith(".")}async function Y(e,t,n){await Ue(e,t,n,Vn,36e5)}async function Ue(e,t,n,r,o){let s=await R(e,t);await Promise.all(s.map(async a=>{if(!r(a))return;let c=Me(t,a);try{let i=await e.stat(c);n-i.mtimeMs>o&&await e.unlink(c)}catch(i){if(!E(i))throw i}}))}async function N(e,t,n){let r=Fn(t),o=He(),s=`.${In(t)}.`,a=Me(r,`${s}${o}`),c=()=>e.unlink(a).catch(()=>{});await ae(e,a,n);try{await e.rename(a,t)}catch(i){if(!Bn(i))throw await c(),i;let u=Me(r,`${s}bad.${o}`);try{await e.rename(t,u)}catch(f){if(!E(f))throw await c(),f}await e.rename(a,t)}await e.fsyncDir(r)}function I(){return{async open(e,t){let n=await lt(e,t),r={path:e};return se.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=se.get(e);se.delete(e),t&&await t.close()},rename:Dn,async readdir(e){return Mn(e)},readFile:Ln,async stat(e){let t=await Tn(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await Pn(e,t)},unlink:Un,rmdir:Hn,utimes:Cn,async fsyncDir(e){if(process.platform==="win32")return;let t=await lt(e,"r");try{await t.sync()}finally{await t.close()}}}}function pt(e){let t=se.get(e);if(!t)throw new Error("closed");return t}function y(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ht=Object.freeze({"test-key-1":mt("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":mt("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function mt(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 H(e){return e?{...ht,...te}:te}import{join as z}from"node:path";function Ce(e){return z(e,".ev-ai","agent-hook","js","signed-v1")}function Be(e){return z(Ce(e),"scopes")}function w(e,t){return z(Be(e),t)}function x(e){return z(e,"attempts")}function ce(e){return z(e,"scope.json")}function Ve(e){return String(e).padStart(10,"0")}var Kn=64;function b(e,t){return X(Ce(e),t?"dev-artifacts":"artifacts")}function Ke(e,t){return X(e,t)}function S(e,t){return X(e,t,"hook.mjs")}function ue(e,t){return X(e,t,"release.json")}function jn(e,t){return X(e,t,"health.json")}function F(e){return yt("sha512").update(e).digest("hex")}function je(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Kn||t.toString("base64")!==e))return t.toString("hex")}async function U(e,t,n){try{let r=await e.stat(t);return r.size<=0||r.size>Le?"bad":F(await e.readFile(t))===n?"ok":"bad"}catch(r){if(E(r))return"missing";throw r}}async function C(e,t,n,r,o,s,a=process.version){let[c,i,u]=await Promise.all([gt(e,S(t,n)),gt(e,ue(t,n)),$n(e,jn(t,n))]);if(c===void 0)return{usable:!1,reason:"artifact_missing"};if(i===void 0)return{usable:!1,reason:"signature_invalid"};let f;try{f=JSON.parse(i.toString("utf8"))}catch{return{usable:!1,reason:"signature_invalid"}}let d=v(f,H(s));if(!d.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:l}=d;if(c.byteLength!==l.size||c.byteLength>Le)return{usable:!1,reason:"hash_mismatch"};let p=yt("sha512").update(c).digest();if(p.toString("hex")!==n)return{usable:!1,reason:"hash_mismatch"};let h=Buffer.from(l.sha512,"base64");if(p.byteLength!==h.byteLength||!p.equals(h))return{usable:!1,reason:"hash_mismatch"};if(!oe(l.version,r))return{usable:!1,reason:"below_floor"};if(!ie(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 g=Date.parse(u.quarantined_until);if(Number.isFinite(g)&&g>o)return{usable:!1,reason:"quarantined"}}return{usable:!0,manifest:l,healthFails:u?.consecutive_startup_failures??0}}async function gt(e,t){try{return await e.readFile(t)}catch(n){if(E(n))return;throw n}}async function $n(e,t){try{let n=await e.readFile(t),r=JSON.parse(n.toString("utf8"));if(!y(r))return;let o=r.consecutive_startup_failures;if(typeof o!="number"||!Number.isInteger(o)||o<0)return;let s={consecutive_startup_failures:o};return typeof r.quarantined_until=="string"&&(s.quarantined_until=r.quarantined_until),s}catch{return}}import{join as _t}from"node:path";var Gn=/^(\d{10})$/,Jn=/^(\d{10})\.done$/,Yn=/^[0-9a-f]{128}$/,zn=64;function P(e){let t=e[at];if(t===void 0||t==="")return T;let n=Number(t);return!Number.isInteger(n)||n<=0?T:Math.min(Math.max(T,n*60),Fe)}async function _(e,t,n=!1){let r=x(t),o=await R(e,r),s=new Map,a=new Map,c=kt(o,Gn),i=kt(o,Jn),u=async l=>{let p=await St(e,_t(r,fe(l)));return p&&s.set(l,{record:Xn(p.value),mtimeMs:p.mtimeMs}),p!==void 0},f=async l=>{let p=qn((await St(e,_t(r,de(l))))?.value);return p&&a.set(l,p),p!==void 0};if(!n)return await Promise.all([...c.map(u),...i.map(f)]),{claims:s,dones:a};await Promise.all([Et(c,u),Et(i,f)]);let d=A(s);return d<A(a)&&i.includes(d)&&await f(d),{claims:s,dones:a}}function kt(e,t){return e.flatMap(n=>{let r=t.exec(n);return r?[Number(r[1])]:[]})}async function Et(e,t){for(let n of[...e].sort((r,o)=>o-r))if(await t(n))return}function A(e){let t=0;for(let n of e.keys())n>t&&(t=n);return t}function L(e,t,n){let r=A(e.claims),o=A(e.dones),s=r===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=r>0?e.claims.get(r):void 0,i=c?Wn(c):void 0,u=r>0?e.dones.get(r):void 0,f=$e(u?.interval_s,n),d=i!==void 0?i+f*1e3:void 0,l=i!==void 0&&i-t>dt;return{latest:r,startMs:i,intervalS:f,deadlineMs:d,selection:s,lastOutcome:a,futureDated:l,highestDone:o}}function Wn(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 fe(e){return Ve(e)}function de(e){return`${Ve(e)}.done`}function $e(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(T,t):Math.min(Math.max(Math.floor(e),T,t),Fe)}async function St(e,t){let n;try{n=await e.stat(t)}catch(o){if(E(o))return;throw o}let r=n.mtimeMs;if(n.size===0||n.size>Pe)return{mtimeMs:r};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>Pe?{mtimeMs:r}:{mtimeMs:r,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:r}}}function Xn(e){if(!y(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 qn(e){if(!y(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=Qn(t.selection);if(n)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:n}}function Qn(e){if(!y(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"&&Yn.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&Zn(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function Zn(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==zn||t.toString("base64")!==e))return t.toString("hex")}import{join as le}from"node:path";async function pe(e,t,n){let r=x(t);await e.mkdir(r,{recursive:!0}),await Y(e,r,n.nowMs);let o=L(await _(e,t,!0),n.nowMs,n.ttlFloorS);return o.futureDated?Rt(e,t,{...n,resync:!0,n:o.latest+1}):o.deadlineMs!==void 0&&n.nowMs<o.deadlineMs?{kind:"too_soon",deadlineMs:o.deadlineMs,latest:o.latest}:Rt(e,t,{...n,n:o.latest+1})}var me={kind:"bundled",why:"bootstrap_failed"};function he(e,t,n,r,o,s){return(a,c,i)=>nr(e,t,{n:n.n,startedAtMs:n.startedAtMs,nowMs:r(),budgetMs:o,intervalS:$e(i,s),outcome:a,selection:c})}async function nr(e,t,n){if(n.nowMs-n.startedAtMs>n.budgetMs+3e4)return{recorded:!1,why:"expired"};let r=await _(e,t);if(A(r.claims)>n.n)return{recorded:!1,why:"superseded"};if(r.dones.has(n.n))return{recorded:!1,why:"already_done"};let o={finished_at:new Date(n.nowMs).toISOString(),interval_s:n.intervalS,outcome:n.outcome,selection:n.selection};return await Y(e,x(t),n.nowMs),await N(e,le(x(t),de(n.n)),JSON.stringify(o)),await rr(e,t,n.n),{recorded:!0}}async function rr(e,t,n){let r=await _(e,t),o=n-8,s=A(r.dones),a=x(t),c=new Set([...r.claims.keys(),...r.dones.keys()]);await Promise.all([...c].map(async i=>{i>=o||i!==s&&(await J(e,le(a,fe(i))),await J(e,le(a,de(i))))}))}async function Rt(e,t,n){if(n.n<1||n.n>9999999999)return{kind:"lost"};let r=x(t),o=le(r,fe(n.n)),s=new Date(n.nowMs).toISOString(),a=He(),c={started_at:s,nonce:a,owner:n.owner};n.resync&&(c.resync=!0);try{await ae(e,o,JSON.stringify(c)),await e.fsyncDir(r)}catch(i){if(Te(i))return{kind:"lost"};throw i}return n.collectorRedacted!==void 0&&await or(e,t,n.collectorRedacted,n.dev===!0),A((await _(e,t)).claims)>n.n?{kind:"lost"}:n.resync?{kind:"resynced",n:n.n,startedAt:s}:{kind:"claimed",n:n.n,startedAt:s,startedAtMs:n.nowMs,nonce:a,owner:n.owner}}async function or(e,t,n,r){let o=ce(t);try{await ae(e,o,Buffer.from(JSON.stringify({collector:n,dev:r}),"utf8")),await e.fsyncDir(t)}catch(s){if(Te(s))return;throw s}}import{readFileSync as Ar}from"node:fs";import{homedir as Or}from"node:os";import{join as vr}from"node:path";import{createHash as ir}from"node:crypto";import{access as sr,readFile as ar,stat as cr}from"node:fs/promises";import{homedir as ur}from"node:os";import{dirname as fr,join as Ge,parse as dr,resolve as xt}from"node:path";function wt(e){return e.charCodeAt(0)===65279?e.slice(1):e}var lr="https://hooks.ev-ai.ai",pr=".claude/ev-ai-runtime-report.json",mr="config.json";var hr=1024*1024,It=new Set(["localhost","127.0.0.1","[::1]","::1"]),gr=["claude","cursor","codex"],yr=[pr,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],bt=/^[A-Za-z0-9._~-]+$/;function _r(e){return e!==void 0&&gr.includes(e)}function At(e){if(e===void 0||!/^\d+$/.test(e))return;let t=Number(e);return Number.isSafeInteger(t)?t:void 0}function q(e,t){let n=e[t+1];return n&&!n.startsWith("--")?{value:n,next:t+1}:{next:t}}function kr(e){let t,n,r,o,s,a;for(let c=0;c<e.length;c++){let i=e[c];if(i!==void 0){if(i==="--runner"){let u=q(e,c);t=u.value,c=u.next;continue}if(i.startsWith("--runner=")){t=i.slice(9);continue}if(i==="--url"){let u=q(e,c);u.value&&(r=u.value),c=u.next;continue}if(i.startsWith("--url=")){r=i.slice(6);continue}if(i==="--token"){let u=q(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=q(e,c);u.value&&(s=u.value),c=u.next;continue}if(i.startsWith("--base-url=")){s=i.slice(11);continue}if(i===G){let u=q(e,c);a=At(u.value)??a,c=u.next;continue}if(i.startsWith(`${G}=`)){a=At(i.slice(G.length+1))??a;continue}i!==ct&&!i.startsWith("-")&&n===void 0&&(n=i)}}return{runner:_r(t)?t:void 0,event:n,collectorUrl:r,orgToken:o,baseUrl:s,...a!==void 0?{cap:a}:{}}}function Ft(e,t=lr){let n=t.replace(/\/+$/,""),r=e.trim();return`${n}/${r}/hook`}function Je(e=ur()){return Ge(e,".ev-ai",mr)}function Er(e,t){return{...e,...t}}function Ot(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 Pt(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?It.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 Ye(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!Pt(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(!bt.test(n))return`org token must match ${bt.source} (got: ${n})`;if(Ot(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(Ot(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function Sr(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?Ft(n):""}function B(e){try{return It.has(new URL(e).hostname)}catch{return!1}}function Mt(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 Rr(e){let t=e.collectorUrl?.trim(),n;if(t)n=t;else{let o=e.orgToken?.trim();o&&(n=Ft(o,e.baseUrl?.trim()??void 0))}if(!n)return{};let r=Ye(n);return r?{problem:r}:{url:Sr(n)}}var ze={access:sr,stat:cr,readFile:(e,t)=>ar(e,t)};async function wr(e,t,n=ze){let r=xt(e),{root:o}=dr(r);for(;;){let a=Ge(r,".git");try{let i=await n.stat(a);if(i.isDirectory()||i.isFile())return r}catch{}if(r===o)break;let c=fr(r);if(c===r)break;r=c}let s=t.CURSOR_PROJECT_DIR??t.CLAUDE_PROJECT_DIR;if(s)try{if((await n.stat(s)).isDirectory())return s}catch{}return xt(e)}async function Q(e,t=ze){try{let n=await t.stat(e);if(!n.isFile()||n.size>hr)return;let r=await t.readFile(e,"utf8"),o=JSON.parse(wt(r));return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function Nt(e,t){return(await Promise.all(yr.map(async r=>{let o=Ge(e,r);try{return await t.access(o),o}catch{return}}))).find(r=>r!==void 0)}async function Dt(e){let t=e.fs??ze,n=Rr(kr(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 d=await Q(r,t),l=d?vt(d):"";return l?{url:l,source:"manifest_override"}:{source:"none"}}catch{}let o=await wr(e.cwd,e.env,t),s=Je(e.home),[a,c]=await Promise.all([Q(s,t),Nt(o,t).then(async d=>d??Nt(e.cwd,t))]),i=c?await Q(c,t):void 0,u;a&&i?u=Er(i,a):a?u=a:i&&(u=i);let f=u?vt(u):"";return f?{url:f,source:"manifest"}:{source:"none"}}function Tt(e){if(Ye(e))return;let t;try{t=new URL(e)}catch{return}let n=Lt(e);if(!n)return;let o=t.pathname.split("/").filter(c=>c.length>0).slice(0,-2),s=o.length>0?`/${o.join("/")}`:"",a=`${t.origin}${s}/${n}`;return ir("sha256").update(a).digest("hex").slice(0,32)}var xr=/^[A-Za-z0-9._~-]+$/;function Ht(e,t){if(!xr.test(t)||Ye(e))return;let n;try{n=new URL(e)}catch{return}let r=n.pathname.split("/").filter(s=>s.length>0);if(r.length<2||r[r.length-1]!=="hook")return;r[r.length-1]=t;let o=new URL(n.origin);if(o.pathname=`/${r.join("/")}`,o.search="",o.hash="",o.username="",o.password="",!(o.username||o.password)&&o.origin===n.origin&&Pt(o.toString()))return o.toString()}function Ut(e){return Ht(e,"version")}function Ct(e){return Ht(e,"error-report")}var Vt=/^[A-Za-z0-9._-]{8,64}$/;function Nr(e,t){try{let r=Ar(vr(e,".ev-ai","agent-hook","installation.json"),"utf8"),o=JSON.parse(r);if(o&&typeof o=="object"&&!Array.isArray(o)){let s=o.installation_id;if(typeof s=="string"&&Vt.test(s))return s}}catch{}let n=t.EV_AI_HOOK_INSTALLATION_ID?.trim();return n&&Vt.test(n)?n:void 0}async function ge(e,t,n,r,o){if(!t.startsWith("failed:")||!r.postJson)return;let s=Ct(e);if(!s)return;let a;try{a=Nr(o?.home??Or(),o?.env??process.env)}catch{}try{await r.postJson(s,{reason:t.slice(0,512),phase:n,...a?{installation_id:a}:{}},{timeoutMs:500,signal:AbortSignal.timeout(500)})}catch{}}import Ir from"node:http";import Fr from"node:https";import{URL as Pr}from"node:url";function ye(){return{getBounded:Kt,postJson:Dr}}function _e(e,t){return e==="timeout"||e==="network"?"failed:timeout":e==="http_3xx"?"failed:http_3xx":t}function Kt(e,t){let n;try{n=new Pr(e)}catch{return Promise.resolve({ok:!1,reason:"origin_rejected"})}if(n.protocol==="http:"){if(!B(e))return Promise.resolve({ok:!1,reason:"origin_rejected"})}else if(n.protocol!=="https:")return Promise.resolve({ok:!1,reason:"origin_rejected"});let r=n.protocol==="http:"?Ir:Fr;return new Promise(o=>{let s=!1,a=[],c=0,i=d=>{s||(s=!0,t.signal?.removeEventListener("abort",u),o(d))},u=()=>{f.destroy(),i({ok:!1,reason:"timeout"})},f=r.request(n,{method:t.method??"GET",agent:!1,timeout:t.timeoutMs,headers:t.headers},d=>{let l=d.statusCode??0;if(l>=300&&l<400){d.resume(),i({ok:!1,reason:"http_3xx"});return}let p=d.headers["content-length"];if(typeof p=="string"){let h=Number(p);if(Number.isFinite(h)&&h>t.maxBytes){d.destroy(),i({ok:!1,reason:"too_large"});return}}d.on("data",h=>{if(c+=h.length,c>t.maxBytes){d.destroy(),i({ok:!1,reason:"too_large"});return}a.push(h)}),d.on("end",()=>{i({ok:!0,response:{status:l,headers:d.headers,body:Buffer.concat(a)}})}),d.on("error",()=>{i({ok:!1,reason:"network"})})});if(f.on("timeout",()=>{f.destroy(),i({ok:!1,reason:"timeout"})}),f.on("error",()=>{i({ok:!1,reason:"network"})}),t.signal){if(t.signal.aborted){u();return}t.signal.addEventListener("abort",u,{once:!0})}f.end(t.body)})}var Lr=2048,Mr=1024;function Dr(e,t,n){let r;try{r=Buffer.from(JSON.stringify(t),"utf8")}catch{return Promise.resolve({ok:!1,reason:"network"})}return r.byteLength>Lr?Promise.resolve({ok:!1,reason:"too_large"}):Kt(e,{maxBytes:Mr,timeoutMs:n.timeoutMs,signal:n.signal,method:"POST",body:r,headers:{"content-type":"application/json","content-length":r.byteLength}})}function Tr(e){return Q(Je(e))}async function Z(e,t,n=Tr(t)){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await n)?.auto_update===!1}function We(e){return!!e.CURSOR_SANDBOX}function ke(e,t,n,r){return{source:"bundled",hookPath:e.bundledHookPath,fallbackReason:t,scopeId:n?.scopeId,dev:n?.dev,...r}}import{join as Ur}from"node:path";var qe=/^[0-9a-f]{128}$/;function Cr(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,n,r,o,s,a,c){if(!qe.test(n)||F(r)!==n)return{ok:!1,reason:"repair_failed"};let i=Ke(t,n);await e.mkdir(i,{recursive:!0}),await Y(e,i,a);let u=S(t,n),f=ue(t,n),d=Cr(o);if(await U(e,u,n)==="ok"){let p=await Br(e,f);if(p?.equals(d))return await Xe(e,t,n),{ok:!0};let h=await Vr(p,c);return h!==void 0&&h!==s.version?{ok:!1,reason:"metadata_conflict"}:(await N(e,f,d),await Xe(e,t,n),{ok:!0})}return await N(e,u,r),await N(e,f,d),await U(e,u,n)!=="ok"?{ok:!1,reason:"repair_failed"}:(await Xe(e,t,n),{ok:!0})}async function $t(e,t,n){let r=je(n.sha512);if(!(r===void 0||!qe.test(r)))return await U(e,S(t,r),r)==="ok"?r:void 0}async function Br(e,t){try{return await e.readFile(t)}catch{return}}async function Vr(e,t){if(e===void 0)return;let n;try{n=JSON.parse(e.toString("utf8"))}catch{return}if(!y(n))return;let r=v(n,H(t));return r.ok?r.manifest.version:void 0}async function Xe(e,t,n){try{let o=(await R(e,t)).filter(i=>qe.test(i));if(o.length<=8)return;let s=o.filter(i=>i!==n),a=await Promise.all(s.map(async i=>{let u=Number.NEGATIVE_INFINITY;try{u=(await e.stat(ue(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=>Kr(e,t,i.name)))}catch{}}async function Kr(e,t,n){let r=Ke(t,n);try{let o=await R(e,r);await Promise.all(o.map(s=>J(e,Ur(r,s)))),await e.rmdir(r)}catch{}}function Se(e,t){return{launcher:e,protocol:String(1),current:t,platform:`${process.platform}-${process.arch}`,node:process.version,update_format:M}}function $r(e,t,n=H(t)){if(!y(e))return{ok:!1,reason:"failed:metadata_mismatch"};let r=e.hook_js;if(r===void 0)return{ok:!0,directive:{kind:"none"}};if(!y(r))return{ok:!1,reason:"failed:metadata_mismatch"};if(r.use_bundled===!0)return{ok:!0,directive:{kind:"bundled",intervalS:Yr(r.check_interval_s)}};let o=v(r,n);if(!o.ok)return{ok:!1,reason:"failed:metadata_mismatch"};let s=Jr(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:Gr(r)}}:{ok:!1,reason:"failed:origin_rejected"}}async function Gt(e,t,n,r,o,s){let a=zr(e,t),c=await r.getBounded(a,{maxBytes:4096,timeoutMs:n,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 f;try{f=JSON.parse(u.toString("utf8"))}catch{return{ok:!1,reason:"failed:metadata_mismatch"}}return $r(f,o)}function Gr(e){return{format:M,key_id:String(e.key_id),payload:String(e.payload),signature:String(e.signature)}}function Jr(e,t){let n;try{n=new URL(e)}catch{return}if(n.username!==""||n.password!==""||n.search!==""||n.hash!==""||n.pathname.includes(".."))return;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(n.pathname)?.[1];if(o&&(n.protocol==="https:"||t&&n.protocol==="http:"&&B(e)))return o}function Yr(e){if(typeof e=="number"&&Number.isInteger(e)&&e>0)return e}function zr(e,t){let n=new URL(e);for(let[r,o]of Object.entries(t))n.searchParams.set(r,o);return n.toString()}async function Re(e,t,n,r,o,s){let a=Ut(e);return a?Gt(a,t,n,r,o,s):{ok:!1,reason:"failed:origin_rejected"}}async function we(e,t,n,r,o,s,a,c,i,u){let{manifest:f,envelope:d}=r;if(!oe(f.version,o))return{ok:!1,reason:"skipped:below_floor"};if(!ie(process.version,f.node_engine))return{ok:!1,reason:"skipped:incompatible_node"};if(f.min_launcher_protocol>1)return{ok:!1,reason:"skipped:incompatible_protocol"};let l=await $t(e,n,f);if(l){let h=await C(e,n,l,o,s,i);if(h.usable)return{ok:!0,digest:l,reused:!0};if(h.reason==="quarantined")return{ok:!1,reason:"skipped:quarantined"};if(h.reason==="signature_invalid"){let g=S(n,l);if(await U(e,g,l)==="ok"){let V=await e.readFile(g),K=await Ee(e,n,l,V,d,f,s,i);return K.ok?{ok:!0,digest:l,reused:!0}:{ok:!1,reason:`failed:${K.reason}`}}}}let p=await Wr(e,n,r,u,s,i);return p||Xr(e,t,n,r,s,a,c,i)}async function Wr(e,t,n,r,o,s){if(r.length!==0)try{let a=await e.readFile(r);if(!re(a,n.manifest).ok)return;let c=F(a),i=await Ee(e,t,c,a,n.envelope,n.manifest,o,s);return i.ok?{ok:!0,digest:c,reused:!1}:{ok:!1,reason:`failed:${i.reason}`}}catch{return}}async function Xr(e,t,n,r,o,s,a,c){let{manifest:i,envelope:u}=r,f=await t.getBounded(i.url,{maxBytes:i.size,timeoutMs:s,signal:a});if(!f.ok)return{ok:!1,reason:_e(f.reason,"failed:extract_failed")};if(f.response.status!==200)return{ok:!1,reason:`failed:http_${f.response.status}`};let d=f.response.body;if(!re(d,i).ok)return{ok:!1,reason:"failed:integrity_mismatch"};let p=F(d),h=await Ee(e,n,p,d,u,i,o,c);return h.ok?{ok:!0,digest:p,reused:!1}:{ok:!1,reason:`failed:${h.reason}`}}async function Zr(e){let t=e.fs??I(),n=e.http??ye(),r=w(e.home,e.scope.scopeId),o=b(e.home,e.scope.dev),s=P(e.env),a=AbortSignal.timeout(3e3),c=await pe(t,r,{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 ke(e,h?"bootstrap_in_progress":"bootstrap_failed",e.scope,{didBootstrap:!1})}let i=he(t,r,c,()=>Date.now(),3e3,s),u=async h=>(await i(h,me),ke(e,"bootstrap_failed",e.scope,{didBootstrap:!0}));if(a.aborted)return u("failed:bootstrap");let f=await Re(e.scope.collectorUrl,Se(e.bundledVersion,e.bundledVersion),1e3,n,e.scope.dev,a);if(!f.ok)return u(f.reason);let d=f.directive;if(d.kind==="none")return u("failed:bootstrap");if(d.kind==="bundled")return await i("bundled",{kind:"bundled",why:"server"},d.intervalS),ke(e,"server",e.scope,{didBootstrap:!0});let l=await we(t,n,o,{manifest:d.manifest,envelope:d.envelope},e.bundledVersion,e.nowMs,2e3,a,e.scope.dev,e.bundledHookPath);if(!l.ok)return ge(e.scope.collectorUrl,l.reason,"bootstrap",n,{home:e.home,env:e.env}),u(l.reason);let{digest:p}=l;return await i("updated",{kind:"cached",digest:p,version:d.manifest.version,sha512:d.manifest.sha512}),{source:"bootstrap",hookPath:S(o,p),scopeId:e.scope.scopeId,digest:p,dev:e.scope.dev,didBootstrap:!0}}async function xe(e,t){let n=await Dt({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!n.url)return;let r=Tt(n.url);if(!(!r||n.source==="none"))return{scopeId:r,collectorUrl:n.url,collectorUrlRedacted:Mt(n.url),source:n.source,dev:B(n.url)}}async function no(e,t,n,r,o){try{await ro(e,t,n,r,o)}catch{}return 0}async function ro(e,t,n,r,o){if(We(t)||await Z(t,r))return;let s=t[st],a=await xe(e,{env:t,cwd:n,home:r});if(!a||!s||a.scopeId!==s)return;let c=o?.fs??I(),i=o?.http??ye(),u=o?.nowMs??Date.now(),f=P(t),d=w(r,a.scopeId);await Ue(c,d,u,Zt=>Zt.startsWith(ut),ft).catch(()=>{});let l=await pe(c,d,{owner:"refresh",nowMs:u,ttlFloorS:f,collectorRedacted:a.collectorUrlRedacted,dev:a.dev});if(l.kind!=="claimed")return;let p=he(c,d,l,()=>Date.now(),6e4,f),h=o?.packageVersion??"",g=L(await _(c,d,!0),u,f).selection,V=g.kind==="uninitialized"?me:g,K=AbortSignal.timeout(6e4),be=await Re(a.collectorUrl,Se(h,g.kind==="cached"?g.version:h),5e3,i,a.dev,K);if(!be.ok){await p(be.reason,V);return}let k=be.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 we(c,i,b(r,a.dev),{manifest:k.manifest,envelope:k.envelope},h,u,3e4,K,a.dev,o?.bundledHookPath??"");if(!j.ok){ge(a.collectorUrl,j.reason,"refresh",i,{home:r,env:t}),await p(j.reason,V);return}let qt=g.kind==="cached"&&g.version===k.manifest.version&&g.sha512===k.manifest.sha512,{digest:Qt}=j;await p(qt?j.reused?"current":"repaired":"updated",{kind:"cached",digest:Qt,version:k.manifest.version,sha512:k.manifest.sha512})}function oo(e){return`${e.slice(0,4)}\u2026`}async function io(e,t,n){let r=e.includes("--json"),o=e.includes("--all"),s=e.slice(1).filter(p=>p!=="--json"&&p!=="--all"),a=await xe(s,t),c=await Z(t.env,t.home),i=I(),u=await Xt(t,n,a,i,c),f=await so(i,t.home,a?.scopeId),d=o?await ao(t,n,i,c,f):[];if(r)return t.stdout.write(`${JSON.stringify({...u,otherScopes:d},null,2)}
3
- `),0;let l=[`launcher ${n.version} protocol ${n.evAi.launcherProtocol} revision ${n.evAi.launcherRevision} bundled hook ${n.version}`];if(l.push(...Wt(u)),o)for(let p of d)l.push(""),l.push(...Wt(p));else l.push(`other scopes ${f.length} (status --all)`);return l.push(`auto-update ${c?"off":"on"}`),t.stdout.write(`${l.join(`
1
+ import{createHash as _t}from"node:crypto";import{join as X}from"node:path";var M="signed-hook-v1",Ae=Buffer.from("ev-ai-hook-release-v1\0","utf8"),T=32;var Qe=64,ee=64;import{sign as Po,verify as gr}from"node:crypto";var tr=/^[A-Za-z0-9+/]+=*$/;function A(e){if(e.length===0||!tr.test(e))return;let t=Buffer.from(e,"base64");if(t.toString("base64")===e)return t}import{createPrivateKey as ho,createPublicKey as nr,timingSafeEqual as go}from"node:crypto";var or=Buffer.from("302a300506032b6570032100","hex"),yo=Buffer.from("302e020100300506032b657004220420","hex");function ir(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 te=Object.freeze({"release-key-1":ir("jVk7k2gEEcdAiPOFtNZomu36bOpfkk0vgF9dC6FMcS0=")});function Ze(e){if(e.byteLength!==T)throw new Error("Ed25519 public key must be 32 bytes");return nr({key:Buffer.concat([or,Buffer.from(e)]),format:"der",type:"spki"})}function et(e,t){if(!Object.hasOwn(e,t))return;let r=e[t];if(r?.byteLength===T)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 tt(e){let t;try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return{ok:!1,reason:m.INVALID_JSON}}return sr(t)}function sr(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 ve(e);try{let r=t.parseValue();return t.atEnd()?{ok:!0,value:r}:{ok:!1,reason:m.TRAILING_BYTES}}catch(r){return r instanceof re?{ok:!1,reason:m.DUPLICATE_FIELD}:{ok:!1,reason:m.INVALID_JSON}}}var re=class extends Error{constructor(){super("duplicate field")}},ve=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 re;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 nt=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],ar=new Set(nt),cr=/^\d+\.\d+\.\d+$/,ur=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,fr=/^[@A-Za-z0-9._/~-]{1,214}$/;function Ne(e){let t=tt(e);return t.ok?lr(t.value):t}function lr(e){if(!Ie(e))return{ok:!1,reason:m.INVALID_JSON};for(let f of Object.keys(e))if(!ar.has(f))return{ok:!1,reason:m.UNKNOWN_FIELD};for(let f of nt)if(!(f in e))return{ok:!1,reason:m.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!fr.test(t)||t.includes(".."))return{ok:!1,reason:m.INVALID_PACKAGE};let r=e.version;if(typeof r!="string"||!cr.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=dr(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(A(s)?.byteLength!==ee)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"||ur.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 Ie(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function dr(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(!mr(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 pr=new Set(["localhost","127.0.0.1","[::1]"]);function mr(e){return e.protocol==="https:"?!0:e.protocol==="http:"?pr.has(e.hostname):!1}var _r=["format","key_id","payload","signature"],yr=/^[A-Za-z0-9._-]{1,128}$/;function Er(e,t){return Buffer.concat([Ae,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function v(e,t){if(!Ie(e))return{ok:!1,reason:m.INVALID_ENVELOPE};if(e.format!==M)return{ok:!1,reason:m.UNKNOWN_FORMAT};for(let f of Object.keys(e))if(f!=="format"&&f!=="key_id"&&f!=="payload"&&f!=="signature")return{ok:!1,reason:m.UNKNOWN_FIELD};for(let f of _r)if(!(f in e))return{ok:!1,reason:m.MISSING_FIELD};let n=e.key_id;if(typeof n!="string"||!yr.test(n))return{ok:!1,reason:m.INVALID_KEY_ID};let o=et(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=A(s),i=A(a);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 u=!1;try{u=gr(null,Er(n,c),Ze(o),i)}catch{u=!1}return u?Ne(c):{ok:!1,reason:m.SIGNATURE_INVALID}}import{createHash as Sr,timingSafeEqual as Rr}from"node:crypto";function ne(e,t){if(e.byteLength!==t.size)return{ok:!1,reason:$.SIZE_MISMATCH};let r=A(t.sha512);if(r?.byteLength!==ee)return{ok:!1,reason:$.HASH_MISMATCH};let n=Sr("sha512").update(e).digest();return n.byteLength!==r.byteLength||!Rr(n,r)?{ok:!1,reason:$.HASH_MISMATCH}:{ok:!0}}var kr=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,br=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,xr=/^v?(\d+)\.(\d+)\.(\d+)/;function ot(e){let t=kr.exec(e);if(t)return{...Fe(t),prerelease:t[4]?.split(".")}}function it(e,t){let r=ot(e),n=ot(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:Or(r.prerelease,n.prerelease)}function oe(e,t){let r=it(e,t);return r!==void 0&&r>=0}function wr(e){let t=br.exec(e.trim());return t?Fe(t):void 0}function Fe(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function ie(e,t){let r=wr(t),n=xr.exec(e.trim()),o=n?Fe(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 Or(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=Ar(o,s);if(a!==0)return a}return 0}function Ar(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 st="EV_AI_LAUNCHER_REFRESH_SCOPE";var at="EV_AI_HOOK_UPDATE_TTL_MIN",ct="--defer-user-spec",G="--cap";var ei=Buffer.from([1]);var ti=1024*1024,ri=4*1024*1024,ni=64*1024,oi=64*1024,ii=64*1024;var ut="handoff-",ft=6e4,D=1800,Pe=604800,lt=3e5,Le=4096,Me=4*1024*1024;import{randomBytes as Nr}from"node:crypto";import{basename as Ir,dirname as Fr,join as Te}from"node:path";import{open as dt,mkdir as Pr,readFile as Lr,readdir as Mr,rename as Tr,stat as Dr,rmdir as Hr,unlink as Cr,utimes as Ur}from"node:fs/promises";var se=new WeakMap;function De(e){if(e&&typeof e=="object"&&"code"in e)return e}function S(e){return De(e)?.code==="ENOENT"}function He(e){return De(e)?.code==="EEXIST"}function Br(e){let t=De(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function k(e,t){try{return await e.readdir(t)}catch(r){if(S(r))return[];throw r}}async function J(e,t){try{await e.unlink(t)}catch(r){if(!S(r))throw r}}async function ae(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 Ce(){return Nr(8).toString("hex")}function Vr(e){return e.startsWith(".")}async function Y(e,t,r){await Ue(e,t,r,Vr,36e5)}async function Ue(e,t,r,n,o){let s=await k(e,t);await Promise.all(s.map(async a=>{if(!n(a))return;let c=Te(t,a);try{let i=await e.stat(c);r-i.mtimeMs>o&&await e.unlink(c)}catch(i){if(!S(i))throw i}}))}async function N(e,t,r){let n=Fr(t),o=Ce(),s=`.${Ir(t)}.`,a=Te(n,`${s}${o}`),c=()=>e.unlink(a).catch(()=>{});await ae(e,a,r);try{await e.rename(a,t)}catch(i){if(!Br(i))throw await c(),i;let u=Te(n,`${s}bad.${o}`);try{await e.rename(t,u)}catch(f){if(!S(f))throw await c(),f}await e.rename(a,t)}await e.fsyncDir(n)}function I(){return{async open(e,t){let r=await dt(e,t),n={path:e};return se.set(n,r),n},async write(e,t){let r=pt(e),n=typeof t=="string"?Buffer.from(t,"utf8"):t;await r.write(n)},async fsync(e){await pt(e).sync()},async close(e){let t=se.get(e);se.delete(e),t&&await t.close()},rename:Tr,async readdir(e){return Mr(e)},readFile:Lr,async stat(e){let t=await Dr(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await Pr(e,t)},unlink:Cr,rmdir:Hr,utimes:Ur,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=se.get(e);if(!t)throw new Error("closed");return t}function _(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var ht=Object.freeze({"test-key-1":mt("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":mt("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function mt(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 H(e){return e?{...ht,...te}:te}import{join as z}from"node:path";function Be(e){return z(e,".ev-ai","agent-hook","js","signed-v1")}function Ve(e){return z(Be(e),"scopes")}function b(e,t){return z(Ve(e),t)}function x(e){return z(e,"attempts")}function ce(e){return z(e,"scope.json")}function Ke(e){return String(e).padStart(10,"0")}var Kr=64;function w(e,t){return X(Be(e),t?"dev-artifacts":"artifacts")}function je(e,t){return X(e,t)}function R(e,t){return X(e,t,"hook.mjs")}function ue(e,t){return X(e,t,"release.json")}function jr(e,t){return X(e,t,"health.json")}function F(e){return _t("sha512").update(e).digest("hex")}function $e(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Kr||t.toString("base64")!==e))return t.toString("hex")}async function C(e,t,r){try{let n=await e.stat(t);return n.size<=0||n.size>Me?"bad":F(await e.readFile(t))===r?"ok":"bad"}catch(n){if(S(n))return"missing";throw n}}async function U(e,t,r,n,o,s,a=process.version){let[c,i,u]=await Promise.all([gt(e,R(t,r)),gt(e,ue(t,r)),$r(e,jr(t,r))]);if(c===void 0)return{usable:!1,reason:"artifact_missing"};if(i===void 0)return{usable:!1,reason:"signature_invalid"};let f;try{f=JSON.parse(i.toString("utf8"))}catch{return{usable:!1,reason:"signature_invalid"}}let d=v(f,H(s));if(!d.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:l}=d;if(c.byteLength!==l.size||c.byteLength>Me)return{usable:!1,reason:"hash_mismatch"};let p=_t("sha512").update(c).digest();if(p.toString("hex")!==r)return{usable:!1,reason:"hash_mismatch"};let h=Buffer.from(l.sha512,"base64");if(p.byteLength!==h.byteLength||!p.equals(h))return{usable:!1,reason:"hash_mismatch"};if(!oe(l.version,n))return{usable:!1,reason:"below_floor"};if(!ie(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 g=Date.parse(u.quarantined_until);if(Number.isFinite(g)&&g>o)return{usable:!1,reason:"quarantined"}}return{usable:!0,manifest:l,healthFails:u?.consecutive_startup_failures??0}}async function gt(e,t){try{return await e.readFile(t)}catch(r){if(S(r))return;throw r}}async function $r(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 yt}from"node:path";var Gr=/^(\d{10})$/,Jr=/^(\d{10})\.done$/,Yr=/^[0-9a-f]{128}$/,zr=64;function P(e){let t=e[at];if(t===void 0||t==="")return D;let r=Number(t);return!Number.isInteger(r)||r<=0?D:Math.min(Math.max(D,r*60),Pe)}async function y(e,t,r=!1){let n=x(t),o=await k(e,n),s=new Map,a=new Map,c=Et(o,Gr),i=Et(o,Jr),u=async l=>{let p=await Rt(e,yt(n,fe(l)));return p&&s.set(l,{record:Xr(p.value),mtimeMs:p.mtimeMs}),p!==void 0},f=async l=>{let p=qr((await Rt(e,yt(n,le(l))))?.value);return p&&a.set(l,p),p!==void 0};if(!r)return await Promise.all([...c.map(u),...i.map(f)]),{claims:s,dones:a};await Promise.all([St(c,u),St(i,f)]);let d=O(s);return d<O(a)&&i.includes(d)&&await f(d),{claims:s,dones:a}}function Et(e,t){return e.flatMap(r=>{let n=t.exec(r);return n?[Number(n[1])]:[]})}async function St(e,t){for(let r of[...e].sort((n,o)=>o-n))if(await t(r))return}function O(e){let t=0;for(let r of e.keys())r>t&&(t=r);return t}function L(e,t,r){let n=O(e.claims),o=O(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?Wr(c):void 0,u=n>0?e.dones.get(n):void 0,f=Ge(u?.interval_s,r),d=i!==void 0?i+f*1e3:void 0,l=i!==void 0&&i-t>lt;return{latest:n,startMs:i,intervalS:f,deadlineMs:d,selection:s,lastOutcome:a,futureDated:l,highestDone:o}}function Wr(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 fe(e){return Ke(e)}function le(e){return`${Ke(e)}.done`}function Ge(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(D,t):Math.min(Math.max(Math.floor(e),D,t),Pe)}async function Rt(e,t){let r;try{r=await e.stat(t)}catch(o){if(S(o))return;throw o}let n=r.mtimeMs;if(r.size===0||r.size>Le)return{mtimeMs:n};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>Le?{mtimeMs:n}:{mtimeMs:n,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:n}}}function Xr(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 qr(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=Qr(t.selection);if(r)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:r}}function Qr(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"&&Yr.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&Zr(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function Zr(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==zr||t.toString("base64")!==e))return t.toString("hex")}import{join as de}from"node:path";async function pe(e,t,r){let n=x(t);await e.mkdir(n,{recursive:!0}),await Y(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 me={kind:"bundled",why:"bootstrap_failed"};function he(e,t,r,n,o,s){return(a,c,i)=>rn(e,t,{n:r.n,startedAtMs:r.startedAtMs,nowMs:n(),budgetMs:o,intervalS:Ge(i,s),outcome:a,selection:c})}async function rn(e,t,r){if(r.nowMs-r.startedAtMs>r.budgetMs+3e4)return{recorded:!1,why:"expired"};let n=await y(e,t);if(O(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 Y(e,x(t),r.nowMs),await N(e,de(x(t),le(r.n)),JSON.stringify(o)),await nn(e,t,r.n),{recorded:!0}}async function nn(e,t,r){let n=await y(e,t),o=r-8,s=O(n.dones),a=x(t),c=new Set([...n.claims.keys(),...n.dones.keys()]);await Promise.all([...c].map(async i=>{i>=o||i!==s&&(await J(e,de(a,fe(i))),await J(e,de(a,le(i))))}))}async function kt(e,t,r){if(r.n<1||r.n>9999999999)return{kind:"lost"};let n=x(t),o=de(n,fe(r.n)),s=new Date(r.nowMs).toISOString(),a=Ce(),c={started_at:s,nonce:a,owner:r.owner};r.resync&&(c.resync=!0);try{await ae(e,o,JSON.stringify(c)),await e.fsyncDir(n)}catch(i){if(He(i))return{kind:"lost"};throw i}return r.collectorRedacted!==void 0&&await on(e,t,r.collectorRedacted,r.dev===!0),O((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 on(e,t,r,n){let o=ce(t);try{await ae(e,o,Buffer.from(JSON.stringify({collector:r,dev:n}),"utf8")),await e.fsyncDir(t)}catch(s){if(He(s))return;throw s}}import{readFileSync as vn}from"node:fs";import{homedir as Nn}from"node:os";import{join as In}from"node:path";import{createHash as sn}from"node:crypto";import{access as an,readFile as cn,stat as un}from"node:fs/promises";import{homedir as fn}from"node:os";import{dirname as ln,join as Je,parse as dn,resolve as xt}from"node:path";function bt(e){return e.charCodeAt(0)===65279?e.slice(1):e}var pn="https://hooks.ev-ai.ai",mn=".claude/ev-ai-runtime-report.json",hn="config.json";var gn=1024*1024,It=new Set(["localhost","127.0.0.1","[::1]","::1"]),_n=["claude","cursor","codex"],yn=[mn,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],wt=/^[A-Za-z0-9._~-]+$/;function En(e){return e!==void 0&&_n.includes(e)}function Ot(e){if(e===void 0||!/^\d+$/.test(e))return;let t=Number(e);return Number.isSafeInteger(t)?t:void 0}function q(e,t){let r=e[t+1];return r&&!r.startsWith("--")?{value:r,next:t+1}:{next:t}}function Sn(e){let t,r,n,o,s,a;for(let c=0;c<e.length;c++){let i=e[c];if(i!==void 0){if(i==="--runner"){let u=q(e,c);t=u.value,c=u.next;continue}if(i.startsWith("--runner=")){t=i.slice(9);continue}if(i==="--url"){let u=q(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=q(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=q(e,c);u.value&&(s=u.value),c=u.next;continue}if(i.startsWith("--base-url=")){s=i.slice(11);continue}if(i===G){let u=q(e,c);a=Ot(u.value)??a,c=u.next;continue}if(i.startsWith(`${G}=`)){a=Ot(i.slice(G.length+1))??a;continue}i!==ct&&!i.startsWith("-")&&r===void 0&&(r=i)}}return{runner:En(t)?t:void 0,event:r,collectorUrl:n,orgToken:o,baseUrl:s,...a!==void 0?{cap:a}:{}}}function Ft(e,t=pn){let r=t.replace(/\/+$/,""),n=e.trim();return`${r}/${n}/hook`}function Ye(e=fn()){return Je(e,".ev-ai",hn)}function Rn(e,t){return{...e,...t}}function At(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 Pt(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?It.has(t.hostname):!1}catch{return!1}}function Lt(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(!Pt(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let r=Lt(e);if(!r)return`must end with /{orgToken}/hook (got: ${e})`;if(!wt.test(r))return`org token must match ${wt.source} (got: ${r})`;if(At(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(At(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function Mt(e){return new URL(e).toString()}function vt(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?Ft(r):""}function B(e){try{return It.has(new URL(e).hostname)}catch{return!1}}function Tt(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 kn(e){let t=e.collectorUrl?.trim(),r;if(t)r=t;else{let o=e.orgToken?.trim();o&&(r=Ft(o,e.baseUrl?.trim()??void 0))}if(!r)return{};let n=ge(r);return n?{problem:n}:{url:Mt(r)}}var bn="CLAUDE_PLUGIN_OPTION_COLLECTOR_URL";function xn(e){let t=e[bn]?.trim();if(!t)return{};let r=ge(t);return r?{problem:r}:{url:Mt(t)}}var ze={access:an,stat:un,readFile:(e,t)=>cn(e,t)};async function wn(e,t,r=ze){let n=xt(e),{root:o}=dn(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=ln(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 xt(e)}async function Q(e,t=ze){try{let r=await t.stat(e);if(!r.isFile()||r.size>gn)return;let n=await t.readFile(e,"utf8"),o=JSON.parse(bt(n));return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function Nt(e,t){return(await Promise.all(yn.map(async n=>{let o=Je(e,n);try{return await t.access(o),o}catch{return}}))).find(n=>n!==void 0)}async function Dt(e){let t=e.fs??ze,r=kn(Sn(e.argv));if(r.url)return{url:r.url,source:"argv"};let n=()=>{let l=xn(e.env).url;return l?{url:l,source:"plugin_option"}:{source:"none"}},o=e.env.EV_AI_HOOK_MANIFEST;if(o)try{await t.access(o);let l=await Q(o,t),p=l?vt(l):"";return p?{url:p,source:"manifest_override"}:n()}catch{}let s=await wn(e.cwd,e.env,t),a=Ye(e.home),[c,i]=await Promise.all([Q(a,t),Nt(s,t).then(async l=>l??Nt(e.cwd,t))]),u=i?await Q(i,t):void 0,f;c&&u?f=Rn(u,c):c?f=c:u&&(f=u);let d=f?vt(f):"";return d?{url:d,source:"manifest"}:n()}function Ht(e){if(ge(e))return;let t;try{t=new URL(e)}catch{return}let r=Lt(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 sn("sha256").update(a).digest("hex").slice(0,32)}var On=/^[A-Za-z0-9._~-]+$/;function Ct(e,t){if(!On.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&&Pt(o.toString()))return o.toString()}function Ut(e){return Ct(e,"version")}function Bt(e){return Ct(e,"error-report")}var Kt=/^[A-Za-z0-9._-]{8,64}$/;function Fn(e,t){try{let n=vn(In(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"&&Kt.test(s))return s}}catch{}let r=t.EV_AI_HOOK_INSTALLATION_ID?.trim();return r&&Kt.test(r)?r:void 0}async function _e(e,t,r,n,o){if(!t.startsWith("failed:")||!n.postJson)return;let s=Bt(e);if(!s)return;let a;try{a=Fn(o?.home??Nn(),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 Pn from"node:http";import Ln from"node:https";import{URL as Mn}from"node:url";function ye(){return{getBounded:jt,postJson:Hn}}function Ee(e,t){return e==="timeout"||e==="network"?"failed:timeout":e==="http_3xx"?"failed:http_3xx":t}function jt(e,t){let r;try{r=new Mn(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:"?Pn:Ln;return new Promise(o=>{let s=!1,a=[],c=0,i=d=>{s||(s=!0,t.signal?.removeEventListener("abort",u),o(d))},u=()=>{f.destroy(),i({ok:!1,reason:"timeout"})},f=n.request(r,{method:t.method??"GET",agent:!1,timeout:t.timeoutMs,headers:t.headers},d=>{let l=d.statusCode??0;if(l>=300&&l<400){d.resume(),i({ok:!1,reason:"http_3xx"});return}let p=d.headers["content-length"];if(typeof p=="string"){let h=Number(p);if(Number.isFinite(h)&&h>t.maxBytes){d.destroy(),i({ok:!1,reason:"too_large"});return}}d.on("data",h=>{if(c+=h.length,c>t.maxBytes){d.destroy(),i({ok:!1,reason:"too_large"});return}a.push(h)}),d.on("end",()=>{i({ok:!0,response:{status:l,headers:d.headers,body:Buffer.concat(a)}})}),d.on("error",()=>{i({ok:!1,reason:"network"})})});if(f.on("timeout",()=>{f.destroy(),i({ok:!1,reason:"timeout"})}),f.on("error",()=>{i({ok:!1,reason:"network"})}),t.signal){if(t.signal.aborted){u();return}t.signal.addEventListener("abort",u,{once:!0})}f.end(t.body)})}var Tn=2048,Dn=1024;function Hn(e,t,r){let n;try{n=Buffer.from(JSON.stringify(t),"utf8")}catch{return Promise.resolve({ok:!1,reason:"network"})}return n.byteLength>Tn?Promise.resolve({ok:!1,reason:"too_large"}):jt(e,{maxBytes:Dn,timeoutMs:r.timeoutMs,signal:r.signal,method:"POST",body:n,headers:{"content-type":"application/json","content-length":n.byteLength}})}function Cn(e){return Q(Ye(e))}async function Z(e,t,r=Cn(t)){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await r)?.auto_update===!1}function We(e){return!!e.CURSOR_SANDBOX}function Se(e,t,r,n){return{source:"bundled",hookPath:e.bundledHookPath,fallbackReason:t,scopeId:r?.scopeId,dev:r?.dev,...n}}import{join as Bn}from"node:path";var qe=/^[0-9a-f]{128}$/;function Vn(e){return Buffer.from(JSON.stringify({format:e.format,key_id:e.key_id,payload:e.payload,signature:e.signature}),"utf8")}async function Re(e,t,r,n,o,s,a,c){if(!qe.test(r)||F(n)!==r)return{ok:!1,reason:"repair_failed"};let i=je(t,r);await e.mkdir(i,{recursive:!0}),await Y(e,i,a);let u=R(t,r),f=ue(t,r),d=Vn(o);if(await C(e,u,r)==="ok"){let p=await Kn(e,f);if(p?.equals(d))return await Xe(e,t,r),{ok:!0};let h=await jn(p,c);return h!==void 0&&h!==s.version?{ok:!1,reason:"metadata_conflict"}:(await N(e,f,d),await Xe(e,t,r),{ok:!0})}return await N(e,u,n),await N(e,f,d),await C(e,u,r)!=="ok"?{ok:!1,reason:"repair_failed"}:(await Xe(e,t,r),{ok:!0})}async function Gt(e,t,r){let n=$e(r.sha512);if(!(n===void 0||!qe.test(n)))return await C(e,R(t,n),n)==="ok"?n:void 0}async function Kn(e,t){try{return await e.readFile(t)}catch{return}}async function jn(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,H(t));return n.ok?n.manifest.version:void 0}async function Xe(e,t,r){try{let o=(await k(e,t)).filter(i=>qe.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(ue(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=>$n(e,t,i.name)))}catch{}}async function $n(e,t,r){let n=je(t,r);try{let o=await k(e,n);await Promise.all(o.map(s=>J(e,Bn(n,s)))),await e.rmdir(n)}catch{}}function ke(e,t){return{launcher:e,protocol:String(1),current:t,platform:`${process.platform}-${process.arch}`,node:process.version,update_format:M}}function Jn(e,t,r=H(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:Wn(n.check_interval_s)}};let o=v(n,r);if(!o.ok)return{ok:!1,reason:"failed:metadata_mismatch"};let s=zn(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:Yn(n)}}:{ok:!1,reason:"failed:origin_rejected"}}async function Jt(e,t,r,n,o,s){let a=Xn(e,t),c=await n.getBounded(a,{maxBytes:4096,timeoutMs:r,signal:s});if(!c.ok)return{ok:!1,reason:Ee(c.reason,"failed:metadata_mismatch")};let{status:i,body:u}=c.response;if(i!==200)return{ok:!1,reason:`failed:http_${i}`};let f;try{f=JSON.parse(u.toString("utf8"))}catch{return{ok:!1,reason:"failed:metadata_mismatch"}}return Jn(f,o)}function Yn(e){return{format:M,key_id:String(e.key_id),payload:String(e.payload),signature:String(e.signature)}}function zn(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 Wn(e){if(typeof e=="number"&&Number.isInteger(e)&&e>0)return e}function Xn(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 be(e,t,r,n,o,s){let a=Ut(e);return a?Jt(a,t,r,n,o,s):{ok:!1,reason:"failed:origin_rejected"}}async function xe(e,t,r,n,o,s,a,c,i,u){let{manifest:f,envelope:d}=n;if(!oe(f.version,o))return{ok:!1,reason:"skipped:below_floor"};if(!ie(process.version,f.node_engine))return{ok:!1,reason:"skipped:incompatible_node"};if(f.min_launcher_protocol>1)return{ok:!1,reason:"skipped:incompatible_protocol"};let l=await Gt(e,r,f);if(l){let h=await U(e,r,l,o,s,i);if(h.usable)return{ok:!0,digest:l,reused:!0};if(h.reason==="quarantined")return{ok:!1,reason:"skipped:quarantined"};if(h.reason==="signature_invalid"){let g=R(r,l);if(await C(e,g,l)==="ok"){let V=await e.readFile(g),K=await Re(e,r,l,V,d,f,s,i);return K.ok?{ok:!0,digest:l,reused:!0}:{ok:!1,reason:`failed:${K.reason}`}}}}let p=await qn(e,r,n,u,s,i);return p||Qn(e,t,r,n,s,a,c,i)}async function qn(e,t,r,n,o,s){if(n.length!==0)try{let a=await e.readFile(n);if(!ne(a,r.manifest).ok)return;let c=F(a),i=await Re(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 Qn(e,t,r,n,o,s,a,c){let{manifest:i,envelope:u}=n,f=await t.getBounded(i.url,{maxBytes:i.size,timeoutMs:s,signal:a});if(!f.ok)return{ok:!1,reason:Ee(f.reason,"failed:extract_failed")};if(f.response.status!==200)return{ok:!1,reason:`failed:http_${f.response.status}`};let d=f.response.body;if(!ne(d,i).ok)return{ok:!1,reason:"failed:integrity_mismatch"};let p=F(d),h=await Re(e,r,p,d,u,i,o,c);return h.ok?{ok:!0,digest:p,reused:!1}:{ok:!1,reason:`failed:${h.reason}`}}async function to(e){let t=e.fs??I(),r=e.http??ye(),n=b(e.home,e.scope.scopeId),o=w(e.home,e.scope.dev),s=P(e.env),a=AbortSignal.timeout(3e3),c=await pe(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 Se(e,h?"bootstrap_in_progress":"bootstrap_failed",e.scope,{didBootstrap:!1})}let i=he(t,n,c,()=>Date.now(),3e3,s),u=async h=>(await i(h,me),Se(e,"bootstrap_failed",e.scope,{didBootstrap:!0}));if(a.aborted)return u("failed:bootstrap");let f=await be(e.scope.collectorUrl,ke(e.bundledVersion,e.bundledVersion),1e3,r,e.scope.dev,a);if(!f.ok)return u(f.reason);let d=f.directive;if(d.kind==="none")return u("failed:bootstrap");if(d.kind==="bundled")return await i("bundled",{kind:"bundled",why:"server"},d.intervalS),Se(e,"server",e.scope,{didBootstrap:!0});let l=await xe(t,r,o,{manifest:d.manifest,envelope:d.envelope},e.bundledVersion,e.nowMs,2e3,a,e.scope.dev,e.bundledHookPath);if(!l.ok)return _e(e.scope.collectorUrl,l.reason,"bootstrap",r,{home:e.home,env:e.env}),u(l.reason);let{digest:p}=l;return await i("updated",{kind:"cached",digest:p,version:d.manifest.version,sha512:d.manifest.sha512}),{source:"bootstrap",hookPath:R(o,p),scopeId:e.scope.scopeId,digest:p,dev:e.scope.dev,didBootstrap:!0}}async function we(e,t){let r=await Dt({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!r.url)return;let n=Ht(r.url);if(!(!n||r.source==="none"))return{scopeId:n,collectorUrl:r.url,collectorUrlRedacted:Tt(r.url),source:r.source,dev:B(r.url)}}async function oo(e,t,r,n,o){try{await io(e,t,r,n,o)}catch{}return 0}async function io(e,t,r,n,o){if(We(t)||await Z(t,n))return;let s=t[st],a=await we(e,{env:t,cwd:r,home:n});if(!a||!s||a.scopeId!==s)return;let c=o?.fs??I(),i=o?.http??ye(),u=o?.nowMs??Date.now(),f=P(t),d=b(n,a.scopeId);await Ue(c,d,u,er=>er.startsWith(ut),ft).catch(()=>{});let l=await pe(c,d,{owner:"refresh",nowMs:u,ttlFloorS:f,collectorRedacted:a.collectorUrlRedacted,dev:a.dev});if(l.kind!=="claimed")return;let p=he(c,d,l,()=>Date.now(),6e4,f),h=o?.packageVersion??"",g=L(await y(c,d,!0),u,f).selection,V=g.kind==="uninitialized"?me:g,K=AbortSignal.timeout(6e4),Oe=await be(a.collectorUrl,ke(h,g.kind==="cached"?g.version:h),5e3,i,a.dev,K);if(!Oe.ok){await p(Oe.reason,V);return}let E=Oe.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 xe(c,i,w(n,a.dev),{manifest:E.manifest,envelope:E.envelope},h,u,3e4,K,a.dev,o?.bundledHookPath??"");if(!j.ok){_e(a.collectorUrl,j.reason,"refresh",i,{home:n,env:t}),await p(j.reason,V);return}let Qt=g.kind==="cached"&&g.version===E.manifest.version&&g.sha512===E.manifest.sha512,{digest:Zt}=j;await p(Qt?j.reused?"current":"repaired":"updated",{kind:"cached",digest:Zt,version:E.manifest.version,sha512:E.manifest.sha512})}function so(e){return`${e.slice(0,4)}\u2026`}async function ao(e,t,r){let n=e.includes("--json"),o=e.includes("--all"),s=e.slice(1).filter(p=>p!=="--json"&&p!=="--all"),a=await we(s,t),c=await Z(t.env,t.home),i=I(),u=await qt(t,r,a,i,c),f=await co(i,t.home,a?.scopeId),d=o?await uo(t,r,i,c,f):[];if(n)return t.stdout.write(`${JSON.stringify({...u,otherScopes:d},null,2)}
3
+ `),0;let l=[`launcher ${r.version} protocol ${r.evAi.launcherProtocol} revision ${r.evAi.launcherRevision} bundled hook ${r.version}`];if(l.push(...Xt(u)),o)for(let p of d)l.push(""),l.push(...Xt(p));else l.push(`other scopes ${f.length} (status --all)`);return l.push(`auto-update ${c?"off":"on"}`),t.stdout.write(`${l.join(`
4
4
  `)}
5
- `),0}async function Xt(e,t,n,r,o){let s=!o;if(o)return{...zt(n,s),selection:"bundled",fallbackReason:"kill_switch"};if(!n)return{selection:"bundled",fallbackReason:"no_collector_url",autoUpdate:s};let a=e.now(),c=await _(r,w(e.home,n.scopeId),!0),i=L(c,a,P(e.env)),u="bundled",f,d;if(i.selection.kind==="cached"){let l=b(e.home,n.dev),p=await C(r,l,i.selection.digest,t.version,a,n.dev);p.usable?(u=`cached ${i.selection.version}`,d=`usable (protocol ${p.manifest.min_launcher_protocol})`):f=p.reason}else i.selection.kind==="bundled"?f=i.selection.why:f="uninitialized";return{...zt(n,s),selection:u,fallbackReason:f,usable:d,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 zt(e,t){return{scopeId:e?.scopeId,collectorUrlRedacted:e?.collectorUrlRedacted,urlSource:e?.source,autoUpdate:t}}function Wt(e){let t=[];e.scopeId?t.push(`this repo scope ${oo(e.scopeId)} ${e.collectorUrlRedacted} (source: ${e.urlSource})`):t.push("this repo (no collector url)");let n=e.fallbackReason?` (${e.fallbackReason})`:e.usable?` ${e.usable}`:"";return t.push(` selection ${e.selection}${n}`),e.lastAttempt&&t.push(` schedule last attempt ${e.lastAttempt} next not before ${e.nextNotBefore} (interval ${Math.round((e.intervalS??0)/60)} min)`),e.lastResult&&t.push(` last result ${e.lastResult}`),t}async function so(e,t,n){return(await R(e,Be(t))).filter(r=>r!==n)}function ao(e,t,n,r,o){return Promise.all(o.map(async s=>{let a=await co(n,w(e.home,s)),c={scopeId:s,collectorUrl:"",collectorUrlRedacted:a.collector??"",source:"manifest",dev:a.dev};return Xt(e,t,c,n,r)}))}async function co(e,t){try{let n=JSON.parse((await e.readFile(ce(t))).toString("utf8"));if(y(n))return{collector:typeof n.collector=="string"?n.collector:void 0,dev:n.dev===!0}}catch{}return{dev:!1}}export{Zr as bootstrap,no as runRefresh,io as runStatus};
5
+ `),0}async function qt(e,t,r,n,o){let s=!o;if(o)return{...Wt(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,P(e.env)),u="bundled",f,d;if(i.selection.kind==="cached"){let l=w(e.home,r.dev),p=await U(n,l,i.selection.digest,t.version,a,r.dev);p.usable?(u=`cached ${i.selection.version}`,d=`usable (protocol ${p.manifest.min_launcher_protocol})`):f=p.reason}else i.selection.kind==="bundled"?f=i.selection.why:f="uninitialized";return{...Wt(r,s),selection:u,fallbackReason:f,usable:d,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 Wt(e,t){return{scopeId:e?.scopeId,collectorUrlRedacted:e?.collectorUrlRedacted,urlSource:e?.source,autoUpdate:t}}function Xt(e){let t=[];e.scopeId?t.push(`this repo scope ${so(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)/60)} min)`),e.lastResult&&t.push(` last result ${e.lastResult}`),t}async function co(e,t,r){return(await k(e,Ve(t))).filter(n=>n!==r)}function uo(e,t,r,n,o){return Promise.all(o.map(async s=>{let a=await fo(r,b(e.home,s)),c={scopeId:s,collectorUrl:"",collectorUrlRedacted:a.collector??"",source:"manifest",dev:a.dev};return qt(e,t,c,r,n)}))}async function fo(e,t){try{let r=JSON.parse((await e.readFile(ce(t))).toString("utf8"));if(_(r))return{collector:typeof r.collector=="string"?r.collector:void 0,dev:r.dev===!0}}catch{}return{dev:!1}}export{to as bootstrap,oo as runRefresh,ao as runStatus};
package/dist/launcher.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import{spawn as Yr}from"node:child_process";import{randomBytes as $r}from"node:crypto";import{readFile as Wr,rm as fn,writeFile as zr}from"node:fs/promises";import{homedir as Xr}from"node:os";import{basename as qr,dirname as Zr,join as Qr}from"node:path";import{Readable as eo}from"node:stream";import{fileURLToPath as dn}from"node:url";import{createHash as At}from"node:crypto";import{join as V}from"node:path";var ue="signed-hook-v1",fe=Buffer.from("ev-ai-hook-release-v1\0","utf8"),T=32;var Ke=64,de=64;import{sign as No,verify as Pn}from"node:crypto";var gn=/^[A-Za-z0-9+/]+=*$/;function F(e){if(e.length===0||!gn.test(e))return;let t=Buffer.from(e,"base64");if(t.toString("base64")===e)return t}import{createPrivateKey as uo,createPublicKey as yn,timingSafeEqual as fo}from"node:crypto";var En=Buffer.from("302a300506032b6570032100","hex"),po=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 G=Object.freeze({"release-key-1":Sn("jVk7k2gEEcdAiPOFtNZomu36bOpfkk0vgF9dC6FMcS0=")});function je(e){if(e.byteLength!==T)throw new Error("Ed25519 public key must be 32 bytes");return yn({key:Buffer.concat([En,Buffer.from(e)]),format:"der",type:"spki"})}function Ge(e,t){if(!Object.hasOwn(e,t))return;let n=e[t];if(n?.byteLength===T)return n}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"};function Je(e){let t;try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return{ok:!1,reason:m.INVALID_JSON}}return Rn(t)}function Rn(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 le(e);try{let n=t.parseValue();return t.atEnd()?{ok:!0,value:n}:{ok:!1,reason:m.TRAILING_BYTES}}catch(n){return n instanceof J?{ok:!1,reason:m.DUPLICATE_FIELD}:{ok:!1,reason:m.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 $e=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],xn=new Set($e),wn=/^\d+\.\d+\.\d+$/,An=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,bn=/^[@A-Za-z0-9._/~-]{1,214}$/;function pe(e){let t=Je(e);return t.ok?kn(t.value):t}function kn(e){if(!me(e))return{ok:!1,reason:m.INVALID_JSON};for(let f of Object.keys(e))if(!xn.has(f))return{ok:!1,reason:m.UNKNOWN_FIELD};for(let f of $e)if(!(f in e))return{ok:!1,reason:m.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!bn.test(t)||t.includes(".."))return{ok:!1,reason:m.INVALID_PACKAGE};let n=e.version;if(typeof n!="string"||!wn.test(n))return{ok:!1,reason:m.INVALID_VERSION};let r=e.url;if(typeof r!="string")return{ok:!1,reason:m.INVALID_URL};let o=Nn(r,n);if(o!==void 0)return{ok:!1,reason:o};let c=e.sha512;if(typeof c!="string")return{ok:!1,reason:m.INVALID_SHA512};if(F(c)?.byteLength!==de)return{ok:!1,reason:m.INVALID_SHA512};let s=e.size;if(typeof s!="number"||!Number.isInteger(s)||s<1||s>4194304)return{ok:!1,reason:m.INVALID_SIZE};let a=e.node_engine;if(typeof a!="string"||An.exec(a)===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:n,url:r,sha512:c,size:s,node_engine:a,min_launcher_protocol:u}}}function me(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Nn(e,t){if(e.includes("..")||/%2e/i.test(e)||/[\\?#]/.test(e))return m.INVALID_URL;let n;try{n=new URL(e)}catch{return m.INVALID_URL}if(n.href!==e)return m.INVALID_URL;if(!In(n))return m.INVALID_URL;if(n.username!==""||n.password!=="")return m.INVALID_URL;if(n.search!==""||n.hash!=="")return m.INVALID_URL;if(n.hostname===""||n.pathname.includes(".."))return m.INVALID_URL;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(n.pathname)?.[1];if(o===void 0)return m.INVALID_URL;if(o!==t)return m.URL_VERSION_MISMATCH}var vn=new Set(["localhost","127.0.0.1","[::1]"]);function In(e){return e.protocol==="https:"?!0:e.protocol==="http:"?vn.has(e.hostname):!1}var Ln=["format","key_id","payload","signature"],Cn=/^[A-Za-z0-9._-]{1,128}$/;function Tn(e,t){return Buffer.concat([fe,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function he(e,t){if(!me(e))return{ok:!1,reason:m.INVALID_ENVELOPE};if(e.format!==ue)return{ok:!1,reason:m.UNKNOWN_FORMAT};for(let f of Object.keys(e))if(f!=="format"&&f!=="key_id"&&f!=="payload"&&f!=="signature")return{ok:!1,reason:m.UNKNOWN_FIELD};for(let f of Ln)if(!(f in e))return{ok:!1,reason:m.MISSING_FIELD};let r=e.key_id;if(typeof r!="string"||!Cn.test(r))return{ok:!1,reason:m.INVALID_KEY_ID};let o=Ge(t,r);if(o===void 0)return{ok:!1,reason:m.UNKNOWN_KEY};let c=e.payload,i=e.signature;if(typeof c!="string"||typeof i!="string")return{ok:!1,reason:m.INVALID_ENVELOPE};let s=F(c),a=F(i);if(s===void 0||a===void 0)return{ok:!1,reason:m.NON_CANONICAL_BASE64};if(a.byteLength!==Ke)return{ok:!1,reason:m.INVALID_SIGNATURE_LENGTH};let u=!1;try{u=Pn(null,Tn(r,s),je(o),a)}catch{u=!1}return u?pe(s):{ok:!1,reason:m.SIGNATURE_INVALID}}var Dn=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,Hn=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,Mn=/^v?(\d+)\.(\d+)\.(\d+)/;function We(e){let t=Dn.exec(e);if(t)return{..._e(t),prerelease:t[4]?.split(".")}}function ge(e,t){let n=We(e),r=We(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:Bn(n.prerelease,r.prerelease)}function ze(e,t){let n=ge(e,t);return n!==void 0&&n>=0}function Un(e){let t=Hn.exec(e.trim());return t?_e(t):void 0}function _e(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function Xe(e,t){let n=Un(t),r=Mn.exec(e.trim()),o=r?_e(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 Bn(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 i=Vn(o,c);if(i!==0)return i}return 0}function Vn(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 ye="EV_AI_LAUNCHER_VERSION",Ee="EV_AI_LAUNCHER_PROTOCOL",Se="EV_AI_HOOK_SOURCE",Y="EV_AI_HOOK_FALLBACK_REASON",$="EV_AI_LAUNCHER_SCOPE",Re="EV_AI_LAUNCHER_READY_FD",W="EV_AI_LAUNCHER_REFRESH_SCOPE",z="EV_AI_LAUNCHER_REFRESH_EVENT",qe="EV_AI_HOOK_UPDATE_TTL_MIN",Ze="--defer-user-spec",D="--cap",Qe=Buffer.from([1]),et='{"continue":true}',tt=3e3,nt=1024*1024,rt=4*1024*1024,xe=64*1024,we=64*1024,X=64*1024,ot=2e3,q=250,it=8e3,Ae=14e3,st=1e3,at=1e3,ct=500,ut=1e4,be="handoff-";var H=1800,ke=604800,ft=3e5,Ne=4096,Z=4*1024*1024,dt=2,lt=864e5;import{randomBytes as Kn}from"node:crypto";import{basename as jn,dirname as Gn,join as pt}from"node:path";import{open as mt,mkdir as Jn,readFile as Yn,readdir as $n,rename as Wn,stat as zn,rmdir as Xn,unlink as qn,utimes as Zn}from"node:fs/promises";var Q=new WeakMap;function gt(e){if(e&&typeof e=="object"&&"code"in e)return e}function C(e){return gt(e)?.code==="ENOENT"}function Qn(e){let t=gt(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function _t(e,t){try{return await e.readdir(t)}catch(n){if(C(n))return[];throw n}}async function er(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 tr(){return Kn(8).toString("hex")}async function U(e,t,n){let r=Gn(t),o=tr(),c=`.${jn(t)}.`,i=pt(r,`${c}${o}`),s=()=>e.unlink(i).catch(()=>{});await er(e,i,n);try{await e.rename(i,t)}catch(a){if(!Qn(a))throw await s(),a;let u=pt(r,`${c}bad.${o}`);try{await e.rename(t,u)}catch(f){if(!C(f))throw await s(),f}await e.rename(i,t)}await e.fsyncDir(r)}function ee(){return{async open(e,t){let n=await mt(e,t),r={path:e};return Q.set(r,n),r},async write(e,t){let n=ht(e),r=typeof t=="string"?Buffer.from(t,"utf8"):t;await n.write(r)},async fsync(e){await ht(e).sync()},async close(e){let t=Q.get(e);Q.delete(e),t&&await t.close()},rename:Wn,async readdir(e){return $n(e)},readFile:Yn,async stat(e){let t=await zn(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await Jn(e,t)},unlink:qn,rmdir:Xn,utimes:Zn,async fsyncDir(e){if(process.platform==="win32")return;let t=await mt(e,"r");try{await t.sync()}finally{await t.close()}}}}function ht(e){let t=Q.get(e);if(!t)throw new Error("closed");return t}function I(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Et=Object.freeze({"test-key-1":yt("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":yt("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function yt(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 St(e){return e?{...Et,...G}:G}import{join as te}from"node:path";function ve(e){return te(e,".ev-ai","agent-hook","js","signed-v1")}function nr(e){return te(ve(e),"scopes")}function B(e,t){return te(nr(e),t)}function Rt(e){return te(e,"attempts")}function Ie(e){return String(e).padStart(10,"0")}function ne(e,t){return V(ve(e),t?"dev-artifacts":"artifacts")}function rr(e,t){return V(e,t)}function re(e,t){return V(e,t,"hook.mjs")}function or(e,t){return V(e,t,"release.json")}function Pe(e,t){return V(e,t,"health.json")}function bt(e){return At("sha512").update(e).digest("hex")}async function Le(e,t,n){try{let r=await e.readFile(n);if(r.byteLength<=0||r.byteLength>Z)return;let o=bt(r),c=re(t,o);return await xt(e,c,o)==="ok"?o:(await e.mkdir(rr(t,o),{recursive:!0}),await U(e,c,r),await xt(e,c,o)==="ok"?o:void 0)}catch{return}}async function xt(e,t,n){try{let r=await e.stat(t);return r.size<=0||r.size>Z?"bad":bt(await e.readFile(t))===n?"ok":"bad"}catch(r){if(C(r))return"missing";throw r}}async function kt(e,t,n,r,o,c,i=process.version){let[s,a,u]=await Promise.all([wt(e,re(t,n)),wt(e,or(t,n)),Ce(e,Pe(t,n))]);if(s===void 0)return{usable:!1,reason:"artifact_missing"};if(a===void 0)return{usable:!1,reason:"signature_invalid"};let f;try{f=JSON.parse(a.toString("utf8"))}catch{return{usable:!1,reason:"signature_invalid"}}let p=he(f,St(c));if(!p.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:l}=p;if(s.byteLength!==l.size||s.byteLength>Z)return{usable:!1,reason:"hash_mismatch"};let d=At("sha512").update(s).digest();if(d.toString("hex")!==n)return{usable:!1,reason:"hash_mismatch"};let h=Buffer.from(l.sha512,"base64");if(d.byteLength!==h.byteLength||!d.equals(h))return{usable:!1,reason:"hash_mismatch"};if(!ze(l.version,r))return{usable:!1,reason:"below_floor"};if(!Xe(i,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 E=Date.parse(u.quarantined_until);if(Number.isFinite(E)&&E>o)return{usable:!1,reason:"quarantined"}}return{usable:!0,manifest:l,healthFails:u?.consecutive_startup_failures??0}}async function wt(e,t){try{return await e.readFile(t)}catch(n){if(C(n))return;throw n}}async function Ce(e,t){try{let n=await e.readFile(t),r=JSON.parse(n.toString("utf8"));if(!I(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 ir}from"node:crypto";import{access as sr,readFile as ar,stat as cr}from"node:fs/promises";import{homedir as ur}from"node:os";import{dirname as fr,join as Te,parse as dr,resolve as vt}from"node:path";function Nt(e){return e.charCodeAt(0)===65279?e.slice(1):e}var lr="https://hooks.ev-ai.ai",pr=".claude/ev-ai-runtime-report.json",mr="config.json",hr="max_concurrent_hooks",gr=1024*1024,Tt=new Set(["localhost","127.0.0.1","[::1]","::1"]),_r=["claude","cursor","codex"],yr=[pr,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],It=/^[A-Za-z0-9._~-]+$/;function Er(e){return e!==void 0&&_r.includes(e)}function Ft(e){if(!e||typeof e!="object")return;let t=e[hr];return typeof t=="number"&&Number.isSafeInteger(t)&&t>0?t:void 0}function Ot(e){if(e===void 0||!/^\d+$/.test(e))return;let t=Number(e);return Number.isSafeInteger(t)?t:void 0}function K(e,t){let n=e[t+1];return n&&!n.startsWith("--")?{value:n,next:t+1}:{next:t}}function Fe(e){let t,n,r,o,c,i;for(let s=0;s<e.length;s++){let a=e[s];if(a!==void 0){if(a==="--runner"){let u=K(e,s);t=u.value,s=u.next;continue}if(a.startsWith("--runner=")){t=a.slice(9);continue}if(a==="--url"){let u=K(e,s);u.value&&(r=u.value),s=u.next;continue}if(a.startsWith("--url=")){r=a.slice(6);continue}if(a==="--token"){let u=K(e,s);u.value&&(o=u.value),s=u.next;continue}if(a.startsWith("--token=")){o=a.slice(8);continue}if(a==="--base-url"){let u=K(e,s);u.value&&(c=u.value),s=u.next;continue}if(a.startsWith("--base-url=")){c=a.slice(11);continue}if(a===D){let u=K(e,s);i=Ot(u.value)??i,s=u.next;continue}if(a.startsWith(`${D}=`)){i=Ot(a.slice(D.length+1))??i;continue}a!==Ze&&!a.startsWith("-")&&n===void 0&&(n=a)}}return{runner:Er(t)?t:void 0,event:n,collectorUrl:r,orgToken:o,baseUrl:c,...i!==void 0?{cap:i}:{}}}function Dt(e,t=lr){let n=t.replace(/\/+$/,""),r=e.trim();return`${n}/${r}/hook`}function De(e=ur()){return Te(e,".ev-ai",mr)}function Sr(e,t){return{...e,...t}}function Pt(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 Rr(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?Tt.has(t.hostname):!1}catch{return!1}}function Ht(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 Mt(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!Rr(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let n=Ht(e);if(!n)return`must end with /{orgToken}/hook (got: ${e})`;if(!It.test(n))return`org token must match ${It.source} (got: ${n})`;if(Pt(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(Pt(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function xr(e){return new URL(e).toString()}function Lt(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?Dt(n):""}function Ut(e){try{return Tt.has(new URL(e).hostname)}catch{return!1}}function Bt(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 wr(e){let t=e.collectorUrl?.trim(),n;if(t)n=t;else{let o=e.orgToken?.trim();o&&(n=Dt(o,e.baseUrl?.trim()??void 0))}if(!n)return{};let r=Mt(n);return r?{problem:r}:{url:xr(n)}}var He={access:sr,stat:cr,readFile:(e,t)=>ar(e,t)};async function Ar(e,t,n=He){let r=vt(e),{root:o}=dr(r);for(;;){let i=Te(r,".git");try{let a=await n.stat(i);if(a.isDirectory()||a.isFile())return r}catch{}if(r===o)break;let s=fr(r);if(s===r)break;r=s}let c=t.CURSOR_PROJECT_DIR??t.CLAUDE_PROJECT_DIR;if(c)try{if((await n.stat(c)).isDirectory())return c}catch{}return vt(e)}async function j(e,t=He){try{let n=await t.stat(e);if(!n.isFile()||n.size>gr)return;let r=await t.readFile(e,"utf8"),o=JSON.parse(Nt(r));return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function Ct(e,t){return(await Promise.all(yr.map(async r=>{let o=Te(e,r);try{return await t.access(o),o}catch{return}}))).find(r=>r!==void 0)}async function Vt(e){let t=e.fs??He,n=wr(Fe(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 p=await j(r,t),l=p?Lt(p):"";return l?{url:l,source:"manifest_override"}:{source:"none"}}catch{}let o=await Ar(e.cwd,e.env,t),c=De(e.home),[i,s]=await Promise.all([j(c,t),Ct(o,t).then(async p=>p??Ct(e.cwd,t))]),a=s?await j(s,t):void 0,u;i&&a?u=Sr(a,i):i?u=i:a&&(u=a);let f=u?Lt(u):"";return f?{url:f,source:"manifest"}:{source:"none"}}function Kt(e){if(Mt(e))return;let t;try{t=new URL(e)}catch{return}let n=Ht(e);if(!n)return;let o=t.pathname.split("/").filter(s=>s.length>0).slice(0,-2),c=o.length>0?`/${o.join("/")}`:"",i=`${t.origin}${c}/${n}`;return ir("sha256").update(i).digest("hex").slice(0,32)}function Me(e){return j(De(e))}async function oe(e,t,n=Me(t)){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await n)?.auto_update===!1}function jt(e){return`${D}=${Ft(e)??0}`}function M(e){return!!e.CURSOR_SANDBOX}async function Gt(e,t,n,r,o,c){if(M(c))return;let i=Pe(t,n),s=await Ce(e,i),a=s?.consecutive_startup_failures??0;if(!r){a>0&&await U(e,i,JSON.stringify({consecutive_startup_failures:0}));return}let u={consecutive_startup_failures:a+1};a+1>=dt?u.quarantined_until=new Date(o+lt).toISOString():s?.quarantined_until&&(u.quarantined_until=s.quarantined_until),await U(e,i,JSON.stringify(u))}function br(e,t){return new Promise(n=>{try{e.write(t,()=>n())}catch{n()}})}function Jt(e){let t=e.now(),n=Ae,r=!1,o=Promise.resolve(),c,i=!1,s=[],a,u,f,p=()=>Math.max(0,t+n-e.now()),l=[],d=(_,w)=>{if(e.installProcessHandlers===!1)return;(e.on??((L,R)=>process.on(L,R)))(_,w),l.push({event:_,handler:w})},h=()=>{let _=e.off??((w,v)=>process.off(w,v));for(let{event:w,handler:v}of l)try{_(w,v)}catch{}l.length=0},E=_=>(r||(r=!0,o=br(e.stdout,_??et)),o),S=_=>{if(c)try{c.kill(_)}catch{}},N=()=>{for(let _ of s)try{_()}catch{}},x=()=>{i||(N(),S("SIGTERM"),u=e.setTimeout(()=>{S("SIGKILL")},q),E())},A=()=>{E().finally(()=>{e.exit(0)})},O=()=>{i||(N(),A())},P=()=>{a&&e.clearTimeout(a),f&&e.clearTimeout(f),a=e.setTimeout(x,p());let _=Math.max(0,t+n+st-e.now());f=e.setTimeout(O,_)};P(),d("uncaughtException",A),d("unhandledRejection",A);for(let _ of["SIGTERM","SIGINT"])d(_,()=>{S(_),A()});return{ackOnce:E,remainingMs:p,eventBudgetMs:()=>n,onEventClassified(_){let w=_?Ae:it;w<n&&(n=w,P())},setChild(_){c=_},onAbort(_){s.push(_)},dispose(){i=!0,a&&e.clearTimeout(a),u&&e.clearTimeout(u),f&&e.clearTimeout(f),h()},waitForAckWrite(){return o}}}function kr(e){let t=e.trim();if(t)try{let n=JSON.parse(t);return I(n)?n:void 0}catch{return}}function Yt(e,t,n,r){if(!t||n!==0||r)return;let o=e.toString("utf8");if(kr(o)!==void 0)return o.trim()}var $t=[ye,Ee,$,Re,Se,Y];function Ue(e){return Buffer.isBuffer(e)?e:Buffer.from(e)}function Nr(e,t,n){let r={...e.env};return r[Re]="3",r[ye]=n,r[Ee]=String(1),r[Se]=t.source,t.fallbackReason?r[Y]=t.fallbackReason:delete r[Y],t.scopeId?r[$]=t.scopeId:delete r[$],r}function vr(e){let t=e.stdio[3];if(t&&typeof t=="object"&&"on"in t)return t}async function Be(e,t,n,r,o,c,i="live"){let s;try{s=o.spawn(o.execPath,[e.hookPath,...t],{cwd:o.cwd,env:Nr(o,e,c),stdio:["pipe","pipe","pipe","pipe"],windowsHide:!0})}catch{return{outcome:"spawn_failed",ready:!1}}r.setChild(s);let a=!1,u=s.stdout,f=s.stderr,p=s.stdin,l=vr(s);if(!u||!f||!p){try{s.kill("SIGKILL")}catch{}return n.stopChildWrites(),r.setChild(void 0),{outcome:"spawn_failed",ready:!1}}i==="replay"?n.replayTo(p):n.attachChild(p);let d="pending",h=Buffer.alloc(0),E=!1,S=!1,N=!1,x=0,A=null,O=!1,P=R=>{if(E)return;if(h.length+R.length>xe){h=Buffer.concat([h,R.subarray(0,xe-h.length)]),E=!0;return}h=Buffer.concat([h,R])};u.on("data",R=>{P(Ue(R))}),u.on("end",()=>{S=!0}),u.on("error",()=>{N=!0,S=!0}),f.on("data",R=>{if(x>=we)return;let b=Ue(R),g=we-x,y=b.length>g?b.subarray(0,g):b;x+=y.length;try{o.stderr.write(y)}catch{}}),f.resume(),l?(l.on("data",R=>{d==="pending"&&Ue(R).includes(Qe[0]??1)&&(d="byte")}),l.on("end",()=>{d==="pending"&&(d="eof")}),l.on("error",()=>{d==="pending"&&(d="error")})):d="error";let _=o.setTimeout(()=>{if(!(d!=="pending"||O))try{s.kill("SIGKILL")}catch{}},ot);await new Promise(R=>{let b=!1,g=()=>{b||(b=!0,R())};s.once("exit",y=>{O=!0,A=y,g()}),s.once("error",()=>{a=!0,O=!0,g()})}),n.stopChildWrites(),o.clearTimeout(_);let w=Math.min(q,Math.max(0,r.remainingMs()));await new Promise(R=>{let b=()=>d!=="pending"&&S;if(b()){R();return}let g=o.setTimeout(()=>R(),w),y=()=>{b()&&(o.clearTimeout(g),R())};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),a)return{outcome:"spawn_failed",ready:!1};let v=d==="byte",L=Yt(h,v,A,E||N);return L!==void 0?(await r.ackOnce(L),{outcome:"success",ready:!0}):d==="eof"?{outcome:"startup_failure",ready:!1}:{outcome:"runtime_failure",ready:v}}function Ir(e){let t=e.charAt(0);return t!==""&&t.toLowerCase()===t}function Or(e,t){let n=e.toLowerCase();return n==="sessionend"||n==="stopfailure"||n==="subagentstop"?!0:n==="stop"&&t==="codex"}function Wt(e,t,n){let r=n.EV_AI_HOOK_SYNC==="1";if(t===void 0||Buffer.byteLength(t,"utf8")>=X)return{isSessionStart:!1,isInProcess:r};let o=Fe(e),c=o.event??"",i=o.runner??"";try{let s=JSON.parse(t);I(s)&&(!c&&typeof s.hook_event_name=="string"?c=s.hook_event_name:!c&&typeof s.event=="string"&&(c=s.event),!i&&(typeof s.conversation_id=="string"||Ir(c))&&(i="cursor"))}catch{}return{isSessionStart:c.toLowerCase()==="sessionstart",isInProcess:r||Or(c,i)}}import{readFile as Pr}from"node:fs/promises";import{fileURLToPath as Lr}from"node:url";async function zt(e){let t=Lr(new URL("../package.json",e)),n=await Pr(t,"utf8"),r=JSON.parse(n);return{version:typeof r.version=="string"?r.version:"",evAi:{launcherProtocol:Ve(r.evAi?.launcherProtocol),minLauncherProtocol:Ve(r.evAi?.minLauncherProtocol),launcherRevision:Ve(r.evAi?.launcherRevision)}}}function Ve(e){return typeof e=="number"&&Number.isInteger(e)?e:0}var Cr=new Set(["configure","install","migrate-to-plugin","update","uninstall","--version","-V","help","--help","-h"]);function ie(e){let t=e[0];return t==="status"?"status":t==="__refresh"?"refresh":t==="__work"||t==="__post"?"bundled_cli":t===void 0||Cr.has(t)?"cli":"hook"}async function Xt(e,t){let n=await Vt({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!n.url)return;let r=Kt(n.url);if(!(!r||n.source==="none"))return{scopeId:r,collectorUrl:n.url,collectorUrlRedacted:Bt(n.url),source:n.source,dev:Ut(n.url)}}import{join as qt}from"node:path";var Tr=/^(\d{10})$/,Fr=/^(\d{10})\.done$/,Dr=/^[0-9a-f]{128}$/,Hr=64;function tn(e){let t=e[qe];if(t===void 0||t==="")return H;let n=Number(t);return!Number.isInteger(n)||n<=0?H:Math.min(Math.max(H,n*60),ke)}async function nn(e,t,n=!1){let r=Rt(t),o=await _t(e,r),c=new Map,i=new Map,s=Zt(o,Tr),a=Zt(o,Fr),u=async l=>{let d=await en(e,qt(r,Ur(l)));return d&&c.set(l,{record:Kr(d.value),mtimeMs:d.mtimeMs}),d!==void 0},f=async l=>{let d=jr((await en(e,qt(r,Br(l))))?.value);return d&&i.set(l,d),d!==void 0};if(!n)return await Promise.all([...s.map(u),...a.map(f)]),{claims:c,dones:i};await Promise.all([Qt(s,u),Qt(a,f)]);let p=se(c);return p<se(i)&&a.includes(p)&&await f(p),{claims:c,dones:i}}function Zt(e,t){return e.flatMap(n=>{let r=t.exec(n);return r?[Number(r[1])]:[]})}async function Qt(e,t){for(let n of[...e].sort((r,o)=>o-r))if(await t(n))return}function se(e){let t=0;for(let n of e.keys())n>t&&(t=n);return t}function rn(e,t,n){let r=se(e.claims),o=se(e.dones),c=r===0?{kind:"uninitialized"}:{kind:"bundled",why:"bootstrap_failed"},i;if(o>0){let d=e.dones.get(o);d&&(c=d.selection,i=d.outcome)}let s=r>0?e.claims.get(r):void 0,a=s?Mr(s):void 0,u=r>0?e.dones.get(r):void 0,f=Vr(u?.interval_s,n),p=a!==void 0?a+f*1e3:void 0,l=a!==void 0&&a-t>ft;return{latest:r,startMs:a,intervalS:f,deadlineMs:p,selection:c,lastOutcome:i,futureDated:l,highestDone:o}}function Mr(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 Ur(e){return Ie(e)}function Br(e){return`${Ie(e)}.done`}function Vr(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(H,t):Math.min(Math.max(Math.floor(e),H,t),ke)}async function en(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>Ne)return{mtimeMs:r};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>Ne?{mtimeMs:r}:{mtimeMs:r,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:r}}}function Kr(e){if(!I(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(!I(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=Gr(t.selection);if(n)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:n}}function Gr(e){if(!I(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"&&Dr.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&Jr(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function Jr(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Hr||t.toString("base64")!==e))return t.toString("hex")}function ae(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 on(e,t,n,r){if(await oe(t.env,t.home,r))return k(t,"kill_switch",n);if(!n)return k(t,"no_collector_url",n);let o=ee(),c=tn(t.env),i=t.now(),s=B(t.home,n.scopeId),a=rn(await nn(o,s,!0),i,c),u={deadlineMs:a.deadlineMs,dev:n.dev};if(a.selection.kind==="cached"){let p=ne(t.home,n.dev),l=await t.readPackageInfo().then(E=>E.version,()=>"");if((ge(l,a.selection.version)??0)>0)return await Le(o,p,t.bundledHookPath),k(t,"below_floor",n,u);let h=await kt(o,p,a.selection.digest,l,i,n.dev);return h.usable?{source:"cached",hookPath:re(p,a.selection.digest),scopeId:n.scopeId,digest:a.selection.digest,healthFails:h.healthFails,...u}:(h.reason==="below_floor"&&await Le(o,p,t.bundledHookPath),k(t,h.reason,n,u))}if(a.selection.kind==="bundled")return k(t,a.selection.why,n,u);if(M(t.env))return k(t,"sandboxed",n,u);let f=await ce(t);if(!f)return k(t,"bootstrap_failed",n,u);try{let p=await t.readPackageInfo();return await f.bootstrap({home:t.home,scope:n,bundledVersion:p.version,bundledHookPath:t.bundledHookPath,env:t.env,nowMs:i})}catch{return k(t,"bootstrap_failed",n,u)}}async function ce(e){try{return e.importUpdate?await e.importUpdate():await import(ae(e,"./launcher-update.mjs").href)}catch{return}}function sn(e,t){let n=[],r=[],o=0,c=0,i="pending",s,a=!1,u=!1,f=!1,p=!1,l=!1,d=[],h=()=>{!p&&typeof e.pause=="function"&&(e.pause(),p=!0)},E=()=>{p&&typeof e.resume=="function"&&(e.resume(),p=!1)},S=()=>{a=!1,f=!1,u=!0,E()},N=()=>{if(!(l||i==="pending")){l=!0,t.clearTimeout(L);for(let g of d)g();d.length=0}},x=g=>{i==="pending"&&(i=g),N()},A=()=>{if(a&&s)try{s.end()}catch{a=!1}},O=g=>{if(i==="oversize")return;let y=c+g.length;if(y>rt){x("oversize");return}r.push(g),c=y},P=g=>{if(!(!a||!s))try{if(!s.write(g)){if(s.destroyed||!s.writable){S();return}f=!0,h()}}catch{S()}},_=g=>{let y=Buffer.isBuffer(g)?g:Buffer.from(g);if(!(i==="truncated"||i==="complete")&&(O(y),!u)){if(a){P(y);return}n.push(y),o+=y.length,o>=nt&&h()}},w=()=>{A(),x("complete")},v=()=>{i==="pending"&&(x("truncated"),A(),S())},L=t.setTimeout(()=>{i==="pending"&&(x("truncated"),A(),S())},tt);"isTTY"in e&&!!e.isTTY?x("complete"):(e.on("data",_),e.on("end",w),e.on("error",v),typeof e.resume=="function"&&e.resume());let b=g=>{g.on("error",()=>{S()}),g.on("drain",()=>{!a||u||(f=!1,E())})};return{get state(){return i},get replayable(){return i==="complete"},get backlogBytes(){return o},get replayBytes(){return c},attachChild(g){s=g,u=!1,a=!0,f=!1,b(g);for(let y of n){if(!a)break;P(y)}if(n.length=0,o=0,f?h():E(),i!=="pending"){try{g.end()}catch{S()}a=!1}},replayTo(g){b(g);try{g.end(r.length>0?Buffer.concat(r,c):Buffer.alloc(0))}catch{}},stopChildWrites(){S()},dispose(){t.clearTimeout(L),e.off?.("data",_),e.off?.("end",w),e.off?.("error",v)},classifiableText(){if(!(i!=="complete"||c>=X))return Buffer.concat(r,c).toString("utf8")},whenSettled(){return l?Promise.resolve():new Promise(g=>{d.push(g)})}}}var ln={version:"",evAi:{launcherProtocol:1,minLauncherProtocol:1,launcherRevision:1}};function to(e){return dn(new URL("./hook.mjs",e))}function no(e){let t;return{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,env:process.env,cwd:process.cwd(),home:Xr(),now:()=>Date.now(),spawn:Yr,exit:n=>{process.exit(n)},setTimeout,clearTimeout,bundledHookPath:to(e),execPath:process.execPath,select:on,readPackageInfo:()=>t??=zt(e),launcherUrl:e}}async function an(e){return e.importCli?e.importCli():import(ae(e,"./cli.mjs").href)}async function pn(e=process.argv.slice(2),t=no(import.meta.url)){let n=ie(e);if(n==="cli")try{return await(await an(t)).main(e)}catch(i){let s=i instanceof Error?i.message:String(i);try{t.stderr.write(`[ev-ai-agent-hook] ${s}
5
- `)}catch{}return 1}if(n==="bundled_cli")return(await an(t)).main(e);if(n==="refresh"||n==="status")try{let i=await t.readPackageInfo().catch(()=>ln);if(n==="refresh")return await ro(e.slice(1),t,i);let s=await ce(t);return s?await s.runStatus(e,t,i):0}catch{return 0}let r=()=>{},o=new Promise(i=>{r=i}),c={...t,exit:i=>{t.exit(i),r(i)}};return Promise.race([hn(e,c),o])}async function mn(e,t,n){let r,o=new Promise(c=>{r=n.setTimeout(c,t)});await Promise.race([e,o]),n.clearTimeout(r)}async function ro(e,t,n){let r=await oo(t),o=ce(t).then(c=>c?.runRefresh(e,t.env,t.cwd,t.home,{packageVersion:n.version,bundledHookPath:t.bundledHookPath})).catch(()=>{});if(r){await mn(o,ut,t);let c={...t.env};delete c[W],delete c[z],await hn(e,{...t,env:c,stdin:eo.from([r]),exit:()=>{},installProcessHandlers:!1},!1).catch(()=>0)}return await o,0}async function oo(e){let t=e.env[z],n=e.env[W];if(!(!t||!n||Zr(t)!==B(e.home,n)||!qr(t).startsWith(be)))try{return await Wr(t)}catch{return}finally{await fn(t,{force:!0}).catch(()=>{})}}async function hn(e,t,n=!0){let r=Jt(t),o=sn(t.stdin,t),c,i=()=>c??=Wt(e,o.classifiableText(),t.env);o.whenSettled().then(()=>r.onEventClassified(i().isInProcess));let s=!1,a=new Promise(p=>{r.onAbort(()=>{s=!0,p()})}),u=p=>Promise.race([p,a.then(()=>{})]),f=async p=>(await r.ackOnce(),r.dispose(),o.dispose(),p);try{let p=t.readPackageInfo().catch(()=>ln),l=Me(t.home),d;try{d=await u(Xt(e,t))}catch{d=void 0}if(s)return f(0);let h;try{h=await u(t.select(e,t,d,l))}catch{h=k(t,"selection_error",d)}let E=await u(p);if(s||!h||!E)return f(0);let S=n?await u(io(t,h,d,o,i,l).catch(()=>{})):void 0;if(s||S&&await cn(e,t,S,o.classifiableText()))return f(0);let N=[...e,jt(await l)],x=await Be(h,N,o,r,t,E.version,"live");if(x.outcome==="success"&&h.source==="cached"&&h.healthFails&&await un(t,h,!1),x.outcome==="startup_failure"&&h.source!=="bundled"&&(await un(t,h,!0),o.replayable&&r.remainingMs()>at)){let A=k(t,"startup_failure",d);await Be(A,N,o,r,t,E.version,"replay")}return S&&await cn(e,t,S),f(0)}catch{return f(0)}}async function io(e,t,n,r,o,c){if(!(!n||t.didBootstrap||M(e.env)||t.deadlineMs!==void 0&&t.deadlineMs>e.now())&&(await mn(r.whenSettled(),ct,e),!(!r.replayable||!o().isSessionStart||await oe(e.env,e.home,c))))return n}async function cn(e,t,n,r){let o={...t.env};for(let i of $t)delete o[i];o[W]=n.scopeId;let c;if(r!==void 0){c=Qr(B(t.home,n.scopeId),`${be}${$r(8).toString("hex")}.json`);try{await zr(c,r,{mode:384,flag:"wx"})}catch{return!1}o[z]=c}try{let i=t.spawn(t.execPath,[dn(ae(t,"./launcher.mjs")),"__refresh",...e],{cwd:t.cwd,env:o,detached:!0,stdio:"ignore",windowsHide:!0});return await new Promise((s,a)=>{i.once("spawn",s),i.once("error",a)}),i.unref(),!0}catch{return c&&await fn(c,{force:!0}).catch(()=>{}),!1}}async function un(e,t,n){t.digest&&await Gt(ee(),ne(e.home,t.dev===!0),t.digest,n,e.now(),e.env).catch(()=>{})}pn().then(e=>{process.exit(e)}).catch(e=>{if(ie(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 _o}from"node:child_process";import{randomBytes as yo}from"node:crypto";import{readFile as Eo,rm as Sn,writeFile as So}from"node:fs/promises";import{homedir as Ro}from"node:os";import{basename as xo,dirname as Ao,join as bo}from"node:path";import{Readable as wo}from"node:stream";import{fileURLToPath as Rn}from"node:url";import{createHash as It}from"node:crypto";import{join as V}from"node:path";var ue="signed-hook-v1",fe=Buffer.from("ev-ai-hook-release-v1\0","utf8"),T=32;var $e=64,le=64;import{sign as Qo,verify as Bn}from"node:crypto";var wn=/^[A-Za-z0-9+/]+=*$/;function F(e){if(e.length===0||!wn.test(e))return;let t=Buffer.from(e,"base64");if(t.toString("base64")===e)return t}import{createPrivateKey as Do,createPublicKey as Nn,timingSafeEqual as Ho}from"node:crypto";var vn=Buffer.from("302a300506032b6570032100","hex"),Uo=Buffer.from("302e020100300506032b657004220420","hex");function On(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 G=Object.freeze({"release-key-1":On("jVk7k2gEEcdAiPOFtNZomu36bOpfkk0vgF9dC6FMcS0=")});function Ye(e){if(e.byteLength!==T)throw new Error("Ed25519 public key must be 32 bytes");return Nn({key:Buffer.concat([vn,Buffer.from(e)]),format:"der",type:"spki"})}function We(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 ze(e){let t;try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return{ok:!1,reason:p.INVALID_JSON}}return In(t)}function In(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 de(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")}},de=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 qe=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],Cn=new Set(qe),Pn=/^\d+\.\d+\.\d+$/,Ln=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,Tn=/^[@A-Za-z0-9._/~-]{1,214}$/;function pe(e){let t=ze(e);return t.ok?Fn(t.value):t}function Fn(e){if(!me(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 qe)if(!(f in e))return{ok:!1,reason:p.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!Tn.test(t)||t.includes(".."))return{ok:!1,reason:p.INVALID_PACKAGE};let n=e.version;if(typeof n!="string"||!Pn.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=Dn(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(F(c)?.byteLength!==le)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"||Ln.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 me(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Dn(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(!Mn(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 Hn=new Set(["localhost","127.0.0.1","[::1]"]);function Mn(e){return e.protocol==="https:"?!0:e.protocol==="http:"?Hn.has(e.hostname):!1}var Vn=["format","key_id","payload","signature"],Kn=/^[A-Za-z0-9._-]{1,128}$/;function jn(e,t){return Buffer.concat([fe,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function he(e,t){if(!me(e))return{ok:!1,reason:p.INVALID_ENVELOPE};if(e.format!==ue)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 Vn)if(!(f in e))return{ok:!1,reason:p.MISSING_FIELD};let r=e.key_id;if(typeof r!="string"||!Kn.test(r))return{ok:!1,reason:p.INVALID_KEY_ID};let o=We(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=F(c),s=F(a);if(i===void 0||s===void 0)return{ok:!1,reason:p.NON_CANONICAL_BASE64};if(s.byteLength!==$e)return{ok:!1,reason:p.INVALID_SIGNATURE_LENGTH};let u=!1;try{u=Bn(null,jn(r,i),Ye(o),s)}catch{u=!1}return u?pe(i):{ok:!1,reason:p.SIGNATURE_INVALID}}var Jn=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,$n=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,Yn=/^v?(\d+)\.(\d+)\.(\d+)/;function Ze(e){let t=Jn.exec(e);if(t)return{..._e(t),prerelease:t[4]?.split(".")}}function ge(e,t){let n=Ze(e),r=Ze(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:zn(n.prerelease,r.prerelease)}function Qe(e,t){let n=ge(e,t);return n!==void 0&&n>=0}function Wn(e){let t=$n.exec(e.trim());return t?_e(t):void 0}function _e(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function et(e,t){let n=Wn(t),r=Yn.exec(e.trim()),o=r?_e(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 zn(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=Xn(o,c);if(a!==0)return a}return 0}function Xn(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 ye="EV_AI_LAUNCHER_VERSION",Ee="EV_AI_LAUNCHER_PROTOCOL",Se="EV_AI_HOOK_SOURCE",$="EV_AI_HOOK_FALLBACK_REASON",Y="EV_AI_LAUNCHER_SCOPE",Re="EV_AI_LAUNCHER_READY_FD",W="EV_AI_LAUNCHER_REFRESH_SCOPE",z="EV_AI_LAUNCHER_REFRESH_EVENT",tt="EV_AI_HOOK_UPDATE_TTL_MIN",nt="--defer-user-spec",D="--cap",rt="--url",ot=Buffer.from([1]),it='{"continue":true}',st=3e3,at=1024*1024,ct=4*1024*1024,xe=64*1024,Ae=64*1024,X=64*1024,ut=2e3,q=250,ft=8e3,be=14e3,lt=1e3,dt=1e3,pt=500,mt=500,ht=1e4,we="handoff-";var H=1800,ke=604800,gt=3e5,Ne=4096,Z=4*1024*1024,_t=2,yt=864e5;import{randomBytes as qn}from"node:crypto";import{basename as Zn,dirname as Qn,join as Et}from"node:path";import{open as St,mkdir as er,readFile as tr,readdir as nr,rename as rr,stat as or,rmdir as ir,unlink as sr,utimes as ar}from"node:fs/promises";var Q=new WeakMap;function xt(e){if(e&&typeof e=="object"&&"code"in e)return e}function L(e){return xt(e)?.code==="ENOENT"}function cr(e){let t=xt(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function At(e,t){try{return await e.readdir(t)}catch(n){if(L(n))return[];throw n}}async function ur(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 fr(){return qn(8).toString("hex")}async function U(e,t,n){let r=Qn(t),o=fr(),c=`.${Zn(t)}.`,a=Et(r,`${c}${o}`),i=()=>e.unlink(a).catch(()=>{});await ur(e,a,n);try{await e.rename(a,t)}catch(s){if(!cr(s))throw await i(),s;let u=Et(r,`${c}bad.${o}`);try{await e.rename(t,u)}catch(f){if(!L(f))throw await i(),f}await e.rename(a,t)}await e.fsyncDir(r)}function ee(){return{async open(e,t){let n=await St(e,t),r={path:e};return Q.set(r,n),r},async write(e,t){let n=Rt(e),r=typeof t=="string"?Buffer.from(t,"utf8"):t;await n.write(r)},async fsync(e){await Rt(e).sync()},async close(e){let t=Q.get(e);Q.delete(e),t&&await t.close()},rename:rr,async readdir(e){return nr(e)},readFile:tr,async stat(e){let t=await or(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await er(e,t)},unlink:sr,rmdir:ir,utimes:ar,async fsyncDir(e){if(process.platform==="win32")return;let t=await St(e,"r");try{await t.sync()}finally{await t.close()}}}}function Rt(e){let t=Q.get(e);if(!t)throw new Error("closed");return t}function O(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var wt=Object.freeze({"test-key-1":bt("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":bt("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function bt(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 kt(e){return e?{...wt,...G}:G}import{join as te}from"node:path";function ve(e){return te(e,".ev-ai","agent-hook","js","signed-v1")}function lr(e){return te(ve(e),"scopes")}function B(e,t){return te(lr(e),t)}function Nt(e){return te(e,"attempts")}function Oe(e){return String(e).padStart(10,"0")}function ne(e,t){return V(ve(e),t?"dev-artifacts":"artifacts")}function dr(e,t){return V(e,t)}function re(e,t){return V(e,t,"hook.mjs")}function pr(e,t){return V(e,t,"release.json")}function Ce(e,t){return V(e,t,"health.json")}function Ct(e){return It("sha512").update(e).digest("hex")}async function Pe(e,t,n){try{let r=await e.readFile(n);if(r.byteLength<=0||r.byteLength>Z)return;let o=Ct(r),c=re(t,o);return await vt(e,c,o)==="ok"?o:(await e.mkdir(dr(t,o),{recursive:!0}),await U(e,c,r),await vt(e,c,o)==="ok"?o:void 0)}catch{return}}async function vt(e,t,n){try{let r=await e.stat(t);return r.size<=0||r.size>Z?"bad":Ct(await e.readFile(t))===n?"ok":"bad"}catch(r){if(L(r))return"missing";throw r}}async function Pt(e,t,n,r,o,c,a=process.version){let[i,s,u]=await Promise.all([Ot(e,re(t,n)),Ot(e,pr(t,n)),Le(e,Ce(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=he(f,kt(c));if(!m.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:l}=m;if(i.byteLength!==l.size||i.byteLength>Z)return{usable:!1,reason:"hash_mismatch"};let d=It("sha512").update(i).digest();if(d.toString("hex")!==n)return{usable:!1,reason:"hash_mismatch"};let h=Buffer.from(l.sha512,"base64");if(d.byteLength!==h.byteLength||!d.equals(h))return{usable:!1,reason:"hash_mismatch"};if(!Qe(l.version,r))return{usable:!1,reason:"below_floor"};if(!et(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 E=Date.parse(u.quarantined_until);if(Number.isFinite(E)&&E>o)return{usable:!1,reason:"quarantined"}}return{usable:!0,manifest:l,healthFails:u?.consecutive_startup_failures??0}}async function Ot(e,t){try{return await e.readFile(t)}catch(n){if(L(n))return;throw n}}async function Le(e,t){try{let n=await e.readFile(t),r=JSON.parse(n.toString("utf8"));if(!O(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 mr}from"node:crypto";import{access as hr,readFile as gr,stat as _r}from"node:fs/promises";import{homedir as yr}from"node:os";import{dirname as Er,join as Te,parse as Sr,resolve as Tt}from"node:path";function Lt(e){return e.charCodeAt(0)===65279?e.slice(1):e}var Rr="https://hooks.ev-ai.ai",xr=".claude/ev-ai-runtime-report.json",Ar="config.json",br="max_concurrent_hooks",wr=1024*1024,Bt=new Set(["localhost","127.0.0.1","[::1]","::1"]),kr=["claude","cursor","codex"],Nr=[xr,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],Ft=/^[A-Za-z0-9._~-]+$/;function vr(e){return e!==void 0&&kr.includes(e)}function Fe(e){if(!e||typeof e!="object")return;let t=e[br];return typeof t=="number"&&Number.isSafeInteger(t)&&t>0?t:void 0}function Dt(e){if(e===void 0||!/^\d+$/.test(e))return;let t=Number(e);return Number.isSafeInteger(t)?t:void 0}function K(e,t){let n=e[t+1];return n&&!n.startsWith("--")?{value:n,next:t+1}:{next:t}}function De(e){let t,n,r,o,c,a;for(let i=0;i<e.length;i++){let s=e[i];if(s!==void 0){if(s==="--runner"){let u=K(e,i);t=u.value,i=u.next;continue}if(s.startsWith("--runner=")){t=s.slice(9);continue}if(s==="--url"){let u=K(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=K(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=K(e,i);u.value&&(c=u.value),i=u.next;continue}if(s.startsWith("--base-url=")){c=s.slice(11);continue}if(s===D){let u=K(e,i);a=Dt(u.value)??a,i=u.next;continue}if(s.startsWith(`${D}=`)){a=Dt(s.slice(D.length+1))??a;continue}s!==nt&&!s.startsWith("-")&&n===void 0&&(n=s)}}return{runner:vr(t)?t:void 0,event:n,collectorUrl:r,orgToken:o,baseUrl:c,...a!==void 0?{cap:a}:{}}}function Vt(e,t=Rr){let n=t.replace(/\/+$/,""),r=e.trim();return`${n}/${r}/hook`}function He(e=yr()){return Te(e,".ev-ai",Ar)}function Or(e,t){return{...e,...t}}function Ht(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 Ir(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?Bt.has(t.hostname):!1}catch{return!1}}function Kt(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 Me(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!Ir(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let n=Kt(e);if(!n)return`must end with /{orgToken}/hook (got: ${e})`;if(!Ft.test(n))return`org token must match ${Ft.source} (got: ${n})`;if(Ht(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(Ht(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function jt(e){return new URL(e).toString()}function Mt(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?Vt(n):""}function Gt(e){try{return Bt.has(new URL(e).hostname)}catch{return!1}}function Jt(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=Vt(o,e.baseUrl?.trim()??void 0))}if(!n)return{};let r=Me(n);return r?{problem:r}:{url:jt(n)}}var Pr="CLAUDE_PLUGIN_OPTION_COLLECTOR_URL";function Lr(e){let t=e[Pr]?.trim();if(!t)return{};let n=Me(t);return n?{problem:n}:{url:jt(t)}}var Ue={access:hr,stat:_r,readFile:(e,t)=>gr(e,t)};async function Tr(e,t,n=Ue){let r=Tt(e),{root:o}=Sr(r);for(;;){let a=Te(r,".git");try{let s=await n.stat(a);if(s.isDirectory()||s.isFile())return r}catch{}if(r===o)break;let i=Er(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 Tt(e)}async function j(e,t=Ue){try{let n=await t.stat(e);if(!n.isFile()||n.size>wr)return;let r=await t.readFile(e,"utf8"),o=JSON.parse(Lt(r));return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function Ut(e,t){return(await Promise.all(Nr.map(async r=>{let o=Te(e,r);try{return await t.access(o),o}catch{return}}))).find(r=>r!==void 0)}async function $t(e){let t=e.fs??Ue,n=Cr(De(e.argv));if(n.url)return{url:n.url,source:"argv"};let r=()=>{let l=Lr(e.env).url;return l?{url:l,source:"plugin_option"}:{source:"none"}},o=e.env.EV_AI_HOOK_MANIFEST;if(o)try{await t.access(o);let l=await j(o,t),d=l?Mt(l):"";return d?{url:d,source:"manifest_override"}:r()}catch{}let c=await Tr(e.cwd,e.env,t),a=He(e.home),[i,s]=await Promise.all([j(a,t),Ut(c,t).then(async l=>l??Ut(e.cwd,t))]),u=s?await j(s,t):void 0,f;i&&u?f=Or(u,i):i?f=i:u&&(f=u);let m=f?Mt(f):"";return m?{url:m,source:"manifest"}:r()}function Yt(e){if(Me(e))return;let t;try{t=new URL(e)}catch{return}let n=Kt(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 mr("sha256").update(a).digest("hex").slice(0,32)}import{readFile as Fr,stat as Dr}from"node:fs/promises";import{join as zt}from"node:path";var Hr=4,Mr=10;function Xt(e=process.platform){return e==="win32"?Hr:Mr}var Ur=6e4,Wt=2e3,Br="slots",Vr=64;function qt(e){return zt(e,".ev-ai","agent-hook",Br)}function Kr(e,t){return zt(e,`slot-${t}`)}function jr(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}var Gr=/^(\d+)\n(\d+)\n$/;function Jr(e){let t=Gr.exec(e);if(!t)return;let n=Number(t[1]),r=Number(t[2]);return Number.isSafeInteger(n)&&n>0&&Number.isSafeInteger(r)?{pid:n,acquiredAtMs:r}:void 0}function $r(e,t,n){let r=Jr(e);if(!r)return Math.abs(n-t)<Wt;let o=n-r.acquiredAtMs;return o<-Wt||o>=Ur?!1:jr(r.pid)}async function Yr(e,t){try{let n=await Dr(e);if(!n.isFile())return!1;let r=n.size<=Vr?await Fr(e,"utf8"):"";return $r(r,n.mtimeMs,t)}catch{return!1}}async function Zt(e,t,n){for(let r=0;r<e;r+=1)if(!await Yr(Kr(t,r),n()))return!0;return e<=0}function Be(e){return j(He(e))}async function oe(e,t,n=Be(t)){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await n)?.auto_update===!1}function Qt(e){return`${D}=${Fe(e)??0}`}function Ve(e){return Fe(e)??Xt()}function M(e){return!!e.CURSOR_SANDBOX}async function en(e,t,n,r,o,c){if(M(c))return;let a=Ce(t,n),i=await Le(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>=_t?u.quarantined_until=new Date(o+yt).toISOString():i?.quarantined_until&&(u.quarantined_until=i.quarantined_until),await U(e,a,JSON.stringify(u))}function Wr(e,t){return new Promise(n=>{try{e.write(t,()=>n())}catch{n()}})}function tn(e){let t=e.now(),n=be,r=!1,o=Promise.resolve(),c,a=!1,i=[],s,u,f,m=()=>Math.max(0,t+n-e.now()),l=[],d=(_,b)=>{if(e.installProcessHandlers===!1)return;(e.on??((P,R)=>process.on(P,R)))(_,b),l.push({event:_,handler:b})},h=()=>{let _=e.off??((b,v)=>process.off(b,v));for(let{event:b,handler:v}of l)try{_(b,v)}catch{}l.length=0},E=_=>(r||(r=!0,o=Wr(e.stdout,_??it)),o),S=_=>{if(c)try{c.kill(_)}catch{}},N=()=>{for(let _ of i)try{_()}catch{}},A=()=>{a||(N(),S("SIGTERM"),u=e.setTimeout(()=>{S("SIGKILL")},q),E())},x=()=>{E().finally(()=>{e.exit(0)})},I=()=>{a||(N(),x())},C=()=>{s&&e.clearTimeout(s),f&&e.clearTimeout(f),s=e.setTimeout(A,m());let _=Math.max(0,t+n+lt-e.now());f=e.setTimeout(I,_)};C(),d("uncaughtException",x),d("unhandledRejection",x);for(let _ of["SIGTERM","SIGINT"])d(_,()=>{S(_),x()});return{ackOnce:E,remainingMs:m,eventBudgetMs:()=>n,onEventClassified(_){let b=_?be:ft;b<n&&(n=b,C())},setChild(_){c=_},onAbort(_){i.push(_)},dispose(){a=!0,s&&e.clearTimeout(s),u&&e.clearTimeout(u),f&&e.clearTimeout(f),h()},waitForAckWrite(){return o}}}function zr(e){let t=e.trim();if(t)try{let n=JSON.parse(t);return O(n)?n:void 0}catch{return}}function nn(e,t,n,r){if(!t||n!==0||r)return;let o=e.toString("utf8");if(zr(o)!==void 0)return o.trim()}var rn=[ye,Ee,Y,Re,Se,$];function Ke(e){return Buffer.isBuffer(e)?e:Buffer.from(e)}function Xr(e,t,n){let r={...e.env};return r[Re]="3",r[ye]=n,r[Ee]=String(1),r[Se]=t.source,t.fallbackReason?r[$]=t.fallbackReason:delete r[$],t.scopeId?r[Y]=t.scopeId:delete r[Y],r}function qr(e){let t=e.stdio[3];if(t&&typeof t=="object"&&"on"in t)return t}async function je(e,t,n,r,o,c,a="live"){let i;try{i=o.spawn(o.execPath,[e.hookPath,...t],{cwd:o.cwd,env:Xr(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=qr(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",h=Buffer.alloc(0),E=!1,S=!1,N=!1,A=0,x=null,I=!1,C=R=>{if(E)return;if(h.length+R.length>xe){h=Buffer.concat([h,R.subarray(0,xe-h.length)]),E=!0;return}h=Buffer.concat([h,R])};u.on("data",R=>{C(Ke(R))}),u.on("end",()=>{S=!0}),u.on("error",()=>{N=!0,S=!0}),f.on("data",R=>{if(A>=Ae)return;let w=Ke(R),g=Ae-A,y=w.length>g?w.subarray(0,g):w;A+=y.length;try{o.stderr.write(y)}catch{}}),f.resume(),l?(l.on("data",R=>{d==="pending"&&Ke(R).includes(ot[0]??1)&&(d="byte")}),l.on("end",()=>{d==="pending"&&(d="eof")}),l.on("error",()=>{d==="pending"&&(d="error")})):d="error";let _=o.setTimeout(()=>{if(!(d!=="pending"||I))try{i.kill("SIGKILL")}catch{}},ut);await new Promise(R=>{let w=!1,g=()=>{w||(w=!0,R())};i.once("exit",y=>{I=!0,x=y,g()}),i.once("error",()=>{s=!0,I=!0,g()})}),n.stopChildWrites(),o.clearTimeout(_);let b=Math.min(q,Math.max(0,r.remainingMs()));await new Promise(R=>{let w=()=>d!=="pending"&&S;if(w()){R();return}let g=o.setTimeout(()=>R(),b),y=()=>{w()&&(o.clearTimeout(g),R())};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 v=d==="byte",P=nn(h,v,x,E||N);return P!==void 0?(await r.ackOnce(P),{outcome:"success",ready:!0}):d==="eof"?{outcome:"startup_failure",ready:!1}:{outcome:"runtime_failure",ready:v}}function Zr(e){let t=e.charAt(0);return t!==""&&t.toLowerCase()===t}function Qr(e,t){let n=e.toLowerCase();return n==="sessionend"||n==="stopfailure"||n==="subagentstop"?!0:n==="stop"&&t==="codex"}var eo=new Set(["sessionstart","stop","sessionend","stopfailure","session_start","session_end"]);function on(e,t,n){let r=n.EV_AI_HOOK_SYNC==="1";if(t===void 0||Buffer.byteLength(t,"utf8")>=X)return{isSessionStart:!1,isInProcess:r,isCapped:!1};let o=De(e),c=o.event??"",a=o.runner??"";try{let s=JSON.parse(t);O(s)&&(!c&&typeof s.hook_event_name=="string"?c=s.hook_event_name:!c&&typeof s.event=="string"&&(c=s.event),!a&&(typeof s.conversation_id=="string"||Zr(c))&&(a="cursor"))}catch{}let i=c.toLowerCase();return{isSessionStart:i==="sessionstart",isInProcess:r||Qr(c,a),isCapped:i!==""&&!eo.has(i)}}import{readFile as to}from"node:fs/promises";import{fileURLToPath as no}from"node:url";async function sn(e){let t=no(new URL("../package.json",e)),n=await to(t,"utf8"),r=JSON.parse(n);return{version:typeof r.version=="string"?r.version:"",evAi:{launcherProtocol:Ge(r.evAi?.launcherProtocol),minLauncherProtocol:Ge(r.evAi?.minLauncherProtocol),launcherRevision:Ge(r.evAi?.launcherRevision)}}}function Ge(e){return typeof e=="number"&&Number.isInteger(e)?e:0}var ro=new Set(["configure","install","migrate-to-plugin","update","uninstall","--version","-V","help","--help","-h"]);function ie(e){let t=e[0];return t==="status"?"status":t==="__refresh"?"refresh":t==="__work"||t==="__post"?"bundled_cli":t===void 0||ro.has(t)?"cli":"hook"}async function an(e,t){let n=await $t({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!n.url)return;let r=Yt(n.url);if(!(!r||n.source==="none"))return{scopeId:r,collectorUrl:n.url,collectorUrlRedacted:Jt(n.url),source:n.source,dev:Gt(n.url)}}import{join as cn}from"node:path";var oo=/^(\d{10})$/,io=/^(\d{10})\.done$/,so=/^[0-9a-f]{128}$/,ao=64;function dn(e){let t=e[tt];if(t===void 0||t==="")return H;let n=Number(t);return!Number.isInteger(n)||n<=0?H:Math.min(Math.max(H,n*60),ke)}async function pn(e,t,n=!1){let r=Nt(t),o=await At(e,r),c=new Map,a=new Map,i=un(o,oo),s=un(o,io),u=async l=>{let d=await ln(e,cn(r,uo(l)));return d&&c.set(l,{record:po(d.value),mtimeMs:d.mtimeMs}),d!==void 0},f=async l=>{let d=mo((await ln(e,cn(r,fo(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([fn(i,u),fn(s,f)]);let m=se(c);return m<se(a)&&s.includes(m)&&await f(m),{claims:c,dones:a}}function un(e,t){return e.flatMap(n=>{let r=t.exec(n);return r?[Number(r[1])]:[]})}async function fn(e,t){for(let n of[...e].sort((r,o)=>o-r))if(await t(n))return}function se(e){let t=0;for(let n of e.keys())n>t&&(t=n);return t}function mn(e,t,n){let r=se(e.claims),o=se(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?co(i):void 0,u=r>0?e.dones.get(r):void 0,f=lo(u?.interval_s,n),m=s!==void 0?s+f*1e3:void 0,l=s!==void 0&&s-t>gt;return{latest:r,startMs:s,intervalS:f,deadlineMs:m,selection:c,lastOutcome:a,futureDated:l,highestDone:o}}function co(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 uo(e){return Oe(e)}function fo(e){return`${Oe(e)}.done`}function lo(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(H,t):Math.min(Math.max(Math.floor(e),H,t),ke)}async function ln(e,t){let n;try{n=await e.stat(t)}catch(o){if(L(o))return;throw o}let r=n.mtimeMs;if(n.size===0||n.size>Ne)return{mtimeMs:r};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>Ne?{mtimeMs:r}:{mtimeMs:r,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:r}}}function po(e){if(!O(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 mo(e){if(!O(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=ho(t.selection);if(n)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:n}}function ho(e){if(!O(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"&&so.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&go(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function go(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==ao||t.toString("base64")!==e))return t.toString("hex")}function ae(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 hn(e,t,n,r){if(await oe(t.env,t.home,r))return k(t,"kill_switch",n);if(!n)return k(t,"no_collector_url",n);let o=ee(),c=dn(t.env),a=t.now(),i=B(t.home,n.scopeId),s=mn(await pn(o,i,!0),a,c),u={deadlineMs:s.deadlineMs,dev:n.dev};if(s.selection.kind==="cached"){let m=ne(t.home,n.dev),l=await t.readPackageInfo().then(E=>E.version,()=>"");if((ge(l,s.selection.version)??0)>0)return await Pe(o,m,t.bundledHookPath),k(t,"below_floor",n,u);let h=await Pt(o,m,s.selection.digest,l,a,n.dev);return h.usable?{source:"cached",hookPath:re(m,s.selection.digest),scopeId:n.scopeId,digest:s.selection.digest,healthFails:h.healthFails,...u}:(h.reason==="below_floor"&&await Pe(o,m,t.bundledHookPath),k(t,h.reason,n,u))}if(s.selection.kind==="bundled")return k(t,s.selection.why,n,u);if(M(t.env))return k(t,"sandboxed",n,u);let f=await ce(t);if(!f)return k(t,"bootstrap_failed",n,u);try{let m=await t.readPackageInfo();return await f.bootstrap({home:t.home,scope:n,bundledVersion:m.version,bundledHookPath:t.bundledHookPath,env:t.env,nowMs:a})}catch{return k(t,"bootstrap_failed",n,u)}}async function ce(e){try{return e.importUpdate?await e.importUpdate():await import(ae(e,"./launcher-update.mjs").href)}catch{return}}function gn(e,t){let n=[],r=[],o=0,c=0,a="pending",i,s=!1,u=!1,f=!1,m=!1,l=!1,d=[],h=()=>{!m&&typeof e.pause=="function"&&(e.pause(),m=!0)},E=()=>{m&&typeof e.resume=="function"&&(e.resume(),m=!1)},S=()=>{s=!1,f=!1,u=!0,E()},N=()=>{if(!(l||a==="pending")){l=!0,t.clearTimeout(P);for(let g of d)g();d.length=0}},A=g=>{a==="pending"&&(a=g),N()},x=()=>{if(s&&i)try{i.end()}catch{s=!1}},I=g=>{if(a==="oversize")return;let y=c+g.length;if(y>ct){A("oversize");return}r.push(g),c=y},C=g=>{if(!(!s||!i))try{if(!i.write(g)){if(i.destroyed||!i.writable){S();return}f=!0,h()}}catch{S()}},_=g=>{let y=Buffer.isBuffer(g)?g:Buffer.from(g);if(!(a==="truncated"||a==="complete")&&(I(y),!u)){if(s){C(y);return}n.push(y),o+=y.length,o>=at&&h()}},b=()=>{x(),A("complete")},v=()=>{a==="pending"&&(A("truncated"),x(),S())},P=t.setTimeout(()=>{a==="pending"&&(A("truncated"),x(),S())},st);"isTTY"in e&&!!e.isTTY?A("complete"):(e.on("data",_),e.on("end",b),e.on("error",v),typeof e.resume=="function"&&e.resume());let w=g=>{g.on("error",()=>{S()}),g.on("drain",()=>{!s||u||(f=!1,E())})};return{get state(){return a},get replayable(){return a==="complete"},get backlogBytes(){return o},get replayBytes(){return c},attachChild(g){i=g,u=!1,s=!0,f=!1,w(g);for(let y of n){if(!s)break;C(y)}if(n.length=0,o=0,f?h():E(),a!=="pending"){try{g.end()}catch{S()}s=!1}},replayTo(g){w(g);try{g.end(r.length>0?Buffer.concat(r,c):Buffer.alloc(0))}catch{}},stopChildWrites(){S()},dispose(){t.clearTimeout(P),e.off?.("data",_),e.off?.("end",b),e.off?.("error",v)},classifiableText(){if(!(a!=="complete"||c>=X))return Buffer.concat(r,c).toString("utf8")},whenSettled(){return l?Promise.resolve():new Promise(g=>{d.push(g)})}}}var xn={version:"",evAi:{launcherProtocol:1,minLauncherProtocol:1,launcherRevision:1}};function ko(e){return Rn(new URL("./hook.mjs",e))}function No(e){let t;return{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,env:process.env,cwd:process.cwd(),home:Ro(),now:()=>Date.now(),spawn:_o,exit:n=>{process.exit(n)},setTimeout,clearTimeout,bundledHookPath:ko(e),execPath:process.execPath,select:hn,readPackageInfo:()=>t??=sn(e),launcherUrl:e}}async function _n(e){return e.importCli?e.importCli():import(ae(e,"./cli.mjs").href)}async function An(e=process.argv.slice(2),t=No(import.meta.url)){let n=ie(e);if(n==="cli")try{return await(await _n(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 _n(t)).main(e);if(n==="refresh"||n==="status")try{let a=await t.readPackageInfo().catch(()=>xn);if(n==="refresh")return await vo(e.slice(1),t,a);let i=await ce(t);return i?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([bn(e,c),o])}async function Je(e,t,n){let r,o=new Promise(c=>{r=n.setTimeout(c,t)});await Promise.race([e,o]),n.clearTimeout(r)}async function vo(e,t,n){let r=await Oo(t),o=ce(t).then(c=>c?.runRefresh(e,t.env,t.cwd,t.home,{packageVersion:n.version,bundledHookPath:t.bundledHookPath})).catch(()=>{});if(r){await Je(o,ht,t);let c={...t.env};delete c[W],delete c[z],await bn(e,{...t,env:c,stdin:wo.from([r]),exit:()=>{},installProcessHandlers:!1},!1).catch(()=>0)}return await o,0}async function Oo(e){let t=e.env[z],n=e.env[W];if(!(!t||!n||Ao(t)!==B(e.home,n)||!xo(t).startsWith(we)))try{return await Eo(t)}catch{return}finally{await Sn(t,{force:!0}).catch(()=>{})}}async function bn(e,t,n=!0){let r=tn(t),o=gn(t.stdin,t),c,a=()=>c??=on(e,o.classifiableText(),t.env);o.whenSettled().then(()=>r.onEventClassified(a().isInProcess));let i=!1,s=new Promise(m=>{r.onAbort(()=>{i=!0,m()})}),u=m=>Promise.race([m,s.then(()=>{})]),f=async m=>(await r.ackOnce(),r.dispose(),o.dispose(),m);try{let m=t.readPackageInfo().catch(()=>xn),l=Be(t.home);if(await u(Co(t,o,a,l).catch(()=>!1))){if(t.env.EV_AI_HOOK_DEBUG){let x=Ve(await l);t.stderr.write(`[ev-ai-agent-hook] DEBUG: hook process cap reached (${x}/${x}); event dropped
6
+ `)}return f(0)}if(i)return f(0);let d;try{d=await u(an(e,t))}catch{d=void 0}if(i)return f(0);let h;try{h=await u(t.select(e,t,d,l))}catch{h=k(t,"selection_error",d)}let E=await u(m);if(i||!h||!E)return f(0);let S=n?await u(Po(t,h,d,o,a,l).catch(()=>{})):void 0;if(i||S&&await yn(e,t,S,o.classifiableText()))return f(0);let N=[...e,...Io(d),Qt(await l)],A=await je(h,N,o,r,t,E.version,"live");if(A.outcome==="success"&&h.source==="cached"&&h.healthFails&&await En(t,h,!1),A.outcome==="startup_failure"&&h.source!=="bundled"&&(await En(t,h,!0),o.replayable&&r.remainingMs()>dt)){let x=k(t,"startup_failure",d);await je(x,N,o,r,t,E.version,"replay")}return S&&await yn(e,t,S),f(0)}catch{return f(0)}}function Io(e){return e?.source==="plugin_option"?[`${rt}=${e.collectorUrl}`]:[]}async function Co(e,t,n,r){return await Zt(Ve(await r),qt(e.home),e.now)?!1:(await Je(t.whenSettled(),mt,e),t.replayable&&n().isCapped)}async function Po(e,t,n,r,o,c){if(!(!n||t.didBootstrap||M(e.env)||t.deadlineMs!==void 0&&t.deadlineMs>e.now())&&(await Je(r.whenSettled(),pt,e),!(!r.replayable||!o().isSessionStart||await oe(e.env,e.home,c))))return n}async function yn(e,t,n,r){let o={...t.env};for(let a of rn)delete o[a];o[W]=n.scopeId;let c;if(r!==void 0){c=bo(B(t.home,n.scopeId),`${we}${yo(8).toString("hex")}.json`);try{await So(c,r,{mode:384,flag:"wx"})}catch{return!1}o[z]=c}try{let a=t.spawn(t.execPath,[Rn(ae(t,"./launcher.mjs")),"__refresh",...e],{cwd:t.cwd,env:o,detached:!0,stdio:"ignore",windowsHide:!0});return await new Promise((i,s)=>{a.once("spawn",i),a.once("error",s)}),a.unref(),!0}catch{return c&&await Sn(c,{force:!0}).catch(()=>{}),!1}}async function En(e,t,n){t.digest&&await en(ee(),ne(e.home,t.dev===!0),t.digest,n,e.now(),e.env).catch(()=>{})}An().then(e=>{process.exit(e)}).catch(e=>{if(ie(process.argv.slice(2))==="cli"){let t=e instanceof Error?e.message:String(e);try{process.stderr.write(`[ev-ai-agent-hook] ${t}
6
7
  `)}catch{}process.exit(1)}try{process.stdout.write('{"continue":true}')}catch{}process.exit(0)});
@@ -1104,6 +1104,7 @@ var managed_hooks_snippet_exports = {};
1104
1104
  __export(managed_hooks_snippet_exports, {
1105
1105
  CLAUDE_MANAGED_HOOK_TIMEOUT_SECONDS: () => CLAUDE_MANAGED_HOOK_TIMEOUT_SECONDS,
1106
1106
  CLAUDE_MANAGED_SESSION_START_TIMEOUT_SECONDS: () => CLAUDE_MANAGED_SESSION_START_TIMEOUT_SECONDS,
1107
+ NPX_PACKAGE_SPEC: () => NPX_PACKAGE_SPEC,
1107
1108
  buildCollectorUrl: () => buildCollectorUrl,
1108
1109
  managedHooksSnippet: () => managedHooksSnippet
1109
1110
  });
@@ -1319,14 +1320,13 @@ function isInProcessEvent(runnerEvent, platform) {
1319
1320
 
1320
1321
  // src/shared/constants.ts
1321
1322
  var HOOK_BINARY_NAME = "ev-ai-agent-hook";
1322
- var HOOK_CHECKSUMS_FILE = "SHA256SUMS";
1323
1323
  var GLOBAL_HOOK_BINARY_RELATIVE = `current/${HOOK_BINARY_NAME}`;
1324
1324
  var PROJECT_HOOK_BINARY_RELATIVE = `.ev-ai/agent-hook/${HOOK_BINARY_NAME}`;
1325
1325
  var HOOK_INPUT_ALLOWLIST_MAX_BYTES = 4 * 1024;
1326
1326
  var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
1327
1327
  var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
1328
1328
  var GZIP_MIN_BYTES = 32 * 1024;
1329
- var PACKAGE_VERSION = "1.3.3";
1329
+ var PACKAGE_VERSION = "1.3.5";
1330
1330
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
1331
1331
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
1332
1332
 
@@ -1426,8 +1426,6 @@ var CURSOR_WIRED_HOOK_EVENTS = [
1426
1426
  ];
1427
1427
 
1428
1428
  // src/install/plugin-hooks.ts
1429
- var PLUGIN_HOOK_PAYLOAD = "hook.mjs";
1430
- var PLUGIN_CHECKSUMS_FILE = HOOK_CHECKSUMS_FILE;
1431
1429
  function buildClaudePluginHooks(command) {
1432
1430
  return { hooks: desiredClaudeHookGroups(command) };
1433
1431
  }
@@ -1438,20 +1436,11 @@ function buildCursorPluginHooks(command) {
1438
1436
  command: commandForEvent(eventName, entry)
1439
1437
  }));
1440
1438
  }
1441
- return { hooks };
1439
+ return { version: 1, hooks };
1442
1440
  }
1443
1441
  function buildCodexPluginHooks(command) {
1444
1442
  return { hooks: desiredCodexHookGroups(command) };
1445
1443
  }
1446
- var PLUGIN_PAYLOAD_FILES = [
1447
- { source: "dist/hook.mjs", target: PLUGIN_HOOK_PAYLOAD, executable: false },
1448
- {
1449
- source: `compile-out/bin/${PLUGIN_CHECKSUMS_FILE}`,
1450
- target: PLUGIN_CHECKSUMS_FILE,
1451
- executable: false,
1452
- optional: true
1453
- }
1454
- ];
1455
1444
 
1456
1445
  // src/install/managed-hooks-snippet.ts
1457
1446
  var CLAUDE_MANAGED_HOOK_TIMEOUT_SECONDS = 5;
@@ -1470,15 +1459,16 @@ function withClaudeManagedHookLimits(doc) {
1470
1459
  }
1471
1460
  return { hooks };
1472
1461
  }
1473
- function managedHooksSnippet(runner, collectorUrl) {
1474
- const command = withUrlFlag(withRunnerFlag(npxHookCommand(), runner), collectorUrl);
1475
- const doc = runner === "cursor" ? { version: 1, ...buildCursorPluginHooks(command) } : runner === "claude" ? withClaudeManagedHookLimits(buildClaudePluginHooks(command)) : buildCodexPluginHooks(command);
1462
+ function managedHooksSnippet(runner, collectorUrl, packageSpec) {
1463
+ const command = withUrlFlag(withRunnerFlag(npxHookCommand(packageSpec), runner), collectorUrl);
1464
+ const doc = runner === "cursor" ? buildCursorPluginHooks(command) : runner === "claude" ? withClaudeManagedHookLimits(buildClaudePluginHooks(command)) : buildCodexPluginHooks(command);
1476
1465
  return JSON.stringify(doc, null, 2);
1477
1466
  }
1478
1467
  // Annotate the CommonJS export names for ESM import in node:
1479
1468
  0 && (module.exports = {
1480
1469
  CLAUDE_MANAGED_HOOK_TIMEOUT_SECONDS,
1481
1470
  CLAUDE_MANAGED_SESSION_START_TIMEOUT_SECONDS,
1471
+ NPX_PACKAGE_SPEC,
1482
1472
  buildCollectorUrl,
1483
1473
  managedHooksSnippet
1484
1474
  });
@@ -1,3 +1,8 @@
1
1
  export type KnownRunner = 'claude' | 'cursor' | 'codex';
2
+ export const NPX_PACKAGE_SPEC: string;
2
3
  export function buildCollectorUrl(orgToken: string, baseUrl?: string): string;
3
- export function managedHooksSnippet(runner: KnownRunner, collectorUrl: string): string;
4
+ export function managedHooksSnippet(
5
+ runner: KnownRunner,
6
+ collectorUrl: string,
7
+ packageSpec?: string,
8
+ ): string;
@@ -1309,14 +1309,13 @@ function isInProcessEvent(runnerEvent, platform) {
1309
1309
 
1310
1310
  // src/shared/constants.ts
1311
1311
  var HOOK_BINARY_NAME = "ev-ai-agent-hook";
1312
- var HOOK_CHECKSUMS_FILE = "SHA256SUMS";
1313
1312
  var GLOBAL_HOOK_BINARY_RELATIVE = `current/${HOOK_BINARY_NAME}`;
1314
1313
  var PROJECT_HOOK_BINARY_RELATIVE = `.ev-ai/agent-hook/${HOOK_BINARY_NAME}`;
1315
1314
  var HOOK_INPUT_ALLOWLIST_MAX_BYTES = 4 * 1024;
1316
1315
  var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
1317
1316
  var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
1318
1317
  var GZIP_MIN_BYTES = 32 * 1024;
1319
- var PACKAGE_VERSION = "1.3.3";
1318
+ var PACKAGE_VERSION = "1.3.5";
1320
1319
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
1321
1320
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
1322
1321
 
@@ -1416,8 +1415,6 @@ var CURSOR_WIRED_HOOK_EVENTS = [
1416
1415
  ];
1417
1416
 
1418
1417
  // src/install/plugin-hooks.ts
1419
- var PLUGIN_HOOK_PAYLOAD = "hook.mjs";
1420
- var PLUGIN_CHECKSUMS_FILE = HOOK_CHECKSUMS_FILE;
1421
1418
  function buildClaudePluginHooks(command) {
1422
1419
  return { hooks: desiredClaudeHookGroups(command) };
1423
1420
  }
@@ -1428,20 +1425,11 @@ function buildCursorPluginHooks(command) {
1428
1425
  command: commandForEvent(eventName, entry)
1429
1426
  }));
1430
1427
  }
1431
- return { hooks };
1428
+ return { version: 1, hooks };
1432
1429
  }
1433
1430
  function buildCodexPluginHooks(command) {
1434
1431
  return { hooks: desiredCodexHookGroups(command) };
1435
1432
  }
1436
- var PLUGIN_PAYLOAD_FILES = [
1437
- { source: "dist/hook.mjs", target: PLUGIN_HOOK_PAYLOAD, executable: false },
1438
- {
1439
- source: `compile-out/bin/${PLUGIN_CHECKSUMS_FILE}`,
1440
- target: PLUGIN_CHECKSUMS_FILE,
1441
- executable: false,
1442
- optional: true
1443
- }
1444
- ];
1445
1433
 
1446
1434
  // src/install/managed-hooks-snippet.ts
1447
1435
  var CLAUDE_MANAGED_HOOK_TIMEOUT_SECONDS = 5;
@@ -1460,14 +1448,15 @@ function withClaudeManagedHookLimits(doc) {
1460
1448
  }
1461
1449
  return { hooks };
1462
1450
  }
1463
- function managedHooksSnippet(runner, collectorUrl) {
1464
- const command = withUrlFlag(withRunnerFlag(npxHookCommand(), runner), collectorUrl);
1465
- const doc = runner === "cursor" ? { version: 1, ...buildCursorPluginHooks(command) } : runner === "claude" ? withClaudeManagedHookLimits(buildClaudePluginHooks(command)) : buildCodexPluginHooks(command);
1451
+ function managedHooksSnippet(runner, collectorUrl, packageSpec) {
1452
+ const command = withUrlFlag(withRunnerFlag(npxHookCommand(packageSpec), runner), collectorUrl);
1453
+ const doc = runner === "cursor" ? buildCursorPluginHooks(command) : runner === "claude" ? withClaudeManagedHookLimits(buildClaudePluginHooks(command)) : buildCodexPluginHooks(command);
1466
1454
  return JSON.stringify(doc, null, 2);
1467
1455
  }
1468
1456
  export {
1469
1457
  CLAUDE_MANAGED_HOOK_TIMEOUT_SECONDS,
1470
1458
  CLAUDE_MANAGED_SESSION_START_TIMEOUT_SECONDS,
1459
+ NPX_PACKAGE_SPEC,
1471
1460
  buildCollectorUrl,
1472
1461
  managedHooksSnippet
1473
1462
  };