@ev-ai/agent-hook 1.2.3 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- import{createHash as 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(`
1
+ import{createHash as dt}from"node:crypto";import{join as W}from"node:path";var M="signed-hook-v1",xe=Buffer.from("ev-ai-hook-release-v1\0","utf8"),D=32;var Xe=64,Q=64;import{sign as So,verify as ar}from"node:crypto";var Jt=/^[A-Za-z0-9+/]+=*$/;function O(e){if(e.length===0||!Jt.test(e))return;let t=Buffer.from(e,"base64");if(t.toString("base64")===e)return t}import{createPrivateKey as no,createPublicKey as zt,timingSafeEqual as oo}from"node:crypto";var Wt=Buffer.from("302a300506032b6570032100","hex"),so=Buffer.from("302e020100300506032b657004220420","hex");function Xt(e){let t=Buffer.from(e,"base64");if(t.byteLength!==D||t.toString("base64")!==e)throw new Error("invalid production public key");return t}var Z=Object.freeze({"release-key-1":Xt("jVk7k2gEEcdAiPOFtNZomu36bOpfkk0vgF9dC6FMcS0=")});function qe(e){if(e.byteLength!==D)throw new Error("Ed25519 public key must be 32 bytes");return zt({key:Buffer.concat([Wt,Buffer.from(e)]),format:"der",type:"spki"})}function Qe(e,t){if(!Object.hasOwn(e,t))return;let r=e[t];if(r?.byteLength===D)return r}var m={UNKNOWN_FORMAT:"unknown_format",UNKNOWN_KEY:"unknown_key",NON_CANONICAL_BASE64:"non_canonical_base64",INVALID_SIGNATURE_LENGTH:"invalid_signature_length",SIGNATURE_INVALID:"signature_invalid",TRAILING_BYTES:"trailing_bytes",UNKNOWN_FIELD:"unknown_field",DUPLICATE_FIELD:"duplicate_field",MISSING_FIELD:"missing_field",INVALID_TYPE:"invalid_type",INVALID_VERSION:"invalid_version",INVALID_URL:"invalid_url",URL_VERSION_MISMATCH:"url_version_mismatch",INVALID_SHA512:"invalid_sha512",INVALID_SIZE:"invalid_size",INVALID_NODE_ENGINE:"invalid_node_engine",INVALID_PROTOCOL:"invalid_protocol",INVALID_PACKAGE:"invalid_package",INVALID_JSON:"invalid_json",INVALID_ENVELOPE:"invalid_envelope",INVALID_KEY_ID:"invalid_key_id"},$={SIZE_MISMATCH:"size_mismatch",HASH_MISMATCH:"hash_mismatch"};function Ze(e){let t;try{t=new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return{ok:!1,reason:m.INVALID_JSON}}return qt(t)}function qt(e){if(e.length===0)return{ok:!1,reason:m.INVALID_JSON};if(e.trimStart()!==e||e.trimEnd()!==e)return{ok:!1,reason:m.TRAILING_BYTES};let t=new Ae(e);try{let r=t.parseValue();return t.atEnd()?{ok:!0,value:r}:{ok:!1,reason:m.TRAILING_BYTES}}catch(r){return r instanceof ee?{ok:!1,reason:m.DUPLICATE_FIELD}:{ok:!1,reason:m.INVALID_JSON}}}var ee=class extends Error{constructor(){super("duplicate field")}},Ae=class{text;i=0;constructor(t){this.text=t}atEnd(){return this.i>=this.text.length}parseValue(){this.skipWs();let t=this.text[this.i];if(t==="{")return this.parseObject();if(t==="[")return this.parseArray();if(t==='"')return this.parseString();if(t==="t"||t==="f"||t==="n")return this.parseLiteral();if(t==="-"||t!==void 0&&t>="0"&&t<="9")return this.parseNumber();throw new SyntaxError("invalid json")}skipWs(){let{text:t}=this;for(;this.i<t.length;){let r=t.charCodeAt(this.i);if(r!==32&&r!==10&&r!==13&&r!==9)break;this.i+=1}}parseObject(){this.expect("{"),this.skipWs();let t=Object.create(null),r=new Set;if(this.text[this.i]==="}")return this.i+=1,t;for(;;){if(this.skipWs(),this.text[this.i]!=='"')throw new SyntaxError("expected key");let n=this.parseString();if(r.has(n))throw new ee;r.add(n),this.skipWs(),this.expect(":"),t[n]=this.parseValue(),this.skipWs();let o=this.text[this.i];if(o===","){this.i+=1;continue}if(o==="}")return this.i+=1,t;throw new SyntaxError("expected comma or end of object")}}parseArray(){this.expect("["),this.skipWs();let t=[];if(this.text[this.i]==="]")return this.i+=1,t;for(;;){t.push(this.parseValue()),this.skipWs();let r=this.text[this.i];if(r===","){this.i+=1;continue}if(r==="]")return this.i+=1,t;throw new SyntaxError("expected comma or end of array")}}parseString(){this.expect('"');let{text:t}=this,r="";for(;this.i<t.length;){let n=t.charCodeAt(this.i);if(n===34)return this.i+=1,r;if(n===92){this.i+=1,r+=this.parseEscape();continue}if(n<32)throw new SyntaxError("unescaped control");r+=t[this.i],this.i+=1}throw new SyntaxError("unterminated string")}parseEscape(){let t=this.text[this.i];if(t===void 0)throw new SyntaxError("unterminated escape");switch(this.i+=1,t){case'"':case"\\":case"/":return t;case"b":return"\b";case"f":return"\f";case"n":return`
2
+ `;case"r":return"\r";case"t":return" ";case"u":{let r=this.text.slice(this.i,this.i+4);if(!/^[0-9a-fA-F]{4}$/.test(r))throw new SyntaxError("invalid unicode escape");return this.i+=4,String.fromCharCode(Number.parseInt(r,16))}default:throw new SyntaxError("invalid escape")}}parseLiteral(){if(this.text.startsWith("true",this.i))return this.i+=4,!0;if(this.text.startsWith("false",this.i))return this.i+=5,!1;if(this.text.startsWith("null",this.i))return this.i+=4,null;throw new SyntaxError("invalid literal")}parseNumber(){let t=this.i,{text:r}=this;if(r[this.i]==="-"&&(this.i+=1),r[this.i]==="0")this.i+=1;else if(this.isDigit(r[this.i]))for(;this.isDigit(r[this.i]);)this.i+=1;else throw new SyntaxError("invalid number");if(r[this.i]==="."){if(this.i+=1,!this.isDigit(r[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(r[this.i]);)this.i+=1}if(r[this.i]==="e"||r[this.i]==="E"){if(this.i+=1,(r[this.i]==="+"||r[this.i]==="-")&&(this.i+=1),!this.isDigit(r[this.i]))throw new SyntaxError("invalid number");for(;this.isDigit(r[this.i]);)this.i+=1}let n=Number(r.slice(t,this.i));if(!Number.isFinite(n))throw new SyntaxError("invalid number");return n}expect(t){if(this.text[this.i]!==t)throw new SyntaxError(`expected ${t}`);this.i+=1}isDigit(t){return t!==void 0&&t>="0"&&t<="9"}};var tt=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],Qt=new Set(tt),Zt=/^\d+\.\d+\.\d+$/,er=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,tr=/^[@A-Za-z0-9._/~-]{1,214}$/;function Oe(e){let t=Ze(e);return t.ok?rr(t.value):t}function rr(e){if(!ve(e))return{ok:!1,reason:m.INVALID_JSON};for(let u of Object.keys(e))if(!Qt.has(u))return{ok:!1,reason:m.UNKNOWN_FIELD};for(let u of tt)if(!(u in e))return{ok:!1,reason:m.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!tr.test(t)||t.includes(".."))return{ok:!1,reason:m.INVALID_PACKAGE};let r=e.version;if(typeof r!="string"||!Zt.test(r))return{ok:!1,reason:m.INVALID_VERSION};let n=e.url;if(typeof n!="string")return{ok:!1,reason:m.INVALID_URL};let o=nr(n,r);if(o!==void 0)return{ok:!1,reason:o};let a=e.sha512;if(typeof a!="string")return{ok:!1,reason:m.INVALID_SHA512};if(O(a)?.byteLength!==Q)return{ok:!1,reason:m.INVALID_SHA512};let c=e.size;if(typeof c!="number"||!Number.isInteger(c)||c<1||c>4194304)return{ok:!1,reason:m.INVALID_SIZE};let i=e.node_engine;if(typeof i!="string"||er.exec(i)===null)return{ok:!1,reason:m.INVALID_NODE_ENGINE};let l=e.min_launcher_protocol;return typeof l!="number"||!Number.isInteger(l)||l<1||!Number.isSafeInteger(l)?{ok:!1,reason:m.INVALID_PROTOCOL}:{ok:!0,manifest:{package:t,version:r,url:n,sha512:a,size:c,node_engine:i,min_launcher_protocol:l}}}function ve(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function nr(e,t){if(e.includes("..")||/%2e/i.test(e)||/[\\?#]/.test(e))return m.INVALID_URL;let r;try{r=new URL(e)}catch{return m.INVALID_URL}if(r.href!==e)return m.INVALID_URL;if(!ir(r))return m.INVALID_URL;if(r.username!==""||r.password!=="")return m.INVALID_URL;if(r.search!==""||r.hash!=="")return m.INVALID_URL;if(r.hostname===""||r.pathname.includes(".."))return m.INVALID_URL;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(r.pathname)?.[1];if(o===void 0)return m.INVALID_URL;if(o!==t)return m.URL_VERSION_MISMATCH}var or=new Set(["localhost","127.0.0.1","[::1]"]);function ir(e){return e.protocol==="https:"?!0:e.protocol==="http:"?or.has(e.hostname):!1}var cr=["format","key_id","payload","signature"],ur=/^[A-Za-z0-9._-]{1,128}$/;function lr(e,t){return Buffer.concat([xe,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function v(e,t){if(!ve(e))return{ok:!1,reason:m.INVALID_ENVELOPE};if(e.format!==M)return{ok:!1,reason:m.UNKNOWN_FORMAT};for(let u of Object.keys(e))if(u!=="format"&&u!=="key_id"&&u!=="payload"&&u!=="signature")return{ok:!1,reason:m.UNKNOWN_FIELD};for(let u of cr)if(!(u in e))return{ok:!1,reason:m.MISSING_FIELD};let n=e.key_id;if(typeof n!="string"||!ur.test(n))return{ok:!1,reason:m.INVALID_KEY_ID};let o=Qe(t,n);if(o===void 0)return{ok:!1,reason:m.UNKNOWN_KEY};let a=e.payload,s=e.signature;if(typeof a!="string"||typeof s!="string")return{ok:!1,reason:m.INVALID_ENVELOPE};let c=O(a),i=O(s);if(c===void 0||i===void 0)return{ok:!1,reason:m.NON_CANONICAL_BASE64};if(i.byteLength!==Xe)return{ok:!1,reason:m.INVALID_SIGNATURE_LENGTH};let l=!1;try{l=ar(null,lr(n,c),qe(o),i)}catch{l=!1}return l?Oe(c):{ok:!1,reason:m.SIGNATURE_INVALID}}import{createHash as fr,timingSafeEqual as dr}from"node:crypto";function te(e,t){if(e.byteLength!==t.size)return{ok:!1,reason:$.SIZE_MISMATCH};let r=O(t.sha512);if(r?.byteLength!==Q)return{ok:!1,reason:$.HASH_MISMATCH};let n=fr("sha512").update(e).digest();return n.byteLength!==r.byteLength||!dr(n,r)?{ok:!1,reason:$.HASH_MISMATCH}:{ok:!0}}var pr=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,mr=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,hr=/^v?(\d+)\.(\d+)\.(\d+)/;function rt(e){let t=pr.exec(e);if(t)return{...Ne(t),prerelease:t[4]?.split(".")}}function nt(e,t){let r=rt(e),n=rt(t);if(!(!r||!n))return r.major!==n.major?r.major-n.major:r.minor!==n.minor?r.minor-n.minor:r.patch!==n.patch?r.patch-n.patch:_r(r.prerelease,n.prerelease)}function re(e,t){let r=nt(e,t);return r!==void 0&&r>=0}function gr(e){let t=mr.exec(e.trim());return t?Ne(t):void 0}function Ne(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function ne(e,t){let r=gr(t),n=hr.exec(e.trim()),o=n?Ne(n):void 0;return!r||!o?!1:o.major!==r.major?o.major>r.major:o.minor!==r.minor?o.minor>r.minor:o.patch>=r.patch}function _r(e,t){if(e===void 0&&t===void 0)return 0;if(e===void 0)return 1;if(t===void 0)return-1;let r=Math.max(e.length,t.length);for(let n=0;n<r;n++){let o=e[n],a=t[n];if(o===void 0)return-1;if(a===void 0)return 1;let s=yr(o,a);if(s!==0)return s}return 0}function yr(e,t){let r=/^\d+$/.test(e),n=/^\d+$/.test(t);if(r&&n){let o=Number(e)-Number(t);return o<0?-1:o>0?1:0}return r?-1:n?1:e<t?-1:e>t?1:0}var ot="EV_AI_LAUNCHER_REFRESH_SCOPE",it="EV_AI_HOOK_UPDATE_TTL_MIN",jo=Buffer.from([1]);var $o=1024*1024,Go=4*1024*1024,Jo=64*1024,Yo=64*1024,zo=64*1024;var T=21600,Ie=604800,st=3e5,Pe=4096,Fe=4*1024*1024;import{randomBytes as Rr}from"node:crypto";import{basename as Sr,dirname as Er,join as Le}from"node:path";import{open as at,mkdir as br,readFile as wr,readdir as xr,rename as Ar,stat as Or,rmdir as vr,unlink as Nr,utimes as Ir}from"node:fs/promises";var oe=new WeakMap;function Me(e){if(e&&typeof e=="object"&&"code"in e)return e}function R(e){return Me(e)?.code==="ENOENT"}function De(e){return Me(e)?.code==="EEXIST"}function Pr(e){let t=Me(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function E(e,t){try{return await e.readdir(t)}catch(r){if(R(r))return[];throw r}}async function G(e,t){try{await e.unlink(t)}catch(r){if(!R(r))throw r}}async function ie(e,t,r){let n=await e.open(t,"wx");try{await e.write(n,r),await e.fsync(n)}finally{await e.close(n)}}function Te(){return Rr(8).toString("hex")}function Fr(e){return e.startsWith(".")}async function J(e,t,r){let n=await E(e,t);await Promise.all(n.map(async o=>{if(!Fr(o))return;let a=Le(t,o);try{let s=await e.stat(a);r-s.mtimeMs>36e5&&await e.unlink(a)}catch(s){if(!R(s))throw s}}))}async function N(e,t,r){let n=Er(t),o=Te(),a=`.${Sr(t)}.`,s=Le(n,`${a}${o}`),c=()=>e.unlink(s).catch(()=>{});await ie(e,s,r);try{await e.rename(s,t)}catch(i){if(!Pr(i))throw await c(),i;let l=Le(n,`${a}bad.${o}`);try{await e.rename(t,l)}catch(u){if(!R(u))throw await c(),u}await e.rename(s,t)}await e.fsyncDir(n)}function I(){return{async open(e,t){let r=await at(e,t),n={path:e};return oe.set(n,r),n},async write(e,t){let r=ct(e),n=typeof t=="string"?Buffer.from(t,"utf8"):t;await r.write(n)},async fsync(e){await ct(e).sync()},async close(e){let t=oe.get(e);oe.delete(e),t&&await t.close()},rename:Ar,async readdir(e){return xr(e)},readFile:wr,async stat(e){let t=await Or(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await br(e,t)},unlink:Nr,rmdir:vr,utimes:Ir,async fsyncDir(e){if(process.platform==="win32")return;let t=await at(e,"r");try{await t.sync()}finally{await t.close()}}}}function ct(e){let t=oe.get(e);if(!t)throw new Error("closed");return t}function _(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var lt=Object.freeze({"test-key-1":ut("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":ut("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function ut(e){let t=Buffer.from(e,"base64");if(t.byteLength!==D||t.toString("base64")!==e)throw new Error("invalid test public key");return t}function U(e){return e?{...lt,...Z}:Z}import{join as Y}from"node:path";function Ue(e){return Y(e,".ev-ai","agent-hook","js","signed-v1")}function He(e){return Y(Ue(e),"scopes")}function b(e,t){return Y(He(e),t)}function w(e){return Y(e,"attempts")}function se(e){return Y(e,"scope.json")}function Ce(e){return String(e).padStart(10,"0")}var Lr=64;function x(e,t){return W(Ue(e),t?"dev-artifacts":"artifacts")}function Be(e,t){return W(e,t)}function S(e,t){return W(e,t,"hook.mjs")}function ae(e,t){return W(e,t,"release.json")}function Mr(e,t){return W(e,t,"health.json")}function P(e){return dt("sha512").update(e).digest("hex")}function Ve(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Lr||t.toString("base64")!==e))return t.toString("hex")}async function H(e,t,r){try{let n=await e.stat(t);return n.size<=0||n.size>Fe?"bad":P(await e.readFile(t))===r?"ok":"bad"}catch(n){if(R(n))return"missing";throw n}}async function C(e,t,r,n,o,a,s=process.version){let[c,i,l]=await Promise.all([ft(e,S(t,r)),ft(e,ae(t,r)),Dr(e,Mr(t,r))]);if(c===void 0)return{usable:!1,reason:"artifact_missing"};if(i===void 0)return{usable:!1,reason:"signature_invalid"};let u;try{u=JSON.parse(i.toString("utf8"))}catch{return{usable:!1,reason:"signature_invalid"}}let f=v(u,U(a));if(!f.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:d}=f;if(c.byteLength!==d.size||c.byteLength>Fe)return{usable:!1,reason:"hash_mismatch"};let p=dt("sha512").update(c).digest();if(p.toString("hex")!==r)return{usable:!1,reason:"hash_mismatch"};let h=Buffer.from(d.sha512,"base64");if(p.byteLength!==h.byteLength||!p.equals(h))return{usable:!1,reason:"hash_mismatch"};if(!re(d.version,n))return{usable:!1,reason:"below_floor"};if(!ne(s,d.node_engine))return{usable:!1,reason:"incompatible_node"};if(d.min_launcher_protocol>1)return{usable:!1,reason:"incompatible_protocol"};if(l?.quarantined_until){let g=Date.parse(l.quarantined_until);if(Number.isFinite(g)&&g>o)return{usable:!1,reason:"quarantined"}}return{usable:!0,manifest:d,healthFails:l?.consecutive_startup_failures??0}}async function ft(e,t){try{return await e.readFile(t)}catch(r){if(R(r))return;throw r}}async function Dr(e,t){try{let r=await e.readFile(t),n=JSON.parse(r.toString("utf8"));if(!_(n))return;let o=n.consecutive_startup_failures;if(typeof o!="number"||!Number.isInteger(o)||o<0)return;let a={consecutive_startup_failures:o};return typeof n.quarantined_until=="string"&&(a.quarantined_until=n.quarantined_until),a}catch{return}}import{join as pt}from"node:path";var Tr=/^(\d{10})$/,Ur=/^(\d{10})\.done$/,Hr=/^[0-9a-f]{128}$/,Cr=64;function F(e){let t=e[it];if(t===void 0||t==="")return T;let r=Number(t);return!Number.isInteger(r)||r<=0?T:Math.min(Math.max(T,r*60),Ie)}async function y(e,t,r=!1){let n=w(t),o=await E(e,n),a=new Map,s=new Map,c=mt(o,Tr),i=mt(o,Ur),l=async d=>{let p=await gt(e,pt(n,ce(d)));return p&&a.set(d,{record:Vr(p.value),mtimeMs:p.mtimeMs}),p!==void 0},u=async d=>{let p=Kr((await gt(e,pt(n,ue(d))))?.value);return p&&s.set(d,p),p!==void 0};if(!r)return await Promise.all([...c.map(l),...i.map(u)]),{claims:a,dones:s};await Promise.all([ht(c,l),ht(i,u)]);let f=A(a);return f<A(s)&&i.includes(f)&&await u(f),{claims:a,dones:s}}function mt(e,t){return e.flatMap(r=>{let n=t.exec(r);return n?[Number(n[1])]:[]})}async function ht(e,t){for(let r of[...e].sort((n,o)=>o-n))if(await t(r))return}function A(e){let t=0;for(let r of e.keys())r>t&&(t=r);return t}function L(e,t,r){let n=A(e.claims),o=A(e.dones),a=n===0?{kind:"uninitialized"}:{kind:"bundled",why:"bootstrap_failed"},s;if(o>0){let p=e.dones.get(o);p&&(a=p.selection,s=p.outcome)}let c=n>0?e.claims.get(n):void 0,i=c?Br(c):void 0,l=n>0?e.dones.get(n):void 0,u=Ke(l?.interval_s,r),f=i!==void 0?i+u*1e3:void 0,d=i!==void 0&&i-t>st;return{latest:n,startMs:i,intervalS:u,deadlineMs:f,selection:a,lastOutcome:s,futureDated:d,highestDone:o}}function Br(e){if(e.record!=="empty"&&e.record.started_at){let t=Date.parse(e.record.started_at);if(Number.isFinite(t))return t}return e.mtimeMs}function ce(e){return Ce(e)}function ue(e){return`${Ce(e)}.done`}function Ke(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(T,t):Math.min(Math.max(Math.floor(e),T,t),Ie)}async function gt(e,t){let r;try{r=await e.stat(t)}catch(o){if(R(o))return;throw o}let n=r.mtimeMs;if(r.size===0||r.size>Pe)return{mtimeMs:n};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>Pe?{mtimeMs:n}:{mtimeMs:n,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:n}}}function Vr(e){if(!_(e))return"empty";let t={};return typeof e.started_at=="string"&&(t.started_at=e.started_at),(e.owner==="bootstrap"||e.owner==="refresh")&&(t.owner=e.owner),e.resync===!0&&(t.resync=!0),t}function Kr(e){if(!_(e))return;let t=e;if(typeof t.finished_at!="string"||typeof t.outcome!="string"||typeof t.interval_s!="number"||!Number.isFinite(t.interval_s))return;let r=jr(t.selection);if(r)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:r}}function jr(e){if(!_(e))return;let t=e;if(t.kind==="bundled")return t.why==="server"||t.why==="bootstrap_failed"?{kind:"bundled",why:t.why}:void 0;if(t.kind==="cached"&&typeof t.digest=="string"&&Hr.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&$r(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function $r(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Cr||t.toString("base64")!==e))return t.toString("hex")}import{join as le}from"node:path";async function fe(e,t,r){let n=w(t);await e.mkdir(n,{recursive:!0}),await J(e,n,r.nowMs);let o=L(await y(e,t,!0),r.nowMs,r.ttlFloorS);return o.futureDated?_t(e,t,{...r,resync:!0,n:o.latest+1}):o.deadlineMs!==void 0&&r.nowMs<o.deadlineMs?{kind:"too_soon",deadlineMs:o.deadlineMs,latest:o.latest}:_t(e,t,{...r,n:o.latest+1})}var de={kind:"bundled",why:"bootstrap_failed"};function pe(e,t,r,n,o,a){return(s,c,i)=>Yr(e,t,{n:r.n,startedAtMs:r.startedAtMs,nowMs:n(),budgetMs:o,intervalS:Ke(i,a),outcome:s,selection:c})}async function Yr(e,t,r){if(r.nowMs-r.startedAtMs>r.budgetMs+3e4)return{recorded:!1,why:"expired"};let n=await y(e,t);if(A(n.claims)>r.n)return{recorded:!1,why:"superseded"};if(n.dones.has(r.n))return{recorded:!1,why:"already_done"};let o={finished_at:new Date(r.nowMs).toISOString(),interval_s:r.intervalS,outcome:r.outcome,selection:r.selection};return await J(e,w(t),r.nowMs),await N(e,le(w(t),ue(r.n)),JSON.stringify(o)),await zr(e,t,r.n),{recorded:!0}}async function zr(e,t,r){let n=await y(e,t),o=r-8,a=A(n.dones),s=w(t),c=new Set([...n.claims.keys(),...n.dones.keys()]);await Promise.all([...c].map(async i=>{i>=o||i!==a&&(await G(e,le(s,ce(i))),await G(e,le(s,ue(i))))}))}async function _t(e,t,r){if(r.n<1||r.n>9999999999)return{kind:"lost"};let n=w(t),o=le(n,ce(r.n)),a=new Date(r.nowMs).toISOString(),s=Te(),c={started_at:a,nonce:s,owner:r.owner};r.resync&&(c.resync=!0);try{await ie(e,o,JSON.stringify(c)),await e.fsyncDir(n)}catch(i){if(De(i))return{kind:"lost"};throw i}return r.collectorRedacted!==void 0&&await Wr(e,t,r.collectorRedacted,r.dev===!0),A((await y(e,t)).claims)>r.n?{kind:"lost"}:r.resync?{kind:"resynced",n:r.n,startedAt:a}:{kind:"claimed",n:r.n,startedAt:a,startedAtMs:r.nowMs,nonce:s,owner:r.owner}}async function Wr(e,t,r,n){let o=se(t);try{await ie(e,o,Buffer.from(JSON.stringify({collector:r,dev:n}),"utf8")),await e.fsyncDir(t)}catch(a){if(De(a))return;throw a}}import{readFileSync as yn}from"node:fs";import{homedir as kn}from"node:os";import{join as Rn}from"node:path";import{createHash as Xr}from"node:crypto";import{access as qr,readFile as Qr,stat as Zr}from"node:fs/promises";import{homedir as en}from"node:os";import{dirname as tn,join as je,parse as rn,resolve as yt}from"node:path";var nn="https://hooks.ev-ai.ai",on=".claude/ev-ai-runtime-report.json",sn="config.json",an=1024*1024,bt=new Set(["localhost","127.0.0.1","[::1]","::1"]),cn=["claude","cursor","codex"],un=[on,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],kt=/^[A-Za-z0-9._~-]+$/;function ln(e){return e!==void 0&&cn.includes(e)}function me(e,t){let r=e[t+1];return r&&!r.startsWith("--")?{value:r,next:t+1}:{next:t}}function fn(e){let t,r,n,o,a;for(let s=0;s<e.length;s++){let c=e[s];if(c!==void 0){if(c==="--runner"){let i=me(e,s);t=i.value,s=i.next;continue}if(c.startsWith("--runner=")){t=c.slice(9);continue}if(c==="--url"){let i=me(e,s);i.value&&(n=i.value),s=i.next;continue}if(c.startsWith("--url=")){n=c.slice(6);continue}if(c==="--token"){let i=me(e,s);i.value&&(o=i.value),s=i.next;continue}if(c.startsWith("--token=")){o=c.slice(8);continue}if(c==="--base-url"){let i=me(e,s);i.value&&(a=i.value),s=i.next;continue}if(c.startsWith("--base-url=")){a=c.slice(11);continue}!c.startsWith("-")&&r===void 0&&(r=c)}}return{runner:ln(t)?t:void 0,event:r,collectorUrl:n,orgToken:o,baseUrl:a}}function wt(e,t=nn){let r=t.replace(/\/+$/,""),n=e.trim();return`${r}/${n}/hook`}function $e(e=en()){return je(e,".ev-ai",sn)}function dn(e,t){return{...e,...t}}function Rt(e){for(let t=0;t<e.length;t++){let r=e.charCodeAt(t);if(r<=32||r===127||r===39)return!0}return!1}function xt(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?bt.has(t.hostname):!1}catch{return!1}}function At(e){try{let r=new URL(e).pathname.split("/").filter(n=>n.length>0);if(r.length>=2&&r[r.length-1]==="hook"){let n=r[r.length-2];return n&&n.length>0?n:void 0}return}catch{return}}function Ge(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!xt(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let r=At(e);if(!r)return`must end with /{orgToken}/hook (got: ${e})`;if(!kt.test(r))return`org token must match ${kt.source} (got: ${r})`;if(Rt(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(Rt(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function pn(e){return new URL(e).toString()}function St(e){if(e.collector_url)return e.collector_url;let t=e.repo_ingest_token,r=typeof t=="string"?t.trim():void 0;return r?wt(r):""}function B(e){try{return bt.has(new URL(e).hostname)}catch{return!1}}function Ot(e){try{let t=new URL(e),r=t.pathname.split("/").filter(n=>n.length>0);return r.length>=2&&r[r.length-1]==="hook"&&(r[r.length-2]="***",t.pathname=`/${r.join("/")}`),t.toString()}catch{return"<invalid-url>"}}function mn(e){let t=e.collectorUrl?.trim(),r;if(t)r=t;else{let o=e.orgToken?.trim();o&&(r=wt(o,e.baseUrl?.trim()??void 0))}if(!r)return{};let n=Ge(r);return n?{problem:n}:{url:pn(r)}}var Je={access:qr,stat:Zr,readFile:(e,t)=>Qr(e,t)};async function hn(e,t,r=Je){let n=yt(e),{root:o}=rn(n);for(;;){let s=je(n,".git");try{let i=await r.stat(s);if(i.isDirectory()||i.isFile())return n}catch{}if(n===o)break;let c=tn(n);if(c===n)break;n=c}let a=t.CURSOR_PROJECT_DIR??t.CLAUDE_PROJECT_DIR;if(a)try{if((await r.stat(a)).isDirectory())return a}catch{}return yt(e)}async function X(e,t=Je){try{let r=await t.stat(e);if(!r.isFile()||r.size>an)return;let n=await t.readFile(e,"utf8"),o=JSON.parse(n);return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function Et(e,t){return(await Promise.all(un.map(async n=>{let o=je(e,n);try{return await t.access(o),o}catch{return}}))).find(n=>n!==void 0)}async function vt(e){let t=e.fs??Je,r=mn(fn(e.argv));if(r.url)return{url:r.url,source:"argv"};let n=e.env.EV_AI_HOOK_MANIFEST;if(n)try{await t.access(n);let f=await X(n,t),d=f?St(f):"";return d?{url:d,source:"manifest_override"}:{source:"none"}}catch{}let o=await hn(e.cwd,e.env,t),a=$e(e.home),[s,c]=await Promise.all([X(a,t),Et(o,t).then(async f=>f??Et(e.cwd,t))]),i=c?await X(c,t):void 0,l;s&&i?l=dn(i,s):s?l=s:i&&(l=i);let u=l?St(l):"";return u?{url:u,source:"manifest"}:{source:"none"}}function Nt(e){if(Ge(e))return;let t;try{t=new URL(e)}catch{return}let r=At(e);if(!r)return;let o=t.pathname.split("/").filter(c=>c.length>0).slice(0,-2),a=o.length>0?`/${o.join("/")}`:"",s=`${t.origin}${a}/${r}`;return Xr("sha256").update(s).digest("hex").slice(0,32)}var gn=/^[A-Za-z0-9._~-]+$/;function It(e,t){if(!gn.test(t)||Ge(e))return;let r;try{r=new URL(e)}catch{return}let n=r.pathname.split("/").filter(a=>a.length>0);if(n.length<2||n[n.length-1]!=="hook")return;n[n.length-1]=t;let o=new URL(r.origin);if(o.pathname=`/${n.join("/")}`,o.search="",o.hash="",o.username="",o.password="",!(o.username||o.password)&&o.origin===r.origin&&xt(o.toString()))return o.toString()}function Pt(e){return It(e,"version")}function Ft(e){return It(e,"error-report")}var Mt=/^[A-Za-z0-9._-]{8,64}$/;function Sn(e,t){try{let n=yn(Rn(e,".ev-ai","agent-hook","installation.json"),"utf8"),o=JSON.parse(n);if(o&&typeof o=="object"&&!Array.isArray(o)){let a=o.installation_id;if(typeof a=="string"&&Mt.test(a))return a}}catch{}let r=t.EV_AI_HOOK_INSTALLATION_ID?.trim();return r&&Mt.test(r)?r:void 0}async function he(e,t,r,n,o){if(!t.startsWith("failed:")||!n.postJson)return;let a=Ft(e);if(!a)return;let s;try{s=Sn(o?.home??kn(),o?.env??process.env)}catch{}try{await n.postJson(a,{reason:t.slice(0,512),phase:r,...s?{installation_id:s}:{}},{timeoutMs:500,signal:AbortSignal.timeout(500)})}catch{}}import En from"node:http";import bn from"node:https";import{URL as wn}from"node:url";function ge(){return{getBounded:Dt,postJson:On}}function _e(e,t){return e==="timeout"||e==="network"?"failed:timeout":e==="http_3xx"?"failed:http_3xx":t}function Dt(e,t){let r;try{r=new wn(e)}catch{return Promise.resolve({ok:!1,reason:"origin_rejected"})}if(r.protocol==="http:"){if(!B(e))return Promise.resolve({ok:!1,reason:"origin_rejected"})}else if(r.protocol!=="https:")return Promise.resolve({ok:!1,reason:"origin_rejected"});let n=r.protocol==="http:"?En:bn;return new Promise(o=>{let a=!1,s=[],c=0,i=f=>{a||(a=!0,t.signal?.removeEventListener("abort",l),o(f))},l=()=>{u.destroy(),i({ok:!1,reason:"timeout"})},u=n.request(r,{method:t.method??"GET",agent:!1,timeout:t.timeoutMs,headers:t.headers},f=>{let d=f.statusCode??0;if(d>=300&&d<400){f.resume(),i({ok:!1,reason:"http_3xx"});return}let p=f.headers["content-length"];if(typeof p=="string"){let h=Number(p);if(Number.isFinite(h)&&h>t.maxBytes){f.destroy(),i({ok:!1,reason:"too_large"});return}}f.on("data",h=>{if(c+=h.length,c>t.maxBytes){f.destroy(),i({ok:!1,reason:"too_large"});return}s.push(h)}),f.on("end",()=>{i({ok:!0,response:{status:d,headers:f.headers,body:Buffer.concat(s)}})}),f.on("error",()=>{i({ok:!1,reason:"network"})})});if(u.on("timeout",()=>{u.destroy(),i({ok:!1,reason:"timeout"})}),u.on("error",()=>{i({ok:!1,reason:"network"})}),t.signal){if(t.signal.aborted){l();return}t.signal.addEventListener("abort",l,{once:!0})}u.end(t.body)})}var xn=2048,An=1024;function On(e,t,r){let n;try{n=Buffer.from(JSON.stringify(t),"utf8")}catch{return Promise.resolve({ok:!1,reason:"network"})}return n.byteLength>xn?Promise.resolve({ok:!1,reason:"too_large"}):Dt(e,{maxBytes:An,timeoutMs:r.timeoutMs,signal:r.signal,method:"POST",body:n,headers:{"content-type":"application/json","content-length":n.byteLength}})}async function q(e,t){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await X($e(t)))?.auto_update===!1}function Ye(e){return!!e.CURSOR_SANDBOX}function ye(e,t,r,n){return{source:"bundled",hookPath:e.bundledHookPath,fallbackReason:t,scopeId:r?.scopeId,dev:r?.dev,...n}}import{join as Nn}from"node:path";var We=/^[0-9a-f]{128}$/;function In(e){return Buffer.from(JSON.stringify({format:e.format,key_id:e.key_id,payload:e.payload,signature:e.signature}),"utf8")}async function ke(e,t,r,n,o,a,s,c){if(!We.test(r)||P(n)!==r)return{ok:!1,reason:"repair_failed"};let i=Be(t,r);await e.mkdir(i,{recursive:!0}),await J(e,i,s);let l=S(t,r),u=ae(t,r),f=In(o);if(await H(e,l,r)==="ok"){let p=await Pn(e,u);if(p?.equals(f))return await ze(e,t,r),{ok:!0};let h=await Fn(p,c);return h!==void 0&&h!==a.version?{ok:!1,reason:"metadata_conflict"}:(await N(e,u,f),await ze(e,t,r),{ok:!0})}return await N(e,l,n),await N(e,u,f),await H(e,l,r)!=="ok"?{ok:!1,reason:"repair_failed"}:(await ze(e,t,r),{ok:!0})}async function Ut(e,t,r){let n=Ve(r.sha512);if(!(n===void 0||!We.test(n)))return await H(e,S(t,n),n)==="ok"?n:void 0}async function Pn(e,t){try{return await e.readFile(t)}catch{return}}async function Fn(e,t){if(e===void 0)return;let r;try{r=JSON.parse(e.toString("utf8"))}catch{return}if(!_(r))return;let n=v(r,U(t));return n.ok?n.manifest.version:void 0}async function ze(e,t,r){try{let o=(await E(e,t)).filter(i=>We.test(i));if(o.length<=8)return;let a=o.filter(i=>i!==r),s=await Promise.all(a.map(async i=>{let l=Number.NEGATIVE_INFINITY;try{l=(await e.stat(ae(t,i))).mtimeMs}catch{}return{name:i,mtimeMs:l}}));s.sort((i,l)=>l.mtimeMs-i.mtimeMs);let c=s.slice(7);await Promise.all(c.map(i=>Ln(e,t,i.name)))}catch{}}async function Ln(e,t,r){let n=Be(t,r);try{let o=await E(e,n);await Promise.all(o.map(a=>G(e,Nn(n,a)))),await e.rmdir(n)}catch{}}function Re(e,t){return{launcher:e,protocol:String(1),current:t,platform:`${process.platform}-${process.arch}`,node:process.version,update_format:M}}function Dn(e,t,r=U(t)){if(!_(e))return{ok:!1,reason:"failed:metadata_mismatch"};let n=e.hook_js;if(n===void 0)return{ok:!0,directive:{kind:"none"}};if(!_(n))return{ok:!1,reason:"failed:metadata_mismatch"};if(n.use_bundled===!0)return{ok:!0,directive:{kind:"bundled",intervalS:Hn(n.check_interval_s)}};let o=v(n,r);if(!o.ok)return{ok:!1,reason:"failed:metadata_mismatch"};let a=Un(o.manifest.url,t);return a?a!==o.manifest.version?{ok:!1,reason:"failed:metadata_mismatch"}:{ok:!0,directive:{kind:"target",manifest:o.manifest,envelope:Tn(n)}}:{ok:!1,reason:"failed:origin_rejected"}}async function Ht(e,t,r,n,o,a){let s=Cn(e,t),c=await n.getBounded(s,{maxBytes:4096,timeoutMs:r,signal:a});if(!c.ok)return{ok:!1,reason:_e(c.reason,"failed:metadata_mismatch")};let{status:i,body:l}=c.response;if(i!==200)return{ok:!1,reason:`failed:http_${i}`};let u;try{u=JSON.parse(l.toString("utf8"))}catch{return{ok:!1,reason:"failed:metadata_mismatch"}}return Dn(u,o)}function Tn(e){return{format:M,key_id:String(e.key_id),payload:String(e.payload),signature:String(e.signature)}}function Un(e,t){let r;try{r=new URL(e)}catch{return}if(r.username!==""||r.password!==""||r.search!==""||r.hash!==""||r.pathname.includes(".."))return;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(r.pathname)?.[1];if(o&&(r.protocol==="https:"||t&&r.protocol==="http:"&&B(e)))return o}function Hn(e){if(typeof e=="number"&&Number.isInteger(e)&&e>0)return e}function Cn(e,t){let r=new URL(e);for(let[n,o]of Object.entries(t))r.searchParams.set(n,o);return r.toString()}async function Se(e,t,r,n,o,a){let s=Pt(e);return s?Ht(s,t,r,n,o,a):{ok:!1,reason:"failed:origin_rejected"}}async function Ee(e,t,r,n,o,a,s,c,i,l){let{manifest:u,envelope:f}=n;if(!re(u.version,o))return{ok:!1,reason:"skipped:below_floor"};if(!ne(process.version,u.node_engine))return{ok:!1,reason:"skipped:incompatible_node"};if(u.min_launcher_protocol>1)return{ok:!1,reason:"skipped:incompatible_protocol"};let d=await Ut(e,r,u);if(d){let h=await C(e,r,d,o,a,i);if(h.usable)return{ok:!0,digest:d,reused:!0};if(h.reason==="quarantined")return{ok:!1,reason:"skipped:quarantined"};if(h.reason==="signature_invalid"){let g=S(r,d);if(await H(e,g,d)==="ok"){let V=await e.readFile(g),K=await ke(e,r,d,V,f,u,a,i);return K.ok?{ok:!0,digest:d,reused:!0}:{ok:!1,reason:`failed:${K.reason}`}}}}let p=await Bn(e,r,n,l,a,i);return p||Vn(e,t,r,n,a,s,c,i)}async function Bn(e,t,r,n,o,a){if(n.length!==0)try{let s=await e.readFile(n);if(!te(s,r.manifest).ok)return;let c=P(s),i=await ke(e,t,c,s,r.envelope,r.manifest,o,a);return i.ok?{ok:!0,digest:c,reused:!1}:{ok:!1,reason:`failed:${i.reason}`}}catch{return}}async function Vn(e,t,r,n,o,a,s,c){let{manifest:i,envelope:l}=n,u=await t.getBounded(i.url,{maxBytes:i.size,timeoutMs:a,signal:s});if(!u.ok)return{ok:!1,reason:_e(u.reason,"failed:extract_failed")};if(u.response.status!==200)return{ok:!1,reason:`failed:http_${u.response.status}`};let f=u.response.body;if(!te(f,i).ok)return{ok:!1,reason:"failed:integrity_mismatch"};let p=P(f),h=await ke(e,r,p,f,l,i,o,c);return h.ok?{ok:!0,digest:p,reused:!1}:{ok:!1,reason:`failed:${h.reason}`}}async function $n(e){let t=e.fs??I(),r=e.http??ge(),n=b(e.home,e.scope.scopeId),o=x(e.home,e.scope.dev),a=F(e.env),s=AbortSignal.timeout(3e3),c=await fe(t,n,{owner:"bootstrap",nowMs:e.nowMs,ttlFloorS:a,collectorRedacted:e.scope.collectorUrlRedacted,dev:e.scope.dev});if(c.kind!=="claimed"){let h=c.kind==="lost"||c.kind==="too_soon";return ye(e,h?"bootstrap_in_progress":"bootstrap_failed",e.scope,{didBootstrap:!1})}let i=pe(t,n,c,()=>Date.now(),3e3,a),l=async h=>(await i(h,de),ye(e,"bootstrap_failed",e.scope,{didBootstrap:!0}));if(s.aborted)return l("failed:bootstrap");let u=await Se(e.scope.collectorUrl,Re(e.bundledVersion,e.bundledVersion),1e3,r,e.scope.dev,s);if(!u.ok)return l(u.reason);let f=u.directive;if(f.kind==="none")return l("failed:bootstrap");if(f.kind==="bundled")return await i("bundled",{kind:"bundled",why:"server"},f.intervalS),ye(e,"server",e.scope,{didBootstrap:!0});let d=await Ee(t,r,o,{manifest:f.manifest,envelope:f.envelope},e.bundledVersion,e.nowMs,2e3,s,e.scope.dev,e.bundledHookPath);if(!d.ok)return he(e.scope.collectorUrl,d.reason,"bootstrap",r,{home:e.home,env:e.env}),l(d.reason);let{digest:p}=d;return await i("updated",{kind:"cached",digest:p,version:f.manifest.version,sha512:f.manifest.sha512}),{source:"bootstrap",hookPath:S(o,p),scopeId:e.scope.scopeId,digest:p,dev:e.scope.dev,didBootstrap:!0}}async function be(e,t){let r=await vt({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!r.url)return;let n=Nt(r.url);if(!(!n||r.source==="none"))return{scopeId:n,collectorUrl:r.url,collectorUrlRedacted:Ot(r.url),source:r.source,dev:B(r.url)}}async function Yn(e,t,r,n,o){try{await zn(e,t,r,n,o)}catch{}return 0}async function zn(e,t,r,n,o){if(Ye(t)||await q(t,n))return;let a=t[ot],s=await be(e,{env:t,cwd:r,home:n});if(!s||!a||s.scopeId!==a)return;let c=o?.fs??I(),i=o?.http??ge(),l=o?.nowMs??Date.now(),u=F(t),f=b(n,s.scopeId),d=await fe(c,f,{owner:"refresh",nowMs:l,ttlFloorS:u,collectorRedacted:s.collectorUrlRedacted,dev:s.dev});if(d.kind!=="claimed")return;let p=pe(c,f,d,()=>Date.now(),6e4,u),h=o?.packageVersion??"",g=L(await y(c,f,!0),l,u).selection,V=g.kind==="uninitialized"?de:g,K=AbortSignal.timeout(6e4),we=await Se(s.collectorUrl,Re(h,g.kind==="cached"?g.version:h),5e3,i,s.dev,K);if(!we.ok){await p(we.reason,V);return}let k=we.directive;if(k.kind==="none"){await p("no_directive",V);return}if(k.kind==="bundled"){await p("bundled",{kind:"bundled",why:"server"},k.intervalS);return}let j=await Ee(c,i,x(n,s.dev),{manifest:k.manifest,envelope:k.envelope},h,l,3e4,K,s.dev,o?.bundledHookPath??"");if(!j.ok){he(s.collectorUrl,j.reason,"refresh",i,{home:n,env:t}),await p(j.reason,V);return}let $t=g.kind==="cached"&&g.version===k.manifest.version&&g.sha512===k.manifest.sha512,{digest:Gt}=j;await p($t?j.reused?"current":"repaired":"updated",{kind:"cached",digest:Gt,version:k.manifest.version,sha512:k.manifest.sha512})}function Wn(e){return`${e.slice(0,4)}\u2026`}async function Xn(e,t,r){let n=e.includes("--json"),o=e.includes("--all"),a=e.slice(1).filter(p=>p!=="--json"&&p!=="--all"),s=await be(a,t),c=await q(t.env,t.home),i=I(),l=await jt(t,r,s,i,c),u=await qn(i,t.home,s?.scopeId),f=o?await Qn(t,r,i,c,u):[];if(n)return t.stdout.write(`${JSON.stringify({...l,otherScopes:f},null,2)}
3
+ `),0;let d=[`launcher ${r.version} protocol ${r.evAi.launcherProtocol} revision ${r.evAi.launcherRevision} bundled hook ${r.version}`];if(d.push(...Kt(l)),o)for(let p of f)d.push(""),d.push(...Kt(p));else d.push(`other scopes ${u.length} (status --all)`);return d.push(`auto-update ${c?"off":"on"}`),t.stdout.write(`${d.join(`
4
4
  `)}
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};
5
+ `),0}async function jt(e,t,r,n,o){let a=!o;if(o)return{...Vt(r,a),selection:"bundled",fallbackReason:"kill_switch"};if(!r)return{selection:"bundled",fallbackReason:"no_collector_url",autoUpdate:a};let s=e.now(),c=await y(n,b(e.home,r.scopeId),!0),i=L(c,s,F(e.env)),l="bundled",u,f;if(i.selection.kind==="cached"){let d=x(e.home,r.dev),p=await C(n,d,i.selection.digest,t.version,s,r.dev);p.usable?(l=`cached ${i.selection.version}`,f=`usable (protocol ${p.manifest.min_launcher_protocol})`):u=p.reason}else i.selection.kind==="bundled"?u=i.selection.why:u="uninitialized";return{...Vt(r,a),selection:l,fallbackReason:u,usable:f,lastAttempt:i.startMs!==void 0?new Date(i.startMs).toISOString():void 0,nextNotBefore:i.deadlineMs!==void 0?new Date(i.deadlineMs).toISOString():void 0,intervalS:i.intervalS,lastResult:i.lastOutcome}}function Vt(e,t){return{scopeId:e?.scopeId,collectorUrlRedacted:e?.collectorUrlRedacted,urlSource:e?.source,autoUpdate:t}}function Kt(e){let t=[];e.scopeId?t.push(`this repo scope ${Wn(e.scopeId)} ${e.collectorUrlRedacted} (source: ${e.urlSource})`):t.push("this repo (no collector url)");let r=e.fallbackReason?` (${e.fallbackReason})`:e.usable?` ${e.usable}`:"";return t.push(` selection ${e.selection}${r}`),e.lastAttempt&&t.push(` schedule last attempt ${e.lastAttempt} next not before ${e.nextNotBefore} (interval ${Math.round((e.intervalS??0)/3600)} h)`),e.lastResult&&t.push(` last result ${e.lastResult}`),t}async function qn(e,t,r){return(await E(e,He(t))).filter(n=>n!==r)}function Qn(e,t,r,n,o){return Promise.all(o.map(async a=>{let s=await Zn(r,b(e.home,a)),c={scopeId:a,collectorUrl:"",collectorUrlRedacted:s.collector??"",source:"manifest",dev:s.dev};return jt(e,t,c,r,n)}))}async function Zn(e,t){try{let r=JSON.parse((await e.readFile(se(t))).toString("utf8"));if(_(r))return{collector:typeof r.collector=="string"?r.collector:void 0,dev:r.dev===!0}}catch{}return{dev:!1}}export{$n as bootstrap,Yn as runRefresh,Xn as runStatus};
@@ -44,7 +44,7 @@ var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
44
44
  var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
45
45
  var GZIP_MIN_BYTES = 32 * 1024;
46
46
  var USER_SPEC_COOLDOWN_MS = 14 * 60 * 60 * 1e3;
47
- var PACKAGE_VERSION = "1.2.3";
47
+ var PACKAGE_VERSION = "1.2.5";
48
48
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
49
49
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
50
50
 
@@ -17,7 +17,7 @@ var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
17
17
  var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
18
18
  var GZIP_MIN_BYTES = 32 * 1024;
19
19
  var USER_SPEC_COOLDOWN_MS = 14 * 60 * 60 * 1e3;
20
- var PACKAGE_VERSION = "1.2.3";
20
+ var PACKAGE_VERSION = "1.2.5";
21
21
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
22
22
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
23
23
 
@@ -15,7 +15,7 @@ var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
15
15
  var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
16
16
  var GZIP_MIN_BYTES = 32 * 1024;
17
17
  var USER_SPEC_COOLDOWN_MS = 14 * 60 * 60 * 1e3;
18
- var PACKAGE_VERSION = "1.2.3";
18
+ var PACKAGE_VERSION = "1.2.5";
19
19
  var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
20
20
  var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
21
21
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ev-ai/agent-hook",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "Cross-runner runtime telemetry hook for Claude Code, Cursor, and Codex",
5
5
  "type": "module",
6
6
  "bin": {