@ev-ai/agent-hook 1.2.5 → 1.2.7

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