brass-runtime 1.15.0 → 1.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +673 -136
  3. package/dist/agent/cli/main.cjs +40 -35
  4. package/dist/agent/cli/main.js +9 -4
  5. package/dist/agent/cli/main.mjs +9 -4
  6. package/dist/agent/index.cjs +8 -4
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +7 -3
  9. package/dist/agent/index.mjs +7 -3
  10. package/dist/chunk-2HQTDLHF.mjs +683 -0
  11. package/dist/chunk-36I3M4UC.mjs +370 -0
  12. package/dist/chunk-3AYM6WPJ.js +1629 -0
  13. package/dist/chunk-3LOYJFRR.cjs +300 -0
  14. package/dist/chunk-3RG5ZIWI.js +10 -0
  15. package/dist/chunk-3Y2RIUMM.js +300 -0
  16. package/dist/{chunk-VEZNF5GZ.cjs → chunk-4ROBZFL6.cjs} +130 -126
  17. package/dist/{chunk-3QMOKAS5.js → chunk-52OB2ROS.js} +9 -5
  18. package/dist/chunk-52PPNNI4.cjs +416 -0
  19. package/dist/chunk-5EC274J5.cjs +2874 -0
  20. package/dist/chunk-5QC7LRZ3.js +229 -0
  21. package/dist/chunk-5VRJNBLZ.mjs +2874 -0
  22. package/dist/chunk-62AZW6UT.cjs +313 -0
  23. package/dist/chunk-6IXXWIUM.js +683 -0
  24. package/dist/chunk-74ZTY6CP.js +2871 -0
  25. package/dist/chunk-76YMRMH2.cjs +777 -0
  26. package/dist/chunk-7CMJS3QE.mjs +2871 -0
  27. package/dist/{chunk-4NHES7VK.mjs → chunk-7JIJOVCT.js} +27 -13
  28. package/dist/chunk-A2OM6NEH.mjs +194 -0
  29. package/dist/chunk-AGR5B2BC.cjs +683 -0
  30. package/dist/chunk-AVNQLJ5V.js +777 -0
  31. package/dist/chunk-B33ICAKP.js +313 -0
  32. package/dist/{chunk-ELOOF35R.mjs → chunk-B5JD23U7.mjs} +1 -1
  33. package/dist/chunk-BABBZK4Y.js +2024 -0
  34. package/dist/chunk-C3MDXTRZ.js +354 -0
  35. package/dist/chunk-CIZFIMK5.js +2193 -0
  36. package/dist/chunk-CZIVE6NT.cjs +354 -0
  37. package/dist/chunk-DNFJLJMW.mjs +354 -0
  38. package/dist/chunk-DNFO2EIZ.mjs +777 -0
  39. package/dist/chunk-EJ6BPYVR.mjs +416 -0
  40. package/dist/chunk-ENKODRU3.cjs +2193 -0
  41. package/dist/chunk-EOC4UHBS.mjs +229 -0
  42. package/dist/{chunk-BMH5AV44.js → chunk-FH2X7BVP.js} +756 -440
  43. package/dist/{chunk-PPUXIH5R.js → chunk-FHQGHPMO.mjs} +27 -13
  44. package/dist/{chunk-TGIFUAK4.cjs → chunk-GLE2WY7Z.cjs} +951 -635
  45. package/dist/{chunk-BDF4AMWX.mjs → chunk-GYM3LLGS.mjs} +756 -440
  46. package/dist/chunk-HLWLMW2F.mjs +2024 -0
  47. package/dist/chunk-JF5WGYJJ.cjs +194 -0
  48. package/dist/chunk-KH4SYAOS.mjs +1629 -0
  49. package/dist/chunk-KN32XNTH.mjs +313 -0
  50. package/dist/chunk-KQLYONSE.cjs +2871 -0
  51. package/dist/{chunk-STVLQ3XD.cjs → chunk-KZJQ723N.cjs} +92 -78
  52. package/dist/chunk-L2SYFEBS.js +194 -0
  53. package/dist/chunk-L6VB5N7Q.cjs +104 -0
  54. package/dist/{chunk-K6M7MDZ4.mjs → chunk-MBEJI5HF.mjs} +9 -5
  55. package/dist/chunk-MIIYDLGM.js +2874 -0
  56. package/dist/chunk-MOO4L7F4.mjs +104 -0
  57. package/dist/chunk-MT3OWDPC.mjs +2193 -0
  58. package/dist/chunk-MVGUEJ5Z.cjs +370 -0
  59. package/dist/chunk-OBGZSXTJ.cjs +10 -0
  60. package/dist/chunk-PD4EJTQC.cjs +229 -0
  61. package/dist/chunk-PWC3RBQE.mjs +300 -0
  62. package/dist/chunk-Q2I37RP3.cjs +1629 -0
  63. package/dist/chunk-RKGKFN2A.js +416 -0
  64. package/dist/{chunk-R3R2FVLG.cjs → chunk-SA6HUJVI.cjs} +5 -5
  65. package/dist/chunk-TRM4JUZQ.js +104 -0
  66. package/dist/chunk-UB4B6OFY.js +370 -0
  67. package/dist/{chunk-TO7IKXYT.js → chunk-UCUBNWM2.js} +1 -1
  68. package/dist/chunk-VN44DYYT.cjs +2024 -0
  69. package/dist/chunk-Y6FXYEAI.mjs +10 -0
  70. package/dist/client-CZHU674n.d.ts +820 -0
  71. package/dist/core/index.cjs +198 -4
  72. package/dist/core/index.d.ts +311 -212
  73. package/dist/core/index.js +237 -43
  74. package/dist/core/index.mjs +237 -43
  75. package/dist/{effect-CMOQKX8y.d.ts → effect-DIUHZ9IN.d.ts} +195 -1
  76. package/dist/effectRunner-CFLC32IK.cjs +8 -0
  77. package/dist/effectRunner-L4S7IPT3.js +8 -0
  78. package/dist/effectRunner-NNGG75QA.mjs +8 -0
  79. package/dist/http/index.cjs +1227 -2971
  80. package/dist/http/index.d.ts +826 -280
  81. package/dist/http/index.js +1089 -2833
  82. package/dist/http/index.mjs +1089 -2833
  83. package/dist/http/testing.cjs +161 -0
  84. package/dist/http/testing.d.ts +43 -0
  85. package/dist/http/testing.js +161 -0
  86. package/dist/http/testing.mjs +161 -0
  87. package/dist/index.cjs +486 -250
  88. package/dist/index.d.ts +87 -95
  89. package/dist/index.js +391 -155
  90. package/dist/index.mjs +391 -155
  91. package/dist/observability/index.cjs +162 -0
  92. package/dist/observability/index.d.ts +152 -0
  93. package/dist/observability/index.js +162 -0
  94. package/dist/observability/index.mjs +162 -0
  95. package/dist/perf/cli.cjs +401 -0
  96. package/dist/perf/cli.d.ts +1 -0
  97. package/dist/perf/cli.js +401 -0
  98. package/dist/perf/cli.mjs +401 -0
  99. package/dist/perf/index.cjs +141 -0
  100. package/dist/perf/index.d.ts +483 -0
  101. package/dist/perf/index.js +141 -0
  102. package/dist/perf/index.mjs +141 -0
  103. package/dist/schedule-CK3Ml_7p.d.ts +259 -0
  104. package/dist/schema/index.cjs +29 -0
  105. package/dist/schema/index.d.ts +179 -0
  106. package/dist/schema/index.js +29 -0
  107. package/dist/schema/index.mjs +29 -0
  108. package/dist/server-GJPg8ZSG.d.ts +675 -0
  109. package/dist/{stream-FQm9h4Mg.d.ts → stream-B4oK9JFP.d.ts} +1 -1
  110. package/dist/tracer-Hwt1cl7h.d.ts +189 -0
  111. package/dist/tracing-DqbTKGcf.d.ts +148 -0
  112. package/docs/ARCHITECTURE.md +292 -0
  113. package/docs/README.md +63 -0
  114. package/docs/adr/0001-ai-context-pack.md +32 -0
  115. package/docs/agent-apply-mode.md +104 -0
  116. package/docs/agent-approvals.md +110 -0
  117. package/docs/agent-batch.md +185 -0
  118. package/docs/agent-boundaries.md +112 -0
  119. package/docs/agent-chat-sessions.md +160 -0
  120. package/docs/agent-ci.md +17 -0
  121. package/docs/agent-cli.md +405 -0
  122. package/docs/agent-config.md +480 -0
  123. package/docs/agent-context-discovery.md +159 -0
  124. package/docs/agent-copilot-like-dx.md +126 -0
  125. package/docs/agent-declarative-optimized-planning.md +138 -0
  126. package/docs/agent-dx.md +224 -0
  127. package/docs/agent-env-files.md +126 -0
  128. package/docs/agent-follow-up-context.md +43 -0
  129. package/docs/agent-global-usage.md +180 -0
  130. package/docs/agent-init.md +109 -0
  131. package/docs/agent-install-and-configure.md +516 -0
  132. package/docs/agent-language-workspace-ux.md +99 -0
  133. package/docs/agent-llm-adapters.md +123 -0
  134. package/docs/agent-local-install.md +190 -0
  135. package/docs/agent-local-tests.md +51 -0
  136. package/docs/agent-observability.md +155 -0
  137. package/docs/agent-patch-quality-loop.md +162 -0
  138. package/docs/agent-presets.md +22 -0
  139. package/docs/agent-project-commands.md +237 -0
  140. package/docs/agent-project-intelligence.md +156 -0
  141. package/docs/agent-redaction.md +18 -0
  142. package/docs/agent-release-readiness.md +76 -0
  143. package/docs/agent-rollback-safety.md +162 -0
  144. package/docs/agent-rollback.md +23 -0
  145. package/docs/agent-run-artifacts.md +16 -0
  146. package/docs/agent-vscode-auto-discovery.md +137 -0
  147. package/docs/agent-vscode-batch-runner.md +100 -0
  148. package/docs/agent-vscode-chat-layout.md +90 -0
  149. package/docs/agent-vscode-clean-install.md +147 -0
  150. package/docs/agent-vscode-code-actions.md +70 -0
  151. package/docs/agent-vscode-diff-preview.md +45 -0
  152. package/docs/agent-vscode-inline-assist.md +56 -0
  153. package/docs/agent-vscode-install.md +186 -0
  154. package/docs/agent-vscode-model-setup.md +97 -0
  155. package/docs/agent-vscode-patch-preview.md +92 -0
  156. package/docs/agent-vscode-problems.md +79 -0
  157. package/docs/agent-vscode-project-dashboard.md +106 -0
  158. package/docs/agent-vscode-run-history.md +92 -0
  159. package/docs/agent-vscode-ux.md +73 -0
  160. package/docs/ai/INVARIANTS.md +84 -0
  161. package/docs/ai/PROJECT_MAP.md +338 -0
  162. package/docs/ai/PUBLIC_API.md +336 -0
  163. package/docs/ai/VALIDATION_MATRIX.md +67 -0
  164. package/docs/api-polish.md +37 -0
  165. package/docs/cancellation.md +162 -0
  166. package/docs/coverage.md +46 -0
  167. package/docs/getting-started.md +159 -0
  168. package/docs/guides/README.md +40 -0
  169. package/docs/guides/circuit-breaker.md +89 -0
  170. package/docs/guides/error-handling.md +91 -0
  171. package/docs/guides/getting-started.md +107 -0
  172. package/docs/guides/layers.md +189 -0
  173. package/docs/guides/metrics.md +101 -0
  174. package/docs/guides/resource-management.md +141 -0
  175. package/docs/guides/retry.md +215 -0
  176. package/docs/guides/semaphore.md +66 -0
  177. package/docs/guides/streams.md +117 -0
  178. package/docs/guides/supervisors.md +98 -0
  179. package/docs/guides/testing.md +162 -0
  180. package/docs/guides/tracing.md +71 -0
  181. package/docs/http-recipes.md +399 -0
  182. package/docs/http.md +749 -0
  183. package/docs/modules.md +285 -0
  184. package/docs/observability-collector-smoke.md +31 -0
  185. package/docs/observability-framework-examples.md +98 -0
  186. package/docs/observability.md +542 -0
  187. package/docs/otel-collector-smoke.yaml +27 -0
  188. package/docs/performance-profiler.md +199 -0
  189. package/docs/production-readiness.md +73 -0
  190. package/docs/recipes/README.md +12 -0
  191. package/docs/recipes/http-server.md +45 -0
  192. package/docs/recipes/layers.md +44 -0
  193. package/docs/recipes/performance.md +47 -0
  194. package/docs/recipes/runtime.md +41 -0
  195. package/docs/recipes/testing.md +41 -0
  196. package/docs/release.md +53 -0
  197. package/docs/wasm-bounded-queues.md +44 -0
  198. package/docs/wasm-engine-observability-benchmarks.md +85 -0
  199. package/docs/wasm-fiber-engine.md +117 -0
  200. package/docs/wasm-scheduler-state-machine.md +122 -0
  201. package/docs/wasm-stream-chunks.md +54 -0
  202. package/package.json +48 -2
  203. package/dist/chunk-AR22SXML.js +0 -1043
  204. package/dist/chunk-BDYEENHT.js +0 -224
  205. package/dist/chunk-JFPU5GQI.mjs +0 -1043
  206. package/dist/chunk-MS34J5LY.cjs +0 -224
  207. package/dist/chunk-UMAZLXAB.mjs +0 -224
  208. package/dist/chunk-XPZNXSVN.cjs +0 -1043
  209. package/dist/tracing-DNT9jEbr.d.ts +0 -106
@@ -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 _chunkVN44DYYTcjs = require('../chunk-VN44DYYT.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-76YMRMH2.cjs');
28
+ require('../chunk-ENKODRU3.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 _chunkVN44DYYTcjs.profileRuntimeAb.call(void 0, cli.runtimeAb);
41
+ await printReport(cli, report2, _chunkVN44DYYTcjs.formatRuntimeAbReport.call(void 0, report2));
42
+ return;
43
+ }
44
+ if (cli.profile === "runtime-soak") {
45
+ const report2 = await _chunkVN44DYYTcjs.profileRuntimeSoak.call(void 0, cli.runtimeSoak);
46
+ await printReport(cli, report2, _chunkVN44DYYTcjs.formatRuntimeSoakReport.call(void 0, report2));
47
+ return;
48
+ }
49
+ if (cli.profile === "http-memory") {
50
+ const report2 = await _chunkVN44DYYTcjs.profileHttpMemoryLab.call(void 0, cli.httpMemory);
51
+ await printReport(cli, report2, _chunkVN44DYYTcjs.formatHttpMemoryLabReport.call(void 0, report2));
52
+ return;
53
+ }
54
+ const report = await _chunkVN44DYYTcjs.runBrassPerformanceProfile.call(void 0, cli.options);
55
+ await printReport(cli, report, _chunkVN44DYYTcjs.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 = _chunkVN44DYYTcjs.createPerfHistoryEntry.call(void 0, cli.profile, report, storeOptions);
299
+ const historyPath = config.recordHistory ? await _chunkVN44DYYTcjs.writePerfHistoryEntry.call(void 0, entry, storeOptions) : void 0;
300
+ const savedBaseline = config.saveBaseline ? await _chunkVN44DYYTcjs.savePerfBaseline.call(void 0, config.saveBaseline, entry, storeOptions) : void 0;
301
+ const loadedBaseline = config.compareBaseline ? await _chunkVN44DYYTcjs.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 ? _chunkVN44DYYTcjs.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(_chunkVN44DYYTcjs.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(_chunkVN44DYYTcjs.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