brass-runtime 1.16.0 → 1.17.0

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.
Files changed (219) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +287 -23
  3. package/dist/agent/cli/main.cjs +38 -38
  4. package/dist/agent/cli/main.js +6 -6
  5. package/dist/agent/cli/main.mjs +6 -6
  6. package/dist/agent/index.cjs +7 -7
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +6 -6
  9. package/dist/agent/index.mjs +6 -6
  10. package/dist/chunk-2HQTDLHF.mjs +683 -0
  11. package/dist/chunk-36I3M4UC.mjs +370 -0
  12. package/dist/{chunk-QY5FKYEQ.js → chunk-3AYM6WPJ.js} +570 -51
  13. package/dist/chunk-3LOYJFRR.cjs +300 -0
  14. package/dist/chunk-3Y2RIUMM.js +300 -0
  15. package/dist/{chunk-7XOPAB5Q.js → chunk-4P2HHGAX.mjs} +83 -5
  16. package/dist/{chunk-N6VHMOWB.cjs → chunk-4ROBZFL6.cjs} +128 -128
  17. package/dist/{chunk-NC5SDRYE.js → chunk-52OB2ROS.js} +4 -4
  18. package/dist/{chunk-JX3LZQJH.cjs → chunk-52PPNNI4.cjs} +82 -20
  19. package/dist/{chunk-5YOQOXEQ.cjs → chunk-5EC274J5.cjs} +676 -293
  20. package/dist/chunk-5QC7LRZ3.js +229 -0
  21. package/dist/{chunk-7TL2LHQJ.js → chunk-5VRJNBLZ.mjs} +524 -141
  22. package/dist/chunk-62AZW6UT.cjs +313 -0
  23. package/dist/chunk-6IXXWIUM.js +683 -0
  24. package/dist/chunk-6RY2FFN4.mjs +2024 -0
  25. package/dist/chunk-74ZTY6CP.js +2871 -0
  26. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  27. package/dist/{chunk-2WC63LJK.mjs → chunk-7JIJOVCT.js} +20 -10
  28. package/dist/chunk-7X3K5RMS.js +2024 -0
  29. package/dist/chunk-7ZPEZ57L.cjs +2024 -0
  30. package/dist/{chunk-FM4W4QPL.js → chunk-A2OM6NEH.mjs} +5 -4
  31. package/dist/chunk-AGR5B2BC.cjs +683 -0
  32. package/dist/chunk-B33ICAKP.js +313 -0
  33. package/dist/{chunk-J3H54ZRV.mjs → chunk-B5JD23U7.mjs} +1 -1
  34. package/dist/{chunk-F5EUMJL7.mjs → chunk-BKK77SBA.js} +83 -5
  35. package/dist/{chunk-U5KWK3PX.mjs → chunk-C3MDXTRZ.js} +11 -0
  36. package/dist/{chunk-SPUEME2B.cjs → chunk-CZIVE6NT.cjs} +12 -1
  37. package/dist/{chunk-TDVMADDN.js → chunk-DNFJLJMW.mjs} +11 -0
  38. package/dist/{chunk-XDZOO4L5.js → chunk-EJ6BPYVR.mjs} +79 -17
  39. package/dist/chunk-EOC4UHBS.mjs +229 -0
  40. package/dist/chunk-F6XWZQY4.cjs +777 -0
  41. package/dist/{chunk-7LVI2GIN.js → chunk-FH2X7BVP.js} +507 -72
  42. package/dist/{chunk-OOGJ73B6.js → chunk-FHQGHPMO.mjs} +20 -10
  43. package/dist/{chunk-WQ5QNU5R.cjs → chunk-GLE2WY7Z.cjs} +652 -217
  44. package/dist/{chunk-G6IQOE4P.mjs → chunk-GYM3LLGS.mjs} +507 -72
  45. package/dist/{chunk-TVN5I4U6.cjs → chunk-JF5WGYJJ.cjs} +25 -24
  46. package/dist/{chunk-CY33PGEX.mjs → chunk-KH4SYAOS.mjs} +570 -51
  47. package/dist/chunk-KN32XNTH.mjs +313 -0
  48. package/dist/chunk-KQLYONSE.cjs +2871 -0
  49. package/dist/{chunk-7HUOJA4W.cjs → chunk-KZJQ723N.cjs} +90 -80
  50. package/dist/{chunk-CCKHV5BT.mjs → chunk-L2SYFEBS.js} +5 -4
  51. package/dist/{chunk-IJT6RRQ5.cjs → chunk-L6VB5N7Q.cjs} +20 -9
  52. package/dist/{chunk-ZGLD4TVZ.mjs → chunk-MBEJI5HF.mjs} +4 -4
  53. package/dist/{chunk-PRWCB3QL.mjs → chunk-MIIYDLGM.js} +524 -141
  54. package/dist/{chunk-H55LI6WY.js → chunk-MOO4L7F4.mjs} +15 -4
  55. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  56. package/dist/chunk-PD4EJTQC.cjs +229 -0
  57. package/dist/chunk-PWC3RBQE.mjs +300 -0
  58. package/dist/{chunk-MWXMNYJS.cjs → chunk-Q2I37RP3.cjs} +643 -124
  59. package/dist/{chunk-VFIUZG7J.mjs → chunk-RKGKFN2A.js} +79 -17
  60. package/dist/{chunk-NYL4D7SK.cjs → chunk-SA6HUJVI.cjs} +5 -5
  61. package/dist/chunk-SK7UZRNI.mjs +777 -0
  62. package/dist/{chunk-K2T3DV26.mjs → chunk-TRM4JUZQ.js} +15 -4
  63. package/dist/chunk-UB4B6OFY.js +370 -0
  64. package/dist/{chunk-G3XGCZDQ.js → chunk-UCUBNWM2.js} +1 -1
  65. package/dist/chunk-VWIPB6I5.js +777 -0
  66. package/dist/{chunk-JNFRRJYH.cjs → chunk-WBGRHGBP.cjs} +270 -192
  67. package/dist/{client-CtFmoDvM.d.ts → client-CZHU674n.d.ts} +211 -36
  68. package/dist/core/index.cjs +135 -9
  69. package/dist/core/index.d.ts +238 -33
  70. package/dist/core/index.js +155 -29
  71. package/dist/core/index.mjs +155 -29
  72. package/dist/{effect-CGNl5Rqp.d.ts → effect-DIUHZ9IN.d.ts} +89 -1
  73. package/dist/effectRunner-CFLC32IK.cjs +8 -0
  74. package/dist/{effectRunner-A4CHJXJI.js → effectRunner-L4S7IPT3.js} +2 -2
  75. package/dist/{effectRunner-OPUF6QRN.mjs → effectRunner-NNGG75QA.mjs} +2 -2
  76. package/dist/http/index.cjs +324 -2986
  77. package/dist/http/index.d.ts +54 -68
  78. package/dist/http/index.js +238 -2900
  79. package/dist/http/index.mjs +238 -2900
  80. package/dist/http/testing.cjs +14 -12
  81. package/dist/http/testing.d.ts +5 -4
  82. package/dist/http/testing.js +10 -8
  83. package/dist/http/testing.mjs +10 -8
  84. package/dist/index.cjs +423 -255
  85. package/dist/index.d.ts +87 -69
  86. package/dist/index.js +301 -133
  87. package/dist/index.mjs +301 -133
  88. package/dist/observability/index.cjs +18 -531
  89. package/dist/observability/index.d.ts +81 -8
  90. package/dist/observability/index.js +25 -538
  91. package/dist/observability/index.mjs +25 -538
  92. package/dist/perf/cli.cjs +401 -0
  93. package/dist/perf/cli.d.ts +1 -0
  94. package/dist/perf/cli.js +401 -0
  95. package/dist/perf/cli.mjs +401 -0
  96. package/dist/perf/index.cjs +141 -0
  97. package/dist/perf/index.d.ts +483 -0
  98. package/dist/perf/index.js +141 -0
  99. package/dist/perf/index.mjs +141 -0
  100. package/dist/schedule-CK3Ml_7p.d.ts +259 -0
  101. package/dist/schema/index.cjs +6 -2
  102. package/dist/schema/index.d.ts +3 -1
  103. package/dist/schema/index.js +5 -1
  104. package/dist/schema/index.mjs +5 -1
  105. package/dist/{server-C8hDXA74.d.ts → server-D6JZ15_e.d.ts} +16 -4
  106. package/dist/{stream-dvSs0QS5.d.ts → stream-B4oK9JFP.d.ts} +1 -1
  107. package/dist/{tracer-B5tRH9H7.d.ts → tracer-Hwt1cl7h.d.ts} +13 -54
  108. package/dist/{tracing-Dt9S_6V8.d.ts → tracing-DqbTKGcf.d.ts} +1 -1
  109. package/docs/ARCHITECTURE.md +292 -0
  110. package/docs/README.md +65 -0
  111. package/docs/adr/0001-ai-context-pack.md +32 -0
  112. package/docs/agent-apply-mode.md +104 -0
  113. package/docs/agent-approvals.md +110 -0
  114. package/docs/agent-batch.md +185 -0
  115. package/docs/agent-boundaries.md +112 -0
  116. package/docs/agent-chat-sessions.md +160 -0
  117. package/docs/agent-ci.md +17 -0
  118. package/docs/agent-cli.md +405 -0
  119. package/docs/agent-config.md +480 -0
  120. package/docs/agent-context-discovery.md +159 -0
  121. package/docs/agent-copilot-like-dx.md +126 -0
  122. package/docs/agent-declarative-optimized-planning.md +138 -0
  123. package/docs/agent-dx.md +224 -0
  124. package/docs/agent-env-files.md +126 -0
  125. package/docs/agent-follow-up-context.md +43 -0
  126. package/docs/agent-global-usage.md +180 -0
  127. package/docs/agent-init.md +109 -0
  128. package/docs/agent-install-and-configure.md +516 -0
  129. package/docs/agent-language-workspace-ux.md +99 -0
  130. package/docs/agent-llm-adapters.md +123 -0
  131. package/docs/agent-local-install.md +190 -0
  132. package/docs/agent-local-tests.md +51 -0
  133. package/docs/agent-observability.md +155 -0
  134. package/docs/agent-patch-quality-loop.md +162 -0
  135. package/docs/agent-presets.md +22 -0
  136. package/docs/agent-project-commands.md +237 -0
  137. package/docs/agent-project-intelligence.md +156 -0
  138. package/docs/agent-redaction.md +18 -0
  139. package/docs/agent-release-readiness.md +76 -0
  140. package/docs/agent-rollback-safety.md +162 -0
  141. package/docs/agent-rollback.md +23 -0
  142. package/docs/agent-run-artifacts.md +16 -0
  143. package/docs/agent-vscode-auto-discovery.md +137 -0
  144. package/docs/agent-vscode-batch-runner.md +100 -0
  145. package/docs/agent-vscode-chat-layout.md +90 -0
  146. package/docs/agent-vscode-clean-install.md +147 -0
  147. package/docs/agent-vscode-code-actions.md +70 -0
  148. package/docs/agent-vscode-diff-preview.md +45 -0
  149. package/docs/agent-vscode-inline-assist.md +56 -0
  150. package/docs/agent-vscode-install.md +186 -0
  151. package/docs/agent-vscode-model-setup.md +97 -0
  152. package/docs/agent-vscode-patch-preview.md +92 -0
  153. package/docs/agent-vscode-problems.md +79 -0
  154. package/docs/agent-vscode-project-dashboard.md +106 -0
  155. package/docs/agent-vscode-run-history.md +92 -0
  156. package/docs/agent-vscode-ux.md +73 -0
  157. package/docs/ai/INVARIANTS.md +84 -0
  158. package/docs/ai/PROJECT_MAP.md +338 -0
  159. package/docs/ai/PUBLIC_API.md +339 -0
  160. package/docs/ai/VALIDATION_MATRIX.md +67 -0
  161. package/docs/api-polish.md +37 -0
  162. package/docs/cancellation.md +162 -0
  163. package/docs/coverage.md +46 -0
  164. package/docs/framework-integrations.md +38 -0
  165. package/docs/frameworks/angular.md +153 -0
  166. package/docs/frameworks/express.md +125 -0
  167. package/docs/frameworks/fastify.md +124 -0
  168. package/docs/frameworks/nestjs.md +282 -0
  169. package/docs/frameworks/nextjs.md +147 -0
  170. package/docs/frameworks/react.md +139 -0
  171. package/docs/frameworks/vanilla.md +224 -0
  172. package/docs/getting-started.md +159 -0
  173. package/docs/guides/README.md +40 -0
  174. package/docs/guides/circuit-breaker.md +89 -0
  175. package/docs/guides/error-handling.md +91 -0
  176. package/docs/guides/getting-started.md +107 -0
  177. package/docs/guides/layers.md +189 -0
  178. package/docs/guides/metrics.md +101 -0
  179. package/docs/guides/resource-management.md +141 -0
  180. package/docs/guides/retry.md +215 -0
  181. package/docs/guides/semaphore.md +66 -0
  182. package/docs/guides/streams.md +117 -0
  183. package/docs/guides/supervisors.md +98 -0
  184. package/docs/guides/testing.md +162 -0
  185. package/docs/guides/tracing.md +71 -0
  186. package/docs/http-recipes.md +399 -0
  187. package/docs/http.md +749 -0
  188. package/docs/modules.md +285 -0
  189. package/docs/nestjs.md +6 -0
  190. package/docs/observability-collector-smoke.md +31 -0
  191. package/docs/observability-framework-examples.md +110 -0
  192. package/docs/observability.md +649 -0
  193. package/docs/otel-collector-smoke.yaml +27 -0
  194. package/docs/performance-profiler.md +199 -0
  195. package/docs/production-readiness.md +73 -0
  196. package/docs/recipes/README.md +12 -0
  197. package/docs/recipes/http-server.md +45 -0
  198. package/docs/recipes/layers.md +44 -0
  199. package/docs/recipes/performance.md +47 -0
  200. package/docs/recipes/runtime.md +41 -0
  201. package/docs/recipes/testing.md +41 -0
  202. package/docs/release.md +53 -0
  203. package/docs/wasm-bounded-queues.md +44 -0
  204. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  205. package/docs/wasm-fiber-engine.md +117 -0
  206. package/docs/wasm-scheduler-state-machine.md +122 -0
  207. package/docs/wasm-stream-chunks.md +54 -0
  208. package/package.json +22 -2
  209. package/dist/chunk-45F7OKGT.cjs +0 -104
  210. package/dist/chunk-7V4KY4RL.mjs +0 -104
  211. package/dist/chunk-DJQ7OMMB.cjs +0 -144
  212. package/dist/chunk-GOV47PPB.mjs +0 -552
  213. package/dist/chunk-JF4XXPZ5.cjs +0 -552
  214. package/dist/chunk-KCPT2D6G.js +0 -552
  215. package/dist/chunk-NOYZIMUJ.mjs +0 -144
  216. package/dist/chunk-PNVFW245.js +0 -144
  217. package/dist/chunk-ROJC3NBJ.js +0 -104
  218. package/dist/effectRunner-3ZHAD3LE.cjs +0 -8
  219. package/dist/schedule-Fque9Abz.d.ts +0 -70
@@ -0,0 +1,401 @@
1
+ #!/usr/bin/env node
2
+ "use strict"; function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+
15
+
16
+
17
+
18
+ var _chunk7ZPEZ57Lcjs = require('../chunk-7ZPEZ57L.cjs');
19
+ require('../chunk-PD4EJTQC.cjs');
20
+ require('../chunk-KQLYONSE.cjs');
21
+ require('../chunk-5EC274J5.cjs');
22
+ require('../chunk-L6VB5N7Q.cjs');
23
+ require('../chunk-KZJQ723N.cjs');
24
+ require('../chunk-SA6HUJVI.cjs');
25
+ require('../chunk-AGR5B2BC.cjs');
26
+ require('../chunk-JF5WGYJJ.cjs');
27
+ require('../chunk-F6XWZQY4.cjs');
28
+ require('../chunk-WBGRHGBP.cjs');
29
+ require('../chunk-52PPNNI4.cjs');
30
+ require('../chunk-3LOYJFRR.cjs');
31
+ require('../chunk-GLE2WY7Z.cjs');
32
+ require('../chunk-MVGUEJ5Z.cjs');
33
+ require('../chunk-CZIVE6NT.cjs');
34
+ require('../chunk-OBGZSXTJ.cjs');
35
+
36
+ // src/perf/cli.ts
37
+ async function main(argv) {
38
+ const cli = parseArgs(argv);
39
+ if (cli.profile === "runtime-ab") {
40
+ const report2 = await _chunk7ZPEZ57Lcjs.profileRuntimeAb.call(void 0, cli.runtimeAb);
41
+ await printReport(cli, report2, _chunk7ZPEZ57Lcjs.formatRuntimeAbReport.call(void 0, report2));
42
+ return;
43
+ }
44
+ if (cli.profile === "runtime-soak") {
45
+ const report2 = await _chunk7ZPEZ57Lcjs.profileRuntimeSoak.call(void 0, cli.runtimeSoak);
46
+ await printReport(cli, report2, _chunk7ZPEZ57Lcjs.formatRuntimeSoakReport.call(void 0, report2));
47
+ return;
48
+ }
49
+ if (cli.profile === "http-memory") {
50
+ const report2 = await _chunk7ZPEZ57Lcjs.profileHttpMemoryLab.call(void 0, cli.httpMemory);
51
+ await printReport(cli, report2, _chunk7ZPEZ57Lcjs.formatHttpMemoryLabReport.call(void 0, report2));
52
+ return;
53
+ }
54
+ const report = await _chunk7ZPEZ57Lcjs.runBrassPerformanceProfile.call(void 0, cli.options);
55
+ await printReport(cli, report, _chunk7ZPEZ57Lcjs.formatPerformanceReport.call(void 0, report));
56
+ }
57
+ function parseArgs(argv) {
58
+ let json = envBool("BRASS_PERF_JSON", false);
59
+ let profile = envProfile("BRASS_PERF_PROFILE", "all");
60
+ let calls = envInt("BRASS_PERF_CALLS", void 0);
61
+ let concurrency = envInt("BRASS_PERF_CONCURRENCY", void 0);
62
+ let delayMs = envInt("BRASS_PERF_DELAY_MS", void 0);
63
+ let warmupCalls = envInt("BRASS_PERF_WARMUP_CALLS", void 0);
64
+ let timeoutMs = envInt("BRASS_PERF_TIMEOUT_MS", void 0);
65
+ let statsSampleMs = envInt("BRASS_PERF_STATS_SAMPLE_MS", void 0);
66
+ let runtimeIterations = envInt("BRASS_PERF_RUNTIME_ITERATIONS", void 0);
67
+ let runtimeChainDepth = envInt("BRASS_PERF_RUNTIME_CHAIN_DEPTH", void 0);
68
+ let runtimeVariant = envRuntimeVariant("BRASS_PERF_RUNTIME_VARIANT");
69
+ let baseline = envRuntimeVariant("BRASS_PERF_BASELINE");
70
+ let candidate = envRuntimeVariant("BRASS_PERF_CANDIDATE");
71
+ let rounds = envInt("BRASS_PERF_ROUNDS", void 0);
72
+ let forceGc = envBool("BRASS_PERF_FORCE_GC", false);
73
+ let variants = envVariants("BRASS_PERF_VARIANTS");
74
+ let recordHistory = envBool("BRASS_PERF_RECORD_HISTORY", false);
75
+ let historyDir = envString("BRASS_PERF_HISTORY_DIR");
76
+ let historyMaxEntries = envInt("BRASS_PERF_HISTORY_MAX_ENTRIES", void 0);
77
+ let saveBaseline = envString("BRASS_PERF_SAVE_BASELINE");
78
+ let compareBaseline = envString("BRASS_PERF_COMPARE_BASELINE");
79
+ let failOnBaselineRegression = envBool("BRASS_PERF_FAIL_ON_BASELINE_REGRESSION", false);
80
+ let baselineMaxRegressionPercent = envNumber("BRASS_PERF_BASELINE_MAX_REGRESSION_PERCENT");
81
+ let baselineMaxHeapRegressionPercent = envNumber("BRASS_PERF_BASELINE_MAX_HEAP_REGRESSION_PERCENT");
82
+ let baselineWarnAtRatio = envNumber("BRASS_PERF_BASELINE_WARN_AT_RATIO");
83
+ for (let i = 0; i < argv.length; i++) {
84
+ const arg = argv[i];
85
+ switch (arg) {
86
+ case "--json":
87
+ json = true;
88
+ break;
89
+ case "--profile":
90
+ profile = parseProfile(readValue(argv, ++i, arg));
91
+ break;
92
+ case "--calls":
93
+ calls = parsePositive(readValue(argv, ++i, arg), arg);
94
+ break;
95
+ case "--concurrency":
96
+ concurrency = parsePositive(readValue(argv, ++i, arg), arg);
97
+ break;
98
+ case "--delay-ms":
99
+ delayMs = parseNonNegative(readValue(argv, ++i, arg), arg);
100
+ break;
101
+ case "--warmup":
102
+ case "--warmup-calls":
103
+ warmupCalls = parseNonNegative(readValue(argv, ++i, arg), arg);
104
+ break;
105
+ case "--timeout-ms":
106
+ timeoutMs = parsePositive(readValue(argv, ++i, arg), arg);
107
+ break;
108
+ case "--stats-sample-ms":
109
+ statsSampleMs = parsePositive(readValue(argv, ++i, arg), arg);
110
+ break;
111
+ case "--runtime-iterations":
112
+ runtimeIterations = parsePositive(readValue(argv, ++i, arg), arg);
113
+ break;
114
+ case "--runtime-chain-depth":
115
+ runtimeChainDepth = parsePositive(readValue(argv, ++i, arg), arg);
116
+ break;
117
+ case "--runtime-variant":
118
+ runtimeVariant = parseRuntimeVariant(readValue(argv, ++i, arg));
119
+ break;
120
+ case "--baseline":
121
+ baseline = parseRuntimeVariant(readValue(argv, ++i, arg));
122
+ break;
123
+ case "--candidate":
124
+ candidate = parseRuntimeVariant(readValue(argv, ++i, arg));
125
+ break;
126
+ case "--rounds":
127
+ rounds = parsePositive(readValue(argv, ++i, arg), arg);
128
+ break;
129
+ case "--variants":
130
+ variants = parseVariants(readValue(argv, ++i, arg));
131
+ break;
132
+ case "--force-gc":
133
+ forceGc = true;
134
+ break;
135
+ case "--no-gc":
136
+ forceGc = false;
137
+ break;
138
+ case "--no-http":
139
+ profile = "runtime";
140
+ break;
141
+ case "--no-runtime":
142
+ profile = "http";
143
+ break;
144
+ case "--record-history":
145
+ recordHistory = true;
146
+ break;
147
+ case "--history-dir":
148
+ historyDir = readValue(argv, ++i, arg);
149
+ break;
150
+ case "--history-max-entries":
151
+ historyMaxEntries = parsePositive(readValue(argv, ++i, arg), arg);
152
+ break;
153
+ case "--save-baseline":
154
+ saveBaseline = readValue(argv, ++i, arg);
155
+ break;
156
+ case "--compare-baseline":
157
+ compareBaseline = readValue(argv, ++i, arg);
158
+ break;
159
+ case "--fail-on-baseline-regression":
160
+ failOnBaselineRegression = true;
161
+ break;
162
+ case "--baseline-max-regression-percent":
163
+ baselineMaxRegressionPercent = parseNonNegativeNumber(readValue(argv, ++i, arg), arg);
164
+ break;
165
+ case "--baseline-max-heap-regression-percent":
166
+ baselineMaxHeapRegressionPercent = parseNonNegativeNumber(readValue(argv, ++i, arg), arg);
167
+ break;
168
+ case "--baseline-warn-at-ratio":
169
+ baselineWarnAtRatio = parseNonNegativeNumber(readValue(argv, ++i, arg), arg);
170
+ break;
171
+ case "--help":
172
+ case "-h":
173
+ printHelp();
174
+ process.exit(0);
175
+ default:
176
+ throw new Error(`Unknown argument: ${arg}`);
177
+ }
178
+ }
179
+ return {
180
+ json,
181
+ profile,
182
+ options: {
183
+ runtime: profile === "http" ? false : {
184
+ ...runtimeIterations !== void 0 ? { iterations: runtimeIterations } : {},
185
+ ...runtimeChainDepth !== void 0 ? { chainDepth: runtimeChainDepth } : {},
186
+ ...runtimeVariant !== void 0 ? { variant: runtimeVariant } : {}
187
+ },
188
+ http: profile === "runtime" ? false : {
189
+ ...calls !== void 0 ? { calls } : {},
190
+ ...concurrency !== void 0 ? { concurrency } : {},
191
+ ...delayMs !== void 0 ? { delayMs } : {},
192
+ ...warmupCalls !== void 0 ? { warmupCalls } : {},
193
+ ...timeoutMs !== void 0 ? { timeoutMs } : {},
194
+ ...statsSampleMs !== void 0 ? { statsSampleMs } : {},
195
+ ...variants !== void 0 ? { variants } : {},
196
+ forceGc
197
+ },
198
+ memory: { forceGc }
199
+ },
200
+ runtimeAb: {
201
+ baseline,
202
+ candidate,
203
+ runtime: {
204
+ ...runtimeIterations !== void 0 ? { iterations: runtimeIterations } : {},
205
+ ...runtimeChainDepth !== void 0 ? { chainDepth: runtimeChainDepth } : {}
206
+ },
207
+ forceGc
208
+ },
209
+ runtimeSoak: {
210
+ rounds,
211
+ variant: runtimeVariant,
212
+ runtime: {
213
+ ...runtimeIterations !== void 0 ? { iterations: runtimeIterations } : {},
214
+ ...runtimeChainDepth !== void 0 ? { chainDepth: runtimeChainDepth } : {}
215
+ },
216
+ forceGc
217
+ },
218
+ httpMemory: {
219
+ ...calls !== void 0 ? { calls } : {},
220
+ ...concurrency !== void 0 ? { concurrency } : {},
221
+ ...delayMs !== void 0 ? { delayMs } : {},
222
+ ...warmupCalls !== void 0 ? { warmupCalls } : {},
223
+ ...timeoutMs !== void 0 ? { timeoutMs } : {},
224
+ ...statsSampleMs !== void 0 ? { statsSampleMs } : {},
225
+ ...variants !== void 0 ? { variants } : {},
226
+ rounds,
227
+ forceGc
228
+ },
229
+ history: {
230
+ recordHistory,
231
+ ...historyDir !== void 0 ? { historyDir } : {},
232
+ ...historyMaxEntries !== void 0 ? { maxEntries: historyMaxEntries } : {},
233
+ ...saveBaseline !== void 0 ? { saveBaseline } : {},
234
+ ...compareBaseline !== void 0 ? { compareBaseline } : {},
235
+ failOnBaselineRegression,
236
+ thresholds: {
237
+ ...baselineMaxRegressionPercent !== void 0 ? { maxRegressionPercent: baselineMaxRegressionPercent } : {},
238
+ ...baselineMaxHeapRegressionPercent !== void 0 ? { maxHeapRegressionPercent: baselineMaxHeapRegressionPercent } : {},
239
+ ...baselineWarnAtRatio !== void 0 ? { warnAtRatio: baselineWarnAtRatio } : {}
240
+ }
241
+ }
242
+ };
243
+ }
244
+ function printHelp() {
245
+ console.log([
246
+ "Usage: npm run perf -- [options]",
247
+ "",
248
+ "Options:",
249
+ " --profile all|runtime|http|runtime-ab|runtime-soak|http-memory",
250
+ " --json",
251
+ " --calls N",
252
+ " --concurrency N",
253
+ " --delay-ms N",
254
+ " --warmup N",
255
+ " --variants node-http-text,default-json,default-json-observed",
256
+ " --runtime-iterations N",
257
+ " --runtime-chain-depth N",
258
+ " --runtime-variant default|fiber-only|active-hooks|recorder|wide-scheduler",
259
+ " --baseline default|fiber-only|active-hooks|recorder|wide-scheduler",
260
+ " --candidate default|fiber-only|active-hooks|recorder|wide-scheduler",
261
+ " --rounds N",
262
+ " --force-gc",
263
+ " --no-gc",
264
+ " --record-history",
265
+ " --history-dir PATH",
266
+ " --history-max-entries N",
267
+ " --save-baseline NAME",
268
+ " --compare-baseline NAME",
269
+ " --baseline-max-regression-percent N",
270
+ " --baseline-max-heap-regression-percent N",
271
+ " --baseline-warn-at-ratio N",
272
+ " --fail-on-baseline-regression"
273
+ ].join("\n"));
274
+ }
275
+ async function printReport(cli, report, textReport) {
276
+ const history = await maybeHandleHistory(cli, report);
277
+ if (cli.json) {
278
+ console.log(JSON.stringify(history ? { report, history } : report, null, 2));
279
+ } else {
280
+ console.log(history ? `${textReport}
281
+
282
+ ${formatCliHistory(history)}` : textReport);
283
+ }
284
+ if (_optionalChain([history, 'optionalAccess', _ => _.comparison]) && !history.comparison.passed && cli.history.failOnBaselineRegression) {
285
+ process.exitCode = 1;
286
+ }
287
+ }
288
+ async function maybeHandleHistory(cli, report) {
289
+ const config = cli.history;
290
+ if (!config.recordHistory && !config.saveBaseline && !config.compareBaseline) return void 0;
291
+ const storeOptions = {
292
+ ...config.historyDir !== void 0 ? { directory: config.historyDir } : {},
293
+ ...config.maxEntries !== void 0 ? { maxEntries: config.maxEntries } : {},
294
+ metadata: {
295
+ cliProfile: cli.profile
296
+ }
297
+ };
298
+ const entry = _chunk7ZPEZ57Lcjs.createPerfHistoryEntry.call(void 0, cli.profile, report, storeOptions);
299
+ const historyPath = config.recordHistory ? await _chunk7ZPEZ57Lcjs.writePerfHistoryEntry.call(void 0, entry, storeOptions) : void 0;
300
+ const savedBaseline = config.saveBaseline ? await _chunk7ZPEZ57Lcjs.savePerfBaseline.call(void 0, config.saveBaseline, entry, storeOptions) : void 0;
301
+ const loadedBaseline = config.compareBaseline ? await _chunk7ZPEZ57Lcjs.loadPerfBaseline.call(void 0, config.compareBaseline, storeOptions) : void 0;
302
+ if (config.compareBaseline && !loadedBaseline) {
303
+ throw new Error(`Perf baseline '${config.compareBaseline}' was not found`);
304
+ }
305
+ const comparison = loadedBaseline ? _chunk7ZPEZ57Lcjs.comparePerfToBaseline.call(void 0, entry, loadedBaseline, config.thresholds) : void 0;
306
+ return Object.freeze({
307
+ entry,
308
+ ...historyPath !== void 0 ? { historyPath } : {},
309
+ ...savedBaseline !== void 0 ? { savedBaselinePath: savedBaseline.path } : {},
310
+ ...comparison !== void 0 ? { comparison } : {}
311
+ });
312
+ }
313
+ function formatCliHistory(history) {
314
+ const lines = [];
315
+ lines.push("Performance history");
316
+ if (history.historyPath) lines.push(`- recorded: ${history.historyPath}`);
317
+ if (history.savedBaselinePath) lines.push(`- baseline saved: ${history.savedBaselinePath}`);
318
+ if (history.comparison) {
319
+ lines.push("");
320
+ lines.push(_chunk7ZPEZ57Lcjs.formatPerfBaselineComparison.call(void 0, history.comparison));
321
+ }
322
+ return lines.join("\n");
323
+ }
324
+ function readValue(argv, index, flag) {
325
+ const value = argv[index];
326
+ if (!value || value.startsWith("--")) throw new Error(`Missing value for ${flag}`);
327
+ return value;
328
+ }
329
+ function parseProfile(value) {
330
+ if (value === "all" || value === "runtime" || value === "http" || value === "runtime-ab" || value === "runtime-soak" || value === "http-memory") return value;
331
+ throw new Error(`Invalid --profile value: ${value}`);
332
+ }
333
+ function parseRuntimeVariant(value) {
334
+ if (value === "default" || value === "fiber-only" || value === "active-hooks" || value === "recorder" || value === "wide-scheduler") return value;
335
+ throw new Error(`Invalid runtime variant: ${value}`);
336
+ }
337
+ function parseVariants(value) {
338
+ const allowed = new Set(_chunk7ZPEZ57Lcjs.HTTP_PROFILE_VARIANTS);
339
+ return Object.freeze(value.split(",").map((item) => item.trim()).filter(Boolean).map((item) => {
340
+ if (!allowed.has(item)) {
341
+ throw new Error(`Invalid HTTP profile variant: ${item}`);
342
+ }
343
+ return item;
344
+ }));
345
+ }
346
+ function parsePositive(value, flag) {
347
+ const parsed = Number(value);
348
+ if (!Number.isFinite(parsed) || parsed <= 0) throw new Error(`${flag} must be a positive number`);
349
+ return Math.floor(parsed);
350
+ }
351
+ function parseNonNegative(value, flag) {
352
+ const parsed = Number(value);
353
+ if (!Number.isFinite(parsed) || parsed < 0) throw new Error(`${flag} must be a non-negative number`);
354
+ return Math.floor(parsed);
355
+ }
356
+ function parseNonNegativeNumber(value, flag) {
357
+ const parsed = Number(value);
358
+ if (!Number.isFinite(parsed) || parsed < 0) throw new Error(`${flag} must be a non-negative number`);
359
+ return parsed;
360
+ }
361
+ function envInt(name, fallback) {
362
+ const raw = process.env[name];
363
+ if (raw === void 0 || raw.trim() === "") return fallback;
364
+ const parsed = Number(raw);
365
+ return Number.isFinite(parsed) ? Math.floor(parsed) : fallback;
366
+ }
367
+ function envNumber(name) {
368
+ const raw = process.env[name];
369
+ if (raw === void 0 || raw.trim() === "") return void 0;
370
+ const parsed = Number(raw);
371
+ return Number.isFinite(parsed) ? parsed : void 0;
372
+ }
373
+ function envString(name) {
374
+ const raw = process.env[name];
375
+ if (raw === void 0 || raw.trim() === "") return void 0;
376
+ return raw.trim();
377
+ }
378
+ function envBool(name, fallback) {
379
+ const raw = process.env[name];
380
+ if (raw === void 0 || raw.trim() === "") return fallback;
381
+ return raw === "1" || raw.toLowerCase() === "true" || raw.toLowerCase() === "yes";
382
+ }
383
+ function envProfile(name, fallback) {
384
+ const raw = process.env[name];
385
+ if (!raw) return fallback;
386
+ return parseProfile(raw.trim());
387
+ }
388
+ function envRuntimeVariant(name) {
389
+ const raw = process.env[name];
390
+ if (!raw || raw.trim() === "") return void 0;
391
+ return parseRuntimeVariant(raw.trim());
392
+ }
393
+ function envVariants(name) {
394
+ const raw = process.env[name];
395
+ if (!raw || raw.trim() === "") return void 0;
396
+ return parseVariants(raw);
397
+ }
398
+ main(process.argv.slice(2)).catch((error) => {
399
+ console.error(error instanceof Error ? error.message : String(error));
400
+ process.exitCode = 1;
401
+ });
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node