@ev-ai/agent-hook 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- import{createHash as Dt}from"node:crypto";import{join as B}from"node:path";var At=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,vt=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,Ot=/^v?(\d+)\.(\d+)\.(\d+)/;function Ne(e){let t=At.exec(e);if(t)return{...me(t),prerelease:t[4]?.split(".")}}function Et(e,t){let n=Ne(e),r=Ne(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:Mt(n.prerelease,r.prerelease)}function G(e,t){let n=Et(e,t);return n!==void 0&&n>=0}function pe(e){let t=vt.exec(e.trim());return t?me(t):void 0}function me(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function Fe(e,t){let n=pe(t),r=Ot.exec(e.trim()),o=r?me(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 Mt(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=Pt(o,c);if(s!==0)return s}return 0}function Pt(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 Ce="EV_AI_LAUNCHER_REFRESH_SCOPE",Le="EV_AI_HOOK_UPDATE_TTL_MIN",kr=Buffer.from([1]);var xr=1024*1024,Sr=4*1024*1024,wr=64*1024,Rr=64*1024,Ar=64*1024;var P=21600,ge=604800,Ue=3e5,he=4096,X=4*1024*1024;import{open as Ie,mkdir as Nt,readFile as Ft,readdir as Ct,rename as Lt,stat as Ut,unlink as It,utimes as Tt}from"node:fs/promises";var W=new WeakMap;function _e(e){if(e&&typeof e=="object"&&"code"in e)return e}function k(e){return _e(e)?.code==="ENOENT"}function ye(e){return _e(e)?.code==="EEXIST"}function De(e){let t=_e(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function U(e,t){try{return await e.readdir(t)}catch(n){if(k(n))return[];throw n}}async function be(e,t){try{await e.unlink(t)}catch(n){if(!k(n))throw n}}async function N(e,t,n){let r=await e.open(t,"wx");try{await e.write(r,n),await e.fsync(r)}finally{await e.close(r)}}function A(){return{async open(e,t){let n=await Ie(e,t),r={path:e};return W.set(r,n),r},async write(e,t){let n=Te(e),r=typeof t=="string"?Buffer.from(t,"utf8"):t;await n.write(r)},async fsync(e){await Te(e).sync()},async close(e){let t=W.get(e);W.delete(e),t&&await t.close()},rename:Lt,async readdir(e){return Ct(e)},readFile:Ft,async stat(e){let t=await Ut(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await Nt(e,t)},unlink:It,utimes:Tt,async fsyncDir(e){if(process.platform==="win32")return;let t=await Ie(e,"r");try{await t.sync()}finally{await t.close()}}}}function Te(e){let t=W.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 ke(e){return I(e,".ev-ai","agent-hook","js")}function xe(e){return I(ke(e),"scopes")}function x(e,t){return I(xe(e),t)}function v(e){return I(e,"attempts")}function q(e){return I(e,"scope.json")}function T(e){return String(e).padStart(10,"0")}var D="@ev-ai/agent-hook";function S(e,t){return B(ke(e),t?"dev-artifacts":"artifacts")}function Se(e,t){return B(e,t)}function w(e,t){return B(e,t,"hook.mjs")}function Q(e,t){return B(e,t,"meta.json")}function Ht(e,t){return B(e,t,"health.json")}function F(e){return Dt("sha256").update(e).digest("hex")}async function j(e,t,n){try{let r=await e.stat(t);return r.size<=0||r.size>X?"bad":F(await e.readFile(t))===n?"ok":"bad"}catch(r){if(k(r))return"missing";throw r}}async function C(e,t,n,r,o,c=process.version){let[s,a,i]=await Promise.all([j(e,w(t,n),n),Y(e,Q(t,n)),Bt(e,Ht(t,n))]);if(s==="missing")return{usable:!1,reason:"artifact_missing"};if(s==="bad"||!a)return{usable:!1,reason:"hash_mismatch"};if(!G(a.version,r))return{usable:!1,reason:"below_floor"};if(!Fe(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 Y(e,t){try{let n=await e.readFile(t);return He(JSON.parse(n.toString("utf8")))}catch{return}}function He(e){if(!g(e))return;let t=e;if(t.package===D&&!(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:D,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 Bt(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 Be}from"node:path";var jt=/^(\d{10})$/,$t=/^(\d{10})\.done$/,Vt=/^[0-9a-f]{64}$/i;function O(e){let t=e[Le];if(t===void 0||t==="")return P;let n=Number(t);return!Number.isInteger(n)||n<=0?P:Math.min(Math.max(P,n*60),ge)}async function y(e,t,n=!1){let r=v(t),o=await U(e,r),c=new Map,s=new Map,a=je(o,jt),i=je(o,$t),u=async f=>{let p=await Ve(e,Be(r,Z(f)));return p&&c.set(f,{record:Kt(p.value),mtimeMs:p.mtimeMs}),p!==void 0},l=async f=>{let p=zt((await Ve(e,Be(r,ee(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([$e(a,u),$e(i,l)]);let d=R(c);return d<R(s)&&i.includes(d)&&await l(d),{claims:c,dones:s}}function je(e,t){return e.flatMap(n=>{let r=t.exec(n);return r?[Number(r[1])]:[]})}async function $e(e,t){for(let n of[...e].sort((r,o)=>o-r))if(await t(n))return}function R(e){let t=0;for(let n of e.keys())n>t&&(t=n);return t}function E(e,t,n){let r=R(e.claims),o=R(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?Jt(a):void 0,u=r>0?e.dones.get(r):void 0,l=$(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 Jt(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 Z(e){return T(e)}function ee(e){return`${T(e)}.done`}function $(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(P,t):Math.min(Math.max(Math.floor(e),P,t),ge)}async function Ve(e,t){let n;try{n=await e.stat(t)}catch(o){if(k(o))return;throw o}let r=n.mtimeMs;if(n.size===0||n.size>he)return{mtimeMs:r};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>he?{mtimeMs:r}:{mtimeMs:r,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:r}}}function Kt(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 zt(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=Gt(t.selection);if(n)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:n}}function Gt(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"&&Vt.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{randomBytes as qt}from"node:crypto";import{join as V}from"node:path";var Je=/^https:\/\/registry\.npmjs\.org\/@ev-ai\/agent-hook\/-\/agent-hook-(\d+\.\d+\.\d+)\.tgz$/;async function te(e,t,n){let r=v(t);await e.mkdir(r,{recursive:!0});let o=E(await y(e,t,!0),n.nowMs,n.ttlFloorS);return o.futureDated?Ke(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}:Ke(e,t,{...n,n:o.latest+1})}async function ne(e,t,n){if(n.nowMs-n.startedAtMs>n.budgetMs+3e4)return{recorded:!1,why:"expired"};let r=await y(e,t);if(R(r.claims)>n.n)return{recorded:!1,why:"superseded"};if(r.dones.has(n.n))return{recorded:!1,why:"already_done"};let o=v(t),c=V(o,ee(n.n)),s=ze(),a=V(o,`.${T(n.n)}.done.${s}`),i={finished_at:new Date(n.nowMs).toISOString(),interval_s:n.intervalS,outcome:n.outcome,selection:n.selection},u=Buffer.from(JSON.stringify(i),"utf8");try{await N(e,a,u),await e.rename(a,c),await e.fsyncDir(o)}catch(l){throw await e.unlink(a).catch(()=>{}),l}return await Qt(e,t,n.n),{recorded:!0}}async function Qt(e,t,n){let r=await y(e,t),o=n-8,c=R(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 be(e,V(s,Z(i))),await be(e,V(s,ee(i))))}))}async function Ke(e,t,n){if(n.n<1||n.n>9999999999)return{kind:"lost"};let r=v(t),o=V(r,Z(n.n)),c=new Date(n.nowMs).toISOString(),s=ze(),a={started_at:c,nonce:s,owner:n.owner};n.resync&&(a.resync=!0);try{await N(e,o,JSON.stringify(a)),await e.fsyncDir(r)}catch(i){if(ye(i))return{kind:"lost"};throw i}return n.collectorRedacted!==void 0&&await Yt(e,t,n.collectorRedacted,n.dev===!0),R((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 Yt(e,t,n,r){let o=q(t);try{await N(e,o,Buffer.from(JSON.stringify({collector:n,dev:r}),"utf8")),await e.fsyncDir(t)}catch(c){if(ye(c))return;throw c}}function ze(){return qt(8).toString("hex")}import bn from"node:http";import kn from"node:https";import{URL as xn}from"node:url";import{createHash as Zt}from"node:crypto";import{access as en,readFile as tn,stat as nn}from"node:fs/promises";import{homedir as rn}from"node:os";import{dirname as on,join as we,parse as sn,resolve as Ge}from"node:path";var an="https://hooks.ev-ai.ai",cn=".claude/ev-ai-runtime-report.json",un="config.json",dn=1024*1024,Ye=new Set(["localhost","127.0.0.1","[::1]","::1"]),ln=["claude","cursor","codex"],fn=[cn,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],Xe=/^[A-Za-z0-9._~-]+$/;function pn(e){return e!==void 0&&ln.includes(e)}function re(e,t){let n=e[t+1];return n&&!n.startsWith("--")?{value:n,next:t+1}:{next:t}}function mn(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=re(e,s);t=i.value,s=i.next;continue}if(a.startsWith("--runner=")){t=a.slice(9);continue}if(a==="--url"){let i=re(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=re(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=re(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:pn(t)?t:void 0,event:n,collectorUrl:r,orgToken:o,baseUrl:c}}function Ze(e,t=an){let n=t.replace(/\/+$/,""),r=e.trim();return`${n}/${r}/hook`}function Re(e=rn()){return we(e,".ev-ai",un)}function gn(e,t){return{...e,...t}}function We(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 et(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?Ye.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 Ae(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!et(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(!Xe.test(n))return`org token must match ${Xe.source} (got: ${n})`;if(We(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(We(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function hn(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?Ze(n):""}function oe(e){try{return Ye.has(new URL(e).hostname)}catch{return!1}}function nt(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 _n(e){let t=e.collectorUrl?.trim(),n;if(t)n=t;else{let o=e.orgToken?.trim();o&&(n=Ze(o,e.baseUrl?.trim()??void 0))}if(!n)return{};let r=Ae(n);return r?{problem:r}:{url:hn(n)}}var ve={access:en,stat:nn,readFile:(e,t)=>tn(e,t)};async function yn(e,t,n=ve){let r=Ge(e),{root:o}=sn(r);for(;;){let s=we(r,".git");try{let i=await n.stat(s);if(i.isDirectory()||i.isFile())return r}catch{}if(r===o)break;let a=on(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 Ge(e)}async function J(e,t=ve){try{let n=await t.stat(e);if(!n.isFile()||n.size>dn)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(fn.map(async r=>{let o=we(e,r);try{return await t.access(o),o}catch{return}}))).find(r=>r!==void 0)}async function rt(e){let t=e.fs??ve,n=_n(mn(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 J(r,t),f=d?qe(d):"";return f?{url:f,source:"manifest_override"}:{source:"none"}}catch{}let o=await yn(e.cwd,e.env,t),c=Re(e.home),[s,a]=await Promise.all([J(c,t),Qe(o,t).then(async d=>d??Qe(e.cwd,t))]),i=a?await J(a,t):void 0,u;s&&i?u=gn(i,s):s?u=s:i&&(u=i);let l=u?qe(u):"";return l?{url:l,source:"manifest"}:{source:"none"}}function ot(e){if(Ae(e))return;let t;try{t=new URL(e)}catch{return}let n=tt(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 Zt("sha256").update(s).digest("hex").slice(0,32)}function it(e){if(Ae(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&&et(r.toString()))return r.toString()}function ie(){return{getBounded:Sn}}function se(e,t){return e==="timeout"||e==="network"?"failed:timeout":e==="http_3xx"?"failed:http_3xx":t}function Sn(e,t){let n;try{n=new xn(e)}catch{return Promise.resolve({ok:!1,reason:"origin_rejected"})}if(n.protocol==="http:"){if(!oe(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:"?bn: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 M(e,t){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await J(Re(t)))?.auto_update===!1}function K(e){return!!e.CURSOR_SANDBOX}function ae(e,t,n,r){return{source:"bundled",hookPath:e.bundledHookPath,fallbackReason:t,scopeId:n?.scopeId,dev:n?.dev,...r}}import{randomBytes as An}from"node:crypto";import{basename as vn,join as Oe}from"node:path";var at=/^[0-9a-f]{64}$/,On=/^\.(?:hook\.mjs|meta\.json|health\.json)\./;async function ct(e,t,n,r,o,c){if(!at.test(n)||F(r)!==n)return{ok:!1,reason:"repair_failed"};let s=Se(t,n);await e.mkdir(s,{recursive:!0}),await Mn(e,s,c);let a=w(t,n),i=Q(t,n),u=await Y(e,i);if(await j(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 st(e,s,a,r),await st(e,s,i,Buffer.from(JSON.stringify(d),"utf8")),await j(e,a,n)!=="ok"?{ok:!1,reason:"repair_failed"}:{ok:!0}}async function ut(e,t,n,r){let c=(await U(e,t)).filter(a=>at.test(a)).slice(0,512);return(await Promise.all(c.map(async a=>{let i=await Y(e,Q(t,a));if(!(i?.version!==n||i?.integrity!==r))return await j(e,w(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 st(e,t,n,r){let o=An(8).toString("hex"),c=`.${vn(n)}.`,s=Oe(t,`${c}${o}`),a=()=>e.unlink(s).catch(()=>{});await N(e,s,r);try{await e.rename(s,n)}catch(i){if(!De(i))throw await a(),i;let u=Oe(t,`${c}bad.${o}`);try{await e.rename(n,u)}catch(l){if(!k(l))throw await a(),l}await e.rename(s,n)}await e.fsyncDir(t)}async function Mn(e,t,n){let r=await U(e,t);await Promise.all(r.map(async o=>{if(!On.test(o))return;let c=Oe(t,o);try{let s=await e.stat(c);n-s.mtimeMs>36e5&&await e.unlink(c)}catch(s){if(!k(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 ce(e,t){return{launcher:e,protocol:String(1),current:t,platform:`${process.platform}-${process.arch}`,node:process.version}}function Ee(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"||!Ee(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=Un(e,t),a=await r.getBounded(s,{maxBytes:4096,timeoutMs:n,signal:c});if(!a.ok)return{ok:!1,reason:se(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=Je.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 Un(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),L=512,Jn="package/package.json",Kn="package/dist/hook.mjs";function zn(e,t){if(!Ee(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!==D||n.version!==t||typeof n.version!="string")return;let r=n.engines,o=g(r)?r.node:void 0;if(typeof o!="string"||!pe(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:D,version:n.version,node_engine:o,min_launcher_protocol:s,integrity:""}}function Wn(e){let t=0,n=0,r,o,c,s,a=0;for(;t+L<=e.length;){let i=e.subarray(t,t+L);if(t+=L,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 b=nr(h);if(!b)return{ok:!1,reason:"failed:extract_failed"};c=b.path,s=b.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>X)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<L;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/L)*L}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 ue(e,t,n,r,o,c){let s=it(e);return s?lt(s,t,n,r,o,c):{ok:!1,reason:"failed:origin_rejected"}}async function de(e,t,n,r,o,c,s,a){if(!G(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 C(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:se(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=F(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}`}}var ar={kind:"bundled",why:"bootstrap_failed"};async function cr(e){let t=e.fs??A(),n=e.http??ie(),r=x(e.home,e.scope.scopeId),o=S(e.home,e.scope.dev),c=O(e.env),s=AbortSignal.timeout(3e3),a=await te(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 ae(e,m?"bootstrap_in_progress":"bootstrap_failed",e.scope,{didBootstrap:!1})}let i=(m,h,b)=>ne(t,r,{n:a.n,startedAtMs:a.startedAtMs,nowMs:e.nowMs,budgetMs:3e3,intervalS:$(b,c),outcome:m,selection:h}),u=async m=>(await i(m,ar),ae(e,"bootstrap_failed",e.scope,{didBootstrap:!0}));if(await M(e.env,e.home)||K(e.env)||s.aborted)return u("failed:bootstrap");let l=await ue(e.scope.collectorUrl,ce(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),ae(e,"server",e.scope,{didBootstrap:!0});let f=await de(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:w(o,p),scopeId:e.scope.scopeId,digest:p,dev:e.scope.dev,didBootstrap:!0}}async function le(e,t){let n=await rt({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!n.url)return;let r=ot(n.url);if(!(!r||n.source==="none"))return{scopeId:r,collectorUrl:n.url,collectorUrlRedacted:nt(n.url),source:n.source,dev:oe(n.url)}}var lr={kind:"bundled",why:"bootstrap_failed"};async function fr(e,t,n,r,o){try{await pr(e,t,n,r,o)}catch{}return 0}async function pr(e,t,n,r,o){if(K(t)||await M(t,r))return;let c=t[Ce],s=await le(e,{env:t,cwd:n,home:r});if(!s||!c||s.scopeId!==c)return;let a=o?.fs??A(),i=o?.http??ie(),u=o?.nowMs??Date.now(),l=O(t),d=x(r,s.scopeId),f=await te(a,d,{owner:"refresh",nowMs:u,ttlFloorS:l,collectorRedacted:s.collectorUrlRedacted,dev:s.dev});if(f.kind!=="claimed")return;let p=(St,wt,Rt)=>ne(a,d,{n:f.n,startedAtMs:f.startedAtMs,nowMs:u,budgetMs:6e4,intervalS:$(Rt,l),outcome:St,selection:wt}),m=o?.packageVersion??"",h=E(await y(a,d,!0),u,l).selection,b=h.kind==="uninitialized"?lr:h,Pe=AbortSignal.timeout(6e4),fe=await ue(s.collectorUrl,ce(m,h.kind==="cached"?h.version:m),5e3,i,s.dev,Pe);if(!fe.ok){await p(fe.reason,b);return}let _=fe.directive;if(_.kind==="none"){await p("no_directive",b);return}if(_.kind==="bundled"){await p("bundled",{kind:"bundled",why:"server"},_.intervalS);return}let z=await de(a,i,S(r,s.dev),_,m,u,3e4,Pe);if(!z.ok){await p(z.reason,b,_.intervalS);return}let kt=h.kind==="cached"&&h.version===_.version&&h.integrity===_.integrity,{digest:xt}=z;await p(kt?z.reused?"current":"repaired":"updated",{kind:"cached",digest:xt,version:_.version,integrity:_.integrity},_.intervalS)}function mr(e){return`${e.slice(0,4)}\u2026`}async function gr(e,t,n){let r=e.includes("--json"),o=e.includes("--all"),c=e.slice(1).filter(p=>p!=="--json"&&p!=="--all"),s=await le(c,t),a=await M(t.env,t.home),i=A(),u=await bt(t,n,s,i,a),l=await hr(i,t.home,s?.scopeId),d=o?await _r(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=E(a,s,O(e.env)),u="bundled",l,d;if(i.selection.kind==="cached"){let f=S(e.home,n.dev),p=await C(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 ${mr(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 hr(e,t,n){try{return(await e.readdir(xe(t))).filter(r=>r!==n)}catch{return[]}}function _r(e,t,n,r,o){return Promise.all(o.map(async c=>{let s={scopeId:c,collectorUrl:"",collectorUrlRedacted:await yr(n,x(e.home,c))??"",source:"manifest",dev:!1};return bt(e,t,s,n,r)}))}async function yr(e,t){try{let n=JSON.parse((await e.readFile(q(t))).toString("utf8"));return g(n)&&typeof n.collector=="string"?n.collector:void 0}catch{return}}export{cr as bootstrap,fr as runRefresh,gr 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 Hn}from"node:child_process";import{homedir as Bn}from"node:os";import{fileURLToPath as Rt}from"node:url";import{createHash as Jt}from"node:crypto";import{join as J}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{...q(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?q(t):void 0}function q(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?q(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 s=Ft(o,c);if(s!==0)return s}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",Z="EV_AI_LAUNCHER_PROTOCOL",ee="EV_AI_HOOK_SOURCE",D="EV_AI_HOOK_FALLBACK_REASON",U="EV_AI_LAUNCHER_SCOPE",te="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,ne=64*1024,re=64*1024,H=64*1024,Oe=2e3,B=250,Le=8e3,oe=14e3,Te=1e3,Fe=1e3,T=21600,ie=604800,Ie=3e5,se=4096,Me=4*1024*1024,De=2,Ue=864e5;import{open as He,mkdir as It,readFile as Mt,readdir as Dt,rename as Ut,stat as Ht,unlink as Bt,utimes as jt}from"node:fs/promises";var j=new WeakMap;function Vt(e){if(e&&typeof e=="object"&&"code"in e)return e}function I(e){return Vt(e)?.code==="ENOENT"}async function je(e,t){try{return await e.readdir(t)}catch(n){if(I(n))return[];throw n}}async function Ve(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 V(){return{async open(e,t){let n=await He(e,t),r={path:e};return j.set(r,n),r},async write(e,t){let n=Be(e),r=typeof t=="string"?Buffer.from(t,"utf8"):t;await n.write(r)},async fsync(e){await Be(e).sync()},async close(e){let t=j.get(e);j.delete(e),t&&await t.close()},rename:Ut,async readdir(e){return Dt(e)},readFile:Mt,async stat(e){let t=await Ht(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await It(e,t)},unlink:Bt,utimes:jt,async fsyncDir(e){if(process.platform==="win32")return;let t=await He(e,"r");try{await t.sync()}finally{await t.close()}}}}function Be(e){let t=j.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 K}from"node:path";function ae(e){return K(e,".ev-ai","agent-hook","js")}function Kt(e){return K(ae(e),"scopes")}function Ke(e,t){return K(Kt(e),t)}function Je(e){return K(e,"attempts")}function ce(e){return String(e).padStart(10,"0")}var $e="@ev-ai/agent-hook";function $(e,t){return J(ae(e),t?"dev-artifacts":"artifacts")}function de(e,t){return J(e,t,"hook.mjs")}function $t(e,t){return J(e,t,"meta.json")}function le(e,t){return J(e,t,"health.json")}function Wt(e){return Jt("sha256").update(e).digest("hex")}async function Yt(e,t,n){try{let r=await e.stat(t);return r.size<=0||r.size>Me?"bad":Wt(await e.readFile(t))===n?"ok":"bad"}catch(r){if(I(r))return"missing";throw r}}async function We(e,t,n,r,o,c=process.version){let[s,i,a]=await Promise.all([Yt(e,de(t,n),n),Gt(e,$t(t,n)),fe(e,le(t,n))]);if(s==="missing")return{usable:!1,reason:"artifact_missing"};if(s==="bad"||!i)return{usable:!1,reason:"hash_mismatch"};if(!Ee(i.version,r))return{usable:!1,reason:"below_floor"};if(!we(c,i.node_engine))return{usable:!1,reason:"incompatible_node"};if(i.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:i,healthFails:a?.consecutive_startup_failures??0}}async function Gt(e,t){try{let n=await e.readFile(t);return zt(JSON.parse(n.toString("utf8")))}catch{return}}function zt(e){if(!x(e))return;let t=e;if(t.package===$e&&!(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:$e,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{randomBytes as gn}from"node:crypto";import{basename as _n,dirname as yn,join as Sn}from"node:path";import{createHash as Xt}from"node:crypto";import{access as qt,readFile as Qt,stat as Zt}from"node:fs/promises";import{homedir as en}from"node:os";import{dirname as tn,join as me,parse as nn,resolve as Ye}from"node:path";var rn="https://hooks.ev-ai.ai",on=".claude/ev-ai-runtime-report.json",sn="config.json",an=1024*1024,Qe=new Set(["localhost","127.0.0.1","[::1]","::1"]),cn=["claude","cursor","codex"],un=[on,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],Ge=/^[A-Za-z0-9._~-]+$/;function dn(e){return e!==void 0&&cn.includes(e)}function W(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 s=0;s<e.length;s++){let i=e[s];if(i!==void 0){if(i==="--runner"){let a=W(e,s);t=a.value,s=a.next;continue}if(i.startsWith("--runner=")){t=i.slice(9);continue}if(i==="--url"){let a=W(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=W(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=W(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:dn(t)?t:void 0,event:n,collectorUrl:r,orgToken:o,baseUrl:c}}function Ze(e,t=rn){let n=t.replace(/\/+$/,""),r=e.trim();return`${n}/${r}/hook`}function he(e=en()){return me(e,".ev-ai",sn)}function ln(e,t){return{...e,...t}}function ze(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 fn(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?Qe.has(t.hostname):!1}catch{return!1}}function et(e){try{let n=new URL(e).pathname.split("/").filter(r=>r.length>0);if(n.length>=2&&n[n.length-1]==="hook"){let r=n[n.length-2];return r&&r.length>0?r:void 0}return}catch{return}}function tt(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!fn(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let n=et(e);if(!n)return`must end with /{orgToken}/hook (got: ${e})`;if(!Ge.test(n))return`org token must match ${Ge.source} (got: ${n})`;if(ze(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(ze(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function mn(e){return new URL(e).toString()}function Xe(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?Ze(n):""}function nt(e){try{return Qe.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 pn(e){let t=e.collectorUrl?.trim(),n;if(t)n=t;else{let o=e.orgToken?.trim();o&&(n=Ze(o,e.baseUrl?.trim()??void 0))}if(!n)return{};let r=tt(n);return r?{problem:r}:{url:mn(n)}}var ge={access:qt,stat:Zt,readFile:(e,t)=>Qt(e,t)};async function hn(e,t,n=ge){let r=Ye(e),{root:o}=nn(r);for(;;){let s=me(r,".git");try{let a=await n.stat(s);if(a.isDirectory()||a.isFile())return r}catch{}if(r===o)break;let i=tn(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 Ye(e)}async function M(e,t=ge){try{let n=await t.stat(e);if(!n.isFile()||n.size>an)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(un.map(async r=>{let o=me(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=pn(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 M(r,t),l=p?Xe(p):"";return l?{url:l,source:"manifest_override"}:{source:"none"}}catch{}let o=await hn(e.cwd,e.env,t),c=he(e.home),[s,i]=await Promise.all([M(c,t),qe(o,t).then(async p=>p??qe(e.cwd,t))]),a=i?await M(i,t):void 0,u;s&&a?u=ln(a,s):s?u=s:a&&(u=a);let f=u?Xe(u):"";return f?{url:f,source:"manifest"}:{source:"none"}}function it(e){if(tt(e))return;let t;try{t=new URL(e)}catch{return}let n=et(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 Xt("sha256").update(s).digest("hex").slice(0,32)}async function Y(e,t){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await M(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 s=le(t,n),i=await fe(e,s),a=i?.consecutive_startup_failures??0;if(!r){a>0&&await st(e,s,{consecutive_startup_failures:0});return}let u={consecutive_startup_failures:a+1};a+1>=De?u.quarantined_until=new Date(o+Ue).toISOString():i?.quarantined_until&&(u.quarantined_until=i.quarantined_until),await st(e,s,u)}async function st(e,t,n){let r=yn(t),o=Sn(r,`.${_n(t)}.${gn(8).toString("hex")}`);await Ve(e,o,JSON.stringify(n));try{await e.rename(o,t)}catch(c){throw await e.unlink(o).catch(()=>{}),c}await e.fsyncDir(r)}function vn(e,t){return new Promise(n=>{try{e.write(t,()=>n())}catch{n()}})}function ct(e){let t=e.now(),n=oe,r=!1,o=Promise.resolve(),c,s=!1,i=[],a,u,f,p=()=>Math.max(0,t+n-e.now()),l=[],d=(h,S)=>{if(e.installProcessHandlers===!1)return;(e.on??((O,g)=>process.on(O,g)))(h,S),l.push({event:h,handler:S})},_=()=>{let h=e.off??((S,R)=>process.off(S,R));for(let{event:S,handler:R}of l)try{h(S,R)}catch{}l.length=0},y=h=>(r||(r=!0,o=vn(e.stdout,h??Pe)),o),v=h=>{if(c)try{c.kill(h)}catch{}},E=()=>{for(let h of i)try{h()}catch{}},N=()=>{s||(E(),v("SIGTERM"),u=e.setTimeout(()=>{v("SIGKILL")},B),y())},b=()=>{y().finally(()=>{e.exit(0)})},k=()=>{s||(E(),b())},L=()=>{a&&e.clearTimeout(a),f&&e.clearTimeout(f),a=e.setTimeout(N,p());let h=Math.max(0,t+n+Te-e.now());f=e.setTimeout(k,h)};L(),d("uncaughtException",b),d("unhandledRejection",b);for(let h of["SIGTERM","SIGINT"])d(h,()=>{v(h),b()});return{ackOnce:y,remainingMs:p,eventBudgetMs:()=>n,onEventClassified(h){let S=h?oe:Le;S<n&&(n=S,L())},setChild(h){c=h},onAbort(h){i.push(h)},dispose(){s=!0,a&&e.clearTimeout(a),u&&e.clearTimeout(u),f&&e.clearTimeout(f),_()},waitForAckWrite(){return o}}}function bn(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(bn(o)!==void 0)return o.trim()}var dt=[Q,Z,U,te,ee,D];function _e(e){return Buffer.isBuffer(e)?e:Buffer.from(e)}function En(e,t,n){let r={...e.env};return r[te]="3",r[Q]=n,r[Z]=String(1),r[ee]=t.source,t.fallbackReason?r[D]=t.fallbackReason:delete r[D],t.scopeId?r[U]=t.scopeId:delete r[U],r}function wn(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,s="live"){let i;try{i=o.spawn(o.execPath,[e.hookPath,...t],{cwd:o.cwd,env:En(o,e,c),stdio:["pipe","pipe","pipe","pipe"],windowsHide:!0})}catch{return{outcome:"spawn_failed",ready:!1}}r.setChild(i);let a=!1,u=i.stdout,f=i.stderr,p=i.stdin,l=wn(i);if(!u||!f||!p){try{i.kill("SIGKILL")}catch{}return n.stopChildWrites(),r.setChild(void 0),{outcome:"spawn_failed",ready:!1}}s==="replay"?n.replayTo(p):n.attachChild(p);let d="pending",_=Buffer.alloc(0),y=!1,v=!1,E=!1,N=0,b=null,k=!1,L=g=>{if(y)return;if(_.length+g.length>ne){_=Buffer.concat([_,g.subarray(0,ne-_.length)]),y=!0;return}_=Buffer.concat([_,g])};u.on("data",g=>{L(_e(g))}),u.on("end",()=>{v=!0}),u.on("error",()=>{E=!0,v=!0}),f.on("data",g=>{if(N>=re)return;let w=_e(g),A=re-N,m=w.length>A?w.subarray(0,A):w;N+=m.length;try{o.stderr.write(m)}catch{}}),f.resume(),l?(l.on("data",g=>{d==="pending"&&_e(g).includes(Ae[0]??1)&&(d="byte")}),l.on("end",()=>{d==="pending"&&(d="eof")}),l.on("error",()=>{d==="pending"&&(d="error")})):d="error";let h=o.setTimeout(()=>{if(!(d!=="pending"||k))try{i.kill("SIGKILL")}catch{}},Oe);await new Promise(g=>{let w=!1,A=()=>{w||(w=!0,g())};i.once("exit",m=>{k=!0,b=m,A()}),i.once("error",()=>{a=!0,k=!0,A()})}),n.stopChildWrites(),o.clearTimeout(h);let S=Math.min(B,Math.max(0,r.remainingMs()));await new Promise(g=>{let w=()=>d!=="pending"&&v;if(w()){g();return}let A=o.setTimeout(()=>g(),S),m=()=>{w()&&(o.clearTimeout(A),g())};u.on("end",m),u.on("error",m),l?.on("end",m),l?.on("error",m),l?.on("data",m)}),u.removeAllListeners(),f.removeAllListeners(),l?.removeAllListeners();try{u.destroy()}catch{}try{f.destroy()}catch{}try{l?.destroy()}catch{}if(r.setChild(void 0),a)return{outcome:"spawn_failed",ready:!1};let R=d==="byte",O=ut(_,R,b,y||E);return O!==void 0?(await r.ackOnce(O),{outcome:"success",ready:!0}):d==="eof"?{outcome:"startup_failure",ready:!1}:{outcome:"runtime_failure",ready:R}}function xn(e){let t=e.charAt(0);return t!==""&&t.toLowerCase()===t}function Rn(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")>=H)return{isSessionStart:!1,isInProcess:r};let o=pe(e),c=o.event??"",s=o.runner??"";try{let i=JSON.parse(t);x(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"||xn(c))&&(s="cursor"))}catch{}return{isSessionStart:c.toLowerCase()==="sessionstart",isInProcess:r||Rn(c,s)}}import{readFile as An}from"node:fs/promises";import{fileURLToPath as Pn}from"node:url";async function ft(e){let t=Pn(new URL("../package.json",e)),n=await An(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 Cn=new Set(["configure","install","migrate-to-plugin","update","uninstall","--version","-V","help","--help","-h"]);function G(e){let t=e[0];return t==="status"?"status":t==="__refresh"?"refresh":t==="__work"||t==="__post"?"bundled_cli":t===void 0||Cn.has(t)?"cli":"hook"}async function mt(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:nt(n.url)}}import{join as pt}from"node:path";var kn=/^(\d{10})$/,Nn=/^(\d{10})\.done$/,On=/^[0-9a-f]{64}$/i;function yt(e){let t=e[Re];if(t===void 0||t==="")return T;let n=Number(t);return!Number.isInteger(n)||n<=0?T:Math.min(Math.max(T,n*60),ie)}async function St(e,t,n=!1){let r=Je(t),o=await je(e,r),c=new Map,s=new Map,i=ht(o,kn),a=ht(o,Nn),u=async l=>{let d=await _t(e,pt(r,Tn(l)));return d&&c.set(l,{record:Mn(d.value),mtimeMs:d.mtimeMs}),d!==void 0},f=async l=>{let d=Dn((await _t(e,pt(r,Fn(l))))?.value);return d&&s.set(l,d),d!==void 0};if(!n)return await Promise.all([...i.map(u),...a.map(f)]),{claims:c,dones:s};await Promise.all([gt(i,u),gt(a,f)]);let p=z(c);return p<z(s)&&a.includes(p)&&await f(p),{claims:c,dones:s}}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 z(e){let t=0;for(let n of e.keys())n>t&&(t=n);return t}function vt(e,t,n){let r=z(e.claims),o=z(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?Ln(i):void 0,u=r>0?e.dones.get(r):void 0,f=In(u?.interval_s,n),p=a!==void 0?a+f*1e3:void 0,l=a!==void 0&&a-t>Ie;return{latest:r,startMs:a,intervalS:f,deadlineMs:p,selection:c,lastOutcome:s,futureDated:l,highestDone:o}}function Ln(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 Tn(e){return ce(e)}function Fn(e){return`${ce(e)}.done`}function In(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(T,t):Math.min(Math.max(Math.floor(e),T,t),ie)}async function _t(e,t){let n;try{n=await e.stat(t)}catch(o){if(I(o))return;throw o}let r=n.mtimeMs;if(n.size===0||n.size>se)return{mtimeMs:r};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>se?{mtimeMs:r}:{mtimeMs:r,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:r}}}function Mn(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=Un(t.selection);if(n)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:n}}function Un(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"&&On.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 X(e,t){return new URL(t,e.launcherUrl??import.meta.url)}function C(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 Y(t.env,t.home))return C(t,"kill_switch",n);if(!n)return C(t,"no_collector_url",n);let r=V(),o=yt(t.env),c=t.now(),s=Ke(t.home,n.scopeId),i=vt(await St(r,s,!0),c,o),a={deadlineMs:i.deadlineMs,dev:n.dev};if(i.selection.kind==="cached"){let f=$(t.home,n.dev),p=await t.readPackageInfo().then(d=>d.version,()=>""),l=await We(r,f,i.selection.digest,p,c);return l.usable?{source:"cached",hookPath:de(f,i.selection.digest),scopeId:n.scopeId,digest:i.selection.digest,healthFails:l.healthFails,...a}:C(t,l.reason,n,a)}if(i.selection.kind==="bundled")return C(t,i.selection.why,n,a);if(F(t.env))return C(t,"sandboxed",n,a);let u=await ve(t);if(!u)return C(t,"bootstrap_failed",n,a);try{let f=await t.readPackageInfo();return await u.bootstrap({home:t.home,scope:n,bundledVersion:f.version,bundledHookPath:t.bundledHookPath,env:t.env,nowMs:c})}catch{return C(t,"bootstrap_failed",n,a)}}async function ve(e){try{return e.importUpdate?await e.importUpdate():await import(X(e,"./launcher-update.mjs").href)}catch{return}}function Et(e,t,n=Ce){let r=[],o=[],c=0,s=0,i="pending",a,u=!1,f=!1,p=!1,l=!1,d=!1,_=[],y=()=>{!l&&typeof e.pause=="function"&&(e.pause(),l=!0)},v=()=>{l&&typeof e.resume=="function"&&(e.resume(),l=!1)},E=()=>{u=!1,p=!1,f=!0,v()},N=()=>{if(!(d||i==="pending")){d=!0,t.clearTimeout(g);for(let m of _)m();_.length=0}},b=m=>{i==="pending"&&(i=m),N()},k=()=>{if(u&&a)try{a.end()}catch{u=!1}},L=m=>{if(i==="oversize")return;let P=s+m.length;if(P>Ne){b("oversize");return}o.push(m),s=P},h=m=>{if(!(!u||!a))try{if(!a.write(m)){if(a.destroyed||!a.writable){E();return}p=!0,y()}}catch{E()}},S=m=>{let P=Buffer.isBuffer(m)?m:Buffer.from(m);if(!(i==="truncated"||i==="complete")&&(L(P),!f)){if(u){h(P);return}r.push(P),c+=P.length,c>=ke&&y()}},R=()=>{k(),b("complete")},O=()=>{i==="pending"&&b("truncated")},g=t.setTimeout(()=>{i==="pending"&&(b("truncated"),k(),E())},n);"isTTY"in e&&!!e.isTTY?b("complete"):(e.on("data",S),e.on("end",R),e.on("error",O),typeof e.resume=="function"&&e.resume());let A=m=>{m.on("error",()=>{E()}),m.on("drain",()=>{!u||f||(p=!1,v())})};return{get state(){return i},get replayable(){return i==="complete"},get backlogBytes(){return c},get replayBytes(){return s},attachChild(m){a=m,f=!1,u=!0,p=!1,A(m);for(let P of r){if(!u)break;h(P)}if(r.length=0,c=0,p?y():v(),i!=="pending"){try{m.end()}catch{E()}u=!1}},replayTo(m){A(m);try{m.end(o.length>0?Buffer.concat(o,s):Buffer.alloc(0))}catch{}},stopChildWrites(){E()},dispose(){t.clearTimeout(g),e.off?.("data",S),e.off?.("end",R),e.off?.("error",O)},classifiableText(){if(!(i!=="complete"||s>=H))return Buffer.concat(o,s).toString("utf8")},whenSettled(){return d?Promise.resolve():new Promise(m=>{_.push(m)})}}}var At={version:"",evAi:{launcherProtocol:1,minLauncherProtocol:1,launcherRevision:1}};function jn(e){return Rt(new URL("./hook.mjs",e))}function Vn(e){let t;return{stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,env:process.env,cwd:process.cwd(),home:Bn(),now:()=>Date.now(),spawn:Hn,exit:n=>{process.exit(n)},setTimeout,clearTimeout,bundledHookPath:jn(e),execPath:process.execPath,select:bt,readPackageInfo:()=>t??=ft(e),launcherUrl:e}}async function wt(e){return e.importCli?e.importCli():import(X(e,"./cli.mjs").href)}async function Pt(e=process.argv.slice(2),t=Vn(import.meta.url)){let n=G(e);if(n==="cli")try{return await(await wt(t)).main(e)}catch(s){let i=s instanceof Error?s.message:String(s);try{t.stderr.write(`[ev-ai-agent-hook] ${i}
4
- `)}catch{}return 1}if(n==="bundled_cli")return(await wt(t)).main(e);if(n==="refresh"||n==="status")try{let s=await t.readPackageInfo().catch(()=>At),i=await ve(t);return i?n==="refresh"?await i.runRefresh(e.slice(1),t.env,t.cwd,t.home,{packageVersion:s.version}):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([Kn(e,c,r),o])}async function Kn(e,t,n){let r=ct(t),o=Et(t.stdin,t),c,s=()=>c??=lt(e,o.classifiableText(),t.env);o.whenSettled().then(()=>r.onEventClassified(s().isInProcess));let i=!1,a=new Promise(p=>{r.onAbort(()=>{i=!0,p()})}),u=p=>Promise.race([p,a.then(()=>{})]),f=async p=>(await r.ackOnce(),r.dispose(),o.dispose(),n(p),p);try{let p=t.readPackageInfo().catch(()=>At),l;try{l=await u(mt(e,t))}catch{l=void 0}if(i)return f(0);let d;try{d=await u(t.select(e,t,l))}catch{d=C(t,"selection_error",l)}let _=await u(p);if(i||!d||!_)return f(0);let y=await ye(d,e,o,r,t,_.version,"live");if(y.outcome==="success"&&d.source==="cached"&&d.healthFails&&await xt(t,d,!1),y.outcome==="startup_failure"&&d.source!=="bundled"&&(await xt(t,d,!0),o.replayable&&r.remainingMs()>Fe)){let v=C(t,"startup_failure",l);await ye(v,e,o,r,t,_.version,"replay")}return await Jn(e,t,d,l,o.replayable,s),f(0)}catch{return f(0)}}async function Jn(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 Y(t.env,t.home))return;let s={...t.env};for(let i of dt)delete s[i];s[xe]=r.scopeId;try{t.spawn(t.execPath,[Rt(X(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 at(V(),$(e.home,t.dev===!0),t.digest,n,e.now(),e.env).catch(()=>{})}Pt().then(e=>{process.exit(e)}).catch(e=>{if(G(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)});
@@ -17,7 +17,7 @@ var __copyProps = (to, from, except, desc) => {
17
17
  };
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
- // src/managed-hooks-snippet.ts
20
+ // src/install/managed-hooks-snippet.ts
21
21
  var managed_hooks_snippet_exports = {};
22
22
  __export(managed_hooks_snippet_exports, {
23
23
  buildCollectorUrl: () => buildCollectorUrl,
@@ -25,7 +25,7 @@ __export(managed_hooks_snippet_exports, {
25
25
  });
26
26
  module.exports = __toCommonJS(managed_hooks_snippet_exports);
27
27
 
28
- // src/collector-url-resolve.ts
28
+ // src/config/collector-url-resolve.ts
29
29
  var DEFAULT_COLLECTOR_BASE_URL = "https://hooks.ev-ai.ai";
30
30
  var MAX_JSON_FILE_BYTES = 1024 * 1024;
31
31
  function buildCollectorUrl(orgToken, baseUrl = DEFAULT_COLLECTOR_BASE_URL) {
@@ -34,7 +34,7 @@ function buildCollectorUrl(orgToken, baseUrl = DEFAULT_COLLECTOR_BASE_URL) {
34
34
  return `${normalizedBase}/${token}/hook`;
35
35
  }
36
36
 
37
- // src/constants.ts
37
+ // src/shared/constants.ts
38
38
  var HOOK_BINARY_NAME = "ev-ai-agent-hook";
39
39
  var HOOK_CHECKSUMS_FILE = "SHA256SUMS";
40
40
  var GLOBAL_HOOK_BINARY_RELATIVE = `current/${HOOK_BINARY_NAME}`;
@@ -44,11 +44,11 @@ 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.0";
47
+ var PACKAGE_VERSION = "1.2.2";
48
48
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
49
49
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
50
50
 
51
- // src/install.ts
51
+ // src/install/install.ts
52
52
  function isSessionStartEvent(eventName) {
53
53
  return eventName === "SessionStart" || eventName === "sessionStart";
54
54
  }
@@ -136,7 +136,7 @@ var CURSOR_WIRED_HOOK_EVENTS = [
136
136
  "stop"
137
137
  ];
138
138
 
139
- // src/plugin-hooks.ts
139
+ // src/install/plugin-hooks.ts
140
140
  var PLUGIN_HOOK_PAYLOAD = "hook.mjs";
141
141
  var PLUGIN_CHECKSUMS_FILE = HOOK_CHECKSUMS_FILE;
142
142
  function buildClaudePluginHooks(command) {
@@ -164,7 +164,7 @@ var PLUGIN_PAYLOAD_FILES = [
164
164
  }
165
165
  ];
166
166
 
167
- // src/managed-hooks-snippet.ts
167
+ // src/install/managed-hooks-snippet.ts
168
168
  function managedHooksSnippet(runner, collectorUrl) {
169
169
  const command = withUrlFlag(withRunnerFlag(npxHookCommand(), runner), collectorUrl);
170
170
  const doc = runner === "cursor" ? { version: 1, ...buildCursorPluginHooks(command) } : runner === "claude" ? buildClaudePluginHooks(command) : buildCodexPluginHooks(command);
@@ -1,4 +1,4 @@
1
- // src/collector-url-resolve.ts
1
+ // src/config/collector-url-resolve.ts
2
2
  var DEFAULT_COLLECTOR_BASE_URL = "https://hooks.ev-ai.ai";
3
3
  var MAX_JSON_FILE_BYTES = 1024 * 1024;
4
4
  function buildCollectorUrl(orgToken, baseUrl = DEFAULT_COLLECTOR_BASE_URL) {
@@ -7,7 +7,7 @@ function buildCollectorUrl(orgToken, baseUrl = DEFAULT_COLLECTOR_BASE_URL) {
7
7
  return `${normalizedBase}/${token}/hook`;
8
8
  }
9
9
 
10
- // src/constants.ts
10
+ // src/shared/constants.ts
11
11
  var HOOK_BINARY_NAME = "ev-ai-agent-hook";
12
12
  var HOOK_CHECKSUMS_FILE = "SHA256SUMS";
13
13
  var GLOBAL_HOOK_BINARY_RELATIVE = `current/${HOOK_BINARY_NAME}`;
@@ -17,11 +17,11 @@ 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.0";
20
+ var PACKAGE_VERSION = "1.2.2";
21
21
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
22
22
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
23
23
 
24
- // src/install.ts
24
+ // src/install/install.ts
25
25
  function isSessionStartEvent(eventName) {
26
26
  return eventName === "SessionStart" || eventName === "sessionStart";
27
27
  }
@@ -109,7 +109,7 @@ var CURSOR_WIRED_HOOK_EVENTS = [
109
109
  "stop"
110
110
  ];
111
111
 
112
- // src/plugin-hooks.ts
112
+ // src/install/plugin-hooks.ts
113
113
  var PLUGIN_HOOK_PAYLOAD = "hook.mjs";
114
114
  var PLUGIN_CHECKSUMS_FILE = HOOK_CHECKSUMS_FILE;
115
115
  function buildClaudePluginHooks(command) {
@@ -137,7 +137,7 @@ var PLUGIN_PAYLOAD_FILES = [
137
137
  }
138
138
  ];
139
139
 
140
- // src/managed-hooks-snippet.ts
140
+ // src/install/managed-hooks-snippet.ts
141
141
  function managedHooksSnippet(runner, collectorUrl) {
142
142
  const command = withUrlFlag(withRunnerFlag(npxHookCommand(), runner), collectorUrl);
143
143
  const doc = runner === "cursor" ? { version: 1, ...buildCursorPluginHooks(command) } : runner === "claude" ? buildClaudePluginHooks(command) : buildCodexPluginHooks(command);
@@ -1,11 +1,11 @@
1
- // src/plugin-hooks.ts
1
+ // src/install/plugin-hooks.ts
2
2
  import { chmodSync, copyFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs";
3
3
  import { dirname, join } from "node:path";
4
4
 
5
- // src/collector-url-resolve.ts
5
+ // src/config/collector-url-resolve.ts
6
6
  var MAX_JSON_FILE_BYTES = 1024 * 1024;
7
7
 
8
- // src/constants.ts
8
+ // src/shared/constants.ts
9
9
  var HOOK_BINARY_NAME = "ev-ai-agent-hook";
10
10
  var HOOK_CHECKSUMS_FILE = "SHA256SUMS";
11
11
  var GLOBAL_HOOK_BINARY_RELATIVE = `current/${HOOK_BINARY_NAME}`;
@@ -15,11 +15,11 @@ 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.0";
18
+ var PACKAGE_VERSION = "1.2.2";
19
19
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
20
20
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
21
21
 
22
- // src/install.ts
22
+ // src/install/install.ts
23
23
  function isSessionStartEvent(eventName) {
24
24
  return eventName === "SessionStart" || eventName === "sessionStart";
25
25
  }
@@ -94,7 +94,7 @@ var CURSOR_WIRED_HOOK_EVENTS = [
94
94
  "stop"
95
95
  ];
96
96
 
97
- // src/plugin-hooks.ts
97
+ // src/install/plugin-hooks.ts
98
98
  var PLUGIN_HOOK_PAYLOAD = "hook.mjs";
99
99
  var PLUGIN_VERSION_FILE = "version";
100
100
  var PLUGIN_CHECKSUMS_FILE = HOOK_CHECKSUMS_FILE;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ev-ai/agent-hook",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
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"