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