@ev-ai/agent-hook 1.3.5 → 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 +1 -1
- package/README.md +1 -1
- package/dist/cli.mjs +40 -40
- package/dist/hook.mjs +35 -35
- package/dist/launcher-update.mjs +4 -4
- package/dist/launcher.mjs +6 -4
- package/dist/managed-hooks-snippet.cjs +1 -1
- package/dist/managed-hooks-snippet.mjs +1 -1
- package/dist/plugin-hooks.mjs +6 -7
- 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 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 nt=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],ar=new Set(nt),cr=/^\d+\.\d+\.\d+$/,ur=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,fr=/^[@A-Za-z0-9._/~-]{1,214}$/;function Ne(e){let t=tt(e);return t.ok?lr(t.value):t}function lr(e){if(!Ie(e))return{ok:!1,reason:m.INVALID_JSON};for(let f of Object.keys(e))if(!ar.has(f))return{ok:!1,reason:m.UNKNOWN_FIELD};for(let f of nt)if(!(f in e))return{ok:!1,reason:m.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!fr.test(t)||t.includes(".."))return{ok:!1,reason:m.INVALID_PACKAGE};let r=e.version;if(typeof r!="string"||!cr.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=dr(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!==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"||ur.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:r,url:n,sha512:s,size:c,node_engine:i,min_launcher_protocol:u}}}function Ie(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function dr(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(!mr(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 pr=new Set(["localhost","127.0.0.1","[::1]"]);function mr(e){return e.protocol==="https:"?!0:e.protocol==="http:"?pr.has(e.hostname):!1}var _r=["format","key_id","payload","signature"],yr=/^[A-Za-z0-9._-]{1,128}$/;function Er(e,t){return Buffer.concat([Ae,Buffer.from(e,"utf8"),Buffer.from([0]),Buffer.from(t)])}function v(e,t){if(!Ie(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 _r)if(!(f in e))return{ok:!1,reason:m.MISSING_FIELD};let n=e.key_id;if(typeof n!="string"||!yr.test(n))return{ok:!1,reason:m.INVALID_KEY_ID};let o=et(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 c=A(s),i=A(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=gr(null,Er(n,c),Ze(o),i)}catch{u=!1}return u?Ne(c):{ok:!1,reason:m.SIGNATURE_INVALID}}import{createHash as Sr,timingSafeEqual as Rr}from"node:crypto";function ne(e,t){if(e.byteLength!==t.size)return{ok:!1,reason:$.SIZE_MISMATCH};let r=A(t.sha512);if(r?.byteLength!==ee)return{ok:!1,reason:$.HASH_MISMATCH};let n=Sr("sha512").update(e).digest();return n.byteLength!==r.byteLength||!Rr(n,r)?{ok:!1,reason:$.HASH_MISMATCH}:{ok:!0}}var kr=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,br=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,xr=/^v?(\d+)\.(\d+)\.(\d+)/;function ot(e){let t=kr.exec(e);if(t)return{...Fe(t),prerelease:t[4]?.split(".")}}function it(e,t){let r=ot(e),n=ot(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:Or(r.prerelease,n.prerelease)}function oe(e,t){let r=it(e,t);return r!==void 0&&r>=0}function wr(e){let t=br.exec(e.trim());return t?Fe(t):void 0}function Fe(e){return{major:Number(e[1]),minor:Number(e[2]??0),patch:Number(e[3]??0)}}function ie(e,t){let r=wr(t),n=xr.exec(e.trim()),o=n?Fe(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 Or(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=Ar(o,s);if(a!==0)return a}return 0}function Ar(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 st="EV_AI_LAUNCHER_REFRESH_SCOPE";var at="EV_AI_HOOK_UPDATE_TTL_MIN",ct="--defer-user-spec",G="--cap";var ei=Buffer.from([1]);var ti=1024*1024,ri=4*1024*1024,ni=64*1024,oi=64*1024,ii=64*1024;var ut="handoff-",ft=6e4,D=1800,Pe=604800,lt=3e5,Le=4096,Me=4*1024*1024;import{randomBytes as Nr}from"node:crypto";import{basename as Ir,dirname as Fr,join as Te}from"node:path";import{open as dt,mkdir as Pr,readFile as Lr,readdir as Mr,rename as Tr,stat as Dr,rmdir as Hr,unlink as Cr,utimes as Ur}from"node:fs/promises";var se=new WeakMap;function De(e){if(e&&typeof e=="object"&&"code"in e)return e}function S(e){return De(e)?.code==="ENOENT"}function He(e){return De(e)?.code==="EEXIST"}function Br(e){let t=De(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function k(e,t){try{return await e.readdir(t)}catch(r){if(S(r))return[];throw r}}async function J(e,t){try{await e.unlink(t)}catch(r){if(!S(r))throw r}}async function ae(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 Ce(){return Nr(8).toString("hex")}function Vr(e){return e.startsWith(".")}async function Y(e,t,r){await Ue(e,t,r,Vr,36e5)}async function Ue(e,t,r,n,o){let s=await k(e,t);await Promise.all(s.map(async a=>{if(!n(a))return;let c=Te(t,a);try{let i=await e.stat(c);r-i.mtimeMs>o&&await e.unlink(c)}catch(i){if(!S(i))throw i}}))}async function N(e,t,r){let n=Fr(t),o=Ce(),s=`.${Ir(t)}.`,a=Te(n,`${s}${o}`),c=()=>e.unlink(a).catch(()=>{});await ae(e,a,r);try{await e.rename(a,t)}catch(i){if(!Br(i))throw await c(),i;let u=Te(n,`${s}bad.${o}`);try{await e.rename(t,u)}catch(f){if(!S(f))throw await c(),f}await e.rename(a,t)}await e.fsyncDir(n)}function I(){return{async open(e,t){let r=await dt(e,t),n={path:e};return se.set(n,r),n},async write(e,t){let r=pt(e),n=typeof t=="string"?Buffer.from(t,"utf8"):t;await r.write(n)},async fsync(e){await pt(e).sync()},async close(e){let t=se.get(e);se.delete(e),t&&await t.close()},rename:Tr,async readdir(e){return Mr(e)},readFile:Lr,async stat(e){let t=await Dr(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await Pr(e,t)},unlink:Cr,rmdir:Hr,utimes:Ur,async fsyncDir(e){if(process.platform==="win32")return;let t=await dt(e,"r");try{await t.sync()}finally{await t.close()}}}}function pt(e){let t=se.get(e);if(!t)throw new Error("closed");return t}function _(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!==T||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 Be(e){return z(e,".ev-ai","agent-hook","js","signed-v1")}function Ve(e){return z(Be(e),"scopes")}function b(e,t){return z(Ve(e),t)}function x(e){return z(e,"attempts")}function ce(e){return z(e,"scope.json")}function Ke(e){return String(e).padStart(10,"0")}var Kr=64;function w(e,t){return X(Be(e),t?"dev-artifacts":"artifacts")}function je(e,t){return X(e,t)}function R(e,t){return X(e,t,"hook.mjs")}function ue(e,t){return X(e,t,"release.json")}function jr(e,t){return X(e,t,"health.json")}function F(e){return _t("sha512").update(e).digest("hex")}function $e(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==Kr||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>Me?"bad":F(await e.readFile(t))===r?"ok":"bad"}catch(n){if(S(n))return"missing";throw n}}async function U(e,t,r,n,o,s,a=process.version){let[c,i,u]=await Promise.all([gt(e,R(t,r)),gt(e,ue(t,r)),$r(e,jr(t,r))]);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>Me)return{usable:!1,reason:"hash_mismatch"};let p=_t("sha512").update(c).digest();if(p.toString("hex")!==r)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,n))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(r){if(S(r))return;throw r}}async function $r(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 yt}from"node:path";var Gr=/^(\d{10})$/,Jr=/^(\d{10})\.done$/,Yr=/^[0-9a-f]{128}$/,zr=64;function P(e){let t=e[at];if(t===void 0||t==="")return D;let r=Number(t);return!Number.isInteger(r)||r<=0?D:Math.min(Math.max(D,r*60),Pe)}async function y(e,t,r=!1){let n=x(t),o=await k(e,n),s=new Map,a=new Map,c=Et(o,Gr),i=Et(o,Jr),u=async l=>{let p=await Rt(e,yt(n,fe(l)));return p&&s.set(l,{record:Xr(p.value),mtimeMs:p.mtimeMs}),p!==void 0},f=async l=>{let p=qr((await Rt(e,yt(n,le(l))))?.value);return p&&a.set(l,p),p!==void 0};if(!r)return await Promise.all([...c.map(u),...i.map(f)]),{claims:s,dones:a};await Promise.all([St(c,u),St(i,f)]);let d=O(s);return d<O(a)&&i.includes(d)&&await f(d),{claims:s,dones:a}}function Et(e,t){return e.flatMap(r=>{let n=t.exec(r);return n?[Number(n[1])]:[]})}async function St(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 c=n>0?e.claims.get(n):void 0,i=c?Wr(c):void 0,u=n>0?e.dones.get(n):void 0,f=Ge(u?.interval_s,r),d=i!==void 0?i+f*1e3:void 0,l=i!==void 0&&i-t>lt;return{latest:n,startMs:i,intervalS:f,deadlineMs:d,selection:s,lastOutcome:a,futureDated:l,highestDone:o}}function Wr(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 Ke(e)}function le(e){return`${Ke(e)}.done`}function Ge(e,t){return typeof e!="number"||!Number.isFinite(e)||e<=0?Math.max(D,t):Math.min(Math.max(Math.floor(e),D,t),Pe)}async function Rt(e,t){let r;try{r=await e.stat(t)}catch(o){if(S(o))return;throw o}let n=r.mtimeMs;if(r.size===0||r.size>Le)return{mtimeMs:n};try{let o=await e.readFile(t);return o.byteLength===0||o.byteLength>Le?{mtimeMs:n}:{mtimeMs:n,value:JSON.parse(o.toString("utf8"))}}catch{return{mtimeMs:n}}}function Xr(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 qr(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=Qr(t.selection);if(r)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:r}}function Qr(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"&&Yr.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&Zr(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function Zr(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==zr||t.toString("base64")!==e))return t.toString("hex")}import{join as de}from"node:path";async function pe(e,t,r){let n=x(t);await e.mkdir(n,{recursive:!0}),await Y(e,n,r.nowMs);let o=L(await y(e,t,!0),r.nowMs,r.ttlFloorS);return o.futureDated?kt(e,t,{...r,resync:!0,n:o.latest+1}):o.deadlineMs!==void 0&&r.nowMs<o.deadlineMs?{kind:"too_soon",deadlineMs:o.deadlineMs,latest:o.latest}:kt(e,t,{...r,n:o.latest+1})}var me={kind:"bundled",why:"bootstrap_failed"};function he(e,t,r,n,o,s){return(a,c,i)=>rn(e,t,{n:r.n,startedAtMs:r.startedAtMs,nowMs:n(),budgetMs:o,intervalS:Ge(i,s),outcome:a,selection:c})}async function rn(e,t,r){if(r.nowMs-r.startedAtMs>r.budgetMs+3e4)return{recorded:!1,why:"expired"};let n=await y(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 Y(e,x(t),r.nowMs),await N(e,de(x(t),le(r.n)),JSON.stringify(o)),await nn(e,t,r.n),{recorded:!0}}async function nn(e,t,r){let n=await y(e,t),o=r-8,s=O(n.dones),a=x(t),c=new Set([...n.claims.keys(),...n.dones.keys()]);await Promise.all([...c].map(async i=>{i>=o||i!==s&&(await J(e,de(a,fe(i))),await J(e,de(a,le(i))))}))}async function kt(e,t,r){if(r.n<1||r.n>9999999999)return{kind:"lost"};let n=x(t),o=de(n,fe(r.n)),s=new Date(r.nowMs).toISOString(),a=Ce(),c={started_at:s,nonce:a,owner:r.owner};r.resync&&(c.resync=!0);try{await ae(e,o,JSON.stringify(c)),await e.fsyncDir(n)}catch(i){if(He(i))return{kind:"lost"};throw i}return r.collectorRedacted!==void 0&&await on(e,t,r.collectorRedacted,r.dev===!0),O((await y(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 on(e,t,r,n){let o=ce(t);try{await ae(e,o,Buffer.from(JSON.stringify({collector:r,dev:n}),"utf8")),await e.fsyncDir(t)}catch(s){if(He(s))return;throw s}}import{readFileSync as vn}from"node:fs";import{homedir as Nn}from"node:os";import{join as In}from"node:path";import{createHash as sn}from"node:crypto";import{access as an,readFile as cn,stat as un}from"node:fs/promises";import{homedir as fn}from"node:os";import{dirname as ln,join as Je,parse as dn,resolve as xt}from"node:path";function bt(e){return e.charCodeAt(0)===65279?e.slice(1):e}var pn="https://hooks.ev-ai.ai",mn=".claude/ev-ai-runtime-report.json",hn="config.json";var gn=1024*1024,It=new Set(["localhost","127.0.0.1","[::1]","::1"]),_n=["claude","cursor","codex"],yn=[mn,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],wt=/^[A-Za-z0-9._~-]+$/;function En(e){return e!==void 0&&_n.includes(e)}function Ot(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 r=e[t+1];return r&&!r.startsWith("--")?{value:r,next:t+1}:{next:t}}function Sn(e){let t,r,n,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&&(n=u.value),c=u.next;continue}if(i.startsWith("--url=")){n=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=Ot(u.value)??a,c=u.next;continue}if(i.startsWith(`${G}=`)){a=Ot(i.slice(G.length+1))??a;continue}i!==ct&&!i.startsWith("-")&&r===void 0&&(r=i)}}return{runner:En(t)?t:void 0,event:r,collectorUrl:n,orgToken:o,baseUrl:s,...a!==void 0?{cap:a}:{}}}function Ft(e,t=pn){let r=t.replace(/\/+$/,""),n=e.trim();return`${r}/${n}/hook`}function Ye(e=fn()){return Je(e,".ev-ai",hn)}function Rn(e,t){return{...e,...t}}function At(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 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 r=new URL(e).pathname.split("/").filter(n=>n.length>0);if(r.length>=2&&r[r.length-1]==="hook"){let n=r[r.length-2];return n&&n.length>0?n:void 0}return}catch{return}}function ge(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!Pt(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let r=Lt(e);if(!r)return`must end with /{orgToken}/hook (got: ${e})`;if(!wt.test(r))return`org token must match ${wt.source} (got: ${r})`;if(At(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(At(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function Mt(e){return new URL(e).toString()}function vt(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?Ft(r):""}function B(e){try{return It.has(new URL(e).hostname)}catch{return!1}}function Tt(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 kn(e){let t=e.collectorUrl?.trim(),r;if(t)r=t;else{let o=e.orgToken?.trim();o&&(r=Ft(o,e.baseUrl?.trim()??void 0))}if(!r)return{};let n=ge(r);return n?{problem:n}:{url:Mt(r)}}var bn="CLAUDE_PLUGIN_OPTION_COLLECTOR_URL";function xn(e){let t=e[bn]?.trim();if(!t)return{};let r=ge(t);return r?{problem:r}:{url:Mt(t)}}var ze={access:an,stat:un,readFile:(e,t)=>cn(e,t)};async function wn(e,t,r=ze){let n=xt(e),{root:o}=dn(n);for(;;){let a=Je(n,".git");try{let i=await r.stat(a);if(i.isDirectory()||i.isFile())return n}catch{}if(n===o)break;let c=ln(n);if(c===n)break;n=c}let s=t.CURSOR_PROJECT_DIR??t.CLAUDE_PROJECT_DIR;if(s)try{if((await r.stat(s)).isDirectory())return s}catch{}return xt(e)}async function Q(e,t=ze){try{let r=await t.stat(e);if(!r.isFile()||r.size>gn)return;let n=await t.readFile(e,"utf8"),o=JSON.parse(bt(n));return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function Nt(e,t){return(await Promise.all(yn.map(async n=>{let o=Je(e,n);try{return await t.access(o),o}catch{return}}))).find(n=>n!==void 0)}async function Dt(e){let t=e.fs??ze,r=kn(Sn(e.argv));if(r.url)return{url:r.url,source:"argv"};let n=()=>{let l=xn(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 Q(o,t),p=l?vt(l):"";return p?{url:p,source:"manifest_override"}:n()}catch{}let s=await wn(e.cwd,e.env,t),a=Ye(e.home),[c,i]=await Promise.all([Q(a,t),Nt(s,t).then(async l=>l??Nt(e.cwd,t))]),u=i?await Q(i,t):void 0,f;c&&u?f=Rn(u,c):c?f=c:u&&(f=u);let d=f?vt(f):"";return d?{url:d,source:"manifest"}:n()}function Ht(e){if(ge(e))return;let t;try{t=new URL(e)}catch{return}let r=Lt(e);if(!r)return;let o=t.pathname.split("/").filter(c=>c.length>0).slice(0,-2),s=o.length>0?`/${o.join("/")}`:"",a=`${t.origin}${s}/${r}`;return sn("sha256").update(a).digest("hex").slice(0,32)}var On=/^[A-Za-z0-9._~-]+$/;function Ct(e,t){if(!On.test(t)||ge(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&&Pt(o.toString()))return o.toString()}function Ut(e){return Ct(e,"version")}function Bt(e){return Ct(e,"error-report")}var Kt=/^[A-Za-z0-9._-]{8,64}$/;function Fn(e,t){try{let n=vn(In(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"&&Kt.test(s))return s}}catch{}let r=t.EV_AI_HOOK_INSTALLATION_ID?.trim();return r&&Kt.test(r)?r:void 0}async function _e(e,t,r,n,o){if(!t.startsWith("failed:")||!n.postJson)return;let s=Bt(e);if(!s)return;let a;try{a=Fn(o?.home??Nn(),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 Pn from"node:http";import Ln from"node:https";import{URL as Mn}from"node:url";function ye(){return{getBounded:jt,postJson:Hn}}function Ee(e,t){return e==="timeout"||e==="network"?"failed:timeout":e==="http_3xx"?"failed:http_3xx":t}function jt(e,t){let r;try{r=new Mn(e)}catch{return Promise.resolve({ok:!1,reason:"origin_rejected"})}if(r.protocol==="http:"){if(!B(e))return Promise.resolve({ok:!1,reason:"origin_rejected"})}else if(r.protocol!=="https:")return Promise.resolve({ok:!1,reason:"origin_rejected"});let n=r.protocol==="http:"?Pn:Ln;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=n.request(r,{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 Tn=2048,Dn=1024;function Hn(e,t,r){let n;try{n=Buffer.from(JSON.stringify(t),"utf8")}catch{return Promise.resolve({ok:!1,reason:"network"})}return n.byteLength>Tn?Promise.resolve({ok:!1,reason:"too_large"}):jt(e,{maxBytes:Dn,timeoutMs:r.timeoutMs,signal:r.signal,method:"POST",body:n,headers:{"content-type":"application/json","content-length":n.byteLength}})}function Cn(e){return Q(Ye(e))}async function Z(e,t,r=Cn(t)){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await r)?.auto_update===!1}function We(e){return!!e.CURSOR_SANDBOX}function Se(e,t,r,n){return{source:"bundled",hookPath:e.bundledHookPath,fallbackReason:t,scopeId:r?.scopeId,dev:r?.dev,...n}}import{join as Bn}from"node:path";var qe=/^[0-9a-f]{128}$/;function Vn(e){return Buffer.from(JSON.stringify({format:e.format,key_id:e.key_id,payload:e.payload,signature:e.signature}),"utf8")}async function Re(e,t,r,n,o,s,a,c){if(!qe.test(r)||F(n)!==r)return{ok:!1,reason:"repair_failed"};let i=je(t,r);await e.mkdir(i,{recursive:!0}),await Y(e,i,a);let u=R(t,r),f=ue(t,r),d=Vn(o);if(await C(e,u,r)==="ok"){let p=await Kn(e,f);if(p?.equals(d))return await Xe(e,t,r),{ok:!0};let h=await jn(p,c);return h!==void 0&&h!==s.version?{ok:!1,reason:"metadata_conflict"}:(await N(e,f,d),await Xe(e,t,r),{ok:!0})}return await N(e,u,n),await N(e,f,d),await C(e,u,r)!=="ok"?{ok:!1,reason:"repair_failed"}:(await Xe(e,t,r),{ok:!0})}async function Gt(e,t,r){let n=$e(r.sha512);if(!(n===void 0||!qe.test(n)))return await C(e,R(t,n),n)==="ok"?n:void 0}async function Kn(e,t){try{return await e.readFile(t)}catch{return}}async function jn(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,H(t));return n.ok?n.manifest.version:void 0}async function Xe(e,t,r){try{let o=(await k(e,t)).filter(i=>qe.test(i));if(o.length<=8)return;let s=o.filter(i=>i!==r),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=>$n(e,t,i.name)))}catch{}}async function $n(e,t,r){let n=je(t,r);try{let o=await k(e,n);await Promise.all(o.map(s=>J(e,Bn(n,s)))),await e.rmdir(n)}catch{}}function ke(e,t){return{launcher:e,protocol:String(1),current:t,platform:`${process.platform}-${process.arch}`,node:process.version,update_format:M}}function Jn(e,t,r=H(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:Wn(n.check_interval_s)}};let o=v(n,r);if(!o.ok)return{ok:!1,reason:"failed:metadata_mismatch"};let s=zn(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:Yn(n)}}:{ok:!1,reason:"failed:origin_rejected"}}async function Jt(e,t,r,n,o,s){let a=Xn(e,t),c=await n.getBounded(a,{maxBytes:4096,timeoutMs:r,signal:s});if(!c.ok)return{ok:!1,reason:Ee(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 Jn(f,o)}function Yn(e){return{format:M,key_id:String(e.key_id),payload:String(e.payload),signature:String(e.signature)}}function zn(e,t){let r;try{r=new URL(e)}catch{return}if(r.username!==""||r.password!==""||r.search!==""||r.hash!==""||r.pathname.includes(".."))return;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(r.pathname)?.[1];if(o&&(r.protocol==="https:"||t&&r.protocol==="http:"&&B(e)))return o}function Wn(e){if(typeof e=="number"&&Number.isInteger(e)&&e>0)return e}function Xn(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 be(e,t,r,n,o,s){let a=Ut(e);return a?Jt(a,t,r,n,o,s):{ok:!1,reason:"failed:origin_rejected"}}async function xe(e,t,r,n,o,s,a,c,i,u){let{manifest:f,envelope:d}=n;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 Gt(e,r,f);if(l){let h=await U(e,r,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=R(r,l);if(await C(e,g,l)==="ok"){let V=await e.readFile(g),K=await Re(e,r,l,V,d,f,s,i);return K.ok?{ok:!0,digest:l,reused:!0}:{ok:!1,reason:`failed:${K.reason}`}}}}let p=await qn(e,r,n,u,s,i);return p||Qn(e,t,r,n,s,a,c,i)}async function qn(e,t,r,n,o,s){if(n.length!==0)try{let a=await e.readFile(n);if(!ne(a,r.manifest).ok)return;let c=F(a),i=await Re(e,t,c,a,r.envelope,r.manifest,o,s);return i.ok?{ok:!0,digest:c,reused:!1}:{ok:!1,reason:`failed:${i.reason}`}}catch{return}}async function Qn(e,t,r,n,o,s,a,c){let{manifest:i,envelope:u}=n,f=await t.getBounded(i.url,{maxBytes:i.size,timeoutMs:s,signal:a});if(!f.ok)return{ok:!1,reason:Ee(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(!ne(d,i).ok)return{ok:!1,reason:"failed:integrity_mismatch"};let p=F(d),h=await Re(e,r,p,d,u,i,o,c);return h.ok?{ok:!0,digest:p,reused:!1}:{ok:!1,reason:`failed:${h.reason}`}}async function to(e){let t=e.fs??I(),r=e.http??ye(),n=b(e.home,e.scope.scopeId),o=w(e.home,e.scope.dev),s=P(e.env),a=AbortSignal.timeout(3e3),c=await pe(t,n,{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 Se(e,h?"bootstrap_in_progress":"bootstrap_failed",e.scope,{didBootstrap:!1})}let i=he(t,n,c,()=>Date.now(),3e3,s),u=async h=>(await i(h,me),Se(e,"bootstrap_failed",e.scope,{didBootstrap:!0}));if(a.aborted)return u("failed:bootstrap");let f=await be(e.scope.collectorUrl,ke(e.bundledVersion,e.bundledVersion),1e3,r,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),Se(e,"server",e.scope,{didBootstrap:!0});let l=await xe(t,r,o,{manifest:d.manifest,envelope:d.envelope},e.bundledVersion,e.nowMs,2e3,a,e.scope.dev,e.bundledHookPath);if(!l.ok)return _e(e.scope.collectorUrl,l.reason,"bootstrap",r,{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:R(o,p),scopeId:e.scope.scopeId,digest:p,dev:e.scope.dev,didBootstrap:!0}}async function we(e,t){let r=await Dt({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!r.url)return;let n=Ht(r.url);if(!(!n||r.source==="none"))return{scopeId:n,collectorUrl:r.url,collectorUrlRedacted:Tt(r.url),source:r.source,dev:B(r.url)}}async function oo(e,t,r,n,o){try{await io(e,t,r,n,o)}catch{}return 0}async function io(e,t,r,n,o){if(We(t)||await Z(t,n))return;let s=t[st],a=await we(e,{env:t,cwd:r,home:n});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=b(n,a.scopeId);await Ue(c,d,u,er=>er.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 y(c,d,!0),u,f).selection,V=g.kind==="uninitialized"?me:g,K=AbortSignal.timeout(6e4),Oe=await be(a.collectorUrl,ke(h,g.kind==="cached"?g.version:h),5e3,i,a.dev,K);if(!Oe.ok){await p(Oe.reason,V);return}let E=Oe.directive;if(E.kind==="none"){await p("no_directive",V);return}if(E.kind==="bundled"){await p("bundled",{kind:"bundled",why:"server"},E.intervalS);return}let j=await xe(c,i,w(n,a.dev),{manifest:E.manifest,envelope:E.envelope},h,u,3e4,K,a.dev,o?.bundledHookPath??"");if(!j.ok){_e(a.collectorUrl,j.reason,"refresh",i,{home:n,env:t}),await p(j.reason,V);return}let Qt=g.kind==="cached"&&g.version===E.manifest.version&&g.sha512===E.manifest.sha512,{digest:Zt}=j;await p(Qt?j.reused?"current":"repaired":"updated",{kind:"cached",digest:Zt,version:E.manifest.version,sha512:E.manifest.sha512})}function so(e){return`${e.slice(0,4)}\u2026`}async function ao(e,t,r){let n=e.includes("--json"),o=e.includes("--all"),s=e.slice(1).filter(p=>p!=="--json"&&p!=="--all"),a=await we(s,t),c=await Z(t.env,t.home),i=I(),u=await qt(t,r,a,i,c),f=await co(i,t.home,a?.scopeId),d=o?await uo(t,r,i,c,f):[];if(n)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,7 +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 qe=["package","version","url","sha512","size","node_engine","min_launcher_protocol"],Cn=new Set(qe),Pn=/^\d+\.\d+\.\d+$/,Ln=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,Tn=/^[@A-Za-z0-9._/~-]{1,214}$/;function pe(e){let t=ze(e);return t.ok?Fn(t.value):t}function Fn(e){if(!me(e))return{ok:!1,reason:p.INVALID_JSON};for(let f of Object.keys(e))if(!Cn.has(f))return{ok:!1,reason:p.UNKNOWN_FIELD};for(let f of qe)if(!(f in e))return{ok:!1,reason:p.MISSING_FIELD};let t=e.package;if(typeof t!="string"||!Tn.test(t)||t.includes(".."))return{ok:!1,reason:p.INVALID_PACKAGE};let n=e.version;if(typeof n!="string"||!Pn.test(n))return{ok:!1,reason:p.INVALID_VERSION};let r=e.url;if(typeof r!="string")return{ok:!1,reason:p.INVALID_URL};let o=Dn(r,n);if(o!==void 0)return{ok:!1,reason:o};let c=e.sha512;if(typeof c!="string")return{ok:!1,reason:p.INVALID_SHA512};if(F(c)?.byteLength!==le)return{ok:!1,reason:p.INVALID_SHA512};let i=e.size;if(typeof i!="number"||!Number.isInteger(i)||i<1||i>4194304)return{ok:!1,reason:p.INVALID_SIZE};let s=e.node_engine;if(typeof s!="string"||Ln.exec(s)===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:c,size:i,node_engine:s,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 Dn(e,t){if(e.includes("..")||/%2e/i.test(e)||/[\\?#]/.test(e))return p.INVALID_URL;let n;try{n=new URL(e)}catch{return p.INVALID_URL}if(n.href!==e)return p.INVALID_URL;if(!Mn(n))return p.INVALID_URL;if(n.username!==""||n.password!=="")return p.INVALID_URL;if(n.search!==""||n.hash!=="")return p.INVALID_URL;if(n.hostname===""||n.pathname.includes(".."))return p.INVALID_URL;let o=/\/(\d+\.\d+\.\d+)\/hook\.mjs$/.exec(n.pathname)?.[1];if(o===void 0)return p.INVALID_URL;if(o!==t)return p.URL_VERSION_MISMATCH}var Hn=new Set(["localhost","127.0.0.1","[::1]"]);function Mn(e){return e.protocol==="https:"?!0:e.protocol==="http:"?Hn.has(e.hostname):!1}var Vn=["format","key_id","payload","signature"],Kn=/^[A-Za-z0-9._-]{1,128}$/;function jn(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:p.INVALID_ENVELOPE};if(e.format!==ue)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 Vn)if(!(f in e))return{ok:!1,reason:p.MISSING_FIELD};let r=e.key_id;if(typeof r!="string"||!Kn.test(r))return{ok:!1,reason:p.INVALID_KEY_ID};let o=We(t,r);if(o===void 0)return{ok:!1,reason:p.UNKNOWN_KEY};let c=e.payload,a=e.signature;if(typeof c!="string"||typeof a!="string")return{ok:!1,reason:p.INVALID_ENVELOPE};let i=F(c),s=F(a);if(i===void 0||s===void 0)return{ok:!1,reason:p.NON_CANONICAL_BASE64};if(s.byteLength!==$e)return{ok:!1,reason:p.INVALID_SIGNATURE_LENGTH};let u=!1;try{u=Bn(null,jn(r,i),Ye(o),s)}catch{u=!1}return u?pe(i):{ok:!1,reason:p.SIGNATURE_INVALID}}var Jn=/^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?$/,$n=/^>=(\d+)(?:\.(\d+)(?:\.(\d+))?)?$/,Yn=/^v?(\d+)\.(\d+)\.(\d+)/;function Ze(e){let t=Jn.exec(e);if(t)return{..._e(t),prerelease:t[4]?.split(".")}}function ge(e,t){let n=Ze(e),r=Ze(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:zn(n.prerelease,r.prerelease)}function Qe(e,t){let n=ge(e,t);return n!==void 0&&n>=0}function Wn(e){let t=$n.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 et(e,t){let n=Wn(t),r=Yn.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 zn(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 a=Xn(o,c);if(a!==0)return a}return 0}function Xn(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",$="EV_AI_HOOK_FALLBACK_REASON",Y="EV_AI_LAUNCHER_SCOPE",Re="EV_AI_LAUNCHER_READY_FD",W="EV_AI_LAUNCHER_REFRESH_SCOPE",z="EV_AI_LAUNCHER_REFRESH_EVENT",tt="EV_AI_HOOK_UPDATE_TTL_MIN",nt="--defer-user-spec",D="--cap",rt="--url",ot=Buffer.from([1]),it='{"continue":true}',st=3e3,at=1024*1024,ct=4*1024*1024,xe=64*1024,Ae=64*1024,X=64*1024,ut=2e3,q=250,ft=8e3,be=14e3,lt=1e3,dt=1e3,pt=500,mt=500,ht=1e4,we="handoff-";var H=1800,ke=604800,gt=3e5,Ne=4096,Z=4*1024*1024,_t=2,yt=864e5;import{randomBytes as qn}from"node:crypto";import{basename as Zn,dirname as Qn,join as Et}from"node:path";import{open as St,mkdir as er,readFile as tr,readdir as nr,rename as rr,stat as or,rmdir as ir,unlink as sr,utimes as ar}from"node:fs/promises";var Q=new WeakMap;function xt(e){if(e&&typeof e=="object"&&"code"in e)return e}function L(e){return xt(e)?.code==="ENOENT"}function cr(e){let t=xt(e)?.code;return t==="EPERM"||t==="EBUSY"||t==="EACCES"}async function At(e,t){try{return await e.readdir(t)}catch(n){if(L(n))return[];throw n}}async function ur(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 fr(){return qn(8).toString("hex")}async function U(e,t,n){let r=Qn(t),o=fr(),c=`.${Zn(t)}.`,a=Et(r,`${c}${o}`),i=()=>e.unlink(a).catch(()=>{});await ur(e,a,n);try{await e.rename(a,t)}catch(s){if(!cr(s))throw await i(),s;let u=Et(r,`${c}bad.${o}`);try{await e.rename(t,u)}catch(f){if(!L(f))throw await i(),f}await e.rename(a,t)}await e.fsyncDir(r)}function ee(){return{async open(e,t){let n=await St(e,t),r={path:e};return Q.set(r,n),r},async write(e,t){let n=Rt(e),r=typeof t=="string"?Buffer.from(t,"utf8"):t;await n.write(r)},async fsync(e){await Rt(e).sync()},async close(e){let t=Q.get(e);Q.delete(e),t&&await t.close()},rename:rr,async readdir(e){return nr(e)},readFile:tr,async stat(e){let t=await or(e);return{mtimeMs:t.mtimeMs,size:t.size,isDirectory:()=>t.isDirectory()}},async mkdir(e,t){await er(e,t)},unlink:sr,rmdir:ir,utimes:ar,async fsyncDir(e){if(process.platform==="win32")return;let t=await St(e,"r");try{await t.sync()}finally{await t.close()}}}}function Rt(e){let t=Q.get(e);if(!t)throw new Error("closed");return t}function O(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var wt=Object.freeze({"test-key-1":bt("3SU59MnYNtXEjlWrtcg6kYpCuIg+mZBapne4x6Ao9vQ="),"test-key-2":bt("RoD7qRBoc0L26I5dWmV+pk8FQe4umOBMFfg6fIsl5UU=")});function bt(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 kt(e){return e?{...wt,...G}:G}import{join as te}from"node:path";function ve(e){return te(e,".ev-ai","agent-hook","js","signed-v1")}function lr(e){return te(ve(e),"scopes")}function B(e,t){return te(lr(e),t)}function Nt(e){return te(e,"attempts")}function Oe(e){return String(e).padStart(10,"0")}function ne(e,t){return V(ve(e),t?"dev-artifacts":"artifacts")}function dr(e,t){return V(e,t)}function re(e,t){return V(e,t,"hook.mjs")}function pr(e,t){return V(e,t,"release.json")}function Ce(e,t){return V(e,t,"health.json")}function Ct(e){return It("sha512").update(e).digest("hex")}async function Pe(e,t,n){try{let r=await e.readFile(n);if(r.byteLength<=0||r.byteLength>Z)return;let o=Ct(r),c=re(t,o);return await vt(e,c,o)==="ok"?o:(await e.mkdir(dr(t,o),{recursive:!0}),await U(e,c,r),await vt(e,c,o)==="ok"?o:void 0)}catch{return}}async function vt(e,t,n){try{let r=await e.stat(t);return r.size<=0||r.size>Z?"bad":Ct(await e.readFile(t))===n?"ok":"bad"}catch(r){if(L(r))return"missing";throw r}}async function Pt(e,t,n,r,o,c,a=process.version){let[i,s,u]=await Promise.all([Ot(e,re(t,n)),Ot(e,pr(t,n)),Le(e,Ce(t,n))]);if(i===void 0)return{usable:!1,reason:"artifact_missing"};if(s===void 0)return{usable:!1,reason:"signature_invalid"};let f;try{f=JSON.parse(s.toString("utf8"))}catch{return{usable:!1,reason:"signature_invalid"}}let m=he(f,kt(c));if(!m.ok)return{usable:!1,reason:"signature_invalid"};let{manifest:l}=m;if(i.byteLength!==l.size||i.byteLength>Z)return{usable:!1,reason:"hash_mismatch"};let d=It("sha512").update(i).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(!Qe(l.version,r))return{usable:!1,reason:"below_floor"};if(!et(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 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 Ot(e,t){try{return await e.readFile(t)}catch(n){if(L(n))return;throw n}}async function Le(e,t){try{let n=await e.readFile(t),r=JSON.parse(n.toString("utf8"));if(!O(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 mr}from"node:crypto";import{access as hr,readFile as gr,stat as _r}from"node:fs/promises";import{homedir as yr}from"node:os";import{dirname as Er,join as Te,parse as Sr,resolve as Tt}from"node:path";function Lt(e){return e.charCodeAt(0)===65279?e.slice(1):e}var Rr="https://hooks.ev-ai.ai",xr=".claude/ev-ai-runtime-report.json",Ar="config.json",br="max_concurrent_hooks",wr=1024*1024,Bt=new Set(["localhost","127.0.0.1","[::1]","::1"]),kr=["claude","cursor","codex"],Nr=[xr,".cursor/ev-ai-runtime-report.json",".codex/ev-ai-runtime-report.json"],Ft=/^[A-Za-z0-9._~-]+$/;function vr(e){return e!==void 0&&kr.includes(e)}function Fe(e){if(!e||typeof e!="object")return;let t=e[br];return typeof t=="number"&&Number.isSafeInteger(t)&&t>0?t:void 0}function Dt(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 De(e){let t,n,r,o,c,a;for(let i=0;i<e.length;i++){let s=e[i];if(s!==void 0){if(s==="--runner"){let u=K(e,i);t=u.value,i=u.next;continue}if(s.startsWith("--runner=")){t=s.slice(9);continue}if(s==="--url"){let u=K(e,i);u.value&&(r=u.value),i=u.next;continue}if(s.startsWith("--url=")){r=s.slice(6);continue}if(s==="--token"){let u=K(e,i);u.value&&(o=u.value),i=u.next;continue}if(s.startsWith("--token=")){o=s.slice(8);continue}if(s==="--base-url"){let u=K(e,i);u.value&&(c=u.value),i=u.next;continue}if(s.startsWith("--base-url=")){c=s.slice(11);continue}if(s===D){let u=K(e,i);a=Dt(u.value)??a,i=u.next;continue}if(s.startsWith(`${D}=`)){a=Dt(s.slice(D.length+1))??a;continue}s!==nt&&!s.startsWith("-")&&n===void 0&&(n=s)}}return{runner:vr(t)?t:void 0,event:n,collectorUrl:r,orgToken:o,baseUrl:c,...a!==void 0?{cap:a}:{}}}function Vt(e,t=Rr){let n=t.replace(/\/+$/,""),r=e.trim();return`${n}/${r}/hook`}function He(e=yr()){return Te(e,".ev-ai",Ar)}function Or(e,t){return{...e,...t}}function Ht(e){for(let t=0;t<e.length;t++){let n=e.charCodeAt(t);if(n<=32||n===127||n===39)return!0}return!1}function Ir(e){try{let t=new URL(e);return t.protocol==="https:"?!0:t.protocol==="http:"?Bt.has(t.hostname):!1}catch{return!1}}function Kt(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 Me(e){let t;try{t=new URL(e)}catch{return`invalid URL (got: ${e})`}if(!Ir(e))return`must be https (or http on localhost / 127.0.0.1 / ::1) (got: ${e})`;let n=Kt(e);if(!n)return`must end with /{orgToken}/hook (got: ${e})`;if(!Ft.test(n))return`org token must match ${Ft.source} (got: ${n})`;if(Ht(e))return`must not contain whitespace, control characters, or single quotes (got: ${e})`;if(Ht(t.pathname))return`pathname must not contain whitespace, control characters, or single quotes (got: ${e})`}function jt(e){return new URL(e).toString()}function Mt(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?Vt(n):""}function Gt(e){try{return Bt.has(new URL(e).hostname)}catch{return!1}}function Jt(e){try{let t=new URL(e),n=t.pathname.split("/").filter(r=>r.length>0);return n.length>=2&&n[n.length-1]==="hook"&&(n[n.length-2]="***",t.pathname=`/${n.join("/")}`),t.toString()}catch{return"<invalid-url>"}}function Cr(e){let t=e.collectorUrl?.trim(),n;if(t)n=t;else{let o=e.orgToken?.trim();o&&(n=Vt(o,e.baseUrl?.trim()??void 0))}if(!n)return{};let r=Me(n);return r?{problem:r}:{url:jt(n)}}var Pr="CLAUDE_PLUGIN_OPTION_COLLECTOR_URL";function Lr(e){let t=e[Pr]?.trim();if(!t)return{};let n=Me(t);return n?{problem:n}:{url:jt(t)}}var Ue={access:hr,stat:_r,readFile:(e,t)=>gr(e,t)};async function Tr(e,t,n=Ue){let r=Tt(e),{root:o}=Sr(r);for(;;){let a=Te(r,".git");try{let s=await n.stat(a);if(s.isDirectory()||s.isFile())return r}catch{}if(r===o)break;let i=Er(r);if(i===r)break;r=i}let c=t.CURSOR_PROJECT_DIR??t.CLAUDE_PROJECT_DIR;if(c)try{if((await n.stat(c)).isDirectory())return c}catch{}return Tt(e)}async function j(e,t=Ue){try{let n=await t.stat(e);if(!n.isFile()||n.size>wr)return;let r=await t.readFile(e,"utf8"),o=JSON.parse(Lt(r));return o===null||typeof o!="object"||Array.isArray(o)?void 0:o}catch{return}}async function Ut(e,t){return(await Promise.all(Nr.map(async r=>{let o=Te(e,r);try{return await t.access(o),o}catch{return}}))).find(r=>r!==void 0)}async function $t(e){let t=e.fs??Ue,n=Cr(De(e.argv));if(n.url)return{url:n.url,source:"argv"};let r=()=>{let l=Lr(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?Mt(l):"";return d?{url:d,source:"manifest_override"}:r()}catch{}let c=await Tr(e.cwd,e.env,t),a=He(e.home),[i,s]=await Promise.all([j(a,t),Ut(c,t).then(async l=>l??Ut(e.cwd,t))]),u=s?await j(s,t):void 0,f;i&&u?f=Or(u,i):i?f=i:u&&(f=u);let m=f?Mt(f):"";return m?{url:m,source:"manifest"}:r()}function Yt(e){if(Me(e))return;let t;try{t=new URL(e)}catch{return}let n=Kt(e);if(!n)return;let o=t.pathname.split("/").filter(i=>i.length>0).slice(0,-2),c=o.length>0?`/${o.join("/")}`:"",a=`${t.origin}${c}/${n}`;return mr("sha256").update(a).digest("hex").slice(0,32)}import{readFile as Fr,stat as Dr}from"node:fs/promises";import{join as zt}from"node:path";var Hr=4,Mr=10;function Xt(e=process.platform){return e==="win32"?Hr:Mr}var Ur=6e4,Wt=2e3,Br="slots",Vr=64;function qt(e){return zt(e,".ev-ai","agent-hook",Br)}function Kr(e,t){return zt(e,`slot-${t}`)}function jr(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return t.code==="EPERM"}}var Gr=/^(\d+)\n(\d+)\n$/;function Jr(e){let t=Gr.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 $r(e,t,n){let r=Jr(e);if(!r)return Math.abs(n-t)<Wt;let o=n-r.acquiredAtMs;return o<-Wt||o>=Ur?!1:jr(r.pid)}async function Yr(e,t){try{let n=await Dr(e);if(!n.isFile())return!1;let r=n.size<=Vr?await Fr(e,"utf8"):"";return $r(r,n.mtimeMs,t)}catch{return!1}}async function Zt(e,t,n){for(let r=0;r<e;r+=1)if(!await Yr(Kr(t,r),n()))return!0;return e<=0}function Be(e){return j(He(e))}async function oe(e,t,n=Be(t)){return e.EV_AI_AUTO_UPDATE==="0"?!0:(await n)?.auto_update===!1}function Qt(e){return`${D}=${Fe(e)??0}`}function Ve(e){return Fe(e)??Xt()}function M(e){return!!e.CURSOR_SANDBOX}async function en(e,t,n,r,o,c){if(M(c))return;let a=Ce(t,n),i=await Le(e,a),s=i?.consecutive_startup_failures??0;if(!r){s>0&&await U(e,a,JSON.stringify({consecutive_startup_failures:0}));return}let u={consecutive_startup_failures:s+1};s+1>=_t?u.quarantined_until=new Date(o+yt).toISOString():i?.quarantined_until&&(u.quarantined_until=i.quarantined_until),await U(e,a,JSON.stringify(u))}function Wr(e,t){return new Promise(n=>{try{e.write(t,()=>n())}catch{n()}})}function tn(e){let t=e.now(),n=be,r=!1,o=Promise.resolve(),c,a=!1,i=[],s,u,f,m=()=>Math.max(0,t+n-e.now()),l=[],d=(_,b)=>{if(e.installProcessHandlers===!1)return;(e.on??((P,R)=>process.on(P,R)))(_,b),l.push({event:_,handler:b})},h=()=>{let _=e.off??((b,v)=>process.off(b,v));for(let{event:b,handler:v}of l)try{_(b,v)}catch{}l.length=0},E=_=>(r||(r=!0,o=Wr(e.stdout,_??it)),o),S=_=>{if(c)try{c.kill(_)}catch{}},N=()=>{for(let _ of i)try{_()}catch{}},A=()=>{a||(N(),S("SIGTERM"),u=e.setTimeout(()=>{S("SIGKILL")},q),E())},x=()=>{E().finally(()=>{e.exit(0)})},I=()=>{a||(N(),x())},C=()=>{s&&e.clearTimeout(s),f&&e.clearTimeout(f),s=e.setTimeout(A,m());let _=Math.max(0,t+n+lt-e.now());f=e.setTimeout(I,_)};C(),d("uncaughtException",x),d("unhandledRejection",x);for(let _ of["SIGTERM","SIGINT"])d(_,()=>{S(_),x()});return{ackOnce:E,remainingMs:m,eventBudgetMs:()=>n,onEventClassified(_){let b=_?be:ft;b<n&&(n=b,C())},setChild(_){c=_},onAbort(_){i.push(_)},dispose(){a=!0,s&&e.clearTimeout(s),u&&e.clearTimeout(u),f&&e.clearTimeout(f),h()},waitForAckWrite(){return o}}}function zr(e){let t=e.trim();if(t)try{let n=JSON.parse(t);return O(n)?n:void 0}catch{return}}function nn(e,t,n,r){if(!t||n!==0||r)return;let o=e.toString("utf8");if(zr(o)!==void 0)return o.trim()}var rn=[ye,Ee,Y,Re,Se,$];function Ke(e){return Buffer.isBuffer(e)?e:Buffer.from(e)}function Xr(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[$]=t.fallbackReason:delete r[$],t.scopeId?r[Y]=t.scopeId:delete r[Y],r}function qr(e){let t=e.stdio[3];if(t&&typeof t=="object"&&"on"in t)return t}async function je(e,t,n,r,o,c,a="live"){let i;try{i=o.spawn(o.execPath,[e.hookPath,...t],{cwd:o.cwd,env:Xr(o,e,c),stdio:["pipe","pipe","pipe","pipe"],windowsHide:!0})}catch{return{outcome:"spawn_failed",ready:!1}}r.setChild(i);let s=!1,u=i.stdout,f=i.stderr,m=i.stdin,l=qr(i);if(!u||!f||!m){try{i.kill("SIGKILL")}catch{}return n.stopChildWrites(),r.setChild(void 0),{outcome:"spawn_failed",ready:!1}}a==="replay"?n.replayTo(m):n.attachChild(m);let d="pending",h=Buffer.alloc(0),E=!1,S=!1,N=!1,A=0,x=null,I=!1,C=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=>{C(Ke(R))}),u.on("end",()=>{S=!0}),u.on("error",()=>{N=!0,S=!0}),f.on("data",R=>{if(A>=Ae)return;let w=Ke(R),g=Ae-A,y=w.length>g?w.subarray(0,g):w;A+=y.length;try{o.stderr.write(y)}catch{}}),f.resume(),l?(l.on("data",R=>{d==="pending"&&Ke(R).includes(ot[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"||I))try{i.kill("SIGKILL")}catch{}},ut);await new Promise(R=>{let w=!1,g=()=>{w||(w=!0,R())};i.once("exit",y=>{I=!0,x=y,g()}),i.once("error",()=>{s=!0,I=!0,g()})}),n.stopChildWrites(),o.clearTimeout(_);let b=Math.min(q,Math.max(0,r.remainingMs()));await new Promise(R=>{let w=()=>d!=="pending"&&S;if(w()){R();return}let g=o.setTimeout(()=>R(),b),y=()=>{w()&&(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),s)return{outcome:"spawn_failed",ready:!1};let v=d==="byte",P=nn(h,v,x,E||N);return P!==void 0?(await r.ackOnce(P),{outcome:"success",ready:!0}):d==="eof"?{outcome:"startup_failure",ready:!1}:{outcome:"runtime_failure",ready:v}}function Zr(e){let t=e.charAt(0);return t!==""&&t.toLowerCase()===t}function Qr(e,t){let n=e.toLowerCase();return n==="sessionend"||n==="stopfailure"||n==="subagentstop"?!0:n==="stop"&&t==="codex"}var eo=new Set(["sessionstart","stop","sessionend","stopfailure","session_start","session_end"]);function on(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,isCapped:!1};let o=De(e),c=o.event??"",a=o.runner??"";try{let s=JSON.parse(t);O(s)&&(!c&&typeof s.hook_event_name=="string"?c=s.hook_event_name:!c&&typeof s.event=="string"&&(c=s.event),!a&&(typeof s.conversation_id=="string"||Zr(c))&&(a="cursor"))}catch{}let i=c.toLowerCase();return{isSessionStart:i==="sessionstart",isInProcess:r||Qr(c,a),isCapped:i!==""&&!eo.has(i)}}import{readFile as to}from"node:fs/promises";import{fileURLToPath as no}from"node:url";async function sn(e){let t=no(new URL("../package.json",e)),n=await to(t,"utf8"),r=JSON.parse(n);return{version:typeof r.version=="string"?r.version:"",evAi:{launcherProtocol:Ge(r.evAi?.launcherProtocol),minLauncherProtocol:Ge(r.evAi?.minLauncherProtocol),launcherRevision:Ge(r.evAi?.launcherRevision)}}}function Ge(e){return typeof e=="number"&&Number.isInteger(e)?e:0}var ro=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||ro.has(t)?"cli":"hook"}async function an(e,t){let n=await $t({argv:e,env:t.env,cwd:t.cwd,home:t.home});if(!n.url)return;let r=Yt(n.url);if(!(!r||n.source==="none"))return{scopeId:r,collectorUrl:n.url,collectorUrlRedacted:Jt(n.url),source:n.source,dev:Gt(n.url)}}import{join as cn}from"node:path";var oo=/^(\d{10})$/,io=/^(\d{10})\.done$/,so=/^[0-9a-f]{128}$/,ao=64;function dn(e){let t=e[tt];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 pn(e,t,n=!1){let r=Nt(t),o=await At(e,r),c=new Map,a=new Map,i=un(o,oo),s=un(o,io),u=async l=>{let d=await ln(e,cn(r,uo(l)));return d&&c.set(l,{record:po(d.value),mtimeMs:d.mtimeMs}),d!==void 0},f=async l=>{let d=mo((await ln(e,cn(r,fo(l))))?.value);return d&&a.set(l,d),d!==void 0};if(!n)return await Promise.all([...i.map(u),...s.map(f)]),{claims:c,dones:a};await Promise.all([fn(i,u),fn(s,f)]);let m=se(c);return m<se(a)&&s.includes(m)&&await f(m),{claims:c,dones:a}}function un(e,t){return e.flatMap(n=>{let r=t.exec(n);return r?[Number(r[1])]:[]})}async function fn(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 mn(e,t,n){let r=se(e.claims),o=se(e.dones),c=r===0?{kind:"uninitialized"}:{kind:"bundled",why:"bootstrap_failed"},a;if(o>0){let d=e.dones.get(o);d&&(c=d.selection,a=d.outcome)}let i=r>0?e.claims.get(r):void 0,s=i?co(i):void 0,u=r>0?e.dones.get(r):void 0,f=lo(u?.interval_s,n),m=s!==void 0?s+f*1e3:void 0,l=s!==void 0&&s-t>gt;return{latest:r,startMs:s,intervalS:f,deadlineMs:m,selection:c,lastOutcome:a,futureDated:l,highestDone:o}}function co(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 uo(e){return Oe(e)}function fo(e){return`${Oe(e)}.done`}function lo(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 ln(e,t){let n;try{n=await e.stat(t)}catch(o){if(L(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 po(e){if(!O(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 mo(e){if(!O(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=ho(t.selection);if(n)return{finished_at:t.finished_at,interval_s:t.interval_s,outcome:t.outcome,selection:n}}function ho(e){if(!O(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"&&so.test(t.digest)&&typeof t.version=="string"&&t.version.length>0&&typeof t.sha512=="string"&&go(t.sha512)===t.digest)return{kind:"cached",digest:t.digest,version:t.version,sha512:t.sha512}}function go(e){if(e.length===0||!/^[A-Za-z0-9+/]+=*$/.test(e))return;let t=Buffer.from(e,"base64");if(!(t.byteLength!==ao||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 hn(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=dn(t.env),a=t.now(),i=B(t.home,n.scopeId),s=mn(await pn(o,i,!0),a,c),u={deadlineMs:s.deadlineMs,dev:n.dev};if(s.selection.kind==="cached"){let m=ne(t.home,n.dev),l=await t.readPackageInfo().then(E=>E.version,()=>"");if((ge(l,s.selection.version)??0)>0)return await Pe(o,m,t.bundledHookPath),k(t,"below_floor",n,u);let h=await Pt(o,m,s.selection.digest,l,a,n.dev);return h.usable?{source:"cached",hookPath:re(m,s.selection.digest),scopeId:n.scopeId,digest:s.selection.digest,healthFails:h.healthFails,...u}:(h.reason==="below_floor"&&await Pe(o,m,t.bundledHookPath),k(t,h.reason,n,u))}if(s.selection.kind==="bundled")return k(t,s.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 m=await t.readPackageInfo();return await f.bootstrap({home:t.home,scope:n,bundledVersion:m.version,bundledHookPath:t.bundledHookPath,env:t.env,nowMs:a})}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 gn(e,t){let n=[],r=[],o=0,c=0,a="pending",i,s=!1,u=!1,f=!1,m=!1,l=!1,d=[],h=()=>{!m&&typeof e.pause=="function"&&(e.pause(),m=!0)},E=()=>{m&&typeof e.resume=="function"&&(e.resume(),m=!1)},S=()=>{s=!1,f=!1,u=!0,E()},N=()=>{if(!(l||a==="pending")){l=!0,t.clearTimeout(P);for(let g of d)g();d.length=0}},A=g=>{a==="pending"&&(a=g),N()},x=()=>{if(s&&i)try{i.end()}catch{s=!1}},I=g=>{if(a==="oversize")return;let y=c+g.length;if(y>ct){A("oversize");return}r.push(g),c=y},C=g=>{if(!(!s||!i))try{if(!i.write(g)){if(i.destroyed||!i.writable){S();return}f=!0,h()}}catch{S()}},_=g=>{let y=Buffer.isBuffer(g)?g:Buffer.from(g);if(!(a==="truncated"||a==="complete")&&(I(y),!u)){if(s){C(y);return}n.push(y),o+=y.length,o>=at&&h()}},b=()=>{x(),A("complete")},v=()=>{a==="pending"&&(A("truncated"),x(),S())},P=t.setTimeout(()=>{a==="pending"&&(A("truncated"),x(),S())},st);"isTTY"in e&&!!e.isTTY?A("complete"):(e.on("data",_),e.on("end",b),e.on("error",v),typeof e.resume=="function"&&e.resume());let w=g=>{g.on("error",()=>{S()}),g.on("drain",()=>{!s||u||(f=!1,E())})};return{get state(){return a},get replayable(){return a==="complete"},get backlogBytes(){return o},get replayBytes(){return c},attachChild(g){i=g,u=!1,s=!0,f=!1,w(g);for(let y of n){if(!s)break;C(y)}if(n.length=0,o=0,f?h():E(),a!=="pending"){try{g.end()}catch{S()}s=!1}},replayTo(g){w(g);try{g.end(r.length>0?Buffer.concat(r,c):Buffer.alloc(0))}catch{}},stopChildWrites(){S()},dispose(){t.clearTimeout(P),e.off?.("data",_),e.off?.("end",b),e.off?.("error",v)},classifiableText(){if(!(a!=="complete"||c>=X))return Buffer.concat(r,c).toString("utf8")},whenSettled(){return l?Promise.resolve():new Promise(g=>{d.push(g)})}}}var xn={version:"",evAi:{launcherProtocol:1,minLauncherProtocol:1,launcherRevision:1}};function ko(e){return Rn(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:Ro(),now:()=>Date.now(),spawn:_o,exit:n=>{process.exit(n)},setTimeout,clearTimeout,bundledHookPath:ko(e),execPath:process.execPath,select:hn,readPackageInfo:()=>t??=sn(e),launcherUrl:e}}async function _n(e){return e.importCli?e.importCli():import(ae(e,"./cli.mjs").href)}async function An(e=process.argv.slice(2),t=No(import.meta.url)){let n=ie(e);if(n==="cli")try{return await(await _n(t)).main(e)}catch(a){let i=a instanceof Error?a.message:String(a);try{t.stderr.write(`[ev-ai-agent-hook] ${i}
|
|
5
|
-
|
|
6
|
-
`)}return f(0)}if(i)return f(0);let d;try{d=await u(an(e,t))}catch{d=void 0}if(i)return f(0);let h;try{h=await u(t.select(e,t,d,l))}catch{h=k(t,"selection_error",d)}let E=await u(m);if(i||!h||!E)return f(0);let S=n?await u(Po(t,h,d,o,a,l).catch(()=>{})):void 0;if(i||S&&await yn(e,t,S,o.classifiableText()))return f(0);let N=[...e,...Io(d),Qt(await l)],A=await je(h,N,o,r,t,E.version,"live");if(A.outcome==="success"&&h.source==="cached"&&h.healthFails&&await En(t,h,!1),A.outcome==="startup_failure"&&h.source!=="bundled"&&(await En(t,h,!0),o.replayable&&r.remainingMs()>dt)){let x=k(t,"startup_failure",d);await je(x,N,o,r,t,E.version,"replay")}return S&&await yn(e,t,S),f(0)}catch{return f(0)}}function Io(e){return e?.source==="plugin_option"?[`${rt}=${e.collectorUrl}`]:[]}async function Co(e,t,n,r){return await Zt(Ve(await r),qt(e.home),e.now)?!1:(await Je(t.whenSettled(),mt,e),t.replayable&&n().isCapped)}async function Po(e,t,n,r,o,c){if(!(!n||t.didBootstrap||M(e.env)||t.deadlineMs!==void 0&&t.deadlineMs>e.now())&&(await Je(r.whenSettled(),pt,e),!(!r.replayable||!o().isSessionStart||await oe(e.env,e.home,c))))return n}async function yn(e,t,n,r){let o={...t.env};for(let a of rn)delete o[a];o[W]=n.scopeId;let c;if(r!==void 0){c=bo(B(t.home,n.scopeId),`${we}${yo(8).toString("hex")}.json`);try{await So(c,r,{mode:384,flag:"wx"})}catch{return!1}o[z]=c}try{let a=t.spawn(t.execPath,[Rn(ae(t,"./launcher.mjs")),"__refresh",...e],{cwd:t.cwd,env:o,detached:!0,stdio:"ignore",windowsHide:!0});return await new Promise((i,s)=>{a.once("spawn",i),a.once("error",s)}),a.unref(),!0}catch{return c&&await Sn(c,{force:!0}).catch(()=>{}),!1}}async function En(e,t,n){t.digest&&await en(ee(),ne(e.home,t.dev===!0),t.digest,n,e.now(),e.env).catch(()=>{})}An().then(e=>{process.exit(e)}).catch(e=>{if(ie(process.argv.slice(2))==="cli"){let t=e instanceof Error?e.message:String(e);try{process.stderr.write(`[ev-ai-agent-hook] ${t}
|
|
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}
|
|
7
9
|
`)}catch{}process.exit(1)}try{process.stdout.write('{"continue":true}')}catch{}process.exit(0)});
|
|
@@ -1326,7 +1326,7 @@ var HOOK_INPUT_ALLOWLIST_MAX_BYTES = 4 * 1024;
|
|
|
1326
1326
|
var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
|
|
1327
1327
|
var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
|
|
1328
1328
|
var GZIP_MIN_BYTES = 32 * 1024;
|
|
1329
|
-
var PACKAGE_VERSION = "1.3.
|
|
1329
|
+
var PACKAGE_VERSION = "1.3.6";
|
|
1330
1330
|
var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
|
|
1331
1331
|
var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
|
|
1332
1332
|
|
|
@@ -1315,7 +1315,7 @@ var HOOK_INPUT_ALLOWLIST_MAX_BYTES = 4 * 1024;
|
|
|
1315
1315
|
var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
|
|
1316
1316
|
var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
|
|
1317
1317
|
var GZIP_MIN_BYTES = 32 * 1024;
|
|
1318
|
-
var PACKAGE_VERSION = "1.3.
|
|
1318
|
+
var PACKAGE_VERSION = "1.3.6";
|
|
1319
1319
|
var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
|
|
1320
1320
|
var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
|
|
1321
1321
|
|
package/dist/plugin-hooks.mjs
CHANGED
|
@@ -26,9 +26,14 @@ var HOOK_INPUT_ALLOWLIST_MAX_BYTES = 4 * 1024;
|
|
|
26
26
|
var HOOK_INPUT_FULL_MAX_BYTES = 256 * 1024;
|
|
27
27
|
var HOOK_INPUT_MCP_MAX_BYTES = 4 * 1024;
|
|
28
28
|
var GZIP_MIN_BYTES = 32 * 1024;
|
|
29
|
-
var PACKAGE_VERSION = "1.3.
|
|
29
|
+
var PACKAGE_VERSION = "1.3.6";
|
|
30
30
|
var NPX_PACKAGE_SPEC = `@ev-ai/agent-hook@${PACKAGE_VERSION}`;
|
|
31
31
|
var HOOK_STATUS_MESSAGE = "ev-ai runtime report";
|
|
32
|
+
var PLUGIN_ROOT_VARIABLE = {
|
|
33
|
+
claude: "CLAUDE_PLUGIN_ROOT",
|
|
34
|
+
cursor: "CURSOR_PLUGIN_ROOT",
|
|
35
|
+
codex: "PLUGIN_ROOT"
|
|
36
|
+
};
|
|
32
37
|
|
|
33
38
|
// src/config/hook-config.ts
|
|
34
39
|
var HOOK_CONFIG_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
@@ -115,11 +120,6 @@ var CURSOR_WIRED_HOOK_EVENTS = [
|
|
|
115
120
|
// src/install/plugin-hooks.ts
|
|
116
121
|
var PLUGIN_HOOK_ENTRY = "dist/launcher.mjs";
|
|
117
122
|
var PLUGIN_PACKAGE_FILE = "package.json";
|
|
118
|
-
var PLUGIN_ROOT_VARIABLE = {
|
|
119
|
-
claude: "CLAUDE_PLUGIN_ROOT",
|
|
120
|
-
cursor: "CURSOR_PLUGIN_ROOT",
|
|
121
|
-
codex: "PLUGIN_ROOT"
|
|
122
|
-
};
|
|
123
123
|
function pluginLauncherPosixCommand(runner) {
|
|
124
124
|
return `node "\${${PLUGIN_ROOT_VARIABLE[runner]}}/${PLUGIN_HOOK_ENTRY}" --runner ${runner} ; exit 0`;
|
|
125
125
|
}
|
|
@@ -232,7 +232,6 @@ export {
|
|
|
232
232
|
PLUGIN_HOOK_ENTRY,
|
|
233
233
|
PLUGIN_PACKAGE_FILE,
|
|
234
234
|
PLUGIN_PAYLOAD_FILES,
|
|
235
|
-
PLUGIN_ROOT_VARIABLE,
|
|
236
235
|
buildClaudePluginHooks,
|
|
237
236
|
buildCodexPluginHooks,
|
|
238
237
|
buildCursorPluginHooks,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ev-ai/agent-hook",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.6",
|
|
4
4
|
"description": "Cross-runner runtime telemetry hook for Claude Code, Cursor, and Codex",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"evAi": {
|
|
27
27
|
"launcherProtocol": 1,
|
|
28
28
|
"minLauncherProtocol": 1,
|
|
29
|
-
"launcherRevision":
|
|
29
|
+
"launcherRevision": 6
|
|
30
30
|
},
|
|
31
31
|
"engines": {
|
|
32
32
|
"node": ">=18"
|