ostia 0.2.4 → 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{y,e,k,l,O,N,D,q,F,m,t,P,K,d,p,Y,o,f,r,g,h,B,M,Z,T,R}from"./chunk-1wydyvyj.js";function _e(a,x,v){let E=a[0];if(E==="bun"||E?.endsWith("/bun"))return{argv:[E,...x,...a.slice(1)],env:v};return{argv:a,env:{...process.env,...v,BUN_OPTIONS:x.join(" ")}}}function Gn(a){return a.startsWith("file://")?a.slice(7):a}function je(a,x,v){let E=a.nodes,U=E.length,ie=new Map,G=[],A=new Map,ae=new Int32Array(U);for(let se=0;se<U;se++){let ge=E[se],ce=ge.callFrame,we=Gn(ce.url),Me=ie.get(ce.functionName);if(Me===void 0)Me=new Map,ie.set(ce.functionName,Me);let Pe=Me.get(we);if(Pe===void 0)Pe=G.length,Me.set(we,Pe),G.push({key:e("fr",ce.functionName,we),name:ce.functionName,url:we||void 0,line:ce.lineNumber>=0?ce.lineNumber:void 0,col:ce.columnNumber>=0?ce.columnNumber:void 0});ae[se]=Pe,A.set(ge.id,se)}let X=Array(U);for(let se=0;se<U;se++){let ge=E[se];X[se]={id:ge.id,frameIx:ae[A.get(ge.id)],children:ge.children??[]}}let oe=new Float64Array(U),ue=new Float64Array(U),{samples:me,timeDeltas:le}=a;for(let se=0;se<me.length;se++){let ge=A.get(me[se]);if(ge===void 0)continue;oe[ge]+=le[se]??0,ue[ge]+=1}let de=new Int32Array(U).fill(-1);for(let se=0;se<U;se++){let ge=E[se].children;if(!ge)continue;for(let ce of ge){let we=A.get(ce);if(we!==void 0)de[we]=se}}let fe=[],pe=[];for(let se=U-1;se>=0;se--)if(de[se]===-1)pe.push(se);while(pe.length>0){let se=pe.pop();fe.push(se);let ge=E[se].children;if(!ge)continue;for(let ce of ge){let we=A.get(ce);if(we!==void 0&&de[we]===se)pe.push(we)}}let he=new Float64Array(U);for(let se=fe.length-1;se>=0;se--){let ge=fe[se];he[ge]+=oe[ge];let ce=de[ge];if(ce>=0)he[ce]+=he[ge]}let ye=Array(G.length),be=[];for(let se=0;se<U;se++){let ge=X[se].frameIx,ce=ye[ge];if(ce)ce.selfUs+=oe[se],ce.totalUs+=he[se],ce.samples+=ue[se];else{let we={frameIx:ge,selfUs:oe[se],totalUs:he[se],samples:ue[se]};ye[ge]=we,be.push(we)}}return{origin:x,samplingIntervalUs:v,frames:G,nodes:X,totals:be.sort((se,ge)=>ge.selfUs-se.selfUs),samples:{nodeIds:a.samples,timeDeltasUs:a.timeDeltas}}}async function on(a){let x=`${a.artifactDir}/${a.fileName}`,{argv:v,env:E}=_e(a.argv,["--cpu-prof","--cpu-prof-dir",a.artifactDir,"--cpu-prof-name",a.fileName,"--cpu-prof-interval",String(a.intervalUs)],a.env),U=Bun.nanoseconds(),G=await Bun.spawn(v,{cwd:a.cwd,env:E,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,A=Bun.nanoseconds()-U,ae=Bun.file(x);if(!await ae.exists())return{diagnosticWallNs:A,exitCode:G,warnings:[{code:"artifact-missing",message:`Expected a .cpuprofile at ${x} after exit ${G}, found nothing. The workload's argv[0] must be a \`bun\` binary for CPU capture.`,data:{artifactPath:x,argv:a.argv}}]};let X=await ae.json(),oe=je(X,"cpu-prof",a.intervalUs),ue=X.samples.length===0?[{code:"empty-profile",message:"CPU capture produced zero samples."}]:[];return{diagnosticWallNs:A,exitCode:G,artifactPath:x,cpu:oe,warnings:ue}}function sn(a,x="heap-prof"){let{node_fields:v,node_types:E}=a.snapshot.meta,U=v.indexOf("type"),ie=v.indexOf("self_size"),G=v.length,A=E[0];if(U===-1||ie===-1||!Array.isArray(A))return{origin:x,typeCounts:[],objectCount:a.snapshot.node_count};let ae=A.length,X=Array(ae),oe=new Map,ue=[],me=0,le=a.nodes,de=le.length;for(let be=0;be<de;be+=G){let se=le[be+U],ge=le[be+ie]??0;me+=ge;let ce;if(se>=0&&se<ae){if(ce=X[se],ce===void 0)ce={type:A[se],count:0,bytes:0},X[se]=ce,ue.push(ce)}else{let we=`unknown(${se})`;if(ce=oe.get(we),ce===void 0)ce={type:we,count:0,bytes:0},oe.set(we,ce),ue.push(ce)}ce.count++,ce.bytes+=ge}let fe=ue.sort((be,se)=>se.count-be.count),pe=fe.slice(0,20),he=fe.slice(20),ye=pe.map(({type:be,count:se,bytes:ge})=>({type:be,count:se,retainedBytes:ge}));if(he.length>0){let be=0,se=0;for(let ge of he)be+=ge.count,se+=ge.bytes;ye.push({type:"other",count:be,retainedBytes:se})}return{origin:x,heapSizeBytes:me,objectCount:a.snapshot.node_count,typeCounts:ye}}async function an(a){let x=`${a.artifactDir}/${a.fileName}`,{argv:v,env:E}=_e(a.argv,["--heap-prof","--heap-prof-dir",a.artifactDir,"--heap-prof-name",a.fileName],a.env),U=Bun.nanoseconds(),G=await Bun.spawn(v,{cwd:a.cwd,env:E,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,A=Bun.nanoseconds()-U,ae=Bun.file(x);if(!await ae.exists())return{diagnosticWallNs:A,exitCode:G,warnings:[{code:"artifact-missing",message:`Expected a heap snapshot at ${x} after exit ${G}, found nothing. The workload's argv[0] must be a \`bun\` binary for heap capture.`,data:{artifactPath:x,argv:a.argv}}]};let X=await ae.json(),oe=sn(X,"heap-prof");return{diagnosticWallNs:A,exitCode:G,artifactPath:x,heap:oe,warnings:[]}}var Kn=1000;async function mn(a,x={}){let v=x.intervalUs??Kn,{Session:E}=await import("inspector/promises"),U=new E;U.connect();let ie=Bun.nanoseconds();try{await U.post("Profiler.enable"),await U.post("Profiler.setSamplingInterval",{interval:v}),await U.post("Profiler.start");let G=await a(),{profile:A}=await U.post("Profiler.stop"),ae=Bun.nanoseconds()-ie,X=je(A,"inspector",v);return{result:G,cpu:X,diagnosticWallNs:ae}}finally{U.disconnect()}}function Jn(a){let x=a>>>0;return()=>{x=x+1831565813|0;let v=Math.imul(x^x>>>15,1|x);return v=v+Math.imul(v^v>>>7,61|v)^v,((v^v>>>14)>>>0)/4294967296}}var Ve=2000,Yn=2000;function qn(a){let x=a.length,v=x>>1;return x%2===0?(a[v-1]+a[v])/2:a[v]}function cn(a,x,v){if(a.length<=v)return a;let E=[...a];for(let U=0;U<v;U++){let ie=U+Math.floor(x()*(E.length-U)),G=E[U];E[U]=E[ie],E[ie]=G}return E.slice(0,v)}class Qe{sorted;rankOf;counts;n;constructor(a){let x=a.length,v=new Uint32Array(x);for(let E=0;E<x;E++)v[E]=E;v.sort((E,U)=>a[E]-a[U]),this.sorted=new Float64Array(x),this.rankOf=new Uint32Array(x);for(let E=0;E<x;E++)this.sorted[E]=a[v[E]],this.rankOf[v[E]]=E;this.n=x,this.counts=new Uint32Array(x)}resampleMedian(a){let{n:x,counts:v,sorted:E,rankOf:U}=this;v.fill(0);for(let X=0;X<x;X++)v[U[Math.floor(a()*x)]]++;let ie=x+1>>1,G=x%2===0?ie+1:ie,A=0,ae=-1;for(let X=0;X<x;X++){if(A+=v[X],ae<0&&A>=ie)ae=X;if(A>=G)return ae===X?E[X]:(E[ae]+E[X])/2}return E[x-1]}}function un(a,x,v={}){let E=v.seed??(Date.now()^Math.imul(a.length,2654435761))>>>0,U=Jn(E),ie=v.iterations??Yn,G=a.length>Ve||x.length>Ve,A=new Qe(cn(a,U,Ve)),ae=new Qe(cn(x,U,Ve)),X=qn(A.sorted),oe=new Float64Array(ie);for(let ue=0;ue<ie;ue++){let me=A.resampleMedian(U),le=ae.resampleMedian(U);oe[ue]=X===0?le-me===0?0:1/0:(le-me)/X*100}return oe.sort(),{ci95:[l(oe,0.025),l(oe,0.975)],seed:E,data:{subsampled:G,iterations:ie}}}function Qn(a){let x=a<0?-1:1,v=Math.abs(a),E=0.254829592,U=-0.284496736,ie=1.421413741,G=-1.453152027,A=1.061405429,ae=0.3275911,X=1/(1+0.3275911*v),oe=1-((((1.061405429*X+-1.453152027)*X+1.421413741)*X+-0.284496736)*X+0.254829592)*X*Math.exp(-v*v);return x*oe}function Xn(a){return 0.5*(1+Qn(a/Math.SQRT2))}function ln(a,x){let v=a.length,E=x.length,U=v+E,ie=new Float64Array(a),G=new Float64Array(x);ie.sort(),G.sort();let A=0,ae=0,X=0,oe=0,ue=0;while(X<v||oe<E){let he=oe>=E||X<v&&ie[X]<=G[oe]?ie[X]:G[oe],ye=0;while(X<v&&ie[X]===he)ye++,X++;let be=0;while(oe<E&&G[oe]===he)be++,oe++;let se=ye+be,ge=ue+(se+1)/2;if(A+=ye*ge,se>1)ae+=se**3-se;ue+=se}let me=A-v*(v+1)/2,le=v*E/2,de=Math.sqrt(v*E*(U+1-ae/(U*(U-1)))/12),fe=de===0?0:(me-le)/de,pe=Math.min(1,Math.max(0,2*(1-Xn(Math.abs(fe)))));return{u:me,z:fe,pValue:pe}}var c={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},Xe=5;function He(a,x){if(a===0)return x===0?0:1/0;return(x-a)/a*100}function dn(a){let x=new Map;for(let v of a.measurements){let E=`${v.workloadId}\x00${v.phase}`;if(!x.has(E))x.set(E,v)}return x}function Zn(a,x,v){return{base:a,cand:x,baseByPhase:dn(a),candByPhase:dn(x),candWorkloads:new Map(x.workloads.map((E)=>[E.id,E])),environmentMismatch:et(a,x),effectiveTimingPct:Math.max(v.timingPct,a.environment?.noise.floorPct??0,x.environment?.noise.floorPct??0)}}function et(a,x){let v=[];if(a.platform.os!==x.platform.os)v.push({field:"platform.os",base:a.platform.os,cand:x.platform.os});if(a.platform.arch!==x.platform.arch)v.push({field:"platform.arch",base:a.platform.arch,cand:x.platform.arch});if(a.bunVersion!==x.bunVersion)v.push({field:"bunVersion",base:a.bunVersion,cand:x.bunVersion});if(a.environment&&x.environment){if(a.environment.cpuModel!==x.environment.cpuModel)v.push({field:"cpuModel",base:a.environment.cpuModel,cand:x.environment.cpuModel});if(a.environment.cores!==x.environment.cores)v.push({field:"cores",base:a.environment.cores,cand:x.environment.cores})}if(v.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${v.map((E)=>E.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:v}}}function nt(a){let x=[];for(let E of a){if(!E.timing)continue;let U=1+E.timing.medianDeltaPct/100;if(Number.isFinite(U)&&U>0)x.push(Math.log(U))}if(x.length===0)return null;let v=x.reduce((E,U)=>E+U,0)/x.length;return(Math.exp(v)-1)*100}function W(a,x,v=c){let E=Zn(a,x,v);return{effectiveTimingPct:E.effectiveTimingPct,compare:(U)=>tt(E,U,v),unmatched(){let U=new Set(a.workloads.map((ie)=>ie.id));return{baseOnly:a.workloads.filter((ie)=>!E.candWorkloads.has(ie.id)),candOnly:x.workloads.filter((ie)=>!U.has(ie.id))}}}}function j(a,x){let v=0,E=0,U=0;for(let ie of a){if(!ie.timing)continue;if(ie.timing.verdict==="regressed")v++;else if(ie.timing.verdict==="improved")E++;else U++}return{matched:a.length,regressed:v,improved:E,unchanged:U,geomeanPct:nt(a),effectiveTimingPct:x,verdict:a.some((ie)=>ie.verdict==="fail")?"fail":"pass"}}function C(a,x,v=c){let E=W(a,x,v),U=[];for(let ie of a.workloads){let G=E.compare(ie.id);if(G)U.push(G)}return{comparisons:U,unmatched:E.unmatched(),summary:j(U,E.effectiveTimingPct)}}function tt(a,x,v){let{baseByPhase:E,candByPhase:U,effectiveTimingPct:ie}=a,G=E.get(`${x}\x00timing`),A=U.get(`${x}\x00timing`),ae=E.get(`${x}\x00cpu`),X=U.get(`${x}\x00cpu`),oe=E.get(`${x}\x00heap`),ue=U.get(`${x}\x00heap`),me=a.candWorkloads.get(x),le=G?.id??ae?.id??oe?.id,de=A?.id??X?.id??ue?.id??me?.id;if(!le||!de)return;let fe=!1,pe=[];if(a.environmentMismatch)pe.push(a.environmentMismatch);let he;if(G?.timing&&me?.skipped&&!A?.timing)he={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},pe.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:x}});else if(G?.timing&&A?.timing){let se=G.timing.samples,ge=A.timing.samples,ce=He(G.timing.median,A.timing.median),we=He(G.timing.mean,A.timing.mean),Me=(Pe,xe)=>{if(Pe>ie)return"regressed";if(xe<-ie)return"improved";return"unchanged"};if(se.length<Xe||ge.length<Xe){let Pe=Me(ce,ce);if(Pe==="regressed")fe=!0;he={medianDeltaPct:ce,meanDeltaPct:we,verdict:Pe},pe.push({code:"thin-comparison",message:`Only ${se.length} baseline / ${ge.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${Xe}+ per side).`,data:{baseSamples:se.length,candSamples:ge.length}})}else{let Pe=un(se,ge,{iterations:v.bootstrapIterations}),xe=ln(se,ge),ke=xe.pValue<v.alpha?Me(Pe.ci95[0],Pe.ci95[1]):"unchanged";if(ke==="regressed")fe=!0;he={medianDeltaPct:ce,meanDeltaPct:we,ci95:Pe.ci95,pValue:xe.pValue,seed:Pe.seed,verdict:ke}}}let ye;if(ae?.cpu&&X?.cpu){let se=new Map(ae.cpu.totals.map((Pe)=>[ae.cpu.frames[Pe.frameIx].key,Pe])),ge=new Map(X.cpu.totals.map((Pe)=>[X.cpu.frames[Pe.frameIx].key,Pe])),ce=new Map(ae.cpu.frames.map((Pe)=>[Pe.key,Pe.name])),we=new Map(X.cpu.frames.map((Pe)=>[Pe.key,Pe.name]));ye=[...new Set([...se.keys(),...ge.keys()])].map((Pe)=>{let xe=se.get(Pe)?.selfUs??0,ke=ge.get(Pe)?.selfUs??0;return{frameKey:Pe,name:we.get(Pe)??ce.get(Pe)??Pe,baseSelfUs:xe,candSelfUs:ke,deltaPct:He(xe,ke)}}).sort((Pe,xe)=>Math.abs(xe.deltaPct)-Math.abs(Pe.deltaPct));for(let Pe of ye)if((Pe.baseSelfUs>=v.minFrameSelfUs||Pe.candSelfUs>=v.minFrameSelfUs)&&Pe.deltaPct>v.frameSelfPct)fe=!0}let be;if(oe?.heap&&ue?.heap){let se=new Map(oe.heap.typeCounts.map((we)=>[we.type,we])),ge=new Map(ue.heap.typeCounts.map((we)=>[we.type,we]));be=[...new Set([...se.keys(),...ge.keys()])].map((we)=>{let Me=se.get(we),Pe=ge.get(we);return{type:we,baseCount:Me?.count??0,candCount:Pe?.count??0,baseBytes:Me?.retainedBytes,candBytes:Pe?.retainedBytes,deltaPct:He(Me?.count??0,Pe?.count??0)}}).sort((we,Me)=>Math.abs(Me.deltaPct)-Math.abs(we.deltaPct));for(let we of be)if(we.deltaPct>v.heapTypePct)fe=!0}return{id:e("cmp",le,de),baselineMeasurementId:le,candidateMeasurementId:de,timing:he,...pe.length>0&&{warnings:pe},frames:ye,heapTypes:be,thresholds:{...v,effectiveTimingPct:ie},verdict:fe?"fail":"pass"}}var Be="node_modules/.cache/ostia",rt=".ostia/baselines",it={runs:null,warmup:3,outDir:Be,baselineDir:rt,baseline:"main",cpuIntervalUs:1000,thresholds:c,workloads:[]};function gn(a){return{...it,...a,thresholds:{...c,...a.thresholds??{}}}}async function pn(a){let x=Bun.file(a);if(!await x.exists())return;return gn(await x.json())}async function fn(a){let x=a.startsWith("/")?a:`${process.cwd()}/${a}`;if(!await Bun.file(x).exists())return;let v=await import(x);return gn(v.default??{})}async function S(a){if(a!==void 0)return a.endsWith(".ts")?fn(a):pn(a);return await fn("ostia.config.ts")??pn("ostia.config.json")}function s(a,x){return`${a.baselineDir}/${x??a.baseline}.json`}async function L(){if(await Bun.file("ostia.config.ts").exists())return"ostia.config.ts";if(await Bun.file("ostia.config.json").exists())return"ostia.config.json";return}var ot=10,st=3000000000,at=3;function Ze(a){if(a.timeSource)N(a.timeSource);let x=a.warmup??at,v=a.samples,E=a.minSamples??ot,U=v??E,ie=v!==void 0?0:a.budgetMs!==void 0?a.budgetMs*1e6:st,G=a.timeSource!==void 0,A=a.ignoreExitCodes??[],ae=new Set(A),X=[],oe=0,ue=0,me=!1,le;function de(){if(me)return!0;if(v!==void 0)return ue>=v;return ue>=U&&oe>=ie}async function fe(pe,he){if(a.prepare)await F(a.prepare,{phase:pe,index:he},{cwd:a.cwd,env:a.env,timeoutMs:a.timeoutMs,signal:a.signal});return q(a)}return{async warmup(){for(let pe=0;pe<x;pe++){if(a.signal?.aborted)return;await fe("warmup",pe)}},async step(){if(de()||a.signal?.aborted)return!1;let pe=await fe("timing",ue);if(a.signal?.aborted)return!1;if(pe.timeSourceNoMatch)le??=pe.timeSourceMissOutput;if(X.push({i:ue,wallNs:pe.wallNs,exitCode:pe.exitCode??void 0,userNs:pe.userNs,systemNs:pe.systemNs,maxRssBytes:pe.maxRssBytes,...pe.reportedNs!==void 0&&{reportedNs:pe.reportedNs},...pe.timedOut?{timedOut:!0}:{},...pe.timeSourceNoMatch?{timeSourceNoMatch:!0}:{}}),oe+=pe.wallNs,ue++,a.failOnNonzero&&pe.exitCode!==null&&pe.exitCode!==0&&!ae.has(pe.exitCode))me=!0;return!0},done:de,result(){let pe=X.filter((ce)=>!ce.timedOut&&!ce.timeSourceNoMatch),he=pe.map((ce)=>G?ce.reportedNs:ce.wallNs),ye=[],be=X.filter((ce)=>ce.timedOut).length;if(be>0)ye.push({code:"timeout",message:`${be} of ${X.length} trial(s) timed out after ${a.timeoutMs}ms.`,data:{timeoutMs:a.timeoutMs,trials:be}});let se=X.filter((ce)=>ce.timeSourceNoMatch).length;if(se>0&&a.timeSource){let{pattern:ce}=a.timeSource;ye.push({code:"time-source-no-match",message:`${se} of ${X.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof ce==="string"?ce:ce.source,trials:se,...le!==void 0&&{output:le}}})}if(he.length===0)return{trials:X,warnings:ye};let ge=k(he);return ye.push(...O(ge,pe.map((ce)=>ce.exitCode),G?"reported":"subprocess",A)),{trials:X,timing:ge,warnings:ye}}}}async function en(a){await a.warmup();while(await a.step());}async function z(a){let x=Ze(a);return await en(x),x.result()}async function I(a,x){let v=new Set;for(let E of a)for await(let U of new Bun.Glob(E).scan({cwd:x,absolute:!1}))v.add(U);return[...v].sort()}var hn=new URL("./runner.ts",import.meta.url).pathname;function _(){return Math.max(1,navigator.hardwareConcurrency||1)}async function H(a,x){return I(a,x)}function mt(a){if(a===void 0)return;return a==="auto"?_():a}async function J(a,x,v=process.cwd()){return{suites:a.suites.length>0?a.suites:x?.suites?await H(x.suites,v):[],budgetMs:a.budgetMs??x?.budgetMs,samples:a.samples??x?.samples,minSamples:a.minSamples??x?.minSamples,jobs:a.jobs??mt(x?.jobs),gc:a.gc??x?.gc??!1,cpu:a.cpu??x?.cpu??!1,alloc:a.alloc??x?.alloc??!1,filter:a.filter??x?.filter,isolate:a.isolate??x?.isolate??!1,preload:a.preload.length>0?a.preload:x?.preload??[],bunFlags:a.bunFlags,outDir:a.outDir??x?.outDir,noiseCheck:a.noiseCheck,timeoutMs:a.timeoutMs??x?.timeoutMs,cwd:v}}async function b(a){if(a.samples!==void 0&&(!Number.isFinite(a.samples)||a.samples<1))throw RangeError(`bench: samples must be >= 1, got ${a.samples}`);if(a.minSamples!==void 0&&(!Number.isFinite(a.minSamples)||a.minSamples<1))throw RangeError(`bench: minSamples must be >= 1, got ${a.minSamples}`);if(a.budgetMs!==void 0&&!Number.isFinite(a.budgetMs))throw RangeError(`bench: budgetMs must be finite, got ${a.budgetMs}`);let v=`${a.outDir??Be}/bench-tmp`,E=a.cwd??process.cwd(),U=Math.max(1,Math.floor(a.jobs??1)),ie={budgetMs:a.budgetMs,samples:a.samples,minSamples:a.minSamples,gc:a.gc,cpu:a.cpu,alloc:a.alloc,noiseCheck:a.noiseCheck},G=(ue)=>ue.startsWith("/")?ue:`${E}/${ue}`,A=a.suites.map(G),ae=(a.preload??[]).map(G),X=a.bunFlags??[],oe=async(ue,me)=>{let le=new Set,de=0,fe,pe=async()=>{while(fe===void 0&&!a.signal?.aborted&&de<ue.length){let he=de++;try{let ye=D(a.timeoutMs,a.signal),be=Bun.spawn(ue[he],{cwd:E,stdout:"inherit",stderr:"inherit",stdin:"ignore",...ye.spawn});le.add(be);let se=await be.exited;if(le.delete(be),a.signal?.aborted)return;if(ye.timedOut())throw Error(`Bench suite timed out after ${a.timeoutMs}ms: ${me(he)}`);if(se!==0)throw Error(`Bench suite failed: ${me(he)} (runner exited ${se})`)}catch(ye){fe??=ye instanceof Error?ye:Error(String(ye));for(let be of le)be.kill()}}};if(await Promise.all(Array.from({length:Math.min(U,ue.length)},pe)),fe)throw fe};try{let ue=A.map((ce)=>`${v}/${e("bench-plan",ce)}.json`),me=A.map((ce)=>`${v}/${e("bench-primary",ce)}.json`),le=A.map((ce,we)=>["bun",...X,hn,ce,me[we],JSON.stringify({...ie,filter:a.filter,isolate:a.isolate,preload:ae,planPath:ue[we]})]);await oe(le,(ce)=>a.suites[ce]);let de=await Promise.all(ue.map(async(ce)=>{if(!await Bun.file(ce).exists())return[];let{tasks:we}=await Bun.file(ce).json();return we})),fe=await Promise.all(me.map(async(ce)=>await Bun.file(ce).exists()?r(ce):void 0)),pe=[];for(let ce=0;ce<de.length;ce++)for(let we of de[ce])if(we.isolate)pe.push({suiteIndex:ce,taskIds:[we.id]});let he=pe.map((ce,we)=>`${v}/${e("bench-item",A[ce.suiteIndex],we)}.json`),ye=pe.map((ce,we)=>["bun",...X,hn,A[ce.suiteIndex],he[we],JSON.stringify({...ie,taskIds:ce.taskIds,preload:ae,markIsolated:!0})]);await oe(ye,(ce)=>a.suites[pe[ce].suiteIndex]);let be=await Promise.all(he.map(async(ce)=>await Bun.file(ce).exists()?r(ce):void 0)),se=[],ge=[];for(let ce=0;ce<de.length;ce++){let we=fe[ce];if(!we)continue;let Me=new Map;for(let ke of we.measurements){let $e=Me.get(ke.workloadId)??[];$e.push(ke),Me.set(ke.workloadId,$e)}let Pe=0,xe=new Map;pe.forEach((ke,$e)=>{let Ce=be[$e];if(ke.suiteIndex===ce&&Ce)xe.set(ke.taskIds[0],Ce)});for(let ke of de[ce])if(ke.isolate){let $e=xe.get(ke.id);if(!$e)continue;let Ce=$e.workloads[0];se.push(Ce);for(let Le of $e.measurements)if(Le.workloadId===Ce.id)ge.push(Le)}else{let $e=we.workloads[Pe];se.push($e),Pe++;for(let Ce of Me.get($e.id)??[])ge.push(Ce)}}if(a.signal?.aborted&&ge.length>0){let ce=ge[ge.length-1];ce.warnings=[...ce.warnings,{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed."}]}return t(se,ge,fe.find((ce)=>ce!==void 0)?.environment)}finally{await Bun.spawn(["rm","-rf",v]).exited}}function Q(a,x,v=8){if(v<=1)throw RangeError(`range: multiplier must be > 1, got ${v}`);if(a<=0)throw RangeError(`range: start must be > 0, got ${a}`);let E=[];for(let U=a;U<=x;U*=v)E.push(U);if(!E.includes(x))E.push(x);return E}function Se(a,x){if(x){let v=a.measurements.find((E)=>E.id===x);return v?.cpu?[v]:[]}return a.measurements.filter((v)=>v.phase==="cpu"&&v.cpu)}function Oe(a){let x=a.nodes,v=x.length,E=ct(a),U=new Int32Array(v).fill(-1);for(let ae=0;ae<v;ae++)for(let X of x[ae].children){let oe=E(X);if(oe!==-1)U[oe]=ae}let ie=[];for(let ae=0;ae<v;ae++)if(U[ae]===-1)ie.push(ae);let G=[],A=[];for(let ae=ie.length-1;ae>=0;ae--)A.push(ie[ae]);while(A.length>0){let ae=A.pop();G.push(ae);for(let X of x[ae].children){let oe=E(X);if(oe!==-1&&U[oe]===ae)A.push(oe)}}return{count:v,indexOf:E,parentIx:U,roots:ie,order:G}}function ct(a){let x=a.nodes,v=x.length,E=1/0,U=-1/0,ie=!0;for(let A=0;A<v;A++){let ae=x[A].id;if(!Number.isInteger(ae)){ie=!1;break}if(ae<E)E=ae;if(ae>U)U=ae}if(ie&&v>0&&U-E<v*4+64){let A=U-E+1,ae=new Int32Array(A).fill(-1);for(let X=0;X<v;X++)ae[x[X].id-E]=X;return(X)=>{let oe=X-E;return oe>=0&&oe<A?ae[oe]:-1}}let G=new Map;for(let A=0;A<v;A++)G.set(x[A].id,A);return(A)=>G.get(A)??-1}function bn(a,x){let{count:v,indexOf:E,parentIx:U,order:ie}=x,G=new Float64Array(v),A=new Float64Array(v),ae=a.samples?.nodeIds??[],X=a.samples?.timeDeltasUs??[];for(let ue=0;ue<ae.length;ue++){let me=E(ae[ue]);if(me===-1)continue;G[me]+=X[ue]??0,A[me]+=1}let oe=new Float64Array(v);for(let ue=ie.length-1;ue>=0;ue--){let me=ie[ue];oe[me]+=G[me];let le=U[me];if(le>=0)oe[le]+=oe[me]}return{selfUs:G,totalUs:oe,samples:A}}var wn={name:"collapsed",async render(a,x={}){return{files:Se(a,x.measurementId).map((U)=>{let ie=U.cpu,{nodes:G,frames:A}=ie,ae=Oe(ie),X=Array(ae.count);for(let de of ae.order){let fe=A[G[de].frameIx].name||"(anonymous)",pe=ae.parentIx[de];X[de]=pe===-1?fe:`${X[pe]};${fe}`}let oe=new Float64Array(ae.count),ue=[],me=ie.samples?.nodeIds??[];for(let de=0;de<me.length;de++){let fe=ae.indexOf(me[de]);if(fe===-1)continue;if(oe[fe]++===0)ue.push(fe)}let le=Array(ue.length);for(let de=0;de<ue.length;de++){let fe=ue[de];le[de]=`${X[fe]} ${oe[fe]}`}return{path:`${U.id}.collapsed.txt`,content:le.join(`
2
+ import{y,e,k,l,O,N,D,q,F,m,t,P,K,d,p,Y,o,f,r,g,h,B,M,Z,T,R}from"./chunk-v0efhnv2.js";function _e(a,x,v){let E=a[0];if(E==="bun"||E?.endsWith("/bun"))return{argv:[E,...x,...a.slice(1)],env:v};return{argv:a,env:{...process.env,...v,BUN_OPTIONS:x.join(" ")}}}function Gn(a){return a.startsWith("file://")?a.slice(7):a}function je(a,x,v){let E=a.nodes,U=E.length,ie=new Map,G=[],A=new Map,ae=new Int32Array(U);for(let se=0;se<U;se++){let ge=E[se],ce=ge.callFrame,we=Gn(ce.url),Me=ie.get(ce.functionName);if(Me===void 0)Me=new Map,ie.set(ce.functionName,Me);let Pe=Me.get(we);if(Pe===void 0)Pe=G.length,Me.set(we,Pe),G.push({key:e("fr",ce.functionName,we),name:ce.functionName,url:we||void 0,line:ce.lineNumber>=0?ce.lineNumber:void 0,col:ce.columnNumber>=0?ce.columnNumber:void 0});ae[se]=Pe,A.set(ge.id,se)}let X=Array(U);for(let se=0;se<U;se++){let ge=E[se];X[se]={id:ge.id,frameIx:ae[A.get(ge.id)],children:ge.children??[]}}let oe=new Float64Array(U),ue=new Float64Array(U),{samples:me,timeDeltas:le}=a;for(let se=0;se<me.length;se++){let ge=A.get(me[se]);if(ge===void 0)continue;oe[ge]+=le[se]??0,ue[ge]+=1}let de=new Int32Array(U).fill(-1);for(let se=0;se<U;se++){let ge=E[se].children;if(!ge)continue;for(let ce of ge){let we=A.get(ce);if(we!==void 0)de[we]=se}}let fe=[],pe=[];for(let se=U-1;se>=0;se--)if(de[se]===-1)pe.push(se);while(pe.length>0){let se=pe.pop();fe.push(se);let ge=E[se].children;if(!ge)continue;for(let ce of ge){let we=A.get(ce);if(we!==void 0&&de[we]===se)pe.push(we)}}let he=new Float64Array(U);for(let se=fe.length-1;se>=0;se--){let ge=fe[se];he[ge]+=oe[ge];let ce=de[ge];if(ce>=0)he[ce]+=he[ge]}let ye=Array(G.length),be=[];for(let se=0;se<U;se++){let ge=X[se].frameIx,ce=ye[ge];if(ce)ce.selfUs+=oe[se],ce.totalUs+=he[se],ce.samples+=ue[se];else{let we={frameIx:ge,selfUs:oe[se],totalUs:he[se],samples:ue[se]};ye[ge]=we,be.push(we)}}return{origin:x,samplingIntervalUs:v,frames:G,nodes:X,totals:be.sort((se,ge)=>ge.selfUs-se.selfUs),samples:{nodeIds:a.samples,timeDeltasUs:a.timeDeltas}}}async function on(a){let x=`${a.artifactDir}/${a.fileName}`,{argv:v,env:E}=_e(a.argv,["--cpu-prof","--cpu-prof-dir",a.artifactDir,"--cpu-prof-name",a.fileName,"--cpu-prof-interval",String(a.intervalUs)],a.env),U=Bun.nanoseconds(),G=await Bun.spawn(v,{cwd:a.cwd,env:E,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,A=Bun.nanoseconds()-U,ae=Bun.file(x);if(!await ae.exists())return{diagnosticWallNs:A,exitCode:G,warnings:[{code:"artifact-missing",message:`Expected a .cpuprofile at ${x} after exit ${G}, found nothing. The workload's argv[0] must be a \`bun\` binary for CPU capture.`,data:{artifactPath:x,argv:a.argv}}]};let X=await ae.json(),oe=je(X,"cpu-prof",a.intervalUs),ue=X.samples.length===0?[{code:"empty-profile",message:"CPU capture produced zero samples."}]:[];return{diagnosticWallNs:A,exitCode:G,artifactPath:x,cpu:oe,warnings:ue}}function sn(a,x="heap-prof"){let{node_fields:v,node_types:E}=a.snapshot.meta,U=v.indexOf("type"),ie=v.indexOf("self_size"),G=v.length,A=E[0];if(U===-1||ie===-1||!Array.isArray(A))return{origin:x,typeCounts:[],objectCount:a.snapshot.node_count};let ae=A.length,X=Array(ae),oe=new Map,ue=[],me=0,le=a.nodes,de=le.length;for(let be=0;be<de;be+=G){let se=le[be+U],ge=le[be+ie]??0;me+=ge;let ce;if(se>=0&&se<ae){if(ce=X[se],ce===void 0)ce={type:A[se],count:0,bytes:0},X[se]=ce,ue.push(ce)}else{let we=`unknown(${se})`;if(ce=oe.get(we),ce===void 0)ce={type:we,count:0,bytes:0},oe.set(we,ce),ue.push(ce)}ce.count++,ce.bytes+=ge}let fe=ue.sort((be,se)=>se.count-be.count),pe=fe.slice(0,20),he=fe.slice(20),ye=pe.map(({type:be,count:se,bytes:ge})=>({type:be,count:se,retainedBytes:ge}));if(he.length>0){let be=0,se=0;for(let ge of he)be+=ge.count,se+=ge.bytes;ye.push({type:"other",count:be,retainedBytes:se})}return{origin:x,heapSizeBytes:me,objectCount:a.snapshot.node_count,typeCounts:ye}}async function an(a){let x=`${a.artifactDir}/${a.fileName}`,{argv:v,env:E}=_e(a.argv,["--heap-prof","--heap-prof-dir",a.artifactDir,"--heap-prof-name",a.fileName],a.env),U=Bun.nanoseconds(),G=await Bun.spawn(v,{cwd:a.cwd,env:E,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,A=Bun.nanoseconds()-U,ae=Bun.file(x);if(!await ae.exists())return{diagnosticWallNs:A,exitCode:G,warnings:[{code:"artifact-missing",message:`Expected a heap snapshot at ${x} after exit ${G}, found nothing. The workload's argv[0] must be a \`bun\` binary for heap capture.`,data:{artifactPath:x,argv:a.argv}}]};let X=await ae.json(),oe=sn(X,"heap-prof");return{diagnosticWallNs:A,exitCode:G,artifactPath:x,heap:oe,warnings:[]}}var Kn=1000;async function mn(a,x={}){let v=x.intervalUs??Kn,{Session:E}=await import("inspector/promises"),U=new E;U.connect();let ie=Bun.nanoseconds();try{await U.post("Profiler.enable"),await U.post("Profiler.setSamplingInterval",{interval:v}),await U.post("Profiler.start");let G=await a(),{profile:A}=await U.post("Profiler.stop"),ae=Bun.nanoseconds()-ie,X=je(A,"inspector",v);return{result:G,cpu:X,diagnosticWallNs:ae}}finally{U.disconnect()}}function Jn(a){let x=a>>>0;return()=>{x=x+1831565813|0;let v=Math.imul(x^x>>>15,1|x);return v=v+Math.imul(v^v>>>7,61|v)^v,((v^v>>>14)>>>0)/4294967296}}var Ve=2000,Yn=2000;function qn(a){let x=a.length,v=x>>1;return x%2===0?(a[v-1]+a[v])/2:a[v]}function cn(a,x,v){if(a.length<=v)return a;let E=[...a];for(let U=0;U<v;U++){let ie=U+Math.floor(x()*(E.length-U)),G=E[U];E[U]=E[ie],E[ie]=G}return E.slice(0,v)}class Qe{sorted;rankOf;counts;n;constructor(a){let x=a.length,v=new Uint32Array(x);for(let E=0;E<x;E++)v[E]=E;v.sort((E,U)=>a[E]-a[U]),this.sorted=new Float64Array(x),this.rankOf=new Uint32Array(x);for(let E=0;E<x;E++)this.sorted[E]=a[v[E]],this.rankOf[v[E]]=E;this.n=x,this.counts=new Uint32Array(x)}resampleMedian(a){let{n:x,counts:v,sorted:E,rankOf:U}=this;v.fill(0);for(let X=0;X<x;X++)v[U[Math.floor(a()*x)]]++;let ie=x+1>>1,G=x%2===0?ie+1:ie,A=0,ae=-1;for(let X=0;X<x;X++){if(A+=v[X],ae<0&&A>=ie)ae=X;if(A>=G)return ae===X?E[X]:(E[ae]+E[X])/2}return E[x-1]}}function un(a,x,v={}){let E=v.seed??(Date.now()^Math.imul(a.length,2654435761))>>>0,U=Jn(E),ie=v.iterations??Yn,G=a.length>Ve||x.length>Ve,A=new Qe(cn(a,U,Ve)),ae=new Qe(cn(x,U,Ve)),X=qn(A.sorted),oe=new Float64Array(ie);for(let ue=0;ue<ie;ue++){let me=A.resampleMedian(U),le=ae.resampleMedian(U);oe[ue]=X===0?le-me===0?0:1/0:(le-me)/X*100}return oe.sort(),{ci95:[l(oe,0.025),l(oe,0.975)],seed:E,data:{subsampled:G,iterations:ie}}}function Qn(a){let x=a<0?-1:1,v=Math.abs(a),E=0.254829592,U=-0.284496736,ie=1.421413741,G=-1.453152027,A=1.061405429,ae=0.3275911,X=1/(1+0.3275911*v),oe=1-((((1.061405429*X+-1.453152027)*X+1.421413741)*X+-0.284496736)*X+0.254829592)*X*Math.exp(-v*v);return x*oe}function Xn(a){return 0.5*(1+Qn(a/Math.SQRT2))}function ln(a,x){let v=a.length,E=x.length,U=v+E,ie=new Float64Array(a),G=new Float64Array(x);ie.sort(),G.sort();let A=0,ae=0,X=0,oe=0,ue=0;while(X<v||oe<E){let he=oe>=E||X<v&&ie[X]<=G[oe]?ie[X]:G[oe],ye=0;while(X<v&&ie[X]===he)ye++,X++;let be=0;while(oe<E&&G[oe]===he)be++,oe++;let se=ye+be,ge=ue+(se+1)/2;if(A+=ye*ge,se>1)ae+=se**3-se;ue+=se}let me=A-v*(v+1)/2,le=v*E/2,de=Math.sqrt(v*E*(U+1-ae/(U*(U-1)))/12),fe=de===0?0:(me-le)/de,pe=Math.min(1,Math.max(0,2*(1-Xn(Math.abs(fe)))));return{u:me,z:fe,pValue:pe}}var c={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},Xe=5;function He(a,x){if(a===0)return x===0?0:1/0;return(x-a)/a*100}function dn(a){let x=new Map;for(let v of a.measurements){let E=`${v.workloadId}\x00${v.phase}`;if(!x.has(E))x.set(E,v)}return x}function Zn(a,x,v){return{base:a,cand:x,baseByPhase:dn(a),candByPhase:dn(x),candWorkloads:new Map(x.workloads.map((E)=>[E.id,E])),environmentMismatch:et(a,x),effectiveTimingPct:Math.max(v.timingPct,a.environment?.noise.floorPct??0,x.environment?.noise.floorPct??0)}}function et(a,x){let v=[];if(a.platform.os!==x.platform.os)v.push({field:"platform.os",base:a.platform.os,cand:x.platform.os});if(a.platform.arch!==x.platform.arch)v.push({field:"platform.arch",base:a.platform.arch,cand:x.platform.arch});if(a.bunVersion!==x.bunVersion)v.push({field:"bunVersion",base:a.bunVersion,cand:x.bunVersion});if(a.environment&&x.environment){if(a.environment.cpuModel!==x.environment.cpuModel)v.push({field:"cpuModel",base:a.environment.cpuModel,cand:x.environment.cpuModel});if(a.environment.cores!==x.environment.cores)v.push({field:"cores",base:a.environment.cores,cand:x.environment.cores})}if(v.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${v.map((E)=>E.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:v}}}function nt(a){let x=[];for(let E of a){if(!E.timing)continue;let U=1+E.timing.medianDeltaPct/100;if(Number.isFinite(U)&&U>0)x.push(Math.log(U))}if(x.length===0)return null;let v=x.reduce((E,U)=>E+U,0)/x.length;return(Math.exp(v)-1)*100}function W(a,x,v=c){let E=Zn(a,x,v);return{effectiveTimingPct:E.effectiveTimingPct,compare:(U)=>tt(E,U,v),unmatched(){let U=new Set(a.workloads.map((ie)=>ie.id));return{baseOnly:a.workloads.filter((ie)=>!E.candWorkloads.has(ie.id)),candOnly:x.workloads.filter((ie)=>!U.has(ie.id))}}}}function j(a,x){let v=0,E=0,U=0;for(let ie of a){if(!ie.timing)continue;if(ie.timing.verdict==="regressed")v++;else if(ie.timing.verdict==="improved")E++;else U++}return{matched:a.length,regressed:v,improved:E,unchanged:U,geomeanPct:nt(a),effectiveTimingPct:x,verdict:a.some((ie)=>ie.verdict==="fail")?"fail":"pass"}}function C(a,x,v=c){let E=W(a,x,v),U=[];for(let ie of a.workloads){let G=E.compare(ie.id);if(G)U.push(G)}return{comparisons:U,unmatched:E.unmatched(),summary:j(U,E.effectiveTimingPct)}}function tt(a,x,v){let{baseByPhase:E,candByPhase:U,effectiveTimingPct:ie}=a,G=E.get(`${x}\x00timing`),A=U.get(`${x}\x00timing`),ae=E.get(`${x}\x00cpu`),X=U.get(`${x}\x00cpu`),oe=E.get(`${x}\x00heap`),ue=U.get(`${x}\x00heap`),me=a.candWorkloads.get(x),le=G?.id??ae?.id??oe?.id,de=A?.id??X?.id??ue?.id??me?.id;if(!le||!de)return;let fe=!1,pe=[];if(a.environmentMismatch)pe.push(a.environmentMismatch);let he;if(G?.timing&&me?.skipped&&!A?.timing)he={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},pe.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:x}});else if(G?.timing&&A?.timing){let se=G.timing.samples,ge=A.timing.samples,ce=He(G.timing.median,A.timing.median),we=He(G.timing.mean,A.timing.mean),Me=(Pe,xe)=>{if(Pe>ie)return"regressed";if(xe<-ie)return"improved";return"unchanged"};if(se.length<Xe||ge.length<Xe){let Pe=Me(ce,ce);if(Pe==="regressed")fe=!0;he={medianDeltaPct:ce,meanDeltaPct:we,verdict:Pe},pe.push({code:"thin-comparison",message:`Only ${se.length} baseline / ${ge.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${Xe}+ per side).`,data:{baseSamples:se.length,candSamples:ge.length}})}else{let Pe=un(se,ge,{iterations:v.bootstrapIterations}),xe=ln(se,ge),ke=xe.pValue<v.alpha?Me(Pe.ci95[0],Pe.ci95[1]):"unchanged";if(ke==="regressed")fe=!0;he={medianDeltaPct:ce,meanDeltaPct:we,ci95:Pe.ci95,pValue:xe.pValue,seed:Pe.seed,verdict:ke}}}let ye;if(ae?.cpu&&X?.cpu){let se=new Map(ae.cpu.totals.map((Pe)=>[ae.cpu.frames[Pe.frameIx].key,Pe])),ge=new Map(X.cpu.totals.map((Pe)=>[X.cpu.frames[Pe.frameIx].key,Pe])),ce=new Map(ae.cpu.frames.map((Pe)=>[Pe.key,Pe.name])),we=new Map(X.cpu.frames.map((Pe)=>[Pe.key,Pe.name]));ye=[...new Set([...se.keys(),...ge.keys()])].map((Pe)=>{let xe=se.get(Pe)?.selfUs??0,ke=ge.get(Pe)?.selfUs??0;return{frameKey:Pe,name:we.get(Pe)??ce.get(Pe)??Pe,baseSelfUs:xe,candSelfUs:ke,deltaPct:He(xe,ke)}}).sort((Pe,xe)=>Math.abs(xe.deltaPct)-Math.abs(Pe.deltaPct));for(let Pe of ye)if((Pe.baseSelfUs>=v.minFrameSelfUs||Pe.candSelfUs>=v.minFrameSelfUs)&&Pe.deltaPct>v.frameSelfPct)fe=!0}let be;if(oe?.heap&&ue?.heap){let se=new Map(oe.heap.typeCounts.map((we)=>[we.type,we])),ge=new Map(ue.heap.typeCounts.map((we)=>[we.type,we]));be=[...new Set([...se.keys(),...ge.keys()])].map((we)=>{let Me=se.get(we),Pe=ge.get(we);return{type:we,baseCount:Me?.count??0,candCount:Pe?.count??0,baseBytes:Me?.retainedBytes,candBytes:Pe?.retainedBytes,deltaPct:He(Me?.count??0,Pe?.count??0)}}).sort((we,Me)=>Math.abs(Me.deltaPct)-Math.abs(we.deltaPct));for(let we of be)if(we.deltaPct>v.heapTypePct)fe=!0}return{id:e("cmp",le,de),baselineMeasurementId:le,candidateMeasurementId:de,timing:he,...pe.length>0&&{warnings:pe},frames:ye,heapTypes:be,thresholds:{...v,effectiveTimingPct:ie},verdict:fe?"fail":"pass"}}var Be="node_modules/.cache/ostia",rt=".ostia/baselines",it={runs:null,warmup:3,outDir:Be,baselineDir:rt,baseline:"main",cpuIntervalUs:1000,thresholds:c,workloads:[]};function gn(a){return{...it,...a,thresholds:{...c,...a.thresholds??{}}}}async function pn(a){let x=Bun.file(a);if(!await x.exists())return;return gn(await x.json())}async function fn(a){let x=a.startsWith("/")?a:`${process.cwd()}/${a}`;if(!await Bun.file(x).exists())return;let v=await import(x);return gn(v.default??{})}async function S(a){if(a!==void 0)return a.endsWith(".ts")?fn(a):pn(a);return await fn("ostia.config.ts")??pn("ostia.config.json")}function s(a,x){return`${a.baselineDir}/${x??a.baseline}.json`}async function L(){if(await Bun.file("ostia.config.ts").exists())return"ostia.config.ts";if(await Bun.file("ostia.config.json").exists())return"ostia.config.json";return}var ot=10,st=3000000000,at=3;function Ze(a){if(a.timeSource)N(a.timeSource);let x=a.warmup??at,v=a.samples,E=a.minSamples??ot,U=v??E,ie=v!==void 0?0:a.budgetMs!==void 0?a.budgetMs*1e6:st,G=a.timeSource!==void 0,A=a.ignoreExitCodes??[],ae=new Set(A),X=[],oe=0,ue=0,me=!1,le;function de(){if(me)return!0;if(v!==void 0)return ue>=v;return ue>=U&&oe>=ie}async function fe(pe,he){if(a.prepare)await F(a.prepare,{phase:pe,index:he},{cwd:a.cwd,env:a.env,timeoutMs:a.timeoutMs,signal:a.signal});return q(a)}return{async warmup(){for(let pe=0;pe<x;pe++){if(a.signal?.aborted)return;await fe("warmup",pe)}},async step(){if(de()||a.signal?.aborted)return!1;let pe=await fe("timing",ue);if(a.signal?.aborted)return!1;if(pe.timeSourceNoMatch)le??=pe.timeSourceMissOutput;if(X.push({i:ue,wallNs:pe.wallNs,exitCode:pe.exitCode??void 0,userNs:pe.userNs,systemNs:pe.systemNs,maxRssBytes:pe.maxRssBytes,...pe.reportedNs!==void 0&&{reportedNs:pe.reportedNs},...pe.timedOut?{timedOut:!0}:{},...pe.timeSourceNoMatch?{timeSourceNoMatch:!0}:{}}),oe+=pe.wallNs,ue++,a.failOnNonzero&&pe.exitCode!==null&&pe.exitCode!==0&&!ae.has(pe.exitCode))me=!0;return!0},done:de,result(){let pe=X.filter((ce)=>!ce.timedOut&&!ce.timeSourceNoMatch),he=pe.map((ce)=>G?ce.reportedNs:ce.wallNs),ye=[],be=X.filter((ce)=>ce.timedOut).length;if(be>0)ye.push({code:"timeout",message:`${be} of ${X.length} trial(s) timed out after ${a.timeoutMs}ms.`,data:{timeoutMs:a.timeoutMs,trials:be}});let se=X.filter((ce)=>ce.timeSourceNoMatch).length;if(se>0&&a.timeSource){let{pattern:ce}=a.timeSource;ye.push({code:"time-source-no-match",message:`${se} of ${X.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof ce==="string"?ce:ce.source,trials:se,...le!==void 0&&{output:le}}})}if(he.length===0)return{trials:X,warnings:ye};let ge=k(he);return ye.push(...O(ge,pe.map((ce)=>ce.exitCode),G?"reported":"subprocess",A)),{trials:X,timing:ge,warnings:ye}}}}async function en(a){await a.warmup();while(await a.step());}async function z(a){let x=Ze(a);return await en(x),x.result()}async function I(a,x){let v=new Set;for(let E of a)for await(let U of new Bun.Glob(E).scan({cwd:x,absolute:!1}))v.add(U);return[...v].sort()}var hn=new URL("./runner.ts",import.meta.url).pathname;function _(){return Math.max(1,navigator.hardwareConcurrency||1)}async function H(a,x){return I(a,x)}function mt(a){if(a===void 0)return;return a==="auto"?_():a}async function J(a,x,v=process.cwd()){return{suites:a.suites.length>0?a.suites:x?.suites?await H(x.suites,v):[],budgetMs:a.budgetMs??x?.budgetMs,samples:a.samples??x?.samples,minSamples:a.minSamples??x?.minSamples,jobs:a.jobs??mt(x?.jobs),gc:a.gc??x?.gc??!1,cpu:a.cpu??x?.cpu??!1,alloc:a.alloc??x?.alloc??!1,filter:a.filter??x?.filter,isolate:a.isolate??x?.isolate??!1,preload:a.preload.length>0?a.preload:x?.preload??[],bunFlags:a.bunFlags,outDir:a.outDir??x?.outDir,noiseCheck:a.noiseCheck,timeoutMs:a.timeoutMs??x?.timeoutMs,cwd:v}}async function b(a){if(a.samples!==void 0&&(!Number.isFinite(a.samples)||a.samples<1))throw RangeError(`bench: samples must be >= 1, got ${a.samples}`);if(a.minSamples!==void 0&&(!Number.isFinite(a.minSamples)||a.minSamples<1))throw RangeError(`bench: minSamples must be >= 1, got ${a.minSamples}`);if(a.budgetMs!==void 0&&!Number.isFinite(a.budgetMs))throw RangeError(`bench: budgetMs must be finite, got ${a.budgetMs}`);let v=`${a.outDir??Be}/bench-tmp`,E=a.cwd??process.cwd(),U=Math.max(1,Math.floor(a.jobs??1)),ie={budgetMs:a.budgetMs,samples:a.samples,minSamples:a.minSamples,gc:a.gc,cpu:a.cpu,alloc:a.alloc,noiseCheck:a.noiseCheck},G=(ue)=>ue.startsWith("/")?ue:`${E}/${ue}`,A=a.suites.map(G),ae=(a.preload??[]).map(G),X=a.bunFlags??[],oe=async(ue,me)=>{let le=new Set,de=0,fe,pe=async()=>{while(fe===void 0&&!a.signal?.aborted&&de<ue.length){let he=de++;try{let ye=D(a.timeoutMs,a.signal),be=Bun.spawn(ue[he],{cwd:E,stdout:"inherit",stderr:"inherit",stdin:"ignore",...ye.spawn});le.add(be);let se=await be.exited;if(le.delete(be),a.signal?.aborted)return;if(ye.timedOut())throw Error(`Bench suite timed out after ${a.timeoutMs}ms: ${me(he)}`);if(se!==0)throw Error(`Bench suite failed: ${me(he)} (runner exited ${se})`)}catch(ye){fe??=ye instanceof Error?ye:Error(String(ye));for(let be of le)be.kill()}}};if(await Promise.all(Array.from({length:Math.min(U,ue.length)},pe)),fe)throw fe};try{let ue=A.map((ce)=>`${v}/${e("bench-plan",ce)}.json`),me=A.map((ce)=>`${v}/${e("bench-primary",ce)}.json`),le=A.map((ce,we)=>["bun",...X,hn,ce,me[we],JSON.stringify({...ie,filter:a.filter,isolate:a.isolate,preload:ae,planPath:ue[we]})]);await oe(le,(ce)=>a.suites[ce]);let de=await Promise.all(ue.map(async(ce)=>{if(!await Bun.file(ce).exists())return[];let{tasks:we}=await Bun.file(ce).json();return we})),fe=await Promise.all(me.map(async(ce)=>await Bun.file(ce).exists()?r(ce):void 0)),pe=[];for(let ce=0;ce<de.length;ce++)for(let we of de[ce])if(we.isolate)pe.push({suiteIndex:ce,taskIds:[we.id]});let he=pe.map((ce,we)=>`${v}/${e("bench-item",A[ce.suiteIndex],we)}.json`),ye=pe.map((ce,we)=>["bun",...X,hn,A[ce.suiteIndex],he[we],JSON.stringify({...ie,taskIds:ce.taskIds,preload:ae,markIsolated:!0})]);await oe(ye,(ce)=>a.suites[pe[ce].suiteIndex]);let be=await Promise.all(he.map(async(ce)=>await Bun.file(ce).exists()?r(ce):void 0)),se=[],ge=[];for(let ce=0;ce<de.length;ce++){let we=fe[ce];if(!we)continue;let Me=new Map;for(let ke of we.measurements){let $e=Me.get(ke.workloadId)??[];$e.push(ke),Me.set(ke.workloadId,$e)}let Pe=0,xe=new Map;pe.forEach((ke,$e)=>{let Ce=be[$e];if(ke.suiteIndex===ce&&Ce)xe.set(ke.taskIds[0],Ce)});for(let ke of de[ce])if(ke.isolate){let $e=xe.get(ke.id);if(!$e)continue;let Ce=$e.workloads[0];se.push(Ce);for(let Le of $e.measurements)if(Le.workloadId===Ce.id)ge.push(Le)}else{let $e=we.workloads[Pe];se.push($e),Pe++;for(let Ce of Me.get($e.id)??[])ge.push(Ce)}}if(a.signal?.aborted&&ge.length>0){let ce=ge[ge.length-1];ce.warnings=[...ce.warnings,{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed."}]}return t(se,ge,fe.find((ce)=>ce!==void 0)?.environment)}finally{await Bun.spawn(["rm","-rf",v]).exited}}function Q(a,x,v=8){if(v<=1)throw RangeError(`range: multiplier must be > 1, got ${v}`);if(a<=0)throw RangeError(`range: start must be > 0, got ${a}`);let E=[];for(let U=a;U<=x;U*=v)E.push(U);if(!E.includes(x))E.push(x);return E}function Se(a,x){if(x){let v=a.measurements.find((E)=>E.id===x);return v?.cpu?[v]:[]}return a.measurements.filter((v)=>v.phase==="cpu"&&v.cpu)}function Oe(a){let x=a.nodes,v=x.length,E=ct(a),U=new Int32Array(v).fill(-1);for(let ae=0;ae<v;ae++)for(let X of x[ae].children){let oe=E(X);if(oe!==-1)U[oe]=ae}let ie=[];for(let ae=0;ae<v;ae++)if(U[ae]===-1)ie.push(ae);let G=[],A=[];for(let ae=ie.length-1;ae>=0;ae--)A.push(ie[ae]);while(A.length>0){let ae=A.pop();G.push(ae);for(let X of x[ae].children){let oe=E(X);if(oe!==-1&&U[oe]===ae)A.push(oe)}}return{count:v,indexOf:E,parentIx:U,roots:ie,order:G}}function ct(a){let x=a.nodes,v=x.length,E=1/0,U=-1/0,ie=!0;for(let A=0;A<v;A++){let ae=x[A].id;if(!Number.isInteger(ae)){ie=!1;break}if(ae<E)E=ae;if(ae>U)U=ae}if(ie&&v>0&&U-E<v*4+64){let A=U-E+1,ae=new Int32Array(A).fill(-1);for(let X=0;X<v;X++)ae[x[X].id-E]=X;return(X)=>{let oe=X-E;return oe>=0&&oe<A?ae[oe]:-1}}let G=new Map;for(let A=0;A<v;A++)G.set(x[A].id,A);return(A)=>G.get(A)??-1}function bn(a,x){let{count:v,indexOf:E,parentIx:U,order:ie}=x,G=new Float64Array(v),A=new Float64Array(v),ae=a.samples?.nodeIds??[],X=a.samples?.timeDeltasUs??[];for(let ue=0;ue<ae.length;ue++){let me=E(ae[ue]);if(me===-1)continue;G[me]+=X[ue]??0,A[me]+=1}let oe=new Float64Array(v);for(let ue=ie.length-1;ue>=0;ue--){let me=ie[ue];oe[me]+=G[me];let le=U[me];if(le>=0)oe[le]+=oe[me]}return{selfUs:G,totalUs:oe,samples:A}}var wn={name:"collapsed",async render(a,x={}){return{files:Se(a,x.measurementId).map((U)=>{let ie=U.cpu,{nodes:G,frames:A}=ie,ae=Oe(ie),X=Array(ae.count);for(let de of ae.order){let fe=A[G[de].frameIx].name||"(anonymous)",pe=ae.parentIx[de];X[de]=pe===-1?fe:`${X[pe]};${fe}`}let oe=new Float64Array(ae.count),ue=[],me=ie.samples?.nodeIds??[];for(let de=0;de<me.length;de++){let fe=ae.indexOf(me[de]);if(fe===-1)continue;if(oe[fe]++===0)ue.push(fe)}let le=Array(ue.length);for(let de=0;de<ue.length;de++){let fe=ue[de];le[de]=`${X[fe]} ${oe[fe]}`}return{path:`${U.id}.collapsed.txt`,content:le.join(`
3
3
  `)+(le.length>0?`
4
4
  `:"")}})}}};var yn={name:"cpuprofile",async render(a,x={}){let v=Se(a,x.measurementId),E=[],U=[];for(let ie of v){if(ie.cpu?.origin!=="cpu-prof"&&ie.cpu?.origin!=="inspector"){U.push(`${ie.id} (origin ${ie.cpu?.origin??"unknown"} has no .cpuprofile artifact to pass through)`);continue}let G=ie.artifacts.find((ae)=>ae.kind==="cpuprofile");if(!G){U.push(`${ie.id} (no cpuprofile artifact recorded on this run)`);continue}let A=Bun.file(G.path);if(!await A.exists()){U.push(`${ie.id} (artifact missing on disk: ${G.path})`);continue}E.push({path:`${ie.id}.cpuprofile`,content:await A.text()})}if(E.length===0&&U.length>0)return{text:`No .cpuprofile artifacts available:
5
5
  ${U.map((ie)=>` - ${ie}`).join(`
@@ -7,6 +7,6 @@ ${u(s.trimEnd())}`);return c.length>0?c.join(`
7
7
  \u2026(${n} bytes elided)\u2026
8
8
  `;async function nn(n,s=Qe){let i=Math.floor(s/2),u=n.getReader(),c=[],b=0,I=[],C=0,S=0;try{for(;;){let{done:ne,value:re}=await u.read();if(ne)break;if(!re||re.byteLength===0)continue;S+=re.byteLength;let V=re;if(b<i){let J=i-b;if(V.byteLength<=J){c.push(V),b+=V.byteLength;continue}c.push(V.subarray(0,J)),b+=J,V=V.subarray(J)}I.push(V),C+=V.byteLength;while(C>i&&I.length>0){let J=I[0],Q=C-i;if(J.byteLength<=Q)I.shift(),C-=J.byteLength;else I[0]=J.subarray(Q),C-=Q}}}finally{u.releaseLock()}let j=new TextDecoder,W=j.decode(ve(c));if(S<=b+C)return W;let _=j.decode(ve(I)),H=S-b-C;return`${W}${en(H)}${_}`}function ve(n){let s=n.reduce((c,b)=>c+b.byteLength,0),i=new Uint8Array(s),u=0;for(let c of n)i.set(c,u),u+=c.byteLength;return i}async function F(n,s,i){if(typeof n==="function"){await n(s);return}let u=ke(n),c=D(i.timeoutMs,i.signal),b=Bun.spawn(u,{cwd:i.cwd,env:i.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...c.spawn}),I=nn(b.stderr).catch(()=>""),C=await b.exited;if(c.timedOut()){let S=(await I).trim();throw Error(`prepare command "${u.join(" ")}" timed out after ${i.timeoutMs}ms before ${s.phase} trial ${s.index}.${S?`
9
9
  ${S}`:""}`)}if(i.signal?.aborted)return;if(C!==0){let S=(await I).trim();throw Error(`prepare command "${u.join(" ")}" exited with code ${C} before ${s.phase} trial ${s.index}.${S?`
10
- ${S}`:""}`)}}function ke(n){if(n===void 0||typeof n==="function")return;return Array.isArray(n)?n:m(n)}function Ne(n){if(n===void 0)return;return{pattern:typeof n.pattern==="string"?n.pattern:n.pattern.source,...n.group!==void 0&&{group:n.group},...n.unit!==void 0&&{unit:n.unit}}}function m(n){return n.trim().split(/\s+/).filter(Boolean)}import{renameSync as rn}from"fs";var Oe={name:"ostia",version:"0.2.4",description:"Fast profiling and benchmarking for Bun.",type:"module",engines:{bun:">=1.4.0"},exports:{".":"./src/index.ts"},bin:{ostia:"./src/cli/main.ts"},scripts:{build:"bun scripts/build.ts",test:"bun test",typecheck:"tsc6",lint:"biome check .","lint:fix":"biome check --write . --unsafe","lint:changed":"biome check --changed --no-errors-on-unmatched .","lint:fix:changed":"biome check --write --unsafe --changed --no-errors-on-unmatched .",knip:"knip-bun",bench:"bun src/cli/main.ts bench bench/*.ts","bench:baseline":"bun src/cli/main.ts bench bench/*.ts --budget 3000 --min-samples 30 --export-json .ostia/baselines/bench-main.json",baseline:"bun src/cli/main.ts baseline save",dogfood:"bun test && bun src/cli/main.ts ci",examples:"bun scripts/run-examples.ts"},devDependencies:{"@biomejs/biome":"2.5.12","@types/bun":"^1.4.0",knip:"^6.34.0",typescript:"npm:@typescript/typescript6@^6.0.2"}};var x=Oe.version;function y(n,s){return JSON.stringify(ye(n),null,s)}function ye(n){if(Array.isArray(n)){let s=!1;for(let i=0;i<n.length;i++){let u=n[i];if(u!==null&&typeof u==="object"){s=!0;break}}return s?n.map(ye):n}if(n!==null&&typeof n==="object"){let s=n,i={};for(let u of Object.keys(s).sort())i[u]=ye(s[u]);return i}return n}function e(n,...s){let i=Bun.CryptoHasher.hash("sha256",y(s),"hex");return`${n}_${i.slice(0,16)}`}var ge,Pe=!1;function Te(n){let s=Bun.spawnSync(["git",...n],{timeout:200,stdout:"pipe",stderr:"ignore"});return s.success?s.stdout.toString().trim():void 0}function Ee(){if(Pe)return ge;Pe=!0;try{let n=Te(["rev-parse","--short","HEAD"]);if(n===void 0)ge=void 0;else{let s=Te(["rev-parse","--abbrev-ref","HEAD"]),i=Te(["status","--porcelain"]);ge={sha:n,branch:s??"HEAD",dirty:(i?.length??0)>0}}}catch{ge=void 0}return ge}function t(n,s,i){let u=Ee();return{schemaVersion:2,toolVersion:x,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:n,measurements:s,...i!==void 0&&{environment:i},...u!==void 0&&{git:u}}}function P(n,s,i={}){if(i.timeSource)N(i.timeSource);let u=ke(i.prepare),c=Ne(i.timeSource),b=typeof i.prepare==="function"?i.prepare.toString():u;return{id:e("wl","subprocess",n,...b!==void 0||c!==void 0?[b??null,c??null]:[]),kind:"subprocess",command:n,label:s,...u!==void 0&&{prepare:u},...c!==void 0&&{timeSource:c}}}function K(n,s){return{id:e("wl","inprocess",n.name,n.toString()),kind:"inprocess",label:s}}function Be(n,s,i={}){return{id:i.params!==void 0?e("wl","inprocess-entry",n,s,i.params):e("wl","inprocess-entry",n,s),kind:"inprocess",entry:{file:n,task:s,...i.group!==void 0&&{group:i.group}},...i.label!==void 0&&{label:i.label},...i.baseline!==void 0&&{baseline:i.baseline},...i.description!==void 0&&{description:i.description},...i.groupDescription!==void 0&&{groupDescription:i.groupDescription},...i.isolated!==void 0&&{isolated:i.isolated},...i.params!==void 0&&{params:i.params},...i.skipped!==void 0&&{skipped:i.skipped}}}function d(n){return{id:e("run",n.workload.id,"timing",n.configFingerprint,Bun.version,x),workloadId:n.workload.id,phase:"timing",instrumented:!1,configFingerprint:n.configFingerprint,trials:n.trials,timing:n.timing,warnings:n.warnings,artifacts:[],memory:on(n.trials),...n.interleaved!==void 0&&{interleaved:n.interleaved}}}function on(n){let s=n.map((i)=>i.maxRssBytes).filter((i)=>i!==void 0);if(s.length===0)return;return{origin:"resourceUsage",perTrial:n.map((i)=>({rssBytes:i.maxRssBytes})),maxRssBytes:Math.max(...s)}}function p(n){return{id:e("run",n.workload.id,n.phase,n.configFingerprint,Bun.version,x),workloadId:n.workload.id,phase:n.phase,instrumented:!0,configFingerprint:n.configFingerprint,trials:[{i:0,wallNs:n.diagnosticWallNs,exitCode:n.exitCode}],diagnosticWallNs:n.diagnosticWallNs,cpu:n.cpu,heap:n.heap,memory:n.memory,jit:n.jit,warnings:n.warnings,artifacts:n.artifacts}}async function Y(n,s,i){let c=await Bun.file(i).arrayBuffer(),b=new Bun.CryptoHasher("sha256");return b.update(c),{id:e("art",n,s,i),kind:s,path:i,sha256:b.digest("hex"),bytes:c.byteLength}}function o(n){return e("cfg",n)}function f(n){return`${y(n,2)}
10
+ ${S}`:""}`)}}function ke(n){if(n===void 0||typeof n==="function")return;return Array.isArray(n)?n:m(n)}function Ne(n){if(n===void 0)return;return{pattern:typeof n.pattern==="string"?n.pattern:n.pattern.source,...n.group!==void 0&&{group:n.group},...n.unit!==void 0&&{unit:n.unit}}}function m(n){return n.trim().split(/\s+/).filter(Boolean)}import{renameSync as rn}from"fs";var Oe={name:"ostia",version:"0.2.5",description:"Fast profiling and benchmarking for Bun.",type:"module",engines:{bun:">=1.4.0"},exports:{".":"./src/index.ts"},bin:{ostia:"src/cli/main.ts"},scripts:{build:"bun scripts/build.ts",test:"bun test",typecheck:"tsc6",lint:"biome check .","lint:fix":"biome check --write . --unsafe","lint:changed":"biome check --changed --no-errors-on-unmatched .","lint:fix:changed":"biome check --write --unsafe --changed --no-errors-on-unmatched .",knip:"knip-bun",bench:"bun src/cli/main.ts bench bench/*.ts","bench:baseline":"bun src/cli/main.ts bench bench/*.ts --budget 3000 --min-samples 30 --export-json .ostia/baselines/bench-main.json",baseline:"bun src/cli/main.ts baseline save",dogfood:"bun test && bun src/cli/main.ts ci",examples:"bun scripts/run-examples.ts"},devDependencies:{"@biomejs/biome":"2.5.13","@types/bun":"^1.4.2",knip:"^6.35.1",typescript:"npm:@typescript/typescript6@^6.0.2"},repository:{type:"git",url:"git+https://github.com/metonym/ostia.git"}};var x=Oe.version;function y(n,s){return JSON.stringify(ye(n),null,s)}function ye(n){if(Array.isArray(n)){let s=!1;for(let i=0;i<n.length;i++){let u=n[i];if(u!==null&&typeof u==="object"){s=!0;break}}return s?n.map(ye):n}if(n!==null&&typeof n==="object"){let s=n,i={};for(let u of Object.keys(s).sort())i[u]=ye(s[u]);return i}return n}function e(n,...s){let i=Bun.CryptoHasher.hash("sha256",y(s),"hex");return`${n}_${i.slice(0,16)}`}var ge,Pe=!1;function Te(n){let s=Bun.spawnSync(["git",...n],{timeout:200,stdout:"pipe",stderr:"ignore"});return s.success?s.stdout.toString().trim():void 0}function Ee(){if(Pe)return ge;Pe=!0;try{let n=Te(["rev-parse","--short","HEAD"]);if(n===void 0)ge=void 0;else{let s=Te(["rev-parse","--abbrev-ref","HEAD"]),i=Te(["status","--porcelain"]);ge={sha:n,branch:s??"HEAD",dirty:(i?.length??0)>0}}}catch{ge=void 0}return ge}function t(n,s,i){let u=Ee();return{schemaVersion:2,toolVersion:x,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:n,measurements:s,...i!==void 0&&{environment:i},...u!==void 0&&{git:u}}}function P(n,s,i={}){if(i.timeSource)N(i.timeSource);let u=ke(i.prepare),c=Ne(i.timeSource),b=typeof i.prepare==="function"?i.prepare.toString():u;return{id:e("wl","subprocess",n,...b!==void 0||c!==void 0?[b??null,c??null]:[]),kind:"subprocess",command:n,label:s,...u!==void 0&&{prepare:u},...c!==void 0&&{timeSource:c}}}function K(n,s){return{id:e("wl","inprocess",n.name,n.toString()),kind:"inprocess",label:s}}function Be(n,s,i={}){return{id:i.params!==void 0?e("wl","inprocess-entry",n,s,i.params):e("wl","inprocess-entry",n,s),kind:"inprocess",entry:{file:n,task:s,...i.group!==void 0&&{group:i.group}},...i.label!==void 0&&{label:i.label},...i.baseline!==void 0&&{baseline:i.baseline},...i.description!==void 0&&{description:i.description},...i.groupDescription!==void 0&&{groupDescription:i.groupDescription},...i.isolated!==void 0&&{isolated:i.isolated},...i.params!==void 0&&{params:i.params},...i.skipped!==void 0&&{skipped:i.skipped}}}function d(n){return{id:e("run",n.workload.id,"timing",n.configFingerprint,Bun.version,x),workloadId:n.workload.id,phase:"timing",instrumented:!1,configFingerprint:n.configFingerprint,trials:n.trials,timing:n.timing,warnings:n.warnings,artifacts:[],memory:on(n.trials),...n.interleaved!==void 0&&{interleaved:n.interleaved}}}function on(n){let s=n.map((i)=>i.maxRssBytes).filter((i)=>i!==void 0);if(s.length===0)return;return{origin:"resourceUsage",perTrial:n.map((i)=>({rssBytes:i.maxRssBytes})),maxRssBytes:Math.max(...s)}}function p(n){return{id:e("run",n.workload.id,n.phase,n.configFingerprint,Bun.version,x),workloadId:n.workload.id,phase:n.phase,instrumented:!0,configFingerprint:n.configFingerprint,trials:[{i:0,wallNs:n.diagnosticWallNs,exitCode:n.exitCode}],diagnosticWallNs:n.diagnosticWallNs,cpu:n.cpu,heap:n.heap,memory:n.memory,jit:n.jit,warnings:n.warnings,artifacts:n.artifacts}}async function Y(n,s,i){let c=await Bun.file(i).arrayBuffer(),b=new Bun.CryptoHasher("sha256");return b.update(c),{id:e("art",n,s,i),kind:s,path:i,sha256:b.digest("hex"),bytes:c.byteLength}}function o(n){return e("cfg",n)}function f(n){return`${y(n,2)}
11
11
  `}async function E(n,s){let i=`${s}.tmp-${process.pid}`;await Bun.write(i,n),rn(i,s)}async function a(n,s){await E(f(n),s)}function sn(n){if(n.schemaVersion===2)return n;let{runs:s,comparisons:i,...u}=n;return{...u,schemaVersion:2,measurements:s.map(({baselineRunId:c,...b})=>b),...i!==void 0&&{comparisons:i.map(({baselineRunId:c,candidateRunId:b,...I})=>({...I,baselineMeasurementId:c,candidateMeasurementId:b}))}}}class A extends Error{code;path;schemaVersion;constructor(n,s,i={}){super(s);this.name="OstiaDocumentError",this.code=n,this.path=i.path,this.schemaVersion=i.schemaVersion}}async function r(n){let s=await Bun.file(n).text(),i;try{i=JSON.parse(s)}catch(c){let b=c instanceof Error?c.message:String(c);throw new A("invalid-json",`${n}: invalid JSON (${b})`,{path:n})}let u=i!==null&&typeof i==="object"?i.schemaVersion:void 0;if(typeof u!=="number")throw new A("not-a-document",`${n}: not a ProfileDocument (missing schemaVersion)`,{path:n});if(u!==1&&u!==2)throw new A("unsupported-schema",`${n}: unsupported ProfileDocument schemaVersion ${u} (this ostia reads 1\u20132)`,{path:n,schemaVersion:u});return sn(i)}import xe from"os";function k(n){if(n.length===0)throw Error("computeTimingStats: samples must be non-empty");let s=n.length,i=an(n),u=0;for(let w=0;w<s;w++)u+=n[w];let c=u/s,b=l(i,0.5),I=0;for(let w=0;w<s;w++){let L=n[w]-c;I+=L*L}let C=Math.sqrt(I/s),S=i[0],j=i[s-1],W=l(i,0.25),_=l(i,0.75),H=_-W,ne=W-1.5*H,re=_+1.5*H,V=W-3*H,J=_+3*H,Q=0,te=0;for(let w=0;w<s;w++){let L=n[w];if(L<V||L>J)te++;else if(L<ne||L>re)Q++}let ce=l(i,0.99),ee=new Float64Array(s);for(let w=0;w<s;w++)ee[w]=Math.abs(n[w]-b);ee.sort();let ae=l(ee,0.5);return{unit:"ns",samples:n,mean:c,median:b,stddev:C,min:S,max:j,outliers:{mild:Q,severe:te},p25:W,p75:_,p99:ce,mad:ae}}function an(n){let s=new Float64Array(n.length);return s.set(n),s.sort(),s}function l(n,s){let i=n.length;if(i===1)return n[0];let u=s*(i-1),c=Math.floor(u),b=Math.ceil(u);if(c===b)return n[c];let I=u-c;return n[c]*(1-I)+n[b]*I}var un=5000000,cn=200;function O(n,s,i="subprocess",u=[]){let c=[],b=n.samples[0];if(b!==void 0&&n.p25!==void 0&&n.p75!==void 0){let S=n.p75-n.p25;if(b>n.median+3*S&&S>0)c.push({code:"slow-first-run",message:`First run took ${(b/1e6).toFixed(2)}ms, much slower than the median ${(n.median/1e6).toFixed(2)}ms. Consider more warmup.`,data:{firstNs:b,medianNs:n.median}})}if(n.outliers.mild+n.outliers.severe>0)c.push({code:"outliers-detected",message:`${n.outliers.mild+n.outliers.severe} outlier(s) detected (${n.outliers.severe} severe, ${n.outliers.mild} mild).`,data:n.outliers});if(i==="subprocess"&&n.median<un)c.push({code:"fast-command",message:`Median run time (${(n.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:n.median}});if(i==="inprocess"&&n.median<cn)c.push({code:"below-timer-resolution",message:`Median run time (${n.median.toFixed(0)}ns) is close to timer resolution; consider a larger batch size or a coarser operation.`,data:{medianNs:n.median}});let I=new Set(u),C=s.filter((S)=>S!==void 0&&S!==0&&!I.has(S));if(C.length>0)c.push({code:"nonzero-exit",message:`${C.length} of ${s.length} trial(s) exited non-zero.`,data:{exitCodes:C}});return c}var ln=200,Ae=64,mn=(()=>{let n=new Uint8Array(4096);for(let s=0;s<n.length;s++)n[s]=s*2654435761&255;return n})();function dn(n,s){let i=s;for(let u=0;u<n.length;u++)i^=n[u],i=Math.imul(i,16777619);return i>>>0}function pn(n){let s=k(n),i=s.mad??0;return{floorPct:s.median===0?0:i/s.median*100,referenceMedianNs:s.median,samples:n.length}}function Fe(n=ln){let s=n*1e6,i=[],u=0,c=Bun.nanoseconds(),b=0;while(b<s){let I=Bun.nanoseconds();for(let S=0;S<Ae;S++)u^=dn(mn,S);let C=Bun.nanoseconds();i.push((C-I)/Ae),b=Bun.nanoseconds()-c}return pn(i)}var fn=0.75;function g(){let[n=0,s=0]=xe.loadavg();return{cpuModel:xe.cpus()[0]?.model??"unknown",cores:xe.availableParallelism(),loadAvg1:n,loadAvg5:s,noise:Fe()}}function h(n){if(n.loadAvg1<=n.cores*fn)return;return{code:"noisy-machine",message:`Load average ${n.loadAvg1.toFixed(2)} exceeds 75% of ${n.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:n.loadAvg1,cores:n.cores}}}import{profile as bn}from"bun:jsc";var gn=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),Ce=4294967295;function Ue(n,s){let i=s??n.interval*1e6,u=new Map,c=[];function b(w,L,z,le){let me=u.get(w);if(me===void 0)me=new Map,u.set(w,me);let ue=L??"",de=me.get(ue);if(de===void 0)de=c.length,me.set(ue,de),c.push({key:e("fr",w,ue),name:w,url:L,line:z,col:le});return de}function I(w){let L=w.line===Ce,z=L?void 0:w.line-1,le=L||w.column===Ce?void 0:w.column-1;return b(w.name,w.sourceURL,z,le)}let C=b("(root)",void 0,void 0,void 0),S=1,j={id:0,frameIx:C,children:new Map,selfUs:0,samples:0,totalUs:0},W=new Map([[0,j]]),_={llint:0,baseline:0,dfg:0,ftl:0},H=new Map,ne=[],re=[];for(let w of n.traces){let L=w.frames,z=j;for(let ue=L.length-1;ue>=0;ue--){let de=I(L[ue]),pe=z.children.get(de);if(!pe)pe={id:S++,frameIx:de,children:new Map,selfUs:0,samples:0,totalUs:0},z.children.set(de,pe),W.set(pe.id,pe);z=pe}z.selfUs+=i,z.samples+=1,ne.push(z.id),re.push(i);let le=L[0],me=le&&gn.get(le.category);if(me){_[me]++;let ue=H.get(me)??new Map;ue.set(z.frameIx,(ue.get(z.frameIx)??0)+1),H.set(me,ue)}}function V(w){let L=w.selfUs;for(let z of w.children.values())L+=V(z);return w.totalUs=L,L}V(j);let J=new Map;function Q(w){let L=J.get(w.frameIx);if(L)L.selfUs+=w.selfUs,L.totalUs+=w.totalUs,L.samples+=w.samples;else J.set(w.frameIx,{frameIx:w.frameIx,selfUs:w.selfUs,totalUs:w.totalUs,samples:w.samples});for(let z of w.children.values())Q(z)}Q(j);let te=[...W.values()].map((w)=>({id:w.id,frameIx:w.frameIx,children:[...w.children.values()].map((L)=>L.id)})),ce={origin:"jsc-profile",samplingIntervalUs:i,frames:c,nodes:te,totals:[...J.values()].sort((w,L)=>L.selfUs-w.selfUs),samples:{nodeIds:ne,timeDeltasUs:re}},ee=[...H.entries()].flatMap(([w,L])=>[...L.entries()].sort((z,le)=>le[1]-z[1]).slice(0,3).map(([z,le])=>({tier:w,frameKey:c[z].key,samples:le})));return{cpu:ce,jit:{origin:"jsc-profile",tiers:_,topFramesByTier:ee}}}var hn=1000;async function B(n,s={}){let i=s.intervalUs??hn,u,c=Bun.nanoseconds(),b=await bn(async()=>(u=await n(),u),i),I=Bun.nanoseconds()-c,{cpu:C,jit:S}=Ue(b.stackTraces,i);return{result:u,cpu:C,jit:S,diagnosticWallNs:I}}var wn=500,kn=20,$e=3,yn=10,Tn=2,xn=0.1,Sn=1000,Mn=1e4;function Le(n){let s=Math.log10(Math.max(1,n)/1e6),i=Math.round($e+Tn*s);return Math.min(yn,Math.max($e,i))}function Rn(n,s){let i=Math.floor(s/n);return Math.min(kn,Math.max(i,Le(n)))}var De=0;function U(n){if(typeof n==="number")De+=n;else if(n!==void 0&&n!==null)De+=1}function be(n){return n!==null&&typeof n==="object"&&typeof n.then==="function"}function _e(n,s){return Math.max(1,Math.ceil(Sn/n),Math.ceil(s/(n*Mn)))}async function We(n,s={}){let i=(s.budgetMs??wn)*1e6,u=i*(s.warmup??xn),c=Bun.nanoseconds(),b=0,I=0;while(I<u){let ee=n();U(be(ee)?await ee:ee),b++,I=Bun.nanoseconds()-c}let C;if(b>0)C=Math.max(1,I/b);else{let ee=Bun.nanoseconds(),ae=n();U(be(ae)?await ae:ae),C=Math.max(1,Bun.nanoseconds()-ee)}let S=_e(C,i);if(S>1){let ee=Bun.nanoseconds();for(let ae=0;ae<S;ae++){let w=n();U(be(w)?await w:w)}C=Math.max(1,(Bun.nanoseconds()-ee)/S),S=_e(C,i)}let j=C*S,W=s.samples??s.minSamples??Rn(j,i),_=s.samples!==void 0?0:i,H=[],ne=Bun.nanoseconds(),re=0,V=0;while(V<W||re<_){let ee=Bun.nanoseconds();for(let w=0;w<S;w++){let L=n();U(be(L)?await L:L)}let ae=Bun.nanoseconds();if(H.push({i:V,wallNs:(ae-ee)/S}),V++,re=Bun.nanoseconds()-ne,s.gc)Bun.gc(!0);if(s.samples!==void 0&&V>=s.samples)break}let J=H.map((ee)=>ee.wallNs),Q=k(J);if(S>1)Q.batch=S;let te=O(Q,[],"inprocess"),ce=Le(j);if(H.length<ce)te.push({code:"low-sample-count",message:`Only ${H.length} sample(s) at ~${vn(j)} per trial; ${ce} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:H.length,target:ce,trialCostNs:j}});return{trials:H,timing:Q,warnings:te}}function vn(n){if(n>=1e9)return`${(n/1e9).toFixed(2)}s`;if(n>=1e6)return`${(n/1e6).toFixed(1)}ms`;if(n>=1000)return`${(n/1000).toFixed(1)}\xB5s`;return`${n.toFixed(0)}ns`}var Re=[],oe,fe;function Se(n,s,i,u){let c=oe;oe={name:n,description:i?.description,isolate:i?.isolate,gc:i?.gc,cpu:i?.cpu,alloc:i?.alloc,before:i?.before,after:i?.after,skip:u.skip,only:u.only};try{s()}finally{oe=c}}var se=Object.assign((n,s,i)=>Se(n,s,i,{}),{skip:(n,s,i)=>Se(n,s,i,{skip:!0}),only:(n,s,i)=>Se(n,s,i,{only:!0})});function Me(n,s,i,u){let c=fe!==void 0||i?.params!==void 0?{...fe,...i?.params}:void 0;Re.push({groupName:oe?.name,groupDescription:oe?.description,groupIsolate:oe?.isolate,groupGc:oe?.gc,groupCpu:oe?.cpu,groupAlloc:oe?.alloc,groupBefore:oe?.before,groupAfter:oe?.after,name:n,fn:s,baseline:i?.baseline,params:c,skipped:u.skip||oe?.skip,only:u.only||oe?.only,opts:i})}var ie=Object.assign((n,s,i)=>Me(n,s,i,{}),{skip:(n,s,i)=>Me(n,s,i,{skip:!0}),only:(n,s,i)=>Me(n,s,i,{only:!0})});function M(){return Re}function X(){Re.length=0,oe=void 0,fe=void 0}function Z(n,s){let i=fe;fe=n;try{return s()}finally{fe=i}}function v(n){return n.groupName?`${n.groupName}/${n.name}`:n.name}function G(n,s){return n.opts?.isolate??n.groupIsolate??s}function je(n,s){return n.opts?.gc??n.groupGc??s}function Ge(n,s){return n.opts?.cpu??n.groupCpu??s}function He(n,s){return n.opts?.alloc??n.groupAlloc??s}function T(n,s){if(!s)return[...n];let i=new RegExp(s);return n.filter((u)=>i.test(v(u)))}import{heapStats as In}from"bun:jsc";var Nn=100;function Je(){try{return In().heapSize}catch{return process.memoryUsage().heapUsed}}async function Ve(n,s=Nn){let i=Bun.nanoseconds();Bun.gc(!0);let u=Je();for(let I=0;I<s;I++){let C=n();if(C instanceof Promise)await C}Bun.gc(!0);let c=Je(),b=Bun.nanoseconds()-i;return{memory:{origin:"heapStats",bytesPerOp:Math.max(0,(c-u)/s)},diagnosticWallNs:b}}var On=200,Pn=20;async function ze(n,s=On){let i=s*1e6,u=async()=>{let C=Bun.nanoseconds();while(Bun.nanoseconds()-C<i){let S=n();if(S instanceof Promise)await S}},{cpu:c,jit:b,diagnosticWallNs:I}=await B(u);return{cpu:c,jit:b,diagnosticWallNs:I}}function Ke(n){let{llint:s,baseline:i,dfg:u,ftl:c}=n.tiers,b=s+i+u+c;if(b===0)return;let I=s/b*100,C=i/b*100,S=u/b*100,j=c/b*100;if(I+C<=Pn)return;return{code:"jit-cold",message:`${(I+C).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:I,baselinePct:C,dfgPct:S,ftlPct:j}}}async function R(n,s,i){let c=s.some((W)=>!W.skipped)&&i.noiseCheck!==!1?g():void 0,b=c?h(c):void 0,I=new Map,C=new Map;s.forEach((W,_)=>{if(W.groupName===void 0||W.skipped)return;if(!I.has(W.groupName))I.set(W.groupName,_);C.set(W.groupName,_)});let S=[],j=[];for(let W=0;W<s.length;W++){let _=s[W],H=v(_),ne=Be(n,H,{label:H,baseline:_.baseline,group:_.groupName,description:_.opts?.description,groupDescription:_.groupDescription,isolated:i.markIsolated,params:_.params,skipped:_.skipped});if(S.push(ne),_.skipped)continue;let re=_.groupName!==void 0&&I.get(_.groupName)===W,V=_.groupName!==void 0&&C.get(_.groupName)===W;if(re&&_.groupBefore)await _.groupBefore();if(_.opts?.before)await _.opts.before();let J={budgetMs:_.opts?.budgetMs??i.budgetMs,samples:_.opts?.samples??i.samples,minSamples:_.opts?.minSamples??i.minSamples,warmup:i.warmup,gc:je(_,i.gc??!1)},Q=await We(_.fn,J);if(j.push(d({workload:ne,configFingerprint:o({budgetMs:J.budgetMs??null,samples:J.samples??null,minSamples:J.minSamples??null,gc:J.gc??!1}),trials:Q.trials,timing:Q.timing,warnings:b&&j.length===0?[...Q.warnings,b]:Q.warnings})),Ge(_,i.cpu??!1)){let te=await ze(_.fn),ce=Ke(te.jit);j.push(p({workload:ne,phase:"cpu",configFingerprint:o({cpu:!0}),diagnosticWallNs:te.diagnosticWallNs,cpu:te.cpu,jit:te.jit,warnings:ce?[ce]:[],artifacts:[]}))}if(He(_,i.alloc??!1)){let te=await Ve(_.fn);j.push(p({workload:ne,phase:"memstats",configFingerprint:o({alloc:!0}),diagnosticWallNs:te.diagnosticWallNs,memory:te.memory,warnings:[],artifacts:[]}))}if(_.opts?.after)await _.opts.after();if(V&&_.groupAfter)await _.groupAfter()}return t(S,j,c)}
12
12
  export{y,e,k,l,O,N,D,q,F,m,x,t,P,K,d,p,Y,o,f,E,a,A,r,g,h,B,U,se,ie,M,X,Z,v,G,T,R};
package/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{e,m,x,t,P,d,o,f,E,a,r,g,h}from"./chunk-1wydyvyj.js";import{c,W,j,C,S,s,L,I,_,H,J,b,z,w,n,u,i,V}from"./chunk-cf9hya3b.js";function he(p){return e("cache",p.workloadId,p.phase,p.configFingerprint,p.bunVersion,p.toolVersion,p.instrumented,p.inputsDigest??null)}async function ge(p,l=process.cwd()){if(p.length===0)return;let k=await I(p,l),y=await Promise.all(k.map(async(v)=>{let M=await Bun.file(`${l}/${v}`).arrayBuffer();return{path:v,sha256:Bun.CryptoHasher.hash("sha256",M,"hex")}}));return e("inputs",y)}function be(p,l){return`${p}/cache/${l}.json`}async function we(p,l){let k=Bun.file(be(p,l));if(!await k.exists())return;return await k.json()}async function ke(p,l,k){await Bun.write(be(p,l),`${JSON.stringify(k,null,2)}
3
+ import{e,m,x,t,P,d,o,f,E,a,r,g,h}from"./chunk-v0efhnv2.js";import{c,W,j,C,S,s,L,I,_,H,J,b,z,w,n,u,i,V}from"./chunk-h5md141w.js";function he(p){return e("cache",p.workloadId,p.phase,p.configFingerprint,p.bunVersion,p.toolVersion,p.instrumented,p.inputsDigest??null)}async function ge(p,l=process.cwd()){if(p.length===0)return;let k=await I(p,l),y=await Promise.all(k.map(async(v)=>{let M=await Bun.file(`${l}/${v}`).arrayBuffer();return{path:v,sha256:Bun.CryptoHasher.hash("sha256",M,"hex")}}));return e("inputs",y)}function be(p,l){return`${p}/cache/${l}.json`}async function we(p,l){let k=Bun.file(be(p,l));if(!await k.exists())return;return await k.json()}async function ke(p,l,k){await Bun.write(be(p,l),`${JSON.stringify(k,null,2)}
4
4
  `)}var ve=600000;class ie extends Error{path;constructor(p){super(`No baseline document at ${p}. Create one with: ostia time --export-json ${p} <command...>`);this.path=p}}class re extends Error{path;missing;total;constructor(p,l,k){super(`${l} of ${k} configured workload(s) have no matching row in baseline ${p} (by workload id). Re-seed with: ostia baseline save`);this.path=p;this.missing=l;this.total=k}}function De(p,l,k){if(p)return p;return l===k?"fail":"warn"}function Ie(p,l=[]){let k=new Set(l),y=p.filter((v)=>!v.timedOut&&!v.timeSourceNoMatch).map((v)=>v.exitCode).filter((v)=>v!==void 0);return y.length>0&&y.every((v)=>v!==0&&!k.has(v))}async function me(p,l){let k=p.noiseCheck===!1?void 0:g(),y=k?h(k):void 0,v=[];for(let M of p.workloads){if(M.suites){let D=await H(M.suites,process.cwd()),ee=await b({suites:D,outDir:p.outDir,noiseCheck:!1,budgetMs:p.bench?.budgetMs,samples:p.bench?.samples,minSamples:p.bench?.minSamples,gc:p.bench?.gc,cpu:p.bench?.cpu,alloc:p.bench?.alloc,filter:p.bench?.filter,isolate:p.bench?.isolate,preload:p.bench?.preload,jobs:typeof p.bench?.jobs==="number"?p.bench.jobs:void 0,timeoutMs:p.bench?.timeoutMs??ve});for(let Y of ee.workloads){let X=ee.measurements.find((N)=>N.workloadId===Y.id&&N.phase==="timing");if(!X)continue;if(y)X.warnings.push(y);v.push({workload:Y,status:"executed",run:X,harnessFailed:!1})}continue}let R=P(M.command,M.label,{prepare:M.prepare,timeSource:M.timeSource}),A=await ge(M.inputs??[]),T=o({runs:p.runs,warmup:p.warmup}),K=typeof M.prepare!=="function",B=he({workloadId:R.id,phase:"timing",configFingerprint:T,bunVersion:Bun.version,toolVersion:x,instrumented:!1,inputsDigest:A}),U=l||!K?void 0:await we(p.outDir,B),G,O;if(U)G=U,O="cached";else{let D=await z({argv:M.command,samples:p.runs??void 0,warmup:p.warmup,prepare:M.prepare,timeSource:M.timeSource,timeoutMs:M.timeoutMs??ve,ignoreExitCodes:M.ignoreExitCodes,failOnNonzero:M.failOnNonzero});if(G=d({workload:R,configFingerprint:T,trials:D.trials,timing:D.timing,warnings:y?[...D.warnings,y]:D.warnings}),K)await ke(p.outDir,B,G);O="executed"}v.push({workload:R,status:O,run:G,harnessFailed:Ie(G.trials,M.ignoreExitCodes)})}return{results:v,environment:k}}async function ye(p){let{config:l}=p,k=s(l,p.baselineName);if(!await Bun.file(k).exists())throw new ie(k);let v=await r(k),{results:M,environment:R}=await me(l,p.full),A=M.map((N)=>({...N})),T=A.filter((N)=>N.status==="executed").length,K=A.length-T,B=A.filter((N)=>N.harnessFailed).length,U=t(A.map((N)=>N.workload),A.map((N)=>N.run),R),G=0,O=0,D=0,ee=W(v,U,l.thresholds);for(let N of A){let de=ee.compare(N.workload.id);if(!de){D++;continue}if(N.comparison=de,de.verdict==="pass")G++;else O++}if(D>0){if(De(l.onMissingBaseline,D,A.length)==="fail")throw new re(k,D,A.length)}let Y=A.map((N)=>N.comparison).filter((N)=>N!==void 0);U.comparisons=Y;let X=ee.unmatched();return U.unmatched={baseOnly:X.baseOnly.map((N)=>N.id),candOnly:X.candOnly.map((N)=>N.id)},U.comparisonSummary=j(Y,ee.effectiveTimingPct),{document:U,summary:{total:A.length,cached:K,executed:T,passed:G,regressed:O,missingBaseline:D,failed:B,results:A,unmatched:X},baseline:v}}function Ce(p){let l=[];if(l.push(`${p.total} workloads`),l.push(`${p.cached} cached`),l.push(`${p.executed} executed`),p.missingBaseline>0)l.push(`${p.missingBaseline} skipped (no matching baseline workload)`);if(p.failed>0){let y=p.results.filter((v)=>v.harnessFailed).map((v)=>n(v.workload));l.push(`${p.failed} failed (harness error, every trial exited non-zero: ${y.join(", ")})`)}let k=p.results.filter((y)=>y.comparison?.verdict==="fail").map((y)=>{let v=y.comparison.timing,M=n(y.workload);return v?`${v.medianDeltaPct>0?"+":""}${v.medianDeltaPct.toFixed(1)}% median on ${M}`:M});return l.push(`${p.passed} passed ${p.regressed} regressed${k.length>0?` (${k.join(", ")})`:""}`),l.push(""),l.push(`Profile CI: ${p.regressed>0||p.failed>0?"\u2717":"\u2713"}`),`${l.join(`
5
5
  `)}
6
6
  `}async function xe(p,l){let{results:k,environment:y}=await me(p,!1),v=t(k.map((R)=>R.workload),k.map((R)=>R.run),y),M=s(p,l);return await a(v,M),M}async function Pe(p){let l=[];try{let y=new Bun.Glob("*.json");for await(let v of y.scan({cwd:p.baselineDir,absolute:!1}))l.push(v.replace(/\.json$/,""))}catch{return[]}return l.sort(),(await Promise.all(l.map(async(y)=>{let v=s(p,y);try{let M=await r(v);return{name:y,path:v,createdAt:M.createdAt,toolVersion:M.toolVersion,bunVersion:M.bunVersion,workloads:M.workloads.length,...M.git!==void 0&&{git:M.git}}}catch{return}}))).filter((y)=>y!==void 0)}function te(p){return p instanceof Error?p.message:String(p)}var q=(p)=>Bun.write(Bun.stdout,p),$e=(p)=>Bun.write(Bun.stderr,p);class Q extends Error{}async function F(p,l,k){await $e(l.endsWith(`
package/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{c,C,b,Q,u,i,ee,ne,te,V,re}from"./chunk-cf9hya3b.js";import{t,a,A,r,U,se,ie}from"./chunk-1wydyvyj.js";export{c as DEFAULT_THRESHOLDS,u as MINIMAL_PROTOCOL_VERSION,A as OstiaDocumentError,b as bench,C as compareDocuments,t as createDocument,te as defineConfig,se as group,U as keep,r as loadDocument,re as profile,Q as range,i as renderers,ee as run,a as saveDocument,ne as sweep,ie as task,V as time};
2
+ import{c,C,b,Q,u,i,ee,ne,te,V,re}from"./chunk-h5md141w.js";import{t,a,A,r,U,se,ie}from"./chunk-v0efhnv2.js";export{c as DEFAULT_THRESHOLDS,u as MINIMAL_PROTOCOL_VERSION,A as OstiaDocumentError,b as bench,C as compareDocuments,t as createDocument,te as defineConfig,se as group,U as keep,r as loadDocument,re as profile,Q as range,i as renderers,ee as run,a as saveDocument,ne as sweep,ie as task,V as time};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ostia",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "Fast profiling and benchmarking for Bun.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -15,6 +15,10 @@
15
15
  "bin": {
16
16
  "ostia": "cli.js"
17
17
  },
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "git+https://github.com/metonym/ostia.git"
21
+ },
18
22
  "main": "./index.js",
19
23
  "module": "./index.js",
20
24
  "types": "./index.d.ts"
package/runner.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{a,M,X,v,G,T,R}from"./chunk-1wydyvyj.js";async function d(){let[s,l,c]=process.argv.slice(2);if(!s||!l)return process.stderr.write(`bench runner: usage: runner.ts <suiteFile> <outputPath> [optsJson]
3
+ import{a,M,X,v,G,T,R}from"./chunk-v0efhnv2.js";async function d(){let[s,l,c]=process.argv.slice(2);if(!s||!l)return process.stderr.write(`bench runner: usage: runner.ts <suiteFile> <outputPath> [optsJson]
4
4
  `),2;let e=c?JSON.parse(c):{};for(let t of e.preload??[])await import(t);X(),await import(s);let i=M();if(i.length===0)return process.stderr.write(`bench runner: ${s} registered no tasks (no task() calls found).
5
5
  `),2;let r=i.filter((t)=>t.only),p=r.length>0?r:i;if(r.length>0)process.stderr.write(`bench: ${r.length} task(s) selected by .only
6
6
  `);let n=T(p,e.filter);if(e.taskIds){let t=new Set(e.taskIds);n=n.filter((o)=>t.has(v(o)))}if(n.length===0)return process.stderr.write(`bench runner: --filter ${JSON.stringify(e.filter)} matched zero of ${p.length} registered task(s) in ${s}.