ostia 0.2.9 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -65,11 +65,11 @@ ostia bench suite.ts
65
65
  ```
66
66
  Apple M2 · 8 cores · load 3.5 · noise floor 0.4%
67
67
 
68
- Task Median Spread Range Relative
69
- ------------------------------------------------------------------------------------------------
68
+ Task Median Spread Range Relative
69
+ -----------------------------------------------------------------------------------------
70
70
  dedupe:
71
- dedupe/naive (indexOf scan, O(n²)) 173.9 µs 180.4 µs…205.8 µs 170.1 µs…635.5 µs 7.40× slower
72
- dedupe/Set-based (O(n)) 23.5 µs 24.9 µs…72.5 µs 18.7 µs…208.3 µs 1.00×
71
+ naive (indexOf scan, O(n²)) 173.9 µs 180.4 µs…205.8 µs 170.1 µs…635.5 µs 7.40× slower
72
+ Set-based (O(n)) 23.5 µs 24.9 µs…72.5 µs 18.7 µs…208.3 µs 1.00×
73
73
  ```
74
74
 
75
75
  ### Check a change for regressions
@@ -84,11 +84,11 @@ ostia ab suite.ts # every task: working tree vs HEAD, paired in one process
84
84
  ```
85
85
  A/B: working tree vs HEAD (3945768) · 15 rounds · threshold 10% · geomean threshold 1.5%
86
86
 
87
- Task Base Candidate Change p25…p75 Verdict
88
- -------------------------------------------------------------------------------------------------
87
+ Task Base Candidate Change p25…p75 Verdict
88
+ ------------------------------------------------------------------------------------------
89
89
  dedupe:
90
- dedupe/naive (indexOf scan, O(n²)) 183.5 µs 178.5 µs -1.9% -3.5%…-0.3%
91
- dedupe/Set-based (O(n)) 25.2 µs 181.2 µs +618.1% +554.2%…+659.2% regressed, confirmed (repeats: +630.6%, +584.5%)
90
+ naive (indexOf scan, O(n²)) 183.5 µs 178.5 µs -1.9% -3.5%…-0.3%
91
+ Set-based (O(n)) 25.2 µs 181.2 µs +618.1% +554.2%…+659.2% regressed, confirmed (repeats: +630.6%, +584.5%)
92
92
 
93
93
  Geomean +165.4% (threshold 1.5%) · 1 regressed, 0 improved, 1 unchanged of 2 · fail
94
94
  ```
@@ -132,7 +132,7 @@ Scratch output (cache, artifacts) goes to `node_modules/.cache/ostia`. Baselines
132
132
 
133
133
  `--format minimal` (on `time`, `bench`, `ab`, `compare`, `report`, `ci`) prints one JSON
134
134
  object per line on stdout and nothing else. Every line has `event` and
135
- `protocolVersion: 1`. Timing values are in nanoseconds.
135
+ `protocolVersion: 2`. Timing values are in nanoseconds.
136
136
 
137
137
  ```sh
138
138
  ostia time --samples 10 "bun a.ts" --format minimal
@@ -142,16 +142,16 @@ ostia ci --format minimal; echo $?
142
142
 
143
143
  | `event` | When | Key fields |
144
144
  |---|---|---|
145
- | `run` | One per timing measurement, every command | `workloadId`, `task`, `group?`, `params?`, `skipped?`, `unit`, `samples`, `batch`, `mean`/`median`/`stddev`/`stddevPct`/`min`/`max`/`p75`/`p99`/`mad`, `userNs`/`systemNs` (subprocess only), `retainedBytesPerOp?`/`peakBytes?` (`--alloc`/`--peak-mem`), `relative?`, `noiseFloorPct?`, `warnings[]`, on `compare`/`ci`: `delta: { medianPct, meanPct, verdict, pass, ci95?, pValue?, effectiveTimingPct, matched }`, and on `ab`: `paired: { baseMedian, medianRatio, p25, p75, rounds, verdict, flagged?, confirmed?, repeats?, sameOutput }` |
145
+ | `run` | One per timing measurement, every command | `workloadId`, `task`, `group?`, `params?`, `skipped?`, `unit`, `samples` (0 when no trial produced one), `batch`, `mean`/`median`/`stddev`/`stddevPct`/`min`/`max`/`p75`/`p99`/`mad`, `userNs`/`systemNs` (subprocess only), `retainedBytesPerOp?`/`peakBytes?` (`--alloc`/`--peak-mem`), `relative?`, `noiseFloorPct?`, `warnings[]`, `threw?` (`ab`, a task that threw), on `compare`/`ci`: `delta: { medianPct, meanPct, verdict, pass, ci95?, pValue?, effectiveTimingPct, matched }`, and on `ab`: `paired: { baseMedian, medianRatio, ratioP25, ratioP75, rounds, verdict, flagged?, confirmed?, repeats?, sameOutput, suiteChanged?, retained?, peak? }` |
146
146
  | `unmatched` | One per workload on only one side of `compare`/`ci`/`ab` | `workloadId`, `task`, `side: "base" \| "cand"` |
147
- | `summary` | Last line of `compare`/`ci`/`ab` only | `command`, `matched`/`regressed`/`improved`/`unchanged`/`unmatched`, `cached`/`executed`/`failed`/`missingBaseline` (`ci`), `geomeanPct`, `effectiveTimingPct`, `noiseFloorPct?`, `baseline?` (`ci`), `base?`/`geomeanThresholdPct?`/`unconfirmed?`/`outputDiffers?` (`ab`), `git?`, `exportedTo?`, `verdict`, `exitCode` |
147
+ | `summary` | Last line of `compare`/`ci`/`ab` only | `command`, `matched`/`regressed`/`improved`/`unchanged`/`unmatched`, `cached`/`executed`/`failed`/`missingBaseline` (`ci`), `geomeanPct`, `effectiveTimingPct`, `noiseFloorPct?`, `baseline?` (`ci`), `base?`/`geomeanThresholdPct?`/`unconfirmed?`/`outputDiffers?`/`notComparable?`/`threw?`/`newSuites?`/`memory?` (`ab`), `git?`, `exportedTo?`, `verdict`, `exitCode` |
148
148
 
149
149
  ```
150
- {"event":"run","protocolVersion":1,"schemaVersion":2,"workloadId":"wl_11e8562f3622d528","task":"work","unit":"ns","samples":10,"batch":1,"mean":21012800,"median":20999900,"stddev":231456,"stddevPct":1.1015,"min":20664000,"max":21552300,"warnings":[{"code":"outliers-detected","data":{"mild":1,"severe":0}}],"p75":21086100,"p99":21517600,"mad":126625,"userNs":15519000,"systemNs":6015500,"noiseFloorPct":2.09286,"delta":{"medianPct":44.0989,"meanPct":43.9626,"verdict":"regressed","pass":false,"effectiveTimingPct":10,"matched":true,"ci95":[41.4394,45.5841],"pValue":0.000157103}}
151
- {"event":"summary","protocolVersion":1,"command":"ci","matched":1,"regressed":1,"improved":0,"unchanged":0,"unmatched":0,"geomeanPct":44.098920968212305,"effectiveTimingPct":10,"verdict":"fail","exitCode":1,"cached":1,"executed":0,"failed":0,"missingBaseline":0,"baseline":{"name":"main","path":".ostia/baselines/main.json"},"noiseFloorPct":2.09286}
150
+ {"event":"run","protocolVersion":2,"schemaVersion":2,"workloadId":"wl_11e8562f3622d528","task":"work","unit":"ns","samples":10,"batch":1,"mean":21012800,"median":20999900,"stddev":231456,"stddevPct":1.1015,"min":20664000,"max":21552300,"warnings":[{"code":"outliers-detected","data":{"mild":1,"severe":0}}],"p75":21086100,"p99":21517600,"mad":126625,"userNs":15519000,"systemNs":6015500,"noiseFloorPct":2.09286,"delta":{"medianPct":44.0989,"meanPct":43.9626,"verdict":"regressed","pass":false,"effectiveTimingPct":10,"matched":true,"ci95":[41.4394,45.5841],"pValue":0.000157103}}
151
+ {"event":"summary","protocolVersion":2,"command":"ci","matched":1,"regressed":1,"improved":0,"unchanged":0,"unmatched":0,"geomeanPct":44.098920968212305,"effectiveTimingPct":10,"verdict":"fail","exitCode":1,"cached":1,"executed":0,"failed":0,"missingBaseline":0,"baseline":{"name":"main","path":".ostia/baselines/main.json"},"noiseFloorPct":2.09286}
152
152
  ```
153
153
 
154
- Within `protocolVersion: 1`, keys are only ever added, never renamed or removed.
154
+ Within `protocolVersion: 2`, keys are only ever added, never renamed or removed.
155
155
 
156
156
  Exit codes, the same for every command:
157
157
 
@@ -160,12 +160,12 @@ Exit codes, the same for every command:
160
160
  | `0` | Pass |
161
161
  | `1` | At least one workload regressed (`compare`/`ci`/`ab` only; `time`/`bench` never return 1) |
162
162
  | `2` | Harness error: a command exited non-zero or produced no samples, a suite failed, nothing matched, a bad flag, a missing/invalid config or baseline |
163
- | `130` | Cancelled with Ctrl-C (`time`/`bench`/`ab`; partial results are still exported) |
163
+ | `130` | Cancelled with Ctrl-C (`time`/`bench`/`ab`/`ci`; partial results are still exported) |
164
164
 
165
- On exit 2, stderr's last line is `{"event":"error","protocolVersion":1,"code":...,"message":...,"data"?:...}`
165
+ On exit 2, stderr's last line is `{"event":"error","protocolVersion":2,"code":...,"message":...,"data"?:...}`
166
166
  when stderr is not a TTY or a machine format (`minimal`/`json`/`jsonl`) was requested.
167
167
  A person at a terminal sees only the prose message. `code` is one of `invalid-flag`,
168
- `config-missing`, `config-invalid`, `baseline-missing`, `no-matches`, `spawn-failed`,
168
+ `config-missing`, `config-invalid`, `baseline-missing`, `no-matches`, `spawn-failed`, `suite-failed`,
169
169
  `command-failed`, `timeout`, `time-source-no-match`, `document-load-failed`,
170
170
  `no-cpu-evidence`, `internal`. Full reference: [docs/agent-protocol.md](docs/agent-protocol.md).
171
171
 
@@ -238,12 +238,26 @@ ostia ab bench/*.ts --threshold 5 --rounds 21
238
238
  - The same suite files as `ostia bench`, unchanged. The ref's tree is extracted once per
239
239
  commit under `node_modules/.cache/ostia/ab/`; relative imports resolve within each tree,
240
240
  package imports to the project's `node_modules`.
241
+ - Files git doesn't hold (generated or gitignored sources) aren't in the base tree.
242
+ `--base-setup "bun scripts/generate.ts"` (or `ab.setup` in the config) builds them once
243
+ per tree, with the project's `node_modules` linked in.
241
244
  - A task is flagged when its median ratio moves past `--threshold` (default 10%) in at
242
245
  least three quarters of rounds, and counts only if `--confirm` (default 2) fresh
243
- processes agree. The run also fails when the geometric mean of all ratios is more than
246
+ processes agree. Each suite runs once with each side first, since the side that goes
247
+ first can run faster. The run also fails when the geometric mean of all ratios is more than
244
248
  `--geomean-threshold` (default 1.5%) slower.
245
249
  - Tasks whose first call returns different values on each side are listed (not a
246
- failure). Exit: `0` pass, `1` regression, `2` nothing paired or a harness error.
250
+ failure). The base side runs the base's copy of each suite, so a task whose suite file
251
+ changed is marked `suite-changed`; if its output changed too, it reads `not comparable`
252
+ and stays out of the verdict. A task that throws reads `base threw`, `candidate threw` or
253
+ `both threw` and isn't timed; one that throws on the candidate side only fails the run.
254
+ Exit: `0` pass, `1` regression (time or memory), `2` nothing paired or a harness error.
255
+ - `--alloc` and `--peak-mem` compare memory too: retained heap per call, and how far the
256
+ first call raises RSS. A reading that grows past `--mem-threshold` (default 10%) and
257
+ past its noise floor fails the run.
258
+ - Progress goes to stderr on a terminal; `--progress` turns it on in logs and pipes too.
259
+ - The 5 most recently used base trees stay cached (`--keep-trees`); `ostia ab --clean`
260
+ removes them all.
247
261
 
248
262
  ### `ostia compare`
249
263
 
@@ -386,8 +400,8 @@ export default defineConfig({
386
400
  })
387
401
  ```
388
402
 
389
- A config that still uses the old `runs` field fails to load with a message naming
390
- `samples` (error code `config-invalid`). All fields: [docs/config.md](docs/config.md).
403
+ A config with a wrong-typed value, or the old `runs` field, fails to load with a message
404
+ naming the key (error code `config-invalid`). All fields: [docs/config.md](docs/config.md).
391
405
 
392
406
  ## Documentation
393
407
 
package/ab-runner.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{g,c,r,s,ge,i,a,te,p,ce,y,L,b,me,x,P}from"./chunk-cqy5fzae.js";var j=15,z=1e7,K=1e6,Q=3;async function J(n,S,T={}){let h=T.rounds??j,d=Bun.nanoseconds(),R=async(e)=>{let u=Bun.nanoseconds(),t=e(),o=p(t),m=o?await t:t;return{isAsync:o,result:m,ns:Math.max(1,Bun.nanoseconds()-u)}},w=await R(n),k=await R(S),_=Bun.deepEquals(w.result,k.result),I=(e,u)=>{let t=ce(u),o=Array(te);return(m)=>t(e,o,m)},B=I(n,w.isAsync),N=I(S,k.isAsync),M=w.ns,F=k.ns;for(let e=1;;e*=2){let u=await B(e),t=await N(e);if(M=Math.max(1,u/e),F=Math.max(1,t/e),u>=K&&t>=K)break}let l=Math.max(1,Math.round(z/Math.max(M,F)));for(let e=0;e<Q;e++)await B(l),await N(l);let O=[],W=[],v=[];for(let e=0;e<h;e++){let u,t;if(e%2===0)u=await B(l),t=await N(l);else t=await N(l),u=await B(l);u=Math.max(1,u),t=Math.max(1,t),O.push(u/l),W.push(t/l),v.push(t/u)}return{rounds:h,batch:l,baseSamples:O,candSamples:W,ratios:v,sameOutput:_,diagnosticWallNs:Bun.nanoseconds()-d}}function G(n,S){let T=Float64Array.from(n).sort(),h=r(T,0.5),d=r(T,0.25),R=r(T,0.75),w=S/100,k=h>1+w&&d>1?"regressed":h<1-w&&R<1?"improved":void 0;return{medianRatio:h,p25:d,p75:R,...k&&{flagged:k}}}function U(n){return`${b(n)}\x00${g(n.params??null)}`}async function H(n){return L(),await import(n),[...y()]}async function V(){let[n,S,T,h]=process.argv.slice(2);if(!n||S===void 0||!T||!h)return process.stderr.write(`ab runner: usage: ab-runner.ts <candSuite> <baseSuite|''> <outputPath> <optsJson>
4
- `),2;let d=JSON.parse(h);for(let t of d.preload??[])await import(t);let R=S?await H(S):[],w=await H(n);if(w.length===0)return process.stderr.write(`ab runner: ${n} registered no tasks (no task() calls found).
5
- `),2;let k;try{k=x(w,d.filter,n)}catch(t){return process.stderr.write(`ab runner: ${t.message}
6
- `),2}let _=d.workloadIds&&new Set(d.workloadIds),I=new Map(R.map((t)=>[U(t),t])),B=new Set(w.map(U)),N=[],M=[],F=[];for(let t of k){let o=P(n,t);if(_&&!_.has(o.id))continue;if(N.push(o),t.skipped)continue;let m=I.get(U(t));if(m&&!m.skipped)M.push({workload:o,base:m,cand:t});else F.push(o.id)}let l=[];if(!_)for(let t of me(R,d.filter)){if(t.skipped||B.has(U(t)))continue;let o=P(n,t);N.push(o),l.push(o.id)}let O=new Map,W=new Map;M.forEach(({cand:t},o)=>{if(t.groupName===void 0)return;if(!O.has(t.groupName))O.set(t.groupName,o);W.set(t.groupName,o)});let v=i({rounds:d.rounds,thresholdPct:d.thresholdPct}),e=[];for(let t=0;t<M.length;t++){let{workload:o,base:m,cand:A}=M[t],D=A.groupName,q=D!==void 0&&O.get(D)===t,Z=D!==void 0&&W.get(D)===t;if(q)await m.groupBefore?.(),await A.groupBefore?.();await m.opts?.before?.(),await A.opts?.before?.();let f=await J(m.fn,A.fn,{rounds:d.rounds}),C=G(f.ratios,d.thresholdPct),E=c(f.candSamples);if(f.batch>1)E.batch=f.batch;if(e.push(ge({workload:o,configFingerprint:v,timing:E,diagnosticWallNs:f.diagnosticWallNs,warnings:[],paired:{rounds:f.rounds,batch:f.batch,baseSamples:f.baseSamples,baseMedianNs:r(Float64Array.from(f.baseSamples).sort(),0.5),ratios:f.ratios,...C,verdict:C.flagged??"unchanged",sameOutput:f.sameOutput}})),await A.opts?.after?.(),await m.opts?.after?.(),Z)await A.groupAfter?.(),await m.groupAfter?.()}let u=s(N,e);return u.unmatched={baseOnly:l,candOnly:F},await a(u,T),0}V().then((n)=>process.exit(n));
3
+ import{c,M,t,Ye,i,u,p,E,ue,L,Ue,me,_e,f,en,N,le,D}from"./chunk-jzfv4c07.js";import{j,H,ee}from"./chunk-w9pvsd7y.js";import{b,oe,cn,se}from"./chunk-zf3y6chk.js";function F(r){return`${L(r)}\x00${M(r.params??null)}`}async function q(r){return ue(),await import(r),[...E()]}var V=5;function T(r){return(r instanceof Error?r.message:String(r)).split(`
4
+ `).slice(0,V).join(`
5
+ `)}async function A(r,y,l){if(process.stderr.write(`ab runner: ${y}
6
+ `),await Bun.write(`${r}.error`,y),l)await Bun.write(`${r}.side`,l);return 2}async function X(r,y,l,S){let s={base:r,cand:y},d=new Map,w=(a,k)=>{if(!d.has(a))d.set(a,k)},h=new Set;for(let a of S)try{await s[a].opts?.before?.(),h.add(a)}catch(k){w(a,k)}let P,o;if(h.size===2)try{P=await cn(r.fn,y.fn,{rounds:l,candFirst:S[0]==="cand"})}catch(a){if(a instanceof oe)w(a.side,a.cause);else o={err:a}}if(d.size===1){let a=d.has("base")?"cand":"base";if(h.has(a))try{await s[a].fn()}catch(k){w(a,k)}}for(let a of S.toReversed()){if(!h.has(a))continue;try{await s[a].opts?.after?.()}catch(k){w(a,k)}}if(o)throw o.err;let m=d.get("base"),O=d.get("cand");if(d.size===2)return{threw:{side:"both",message:`base: ${T(m)}
7
+ candidate: ${T(O)}`}};if(d.has("base"))return{threw:{side:"base",message:T(m)}};if(d.has("cand"))return{threw:{side:"cand",message:T(O)}};return{result:P}}async function Y(r,y,l,S,s){let{workloadId:d,side:w}=S,h=S.peakMem?await H():void 0;await import("./index.js");let P=j(),o;try{for(let m of s)await import(m);o=(await q(r)).find((m)=>D(y,m).id===d)}catch(m){return A(l,`the ${b(w)} side failed to load ${r}: ${T(m)}`,w)}if(!o)return A(l,`no task with workload id ${d} in ${r}.`);try{let m={};if(await f(o,"before"),await o.opts?.before?.(),h)m.peak=await ee(o.fn,P,h);if(S.alloc){await le(o.fn);let{memory:O,calls:a}=await le(o.fn);m.alloc={bytesPerOp:O.bytesPerOp,calls:a}}return await o.opts?.after?.(),await f(o,"after"),await Bun.write(l,JSON.stringify(m)),0}catch(m){return A(l,`${L(o)} threw on the ${b(w)} side while measuring memory: ${T(m)}`,w)}}async function Z(){let[r,y,l,S]=process.argv.slice(2);if(!r||y===void 0||!l||!S)return process.stderr.write(`ab runner: usage: ab-runner.ts <candSuite> <baseSuite|''> <outputPath> <optsJson>
8
+ `),2;let s=JSON.parse(S);if(s.memoryFor)return Y(s.memoryFor.side==="base"?y:r,r,l,s.memoryFor,s.preload??[]);for(let e of s.preload??[])await import(e);let d=s.candFirst?["cand","base"]:["base","cand"],w=[],h=[];for(let e of d){let n=e==="base"?y:r;if(!n)continue;try{let R=await q(n);if(e==="base")w=R;else h=R}catch(R){return A(l,`the ${b(e)} side failed to load ${n}: ${T(R)}`,e)}}if(h.length===0)return A(l,`${r} registered no tasks (no task() calls found).`,"cand");let P;try{P=N(h,s.filter,r,!s.workloadIds)}catch(e){return A(l,e.message)}let o=s.workloadIds&&new Set(s.workloadIds),m=new Map(w.map((e)=>[F(e),e])),O=new Set(h.map(F)),a=[],k=[],W=[];for(let e of P){let n=D(r,e);if(o&&!o.has(n.id))continue;if(a.push(n),e.skipped)continue;let R=m.get(F(e));if(R&&!R.skipped)k.push({workload:n,base:R,cand:e});else W.push(n.id)}let J=[];if(!o&&!h.some((e)=>e.only))for(let e of en(w,s.filter)){if(e.skipped||O.has(F(e)))continue;let n=D(r,e);a.push(n),J.push(n.id)}let C=_e(k.map((e)=>e.cand));if(s.planPath){let e={memory:k.map((n)=>({workloadId:n.workload.id,alloc:Ue(n.cand,s.alloc??!1),peakMem:me(n.cand,s.peakMem??!1)})).filter((n)=>n.alloc||n.peakMem)};await Bun.write(s.planPath,JSON.stringify(e))}let B=i({rounds:s.rounds,thresholdPct:s.thresholdPct}),x=[];for(let e=0;e<k.length;e++){let{workload:n,base:R,cand:I}=k[e],{enter:Q,leave:U}=C(e);if(s.progress)process.send?.({task:e+1,tasks:k.length,label:L(I)});let K={base:R,cand:I};for(let g of d)await f(K[g],"before",Q);let v=await X(R,I,s.rounds,d);if("threw"in v)x.push(Ye({workload:n,configFingerprint:B,threw:v.threw,diagnosticWallNs:0,warnings:[]}));else{let{result:g}=v,G=se(g.ratios,s.thresholdPct),_=c(g.candSamples);if(g.batch>1)_.batch=g.batch;x.push(Ye({workload:n,configFingerprint:B,timing:_,diagnosticWallNs:g.diagnosticWallNs,warnings:[],paired:{rounds:g.rounds,batch:g.batch,baseSamples:g.baseSamples,baseMedianNs:p(g.baseSamples),ratios:g.ratios,...G,verdict:G.flagged??"unchanged",sameOutput:g.sameOutput}}))}for(let g of d.toReversed())await f(K[g],"after",U)}let z=t(a,x);return z.unmatched={baseOnly:J,candOnly:W},await u(z,l),0}Z().then((r)=>process.exit(r));
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{nn,je,He,Ge,Ve,tn,Q,rn}from"./chunk-qwhvzj0v.js";export{He as AB_HELP,Q as BASELINE_HELP,je as BENCH_HELP,tn as CI_HELP,Ge as COMPARE_HELP,rn as MAIN_HELP,Ve as REPORT_HELP,nn as TIME_HELP};
@@ -0,0 +1,27 @@
1
+ // @bun
2
+ import{T,l,be,mn,we,K,B,n,c,w,o,ye,M,e,t,ae,ln,U,y,dn,i,q,a,ke,Pe,Y,xe,d,R,I,Te,Me,Re,_,k,s,Se,pn,Z,ve,r,S,$e,Ce,p,h,Xe,ce,Oe,v,Ae,Ie,De,Fe,Be,E,fn,N,X,We,Le,de}from"./chunk-jzfv4c07.js";import{b,O,un,se}from"./chunk-zf3y6chk.js";import{appendFileSync as yo,existsSync as Ln,lstatSync as ko,readdirSync as ar,realpathSync as At,renameSync as Po,statSync as Ro,symlinkSync as Mo,unlinkSync as xo,utimesSync as To}from"fs";import{mkdir as $o}from"fs/promises";import{relative as mr,sep as So}from"path";function Vr(u){let f=u>>>0;return()=>{f=f+1831565813|0;let D=Math.imul(f^f>>>15,1|f);return D=D+Math.imul(D^D>>>7,61|D)^D,((D^D>>>14)>>>0)/4294967296}}var st=2000,Hr=2000;function zt(u,f,D){if(u.length<=D)return u;let A=[...u];for(let W=0;W<D;W++){let L=W+Math.floor(f()*(A.length-W)),j=A[W];A[W]=A[L],A[L]=j}return A.slice(0,D)}class vt{sorted;rankOf;counts;n;constructor(u){let f=u.length,D=new Uint32Array(f);for(let A=0;A<f;A++)D[A]=A;D.sort((A,W)=>u[A]-u[W]),this.sorted=new Float64Array(f),this.rankOf=new Uint32Array(f);for(let A=0;A<f;A++)this.sorted[A]=u[D[A]],this.rankOf[D[A]]=A;this.n=f,this.counts=new Uint32Array(f)}resampleMedian(u){let{n:f,counts:D,sorted:A,rankOf:W}=this;D.fill(0);for(let me=0;me<f;me++)D[W[Math.floor(u()*f)]]++;let L=f+1>>1,j=f%2===0?L+1:L,oe=0,H=-1;for(let me=0;me<f;me++){if(oe+=D[me],H<0&&oe>=L)H=me;if(oe>=j)return H===me?A[me]:(A[H]+A[me])/2}return A[f-1]}}function Gr(u,f){let D=new Float64Array(u.length+f.length+1);return D.set(u),D[u.length]=Number.NaN,D.set(f,u.length+1),Bun.hash.crc32(D)}function Kt(u,f,D={}){if(u.length===0||f.length===0)throw RangeError("bootstrapMedianDiffCi: both sides need samples");let A=D.seed??Gr(u,f),W=Vr(A),L=D.iterations??Hr,j=u.length>st||f.length>st,oe=new vt(zt(u,W,st)),H=new vt(zt(f,W,st)),me=o(oe.sorted,0.5),Q=new Float64Array(L);for(let ie=0;ie<L;ie++){let ee=oe.resampleMedian(W),Ue=H.resampleMedian(W)-ee;Q[ie]=me===0?Ue===0?0:Ue*(1/0):Ue/me*100}return Q.sort(),{ci95:[o(Q,0.025),o(Q,0.975)],seed:A,data:{subsampled:j,iterations:L}}}function zr(u){let f=u<0?-1:1,D=Math.abs(u),A=0.254829592,W=-0.284496736,L=1.421413741,j=-1.453152027,oe=1.061405429,H=0.3275911,me=1/(1+0.3275911*D),Q=1-((((1.061405429*me+-1.453152027)*me+1.421413741)*me+-0.284496736)*me+0.254829592)*me*Math.exp(-D*D);return f*Q}function Kr(u){return 0.5*(1+zr(u/Math.SQRT2))}function Jt(u,f){let D=u.length,A=f.length,W=D+A;if(D===0||A===0)return{u:0,z:0,pValue:1};let L=w(u),j=w(f),oe=0,H=0,me=0,Q=0,ie=0;while(me<D||Q<A){let Ve=Q>=A||me<D&&L[me]<=j[Q]?L[me]:j[Q],Ee=0;while(me<D&&L[me]===Ve)Ee++,me++;let _e=0;while(Q<A&&j[Q]===Ve)_e++,Q++;let je=Ee+_e,He=ie+(je+1)/2;if(oe+=Ee*He,je>1)H+=je**3-je;ie+=je}let ee=oe-D*(D+1)/2,Ne=D*A/2,Ue=Math.sqrt(D*A*(W+1-H/(W*(W-1)))/12),ue=Ue===0?0:(ee-Ne)/Ue,le=Math.min(1,Math.max(0,2*(1-Kr(Math.abs(ue)))));return{u:ee,z:ue,pValue:le}}var P={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},It=5;function it(u,f){if(u===0)return f===0?0:1/0;return(f-u)/u*100}function Yt(u){let f=new Map;for(let D of u.measurements){let A=`${D.workloadId}\x00${D.phase}`;if(!f.has(A))f.set(A,D)}return(D,A)=>f.get(`${D}\x00${A}`)}function Jr(u,f,D){return{base:Yt(u),cand:Yt(f),candWorkloads:new Map(f.workloads.map((A)=>[A.id,A])),environmentMismatch:Yr(u,f),effectiveTimingPct:Math.max(D.timingPct,u.environment?.noise.floorPct??0,f.environment?.noise.floorPct??0)}}function Yr(u,f){let D=[["platform.os",u.platform.os,f.platform.os],["platform.arch",u.platform.arch,f.platform.arch],["bunVersion",u.bunVersion,f.bunVersion]];if(u.environment&&f.environment)D.push(["cpuModel",u.environment.cpuModel,f.environment.cpuModel],["cores",u.environment.cores,f.environment.cores]);let A=D.filter(([,W,L])=>W!==L).map(([W,L,j])=>({field:W,base:L,cand:j}));if(A.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${A.map((W)=>W.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:A}}}function qr(u){let f=[];for(let A of u){if(!A.timing)continue;let W=1+A.timing.medianDeltaPct/100;if(Number.isFinite(W)&&W>0)f.push(Math.log(W))}if(f.length===0)return null;let D=f.reduce((A,W)=>A+W,0)/f.length;return(Math.exp(D)-1)*100}function Je(u,f,D=P){let A=Jr(u,f,D);return{effectiveTimingPct:A.effectiveTimingPct,compare:(W)=>eo(A,W,D),unmatched(){let W=new Set(u.workloads.map((L)=>L.id));return{baseOnly:u.workloads.filter((L)=>!A.candWorkloads.has(L.id)),candOnly:f.workloads.filter((L)=>!W.has(L.id))}}}}function ze(u,f){let D=0,A=0,W=0;for(let L of u){if(!L.timing)continue;if(L.timing.verdict==="regressed")D++;else if(L.timing.verdict==="improved")A++;else W++}return{matched:u.length,regressed:D,improved:A,unchanged:W,geomeanPct:qr(u),effectiveTimingPct:f,verdict:u.some((L)=>L.verdict==="fail")?"fail":"pass"}}function pe(u,f,D=P){let A=Je(u,f,D),W=[];for(let L of f.workloads){let j=A.compare(L.id);if(j)W.push(j)}return{comparisons:W,unmatched:A.unmatched(),summary:ze(W,A.effectiveTimingPct)}}function Qr(u,f,D,A){let W=u.samples,L=f.samples,j=it(u.median,f.median),oe=it(u.mean,f.mean),H=(ie,ee)=>{if(ie>D)return"regressed";if(ee<-D)return"improved";return"unchanged"};if(W.length<It||L.length<It)return{timing:{medianDeltaPct:j,meanDeltaPct:oe,verdict:H(j,j)},warning:{code:"thin-comparison",message:`Only ${W.length} baseline / ${L.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${It}+ per side).`,data:{baseSamples:W.length,candSamples:L.length}}};let me=Kt(W,L,{iterations:A.bootstrapIterations}),Q=Jt(W,L);return{timing:{medianDeltaPct:j,meanDeltaPct:oe,ci95:me.ci95,pValue:Q.pValue,seed:me.seed,verdict:Q.pValue<A.alpha?H(me.ci95[0],me.ci95[1]):"unchanged"}}}function Xr(u,f,D){let A=(ie)=>new Map(ie.totals.map((ee)=>[ie.frames[ee.frameIx].key,ee.selfUs])),W=(ie)=>new Map(ie.frames.map((ee)=>[ee.key,ee.name])),L=A(u),j=A(f),oe=W(u),H=W(f),me=[...new Set([...L.keys(),...j.keys()])].map((ie)=>{let ee=L.get(ie)??0,Ne=j.get(ie)??0;return{frameKey:ie,name:H.get(ie)??oe.get(ie)??ie,baseSelfUs:ee,candSelfUs:Ne,deltaPct:it(ee,Ne)}}).sort((ie,ee)=>Math.abs(ee.deltaPct)-Math.abs(ie.deltaPct)),Q=me.some((ie)=>(ie.baseSelfUs>=D.minFrameSelfUs||ie.candSelfUs>=D.minFrameSelfUs)&&ie.deltaPct>D.frameSelfPct);return{frames:me,failed:Q}}function Zr(u,f,D){let A=new Map(u.typeCounts.map((j)=>[j.type,j])),W=new Map(f.typeCounts.map((j)=>[j.type,j])),L=[...new Set([...A.keys(),...W.keys()])].map((j)=>{let oe=A.get(j),H=W.get(j);return{type:j,baseCount:oe?.count??0,candCount:H?.count??0,baseBytes:oe?.retainedBytes,candBytes:H?.retainedBytes,deltaPct:it(oe?.count??0,H?.count??0)}}).sort((j,oe)=>Math.abs(oe.deltaPct)-Math.abs(j.deltaPct));return{heapTypes:L,failed:L.some((j)=>j.deltaPct>D.heapTypePct)}}function eo(u,f,D){let{effectiveTimingPct:A}=u,W=u.base(f,"timing"),L=u.cand(f,"timing"),j=u.base(f,"cpu"),oe=u.cand(f,"cpu"),H=u.base(f,"heap"),me=u.cand(f,"heap"),Q=u.candWorkloads.get(f),ie=W?.id??j?.id??H?.id,ee=L?.id??oe?.id??me?.id??Q?.id;if(!ie||!ee)return;let Ne=!1,Ue=[];if(u.environmentMismatch)Ue.push(u.environmentMismatch);let ue;if(W?.timing&&Q?.skipped&&!L?.timing)ue={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},Ue.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:f}});else if(W?.timing&&L?.timing){let Ee=Qr(W.timing,L.timing,A,D);if(ue=Ee.timing,Ee.warning)Ue.push(Ee.warning);if(ue.verdict==="regressed")Ne=!0}let le;if(j?.cpu&&oe?.cpu){let Ee=Xr(j.cpu,oe.cpu,D);le=Ee.frames,Ne||=Ee.failed}let Ve;if(H?.heap&&me?.heap){let Ee=Zr(H.heap,me.heap,D);Ve=Ee.heapTypes,Ne||=Ee.failed}return{id:e("cmp",ie,ee),baselineMeasurementId:ie,candidateMeasurementId:ee,timing:ue,...Ue.length>0&&{warnings:Ue},frames:le,heapTypes:Ve,thresholds:{...D,effectiveTimingPct:A},verdict:Ne?"fail":"pass"}}class m extends Error{}var qt=(u)=>typeof u==="object"&&u!==null&&!Array.isArray(u),tt=(u)=>(f)=>typeof f==="number"&&Number.isInteger(f)&&f>=u,Dn=(u)=>(f)=>typeof f==="number"&&Number.isFinite(f)&&f>=u,En=(u)=>typeof u==="string",no=(u)=>typeof u==="boolean",nt=(u)=>Array.isArray(u)&&u.every(En),Qt=(...u)=>(f)=>u.includes(f),rn=(u,f)=>({ok:u,expects:f}),On=rn(tt(1),"a positive integer"),to=rn(tt(0),"a non-negative integer"),Ot=rn(En,"a string"),Nn=rn(no,"a boolean"),at=rn(nt,"an array of strings"),ro={timingPct:rn(Dn(0),"a non-negative number"),frameSelfPct:rn(Dn(0),"a non-negative number"),heapTypePct:rn(Dn(0),"a non-negative number"),minFrameSelfUs:rn(Dn(0),"a non-negative number"),alpha:rn((u)=>Dn(0)(u)&&u<=1,"a number in [0, 1]"),bootstrapIterations:On},oo={suites:at,preload:at,bunFlags:at,jobs:rn((u)=>tt(1)(u)||u==="auto",'a positive integer or "auto"'),budgetMs:rn(Dn(0),"a non-negative number"),samples:On,minSamples:On,gc:Nn,cpu:Nn,cpuIntervalUs:On,alloc:Nn,peakMem:Nn,filter:Ot,isolate:Nn,outDir:Ot,timeoutMs:On},so={setup:rn((u)=>En(u)||nt(u),"a command string or an array of them"),keepTrees:On,alloc:Nn,peakMem:Nn,memThresholdPct:rn(Dn(0),"a non-negative number")},io=["inputs","prepare","timeSource","ignoreExitCodes"],ao={label:Ot,command:rn((u)=>nt(u)&&u.length>0,"a non-empty array of strings (argv, no shell)"),suites:rn((u)=>nt(u)&&u.length>0,"a non-empty array of glob strings"),inputs:at,prepare:rn((u)=>En(u)||nt(u)||typeof u==="function","a command string, an argv array, or (ostia.config.ts) a function"),timeSource:rn((u)=>qt(u)&&(En(u.pattern)||u.pattern instanceof RegExp)&&(u.group===void 0||tt(0)(u.group))&&(u.unit===void 0||Qt("ns","us","ms","s")(u.unit)),'an object { pattern, group?, unit? } with a regex source string (or RegExp) pattern, an integer group, and unit "ns" | "us" | "ms" | "s"'),timeoutMs:On,ignoreExitCodes:rn((u)=>Array.isArray(u)&&u.every((f)=>tt(0)(f)&&f<=255),"an array of exit codes 0-255")},mo={samples:On,budgetMs:rn(Dn(0),"a non-negative number"),minSamples:On,warmup:to,outDir:rn((u)=>En(u)&&u!=="","a non-empty string"),baselineDir:rn((u)=>En(u)&&u!=="","a non-empty string"),baseline:rn((u)=>En(u)&&u!=="","a non-empty string"),onMissingBaseline:rn(Qt("warn","fail"),'"warn" or "fail"'),noiseCheck:Nn},Dt=(u)=>typeof u==="function"?"a function":u instanceof RegExp?String(u):JSON.stringify(u)??String(u);function et(u,f,D,A,W){let L=D===""?"":`${D}.`;for(let[j,oe]of Object.entries(u)){if(oe===void 0)continue;let H=Object.hasOwn(f,j)?f[j]:void 0;if(!H){if(!j.startsWith("$"))W(`${A}: unknown key "${L}${j}" is ignored.`)}else if(!H.ok(oe))throw new m(`${A}: "${L}${j}" must be ${H.expects}, got ${Dt(oe)}.`)}}function mt(u,f,D){if(!qt(u))throw new m(`${D}: "${f}" must be an object, got ${Dt(u)}.`);return u}function uo(u,f,D,A){let W=`workloads[${f}]`,L=mt(u,W,D),j=(H)=>L[H]!==void 0;if(j("command")===j("suites"))throw new m(`${D}: "${W}" needs exactly one of "command" or "suites".`);if(et(L,ao,W,D,A),j("suites")){for(let H of io)if(j(H))A(`${D}: "${W}.${H}" applies to command workloads only; ignored on a suites workload.`)}let oe=L.timeSource?.pattern;if(typeof oe==="string")try{new RegExp(oe)}catch(H){throw new m(`${D}: "${W}.timeSource.pattern" is not a valid regex: ${H.message}`)}}function Xt(u,f,D){let{thresholds:A,workloads:W,bench:L,ab:j,...oe}=u;if(et(oe,mo,"",f,D),A!==void 0)et(mt(A,"thresholds",f),ro,"thresholds",f,D);if(L!==void 0)et(mt(L,"bench",f),oo,"bench",f,D);if(j!==void 0)et(mt(j,"ab",f),so,"ab",f,D);if(W!==void 0){if(!Array.isArray(W))throw new m(`${f}: "workloads" must be an array, got ${Dt(W)}.`);W.forEach((H,me)=>{uo(H,me,f,D)})}}var An="node_modules/.cache/ostia",co=".ostia/baselines",lo={warmup:3,outDir:An,baselineDir:co,baseline:"main",thresholds:P,workloads:[]},po={runs:"samples"},ne=["ostia.config.ts","ostia.config.json"],er=(u)=>console.warn(`ostia: ${u}`);function Zt(u){return Object.fromEntries(Object.entries(u).filter(([,f])=>f!==void 0))}function fo(u,f){if(typeof u!=="object"||u===null||Array.isArray(u))throw new m(`${f}: expected an object.`);for(let[A,W]of Object.entries(po))if(A in u)throw new m(`${f}: "${A}" was renamed to "${W}".`);Xt(u,f,er);let D=Zt(u);return{...lo,...D,thresholds:{...P,...D.thresholds&&Zt(D.thresholds)}}}async function go(u){let f=u.startsWith("/")?u:`${process.cwd()}/${u}`,D=Bun.file(f);if(!await D.exists())return;try{if(!u.endsWith(".ts"))return await D.json();let A=(await import(f)).default;if(A===void 0)throw Error('no default export; use "export default defineConfig({ ... })"');return A}catch(A){throw new m(`${u}: ${T(A)}`)}}async function nr(){let u=[];for(let f of ne)if(await Bun.file(f).exists())u.push(f);return u}async function on(u){let f=u;if(f===void 0){let A=await nr();if(A.length>1)er(`${A.join(" and ")} both exist; using ${A[0]} and ignoring the rest.`);f=A[0]}if(f===void 0)return;let D=await go(f);return D===void 0?void 0:fo(D,f)}function C(u,f){return`${u.baselineDir}/${f??u.baseline}.json`}async function Ke(){return(await nr())[0]}var ho=10,bo=3000,wo=3;function tr(u,f){return u!==void 0&&u!==0&&!f.has(u)}function Nt(u){if(_n("time",u),u.timeSource)be(u.timeSource);let f=u.warmup??wo,D=u.samples,A=u.minSamples??ho,W=D!==void 0?0:(u.budgetMs??bo)*1e6,L=u.timeSource!==void 0,j=u.ignoreExitCodes??[],oe=new Set(j),H=[],me=0,Q=0,ie=!1,ee;function Ne(){if(ie)return!0;if(D!==void 0)return Q>=D;return Q>=A&&me>=W}async function Ue(ue,le){if(u.prepare)await we(u.prepare,{phase:ue,index:le},{cwd:u.cwd,env:u.env,timeoutMs:u.timeoutMs,signal:u.signal});return mn(u)}return{async warmup(){for(let ue=0;ue<f;ue++){if(u.signal?.aborted)return;await Ue("warmup",ue)}},async step(){if(Ne()||u.signal?.aborted)return!1;let ue=await Ue("timing",Q);if(u.signal?.aborted)return!1;if(ue.timeSourceNoMatch)ee??=ue.timeSourceMissOutput;let le=ue.exitCode??void 0;if(H.push({i:Q,wallNs:ue.wallNs,exitCode:le,userNs:ue.userNs,systemNs:ue.systemNs,maxRssBytes:ue.maxRssBytes,...ue.reportedNs!==void 0&&{reportedNs:ue.reportedNs},...ue.timedOut&&{timedOut:!0},...ue.timeSourceNoMatch&&{timeSourceNoMatch:!0}}),me+=ue.wallNs,Q++,tr(le,oe))ie=!0;return!0},done:Ne,result(){let ue=H.filter((He)=>!He.timedOut&&!He.timeSourceNoMatch),le=ue.map((He)=>L?He.reportedNs:He.wallNs),Ve=[],Ee=H.filter((He)=>He.timedOut).length;if(Ee>0)Ve.push({code:"timeout",message:`${Ee} of ${H.length} trial(s) timed out after ${u.timeoutMs}ms.`,data:{timeoutMs:u.timeoutMs,trials:Ee}});let _e=H.filter((He)=>He.timeSourceNoMatch).length;if(_e>0&&u.timeSource){let{pattern:He}=u.timeSource;Ve.push({code:"time-source-no-match",message:`${_e} of ${H.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof He==="string"?He:He.source,trials:_e,...ee!==void 0&&{output:ee}}})}if(le.length===0)return{trials:H,warnings:Ve};let je=c(le);return Ve.push(...ye(je,ue.map((He)=>He.exitCode),L?"reported":"subprocess",j)),{trials:H,timing:je,warnings:Ve}}}}async function Et(u){await u.warmup();while(await u.step());}async function sn(u){let f=Nt(u);return await Et(f),f.result()}function fe(u,f=[]){if(!u.timing)return!0;let D=new Set(f);return u.trials.some((A)=>tr(A.exitCode,D))}function _n(u,f){for(let[D,A]of Object.entries({samples:f.samples,minSamples:f.minSamples}))if(A!==void 0&&(!Number.isFinite(A)||A<1))throw RangeError(`${u}: ${D} must be >= 1, got ${A}`);if(f.budgetMs!==void 0&&!Number.isFinite(f.budgetMs))throw RangeError(`${u}: budgetMs must be finite, got ${f.budgetMs}`);if(f.warmup!==void 0&&(!Number.isFinite(f.warmup)||f.warmup<0))throw RangeError(`${u}: warmup must be >= 0, got ${f.warmup}`);if(f.timeoutMs!==void 0&&(!Number.isFinite(f.timeoutMs)||f.timeoutMs<=0))throw RangeError(`${u}: timeoutMs must be > 0, got ${f.timeoutMs}`)}class F extends l{}class G extends Error{side;constructor(u,f){super(u);this.side=f}}class V extends Error{}var Co=new URL("./ab-runner.ts",import.meta.url).pathname,Fn={keepTrees:5,base:"HEAD",rounds:15,thresholdPct:10,geomeanThresholdPct:1.5,memThresholdPct:10,confirm:2},rr=1048576,vo=16384;function or(u,f){let D=Bun.spawnSync(["git",...u],{cwd:f,stdout:"pipe",stderr:"ignore"});return D.success?D.stdout.toString().trim():void 0}var Ft=`
3
+ ;globalThis.__ostia_ab_base__;
4
+ `,Io="**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}";async function Oo(u){for await(let f of new Bun.Glob(Io).scan({cwd:u,dot:!0,absolute:!0})){if(/\.d\.[mc]?ts$/.test(f)||!ko(f).isFile())continue;yo(f,Ft)}}function Do(u,f,D){if(D.length===0)return`${u}/${f}`;return`${u}/${f}-${e("ab-setup",D).slice(-8)}`}var No=20,Eo=65536,Ao=1000;function sr(u){let f=u.getReader(),D=new TextDecoder,A="",W=(async()=>{try{for(;;){let L=await f.read();if(L.done)return;A=(A+D.decode(L.value,{stream:!0})).slice(-Eo)}}catch{}})();return{done:W,stop:async()=>(await f.cancel().catch(()=>{}),await W,A)}}async function Fo(u,f,D,A){let W=Bun.spawn(["sh","-c",u],{cwd:f,env:D,stdout:"pipe",stderr:"pipe",stdin:"ignore",detached:!0}),L=()=>{try{process.kill(-W.pid,"SIGKILL")}catch{}},j=!1,oe=A.timeoutMs===void 0?void 0:setTimeout(()=>{j=!0,L()},A.timeoutMs);if(A.signal?.addEventListener("abort",L),A.signal?.aborted)L();let H=sr(W.stdout),me=sr(W.stderr),Q;try{let ie=await W.exited;L(),await Promise.race([Promise.all([H.done,me.done]),new Promise((Ue)=>{Q=setTimeout(Ue,Ao)})]);let[ee,Ne]=await Promise.all([H.stop(),me.stop()]);return{exitCode:ie,timedOut:j,output:Ne.trim()||ee.trim()}}finally{clearTimeout(oe),clearTimeout(Q),A.signal?.removeEventListener("abort",L)}}async function Wo(u,f,D){let A=At(D.toplevel),W=At(D.cwd),L=mr(A,W),j=L&&Ln(`${u}/${L}`)?`${u}/${L}`:u,oe=[];for(let[H,me]of[[`${A}/node_modules`,`${u}/node_modules`],[`${W}/node_modules`,`${j}/node_modules`]]){if(!Ln(H)||Ln(me))continue;Mo(H,me),oe.push(me)}try{for(let H of D.commands){D.onProgress?.({phase:"setup",command:H});let{exitCode:me,timedOut:Q,output:ie}=await Fo(H,j,{...process.env,OSTIA_AB_SHA:f,OSTIA_AB_CANDIDATE_DIR:W},D);if(D.signal?.aborted)return!1;if(me===0&&!Q)continue;let ee=ie.split(`
5
+ `).slice(-No).join(`
6
+ `),Ne=Q?`timed out after ${D.timeoutMs}ms`:`exited ${me}`;throw new V(`Base setup ${Ne}: ${H}${ee?`
7
+ ${ee}`:""}`)}return!0}finally{for(let H of oe)xo(H)}}async function Bo(u,f,D){if(Ln(f))return!0;let A=`${f}.tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`;await h(A),await $o(A,{recursive:!0});let W=Bun.spawn(["git","archive","--format=tar",u],{cwd:D.cwd,stdout:"pipe",stderr:"pipe"}),L=Bun.spawn(["tar","-x","-C",A],{stdin:W.stdout,stderr:"pipe"}),[j,oe]=await Promise.all([W.exited,L.exited]);if(j!==0||oe!==0){let H=await new Response(j!==0?W.stderr:L.stderr).text();throw await h(A),Error(`Could not extract ${u}: ${H.trim()}`)}try{if(!await Wo(A,u,D))return await h(A),!1}catch(H){throw await h(A),H}await Oo(A);try{Po(A,f)}catch{await h(A)}return!0}var Uo=3600000;function _o(u){try{return process.kill(u,0),!0}catch(f){return f.code==="EPERM"}}function Lo(u){let f=new Date;try{To(u,f,f)}catch{}}async function jo(u,f){if(!Ln(u))return 0;let D=Date.now(),A=[],W=[];for(let L of ar(u)){let j=`${u}/${L}`,oe=/\.tmp-(\d+)(?:-\w+)?$/.exec(L);if(oe){if(!_o(Number(oe[1])))A.push(j);continue}try{W.push({path:j,mtimeMs:Ro(j).mtimeMs})}catch{}}W.sort((L,j)=>j.mtimeMs-L.mtimeMs);for(let L of W.slice(f))if(D-L.mtimeMs>Uo)A.push(L.path);for(let L of A)await h(L);return A.length}async function an(u={}){let f=u.cwd??process.cwd(),D=`${S(f,u.outDir??An)}/ab`;if(!Ln(D))return 0;let A=ar(D).length;return await h(D),A}function Vo(u,f,D,A){let W=u.paired,L=[...D.base,...D.cand],j=(oe,H)=>{let me=un(p(D.base.map(oe)),p(D.cand.map(oe)),A,H);if(!O(W))me.verdict="unchanged";return me};if(f.alloc){let oe=Math.min(...L.map((H)=>H.alloc.calls));W.retained=j((H)=>H.alloc.bytesPerOp,vo/oe)}if(f.peakMem){let oe=L.map((Q)=>Q.peak),H=Oe(oe),me=Math.max(...oe.map((Q)=>Q.slackBytes));if(W.peak=j((Q)=>Q.peak.peakBytes,H?Math.max(rr,me):rr),H)u.warnings.push(H)}}function Ho(u,f,D){let A=new Map(f.measurements.map((L)=>[L.workloadId,L])),W=u.measurements.map((L)=>{let j=A.get(L.workloadId);if(!j)return L;if(L.threw&&j.threw&&L.threw.side!==j.threw.side)return{...L,threw:{side:"both",message:`${L.threw.message}
8
+ ${j.threw.message}`}};if(L.threw)return L;if(j.threw)return j;let oe=L.paired,H=j.paired;if(!oe||!H||!L.timing||!j.timing)return L;let me=[...oe.ratios,...H.ratios],Q=[...oe.baseSamples,...H.baseSamples],ie=se(me,D),ee=c([...L.timing.samples,...j.timing.samples]);if(oe.batch>1)ee.batch=oe.batch;return{...L,timing:ee,diagnosticWallNs:(L.diagnosticWallNs??0)+(j.diagnosticWallNs??0),paired:{rounds:oe.rounds+H.rounds,batch:oe.batch,baseSamples:Q,baseMedianNs:p(Q),ratios:me,...ie,verdict:ie.flagged??"unchanged",sameOutput:oe.sameOutput&&H.sameOutput}}});return{...u,measurements:W}}function Go(u){if(!u.repeats?.length)return u.medianRatio;return p([u.medianRatio,...u.repeats.map((f)=>f.medianRatio)])}function ir(u,f){let D=u.filter((le)=>!le.threw).map((le)=>le.paired).filter((le)=>le!==void 0),A=(le)=>D.filter((Ve)=>Ve.verdict===le).length,W=D.filter(O),L=W.reduce((le,Ve)=>le+Math.log(Go(Ve)),0),j=W.length>0?(Math.exp(L/W.length)-1)*100:null,oe=A("regressed"),H=A("improved"),me=u.filter((le)=>le.threw),Q=me.some((le)=>le.threw?.side==="cand"),{memThresholdPct:ie,...ee}=f,Ne=D.filter((le)=>le.retained||le.peak).map((le)=>[le.retained?.verdict,le.peak?.verdict]),Ue=Ne.filter((le)=>le.includes("regressed")),ue=Ne.length>0&&{thresholdPct:ie??Fn.memThresholdPct,regressed:Ue.length,improved:Ne.filter((le)=>le.includes("improved")&&!le.includes("regressed")).length};return{...ee,matched:D.length,regressed:oe,improved:H,unchanged:D.length-oe-H,unconfirmed:D.filter((le)=>le.confirmed===!1).length,outputDiffers:D.filter((le)=>!le.sameOutput).length,notComparable:D.length-W.length,threw:me.length,...ue&&{memory:ue},geomeanPct:j,verdict:oe>0||Q||Ue.length>0||j!==null&&j>f.geomeanThresholdPct?"fail":"pass"}}async function ge(u){let f=u.base??Fn.base,D=u.rounds??Fn.rounds,A=u.thresholdPct??Fn.thresholdPct,W=u.geomeanThresholdPct??Fn.geomeanThresholdPct,L=u.memThresholdPct??Fn.memThresholdPct,j=u.confirm??Fn.confirm,oe=u.keepTrees??Fn.keepTrees;if(!Number.isInteger(oe)||oe<1)throw RangeError(`ab: keepTrees must be an integer >= 1, got ${oe}`);if(!Number.isInteger(D)||D<3)throw RangeError(`ab: rounds must be an integer >= 3, got ${D}`);if(!Number.isInteger(j)||j<0)throw RangeError(`ab: confirm must be an integer >= 0, got ${j}`);for(let[Ye,Qe]of Object.entries({thresholdPct:A,geomeanThresholdPct:W,memThresholdPct:L}))if(!Number.isFinite(Qe)||Qe<0)throw RangeError(`ab: ${Ye} must be >= 0, got ${Qe}`);_n("ab",{timeoutMs:u.timeoutMs});let H=u.cwd??process.cwd(),me=S(H,u.outDir??An),Q=Ce(me,"ab"),ie=u.suites.map((Ye)=>S(H,Ye));for(let[Ye,Qe]of ie.entries())$e(u.suites[Ye],Qe);let ee=or(["rev-parse","--show-toplevel"],H);if(ee===void 0)throw new F(`${H} is not inside a git repository.`);let Ne=or(["rev-parse","--verify","--quiet",`${f}^{commit}`],H);if(Ne===void 0)throw new F(`"${f}" is not a commit in ${ee}.`);let Ue=typeof u.baseSetup==="string"?[u.baseSetup]:u.baseSetup??[],ue=Do(`${me}/ab`,Ne,Ue),le=await Bo(Ne,ue,{commands:Ue,toplevel:ee,cwd:H,timeoutMs:u.timeoutMs,signal:u.signal,onProgress:u.onProgress}),Ve={base:{ref:f,sha:Ne},rounds:D,thresholdPct:A,geomeanThresholdPct:W,memThresholdPct:L};if(!le){let Ye=t([],[]);return Ye.unmatched={baseOnly:[],candOnly:[]},Ye.ab=ir([],Ve),Ye}let{environment:Ee,noiseWarning:_e}=v(u.noiseCheck),je=ie.map((Ye,Qe)=>{let kn=mr(ee,At(Ye));if(kn===".."||kn.startsWith(`..${So}`))throw new l(`${u.suites[Qe]} is outside ${ee}.`);return Ln(`${ue}/${kn}`)?`${ue}/${kn}`:""}),He=await Promise.all(ie.map(async(Ye,Qe)=>{if(!je[Qe])return!1;let kn=await Bun.file(je[Qe]).text(),Rn=await Bun.file(Ye).text();return(kn.endsWith(Ft)?kn.slice(0,-Ft.length):kn)!==Rn})),Tn=(u.preload??[]).map((Ye)=>S(H,Ye)),Ge=u.bunFlags??[],en=u.onProgress,cn=0,Sn=async(Ye,Qe={},kn)=>{Lo(ue);let Rn=`${Q}/${e("ab-run",ie[Ye],cn++)}.json`,Bn={filter:u.filter,rounds:D,thresholdPct:A,preload:Tn,progress:en!==void 0&&!Qe.workloadIds&&!Qe.memoryFor,...Qe},Xn;try{Xn=await Ie(["bun",...Ge,Co,ie[Ye],je[Ye],Rn,JSON.stringify(Bn)],{cwd:H,label:"A/B suite",name:u.suites[Ye],timeoutMs:u.timeoutMs,signal:u.signal,env:kn,errorFile:`${Rn}.error`,...Bn.progress&&{ipc:(Un)=>en?.({phase:"measure",suite:Ye+1,suites:ie.length,file:u.suites[Ye],pass:Qe.candFirst?2:1,passes:2,...Un})}})}catch(Un){let Zn=Bun.file(`${Rn}.side`);if(!await Zn.exists())throw Un;throw new G(Un.message,await Zn.text())}return Xn?Rn:void 0},tn=async(Ye,Qe={})=>{let kn=await Sn(Ye,{...Qe,rounds:Math.ceil(D/2)});if(!kn)return;let Rn=await Sn(Ye,{...Qe,planPath:void 0,rounds:Math.floor(D/2),candFirst:!0});if(!Rn)return;return Ho(await a(kn),await a(Rn),A)};try{let Ye=[],Qe=[],kn=new Map,Rn=[],Bn=[],Xn=[];for(let Ze=0;Ze<ie.length;Ze++){let Pn=`${Q}/${e("ab-plan",ie[Ze])}.json`,Cn=await tn(Ze,{alloc:u.alloc,peakMem:u.peakMem,planPath:Pn});if(!Cn)break;let In=await Bun.file(Pn).json();for(let Mn of In.memory)Xn.push({...Mn,suite:Ze});Ye.push(...Cn.workloads),Qe.push(...Cn.measurements);for(let Mn of Cn.measurements){if(kn.set(Mn.workloadId,Ze),!He[Ze]||!Mn.paired)continue;if(Mn.paired.suiteChanged=!0,!O(Mn.paired))Mn.paired.verdict="unchanged";Mn.warnings.push({code:"suite-changed",message:O(Mn.paired)?"The suite file differs from the base's copy, so each side may run a different benchmark.":"The suite file differs from the base's copy and so does the output: each side likely ran a different benchmark. Left out of the verdict, geomean and memory verdict."})}Rn.push(...Cn.unmatched?.baseOnly??[]),Bn.push(...Cn.unmatched?.candOnly??[])}let Un=Qe.filter((Ze)=>Ze.paired?.flagged&&j>0&&O(Ze.paired)),Zn=new Map(Ye.map((Ze)=>[Ze.id,Ze.entry?.task??Ze.id])),_r=0;for(let Ze of Un){let Pn=Ze.paired,Cn=Pn.flagged;Pn.repeats=[];for(let In=0;In<j&&!u.signal?.aborted;In++){en?.({phase:"confirm",repeat:++_r,repeats:Un.length*j,label:Zn.get(Ze.workloadId)??Ze.workloadId});let jn=(await tn(kn.get(Ze.workloadId),{workloadIds:[Ze.workloadId]}))?.measurements[0];if(jn?.threw){Ze.threw={...jn.threw,repeat:In+1};break}let vn=jn?.paired;if(!vn)break;Pn.repeats.push({medianRatio:vn.medianRatio,ratioP25:vn.ratioP25,ratioP75:vn.ratioP75,...vn.flagged&&{flagged:vn.flagged}})}Pn.confirmed=!Ze.threw&&Pn.repeats.length===j&&Pn.repeats.every((In)=>In.flagged===Cn),Pn.verdict=Pn.confirmed?Cn:"unchanged"}let Vt=new Map(Qe.map((Ze)=>[Ze.workloadId,Ze])),Ht=Xn.filter(({workloadId:Ze})=>{let Pn=Vt.get(Ze);return Pn?.paired&&!Pn.threw}),Lr=Ht.length*ce*2,jr=0;for(let Ze of Ht){let{workloadId:Pn,suite:Cn,peakMem:In}=Ze,Mn={base:[],cand:[]};for(let jn=0;jn<ce&&!u.signal?.aborted;jn++)for(let vn of["base","cand"]){if(u.signal?.aborted)break;en?.({phase:"memory",run:++jr,runs:Lr,side:vn,label:Zn.get(Pn)??Pn});let Gt=await Sn(Cn,{memoryFor:{...Ze,side:vn}},In?{OSTIA_PEAK_MEM:"1"}:void 0);if(Gt)Mn[vn].push(await Bun.file(Gt).json())}if(Mn.base.length===0||Mn.cand.length===0)continue;Vo(Vt.get(Pn),Ze,Mn,L)}Ae(Qe,_e,u.signal?.aborted?"Run was cancelled before it finished; this document holds whatever suites had already completed.":void 0);let Ct=t(Ye,Qe,Ee);return Ct.unmatched={baseOnly:Rn,candOnly:Bn},Ct.ab=ir(Qe,{...Ve,newSuites:u.suites.filter((Ze,Pn)=>!je[Pn])}),await jo(`${me}/ab`,oe),Ct}finally{await h(Q)}}import{resolve as zo}from"path";var Ko=["node_modules",".git"],ur=/[*?[\]{}!]/;function Jo(u,f){let D=u.split("/"),A=D.findIndex((L)=>ur.test(L)),W=A<0?D.length:A;return[D.slice(W),f.split("/").slice(W)]}async function J(u,f){let D=new Set;for(let A of u){if(!ur.test(A)){if(await Bun.file(zo(f,A)).exists())D.add(A);continue}for await(let W of new Bun.Glob(A).scan({cwd:f,dot:!0})){let[L,j]=Jo(A,W);if(!j.some((H)=>Ko.includes(H)&&!L.includes(H)))D.add(W)}}return[...D].sort()}var Yo=new URL("./runner.ts",import.meta.url).pathname;function qe(){return Math.max(1,navigator.hardwareConcurrency||1)}async function te(u,f,D=process.cwd()){return{suites:u.suites.length>0?u.suites:f?.suites?await J(f.suites,D):[],budgetMs:u.budgetMs??f?.budgetMs,samples:u.samples??f?.samples,minSamples:u.minSamples??f?.minSamples,jobs:u.jobs??(f?.jobs==="auto"?qe():f?.jobs),gc:u.gc??f?.gc??!1,cpu:u.cpu??f?.cpu??!1,cpuIntervalUs:u.cpuIntervalUs??f?.cpuIntervalUs,alloc:u.alloc??f?.alloc??!1,peakMem:u.peakMem??f?.peakMem??!1,filter:u.filter??f?.filter,isolate:u.isolate??f?.isolate??!1,preload:u.preload.length>0?u.preload:f?.preload??[],bunFlags:u.bunFlags.length>0?u.bunFlags:f?.bunFlags??[],outDir:u.outDir??f?.outDir,noiseCheck:u.noiseCheck,timeoutMs:u.timeoutMs??f?.timeoutMs,cwd:D}}function qo(u,f){if(!f?.length)return[];let D=p(f.map((W)=>W.peakBytes)),A=Oe(f);return[y({workload:u,phase:"memstats",configFingerprint:i({peakMem:!0}),diagnosticWallNs:p(f.map((W)=>W.wallNs)),memory:{origin:"resourceUsage",kind:"peak",peakBytes:D},warnings:A?[A]:[],artifacts:[]})]}async function z(u){_n("bench",u);let f=u.jobs??1;if(!Number.isInteger(f)||f<1)throw RangeError(`bench: jobs must be an integer >= 1, got ${f}`);let D=u.cwd??process.cwd(),A=Ce(S(D,u.outDir??An),"bench"),W=u.suites.map((ee)=>S(D,ee));for(let[ee,Ne]of W.entries())$e(u.suites[ee],Ne);let L=(u.preload??[]).map((ee)=>S(D,ee)),j=u.bunFlags??[],{environment:oe,noiseWarning:H}=v(u.noiseCheck),me={budgetMs:u.budgetMs,samples:u.samples,minSamples:u.minSamples,gc:u.gc,cpu:u.cpu,cpuIntervalUs:u.cpuIntervalUs,alloc:u.alloc,peakMem:u.peakMem,noiseCheck:!1},Q=(ee,Ne,...Ue)=>`${A}/${e(ee,W[Ne],...Ue)}.json`,ie=async(ee,Ne)=>{let Ue=new Set,ue=0,le,Ve=async()=>{while(le===void 0&&!u.signal?.aborted&&ue<ee.length){let Ee=ee[ue++];try{if(!await Ie(["bun",...j,Yo,W[Ee.suiteIndex],Ee.outPath,JSON.stringify(Ee.runnerOpts)],{label:"Bench suite",name:u.suites[Ee.suiteIndex],cwd:D,env:Ne,timeoutMs:u.timeoutMs,signal:u.signal,inFlight:Ue}))return}catch(_e){le??=_e instanceof Error?_e:Error(String(_e));for(let je of Ue)je.kill()}}};if(await Promise.all(Array.from({length:Math.min(f,ee.length)},Ve)),le)throw le};try{let ee=W.map((Ge,en)=>({planPath:Q("bench-plan",en),outPath:Q("bench-primary",en)}));await ie(ee.map((Ge,en)=>({suiteIndex:en,outPath:Ge.outPath,runnerOpts:{...me,filter:u.filter,isolate:u.isolate,preload:L,planPath:Ge.planPath}})));let Ne=await Promise.all(ee.map(async(Ge)=>await Bun.file(Ge.planPath).exists()?(await Bun.file(Ge.planPath).json()).tasks:[])),Ue=await Promise.all(ee.map((Ge)=>Xe(Ge.outPath))),ue=Ne.flatMap((Ge,en)=>Ge.filter((cn)=>cn.isolate).map((cn)=>({task:cn,suiteIndex:en}))),le=ue.map((Ge,en)=>Q("bench-item",Ge.suiteIndex,en));await ie(ue.map((Ge,en)=>({suiteIndex:Ge.suiteIndex,outPath:le[en],runnerOpts:{...me,workloadIds:[Ge.task.workloadId],preload:L,markIsolated:!0}})));let Ve=new Map;await Promise.all(ue.map(async(Ge,en)=>{let cn=await Xe(le[en]);if(cn)Ve.set(Ge.task,cn)}));let Ee=Ne.flatMap((Ge,en)=>Ge.filter((cn)=>cn.peakMem).flatMap((cn)=>Array.from({length:ce},()=>({workloadId:cn.workloadId,suiteIndex:en})))),_e=Ee.map((Ge,en)=>Q("bench-peak",Ge.suiteIndex,en));await ie(Ee.map((Ge,en)=>({suiteIndex:Ge.suiteIndex,outPath:_e[en],runnerOpts:{filter:u.filter,preload:L,peakMemFor:Ge.workloadId}})),{OSTIA_PEAK_MEM:"1"});let je=new Map;for(let Ge=0;Ge<Ee.length;Ge++){let en=Bun.file(_e[Ge]);if(!await en.exists())continue;let cn=Ee[Ge].workloadId,Sn=je.get(cn)??[];Sn.push(await en.json()),je.set(cn,Sn)}let He=[],Tn=[];return Ne.forEach((Ge,en)=>{let cn=Ue[en];if(!cn)return;let Sn=Map.groupBy(cn.measurements,(Ye)=>Ye.workloadId),tn=0;for(let Ye of Ge){let Qe,kn;if(Ye.isolate){let Rn=Ve.get(Ye);if(!Rn)continue;Qe=Rn.workloads[0],kn=Rn.measurements.filter((Bn)=>Bn.workloadId===Qe.id)}else Qe=cn.workloads[tn++],kn=Sn.get(Qe.id)??[];He.push(Qe),Tn.push(...kn,...qo(Qe,je.get(Qe.id)))}}),Ae(Tn,H,u.signal?.aborted?"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed.":void 0),t(He,Tn,oe)}finally{await h(A)}}function gn(u,f,D=8){if(D<=1)throw RangeError(`range: multiplier must be > 1, got ${D}`);if(u<=0)throw RangeError(`range: start must be > 0, got ${u}`);let A=[];for(let W=u;W<=f;W*=D)A.push(W);if(!A.includes(f))A.push(f);return A}function cr(u){return u.cpu!==void 0}function Wt(u,f){if(f){let D=u.measurements.find((A)=>A.id===f);return D&&cr(D)?[D]:[]}return u.measurements.filter((D)=>D.phase==="cpu"&&cr(D))}function Vn(u,f,D,A){return{files:Wt(u,f.measurementId).map((W)=>({path:`${W.id}.${D}`,content:A(W)}))}}function Hn(u){let f=u.nodes,D=f.length,A=Qo(u),W=new Int32Array(D).fill(-1);for(let H=0;H<D;H++)for(let me of f[H].children){let Q=A(me);if(Q!==-1)W[Q]=H}let L=[];for(let H=0;H<D;H++)if(W[H]===-1)L.push(H);let j=[],oe=[];for(let H=L.length-1;H>=0;H--)oe.push(L[H]);while(oe.length>0){let H=oe.pop();j.push(H);for(let me of f[H].children){let Q=A(me);if(Q!==-1&&W[Q]===H)oe.push(Q)}}return{count:D,indexOf:A,parentIx:W,roots:L,order:j}}function Qo(u){let f=u.nodes,D=f.length,A=1/0,W=-1/0,L=!0;for(let oe=0;oe<D;oe++){let H=f[oe].id;if(!Number.isInteger(H)){L=!1;break}if(H<A)A=H;if(H>W)W=H}if(L&&D>0&&W-A<D*4+64){let oe=W-A+1,H=new Int32Array(oe).fill(-1);for(let me=0;me<D;me++)H[f[me].id-A]=me;return(me)=>{let Q=me-A;return Q>=0&&Q<oe?H[Q]:-1}}let j=new Map;for(let oe=0;oe<D;oe++)j.set(f[oe].id,oe);return(oe)=>j.get(oe)??-1}function dr(u,f){let{count:D,indexOf:A,parentIx:W,order:L}=f,j=new Float64Array(D),oe=new Float64Array(D),H=u.samples?.nodeIds??[],me=u.samples?.timeDeltasUs??[];for(let ie=0;ie<H.length;ie++){let ee=A(H[ie]);if(ee===-1)continue;j[ee]+=me[ie]??0,oe[ee]+=1}let Q=new Float64Array(D);for(let ie=L.length-1;ie>=0;ie--){let ee=L[ie];Q[ee]+=j[ee];let Ne=W[ee];if(Ne>=0)Q[Ne]+=Q[ee]}return{selfUs:j,totalUs:Q,samples:oe}}var lr={name:"collapsed",async render(u,f={}){return Vn(u,f,"collapsed.txt",({cpu:D})=>{let{nodes:A,frames:W}=D,L=Hn(D),j=Array(L.count);for(let Q of L.order){let ie=I(W[A[Q].frameIx]),ee=L.parentIx[Q];j[Q]=ee===-1?ie:`${j[ee]};${ie}`}let oe=new Float64Array(L.count),H=[];for(let Q of D.samples?.nodeIds??[]){let ie=L.indexOf(Q);if(ie===-1)continue;if(oe[ie]++===0)H.push(ie)}let me=H.map((Q)=>`${j[Q]} ${oe[Q]}`);return me.length>0?`${me.join(`
9
+ `)}
10
+ `:""})}};var pr={name:"cpuprofile",async render(u,f={}){let D=[],A=[];for(let W of Wt(u,f.measurementId)){let{origin:L}=W.cpu;if(L!=="cpu-prof"&&L!=="inspector"){A.push(`${W.id} (origin ${L} has no .cpuprofile artifact to pass through)`);continue}let j=W.artifacts.find((H)=>H.kind==="cpuprofile");if(!j){A.push(`${W.id} (no cpuprofile artifact recorded on this run)`);continue}let oe=Bun.file(j.path);if(!await oe.exists()){A.push(`${W.id} (artifact missing on disk: ${j.path})`);continue}D.push({path:`${W.id}.cpuprofile`,content:await oe.text()})}if(D.length===0&&A.length>0)return{text:`No .cpuprofile artifacts available:
11
+ ${A.map((W)=>` - ${W}`).join(`
12
+ `)}
13
+ `};return{files:D}}};var fr={name:"json",async render(u){return{text:q(u)}}};var gr={name:"jsonl",async render(u){let{measurements:f,...D}=u;return{text:`${[M({kind:"document",...D}),...f.map((W)=>M({kind:"measurement",...W}))].join(`
14
+ `)}
15
+ `}}};var hr=0.5;function $n(u){return new Map(u.workloads.map((f)=>[f.id,f]))}function Gn(u){return u.measurements.filter((f)=>f.phase==="timing"&&f.timing!==void 0)}function zn(u){return u.measurements.filter((f)=>f.phase==="timing"&&f.timing===void 0)}function Kn(u,f){let D=new Set(f.map((A)=>A.workloadId));return u.workloads.filter((A)=>A.skipped&&!D.has(A.id))}function ut(u){for(let f of u.comparisons??[]){let D=f.warnings?.find((A)=>A.code==="environment-mismatch");if(D)return D}return}function ct(u){return(u.warnings??[]).filter((f)=>f.code!=="environment-mismatch")}function dt(u){let f=$n(u),D=new Map(u.measurements.map((A)=>[A.id,A]));return(A)=>{let W=D.get(A.candidateMeasurementId),L=W?.workloadId??A.candidateMeasurementId;return{run:W,workloadId:L,workload:f.get(L)}}}function lt(u,f){return(u.frames??[]).slice(0,f).filter((D)=>Math.abs(D.deltaPct)>=hr)}function pt(u,f){return(u.heapTypes??[]).slice(0,f).filter((D)=>Math.abs(D.deltaPct)>=hr)}function Jn(u){let f=new Map;for(let D of u.measurements){if(D.phase!=="memstats"||!D.memory)continue;let A=f.get(D.workloadId)??{warnings:[]};if(D.memory.bytesPerOp!==void 0)A.retained=D.memory.bytesPerOp;if(D.memory.peakBytes!==void 0)A.peak=D.memory.peakBytes;A.warnings.push(...D.warnings),f.set(D.workloadId,A)}return f}function rt(u,f){let D=f.get(u.workloadId)?.warnings;return D?.length?[...u.warnings,...D]:u.warnings}function ft(u){return[{header:"Retained/op",read:(D)=>D.retained},{header:"Peak mem",read:(D)=>D.peak}].filter((D)=>{for(let A of u.values())if(D.read(A)!==void 0)return!0;return!1}).map((D)=>({header:D.header,cell:(A)=>{let W=u.get(A),L=W&&D.read(W);return L===void 0?void 0:R(L)}}))}function br(u){return u.phase==="paired"&&u.threw!==void 0}function wr(u){return u.phase==="paired"&&u.threw===void 0&&u.timing!==void 0&&u.paired!==void 0}function Yn(u){return u.measurements.filter(wr)}function ht(u){return u.measurements.filter(br)}function yr(u){let f=[];for(let D of u.measurements)if(br(D))f.push({kind:"threw",run:D});else if(wr(D))f.push({kind:"timed",run:D});return f}function bt(u){return`${b(u.side)} threw${u.repeat?` (repeat ${u.repeat})`:""}`}function gt(u){return r((u-1)*100)}function Xo(u){if(!O(u))return"not comparable";if(!u.flagged)return"";let f=u.repeats?.length?` (repeats: ${u.repeats.map((D)=>gt(D.medianRatio)).join(", ")})`:"";if(u.confirmed===void 0)return`${u.flagged}${f}`;return`${u.confirmed?`${u.flagged}, confirmed`:`${u.flagged}? unconfirmed`}${f}`}function wt(u){if(!u.newSuites?.length)return;return`New suite${u.newSuites.length>1?"s":""}, not at ${u.base.ref}: ${u.newSuites.join(", ")}`}function yt(u){let f=u.paired,D=B(Math.min(f.baseMedianNs,u.timing.median));return{base:n(f.baseMedianNs,D),candidate:n(u.timing.median,D),change:gt(f.medianRatio),spread:`${gt(f.ratioP25)}\u2026${gt(f.ratioP75)}`,verdict:Xo(f)}}function kt(u){return Yn(u).flatMap((f)=>{let D=[],{retained:A,peak:W}=f.paired;if(A)D.push({run:f,reading:"retained/op",change:A});if(W)D.push({run:f,reading:"peak",change:W});return D})}function Zo(u){let f=Math.round(u.baseBytes),D=Math.round(u.candBytes)-f;if(D===0)return"0B";let A=`${D>0?"+":"-"}${R(Math.abs(D))}`;if(f===0||u.baseBytes<u.floorBytes)return A;return`${A} (${r(D/f*100)})`}function Pt({reading:u,change:f}){return{reading:u,base:R(f.baseBytes),candidate:R(f.candBytes),change:Zo(f),verdict:f.verdict==="unchanged"?"":f.verdict}}function Rt(u){let f=u.memory?` \xB7 memory threshold ${u.memory.thresholdPct}%`:"";return`working tree vs ${u.base.ref} (${u.base.sha.slice(0,7)}) \xB7 ${u.rounds} rounds \xB7 threshold ${u.thresholdPct}% \xB7 geomean threshold ${u.geomeanThresholdPct}%${f}`}function Mt(u){let f=u.geomeanPct===null?"Geomean -":`Geomean ${r(u.geomeanPct)} (threshold ${u.geomeanThresholdPct}%)`,D=[u.unconfirmed>0&&`${u.unconfirmed} unconfirmed`,u.notComparable>0&&`${u.notComparable} not comparable`,u.threw>0&&`${u.threw} threw`].filter(Boolean),A=D.length>0?` (${D.join(", ")})`:"",W=u.memory?` \xB7 memory: ${u.memory.regressed} regressed, ${u.memory.improved} improved`:"";return`${f} \xB7 ${u.regressed} regressed, ${u.improved} improved, ${u.unchanged} unchanged of ${u.matched}${A}${W} \xB7 ${u.verdict}`}function xt(u){let f=$n(u),D=(A)=>s(f.get(A),A);return{outputDiffers:Yn(u).filter((A)=>!A.paired.sameOutput).map((A)=>D(A.workloadId)),baseOnly:(u.unmatched?.baseOnly??[]).map(D),candOnly:(u.unmatched?.candOnly??[]).map(D)}}function Wn(u){if(!u?.entry)return;if(u.entry.group!==void 0)return u.entry.group;let f=u.entry.task,D=f.lastIndexOf("/");return D===-1?void 0:f.slice(0,D)}function kr(u,f){return f!==void 0&&u.startsWith(`${f}/`)?u.slice(f.length+1):u}function qn(u){if(u.length<2)return;let f=Math.min(...u.map((W)=>W.run.timing.median)),D=new Map;for(let W of u){let L=Wn(W.workload);if(L===void 0)continue;let j=D.get(L);if(j)j.push(W);else D.set(L,[W])}let A=new Map;for(let W of u){let L=Wn(W.workload),j=f;if(L!==void 0){let oe=D.get(L),H=oe.find((me)=>me.workload?.baseline);j=H?H.run.timing.median:Math.min(...oe.map((me)=>me.run.timing.median))}A.set(W,W.run.timing.median/j)}return A}var Pr=10,Rr=10,xn=(u)=>pn(String(u));function Qn(u,f){return[`| ${u.join(" | ")} |`,`|${u.map(()=>"---").join("|")}|`,...f.map((D)=>`| ${D.join(" | ")} |`)]}function es(u){if(!u?.params)return"";return` (${Object.entries(u.params).map(([D,A])=>`${D}=${A}`).join(", ")})`}function ot(u,f){return xn(s(u,f)+es(u))}function Bt(u){return`${u.message} (\`${u.code}\`)`}function Mr(u,f){return f.map((D)=>`- **${u}**: ${Bt(D)}`)}function ns(u){let f;for(let D of u){let A=D?.params?Object.keys(D.params):void 0;if(A?.length!==2)return;if(f===void 0)f=A;else if(A.some((W,L)=>W!==f[L]))return}return f}var xr={name:"markdown",async render(u){let f=$n(u),D=u.git?` \xB7 ${_(u.git)}`:"",A=ut(u);return{text:["# Profile Report","",`Bun ${u.bunVersion} \xB7 ostia ${u.toolVersion} \xB7 ${u.platform.os}/${u.platform.arch} \xB7 ${u.createdAt}${D}`,"",...u.environment?[Re(u.environment),""]:[],...A?[`> \u26A0 ${A.message}`,""]:[],...u.ab?ts(u,u.ab,f):[],...rs(u,f),...os(u,f),...as(u)].join(`
16
+ `)}}};function ts(u,f,D){let A=Yn(u),W=["## A/B","",Rt(f),""];if(A.length>0)W.push(...Qn(["Task","Base","Candidate","Change","p25\u2026p75","Verdict"],A.map((Q)=>{let ie=yt(Q);return[ot(D.get(Q.workloadId),Q.workloadId),ie.base,ie.candidate,ie.change,ie.spread,ie.verdict?`**${xn(ie.verdict)}**`:""]})),"");let L=kt(u);if(L.length>0)W.push(...Qn(["Task","Memory","Base","Candidate","Change","Verdict"],L.map((Q)=>{let ie=Pt(Q);return[ot(D.get(Q.run.workloadId),Q.run.workloadId),ie.reading,ie.base,ie.candidate,ie.change,ie.verdict?`**${ie.verdict}**`:""]})),"");let j=ht(u);if(j.length>0){W.push(`Threw (${j.length}):`,"");for(let Q of j){let ie=Q.threw.message.split(`
17
+ `)[0].replaceAll("`","'");W.push(`- **${ot(D.get(Q.workloadId),Q.workloadId)}**: ${bt(Q.threw)}: \`${ie}\``)}W.push("")}let oe=xt(u),H=(Q,ie)=>ie.length>0?`${Q}: ${ie.map(xn).join(", ")}`:void 0;for(let Q of[H("Output differs from the base",oe.outputDiffers),wt(f),H("Base only",oe.baseOnly),H("Candidate only",oe.candOnly)])if(Q)W.push(Q,"");let me=A.flatMap((Q)=>Mr(s(D.get(Q.workloadId),Q.workloadId),Q.warnings));if(me.length>0)W.push(...me,"");return W.push(`**${Mt(f)}**`,""),W}function rs(u,f){let D=Gn(u),A=zn(u),W=Jn(u),L=[...Kn(u,D).map((ee)=>({id:ee.id,workload:ee,status:"skipped"})),...A.map((ee)=>({id:ee.workloadId,workload:f.get(ee.workloadId),status:"no samples"}))];if(D.length===0&&L.length===0)return[];let j=["## Timing",""],oe=D.map((ee)=>({run:ee,workload:f.get(ee.workloadId)})),H=new Map,me=[];for(let ee of oe){let Ne=Wn(ee.workload);if(Ne===void 0)me.push(ee);else if(H.has(Ne))H.get(Ne).push(ee);else H.set(Ne,[ee])}let Q=[];for(let[ee,Ne]of H){let Ue=ns(Ne.map((ue)=>ue.workload));if(Ue)Q.push({group:ee,keys:Ue,rows:Ne});else me.push(...Ne)}if(me.length>0||L.length>0){let ee=qn(oe),Ne=[],Ue=new Map(me.map((ue)=>[ue,Z(ue.run)]));if([...Ue.values()].some(Boolean))Ne.push({header:"User/Sys",cell:(ue)=>{let le=Ue.get(ue);return le?ve(le):"-"}});for(let ue of ft(W))Ne.push({header:ue.header,cell:(le)=>ue.cell(le.run.workloadId)??"-"});if(ee)Ne.push({header:"Relative",cell:(ue)=>Se(ee.get(ue),!!ue.workload?.baseline)});j.push(...Qn(["Task","Median","Spread (p75\u2026p99)","Mean \xB1 SD","Range","MAD",...Ne.map((ue)=>ue.header)],[...me.map((ue)=>{let le=ue.run.timing,Ve=B(le.median);return[ot(ue.workload,ue.run.workloadId),n(le.median,Ve),Y(le.p75,le.p99,Ve),`${n(le.mean,Ve)} \xB1 ${n(le.stddev,Ve)}`,Y(le.min,le.max,Ve),n(le.mad,Ve),...Ne.map((Ee)=>Ee.cell(ue))]}),...L.map(({id:ue,workload:le,status:Ve})=>[ot(le,ue),`- ${Ve}`,"-","-","-","-",...Ne.map(()=>"-")])]),"")}for(let{group:ee,keys:[Ne,Ue],rows:ue}of Q){let le=[],Ve=[],Ee=new Map;for(let{run:_e,workload:je}of ue){let He=je.params[Ne],Tn=je.params[Ue];if(!le.includes(He))le.push(He);if(!Ve.includes(Tn))Ve.push(Tn);Ee.set(`${He} ${Tn}`,_e.timing.median)}j.push(`### ${xn(ee)} (${xn(Ne)} \xD7 ${xn(Ue)})`,"",...Qn([`${xn(Ne)} \\ ${xn(Ue)}`,...Ve.map(xn)],le.map((_e)=>[xn(_e),...Ve.map((je)=>{let He=Ee.get(`${_e} ${je}`);return He===void 0?"-":n(He)})])),"")}let ie=[...D,...A].flatMap((ee)=>Mr(s(f.get(ee.workloadId),ee.workloadId),rt(ee,W)));if(ie.length>0)j.push("### Warnings","",...ie,"");return j}function os(u,f){let D=[];for(let A of u.measurements){if(A.phase!=="cpu"&&A.phase!=="heap")continue;let W=s(f.get(A.workloadId),A.workloadId);D.push(A.phase==="cpu"?`## CPU capture - ${W}`:`## Heap snapshot - ${W}`,"",`instrumented, diagnostic wall ${xe(A.diagnosticWallNs??0)}ms`,"",...A.phase==="cpu"?ss(A):is(A));let L=[...A.artifacts.map((j)=>`- artifact: \`${j.path}\``),...A.warnings.map((j)=>`- ! ${Bt(j)}`)];if(L.length>0)D.push(...L,"")}return D}function ss(u){let{cpu:f}=u;if(!f)return[];let D=[`origin: \`${f.origin}\`, interval: ${f.samplingIntervalUs}\xB5s, samples: ${X(f)}`,"",...Qn(["Self %","Self (ms)","Total (ms)","Frame"],Te(f,Pr).map((A)=>[`${A.pct}%`,d(A.selfUs),d(A.totalUs),xn(I(A.frame))])),""];if(u.jit){let A=u.jit.tiers;D.push(`JIT tiers: LLInt ${A.llint} \xB7 Baseline ${A.baseline} \xB7 DFG ${A.dfg} \xB7 FTL ${A.ftl}`,"")}return D}function is(u){let{heap:f}=u;if(!f)return[];return[Me(f),"",...Qn(["Count","Type"],f.typeCounts.slice(0,Rr).map((D)=>[String(D.count),xn(D.type)])),""]}function as(u){if(!u.comparisons||u.comparisons.length===0)return[];let f=dt(u),D=["## Comparisons",""];for(let A of u.comparisons){let{run:W,workload:L,workloadId:j}=f(A);if(D.push(`### ${A.verdict==="pass"?"\u2713":"\u2717"} ${s(L,j)}`,""),A.timing){let{medianDeltaPct:oe,ci95:H,pValue:me,verdict:Q}=A.timing,ie=Q==="unchanged"&&me!==void 0&&me>=A.thresholds.alpha?"~":"",ee=[];if(W?.timing)ee.push(`n=${W.timing.samples.length}`);if(H)ee.push(`95% CI [${r(H[0])}, ${r(H[1])}]`);if(me!==void 0)ee.push(`p=${me.toFixed(4)}`);ee.push(`threshold ${A.thresholds.effectiveTimingPct.toFixed(1)}%`),D.push(`- timing: ${ie}${r(oe)} median, ${ee.join(", ")} (**${Q}**)`)}for(let oe of lt(A,Pr))D.push(`- frame \`${xn(oe.name)}\`: ${r(oe.deltaPct)} self-time (${d(oe.baseSelfUs)}ms \u2192 ${d(oe.candSelfUs)}ms)`);for(let oe of pt(A,Rr))D.push(`- heap \`${xn(oe.type)}\`: ${r(oe.deltaPct)} count (${oe.baseCount} \u2192 ${oe.candCount})`);for(let oe of ct(A))D.push(`- ! ${Bt(oe)}`);D.push("")}return D}var ms=15;function us(u,f,D){return`${u.replace(/"/g,"'")} (self ${d(f)}ms, total ${d(D)}ms)`}function cs(u,f,D,A){let W=[];if(A<=0)return W;for(let L=0;L<f;L++){if(L===D)continue;let j=u[L];if(W.length===A&&j<=u[W[A-1]])continue;let oe=W.length;while(oe>0&&u[W[oe-1]]<j)oe--;if(W.splice(oe,0,L),W.length>A)W.pop()}return W}var Tr={name:"mermaid",async render(u,f={}){let D=f.topN??ms;return Vn(u,f,"mermaid.md",({cpu:A})=>{let{nodes:W,frames:L}=A,j=Hn(A),{selfUs:oe,totalUs:H}=dr(A,j),{parentIx:me}=j,Q=j.roots[0]??-1,ie=new Set(Q!==-1?[Q]:[]);for(let Ue of cs(oe,j.count,Q,D)){let ue=[];for(let le=Ue;le!==-1;le=me[le])ue.push(le);for(let le=ue.length-1;le>=0;le--)ie.add(ue[le])}let ee=(Ue)=>`n${W[Ue].id}`,Ne=["graph TD"];for(let Ue of ie){let ue=I(L[W[Ue].frameIx]);Ne.push(` ${ee(Ue)}["${us(ue,oe[Ue],H[Ue])}"]`)}for(let Ue of ie){let ue=me[Ue];if(ue!==-1&&ie.has(ue))Ne.push(` ${ee(ue)} --> ${ee(Ue)}`)}return`${Ne.join(`
18
+ `)}
19
+ `})}};var x=2;function nn(u){return Number.isFinite(u)?Number(u.toPrecision(6)):u}function $r(u){return{base:Math.round(u.baseBytes),cand:Math.round(u.candBytes),verdict:u.verdict,floor:Math.round(u.floorBytes)}}function Ut(u){return u.map((f)=>f.data?{code:f.code,data:f.data}:{code:f.code})}function _t(u,f){if(f?.entry?.group!==void 0)u.group=f.entry.group;if(f?.description!==void 0)u.description=f.description;if(f?.groupDescription!==void 0)u.groupDescription=f.groupDescription;if(f?.params!==void 0)u.params=f.params}function Cr(u){if(!u?.timing)return;let f={medianPct:nn(u.timing.medianDeltaPct),meanPct:nn(u.timing.meanDeltaPct),verdict:u.timing.verdict,pass:u.verdict==="pass",effectiveTimingPct:nn(u.thresholds.effectiveTimingPct),matched:!0};if(u.timing.ci95)f.ci95=[nn(u.timing.ci95[0]),nn(u.timing.ci95[1])];if(u.timing.pValue!==void 0)f.pValue=nn(u.timing.pValue);return f}function Sr(u,f,D,A,W,L){let j={event:"run",protocolVersion:x,schemaVersion:u.schemaVersion,workloadId:f.id,task:s(f,f.id),...D,batch:1,warnings:Ut(A)};if(_t(j,f),L!==void 0)j.noiseFloorPct=nn(L);let oe=Cr(W);if(oe)j.delta=oe;return j}function ds(u){let f=$n(u),D=u.environment?.noise.floorPct,A=(ue)=>({run:ue,workload:f.get(ue.workloadId)}),W=Gn(u).map(A),L=qn(W),j=[...W,...Yn(u).map(A)],oe=new Map((u.comparisons??[]).map((ue)=>[ue.candidateMeasurementId,ue])),H=Jn(u),me=new Map;for(let ue of u.measurements){if(ue.phase!=="cpu"||ue.warnings.length===0)continue;let le=me.get(ue.workloadId)??[];me.set(ue.workloadId,[...le,...ue.warnings])}let Q=(ue,le)=>[...ue.warnings,...me.get(ue.workloadId)??[],...H.get(ue.workloadId)?.warnings??[],...le?.warnings??[]],ie=Kn(u,j.map((ue)=>ue.run)).map((ue)=>Sr(u,ue,{skipped:!0},oe.get(ue.id)?.warnings??[],oe.get(ue.id),D)),ee=zn(u).flatMap((ue)=>{let le=f.get(ue.workloadId);if(!le)return[];let Ve=oe.get(ue.id);return Sr(u,le,{samples:0},Q(ue,Ve),Ve,D)}),Ne=j.map((ue)=>{let{run:le,workload:Ve}=ue,Ee=le.timing,_e=oe.get(le.id),je={event:"run",protocolVersion:x,schemaVersion:u.schemaVersion,workloadId:le.workloadId,task:s(Ve,le.workloadId),unit:"ns",samples:Ee.samples.length,batch:Ee.batch??1,mean:nn(Ee.mean),median:nn(Ee.median),stddev:nn(Ee.stddev),stddevPct:nn(Ee.mean===0?0:Ee.stddev/Ee.mean*100),min:nn(Ee.min),max:nn(Ee.max),warnings:Ut(Q(le,_e))};je.p75=nn(Ee.p75),je.p99=nn(Ee.p99),je.mad=nn(Ee.mad);let He=Z(le);if(He)je.userNs=nn(He.userNs),je.systemNs=nn(He.systemNs);let Tn=H.get(le.workloadId),Ge=Tn?.retained??le.paired?.retained?.candBytes;if(Ge!==void 0)je.retainedBytesPerOp=Math.round(Ge);let en=Tn?.peak??le.paired?.peak?.candBytes;if(en!==void 0)je.peakBytes=Math.round(en);_t(je,Ve);let cn=L?.get(ue);if(cn!==void 0)je.relative=nn(cn);if(Ve?.baseline)je.baseline=!0;if(D!==void 0)je.noiseFloorPct=nn(D);let Sn=Cr(_e);if(Sn)je.delta=Sn;let tn=le.paired;if(tn)je.paired={baseMedian:nn(tn.baseMedianNs),medianRatio:nn(tn.medianRatio),ratioP25:nn(tn.ratioP25),ratioP75:nn(tn.ratioP75),rounds:tn.rounds,verdict:tn.verdict,...tn.flagged&&{flagged:tn.flagged},...tn.confirmed!==void 0&&{confirmed:tn.confirmed},...tn.repeats&&{repeats:tn.repeats.map((Ye)=>nn(Ye.medianRatio))},sameOutput:tn.sameOutput,...tn.suiteChanged&&{suiteChanged:!0},...tn.retained&&{retained:$r(tn.retained)},...tn.peak&&{peak:$r(tn.peak)}};return je}),Ue=ht(u).map((ue)=>{let le=f.get(ue.workloadId),Ve={event:"run",protocolVersion:x,schemaVersion:u.schemaVersion,workloadId:ue.workloadId,task:s(le,ue.workloadId),batch:1,warnings:Ut(ue.warnings)};if(_t(Ve,le),D!==void 0)Ve.noiseFloorPct=nn(D);return Ve.threw=ue.threw,Ve});return[...Ne,...ee,...Ue,...ie]}function ls(u){if(!u.unmatched)return[];let f=(D,A)=>({event:"unmatched",protocolVersion:x,workloadId:D.id,task:s(D,D.id),side:A});return[...u.unmatched.baseOnly.map((D)=>f(D,"base")),...u.unmatched.candOnly.map((D)=>f(D,"cand"))]}function ps(u){return u===0?"pass":u===1?"fail":"error"}function fs(u,f){let D=f.command==="ab"&&u.ab?{...u.ab,effectiveTimingPct:u.ab.thresholdPct}:u.comparisonSummary,A=(f.unmatched?.baseOnly.length??0)+(f.unmatched?.candOnly.length??0),W={event:"summary",protocolVersion:x,command:f.command,matched:D?.matched??0,regressed:D?.regressed??0,improved:D?.improved??0,unchanged:D?.unchanged??0,unmatched:A,geomeanPct:D?.geomeanPct!==void 0?D.geomeanPct:null,effectiveTimingPct:nn(D?.effectiveTimingPct??0),verdict:ps(f.exitCode),exitCode:f.exitCode};if(f.command==="ci"){if(W.cached=f.cached??0,W.executed=f.executed??0,W.failed=f.failed??0,W.missingBaseline=f.missingBaseline??0,f.baseline)W.baseline=f.baseline}if(f.command==="ab"&&u.ab){if(W.base=u.ab.base,W.geomeanThresholdPct=u.ab.geomeanThresholdPct,W.unconfirmed=u.ab.unconfirmed,W.outputDiffers=u.ab.outputDiffers,u.ab.notComparable!==void 0)W.notComparable=u.ab.notComparable;if(u.ab.threw!==void 0)W.threw=u.ab.threw;if(u.ab.newSuites?.length)W.newSuites=u.ab.newSuites;if(u.ab.memory)W.memory=u.ab.memory}if(u.environment)W.noiseFloorPct=nn(u.environment.noise.floorPct);if(f.baseGit||f.candGit)W.git={...f.baseGit&&{base:f.baseGit},...f.candGit&&{cand:f.candGit}};if(f.exportedTo)W.exportedTo=f.exportedTo;return W}var vr={name:"minimal",async render(u,f={}){let D=[...ds(u)];if(f.protocol)D.push(...ls(f.protocol)),D.push(fs(u,f.protocol));let A=D.map((W)=>JSON.stringify(W));return{text:A.length>0?`${A.join(`
20
+ `)}
21
+ `:""}}};var gs="https://www.speedscope.app/file-format-schema.json",Ir={name:"speedscope",async render(u,f={}){let D=$n(u);return Vn(u,f,"speedscope.json",(A)=>{let{cpu:W}=A,{nodes:L}=W,j=Hn(W),oe=W.samples?.nodeIds??[],H=W.samples?.timeDeltasUs??[],me=Array(j.count);for(let Ue of j.order){let ue=j.parentIx[Ue],le=L[Ue].frameIx;me[Ue]=ue===-1?[le]:[...me[ue],le]}let Q=oe.map((Ue)=>{let ue=j.indexOf(Ue);return ue===-1?[]:me[ue]}),ie=D.get(A.workloadId),ee=ie?.label??ie?.command?.join(" ")??ie?.entry?.task??"profile",Ne={$schema:gs,exporter:"ostia",name:ee,activeProfileIndex:0,shared:{frames:W.frames.map((Ue)=>({name:I(Ue),file:Ue.url,line:Ue.line!==void 0?Ue.line+1:void 0}))},profiles:[{type:"sampled",name:ee,unit:"microseconds",startValue:0,endValue:H.reduce((Ue,ue)=>Ue+ue,0),samples:Q,weights:H}]};return`${JSON.stringify(Ne,null,2)}
22
+ `})}};var Or=5,Dr=5,hs=10;function jt(u,f){let D=(H)=>H.group!==void 0?" ":"",A=(H)=>kr(H.label,H.group),W=4;for(let H of f)W=Math.max(W,D(H).length+A(H).length);let L=`${"Task".padEnd(W)} ${u.map((H)=>H.header.padEnd(H.width)).join(" ")}`,j=[L,"-".repeat(L.length)],oe;for(let H of f){if(H.group!==void 0&&H.group!==oe)j.push(`${H.group}:`);oe=H.group;let me=D(H),Q=(me+A(H)).padEnd(W),ie=H.data;if(j.push(ie===void 0?`${Q} - ${H.status}`:`${Q} ${u.map((ee)=>ee.cell(ie).padEnd(ee.width)).join(" ")}`),H.warnings.length>0)j.push(`${me} ! ${H.warnings.map((ee)=>ee.code).join(", ")}`)}return j}function Nr(u){let f=u.flatMap((D)=>D.warnings.map((A)=>` ${D.label}: ${A.message}`));return f.length>0?["","Warnings:",...f]:[]}function Lt(u){return{text:`${u.map((f)=>f.trimEnd()).join(`
23
+ `)}
24
+ `}}var Er={name:"table",async render(u){let f=u.environment?[Re(u.environment),""]:[];if(u.ab)return Lt(ws(u,u.ab,f));let D=Gn(u),A=zn(u),W=ys(u);if(D.length===0&&A.length===0&&Kn(u,D).length===0)return W.length>0?Lt([...f,...W]):{text:`(no timing runs)
25
+ `};let L=[...f,...bs(u,D,A)],j=ks(u);if(j.length>0)L.push("",...j);if(W.length>0)L.push("",...W);return Lt(L)}};function bs(u,f,D){let A=Jn(u),W=new Map(f.map((ee)=>[ee.workloadId,ee])),L=new Map(D.map((ee)=>[ee.workloadId,ee])),j=[],oe=[];for(let ee of u.workloads){let Ne=W.get(ee.id),Ue=k(ee),ue=Wn(ee);if(Ne){let le={run:Ne,workload:ee};oe.push(le),j.push({label:Ue,group:ue,data:le,warnings:rt(Ne,A)})}else if(L.has(ee.id)){let le=rt(L.get(ee.id),A);j.push({label:Ue,group:ue,status:"no samples",warnings:le})}else if(ee.skipped)j.push({label:Ue,group:ue,status:"skipped",warnings:[]})}let H=({run:ee})=>B(ee.timing.median),me=new Map(oe.map((ee)=>[ee,Z(ee.run)])),Q=qn(oe),ie=[{header:"Median",width:10,cell:(ee)=>n(ee.run.timing.median,H(ee))},{header:"Spread",width:18,cell:(ee)=>Y(ee.run.timing.p75,ee.run.timing.p99,H(ee))},{header:"Range",width:18,cell:(ee)=>Y(ee.run.timing.min,ee.run.timing.max,H(ee))}];if([...me.values()].some(Boolean))ie.push({header:"User/Sys",width:18,cell:(ee)=>{let Ne=me.get(ee);return Ne?ve(Ne):""}});for(let ee of ft(A))ie.push({header:ee.header,width:Math.max(ee.header.length,hs),cell:(Ne)=>ee.cell(Ne.run.workloadId)??""});if(Q)ie.push({header:"Relative",width:8,cell:(ee)=>Se(Q.get(ee),!!ee.workload?.baseline)});return[...jt(ie,j),...Nr(j)]}function ws(u,f,D){let A=$n(u),W=[...D,`A/B: ${Rt(f)}`,""],L=[],j=yr(u).map(({kind:Q,run:ie})=>{let ee=A.get(ie.workloadId),Ne=s(ee,ie.workloadId),Ue;if(Q==="threw"){let ue=bt(ie.threw);L.push({label:Ne,verdict:ue,message:ie.threw.message}),Ue={base:"-",candidate:"-",change:"",spread:"",verdict:ue}}else Ue=yt(ie);return{label:Ne,group:Wn(ee),data:Ue,warnings:ie.warnings}});if(j.length>0)W.push(...jt([{header:"Base",width:10,cell:(Q)=>Q.base},{header:"Candidate",width:10,cell:(Q)=>Q.candidate},{header:"Change",width:9,cell:(Q)=>Q.change},{header:"p25\u2026p75",width:18,cell:(Q)=>Q.spread},{header:"Verdict",width:7,cell:(Q)=>Q.verdict}],j));let oe=kt(u);if(oe.length>0)W.push("","Memory:",...jt([{header:"Reading",width:11,cell:(Q)=>Q.reading},{header:"Base",width:10,cell:(Q)=>Q.base},{header:"Candidate",width:10,cell:(Q)=>Q.candidate},{header:"Change",width:18,cell:(Q)=>Q.change},{header:"Verdict",width:7,cell:(Q)=>Q.verdict}],oe.map((Q)=>{let ie=A.get(Q.run.workloadId);return{label:s(ie,Q.run.workloadId),group:Wn(ie),data:Pt(Q),warnings:[]}})));let H=xt(u);if(L.length>0){W.push("",`Threw (${L.length}):`);for(let Q of L){let[ie,...ee]=Q.message.split(`
26
+ `);W.push(` ${Q.label}: ${Q.verdict}: ${ie}`);for(let Ne of ee)W.push(` ${Ne}`)}}if(H.outputDiffers.length>0)W.push("",`Output differs from the base (${H.outputDiffers.length}):`,...H.outputDiffers.map((Q)=>` ${Q}`));let me=wt(f);if(me)W.push("",me);if(H.baseOnly.length>0||H.candOnly.length>0){if(W.push("","Unmatched:"),H.baseOnly.length>0)W.push(` base only: ${H.baseOnly.join(", ")}`);if(H.candOnly.length>0)W.push(` candidate only: ${H.candOnly.join(", ")}`)}return W.push(...Nr(j),"",Mt(f)),W}function ys(u){if(!u.comparisons||u.comparisons.length===0)return[];let f=[],D=dt(u),A=ut(u);if(A)f.push(`\u26A0 ${A.message}`,"");let W=[];for(let L of u.comparisons){let{workload:j,workloadId:oe}=D(L),H=s(j,oe);if(f.push(`${L.verdict==="pass"?"\u2713":"\u2717"} ${H}`),L.timing){let{medianDeltaPct:Q,ci95:ie,pValue:ee,verdict:Ne}=L.timing;if(ie&&ee!==void 0){let Ue=ee<0.001?"p<0.001":`p=${ee.toFixed(3)}`;f.push(` timing: ${r(Q)} median, 95% CI [${r(ie[0])}, ${r(ie[1])}], ${Ue} (${Ne})`)}else f.push(` timing: ${r(Q)} median (${Ne})`)}for(let Q of lt(L,Or))f.push(` frame ${Q.name}: ${r(Q.deltaPct)} self-time (${d(Q.baseSelfUs)}ms -> ${d(Q.candSelfUs)}ms)`);for(let Q of pt(L,Dr))f.push(` heap ${Q.type}: ${r(Q.deltaPct)} count (${Q.baseCount} -> ${Q.candCount})`);let me=ct(L);if(me.length>0){f.push(` ! ${me.map((Q)=>Q.code).join(", ")}`);for(let Q of me)W.push(` ${H}: ${Q.message}`)}}if(W.length>0)f.push("","Comparison warnings:",...W);return f}function ks(u){let f=$n(u),D=[];for(let A of u.measurements){if(A.phase!=="cpu"&&A.phase!=="heap")continue;let W=f.get(A.workloadId),L=s(W,A.workloadId);if(A.phase==="cpu")if(A.cpu){D.push(`CPU capture - ${L} (instrumented, ${A.cpu.samplingIntervalUs}\xB5s interval, ${X(A.cpu)} samples, diagnostic wall ${xe(A.diagnosticWallNs??0)}ms)`);for(let j of Te(A.cpu,Or))D.push(` ${j.pct.padStart(5)}% ${d(j.selfUs).padStart(8)}ms self ${j.frame?.name??"?"}`)}else D.push(`CPU capture - ${L} (instrumented, no evidence captured)`);else if(A.heap){D.push(`Heap snapshot - ${L} (instrumented, ${Me(A.heap)})`);for(let j of A.heap.typeCounts.slice(0,Dr))D.push(` ${String(j.count).padStart(6)} ${j.type}`)}else D.push(`Heap snapshot - ${L} (instrumented, no evidence captured)`);for(let j of A.artifacts)D.push(` artifact: ${j.path}`);for(let j of A.warnings)D.push(` ! ${j.message}`)}return D}var g={table:Er,json:fr,markdown:xr,jsonl:gr,minimal:vr,collapsed:lr,mermaid:Tr,speedscope:Ir,cpuprofile:pr};async function hn(u={}){let f=E();if(f.length===0)throw Error("run(): no tasks registered - call group()/task() before run() in the same file.");let D=Bun.main,A;try{A=N(f,u.filter,D)}catch(L){throw Error(`run(): ${L.message}`)}let W=await de(D,A,u);if(!u.quiet){let L=u.format??"table",{text:j}=await g[L].render(W,{});if(j)process.stdout.write(j)}return W}function bn(u,f){let D=Object.keys(u),A=(W,L)=>{if(W===D.length){fn(L,()=>f(L));return}let j=D[W];for(let oe of u[j])A(W+1,{...L,[j]:oe})};A(0,{})}function Ps(u){return u.startsWith("file://")?u.slice(7):u}function Tt(u,f,D){let A=u.nodes,W=A.length,{frames:L,intern:j}=De(),oe=new Map,H=Array(W);for(let Ee=0;Ee<W;Ee++){let _e=A[Ee],je=_e.callFrame,He=j(je.functionName,Ps(je.url)||void 0,je.lineNumber>=0?je.lineNumber:void 0,je.columnNumber>=0?je.columnNumber:void 0);H[Ee]={id:_e.id,frameIx:He,children:_e.children??[]},oe.set(_e.id,Ee)}let me=new Float64Array(W),Q=new Float64Array(W),{samples:ie,timeDeltas:ee}=u;for(let Ee=0;Ee<ie.length;Ee++){let _e=oe.get(ie[Ee]);if(_e===void 0)continue;me[_e]+=ee[Ee]??0,Q[_e]+=1}let Ne=new Int32Array(W).fill(-1);for(let Ee=0;Ee<W;Ee++){let _e=A[Ee].children;if(!_e)continue;for(let je of _e){let He=oe.get(je);if(He!==void 0)Ne[He]=Ee}}let Ue=[],ue=[];for(let Ee=W-1;Ee>=0;Ee--)if(Ne[Ee]===-1)ue.push(Ee);while(ue.length>0){let Ee=ue.pop();Ue.push(Ee);let _e=A[Ee].children;if(!_e)continue;for(let je of _e){let He=oe.get(je);if(He!==void 0&&Ne[He]===Ee)ue.push(He)}}let le=new Float64Array(W);for(let Ee=Ue.length-1;Ee>=0;Ee--){let _e=Ue[Ee];le[_e]+=me[_e];let je=Ne[_e];if(je>=0)le[je]+=le[_e]}let Ve=new Map;for(let Ee=0;Ee<W;Ee++)Fe(Ve,H[Ee].frameIx,me[Ee],le[Ee],Q[Ee]);return{origin:f,samplingIntervalUs:D,frames:L,nodes:H,totals:Be(Ve),samples:{nodeIds:u.samples,timeDeltasUs:u.timeDeltas}}}async function Ar(u,f={}){let D=f.intervalUs??We,{Session:A}=await import("inspector/promises"),W=new A;W.connect();try{await W.post("Profiler.enable"),await W.post("Profiler.setSamplingInterval",{interval:D});let L=Bun.nanoseconds();await W.post("Profiler.start");let j=await u(),{profile:oe}=await W.post("Profiler.stop"),H=Bun.nanoseconds()-L,me=Tt(oe,"inspector",D);return{result:j,cpu:me,diagnosticWallNs:H}}finally{W.disconnect()}}function Rs(u){return u.replace(/[\s"']/g,"\\$&")}function Ms(u,f,D){let A=u[0];if(A&&/(^|[\\/])bun(\.exe)?$/.test(A))return{argv:[A,...f,...u.slice(1)],env:D};let W={...process.env,...D},L=f.map(Rs).join(" ");return{argv:u,env:{...W,BUN_OPTIONS:W.BUN_OPTIONS?`${W.BUN_OPTIONS} ${L}`:L}}}async function $t(u,f,D){let A=`${u.artifactDir}/${u.fileName}`,{argv:W,env:L}=Ms(u.argv,f,u.env),j=Bun.nanoseconds(),H=await Bun.spawn(W,{cwd:u.cwd,env:L,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,me=Bun.nanoseconds()-j,Q=Bun.file(A);if(!await Q.exists())return{diagnosticWallNs:me,exitCode:H,warnings:[{code:"artifact-missing",message:`Expected ${D.what} at ${A} after exit ${H}, found nothing. The workload's argv[0] must be a \`bun\` binary for ${D.kind} capture.`,data:{artifactPath:A,argv:u.argv}}]};return{diagnosticWallNs:me,exitCode:H,artifactPath:A,raw:await Q.json(),warnings:[]}}async function Fr(u){let{raw:f,...D}=await $t(u,["--cpu-prof","--cpu-prof-dir",u.artifactDir,"--cpu-prof-name",u.fileName,"--cpu-prof-interval",String(u.intervalUs)],{what:"a .cpuprofile",kind:"CPU"});if(!f)return D;if(f.samples.length===0)D.warnings.push({code:"empty-profile",message:"CPU capture produced zero samples."});return{...D,cpu:Tt(f,"cpu-prof",u.intervalUs)}}function Wr(u){let{node_fields:D,node_types:A}=u.snapshot.meta,W=D.indexOf("type"),L=D.indexOf("self_size"),j=D.length,oe=A[0];if(W===-1||L===-1||!Array.isArray(oe))return{origin:"heap-prof",typeCounts:[],objectCount:u.snapshot.node_count};let H=oe.length,me=Array(H),Q=new Map,ie=[],ee=(Ee)=>{let _e={type:Ee,count:0,bytes:0};return ie.push(_e),_e},Ne=0,Ue=u.nodes,ue=Ue.length;for(let Ee=0;Ee<ue;Ee+=j){let _e=Ue[Ee+W],je=Ue[Ee+L]??0;Ne+=je;let He;if(_e>=0&&_e<H)He=me[_e]??=ee(oe[_e]);else if(He=Q.get(_e),He===void 0)He=ee(`unknown(${_e})`),Q.set(_e,He);He.count++,He.bytes+=je}ie.sort((Ee,_e)=>_e.count-Ee.count);let le=ie.slice(0,20).map(({type:Ee,count:_e,bytes:je})=>({type:Ee,count:_e,retainedBytes:je})),Ve=ie.slice(20);if(Ve.length>0)le.push({type:"other",count:Ve.reduce((Ee,_e)=>Ee+_e.count,0),retainedBytes:Ve.reduce((Ee,_e)=>Ee+_e.bytes,0)});return{origin:"heap-prof",heapSizeBytes:Ne,objectCount:u.snapshot.node_count,typeCounts:le}}async function Br(u){let{raw:f,...D}=await $t(u,["--heap-prof","--heap-prof-dir",u.artifactDir,"--heap-prof-name",u.fileName],{what:"a heap snapshot",kind:"heap"});return f?{...D,heap:Wr(f)}:D}var St=1000;function re(){return{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever measurements had already completed."}}async function he(u){_n("time",u);let f=i({samples:u.samples??null,budgetMs:u.budgetMs??null,minSamples:u.minSamples??null,warmup:u.warmup??null,cpu:u.cpu??!1,heap:u.heap??!1,cpuIntervalUs:u.cpuIntervalUs??St}),D=`${u.outDir??An}/artifacts`,A=u.noiseCheck===!1?void 0:ke(),W=A?Pe(A):void 0,L=[],j=[],oe=u.commands.map((ie)=>{let ee=typeof ie==="string"||Array.isArray(ie)?{command:ie}:ie,Ne=Array.isArray(ee.command)?ee.command:K(ee.command),Ue=ee.prepare??u.prepare,ue=ee.timeSource??u.timeSource,le=ae(Ne,ee.label??(Array.isArray(ee.command)?void 0:ee.command),{prepare:Ue,timeSource:ue});return{argv:Ne,workload:le,prepare:Ue,timeSource:ue,timeoutMs:ee.timeoutMs??u.timeoutMs,ignoreExitCodes:ee.ignoreExitCodes??u.ignoreExitCodes}}),H=(u.interleave??!0)&&oe.length>1,me=oe.map((ie)=>Nt({argv:ie.argv,cwd:u.cwd,env:u.env,samples:u.samples,budgetMs:u.budgetMs,minSamples:u.minSamples,warmup:u.warmup,prepare:ie.prepare,timeSource:ie.timeSource,timeoutMs:ie.timeoutMs,ignoreExitCodes:ie.ignoreExitCodes,signal:u.signal})),Q=async(ie)=>{let{argv:ee,workload:Ne,prepare:Ue}=oe[ie];L.push(Ne);let ue=me[ie].result(),le=U({workload:Ne,configFingerprint:f,trials:ue.trials,timing:ue.timing,warnings:W&&j.length===0?[...ue.warnings,W]:ue.warnings,interleaved:H?!0:void 0});if(j.push(le),!u.signal?.aborted)j.push(...await xs({workload:Ne,argv:ee,timingMeasurementId:le.id,cfgFp:f,opts:u,artifactDir:D,prepare:Ue}))};if(H){for(let ee of me)await ee.warmup();let ie=!0;while(ie){ie=!1;for(let ee of me)if(await ee.step())ie=!0}for(let ee=0;ee<oe.length;ee++)await Q(ee)}else for(let ie=0;ie<oe.length;ie++)await Et(me[ie]),await Q(ie);if(u.signal?.aborted&&j.length>0){let ie=j[j.length-1];ie.warnings=[...ie.warnings,re()]}return t(L,j,A)}async function xs({workload:u,argv:f,timingMeasurementId:D,cfgFp:A,opts:W,artifactDir:L,prepare:j}){let oe=[],H=async(Q)=>{if(j)await we(j,{phase:Q,index:0},{cwd:W.cwd,env:W.env})},me=(Q)=>({argv:f,cwd:W.cwd,env:W.env,artifactDir:L,fileName:`${D}-${Q}`});if(W.cpu){await H("cpu");let Q=await Fr({...me("cpu.cpuprofile"),intervalUs:W.cpuIntervalUs??St});oe.push(await Ur({workload:u,phase:"cpu",configFingerprint:A,artifactKind:"cpuprofile",...Q}))}if(W.heap){await H("heap");let Q=await Br(me("heap.heapsnapshot"));oe.push(await Ur({workload:u,phase:"heap",configFingerprint:A,artifactKind:"heapsnapshot",...Q}))}return oe}async function Ur({artifactPath:u,artifactKind:f,...D}){let A=y({...D,artifacts:[]});if(u)A.artifacts=[await dn(A.id,f,u)];return A}async function wn(u,f={}){if(f.name!==void 0&&(typeof f.name!=="string"||!f.name))throw TypeError("profile(): name must be a non-empty string");let D=ln(u,f.name),A=f.cpuIntervalUs??St,W=i({intervalUs:A,origin:f.origin??"inspector"}),L=(H,me)=>({result:H,measurement:me,document:t([D],[me])});if(f.signal?.aborted){let H=Bun.nanoseconds(),me=await u();return L(me,y({workload:D,phase:"cpu",configFingerprint:W,diagnosticWallNs:Bun.nanoseconds()-H,warnings:[re()],artifacts:[]}))}let j=f.origin==="jsc"?await Le(u,{intervalUs:A}):{...await Ar(u,{intervalUs:A}),jit:void 0},oe=j.cpu.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];return L(j.result,y({workload:D,phase:"cpu",configFingerprint:W,diagnosticWallNs:j.diagnosticWallNs,cpu:j.cpu,jit:j.jit,warnings:oe,artifacts:[]}))}function yn(u){return u}
27
+ export{P,Je,ze,pe,m,ne,on,C,Ke,sn,fe,F,G,V,an,ge,J,qe,te,z,re,he,gn,x,g,hn,bn,wn,yn};
@@ -0,0 +1,15 @@
1
+ // @bun
2
+ function T(m){return m instanceof Error?m.message:String(m)}class l extends Error{}var Vn={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function B(m){let g=Math.abs(m);if(g>=1e9)return"s";if(g>=1e6)return"ms";if(g>=1000)return"\xB5s";return"ns"}function Kn(m){let g=Math.floor(Math.log10(Math.max(Math.abs(m),1)))+1;return Math.max(1,3-g)}function n(m,g=B(m)){let b=m/Vn[g];return`${b.toFixed(Kn(b))} ${g}`}function c(m){if(m.length===0)throw Error("computeTimingStats: samples must be non-empty");let g=m.length,b=w(m),x=0;for(let J=0;J<g;J++)x+=m[J];let P=x/g,F=o(b,0.5),O=0;for(let J=0;J<g;J++){let se=m[J]-P;O+=se*se}let G=Math.sqrt(O/g),C=b[0],H=b[g-1],j=o(b,0.25),ne=o(b,0.75),oe=ne-j,fe=j-1.5*oe,Q=ne+1.5*oe,te=j-3*oe,ee=ne+3*oe,re=0,ge=0;for(let J=0;J<g;J++){let se=m[J];if(se<te||se>ee)ge++;else if(se<fe||se>Q)re++}let je=o(b,0.99),V=new Float64Array(g);for(let J=0;J<g;J++)V[J]=Math.abs(m[J]-F);V.sort();let z=o(V,0.5);return{unit:"ns",samples:m,mean:P,median:F,stddev:G,min:C,max:H,outliers:{mild:re,severe:ge},p25:j,p75:ne,p99:je,mad:z}}function w(m){let g=new Float64Array(m.length);return g.set(m),g.sort(),g}function o(m,g){let b=m.length;if(b===1)return m[0];let x=g*(b-1),P=Math.floor(x),F=Math.ceil(x);if(P===F)return m[P];let O=x-P;return m[P]*(1-O)+m[F]*O}var zn=5000000;function ye(m,g,b="subprocess",x=[]){let P=[],F=m.samples[0];if(F!==void 0){let C=m.p75-m.p25;if(F>m.median+3*C&&F>2*m.median&&C>0)P.push({code:"slow-first-run",message:`First run took ${n(F)}, much slower than the median ${n(m.median)}. Consider more warmup.`,data:{firstNs:F,medianNs:m.median}})}if(b!=="inprocess"&&m.outliers.mild+m.outliers.severe>0)P.push({code:"outliers-detected",message:`${m.outliers.mild+m.outliers.severe} outlier(s) detected (${m.outliers.severe} severe, ${m.outliers.mild} mild).`,data:m.outliers});if(b==="subprocess"&&m.median<zn)P.push({code:"fast-command",message:`Median run time (${(m.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:m.median}});let O=new Set(x),G=g.filter((C)=>C!==void 0&&C!==0&&!O.has(C));if(G.length>0)P.push({code:"nonzero-exit",message:`${G.length} of ${g.length} trial(s) exited non-zero.`,data:{exitCodes:G}});return P}function M(m,g){return JSON.stringify(nn(m),null,g)}function nn(m){if(Array.isArray(m))return m.some((b)=>b!==null&&typeof b==="object")?m.map(nn):m;if(m!==null&&typeof m==="object"){let g=m,b={};for(let x of Object.keys(g).sort())b[x]=nn(g[x]);return b}return m}function e(m,...g){let b=Bun.CryptoHasher.hash("sha256",M(g),"hex");return`${m}_${b.slice(0,16)}`}import{rename as tt,rm as rt}from"fs/promises";import{isAbsolute as ot,relative as it}from"path";class rn extends Error{}var wn=new WeakMap;function yn(m){if(typeof m.pattern!=="string")return m.pattern;let g=wn.get(m);if(!g)g=new RegExp(m.pattern),wn.set(m,g);return g}function be(m){let g=yn(m);if(/[gyd]/.test(g.flags))throw RangeError("timeSource pattern must not use the g, y or d flag")}var qn={ns:1,us:1000,ms:1e6,s:1e9};function Ke(m,g){let b=m!==void 0?AbortSignal.timeout(m):void 0,x=b&&g?AbortSignal.any([b,g]):b??g;return{spawn:x?{signal:x,killSignal:"SIGKILL"}:{},timedOut:()=>b?.aborted??!1}}async function mn(m){let g=m.timeSource!==void 0,b=Bun.nanoseconds(),x=Ke(m.timeoutMs,m.signal),P=Bun.spawn(m.argv,{cwd:m.cwd,env:m.env,stdout:g?"pipe":"ignore",stderr:g?"pipe":"ignore",stdin:"ignore",...x.spawn}),F=g?Promise.all([new Response(P.stdout).text(),new Response(P.stderr).text()]):void 0,O=await P.exited,G=Bun.nanoseconds(),C=P.resourceUsage?.(),H=x.timedOut(),j={wallNs:G-b,exitCode:H?null:O,userNs:C?Number(C.cpuTime.user)*1000:void 0,systemNs:C?Number(C.cpuTime.system)*1000:void 0,maxRssBytes:C?.maxRSS,...H&&{timedOut:!0}};if(F){let[ne,oe]=await F;if(m.timeSource&&!H)try{j.reportedNs=Yn(m.timeSource,ne,oe,m.argv)}catch(fe){if(!(fe instanceof rn))throw fe;j.timeSourceNoMatch=!0,j.timeSourceMissOutput=Zn(ne,oe)}}return j}function Yn(m,g,b,x=[]){let P=yn(m),F=m.group??1,O=P.exec(g)??P.exec(b),G=x.length>0?` for "${x.join(" ")}"`:"";if(!O)throw new rn(`timeSource pattern ${P} did not match the output${G}. Output was:
3
+ ${Tn(g,b)}`);let C=O[F];if(C===void 0)throw Error(`timeSource pattern ${P} matched${G} but has no capture group ${F} (matched text: "${O[0]}").`);let H=Number(C);if(!Number.isFinite(H))throw Error(`timeSource pattern ${P} group ${F} captured "${C}"${G}, which is not a number.`);return H*qn[m.unit??"ms"]}function Tn(m,g){let x=(F)=>F.length>800?`${F.slice(0,800)}\u2026(${F.length-800} more)`:F,P=[];if(m.trim())P.push(`--- stdout ---
4
+ ${x(m.trimEnd())}`);if(g.trim())P.push(`--- stderr ---
5
+ ${x(g.trimEnd())}`);return P.length>0?P.join(`
6
+ `):"(empty)"}var tn=2048;function Zn(m,g){let b=Tn(m,g);if(Buffer.byteLength(b,"utf8")<=tn)return b;let x=b.slice(0,tn);while(Buffer.byteLength(x,"utf8")>tn)x=x.slice(0,-1);return`${x}\u2026`}var Xn=1048576;async function Qn(m,g=Xn){let b=Math.floor(g/2),x=m.getReader(),P=[],F=0,O=[],G=0,C=0;try{for(;;){let{done:fe,value:Q}=await x.read();if(fe)break;if(!Q||Q.byteLength===0)continue;C+=Q.byteLength;let te=Q;if(F<b){let ee=b-F;if(te.byteLength<=ee){P.push(te),F+=te.byteLength;continue}P.push(te.subarray(0,ee)),F+=ee,te=te.subarray(ee)}O.push(te),G+=te.byteLength;while(G>b&&O.length>0){let ee=O[0],re=G-b;if(ee.byteLength<=re)O.shift(),G-=ee.byteLength;else O[0]=ee.subarray(re),G-=re}}}finally{x.releaseLock()}let H=new TextDecoder,j=H.decode(Buffer.concat(P));if(C<=F+G)return j;let ne=H.decode(Buffer.concat(O)),oe=C-F-G;return`${j}
7
+ \u2026(${oe} bytes elided)\u2026
8
+ ${ne}`}async function we(m,g,b){if(typeof m==="function"){await m(g);return}let x=on(m),P=Ke(b.timeoutMs,b.signal),F=Bun.spawn(x,{cwd:b.cwd,env:b.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...P.spawn}),O=Qn(F.stderr).catch(()=>""),G=await F.exited,C=P.timedOut();if(!C&&b.signal?.aborted)return;if(!C&&G===0)return;let H=C?`timed out after ${b.timeoutMs}ms`:`exited with code ${G}`,j=(await O).trim();throw Error(`prepare command "${x.join(" ")}" ${H} before ${g.phase} trial ${g.index}.${j?`
9
+ ${j}`:""}`)}function on(m){if(m===void 0||typeof m==="function")return;return Array.isArray(m)?m:K(m)}function Sn(m){if(m===void 0)return;return{pattern:typeof m.pattern==="string"?m.pattern:m.pattern.source,...m.group!==void 0&&{group:m.group},...m.unit!==void 0&&{unit:m.unit}}}function K(m){return m.trim().split(/\s+/).filter(Boolean)}var Mn={name:"ostia",version:"0.2.10",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","smoke:package":"bun scripts/smoke-package.ts",test:"bun test",typecheck:"tsc6","typecheck:package":"tsc6 -p tests/types",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.14","@types/bun":"^1.4.2",knip:"^6.38.0",typescript:"npm:@typescript/typescript6@^6.0.2"},repository:{type:"git",url:"git+https://github.com/metonym/ostia.git"}};var ie=Mn.version;var Rn;function sn(m){let g=Bun.spawnSync(["git",...m],{timeout:200,stdout:"pipe",stderr:"ignore"});return g.success?g.stdout.toString().trim():void 0}function nt(){try{let m=sn(["rev-parse","--short","HEAD"]);if(m===void 0)return;return{sha:m,branch:sn(["rev-parse","--abbrev-ref","HEAD"])??"HEAD",dirty:(sn(["status","--porcelain"])?.length??0)>0}}catch{return}}function vn(){return Rn??={git:nt()},Rn.git}function He(m){return Object.fromEntries(Object.entries(m).filter(([,g])=>g!==void 0))}function an(m,g,b){return e("run",m,g,b,Bun.version,ie)}function t(m,g,b){let x=vn();return{schemaVersion:2,toolVersion:ie,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:m,measurements:g,...He({environment:b,git:x})}}function ae(m,g,b={}){if(b.timeSource)be(b.timeSource);let x=on(b.prepare),P=Sn(b.timeSource),F=typeof b.prepare==="function"?b.prepare.toString():x;return{id:e("wl","subprocess",m,...F!==void 0||P!==void 0?[F??null,P??null]:[]),kind:"subprocess",command:m,label:g,...He({prepare:x,timeSource:P})}}function ln(m,g){return{id:g===void 0?e("wl","inprocess",m.name,m.toString()):e("wl","inprocess-named",g),kind:"inprocess",label:g}}function Nn(m,g,b={}){let x=ot(m)?it(process.cwd(),m):m,P=b.params!==void 0?e("wl","inprocess-entry",x,g,b.params):e("wl","inprocess-entry",x,g),{group:F,...O}=b;return{id:P,kind:"inprocess",entry:{file:m,task:g,...He({group:F})},...He(O)}}function U(m){return{id:an(m.workload.id,"timing",m.configFingerprint),workloadId:m.workload.id,phase:"timing",instrumented:!1,configFingerprint:m.configFingerprint,trials:m.trials,timing:m.timing,warnings:m.warnings,artifacts:[],memory:st(m.trials),...He({interleaved:m.interleaved})}}function st(m){let g=m.map((b)=>b.maxRssBytes).filter((b)=>b!==void 0);if(g.length===0)return;return{origin:"resourceUsage",maxRssBytes:Math.max(...g)}}function y(m){return{id:an(m.workload.id,m.phase,m.configFingerprint),workloadId:m.workload.id,phase:m.phase,instrumented:!0,configFingerprint:m.configFingerprint,trials:[{i:0,wallNs:m.diagnosticWallNs,exitCode:m.exitCode}],diagnosticWallNs:m.diagnosticWallNs,cpu:m.cpu,heap:m.heap,memory:m.memory,jit:m.jit,warnings:m.warnings,artifacts:m.artifacts}}function Ye(m){return{id:an(m.workload.id,"paired",m.configFingerprint),workloadId:m.workload.id,phase:"paired",instrumented:!1,configFingerprint:m.configFingerprint,trials:[],..."threw"in m?{threw:m.threw}:{timing:m.timing,paired:m.paired},diagnosticWallNs:m.diagnosticWallNs,warnings:m.warnings,artifacts:[]}}async function dn(m,g,b){let x=await Bun.file(b).arrayBuffer();return{id:e("art",m,g,b),kind:g,path:b,sha256:Bun.CryptoHasher.hash("sha256",x,"hex"),bytes:x.byteLength}}function i(m){return e("cfg",m)}function q(m){return`${M(m,2)}
10
+ `}async function Ze(m,g){let b=`${g}.tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`;try{await Bun.write(b,m),await tt(b,g)}catch(x){throw await rt(b,{force:!0}),x}}async function u(m,g){await Ze(q(m),g)}class A extends Error{code;path;schemaVersion;constructor(m,g,b={}){super(g);this.name="OstiaDocumentError",this.code=m,this.path=b.path,this.schemaVersion=b.schemaVersion}}async function a(m){let g=await Bun.file(m).text(),b;try{b=JSON.parse(g)}catch(P){let F=T(P);throw new A("invalid-json",`${m}: invalid JSON (${F})`,{path:m})}let x=b!==null&&typeof b==="object"?b.schemaVersion:void 0;if(typeof x!=="number")throw new A("not-a-document",`${m}: not a ProfileDocument (missing schemaVersion)`,{path:m});if(x!==2)throw new A("unsupported-schema",`${m}: unsupported ProfileDocument schemaVersion ${x} (this ostia reads 2)`,{path:m,schemaVersion:x});return at(b,m),ut(ct(b))}var En=(m)=>typeof m==="object"&&m!==null&&!Array.isArray(m);function at(m,g){let b=(x)=>new A("not-a-document",`${g}: malformed document: ${x}`,{path:g});if(!Array.isArray(m.workloads))throw b('"workloads" must be an array');if(!Array.isArray(m.measurements))throw b('"measurements" must be an array');m.workloads.forEach((x,P)=>{if(!En(x)||typeof x.id!=="string")throw b(`workloads[${P}] must be an object with a string "id"`)}),m.measurements.forEach((x,P)=>{if(!En(x)||typeof x.id!=="string"||typeof x.workloadId!=="string"||typeof x.phase!=="string")throw b(`measurements[${P}] must be an object with string "id", "workloadId" and "phase"`);for(let F of["trials","warnings","artifacts"])if(!Array.isArray(x[F]))throw b(`measurements[${P}].${F} must be an array`)})}function ut(m){let g=(b)=>{if(b.ratioP25!==void 0||b.p25===void 0)return;b.ratioP25=b.p25,b.ratioP75=b.p75,delete b.p25,delete b.p75};for(let b of m.measurements){if(!b.paired)continue;g(b.paired);for(let x of b.paired.repeats??[])g(x)}return m}function ct(m){for(let g of m.measurements){let b=g.timing;if(!b||b.mad!==void 0||b.samples.length===0)continue;g.timing={...c(b.samples),...b.batch!==void 0&&{batch:b.batch}}}return m}function Y(m,g,b){return`${n(m,b)}\u2026${n(g,b)}`}function xe(m){return(m/1e6).toFixed(3)}function d(m){return(m/1000).toFixed(2)}function R(m){if(m<1024)return`${m.toFixed(0)}B`;if(m<1048576)return`${(m/1024).toFixed(2)}KiB`;return`${(m/1048576).toFixed(2)}MiB`}function I(m){return m?.name||"(anonymous)"}function Te(m,g){let b=m.totals.reduce((x,P)=>x+P.selfUs,0)||1;return m.totals.slice(0,g).map((x)=>({frame:m.frames[x.frameIx],selfUs:x.selfUs,totalUs:x.totalUs,pct:(x.selfUs/b*100).toFixed(1)}))}function Me(m){return`${m.objectCount??"?"} objects, ${R(m.heapSizeBytes??0)}`}function Re(m){return`${m.cpuModel} \xB7 ${m.cores} cores \xB7 load ${m.loadAvg1.toFixed(1)} \xB7 noise floor ${m.noise.floorPct.toFixed(1)}%`}function _(m){return`${m.sha} (${m.branch}${m.dirty?", dirty":""})`}function k(m){return m.label??m.command?.join(" ")??m.entry?.task??m.id}function s(m,g){return m?k(m):g}function Se(m,g){if(m===1)return g?"1.00\xD7 (baseline)":"1.00\xD7";if(m>1)return`${m.toFixed(2)}\xD7 slower`;return`${(1/m).toFixed(2)}\xD7 faster`}function pn(m){return m.replace(/\|/g,"\\|").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/`/g,"\\`").replace(/\r\n|\r|\n/g,"<br>")}function Z(m){let g=[],b=[];for(let x of m.trials){if(x.timedOut||x.timeSourceNoMatch)continue;if(x.userNs===void 0||x.systemNs===void 0)continue;g.push(x.userNs),b.push(x.systemNs)}if(g.length===0)return;return{userNs:o(w(g),0.5),systemNs:o(w(b),0.5)}}function ve(m){return`${n(m.userNs)}/${n(m.systemNs)}`}function r(m){let g=m.toFixed(1);if(Number(g)===0)return"0.0%";return`${m>0?"+":""}${g}%`}import{statSync as ft}from"fs";import{rm as gt}from"fs/promises";import{isAbsolute as bt}from"path";import un from"os";var mt=200,Fn=64,lt=(()=>{let m=new Uint8Array(4096);for(let g=0;g<m.length;g++)m[g]=g*2654435761&255;return m})();function pt(m,g){let b=g;for(let x=0;x<m.length;x++)b^=m[x],b=Math.imul(b,16777619);return b>>>0}function dt(m){let g=c(m);return{floorPct:g.median===0?0:g.mad/g.median*100,referenceMedianNs:g.median,samples:m.length}}function An(m=mt){let g=m*1e6,b=[],x=0,P=Bun.nanoseconds();while(Bun.nanoseconds()-P<g){let F=Bun.nanoseconds();for(let O=0;O<Fn;O++)x^=pt(lt,O);b.push((Bun.nanoseconds()-F)/Fn)}return dt(b)}var $n=0.75;function ke(){let[m=0,g=0]=un.loadavg();return{cpuModel:un.cpus()[0]?.model??"unknown",cores:un.availableParallelism(),loadAvg1:m,loadAvg5:g,noise:An()}}function Pe(m){if(m.loadAvg1<=m.cores*$n)return;return{code:"noisy-machine",message:`Load average ${m.loadAvg1.toFixed(2)} exceeds ${$n*100}% of ${m.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:m.loadAvg1,cores:m.cores}}}function S(m,g){return bt(g)?g:`${m}/${g}`}class In extends l{}function $e(m,g){if(!ft(g,{throwIfNoEntry:!1})?.isFile())throw new In(`Suite not found: ${m}`)}function Ce(m,g){return`${m}/${g}-tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`}function p(m){return o(Float64Array.from(m).sort(),0.5)}function h(m){return gt(m,{recursive:!0,force:!0})}async function Xe(m){return await Bun.file(m).exists()?a(m):void 0}var ce=3,ht=16777216;function Oe(m){let g=p(m.map((x)=>x.peakBytes)),b=Math.max(...m.map((x)=>x.slackBytes));if(b<ht||b<=g/4)return;return{code:"peak-hidden",message:`Before the call, earlier work in the process had freed up to ${R(b)} the allocator still held (module-scope setup or before hooks that allocate), which the call could reuse without RSS rising: this reading can be low by up to that much. Skip that work when process.env.OSTIA_PEAK_MEM is set.`,data:{slackBytes:b,processes:m.length}}}function v(m){let g=m===!1?void 0:ke();return{environment:g,noiseWarning:g&&Pe(g)}}function Ae(m,g,b){let x=m[0],P=m[m.length-1];if(!x||!P)return;if(g)x.warnings.push(g);if(b)P.warnings.push({code:"aborted",message:b})}async function Ie(m,g){let b=Ke(g.timeoutMs,g.signal),x=Bun.spawn(m,{cwd:g.cwd,...g.env&&{env:{...process.env,...g.env}},stdout:"inherit",stderr:"inherit",stdin:"ignore",...g.ipc&&{ipc:g.ipc},...b.spawn});g.inFlight?.add(x);let P;try{P=await x.exited}finally{g.inFlight?.delete(x)}if(g.signal?.aborted)return!1;if(b.timedOut())throw Error(`${g.label} timed out after ${g.timeoutMs}ms: ${g.name}`);if(P!==0){let F=g.errorFile&&Bun.file(g.errorFile);throw Error(F&&await F.exists()?`${g.label} failed: ${g.name}: ${await F.text()}`:`${g.label} failed: ${g.name} (runner exited ${P})`)}return!0}var bn=[],pe,Ge;function cn(m,g,b,x){let P=pe,F=P?`${P.path}/${m}`:m;pe={path:F,chain:[...P?.chain??[],{path:F,before:b?.before,after:b?.after}],description:b?.description??P?.description,isolate:b?.isolate??P?.isolate,gc:b?.gc??P?.gc,cpu:b?.cpu??P?.cpu,alloc:b?.alloc??P?.alloc,peakMem:b?.peakMem??P?.peakMem,skip:x.skip||P?.skip,only:x.only||P?.only};try{g()}finally{pe=P}}var kn=Object.assign((m,g,b)=>cn(m,g,b,{}),{skip:(m,g,b)=>cn(m,g,b,{skip:!0}),only:(m,g,b)=>cn(m,g,b,{only:!0})});function gn(m,g,b,x){let P=Ge!==void 0||b?.params!==void 0?{...Ge,...b?.params}:void 0;bn.push({groupName:pe?.path,groupChain:pe?.chain,groupDescription:pe?.description,groupIsolate:pe?.isolate,groupGc:pe?.gc,groupCpu:pe?.cpu,groupAlloc:pe?.alloc,groupPeakMem:pe?.peakMem,name:m,fn:g,baseline:b?.baseline,params:P,skipped:x.skip||pe?.skip,only:x.only||pe?.only,opts:b})}var Pn=Object.assign((m,g,b)=>gn(m,g,b,{}),{skip:(m,g,b)=>gn(m,g,b,{skip:!0}),only:(m,g,b)=>gn(m,g,b,{only:!0})});function E(){return bn}function ue(){bn.length=0,pe=void 0,Ge=void 0}function fn(m,g){let b=Ge;Ge=m;try{return g()}finally{Ge=b}}function L(m){return m.groupName?`${m.groupName}/${m.name}`:m.name}function Qe(m,g){return m.opts?.isolate??m.groupIsolate??g}function On(m,g){return m.opts?.gc??m.groupGc??g}function Bn(m,g){return m.opts?.cpu??m.groupCpu??g}function Ue(m,g){return m.opts?.alloc??m.groupAlloc??g}function me(m,g){return m.opts?.peakMem??m.groupPeakMem??g}function _e(m){let g=new Map,b=new Map;return m.forEach((x,P)=>{if(x.skipped)return;for(let{path:F}of x.groupChain??[]){if(!g.has(F))g.set(F,P);b.set(F,P)}}),(x)=>{let P=(m[x].groupChain??[]).map((F)=>F.path);return{enter:P.filter((F)=>g.get(F)===x),leave:P.filter((F)=>b.get(F)===x).reverse()}}}async function f(m,g,b){let x=m.groupChain??[],P=b??(g==="before"?x:[...x].reverse()).map((F)=>F.path);for(let F of P)await x.find((O)=>O.path===F)?.[g]?.()}function en(m,g){if(!g)return[...m];let b=new RegExp(g);return m.filter((x)=>b.test(L(x)))}function N(m,g,b,x=!0){let P=m.filter((G)=>G.only),F=P.length>0?P:m;if(x&&P.length>0)process.stderr.write(`bench: ${P.length} task(s) selected by .only
11
+ `);let O=en(F,g);if(O.length===0)throw Error(`filter ${JSON.stringify(g)} matched zero of ${F.length} registered task(s) in ${b}.`);return O}import{heapStats as Cn}from"bun:jsc";function W(m){return m!==null&&typeof m==="object"&&typeof m.then==="function"}var kt=(async()=>{}).constructor,wt=0,Un=256;function Ee(m,g){let b=`/* ostia task loop ${wt++} */
12
+ const t0 = Bun.nanoseconds()
13
+ for (let b = 0; b < n; b++) sink[b & ${Un-1}] = ${g?"await ":""}fn()
14
+ return Bun.nanoseconds() - t0`,x=(g?kt:Function)("fn","sink","n",b),P=Array(Un);return(F)=>x(m,P,F)}async function Ne(m){let g=Bun.nanoseconds(),b=m(),x=W(b),P=x?await b:b;return{isAsync:x,result:P,ns:Math.max(1,Bun.nanoseconds()-g)}}var yt=100,xt=1000;async function le(m,g=yt,b=xt){let x=Bun.nanoseconds();Bun.gc(!0);let P=Cn().heapSize,F=Bun.nanoseconds()+b*1e6,O=0;while(O<g&&(O===0||Bun.nanoseconds()<F)){let H=m();if(W(H))await H;O++}Bun.gc(!0);let G=Cn().heapSize,C=Bun.nanoseconds()-x;return{memory:{origin:"heapStats",kind:"retained",bytesPerOp:Math.max(0,(G-P)/O)},calls:O,diagnosticWallNs:C}}var Tt=500,St=20,_n=3,Mt=10,Rt=2,vt=0.1,Pt=1000,Wn=1e4,Et=2*Wn,Nt=1e6,Ft=5;function Ln(m){let g=Math.log10(Math.max(1,m)/1e6),b=Math.round(_n+Rt*g);return Math.min(Mt,Math.max(_n,b))}function At(m,g){let b=Math.floor(g/m);return Math.min(St,Math.max(b,Ln(m)))}var $t;function xn(m){$t=m}function Dn(m,g){return Math.max(1,Math.ceil(Pt/m),Math.ceil(g/(m*Wn)))}function It(m){let g=[...m].sort((b,x)=>b-x);return g[g.length>>1]}async function Gn(m,g={}){let b=(g.budgetMs??Tt)*1e6,x=b*(g.warmup??vt),P=await Ne(m),F=P.ns,O=Ee(m,P.isAsync),G=Bun.nanoseconds(),C=1;while(Bun.nanoseconds()-G<x){let z=await O(C);if(F=Math.max(1,z/C),z<Nt)C*=2}let H=Dn(F,b);if(H>1){let z=[];for(let J=0;J<Ft;J++)z.push(await O(H)/H);F=Math.max(1,It(z)),H=Dn(F,b)}let j=F*H,ne=g.samples??g.minSamples??At(j,b),oe=g.samples!==void 0?0:b,fe=g.samples??Math.max(Et,ne),Q=[],te=Bun.nanoseconds(),ee=0,re=0;while(re<ne||ee<oe&&re<fe){let z=await O(H);if(Q.push({i:re,wallNs:z/H}),re++,ee=Bun.nanoseconds()-te,g.gc)Bun.gc(!0)}let ge=c(Q.map((z)=>z.wallNs));if(H>1)ge.batch=H;let je=ye(ge,[],"inprocess"),V=Ln(j);if(Q.length<V)je.push({code:"low-sample-count",message:`Only ${Q.length} sample(s) at ~${n(j)} per trial; ${V} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:Q.length,target:V,trialCostNs:j}});return{trials:Q,timing:ge,warnings:je}}import{profile as Bt}from"bun:jsc";var We=1000;function De(){let m=new Map,g=[];return{frames:g,intern(b,x,P,F){let O=m.get(b);if(O===void 0)O=new Map,m.set(b,O);let G=x??"",C=O.get(G);if(C===void 0)C=g.length,O.set(G,C),g.push({key:e("fr",b,G),name:b,url:x,line:P,col:F});return C}}}function Fe(m,g,b,x,P){let F=m.get(g);if(F)F.selfUs+=b,F.totalUs+=x,F.samples+=P;else m.set(g,{frameIx:g,selfUs:b,totalUs:x,samples:P})}function Be(m){return[...m.values()].sort((g,b)=>b.selfUs-g.selfUs)}var Ot=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),jn=4294967295;function Hn(m,g){let b=g??m.interval*1e6,{frames:x,intern:P}=De();function F(V){let z=V.line===jn,J=z?void 0:V.line-1,se=z||V.column===jn?void 0:V.column-1;return P(V.name,V.sourceURL,J,se)}let O=[];function G(V){let z={id:O.length,frameIx:V,children:new Map,selfUs:0,samples:0,totalUs:0};return O.push(z),z}let C=G(P("(root)",void 0,void 0,void 0)),H={llint:0,baseline:0,dfg:0,ftl:0},j=new Map,ne=[],oe=[];for(let V of m.traces){let z=V.frames,J=C;for(let he=z.length-1;he>=0;he--){let qe=F(z[he]),Ve=J.children.get(qe);if(!Ve)Ve=G(qe),J.children.set(qe,Ve);J=Ve}J.selfUs+=b,J.samples+=1,ne.push(J.id),oe.push(b);let se=z[0],Je=se&&Ot.get(se.category);if(Je){H[Je]++;let he=j.get(Je)??new Map;he.set(J.frameIx,(he.get(J.frameIx)??0)+1),j.set(Je,he)}}function fe(V){let z=V.selfUs;for(let J of V.children.values())z+=fe(J);return V.totalUs=z,z}fe(C);let Q=new Map;function te(V){Fe(Q,V.frameIx,V.selfUs,V.totalUs,V.samples);for(let z of V.children.values())te(z)}te(C);let ee=O.map((V)=>({id:V.id,frameIx:V.frameIx,children:[...V.children.values()].map((z)=>z.id)})),re={origin:"jsc-profile",samplingIntervalUs:b,frames:x,nodes:ee,totals:Be(Q),samples:{nodeIds:ne,timeDeltasUs:oe}},ge=[...j.entries()].flatMap(([V,z])=>[...z.entries()].sort((J,se)=>se[1]-J[1]).slice(0,3).map(([J,se])=>({tier:V,frameKey:x[J].key,samples:se})));return{cpu:re,jit:{origin:"jsc-profile",tiers:H,topFramesByTier:ge}}}async function Le(m,g={}){let b=g.intervalUs??We,x,P=Bun.nanoseconds(),F=await Bt(async()=>(x=await m(),x),b),O=Bun.nanoseconds()-P,{cpu:G,jit:C}=Hn(F.stackTraces,b);return{result:x,cpu:G,jit:C,diagnosticWallNs:O}}function X(m){return m.samples?.nodeIds.length??m.totals.reduce((g,b)=>g+b.samples,0)}var hn=100,ze=2000,Ut=2,Ct=200,_t=1e4,Dt=ze/2,Wt=20;function Lt(m){let g=ze*Ut*m/1000;return Math.min(_t,Math.max(Ct,g))}async function Jn(m,g={}){let b=g.intervalUs??hn,x=Lt(b)*1e6,P=async()=>{let H=Bun.nanoseconds();do{let j=m();if(W(j))await j}while(Bun.nanoseconds()-H<x)},{cpu:F,jit:O,diagnosticWallNs:G}=await Le(P,{intervalUs:b}),C=[Gt(F),jt(O)].filter((H)=>H!==void 0);return{cpu:F,jit:O,diagnosticWallNs:G,warnings:C}}function Gt(m){let g=X(m);if(g>=Dt)return;return{code:"low-sample-count",message:`Only ${g} CPU sample(s) at ${m.samplingIntervalUs}\xB5s (target ${ze}); frame shares this thin move several points between runs. Lower --cpu-interval for more.`,data:{samples:g,target:ze,intervalUs:m.samplingIntervalUs}}}function jt(m){let{llint:g,baseline:b,dfg:x,ftl:P}=m.tiers,F=g+b+x+P;if(F===0)return;let O=g/F*100,G=b/F*100,C=x/F*100,H=P/F*100;if(O+G<=Wt)return;return{code:"jit-cold",message:`${(O+G).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:O,baselinePct:G,dfgPct:C,ftlPct:H}}}function D(m,g,b){let x=L(g);return Nn(m,x,{label:x,baseline:g.baseline,group:g.groupName,description:g.opts?.description,groupDescription:g.groupDescription,isolated:b,params:g.params,skipped:g.skipped})}async function de(m,g,b){let x=g.some((H)=>!H.skipped),{environment:P,noiseWarning:F}=v(x?b.noiseCheck:!1),O=_e(g),G=[],C=[];for(let H=0;H<g.length;H++){let j=g[H],ne=D(m,j,b.markIsolated);if(G.push(ne),j.skipped)continue;let{enter:oe,leave:fe}=O(H);if(await f(j,"before",oe),j.opts?.before)await j.opts.before();let Q={budgetMs:j.opts?.budgetMs??b.budgetMs,samples:j.opts?.samples??b.samples,minSamples:j.opts?.minSamples??b.minSamples,warmup:b.warmup,gc:On(j,b.gc??!1)},te=await Gn(j.fn,Q);if(C.push(U({workload:ne,configFingerprint:i({budgetMs:Q.budgetMs??null,samples:Q.samples??null,minSamples:Q.minSamples??null,gc:Q.gc??!1}),trials:te.trials,timing:te.timing,warnings:F&&C.length===0?[...te.warnings,F]:te.warnings})),Bn(j,b.cpu??!1)){let ee=b.cpuIntervalUs??hn,re=await Jn(j.fn,{intervalUs:ee});C.push(y({workload:ne,phase:"cpu",configFingerprint:i({cpu:!0,intervalUs:ee}),diagnosticWallNs:re.diagnosticWallNs,cpu:re.cpu,jit:re.jit,warnings:re.warnings,artifacts:[]}))}if(Ue(j,b.alloc??!1)){let ee=await le(j.fn);C.push(y({workload:ne,phase:"memstats",configFingerprint:i({alloc:!0}),diagnosticWallNs:ee.diagnosticWallNs,memory:ee.memory,warnings:[],artifacts:[]}))}if(j.opts?.after)await j.opts.after();await f(j,"after",fe)}return t(G,C,P)}
15
+ export{T,l,be,mn,we,K,B,n,c,w,o,ye,ie,M,e,t,ae,ln,U,y,Ye,dn,i,q,Ze,u,A,a,ke,Pe,Y,xe,d,R,I,Te,Me,Re,_,k,s,Se,pn,Z,ve,r,S,$e,Ce,p,h,Xe,ce,Oe,v,Ae,Ie,W,Ee,Ne,De,Fe,Be,kn,Pn,E,ue,fn,L,Qe,Ue,me,_e,f,en,N,X,le,We,Le,xn,D,de};