ostia 0.2.9 → 0.2.11

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
@@ -5,7 +5,7 @@ ostia is a profiling and benchmarking toolkit for Bun. It times subprocess comma
5
5
  profiles, heap snapshots, JIT tiers, retained heap and peak memory, and writes everything
6
6
  to one schema-versioned JSON document (`ProfileDocument`). Two documents compare with a
7
7
  bootstrap confidence interval and a Mann-Whitney test, with the regression threshold
8
- widened to the machine's measured noise floor. `ostia ab` pairs the working tree against
8
+ widened by the machine's measured noise and drift. `ostia ab` pairs the working tree against
9
9
  a git ref in one process, which holds up on machines too noisy for that. `ostia ci` gates
10
10
  a config file of workloads against a saved baseline, and `--format minimal` gives scripts
11
11
  and LLM agents a compact JSON line protocol. The CLI is a thin wrapper over the library, so anything
@@ -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
  ```
@@ -122,7 +122,7 @@ ostia ci # on your change: exit 1 on a regression
122
122
  Profile CI: ✗
123
123
  ...
124
124
  ✗ work
125
- timing: +44.1% median, 95% CI [+41.4%, +45.6%], p<0.001 (regressed)
125
+ timing: 14.57 ms -> 21.00 ms, +44.1% median, 95% CI [+41.4%, +45.6%], p<0.001 (regressed)
126
126
  ```
127
127
 
128
128
  Scratch output (cache, artifacts) goes to `node_modules/.cache/ostia`. Baselines go to
@@ -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
 
@@ -257,9 +271,13 @@ ostia compare before.json after.json --format markdown
257
271
 
258
272
  ```
259
273
  ✗ bun fixtures/work.ts
260
- timing: +23.8% median, 95% CI [+18.3%, +30.1%], p<0.001 (regressed)
274
+ timing: 31.2 ms -> 38.6 ms, +23.8% median, 95% CI [+18.3%, +30.1%], p<0.001 (regressed)
261
275
  ```
262
276
 
277
+ `--format json` adds a flat `compared` array, one row per task, for scripts. A task on only
278
+ one side is listed under "Not compared"; a renamed suite task still compares when it lists
279
+ its old name in `aliases`.
280
+
263
281
  A regression needs the whole 95% CI above the threshold and a Mann-Whitney p-value below
264
282
  `alpha` (default 0.01). Thresholds come from the config file when one exists, otherwise
265
283
  the defaults (`timingPct: 5`). The bootstrap is seeded from the samples, so the same two
@@ -386,8 +404,8 @@ export default defineConfig({
386
404
  })
387
405
  ```
388
406
 
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).
407
+ A config with a wrong-typed value, or the old `runs` field, fails to load with a message
408
+ naming the key (error code `config-invalid`). All fields: [docs/config.md](docs/config.md).
391
409
 
392
410
  ## Documentation
393
411
 
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,S,r,Xe,i,u,f,D,ue,F,_e,We,de,Le,g,tn,B,le,U}from"./chunk-5m601yfv.js";import{H,G,ne}from"./chunk-dvqggjkn.js";import{y,se,un,ie}from"./chunk-fc36fd0b.js";function E(e,l=F(e)){return`${l}\x00${S(e.params??null)}`}function _(e){return[F(e),..._e(e)].map((l)=>E(e,l))}async function q(e){return ue(),await import(e),[...D()]}var X=5;function O(e){return(e instanceof Error?e.message:String(e)).split(`
4
+ `).slice(0,X).join(`
5
+ `)}async function N(e,l,m){if(process.stderr.write(`ab runner: ${l}
6
+ `),await Bun.write(`${e}.error`,l),m)await Bun.write(`${e}.side`,m);return 2}async function Y(e,l,m,P){let t={base:e,cand:l},d=new Map,w=(a,k)=>{if(!d.has(a))d.set(a,k)},h=new Set;for(let a of P)try{await t[a].opts?.before?.(),h.add(a)}catch(k){w(a,k)}let T,o;if(h.size===2)try{T=await un(e.fn,l.fn,{rounds:m,candFirst:P[0]==="cand"})}catch(a){if(a instanceof se)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 t[a].fn()}catch(k){w(a,k)}}for(let a of P.toReversed()){if(!h.has(a))continue;try{await t[a].opts?.after?.()}catch(k){w(a,k)}}if(o)throw o.err;let p=d.get("base"),A=d.get("cand");if(d.size===2)return{threw:{side:"both",message:`base: ${O(p)}
7
+ candidate: ${O(A)}`}};if(d.has("base"))return{threw:{side:"base",message:O(p)}};if(d.has("cand"))return{threw:{side:"cand",message:O(A)}};return{result:T}}async function Z(e,l,m,P,t){let{workloadId:d,side:w}=P,h=P.peakMem?await G():void 0;await import("./index.js");let T=H(),o;try{for(let p of t)await import(p);o=(await q(e)).find((p)=>U(l,p).id===d)}catch(p){return N(m,`the ${y(w)} side failed to load ${e}: ${O(p)}`,w)}if(!o)return N(m,`no task with workload id ${d} in ${e}.`);try{let p={};if(await g(o,"before"),await o.opts?.before?.(),h)p.peak=await ne(o.fn,T,h);if(P.alloc){await le(o.fn);let{memory:A,calls:a}=await le(o.fn);p.alloc={bytesPerOp:A.bytesPerOp,calls:a}}return await o.opts?.after?.(),await g(o,"after"),await Bun.write(m,JSON.stringify(p)),0}catch(p){return N(m,`${F(o)} threw on the ${y(w)} side while measuring memory: ${O(p)}`,w)}}async function ee(){let[e,l,m,P]=process.argv.slice(2);if(!e||l===void 0||!m||!P)return process.stderr.write(`ab runner: usage: ab-runner.ts <candSuite> <baseSuite|''> <outputPath> <optsJson>
8
+ `),2;let t=JSON.parse(P);if(t.memoryFor)return Z(t.memoryFor.side==="base"?l:e,e,m,t.memoryFor,t.preload??[]);for(let s of t.preload??[])await import(s);let d=t.candFirst?["cand","base"]:["base","cand"],w=[],h=[];for(let s of d){let n=s==="base"?l:e;if(!n)continue;try{let R=await q(n);if(s==="base")w=R;else h=R}catch(R){return N(m,`the ${y(s)} side failed to load ${n}: ${O(R)}`,s)}}if(h.length===0)return N(m,`${e} registered no tasks (no task() calls found).`,"cand");let T;try{T=B(h,t.filter,e,!t.workloadIds)}catch(s){return N(m,s.message)}let o=t.workloadIds&&new Set(t.workloadIds),p=new Map(w.map((s)=>[E(s),s])),A=new Set(h.flatMap(_)),a=[],k=[],v=[];for(let s of T){let n=U(e,s);if(o&&!o.has(n.id))continue;if(a.push(n),s.skipped)continue;let R=_(s).map((M)=>p.get(M)).find((M)=>M!==void 0);if(R&&!R.skipped)k.push({workload:n,base:R,cand:s});else v.push(n.id)}let W=[];if(!o&&!h.some((s)=>s.only))for(let s of tn(w,t.filter)){if(s.skipped||A.has(E(s)))continue;let n=U(e,s);a.push(n),W.push(n.id)}let C=Le(k.map((s)=>s.cand));if(t.planPath){let s={memory:k.map((n)=>({workloadId:n.workload.id,alloc:We(n.cand,t.alloc??!1),peakMem:de(n.cand,t.peakMem??!1)})).filter((n)=>n.alloc||n.peakMem)};await Bun.write(t.planPath,JSON.stringify(s))}let J=i({rounds:t.rounds,thresholdPct:t.thresholdPct}),I=[];for(let s=0;s<k.length;s++){let{workload:n,base:R,cand:M}=k[s],{enter:Q,leave:V}=C(s);if(t.progress)process.send?.({task:s+1,tasks:k.length,label:F(M)});let z={base:R,cand:M};for(let b of d)await g(z[b],"before",Q);let x=await Y(R,M,t.rounds,d);if("threw"in x)I.push(Xe({workload:n,configFingerprint:J,threw:x.threw,diagnosticWallNs:0,warnings:[]}));else{let{result:b}=x,L=ie(b.ratios,t.thresholdPct),j=c(b.candSamples);if(b.batch>1)j.batch=b.batch;I.push(Xe({workload:n,configFingerprint:J,timing:j,diagnosticWallNs:b.diagnosticWallNs,warnings:[],paired:{rounds:b.rounds,batch:b.batch,baseSamples:b.baseSamples,baseMedianNs:f(b.baseSamples),ratios:b.ratios,...L,verdict:L.flagged??"unchanged",sameOutput:b.sameOutput}}))}for(let b of d.toReversed())await g(z[b],"after",V)}let K=r(a,I);return K.unmatched={baseOnly:W,candOnly:v},await u(K,m),0}ee().then((e)=>process.exit(e));
@@ -0,0 +1,15 @@
1
+ // @bun
2
+ import{statSync as ht}from"fs";import{rm as kt}from"fs/promises";import{isAbsolute as yt}from"path";function T(d){return d instanceof Error?d.message:String(d)}class l extends Error{}import{rename as it,rm as st}from"fs/promises";import{isAbsolute as at,relative as ut}from"path";class on extends Error{}var Rn=new WeakMap;function vn(d){if(typeof d.pattern!=="string")return d.pattern;let h=Rn.get(d);if(!h)h=new RegExp(d.pattern),Rn.set(d,h);return h}function we(d){let h=vn(d);if(/[gyd]/.test(h.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 qe(d,h){let y=d!==void 0?AbortSignal.timeout(d):void 0,x=y&&h?AbortSignal.any([y,h]):y??h;return{spawn:x?{signal:x,killSignal:"SIGKILL"}:{},timedOut:()=>y?.aborted??!1}}async function ln(d){let h=d.timeSource!==void 0,y=Bun.nanoseconds(),x=qe(d.timeoutMs,d.signal),M=Bun.spawn(d.argv,{cwd:d.cwd,env:d.env,stdout:h?"pipe":"ignore",stderr:h?"pipe":"ignore",stdin:"ignore",...x.spawn}),A=h?Promise.all([new Response(M.stdout).text(),new Response(M.stderr).text()]):void 0,I=await M.exited,G=Bun.nanoseconds(),_=M.resourceUsage?.(),J=x.timedOut(),H={wallNs:G-y,exitCode:J?null:I,userNs:_?Number(_.cpuTime.user)*1000:void 0,systemNs:_?Number(_.cpuTime.system)*1000:void 0,maxRssBytes:_?.maxRSS,...J&&{timedOut:!0}};if(A){let[ne,oe]=await A;if(d.timeSource&&!J)try{H.reportedNs=Yn(d.timeSource,ne,oe,d.argv)}catch(be){if(!(be instanceof on))throw be;H.timeSourceNoMatch=!0,H.timeSourceMissOutput=Zn(ne,oe)}}return H}function Yn(d,h,y,x=[]){let M=vn(d),A=d.group??1,I=M.exec(h)??M.exec(y),G=x.length>0?` for "${x.join(" ")}"`:"";if(!I)throw new on(`timeSource pattern ${M} did not match the output${G}. Output was:
3
+ ${Pn(h,y)}`);let _=I[A];if(_===void 0)throw Error(`timeSource pattern ${M} matched${G} but has no capture group ${A} (matched text: "${I[0]}").`);let J=Number(_);if(!Number.isFinite(J))throw Error(`timeSource pattern ${M} group ${A} captured "${_}"${G}, which is not a number.`);return J*qn[d.unit??"ms"]}function Pn(d,h){let x=(A)=>A.length>800?`${A.slice(0,800)}\u2026(${A.length-800} more)`:A,M=[];if(d.trim())M.push(`--- stdout ---
4
+ ${x(d.trimEnd())}`);if(h.trim())M.push(`--- stderr ---
5
+ ${x(h.trimEnd())}`);return M.length>0?M.join(`
6
+ `):"(empty)"}var rn=2048;function Zn(d,h){let y=Pn(d,h);if(Buffer.byteLength(y,"utf8")<=rn)return y;let x=y.slice(0,rn);while(Buffer.byteLength(x,"utf8")>rn)x=x.slice(0,-1);return`${x}\u2026`}var Xn=1048576;async function Qn(d,h=Xn){let y=Math.floor(h/2),x=d.getReader(),M=[],A=0,I=[],G=0,_=0;try{for(;;){let{done:be,value:ee}=await x.read();if(be)break;if(!ee||ee.byteLength===0)continue;_+=ee.byteLength;let re=ee;if(A<y){let te=y-A;if(re.byteLength<=te){M.push(re),A+=re.byteLength;continue}M.push(re.subarray(0,te)),A+=te,re=re.subarray(te)}I.push(re),G+=re.byteLength;while(G>y&&I.length>0){let te=I[0],se=G-y;if(te.byteLength<=se)I.shift(),G-=te.byteLength;else I[0]=te.subarray(se),G-=se}}}finally{x.releaseLock()}let J=new TextDecoder,H=J.decode(Buffer.concat(M));if(_<=A+G)return H;let ne=J.decode(Buffer.concat(I)),oe=_-A-G;return`${H}
7
+ \u2026(${oe} bytes elided)\u2026
8
+ ${ne}`}async function ye(d,h,y){if(typeof d==="function"){await d(h);return}let x=sn(d),M=qe(y.timeoutMs,y.signal),A=Bun.spawn(x,{cwd:y.cwd,env:y.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...M.spawn}),I=Qn(A.stderr).catch(()=>""),G=await A.exited,_=M.timedOut();if(!_&&y.signal?.aborted)return;if(!_&&G===0)return;let J=_?`timed out after ${y.timeoutMs}ms`:`exited with code ${G}`,H=(await I).trim();throw Error(`prepare command "${x.join(" ")}" ${J} before ${h.phase} trial ${h.index}.${H?`
9
+ ${H}`:""}`)}function sn(d){if(d===void 0||typeof d==="function")return;return Array.isArray(d)?d:q(d)}function En(d){if(d===void 0)return;return{pattern:typeof d.pattern==="string"?d.pattern:d.pattern.source,...d.group!==void 0&&{group:d.group},...d.unit!==void 0&&{unit:d.unit}}}function q(d){return d.trim().split(/\s+/).filter(Boolean)}var et={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function R(d){let h=Math.abs(d);if(h>=1e9)return"s";if(h>=1e6)return"ms";if(h>=1000)return"\xB5s";return"ns"}function nt(d){let h=Math.floor(Math.log10(Math.max(Math.abs(d),1)))+1;return Math.max(1,3-h)}function e(d,h=R(d)){let y=d/et[h];return`${y.toFixed(nt(y))} ${h}`}function c(d){if(d.length===0)throw Error("computeTimingStats: samples must be non-empty");let h=d.length,y=k(d),x=0;for(let V=0;V<h;V++)x+=d[V];let M=x/h,A=o(y,0.5),I=0;for(let V=0;V<h;V++){let ie=d[V]-M;I+=ie*ie}let G=Math.sqrt(I/h),_=y[0],J=y[h-1],H=o(y,0.25),ne=o(y,0.75),oe=ne-H,be=H-1.5*oe,ee=ne+1.5*oe,re=H-3*oe,te=ne+3*oe,se=0,fe=0;for(let V=0;V<h;V++){let ie=d[V];if(ie<re||ie>te)fe++;else if(ie<be||ie>ee)se++}let he=o(y,0.99),K=new Float64Array(h);for(let V=0;V<h;V++)K[V]=Math.abs(d[V]-A);K.sort();let z=o(K,0.5);return{unit:"ns",samples:d,mean:M,median:A,stddev:G,min:_,max:J,outliers:{mild:se,severe:fe},p25:H,p75:ne,p99:he,mad:z}}function k(d){let h=new Float64Array(d.length);return h.set(d),h.sort(),h}function o(d,h){let y=d.length;if(y===1)return d[0];let x=h*(y-1),M=Math.floor(x),A=Math.ceil(x);if(M===A)return d[M];let I=x-M;return d[M]*(1-I)+d[A]*I}var tt=5000000;function ke(d,h,y="subprocess",x=[]){let M=[],A=d.samples[0];if(A!==void 0){let _=d.p75-d.p25;if(A>d.median+3*_&&A>2*d.median&&_>0)M.push({code:"slow-first-run",message:`First run took ${e(A)}, much slower than the median ${e(d.median)}. Consider more warmup.`,data:{firstNs:A,medianNs:d.median}})}if(y!=="inprocess"&&d.outliers.mild+d.outliers.severe>0)M.push({code:"outliers-detected",message:`${d.outliers.mild+d.outliers.severe} outlier(s) detected (${d.outliers.severe} severe, ${d.outliers.mild} mild).`,data:d.outliers});if(y==="subprocess"&&d.median<tt)M.push({code:"fast-command",message:`Median run time (${(d.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:d.median}});let I=new Set(x),G=h.filter((_)=>_!==void 0&&_!==0&&!I.has(_));if(G.length>0)M.push({code:"nonzero-exit",message:`${G.length} of ${h.length} trial(s) exited non-zero.`,data:{exitCodes:G}});return M}var Nn={name:"ostia",version:"0.2.11",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:"bun check","typecheck:package":"bun check -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 ae=Nn.version;function S(d,h){return JSON.stringify(an(d),null,h)}function an(d){if(Array.isArray(d))return d.some((y)=>y!==null&&typeof y==="object")?d.map(an):d;if(d!==null&&typeof d==="object"){let h=d,y={};for(let x of Object.keys(h).sort())y[x]=an(h[x]);return y}return d}function n(d,...h){let y=Bun.CryptoHasher.hash("sha256",S(h),"hex");return`${d}_${y.slice(0,16)}`}var Fn;function un(d){let h=Bun.spawnSync(["git",...d],{timeout:200,stdout:"pipe",stderr:"ignore"});return h.success?h.stdout.toString().trim():void 0}function ot(){try{let d=un(["rev-parse","--short","HEAD"]);if(d===void 0)return;return{sha:d,branch:un(["rev-parse","--abbrev-ref","HEAD"])??"HEAD",dirty:(un(["status","--porcelain"])?.length??0)>0}}catch{return}}function An(){return Fn??={git:ot()},Fn.git}function Ve(d){return Object.fromEntries(Object.entries(d).filter(([,h])=>h!==void 0))}function cn(d,h,y){return n("run",d,h,y,Bun.version,ae)}function r(d,h,y){let x=An();return{schemaVersion:2,toolVersion:ae,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:d,measurements:h,...Ve({environment:y,git:x})}}function me(d,h,y={}){if(y.timeSource)we(y.timeSource);let x=sn(y.prepare),M=En(y.timeSource),A=typeof y.prepare==="function"?y.prepare.toString():x;return{id:n("wl","subprocess",d,...A!==void 0||M!==void 0?[A??null,M??null]:[]),kind:"subprocess",command:d,label:h,...Ve({prepare:x,timeSource:M})}}function pn(d,h){return{id:h===void 0?n("wl","inprocess",d.name,d.toString()):n("wl","inprocess-named",h),kind:"inprocess",label:h}}function mn(d,h,y={}){let x=at(d)?ut(process.cwd(),d):d,M=y.params!==void 0?n("wl","inprocess-entry",x,h,y.params):n("wl","inprocess-entry",x,h),{group:A,...I}=y;return{id:M,kind:"inprocess",entry:{file:d,task:h,...Ve({group:A})},...Ve(I)}}function W(d){return{id:cn(d.workload.id,"timing",d.configFingerprint),workloadId:d.workload.id,phase:"timing",instrumented:!1,configFingerprint:d.configFingerprint,trials:d.trials,timing:d.timing,warnings:d.warnings,artifacts:[],memory:d.heapUsed?{origin:"heapStats",heapUsedBeforeBytes:d.heapUsed.beforeBytes,heapUsedAfterBytes:d.heapUsed.afterBytes}:ct(d.trials),...Ve({interleaved:d.interleaved})}}function ct(d){let h=d.map((y)=>y.maxRssBytes).filter((y)=>y!==void 0);if(h.length===0)return;return{origin:"resourceUsage",maxRssBytes:Math.max(...h)}}function P(d){return{id:cn(d.workload.id,d.phase,d.configFingerprint),workloadId:d.workload.id,phase:d.phase,instrumented:!0,configFingerprint:d.configFingerprint,trials:[{i:0,wallNs:d.diagnosticWallNs,exitCode:d.exitCode}],diagnosticWallNs:d.diagnosticWallNs,cpu:d.cpu,heap:d.heap,memory:d.memory,jit:d.jit,warnings:d.warnings,artifacts:d.artifacts}}function Xe(d){return{id:cn(d.workload.id,"paired",d.configFingerprint),workloadId:d.workload.id,phase:"paired",instrumented:!1,configFingerprint:d.configFingerprint,trials:[],..."threw"in d?{threw:d.threw}:{timing:d.timing,paired:d.paired},diagnosticWallNs:d.diagnosticWallNs,warnings:d.warnings,artifacts:[]}}async function fn(d,h,y){let x=await Bun.file(y).arrayBuffer();return{id:n("art",d,h,y),kind:h,path:y,sha256:Bun.CryptoHasher.hash("sha256",x,"hex"),bytes:x.byteLength}}function i(d){return n("cfg",d)}function Y(d){return`${S(d,2)}
10
+ `}async function Qe(d,h){let y=`${h}.tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`;try{await Bun.write(y,d),await it(y,h)}catch(x){throw await st(y,{force:!0}),x}}async function u(d,h){await Qe(Y(d),h)}class E extends Error{code;path;schemaVersion;constructor(d,h,y={}){super(h);this.name="OstiaDocumentError",this.code=d,this.path=y.path,this.schemaVersion=y.schemaVersion}}async function a(d){let h=await Bun.file(d).text(),y;try{y=JSON.parse(h)}catch(M){let A=T(M);throw new E("invalid-json",`${d}: invalid JSON (${A})`,{path:d})}let x=y!==null&&typeof y==="object"?y.schemaVersion:void 0;if(typeof x!=="number")throw new E("not-a-document",`${d}: not a ProfileDocument (missing schemaVersion)`,{path:d});if(x!==2)throw new E("unsupported-schema",`${d}: unsupported ProfileDocument schemaVersion ${x} (this ostia reads 2)`,{path:d,schemaVersion:x});return mt(y,d),lt(pt(y))}var In=(d)=>typeof d==="object"&&d!==null&&!Array.isArray(d);function mt(d,h){let y=(x)=>new E("not-a-document",`${h}: malformed document: ${x}`,{path:h});if(!Array.isArray(d.workloads))throw y('"workloads" must be an array');if(!Array.isArray(d.measurements))throw y('"measurements" must be an array');d.workloads.forEach((x,M)=>{if(!In(x)||typeof x.id!=="string")throw y(`workloads[${M}] must be an object with a string "id"`)}),d.measurements.forEach((x,M)=>{if(!In(x)||typeof x.id!=="string"||typeof x.workloadId!=="string"||typeof x.phase!=="string")throw y(`measurements[${M}] must be an object with string "id", "workloadId" and "phase"`);for(let A of["trials","warnings","artifacts"])if(!Array.isArray(x[A]))throw y(`measurements[${M}].${A} must be an array`)})}function lt(d){let h=(y)=>{if(y.ratioP25!==void 0||y.p25===void 0)return;y.ratioP25=y.p25,y.ratioP75=y.p75,delete y.p25,delete y.p75};for(let y of d.measurements){if(!y.paired)continue;h(y.paired);for(let x of y.paired.repeats??[])h(x)}return d}function pt(d){for(let h of d.measurements){let y=h.timing;if(!y||y.mad!==void 0||y.samples.length===0)continue;h.timing={...c(y.samples),...y.batch!==void 0&&{batch:y.batch}}}return d}import bn from"os";var dt=200,$n=64,ft=(()=>{let d=new Uint8Array(4096);for(let h=0;h<d.length;h++)d[h]=h*2654435761&255;return d})();function gt(d,h){let y=h;for(let x=0;x<d.length;x++)y^=d[x],y=Math.imul(y,16777619);return y>>>0}function bt(d){let h=c(d);return{floorPct:h.median===0?0:h.mad/h.median*100,referenceMedianNs:h.median,samples:d.length}}function dn(d=dt){let h=d*1e6,y=[],x=0,M=Bun.nanoseconds();while(Bun.nanoseconds()-M<h){let A=Bun.nanoseconds();for(let I=0;I<$n;I++)x^=gt(ft,I);y.push((Bun.nanoseconds()-A)/$n)}return bt(y)}var Bn=0.75;function Pe(){let[d=0,h=0]=bn.loadavg();return{cpuModel:bn.cpus()[0]?.model??"unknown",cores:bn.availableParallelism(),loadAvg1:d,loadAvg5:h,noise:dn()}}function v(d){if(!d)return;let h=d.noise.referenceMedianNs,y=dn().referenceMedianNs;d.noise.driftPct=h>0?(y/h-1)*100:0}function xe(d){if(d.loadAvg1<=d.cores*Bn)return;return{code:"noisy-machine",message:`Load average ${d.loadAvg1.toFixed(2)} exceeds ${Bn*100}% of ${d.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:d.loadAvg1,cores:d.cores}}}function Z(d,h,y){return`${e(d,y)}\u2026${e(h,y)}`}function Me(d){return(d/1e6).toFixed(3)}function p(d){return(d/1000).toFixed(2)}function b(d){if(d<1024)return`${d.toFixed(0)}B`;if(d<1048576)return`${(d/1024).toFixed(2)}KiB`;return`${(d/1048576).toFixed(2)}MiB`}function N(d){return d?.name||"(anonymous)"}function Te(d,h){let y=d.totals.reduce((x,M)=>x+M.selfUs,0)||1;return d.totals.slice(0,h).map((x)=>({frame:d.frames[x.frameIx],selfUs:x.selfUs,totalUs:x.totalUs,pct:(x.selfUs/y*100).toFixed(1)}))}function Re(d){return`${d.objectCount??"?"} objects, ${b(d.heapSizeBytes??0)}`}function Se(d){return`${d.cpuModel} \xB7 ${d.cores} cores \xB7 load ${d.loadAvg1.toFixed(1)} \xB7 noise floor ${d.noise.floorPct.toFixed(1)}%`}function L(d){return`${d.sha} (${d.branch}${d.dirty?", dirty":""})`}function m(d){return d.label??d.command?.join(" ")??d.entry?.task??d.id}function s(d,h){return d?m(d):h}function ve(d,h){if(d===1)return h?"1.00\xD7 (baseline)":"1.00\xD7";if(d>1)return`${d.toFixed(2)}\xD7 slower`;return`${(1/d).toFixed(2)}\xD7 faster`}function gn(d){return d.replace(/\|/g,"\\|").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/`/g,"\\`").replace(/\r\n|\r|\n/g,"<br>")}function X(d){let h=[],y=[];for(let x of d.trials){if(x.timedOut||x.timeSourceNoMatch)continue;if(x.userNs===void 0||x.systemNs===void 0)continue;h.push(x.userNs),y.push(x.systemNs)}if(h.length===0)return;return{userNs:o(k(h),0.5),systemNs:o(k(y),0.5)}}function Ce(d){return`${e(d.userNs)}/${e(d.systemNs)}`}function t(d){let h=d.toFixed(1);if(Number(h)===0)return"0.0%";return`${d>0?"+":""}${h}%`}function C(d,h){return yt(h)?h:`${d}/${h}`}class On extends l{}function $e(d,h){if(!ht(h,{throwIfNoEntry:!1})?.isFile())throw new On(`Suite not found: ${d}`)}function Oe(d,h){return`${d}/${h}-tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`}function f(d){return o(Float64Array.from(d).sort(),0.5)}function w(d){return kt(d,{recursive:!0,force:!0})}async function en(d){return await Bun.file(d).exists()?a(d):void 0}var ce=3,wt=16777216;function Ae(d){let h=f(d.map((x)=>x.peakBytes)),y=Math.max(...d.map((x)=>x.slackBytes));if(y<wt||y<=h/4)return;return{code:"peak-hidden",message:`Before the call, earlier work in the process had freed up to ${b(y)} 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:y,processes:d.length}}}function O(d){let h=d===!1?void 0:Pe();return{environment:h,noiseWarning:h&&xe(h)}}function Ie(d,h,y){let x=d[0],M=d[d.length-1];if(!x||!M)return;if(h)x.warnings.push(h);if(y)M.warnings.push({code:"aborted",message:y})}async function Ee(d,h){let y=qe(h.timeoutMs,h.signal),x=Bun.spawn(d,{cwd:h.cwd,...h.env&&{env:{...process.env,...h.env}},stdout:"inherit",stderr:"inherit",stdin:"ignore",...h.ipc&&{ipc:h.ipc},...y.spawn});h.inFlight?.add(x);let M;try{M=await x.exited}finally{h.inFlight?.delete(x)}if(h.signal?.aborted)return!1;if(y.timedOut())throw Error(`${h.label} timed out after ${h.timeoutMs}ms: ${h.name}`);if(M!==0){let A=h.errorFile&&Bun.file(h.errorFile);throw Error(A&&await A.exists()?`${h.label} failed: ${h.name}: ${await A.text()}`:`${h.label} failed: ${h.name} (runner exited ${M})`)}return!0}function j(d){return d!==null&&typeof d==="object"&&typeof d.then==="function"}var xt=(async()=>{}).constructor,Tt=0,Un=256;function Ne(d,h){let y=`/* ostia task loop ${Tt++} */
11
+ const t0 = Bun.nanoseconds()
12
+ for (let b = 0; b < n; b++) sink[b & ${Un-1}] = ${h?"await ":""}fn()
13
+ return Bun.nanoseconds() - t0`,x=(h?xt:Function)("fn","sink","n",y),M=Array(Un);return(A)=>x(d,M,A)}async function De(d){let h=Bun.nanoseconds(),y=d(),x=j(y),M=x?await y:y;return{isAsync:x,result:M,ns:Math.max(1,Bun.nanoseconds()-h)}}var wn=[],ge,Je;function kn(d,h,y,x){let M=ge,A=M?`${M.path}/${d}`:d;ge={path:A,chain:[...M?.chain??[],{path:A,before:y?.before,after:y?.after}],description:y?.description??M?.description,isolate:y?.isolate??M?.isolate,gc:y?.gc??M?.gc,cpu:y?.cpu??M?.cpu,alloc:y?.alloc??M?.alloc,peakMem:y?.peakMem??M?.peakMem,skip:x.skip||M?.skip,only:x.only||M?.only};try{h()}finally{ge=M}}var xn=Object.assign((d,h,y)=>kn(d,h,y,{}),{skip:(d,h,y)=>kn(d,h,y,{skip:!0}),only:(d,h,y)=>kn(d,h,y,{only:!0})});function yn(d,h,y,x){let M=Je!==void 0||y?.params!==void 0?{...Je,...y?.params}:void 0;wn.push({groupName:ge?.path,groupChain:ge?.chain,groupDescription:ge?.description,groupIsolate:ge?.isolate,groupGc:ge?.gc,groupCpu:ge?.cpu,groupAlloc:ge?.alloc,groupPeakMem:ge?.peakMem,name:d,fn:h,baseline:y?.baseline,params:M,skipped:x.skip||ge?.skip,only:x.only||ge?.only,opts:y})}var Mn=Object.assign((d,h,y)=>yn(d,h,y,{}),{skip:(d,h,y)=>yn(d,h,y,{skip:!0}),only:(d,h,y)=>yn(d,h,y,{only:!0})});function D(){return wn}function ue(){wn.length=0,ge=void 0,Je=void 0}function hn(d,h){let y=Je;Je=d;try{return h()}finally{Je=y}}function F(d){return d.groupName?`${d.groupName}/${d.name}`:d.name}function _e(d){return(d.opts?.aliases??[]).map((h)=>d.groupName?`${d.groupName}/${h}`:h)}function nn(d,h){return d.opts?.isolate??d.groupIsolate??h}function Cn(d,h){return d.opts?.gc??d.groupGc??h}function _n(d,h){return d.opts?.cpu??d.groupCpu??h}function We(d,h){return d.opts?.alloc??d.groupAlloc??h}function de(d,h){return d.opts?.peakMem??d.groupPeakMem??h}function Le(d){let h=new Map,y=new Map;return d.forEach((x,M)=>{if(x.skipped)return;for(let{path:A}of x.groupChain??[]){if(!h.has(A))h.set(A,M);y.set(A,M)}}),(x)=>{let M=(d[x].groupChain??[]).map((A)=>A.path);return{enter:M.filter((A)=>h.get(A)===x),leave:M.filter((A)=>y.get(A)===x).reverse()}}}async function g(d,h,y){let x=d.groupChain??[],M=y??(h==="before"?x:[...x].reverse()).map((A)=>A.path);for(let A of M)await x.find((I)=>I.path===A)?.[h]?.()}function tn(d,h){if(!h)return[...d];let y=new RegExp(h);return d.filter((x)=>y.test(F(x)))}function B(d,h,y,x=!0){let M=d.filter((G)=>G.only),A=M.length>0?M:d;if(x&&M.length>0)process.stderr.write(`bench: ${M.length} task(s) selected by .only
14
+ `);let I=tn(A,h);if(I.length===0)throw Error(`filter ${JSON.stringify(h)} matched zero of ${A.length} registered task(s) in ${y}.`);return I}function Q(d){return d.samples?.nodeIds.length??d.totals.reduce((h,y)=>h+y.samples,0)}import{heapSize as zn}from"bun:jsc";import{heapStats as Dn}from"bun:jsc";var St=100,Mt=1000;async function le(d,h=St,y=Mt){let x=Bun.nanoseconds();Bun.gc(!0);let M=Dn().heapSize,A=Bun.nanoseconds()+y*1e6,I=0;while(I<h&&(I===0||Bun.nanoseconds()<A)){let J=d();if(j(J))await J;I++}Bun.gc(!0);let G=Dn().heapSize,_=Bun.nanoseconds()-x;return{memory:{origin:"heapStats",kind:"retained",bytesPerOp:Math.max(0,(G-M)/I)},calls:I,diagnosticWallNs:_}}import{profile as vt}from"bun:jsc";var je=1000;function Fe(){let d=new Map,h=[];return{frames:h,intern(y,x,M,A){let I=d.get(y);if(I===void 0)I=new Map,d.set(y,I);let G=x??"",_=I.get(G);if(_===void 0)_=h.length,I.set(G,_),h.push({key:n("fr",y,G),name:y,url:x,line:M,col:A});return _}}}function Be(d,h,y,x,M){let A=d.get(h);if(A)A.selfUs+=y,A.totalUs+=x,A.samples+=M;else d.set(h,{frameIx:h,selfUs:y,totalUs:x,samples:M})}function Ue(d){return[...d.values()].sort((h,y)=>y.selfUs-h.selfUs)}var Rt=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),Wn=4294967295;function Ln(d,h){let y=h??d.interval*1e6,{frames:x,intern:M}=Fe();function A(K){let z=K.line===Wn,V=z?void 0:K.line-1,ie=z||K.column===Wn?void 0:K.column-1;return M(K.name,K.sourceURL,V,ie)}let I=[];function G(K){let z={id:I.length,frameIx:K,children:new Map,selfUs:0,samples:0,totalUs:0};return I.push(z),z}let _=G(M("(root)",void 0,void 0,void 0)),J={llint:0,baseline:0,dfg:0,ftl:0},H=new Map,ne=[],oe=[];for(let K of d.traces){let z=K.frames,V=_;for(let Ge=z.length-1;Ge>=0;Ge--){let Ze=A(z[Ge]),ze=V.children.get(Ze);if(!ze)ze=G(Ze),V.children.set(Ze,ze);V=ze}V.selfUs+=y,V.samples+=1,ne.push(V.id),oe.push(y);let ie=z[0],Ke=ie&&Rt.get(ie.category);if(Ke){J[Ke]++;let Ge=H.get(Ke)??new Map;Ge.set(V.frameIx,(Ge.get(V.frameIx)??0)+1),H.set(Ke,Ge)}}function be(K){let z=K.selfUs;for(let V of K.children.values())z+=be(V);return K.totalUs=z,z}be(_);let ee=new Map;function re(K){Be(ee,K.frameIx,K.selfUs,K.totalUs,K.samples);for(let z of K.children.values())re(z)}re(_);let te=I.map((K)=>({id:K.id,frameIx:K.frameIx,children:[...K.children.values()].map((z)=>z.id)})),se={origin:"jsc-profile",samplingIntervalUs:y,frames:x,nodes:te,totals:Ue(ee),samples:{nodeIds:ne,timeDeltasUs:oe}},fe=[...H.entries()].flatMap(([K,z])=>[...z.entries()].sort((V,ie)=>ie[1]-V[1]).slice(0,3).map(([V,ie])=>({tier:K,frameKey:x[V].key,samples:ie})));return{cpu:se,jit:{origin:"jsc-profile",tiers:J,topFramesByTier:fe}}}async function He(d,h={}){let y=h.intervalUs??je,x,M=Bun.nanoseconds(),A=await vt(async()=>(x=await d(),x),y),I=Bun.nanoseconds()-M,{cpu:G,jit:_}=Ln(A.stackTraces,y);return{result:x,cpu:G,jit:_,diagnosticWallNs:I}}var Sn=100,Ye=2000,Pt=2,Et=200,Nt=1e4,Ft=Ye/2,At=20;function It(d){let h=Ye*Pt*d/1000;return Math.min(Nt,Math.max(Et,h))}async function Gn(d,h={}){let y=h.intervalUs??Sn,x=It(y)*1e6,M=async()=>{let J=Bun.nanoseconds();do{let H=d();if(j(H))await H}while(Bun.nanoseconds()-J<x)},{cpu:A,jit:I,diagnosticWallNs:G}=await He(M,{intervalUs:y}),_=[$t(A),Bt(I)].filter((J)=>J!==void 0);return{cpu:A,jit:I,diagnosticWallNs:G,warnings:_}}function $t(d){let h=Q(d);if(h>=Ft)return;return{code:"low-sample-count",message:`Only ${h} CPU sample(s) at ${d.samplingIntervalUs}\xB5s (target ${Ye}); frame shares this thin move several points between runs. Lower --cpu-interval for more.`,data:{samples:h,target:Ye,intervalUs:d.samplingIntervalUs}}}function Bt(d){let{llint:h,baseline:y,dfg:x,ftl:M}=d.tiers,A=h+y+x+M;if(A===0)return;let I=h/A*100,G=y/A*100,_=x/A*100,J=M/A*100;if(I+G<=At)return;return{code:"jit-cold",message:`${(I+G).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:I,baselinePct:G,dfgPct:_,ftlPct:J}}}var Ot=500,Ut=20,jn=3,Ct=10,_t=2,Dt=0.1,Wt=1000,Jn=1e4,Lt=2*Jn,Gt=1e6,jt=5;function Vn(d){let h=Math.log10(Math.max(1,d)/1e6),y=Math.round(jn+_t*h);return Math.min(Ct,Math.max(jn,y))}function Ht(d,h){let y=Math.floor(h/d);return Math.min(Ut,Math.max(y,Vn(d)))}var Jt;function Tn(d){Jt=d}function Hn(d,h){return Math.max(1,Math.ceil(Wt/d),Math.ceil(h/(d*Jn)))}function Vt(d){let h=[...d].sort((y,x)=>y-x);return h[h.length>>1]}async function Kn(d,h={}){let y=(h.budgetMs??Ot)*1e6,x=y*(h.warmup??Dt),M=await De(d),A=M.ns,I=Ne(d,M.isAsync),G=Bun.nanoseconds(),_=1;while(Bun.nanoseconds()-G<x){let z=await I(_);if(A=Math.max(1,z/_),z<Gt)_*=2}let J=Hn(A,y);if(J>1){let z=[];for(let V=0;V<jt;V++)z.push(await I(J)/J);A=Math.max(1,Vt(z)),J=Hn(A,y)}let H=A*J,ne=h.samples??h.minSamples??Ht(H,y),oe=h.samples!==void 0?0:y,be=h.samples??Math.max(Lt,ne),ee=[],re=Bun.nanoseconds(),te=0,se=0;while(se<ne||te<oe&&se<be){let z=await I(J);if(ee.push({i:se,wallNs:z/J}),se++,te=Bun.nanoseconds()-re,h.gc)Bun.gc(!0)}let fe=c(ee.map((z)=>z.wallNs));if(J>1)fe.batch=J;let he=ke(fe,[],"inprocess"),K=Vn(H);if(ee.length<K)he.push({code:"low-sample-count",message:`Only ${ee.length} sample(s) at ~${e(H)} per trial; ${K} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:ee.length,target:K,trialCostNs:H}});return{trials:ee,timing:fe,warnings:he}}function U(d,h,y){let x=F(h),M=_e(h).map((A)=>mn(d,A,{params:h.params}).id);return mn(d,x,{label:x,formerIds:M.length>0?M:void 0,baseline:h.baseline,group:h.groupName,description:h.opts?.description,groupDescription:h.groupDescription,isolated:y,params:h.params,skipped:h.skipped})}async function pe(d,h,y){let x=h.some((J)=>!J.skipped),{environment:M,noiseWarning:A}=O(x?y.noiseCheck:!1),I=Le(h),G=[],_=[];for(let J=0;J<h.length;J++){let H=h[J],ne=U(d,H,y.markIsolated);if(G.push(ne),H.skipped)continue;let{enter:oe,leave:be}=I(J);if(await g(H,"before",oe),H.opts?.before)await H.opts.before();let ee={budgetMs:H.opts?.budgetMs??y.budgetMs,samples:H.opts?.samples??y.samples,minSamples:H.opts?.minSamples??y.minSamples,warmup:y.warmup,gc:Cn(H,y.gc??!1)},re=zn(),te=await Kn(H.fn,ee),se=zn();if(_.push(W({workload:ne,heapUsed:{beforeBytes:re,afterBytes:se},configFingerprint:i({budgetMs:ee.budgetMs??null,samples:ee.samples??null,minSamples:ee.minSamples??null,gc:ee.gc??!1}),trials:te.trials,timing:te.timing,warnings:A&&_.length===0?[...te.warnings,A]:te.warnings})),_n(H,y.cpu??!1)){let fe=y.cpuIntervalUs??Sn,he=await Gn(H.fn,{intervalUs:fe});_.push(P({workload:ne,phase:"cpu",configFingerprint:i({cpu:!0,intervalUs:fe}),diagnosticWallNs:he.diagnosticWallNs,cpu:he.cpu,jit:he.jit,warnings:he.warnings,artifacts:[]}))}if(We(H,y.alloc??!1)){let fe=await le(H.fn);_.push(P({workload:ne,phase:"memstats",configFingerprint:i({alloc:!0}),diagnosticWallNs:fe.diagnosticWallNs,memory:fe.memory,warnings:[],artifacts:[]}))}if(H.opts?.after)await H.opts.after();await g(H,"after",be)}return v(M),r(G,_,M)}
15
+ export{T,l,we,ln,ye,q,R,e,c,k,o,ke,ae,S,n,r,me,pn,W,P,Xe,fn,i,Y,Qe,u,E,a,Pe,v,xe,Z,Me,p,b,N,Te,Re,Se,L,m,s,ve,gn,X,Ce,t,C,$e,Oe,f,w,en,ce,Ae,O,Ie,Ee,j,Ne,De,Fe,Be,Ue,xn,Mn,D,ue,hn,F,_e,nn,We,de,Le,g,tn,B,Q,le,je,He,Tn,U,pe};
@@ -0,0 +1,2 @@
1
+ // @bun
2
+ import{rn,Ge,Ve,Je,ze,on,ee,sn}from"./chunk-scvezzm9.js";export{Ve as AB_HELP,ee as BASELINE_HELP,Ge as BENCH_HELP,on as CI_HELP,Je as COMPARE_HELP,sn as MAIN_HELP,ze as REPORT_HELP,rn as TIME_HELP};
@@ -0,0 +1,14 @@
1
+ // @bun
2
+ import{j}from"./chunk-5m601yfv.js";import{heapStats as w}from"bun:jsc";function H(){let{heapSize:o,extraMemorySize:e}=w(),s=process.memoryUsage.rss();return{rssBytes:s,residentBytes:f()??s,liveBytes:o+e}}function f(){if(process.platform!=="darwin")return;let o=Bun.spawnSync(["ps","-o","rss=","-p",String(process.pid)],{stderr:"ignore"}),e=Number(o.stdout.toString().trim());return o.success&&e>0?e*1024:void 0}var t={ready:1,go:2,sampling:3,stop:4},g=`self.onmessage = (event) => {
3
+ const slots = new Int32Array(event.data)
4
+ Atomics.store(slots, 0, ${t.ready})
5
+ Atomics.wait(slots, 0, ${t.ready})
6
+ if (Atomics.compareExchange(slots, 0, ${t.go}, ${t.sampling}) === ${t.go}) {
7
+ while (Atomics.load(slots, 0) === ${t.sampling}) {
8
+ const kib = (process.memoryUsage.rss() / 1024) | 0
9
+ if (kib > Atomics.load(slots, 1)) Atomics.store(slots, 1, kib)
10
+ }
11
+ }
12
+ postMessage(0)
13
+ }`,d=1e4;async function G(o=g){let e=new Int32Array(new SharedArrayBuffer(8)),s=new Worker(URL.createObjectURL(new Blob([o],{type:"application/javascript"}))),a=new Promise((r,c)=>{let n=(m)=>c(Error(`RSS sampler worker failed: ${m}`));s.onerror=(m)=>n(m.message||"uncaught error"),s.addEventListener("close",()=>n("worker exited unexpectedly"))});a.catch(()=>{});let i=new Promise((r)=>{s.onmessage=r});try{s.postMessage(e.buffer);let r=Date.now()+d;while(Atomics.load(e,0)!==t.ready){if(Date.now()>r)throw Error("RSS sampler worker failed: did not start in time");await Promise.race([Bun.sleep(1),a])}}catch(r){throw s.terminate(),r}return{async during(r){try{Atomics.store(e,0,t.go),Atomics.notify(e,0);let c=Bun.nanoseconds()+50000000;while(Atomics.load(e,0)!==t.sampling&&Bun.nanoseconds()<c);let n=Date.now()+d;while(Atomics.load(e,0)!==t.sampling){if(Date.now()>n)throw Error("RSS sampler worker failed: did not start sampling");await Promise.race([Bun.sleep(1),a])}return await r(),Atomics.store(e,0,t.stop),await Promise.race([i,a]),Atomics.load(e,1)*1024}finally{s.terminate()}}}}async function ne(o,e,s){let a=s??await G();Bun.gc(!0);let i=H(),r=process.resourceUsage().maxRSS*1024,c=Bun.nanoseconds(),n=0,m=await a.during(async()=>{let p=o();if(j(p))await p;n=Bun.nanoseconds()-c}),l=process.resourceUsage().maxRSS*1024,u=Math.max(m,l>r?l:0),y=e?i.residentBytes-e.residentBytes-(i.liveBytes-e.liveBytes):0;return{peakBytes:Math.max(0,u-i.rssBytes),slackBytes:Math.max(0,y),wallNs:n}}
14
+ export{H,G,ne};
@@ -0,0 +1,3 @@
1
+ // @bun
2
+ import{k,o,Ne,De}from"./chunk-5m601yfv.js";function y(n){return n==="cand"?"candidate":n}class se extends Error{side;constructor(n,t){super(t instanceof Error?t.message:String(t),{cause:t});this.side=n}}async function R(n,t){try{return await t()}catch(r){throw r instanceof se?r:new se(n,r)}}var C=15,_=1e7,N=1e6,O=3;async function un(n,t,r={}){let i=r.rounds??C,{signal:s}=r;s?.throwIfAborted();let m=Bun.nanoseconds(),c=r.candFirst?["cand","base"]:["base","cand"],b=c.toReversed(),h={base:n,cand:t},p={};for(let e of c)p[e]=await R(e,()=>De(h[e]));let M=Bun.deepEquals(p.base.result,p.cand.result),g=(e)=>{let a=Ne(h[e],p[e].isAsync);return(d)=>R(e,()=>a(d))},f={base:g("base"),cand:g("cand")},A=async(e)=>{for(let a=1;;a*=2){s?.throwIfAborted();let d=await e(a);if(d>=N)return Math.max(1,d/a)}},l={base:0,cand:0};for(let e of c)l[e]=await A(f[e]);let u=Math.max(1,Math.round(_/Math.max(l.base,l.cand)));for(let e=0;e<O;e++){s?.throwIfAborted();for(let a of c)await f[a](u)}let S=[],x=[],w=[];for(let e=0;e<i;e++){s?.throwIfAborted();let a={base:0,cand:0};for(let P of e%2===0?c:b)a[P]=await f[P](u);let d=Math.max(1,a.base),T=Math.max(1,a.cand);S.push(d/u),x.push(T/u),w.push(T/d)}return{rounds:i,batch:u,baseSamples:S,candSamples:x,ratios:w,sameOutput:M,diagnosticWallNs:Bun.nanoseconds()-m}}function I(n){return!(n.suiteChanged&&!n.sameOutput)}function dn(n,t,r,i){let s=t-n,m=Math.abs(s)>Math.max(i,n*r/100);return{baseBytes:n,candBytes:t,verdict:!m?"unchanged":s>0?"regressed":"improved",floorBytes:i}}function ie(n,t){let r=k(n),i=o(r,0.5),s=o(r,0.25),m=o(r,0.75),c=t/100,b=i>1+c&&s>1?"regressed":i<1-c&&m<1?"improved":void 0;return{medianRatio:i,ratioP25:s,ratioP75:m,...b&&{flagged:b}}}
3
+ export{y,se,un,I,dn,ie};
@@ -0,0 +1,27 @@
1
+ // @bun
2
+ import{T,l,we,ln,ye,q,R,e,c,k,o,ke,S,n,r,me,pn,W,P,fn,i,Y,a,Pe,v,xe,Z,Me,p,b,N,Te,Re,Se,L,m,s,ve,gn,X,Ce,t,C,$e,Oe,f,w,en,ce,Ae,O,Ie,Ee,Fe,Be,Ue,D,hn,B,Q,je,He,pe}from"./chunk-5m601yfv.js";import{y,I,dn,ie}from"./chunk-fc36fd0b.js";import{appendFileSync as Co,existsSync as jn,lstatSync as vo,readdirSync as pr,realpathSync as Ut,renameSync as Io,statSync as Oo,symlinkSync as Do,unlinkSync as No,utimesSync as Eo}from"fs";import{mkdir as Ao}from"fs/promises";import{relative as fr,sep as Fo}from"path";function Yr(u){let g=u>>>0;return()=>{g=g+1831565813|0;let E=Math.imul(g^g>>>15,1|g);return E=E+Math.imul(E^E>>>7,61|E)^E,((E^E>>>14)>>>0)/4294967296}}var mt=2000,qr=2000;function qt(u,g,E){if(u.length<=E)return u;let F=[...u];for(let U=0;U<E;U++){let H=U+Math.floor(g()*(F.length-U)),j=F[U];F[U]=F[H],F[H]=j}return F.slice(0,E)}class Nt{sorted;rankOf;counts;n;constructor(u){let g=u.length,E=new Uint32Array(g);for(let F=0;F<g;F++)E[F]=F;E.sort((F,U)=>u[F]-u[U]),this.sorted=new Float64Array(g),this.rankOf=new Uint32Array(g);for(let F=0;F<g;F++)this.sorted[F]=u[E[F]],this.rankOf[E[F]]=F;this.n=g,this.counts=new Uint32Array(g)}resampleMedian(u){let{n:g,counts:E,sorted:F,rankOf:U}=this;E.fill(0);for(let ue=0;ue<g;ue++)E[U[Math.floor(u()*g)]]++;let H=g+1>>1,j=g%2===0?H+1:H,ee=0,G=-1;for(let ue=0;ue<g;ue++){if(ee+=E[ue],G<0&&ee>=H)G=ue;if(ee>=j)return G===ue?F[ue]:(F[G]+F[ue])/2}return F[g-1]}}function Qr(u,g){let E=new Float64Array(u.length+g.length+1);return E.set(u),E[u.length]=Number.NaN,E.set(g,u.length+1),Bun.hash.crc32(E)}function Qt(u,g,E={}){if(u.length===0||g.length===0)throw RangeError("bootstrapMedianDiffCi: both sides need samples");let F=E.seed??Qr(u,g),U=Yr(F),H=E.iterations??qr,j=u.length>mt||g.length>mt,ee=new Nt(qt(u,U,mt)),G=new Nt(qt(g,U,mt)),ue=o(ee.sorted,0.5),ne=new Float64Array(H);for(let ae=0;ae<H;ae++){let se=ee.resampleMedian(U),We=G.resampleMedian(U)-se;ne[ae]=ue===0?We===0?0:We*(1/0):We/ue*100}return ne.sort(),{ci95:[o(ne,0.025),o(ne,0.975)],seed:F,data:{subsampled:j,iterations:H}}}function Xr(u){let g=u<0?-1:1,E=Math.abs(u),F=0.254829592,U=-0.284496736,H=1.421413741,j=-1.453152027,ee=1.061405429,G=0.3275911,ue=1/(1+0.3275911*E),ne=1-((((1.061405429*ue+-1.453152027)*ue+1.421413741)*ue+-0.284496736)*ue+0.254829592)*ue*Math.exp(-E*E);return g*ne}function Zr(u){return 0.5*(1+Xr(u/Math.SQRT2))}function Xt(u,g){let E=u.length,F=g.length,U=E+F;if(E===0||F===0)return{u:0,z:0,pValue:1};let H=k(u),j=k(g),ee=0,G=0,ue=0,ne=0,ae=0;while(ue<E||ne<F){let _e=ne>=F||ue<E&&H[ue]<=j[ne]?H[ue]:j[ne],Ne=0;while(ue<E&&H[ue]===_e)Ne++,ue++;let Le=0;while(ne<F&&j[ne]===_e)Le++,ne++;let Ve=Ne+Le,ze=ae+(Ve+1)/2;if(ee+=Ne*ze,Ve>1)G+=Ve**3-Ve;ae+=Ve}let se=ee-E*(E+1)/2,De=E*F/2,We=Math.sqrt(E*F*(U+1-G/(U*(U-1)))/12),de=We===0?0:(se-De)/We,le=Math.min(1,Math.max(0,2*(1-Zr(Math.abs(de)))));return{u:se,z:de,pValue:le}}var x={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},Et=5;function tt(u,g){if(u===0)return g===0?0:1/0;return(g-u)/u*100}function Zt(u){let g=new Map;for(let E of u.measurements){let F=`${E.workloadId}\x00${E.phase}`;if(!g.has(F))g.set(F,E)}return(E,F)=>g.get(`${E}\x00${F}`)}function er(u){let g=new Map;for(let E of u.measurements){let F=E.memory;if(!F||E.phase!=="timing"&&E.phase!=="memstats")continue;let U=g.get(E.workloadId)??{};if(E.phase==="timing")U.heapUsedBefore=F.heapUsedBeforeBytes,U.heapUsedAfter=F.heapUsedAfterBytes,U.maxRss=F.maxRssBytes;else if(F.kind==="peak")U.peak=F.peakBytes;else U.retained=F.bytesPerOp;g.set(E.workloadId,U)}return(E)=>g.get(E)??{}}function nr(u){let{referenceMedianNs:g,driftPct:E}=u.noise;return g*(1+(E??0)/200)}function eo(u,g){if(!u.environment||!g.environment)return;let E=nr(u.environment),F=E>0?(nr(g.environment)/E-1)*100:0;return Math.max(Math.abs(u.environment.noise.driftPct??0),Math.abs(g.environment.noise.driftPct??0),Math.abs(F))}function no(u,g,E){let F=new Map(u.workloads.map((j)=>[j.id,j])),U=new Map(g.workloads.map((j)=>[j.id,j])),H=eo(u,g);return{base:Zt(u),cand:Zt(g),baseMemory:er(u),candMemory:er(g),baseWorkloads:F,candWorkloads:U,baseIdFor:(j)=>{if(F.has(j))return j;return U.get(j)?.formerIds?.find((ee)=>F.has(ee))},environmentMismatch:to(u,g),driftPct:H,effectiveTimingPct:Math.max(E.timingPct,u.environment?.noise.floorPct??0,g.environment?.noise.floorPct??0)+(H??0)}}function to(u,g){let E=[["platform.os",u.platform.os,g.platform.os],["platform.arch",u.platform.arch,g.platform.arch],["bunVersion",u.bunVersion,g.bunVersion]];if(u.environment&&g.environment)E.push(["cpuModel",u.environment.cpuModel,g.environment.cpuModel],["cores",u.environment.cores,g.environment.cores]);let F=E.filter(([,U,H])=>U!==H).map(([U,H,j])=>({field:U,base:H,cand:j}));if(F.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${F.map((U)=>U.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:F}}}function ro(u){let g=[];for(let F of u){if(!F.timing)continue;let U=1+F.timing.medianDeltaPct/100;if(Number.isFinite(U)&&U>0)g.push(Math.log(U))}if(g.length===0)return null;let E=g.reduce((F,U)=>F+U,0)/g.length;return(Math.exp(E)-1)*100}function Ke(u,g,E=x){let F=no(u,g,E),U=()=>{let H=new Set,j=[];for(let ee of g.workloads){let G=F.baseIdFor(ee.id);if(G===void 0)j.push(ee);else H.add(G)}return{baseOnly:u.workloads.filter((ee)=>!H.has(ee.id)),candOnly:j}};return{effectiveTimingPct:F.effectiveTimingPct,driftPct:F.driftPct,compare:(H)=>uo(F,H,E),unmatched:U,compared(H){let j=new Set(H.map(([ne])=>ne)),ee=g.workloads.filter((ne)=>!j.has(ne.id)),{baseOnly:G}=U(),ue=(ne,ae)=>({workloadId:ne.id,task:m(ne),...ne.entry?.group!==void 0&&{group:ne.entry.group},verdict:ae});return[...H.map(([ne,ae])=>so(F,ne,ae)),...ee.map((ne)=>ue(ne,"missing-base")),...G.map((ne)=>ue(ne,"missing-cand"))]}}}var oo=["heapUsedBefore","heapUsedAfter","retained","peak","maxRss"];function so(u,g,E){let F=u.baseIdFor(g)??g,U=u.candWorkloads.get(g),H=u.baseWorkloads.get(F),j={workloadId:g,task:U?m(U):g,...U?.entry?.group!==void 0&&{group:U.entry.group},verdict:E.timing?.verdict??"unchanged",comparisonId:E.id,pass:E.verdict==="pass"};if(F!==g)j.renamedFrom={workloadId:F,task:H?m(H):F};let ee=u.base(F,"timing")?.timing,G=u.cand(g,"timing")?.timing;if(E.timing&&ee&&G){let{medianDeltaPct:se,ci95:De,pValue:We}=E.timing;j.timing={unit:"ns",baseMedian:ee.median,candMedian:G.median,baseSamples:ee.samples.length,candSamples:G.samples.length,medianDeltaPct:se,...De&&{ci95:De},...We!==void 0&&{pValue:We},thresholdPct:E.thresholds.effectiveTimingPct}}let ue=u.baseMemory(F),ne=u.candMemory(g),ae=[];for(let se of oo){let De=ue[se],We=ne[se];if(De===void 0||We===void 0)continue;ae.push({reading:se,baseBytes:De,candBytes:We,deltaPct:tt(De,We)})}if(ae.length>0)j.memory=ae;return j}function qe(u,g,E){let F=0,U=0,H=0;for(let j of u){if(!j.timing)continue;if(j.timing.verdict==="regressed")F++;else if(j.timing.verdict==="improved")U++;else H++}return{matched:u.length,regressed:F,improved:U,unchanged:H,geomeanPct:ro(u),effectiveTimingPct:g,...E!==void 0&&{driftPct:E},verdict:u.some((j)=>j.verdict==="fail")?"fail":"pass"}}function fe(u,g,E=x){let F=Ke(u,g,E),U=[];for(let j of g.workloads){let ee=F.compare(j.id);if(ee)U.push([j.id,ee])}let H=U.map(([,j])=>j);return{comparisons:H,unmatched:F.unmatched(),compared:F.compared(U),summary:qe(H,F.effectiveTimingPct,F.driftPct)}}function io(u,g,E,F){let U=u.samples,H=g.samples,j=tt(u.median,g.median),ee=tt(u.mean,g.mean),G=(ae,se)=>{if(ae>E)return"regressed";if(se<-E)return"improved";return"unchanged"};if(U.length<Et||H.length<Et)return{timing:{medianDeltaPct:j,meanDeltaPct:ee,verdict:G(j,j)},warning:{code:"thin-comparison",message:`Only ${U.length} baseline / ${H.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${Et}+ per side).`,data:{baseSamples:U.length,candSamples:H.length}}};let ue=Qt(U,H,{iterations:F.bootstrapIterations}),ne=Xt(U,H);return{timing:{medianDeltaPct:j,meanDeltaPct:ee,ci95:ue.ci95,pValue:ne.pValue,seed:ue.seed,verdict:ne.pValue<F.alpha?G(ue.ci95[0],ue.ci95[1]):"unchanged"}}}function ao(u,g,E){let F=(ae)=>new Map(ae.totals.map((se)=>[ae.frames[se.frameIx].key,se.selfUs])),U=(ae)=>new Map(ae.frames.map((se)=>[se.key,se.name])),H=F(u),j=F(g),ee=U(u),G=U(g),ue=[...new Set([...H.keys(),...j.keys()])].map((ae)=>{let se=H.get(ae)??0,De=j.get(ae)??0;return{frameKey:ae,name:G.get(ae)??ee.get(ae)??ae,baseSelfUs:se,candSelfUs:De,deltaPct:tt(se,De)}}).sort((ae,se)=>Math.abs(se.deltaPct)-Math.abs(ae.deltaPct)),ne=ue.some((ae)=>(ae.baseSelfUs>=E.minFrameSelfUs||ae.candSelfUs>=E.minFrameSelfUs)&&ae.deltaPct>E.frameSelfPct);return{frames:ue,failed:ne}}function mo(u,g,E){let F=new Map(u.typeCounts.map((j)=>[j.type,j])),U=new Map(g.typeCounts.map((j)=>[j.type,j])),H=[...new Set([...F.keys(),...U.keys()])].map((j)=>{let ee=F.get(j),G=U.get(j);return{type:j,baseCount:ee?.count??0,candCount:G?.count??0,baseBytes:ee?.retainedBytes,candBytes:G?.retainedBytes,deltaPct:tt(ee?.count??0,G?.count??0)}}).sort((j,ee)=>Math.abs(ee.deltaPct)-Math.abs(j.deltaPct));return{heapTypes:H,failed:H.some((j)=>j.deltaPct>E.heapTypePct)}}function uo(u,g,E){let{effectiveTimingPct:F}=u,U=u.baseIdFor(g);if(U===void 0)return;let H=u.base(U,"timing"),j=u.cand(g,"timing"),ee=u.base(U,"cpu"),G=u.cand(g,"cpu"),ue=u.base(U,"heap"),ne=u.cand(g,"heap"),ae=u.candWorkloads.get(g),se=H?.id??ee?.id??ue?.id,De=j?.id??G?.id??ne?.id??ae?.id;if(!se||!De)return;let We=!1,de=[];if(u.environmentMismatch)de.push(u.environmentMismatch);let le;if(H?.timing&&ae?.skipped&&!j?.timing)le={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},de.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:g}});else if(H?.timing&&j?.timing){let Le=io(H.timing,j.timing,F,E);if(le=Le.timing,Le.warning)de.push(Le.warning);if(le.verdict==="regressed")We=!0}let _e;if(ee?.cpu&&G?.cpu){let Le=ao(ee.cpu,G.cpu,E);_e=Le.frames,We||=Le.failed}let Ne;if(ue?.heap&&ne?.heap){let Le=mo(ue.heap,ne.heap,E);Ne=Le.heapTypes,We||=Le.failed}return{id:n("cmp",se,De),baselineMeasurementId:se,candidateMeasurementId:De,timing:le,...de.length>0&&{warnings:de},frames:_e,heapTypes:Ne,thresholds:{...E,effectiveTimingPct:F},verdict:We?"fail":"pass"}}class d extends Error{}var tr=(u)=>typeof u==="object"&&u!==null&&!Array.isArray(u),st=(u)=>(g)=>typeof g==="number"&&Number.isInteger(g)&&g>=u,Dn=(u)=>(g)=>typeof g==="number"&&Number.isFinite(g)&&g>=u,En=(u)=>typeof u==="string",co=(u)=>typeof u==="boolean",ot=(u)=>Array.isArray(u)&&u.every(En),rr=(...u)=>(g)=>u.includes(g),on=(u,g)=>({ok:u,expects:g}),On=on(st(1),"a positive integer"),lo=on(st(0),"a non-negative integer"),At=on(En,"a string"),Nn=on(co,"a boolean"),ut=on(ot,"an array of strings"),po={timingPct:on(Dn(0),"a non-negative number"),frameSelfPct:on(Dn(0),"a non-negative number"),heapTypePct:on(Dn(0),"a non-negative number"),minFrameSelfUs:on(Dn(0),"a non-negative number"),alpha:on((u)=>Dn(0)(u)&&u<=1,"a number in [0, 1]"),bootstrapIterations:On},fo={suites:ut,preload:ut,bunFlags:ut,jobs:on((u)=>st(1)(u)||u==="auto",'a positive integer or "auto"'),budgetMs:on(Dn(0),"a non-negative number"),samples:On,minSamples:On,gc:Nn,cpu:Nn,cpuIntervalUs:On,alloc:Nn,peakMem:Nn,filter:At,isolate:Nn,outDir:At,timeoutMs:On},go={setup:on((u)=>En(u)||ot(u),"a command string or an array of them"),keepTrees:On,alloc:Nn,peakMem:Nn,memThresholdPct:on(Dn(0),"a non-negative number")},ho=["inputs","prepare","timeSource","ignoreExitCodes"],bo={label:At,command:on((u)=>ot(u)&&u.length>0,"a non-empty array of strings (argv, no shell)"),suites:on((u)=>ot(u)&&u.length>0,"a non-empty array of glob strings"),inputs:ut,prepare:on((u)=>En(u)||ot(u)||typeof u==="function","a command string, an argv array, or (ostia.config.ts) a function"),timeSource:on((u)=>tr(u)&&(En(u.pattern)||u.pattern instanceof RegExp)&&(u.group===void 0||st(0)(u.group))&&(u.unit===void 0||rr("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:on((u)=>Array.isArray(u)&&u.every((g)=>st(0)(g)&&g<=255),"an array of exit codes 0-255")},wo={samples:On,budgetMs:on(Dn(0),"a non-negative number"),minSamples:On,warmup:lo,outDir:on((u)=>En(u)&&u!=="","a non-empty string"),baselineDir:on((u)=>En(u)&&u!=="","a non-empty string"),baseline:on((u)=>En(u)&&u!=="","a non-empty string"),onMissingBaseline:on(rr("warn","fail"),'"warn" or "fail"'),noiseCheck:Nn},Ft=(u)=>typeof u==="function"?"a function":u instanceof RegExp?String(u):JSON.stringify(u)??String(u);function rt(u,g,E,F,U){let H=E===""?"":`${E}.`;for(let[j,ee]of Object.entries(u)){if(ee===void 0)continue;let G=Object.hasOwn(g,j)?g[j]:void 0;if(!G){if(!j.startsWith("$"))U(`${F}: unknown key "${H}${j}" is ignored.`)}else if(!G.ok(ee))throw new d(`${F}: "${H}${j}" must be ${G.expects}, got ${Ft(ee)}.`)}}function ct(u,g,E){if(!tr(u))throw new d(`${E}: "${g}" must be an object, got ${Ft(u)}.`);return u}function yo(u,g,E,F){let U=`workloads[${g}]`,H=ct(u,U,E),j=(G)=>H[G]!==void 0;if(j("command")===j("suites"))throw new d(`${E}: "${U}" needs exactly one of "command" or "suites".`);if(rt(H,bo,U,E,F),j("suites")){for(let G of ho)if(j(G))F(`${E}: "${U}.${G}" applies to command workloads only; ignored on a suites workload.`)}let ee=H.timeSource?.pattern;if(typeof ee==="string")try{new RegExp(ee)}catch(G){throw new d(`${E}: "${U}.timeSource.pattern" is not a valid regex: ${G.message}`)}}function or(u,g,E){let{thresholds:F,workloads:U,bench:H,ab:j,...ee}=u;if(rt(ee,wo,"",g,E),F!==void 0)rt(ct(F,"thresholds",g),po,"thresholds",g,E);if(H!==void 0)rt(ct(H,"bench",g),fo,"bench",g,E);if(j!==void 0)rt(ct(j,"ab",g),go,"ab",g,E);if(U!==void 0){if(!Array.isArray(U))throw new d(`${g}: "workloads" must be an array, got ${Ft(U)}.`);U.forEach((G,ue)=>{yo(G,ue,g,E)})}}var An="node_modules/.cache/ostia",ko=".ostia/baselines",Po={warmup:3,outDir:An,baselineDir:ko,baseline:"main",thresholds:x,workloads:[]},Mo={runs:"samples"},te=["ostia.config.ts","ostia.config.json"],ir=(u)=>console.warn(`ostia: ${u}`);function sr(u){return Object.fromEntries(Object.entries(u).filter(([,g])=>g!==void 0))}function Ro(u,g){if(typeof u!=="object"||u===null||Array.isArray(u))throw new d(`${g}: expected an object.`);for(let[F,U]of Object.entries(Mo))if(F in u)throw new d(`${g}: "${F}" was renamed to "${U}".`);or(u,g,ir);let E=sr(u);return{...Po,...E,thresholds:{...x,...E.thresholds&&sr(E.thresholds)}}}async function To(u){let g=u.startsWith("/")?u:`${process.cwd()}/${u}`,E=Bun.file(g);if(!await E.exists())return;try{if(!u.endsWith(".ts"))return await E.json();let F=(await import(g)).default;if(F===void 0)throw Error('no default export; use "export default defineConfig({ ... })"');return F}catch(F){throw new d(`${u}: ${T(F)}`)}}async function ar(){let u=[];for(let g of te)if(await Bun.file(g).exists())u.push(g);return u}async function an(u){let g=u;if(g===void 0){let F=await ar();if(F.length>1)ir(`${F.join(" and ")} both exist; using ${F[0]} and ignoring the rest.`);g=F[0]}if(g===void 0)return;let E=await To(g);return E===void 0?void 0:Ro(E,g)}function A(u,g){return`${u.baselineDir}/${g??u.baseline}.json`}async function Ye(){return(await ar())[0]}var xo=10,$o=3000,So=3;function mr(u,g){return u!==void 0&&u!==0&&!g.has(u)}function Bt(u){if(Ln("time",u),u.timeSource)we(u.timeSource);let g=u.warmup??So,E=u.samples,F=u.minSamples??xo,U=E!==void 0?0:(u.budgetMs??$o)*1e6,H=u.timeSource!==void 0,j=u.ignoreExitCodes??[],ee=new Set(j),G=[],ue=0,ne=0,ae=!1,se;function De(){if(ae)return!0;if(E!==void 0)return ne>=E;return ne>=F&&ue>=U}async function We(de,le){if(u.prepare)await ye(u.prepare,{phase:de,index:le},{cwd:u.cwd,env:u.env,timeoutMs:u.timeoutMs,signal:u.signal});return ln(u)}return{async warmup(){for(let de=0;de<g;de++){if(u.signal?.aborted)return;await We("warmup",de)}},async step(){if(De()||u.signal?.aborted)return!1;let de=await We("timing",ne);if(u.signal?.aborted)return!1;if(de.timeSourceNoMatch)se??=de.timeSourceMissOutput;let le=de.exitCode??void 0;if(G.push({i:ne,wallNs:de.wallNs,exitCode:le,userNs:de.userNs,systemNs:de.systemNs,maxRssBytes:de.maxRssBytes,...de.reportedNs!==void 0&&{reportedNs:de.reportedNs},...de.timedOut&&{timedOut:!0},...de.timeSourceNoMatch&&{timeSourceNoMatch:!0}}),ue+=de.wallNs,ne++,mr(le,ee))ae=!0;return!0},done:De,result(){let de=G.filter((ze)=>!ze.timedOut&&!ze.timeSourceNoMatch),le=de.map((ze)=>H?ze.reportedNs:ze.wallNs),_e=[],Ne=G.filter((ze)=>ze.timedOut).length;if(Ne>0)_e.push({code:"timeout",message:`${Ne} of ${G.length} trial(s) timed out after ${u.timeoutMs}ms.`,data:{timeoutMs:u.timeoutMs,trials:Ne}});let Le=G.filter((ze)=>ze.timeSourceNoMatch).length;if(Le>0&&u.timeSource){let{pattern:ze}=u.timeSource;_e.push({code:"time-source-no-match",message:`${Le} of ${G.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof ze==="string"?ze:ze.source,trials:Le,...se!==void 0&&{output:se}}})}if(le.length===0)return{trials:G,warnings:_e};let Ve=c(le);return _e.push(...ke(Ve,de.map((ze)=>ze.exitCode),H?"reported":"subprocess",j)),{trials:G,timing:Ve,warnings:_e}}}}async function Wt(u){await u.warmup();while(await u.step());}async function mn(u){let g=Bt(u);return await Wt(g),g.result()}function ge(u,g=[]){if(!u.timing)return!0;let E=new Set(g);return u.trials.some((F)=>mr(F.exitCode,E))}function Ln(u,g){for(let[E,F]of Object.entries({samples:g.samples,minSamples:g.minSamples}))if(F!==void 0&&(!Number.isFinite(F)||F<1))throw RangeError(`${u}: ${E} must be >= 1, got ${F}`);if(g.budgetMs!==void 0&&!Number.isFinite(g.budgetMs))throw RangeError(`${u}: budgetMs must be finite, got ${g.budgetMs}`);if(g.warmup!==void 0&&(!Number.isFinite(g.warmup)||g.warmup<0))throw RangeError(`${u}: warmup must be >= 0, got ${g.warmup}`);if(g.timeoutMs!==void 0&&(!Number.isFinite(g.timeoutMs)||g.timeoutMs<=0))throw RangeError(`${u}: timeoutMs must be > 0, got ${g.timeoutMs}`)}class _ extends l{}class V extends Error{side;constructor(u,g){super(u);this.side=g}}class J extends Error{}var Bo=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},ur=1048576,Wo=16384;function cr(u,g){let E=Bun.spawnSync(["git",...u],{cwd:g,stdout:"pipe",stderr:"ignore"});return E.success?E.stdout.toString().trim():void 0}var _t=`
3
+ ;globalThis.__ostia_ab_base__;
4
+ `,Uo="**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}";async function _o(u){for await(let g of new Bun.Glob(Uo).scan({cwd:u,dot:!0,absolute:!0})){if(/\.d\.[mc]?ts$/.test(g)||!vo(g).isFile())continue;Co(g,_t)}}function Lo(u,g,E){if(E.length===0)return`${u}/${g}`;return`${u}/${g}-${n("ab-setup",E).slice(-8)}`}var jo=20,Vo=65536,Ho=1000;function dr(u){let g=u.getReader(),E=new TextDecoder,F="",U=(async()=>{try{for(;;){let H=await g.read();if(H.done)return;F=(F+E.decode(H.value,{stream:!0})).slice(-Vo)}}catch{}})();return{done:U,stop:async()=>(await g.cancel().catch(()=>{}),await U,F)}}async function Go(u,g,E,F){let U=Bun.spawn(["sh","-c",u],{cwd:g,env:E,stdout:"pipe",stderr:"pipe",stdin:"ignore",detached:!0}),H=()=>{try{process.kill(-U.pid,"SIGKILL")}catch{}},j=!1,ee=F.timeoutMs===void 0?void 0:setTimeout(()=>{j=!0,H()},F.timeoutMs);if(F.signal?.addEventListener("abort",H),F.signal?.aborted)H();let G=dr(U.stdout),ue=dr(U.stderr),ne;try{let ae=await U.exited;H(),await Promise.race([Promise.all([G.done,ue.done]),new Promise((We)=>{ne=setTimeout(We,Ho)})]);let[se,De]=await Promise.all([G.stop(),ue.stop()]);return{exitCode:ae,timedOut:j,output:De.trim()||se.trim()}}finally{clearTimeout(ee),clearTimeout(ne),F.signal?.removeEventListener("abort",H)}}async function zo(u,g,E){let F=Ut(E.toplevel),U=Ut(E.cwd),H=fr(F,U),j=H&&jn(`${u}/${H}`)?`${u}/${H}`:u,ee=[];for(let[G,ue]of[[`${F}/node_modules`,`${u}/node_modules`],[`${U}/node_modules`,`${j}/node_modules`]]){if(!jn(G)||jn(ue))continue;Do(G,ue),ee.push(ue)}try{for(let G of E.commands){E.onProgress?.({phase:"setup",command:G});let{exitCode:ue,timedOut:ne,output:ae}=await Go(G,j,{...process.env,OSTIA_AB_SHA:g,OSTIA_AB_CANDIDATE_DIR:U},E);if(E.signal?.aborted)return!1;if(ue===0&&!ne)continue;let se=ae.split(`
5
+ `).slice(-jo).join(`
6
+ `),De=ne?`timed out after ${E.timeoutMs}ms`:`exited ${ue}`;throw new J(`Base setup ${De}: ${G}${se?`
7
+ ${se}`:""}`)}return!0}finally{for(let G of ee)No(G)}}async function Ko(u,g,E){if(jn(g))return!0;let F=`${g}.tmp-${process.pid}-${crypto.randomUUID().slice(0,8)}`;await w(F),await Ao(F,{recursive:!0});let U=Bun.spawn(["git","archive","--format=tar",u],{cwd:E.cwd,stdout:"pipe",stderr:"pipe"}),H=Bun.spawn(["tar","-x","-C",F],{stdin:U.stdout,stderr:"pipe"}),[j,ee]=await Promise.all([U.exited,H.exited]);if(j!==0||ee!==0){let G=await new Response(j!==0?U.stderr:H.stderr).text();throw await w(F),Error(`Could not extract ${u}: ${G.trim()}`)}try{if(!await zo(F,u,E))return await w(F),!1}catch(G){throw await w(F),G}await _o(F);try{Io(F,g)}catch{await w(F)}return!0}var Jo=3600000;function Yo(u){try{return process.kill(u,0),!0}catch(g){return g.code==="EPERM"}}function qo(u){let g=new Date;try{Eo(u,g,g)}catch{}}async function Qo(u,g){if(!jn(u))return 0;let E=Date.now(),F=[],U=[];for(let H of pr(u)){let j=`${u}/${H}`,ee=/\.tmp-(\d+)(?:-\w+)?$/.exec(H);if(ee){if(!Yo(Number(ee[1])))F.push(j);continue}try{U.push({path:j,mtimeMs:Oo(j).mtimeMs})}catch{}}U.sort((H,j)=>j.mtimeMs-H.mtimeMs);for(let H of U.slice(g))if(E-H.mtimeMs>Jo)F.push(H.path);for(let H of F)await w(H);return F.length}async function cn(u={}){let g=u.cwd??process.cwd(),E=`${C(g,u.outDir??An)}/ab`;if(!jn(E))return 0;let F=pr(E).length;return await w(E),F}function Xo(u,g,E,F){let U=u.paired,H=[...E.base,...E.cand],j=(ee,G)=>{let ue=dn(f(E.base.map(ee)),f(E.cand.map(ee)),F,G);if(!I(U))ue.verdict="unchanged";return ue};if(g.alloc){let ee=Math.min(...H.map((G)=>G.alloc.calls));U.retained=j((G)=>G.alloc.bytesPerOp,Wo/ee)}if(g.peakMem){let ee=H.map((ne)=>ne.peak),G=Ae(ee),ue=Math.max(...ee.map((ne)=>ne.slackBytes));if(U.peak=j((ne)=>ne.peak.peakBytes,G?Math.max(ur,ue):ur),G)u.warnings.push(G)}}function Zo(u,g,E){let F=new Map(g.measurements.map((H)=>[H.workloadId,H])),U=u.measurements.map((H)=>{let j=F.get(H.workloadId);if(!j)return H;if(H.threw&&j.threw&&H.threw.side!==j.threw.side)return{...H,threw:{side:"both",message:`${H.threw.message}
8
+ ${j.threw.message}`}};if(H.threw)return H;if(j.threw)return j;let ee=H.paired,G=j.paired;if(!ee||!G||!H.timing||!j.timing)return H;let ue=[...ee.ratios,...G.ratios],ne=[...ee.baseSamples,...G.baseSamples],ae=ie(ue,E),se=c([...H.timing.samples,...j.timing.samples]);if(ee.batch>1)se.batch=ee.batch;return{...H,timing:se,diagnosticWallNs:(H.diagnosticWallNs??0)+(j.diagnosticWallNs??0),paired:{rounds:ee.rounds+G.rounds,batch:ee.batch,baseSamples:ne,baseMedianNs:f(ne),ratios:ue,...ae,verdict:ae.flagged??"unchanged",sameOutput:ee.sameOutput&&G.sameOutput}}});return{...u,measurements:U}}function es(u){if(!u.repeats?.length)return u.medianRatio;return f([u.medianRatio,...u.repeats.map((g)=>g.medianRatio)])}function lr(u,g){let E=u.filter((le)=>!le.threw).map((le)=>le.paired).filter((le)=>le!==void 0),F=(le)=>E.filter((_e)=>_e.verdict===le).length,U=E.filter(I),H=U.reduce((le,_e)=>le+Math.log(es(_e)),0),j=U.length>0?(Math.exp(H/U.length)-1)*100:null,ee=F("regressed"),G=F("improved"),ue=u.filter((le)=>le.threw),ne=ue.some((le)=>le.threw?.side==="cand"),{memThresholdPct:ae,...se}=g,De=E.filter((le)=>le.retained||le.peak).map((le)=>[le.retained?.verdict,le.peak?.verdict]),We=De.filter((le)=>le.includes("regressed")),de=De.length>0&&{thresholdPct:ae??Fn.memThresholdPct,regressed:We.length,improved:De.filter((le)=>le.includes("improved")&&!le.includes("regressed")).length};return{...se,matched:E.length,regressed:ee,improved:G,unchanged:E.length-ee-G,unconfirmed:E.filter((le)=>le.confirmed===!1).length,outputDiffers:E.filter((le)=>!le.sameOutput).length,notComparable:E.length-U.length,threw:ue.length,...de&&{memory:de},geomeanPct:j,verdict:ee>0||ne||We.length>0||j!==null&&j>g.geomeanThresholdPct?"fail":"pass"}}async function he(u){let g=u.base??Fn.base,E=u.rounds??Fn.rounds,F=u.thresholdPct??Fn.thresholdPct,U=u.geomeanThresholdPct??Fn.geomeanThresholdPct,H=u.memThresholdPct??Fn.memThresholdPct,j=u.confirm??Fn.confirm,ee=u.keepTrees??Fn.keepTrees;if(!Number.isInteger(ee)||ee<1)throw RangeError(`ab: keepTrees must be an integer >= 1, got ${ee}`);if(!Number.isInteger(E)||E<3)throw RangeError(`ab: rounds must be an integer >= 3, got ${E}`);if(!Number.isInteger(j)||j<0)throw RangeError(`ab: confirm must be an integer >= 0, got ${j}`);for(let[Qe,Ge]of Object.entries({thresholdPct:F,geomeanThresholdPct:U,memThresholdPct:H}))if(!Number.isFinite(Ge)||Ge<0)throw RangeError(`ab: ${Qe} must be >= 0, got ${Ge}`);Ln("ab",{timeoutMs:u.timeoutMs});let G=u.cwd??process.cwd(),ue=C(G,u.outDir??An),ne=Oe(ue,"ab"),ae=u.suites.map((Qe)=>C(G,Qe));for(let[Qe,Ge]of ae.entries())$e(u.suites[Qe],Ge);let se=cr(["rev-parse","--show-toplevel"],G);if(se===void 0)throw new _(`${G} is not inside a git repository.`);let De=cr(["rev-parse","--verify","--quiet",`${g}^{commit}`],G);if(De===void 0)throw new _(`"${g}" is not a commit in ${se}.`);let We=typeof u.baseSetup==="string"?[u.baseSetup]:u.baseSetup??[],de=Lo(`${ue}/ab`,De,We),le=await Ko(De,de,{commands:We,toplevel:se,cwd:G,timeoutMs:u.timeoutMs,signal:u.signal,onProgress:u.onProgress}),_e={base:{ref:g,sha:De},rounds:E,thresholdPct:F,geomeanThresholdPct:U,memThresholdPct:H};if(!le){let Qe=r([],[]);return Qe.unmatched={baseOnly:[],candOnly:[]},Qe.ab=lr([],_e),Qe}let{environment:Ne,noiseWarning:Le}=O(u.noiseCheck),Ve=ae.map((Qe,Ge)=>{let un=fr(se,Ut(Qe));if(un===".."||un.startsWith(`..${Fo}`))throw new l(`${u.suites[Ge]} is outside ${se}.`);return jn(`${de}/${un}`)?`${de}/${un}`:""}),ze=await Promise.all(ae.map(async(Qe,Ge)=>{if(!Ve[Ge])return!1;let un=await Bun.file(Ve[Ge]).text(),Rn=await Bun.file(Qe).text();return(un.endsWith(_t)?un.slice(0,-_t.length):un)!==Rn})),rn=(u.preload??[]).map((Qe)=>C(G,Qe)),Je=u.bunFlags??[],nn=u.onProgress,sn=0,Sn=async(Qe,Ge={},un)=>{qo(de);let Rn=`${ne}/${n("ab-run",ae[Qe],sn++)}.json`,Un={filter:u.filter,rounds:E,thresholdPct:F,preload:rn,progress:nn!==void 0&&!Ge.workloadIds&&!Ge.memoryFor,...Ge},et;try{et=await Ee(["bun",...Je,Bo,ae[Qe],Ve[Qe],Rn,JSON.stringify(Un)],{cwd:G,label:"A/B suite",name:u.suites[Qe],timeoutMs:u.timeoutMs,signal:u.signal,env:un,errorFile:`${Rn}.error`,...Un.progress&&{ipc:(_n)=>nn?.({phase:"measure",suite:Qe+1,suites:ae.length,file:u.suites[Qe],pass:Ge.candFirst?2:1,passes:2,..._n})}})}catch(_n){let nt=Bun.file(`${Rn}.side`);if(!await nt.exists())throw _n;throw new V(_n.message,await nt.text())}return et?Rn:void 0},Wn=async(Qe,Ge={})=>{let un=await Sn(Qe,{...Ge,rounds:Math.ceil(E/2)});if(!un)return;let Rn=await Sn(Qe,{...Ge,planPath:void 0,rounds:Math.floor(E/2),candFirst:!0});if(!Rn)return;return Zo(await a(un),await a(Rn),F)};try{let Qe=[],Ge=[],un=new Map,Rn=[],Un=[],et=[];for(let Xe=0;Xe<ae.length;Xe++){let Mn=`${ne}/${n("ab-plan",ae[Xe])}.json`,Cn=await Wn(Xe,{alloc:u.alloc,peakMem:u.peakMem,planPath:Mn});if(!Cn)break;let In=await Bun.file(Mn).json();for(let xn of In.memory)et.push({...xn,suite:Xe});Qe.push(...Cn.workloads),Ge.push(...Cn.measurements);for(let xn of Cn.measurements){if(un.set(xn.workloadId,Xe),!ze[Xe]||!xn.paired)continue;if(xn.paired.suiteChanged=!0,!I(xn.paired))xn.paired.verdict="unchanged";xn.warnings.push({code:"suite-changed",message:I(xn.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??[]),Un.push(...Cn.unmatched?.candOnly??[])}let _n=Ge.filter((Xe)=>Xe.paired?.flagged&&j>0&&I(Xe.paired)),nt=new Map(Qe.map((Xe)=>[Xe.id,Xe.entry?.task??Xe.id])),zr=0;for(let Xe of _n){let Mn=Xe.paired,Cn=Mn.flagged;Mn.repeats=[];for(let In=0;In<j&&!u.signal?.aborted;In++){nn?.({phase:"confirm",repeat:++zr,repeats:_n.length*j,label:nt.get(Xe.workloadId)??Xe.workloadId});let Vn=(await Wn(un.get(Xe.workloadId),{workloadIds:[Xe.workloadId]}))?.measurements[0];if(Vn?.threw){Xe.threw={...Vn.threw,repeat:In+1};break}let vn=Vn?.paired;if(!vn)break;Mn.repeats.push({medianRatio:vn.medianRatio,ratioP25:vn.ratioP25,ratioP75:vn.ratioP75,...vn.flagged&&{flagged:vn.flagged}})}Mn.confirmed=!Xe.threw&&Mn.repeats.length===j&&Mn.repeats.every((In)=>In.flagged===Cn),Mn.verdict=Mn.confirmed?Cn:"unchanged"}let Kt=new Map(Ge.map((Xe)=>[Xe.workloadId,Xe])),Jt=et.filter(({workloadId:Xe})=>{let Mn=Kt.get(Xe);return Mn?.paired&&!Mn.threw}),Kr=Jt.length*ce*2,Jr=0;for(let Xe of Jt){let{workloadId:Mn,suite:Cn,peakMem:In}=Xe,xn={base:[],cand:[]};for(let Vn=0;Vn<ce&&!u.signal?.aborted;Vn++)for(let vn of["base","cand"]){if(u.signal?.aborted)break;nn?.({phase:"memory",run:++Jr,runs:Kr,side:vn,label:nt.get(Mn)??Mn});let Yt=await Sn(Cn,{memoryFor:{...Xe,side:vn}},In?{OSTIA_PEAK_MEM:"1"}:void 0);if(Yt)xn[vn].push(await Bun.file(Yt).json())}if(xn.base.length===0||xn.cand.length===0)continue;Xo(Kt.get(Mn),Xe,xn,H)}Ie(Ge,Le,u.signal?.aborted?"Run was cancelled before it finished; this document holds whatever suites had already completed.":void 0);let Dt=r(Qe,Ge,Ne);return Dt.unmatched={baseOnly:Rn,candOnly:Un},Dt.ab=lr(Ge,{..._e,newSuites:u.suites.filter((Xe,Mn)=>!Ve[Mn])}),await Qo(`${ue}/ab`,ee),Dt}finally{await w(ne)}}import{resolve as ns}from"path";var ts=["node_modules",".git"],gr=/[*?[\]{}!]/;function rs(u,g){let E=u.split("/"),F=E.findIndex((H)=>gr.test(H)),U=F<0?E.length:F;return[E.slice(U),g.split("/").slice(U)]}async function z(u,g){let E=new Set;for(let F of u){if(!gr.test(F)){if(await Bun.file(ns(g,F)).exists())E.add(F);continue}for await(let U of new Bun.Glob(F).scan({cwd:g,dot:!0})){let[H,j]=rs(F,U);if(!j.some((G)=>ts.includes(G)&&!H.includes(G)))E.add(U)}}return[...E].sort()}var os=new URL("./runner.ts",import.meta.url).pathname;function Ze(){return Math.max(1,navigator.hardwareConcurrency||1)}async function re(u,g,E=process.cwd()){return{suites:u.suites.length>0?u.suites:g?.suites?await z(g.suites,E):[],budgetMs:u.budgetMs??g?.budgetMs,samples:u.samples??g?.samples,minSamples:u.minSamples??g?.minSamples,jobs:u.jobs??(g?.jobs==="auto"?Ze():g?.jobs),gc:u.gc??g?.gc??!1,cpu:u.cpu??g?.cpu??!1,cpuIntervalUs:u.cpuIntervalUs??g?.cpuIntervalUs,alloc:u.alloc??g?.alloc??!1,peakMem:u.peakMem??g?.peakMem??!1,filter:u.filter??g?.filter,isolate:u.isolate??g?.isolate??!1,preload:u.preload.length>0?u.preload:g?.preload??[],bunFlags:u.bunFlags.length>0?u.bunFlags:g?.bunFlags??[],outDir:u.outDir??g?.outDir,noiseCheck:u.noiseCheck,timeoutMs:u.timeoutMs??g?.timeoutMs,cwd:E}}function ss(u,g){if(!g?.length)return[];let E=f(g.map((U)=>U.peakBytes)),F=Ae(g);return[P({workload:u,phase:"memstats",configFingerprint:i({peakMem:!0}),diagnosticWallNs:f(g.map((U)=>U.wallNs)),memory:{origin:"resourceUsage",kind:"peak",peakBytes:E},warnings:F?[F]:[],artifacts:[]})]}async function K(u){Ln("bench",u);let g=u.jobs??1;if(!Number.isInteger(g)||g<1)throw RangeError(`bench: jobs must be an integer >= 1, got ${g}`);let E=u.cwd??process.cwd(),F=Oe(C(E,u.outDir??An),"bench"),U=u.suites.map((se)=>C(E,se));for(let[se,De]of U.entries())$e(u.suites[se],De);let H=(u.preload??[]).map((se)=>C(E,se)),j=u.bunFlags??[],{environment:ee,noiseWarning:G}=O(u.noiseCheck),ue={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},ne=(se,De,...We)=>`${F}/${n(se,U[De],...We)}.json`,ae=async(se,De)=>{let We=new Set,de=0,le,_e=async()=>{while(le===void 0&&!u.signal?.aborted&&de<se.length){let Ne=se[de++];try{if(!await Ee(["bun",...j,os,U[Ne.suiteIndex],Ne.outPath,JSON.stringify(Ne.runnerOpts)],{label:"Bench suite",name:u.suites[Ne.suiteIndex],cwd:E,env:De,timeoutMs:u.timeoutMs,signal:u.signal,inFlight:We}))return}catch(Le){le??=Le instanceof Error?Le:Error(String(Le));for(let Ve of We)Ve.kill()}}};if(await Promise.all(Array.from({length:Math.min(g,se.length)},_e)),le)throw le};try{let se=U.map((Je,nn)=>({planPath:ne("bench-plan",nn),outPath:ne("bench-primary",nn)}));await ae(se.map((Je,nn)=>({suiteIndex:nn,outPath:Je.outPath,runnerOpts:{...ue,filter:u.filter,isolate:u.isolate,preload:H,planPath:Je.planPath}})));let De=await Promise.all(se.map(async(Je)=>await Bun.file(Je.planPath).exists()?(await Bun.file(Je.planPath).json()).tasks:[])),We=await Promise.all(se.map((Je)=>en(Je.outPath))),de=De.flatMap((Je,nn)=>Je.filter((sn)=>sn.isolate).map((sn)=>({task:sn,suiteIndex:nn}))),le=de.map((Je,nn)=>ne("bench-item",Je.suiteIndex,nn));await ae(de.map((Je,nn)=>({suiteIndex:Je.suiteIndex,outPath:le[nn],runnerOpts:{...ue,workloadIds:[Je.task.workloadId],preload:H,markIsolated:!0}})));let _e=new Map;await Promise.all(de.map(async(Je,nn)=>{let sn=await en(le[nn]);if(sn)_e.set(Je.task,sn)}));let Ne=De.flatMap((Je,nn)=>Je.filter((sn)=>sn.peakMem).flatMap((sn)=>Array.from({length:ce},()=>({workloadId:sn.workloadId,suiteIndex:nn})))),Le=Ne.map((Je,nn)=>ne("bench-peak",Je.suiteIndex,nn));await ae(Ne.map((Je,nn)=>({suiteIndex:Je.suiteIndex,outPath:Le[nn],runnerOpts:{filter:u.filter,preload:H,peakMemFor:Je.workloadId}})),{OSTIA_PEAK_MEM:"1"});let Ve=new Map;for(let Je=0;Je<Ne.length;Je++){let nn=Bun.file(Le[Je]);if(!await nn.exists())continue;let sn=Ne[Je].workloadId,Sn=Ve.get(sn)??[];Sn.push(await nn.json()),Ve.set(sn,Sn)}let ze=[],rn=[];return De.forEach((Je,nn)=>{let sn=We[nn];if(!sn)return;let Sn=Map.groupBy(sn.measurements,(Qe)=>Qe.workloadId),Wn=0;for(let Qe of Je){let Ge,un;if(Qe.isolate){let Rn=_e.get(Qe);if(!Rn)continue;Ge=Rn.workloads[0],un=Rn.measurements.filter((Un)=>Un.workloadId===Ge.id)}else Ge=sn.workloads[Wn++],un=Sn.get(Ge.id)??[];ze.push(Ge),rn.push(...un,...ss(Ge,Ve.get(Ge.id)))}}),Ie(rn,G,u.signal?.aborted?"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed.":void 0),v(ee),r(ze,rn,ee)}finally{await w(F)}}function bn(u,g,E=8){if(E<=1)throw RangeError(`range: multiplier must be > 1, got ${E}`);if(u<=0)throw RangeError(`range: start must be > 0, got ${u}`);let F=[];for(let U=u;U<=g;U*=E)F.push(U);if(!F.includes(g))F.push(g);return F}function hr(u){return u.cpu!==void 0}function Lt(u,g){if(g){let E=u.measurements.find((F)=>F.id===g);return E&&hr(E)?[E]:[]}return u.measurements.filter((E)=>E.phase==="cpu"&&hr(E))}function Hn(u,g,E,F){return{files:Lt(u,g.measurementId).map((U)=>({path:`${U.id}.${E}`,content:F(U)}))}}function Gn(u){let g=u.nodes,E=g.length,F=is(u),U=new Int32Array(E).fill(-1);for(let G=0;G<E;G++)for(let ue of g[G].children){let ne=F(ue);if(ne!==-1)U[ne]=G}let H=[];for(let G=0;G<E;G++)if(U[G]===-1)H.push(G);let j=[],ee=[];for(let G=H.length-1;G>=0;G--)ee.push(H[G]);while(ee.length>0){let G=ee.pop();j.push(G);for(let ue of g[G].children){let ne=F(ue);if(ne!==-1&&U[ne]===G)ee.push(ne)}}return{count:E,indexOf:F,parentIx:U,roots:H,order:j}}function is(u){let g=u.nodes,E=g.length,F=1/0,U=-1/0,H=!0;for(let ee=0;ee<E;ee++){let G=g[ee].id;if(!Number.isInteger(G)){H=!1;break}if(G<F)F=G;if(G>U)U=G}if(H&&E>0&&U-F<E*4+64){let ee=U-F+1,G=new Int32Array(ee).fill(-1);for(let ue=0;ue<E;ue++)G[g[ue].id-F]=ue;return(ue)=>{let ne=ue-F;return ne>=0&&ne<ee?G[ne]:-1}}let j=new Map;for(let ee=0;ee<E;ee++)j.set(g[ee].id,ee);return(ee)=>j.get(ee)??-1}function br(u,g){let{count:E,indexOf:F,parentIx:U,order:H}=g,j=new Float64Array(E),ee=new Float64Array(E),G=u.samples?.nodeIds??[],ue=u.samples?.timeDeltasUs??[];for(let ae=0;ae<G.length;ae++){let se=F(G[ae]);if(se===-1)continue;j[se]+=ue[ae]??0,ee[se]+=1}let ne=new Float64Array(E);for(let ae=H.length-1;ae>=0;ae--){let se=H[ae];ne[se]+=j[se];let De=U[se];if(De>=0)ne[De]+=ne[se]}return{selfUs:j,totalUs:ne,samples:ee}}var wr={name:"collapsed",async render(u,g={}){return Hn(u,g,"collapsed.txt",({cpu:E})=>{let{nodes:F,frames:U}=E,H=Gn(E),j=Array(H.count);for(let ne of H.order){let ae=N(U[F[ne].frameIx]),se=H.parentIx[ne];j[ne]=se===-1?ae:`${j[se]};${ae}`}let ee=new Float64Array(H.count),G=[];for(let ne of E.samples?.nodeIds??[]){let ae=H.indexOf(ne);if(ae===-1)continue;if(ee[ae]++===0)G.push(ae)}let ue=G.map((ne)=>`${j[ne]} ${ee[ne]}`);return ue.length>0?`${ue.join(`
9
+ `)}
10
+ `:""})}};var yr={name:"cpuprofile",async render(u,g={}){let E=[],F=[];for(let U of Lt(u,g.measurementId)){let{origin:H}=U.cpu;if(H!=="cpu-prof"&&H!=="inspector"){F.push(`${U.id} (origin ${H} has no .cpuprofile artifact to pass through)`);continue}let j=U.artifacts.find((G)=>G.kind==="cpuprofile");if(!j){F.push(`${U.id} (no cpuprofile artifact recorded on this run)`);continue}let ee=Bun.file(j.path);if(!await ee.exists()){F.push(`${U.id} (artifact missing on disk: ${j.path})`);continue}E.push({path:`${U.id}.cpuprofile`,content:await ee.text()})}if(E.length===0&&F.length>0)return{text:`No .cpuprofile artifacts available:
11
+ ${F.map((U)=>` - ${U}`).join(`
12
+ `)}
13
+ `};return{files:E}}};var kr={name:"json",async render(u){return{text:Y(u)}}};var Pr={name:"jsonl",async render(u){let{measurements:g,...E}=u;return{text:`${[S({kind:"document",...E}),...g.map((U)=>S({kind:"measurement",...U}))].join(`
14
+ `)}
15
+ `}}};var Mr=0.5;function $n(u){return new Map(u.workloads.map((g)=>[g.id,g]))}function zn(u){return u.measurements.filter((g)=>g.phase==="timing"&&g.timing!==void 0)}function Kn(u){return u.measurements.filter((g)=>g.phase==="timing"&&g.timing===void 0)}function Jn(u,g){let E=new Set(g.map((F)=>F.workloadId));return u.workloads.filter((F)=>F.skipped&&!E.has(F.id))}function dt(u){for(let g of u.comparisons??[]){let E=g.warnings?.find((F)=>F.code==="environment-mismatch");if(E)return E}return}function lt(u){return(u.warnings??[]).filter((g)=>g.code!=="environment-mismatch")}function as(u){let g=$n(u),E=new Map(u.measurements.map((F)=>[F.id,F]));return(F)=>{let U=E.get(F.candidateMeasurementId),H=U?.workloadId??F.candidateMeasurementId;return{run:U,workloadId:H,workload:g.get(H)}}}function pt(u,g){return(u.frames??[]).slice(0,g).filter((E)=>Math.abs(E.deltaPct)>=Mr)}function ft(u,g){return(u.heapTypes??[]).slice(0,g).filter((E)=>Math.abs(E.deltaPct)>=Mr)}function Yn(u){let g=new Map;for(let E of u.measurements){if(E.phase!=="memstats"||!E.memory)continue;let F=g.get(E.workloadId)??{warnings:[]};if(E.memory.bytesPerOp!==void 0)F.retained=E.memory.bytesPerOp;if(E.memory.peakBytes!==void 0)F.peak=E.memory.peakBytes;F.warnings.push(...E.warnings),g.set(E.workloadId,F)}return g}function it(u,g){let E=g.get(u.workloadId)?.warnings;return E?.length?[...u.warnings,...E]:u.warnings}function gt(u){return[{header:"Retained/op",read:(E)=>E.retained},{header:"Peak mem",read:(E)=>E.peak}].filter((E)=>{for(let F of u.values())if(E.read(F)!==void 0)return!0;return!1}).map((E)=>({header:E.header,cell:(F)=>{let U=u.get(F),H=U&&E.read(U);return H===void 0?void 0:b(H)}}))}function qn(u){if(!u.compared&&!u.comparisons?.length&&!u.unmatched)return[];let g=new Map((u.comparisons??[]).map((F)=>[F.id,F]));return(u.compared??ms(u)).map((F)=>({row:F,cmp:F.comparisonId===void 0?void 0:g.get(F.comparisonId)}))}function ms(u){let g=as(u),E=$n(u),F=(U,H)=>{let j=E.get(U);return{workloadId:U,task:s(j,U),...j?.entry?.group!==void 0&&{group:j.entry.group},verdict:H}};return[...(u.comparisons??[]).map((U)=>{let{run:H,workload:j,workloadId:ee}=g(U),G={workloadId:ee,task:j?m(j):ee,...j?.entry?.group!==void 0&&{group:j.entry.group},verdict:U.timing?.verdict??"unchanged",comparisonId:U.id,pass:U.verdict==="pass"};if(U.timing&&H?.timing){let{medianDeltaPct:ue,ci95:ne,pValue:ae}=U.timing;G.timing={unit:"ns",baseMedian:H.timing.median/(1+ue/100),candMedian:H.timing.median,candSamples:H.timing.samples.length,medianDeltaPct:ue,...ne&&{ci95:ne},...ae!==void 0&&{pValue:ae},thresholdPct:U.thresholds.effectiveTimingPct}}return G}),...(u.unmatched?.candOnly??[]).map((U)=>F(U,"missing-base")),...(u.unmatched?.baseOnly??[]).map((U)=>F(U,"missing-cand"))]}var us=10,cs={heapUsedBefore:"heap used before",heapUsedAfter:"heap used after",retained:"retained/op",peak:"peak",maxRss:"max RSS"};function ht(u,g="\u2192"){return(u.memory??[]).filter((E)=>!(Math.abs(E.deltaPct)<us)).map((E)=>`${cs[E.reading]} ${b(E.baseBytes)} ${g} ${b(E.candBytes)} (${Number.isFinite(E.deltaPct)?t(E.deltaPct):"new"})`)}function bt(u){let g=u.comparisonSummary,E=u.comparisons?.[0]?.thresholds.timingPct;if(!g||E===void 0)return;if(!(g.effectiveTimingPct>E))return;let F=g.driftPct!==void 0&&g.driftPct>0?` and drift (${g.driftPct.toFixed(1)}%); \`ostia ab\` alternates base and candidate in one process, so drift can't favor either`:"";return`Timing threshold ${E.toFixed(1)}%, widened to ${g.effectiveTimingPct.toFixed(1)}% by machine noise${F}`}function wt(u){return u==="missing-base"?"candidate only (new, or renamed without `aliases`)":"base only (removed, or renamed without `aliases`)"}function Rr(u){return u.phase==="paired"&&u.threw!==void 0}function Tr(u){return u.phase==="paired"&&u.threw===void 0&&u.timing!==void 0&&u.paired!==void 0}function Qn(u){return u.measurements.filter(Tr)}function kt(u){return u.measurements.filter(Rr)}function xr(u){let g=[];for(let E of u.measurements)if(Rr(E))g.push({kind:"threw",run:E});else if(Tr(E))g.push({kind:"timed",run:E});return g}function Pt(u){return`${y(u.side)} threw${u.repeat?` (repeat ${u.repeat})`:""}`}function yt(u){return t((u-1)*100)}function ds(u){if(!I(u))return"not comparable";if(!u.flagged)return"";let g=u.repeats?.length?` (repeats: ${u.repeats.map((E)=>yt(E.medianRatio)).join(", ")})`:"";if(u.confirmed===void 0)return`${u.flagged}${g}`;return`${u.confirmed?`${u.flagged}, confirmed`:`${u.flagged}? unconfirmed`}${g}`}function Mt(u){if(!u.newSuites?.length)return;return`New suite${u.newSuites.length>1?"s":""}, not at ${u.base.ref}: ${u.newSuites.join(", ")}`}function Rt(u){let g=u.paired,E=R(Math.min(g.baseMedianNs,u.timing.median));return{base:e(g.baseMedianNs,E),candidate:e(u.timing.median,E),change:yt(g.medianRatio),spread:`${yt(g.ratioP25)}\u2026${yt(g.ratioP75)}`,verdict:ds(g)}}function Tt(u){return Qn(u).flatMap((g)=>{let E=[],{retained:F,peak:U}=g.paired;if(F)E.push({run:g,reading:"retained/op",change:F});if(U)E.push({run:g,reading:"peak",change:U});return E})}function ls(u){let g=Math.round(u.baseBytes),E=Math.round(u.candBytes)-g;if(E===0)return"0B";let F=`${E>0?"+":"-"}${b(Math.abs(E))}`;if(g===0||u.baseBytes<u.floorBytes)return F;return`${F} (${t(E/g*100)})`}function xt({reading:u,change:g}){return{reading:u,base:b(g.baseBytes),candidate:b(g.candBytes),change:ls(g),verdict:g.verdict==="unchanged"?"":g.verdict}}function $t(u){let g=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}%${g}`}function St(u){let g=u.geomeanPct===null?"Geomean -":`Geomean ${t(u.geomeanPct)} (threshold ${u.geomeanThresholdPct}%)`,E=[u.unconfirmed>0&&`${u.unconfirmed} unconfirmed`,u.notComparable>0&&`${u.notComparable} not comparable`,u.threw>0&&`${u.threw} threw`].filter(Boolean),F=E.length>0?` (${E.join(", ")})`:"",U=u.memory?` \xB7 memory: ${u.memory.regressed} regressed, ${u.memory.improved} improved`:"";return`${g} \xB7 ${u.regressed} regressed, ${u.improved} improved, ${u.unchanged} unchanged of ${u.matched}${F}${U} \xB7 ${u.verdict}`}function Ct(u){let g=$n(u),E=(F)=>s(g.get(F),F);return{outputDiffers:Qn(u).filter((F)=>!F.paired.sameOutput).map((F)=>E(F.workloadId)),baseOnly:(u.unmatched?.baseOnly??[]).map(E),candOnly:(u.unmatched?.candOnly??[]).map(E)}}function Bn(u){if(!u?.entry)return;if(u.entry.group!==void 0)return u.entry.group;let g=u.entry.task,E=g.lastIndexOf("/");return E===-1?void 0:g.slice(0,E)}function $r(u,g){return g!==void 0&&u.startsWith(`${g}/`)?u.slice(g.length+1):u}function Xn(u){if(u.length<2)return;let g=Math.min(...u.map((U)=>U.run.timing.median)),E=new Map;for(let U of u){let H=Bn(U.workload);if(H===void 0)continue;let j=E.get(H);if(j)j.push(U);else E.set(H,[U])}let F=new Map;for(let U of u){let H=Bn(U.workload),j=g;if(H!==void 0){let ee=E.get(H),G=ee.find((ue)=>ue.workload?.baseline);j=G?G.run.timing.median:Math.min(...ee.map((ue)=>ue.run.timing.median))}F.set(U,U.run.timing.median/j)}return F}var Sr=10,Cr=10,Tn=(u)=>gn(String(u));function Zn(u,g){return[`| ${u.join(" | ")} |`,`|${u.map(()=>"---").join("|")}|`,...g.map((E)=>`| ${E.join(" | ")} |`)]}function ps(u){if(!u?.params)return"";return` (${Object.entries(u.params).map(([E,F])=>`${E}=${F}`).join(", ")})`}function at(u,g){return Tn(s(u,g)+ps(u))}function jt(u){return`${u.message} (\`${u.code}\`)`}function vr(u,g){return g.map((E)=>`- **${u}**: ${jt(E)}`)}function fs(u){let g;for(let E of u){let F=E?.params?Object.keys(E.params):void 0;if(F?.length!==2)return;if(g===void 0)g=F;else if(F.some((U,H)=>U!==g[H]))return}return g}var Ir={name:"markdown",async render(u){let g=$n(u),E=u.git?` \xB7 ${L(u.git)}`:"",F=dt(u);return{text:["# Profile Report","",`Bun ${u.bunVersion} \xB7 ostia ${u.toolVersion} \xB7 ${u.platform.os}/${u.platform.arch} \xB7 ${u.createdAt}${E}`,"",...u.environment?[Se(u.environment),""]:[],...F?[`> \u26A0 ${F.message}`,""]:[],...u.ab?gs(u,u.ab,g):[],...hs(u,g),...bs(u,g),...ks(u)].join(`
16
+ `)}}};function gs(u,g,E){let F=Qn(u),U=["## A/B","",$t(g),""];if(F.length>0)U.push(...Zn(["Task","Base","Candidate","Change","p25\u2026p75","Verdict"],F.map((ne)=>{let ae=Rt(ne);return[at(E.get(ne.workloadId),ne.workloadId),ae.base,ae.candidate,ae.change,ae.spread,ae.verdict?`**${Tn(ae.verdict)}**`:""]})),"");let H=Tt(u);if(H.length>0)U.push(...Zn(["Task","Memory","Base","Candidate","Change","Verdict"],H.map((ne)=>{let ae=xt(ne);return[at(E.get(ne.run.workloadId),ne.run.workloadId),ae.reading,ae.base,ae.candidate,ae.change,ae.verdict?`**${ae.verdict}**`:""]})),"");let j=kt(u);if(j.length>0){U.push(`Threw (${j.length}):`,"");for(let ne of j){let ae=ne.threw.message.split(`
17
+ `)[0].replaceAll("`","'");U.push(`- **${at(E.get(ne.workloadId),ne.workloadId)}**: ${Pt(ne.threw)}: \`${ae}\``)}U.push("")}let ee=Ct(u),G=(ne,ae)=>ae.length>0?`${ne}: ${ae.map(Tn).join(", ")}`:void 0;for(let ne of[G("Output differs from the base",ee.outputDiffers),Mt(g),G("Base only",ee.baseOnly),G("Candidate only",ee.candOnly)])if(ne)U.push(ne,"");let ue=F.flatMap((ne)=>vr(s(E.get(ne.workloadId),ne.workloadId),ne.warnings));if(ue.length>0)U.push(...ue,"");return U.push(`**${St(g)}**`,""),U}function hs(u,g){let E=zn(u),F=Kn(u),U=Yn(u),H=[...Jn(u,E).map((se)=>({id:se.id,workload:se,status:"skipped"})),...F.map((se)=>({id:se.workloadId,workload:g.get(se.workloadId),status:"no samples"}))];if(E.length===0&&H.length===0)return[];let j=["## Timing",""],ee=E.map((se)=>({run:se,workload:g.get(se.workloadId)})),G=new Map,ue=[];for(let se of ee){let De=Bn(se.workload);if(De===void 0)ue.push(se);else if(G.has(De))G.get(De).push(se);else G.set(De,[se])}let ne=[];for(let[se,De]of G){let We=fs(De.map((de)=>de.workload));if(We)ne.push({group:se,keys:We,rows:De});else ue.push(...De)}if(ue.length>0||H.length>0){let se=Xn(ee),De=[],We=new Map(ue.map((de)=>[de,X(de.run)]));if([...We.values()].some(Boolean))De.push({header:"User/Sys",cell:(de)=>{let le=We.get(de);return le?Ce(le):"-"}});for(let de of gt(U))De.push({header:de.header,cell:(le)=>de.cell(le.run.workloadId)??"-"});if(se)De.push({header:"Relative",cell:(de)=>ve(se.get(de),!!de.workload?.baseline)});j.push(...Zn(["Task","Median","Spread (p75\u2026p99)","Mean \xB1 SD","Range","MAD",...De.map((de)=>de.header)],[...ue.map((de)=>{let le=de.run.timing,_e=R(le.median);return[at(de.workload,de.run.workloadId),e(le.median,_e),Z(le.p75,le.p99,_e),`${e(le.mean,_e)} \xB1 ${e(le.stddev,_e)}`,Z(le.min,le.max,_e),e(le.mad,_e),...De.map((Ne)=>Ne.cell(de))]}),...H.map(({id:de,workload:le,status:_e})=>[at(le,de),`- ${_e}`,"-","-","-","-",...De.map(()=>"-")])]),"")}for(let{group:se,keys:[De,We],rows:de}of ne){let le=[],_e=[],Ne=new Map;for(let{run:Le,workload:Ve}of de){let ze=Ve.params[De],rn=Ve.params[We];if(!le.includes(ze))le.push(ze);if(!_e.includes(rn))_e.push(rn);Ne.set(`${ze} ${rn}`,Le.timing.median)}j.push(`### ${Tn(se)} (${Tn(De)} \xD7 ${Tn(We)})`,"",...Zn([`${Tn(De)} \\ ${Tn(We)}`,..._e.map(Tn)],le.map((Le)=>[Tn(Le),..._e.map((Ve)=>{let ze=Ne.get(`${Le} ${Ve}`);return ze===void 0?"-":e(ze)})])),"")}let ae=[...E,...F].flatMap((se)=>vr(s(g.get(se.workloadId),se.workloadId),it(se,U)));if(ae.length>0)j.push("### Warnings","",...ae,"");return j}function bs(u,g){let E=[];for(let F of u.measurements){if(F.phase!=="cpu"&&F.phase!=="heap")continue;let U=s(g.get(F.workloadId),F.workloadId);E.push(F.phase==="cpu"?`## CPU capture - ${U}`:`## Heap snapshot - ${U}`,"",`instrumented, diagnostic wall ${Me(F.diagnosticWallNs??0)}ms`,"",...F.phase==="cpu"?ws(F):ys(F));let H=[...F.artifacts.map((j)=>`- artifact: \`${j.path}\``),...F.warnings.map((j)=>`- ! ${jt(j)}`)];if(H.length>0)E.push(...H,"")}return E}function ws(u){let{cpu:g}=u;if(!g)return[];let E=[`origin: \`${g.origin}\`, interval: ${g.samplingIntervalUs}\xB5s, samples: ${Q(g)}`,"",...Zn(["Self %","Self (ms)","Total (ms)","Frame"],Te(g,Sr).map((F)=>[`${F.pct}%`,p(F.selfUs),p(F.totalUs),Tn(N(F.frame))])),""];if(u.jit){let F=u.jit.tiers;E.push(`JIT tiers: LLInt ${F.llint} \xB7 Baseline ${F.baseline} \xB7 DFG ${F.dfg} \xB7 FTL ${F.ftl}`,"")}return E}function ys(u){let{heap:g}=u;if(!g)return[];return[Re(g),"",...Zn(["Count","Type"],g.typeCounts.slice(0,Cr).map((E)=>[String(E.count),Tn(E.type)])),""]}function ks(u){let g=qn(u);if(g.length===0)return[];let E=["## Comparisons",""],F=bt(u);if(F)E.push(`${F}.`,"");let U=[];for(let{row:H,cmp:j}of g){if(H.verdict==="missing-base"||H.verdict==="missing-cand"){U.push(`- \`${Tn(H.task)}\`: ${wt(H.verdict)}`);continue}if(E.push(`### ${H.pass===!1?"\u2717":"\u2713"} ${H.task}`,""),H.renamedFrom)E.push(`- renamed from \`${Tn(H.renamedFrom.task)}\``);if(H.timing){let{baseMedian:G,candMedian:ue,medianDeltaPct:ne,ci95:ae,pValue:se}=H.timing,De=j?.thresholds.alpha,We=H.verdict==="unchanged"&&se!==void 0&&De!==void 0&&se>=De?"~":"",de=R(Math.max(G,ue)),le=[`n=${H.timing.candSamples}`];if(ae)le.push(`95% CI [${t(ae[0])}, ${t(ae[1])}]`);if(se!==void 0)le.push(`p=${se.toFixed(4)}`);le.push(`threshold ${H.timing.thresholdPct.toFixed(1)}%`),E.push(`- timing: ${e(G,de)} \u2192 ${e(ue,de)}, ${We}${t(ne)} median, ${le.join(", ")} (**${H.verdict}**)`)}let ee=ht(H);if(ee.length>0)E.push(`- memory: ${ee.join(", ")}`);if(j){for(let G of pt(j,Sr))E.push(`- frame \`${Tn(G.name)}\`: ${t(G.deltaPct)} self-time (${p(G.baseSelfUs)}ms \u2192 ${p(G.candSelfUs)}ms)`);for(let G of ft(j,Cr))E.push(`- heap \`${Tn(G.type)}\`: ${t(G.deltaPct)} count (${G.baseCount} \u2192 ${G.candCount})`);for(let G of lt(j))E.push(`- ! ${jt(G)}`)}E.push("")}if(U.length>0)E.push("### Not compared","",...U,"");return E}var Ps=15;function Ms(u,g,E){return`${u.replace(/"/g,"'")} (self ${p(g)}ms, total ${p(E)}ms)`}function Rs(u,g,E,F){let U=[];if(F<=0)return U;for(let H=0;H<g;H++){if(H===E)continue;let j=u[H];if(U.length===F&&j<=u[U[F-1]])continue;let ee=U.length;while(ee>0&&u[U[ee-1]]<j)ee--;if(U.splice(ee,0,H),U.length>F)U.pop()}return U}var Or={name:"mermaid",async render(u,g={}){let E=g.topN??Ps;return Hn(u,g,"mermaid.md",({cpu:F})=>{let{nodes:U,frames:H}=F,j=Gn(F),{selfUs:ee,totalUs:G}=br(F,j),{parentIx:ue}=j,ne=j.roots[0]??-1,ae=new Set(ne!==-1?[ne]:[]);for(let We of Rs(ee,j.count,ne,E)){let de=[];for(let le=We;le!==-1;le=ue[le])de.push(le);for(let le=de.length-1;le>=0;le--)ae.add(de[le])}let se=(We)=>`n${U[We].id}`,De=["graph TD"];for(let We of ae){let de=N(H[U[We].frameIx]);De.push(` ${se(We)}["${Ms(de,ee[We],G[We])}"]`)}for(let We of ae){let de=ue[We];if(de!==-1&&ae.has(de))De.push(` ${se(de)} --> ${se(We)}`)}return`${De.join(`
18
+ `)}
19
+ `})}};var M=2;function tn(u){return Number.isFinite(u)?Number(u.toPrecision(6)):u}function Dr(u){return{base:Math.round(u.baseBytes),cand:Math.round(u.candBytes),verdict:u.verdict,floor:Math.round(u.floorBytes)}}function Vt(u){return u.map((g)=>g.data?{code:g.code,data:g.data}:{code:g.code})}function Ht(u,g){if(g?.entry?.group!==void 0)u.group=g.entry.group;if(g?.description!==void 0)u.description=g.description;if(g?.groupDescription!==void 0)u.groupDescription=g.groupDescription;if(g?.params!==void 0)u.params=g.params}function Er(u,g){if(!u?.timing)return;let E={...g?.timing&&{baseMedian:tn(g.timing.baseMedian)},medianPct:tn(u.timing.medianDeltaPct),meanPct:tn(u.timing.meanDeltaPct),verdict:u.timing.verdict,pass:u.verdict==="pass",effectiveTimingPct:tn(u.thresholds.effectiveTimingPct),matched:!0};if(u.timing.ci95)E.ci95=[tn(u.timing.ci95[0]),tn(u.timing.ci95[1])];if(u.timing.pValue!==void 0)E.pValue=tn(u.timing.pValue);if(g?.renamedFrom)E.renamedFrom=g.renamedFrom.task;return E}function Nr(u,g,E,F,U,H,j){let ee={event:"run",protocolVersion:M,schemaVersion:u.schemaVersion,workloadId:g.id,task:s(g,g.id),...E,batch:1,warnings:Vt(F)};if(Ht(ee,g),j!==void 0)ee.noiseFloorPct=tn(j);let G=Er(U,H);if(G)ee.delta=G;return ee}function Ts(u){let g=$n(u),E=u.environment?.noise.floorPct,F=(_e)=>({run:_e,workload:g.get(_e.workloadId)}),U=zn(u).map(F),H=Xn(U),j=[...U,...Qn(u).map(F)],ee=new Map((u.comparisons??[]).map((_e)=>[_e.candidateMeasurementId,_e])),G=new Map(qn(u).map(({row:_e})=>[_e.comparisonId,_e])),ue=(_e)=>_e&&G.get(_e.id),ne=Yn(u),ae=new Map;for(let _e of u.measurements){if(_e.phase!=="cpu"||_e.warnings.length===0)continue;let Ne=ae.get(_e.workloadId)??[];ae.set(_e.workloadId,[...Ne,..._e.warnings])}let se=(_e,Ne)=>[..._e.warnings,...ae.get(_e.workloadId)??[],...ne.get(_e.workloadId)?.warnings??[],...Ne?.warnings??[]],De=Jn(u,j.map((_e)=>_e.run)).map((_e)=>Nr(u,_e,{skipped:!0},ee.get(_e.id)?.warnings??[],ee.get(_e.id),ue(ee.get(_e.id)),E)),We=Kn(u).flatMap((_e)=>{let Ne=g.get(_e.workloadId);if(!Ne)return[];let Le=ee.get(_e.id);return Nr(u,Ne,{samples:0},se(_e,Le),Le,ue(Le),E)}),de=j.map((_e)=>{let{run:Ne,workload:Le}=_e,Ve=Ne.timing,ze=ee.get(Ne.id),rn={event:"run",protocolVersion:M,schemaVersion:u.schemaVersion,workloadId:Ne.workloadId,task:s(Le,Ne.workloadId),unit:"ns",samples:Ve.samples.length,batch:Ve.batch??1,mean:tn(Ve.mean),median:tn(Ve.median),stddev:tn(Ve.stddev),stddevPct:tn(Ve.mean===0?0:Ve.stddev/Ve.mean*100),min:tn(Ve.min),max:tn(Ve.max),warnings:Vt(se(Ne,ze))};rn.p75=tn(Ve.p75),rn.p99=tn(Ve.p99),rn.mad=tn(Ve.mad);let Je=X(Ne);if(Je)rn.userNs=tn(Je.userNs),rn.systemNs=tn(Je.systemNs);let nn=ne.get(Ne.workloadId),sn=nn?.retained??Ne.paired?.retained?.candBytes;if(sn!==void 0)rn.retainedBytesPerOp=Math.round(sn);let Sn=nn?.peak??Ne.paired?.peak?.candBytes;if(Sn!==void 0)rn.peakBytes=Math.round(Sn);Ht(rn,Le);let Wn=H?.get(_e);if(Wn!==void 0)rn.relative=tn(Wn);if(Le?.baseline)rn.baseline=!0;if(E!==void 0)rn.noiseFloorPct=tn(E);let Qe=Er(ze,ue(ze));if(Qe)rn.delta=Qe;let Ge=Ne.paired;if(Ge)rn.paired={baseMedian:tn(Ge.baseMedianNs),medianRatio:tn(Ge.medianRatio),ratioP25:tn(Ge.ratioP25),ratioP75:tn(Ge.ratioP75),rounds:Ge.rounds,verdict:Ge.verdict,...Ge.flagged&&{flagged:Ge.flagged},...Ge.confirmed!==void 0&&{confirmed:Ge.confirmed},...Ge.repeats&&{repeats:Ge.repeats.map((un)=>tn(un.medianRatio))},sameOutput:Ge.sameOutput,...Ge.suiteChanged&&{suiteChanged:!0},...Ge.retained&&{retained:Dr(Ge.retained)},...Ge.peak&&{peak:Dr(Ge.peak)}};return rn}),le=kt(u).map((_e)=>{let Ne=g.get(_e.workloadId),Le={event:"run",protocolVersion:M,schemaVersion:u.schemaVersion,workloadId:_e.workloadId,task:s(Ne,_e.workloadId),batch:1,warnings:Vt(_e.warnings)};if(Ht(Le,Ne),E!==void 0)Le.noiseFloorPct=tn(E);return Le.threw=_e.threw,Le});return[...de,...We,...le,...De]}function xs(u){if(!u.unmatched)return[];let g=(E,F)=>({event:"unmatched",protocolVersion:M,workloadId:E.id,task:s(E,E.id),side:F});return[...u.unmatched.baseOnly.map((E)=>g(E,"base")),...u.unmatched.candOnly.map((E)=>g(E,"cand"))]}function $s(u){return u===0?"pass":u===1?"fail":"error"}function Ss(u,g){let E=g.command==="ab"&&u.ab?{...u.ab,effectiveTimingPct:u.ab.thresholdPct}:u.comparisonSummary,F=(g.unmatched?.baseOnly.length??0)+(g.unmatched?.candOnly.length??0),U={event:"summary",protocolVersion:M,command:g.command,matched:E?.matched??0,regressed:E?.regressed??0,improved:E?.improved??0,unchanged:E?.unchanged??0,unmatched:F,geomeanPct:E?.geomeanPct!==void 0?E.geomeanPct:null,effectiveTimingPct:tn(E?.effectiveTimingPct??0),verdict:$s(g.exitCode),exitCode:g.exitCode};if(g.command==="ci"){if(U.cached=g.cached??0,U.executed=g.executed??0,U.failed=g.failed??0,U.missingBaseline=g.missingBaseline??0,g.baseline)U.baseline=g.baseline}if(g.command==="ab"&&u.ab){if(U.base=u.ab.base,U.geomeanThresholdPct=u.ab.geomeanThresholdPct,U.unconfirmed=u.ab.unconfirmed,U.outputDiffers=u.ab.outputDiffers,u.ab.notComparable!==void 0)U.notComparable=u.ab.notComparable;if(u.ab.threw!==void 0)U.threw=u.ab.threw;if(u.ab.newSuites?.length)U.newSuites=u.ab.newSuites;if(u.ab.memory)U.memory=u.ab.memory}if(u.comparisonSummary?.driftPct!==void 0&&g.command!=="ab")U.driftPct=tn(u.comparisonSummary.driftPct);if(u.environment)U.noiseFloorPct=tn(u.environment.noise.floorPct);if(g.baseGit||g.candGit)U.git={...g.baseGit&&{base:g.baseGit},...g.candGit&&{cand:g.candGit}};if(g.exportedTo)U.exportedTo=g.exportedTo;return U}var Ar={name:"minimal",async render(u,g={}){let E=[...Ts(u)];if(g.protocol)E.push(...xs(g.protocol)),E.push(Ss(u,g.protocol));let F=E.map((U)=>JSON.stringify(U));return{text:F.length>0?`${F.join(`
20
+ `)}
21
+ `:""}}};var Cs="https://www.speedscope.app/file-format-schema.json",Fr={name:"speedscope",async render(u,g={}){let E=$n(u);return Hn(u,g,"speedscope.json",(F)=>{let{cpu:U}=F,{nodes:H}=U,j=Gn(U),ee=U.samples?.nodeIds??[],G=U.samples?.timeDeltasUs??[],ue=Array(j.count);for(let We of j.order){let de=j.parentIx[We],le=H[We].frameIx;ue[We]=de===-1?[le]:[...ue[de],le]}let ne=ee.map((We)=>{let de=j.indexOf(We);return de===-1?[]:ue[de]}),ae=E.get(F.workloadId),se=ae?.label??ae?.command?.join(" ")??ae?.entry?.task??"profile",De={$schema:Cs,exporter:"ostia",name:se,activeProfileIndex:0,shared:{frames:U.frames.map((We)=>({name:N(We),file:We.url,line:We.line!==void 0?We.line+1:void 0}))},profiles:[{type:"sampled",name:se,unit:"microseconds",startValue:0,endValue:G.reduce((We,de)=>We+de,0),samples:ne,weights:G}]};return`${JSON.stringify(De,null,2)}
22
+ `})}};var Br=5,Wr=5,vs=10;function zt(u,g){let E=(G)=>G.group!==void 0?" ":"",F=(G)=>$r(G.label,G.group),U=4;for(let G of g)U=Math.max(U,E(G).length+F(G).length);let H=`${"Task".padEnd(U)} ${u.map((G)=>G.header.padEnd(G.width)).join(" ")}`,j=[H,"-".repeat(H.length)],ee;for(let G of g){if(G.group!==void 0&&G.group!==ee)j.push(`${G.group}:`);ee=G.group;let ue=E(G),ne=(ue+F(G)).padEnd(U),ae=G.data;if(j.push(ae===void 0?`${ne} - ${G.status}`:`${ne} ${u.map((se)=>se.cell(ae).padEnd(se.width)).join(" ")}`),G.warnings.length>0)j.push(`${ue} ! ${G.warnings.map((se)=>se.code).join(", ")}`)}return j}function Ur(u){let g=u.flatMap((E)=>E.warnings.map((F)=>` ${E.label}: ${F.message}`));return g.length>0?["","Warnings:",...g]:[]}function Gt(u){return{text:`${u.map((g)=>g.trimEnd()).join(`
23
+ `)}
24
+ `}}var _r={name:"table",async render(u){let g=u.environment?[Se(u.environment),""]:[];if(u.ab)return Gt(Os(u,u.ab,g));let E=zn(u),F=Kn(u),U=Ds(u);if(E.length===0&&F.length===0&&Jn(u,E).length===0)return U.length>0?Gt([...g,...U]):{text:`(no timing runs)
25
+ `};let H=[...g,...Is(u,E,F)],j=Ns(u);if(j.length>0)H.push("",...j);if(U.length>0)H.push("",...U);return Gt(H)}};function Is(u,g,E){let F=Yn(u),U=new Map(g.map((se)=>[se.workloadId,se])),H=new Map(E.map((se)=>[se.workloadId,se])),j=[],ee=[];for(let se of u.workloads){let De=U.get(se.id),We=m(se),de=Bn(se);if(De){let le={run:De,workload:se};ee.push(le),j.push({label:We,group:de,data:le,warnings:it(De,F)})}else if(H.has(se.id)){let le=it(H.get(se.id),F);j.push({label:We,group:de,status:"no samples",warnings:le})}else if(se.skipped)j.push({label:We,group:de,status:"skipped",warnings:[]})}let G=({run:se})=>R(se.timing.median),ue=new Map(ee.map((se)=>[se,X(se.run)])),ne=Xn(ee),ae=[{header:"Median",width:10,cell:(se)=>e(se.run.timing.median,G(se))},{header:"Spread",width:18,cell:(se)=>Z(se.run.timing.p75,se.run.timing.p99,G(se))},{header:"Range",width:18,cell:(se)=>Z(se.run.timing.min,se.run.timing.max,G(se))}];if([...ue.values()].some(Boolean))ae.push({header:"User/Sys",width:18,cell:(se)=>{let De=ue.get(se);return De?Ce(De):""}});for(let se of gt(F))ae.push({header:se.header,width:Math.max(se.header.length,vs),cell:(De)=>se.cell(De.run.workloadId)??""});if(ne)ae.push({header:"Relative",width:8,cell:(se)=>ve(ne.get(se),!!se.workload?.baseline)});return[...zt(ae,j),...Ur(j)]}function Os(u,g,E){let F=$n(u),U=[...E,`A/B: ${$t(g)}`,""],H=[],j=xr(u).map(({kind:ne,run:ae})=>{let se=F.get(ae.workloadId),De=s(se,ae.workloadId),We;if(ne==="threw"){let de=Pt(ae.threw);H.push({label:De,verdict:de,message:ae.threw.message}),We={base:"-",candidate:"-",change:"",spread:"",verdict:de}}else We=Rt(ae);return{label:De,group:Bn(se),data:We,warnings:ae.warnings}});if(j.length>0)U.push(...zt([{header:"Base",width:10,cell:(ne)=>ne.base},{header:"Candidate",width:10,cell:(ne)=>ne.candidate},{header:"Change",width:9,cell:(ne)=>ne.change},{header:"p25\u2026p75",width:18,cell:(ne)=>ne.spread},{header:"Verdict",width:7,cell:(ne)=>ne.verdict}],j));let ee=Tt(u);if(ee.length>0)U.push("","Memory:",...zt([{header:"Reading",width:11,cell:(ne)=>ne.reading},{header:"Base",width:10,cell:(ne)=>ne.base},{header:"Candidate",width:10,cell:(ne)=>ne.candidate},{header:"Change",width:18,cell:(ne)=>ne.change},{header:"Verdict",width:7,cell:(ne)=>ne.verdict}],ee.map((ne)=>{let ae=F.get(ne.run.workloadId);return{label:s(ae,ne.run.workloadId),group:Bn(ae),data:xt(ne),warnings:[]}})));let G=Ct(u);if(H.length>0){U.push("",`Threw (${H.length}):`);for(let ne of H){let[ae,...se]=ne.message.split(`
26
+ `);U.push(` ${ne.label}: ${ne.verdict}: ${ae}`);for(let De of se)U.push(` ${De}`)}}if(G.outputDiffers.length>0)U.push("",`Output differs from the base (${G.outputDiffers.length}):`,...G.outputDiffers.map((ne)=>` ${ne}`));let ue=Mt(g);if(ue)U.push("",ue);if(G.baseOnly.length>0||G.candOnly.length>0){if(U.push("","Unmatched:"),G.baseOnly.length>0)U.push(` base only: ${G.baseOnly.join(", ")}`);if(G.candOnly.length>0)U.push(` candidate only: ${G.candOnly.join(", ")}`)}return U.push(...Ur(j),"",St(g)),U}function Ds(u){let g=qn(u);if(g.length===0)return[];let E=[],F=dt(u);if(F)E.push(`\u26A0 ${F.message}`,"");let U=bt(u);if(U)E.push(U,"");let H=[],j=[];for(let{row:ee,cmp:G}of g){if(ee.verdict==="missing-base"||ee.verdict==="missing-cand"){j.push(` ${ee.task}: ${wt(ee.verdict)}`);continue}if(E.push(`${ee.pass===!1?"\u2717":"\u2713"} ${ee.task}`),ee.renamedFrom)E.push(` renamed from ${ee.renamedFrom.task}`);if(ee.timing){let{baseMedian:ae,candMedian:se,medianDeltaPct:De,ci95:We,pValue:de}=ee.timing,le=R(Math.max(ae,se)),_e=`${e(ae,le)} -> ${e(se,le)}`;if(We&&de!==void 0){let Ne=de<0.001?"p<0.001":`p=${de.toFixed(3)}`;E.push(` timing: ${_e}, ${t(De)} median, 95% CI [${t(We[0])}, ${t(We[1])}], ${Ne} (${ee.verdict})`)}else E.push(` timing: ${_e}, ${t(De)} median (${ee.verdict})`)}let ue=ht(ee,"->");if(ue.length>0)E.push(` memory: ${ue.join(", ")}`);if(!G)continue;for(let ae of pt(G,Br))E.push(` frame ${ae.name}: ${t(ae.deltaPct)} self-time (${p(ae.baseSelfUs)}ms -> ${p(ae.candSelfUs)}ms)`);for(let ae of ft(G,Wr))E.push(` heap ${ae.type}: ${t(ae.deltaPct)} count (${ae.baseCount} -> ${ae.candCount})`);let ne=lt(G);if(ne.length>0){E.push(` ! ${ne.map((ae)=>ae.code).join(", ")}`);for(let ae of ne)H.push(` ${ee.task}: ${ae.message}`)}}if(j.length>0)E.push("","Not compared:",...j);if(H.length>0)E.push("","Comparison warnings:",...H);return E}function Ns(u){let g=$n(u),E=[];for(let F of u.measurements){if(F.phase!=="cpu"&&F.phase!=="heap")continue;let U=g.get(F.workloadId),H=s(U,F.workloadId);if(F.phase==="cpu")if(F.cpu){E.push(`CPU capture - ${H} (instrumented, ${F.cpu.samplingIntervalUs}\xB5s interval, ${Q(F.cpu)} samples, diagnostic wall ${Me(F.diagnosticWallNs??0)}ms)`);for(let j of Te(F.cpu,Br))E.push(` ${j.pct.padStart(5)}% ${p(j.selfUs).padStart(8)}ms self ${j.frame?.name??"?"}`)}else E.push(`CPU capture - ${H} (instrumented, no evidence captured)`);else if(F.heap){E.push(`Heap snapshot - ${H} (instrumented, ${Re(F.heap)})`);for(let j of F.heap.typeCounts.slice(0,Wr))E.push(` ${String(j.count).padStart(6)} ${j.type}`)}else E.push(`Heap snapshot - ${H} (instrumented, no evidence captured)`);for(let j of F.artifacts)E.push(` artifact: ${j.path}`);for(let j of F.warnings)E.push(` ! ${j.message}`)}return E}var h={table:_r,json:kr,markdown:Ir,jsonl:Pr,minimal:Ar,collapsed:wr,mermaid:Or,speedscope:Fr,cpuprofile:yr};async function wn(u={}){let g=D();if(g.length===0)throw Error("run(): no tasks registered - call group()/task() before run() in the same file.");let E=Bun.main,F;try{F=B(g,u.filter,E)}catch(H){throw Error(`run(): ${H.message}`)}let U=await pe(E,F,u);if(!u.quiet){let H=u.format??"table",{text:j}=await h[H].render(U,{});if(j)process.stdout.write(j)}return U}function yn(u,g){let E=Object.keys(u),F=(U,H)=>{if(U===E.length){hn(H,()=>g(H));return}let j=E[U];for(let ee of u[j])F(U+1,{...H,[j]:ee})};F(0,{})}function Es(u){return u.startsWith("file://")?u.slice(7):u}function vt(u,g,E){let F=u.nodes,U=F.length,{frames:H,intern:j}=Fe(),ee=new Map,G=Array(U);for(let Ne=0;Ne<U;Ne++){let Le=F[Ne],Ve=Le.callFrame,ze=j(Ve.functionName,Es(Ve.url)||void 0,Ve.lineNumber>=0?Ve.lineNumber:void 0,Ve.columnNumber>=0?Ve.columnNumber:void 0);G[Ne]={id:Le.id,frameIx:ze,children:Le.children??[]},ee.set(Le.id,Ne)}let ue=new Float64Array(U),ne=new Float64Array(U),{samples:ae,timeDeltas:se}=u;for(let Ne=0;Ne<ae.length;Ne++){let Le=ee.get(ae[Ne]);if(Le===void 0)continue;ue[Le]+=se[Ne]??0,ne[Le]+=1}let De=new Int32Array(U).fill(-1);for(let Ne=0;Ne<U;Ne++){let Le=F[Ne].children;if(!Le)continue;for(let Ve of Le){let ze=ee.get(Ve);if(ze!==void 0)De[ze]=Ne}}let We=[],de=[];for(let Ne=U-1;Ne>=0;Ne--)if(De[Ne]===-1)de.push(Ne);while(de.length>0){let Ne=de.pop();We.push(Ne);let Le=F[Ne].children;if(!Le)continue;for(let Ve of Le){let ze=ee.get(Ve);if(ze!==void 0&&De[ze]===Ne)de.push(ze)}}let le=new Float64Array(U);for(let Ne=We.length-1;Ne>=0;Ne--){let Le=We[Ne];le[Le]+=ue[Le];let Ve=De[Le];if(Ve>=0)le[Ve]+=le[Le]}let _e=new Map;for(let Ne=0;Ne<U;Ne++)Be(_e,G[Ne].frameIx,ue[Ne],le[Ne],ne[Ne]);return{origin:g,samplingIntervalUs:E,frames:H,nodes:G,totals:Ue(_e),samples:{nodeIds:u.samples,timeDeltasUs:u.timeDeltas}}}async function Lr(u,g={}){let E=g.intervalUs??je,{Session:F}=await import("inspector/promises"),U=new F;U.connect();try{await U.post("Profiler.enable"),await U.post("Profiler.setSamplingInterval",{interval:E});let H=Bun.nanoseconds();await U.post("Profiler.start");let j=await u(),{profile:ee}=await U.post("Profiler.stop"),G=Bun.nanoseconds()-H,ue=vt(ee,"inspector",E);return{result:j,cpu:ue,diagnosticWallNs:G}}finally{U.disconnect()}}function As(u){return u.replace(/[\s"']/g,"\\$&")}function Fs(u,g,E){let F=u[0];if(F&&/(^|[\\/])bun(\.exe)?$/.test(F))return{argv:[F,...g,...u.slice(1)],env:E};let U={...process.env,...E},H=g.map(As).join(" ");return{argv:u,env:{...U,BUN_OPTIONS:U.BUN_OPTIONS?`${U.BUN_OPTIONS} ${H}`:H}}}async function It(u,g,E){let F=`${u.artifactDir}/${u.fileName}`,{argv:U,env:H}=Fs(u.argv,g,u.env),j=Bun.nanoseconds(),G=await Bun.spawn(U,{cwd:u.cwd,env:H,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,ue=Bun.nanoseconds()-j,ne=Bun.file(F);if(!await ne.exists())return{diagnosticWallNs:ue,exitCode:G,warnings:[{code:"artifact-missing",message:`Expected ${E.what} at ${F} after exit ${G}, found nothing. The workload's argv[0] must be a \`bun\` binary for ${E.kind} capture.`,data:{artifactPath:F,argv:u.argv}}]};return{diagnosticWallNs:ue,exitCode:G,artifactPath:F,raw:await ne.json(),warnings:[]}}async function jr(u){let{raw:g,...E}=await It(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(!g)return E;if(g.samples.length===0)E.warnings.push({code:"empty-profile",message:"CPU capture produced zero samples."});return{...E,cpu:vt(g,"cpu-prof",u.intervalUs)}}function Vr(u){let{node_fields:E,node_types:F}=u.snapshot.meta,U=E.indexOf("type"),H=E.indexOf("self_size"),j=E.length,ee=F[0];if(U===-1||H===-1||!Array.isArray(ee))return{origin:"heap-prof",typeCounts:[],objectCount:u.snapshot.node_count};let G=ee.length,ue=Array(G),ne=new Map,ae=[],se=(Ne)=>{let Le={type:Ne,count:0,bytes:0};return ae.push(Le),Le},De=0,We=u.nodes,de=We.length;for(let Ne=0;Ne<de;Ne+=j){let Le=We[Ne+U],Ve=We[Ne+H]??0;De+=Ve;let ze;if(Le>=0&&Le<G)ze=ue[Le]??=se(ee[Le]);else if(ze=ne.get(Le),ze===void 0)ze=se(`unknown(${Le})`),ne.set(Le,ze);ze.count++,ze.bytes+=Ve}ae.sort((Ne,Le)=>Le.count-Ne.count);let le=ae.slice(0,20).map(({type:Ne,count:Le,bytes:Ve})=>({type:Ne,count:Le,retainedBytes:Ve})),_e=ae.slice(20);if(_e.length>0)le.push({type:"other",count:_e.reduce((Ne,Le)=>Ne+Le.count,0),retainedBytes:_e.reduce((Ne,Le)=>Ne+Le.bytes,0)});return{origin:"heap-prof",heapSizeBytes:De,objectCount:u.snapshot.node_count,typeCounts:le}}async function Hr(u){let{raw:g,...E}=await It(u,["--heap-prof","--heap-prof-dir",u.artifactDir,"--heap-prof-name",u.fileName],{what:"a heap snapshot",kind:"heap"});return g?{...E,heap:Vr(g)}:E}var Ot=1000;function oe(){return{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever measurements had already completed."}}async function be(u){Ln("time",u);let g=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??Ot}),E=`${u.outDir??An}/artifacts`,F=u.noiseCheck===!1?void 0:Pe(),U=F?xe(F):void 0,H=[],j=[],ee=u.commands.map((ae)=>{let se=typeof ae==="string"||Array.isArray(ae)?{command:ae}:ae,De=Array.isArray(se.command)?se.command:q(se.command),We=se.prepare??u.prepare,de=se.timeSource??u.timeSource,le=me(De,se.label??(Array.isArray(se.command)?void 0:se.command),{prepare:We,timeSource:de});return{argv:De,workload:le,prepare:We,timeSource:de,timeoutMs:se.timeoutMs??u.timeoutMs,ignoreExitCodes:se.ignoreExitCodes??u.ignoreExitCodes}}),G=(u.interleave??!0)&&ee.length>1,ue=ee.map((ae)=>Bt({argv:ae.argv,cwd:u.cwd,env:u.env,samples:u.samples,budgetMs:u.budgetMs,minSamples:u.minSamples,warmup:u.warmup,prepare:ae.prepare,timeSource:ae.timeSource,timeoutMs:ae.timeoutMs,ignoreExitCodes:ae.ignoreExitCodes,signal:u.signal})),ne=async(ae)=>{let{argv:se,workload:De,prepare:We}=ee[ae];H.push(De);let de=ue[ae].result(),le=W({workload:De,configFingerprint:g,trials:de.trials,timing:de.timing,warnings:U&&j.length===0?[...de.warnings,U]:de.warnings,interleaved:G?!0:void 0});if(j.push(le),!u.signal?.aborted)j.push(...await Bs({workload:De,argv:se,timingMeasurementId:le.id,cfgFp:g,opts:u,artifactDir:E,prepare:We}))};if(G){for(let se of ue)await se.warmup();let ae=!0;while(ae){ae=!1;for(let se of ue)if(await se.step())ae=!0}for(let se=0;se<ee.length;se++)await ne(se)}else for(let ae=0;ae<ee.length;ae++)await Wt(ue[ae]),await ne(ae);if(u.signal?.aborted&&j.length>0){let ae=j[j.length-1];ae.warnings=[...ae.warnings,oe()]}return v(F),r(H,j,F)}async function Bs({workload:u,argv:g,timingMeasurementId:E,cfgFp:F,opts:U,artifactDir:H,prepare:j}){let ee=[],G=async(ne)=>{if(j)await ye(j,{phase:ne,index:0},{cwd:U.cwd,env:U.env})},ue=(ne)=>({argv:g,cwd:U.cwd,env:U.env,artifactDir:H,fileName:`${E}-${ne}`});if(U.cpu){await G("cpu");let ne=await jr({...ue("cpu.cpuprofile"),intervalUs:U.cpuIntervalUs??Ot});ee.push(await Gr({workload:u,phase:"cpu",configFingerprint:F,artifactKind:"cpuprofile",...ne}))}if(U.heap){await G("heap");let ne=await Hr(ue("heap.heapsnapshot"));ee.push(await Gr({workload:u,phase:"heap",configFingerprint:F,artifactKind:"heapsnapshot",...ne}))}return ee}async function Gr({artifactPath:u,artifactKind:g,...E}){let F=P({...E,artifacts:[]});if(u)F.artifacts=[await fn(F.id,g,u)];return F}async function kn(u,g={}){if(g.name!==void 0&&(typeof g.name!=="string"||!g.name))throw TypeError("profile(): name must be a non-empty string");let E=pn(u,g.name),F=g.cpuIntervalUs??Ot,U=i({intervalUs:F,origin:g.origin??"inspector"}),H=(G,ue)=>({result:G,measurement:ue,document:r([E],[ue])});if(g.signal?.aborted){let G=Bun.nanoseconds(),ue=await u();return H(ue,P({workload:E,phase:"cpu",configFingerprint:U,diagnosticWallNs:Bun.nanoseconds()-G,warnings:[oe()],artifacts:[]}))}let j=g.origin==="jsc"?await He(u,{intervalUs:F}):{...await Lr(u,{intervalUs:F}),jit:void 0},ee=j.cpu.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];return H(j.result,P({workload:E,phase:"cpu",configFingerprint:U,diagnosticWallNs:j.diagnosticWallNs,cpu:j.cpu,jit:j.jit,warnings:ee,artifacts:[]}))}function Pn(u){return u}
27
+ export{x,Ke,qe,fe,d,te,an,A,Ye,mn,ge,_,V,J,cn,he,z,Ze,re,K,oe,be,bn,M,h,wn,yn,kn,Pn};