@ev-ai/agent-hook 1.2.1 → 1.2.3

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