ostia 0.2.6 → 0.2.8

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
@@ -2,12 +2,13 @@
2
2
 
3
3
  ostia is a profiling and benchmarking toolkit for Bun. It times subprocess commands
4
4
  (like hyperfine) and in-process functions (like mitata), optionally captures CPU
5
- profiles, heap snapshots, JIT tiers and allocation counts, and writes everything to one
6
- schema-versioned JSON document (`ProfileDocument`). Two documents compare with a
5
+ profiles, heap snapshots, JIT tiers, retained heap and peak memory, and writes everything
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 ci` gates a config file of
9
- workloads against a saved baseline, and `--format minimal` gives scripts and LLM agents
10
- a compact JSON line protocol. The CLI is a thin wrapper over the library, so anything
8
+ widened to the machine's measured noise floor. `ostia ab` pairs the working tree against
9
+ a git ref in one process, which holds up on machines too noisy for that. `ostia ci` gates
10
+ a config file of workloads against a saved baseline, and `--format minimal` gives scripts
11
+ and LLM agents a compact JSON line protocol. The CLI is a thin wrapper over the library, so anything
11
12
  `ostia time`/`ostia bench` do, `time()`/`bench()` do too.
12
13
 
13
14
  Zero runtime dependencies. Requires Bun ≥ 1.4.
@@ -71,6 +72,30 @@ dedupe:
71
72
  dedupe/Set-based (O(n)) 23.5 µs 24.9 µs…72.5 µs 18.7 µs…208.3 µs 1.00×
72
73
  ```
73
74
 
75
+ ### Check a change for regressions
76
+
77
+ Commit the suite, then change the code: say the Set-based dedupe becomes
78
+ `input.filter((x, i) => input.indexOf(x) === i)`.
79
+
80
+ ```sh
81
+ ostia ab suite.ts # every task: working tree vs HEAD, paired in one process
82
+ ```
83
+
84
+ ```
85
+ A/B: working tree vs HEAD (3945768) · 15 rounds · threshold 10% · geomean threshold 1.5%
86
+
87
+ Task Base Candidate Change p25…p75 Verdict
88
+ -------------------------------------------------------------------------------------------------
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%)
92
+
93
+ Geomean +165.4% (threshold 1.5%) · 1 regressed, 0 improved, 1 unchanged of 2 · fail
94
+ ```
95
+
96
+ Base and candidate run in alternating ~10ms batches, so machine drift cancels within each
97
+ round; a flagged task counts only if two fresh processes agree. Exit 1 on a regression.
98
+
74
99
  ### Gate CI on a baseline
75
100
 
76
101
  ```json
@@ -105,7 +130,7 @@ Scratch output (cache, artifacts) goes to `node_modules/.cache/ostia`. Baselines
105
130
 
106
131
  ## Using ostia from an AI agent
107
132
 
108
- `--format minimal` (on `time`, `bench`, `compare`, `report`, `ci`) prints one JSON
133
+ `--format minimal` (on `time`, `bench`, `ab`, `compare`, `report`, `ci`) prints one JSON
109
134
  object per line on stdout and nothing else. Every line has `event` and
110
135
  `protocolVersion: 1`. Timing values are in nanoseconds.
111
136
 
@@ -117,9 +142,9 @@ ostia ci --format minimal; echo $?
117
142
 
118
143
  | `event` | When | Key fields |
119
144
  |---|---|---|
120
- | `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), `relative?`, `noiseFloorPct?`, `warnings[]`, and on `compare`/`ci`: `delta: { medianPct, meanPct, verdict, pass, ci95?, pValue?, effectiveTimingPct, matched }` |
121
- | `unmatched` | One per workload on only one side of `compare`/`ci` | `workloadId`, `task`, `side: "base" \| "cand"` |
122
- | `summary` | Last line of `compare`/`ci` only | `command`, `matched`/`regressed`/`improved`/`unchanged`/`unmatched`, `cached`/`executed`/`failed`/`missingBaseline` (`ci`), `geomeanPct`, `effectiveTimingPct`, `noiseFloorPct?`, `baseline?` (`ci`), `git?`, `exportedTo?`, `verdict`, `exitCode` |
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 }` |
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` |
123
148
 
124
149
  ```
125
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}}
@@ -133,9 +158,9 @@ Exit codes, the same for every command:
133
158
  | Code | Meaning |
134
159
  |---|---|
135
160
  | `0` | Pass |
136
- | `1` | At least one workload regressed (`compare`/`ci` only; `time`/`bench` never return 1) |
161
+ | `1` | At least one workload regressed (`compare`/`ci`/`ab` only; `time`/`bench` never return 1) |
137
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 |
138
- | `130` | Cancelled with Ctrl-C (`time`/`bench`; partial results are still exported) |
163
+ | `130` | Cancelled with Ctrl-C (`time`/`bench`/`ab`; partial results are still exported) |
139
164
 
140
165
  On exit 2, stderr's last line is `{"event":"error","protocolVersion":1,"code":...,"message":...,"data"?:...}`
141
166
  when stderr is not a TTY or a machine format (`minimal`/`json`/`jsonl`) was requested.
@@ -177,6 +202,7 @@ Runs in-process `group()`/`task()` suites. Each suite file runs in its own child
177
202
  ```sh
178
203
  ostia bench bench/*.ts
179
204
  ostia bench bench/*.ts --filter parse --cpu --alloc
205
+ ostia bench bench/*.ts --filter large --peak-mem
180
206
  ostia bench bench/*.ts --isolate
181
207
  ostia bench --preload ./bench/dom-setup.ts --bun-flags="--conditions=browser" bench/*.ts
182
208
  ```
@@ -188,8 +214,36 @@ ostia bench --preload ./bench/dom-setup.ts --bun-flags="--conditions=browser" be
188
214
  the most comparable numbers.
189
215
  - `--jobs N|auto` runs suite files in parallel. Faster, but noisier; keep the default of 1
190
216
  for anything you `compare` or gate in `ci`.
217
+ - `--cpu` profiles each task at 100µs for about 2,000 samples (`--cpu-interval` changes
218
+ the interval). Inlined helpers count as their callers' self time.
219
+ - `--alloc` reports the heap each call *retains* after a full GC: a leak check, not an
220
+ allocation count. `--peak-mem` reports how far the task's first call raises RSS,
221
+ garbage included, in 3 fresh processes (`OSTIA_PEAK_MEM=1` is set there, so a suite can
222
+ skip heavy setup that would peak first).
191
223
  - With no files, `ostia bench` uses the config's `bench` section. Each flag overrides its
192
- config field; `--no-gc`/`--no-cpu`/`--no-alloc`/`--no-isolate` override a config `true`.
224
+ config field; `--no-gc`/`--no-cpu`/`--no-alloc`/`--no-peak-mem`/`--no-isolate` override
225
+ a config `true`.
226
+
227
+ ### `ostia ab`
228
+
229
+ Runs suites on a git ref's committed tree and on the working tree in one process,
230
+ alternating short batches, and gates on the per-round time ratio.
231
+
232
+ ```sh
233
+ ostia ab bench/*.ts # vs HEAD
234
+ ostia ab bench/*.ts --base origin/main
235
+ ostia ab bench/*.ts --threshold 5 --rounds 21
236
+ ```
237
+
238
+ - The same suite files as `ostia bench`, unchanged. The ref's tree is extracted once per
239
+ commit under `node_modules/.cache/ostia/ab/`; relative imports resolve within each tree,
240
+ package imports to the project's `node_modules`.
241
+ - A task is flagged when its median ratio moves past `--threshold` (default 10%) in at
242
+ 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
244
+ `--geomean-threshold` (default 1.5%) slower.
245
+ - 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.
193
247
 
194
248
  ### `ostia compare`
195
249
 
@@ -265,7 +319,7 @@ ostia baseline show main --format markdown
265
319
 
266
320
  ```ts
267
321
  import {
268
- time, bench, group, task, sweep, range, run, profile, keep,
322
+ time, bench, ab, group, task, sweep, range, run, profile, keep,
269
323
  compareDocuments, defineConfig, createDocument, loadDocument, saveDocument, renderers,
270
324
  } from "ostia"
271
325
  import type { ProfileDocument, MinimalEvent } from "ostia"
@@ -275,6 +329,7 @@ import type { ProfileDocument, MinimalEvent } from "ostia"
275
329
  |---|---|
276
330
  | `time(opts)` | Subprocess timing, same as `ostia time`. Returns a `ProfileDocument`. |
277
331
  | `bench(opts)` | Runs suite files, same as `ostia bench`. |
332
+ | `ab(opts)` | Paired A/B of suite files against a git ref, same as `ostia ab`. |
278
333
  | `group(name, fn, opts?)` / `task(name, fn, opts?)` | Register in-process tasks; `.skip`/`.only` variants. |
279
334
  | `sweep(dims, fn)` / `range(start, end, mult?)` | Parameter sweeps; tasks inherit the point as `params`. |
280
335
  | `run(opts?)` | Runs the tasks registered in the current file, in this process (`bun suite.ts`). |
@@ -0,0 +1,16 @@
1
+ // @bun
2
+ function h(u){if(u.length===0)throw Error("computeTimingStats: samples must be non-empty");let m=u.length,d=pn(u),f=0;for(let R=0;R<m;R++)f+=u[R];let T=f/m,S=o(d,0.5),E=0;for(let R=0;R<m;R++){let H=u[R]-T;E+=H*H}let L=Math.sqrt(E/m),F=d[0],V=d[m-1],j=o(d,0.25),G=o(d,0.75),ne=G-j,se=j-1.5*ne,be=G+1.5*ne,te=j-3*ne,ae=G+3*ne,ge=0,he=0;for(let R=0;R<m;R++){let H=u[R];if(H<te||H>ae)he++;else if(H<se||H>be)ge++}let Ie=o(d,0.99),Me=new Float64Array(m);for(let R=0;R<m;R++)Me[R]=Math.abs(u[R]-S);Me.sort();let Se=o(Me,0.5);return{unit:"ns",samples:u,mean:T,median:S,stddev:L,min:F,max:V,outliers:{mild:ge,severe:he},p25:j,p75:G,p99:Ie,mad:Se}}function pn(u){let m=new Float64Array(u.length);return m.set(u),m.sort(),m}function o(u,m){let d=u.length;if(d===1)return u[0];let f=m*(d-1),T=Math.floor(f),S=Math.ceil(f);if(T===S)return u[T];let E=f-T;return u[T]*(1-E)+u[S]*E}var dn=5000000;function K(u,m,d="subprocess",f=[]){let T=[],S=u.samples[0];if(S!==void 0){let F=u.p75-u.p25;if(S>u.median+3*F&&S>2*u.median&&F>0)T.push({code:"slow-first-run",message:`First run took ${n(S)}, much slower than the median ${n(u.median)}. Consider more warmup.`,data:{firstNs:S,medianNs:u.median}})}if(d!=="inprocess"&&u.outliers.mild+u.outliers.severe>0)T.push({code:"outliers-detected",message:`${u.outliers.mild+u.outliers.severe} outlier(s) detected (${u.outliers.severe} severe, ${u.outliers.mild} mild).`,data:u.outliers});if(d==="subprocess"&&u.median<dn)T.push({code:"fast-command",message:`Median run time (${(u.median/1e6).toFixed(3)}ms) is very fast; results may be dominated by spawn overhead.`,data:{medianNs:u.median}});let E=new Set(f),L=m.filter((F)=>F!==void 0&&F!==0&&!E.has(F));if(L.length>0)T.push({code:"nonzero-exit",message:`${L.length} of ${m.length} trial(s) exited non-zero.`,data:{exitCodes:L}});return T}var I=0.5,fn={ns:1,\u{b5}s:1000,ms:1e6,s:1e9};function b(u){let m=Math.abs(u);if(m>=1e9)return"s";if(m>=1e6)return"ms";if(m>=1000)return"\xB5s";return"ns"}function gn(u){let m=Math.floor(Math.log10(Math.max(Math.abs(u),1)))+1;return Math.max(1,3-m)}function n(u,m=b(u)){let d=u/fn[m];return`${d.toFixed(gn(d))} ${m}`}function O(u){return u.samples?.nodeIds.length??u.totals.reduce((m,d)=>m+d.samples,0)}function g(u){if(u<1024)return`${u.toFixed(0)}B`;if(u<1048576)return`${(u/1024).toFixed(2)}KB`;return`${(u/1048576).toFixed(2)}MB`}function J(u){return`${u.cpuModel} \xB7 ${u.cores} cores \xB7 load ${u.loadAvg1.toFixed(1)} \xB7 noise floor ${u.noise.floorPct.toFixed(1)}%`}function w(u){return`${u.sha} (${u.branch}${u.dirty?", dirty":""})`}function t(u){return u?.label??u?.command?.join(" ")??u?.entry?.task??u?.id??"unknown"}function z(u,m){if(u===1)return m?"1.00\xD7 (baseline)":"1.00\xD7";if(u>1)return`${u.toFixed(2)}\xD7 slower`;return`${(1/u).toFixed(2)}\xD7 faster`}function ce(u){return u.replace(/\|/g,"\\|").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/`/g,"\\`").replace(/\r\n|\r|\n/g,"<br>")}function k(u){let m=u.trials.filter((f)=>!f.timedOut&&!f.timeSourceNoMatch&&f.userNs!==void 0&&f.systemNs!==void 0);if(m.length===0)return;let d=(f)=>o(Float64Array.from(f).sort(),0.5);return{userNs:d(m.map((f)=>f.userNs)),systemNs:d(m.map((f)=>f.systemNs))}}function q(u){return`${n(u.userNs)}/${n(u.systemNs)}`}class Fe extends Error{}function Y(u){if(typeof u.pattern==="string")return;let{flags:m}=u.pattern;if(m.includes("g")||m.includes("y")||m.includes("d"))throw RangeError("timeSource pattern must not use the g or y flag")}function bn(...u){let m=u.filter((d)=>d!==void 0);if(m.length===0)return;if(m.length===1)return m[0];return AbortSignal.any(m)}var hn={ns:1,us:1000,ms:1e6,s:1e9};function D(u,m){let d=u!==void 0?AbortSignal.timeout(u):void 0,f=bn(d,m);return{spawn:f?{signal:f,killSignal:"SIGKILL"}:{},timedOut:()=>d?.aborted??!1}}async function ue(u){let m=u.timeSource!==void 0,d=Bun.nanoseconds(),f=D(u.timeoutMs,u.signal),T=Bun.spawn(u.argv,{cwd:u.cwd,env:u.env,stdout:m?"pipe":"ignore",stderr:m?"pipe":"ignore",stdin:"ignore",...f.spawn}),S=m?Promise.all([new Response(T.stdout).text(),new Response(T.stderr).text()]):void 0,E=await T.exited,L=Bun.nanoseconds(),F=T.resourceUsage?.(),V=f.timedOut(),j={wallNs:L-d,exitCode:V?null:E,userNs:F?Number(F.cpuTime.user)*1000:void 0,systemNs:F?Number(F.cpuTime.system)*1000:void 0,maxRssBytes:F?.maxRSS,...V?{timedOut:!0}:{}};if(S){let[G,ne]=await S;if(u.timeSource&&!V)try{j.reportedNs=kn(u.timeSource,G,ne,u.argv)}catch(se){if(!(se instanceof Fe))throw se;j.timeSourceNoMatch=!0,j.timeSourceMissOutput=wn(G,ne)}}return j}function kn(u,m,d,f=[]){let T=typeof u.pattern==="string"?new RegExp(u.pattern):u.pattern,S=u.group??1,E=T.exec(m)??T.exec(d),L=f.length>0?` for "${f.join(" ")}"`:"";if(!E)throw new Fe(`timeSource pattern ${T} did not match the output${L}. Output was:
3
+ ${je(m,d)}`);let F=E[S];if(F===void 0)throw Error(`timeSource pattern ${T} matched${L} but has no capture group ${S} (matched text: "${E[0]}").`);let V=Number(F);if(!Number.isFinite(V))throw Error(`timeSource pattern ${T} group ${S} captured "${F}"${L}, which is not a number.`);return V*hn[u.unit??"ms"]}function je(u,m){let f=(S)=>S.length>800?`${S.slice(0,800)}\u2026(${S.length-800} more)`:S,T=[];if(u.trim())T.push(`--- stdout ---
4
+ ${f(u.trimEnd())}`);if(m.trim())T.push(`--- stderr ---
5
+ ${f(m.trimEnd())}`);return T.length>0?T.join(`
6
+ `):"(empty)"}var Oe=2048;function wn(u,m){let d=je(u,m);if(Buffer.byteLength(d,"utf8")<=Oe)return d;let f=d.slice(0,Oe);while(Buffer.byteLength(f,"utf8")>Oe)f=f.slice(0,-1);return`${f}\u2026`}var yn=1048576,xn=(u)=>`
7
+ \u2026(${u} bytes elided)\u2026
8
+ `;async function Tn(u,m=yn){let d=Math.floor(m/2),f=u.getReader(),T=[],S=0,E=[],L=0,F=0;try{for(;;){let{done:se,value:be}=await f.read();if(se)break;if(!be||be.byteLength===0)continue;F+=be.byteLength;let te=be;if(S<d){let ae=d-S;if(te.byteLength<=ae){T.push(te),S+=te.byteLength;continue}T.push(te.subarray(0,ae)),S+=ae,te=te.subarray(ae)}E.push(te),L+=te.byteLength;while(L>d&&E.length>0){let ae=E[0],ge=L-d;if(ae.byteLength<=ge)E.shift(),L-=ae.byteLength;else E[0]=ae.subarray(ge),L-=ge}}}finally{f.releaseLock()}let V=new TextDecoder,j=V.decode(Ge(T));if(F<=S+L)return j;let G=V.decode(Ge(E)),ne=F-S-L;return`${j}${xn(ne)}${G}`}function Ge(u){let m=u.reduce((T,S)=>T+S.byteLength,0),d=new Uint8Array(m),f=0;for(let T of u)d.set(T,f),f+=T.byteLength;return d}async function X(u,m,d){if(typeof u==="function"){await u(m);return}let f=Be(u),T=D(d.timeoutMs,d.signal),S=Bun.spawn(f,{cwd:d.cwd,env:d.env,stdout:"ignore",stderr:"pipe",stdin:"ignore",...T.spawn}),E=Tn(S.stderr).catch(()=>""),L=await S.exited;if(T.timedOut()){let F=(await E).trim();throw Error(`prepare command "${f.join(" ")}" timed out after ${d.timeoutMs}ms before ${m.phase} trial ${m.index}.${F?`
9
+ ${F}`:""}`)}if(d.signal?.aborted)return;if(L!==0){let F=(await E).trim();throw Error(`prepare command "${f.join(" ")}" exited with code ${L} before ${m.phase} trial ${m.index}.${F?`
10
+ ${F}`:""}`)}}function Be(u){if(u===void 0||typeof u==="function")return;return Array.isArray(u)?u:y(u)}function He(u){if(u===void 0)return;return{pattern:typeof u.pattern==="string"?u.pattern:u.pattern.source,...u.group!==void 0&&{group:u.group},...u.unit!==void 0&&{unit:u.unit}}}function y(u){return u.trim().split(/\s+/).filter(Boolean)}import{renameSync as Mn}from"fs";import{isAbsolute as vn,relative as Rn}from"path";var Je={name:"ostia",version:"0.2.8",description:"Fast profiling and benchmarking for Bun.",type:"module",engines:{bun:">=1.4.0"},exports:{".":"./src/index.ts"},bin:{ostia:"src/cli/main.ts"},scripts:{build:"bun scripts/build.ts",test:"bun test",typecheck:"tsc6","typecheck:package":"tsc6 -p tests/types",lint:"biome check .","lint:fix":"biome check --write . --unsafe","lint:changed":"biome check --changed --no-errors-on-unmatched .","lint:fix:changed":"biome check --write --unsafe --changed --no-errors-on-unmatched .",knip:"knip-bun",bench:"bun src/cli/main.ts bench bench/*.ts","bench:baseline":"bun src/cli/main.ts bench bench/*.ts --budget 3000 --min-samples 30 --export-json .ostia/baselines/bench-main.json",baseline:"bun src/cli/main.ts baseline save",dogfood:"bun test && bun src/cli/main.ts ci",examples:"bun scripts/run-examples.ts"},devDependencies:{"@biomejs/biome":"2.5.14","@types/bun":"^1.4.2",knip:"^6.38.0",typescript:"npm:@typescript/typescript6@^6.0.2"},repository:{type:"git",url:"git+https://github.com/metonym/ostia.git"}};var N=Je.version;function C(u,m){return JSON.stringify(Ue(u),null,m)}function Ue(u){if(Array.isArray(u)){let m=!1;for(let d=0;d<u.length;d++){let f=u[d];if(f!==null&&typeof f==="object"){m=!0;break}}return m?u.map(Ue):u}if(u!==null&&typeof u==="object"){let m=u,d={};for(let f of Object.keys(m).sort())d[f]=Ue(m[f]);return d}return u}function e(u,...m){let d=Bun.CryptoHasher.hash("sha256",C(m),"hex");return`${u}_${d.slice(0,16)}`}var Ae,Ve=!1;function $e(u){let m=Bun.spawnSync(["git",...u],{timeout:200,stdout:"pipe",stderr:"ignore"});return m.success?m.stdout.toString().trim():void 0}function Ke(){if(Ve)return Ae;Ve=!0;try{let u=$e(["rev-parse","--short","HEAD"]);if(u===void 0)Ae=void 0;else{let m=$e(["rev-parse","--abbrev-ref","HEAD"]),d=$e(["status","--porcelain"]);Ae={sha:u,branch:m??"HEAD",dirty:(d?.length??0)>0}}}catch{Ae=void 0}return Ae}function r(u,m,d){let f=Ke();return{schemaVersion:2,toolVersion:N,bunVersion:Bun.version,platform:{os:process.platform,arch:process.arch},createdAt:new Date().toISOString(),workloads:u,measurements:m,...d!==void 0&&{environment:d},...f!==void 0&&{git:f}}}function B(u,m,d={}){if(d.timeSource)Y(d.timeSource);let f=Be(d.prepare),T=He(d.timeSource),S=typeof d.prepare==="function"?d.prepare.toString():f;return{id:e("wl","subprocess",u,...S!==void 0||T!==void 0?[S??null,T??null]:[]),kind:"subprocess",command:u,label:m,...f!==void 0&&{prepare:f},...T!==void 0&&{timeSource:T}}}function me(u,m){return{id:e("wl","inprocess",u.name,u.toString()),kind:"inprocess",label:m}}function ze(u,m,d={}){let f=vn(u)?Rn(process.cwd(),u):u;return{id:d.params!==void 0?e("wl","inprocess-entry",f,m,d.params):e("wl","inprocess-entry",f,m),kind:"inprocess",entry:{file:u,task:m,...d.group!==void 0&&{group:d.group}},...d.label!==void 0&&{label:d.label},...d.baseline!==void 0&&{baseline:d.baseline},...d.description!==void 0&&{description:d.description},...d.groupDescription!==void 0&&{groupDescription:d.groupDescription},...d.isolated!==void 0&&{isolated:d.isolated},...d.params!==void 0&&{params:d.params},...d.skipped!==void 0&&{skipped:d.skipped}}}function x(u){return{id:e("run",u.workload.id,"timing",u.configFingerprint,Bun.version,N),workloadId:u.workload.id,phase:"timing",instrumented:!1,configFingerprint:u.configFingerprint,trials:u.trials,timing:u.timing,warnings:u.warnings,artifacts:[],memory:Nn(u.trials),...u.interleaved!==void 0&&{interleaved:u.interleaved}}}function Nn(u){let m=u.map((d)=>d.maxRssBytes).filter((d)=>d!==void 0);if(m.length===0)return;return{origin:"resourceUsage",maxRssBytes:Math.max(...m)}}function p(u){return{id:e("run",u.workload.id,u.phase,u.configFingerprint,Bun.version,N),workloadId:u.workload.id,phase:u.phase,instrumented:!0,configFingerprint:u.configFingerprint,trials:[{i:0,wallNs:u.diagnosticWallNs,exitCode:u.exitCode}],diagnosticWallNs:u.diagnosticWallNs,cpu:u.cpu,heap:u.heap,memory:u.memory,jit:u.jit,warnings:u.warnings,artifacts:u.artifacts}}async function le(u,m,d){let T=await Bun.file(d).arrayBuffer(),S=new Bun.CryptoHasher("sha256");return S.update(T),{id:e("art",u,m,d),kind:m,path:d,sha256:S.digest("hex"),bytes:T.byteLength}}function i(u){return e("cfg",u)}function P(u){return`${C(u,2)}
11
+ `}async function Z(u,m){let d=`${m}.tmp-${process.pid}`;await Bun.write(d,u),Mn(d,m)}async function l(u,m){await Z(P(u),m)}class M extends Error{code;path;schemaVersion;constructor(u,m,d={}){super(m);this.name="OstiaDocumentError",this.code=u,this.path=d.path,this.schemaVersion=d.schemaVersion}}async function s(u){let m=await Bun.file(u).text(),d;try{d=JSON.parse(m)}catch(T){let S=T instanceof Error?T.message:String(T);throw new M("invalid-json",`${u}: invalid JSON (${S})`,{path:u})}let f=d!==null&&typeof d==="object"?d.schemaVersion:void 0;if(typeof f!=="number")throw new M("not-a-document",`${u}: not a ProfileDocument (missing schemaVersion)`,{path:u});if(f!==2)throw new M("unsupported-schema",`${u}: unsupported ProfileDocument schemaVersion ${f} (this ostia reads 2)`,{path:u,schemaVersion:f});return In(d)}function In(u){for(let m of u.measurements){let d=m.timing;if(!d||d.mad!==void 0||d.samples.length===0)continue;m.timing={...h(d.samples),...d.batch!==void 0&&{batch:d.batch}}}return u}import Ce from"os";var Pn=200,qe=64,An=(()=>{let u=new Uint8Array(4096);for(let m=0;m<u.length;m++)u[m]=m*2654435761&255;return u})();function En(u,m){let d=m;for(let f=0;f<u.length;f++)d^=u[f],d=Math.imul(d,16777619);return d>>>0}function On(u){let m=h(u);return{floorPct:m.median===0?0:m.mad/m.median*100,referenceMedianNs:m.median,samples:u.length}}function Ye(u=Pn){let m=u*1e6,d=[],f=0,T=Bun.nanoseconds(),S=0;while(S<m){let E=Bun.nanoseconds();for(let F=0;F<qe;F++)f^=En(An,F);let L=Bun.nanoseconds();d.push((L-E)/qe),S=Bun.nanoseconds()-T}return On(d)}var Fn=0.75;function a(){let[u=0,m=0]=Ce.loadavg();return{cpuModel:Ce.cpus()[0]?.model??"unknown",cores:Ce.availableParallelism(),loadAvg1:u,loadAvg5:m,noise:Ye()}}function c(u){if(u.loadAvg1<=u.cores*Fn)return;return{code:"noisy-machine",message:`Load average ${u.loadAvg1.toFixed(2)} exceeds 75% of ${u.cores} available core(s); timing noise may be elevated.`,data:{loadAvg1:u.loadAvg1,cores:u.cores}}}import{profile as Un}from"bun:jsc";var Bn=new Map([["LLInt","llint"],["Baseline","baseline"],["DFG","dfg"],["FTL","ftl"]]),Ze=4294967295;function Xe(u,m){let d=m??u.interval*1e6,f=new Map,T=[];function S(R,H,re,we){let oe=f.get(R);if(oe===void 0)oe=new Map,f.set(R,oe);let Te=H??"",ve=oe.get(Te);if(ve===void 0)ve=T.length,oe.set(Te,ve),T.push({key:e("fr",R,Te),name:R,url:H,line:re,col:we});return ve}function E(R){let H=R.line===Ze,re=H?void 0:R.line-1,we=H||R.column===Ze?void 0:R.column-1;return S(R.name,R.sourceURL,re,we)}let L=S("(root)",void 0,void 0,void 0),F=1,V={id:0,frameIx:L,children:new Map,selfUs:0,samples:0,totalUs:0},j=new Map([[0,V]]),G={llint:0,baseline:0,dfg:0,ftl:0},ne=new Map,se=[],be=[];for(let R of u.traces){let H=R.frames,re=V;for(let Te=H.length-1;Te>=0;Te--){let ve=E(H[Te]),Re=re.children.get(ve);if(!Re)Re={id:F++,frameIx:ve,children:new Map,selfUs:0,samples:0,totalUs:0},re.children.set(ve,Re),j.set(Re.id,Re);re=Re}re.selfUs+=d,re.samples+=1,se.push(re.id),be.push(d);let we=H[0],oe=we&&Bn.get(we.category);if(oe){G[oe]++;let Te=ne.get(oe)??new Map;Te.set(re.frameIx,(Te.get(re.frameIx)??0)+1),ne.set(oe,Te)}}function te(R){let H=R.selfUs;for(let re of R.children.values())H+=te(re);return R.totalUs=H,H}te(V);let ae=new Map;function ge(R){let H=ae.get(R.frameIx);if(H)H.selfUs+=R.selfUs,H.totalUs+=R.totalUs,H.samples+=R.samples;else ae.set(R.frameIx,{frameIx:R.frameIx,selfUs:R.selfUs,totalUs:R.totalUs,samples:R.samples});for(let re of R.children.values())ge(re)}ge(V);let he=[...j.values()].map((R)=>({id:R.id,frameIx:R.frameIx,children:[...R.children.values()].map((H)=>H.id)})),Ie={origin:"jsc-profile",samplingIntervalUs:d,frames:T,nodes:he,totals:[...ae.values()].sort((R,H)=>H.selfUs-R.selfUs),samples:{nodeIds:se,timeDeltasUs:be}},Me=[...ne.entries()].flatMap(([R,H])=>[...H.entries()].sort((re,we)=>we[1]-re[1]).slice(0,3).map(([re,we])=>({tier:R,frameKey:T[re].key,samples:we})));return{cpu:Ie,jit:{origin:"jsc-profile",tiers:G,topFramesByTier:Me}}}var $n=1000;async function Q(u,m={}){let d=m.intervalUs??$n,f,T=Bun.nanoseconds(),S=await Un(async()=>(f=await u(),f),d),E=Bun.nanoseconds()-T,{cpu:L,jit:F}=Xe(S.stackTraces,d);return{result:f,cpu:L,jit:F,diagnosticWallNs:E}}var Cn=500,_n=20,Qe=3,Ln=10,Wn=2,Dn=0.1,Gn=1000,nn=1e4,jn=2*nn,Hn=1e6,Jn=5,tn=256;function rn(u){let m=Math.log10(Math.max(1,u)/1e6),d=Math.round(Qe+Wn*m);return Math.min(Ln,Math.max(Qe,d))}function Vn(u,m){let d=Math.floor(m/u);return Math.min(_n,Math.max(d,rn(u)))}var Kn;function ye(u){Kn=u}function v(u){return u!==null&&typeof u==="object"&&typeof u.then==="function"}var zn=(async()=>{}).constructor,qn=0;function Yn(u){let m=`/* ostia task loop ${qn++} */
12
+ const t0 = Bun.nanoseconds()
13
+ for (let b = 0; b < n; b++) sink[b & ${tn-1}] = ${u?"await ":""}fn()
14
+ return Bun.nanoseconds() - t0`;return(u?zn:Function)("fn","sink","n",m)}function en(u,m){return Math.max(1,Math.ceil(Gn/u),Math.ceil(m/(u*nn)))}function Zn(u){let m=[...u].sort((d,f)=>d-f);return m[m.length>>1]}async function on(u,m={}){let d=(m.budgetMs??Cn)*1e6,f=d*(m.warmup??Dn),T=Bun.nanoseconds(),S=u(),E=v(S);if(E)await S;let L=Math.max(1,Bun.nanoseconds()-T),F=Yn(E),V=Array(tn),j=(oe)=>F(u,V,oe),G=Bun.nanoseconds(),ne=1;while(Bun.nanoseconds()-G<f){let oe=await j(ne);if(L=Math.max(1,oe/ne),oe<Hn)ne*=2}let se=en(L,d);if(se>1){let oe=[];for(let Te=0;Te<Jn;Te++)oe.push(await j(se)/se);L=Math.max(1,Zn(oe)),se=en(L,d)}let be=L*se,te=m.samples??m.minSamples??Vn(be,d),ae=m.samples!==void 0?0:d,ge=m.samples??Math.max(jn,te),he=[],Ie=Bun.nanoseconds(),Me=0,Se=0;while(Se<te||Me<ae&&Se<ge){let oe=await j(se);if(he.push({i:Se,wallNs:oe/se}),Se++,Me=Bun.nanoseconds()-Ie,m.gc)Bun.gc(!0);if(Se>=ge&&Se>=te)break}let R=he.map((oe)=>oe.wallNs),H=h(R);if(se>1)H.batch=se;let re=K(H,[],"inprocess"),we=rn(be);if(he.length<we)re.push({code:"low-sample-count",message:`Only ${he.length} sample(s) at ~${Xn(be)} per trial; ${we} is the floor for this cost class. Raise minSamples or the time budget for a steadier number.`,data:{samples:he.length,target:we,trialCostNs:be}});return{trials:he,timing:H,warnings:re}}function Xn(u){if(u>=1e9)return`${(u/1e9).toFixed(2)}s`;if(u>=1e6)return`${(u/1e6).toFixed(1)}ms`;if(u>=1000)return`${(u/1000).toFixed(1)}\xB5s`;return`${u.toFixed(0)}ns`}var We=[],ke,Ne;function _e(u,m,d,f){let T=ke;ke={name:u,description:d?.description,isolate:d?.isolate,gc:d?.gc,cpu:d?.cpu,alloc:d?.alloc,peakMem:d?.peakMem,before:d?.before,after:d?.after,skip:f.skip,only:f.only};try{m()}finally{ke=T}}var xe=Object.assign((u,m,d)=>_e(u,m,d,{}),{skip:(u,m,d)=>_e(u,m,d,{skip:!0}),only:(u,m,d)=>_e(u,m,d,{only:!0})});function Le(u,m,d,f){let T=Ne!==void 0||d?.params!==void 0?{...Ne,...d?.params}:void 0;We.push({groupName:ke?.name,groupDescription:ke?.description,groupIsolate:ke?.isolate,groupGc:ke?.gc,groupCpu:ke?.cpu,groupAlloc:ke?.alloc,groupPeakMem:ke?.peakMem,groupBefore:ke?.before,groupAfter:ke?.after,name:u,fn:m,baseline:d?.baseline,params:T,skipped:f.skip||ke?.skip,only:f.only||ke?.only,opts:d})}var Pe=Object.assign((u,m,d)=>Le(u,m,d,{}),{skip:(u,m,d)=>Le(u,m,d,{skip:!0}),only:(u,m,d)=>Le(u,m,d,{only:!0})});function W(){return We}function de(){We.length=0,ke=void 0,Ne=void 0}function pe(u,m){let d=Ne;Ne=u;try{return m()}finally{Ne=d}}function A(u){return u.groupName?`${u.groupName}/${u.name}`:u.name}function ie(u,m){return u.opts?.isolate??u.groupIsolate??m}function sn(u,m){return u.opts?.gc??u.groupGc??m}function an(u,m){return u.opts?.cpu??u.groupCpu??m}function un(u,m){return u.opts?.alloc??u.groupAlloc??m}function fe(u,m){return u.opts?.peakMem??u.groupPeakMem??m}function Qn(u,m){if(!m)return[...u];let d=new RegExp(m);return u.filter((f)=>d.test(A(f)))}function U(u,m,d){let f=u.filter((E)=>E.only),T=f.length>0?f:u;if(f.length>0)process.stderr.write(`bench: ${f.length} task(s) selected by .only
15
+ `);let S=Qn(T,m);if(S.length===0)throw Error(`filter ${JSON.stringify(m)} matched zero of ${T.length} registered task(s) in ${d}.`);return S}import{heapStats as et}from"bun:jsc";var nt=100;function cn(){try{return et().heapSize}catch{return process.memoryUsage().heapUsed}}async function ln(u,m=nt){let d=Bun.nanoseconds();Bun.gc(!0);let f=cn();for(let E=0;E<m;E++){let L=u();if(v(L))await L}Bun.gc(!0);let T=cn(),S=Bun.nanoseconds()-d;return{memory:{origin:"heapStats",kind:"retained",bytesPerOp:Math.max(0,(T-f)/m)},diagnosticWallNs:S}}var De=100,Ee=2000,tt=2,rt=200,ot=1e4,it=Ee/2,st=20;function at(u){let m=Ee*tt*u/1000;return Math.min(ot,Math.max(rt,m))}async function mn(u,m={}){let d=m.intervalUs??De,f=at(d)*1e6,T=async()=>{let G=Bun.nanoseconds();do{let ne=u();if(v(ne))await ne}while(Bun.nanoseconds()-G<f)},{cpu:S,jit:E,diagnosticWallNs:L}=await Q(T,{intervalUs:d}),F=[],V=ut(S);if(V)F.push(V);let j=ct(E);if(j)F.push(j);return{cpu:S,jit:E,diagnosticWallNs:L,warnings:F}}function ut(u){let m=O(u);if(m>=it)return;return{code:"low-sample-count",message:`Only ${m} CPU sample(s) at ${u.samplingIntervalUs}\xB5s (target ${Ee}); frame shares this thin move several points between runs. Lower --cpu-interval for more.`,data:{samples:m,target:Ee,intervalUs:u.samplingIntervalUs}}}function ct(u){let{llint:m,baseline:d,dfg:f,ftl:T}=u.tiers,S=m+d+f+T;if(S===0)return;let E=m/S*100,L=d/S*100,F=f/S*100,V=T/S*100;if(E+L<=st)return;return{code:"jit-cold",message:`${(E+L).toFixed(1)}% of CPU samples were in the llint/baseline tiers: the JIT never warmed this task up.`,data:{llintPct:E,baselinePct:L,dfgPct:F,ftlPct:V}}}function ee(u,m,d){let f=A(m);return ze(u,f,{label:f,baseline:m.baseline,group:m.groupName,description:m.opts?.description,groupDescription:m.groupDescription,isolated:d,params:m.params,skipped:m.skipped})}async function _(u,m,d){let T=m.some((j)=>!j.skipped)&&d.noiseCheck!==!1?a():void 0,S=T?c(T):void 0,E=new Map,L=new Map;m.forEach((j,G)=>{if(j.groupName===void 0||j.skipped)return;if(!E.has(j.groupName))E.set(j.groupName,G);L.set(j.groupName,G)});let F=[],V=[];for(let j=0;j<m.length;j++){let G=m[j],ne=ee(u,G,d.markIsolated);if(F.push(ne),G.skipped)continue;let se=G.groupName!==void 0&&E.get(G.groupName)===j,be=G.groupName!==void 0&&L.get(G.groupName)===j;if(se&&G.groupBefore)await G.groupBefore();if(G.opts?.before)await G.opts.before();let te={budgetMs:G.opts?.budgetMs??d.budgetMs,samples:G.opts?.samples??d.samples,minSamples:G.opts?.minSamples??d.minSamples,warmup:d.warmup,gc:sn(G,d.gc??!1)},ae=await on(G.fn,te);if(V.push(x({workload:ne,configFingerprint:i({budgetMs:te.budgetMs??null,samples:te.samples??null,minSamples:te.minSamples??null,gc:te.gc??!1}),trials:ae.trials,timing:ae.timing,warnings:S&&V.length===0?[...ae.warnings,S]:ae.warnings})),an(G,d.cpu??!1)){let ge=d.cpuIntervalUs??De,he=await mn(G.fn,{intervalUs:ge});V.push(p({workload:ne,phase:"cpu",configFingerprint:i({cpu:!0,intervalUs:ge}),diagnosticWallNs:he.diagnosticWallNs,cpu:he.cpu,jit:he.jit,warnings:he.warnings,artifacts:[]}))}if(un(G,d.alloc??!1)){let ge=await ln(G.fn);V.push(p({workload:ne,phase:"memstats",configFingerprint:i({alloc:!0}),diagnosticWallNs:ge.diagnosticWallNs,memory:ge.memory,warnings:[],artifacts:[]}))}if(G.opts?.after)await G.opts.after();if(be&&G.groupAfter)await G.groupAfter()}return r(F,V,T)}
16
+ export{C,e,I,b,n,O,g,J,w,t,z,ce,k,q,h,o,K,Y,D,ue,X,y,N,r,B,me,x,p,le,i,P,Z,l,M,s,a,c,Q,ye,v,xe,Pe,W,de,pe,A,ie,fe,U,ee,_};
@@ -0,0 +1,25 @@
1
+ // @bun
2
+ import{C,e,I,b,n,O,g,J,w,t,z,ce,k,q,h,o,K,Y,D,ue,X,y,r,B,me,x,p,le,i,P,s,a,c,Q,W,pe,U,_}from"./chunk-17t12ta6.js";function ln(l,v,M){let N=l[0];if(N==="bun"||N?.endsWith("/bun"))return{argv:[N,...v,...l.slice(1)],env:M};return{argv:l,env:{...process.env,...M,BUN_OPTIONS:v.join(" ")}}}function kt(l){return l.startsWith("file://")?l.slice(7):l}function pn(l,v,M){let N=l.nodes,A=N.length,ie=new Map,ee=[],de=new Map,Z=new Int32Array(A);for(let Ce=0;Ce<A;Ce++){let ve=N[Ce],Me=ve.callFrame,Ne=kt(Me.url),Ue=ie.get(Me.functionName);if(Ue===void 0)Ue=new Map,ie.set(Me.functionName,Ue);let Oe=Ue.get(Ne);if(Oe===void 0)Oe=ee.length,Ue.set(Ne,Oe),ee.push({key:e("fr",Me.functionName,Ne),name:Me.functionName,url:Ne||void 0,line:Me.lineNumber>=0?Me.lineNumber:void 0,col:Me.columnNumber>=0?Me.columnNumber:void 0});Z[Ce]=Oe,de.set(ve.id,Ce)}let fe=Array(A);for(let Ce=0;Ce<A;Ce++){let ve=N[Ce];fe[Ce]={id:ve.id,frameIx:Z[de.get(ve.id)],children:ve.children??[]}}let xe=new Float64Array(A),ye=new Float64Array(A),{samples:$e,timeDeltas:Pe}=l;for(let Ce=0;Ce<$e.length;Ce++){let ve=de.get($e[Ce]);if(ve===void 0)continue;xe[ve]+=Pe[Ce]??0,ye[ve]+=1}let Re=new Int32Array(A).fill(-1);for(let Ce=0;Ce<A;Ce++){let ve=N[Ce].children;if(!ve)continue;for(let Me of ve){let Ne=de.get(Me);if(Ne!==void 0)Re[Ne]=Ce}}let Ie=[],Te=[];for(let Ce=A-1;Ce>=0;Ce--)if(Re[Ce]===-1)Te.push(Ce);while(Te.length>0){let Ce=Te.pop();Ie.push(Ce);let ve=N[Ce].children;if(!ve)continue;for(let Me of ve){let Ne=de.get(Me);if(Ne!==void 0&&Re[Ne]===Ce)Te.push(Ne)}}let Be=new Float64Array(A);for(let Ce=Ie.length-1;Ce>=0;Ce--){let ve=Ie[Ce];Be[ve]+=xe[ve];let Me=Re[ve];if(Me>=0)Be[Me]+=Be[ve]}let Fe=Array(ee.length),De=[];for(let Ce=0;Ce<A;Ce++){let ve=fe[Ce].frameIx,Me=Fe[ve];if(Me)Me.selfUs+=xe[Ce],Me.totalUs+=Be[Ce],Me.samples+=ye[Ce];else{let Ne={frameIx:ve,selfUs:xe[Ce],totalUs:Be[Ce],samples:ye[Ce]};Fe[ve]=Ne,De.push(Ne)}}return{origin:v,samplingIntervalUs:M,frames:ee,nodes:fe,totals:De.sort((Ce,ve)=>ve.selfUs-Ce.selfUs),samples:{nodeIds:l.samples,timeDeltasUs:l.timeDeltas}}}async function Fn(l){let v=`${l.artifactDir}/${l.fileName}`,{argv:M,env:N}=ln(l.argv,["--cpu-prof","--cpu-prof-dir",l.artifactDir,"--cpu-prof-name",l.fileName,"--cpu-prof-interval",String(l.intervalUs)],l.env),A=Bun.nanoseconds(),ee=await Bun.spawn(M,{cwd:l.cwd,env:N,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,de=Bun.nanoseconds()-A,Z=Bun.file(v);if(!await Z.exists())return{diagnosticWallNs:de,exitCode:ee,warnings:[{code:"artifact-missing",message:`Expected a .cpuprofile at ${v} after exit ${ee}, found nothing. The workload's argv[0] must be a \`bun\` binary for CPU capture.`,data:{artifactPath:v,argv:l.argv}}]};let fe=await Z.json(),xe=pn(fe,"cpu-prof",l.intervalUs),ye=fe.samples.length===0?[{code:"empty-profile",message:"CPU capture produced zero samples."}]:[];return{diagnosticWallNs:de,exitCode:ee,artifactPath:v,cpu:xe,warnings:ye}}function Bn(l){let{node_fields:M,node_types:N}=l.snapshot.meta,A=M.indexOf("type"),ie=M.indexOf("self_size"),ee=M.length,de=N[0];if(A===-1||ie===-1||!Array.isArray(de))return{origin:"heap-prof",typeCounts:[],objectCount:l.snapshot.node_count};let Z=de.length,fe=Array(Z),xe=new Map,ye=[],$e=0,Pe=l.nodes,Re=Pe.length;for(let De=0;De<Re;De+=ee){let Ce=Pe[De+A],ve=Pe[De+ie]??0;$e+=ve;let Me;if(Ce>=0&&Ce<Z){if(Me=fe[Ce],Me===void 0)Me={type:de[Ce],count:0,bytes:0},fe[Ce]=Me,ye.push(Me)}else{let Ne=`unknown(${Ce})`;if(Me=xe.get(Ne),Me===void 0)Me={type:Ne,count:0,bytes:0},xe.set(Ne,Me),ye.push(Me)}Me.count++,Me.bytes+=ve}let Ie=ye.sort((De,Ce)=>Ce.count-De.count),Te=Ie.slice(0,20),Be=Ie.slice(20),Fe=Te.map(({type:De,count:Ce,bytes:ve})=>({type:De,count:Ce,retainedBytes:ve}));if(Be.length>0){let De=0,Ce=0;for(let ve of Be)De+=ve.count,Ce+=ve.bytes;Fe.push({type:"other",count:De,retainedBytes:Ce})}return{origin:"heap-prof",heapSizeBytes:$e,objectCount:l.snapshot.node_count,typeCounts:Fe}}async function An(l){let v=`${l.artifactDir}/${l.fileName}`,{argv:M,env:N}=ln(l.argv,["--heap-prof","--heap-prof-dir",l.artifactDir,"--heap-prof-name",l.fileName],l.env),A=Bun.nanoseconds(),ee=await Bun.spawn(M,{cwd:l.cwd,env:N,stdout:"ignore",stderr:"ignore",stdin:"ignore"}).exited,de=Bun.nanoseconds()-A,Z=Bun.file(v);if(!await Z.exists())return{diagnosticWallNs:de,exitCode:ee,warnings:[{code:"artifact-missing",message:`Expected a heap snapshot at ${v} after exit ${ee}, found nothing. The workload's argv[0] must be a \`bun\` binary for heap capture.`,data:{artifactPath:v,argv:l.argv}}]};let fe=await Z.json(),xe=Bn(fe);return{diagnosticWallNs:de,exitCode:ee,artifactPath:v,heap:xe,warnings:[]}}var Pt=1000;async function Un(l,v={}){let M=v.intervalUs??Pt,{Session:N}=await import("inspector/promises"),A=new N;A.connect();let ie=Bun.nanoseconds();try{await A.post("Profiler.enable"),await A.post("Profiler.setSamplingInterval",{interval:M}),await A.post("Profiler.start");let ee=await l(),{profile:de}=await A.post("Profiler.stop"),Z=Bun.nanoseconds()-ie,fe=pn(de,"inspector",M);return{result:ee,cpu:fe,diagnosticWallNs:Z}}finally{A.disconnect()}}function $t(l){let v=l>>>0;return()=>{v=v+1831565813|0;let M=Math.imul(v^v>>>15,1|v);return M=M+Math.imul(M^M>>>7,61|M)^M,((M^M>>>14)>>>0)/4294967296}}var fn=2000,xt=2000;function Mt(l){let v=l.length,M=v>>1;return v%2===0?(l[M-1]+l[M])/2:l[M]}function jn(l,v,M){if(l.length<=M)return l;let N=[...l];for(let A=0;A<M;A++){let ie=A+Math.floor(v()*(N.length-A)),ee=N[A];N[A]=N[ie],N[ie]=ee}return N.slice(0,M)}class Mn{sorted;rankOf;counts;n;constructor(l){let v=l.length,M=new Uint32Array(v);for(let N=0;N<v;N++)M[N]=N;M.sort((N,A)=>l[N]-l[A]),this.sorted=new Float64Array(v),this.rankOf=new Uint32Array(v);for(let N=0;N<v;N++)this.sorted[N]=l[M[N]],this.rankOf[M[N]]=N;this.n=v,this.counts=new Uint32Array(v)}resampleMedian(l){let{n:v,counts:M,sorted:N,rankOf:A}=this;M.fill(0);for(let fe=0;fe<v;fe++)M[A[Math.floor(l()*v)]]++;let ie=v+1>>1,ee=v%2===0?ie+1:ie,de=0,Z=-1;for(let fe=0;fe<v;fe++){if(de+=M[fe],Z<0&&de>=ie)Z=fe;if(de>=ee)return Z===fe?N[fe]:(N[Z]+N[fe])/2}return N[v-1]}}function Rt(l,v){let M=new Float64Array(l.length+v.length+1);return M.set(l),M[l.length]=Number.NaN,M.set(v,l.length+1),Bun.hash.crc32(M)}function _n(l,v,M={}){let N=M.seed??Rt(l,v),A=$t(N),ie=M.iterations??xt,ee=l.length>fn||v.length>fn,de=new Mn(jn(l,A,fn)),Z=new Mn(jn(v,A,fn)),fe=Mt(de.sorted),xe=new Float64Array(ie);for(let ye=0;ye<ie;ye++){let $e=de.resampleMedian(A),Pe=Z.resampleMedian(A);xe[ye]=fe===0?Pe-$e===0?0:1/0:(Pe-$e)/fe*100}return xe.sort(),{ci95:[o(xe,0.025),o(xe,0.975)],seed:N,data:{subsampled:ee,iterations:ie}}}function vt(l){let v=l<0?-1:1,M=Math.abs(l),N=0.254829592,A=-0.284496736,ie=1.421413741,ee=-1.453152027,de=1.061405429,Z=0.3275911,fe=1/(1+0.3275911*M),xe=1-((((1.061405429*fe+-1.453152027)*fe+1.421413741)*fe+-0.284496736)*fe+0.254829592)*fe*Math.exp(-M*M);return v*xe}function Ct(l){return 0.5*(1+vt(l/Math.SQRT2))}function Ln(l,v){let M=l.length,N=v.length,A=M+N,ie=new Float64Array(l),ee=new Float64Array(v);ie.sort(),ee.sort();let de=0,Z=0,fe=0,xe=0,ye=0;while(fe<M||xe<N){let Be=xe>=N||fe<M&&ie[fe]<=ee[xe]?ie[fe]:ee[xe],Fe=0;while(fe<M&&ie[fe]===Be)Fe++,fe++;let De=0;while(xe<N&&ee[xe]===Be)De++,xe++;let Ce=Fe+De,ve=ye+(Ce+1)/2;if(de+=Fe*ve,Ce>1)Z+=Ce**3-Ce;ye+=Ce}let $e=de-M*(M+1)/2,Pe=M*N/2,Re=Math.sqrt(M*N*(A+1-Z/(A*(A-1)))/12),Ie=Re===0?0:($e-Pe)/Re,Te=Math.min(1,Math.max(0,2*(1-Ct(Math.abs(Ie)))));return{u:$e,z:Ie,pValue:Te}}var d={timingPct:5,frameSelfPct:10,heapTypePct:10,minFrameSelfUs:1000,alpha:0.01,bootstrapIterations:2000},Rn=5;function gn(l,v){if(l===0)return v===0?0:1/0;return(v-l)/l*100}function Vn(l){let v=new Map;for(let M of l.measurements){let N=`${M.workloadId}\x00${M.phase}`;if(!v.has(N))v.set(N,M)}return v}function Tt(l,v,M){return{base:l,cand:v,baseByPhase:Vn(l),candByPhase:Vn(v),candWorkloads:new Map(v.workloads.map((N)=>[N.id,N])),environmentMismatch:It(l,v),effectiveTimingPct:Math.max(M.timingPct,l.environment?.noise.floorPct??0,v.environment?.noise.floorPct??0)}}function It(l,v){let M=[];if(l.platform.os!==v.platform.os)M.push({field:"platform.os",base:l.platform.os,cand:v.platform.os});if(l.platform.arch!==v.platform.arch)M.push({field:"platform.arch",base:l.platform.arch,cand:v.platform.arch});if(l.bunVersion!==v.bunVersion)M.push({field:"bunVersion",base:l.bunVersion,cand:v.bunVersion});if(l.environment&&v.environment){if(l.environment.cpuModel!==v.environment.cpuModel)M.push({field:"cpuModel",base:l.environment.cpuModel,cand:v.environment.cpuModel});if(l.environment.cores!==v.environment.cores)M.push({field:"cores",base:l.environment.cores,cand:v.environment.cores})}if(M.length===0)return;return{code:"environment-mismatch",message:`Base and candidate were measured on different environments (${M.map((N)=>N.field).join(", ")}); a timing delta may reflect that instead of the code change.`,data:{fields:M}}}function St(l){let v=[];for(let N of l){if(!N.timing)continue;let A=1+N.timing.medianDeltaPct/100;if(Number.isFinite(A)&&A>0)v.push(Math.log(A))}if(v.length===0)return null;let M=v.reduce((N,A)=>N+A,0)/v.length;return(Math.exp(M)-1)*100}function ne(l,v,M=d){let N=Tt(l,v,M);return{effectiveTimingPct:N.effectiveTimingPct,compare:(A)=>Ot(N,A,M),unmatched(){let A=new Set(l.workloads.map((ie)=>ie.id));return{baseOnly:l.workloads.filter((ie)=>!N.candWorkloads.has(ie.id)),candOnly:v.workloads.filter((ie)=>!A.has(ie.id))}}}}function te(l,v){let M=0,N=0,A=0;for(let ie of l){if(!ie.timing)continue;if(ie.timing.verdict==="regressed")M++;else if(ie.timing.verdict==="improved")N++;else A++}return{matched:l.length,regressed:M,improved:N,unchanged:A,geomeanPct:St(l),effectiveTimingPct:v,verdict:l.some((ie)=>ie.verdict==="fail")?"fail":"pass"}}function L(l,v,M=d){let N=ne(l,v,M),A=[];for(let ie of l.workloads){let ee=N.compare(ie.id);if(ee)A.push(ee)}return{comparisons:A,unmatched:N.unmatched(),summary:te(A,N.effectiveTimingPct)}}function Ot(l,v,M){let{baseByPhase:N,candByPhase:A,effectiveTimingPct:ie}=l,ee=N.get(`${v}\x00timing`),de=A.get(`${v}\x00timing`),Z=N.get(`${v}\x00cpu`),fe=A.get(`${v}\x00cpu`),xe=N.get(`${v}\x00heap`),ye=A.get(`${v}\x00heap`),$e=l.candWorkloads.get(v),Pe=ee?.id??Z?.id??xe?.id,Re=de?.id??fe?.id??ye?.id??$e?.id;if(!Pe||!Re)return;let Ie=!1,Te=[];if(l.environmentMismatch)Te.push(l.environmentMismatch);let Be;if(ee?.timing&&$e?.skipped&&!de?.timing)Be={medianDeltaPct:0,meanDeltaPct:0,verdict:"unchanged"},Te.push({code:"skipped",message:"Candidate has no timing measurement for this workload (task.skip()); treated as unchanged.",data:{workloadId:v}});else if(ee?.timing&&de?.timing){let Ce=ee.timing.samples,ve=de.timing.samples,Me=gn(ee.timing.median,de.timing.median),Ne=gn(ee.timing.mean,de.timing.mean),Ue=(Oe,Ae)=>{if(Oe>ie)return"regressed";if(Ae<-ie)return"improved";return"unchanged"};if(Ce.length<Rn||ve.length<Rn){let Oe=Ue(Me,Me);if(Oe==="regressed")Ie=!0;Be={medianDeltaPct:Me,meanDeltaPct:Ne,verdict:Oe},Te.push({code:"thin-comparison",message:`Only ${Ce.length} baseline / ${ve.length} candidate sample(s); falling back to a point-estimate threshold instead of a bootstrap CI and Mann-Whitney test (needs ${Rn}+ per side).`,data:{baseSamples:Ce.length,candSamples:ve.length}})}else{let Oe=_n(Ce,ve,{iterations:M.bootstrapIterations}),Ae=Ln(Ce,ve),_e=Ae.pValue<M.alpha?Ue(Oe.ci95[0],Oe.ci95[1]):"unchanged";if(_e==="regressed")Ie=!0;Be={medianDeltaPct:Me,meanDeltaPct:Ne,ci95:Oe.ci95,pValue:Ae.pValue,seed:Oe.seed,verdict:_e}}}let Fe;if(Z?.cpu&&fe?.cpu){let Ce=new Map(Z.cpu.totals.map((Oe)=>[Z.cpu.frames[Oe.frameIx].key,Oe])),ve=new Map(fe.cpu.totals.map((Oe)=>[fe.cpu.frames[Oe.frameIx].key,Oe])),Me=new Map(Z.cpu.frames.map((Oe)=>[Oe.key,Oe.name])),Ne=new Map(fe.cpu.frames.map((Oe)=>[Oe.key,Oe.name]));Fe=[...new Set([...Ce.keys(),...ve.keys()])].map((Oe)=>{let Ae=Ce.get(Oe)?.selfUs??0,_e=ve.get(Oe)?.selfUs??0;return{frameKey:Oe,name:Ne.get(Oe)??Me.get(Oe)??Oe,baseSelfUs:Ae,candSelfUs:_e,deltaPct:gn(Ae,_e)}}).sort((Oe,Ae)=>Math.abs(Ae.deltaPct)-Math.abs(Oe.deltaPct));for(let Oe of Fe)if((Oe.baseSelfUs>=M.minFrameSelfUs||Oe.candSelfUs>=M.minFrameSelfUs)&&Oe.deltaPct>M.frameSelfPct)Ie=!0}let De;if(xe?.heap&&ye?.heap){let Ce=new Map(xe.heap.typeCounts.map((Ne)=>[Ne.type,Ne])),ve=new Map(ye.heap.typeCounts.map((Ne)=>[Ne.type,Ne]));De=[...new Set([...Ce.keys(),...ve.keys()])].map((Ne)=>{let Ue=Ce.get(Ne),Oe=ve.get(Ne);return{type:Ne,baseCount:Ue?.count??0,candCount:Oe?.count??0,baseBytes:Ue?.retainedBytes,candBytes:Oe?.retainedBytes,deltaPct:gn(Ue?.count??0,Oe?.count??0)}}).sort((Ne,Ue)=>Math.abs(Ue.deltaPct)-Math.abs(Ne.deltaPct));for(let Ne of De)if(Ne.deltaPct>M.heapTypePct)Ie=!0}return{id:e("cmp",Pe,Re),baselineMeasurementId:Pe,candidateMeasurementId:Re,timing:Be,...Te.length>0&&{warnings:Te},frames:Fe,heapTypes:De,thresholds:{...M,effectiveTimingPct:ie},verdict:Ie?"fail":"pass"}}var Ze="node_modules/.cache/ostia",Dt=".ostia/baselines",Nt={warmup:3,outDir:Ze,baselineDir:Dt,baseline:"main",thresholds:d,workloads:[]};class T extends Error{}var Et={runs:"samples"};function zn(l,v){for(let[M,N]of Object.entries(Et))if(M in l)throw new T(`${v}: "${M}" was renamed to "${N}".`);return{...Nt,...l,thresholds:{...d,...l.thresholds??{}}}}async function Hn(l){let v=Bun.file(l);if(!await v.exists())return;let M;try{M=await v.json()}catch(N){throw new T(`${l}: ${N instanceof Error?N.message:String(N)}`)}return zn(M,l)}async function Gn(l){let v=l.startsWith("/")?l:`${process.cwd()}/${l}`;if(!await Bun.file(v).exists())return;let M;try{M=await import(v)}catch(N){throw new T(`${l}: ${N instanceof Error?N.message:String(N)}`)}return zn(M.default??{},l)}async function E(l){if(l!==void 0)return l.endsWith(".ts")?Gn(l):Hn(l);return await Gn("ostia.config.ts")??Hn("ostia.config.json")}function u(l,v){return`${l.baselineDir}/${v??l.baseline}.json`}async function re(){if(await Bun.file("ostia.config.ts").exists())return"ostia.config.ts";if(await Bun.file("ostia.config.json").exists())return"ostia.config.json";return}var Wt=10,Ft=3000000000,Bt=3;function vn(l){if(l.timeSource)Y(l.timeSource);let v=l.warmup??Bt,M=l.samples,N=l.minSamples??Wt,A=M??N,ie=M!==void 0?0:l.budgetMs!==void 0?l.budgetMs*1e6:Ft,ee=l.timeSource!==void 0,de=l.ignoreExitCodes??[],Z=new Set(de),fe=[],xe=0,ye=0,$e=!1,Pe;function Re(){if($e)return!0;if(M!==void 0)return ye>=M;return ye>=A&&xe>=ie}async function Ie(Te,Be){if(l.prepare)await X(l.prepare,{phase:Te,index:Be},{cwd:l.cwd,env:l.env,timeoutMs:l.timeoutMs,signal:l.signal});return ue(l)}return{async warmup(){for(let Te=0;Te<v;Te++){if(l.signal?.aborted)return;await Ie("warmup",Te)}},async step(){if(Re()||l.signal?.aborted)return!1;let Te=await Ie("timing",ye);if(l.signal?.aborted)return!1;if(Te.timeSourceNoMatch)Pe??=Te.timeSourceMissOutput;if(fe.push({i:ye,wallNs:Te.wallNs,exitCode:Te.exitCode??void 0,userNs:Te.userNs,systemNs:Te.systemNs,maxRssBytes:Te.maxRssBytes,...Te.reportedNs!==void 0&&{reportedNs:Te.reportedNs},...Te.timedOut?{timedOut:!0}:{},...Te.timeSourceNoMatch?{timeSourceNoMatch:!0}:{}}),xe+=Te.wallNs,ye++,Te.exitCode!==null&&Te.exitCode!==0&&!Z.has(Te.exitCode))$e=!0;return!0},done:Re,result(){let Te=fe.filter((Me)=>!Me.timedOut&&!Me.timeSourceNoMatch),Be=Te.map((Me)=>ee?Me.reportedNs:Me.wallNs),Fe=[],De=fe.filter((Me)=>Me.timedOut).length;if(De>0)Fe.push({code:"timeout",message:`${De} of ${fe.length} trial(s) timed out after ${l.timeoutMs}ms.`,data:{timeoutMs:l.timeoutMs,trials:De}});let Ce=fe.filter((Me)=>Me.timeSourceNoMatch).length;if(Ce>0&&l.timeSource){let{pattern:Me}=l.timeSource;Fe.push({code:"time-source-no-match",message:`${Ce} of ${fe.length} trial(s) didn't match the timeSource pattern.`,data:{pattern:typeof Me==="string"?Me:Me.source,trials:Ce,...Pe!==void 0&&{output:Pe}}})}if(Be.length===0)return{trials:fe,warnings:Fe};let ve=h(Be);return Fe.push(...K(ve,Te.map((Me)=>Me.exitCode),ee?"reported":"subprocess",de)),{trials:fe,timing:ve,warnings:Fe}}}}async function Cn(l){await l.warmup();while(await l.step());}async function ae(l){let v=vn(l);return await Cn(v),v.result()}function G(l,v=[]){if(!l.timing)return!0;let M=new Set(v);return l.trials.some((N)=>N.exitCode!==void 0&&N.exitCode!==0&&!M.has(N.exitCode))}function hn(l,v){let M={samples:v.samples,minSamples:v.minSamples};for(let[N,A]of Object.entries(M))if(A!==void 0&&(!Number.isFinite(A)||A<1))throw RangeError(`${l}: ${N} must be >= 1, got ${A}`);if(v.budgetMs!==void 0&&!Number.isFinite(v.budgetMs))throw RangeError(`${l}: budgetMs must be finite, got ${v.budgetMs}`)}import{appendFileSync as At,existsSync as Tn,lstatSync as Ut,realpathSync as jt,renameSync as _t}from"fs";import{isAbsolute as Kn,relative as Lt,sep as Vt}from"path";class R extends Error{}var Ht=new URL("./runner.ts",import.meta.url).pathname,cn={base:"HEAD",rounds:15,thresholdPct:10,geomeanThresholdPct:1.5,confirm:2};function Jn(l,v){let M=Bun.spawnSync(["git",...l],{cwd:v,stdout:"pipe",stderr:"ignore"});return M.success?M.stdout.toString().trim():void 0}var Gt=`
3
+ ;globalThis.__ostia_ab_base__;
4
+ `,zt="**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}";async function Kt(l){for await(let v of new Bun.Glob(zt).scan({cwd:l,dot:!0,absolute:!0})){if(/\.d\.[mc]?ts$/.test(v)||!Ut(v).isFile())continue;At(v,Gt)}}async function Jt(l,v,M){if(Tn(v))return;let N=`${v}.tmp-${process.pid}`;await Bun.spawn(["rm","-rf",N]).exited,await Bun.spawn(["mkdir","-p",N]).exited;let A=Bun.spawn(["git","archive","--format=tar",l],{cwd:M,stdout:"pipe",stderr:"pipe"}),ie=Bun.spawn(["tar","-x","-C",N],{stdin:A.stdout,stderr:"pipe"}),[ee,de]=await Promise.all([A.exited,ie.exited]);if(ee!==0||de!==0){let Z=await new Response(ee!==0?A.stderr:ie.stderr).text();throw await Bun.spawn(["rm","-rf",N]).exited,Error(`Could not extract ${l}: ${Z.trim()}`)}await Kt(N);try{_t(N,v)}catch{await Bun.spawn(["rm","-rf",N]).exited}}function Yt(l){return o(Float64Array.from(l).sort(),0.5)}function qt(l){if(!l.repeats?.length)return l.medianRatio;return Yt([l.medianRatio,...l.repeats.map((v)=>v.medianRatio)])}function Qt(l,v){let M=l.map((de)=>de.paired).filter((de)=>de!==void 0),N=0;for(let de of M)N+=Math.log(qt(de));let A=M.length>0?(Math.exp(N/M.length)-1)*100:null,ie=M.filter((de)=>de.verdict==="regressed").length,ee=M.filter((de)=>de.verdict==="improved").length;return{...v,matched:M.length,regressed:ie,improved:ee,unchanged:M.length-ie-ee,unconfirmed:M.filter((de)=>de.confirmed===!1).length,outputDiffers:M.filter((de)=>!de.sameOutput).length,geomeanPct:A,verdict:ie>0||A!==null&&A>v.geomeanThresholdPct?"fail":"pass"}}async function j(l){let v=l.base??cn.base,M=l.rounds??cn.rounds,N=l.thresholdPct??cn.thresholdPct,A=l.geomeanThresholdPct??cn.geomeanThresholdPct,ie=l.confirm??cn.confirm;if(!Number.isInteger(M)||M<3)throw RangeError(`ab: rounds must be an integer >= 3, got ${M}`);if(!Number.isInteger(ie)||ie<0)throw RangeError(`ab: confirm must be an integer >= 0, got ${ie}`);for(let[ve,Me]of Object.entries({thresholdPct:N,geomeanThresholdPct:A}))if(!Number.isFinite(Me)||Me<0)throw RangeError(`ab: ${ve} must be >= 0, got ${Me}`);let ee=l.cwd??process.cwd(),de=l.outDir??Ze,Z=Kn(de)?de:`${ee}/${de}`,fe=`${Z}/ab-tmp`,xe=Jn(["rev-parse","--show-toplevel"],ee);if(xe===void 0)throw new R(`${ee} is not inside a git repository.`);let ye=Jn(["rev-parse","--verify","--quiet",`${v}^{commit}`],ee);if(ye===void 0)throw new R(`"${v}" is not a commit in ${xe}.`);let $e=`${Z}/ab/${ye}`;await Jt(ye,$e,ee);let Pe=l.noiseCheck===!1?void 0:a(),Re=(ve)=>Kn(ve)?ve:`${ee}/${ve}`,Ie=l.suites.map(Re),Te=Ie.map((ve,Me)=>{if(!Tn(ve))throw Error(`Suite not found: ${l.suites[Me]}`);let Ne=Lt(xe,jt(ve));if(Ne===".."||Ne.startsWith(`..${Vt}`))throw new R(`${l.suites[Me]} is outside ${xe}.`);return Tn(`${$e}/${Ne}`)?`${$e}/${Ne}`:""}),Be=(l.preload??[]).map(Re),Fe=l.bunFlags??[],De=0,Ce=async(ve,Me={})=>{let Ne=`${fe}/${e("ab-run",Ie[ve],De++)}.json`,Ue={filter:l.filter,rounds:M,thresholdPct:N,preload:Be,...Me},Oe=D(l.timeoutMs,l.signal),_e=await Bun.spawn(["bun",...Fe,Ht,Ie[ve],Te[ve],Ne,JSON.stringify(Ue)],{cwd:ee,stdout:"inherit",stderr:"inherit",stdin:"ignore",...Oe.spawn}).exited;if(l.signal?.aborted)return;if(Oe.timedOut())throw Error(`A/B suite timed out after ${l.timeoutMs}ms: ${l.suites[ve]}`);if(_e!==0)throw Error(`A/B suite failed: ${l.suites[ve]} (runner exited ${_e})`);return s(Ne)};try{let ve=[],Me=[],Ne=new Map,Ue=[],Oe=[];for(let Se=0;Se<Ie.length;Se++){let Ee=await Ce(Se);if(!Ee)break;ve.push(...Ee.workloads),Me.push(...Ee.measurements);for(let Ve of Ee.measurements)Ne.set(Ve.workloadId,Se);Ue.push(...Ee.unmatched?.baseOnly??[]),Oe.push(...Ee.unmatched?.candOnly??[])}for(let Se of Me){let Ee=Se.paired;if(!Ee?.flagged||ie===0)continue;Ee.repeats=[];for(let Ve=0;Ve<ie&&!l.signal?.aborted;Ve++){let He=(await Ce(Ne.get(Se.workloadId),{workloadIds:[Se.workloadId]}))?.measurements[0]?.paired;if(!He)break;Ee.repeats.push({medianRatio:He.medianRatio,p25:He.p25,p75:He.p75,...He.flagged&&{flagged:He.flagged}})}Ee.confirmed=Ee.repeats.length===ie&&Ee.repeats.every((Ve)=>Ve.flagged===Ee.flagged),Ee.verdict=Ee.confirmed?Ee.flagged:"unchanged"}let Ae=Pe&&c(Pe);if(Ae&&Me.length>0)Me[0].warnings.push(Ae);if(l.signal?.aborted&&Me.length>0)Me[Me.length-1].warnings.push({code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites had already completed."});let _e=r(ve,Me,Pe);return _e.unmatched={baseOnly:Ue,candOnly:Oe},_e.ab=Qt(Me,{base:{ref:v,sha:ye},rounds:M,thresholdPct:N,geomeanThresholdPct:A}),_e}finally{await Bun.spawn(["rm","-rf",fe]).exited}}async function H(l,v){let M=new Set;for(let N of l)for await(let A of new Bun.Glob(N).scan({cwd:v,absolute:!1}))M.add(A);return[...M].sort()}var In=new URL("./runner.ts",import.meta.url).pathname;function se(){return Math.max(1,navigator.hardwareConcurrency||1)}async function F(l,v){return H(l,v)}function Xt(l){if(l===void 0)return;return l==="auto"?se():l}async function V(l,v,M=process.cwd()){return{suites:l.suites.length>0?l.suites:v?.suites?await F(v.suites,M):[],budgetMs:l.budgetMs??v?.budgetMs,samples:l.samples??v?.samples,minSamples:l.minSamples??v?.minSamples,jobs:l.jobs??Xt(v?.jobs),gc:l.gc??v?.gc??!1,cpu:l.cpu??v?.cpu??!1,cpuIntervalUs:l.cpuIntervalUs??v?.cpuIntervalUs,alloc:l.alloc??v?.alloc??!1,peakMem:l.peakMem??v?.peakMem??!1,filter:l.filter??v?.filter,isolate:l.isolate??v?.isolate??!1,preload:l.preload.length>0?l.preload:v?.preload??[],bunFlags:l.bunFlags.length>0?l.bunFlags:v?.bunFlags??[],outDir:l.outDir??v?.outDir,noiseCheck:l.noiseCheck,timeoutMs:l.timeoutMs??v?.timeoutMs,cwd:M}}var Zt=3,er=16777216;async function S(l){hn("bench",l);let v=l.cwd??process.cwd(),M=l.outDir??Ze,N=`${M.startsWith("/")?M:`${v}/${M}`}/bench-tmp`,A=Math.max(1,Math.floor(l.jobs??1)),ie={budgetMs:l.budgetMs,samples:l.samples,minSamples:l.minSamples,gc:l.gc,cpu:l.cpu,cpuIntervalUs:l.cpuIntervalUs,alloc:l.alloc,peakMem:l.peakMem,noiseCheck:!1},ee=l.noiseCheck===!1?void 0:a(),de=ee?c(ee):void 0,Z=(Pe)=>Pe.startsWith("/")?Pe:`${v}/${Pe}`,fe=l.suites.map(Z),xe=(l.preload??[]).map(Z),ye=l.bunFlags??[],$e=async(Pe,Re,Ie)=>{let Te=new Set,Be=0,Fe,De=async()=>{while(Fe===void 0&&!l.signal?.aborted&&Be<Pe.length){let Ce=Be++;try{let ve=D(l.timeoutMs,l.signal),Me=Bun.spawn(Pe[Ce],{cwd:v,...Ie&&{env:{...process.env,...Ie}},stdout:"inherit",stderr:"inherit",stdin:"ignore",...ve.spawn});Te.add(Me);let Ne=await Me.exited;if(Te.delete(Me),l.signal?.aborted)return;if(ve.timedOut())throw Error(`Bench suite timed out after ${l.timeoutMs}ms: ${Re(Ce)}`);if(Ne!==0)throw Error(`Bench suite failed: ${Re(Ce)} (runner exited ${Ne})`)}catch(ve){Fe??=ve instanceof Error?ve:Error(String(ve));for(let Me of Te)Me.kill()}}};if(await Promise.all(Array.from({length:Math.min(A,Pe.length)},De)),Fe)throw Fe};try{let Pe=fe.map((Se)=>`${N}/${e("bench-plan",Se)}.json`),Re=fe.map((Se)=>`${N}/${e("bench-primary",Se)}.json`),Ie=fe.map((Se,Ee)=>["bun",...ye,In,Se,Re[Ee],JSON.stringify({...ie,filter:l.filter,isolate:l.isolate,preload:xe,planPath:Pe[Ee]})]);await $e(Ie,(Se)=>l.suites[Se]);let Te=await Promise.all(Pe.map(async(Se)=>{if(!await Bun.file(Se).exists())return[];let{tasks:Ee}=await Bun.file(Se).json();return Ee})),Be=await Promise.all(Re.map(async(Se)=>await Bun.file(Se).exists()?s(Se):void 0)),Fe=[];for(let Se=0;Se<Te.length;Se++)for(let Ee of Te[Se])if(Ee.isolate)Fe.push({suiteIndex:Se,taskIds:[Ee.id]});let De=Fe.map((Se,Ee)=>`${N}/${e("bench-item",fe[Se.suiteIndex],Ee)}.json`),Ce=Fe.map((Se,Ee)=>["bun",...ye,In,fe[Se.suiteIndex],De[Ee],JSON.stringify({...ie,taskIds:Se.taskIds,preload:xe,markIsolated:!0})]);await $e(Ce,(Se)=>l.suites[Fe[Se].suiteIndex]);let ve=await Promise.all(De.map(async(Se)=>await Bun.file(Se).exists()?s(Se):void 0)),Me=[];for(let Se=0;Se<Te.length;Se++)for(let Ee of Te[Se]){if(!Ee.peakMem)continue;for(let Ve=0;Ve<Zt;Ve++)Me.push({suiteIndex:Se,workloadId:Ee.workloadId})}let Ne=Me.map((Se,Ee)=>`${N}/${e("bench-peak",fe[Se.suiteIndex],Ee)}.json`);await $e(Me.map((Se,Ee)=>["bun",...ye,In,fe[Se.suiteIndex],Ne[Ee],JSON.stringify({filter:l.filter,preload:xe,peakMemFor:Se.workloadId})]),(Se)=>l.suites[Me[Se].suiteIndex],{OSTIA_PEAK_MEM:"1"});let Ue=new Map;for(let Se=0;Se<Me.length;Se++){let Ee=Bun.file(Ne[Se]);if(!await Ee.exists())continue;let Ve=Me[Se].workloadId,ze=Ue.get(Ve)??[];ze.push(await Ee.json()),Ue.set(Ve,ze)}let Oe=(Se)=>{let Ee=Ue.get(Se.id);if(!Ee?.length)return[];let Ve=(je)=>o(Float64Array.from(je).sort(),0.5),ze=Ve(Ee.map((je)=>je.peakBytes)),He=Math.max(...Ee.map((je)=>je.slackBytes)),We=He>=er&&He>ze/4?[{code:"peak-hidden",message:`Before the call, earlier work in the process had freed up to ${g(He)} 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:He,processes:Ee.length}}]:[];return[p({workload:Se,phase:"memstats",configFingerprint:i({peakMem:!0}),diagnosticWallNs:Ve(Ee.map((je)=>je.wallNs)),memory:{origin:"resourceUsage",kind:"peak",peakBytes:ze},warnings:We,artifacts:[]})]},Ae=[],_e=[];for(let Se=0;Se<Te.length;Se++){let Ee=Be[Se];if(!Ee)continue;let Ve=new Map;for(let Ke of Ee.measurements){let We=Ve.get(Ke.workloadId)??[];We.push(Ke),Ve.set(Ke.workloadId,We)}let ze=0,He=new Map;Fe.forEach((Ke,We)=>{let je=ve[We];if(Ke.suiteIndex===Se&&je)He.set(Ke.taskIds[0],je)});for(let Ke of Te[Se])if(Ke.isolate){let We=He.get(Ke.id);if(!We)continue;let je=We.workloads[0];Ae.push(je);for(let Ye of We.measurements)if(Ye.workloadId===je.id)_e.push(Ye);_e.push(...Oe(je))}else{let We=Ee.workloads[ze];Ae.push(We),ze++;for(let je of Ve.get(We.id)??[])_e.push(je);_e.push(...Oe(We))}}if(de&&_e.length>0)_e[0].warnings=[..._e[0].warnings,de];if(l.signal?.aborted&&_e.length>0){let Se=_e[_e.length-1];Se.warnings=[...Se.warnings,{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever suites/tasks had already completed."}]}return r(Ae,_e,ee)}finally{await Bun.spawn(["rm","-rf",N]).exited}}function ge(l,v,M=8){if(M<=1)throw RangeError(`range: multiplier must be > 1, got ${M}`);if(l<=0)throw RangeError(`range: start must be > 0, got ${l}`);let N=[];for(let A=l;A<=v;A*=M)N.push(A);if(!N.includes(v))N.push(v);return N}function Xe(l,v){if(v){let M=l.measurements.find((N)=>N.id===v);return M?.cpu?[M]:[]}return l.measurements.filter((M)=>M.phase==="cpu"&&M.cpu)}function nn(l){let v=l.nodes,M=v.length,N=nr(l),A=new Int32Array(M).fill(-1);for(let Z=0;Z<M;Z++)for(let fe of v[Z].children){let xe=N(fe);if(xe!==-1)A[xe]=Z}let ie=[];for(let Z=0;Z<M;Z++)if(A[Z]===-1)ie.push(Z);let ee=[],de=[];for(let Z=ie.length-1;Z>=0;Z--)de.push(ie[Z]);while(de.length>0){let Z=de.pop();ee.push(Z);for(let fe of v[Z].children){let xe=N(fe);if(xe!==-1&&A[xe]===Z)de.push(xe)}}return{count:M,indexOf:N,parentIx:A,roots:ie,order:ee}}function nr(l){let v=l.nodes,M=v.length,N=1/0,A=-1/0,ie=!0;for(let de=0;de<M;de++){let Z=v[de].id;if(!Number.isInteger(Z)){ie=!1;break}if(Z<N)N=Z;if(Z>A)A=Z}if(ie&&M>0&&A-N<M*4+64){let de=A-N+1,Z=new Int32Array(de).fill(-1);for(let fe=0;fe<M;fe++)Z[v[fe].id-N]=fe;return(fe)=>{let xe=fe-N;return xe>=0&&xe<de?Z[xe]:-1}}let ee=new Map;for(let de=0;de<M;de++)ee.set(v[de].id,de);return(de)=>ee.get(de)??-1}function Yn(l,v){let{count:M,indexOf:N,parentIx:A,order:ie}=v,ee=new Float64Array(M),de=new Float64Array(M),Z=l.samples?.nodeIds??[],fe=l.samples?.timeDeltasUs??[];for(let ye=0;ye<Z.length;ye++){let $e=N(Z[ye]);if($e===-1)continue;ee[$e]+=fe[ye]??0,de[$e]+=1}let xe=new Float64Array(M);for(let ye=ie.length-1;ye>=0;ye--){let $e=ie[ye];xe[$e]+=ee[$e];let Pe=A[$e];if(Pe>=0)xe[Pe]+=xe[$e]}return{selfUs:ee,totalUs:xe,samples:de}}var qn={name:"collapsed",async render(l,v={}){return{files:Xe(l,v.measurementId).map((A)=>{let ie=A.cpu,{nodes:ee,frames:de}=ie,Z=nn(ie),fe=Array(Z.count);for(let Re of Z.order){let Ie=de[ee[Re].frameIx].name||"(anonymous)",Te=Z.parentIx[Re];fe[Re]=Te===-1?Ie:`${fe[Te]};${Ie}`}let xe=new Float64Array(Z.count),ye=[],$e=ie.samples?.nodeIds??[];for(let Re=0;Re<$e.length;Re++){let Ie=Z.indexOf($e[Re]);if(Ie===-1)continue;if(xe[Ie]++===0)ye.push(Ie)}let Pe=Array(ye.length);for(let Re=0;Re<ye.length;Re++){let Ie=ye[Re];Pe[Re]=`${fe[Ie]} ${xe[Ie]}`}return{path:`${A.id}.collapsed.txt`,content:Pe.join(`
5
+ `)+(Pe.length>0?`
6
+ `:"")}})}}};var Qn={name:"cpuprofile",async render(l,v={}){let M=Xe(l,v.measurementId),N=[],A=[];for(let ie of M){if(ie.cpu?.origin!=="cpu-prof"&&ie.cpu?.origin!=="inspector"){A.push(`${ie.id} (origin ${ie.cpu?.origin??"unknown"} has no .cpuprofile artifact to pass through)`);continue}let ee=ie.artifacts.find((Z)=>Z.kind==="cpuprofile");if(!ee){A.push(`${ie.id} (no cpuprofile artifact recorded on this run)`);continue}let de=Bun.file(ee.path);if(!await de.exists()){A.push(`${ie.id} (artifact missing on disk: ${ee.path})`);continue}N.push({path:`${ie.id}.cpuprofile`,content:await de.text()})}if(N.length===0&&A.length>0)return{text:`No .cpuprofile artifacts available:
7
+ ${A.map((ie)=>` - ${ie}`).join(`
8
+ `)}
9
+ `};return{files:N}}};var Xn={name:"json",async render(l){return{text:P(l)}}};var Zn={name:"jsonl",async render(l){let{measurements:v,...M}=l;return{text:`${[C({kind:"document",...M}),...v.map((A)=>C({kind:"measurement",...A}))].join(`
10
+ `)}
11
+ `}}};function en(l){return l.measurements.filter((v)=>v.phase==="paired"&&v.timing!==void 0&&v.paired!==void 0)}function qe(l){let v=(l-1)*100;return`${v>=0?"+":""}${v.toFixed(1)}%`}function bn(l){if(!l.flagged)return"";let v=l.repeats?.length?` (repeats: ${l.repeats.map((M)=>qe(M.medianRatio)).join(", ")})`:"";if(l.confirmed===void 0)return`${l.flagged}${v}`;return`${l.confirmed?`${l.flagged}, confirmed`:`${l.flagged}? unconfirmed`}${v}`}function wn(l){return`working tree vs ${l.base.ref} (${l.base.sha.slice(0,7)}) \xB7 ${l.rounds} rounds \xB7 threshold ${l.thresholdPct}% \xB7 geomean threshold ${l.geomeanThresholdPct}%`}function yn(l){let v=l.geomeanPct===null?"Geomean -":`Geomean ${l.geomeanPct>=0?"+":""}${l.geomeanPct.toFixed(1)}% (threshold ${l.geomeanThresholdPct}%)`,M=l.unconfirmed>0?` (${l.unconfirmed} unconfirmed)`:"";return`${v} \xB7 ${l.regressed} regressed, ${l.improved} improved, ${l.unchanged} unchanged of ${l.matched}${M} \xB7 ${l.verdict}`}function kn(l){let v=new Map(l.workloads.map((N)=>[N.id,N])),M=(N)=>v.has(N)?t(v.get(N)):N;return{outputDiffers:en(l).filter((N)=>!N.paired.sameOutput).map((N)=>M(N.workloadId)),baseOnly:(l.unmatched?.baseOnly??[]).map(M),candOnly:(l.unmatched?.candOnly??[]).map(M)}}function dn(l){if(!l?.entry)return;if(l.entry.group!==void 0)return l.entry.group;let v=l.entry.task,M=v.lastIndexOf("/");return M===-1?void 0:v.slice(0,M)}function tn(l){let v=Math.min(...l.map((A)=>A.run.timing.median)),M=new Map;for(let A of l){let ie=dn(A.workload);if(ie===void 0)continue;let ee=M.get(ie);if(ee)ee.push(A);else M.set(ie,[A])}let N=new Map;for(let A of l){let ie=dn(A.workload);if(ie===void 0){N.set(A,v);continue}let ee=M.get(ie)??[A],de=ee.find((Z)=>Z.workload?.baseline);N.set(A,de?de.run.timing.median:Math.min(...ee.map((Z)=>Z.run.timing.median)))}return N}function rn(l){return l.measurements.filter((v)=>v.phase==="timing"&&v.timing!==void 0)}function sn(l,v){let M=new Set(v.map((N)=>N.workloadId));return l.workloads.filter((N)=>N.skipped&&!M.has(N.id))}function Pn(l){for(let v of l.comparisons??[]){let M=v.warnings?.find((N)=>N.code==="environment-mismatch");if(M)return M}return}function on(l){let v=new Map;for(let M of l.measurements){if(M.phase!=="memstats"||!M.memory)continue;let N=v.get(M.workloadId)??{warnings:[]};if(M.memory.bytesPerOp!==void 0)N.retained=M.memory.bytesPerOp;if(M.memory.peakBytes!==void 0)N.peak=M.memory.peakBytes;N.warnings.push(...M.warnings),v.set(M.workloadId,N)}return v}function et(l){return(l/1e6).toFixed(3)}function Sn(l){if(!l?.params)return"";return` (${Object.entries(l.params).map(([M,N])=>`${M}=${N}`).join(", ")})`}function Ge(l){return ce(String(l))}function tr(l){let v;for(let M of l){let N=M?.params?Object.keys(M.params):void 0;if(N?.length!==2)return;if(v===void 0)v=N;else if(N.length!==v.length||N.some((A,ie)=>A!==v[ie]))return}return v}function rr(l){let v=[...l.values()],M=[{name:"Retained/op",cell:(N)=>N?.retained===void 0?"-":g(N.retained)},{name:"Peak mem",cell:(N)=>N?.peak===void 0?"-":g(N.peak)}].filter((N,A)=>v.some((ie)=>A===0?ie.retained!==void 0:ie.peak!==void 0));return{columns:M.map((N)=>N.name),cells:(N)=>M.map((A)=>A.cell(l.get(N)))}}var nt=10,tt=10,rt={name:"markdown",async render(l){let v=new Map(l.workloads.map((Z)=>[Z.id,Z])),M=[];M.push("# Profile Report","");let N=l.git?` \xB7 ${w(l.git)}`:"";if(M.push(`Bun ${l.bunVersion} \xB7 ostia ${l.toolVersion} \xB7 ${l.platform.os}/${l.platform.arch} \xB7 ${l.createdAt}${N}`,""),l.environment)M.push(J(l.environment),"");let A=Pn(l);if(A)M.push(`> \u26A0 ${A.message}`,"");if(l.ab){let Z=en(l);if(M.push("## A/B",""),M.push(wn(l.ab),""),Z.length>0){M.push("| Task | Base | Candidate | Change | p25\u2026p75 | Verdict |","|---|---|---|---|---|---|");for(let xe of Z){let ye=v.get(xe.workloadId),$e=xe.paired,Pe=b(Math.min($e.baseMedianNs,xe.timing.median)),Re=bn($e);M.push(`| ${Ge(t(ye)+Sn(ye))} | ${n($e.baseMedianNs,Pe)} | ${n(xe.timing.median,Pe)} | ${qe($e.medianRatio)} | ${qe($e.p25)}\u2026${qe($e.p75)} | ${Re?`**${Ge(Re)}**`:""} |`)}M.push("")}let fe=kn(l);if(fe.outputDiffers.length>0)M.push(`Output differs from the base: ${fe.outputDiffers.map(Ge).join(", ")}`,"");if(fe.baseOnly.length>0)M.push(`Base only: ${fe.baseOnly.map(Ge).join(", ")}`,"");if(fe.candOnly.length>0)M.push(`Candidate only: ${fe.candOnly.map(Ge).join(", ")}`,"");for(let xe of Z){let ye=t(v.get(xe.workloadId));for(let $e of xe.warnings)M.push(`- **${ye}**: ${$e.message} (\`${$e.code}\`)`)}if(Z.some((xe)=>xe.warnings.length>0))M.push("");M.push(`**${yn(l.ab)}**`,"")}let ie=rn(l),ee=sn(l,ie),de=on(l);if(ie.length>0||ee.length>0){M.push("## Timing","");let Z=new Map,fe=[];for(let Pe of ie){let Re=v.get(Pe.workloadId)?.entry?.group;if(Re===void 0){fe.push(Pe);continue}let Ie=Z.get(Re);if(Ie)Ie.push(Pe);else Z.set(Re,[Pe])}let xe=new Map;for(let[Pe,Re]of Z){let Ie=tr(Re.map((Te)=>v.get(Te.workloadId)));if(Ie)xe.set(Pe,{keys:Ie,runs:Re});else fe.push(...Re)}if(fe.length>0||ee.length>0){let Pe=ie.map((Oe)=>({run:Oe,workload:v.get(Oe.workloadId)})),Re=Pe.length>1,Ie=Re?tn(Pe):void 0,Te=new Map(Pe.map((Oe)=>[Oe.run.id,Ie?.get(Oe)??Oe.run.timing.median])),Be=Re?" Relative |":"",Fe=Re?"---|":"",De=fe.some((Oe)=>k(Oe)),Ce=De?" User/Sys |":"",ve=De?"---|":"",Me=rr(de),Ne=Me.columns.map((Oe)=>` ${Oe} |`).join(""),Ue=Me.columns.map(()=>"---|").join("");M.push(`| Task | Median | Spread (p75\u2026p99) | Mean \xB1 SD | Range | MAD |${Ce}${Ne}${Be}`,`|---|---|---|---|---|---|${ve}${Ue}${Fe}`);for(let Oe of fe){let Ae=v.get(Oe.workloadId),_e=Ge(t(Ae)+Sn(Ae)),Se=Oe.timing,Ee=b(Se.median),Ve=k(Oe),ze=De?` ${Ve?q(Ve):"-"} |`:"",He=Re?` ${z(Se.median/(Te.get(Oe.id)??Se.median),!!Ae?.baseline)} |`:"",Ke=Me.cells(Oe.workloadId).map((We)=>` ${We} |`).join("");M.push(`| ${_e} | ${n(Se.median,Ee)} | ${n(Se.p75,Ee)}\u2026${n(Se.p99,Ee)} | ${n(Se.mean,Ee)} \xB1 ${n(Se.stddev,Ee)} | ${n(Se.min,Ee)}\u2026${n(Se.max,Ee)} | ${n(Se.mad,Ee)} |${ze}${Ke}${He}`)}for(let Oe of ee){let Ae=Ge(t(Oe)+Sn(Oe)),_e=Re?" - |":"",Se=De?" - |":"",Ee=Me.columns.map(()=>" - |").join("");M.push(`| ${Ae} | - skipped | - | - | - | - |${Se}${Ee}${_e}`)}M.push("")}for(let[Pe,{keys:Re,runs:Ie}]of xe){let[Te,Be]=Re,Fe=[],De=[],Ce=new Map;for(let ve of Ie){let Me=v.get(ve.workloadId).params,Ne=Me[Te],Ue=Me[Be];if(!Fe.includes(Ne))Fe.push(Ne);if(!De.includes(Ue))De.push(Ue);Ce.set(`${Ne}\x00${Ue}`,ve)}M.push(`### ${Ge(Pe)} (${Ge(Te)} \xD7 ${Ge(Be)})`,""),M.push(`| ${Ge(Te)} \\ ${Ge(Be)} | ${De.map(Ge).join(" | ")} |`,`|---|${De.map(()=>"---").join("|")}|`);for(let ve of Fe){let Me=De.map((Ne)=>{let Ue=Ce.get(`${ve}\x00${Ne}`);return Ue?n(Ue.timing.median):"-"});M.push(`| ${Ge(ve)} | ${Me.join(" | ")} |`)}M.push("")}let ye=(Pe)=>{let Re=de.get(Pe.workloadId)?.warnings;return Re?.length?[...Pe.warnings,...Re]:Pe.warnings},$e=ie.filter((Pe)=>ye(Pe).length>0);if($e.length>0){M.push("### Warnings","");for(let Pe of $e){let Re=t(v.get(Pe.workloadId));for(let Ie of ye(Pe))M.push(`- **${Re}**: ${Ie.message} (\`${Ie.code}\`)`)}M.push("")}}for(let Z of l.measurements){if(Z.phase!=="cpu"&&Z.phase!=="heap")continue;let fe=t(v.get(Z.workloadId));if(Z.phase==="cpu"){if(M.push(`## CPU capture - ${fe}`,""),M.push(`instrumented, diagnostic wall ${et(Z.diagnosticWallNs??0)}ms`,""),Z.cpu){M.push(`origin: \`${Z.cpu.origin}\`, interval: ${Z.cpu.samplingIntervalUs}\xB5s, samples: ${O(Z.cpu)}`,""),M.push("| Self % | Self (ms) | Total (ms) | Frame |","|---|---|---|---|");let xe=Z.cpu.totals.reduce((ye,$e)=>ye+$e.selfUs,0)||1;for(let ye of Z.cpu.totals.slice(0,nt)){let $e=Z.cpu.frames[ye.frameIx],Pe=(ye.selfUs/xe*100).toFixed(1);M.push(`| ${Pe}% | ${(ye.selfUs/1000).toFixed(2)} | ${(ye.totalUs/1000).toFixed(2)} | ${Ge($e?.name||"(anonymous)")} |`)}if(M.push(""),Z.jit){let ye=Z.jit.tiers;M.push(`JIT tiers: LLInt ${ye.llint} \xB7 Baseline ${ye.baseline} \xB7 DFG ${ye.dfg} \xB7 FTL ${ye.ftl}`,"")}}}else if(M.push(`## Heap snapshot - ${fe}`,""),M.push(`instrumented, diagnostic wall ${et(Z.diagnosticWallNs??0)}ms`,""),Z.heap){M.push(`${Z.heap.objectCount??"?"} objects, ${((Z.heap.heapSizeBytes??0)/1e6).toFixed(2)}MB`,""),M.push("| Count | Type |","|---|---|");for(let xe of Z.heap.typeCounts.slice(0,tt))M.push(`| ${xe.count} | ${Ge(xe.type)} |`);M.push("")}for(let xe of Z.artifacts)M.push(`- artifact: \`${xe.path}\``);for(let xe of Z.warnings)M.push(`- ! ${xe.message} (\`${xe.code}\`)`);if(Z.artifacts.length>0||Z.warnings.length>0)M.push("")}if(l.comparisons&&l.comparisons.length>0){M.push("## Comparisons","");for(let Z of l.comparisons){let fe=l.measurements.find((ye)=>ye.id===Z.candidateMeasurementId),xe=t(fe?v.get(fe.workloadId):v.get(Z.candidateMeasurementId));if(M.push(`### ${Z.verdict==="pass"?"\u2713":"\u2717"} ${xe}`,""),Z.timing){let ye=Z.timing.medianDeltaPct>0?"+":"",$e=Z.timing.verdict==="unchanged"&&Z.timing.pValue!==void 0&&Z.timing.pValue>=Z.thresholds.alpha?"~":"",Pe=[];if(fe?.timing)Pe.push(`n=${fe.timing.samples.length}`);if(Z.timing.ci95)Pe.push(`95% CI [${Z.timing.ci95[0]>0?"+":""}${Z.timing.ci95[0].toFixed(1)}%, ${Z.timing.ci95[1]>0?"+":""}${Z.timing.ci95[1].toFixed(1)}%]`);if(Z.timing.pValue!==void 0)Pe.push(`p=${Z.timing.pValue.toFixed(4)}`);Pe.push(`threshold ${Z.thresholds.effectiveTimingPct.toFixed(1)}%`),M.push(`- timing: ${$e}${ye}${Z.timing.medianDeltaPct.toFixed(1)}% median, ${Pe.join(", ")} (**${Z.timing.verdict}**)`)}for(let ye of Z.frames?.slice(0,nt)??[]){if(Math.abs(ye.deltaPct)<I)continue;let $e=ye.deltaPct>0?"+":"";M.push(`- frame \`${Ge(ye.name)}\`: ${$e}${ye.deltaPct.toFixed(1)}% self-time (${(ye.baseSelfUs/1000).toFixed(2)}ms \u2192 ${(ye.candSelfUs/1000).toFixed(2)}ms)`)}for(let ye of Z.heapTypes?.slice(0,tt)??[]){if(Math.abs(ye.deltaPct)<I)continue;let $e=ye.deltaPct>0?"+":"";M.push(`- heap \`${Ge(ye.type)}\`: ${$e}${ye.deltaPct.toFixed(1)}% count (${ye.baseCount} \u2192 ${ye.candCount})`)}for(let ye of Z.warnings??[]){if(ye.code==="environment-mismatch")continue;M.push(`- ! ${ye.message} (\`${ye.code}\`)`)}M.push("")}}return{text:M.join(`
12
+ `)}}};var sr=15;function On(l){return`n${l}`}function ir(l,v,M){return`${(l||"(anonymous)").replace(/"/g,"'")} (self ${(v/1000).toFixed(2)}ms, total ${(M/1000).toFixed(2)}ms)`}function or(l,v,M,N){let A=[];if(N<=0)return A;for(let ie=0;ie<v;ie++){if(ie===M)continue;let ee=l[ie];if(A.length===N&&ee<=l[A[N-1]])continue;let de=A.length;while(de>0&&l[A[de-1]]<ee)de--;if(A.splice(de,0,ie),A.length>N)A.pop()}return A}var st={name:"mermaid",async render(l,v={}){let M=v.topN??sr;return{files:Xe(l,v.measurementId).map((ie)=>{let ee=ie.cpu,{nodes:de,frames:Z}=ee,fe=nn(ee),{selfUs:xe,totalUs:ye}=Yn(ee,fe),{parentIx:$e}=fe,Pe=fe.roots[0]??-1,Re=or(xe,fe.count,Pe,M),Ie=new Set(Pe!==-1?[Pe]:[]),Te=[];for(let Fe of Re){Te.length=0;for(let De=Fe;De!==-1;De=$e[De])Te.push(De);for(let De=Te.length-1;De>=0;De--)Ie.add(Te[De])}let Be=["graph TD"];for(let Fe of Ie){let De=de[Fe].id;Be.push(` ${On(De)}["${ir(Z[de[Fe].frameIx].name,xe[Fe],ye[Fe])}"]`)}for(let Fe of Ie){let De=$e[Fe];if(De!==-1&&Ie.has(De))Be.push(` ${On(de[De].id)} --> ${On(de[Fe].id)}`)}return{path:`${ie.id}.mermaid.md`,content:`${Be.join(`
13
+ `)}
14
+ `}})}}};var f=1;function Le(l){return Number.isFinite(l)?Number(l.toPrecision(6)):l}function Dn(l,v){return l?.entry?.task??l?.label??l?.command?.join(" ")??v}function it(l,v){if(v?.entry?.group!==void 0)l.group=v.entry.group;if(v?.description!==void 0)l.description=v.description;if(v?.groupDescription!==void 0)l.groupDescription=v.groupDescription;if(v?.params!==void 0)l.params=v.params}function ot(l){if(!l?.timing)return;let v={medianPct:Le(l.timing.medianDeltaPct),meanPct:Le(l.timing.meanDeltaPct),verdict:l.timing.verdict,pass:l.verdict==="pass",effectiveTimingPct:Le(l.thresholds.effectiveTimingPct),matched:!0};if(l.timing.ci95)v.ci95=[Le(l.timing.ci95[0]),Le(l.timing.ci95[1])];if(l.timing.pValue!==void 0)v.pValue=Le(l.timing.pValue);return v}function ar(l,v,M,N){let A={event:"run",protocolVersion:f,schemaVersion:l.schemaVersion,workloadId:v.id,task:Dn(v,v.id),skipped:!0,batch:1,warnings:(M?.warnings??[]).map((ee)=>ee.data?{code:ee.code,data:ee.data}:{code:ee.code})};if(it(A,v),N!==void 0)A.noiseFloorPct=Le(N);let ie=ot(M);if(ie)A.delta=ie;return A}function mr(l){let v=new Map(l.workloads.map((ye)=>[ye.id,ye])),M=l.environment?.noise.floorPct,N=rn(l).map((ye)=>({run:ye,workload:v.get(ye.workloadId)})),A=N.length>1?tn(N):void 0,ie=[...N,...en(l).map((ye)=>({run:ye,workload:v.get(ye.workloadId)}))],ee=new Map((l.comparisons??[]).map((ye)=>[ye.candidateMeasurementId,ye])),de=on(l),Z=new Map;for(let ye of l.measurements){if(ye.phase!=="cpu"||ye.warnings.length===0)continue;let $e=Z.get(ye.workloadId)??[];Z.set(ye.workloadId,[...$e,...ye.warnings])}let fe=sn(l,ie.map((ye)=>ye.run)).map((ye)=>ar(l,ye,ee.get(ye.id),M));return[...ie.map((ye)=>{let{run:$e,workload:Pe}=ye,Re=$e.timing,Ie=ee.get($e.id),Te={event:"run",protocolVersion:f,schemaVersion:l.schemaVersion,workloadId:$e.workloadId,task:Dn(Pe,$e.workloadId),unit:"ns",samples:Re.samples.length,batch:Re.batch??1,mean:Le(Re.mean),median:Le(Re.median),stddev:Le(Re.stddev),stddevPct:Le(Re.mean===0?0:Re.stddev/Re.mean*100),min:Le(Re.min),max:Le(Re.max),warnings:[...$e.warnings,...Z.get($e.workloadId)??[],...de.get($e.workloadId)?.warnings??[],...Ie?.warnings??[]].map((Me)=>Me.data?{code:Me.code,data:Me.data}:{code:Me.code})};Te.p75=Le(Re.p75),Te.p99=Le(Re.p99),Te.mad=Le(Re.mad);let Be=k($e);if(Be)Te.userNs=Le(Be.userNs),Te.systemNs=Le(Be.systemNs);let Fe=de.get($e.workloadId);if(Fe?.retained!==void 0)Te.retainedBytesPerOp=Math.round(Fe.retained);if(Fe?.peak!==void 0)Te.peakBytes=Math.round(Fe.peak);it(Te,Pe);let De=A?.get(ye);if(De!==void 0)Te.relative=Le(Re.median/De);if(Pe?.baseline)Te.baseline=!0;if(M!==void 0)Te.noiseFloorPct=Le(M);let Ce=ot(Ie);if(Ce)Te.delta=Ce;let ve=$e.paired;if(ve)Te.paired={baseMedian:Le(ve.baseMedianNs),medianRatio:Le(ve.medianRatio),p25:Le(ve.p25),p75:Le(ve.p75),rounds:ve.rounds,verdict:ve.verdict,...ve.flagged&&{flagged:ve.flagged},...ve.confirmed!==void 0&&{confirmed:ve.confirmed},...ve.repeats&&{repeats:ve.repeats.map((Me)=>Le(Me.medianRatio))},sameOutput:ve.sameOutput};return Te}),...fe]}function ur(l){if(!l.unmatched)return[];let v=(M,N)=>({event:"unmatched",protocolVersion:f,workloadId:M.id,task:Dn(M,M.id),side:N});return[...l.unmatched.baseOnly.map((M)=>v(M,"base")),...l.unmatched.candOnly.map((M)=>v(M,"cand"))]}function cr(l,v){let M=v.command==="ab"&&l.ab?{...l.ab,effectiveTimingPct:l.ab.thresholdPct}:l.comparisonSummary,N=(v.unmatched?.baseOnly.length??0)+(v.unmatched?.candOnly.length??0),A={event:"summary",protocolVersion:f,command:v.command,matched:M?.matched??0,regressed:M?.regressed??0,improved:M?.improved??0,unchanged:M?.unchanged??0,unmatched:N,geomeanPct:M?.geomeanPct!==void 0?M.geomeanPct:null,effectiveTimingPct:Le(M?.effectiveTimingPct??0),verdict:v.exitCode===0?"pass":"fail",exitCode:v.exitCode};if(v.command==="ci"){if(A.cached=v.cached??0,A.executed=v.executed??0,A.failed=v.failed??0,A.missingBaseline=v.missingBaseline??0,v.baseline)A.baseline=v.baseline}if(v.command==="ab"&&l.ab)A.base=l.ab.base,A.geomeanThresholdPct=l.ab.geomeanThresholdPct,A.unconfirmed=l.ab.unconfirmed,A.outputDiffers=l.ab.outputDiffers;if(l.environment)A.noiseFloorPct=Le(l.environment.noise.floorPct);if(v.baseGit||v.candGit)A.git={...v.baseGit&&{base:v.baseGit},...v.candGit&&{cand:v.candGit}};if(v.exportedTo)A.exportedTo=v.exportedTo;return A}var at={name:"minimal",async render(l,v={}){let M=[...mr(l)];if(v.protocol)M.push(...ur(v.protocol)),M.push(cr(l,v.protocol));let N=M.map((A)=>JSON.stringify(A));return{text:N.length>0?`${N.join(`
15
+ `)}
16
+ `:""}}};var dr="https://www.speedscope.app/file-format-schema.json";function mt(l){return l?.label??l?.command?.join(" ")??l?.entry?.task??"profile"}var ut={name:"speedscope",async render(l,v={}){let M=Xe(l,v.measurementId),N=new Map(l.workloads.map((ie)=>[ie.id,ie]));return{files:M.map((ie)=>{let ee=ie.cpu,{nodes:de}=ee,Z=nn(ee),fe=ee.samples?.nodeIds??[],xe=ee.samples?.timeDeltasUs??[],ye=Array(Z.count);for(let Ie of Z.order){let Te=Z.parentIx[Ie],Be=de[Ie].frameIx;ye[Ie]=Te===-1?[Be]:[...ye[Te],Be]}let $e=Array(fe.length);for(let Ie=0;Ie<fe.length;Ie++){let Te=Z.indexOf(fe[Ie]);$e[Ie]=Te===-1?[]:ye[Te]}let Pe=0;for(let Ie=0;Ie<xe.length;Ie++)Pe+=xe[Ie];let Re={$schema:dr,exporter:"ostia",name:mt(N.get(ie.workloadId)),activeProfileIndex:0,shared:{frames:ee.frames.map((Ie)=>({name:Ie.name||"(anonymous)",file:Ie.url,line:Ie.line!==void 0?Ie.line+1:void 0}))},profiles:[{type:"sampled",name:mt(N.get(ie.workloadId)),unit:"microseconds",startValue:0,endValue:Pe,samples:$e,weights:xe}]};return{path:`${ie.id}.speedscope.json`,content:`${JSON.stringify(Re,null,2)}
17
+ `}})}}};function lr(l){return(l/1e6).toFixed(3)}var dt={name:"table",async render(l){let v=rn(l),M=new Map(l.workloads.map((We)=>[We.id,We])),N=l.environment?[J(l.environment),""]:[];if(l.ab)return{text:pr(l,en(l),N)};let A=sn(l,v);if(v.length===0&&A.length===0){let We=ct(l,M);return{text:We.length>0?`${[...N,...We].join(`
18
+ `)}
19
+ `:`(no timing runs)
20
+ `}}let ie=new Map(v.map((We)=>[We.workloadId,We])),ee=[],de=[];for(let We of l.workloads){let je=ie.get(We.id),Ye=t(We);if(je){let an={kind:"measured",run:je,workload:We,label:Ye};ee.push(an),de.push(an)}else if(We.skipped)ee.push({kind:"skipped",workload:We,label:Ye})}let Z=on(l),fe=!1,xe=!1;for(let We of Z.values()){if(We.retained!==void 0)fe=!0;if(We.peak!==void 0)xe=!0}let ye=(We)=>{let je=Z.get(We.workloadId)?.warnings;return je?.length?[...We.warnings,...je]:We.warnings},$e=new Map(de.map((We)=>[We,k(We.run)])),Pe=[...$e.values()].some(Boolean),Re=de.length>1,Ie=tn(de),Te=new Map,Be=new Map,Fe;for(let We of ee){let je=dn(We.workload);if(je!==Fe){if(je!==void 0)Be.set(We,je);Fe=je}Te.set(We,je!==void 0?" ":"")}let De=Math.max(4,...ee.map((We)=>Te.get(We).length+We.label.length)),Ce=10,ve=18,Me=18,Ne=11,Ue=10,Oe=18,Ae=[...N],_e=fe?` ${"Retained/op".padEnd(Ne)}`:"",Se=xe?` ${"Peak mem".padEnd(Ue)}`:"",Ee=Pe?` ${"User/Sys".padEnd(Oe)}`:"",Ve=`${"Task".padEnd(De)} ${"Median".padEnd(Ce)} ${"Spread".padEnd(ve)} ${"Range".padEnd(Me)}${Ee}${_e}${Se}${Re?" Relative":""}`;Ae.push(Ve),Ae.push("-".repeat(Ve.length));let ze=[];for(let We of ee){let je=Be.get(We);if(je!==void 0)Ae.push(`${je}:`);let Ye=Te.get(We);if(We.kind==="skipped"){Ae.push(`${(Ye+We.label).padEnd(De)} - skipped`);continue}let{run:an,label:ht,workload:$n}=We,Qe=an.timing,mn=b(Qe.median),bt=n(Qe.median,mn),wt=`${n(Qe.p75,mn)}\u2026${n(Qe.p99,mn)}`,yt=`${n(Qe.min,mn)}\u2026${n(Qe.max,mn)}`,un=`${(Ye+ht).padEnd(De)} ${bt.padEnd(Ce)} ${wt.padEnd(ve)} ${yt.padEnd(Me)}`;if(Pe){let Je=$e.get(We);un+=` ${(Je?q(Je):"").padEnd(Oe)}`}let En=$n?Z.get($n.id):void 0;if(fe){let Je=En?.retained,xn=Je!==void 0?g(Je):"";un+=` ${xn.padEnd(Ne)}`}if(xe){let Je=En?.peak,xn=Je!==void 0?g(Je):"";un+=` ${xn.padEnd(Ue)}`}if(Re){let Je=Qe.median/(Ie.get(We)??Qe.median);un+=` ${z(Je,!!$n?.baseline)}`}Ae.push(un);let Wn=ye(an);if(Wn.length>0)Ae.push(`${" ".repeat(Ye.length)} ! ${Wn.map((Je)=>Je.code).join(", ")}`),ze.push(We)}if(ze.length>0){Ae.push(""),Ae.push("Warnings:");for(let We of ze)for(let je of ye(We.run))Ae.push(` ${We.label}: ${je.message}`)}let He=fr(l,M);if(He.length>0)Ae.push(""),Ae.push(...He);let Ke=ct(l,M);if(Ke.length>0)Ae.push(""),Ae.push(...Ke);return{text:`${Ae.map((We)=>We.trimEnd()).join(`
21
+ `)}
22
+ `}}};function pr(l,v,M){let N=new Map(l.workloads.map((Z)=>[Z.id,Z])),A=[...M];if(l.ab)A.push(`A/B: ${wn(l.ab)}`,"");let ie=v.map((Z)=>{let fe=N.get(Z.workloadId),xe=Z.paired,ye=b(Math.min(xe.baseMedianNs,Z.timing.median));return{run:Z,group:dn(fe),label:t(fe),cells:[n(xe.baseMedianNs,ye),n(Z.timing.median,ye),qe(xe.medianRatio),`${qe(xe.p25)}\u2026${qe(xe.p75)}`],verdict:bn(xe)}});if(ie.length>0){let Z=Math.max(4,...ie.map(($e)=>($e.group!==void 0?2:0)+$e.label.length)),fe=[10,10,9,18],xe=`${"Task".padEnd(Z)} ${["Base","Candidate","Change","p25\u2026p75"].map(($e,Pe)=>$e.padEnd(fe[Pe])).join(" ")} Verdict`;A.push(xe,"-".repeat(xe.length));let ye;for(let $e of ie){if($e.group!==ye&&$e.group!==void 0)A.push(`${$e.group}:`);ye=$e.group;let Pe=$e.group!==void 0?" ":"";if(A.push(`${(Pe+$e.label).padEnd(Z)} ${$e.cells.map((Re,Ie)=>Re.padEnd(fe[Ie])).join(" ")} ${$e.verdict}`),$e.run.warnings.length>0)A.push(`${Pe} ! ${$e.run.warnings.map((Re)=>Re.code).join(", ")}`)}}let ee=kn(l);if(ee.outputDiffers.length>0){A.push("",`Output differs from the base (${ee.outputDiffers.length}):`);for(let Z of ee.outputDiffers)A.push(` ${Z}`)}if(ee.baseOnly.length>0||ee.candOnly.length>0){if(A.push("","Unmatched:"),ee.baseOnly.length>0)A.push(` base only: ${ee.baseOnly.join(", ")}`);if(ee.candOnly.length>0)A.push(` candidate only: ${ee.candOnly.join(", ")}`)}let de=ie.filter((Z)=>Z.run.warnings.length>0);if(de.length>0){A.push("","Warnings:");for(let Z of de)for(let fe of Z.run.warnings)A.push(` ${Z.label}: ${fe.message}`)}if(l.ab)A.push("",yn(l.ab));return`${A.map((Z)=>Z.trimEnd()).join(`
23
+ `)}
24
+ `}function ct(l,v){if(!l.comparisons||l.comparisons.length===0)return[];let M=[],N=new Map(l.measurements.map((ee)=>[ee.id,ee])),A=Pn(l);if(A)M.push(`\u26A0 ${A.message}`,"");let ie=[];for(let ee of l.comparisons){let de=N.get(ee.candidateMeasurementId),Z=v.get(de?.workloadId??ee.candidateMeasurementId),fe=Z?t(Z):ee.candidateMeasurementId,xe=ee.verdict==="pass"?"\u2713":"\u2717";if(M.push(`${xe} ${fe}`),ee.timing){let $e=(Pe)=>`${Pe>=0?"+":""}${Pe.toFixed(1)}%`;if(ee.timing.ci95&&ee.timing.pValue!==void 0){let Pe=ee.timing.pValue<0.001?"p<0.001":`p=${ee.timing.pValue.toFixed(3)}`;M.push(` timing: ${$e(ee.timing.medianDeltaPct)} median, 95% CI [${$e(ee.timing.ci95[0])}, ${$e(ee.timing.ci95[1])}], ${Pe} (${ee.timing.verdict})`)}else M.push(` timing: ${$e(ee.timing.medianDeltaPct)} median (${ee.timing.verdict})`)}if(ee.frames)for(let $e of ee.frames.slice(0,lt)){if(Math.abs($e.deltaPct)<I)continue;let Pe=$e.deltaPct>0?"+":"";M.push(` frame ${$e.name}: ${Pe}${$e.deltaPct.toFixed(1)}% self-time (${($e.baseSelfUs/1000).toFixed(2)}ms -> ${($e.candSelfUs/1000).toFixed(2)}ms)`)}if(ee.heapTypes)for(let $e of ee.heapTypes.slice(0,pt)){if(Math.abs($e.deltaPct)<I)continue;let Pe=$e.deltaPct>0?"+":"";M.push(` heap ${$e.type}: ${Pe}${$e.deltaPct.toFixed(1)}% count (${$e.baseCount} -> ${$e.candCount})`)}let ye=(ee.warnings??[]).filter(($e)=>$e.code!=="environment-mismatch");if(ye.length>0){M.push(` ! ${ye.map(($e)=>$e.code).join(", ")}`);for(let $e of ye)ie.push({label:fe,message:$e.message})}}if(ie.length>0){M.push("","Comparison warnings:");for(let ee of ie)M.push(` ${ee.label}: ${ee.message}`)}return M}var lt=5,pt=5;function fr(l,v){let M=[];for(let N of l.measurements){if(N.phase!=="cpu"&&N.phase!=="heap")continue;let A=v.get(N.workloadId),ie=A?t(A):N.workloadId;if(N.phase==="cpu")if(N.cpu){M.push(`CPU capture - ${ie} (instrumented, ${N.cpu.samplingIntervalUs}\xB5s interval, ${O(N.cpu)} samples, diagnostic wall ${lr(N.diagnosticWallNs??0)}ms)`);let ee=N.cpu.totals.reduce((de,Z)=>de+Z.selfUs,0)||1;for(let de of N.cpu.totals.slice(0,lt)){let Z=N.cpu.frames[de.frameIx],fe=(de.selfUs/ee*100).toFixed(1);M.push(` ${fe.padStart(5)}% ${(de.selfUs/1000).toFixed(2).padStart(8)}ms self ${Z?.name??"?"}`)}}else M.push(`CPU capture - ${ie} (instrumented, no evidence captured)`);else if(N.heap){let ee=((N.heap.heapSizeBytes??0)/1e6).toFixed(2);M.push(`Heap snapshot - ${ie} (instrumented, ${N.heap.objectCount??"?"} objects, ${ee}MB)`);for(let de of N.heap.typeCounts.slice(0,pt))M.push(` ${String(de.count).padStart(6)} ${de.type}`)}else M.push(`Heap snapshot - ${ie} (instrumented, no evidence captured)`);for(let ee of N.artifacts)M.push(` artifact: ${ee.path}`);for(let ee of N.warnings)M.push(` ! ${ee.message}`)}return M}var m={table:dt,json:Xn,markdown:rt,jsonl:Zn,minimal:at,collapsed:qn,mermaid:st,speedscope:ut,cpuprofile:Qn};async function he(l={}){let v=W();if(v.length===0)throw Error("run(): no tasks registered - call group()/task() before run() in the same file.");let M=Bun.main,N;try{N=U(v,l.filter,M)}catch(ie){throw Error(`run(): ${ie.message}`)}let A=await _(M,N,l);if(!l.quiet){let ie=l.format??"table",{text:ee}=await m[ie].render(A,{});if(ee)process.stdout.write(ee)}return A}function be(l,v){let M=Object.keys(l),N=(A,ie)=>{if(A===M.length){pe(ie,()=>v(ie));return}let ee=M[A];for(let de of l[ee])N(A+1,{...ie,[ee]:de})};N(0,{})}function we(l){return l}var Nn=1000;async function oe(l){if(hn("time",l),l.warmup!==void 0&&(!Number.isFinite(l.warmup)||l.warmup<0))throw RangeError(`time: warmup must be >= 0, got ${l.warmup}`);let v=i({samples:l.samples??null,budgetMs:l.budgetMs??null,minSamples:l.minSamples??null,warmup:l.warmup??null,cpu:l.cpu??!1,heap:l.heap??!1,cpuIntervalUs:l.cpuIntervalUs??Nn}),N=`${l.outDir??Ze}/artifacts`,A=l.noiseCheck===!1?void 0:a(),ie=A?c(A):void 0,ee=[],de=[],Z=l.commands.map((Pe)=>{let Re=typeof Pe==="string"||Array.isArray(Pe)?{command:Pe}:Pe,Ie=Array.isArray(Re.command)?Re.command:y(Re.command),Te=Re.prepare??l.prepare,Be=Re.timeSource??l.timeSource,Fe=Re.timeoutMs??l.timeoutMs,De=Re.ignoreExitCodes??l.ignoreExitCodes,Ce=B(Ie,Re.label??(Array.isArray(Re.command)?void 0:Re.command),{prepare:Te,timeSource:Be});return{argv:Ie,workload:Ce,prepare:Te,timeSource:Be,timeoutMs:Fe,ignoreExitCodes:De}}),fe=(l.interleave??!0)&&Z.length>1,xe=(Pe)=>({argv:Pe.argv,cwd:l.cwd,env:l.env,samples:l.samples,budgetMs:l.budgetMs,minSamples:l.minSamples,warmup:l.warmup,prepare:Pe.prepare,timeSource:Pe.timeSource,timeoutMs:Pe.timeoutMs,ignoreExitCodes:Pe.ignoreExitCodes,signal:l.signal}),ye=Z.map((Pe)=>vn(xe(Pe))),$e=async(Pe)=>{let{argv:Re,workload:Ie,prepare:Te}=Z[Pe];ee.push(Ie);let Be=ye[Pe].result(),Fe=x({workload:Ie,configFingerprint:v,trials:Be.trials,timing:Be.timing,warnings:ie&&de.length===0?[...Be.warnings,ie]:Be.warnings,interleaved:fe?!0:void 0});if(de.push(Fe),!l.signal?.aborted)de.push(...await gr({workload:Ie,argv:Re,timingMeasurementId:Fe.id,cfgFp:v,opts:l,artifactDir:N,prepare:Te}))};if(fe){for(let Re of ye)await Re.warmup();let Pe=!0;while(Pe){Pe=!1;for(let Re of ye)if(await Re.step())Pe=!0}for(let Re=0;Re<Z.length;Re++)await $e(Re)}else for(let Pe=0;Pe<Z.length;Pe++)await Cn(ye[Pe]),await $e(Pe);if(l.signal?.aborted&&de.length>0){let Pe=de[de.length-1];Pe.warnings=[...Pe.warnings,gt()]}return r(ee,de,A)}function gt(){return{code:"aborted",message:"Run was cancelled before it finished; this document holds whatever measurements had already completed."}}async function gr({workload:l,argv:v,timingMeasurementId:M,cfgFp:N,opts:A,artifactDir:ie,prepare:ee}){let de=[],Z=async(fe)=>{if(ee)await X(ee,{phase:fe,index:0},{cwd:A.cwd,env:A.env})};if(A.cpu){await Z("cpu");let fe=`${M}-cpu.cpuprofile`,xe=await Fn({argv:v,cwd:A.cwd,env:A.env,artifactDir:ie,fileName:fe,intervalUs:A.cpuIntervalUs??Nn});de.push(await ft({workload:l,phase:"cpu",configFingerprint:N,diagnosticWallNs:xe.diagnosticWallNs,exitCode:xe.exitCode,cpu:xe.cpu,artifactPath:xe.artifactPath,artifactKind:"cpuprofile",warnings:xe.warnings}))}if(A.heap){await Z("heap");let fe=`${M}-heap.heapsnapshot`,xe=await An({argv:v,cwd:A.cwd,env:A.env,artifactDir:ie,fileName:fe});de.push(await ft({workload:l,phase:"heap",configFingerprint:N,diagnosticWallNs:xe.diagnosticWallNs,exitCode:xe.exitCode,heap:xe.heap,artifactPath:xe.artifactPath,artifactKind:"heapsnapshot",warnings:xe.warnings}))}return de}async function ft(l){let v=`${l.workload.id}-${l.phase}-${l.configFingerprint}`,M=l.artifactPath?[await le(v,l.artifactKind,l.artifactPath)]:[];return p({workload:l.workload,phase:l.phase,configFingerprint:l.configFingerprint,diagnosticWallNs:l.diagnosticWallNs,exitCode:l.exitCode,cpu:l.cpu,heap:l.heap,warnings:l.warnings,artifacts:M})}async function ke(l,v={}){let M=me(l),N=i({intervalUs:v.intervalUs??Nn,origin:v.origin??"inspector"}),A=(de)=>de.samples?.nodeIds.length===0?[{code:"empty-profile",message:"In-process capture produced zero samples."}]:[];if(v.signal?.aborted){let de=Bun.nanoseconds(),Z=await l(),fe=p({workload:M,phase:"cpu",configFingerprint:N,diagnosticWallNs:Bun.nanoseconds()-de,warnings:[gt()],artifacts:[]});return{result:Z,measurement:fe,document:r([M],[fe])}}let ie=v.origin==="jsc"?await Q(l,v):{...await Un(l,v),jit:void 0},ee=p({workload:M,phase:"cpu",configFingerprint:N,diagnosticWallNs:ie.diagnosticWallNs,cpu:ie.cpu,jit:ie.jit,warnings:A(ie.cpu),artifacts:[]});return{result:ie.result,measurement:ee,document:r([M],[ee])}}
25
+ export{d,ne,te,L,T,E,u,re,R,j,H,ae,G,se,F,V,S,ge,f,m,he,be,we,oe,ke};