ostia 0.1.7 → 0.2.1

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.
@@ -0,0 +1,8 @@
1
+ // @bun
2
+ var De={ns:1,us:1000,ms:1e6,s:1e9};async function D(r){let c=r.timeSource!==void 0,l=Bun.nanoseconds(),b=Bun.spawn(r.argv,{cwd:r.cwd,env:r.env,stdout:c?"pipe":"ignore",stderr:c?"pipe":"ignore",stdin:"ignore"}),R=c?Promise.all([new Response(b.stdout).text(),new Response(b.stderr).text()]):void 0,M=await b.exited,N=Bun.nanoseconds(),C=b.resourceUsage?.(),G={wallNs:N-l,exitCode:M,userNs:C?Number(C.cpuTime.user)*1000:void 0,systemNs:C?Number(C.cpuTime.system)*1000:void 0,maxRssBytes:C?.maxRSS};if(R&&r.timeSource){let[V,ee]=await R;G.reportedNs=_e(r.timeSource,V,ee,r.argv)}return G}function _e(r,c,l,b=[]){let R=typeof r.pattern==="string"?new RegExp(r.pattern):r.pattern,M=r.group??1,N=R.exec(c)??R.exec(l),C=b.length>0?` for "${b.join(" ")}"`:"";if(!N)throw Error(`timeSource pattern ${R} did not match the output${C}. Output was:
3
+ ${$e(c,l)}`);let G=N[M];if(G===void 0)throw Error(`timeSource pattern ${R} matched${C} but has no capture group ${M} (matched text: "${N[0]}").`);let V=Number(G);if(!Number.isFinite(V))throw Error(`timeSource pattern ${R} group ${M} captured "${G}"${C}, which is not a number.`);return V*De[r.unit??"ms"]}function $e(r,c){let b=(M)=>M.length>800?`${M.slice(0,800)}\u2026(${M.length-800} more)`:M,R=[];if(r.trim())R.push(`--- stdout ---
4
+ ${b(r.trimEnd())}`);if(c.trim())R.push(`--- stderr ---
5
+ ${b(c.trimEnd())}`);return R.length>0?R.join(`
6
+ `):"(empty)"}async function k(r,c,l){if(typeof r==="function"){await r(c);return}let b=Array.isArray(r)?r:y(r),M=await Bun.spawn(b,{cwd:l.cwd,env:l.env,stdout:"ignore",stderr:"inherit",stdin:"ignore"}).exited;if(M!==0)throw Error(`prepare command "${b.join(" ")}" exited with code ${M} before ${c.phase} trial ${c.index}.`)}function Re(r){if(r===void 0||typeof r==="function")return;return Array.isArray(r)?r:y(r)}function Me(r){if(r===void 0)return;return{pattern:typeof r.pattern==="string"?r.pattern:r.pattern.source,...r.group!==void 0&&{group:r.group},...r.unit!==void 0&&{unit:r.unit}}}function y(r){return r.trim().split(/\s+/).filter(Boolean)}function x(r){return JSON.stringify(ge(r))}function ge(r){if(Array.isArray(r))return r.map(ge);if(r!==null&&typeof r==="object"){let c={};for(let l of Object.keys(r).sort())c[l]=ge(r[l]);return c}return r}function e(r,...c){let l=Bun.CryptoHasher.hash("sha256",x(c),"hex");return`${r}_${l.slice(0,16)}`}var be,Se=!1;function ke(r){let c=Bun.spawnSync(["git",...r],{timeout:200,stdout:"pipe",stderr:"ignore"});return c.success?c.stdout.toString().trim():void 0}function ve(){if(Se)return be;Se=!0;try{let r=ke(["rev-parse","--short","HEAD"]);if(r===void 0)be=void 0;else{let c=ke(["rev-parse","--abbrev-ref","HEAD"]),l=ke(["status","--porcelain"]);be={sha:r,branch:c??"HEAD",dirty:(l?.length??0)>0}}}catch{be=void 0}return be}var m="0.1.0";function n(r,c,l){let b=ve();return{schemaVersion:2,toolVersion:m,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:r,measurements:c,...l!==void 0&&{environment:l},...b!==void 0&&{git:b}}}function p(r,c,l={}){let b=Re(l.prepare),R=Me(l.timeSource),M=typeof l.prepare==="function"?l.prepare.toString():b;return{id:e("wl","subprocess",r,process.cwd(),...M!==void 0||R!==void 0?[M??null,R??null]:[]),kind:"subprocess",command:r,label:c,...b!==void 0&&{prepare:b},...R!==void 0&&{timeSource:R}}}function F(r,c){return{id:e("wl","inprocess",r.name,r.toString()),kind:"inprocess",label:c}}function O(r,c,l={}){return{id:l.params!==void 0?e("wl","inprocess-entry",r,c,l.params):e("wl","inprocess-entry",r,c),kind:"inprocess",entry:{file:r,task:c,...l.group!==void 0&&{group:l.group}},...l.label!==void 0&&{label:l.label},...l.baseline!==void 0&&{baseline:l.baseline},...l.description!==void 0&&{description:l.description},...l.groupDescription!==void 0&&{groupDescription:l.groupDescription},...l.isolated!==void 0&&{isolated:l.isolated},...l.params!==void 0&&{params:l.params},...l.skipped!==void 0&&{skipped:l.skipped}}}function i(r){return{id:e("run",r.workload.id,"timing",r.configFingerprint,Bun.version,m),workloadId:r.workload.id,phase:"timing",instrumented:!1,configFingerprint:r.configFingerprint,trials:r.trials,timing:r.timing,warnings:r.warnings,artifacts:[],memory:Ce(r.trials),...r.interleaved!==void 0&&{interleaved:r.interleaved}}}function Ce(r){let c=r.map((l)=>l.maxRssBytes).filter((l)=>l!==void 0);if(c.length===0)return;return{origin:"resourceUsage",perTrial:r.map((l)=>({rssBytes:l.maxRssBytes})),maxRssBytes:Math.max(...c)}}function a(r){return{id:e("run",r.workload.id,r.phase,r.configFingerprint,Bun.version,m),workloadId:r.workload.id,phase:r.phase,instrumented:!0,configFingerprint:r.configFingerprint,trials:[{i:0,wallNs:r.diagnosticWallNs,exitCode:r.exitCode}],diagnosticWallNs:r.diagnosticWallNs,cpu:r.cpu,heap:r.heap,memory:r.memory,jit:r.jit,warnings:r.warnings,artifacts:r.artifacts}}async function E(r,c,l){let R=await Bun.file(l).arrayBuffer(),M=new Bun.CryptoHasher("sha256");return M.update(R),{id:e("art",r,c,l),kind:c,path:l,sha256:M.digest("hex"),bytes:R.byteLength}}function o(r){return e("cfg",r)}function S(r){return`${JSON.stringify(ge(r),null,2)}
7
+ `}async function s(r,c){await Bun.write(c,S(r))}function We(r){if(r.schemaVersion===2)return r;let{runs:c,comparisons:l,...b}=r;return{...b,schemaVersion:2,measurements:c.map(({baselineRunId:R,...M})=>({...M,...R!==void 0&&{baselineMeasurementId:R}})),...l!==void 0&&{comparisons:l.map(({baselineRunId:R,candidateRunId:M,...N})=>({...N,baselineMeasurementId:R,candidateMeasurementId:M}))}}}async function t(r){let c=await Bun.file(r).text(),l=JSON.parse(c);return We(l)}import{profile as Le}from"bun:jsc";var Ge=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),Ie=4294967295;function Ne(r,c){let l=c??r.interval*1e6,b=new Map,R=[];function M(w,v,J,ne){let re=b.get(w);if(re===void 0)re=new Map,b.set(w,re);let Y=v??"",se=re.get(Y);if(se===void 0)se=R.length,re.set(Y,se),R.push({key:e("fr",w,Y),name:w,url:v,line:J,col:ne});return se}function N(w){let v=w.line===Ie,J=v?void 0:w.line-1,ne=v||w.column===Ie?void 0:w.column-1;return M(w.name,w.sourceURL,J,ne)}let C=M("(root)",void 0,void 0,void 0),G=1,V={id:0,frameIx:C,children:new Map,selfUs:0,samples:0,totalUs:0},ee=new Map([[0,V]]),te={llint:0,baseline:0,dfg:0,ftl:0},X=new Map,me=[],ae=[];for(let w of r.traces){let v=w.frames,J=V;for(let Y=v.length-1;Y>=0;Y--){let se=N(v[Y]),pe=J.children.get(se);if(!pe)pe={id:G++,frameIx:se,children:new Map,selfUs:0,samples:0,totalUs:0},J.children.set(se,pe),ee.set(pe.id,pe);J=pe}J.selfUs+=l,J.samples+=1,me.push(J.id),ae.push(l);let ne=v[0],re=ne&&Ge.get(ne.category);if(re){te[re]++;let Y=X.get(re)??new Map;Y.set(J.frameIx,(Y.get(J.frameIx)??0)+1),X.set(re,Y)}}function oe(w){let v=w.selfUs;for(let J of w.children.values())v+=oe(J);return w.totalUs=v,v}oe(V);let ue=new Map;function ie(w){let v=ue.get(w.frameIx);if(v)v.selfUs+=w.selfUs,v.totalUs+=w.totalUs,v.samples+=w.samples;else ue.set(w.frameIx,{frameIx:w.frameIx,selfUs:w.selfUs,totalUs:w.totalUs,samples:w.samples});for(let J of w.children.values())ie(J)}ie(V);let ce=[...ee.values()].map((w)=>({id:w.id,frameIx:w.frameIx,children:[...w.children.values()].map((v)=>v.id)})),le={origin:"jsc-profile",samplingIntervalUs:l,frames:R,nodes:ce,totals:[...ue.values()].sort((w,v)=>v.selfUs-w.selfUs),samples:{nodeIds:me,timeDeltasUs:ae}},z=[...X.entries()].flatMap(([w,v])=>[...v.entries()].sort((J,ne)=>ne[1]-J[1]).slice(0,3).map(([J,ne])=>({tier:w,frameKey:R[J].key,samples:ne})));return{cpu:le,jit:{origin:"jsc-profile",tiers:te,topFramesByTier:z}}}var He=1000;async function d(r,c={}){let l=c.intervalUs??He,b,R=Bun.nanoseconds(),M=await Le(async()=>(b=await r(),b),l),N=Bun.nanoseconds()-R,{cpu:C,jit:G}=Ne(M.stackTraces,l);return{result:b,cpu:C,jit:G,diagnosticWallNs:N}}import Te from"os";function u(r){if(r.length===0)throw Error("computeTimingStats: samples must be non-empty");let c=r.length,l=Ee(r),b=0;for(let w=0;w<c;w++)b+=r[w];let R=b/c,M=de(l,0.5),N=0;for(let w=0;w<c;w++){let v=r[w]-R;N+=v*v}let C=Math.sqrt(N/c),G=l[0],V=l[c-1],ee=de(l,0.25),te=de(l,0.75),X=te-ee,me=ee-1.5*X,ae=te+1.5*X,oe=ee-3*X,ue=te+3*X,ie=0,ce=0;for(let w=0;w<c;w++){let v=r[w];if(v<oe||v>ue)ce++;else if(v<me||v>ae)ie++}let le=de(l,0.99),z=new Float64Array(c);for(let w=0;w<c;w++)z[w]=Math.abs(r[w]-M);z.sort();let Q=de(z,0.5);return{unit:"ns",samples:r,mean:R,median:M,stddev:C,min:G,max:V,outliers:{mild:ie,severe:ce},p75:te,p99:le,mad:Q}}function Ee(r){let c=new Float64Array(r.length);return c.set(r),c.sort(),c}function de(r,c){let l=r.length;if(l===1)return r[0];let b=c*(l-1),R=Math.floor(b),M=Math.ceil(b);if(R===M)return r[R];let N=b-R;return r[R]*(1-N)+r[M]*N}var Je=5000000,je=200;function P(r,c,l="subprocess"){let b=[],R=r.samples[0];if(R!==void 0){let N=Ee(r.samples),C=de(N,0.25),V=de(N,0.75)-C;if(R>r.median+3*V&&V>0)b.push({code:"slow-first-run",message:`First run took ${(R/1e6).toFixed(2)}ms, much slower than the median ${(r.median/1e6).toFixed(2)}ms. Consider more warmup.`,data:{firstNs:R,medianNs:r.median}})}if(r.outliers.mild+r.outliers.severe>0)b.push({code:"outliers-detected",message:`${r.outliers.mild+r.outliers.severe} outlier(s) detected (${r.outliers.severe} severe, ${r.outliers.mild} mild).`,data:r.outliers});if(l==="subprocess"&&r.median<Je)b.push({code:"fast-command",message:`Median run time (${(r.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:r.median}});if(l==="inprocess"&&r.median<je)b.push({code:"below-timer-resolution",message:`Median run time (${r.median.toFixed(0)}ns) is close to timer resolution; consider a larger batch size or a coarser operation.`,data:{medianNs:r.median}});let M=c.filter((N)=>N!==void 0&&N!==0);if(M.length>0)b.push({code:"nonzero-exit",message:`${M.length} of ${c.length} trial(s) exited non-zero.`,data:{exitCodes:M}});return b}var Ve=200,Fe=64,qe=(()=>{let r=new Uint8Array(4096);for(let c=0;c<r.length;c++)r[c]=c*2654435761&255;return r})();function ze(r,c){let l=c;for(let b=0;b<r.length;b++)l^=r[b],l=Math.imul(l,16777619);return l>>>0}function Ke(r){let c=u(r),l=c.mad??0;return{floorPct:c.median===0?0:l/c.median*100,referenceMedianNs:c.median,samples:r.length}}function Be(r=Ve){let c=r*1e6,l=[],b=0,R=Bun.nanoseconds(),M=0;while(M<c){let N=Bun.nanoseconds();for(let G=0;G<Fe;G++)b^=ze(qe,G);let C=Bun.nanoseconds();l.push((C-N)/Fe),M=Bun.nanoseconds()-R}return Ke(l)}var Xe=0.75;function f(){let[r=0,c=0]=Te.loadavg();return{cpuModel:Te.cpus()[0]?.model??"unknown",cores:Te.availableParallelism(),loadAvg1:r,loadAvg5:c,noise:Be()}}function g(r){if(r.loadAvg1<=r.cores*Xe)return;return{code:"noisy-machine",message:`Load average ${r.loadAvg1.toFixed(2)} exceeds 75% of ${r.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:r.loadAvg1,cores:r.cores}}}var Ze=500,Qe=20,Oe=3,Ye=10,en=2,nn=0.1,rn=1000,tn=1e4;function Ue(r){let c=Math.log10(Math.max(1,r)/1e6),l=Math.round(Oe+en*c);return Math.min(Ye,Math.max(Oe,l))}function on(r,c){let l=Math.floor(c/r);return Math.min(Qe,Math.max(l,Ue(r)))}var Pe=0;function T(r){if(typeof r==="number")Pe+=r;else if(r!==void 0&&r!==null)Pe+=1}function we(r){return r!==null&&typeof r==="object"&&typeof r.then==="function"}function Ae(r,c){return Math.max(1,Math.ceil(rn/r),Math.ceil(c/(r*tn)))}async function U(r,c={}){let l=(c.budgetMs??Ze)*1e6,b=l*(c.warmup??nn),R=Bun.nanoseconds(),M=0,N=0;while(N<b){let z=r();T(we(z)?await z:z),M++,N=Bun.nanoseconds()-R}let C;if(M>0)C=Math.max(1,N/M);else{let z=Bun.nanoseconds(),Q=r();T(we(Q)?await Q:Q),C=Math.max(1,Bun.nanoseconds()-z)}let G=Ae(C,l);if(G>1){let z=Bun.nanoseconds();for(let Q=0;Q<G;Q++){let w=r();T(we(w)?await w:w)}C=Math.max(1,(Bun.nanoseconds()-z)/G),G=Ae(C,l)}let V=C*G,ee=c.samples??c.minSamples??on(V,l),te=c.samples!==void 0?0:l,X=[],me=Bun.nanoseconds(),ae=0,oe=0;while(oe<ee||ae<te){let z=Bun.nanoseconds();for(let w=0;w<G;w++){let v=r();T(we(v)?await v:v)}let Q=Bun.nanoseconds();if(X.push({i:oe,wallNs:(Q-z)/G}),oe++,ae=Bun.nanoseconds()-me,c.gc)Bun.gc(!0);if(c.samples!==void 0&&oe>=c.samples)break}let ue=X.map((z)=>z.wallNs),ie=u(ue),ce=P(ie,[],"inprocess"),le=Ue(V);if(X.length<le)ce.push({code:"low-sample-count",message:`Only ${X.length} sample(s) at ~${sn(V)} per trial; ${le} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:X.length,target:le,trialCostNs:V}});return{trials:X,timing:ie,warnings:ce}}function sn(r){if(r>=1e9)return`${(r/1e9).toFixed(2)}s`;if(r>=1e6)return`${(r/1e6).toFixed(1)}ms`;if(r>=1000)return`${(r/1000).toFixed(1)}\xB5s`;return`${r.toFixed(0)}ns`}var ye=[],Z,fe;function xe(r,c,l,b){let R=Z;Z={name:r,description:l?.description,isolate:l?.isolate,gc:l?.gc,cpu:l?.cpu,alloc:l?.alloc,before:l?.before,after:l?.after,skip:b.skip,only:b.only};try{c()}finally{Z=R}}var q=Object.assign((r,c,l)=>xe(r,c,l,{}),{skip:(r,c,l)=>xe(r,c,l,{skip:!0}),only:(r,c,l)=>xe(r,c,l,{only:!0})});function he(r,c,l,b){let R=fe!==void 0||l?.params!==void 0?{...fe,...l?.params}:void 0;ye.push({groupName:Z?.name,groupDescription:Z?.description,groupIsolate:Z?.isolate,groupGc:Z?.gc,groupCpu:Z?.cpu,groupAlloc:Z?.alloc,groupBefore:Z?.before,groupAfter:Z?.after,name:r,fn:c,baseline:l?.baseline,params:R,skipped:b.skip||Z?.skip,only:b.only||Z?.only,opts:l})}var K=Object.assign((r,c,l)=>he(r,c,l,{}),{skip:(r,c,l)=>he(r,c,l,{skip:!0}),only:(r,c,l)=>he(r,c,l,{only:!0})});function B(){return ye}function A(){ye.length=0,Z=void 0,fe=void 0}function W(r,c){let l=fe;fe=r;try{return c()}finally{fe=l}}function h(r){return r.groupName?`${r.groupName}/${r.name}`:r.name}function I(r,c){return r.opts?.isolate??r.groupIsolate??c}function j(r,c){return r.opts?.gc??r.groupGc??c}function _(r,c){return r.opts?.cpu??r.groupCpu??c}function L(r,c){return r.opts?.alloc??r.groupAlloc??c}function H(r,c){if(!c)return[...r];let l=new RegExp(c);return r.filter((b)=>l.test(h(b)))}
8
+ export{D,k,y,x,e,m,n,p,F,O,i,a,E,o,S,s,t,u,P,d,f,g,T,U,q,K,B,A,W,h,I,j,_,L,H};
@@ -0,0 +1,21 @@
1
+ // @bun
2
+ import{D,k,y,x,e,n,p,F,i,a,E,o,S,t,u,P,d,f,g,W}from"./chunk-9dqf5cxf.js";function wn(s){return s.startsWith("file://")?s.slice(7):s}function ke(s,h,m){let T=s.nodes,U=T.length,B=new Map,I=[],A=new Map,_=new Int32Array(U);for(let q=0;q<U;q++){let Q=T[q],Z=Q.callFrame,ie=wn(Z.url),se=B.get(Z.functionName);if(se===void 0)se=new Map,B.set(Z.functionName,se);let ce=se.get(ie);if(ce===void 0)ce=I.length,se.set(ie,ce),I.push({key:e("fr",Z.functionName,ie),name:Z.functionName,url:ie||void 0,line:Z.lineNumber>=0?Z.lineNumber:void 0,col:Z.columnNumber>=0?Z.columnNumber:void 0});_[q]=ce,A.set(Q.id,q)}let O=Array(U);for(let q=0;q<U;q++){let Q=T[q];O[q]={id:Q.id,frameIx:_[A.get(Q.id)],children:Q.children??[]}}let j=new Float64Array(U),Y=new Float64Array(U),{samples:L,timeDeltas:K}=s;for(let q=0;q<L.length;q++){let Q=A.get(L[q]);if(Q===void 0)continue;j[Q]+=K[q]??0,Y[Q]+=1}let X=new Int32Array(U).fill(-1);for(let q=0;q<U;q++){let Q=T[q].children;if(!Q)continue;for(let Z of Q){let ie=A.get(Z);if(ie!==void 0)X[ie]=q}}let H=[],te=[];for(let q=U-1;q>=0;q--)if(X[q]===-1)te.push(q);while(te.length>0){let q=te.pop();H.push(q);let Q=T[q].children;if(!Q)continue;for(let Z of Q){let ie=A.get(Z);if(ie!==void 0&&X[ie]===q)te.push(ie)}}let re=new Float64Array(U);for(let q=H.length-1;q>=0;q--){let Q=H[q];re[Q]+=j[Q];let Z=X[Q];if(Z>=0)re[Z]+=re[Q]}let oe=Array(I.length),ne=[];for(let q=0;q<U;q++){let Q=O[q].frameIx,Z=oe[Q];if(Z)Z.selfUs+=j[q],Z.totalUs+=re[q],Z.samples+=Y[q];else{let ie={frameIx:Q,selfUs:j[q],totalUs:re[q],samples:Y[q]};oe[Q]=ie,ne.push(ie)}}return{origin:h,samplingIntervalUs:m,frames:I,nodes:O,totals:ne.sort((q,Q)=>Q.selfUs-q.selfUs),samples:{nodeIds:s.samples,timeDeltasUs:s.timeDeltas}}}function xn(s,h,m,T){let U=["--cpu-prof","--cpu-prof-dir",h,"--cpu-prof-name",m,"--cpu-prof-interval",String(T)],B=s[0];if(B==="bun"||B?.endsWith("/bun"))return[B,...U,...s.slice(1)];return s}async function Fe(s){let h=`${s.artifactDir}/${s.fileName}`,m=s.argv[0],T=m==="bun"||m?.endsWith("/bun"),U=xn(s.argv,s.artifactDir,s.fileName,s.intervalUs),B=T?s.env:{...process.env,...s.env,BUN_OPTIONS:`--cpu-prof --cpu-prof-dir ${s.artifactDir} --cpu-prof-name ${s.fileName} --cpu-prof-interval ${s.intervalUs}`},I=Bun.nanoseconds(),_=await Bun.spawn(U,{cwd:s.cwd,env:B,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,O=Bun.nanoseconds()-I,j=Bun.file(h);if(!await j.exists())return{diagnosticWallNs:O,exitCode:_,warnings:[{code:"artifact-missing",message:`Expected a .cpuprofile at ${h} after exit ${_}, found nothing. The workload's argv[0] must be a \`bun\` binary for CPU capture.`,data:{artifactPath:h,argv:s.argv}}]};let Y=await j.json(),L=ke(Y,"cpu-prof",s.intervalUs),K=Y.samples.length===0?[{code:"empty-profile",message:"CPU capture produced zero samples."}]:[];return{diagnosticWallNs:O,exitCode:_,artifactPath:h,cpu:L,warnings:K}}function We(s,h="heap-prof"){let{node_fields:m,node_types:T}=s.snapshot.meta,U=m.indexOf("type"),B=m.indexOf("self_size"),I=m.length,A=T[0];if(U===-1||B===-1||!Array.isArray(A))return{origin:h,typeCounts:[],objectCount:s.snapshot.node_count};let _=A.length,O=Array(_),j=new Map,Y=[],L=0,K=s.nodes,X=K.length;for(let ne=0;ne<X;ne+=I){let q=K[ne+U],Q=K[ne+B]??0;L+=Q;let Z;if(q>=0&&q<_){if(Z=O[q],Z===void 0)Z={type:A[q],count:0,bytes:0},O[q]=Z,Y.push(Z)}else{let ie=`unknown(${q})`;if(Z=j.get(ie),Z===void 0)Z={type:ie,count:0,bytes:0},j.set(ie,Z),Y.push(Z)}Z.count++,Z.bytes+=Q}let H=Y.sort((ne,q)=>q.count-ne.count),te=H.slice(0,20),re=H.slice(20),oe=te.map(({type:ne,count:q,bytes:Q})=>({type:ne,count:q,retainedBytes:Q}));if(re.length>0){let ne=0,q=0;for(let Q of re)ne+=Q.count,q+=Q.bytes;oe.push({type:"other",count:ne,retainedBytes:q})}return{origin:h,heapSizeBytes:L,objectCount:s.snapshot.node_count,typeCounts:oe}}function Pn(s,h,m){let T=["--heap-prof","--heap-prof-dir",h,"--heap-prof-name",m],U=s[0];if(U==="bun"||U?.endsWith("/bun"))return[U,...T,...s.slice(1)];return s}async function Ue(s){let h=`${s.artifactDir}/${s.fileName}`,m=s.argv[0],T=m==="bun"||m?.endsWith("/bun"),U=Pn(s.argv,s.artifactDir,s.fileName),B=T?s.env:{...process.env,...s.env,BUN_OPTIONS:`--heap-prof --heap-prof-dir ${s.artifactDir} --heap-prof-name ${s.fileName}`},I=Bun.nanoseconds(),_=await Bun.spawn(U,{cwd:s.cwd,env:B,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,O=Bun.nanoseconds()-I,j=Bun.file(h);if(!await j.exists())return{diagnosticWallNs:O,exitCode:_,warnings:[{code:"artifact-missing",message:`Expected a heap snapshot at ${h} after exit ${_}, found nothing. The workload's argv[0] must be a \`bun\` binary for heap capture.`,data:{artifactPath:h,argv:s.argv}}]};let Y=await j.json(),L=We(Y,"heap-prof");return{diagnosticWallNs:O,exitCode:_,artifactPath:h,heap:L,warnings:[]}}import{Session as kn}from"inspector/promises";var $n=1000;async function Oe(s,h={}){let m=h.intervalUs??$n,T=new kn;T.connect();let U=Bun.nanoseconds();try{await T.post("Profiler.enable"),await T.post("Profiler.setSamplingInterval",{interval:m}),await T.post("Profiler.start");let B=await s(),{profile:I}=await T.post("Profiler.stop"),A=Bun.nanoseconds()-U,_=ke(I,"inspector",m);return{result:B,cpu:_,diagnosticWallNs:A}}finally{T.disconnect()}}var Rn=10,Mn=3000000000,vn=3;function Ie(s){let h=s.warmup??vn,m=s.samples,T=s.minSamples??Rn,U=m??T,B=m!==void 0?0:s.budgetMs!==void 0?s.budgetMs*1e6:Mn,I=s.timeSource!==void 0,A=[],_=0,O=0;function j(){if(m!==void 0)return O>=m;return O>=U&&_>=B}async function Y(L,K){if(s.prepare)await k(s.prepare,{phase:L,index:K},{cwd:s.cwd,env:s.env});return D(s)}return{async warmup(){for(let L=0;L<h;L++)await Y("warmup",L)},async step(){if(j())return!1;let L=await Y("timing",O);return A.push({i:O,wallNs:L.wallNs,exitCode:L.exitCode,userNs:L.userNs,systemNs:L.systemNs,maxRssBytes:L.maxRssBytes,...L.reportedNs!==void 0&&{reportedNs:L.reportedNs}}),_+=L.wallNs,O++,!0},done:j,result(){let L=A.map((H)=>I?H.reportedNs??H.wallNs:H.wallNs),K=u(L),X=P(K,A.map((H)=>H.exitCode),I?"reported":"subprocess");return{trials:A,timing:K,warnings:X}}}}async function w(s){let h=Ie(s);await h.warmup();while(await h.step());return h.result()}var Be=new URL("./runner.ts",import.meta.url).pathname,Tn="node_modules/.cache/ostia";function v(){return Math.max(1,navigator.hardwareConcurrency||1)}async function R(s,h){let m=new Set;for(let T of s){let U=new Bun.Glob(T);for await(let B of U.scan({cwd:h,absolute:!1}))m.add(B)}return[...m].sort()}function Cn(s){if(s===void 0)return;return s==="auto"?v():s}async function N(s,h,m=process.cwd()){return{suites:s.suites.length>0?s.suites:h?.suites?await R(h.suites,m):[],budgetMs:s.budgetMs??h?.budgetMs,samples:s.samples??h?.samples,minSamples:s.minSamples??h?.minSamples,jobs:s.jobs??Cn(h?.jobs),gc:s.gc||(h?.gc??!1),cpu:s.cpu||(h?.cpu??!1),alloc:s.alloc||(h?.alloc??!1),filter:s.filter??h?.filter,isolate:s.isolate||(h?.isolate??!1),preload:s.preload.length>0?s.preload:h?.preload??[],bunFlags:s.bunFlags,outDir:s.outDir??h?.outDir,noiseCheck:s.noiseCheck,cwd:m}}async function c(s){let m=`${s.outDir??Tn}/bench-tmp`,T=s.cwd??process.cwd(),U=Math.max(1,Math.floor(s.jobs??1)),B={budgetMs:s.budgetMs,samples:s.samples,minSamples:s.minSamples,gc:s.gc,cpu:s.cpu,alloc:s.alloc,noiseCheck:s.noiseCheck},I=s.suites.map((j)=>j.startsWith("/")?j:`${T}/${j}`),A=(s.preload??[]).map((j)=>j.startsWith("/")?j:`${T}/${j}`),_=s.bunFlags??[],O=async(j,Y)=>{let L=new Set,K=0,X,H=async()=>{while(X===void 0&&K<j.length){let te=K++;try{let re=Bun.spawn(j[te],{cwd:T,stdout:"inherit",stderr:"inherit",stdin:"ignore"});L.add(re);let oe=await re.exited;if(L.delete(re),oe!==0)throw Error(`Bench suite failed: ${Y(te)} (runner exited ${oe})`)}catch(re){X??=re instanceof Error?re:Error(String(re));for(let oe of L)oe.kill()}}};if(await Promise.all(Array.from({length:Math.min(U,j.length)},H)),X)throw X};try{let j=I.map((Q)=>`${m}/${e("bench-plan",Q)}.json`),Y=I.map((Q)=>`${m}/${e("bench-primary",Q)}.json`),L=I.map((Q,Z)=>["bun",..._,Be,Q,Y[Z],JSON.stringify({...B,filter:s.filter,isolate:s.isolate,preload:A,planPath:j[Z]})]);await O(L,(Q)=>s.suites[Q]);let K=await Promise.all(j.map(async(Q)=>{let{tasks:Z}=await Bun.file(Q).json();return Z})),X=await Promise.all(Y.map(t)),H=[];for(let Q=0;Q<K.length;Q++)for(let Z of K[Q])if(Z.isolate)H.push({suiteIndex:Q,taskIds:[Z.id]});let te=H.map((Q,Z)=>`${m}/${e("bench-item",I[Q.suiteIndex],Z)}.json`),re=H.map((Q,Z)=>["bun",..._,Be,I[Q.suiteIndex],te[Z],JSON.stringify({...B,taskIds:Q.taskIds,preload:A,markIsolated:!0})]);await O(re,(Q)=>s.suites[H[Q].suiteIndex]);let oe=await Promise.all(te.map(t)),ne=[],q=[];for(let Q=0;Q<K.length;Q++){let Z=X[Q],ie=new Map;for(let ee of Z.measurements){let ae=ie.get(ee.workloadId)??[];ae.push(ee),ie.set(ee.workloadId,ae)}let se=0,ce=new Map;H.forEach((ee,ae)=>{if(ee.suiteIndex===Q)ce.set(ee.taskIds[0],oe[ae])});for(let ee of K[Q])if(ee.isolate){let ae=ce.get(ee.id),de=ae.workloads[0];ne.push(de);for(let ge of ae.measurements)if(ge.workloadId===de.id)q.push(ge)}else{let ae=Z.workloads[se];ne.push(ae),se++;for(let de of ie.get(ae.id)??[])q.push(de)}}return n(ne,q,X[0]?.environment)}finally{await Bun.spawn(["rm","-rf",m]).exited}}function J(s,h,m=8){if(m<=1)throw RangeError(`range: multiplier must be > 1, got ${m}`);if(s<=0)throw RangeError(`range: start must be > 0, got ${s}`);let T=[];for(let U=s;U<=h;U*=m)T.push(U);if(!T.includes(h))T.push(h);return T}function V(s,h){let m=Object.keys(s),T=(U,B)=>{if(U===m.length){W(B,()=>h(B));return}let I=m[U];for(let A of s[I])T(U+1,{...B,[I]:A})};T(0,{})}function In(s){let h=s>>>0;return()=>{h=h+1831565813|0;let m=Math.imul(h^h>>>15,1|h);return m=m+Math.imul(m^m>>>7,61|m)^m,((m^m>>>14)>>>0)/4294967296}}var $e=2000,Dn=2000;function _e(s){let h=s.length,m=h>>1;return h%2===0?(s[m-1]+s[m])/2:s[m]}function Ee(s,h){let m=s.length;if(m===1)return s[0];let T=h*(m-1),U=Math.floor(T),B=Math.ceil(T);if(U===B)return s[U];let I=T-U;return s[U]*(1-I)+s[B]*I}function Ae(s,h,m){if(s.length<=m)return s;let T=[...s];for(let U=0;U<m;U++){let B=U+Math.floor(h()*(T.length-U)),I=T[U];T[U]=T[B],T[B]=I}return T.slice(0,m)}function je(s,h){let m=s.length,T=new Float64Array(m);for(let U=0;U<m;U++)T[U]=s[Math.floor(h()*m)];return T.sort(),_e(T)}function Le(s,h,m={}){let T=m.seed??(Date.now()^Math.imul(s.length,2654435761))>>>0,U=In(T),B=m.iterations??Dn,I=s.length>$e||h.length>$e,A=Ae(s,U,$e),_=Ae(h,U,$e),O=new Float64Array(A);O.sort();let j=_e(O),Y=new Float64Array(B);for(let L=0;L<B;L++){let K=je(A,U),X=je(_,U);Y[L]=j===0?X-K===0?0:1/0:(X-K)/j*100}return Y.sort(),{ci95:[Ee(Y,0.025),Ee(Y,0.975)],seed:T,data:{subsampled:I,iterations:B}}}function Sn(s){let h=s<0?-1:1,m=Math.abs(s),T=0.254829592,U=-0.284496736,B=1.421413741,I=-1.453152027,A=1.061405429,_=0.3275911,O=1/(1+0.3275911*m),j=1-((((1.061405429*O+-1.453152027)*O+1.421413741)*O+-0.284496736)*O+0.254829592)*O*Math.exp(-m*m);return h*j}function Nn(s){return 0.5*(1+Sn(s/Math.SQRT2))}function He(s,h){let m=s.length,T=h.length,U=m+T,B=[...s.map((H)=>({v:H,group:0})),...h.map((H)=>({v:H,group:1}))].sort((H,te)=>H.v-te.v),I=new Float64Array(U),A=0,_=0;while(_<U){let H=_;while(H+1<U&&B[H+1].v===B[_].v)H++;let te=(_+H)/2+1;for(let oe=_;oe<=H;oe++)I[oe]=te;let re=H-_+1;if(re>1)A+=re**3-re;_=H+1}let O=0;for(let H=0;H<U;H++)if(B[H].group===0)O+=I[H];let j=O-m*(m+1)/2,Y=m*T/2,L=Math.sqrt(m*T*(U+1-A/(U*(U-1)))/12),K=L===0?0:(j-Y)/L,X=Math.min(1,Math.max(0,2*(1-Nn(Math.abs(K)))));return{u:j,z:K,pValue:X}}var l={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},De=5;function Re(s,h){if(s===0)return h===0?0:1/0;return(h-s)/s*100}function he(s,h,m){return s.measurements.find((T)=>T.workloadId===h&&T.phase===m)}function b(s,h,m=l){let T=new Set(h.workloads.map((B)=>B.id)),U=[];for(let B of s.workloads){if(!T.has(B.id))continue;let I=M(s,h,B.id,m);if(I)U.push(I)}return U}function M(s,h,m,T=l){let U=he(s,m,"timing"),B=he(h,m,"timing"),I=he(s,m,"cpu"),A=he(h,m,"cpu"),_=he(s,m,"heap"),O=he(h,m,"heap"),j=h.workloads.find((ne)=>ne.id===m),Y=U?.id??I?.id??_?.id,L=B?.id??A?.id??O?.id??j?.id;if(!Y||!L)return;let K=!1,X=[],H=Math.max(T.timingPct,s.environment?.noise.floorPct??0,h.environment?.noise.floorPct??0),te;if(U?.timing&&j?.skipped&&!B?.timing)te={medianDeltaPct:0,meanDeltaPct:0,effectPct:0,verdict:"unchanged"},X.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:m}});else if(U?.timing&&B?.timing){let ne=U.timing.samples,q=B.timing.samples,Q=Re(U.timing.median,B.timing.median),Z=Re(U.timing.mean,B.timing.mean);if(ne.length<De||q.length<De){let ie=Q>H?"regressed":Q<-H?"improved":"unchanged";if(ie==="regressed")K=!0;te={medianDeltaPct:Q,meanDeltaPct:Z,effectPct:Q,verdict:ie},X.push({code:"thin-comparison",message:`Only ${ne.length} baseline / ${q.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${De}+ per side).`,data:{baseSamples:ne.length,candSamples:q.length}})}else{let ie=Le(ne,q,{iterations:T.bootstrapIterations}),se=He(ne,q),ce=ie.ci95[0]>H&&se.pValue<T.alpha?"regressed":ie.ci95[1]<-H&&se.pValue<T.alpha?"improved":"unchanged";if(ce==="regressed")K=!0;te={medianDeltaPct:Q,meanDeltaPct:Z,effectPct:Q,ci95:ie.ci95,pValue:se.pValue,seed:ie.seed,verdict:ce}}}let re;if(I?.cpu&&A?.cpu){let ne=new Map(I.cpu.totals.map((se)=>[I.cpu.frames[se.frameIx].key,se])),q=new Map(A.cpu.totals.map((se)=>[A.cpu.frames[se.frameIx].key,se])),Q=new Map(I.cpu.frames.map((se)=>[se.key,se.name])),Z=new Map(A.cpu.frames.map((se)=>[se.key,se.name]));re=[...new Set([...ne.keys(),...q.keys()])].map((se)=>{let ce=ne.get(se)?.selfUs??0,ee=q.get(se)?.selfUs??0;return{frameKey:se,name:Z.get(se)??Q.get(se)??se,baseSelfUs:ce,candSelfUs:ee,deltaPct:Re(ce,ee)}}).sort((se,ce)=>Math.abs(ce.deltaPct)-Math.abs(se.deltaPct));for(let se of re)if((se.baseSelfUs>=T.minFrameSelfUs||se.candSelfUs>=T.minFrameSelfUs)&&se.deltaPct>T.frameSelfPct)K=!0}let oe;if(_?.heap&&O?.heap){let ne=new Map(_.heap.typeCounts.map((Z)=>[Z.type,Z])),q=new Map(O.heap.typeCounts.map((Z)=>[Z.type,Z]));oe=[...new Set([...ne.keys(),...q.keys()])].map((Z)=>{let ie=ne.get(Z),se=q.get(Z);return{type:Z,baseCount:ie?.count??0,candCount:se?.count??0,baseBytes:ie?.retainedBytes,candBytes:se?.retainedBytes,deltaPct:Re(ie?.count??0,se?.count??0)}}).sort((Z,ie)=>Math.abs(ie.deltaPct)-Math.abs(Z.deltaPct));for(let Z of oe)if(Z.deltaPct>T.heapTypePct)K=!0}return{id:e("cmp",Y,L),baselineMeasurementId:Y,candidateMeasurementId:L,timing:te,...X.length>0&&{warnings:X},frames:re,heapTypes:oe,thresholds:{...T,effectiveTimingPct:H},verdict:K?"fail":"pass"}}function fe(s,h){if(h){let m=s.measurements.find((T)=>T.id===h);return m?.cpu?[m]:[]}return s.measurements.filter((m)=>m.phase==="cpu"&&m.cpu)}function be(s){let h=s.nodes,m=h.length,T=Fn(s),U=new Int32Array(m).fill(-1);for(let _=0;_<m;_++)for(let O of h[_].children){let j=T(O);if(j!==-1)U[j]=_}let B=[];for(let _=0;_<m;_++)if(U[_]===-1)B.push(_);let I=[],A=[];for(let _=B.length-1;_>=0;_--)A.push(B[_]);while(A.length>0){let _=A.pop();I.push(_);for(let O of h[_].children){let j=T(O);if(j!==-1&&U[j]===_)A.push(j)}}return{count:m,indexOf:T,parentIx:U,roots:B,order:I}}function Fn(s){let h=s.nodes,m=h.length,T=1/0,U=-1/0,B=!0;for(let A=0;A<m;A++){let _=h[A].id;if(!Number.isInteger(_)){B=!1;break}if(_<T)T=_;if(_>U)U=_}if(B&&m>0&&U-T<m*4+64){let A=U-T+1,_=new Int32Array(A).fill(-1);for(let O=0;O<m;O++)_[h[O].id-T]=O;return(O)=>{let j=O-T;return j>=0&&j<A?_[j]:-1}}let I=new Map;for(let A=0;A<m;A++)I.set(h[A].id,A);return(A)=>I.get(A)??-1}function Ve(s,h){let{count:m,indexOf:T,parentIx:U,order:B}=h,I=new Float64Array(m),A=new Float64Array(m),_=s.samples?.nodeIds??[],O=s.samples?.timeDeltasUs??[];for(let Y=0;Y<_.length;Y++){let L=T(_[Y]);if(L===-1)continue;I[L]+=O[Y]??0,A[L]+=1}let j=new Float64Array(m);for(let Y=B.length-1;Y>=0;Y--){let L=B[Y];j[L]+=I[L];let K=U[L];if(K>=0)j[K]+=j[L]}return{selfUs:I,totalUs:j,samples:A}}var ze={name:"collapsed",async render(s,h={}){return{files:fe(s,h.measurementId).map((U)=>{let B=U.cpu,{nodes:I,frames:A}=B,_=be(B),O=Array(_.count);for(let X of _.order){let H=A[I[X].frameIx].name||"(anonymous)",te=_.parentIx[X];O[X]=te===-1?H:`${O[te]};${H}`}let j=new Float64Array(_.count),Y=[],L=B.samples?.nodeIds??[];for(let X=0;X<L.length;X++){let H=_.indexOf(L[X]);if(H===-1)continue;if(j[H]++===0)Y.push(H)}let K=Array(Y.length);for(let X=0;X<Y.length;X++){let H=Y[X];K[X]=`${O[H]} ${j[H]}`}return{path:`${U.id}.collapsed.txt`,content:K.join(`
3
+ `)+(K.length>0?`
4
+ `:"")}})}}};var Ke={name:"cpuprofile",async render(s,h={}){let m=fe(s,h.measurementId),T=[],U=[];for(let B of m){if(B.cpu?.origin!=="cpu-prof"&&B.cpu?.origin!=="inspector"){U.push(`${B.id} (origin ${B.cpu?.origin??"unknown"} has no .cpuprofile artifact to pass through)`);continue}let I=B.artifacts.find((_)=>_.kind==="cpuprofile");if(!I){U.push(`${B.id} (no cpuprofile artifact recorded on this run)`);continue}let A=Bun.file(I.path);if(!await A.exists()){U.push(`${B.id} (artifact missing on disk: ${I.path})`);continue}T.push({path:`${B.id}.cpuprofile`,content:await A.text()})}if(T.length===0&&U.length>0)return{text:`No .cpuprofile artifacts available:
5
+ ${U.map((B)=>` - ${B}`).join(`
6
+ `)}
7
+ `};return{files:T}}};var Ge={name:"json",async render(s){return{text:S(s)}}};var Je={name:"jsonl",async render(s){let{measurements:h,...m}=s;return{text:`${[x(m),...h.map((U)=>x(U))].join(`
8
+ `)}
9
+ `}}};var Wn={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function xe(s){let h=Math.abs(s);if(h>=1e9)return"s";if(h>=1e6)return"ms";if(h>=1000)return"\xB5s";return"ns"}function Un(s){let h=Math.floor(Math.log10(Math.max(Math.abs(s),1)))+1;return Math.max(1,3-h)}function me(s,h=xe(s)){let m=s/Wn[h];return`${m.toFixed(Un(m))} ${h}`}function Me(s){return`${s.cpuModel} \xB7 ${s.cores} cores \xB7 load ${s.loadAvg1.toFixed(1)} \xB7 noise floor ${s.noise.floorPct.toFixed(1)}%`}function Ye(s){return(s/1e6).toFixed(3)}function Pe(s){return s?.label??s?.command?.join(" ")??s?.entry?.task??s?.id??"unknown"}function qe(s){if(!s?.params)return"";return` (${Object.entries(s.params).map(([m,T])=>`${m}=${T}`).join(", ")})`}function On(s){let h;for(let m of s){let T=m?.params?Object.keys(m.params):void 0;if(T?.length!==2)return;if(h===void 0)h=T;else if(T.length!==h.length||T.some((U,B)=>U!==h[B]))return}return h}var Qe=10,Xe=10,Ze={name:"markdown",async render(s){let h=new Map(s.workloads.map((I)=>[I.id,I])),m=[];m.push("# Profile Report","");let T=s.git?` \xB7 ${s.git.sha} (${s.git.branch}${s.git.dirty?", dirty":""})`:"";if(m.push(`Bun ${s.bunVersion} \xB7 ostia ${s.toolVersion} \xB7 ${s.platform.os}/${s.platform.arch} \xB7 ${s.createdAt}${T}`,""),s.environment)m.push(Me(s.environment),"");let U=s.measurements.filter((I)=>I.phase==="timing"&&I.timing!==void 0),B=s.workloads.filter((I)=>I.skipped&&!U.some((A)=>A.workloadId===I.id));if(U.length>0||B.length>0){m.push("## Timing","");let I=new Map,A=[];for(let j of U){let Y=h.get(j.workloadId)?.entry?.group;if(Y===void 0){A.push(j);continue}let L=I.get(Y);if(L)L.push(j);else I.set(Y,[j])}let _=new Map;for(let[j,Y]of I){let L=On(Y.map((K)=>h.get(K.workloadId)));if(L)_.set(j,{keys:L,runs:Y});else A.push(...Y)}if(A.length>0||B.length>0){m.push("| Task | Median | Spread (p75\u2026p99) | Mean \xB1 SD | Range | MAD |","|---|---|---|---|---|---|");for(let j of A){let Y=h.get(j.workloadId),L=Pe(Y)+qe(Y),K=j.timing,X=xe(K.median),H=K.p75??K.median,te=K.p99??K.max,re=K.mad!==void 0?me(K.mad,X):"-";m.push(`| ${L} | ${me(K.median,X)} | ${me(H,X)}\u2026${me(te,X)} | ${me(K.mean,X)} \xB1 ${me(K.stddev,X)} | ${me(K.min,X)}\u2026${me(K.max,X)} | ${re} |`)}for(let j of B){let Y=Pe(j)+qe(j);m.push(`| ${Y} | - skipped | - | - | - | - |`)}m.push("")}for(let[j,{keys:Y,runs:L}]of _){let[K,X]=Y,H=[],te=[],re=new Map;for(let oe of L){let ne=h.get(oe.workloadId).params,q=ne[K],Q=ne[X];if(!H.includes(q))H.push(q);if(!te.includes(Q))te.push(Q);re.set(`${q}\x00${Q}`,oe)}m.push(`### ${j} (${K} \xD7 ${X})`,""),m.push(`| ${K} \\ ${X} | ${te.join(" | ")} |`,`|---|${te.map(()=>"---").join("|")}|`);for(let oe of H){let ne=te.map((q)=>{let Q=re.get(`${oe}\x00${q}`);return Q?me(Q.timing.median):"-"});m.push(`| ${oe} | ${ne.join(" | ")} |`)}m.push("")}let O=U.filter((j)=>j.warnings.length>0);if(O.length>0){m.push("### Warnings","");for(let j of O){let Y=Pe(h.get(j.workloadId));for(let L of j.warnings)m.push(`- **${Y}**: ${L.message} (\`${L.code}\`)`)}m.push("")}}for(let I of s.measurements){if(I.phase!=="cpu"&&I.phase!=="heap")continue;let A=Pe(h.get(I.workloadId));if(I.phase==="cpu"){if(m.push(`## CPU capture - ${A}`,""),m.push(`instrumented, diagnostic wall ${Ye(I.diagnosticWallNs??0)}ms`,""),I.cpu){m.push(`origin: \`${I.cpu.origin}\`, interval: ${I.cpu.samplingIntervalUs}\xB5s`,""),m.push("| Self % | Self (ms) | Total (ms) | Frame |","|---|---|---|---|");let _=I.cpu.totals.reduce((O,j)=>O+j.selfUs,0)||1;for(let O of I.cpu.totals.slice(0,Qe)){let j=I.cpu.frames[O.frameIx],Y=(O.selfUs/_*100).toFixed(1);m.push(`| ${Y}% | ${(O.selfUs/1000).toFixed(2)} | ${(O.totalUs/1000).toFixed(2)} | ${j?.name||"(anonymous)"} |`)}if(m.push(""),I.jit){let O=I.jit.tiers;m.push(`JIT tiers: LLInt ${O.llint} \xB7 Baseline ${O.baseline} \xB7 DFG ${O.dfg} \xB7 FTL ${O.ftl}`,"")}}}else if(m.push(`## Heap snapshot - ${A}`,""),m.push(`instrumented, diagnostic wall ${Ye(I.diagnosticWallNs??0)}ms`,""),I.heap){m.push(`${I.heap.objectCount??"?"} objects, ${((I.heap.heapSizeBytes??0)/1e6).toFixed(2)}MB`,""),m.push("| Count | Type |","|---|---|");for(let _ of I.heap.typeCounts.slice(0,Xe))m.push(`| ${_.count} | ${_.type} |`);m.push("")}for(let _ of I.artifacts)m.push(`- artifact: \`${_.path}\``);for(let _ of I.warnings)m.push(`- ! ${_.message} (\`${_.code}\`)`);if(I.artifacts.length>0||I.warnings.length>0)m.push("")}if(s.comparisons&&s.comparisons.length>0){m.push("## Comparisons","");for(let I of s.comparisons){let A=s.measurements.find((O)=>O.id===I.candidateMeasurementId),_=Pe(A?h.get(A.workloadId):h.get(I.candidateMeasurementId));if(m.push(`### ${I.verdict==="pass"?"\u2713":"\u2717"} ${_}`,""),I.timing){let O=I.timing.medianDeltaPct>0?"+":"";m.push(`- timing: ${O}${I.timing.medianDeltaPct.toFixed(1)}% median (**${I.timing.verdict}**)`)}for(let O of I.frames?.slice(0,Qe)??[]){if(Math.abs(O.deltaPct)<0.5)continue;let j=O.deltaPct>0?"+":"";m.push(`- frame \`${O.name}\`: ${j}${O.deltaPct.toFixed(1)}% self-time (${(O.baseSelfUs/1000).toFixed(2)}ms \u2192 ${(O.candSelfUs/1000).toFixed(2)}ms)`)}for(let O of I.heapTypes?.slice(0,Xe)??[]){if(Math.abs(O.deltaPct)<0.5)continue;let j=O.deltaPct>0?"+":"";m.push(`- heap \`${O.type}\`: ${j}${O.deltaPct.toFixed(1)}% count (${O.baseCount} \u2192 ${O.candCount})`)}m.push("")}}return{text:m.join(`
10
+ `)}}};var Bn=15;function Se(s){return`n${s}`}function En(s,h,m){return`${(s||"(anonymous)").replace(/"/g,"'")} (self ${(h/1000).toFixed(2)}ms, total ${(m/1000).toFixed(2)}ms)`}function An(s,h,m,T){let U=[];if(T<=0)return U;for(let B=0;B<h;B++){if(B===m)continue;let I=s[B];if(U.length===T&&I<=s[U[T-1]])continue;let A=U.length;while(A>0&&s[U[A-1]]<I)A--;if(U.splice(A,0,B),U.length>T)U.pop()}return U}var en={name:"mermaid",async render(s,h={}){let m=h.topN??Bn;return{files:fe(s,h.measurementId).map((B)=>{let I=B.cpu,{nodes:A,frames:_}=I,O=be(I),{selfUs:j,totalUs:Y}=Ve(I,O),{parentIx:L}=O,K=O.roots[0]??-1,X=An(j,O.count,K,m),H=new Set(K!==-1?[K]:[]),te=[];for(let oe of X){te.length=0;for(let ne=oe;ne!==-1;ne=L[ne])te.push(ne);for(let ne=te.length-1;ne>=0;ne--)H.add(te[ne])}let re=["graph TD"];for(let oe of H){let ne=A[oe].id;re.push(` ${Se(ne)}["${En(_[A[oe].frameIx].name,j[oe],Y[oe])}"]`)}for(let oe of H){let ne=L[oe];if(ne!==-1&&H.has(ne))re.push(` ${Se(A[ne].id)} --> ${Se(A[oe].id)}`)}return{path:`${B.id}.mermaid.md`,content:`${re.join(`
11
+ `)}
12
+ `}})}}};function nn(s){if(!s?.entry)return;if(s.entry.group!==void 0)return s.entry.group;let h=s.entry.task,m=h.lastIndexOf("/");return m===-1?void 0:h.slice(0,m)}function ve(s){let h=Math.min(...s.map((U)=>U.run.timing.median)),m=new Map;for(let U of s){let B=nn(U.workload);if(B===void 0)continue;let I=m.get(B);if(I)I.push(U);else m.set(B,[U])}let T=new Map;for(let U of s){let B=nn(U.workload);if(B===void 0){T.set(U,h);continue}let I=m.get(B)??[U],A=I.find((_)=>_.workload?.baseline);T.set(U,A?A.run.timing.median:Math.min(...I.map((_)=>_.run.timing.median)))}return T}function ue(s){return Number.isFinite(s)?Number(s.toPrecision(6)):s}function jn(s,h){return s?.entry?.task??s?.label??s?.command?.join(" ")??h.workloadId}function _n(s,h){let m={task:s.entry?.task??s.label??s.id,skipped:!0,warnings:[]};if(s.entry?.group!==void 0)m.group=s.entry.group;if(s.description!==void 0)m.description=s.description;if(s.groupDescription!==void 0)m.groupDescription=s.groupDescription;if(s.params!==void 0)m.params=s.params;if(h?.timing)m.delta={medianPct:ue(h.timing.medianDeltaPct),meanPct:ue(h.timing.meanDeltaPct),verdict:h.timing.verdict,pass:h.verdict==="pass"};return m}function Ln(s){let h=new Map(s.workloads.map((O)=>[O.id,O])),m=s.measurements.filter((O)=>O.phase==="timing"&&O.timing!==void 0).map((O)=>({run:O,workload:h.get(O.workloadId)})),T=m.length>1?ve(m):void 0,U=new Map((s.comparisons??[]).map((O)=>[O.candidateMeasurementId,O])),B=new Set(m.map((O)=>O.run.workloadId)),I=new Map;for(let O of s.measurements){if(O.phase!=="cpu"||O.warnings.length===0)continue;let j=I.get(O.workloadId)??[];I.set(O.workloadId,[...j,...O.warnings])}let A=s.workloads.filter((O)=>O.skipped&&!B.has(O.id)).map((O)=>_n(O,U.get(O.id)));return[...m.map((O)=>{let{run:j,workload:Y}=O,L=j.timing,K={task:jn(Y,j),unit:"ns",samples:L.samples.length,mean:ue(L.mean),median:ue(L.median),stddev:ue(L.stddev),stddevPct:ue(L.mean===0?0:L.stddev/L.mean*100),min:ue(L.min),max:ue(L.max),warnings:[...j.warnings,...I.get(j.workloadId)??[]].map((H)=>H.data?{code:H.code,data:H.data}:{code:H.code})};if(L.p75!==void 0)K.p75=ue(L.p75);if(L.p99!==void 0)K.p99=ue(L.p99);if(L.mad!==void 0)K.mad=ue(L.mad);if(Y?.entry?.group!==void 0)K.group=Y.entry.group;if(Y?.description!==void 0)K.description=Y.description;if(Y?.groupDescription!==void 0)K.groupDescription=Y.groupDescription;if(Y?.params!==void 0)K.params=Y.params;if(T)K.relative=ue(L.median/(T.get(O)??L.median));if(Y?.baseline)K.baseline=!0;let X=U.get(j.id);if(X?.timing){if(K.delta={medianPct:ue(X.timing.medianDeltaPct),meanPct:ue(X.timing.meanDeltaPct),verdict:X.timing.verdict,pass:X.verdict==="pass"},X.timing.ci95)K.delta.ci95=[ue(X.timing.ci95[0]),ue(X.timing.ci95[1])];if(X.timing.pValue!==void 0)K.delta.pValue=ue(X.timing.pValue)}return K}),...A]}var tn={name:"minimal",async render(s){let h=Ln(s).map((m)=>JSON.stringify(m));return{text:h.length>0?`${h.join(`
13
+ `)}
14
+ `:""}}};var Hn="https://www.speedscope.app/file-format-schema.json";function rn(s){return s?.label??s?.command?.join(" ")??s?.entry?.task??"profile"}var sn={name:"speedscope",async render(s,h={}){let m=fe(s,h.measurementId),T=new Map(s.workloads.map((B)=>[B.id,B]));return{files:m.map((B)=>{let I=B.cpu,{nodes:A}=I,_=be(I),O=I.samples?.nodeIds??[],j=I.samples?.timeDeltasUs??[],Y=Array(_.count);for(let H of _.order){let te=_.parentIx[H],re=A[H].frameIx;Y[H]=te===-1?[re]:[...Y[te],re]}let L=Array(O.length);for(let H=0;H<O.length;H++){let te=_.indexOf(O[H]);L[H]=te===-1?[]:Y[te]}let K=0;for(let H=0;H<j.length;H++)K+=j[H];let X={$schema:Hn,exporter:"ostia",name:rn(T.get(B.workloadId)),activeProfileIndex:0,shared:{frames:I.frames.map((H)=>({name:H.name||"(anonymous)",file:H.url,line:H.line!==void 0?H.line+1:void 0}))},profiles:[{type:"sampled",name:rn(T.get(B.workloadId)),unit:"microseconds",startValue:0,endValue:K,samples:L,weights:j}]};return{path:`${B.id}.speedscope.json`,content:`${JSON.stringify(X,null,2)}
15
+ `}})}}};function Vn(s){return(s/1e6).toFixed(3)}function zn(s){if(s<1024)return`${s.toFixed(0)}B`;if(s<1048576)return`${(s/1024).toFixed(2)}KB`;return`${(s/1048576).toFixed(2)}MB`}function Te(s){return s.label??s.command?.join(" ")??s.entry?.task??s.id}function Kn(s){if(!s?.entry)return;if(s.entry.group!==void 0)return s.entry.group;let h=s.entry.task,m=h.lastIndexOf("/");return m===-1?void 0:h.slice(0,m)}var an={name:"table",async render(s){let h=s.measurements.filter((ee)=>ee.phase==="timing"&&ee.timing!==void 0),m=new Map(s.workloads.map((ee)=>[ee.id,ee])),T=s.environment?[Me(s.environment),""]:[],U=s.workloads.filter((ee)=>ee.skipped&&!h.some((ae)=>ae.workloadId===ee.id));if(h.length===0&&U.length===0){let ee=on(s,m);return{text:ee.length>0?`${[...T,...ee].join(`
16
+ `)}
17
+ `:`(no timing runs)
18
+ `}}let B=new Map(h.map((ee)=>[ee.workloadId,ee])),I=[];for(let ee of s.workloads){let ae=B.get(ee.id);if(ae)I.push({kind:"measured",run:ae,workload:ee,label:Te(ee)});else if(ee.skipped)I.push({kind:"skipped",workload:ee,label:Te(ee)})}let A=I.filter((ee)=>ee.kind==="measured"),_=new Map(s.measurements.filter((ee)=>ee.phase==="memstats"&&ee.memory?.bytesPerOp!==void 0).map((ee)=>[ee.workloadId,ee.memory.bytesPerOp])),O=_.size>0,j=A.length>1,Y=ve(A),L=new Map,K=new Map,X;for(let ee of I){let ae=Kn(ee.workload);if(ae!==X){if(ae!==void 0)K.set(ee,ae);X=ae}L.set(ee,ae!==void 0?" ":"")}let H=Math.max(4,...I.map((ee)=>L.get(ee).length+ee.label.length)),te=10,re=18,oe=18,ne=10,q=[...T],Q=O?` ${"Alloc/op".padEnd(ne)}`:"",Z=`${"Task".padEnd(H)} ${"Median".padEnd(te)} ${"Spread".padEnd(re)} ${"Range".padEnd(oe)}${Q}${j?" Relative":""}`;q.push(Z),q.push("-".repeat(Z.length));let ie=[];for(let ee of I){let ae=K.get(ee);if(ae!==void 0)q.push(`${ae}:`);let de=L.get(ee);if(ee.kind==="skipped"){q.push(`${(de+ee.label).padEnd(H)} - skipped`);continue}let{run:ge,label:ln,workload:Ce}=ee,pe=ge.timing,ye=xe(pe.median),dn=pe.p75??pe.median,fn=pe.p99??pe.max,gn=me(pe.median,ye),hn=`${me(dn,ye)}\u2026${me(fn,ye)}`,bn=`${me(pe.min,ye)}\u2026${me(pe.max,ye)}`,we=`${(de+ln).padEnd(H)} ${gn.padEnd(te)} ${hn.padEnd(re)} ${bn.padEnd(oe)}`;if(O){let le=Ce?_.get(Ce.id):void 0,yn=le!==void 0?zn(le):"";we+=` ${yn.padEnd(ne)}`}if(j){let le=pe.median/(Y.get(ee)??pe.median);if(le===1)we+=Ce?.baseline?" 1.00\xD7 (baseline)":" 1.00\xD7";else if(le>1)we+=` ${le.toFixed(2)}\xD7 slower`;else we+=` ${(1/le).toFixed(2)}\xD7 faster`}if(q.push(we),ge.warnings.length>0)q.push(`${" ".repeat(de.length)} ! ${ge.warnings.map((le)=>le.code).join(", ")}`),ie.push(ee)}if(ie.length>0){q.push(""),q.push("Warnings:");for(let ee of ie)for(let ae of ee.run.warnings)q.push(` ${ee.label}: ${ae.message}`)}let se=Jn(s,m);if(se.length>0)q.push(""),q.push(...se);let ce=on(s,m);if(ce.length>0)q.push(""),q.push(...ce);return{text:`${q.map((ee)=>ee.trimEnd()).join(`
19
+ `)}
20
+ `}}};function Gn(s,h,m){let T=s.measurements.find((B)=>B.id===m),U=T?h.get(T.workloadId):h.get(m);return U?Te(U):m}function on(s,h){if(!s.comparisons||s.comparisons.length===0)return[];let m=[];for(let T of s.comparisons){let U=Gn(s,h,T.candidateMeasurementId),B=T.verdict==="pass"?"\u2713":"\u2717";if(m.push(`${B} ${U}`),T.timing){let I=(A)=>`${A>=0?"+":""}${A.toFixed(1)}%`;if(T.timing.ci95&&T.timing.pValue!==void 0){let A=T.timing.pValue<0.001?"p<0.001":`p=${T.timing.pValue.toFixed(3)}`;m.push(` timing: ${I(T.timing.medianDeltaPct)} median, 95% CI [${I(T.timing.ci95[0])}, ${I(T.timing.ci95[1])}], ${A} (${T.timing.verdict})`)}else m.push(` timing: ${I(T.timing.medianDeltaPct)} median (${T.timing.verdict})`)}if(T.frames)for(let I of T.frames.slice(0,cn)){if(Math.abs(I.deltaPct)<0.5)continue;let A=I.deltaPct>0?"+":"";m.push(` frame ${I.name}: ${A}${I.deltaPct.toFixed(1)}% self-time (${(I.baseSelfUs/1000).toFixed(2)}ms -> ${(I.candSelfUs/1000).toFixed(2)}ms)`)}if(T.heapTypes)for(let I of T.heapTypes.slice(0,un)){if(Math.abs(I.deltaPct)<0.5)continue;let A=I.deltaPct>0?"+":"";m.push(` heap ${I.type}: ${A}${I.deltaPct.toFixed(1)}% count (${I.baseCount} -> ${I.candCount})`)}}return m}var cn=5,un=5;function Jn(s,h){let m=[];for(let T of s.measurements){if(T.phase!=="cpu"&&T.phase!=="heap")continue;let U=h.get(T.workloadId),B=U?Te(U):T.workloadId;if(T.phase==="cpu")if(T.cpu){m.push(`CPU capture - ${B} (instrumented, ${T.cpu.samplingIntervalUs}\xB5s interval, diagnostic wall ${Vn(T.diagnosticWallNs??0)}ms)`);let I=T.cpu.totals.reduce((A,_)=>A+_.selfUs,0)||1;for(let A of T.cpu.totals.slice(0,cn)){let _=T.cpu.frames[A.frameIx],O=(A.selfUs/I*100).toFixed(1);m.push(` ${O.padStart(5)}% ${(A.selfUs/1000).toFixed(2).padStart(8)}ms self ${_?.name??"?"}`)}}else m.push(`CPU capture - ${B} (instrumented, no evidence captured)`);else if(T.heap){let I=((T.heap.heapSizeBytes??0)/1e6).toFixed(2);m.push(`Heap snapshot - ${B} (instrumented, ${T.heap.objectCount??"?"} objects, ${I}MB)`);for(let A of T.heap.typeCounts.slice(0,un))m.push(` ${String(A.count).padStart(6)} ${A.type}`)}else m.push(`Heap snapshot - ${B} (instrumented, no evidence captured)`);for(let I of T.artifacts)m.push(` artifact: ${I.path}`);for(let I of T.warnings)m.push(` ! ${I.message}`)}return m}var r={table:an,json:Ge,markdown:Ze,jsonl:Je,minimal:tn,collapsed:ze,mermaid:en,speedscope:sn,cpuprofile:Ke};function G(s){return s}var Yn="node_modules/.cache/ostia",Ne=1000;async function C(s){let h=o({samples:s.samples??null,budgetMs:s.budgetMs??null,minSamples:s.minSamples??null,warmup:s.warmup??null,cpu:s.cpu??!1,heap:s.heap??!1,cpuIntervalUs:s.cpuIntervalUs??Ne}),T=`${s.outDir??Yn}/artifacts`,U=s.noiseCheck===!1?void 0:f(),B=U?g(U):void 0,I=[],A=[],_=s.commands.map((Y)=>{let L=typeof Y==="string"||Array.isArray(Y)?{command:Y}:Y,K=Array.isArray(L.command)?L.command:y(L.command),X=L.prepare??s.prepare,H=L.timeSource??s.timeSource,te=p(K,L.label??(Array.isArray(L.command)?void 0:L.command),{prepare:X,timeSource:H});return{argv:K,workload:te,prepare:X,timeSource:H}}),O=(s.interleave??!0)&&_.length>1,j=(Y)=>({argv:Y.argv,cwd:s.cwd,env:s.env,samples:s.samples,budgetMs:s.budgetMs,minSamples:s.minSamples,warmup:s.warmup,prepare:Y.prepare,timeSource:Y.timeSource});if(O){let Y=_.map((K)=>Ie(j(K)));for(let K of Y)await K.warmup();let L=!0;while(L){L=!1;for(let K of Y)if(await K.step())L=!0}for(let K=0;K<_.length;K++){let{argv:X,workload:H,prepare:te}=_[K];I.push(H);let re=Y[K].result(),oe=i({workload:H,configFingerprint:h,trials:re.trials,timing:re.timing,warnings:B&&A.length===0?[...re.warnings,B]:re.warnings,interleaved:!0});A.push(oe),A.push(...await mn(H,X,oe.id,h,s,T,te))}return n(I,A,U)}for(let Y of _){let{argv:L,workload:K,prepare:X}=Y;I.push(K);let H=await w(j(Y)),te=i({workload:K,configFingerprint:h,trials:H.trials,timing:H.timing,warnings:B&&A.length===0?[...H.warnings,B]:H.warnings});A.push(te),A.push(...await mn(K,L,te.id,h,s,T,X))}return n(I,A,U)}async function mn(s,h,m,T,U,B,I){let A=[],_=async(O)=>{if(I)await k(I,{phase:O,index:0},{cwd:U.cwd,env:U.env})};if(U.cpu){await _("cpu");let O=`${m}-cpu.cpuprofile`,j=await Fe({argv:h,cwd:U.cwd,env:U.env,artifactDir:B,fileName:O,intervalUs:U.cpuIntervalUs??Ne});A.push(await pn({workload:s,phase:"cpu",configFingerprint:T,diagnosticWallNs:j.diagnosticWallNs,exitCode:j.exitCode,cpu:j.cpu,artifactPath:j.artifactPath,artifactKind:"cpuprofile",warnings:j.warnings}))}if(U.heap){await _("heap");let O=`${m}-heap.heapsnapshot`,j=await Ue({argv:h,cwd:U.cwd,env:U.env,artifactDir:B,fileName:O});A.push(await pn({workload:s,phase:"heap",configFingerprint:T,diagnosticWallNs:j.diagnosticWallNs,exitCode:j.exitCode,heap:j.heap,artifactPath:j.artifactPath,artifactKind:"heapsnapshot",warnings:j.warnings}))}return A}async function pn(s){let h=`${s.workload.id}-${s.phase}-${s.configFingerprint}`,m=s.artifactPath?[await E(h,s.artifactKind,s.artifactPath)]:[];return a({workload:s.workload,phase:s.phase,configFingerprint:s.configFingerprint,diagnosticWallNs:s.diagnosticWallNs,exitCode:s.exitCode,cpu:s.cpu,heap:s.heap,warnings:s.warnings,artifacts:m})}async function z(s,h={}){let m=F(s),T=o({intervalUs:h.intervalUs??Ne,origin:h.origin??"inspector"}),U=(O)=>O.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];if(h.origin==="jsc"){let{result:O,cpu:j,jit:Y,diagnosticWallNs:L}=await d(s,h),K=a({workload:m,phase:"cpu",configFingerprint:T,diagnosticWallNs:L,cpu:j,jit:Y,warnings:U(j),artifacts:[]});return{result:O,measurement:K,document:n([m],[K])}}let{result:B,cpu:I,diagnosticWallNs:A}=await Oe(s,h),_=a({workload:m,phase:"cpu",configFingerprint:T,diagnosticWallNs:A,cpu:I,warnings:U(I),artifacts:[]});return{result:B,measurement:_,document:n([m],[_])}}
21
+ export{v,R,N,c,l,b,M,w,J,V,r,G,C,z};
package/cli.js CHANGED
@@ -1,22 +1,45 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{w,P,d,a,f,y,g,n,k}from"./chunk-3qbcj1m9.js";import{e,c,r,u,i,s,o,t}from"./chunk-zrck2q0b.js";function L(p){return e("cache",p.workloadId,p.phase,p.configFingerprint,p.bunVersion,p.toolVersion,p.instrumented,p.inputsDigest??null)}async function W(p,l=process.cwd()){if(p.length===0)return;let m=new Set;for(let b of p){let C=new Bun.Glob(b);for await(let j of C.scan({cwd:l,absolute:!1}))m.add(j)}let x=[...m].sort(),h=await Promise.all(x.map(async(b)=>{let C=await Bun.file(`${l}/${b}`).arrayBuffer();return{path:b,sha256:Bun.CryptoHasher.hash("sha256",C,"hex")}}));return e("inputs",h)}function z(p,l){return`${p}/cache/${l}.json`}async function M(p,l){let m=Bun.file(z(p,l));if(!await m.exists())return;return await m.json()}async function V(p,l,m){await Bun.write(z(p,l),`${JSON.stringify(m,null,2)}
4
- `)}var Y="node_modules/.cache/ostia",ee=".ostia/baselines",te={runs:null,warmup:3,outDir:Y,baselineDir:ee,baseline:"main",cpuIntervalUs:1000,thresholds:a,workloads:[]};async function q(p="ostia.config.json"){let l=Bun.file(p);if(!await l.exists())return;let m=await l.json();return{...te,...m,thresholds:{...a,...m.thresholds??{}}}}function G(p,l){return`${p.baselineDir}/${l??p.baseline}.json`}class U extends Error{path;constructor(p){super(`No baseline document at ${p}. Create one with: ostia run --export-json ${p} <command...>`);this.path=p}}async function K(p){let{config:l}=p,m=G(l,p.baselineName);if(!await Bun.file(m).exists())throw new U(m);let h=await t(m),b=[],C=0,j=0,F=0;for(let R of l.workloads){let E=u(R.command,R.label),N=await W(R.inputs??[]),I=s({runs:l.runs,warmup:l.warmup}),S=L({workloadId:E.id,phase:"timing",configFingerprint:I,bunVersion:Bun.version,toolVersion:c,instrumented:!1,inputsDigest:N}),_=p.full?void 0:await M(l.outDir,S),O,H;if(_)O=_,H="cached",j++;else{C++;let J=await g({argv:R.command,runs:l.runs??void 0,warmup:l.warmup});O=i({workload:E,configFingerprint:I,trials:J.trials,timing:J.timing,warnings:J.warnings}),await V(l.outDir,S,O),H="executed",F++}b.push({workload:E,status:H,run:O})}let D=r(b.map((R)=>R.workload),b.map((R)=>R.run)),v=0,B=0,A=0;for(let R of b){let E=y(h,D,R.workload.id,l.thresholds);if(!E){A++;continue}if(R.comparison=E,E.verdict==="pass")v++;else B++}return D.comparisons=b.map((R)=>R.comparison).filter((R)=>R!==void 0),{document:D,summary:{total:l.workloads.length,affected:C,cached:j,executed:F,passed:v,regressed:B,missingBaseline:A,results:b}}}function Z(p){let l=[];if(l.push(`${p.total} workloads`),l.push(`${p.affected} affected by this change`),l.push(`${p.cached} cached`),l.push(`${p.executed} executed`),p.missingBaseline>0)l.push(`${p.missingBaseline} skipped (no matching baseline workload)`);let m=p.results.filter((x)=>x.comparison?.verdict==="fail").map((x)=>{let h=x.comparison.timing,b=x.workload.label??x.workload.command?.join(" ")??x.workload.id;return h?`${h.medianDeltaPct>0?"+":""}${h.medianDeltaPct.toFixed(1)}% median on ${b}`:b});return l.push(`${p.passed} passed ${p.regressed} regressed${m.length>0?` (${m.join(", ")})`:""}`),l.push(""),l.push(`Profile CI: ${p.regressed>0?"\u2717":"\u2713"}`),`${l.join(`
3
+ import{v,R,N,c,l,b,M,w,r,C}from"./chunk-h6579788.js";import{e,m,n,p,i,o,s,t}from"./chunk-9dqf5cxf.js";function G(u){return e("cache",u.workloadId,u.phase,u.configFingerprint,u.bunVersion,u.toolVersion,u.instrumented,u.inputsDigest??null)}async function z(u,a=process.cwd()){if(u.length===0)return;let f=new Set;for(let k of u){let g=new Bun.Glob(k);for await(let y of g.scan({cwd:a,absolute:!1}))f.add(y)}let d=[...f].sort(),h=await Promise.all(d.map(async(k)=>{let g=await Bun.file(`${a}/${k}`).arrayBuffer();return{path:k,sha256:Bun.CryptoHasher.hash("sha256",g,"hex")}}));return e("inputs",h)}function K(u,a){return`${u}/cache/${a}.json`}async function X(u,a){let f=Bun.file(K(u,a));if(!await f.exists())return;return await f.json()}async function Z(u,a,f){await Bun.write(K(u,a),`${JSON.stringify(f,null,2)}
4
+ `)}var ce="node_modules/.cache/ostia",ue=".ostia/baselines",me={runs:null,warmup:3,outDir:ce,baselineDir:ue,baseline:"main",cpuIntervalUs:1000,thresholds:l,workloads:[]};function ee(u){return{...me,...u,thresholds:{...l,...u.thresholds??{}}}}async function Q(u){let a=Bun.file(u);if(!await a.exists())return;return ee(await a.json())}async function Y(u){let a=u.startsWith("/")?u:`${process.cwd()}/${u}`;if(!await Bun.file(a).exists())return;let f=await import(a);return ee(f.default??{})}async function O(u){if(u!==void 0)return u.endsWith(".ts")?Y(u):Q(u);return await Y("ostia.config.ts")??Q("ostia.config.json")}function U(u,a){return`${u.baselineDir}/${a??u.baseline}.json`}class L extends Error{path;constructor(u){super(`No baseline document at ${u}. Create one with: ostia time --export-json ${u} <command...>`);this.path=u}}async function V(u,a){let f=[];for(let d of u.workloads){if(d.suites){let j=await R(d.suites,process.cwd()),F=await c({suites:j,outDir:u.outDir,noiseCheck:!1,budgetMs:u.bench?.budgetMs,samples:u.bench?.samples,minSamples:u.bench?.minSamples,gc:u.bench?.gc,cpu:u.bench?.cpu,alloc:u.bench?.alloc,filter:u.bench?.filter,isolate:u.bench?.isolate,preload:u.bench?.preload,jobs:typeof u.bench?.jobs==="number"?u.bench.jobs:void 0});for(let P of F.workloads){let A=F.measurements.find((B)=>B.workloadId===P.id&&B.phase==="timing");if(!A)continue;f.push({workload:P,status:"executed",run:A})}continue}let h=p(d.command,d.label,{prepare:d.prepare,timeSource:d.timeSource}),k=await z(d.inputs??[]),g=o({runs:u.runs,warmup:u.warmup}),y=typeof d.prepare!=="function",E=G({workloadId:h.id,phase:"timing",configFingerprint:g,bunVersion:Bun.version,toolVersion:m,instrumented:!1,inputsDigest:k}),S=a||!y?void 0:await X(u.outDir,E),D,T;if(S)D=S,T="cached";else{let j=await w({argv:d.command,samples:u.runs??void 0,warmup:u.warmup,prepare:d.prepare,timeSource:d.timeSource});if(D=i({workload:h,configFingerprint:g,trials:j.trials,timing:j.timing,warnings:j.warnings}),y)await Z(u.outDir,E,D);T="executed"}f.push({workload:h,status:T,run:D})}return f}async function te(u){let{config:a}=u,f=U(a,u.baselineName);if(!await Bun.file(f).exists())throw new L(f);let h=await t(f),g=(await V(a,u.full)).map((P)=>({...P})),y=g.filter((P)=>P.status==="executed").length,E=g.filter((P)=>P.status==="cached").length,S=y,D=n(g.map((P)=>P.workload),g.map((P)=>P.run)),T=0,j=0,F=0;for(let P of g){let A=M(h,D,P.workload.id,a.thresholds);if(!A){F++;continue}if(P.comparison=A,A.verdict==="pass")T++;else j++}return D.comparisons=g.map((P)=>P.comparison).filter((P)=>P!==void 0),{document:D,summary:{total:g.length,affected:y,cached:E,executed:S,passed:T,regressed:j,missingBaseline:F,results:g}}}function se(u){let a=[];if(a.push(`${u.total} workloads`),a.push(`${u.affected} affected by this change`),a.push(`${u.cached} cached`),a.push(`${u.executed} executed`),u.missingBaseline>0)a.push(`${u.missingBaseline} skipped (no matching baseline workload)`);let f=u.results.filter((d)=>d.comparison?.verdict==="fail").map((d)=>{let h=d.comparison.timing,k=d.workload.label??d.workload.command?.join(" ")??d.workload.id;return h?`${h.medianDeltaPct>0?"+":""}${h.medianDeltaPct.toFixed(1)}% median on ${k}`:k});return a.push(`${u.passed} passed ${u.regressed} regressed${f.length>0?` (${f.join(", ")})`:""}`),a.push(""),a.push(`Profile CI: ${u.regressed>0?"\u2717":"\u2713"}`),`${a.join(`
5
5
  `)}
6
- `}async function T(p,l){if(p.text)process.stdout.write(p.text);if(!p.files||p.files.length===0)return;if(l)for(let m of p.files){let x=m.path?`${l}/${m.path}`:l;await Bun.write(x,m.content),process.stdout.write(`wrote ${x}
7
- `)}else if(p.files.length===1)process.stdout.write(p.files[0].content);else for(let m of p.files)process.stdout.write(`--- ${m.path??"(unnamed)"} ---
8
- ${m.content}
9
- `)}var se=`ostia run [flags] <command...>
6
+ `}async function ne(u,a){let f=await V(u,!1),d=n(f.map((k)=>k.workload),f.map((k)=>k.run)),h=U(u,a);return await s(d,h),h}async function re(u){let a=[];try{let d=new Bun.Glob("*.json");for await(let h of d.scan({cwd:u.baselineDir,absolute:!1}))a.push(h.replace(/\.json$/,""))}catch{return[]}a.sort();let f=[];for(let d of a){let h=U(u,d);try{let k=await t(h);f.push({name:d,path:h,createdAt:k.createdAt,toolVersion:k.toolVersion,bunVersion:k.bunVersion,workloads:k.workloads.length,...k.git!==void 0&&{git:k.git}})}catch{}}return f}async function q(u,a){if(u.text)process.stdout.write(u.text);if(!u.files||u.files.length===0)return;if(a)for(let f of u.files){let d=f.path?`${a}/${f.path}`:a;await Bun.write(d,f.content),process.stdout.write(`wrote ${d}
7
+ `)}else if(u.files.length===1)process.stdout.write(u.files[0].content);else for(let f of u.files)process.stdout.write(`--- ${f.path??"(unnamed)"} ---
8
+ ${f.content}
9
+ `)}var de=`ostia time [flags] <command...>
10
10
 
11
- Run one or more commands N times with warmup and report timing statistics.
11
+ Time one or more commands N times with warmup and report timing statistics.
12
12
 
13
13
  Flags:
14
- --runs N exact number of timed trials (default: hyperfine-style auto)
14
+ --samples N exact number of timed trials
15
+ --budget MS wall-clock time budget for the sampling loop (default: a
16
+ hyperfine-style ~3s min-total-time loop when neither
17
+ --samples nor --budget is given)
18
+ --min-samples N hard floor on trials when --samples is not given
15
19
  --warmup N warmup trials, discarded (default: 3)
20
+ --no-interleave run each command's whole trial loop to completion before the next
21
+ command starts, instead of round-robin (one trial per command,
22
+ repeated). Round-robin is the default with 2+ commands: it spreads
23
+ drift over the run's wall-clock span (thermal throttling, a noisy
24
+ neighbor process) evenly across every command instead of favoring
25
+ whichever ran first or last. Meaningless (and ignored) with one
26
+ command. Interleaved measurements carry Measurement.interleaved: true.
27
+ --prepare CMD run CMD before every trial (warmup and --cpu/--heap trials
28
+ included), unmeasured, in the same cwd; it must exit 0. Whitespace-
29
+ split like the commands themselves (no shell). Given once it applies
30
+ to every command; given once per command it pairs up in order, so the
31
+ same command can be timed warm and cold side by side.
32
+ --time-source REGEX take each trial's time from the first REGEX match in the command's
33
+ own stdout (then stderr), capture group 1, instead of its wall clock -
34
+ e.g. --time-source "built in (\\d+)ms" for a build tool whose own
35
+ summary excludes runtime startup. Every trial must match or the run
36
+ aborts. Trials keep wallNs alongside the reported value.
37
+ --time-unit UNIT unit of the --time-source number: ns | us | ms | s (default: ms)
16
38
  --cpu capture one instrumented CPU-profile trial (subprocess --cpu-prof)
17
39
  --heap capture one instrumented heap-snapshot trial (subprocess --heap-prof)
18
40
  --cpu-interval USEC CPU sampling interval in microseconds (default: 1000)
19
41
  --out-dir PATH directory for captured artifacts (default: node_modules/.cache/ostia)
42
+ --no-noise-check skip the ~200ms machine noise floor reference measurement
20
43
  --export-json PATH write the full ProfileDocument to PATH
21
44
  --format FORMAT table | json | jsonl | markdown | minimal (default: table)
22
45
  --quiet suppress the rendered report (still writes --export-json)
@@ -26,17 +49,22 @@ Instrumented runs (--cpu, --heap) are labeled separately from clean timing and n
26
49
  mixed into the timing statistics.
27
50
 
28
51
  Examples:
29
- ostia run "bun ./fixtures/work.ts"
30
- ostia run --runs 25 --warmup 3 "bun a.ts" "bun b.ts"
31
- ostia run --cpu --heap "bun src/server.ts"
32
- ostia run --format json "bun a.ts"
33
- `,X=`ostia bench [flags] <suite.ts...>
52
+ ostia time "bun ./fixtures/work.ts"
53
+ ostia time --samples 25 --warmup 3 "bun a.ts" "bun b.ts"
54
+ ostia time --no-interleave "bun a.ts" "bun b.ts"
55
+ ostia time --prepare "rm -rf dist" "bun build.ts"
56
+ ostia time --time-source "built in (\\d+)ms" "bun build.ts"
57
+ ostia time --cpu --heap "bun src/server.ts"
58
+ ostia time --format json "bun a.ts"
59
+ `,oe=`ostia bench [flags] <suite.ts...>
34
60
 
35
61
  Run in-process benchmark suites (registered via group()/task()). Each suite file runs
36
62
  in its own spawned child process (isolated from CLI startup state).
37
63
 
38
64
  Flags:
39
- --time-budget MS sampling budget per task; always runs at least this long (default: 500)
65
+ --budget MS sampling budget per task; always runs at least this long (default: 500).
66
+ --samples N exact trial count per task; when set, the budget is ignored -
67
+ the in-process equivalent of "ostia time"'s --samples.
40
68
  --min-samples N hard floor on samples per task, kept even when it overruns the
41
69
  budget. Default: cost-aware - as many as fit in the budget (max 20),
42
70
  but never below the floor the task's per-trial cost earns it: 3 at
@@ -51,6 +79,14 @@ Flags:
51
79
  like-for-like with a baseline measured at 1. "auto" = CPU count.
52
80
  --gc Bun.gc(true) between trials (default: off - hides allocation cost).
53
81
  Per-task { gc } / per-group { gc } override this default.
82
+ --cpu capture an extra phase: "cpu" measurement per task (200ms of the
83
+ task looped under the JSC sampling profiler, JIT tiers included) on
84
+ top of its timing numbers. Per-task { cpu } / per-group { cpu }
85
+ override this default. Once captured, "ostia compare" reports
86
+ per-frame CPU deltas the same way it already does for "ostia time --cpu".
87
+ --alloc capture an extra phase: "memstats" measurement per task: bytes
88
+ allocated per call, from a Bun.gc(true)-bracketed batch of 100 calls.
89
+ Per-task { alloc } / per-group { alloc } override this default.
54
90
  --filter REGEX only run tasks whose "group/name" id matches this regex (substring,
55
91
  case-sensitive; unmatched tasks are skipped, not timed)
56
92
  --isolate give every task its own subprocess instead of sharing its suite
@@ -70,12 +106,13 @@ Flags:
70
106
  resolution condition Bun doesn't set by default, e.g. Svelte/Vue's
71
107
  "browser" vs "default" build: --bun-flags="--conditions=browser"
72
108
  --out-dir PATH directory for scratch IPC files (default: node_modules/.cache/ostia)
109
+ --no-noise-check skip the ~200ms machine noise floor reference measurement
73
110
  --export-json PATH write the full ProfileDocument to PATH
74
111
  --format FORMAT table | json | jsonl | markdown | minimal (default: table)
75
112
  "minimal" is one compact JSON object per task with no raw sample
76
- array: {task, group, description, samples, mean, median, stddevPct,
77
- relative, warnings[{code,data}]} in ns - built to pipe into an LLM
78
- agent's context.
113
+ array: {task, group, description, params, samples, mean, median,
114
+ stddevPct, relative, warnings[{code,data}]} in ns - built to pipe
115
+ into an LLM agent's context.
79
116
  --quiet suppress the rendered report (still writes --export-json)
80
117
  --help show this message
81
118
 
@@ -83,22 +120,33 @@ Suite files register tasks like:
83
120
  import { group, task } from "<pkg>"
84
121
  group("parse", () => {
85
122
  task("small input", () => parse(smallBuf))
86
- task("full pipeline", () => build(), { timeBudgetMs: 2000, minSamples: 10 })
123
+ task("full pipeline", () => build(), { budgetMs: 2000, minSamples: 10 })
87
124
  }, { description: "parser throughput on representative inputs" })
88
- Per-task options override --time-budget / --min-samples / --gc / --isolate for that task
89
- only; per-group { gc } / { isolate } set the default for every task in that group.
125
+ Per-task options override --budget / --min-samples / --gc / --isolate / --cpu / --alloc
126
+ for that task only; per-group { gc } / { isolate } / { cpu } / { alloc } set the default for
127
+ every task in that group.
90
128
  Optional { description } on group() and task() flows into the document (Workload.description
91
129
  / Workload.groupDescription) so the intent travels with the numbers.
92
130
 
93
- Sweep a size dimension with range(start, end, multiplier?) (mitata's .range() point
94
- generation, default multiplier 8, always ending on the end value):
95
- import { group, task, range } from "<pkg>"
131
+ Sweep one or more dimensions with sweep(dims, fn): a cartesian product over the
132
+ dimensions, calling fn once per point. task() calls inside automatically inherit the
133
+ point as Workload.params (an explicit { params } on a task merges over it):
134
+ import { group, task, range, sweep } from "<pkg>"
96
135
  group("parse", () => {
97
- for (const size of range(100, 10_000)) {
136
+ sweep({ size: range(100, 10_000), impl: ["current", "fast"] }, ({ size, impl }) => {
98
137
  const input = buildInput(size) // setup, runs once per point, unmeasured
99
- task(\`\${size} items\`, () => parse(input))
100
- }
138
+ task(\`\${impl}\`, () => impls[impl](input))
139
+ })
101
140
  })
141
+ range(start, end, multiplier?) is the geometric point generator that feeds sweep()
142
+ (mitata's .range(), default multiplier 8, always ending on the end value).
143
+
144
+ task.skip(...) / group.skip(...) register without measuring: the document still
145
+ carries the workload (marked skipped) instead of it being absent, so a renderer
146
+ prints "- skipped" and compare reports it as unchanged with a warning rather than
147
+ silently passing. task.only(...) / group.only(...) restrict the suite file to only
148
+ the selected tasks (--filter still applies on top) and print a one-line notice to
149
+ stderr, so a forgotten .only is visible.
102
150
 
103
151
  Project defaults: with no suite files given on the command line, ostia falls back to
104
152
  ostia.config.json's "bench" section in the current directory - suites is a list of globs
@@ -110,13 +158,14 @@ still works as a one-off override without editing the config.
110
158
 
111
159
  Examples:
112
160
  ostia bench benches/parse.ts
113
- ostia bench --time-budget 1000 --min-samples 50 benches/*.ts
161
+ ostia bench --budget 1000 --min-samples 50 benches/*.ts
114
162
  ostia bench benches/*.ts --filter parse
115
163
  ostia bench benches/*.ts --jobs auto --format minimal
164
+ ostia bench benches/*.ts --cpu --alloc
116
165
  ostia bench --preload ./bench/jsdom-setup.ts benches/*.dom.bench.ts
117
166
  ostia bench --bun-flags="--conditions=browser" bench/*.dom.bench.ts
118
167
  ostia bench # picks up suites/preload/jobs from ostia.config.json
119
- `,Q=`ostia compare <base.json> <candidate.json>
168
+ `,ae=`ostia compare <base.json> <candidate.json>
120
169
  ostia compare <candidate.json> --baseline <path.json>
121
170
 
122
171
  Compare two ProfileDocuments (matched by workload id) and rank timing/frame/heap deltas.
@@ -131,31 +180,35 @@ Flags:
131
180
  Examples:
132
181
  ostia compare before.json after.json
133
182
  ostia compare after.json --baseline .ostia/baselines/main.json
134
- `,re=`ostia report <document.json> [--format table|json|markdown|jsonl|minimal]
135
-
136
- Render a saved ProfileDocument.
137
- `,ne=`ostia viz <document.json> --format FORMAT [--run <id>] [--out-dir PATH]
183
+ `,pe=`ostia report <document.json> [flags]
138
184
 
139
- Render CPU evidence from a saved ProfileDocument as a visualization artifact. Files,
140
- not a GUI - hand the output to speedscope.app, flamegraph.pl, or
141
- a Mermaid renderer.
185
+ Render a saved ProfileDocument. Files, not a GUI for the visualization formats -
186
+ hand the output to speedscope.app, flamegraph.pl, or a Mermaid renderer.
142
187
 
143
188
  Formats:
144
- ascii ranked self-time table (alias for the table renderer)
189
+ table terminal timing/CPU/heap/comparison text (default)
190
+ json pretty JSON document
191
+ jsonl one metadata line, then one line per measurement
192
+ markdown agent- and human-readable report
193
+ minimal one compact JSON object per timing measurement, for LLM/CI consumption
145
194
  collapsed folded stacks: "root;a;b 42" - flamegraph.pl and most flame tooling
146
195
  mermaid call tree, top-15 frames by total time (never the whole profile)
147
196
  speedscope sampled profile JSON for speedscope.app
148
197
  cpuprofile verbatim .cpuprofile pass-through (cpu-prof/inspector origins only)
149
198
 
150
199
  Flags:
151
- --run <id> render only this run (default: every CPU run in the document)
152
- --out-dir PATH write artifacts here instead of stdout
153
- --help show this message
200
+ --format FORMAT one of the formats above (default: table)
201
+ --measurement <id> for the visualization formats: render only this measurement
202
+ (default: every CPU measurement in the document)
203
+ --out-dir PATH write visualization files here instead of stdout
204
+ --help show this message
154
205
 
155
206
  Examples:
156
- ostia viz run.json --format speedscope --out-dir node_modules/.cache/ostia/viz
157
- ostia viz run.json --format collapsed | flamegraph.pl > flame.svg
158
- `,oe=`ostia ci [--full] [--baseline NAME]
207
+ ostia report doc.json
208
+ ostia report doc.json --format markdown
209
+ ostia report doc.json --format speedscope --out-dir node_modules/.cache/ostia/viz
210
+ ostia report doc.json --format collapsed | flamegraph.pl > flame.svg
211
+ `,fe=`ostia ci [--full] [--baseline NAME] [--save-baseline]
159
212
 
160
213
  Load ostia.config.json, run configured workloads (reusing cached results when their
161
214
  fingerprint is unchanged), compare against the named baseline, and gate on regressions.
@@ -163,36 +216,69 @@ fingerprint is unchanged), compare against the named baseline, and gate on regre
163
216
  Flags:
164
217
  --full ignore the cache; rerun every configured workload
165
218
  --baseline NAME baseline name (default: config's "baseline" field, or "main")
219
+ --save-baseline after a pass (no regressions), write the just-measured document as
220
+ the new baseline at the same path just compared against - promotes
221
+ today's numbers to tomorrow's floor in one step.
166
222
  --export-json PATH write the resulting document (with comparisons) to PATH
167
223
  --quiet suppress the rendered report (still writes --export-json)
168
224
  --help show this message
169
225
 
170
226
  Exit codes: 0 pass, 1 regression, 2 harness error (missing config/baseline, spawn failure).
171
- `;function ae(p){let l=[],m,x,h=!1,b=!1,C,j,F,D="table",v=!1,B=!1;for(let A=0;A<p.length;A++){let R=p[A];switch(R){case"--runs":m=Number(p[++A]);break;case"--warmup":x=Number(p[++A]);break;case"--cpu":h=!0;break;case"--heap":b=!0;break;case"--cpu-interval":C=Number(p[++A]);break;case"--out-dir":j=p[++A];break;case"--export-json":F=p[++A];break;case"--format":D=p[++A];break;case"--quiet":v=!0;break;case"--help":case"-h":B=!0;break;default:l.push(R)}}return{commands:l,runs:m,warmup:x,cpu:h,heap:b,cpuIntervalUs:C,outDir:j,exportJson:F,format:D,quiet:v,help:B}}async function ie(p){let l=ae(p);if(l.help||l.commands.length===0)return process.stdout.write(se),l.help?0:2;if(!(l.format in n))return process.stderr.write(`Unknown --format "${l.format}". Expected one of: ${Object.keys(n).join(", ")}
172
- `),2;let m;try{m=await k({commands:l.commands,runs:l.runs,warmup:l.warmup,cpu:l.cpu,heap:l.heap,cpuIntervalUs:l.cpuIntervalUs,outDir:l.outDir})}catch(h){return process.stderr.write(`Run failed: ${h instanceof Error?h.message:String(h)}
173
- `),2}if(l.exportJson)await o(m,l.exportJson);if(!l.quiet){let b=await n[l.format].render(m,{});await T(b)}return m.runs.some((h)=>h.trials.some((b)=>b.exitCode!==void 0&&b.exitCode!==0))?1:0}function le(p){let l=[],m,x,h,b=!1,C,j=!1,F=[],D=[],v,B,A="table",R=!1,E=!1;for(let N=0;N<p.length;N++){let I=p[N];if(I==="--bun-flags"||I.startsWith("--bun-flags=")){let S=I.startsWith("--bun-flags=")?I.slice(12):p[++N]??"";D.push(...S.split(/\s+/).filter(Boolean));continue}switch(I){case"--time-budget":m=Number(p[++N]);break;case"--min-samples":x=Number(p[++N]);break;case"--jobs":{let S=p[++N];h=S==="auto"?w():Number(S);break}case"--gc":b=!0;break;case"--filter":C=p[++N];break;case"--isolate":j=!0;break;case"--preload":F.push(p[++N]);break;case"--out-dir":v=p[++N];break;case"--export-json":B=p[++N];break;case"--format":A=p[++N];break;case"--quiet":R=!0;break;case"--help":case"-h":E=!0;break;default:l.push(I)}}return{suites:l,timeBudgetMs:m,minSamples:x,jobs:h,gc:b,filter:C,isolate:j,preload:F,bunFlags:D,outDir:v,exportJson:B,format:A,quiet:R,help:E}}async function ue(p){let l=le(p);if(l.help)return process.stdout.write(X),0;if(!(l.format in n))return process.stderr.write(`Unknown --format "${l.format}". Expected one of: ${Object.keys(n).join(", ")}
174
- `),2;let m=await q(),x=await P(l,m?.bench);if(x.suites.length===0)return process.stdout.write(X),2;if(x.jobs!==void 0&&!(x.jobs>=1))return process.stderr.write(`--jobs expects a positive integer or "auto".
175
- `),2;let h;try{h=await d(x)}catch(b){return process.stderr.write(`Bench failed: ${b instanceof Error?b.message:String(b)}
176
- `),2}if(l.exportJson)await o(h,l.exportJson);if(!l.quiet){let C=await n[l.format].render(h,{});await T(C)}return 0}function ce(p){let l=[],m,x,h="table",b=!1,C=!1;for(let j=0;j<p.length;j++){let F=p[j];switch(F){case"--baseline":m=p[++j];break;case"--export-json":x=p[++j];break;case"--format":h=p[++j];break;case"--quiet":b=!0;break;case"--help":case"-h":C=!0;break;default:l.push(F)}}return{paths:l,baseline:m,exportJson:x,format:h,quiet:b,help:C}}async function de(p){let l=ce(p);if(l.help)return process.stdout.write(Q),0;let m,x;if(l.baseline)m=l.baseline,x=l.paths[0];else m=l.paths[0],x=l.paths[1];if(!m||!x)return process.stdout.write(Q),2;let h,b;try{[h,b]=await Promise.all([t(m),t(x)])}catch(D){return process.stderr.write(`Failed to load documents: ${D instanceof Error?D.message:String(D)}
177
- `),2}let C=f(h,b),j={...b,comparisons:C};if(l.exportJson)await o(j,l.exportJson);if(!l.quiet){let v=await n[l.format].render(j,{});await T(v)}return C.some((D)=>D.verdict==="fail")?1:0}function pe(p){let l,m="table",x=!1;for(let h=0;h<p.length;h++){let b=p[h];switch(b){case"--format":m=p[++h];break;case"--help":case"-h":x=!0;break;default:l=b}}return{path:l,format:m,help:x}}async function me(p){let l=pe(p);if(l.help||!l.path)return process.stdout.write(re),l.help?0:2;let m;try{m=await t(l.path)}catch(b){return process.stderr.write(`Failed to load ${l.path}: ${b instanceof Error?b.message:String(b)}
178
- `),2}let h=await n[l.format].render(m,{});return await T(h),0}var fe={ascii:"table"};function he(p){let l,m,x,h,b=!1;for(let C=0;C<p.length;C++){let j=p[C];switch(j){case"--format":{let F=p[++C]??"";m=fe[F]??F;break}case"--run":x=p[++C];break;case"--out-dir":h=p[++C];break;case"--help":case"-h":b=!0;break;default:l=j}}return{path:l,format:m,runId:x,outDir:h,help:b}}async function ge(p){let l=he(p);if(l.help||!l.path||!l.format)return process.stdout.write(ne),l.help?0:2;if(!(l.format in n))return process.stderr.write(`Unknown --format "${l.format}". Expected one of: ${Object.keys(n).join(", ")}, ascii
179
- `),2;let m;try{m=await t(l.path)}catch(b){return process.stderr.write(`Failed to load ${l.path}: ${b instanceof Error?b.message:String(b)}
180
- `),2}let h=await n[l.format].render(m,{runId:l.runId});if(!h.text&&(!h.files||h.files.length===0))return process.stderr.write(l.runId?`No CPU evidence found for run "${l.runId}".
181
- `:`No CPU evidence found in this document (no cpu-phase runs). Capture some with "ostia run --cpu ...".
182
- `),2;return await T(h,l.outDir),0}function be(p){let l=!1,m,x,h=!1,b=!1;for(let C=0;C<p.length;C++)switch(p[C]){case"--full":l=!0;break;case"--baseline":m=p[++C];break;case"--export-json":x=p[++C];break;case"--quiet":h=!0;break;case"--help":case"-h":b=!0;break}return{full:l,baseline:m,exportJson:x,quiet:h,help:b}}async function we(p){let l=be(p);if(l.help)return process.stdout.write(oe),0;let m=await q();if(!m)return process.stderr.write(`No ostia.config.json found. "ostia ci" needs configured workloads.
183
- `),2;if(m.workloads.length===0)return process.stderr.write(`ostia.config.json has no "workloads" configured.
184
- `),2;let x;try{x=await K({config:m,full:l.full,baselineName:l.baseline})}catch(h){if(h instanceof U)return process.stderr.write(`${h.message}
227
+ `,_=`ostia baseline <save|list|show> [args]
228
+
229
+ Manage the baseline ProfileDocuments "ostia ci" gates against and "ostia compare --baseline"
230
+ reads.
231
+
232
+ Subcommands:
233
+ save [name] measure every configured workload (same code path as "ostia ci",
234
+ no comparison) and write it to <baselineDir>/<name>.json
235
+ (default name: config's "baseline" field, or "main")
236
+ list list saved baselines: name, created date, workload count
237
+ show <name> [flags] render a saved baseline; delegates to "ostia report" (same
238
+ --format/--measurement/--out-dir flags)
239
+
240
+ Examples:
241
+ ostia baseline save
242
+ ostia baseline save my-feature
243
+ ostia baseline list
244
+ ostia baseline show main
245
+ ostia baseline show main --format markdown
246
+ `;function he(u){let a=[],f=[],d,h,k,g,y,E,S=!0,D=!1,T=!1,j,F,P=!0,A,B="table",W=!1,J=!1;for(let x=0;x<u.length;x++){let I=u[x];switch(I){case"--samples":k=Number(u[++x]);break;case"--budget":g=Number(u[++x]);break;case"--min-samples":y=Number(u[++x]);break;case"--warmup":E=Number(u[++x]);break;case"--no-interleave":S=!1;break;case"--prepare":f.push(u[++x]??"");break;case"--time-source":d=u[++x];break;case"--time-unit":h=u[++x];break;case"--cpu":D=!0;break;case"--heap":T=!0;break;case"--cpu-interval":j=Number(u[++x]);break;case"--out-dir":F=u[++x];break;case"--no-noise-check":P=!1;break;case"--export-json":A=u[++x];break;case"--format":B=u[++x];break;case"--quiet":W=!0;break;case"--help":case"-h":J=!0;break;default:a.push(I)}}return{commands:a,prepare:f,timeSource:d,timeUnit:h,samples:k,budgetMs:g,minSamples:y,warmup:E,interleave:S,cpu:D,heap:T,cpuIntervalUs:j,outDir:F,noiseCheck:P,exportJson:A,format:B,quiet:W,help:J}}var ie=["ns","us","ms","s"];async function be(u){let a=he(u);if(a.help||a.commands.length===0)return process.stdout.write(de),a.help?0:2;if(!(a.format in r))return process.stderr.write(`Unknown --format "${a.format}". Expected one of: ${Object.keys(r).join(", ")}
247
+ `),2;if(a.prepare.length>1&&a.prepare.length!==a.commands.length)return process.stderr.write(`--prepare given ${a.prepare.length} times for ${a.commands.length} command(s): give it once (applies to all) or once per command.
248
+ `),2;if(a.timeUnit!==void 0&&!ie.includes(a.timeUnit))return process.stderr.write(`Unknown --time-unit "${a.timeUnit}". Expected one of: ${ie.join(", ")}
249
+ `),2;if(a.timeSource!==void 0)try{new RegExp(a.timeSource)}catch(g){return process.stderr.write(`Invalid --time-source regex: ${g instanceof Error?g.message:String(g)}
250
+ `),2}let f=a.timeSource!==void 0?{pattern:a.timeSource,unit:a.timeUnit}:void 0,d=a.commands.map((g,y)=>({command:g,prepare:a.prepare.length===1?a.prepare[0]:a.prepare[y]})),h;try{h=await C({commands:d,timeSource:f,samples:a.samples,budgetMs:a.budgetMs,minSamples:a.minSamples,warmup:a.warmup,interleave:a.interleave,cpu:a.cpu,heap:a.heap,cpuIntervalUs:a.cpuIntervalUs,outDir:a.outDir,noiseCheck:a.noiseCheck})}catch(g){return process.stderr.write(`Run failed: ${g instanceof Error?g.message:String(g)}
251
+ `),2}if(a.exportJson)await s(h,a.exportJson);if(!a.quiet){let y=await r[a.format].render(h,{});await q(y)}return h.measurements.some((g)=>g.trials.some((y)=>y.exitCode!==void 0&&y.exitCode!==0))?1:0}function ge(u){let a=[],f,d,h,k,g=!1,y=!1,E=!1,S,D=!1,T=[],j=[],F,P=!0,A,B="table",W=!1,J=!1;for(let x=0;x<u.length;x++){let I=u[x];if(I==="--bun-flags"||I.startsWith("--bun-flags=")){let H=I.startsWith("--bun-flags=")?I.slice(12):u[++x]??"";j.push(...H.split(/\s+/).filter(Boolean));continue}switch(I){case"--budget":f=Number(u[++x]);break;case"--samples":d=Number(u[++x]);break;case"--min-samples":h=Number(u[++x]);break;case"--jobs":{let H=u[++x];k=H==="auto"?v():Number(H);break}case"--gc":g=!0;break;case"--cpu":y=!0;break;case"--alloc":E=!0;break;case"--filter":S=u[++x];break;case"--isolate":D=!0;break;case"--preload":T.push(u[++x]);break;case"--out-dir":F=u[++x];break;case"--no-noise-check":P=!1;break;case"--export-json":A=u[++x];break;case"--format":B=u[++x];break;case"--quiet":W=!0;break;case"--help":case"-h":J=!0;break;default:a.push(I)}}return{suites:a,budgetMs:f,samples:d,minSamples:h,jobs:k,gc:g,cpu:y,alloc:E,filter:S,isolate:D,preload:T,bunFlags:j,outDir:F,noiseCheck:P,exportJson:A,format:B,quiet:W,help:J}}async function we(u){let a=ge(u);if(a.help)return process.stdout.write(oe),0;if(!(a.format in r))return process.stderr.write(`Unknown --format "${a.format}". Expected one of: ${Object.keys(r).join(", ")}
252
+ `),2;let f=await O(),d=await N(a,f?.bench);if(d.suites.length===0)return process.stdout.write(oe),2;if(d.jobs!==void 0&&!(d.jobs>=1))return process.stderr.write(`--jobs expects a positive integer or "auto".
253
+ `),2;let h;try{h=await c(d)}catch(k){return process.stderr.write(`Bench failed: ${k instanceof Error?k.message:String(k)}
254
+ `),2}if(a.exportJson)await s(h,a.exportJson);if(!a.quiet){let g=await r[a.format].render(h,{});await q(g)}return 0}function ke(u){let a=[],f,d,h="table",k=!1,g=!1;for(let y=0;y<u.length;y++){let E=u[y];switch(E){case"--baseline":f=u[++y];break;case"--export-json":d=u[++y];break;case"--format":h=u[++y];break;case"--quiet":k=!0;break;case"--help":case"-h":g=!0;break;default:a.push(E)}}return{paths:a,baseline:f,exportJson:d,format:h,quiet:k,help:g}}async function ye(u){let a=ke(u);if(a.help)return process.stdout.write(ae),0;let f,d;if(a.baseline)f=a.baseline,d=a.paths[0];else f=a.paths[0],d=a.paths[1];if(!f||!d)return process.stdout.write(ae),2;let h,k;try{[h,k]=await Promise.all([t(f),t(d)])}catch(S){return process.stderr.write(`Failed to load documents: ${S instanceof Error?S.message:String(S)}
255
+ `),2}let g=b(h,k),y={...k,comparisons:g};if(a.exportJson)await s(y,a.exportJson);if(!a.quiet){if(h.git&&k.git){let T=(j)=>`${j.sha} (${j.branch}${j.dirty?", dirty":""})`;process.stdout.write(`base ${T(h.git)} \u2192 cand ${T(k.git)}
256
+ `)}let D=await r[a.format].render(y,{});await q(D)}return g.some((S)=>S.verdict==="fail")?1:0}function xe(u){let a,f="table",d,h,k=!1;for(let g=0;g<u.length;g++){let y=u[g];switch(y){case"--format":f=u[++g]??"";break;case"--measurement":d=u[++g];break;case"--out-dir":h=u[++g];break;case"--help":case"-h":k=!0;break;default:a=y}}return{path:a,format:f,measurementId:d,outDir:h,help:k}}async function le(u){let a=xe(u);if(a.help||!a.path)return process.stdout.write(pe),a.help?0:2;if(!(a.format in r))return process.stderr.write(`Unknown --format "${a.format}". Expected one of: ${Object.keys(r).join(", ")}
257
+ `),2;let f;try{f=await t(a.path)}catch(k){return process.stderr.write(`Failed to load ${a.path}: ${k instanceof Error?k.message:String(k)}
258
+ `),2}let h=await r[a.format].render(f,{measurementId:a.measurementId});if(!h.text&&(!h.files||h.files.length===0))return process.stderr.write(a.measurementId?`No CPU evidence found for measurement "${a.measurementId}".
259
+ `:`No CPU evidence found in this document (no cpu-phase measurements). Capture some with "ostia time --cpu ...".
260
+ `),2;return await q(h,a.outDir),0}function Ce(u){let a=!1,f,d=!1,h,k=!1,g=!1;for(let y=0;y<u.length;y++)switch(u[y]){case"--full":a=!0;break;case"--baseline":f=u[++y];break;case"--save-baseline":d=!0;break;case"--export-json":h=u[++y];break;case"--quiet":k=!0;break;case"--help":case"-h":g=!0;break}return{full:a,baseline:f,saveBaseline:d,exportJson:h,quiet:k,help:g}}async function Pe(u){let a=Ce(u);if(a.help)return process.stdout.write(fe),0;let f=await O();if(!f)return process.stderr.write(`No ostia.config.json found. "ostia ci" needs configured workloads.
261
+ `),2;if(f.workloads.length===0)return process.stderr.write(`ostia.config.json has no "workloads" configured.
262
+ `),2;let d;try{d=await te({config:f,full:a.full,baselineName:a.baseline})}catch(h){if(h instanceof L)return process.stderr.write(`${h.message}
185
263
  `),2;return process.stderr.write(`CI run failed: ${h instanceof Error?h.message:String(h)}
186
- `),2}if(l.exportJson)await o(x.document,l.exportJson);if(!l.quiet)process.stdout.write(Z(x.summary));return x.summary.regressed>0?1:0}async function ke(){let[p,...l]=process.argv.slice(2);switch(p){case"run":return ie(l);case"bench":return ue(l);case"compare":return de(l);case"report":return me(l);case"ci":return we(l);case"viz":return ge(l);case void 0:case"--help":case"-h":return process.stdout.write(`ostia - Bun-native profile IR engine
264
+ `),2}if(a.exportJson)await s(d.document,a.exportJson);if(a.saveBaseline&&d.summary.regressed===0)await s(d.document,U(f,a.baseline));if(!a.quiet)process.stdout.write(se(d.summary));return d.summary.regressed>0?1:0}async function je(u){if(u.includes("--help")||u.includes("-h"))return process.stdout.write(_),0;let a=u[0],f=await O();if(!f)return process.stderr.write(`No ostia.config.json found. "ostia baseline save" needs configured workloads.
265
+ `),2;if(f.workloads.length===0)return process.stderr.write(`ostia.config.json has no "workloads" configured.
266
+ `),2;let d=await ne(f,a);return process.stdout.write(`Wrote ${d}
267
+ `),0}async function ve(u){if(u.includes("--help")||u.includes("-h"))return process.stdout.write(_),0;let a=await O();if(!a)return process.stderr.write(`No ostia.config.json found.
268
+ `),2;let f=await re(a);if(f.length===0)return process.stdout.write(`No baselines found in ${a.baselineDir}.
269
+ `),0;for(let d of f){let h=d.git?` ${d.git.sha} (${d.git.branch}${d.git.dirty?", dirty":""})`:"";process.stdout.write(`${d.name} ${d.workloads} workloads created ${d.createdAt} toolVersion ${d.toolVersion}${h}
270
+ `)}return 0}async function $e(u){let[a,...f]=u;if(!a||a==="--help"||a==="-h")return process.stdout.write(_),a?0:2;let d=await O();if(!d)return process.stderr.write(`No ostia.config.json found.
271
+ `),2;return le([U(d,a),...f])}async function Se(u){let[a,...f]=u;switch(a){case"save":return je(f);case"list":return ve(f);case"show":return $e(f);case void 0:case"--help":case"-h":return process.stdout.write(_),a===void 0?2:0;default:return process.stderr.write(`Unknown "ostia baseline ${a}". Run "ostia baseline --help".
272
+ `),2}}async function De(){let[u,...a]=process.argv.slice(2);switch(u){case"time":return be(a);case"bench":return we(a);case"compare":return ye(a);case"report":return le(a);case"ci":return Pe(a);case"baseline":return Se(a);case void 0:case"--help":case"-h":return process.stdout.write(`ostia - Bun-native profile IR engine
187
273
 
188
274
  Commands:
189
- run Run commands N times and report timing/CPU/heap
275
+ time Time commands N times and report timing/CPU/heap
190
276
  bench Run in-process benchmark suites (group()/task())
191
277
  compare Compare two ProfileDocuments
192
- report Render a saved ProfileDocument
278
+ report Render a saved ProfileDocument (table/json/markdown/collapsed/mermaid/speedscope/...)
193
279
  ci Run configured workloads against a baseline, gate on regressions
194
- viz Render CPU evidence as collapsed/mermaid/speedscope/cpuprofile
280
+ baseline Manage baseline ProfileDocuments (save/list/show)
195
281
 
196
282
  Run "ostia <command> --help" for details.
197
- `),p===void 0?2:0;default:return process.stderr.write(`Unknown subcommand "${p}". Run "ostia --help".
198
- `),2}}if(import.meta.main)ke().then((p)=>process.exit(p));
283
+ `),u===void 0?2:0;default:return process.stderr.write(`Unknown subcommand "${u}". Run "ostia --help".
284
+ `),2}}if(import.meta.main)De().then((u)=>process.exit(u));