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