@stacknext/cli 0.0.0-stage → 0.6.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 (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -2
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +4 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/collector/server.d.ts +28 -0
  8. package/dist/collector/server.d.ts.map +1 -0
  9. package/dist/collector/server.js +1258 -0
  10. package/dist/collector/server.js.map +1 -0
  11. package/dist/collector/test-runs.d.ts +40 -0
  12. package/dist/collector/test-runs.d.ts.map +1 -0
  13. package/dist/collector/test-runs.js +153 -0
  14. package/dist/collector/test-runs.js.map +1 -0
  15. package/dist/commands/baseline.d.ts +25 -0
  16. package/dist/commands/baseline.d.ts.map +1 -0
  17. package/dist/commands/baseline.js +151 -0
  18. package/dist/commands/baseline.js.map +1 -0
  19. package/dist/commands/capture.d.ts +13 -0
  20. package/dist/commands/capture.d.ts.map +1 -0
  21. package/dist/commands/capture.js +277 -0
  22. package/dist/commands/capture.js.map +1 -0
  23. package/dist/commands/compare.d.ts +17 -0
  24. package/dist/commands/compare.d.ts.map +1 -0
  25. package/dist/commands/compare.js +95 -0
  26. package/dist/commands/compare.js.map +1 -0
  27. package/dist/commands/coverage.d.ts +9 -0
  28. package/dist/commands/coverage.d.ts.map +1 -0
  29. package/dist/commands/coverage.js +124 -0
  30. package/dist/commands/coverage.js.map +1 -0
  31. package/dist/commands/dev.d.ts +19 -0
  32. package/dist/commands/dev.d.ts.map +1 -0
  33. package/dist/commands/dev.js +296 -0
  34. package/dist/commands/dev.js.map +1 -0
  35. package/dist/commands/diagnose.d.ts +22 -0
  36. package/dist/commands/diagnose.d.ts.map +1 -0
  37. package/dist/commands/diagnose.js +235 -0
  38. package/dist/commands/diagnose.js.map +1 -0
  39. package/dist/commands/doctor.d.ts +7 -0
  40. package/dist/commands/doctor.d.ts.map +1 -0
  41. package/dist/commands/doctor.js +176 -0
  42. package/dist/commands/doctor.js.map +1 -0
  43. package/dist/commands/export.d.ts +9 -0
  44. package/dist/commands/export.d.ts.map +1 -0
  45. package/dist/commands/export.js +55 -0
  46. package/dist/commands/export.js.map +1 -0
  47. package/dist/commands/init.d.ts +11 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +203 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/mcp.d.ts +12 -0
  52. package/dist/commands/mcp.d.ts.map +1 -0
  53. package/dist/commands/mcp.js +32 -0
  54. package/dist/commands/mcp.js.map +1 -0
  55. package/dist/commands/regression-shared.d.ts +12 -0
  56. package/dist/commands/regression-shared.d.ts.map +1 -0
  57. package/dist/commands/regression-shared.js +149 -0
  58. package/dist/commands/regression-shared.js.map +1 -0
  59. package/dist/commands/runs.d.ts +13 -0
  60. package/dist/commands/runs.d.ts.map +1 -0
  61. package/dist/commands/runs.js +85 -0
  62. package/dist/commands/runs.js.map +1 -0
  63. package/dist/commands/status.d.ts +7 -0
  64. package/dist/commands/status.d.ts.map +1 -0
  65. package/dist/commands/status.js +70 -0
  66. package/dist/commands/status.js.map +1 -0
  67. package/dist/commands/uninstall.d.ts +15 -0
  68. package/dist/commands/uninstall.d.ts.map +1 -0
  69. package/dist/commands/uninstall.js +209 -0
  70. package/dist/commands/uninstall.js.map +1 -0
  71. package/dist/http.d.ts +7 -0
  72. package/dist/http.d.ts.map +1 -0
  73. package/dist/http.js +54 -0
  74. package/dist/http.js.map +1 -0
  75. package/dist/index.d.ts +22 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +22 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/output.d.ts +16 -0
  80. package/dist/output.d.ts.map +1 -0
  81. package/dist/output.js +60 -0
  82. package/dist/output.js.map +1 -0
  83. package/dist/program.d.ts +4 -0
  84. package/dist/program.d.ts.map +1 -0
  85. package/dist/program.js +54 -0
  86. package/dist/program.js.map +1 -0
  87. package/dist/project.d.ts +35 -0
  88. package/dist/project.d.ts.map +1 -0
  89. package/dist/project.js +169 -0
  90. package/dist/project.js.map +1 -0
  91. package/dist/runtime.d.ts +26 -0
  92. package/dist/runtime.d.ts.map +1 -0
  93. package/dist/runtime.js +89 -0
  94. package/dist/runtime.js.map +1 -0
  95. package/dist/session.d.ts +10 -0
  96. package/dist/session.d.ts.map +1 -0
  97. package/dist/session.js +23 -0
  98. package/dist/session.js.map +1 -0
  99. package/dist/version.d.ts +2 -0
  100. package/dist/version.d.ts.map +1 -0
  101. package/dist/version.js +2 -0
  102. package/dist/version.js.map +1 -0
  103. package/package.json +58 -3
@@ -0,0 +1,277 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { loadConfig } from '@stacknext/core/config-file';
3
+ import { buildEnvironmentSnapshot, computeRegressionStats, REGRESSION_LIMITATIONS, sanitizeCommandArg, saveRun, } from '@stacknext/regression';
4
+ import { detectProject } from '../project.js';
5
+ import { generateToken } from '../runtime.js';
6
+ import { requireRunningState } from '../session.js';
7
+ import { collectorJson } from '../http.js';
8
+ import { printBanner, printCheck, printSection, style } from '../output.js';
9
+ import { startCollector } from '../collector/server.js';
10
+ import { CLI_VERSION } from '../version.js';
11
+ import { playwrightVersion, runLines } from './regression-shared.js';
12
+ function commandSnapshot(args, result, durationMs) {
13
+ return {
14
+ executable: sanitizeCommandArg(args[0] ?? 'unknown'),
15
+ args: args.slice(1).map(sanitizeCommandArg),
16
+ exitCode: result?.code ?? null,
17
+ signal: result?.signal ?? null,
18
+ durationMs,
19
+ };
20
+ }
21
+ async function childResult(command, args, env, cwd, onSpawn, keepStdoutClean = false) {
22
+ return new Promise((resolve) => {
23
+ const child = spawn(command, args, {
24
+ cwd,
25
+ env,
26
+ stdio: keepStdoutClean ? ['inherit', 'pipe', 'inherit'] : 'inherit',
27
+ shell: process.platform === 'win32',
28
+ });
29
+ if (keepStdoutClean) {
30
+ child.stdout?.on('data', (chunk) => {
31
+ process.stderr.write(chunk);
32
+ });
33
+ }
34
+ onSpawn(child);
35
+ child.once('error', (error) => {
36
+ console.error(style.red(`Could not start capture command: ${error.message}`));
37
+ resolve({ code: 1, signal: null });
38
+ });
39
+ child.once('exit', (code, signal) => resolve({ code, signal }));
40
+ });
41
+ }
42
+ async function fallbackRun(collectorUrl, token, runId, created, status, warnings) {
43
+ try {
44
+ const live = await collectorJson(collectorUrl, `/api/test-runs/${runId}`, token);
45
+ return {
46
+ ...live,
47
+ status,
48
+ completedAt: Date.now(),
49
+ warnings: [...new Set([...live.warnings, ...warnings])].slice(-50),
50
+ stats: computeRegressionStats(live.scenarios),
51
+ };
52
+ }
53
+ catch {
54
+ return {
55
+ ...created,
56
+ id: runId,
57
+ status,
58
+ completedAt: Date.now(),
59
+ warnings: [...new Set([...created.warnings, ...warnings])].slice(-50),
60
+ limitations: [...REGRESSION_LIMITATIONS],
61
+ stats: computeRegressionStats(created.scenarios),
62
+ };
63
+ }
64
+ }
65
+ export async function runCapture(options, commandArgs, cwd = process.cwd()) {
66
+ if (commandArgs.length === 0) {
67
+ throw new Error('Provide the test command to capture after "--", for example: stacknext capture --name main -- pnpm exec playwright test');
68
+ }
69
+ const project = await detectProject(cwd);
70
+ const config = await loadConfig(project.dir);
71
+ const projectName = options.project ?? config.projectName ?? project.name;
72
+ const token = options.token ?? process.env.STACKNEXT_TOKEN;
73
+ let collector = null;
74
+ let attached = false;
75
+ let collectorUrl;
76
+ let collectorToken;
77
+ if (options.url) {
78
+ collectorUrl = options.url;
79
+ if (!token || token.length < 16) {
80
+ throw new Error('--url requires --token (or STACKNEXT_TOKEN) with at least 16 characters');
81
+ }
82
+ collectorToken = token;
83
+ }
84
+ else {
85
+ try {
86
+ const state = await requireRunningState(project.dir);
87
+ attached = true;
88
+ collectorUrl = state.collectorUrl;
89
+ collectorToken = state.token;
90
+ }
91
+ catch (error) {
92
+ if (options.attach)
93
+ throw error;
94
+ collector = await startCollector({
95
+ port: 0,
96
+ autoPort: false,
97
+ token: generateToken(),
98
+ projectName,
99
+ config,
100
+ dashboardDir: null,
101
+ projectDir: project.dir,
102
+ version: CLI_VERSION,
103
+ log: options.quiet ? undefined : (message) => console.error(style.dim(message)),
104
+ });
105
+ collectorUrl = `http://127.0.0.1:${collector.port}`;
106
+ collectorToken = collector.token;
107
+ attached = false;
108
+ }
109
+ }
110
+ const startedAt = Date.now();
111
+ let run;
112
+ try {
113
+ let health = null;
114
+ try {
115
+ health = await collectorJson(collectorUrl, '/api/health', collectorToken);
116
+ }
117
+ catch (error) {
118
+ throw new Error(`Could not reach the StackNext collector at ${collectorUrl}: ${error instanceof Error ? error.message : String(error)}`);
119
+ }
120
+ const environment = buildEnvironmentSnapshot({
121
+ config,
122
+ connections: health?.connections ?? [],
123
+ verbose: health?.instrumentation.nextOtelVerbose
124
+ ? {
125
+ enabled: health.instrumentation.nextOtelVerbose.enabled,
126
+ source: health.instrumentation.nextOtelVerbose.source,
127
+ }
128
+ : undefined,
129
+ playwrightVersion: await playwrightVersion(project.dir),
130
+ });
131
+ const request = {
132
+ name: options.name?.trim() || `capture ${new Date(startedAt).toISOString()}`,
133
+ projectName,
134
+ environment,
135
+ collectorVersion: health?.version ?? CLI_VERSION,
136
+ command: commandSnapshot(commandArgs, null, 0),
137
+ };
138
+ const created = await collectorJson(collectorUrl, '/api/test-runs', collectorToken, {
139
+ method: 'POST',
140
+ headers: { 'content-type': 'application/json' },
141
+ body: JSON.stringify(request),
142
+ });
143
+ run = created.run;
144
+ }
145
+ catch (error) {
146
+ await collector?.close();
147
+ throw error;
148
+ }
149
+ if (!options.quiet) {
150
+ printBanner(CLI_VERSION);
151
+ printSection(`Capturing ${run.name}`);
152
+ printCheck('pass', `Collector ${collectorUrl}`, attached ? 'attached to stacknext dev' : 'ephemeral');
153
+ printCheck('pass', `Run ${run.id}`);
154
+ printSection(`Running ${commandArgs.join(' ')}`);
155
+ }
156
+ let child = null;
157
+ let interruptedBy = null;
158
+ const forward = (signal) => {
159
+ interruptedBy = signal;
160
+ try {
161
+ child?.kill(signal);
162
+ }
163
+ catch {
164
+ // The child may have exited between the signal and this handler.
165
+ }
166
+ };
167
+ const onSigint = () => forward('SIGINT');
168
+ const onSigterm = () => forward('SIGTERM');
169
+ process.once('SIGINT', onSigint);
170
+ process.once('SIGTERM', onSigterm);
171
+ const env = {
172
+ ...process.env,
173
+ STACKNEXT_TEST_RUN_ID: run.id,
174
+ STACKNEXT_COLLECTOR_URL: collectorUrl,
175
+ STACKNEXT_TOKEN: collectorToken,
176
+ STACKNEXT_CAPTURE: '1',
177
+ STACKNEXT_PROJECT_NAME: projectName,
178
+ };
179
+ let result;
180
+ try {
181
+ result = await childResult(commandArgs[0] ?? '', commandArgs.slice(1), env, project.dir, (spawned) => {
182
+ child = spawned;
183
+ }, options.json === true);
184
+ }
185
+ finally {
186
+ process.off('SIGINT', onSigint);
187
+ process.off('SIGTERM', onSigterm);
188
+ }
189
+ const durationMs = Date.now() - startedAt;
190
+ run.command = commandSnapshot(commandArgs, result, durationMs);
191
+ const interrupted = interruptedBy !== null;
192
+ const requestedStatus = interrupted
193
+ ? 'interrupted'
194
+ : result.code === 0
195
+ ? 'completed'
196
+ : 'failed';
197
+ const warnings = [];
198
+ if (interruptedBy) {
199
+ warnings.push(`Capture command was interrupted by ${interruptedBy}.`);
200
+ }
201
+ if (result.signal) {
202
+ warnings.push(`Capture command exited with signal ${result.signal}.`);
203
+ }
204
+ try {
205
+ const completed = await collectorJson(collectorUrl, `/api/test-runs/${run.id}/complete`, collectorToken, {
206
+ method: 'POST',
207
+ headers: { 'content-type': 'application/json' },
208
+ body: JSON.stringify({
209
+ status: requestedStatus,
210
+ warnings,
211
+ command: commandSnapshot(commandArgs, result, durationMs),
212
+ }),
213
+ });
214
+ run = completed.run;
215
+ }
216
+ catch (error) {
217
+ warnings.push(`Collector finalization failed: ${error instanceof Error ? error.message : String(error)}`);
218
+ run = await fallbackRun(collectorUrl, collectorToken, run.id, run, 'incomplete', warnings);
219
+ }
220
+ run = {
221
+ ...run,
222
+ command: commandSnapshot(commandArgs, result, durationMs),
223
+ };
224
+ let savedPath;
225
+ try {
226
+ savedPath = await saveRun(project.dir, run);
227
+ }
228
+ finally {
229
+ await collector?.close();
230
+ }
231
+ let exitCode = result.code ?? 1;
232
+ if (interruptedBy === 'SIGINT')
233
+ exitCode = 130;
234
+ else if (interruptedBy === 'SIGTERM')
235
+ exitCode = 143;
236
+ if (exitCode === 0 && run.status !== 'completed')
237
+ exitCode = 3;
238
+ if (options.json) {
239
+ console.log(JSON.stringify({
240
+ run,
241
+ path: savedPath,
242
+ exitCode,
243
+ telemetryComplete: run.status === 'completed',
244
+ }, null, 2));
245
+ return exitCode;
246
+ }
247
+ printSection('Capture result');
248
+ console.log(runLines(run));
249
+ console.log('');
250
+ printCheck(run.status === 'completed' ? 'pass' : 'warn', `Saved ${savedPath}`, `${run.stats.verifiedSamples}/${run.stats.samples} verified samples`);
251
+ if (run.status !== 'completed') {
252
+ printCheck('warn', 'Telemetry is incomplete', 'exit code 3; no regression verdict can be inferred from this run');
253
+ }
254
+ else {
255
+ printCheck('pass', 'Next: stacknext baseline save ' + run.id + ' --name <name>');
256
+ }
257
+ return exitCode;
258
+ }
259
+ export function registerCaptureCommand(program, cwd) {
260
+ program
261
+ .command('capture')
262
+ .description('Run a Playwright command and save correlated runtime telemetry as a test run')
263
+ .option('--name <name>', 'human-readable run name')
264
+ .option('--project <name>', 'StackNext project name override')
265
+ .option('--attach', 'require an existing stacknext dev collector')
266
+ .option('--url <url>', 'attach to a specific loopback collector URL')
267
+ .option('--token <token>', 'collector bearer token for --url')
268
+ .option('--json', 'print machine-readable JSON')
269
+ .option('--quiet', 'reduce capture output')
270
+ .argument('[command...]', 'test command to run (pass after --)')
271
+ .action(async (commandArgs, options) => {
272
+ const code = await runCapture(options, commandArgs, cwd);
273
+ if (code !== 0)
274
+ process.exitCode = code;
275
+ });
276
+ }
277
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Command } from 'commander';
2
+ export type FailOn = 'regression' | 'inconclusive' | 'any';
3
+ export interface CompareOptions {
4
+ json?: boolean;
5
+ ignoreEnvironment?: boolean;
6
+ minSamples?: string;
7
+ durationRegressionPct?: string;
8
+ durationRegressionMs?: string;
9
+ durationImprovementPct?: string;
10
+ durationImprovementMs?: string;
11
+ countRegressionMin?: string;
12
+ failOn?: string;
13
+ save?: boolean;
14
+ }
15
+ export declare function runCompare(baselineId: string, candidateId: string, options: CompareOptions, cwd?: string): Promise<number>;
16
+ export declare function registerCompareCommand(program: Command, cwd: string): void;
17
+ //# sourceMappingURL=compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/commands/compare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcxC,MAAM,MAAM,MAAM,GAAG,YAAY,GAAG,cAAc,GAAG,KAAK,CAAA;AAE1D,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAuBD,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,cAAc,EACvB,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAsFjB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CA0B1E"}
@@ -0,0 +1,95 @@
1
+ import { compareBaseline, DEFAULT_COMPARISON_OPTIONS, loadBaseline, loadRun, saveComparison, } from '@stacknext/regression';
2
+ import { printBanner, style } from '../output.js';
3
+ import { detectProject } from '../project.js';
4
+ import { CLI_VERSION } from '../version.js';
5
+ import { comparisonLines } from './regression-shared.js';
6
+ function parseNumber(value, fallback, label, integer = false) {
7
+ if (value === undefined)
8
+ return fallback;
9
+ const parsed = Number(value);
10
+ if (!Number.isFinite(parsed) || parsed < 0 || (integer && !Number.isInteger(parsed))) {
11
+ throw new Error(`Invalid ${label} "${value}"`);
12
+ }
13
+ return parsed;
14
+ }
15
+ function parseFailOn(value) {
16
+ if (!value)
17
+ return null;
18
+ if (value === 'regression' || value === 'regressed')
19
+ return 'regression';
20
+ if (value === 'inconclusive' || value === 'any')
21
+ return value;
22
+ throw new Error('Invalid --fail-on value. Use regression, inconclusive or any.');
23
+ }
24
+ export async function runCompare(baselineId, candidateId, options, cwd = process.cwd()) {
25
+ if (!/^base-[0-9a-f]{16}$/.test(baselineId)) {
26
+ throw new Error(`Invalid baseline id "${baselineId}"`);
27
+ }
28
+ if (!/^run-[0-9a-f]{16}$/.test(candidateId)) {
29
+ throw new Error(`Invalid candidate run id "${candidateId}"`);
30
+ }
31
+ const project = await detectProject(cwd);
32
+ const [baseline, candidate] = await Promise.all([
33
+ loadBaseline(project.dir, baselineId),
34
+ loadRun(project.dir, candidateId),
35
+ ]);
36
+ const comparisonOptions = {
37
+ minSamples: parseNumber(options.minSamples, DEFAULT_COMPARISON_OPTIONS.minSamples, 'min-samples', true),
38
+ durationRegressionPct: parseNumber(options.durationRegressionPct, DEFAULT_COMPARISON_OPTIONS.durationRegressionPct, 'duration-regression-pct'),
39
+ durationRegressionMs: parseNumber(options.durationRegressionMs, DEFAULT_COMPARISON_OPTIONS.durationRegressionMs, 'duration-regression-ms'),
40
+ durationImprovementPct: parseNumber(options.durationImprovementPct, DEFAULT_COMPARISON_OPTIONS.durationImprovementPct, 'duration-improvement-pct'),
41
+ durationImprovementMs: parseNumber(options.durationImprovementMs, DEFAULT_COMPARISON_OPTIONS.durationImprovementMs, 'duration-improvement-ms'),
42
+ countRegressionMin: parseNumber(options.countRegressionMin, DEFAULT_COMPARISON_OPTIONS.countRegressionMin, 'count-regression-min', true),
43
+ ignoreEnvironment: options.ignoreEnvironment ?? false,
44
+ };
45
+ const failOn = parseFailOn(options.failOn);
46
+ const comparison = compareBaseline(baseline, candidate, comparisonOptions);
47
+ const savedPath = options.save === false ? null : await saveComparison(project.dir, comparison);
48
+ const failed = (failOn === 'regression' && comparison.status === 'regressed') ||
49
+ (failOn === 'inconclusive' && comparison.status === 'inconclusive') ||
50
+ (failOn === 'any' &&
51
+ (comparison.status === 'regressed' || comparison.status === 'inconclusive'));
52
+ const exitCode = failed ? 1 : 0;
53
+ if (options.json) {
54
+ console.log(JSON.stringify({ comparison, path: savedPath, exitCode }, null, 2));
55
+ return exitCode;
56
+ }
57
+ printBanner(CLI_VERSION);
58
+ console.log(comparisonLines(comparison));
59
+ console.log('');
60
+ if (savedPath)
61
+ console.log(style.dim(`Saved comparison ${savedPath}`));
62
+ if (comparison.status === 'inconclusive') {
63
+ console.log(style.yellow('Inconclusive: no regression verdict is inferred. Fix environment, sample or correlation warnings before comparing again.'));
64
+ }
65
+ if (exitCode !== 0) {
66
+ console.log(style.red(`Failing because --fail-on ${failOn} matched ${comparison.status}.`));
67
+ }
68
+ else if (!failOn) {
69
+ console.log(style.dim('Report-only: use --fail-on regression to make CI fail on regressions.'));
70
+ }
71
+ return exitCode;
72
+ }
73
+ export function registerCompareCommand(program, cwd) {
74
+ program
75
+ .command('compare')
76
+ .description('Compare a saved baseline with a candidate run')
77
+ .argument('<baseline-id>', 'baseline id (base-...)')
78
+ .argument('<candidate-run-id>', 'candidate run id (run-...)')
79
+ .option('--json', 'print machine-readable JSON')
80
+ .option('--ignore-environment', 'compare despite environment differences (reported with a warning)')
81
+ .option('--min-samples <number>', 'minimum verified samples per side (default 3)')
82
+ .option('--duration-regression-pct <number>', 'duration regression percent threshold (default 20)')
83
+ .option('--duration-regression-ms <number>', 'duration regression absolute threshold in ms (default 25)')
84
+ .option('--duration-improvement-pct <number>', 'duration improvement percent threshold (default 20)')
85
+ .option('--duration-improvement-ms <number>', 'duration improvement absolute threshold in ms (default 25)')
86
+ .option('--count-regression-min <number>', 'minimum query/span/error count increase (default 1)')
87
+ .option('--fail-on <status>', 'exit 1 when comparison is regression, inconclusive or any')
88
+ .option('--no-save', 'do not persist the comparison')
89
+ .action(async (baselineId, candidateId, options) => {
90
+ const code = await runCompare(baselineId, candidateId, options, cwd);
91
+ if (code !== 0)
92
+ process.exitCode = code;
93
+ });
94
+ }
95
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/commands/compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Command } from 'commander';
2
+ import type { CoverageReport } from '@stacknext/core';
3
+ export interface CoverageOptions {
4
+ json?: boolean;
5
+ }
6
+ export declare function formatCoverageReport(report: CoverageReport): string;
7
+ export declare function runCoverage(options: CoverageOptions, cwd?: string): Promise<number>;
8
+ export declare function registerCoverageCommand(program: Command, cwd: string): void;
9
+ //# sourceMappingURL=coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/commands/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,EAAgB,cAAc,EAAkB,MAAM,iBAAiB,CAAA;AAMnF,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAmDD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CA0DnE;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,eAAe,EACxB,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAS3E"}
@@ -0,0 +1,124 @@
1
+ import { collectorJson } from '../http.js';
2
+ import { formatRelativeTime, printBanner, style } from '../output.js';
3
+ import { requireRunningState } from '../session.js';
4
+ import { CLI_VERSION } from '../version.js';
5
+ const STATUS_ORDER = [
6
+ 'observed',
7
+ 'active',
8
+ 'configured',
9
+ 'not-observed',
10
+ 'unknown',
11
+ 'unsupported',
12
+ ];
13
+ const STATUS_LABELS = {
14
+ observed: 'Observed in this sample',
15
+ active: 'Active, not exercised yet',
16
+ configured: 'Configured, no app connected',
17
+ 'not-observed': 'Not observed in this sample',
18
+ unknown: 'Cannot be determined',
19
+ unsupported: 'Not supported',
20
+ };
21
+ function marker(status) {
22
+ switch (status) {
23
+ case 'observed':
24
+ return style.green('✓');
25
+ case 'active':
26
+ case 'configured':
27
+ return style.cyan('·');
28
+ case 'not-observed':
29
+ case 'unknown':
30
+ return style.yellow('!');
31
+ case 'unsupported':
32
+ return style.dim('—');
33
+ }
34
+ }
35
+ function formatEvidence(item, now) {
36
+ const parts = [];
37
+ if (item.evidence.count > 0) {
38
+ parts.push(`${item.evidence.count} ${item.evidence.count === 1 ? 'event' : 'events'}`);
39
+ }
40
+ if (item.evidence.lastSeen !== null) {
41
+ parts.push(`last ${formatRelativeTime(item.evidence.lastSeen, now)}`);
42
+ }
43
+ if (item.evidence.spanTypes.length > 0) {
44
+ parts.push(item.evidence.spanTypes.slice(0, 4).join(', '));
45
+ }
46
+ return parts.join(' · ');
47
+ }
48
+ export function formatCoverageReport(report) {
49
+ const lines = [];
50
+ const first = report.sample.firstEventTime;
51
+ const last = report.sample.lastEventTime;
52
+ lines.push(`${style.bold('StackNext coverage')} ${style.dim(`v${report.collectorVersion}`)} — ${report.projectName}`);
53
+ lines.push(`Sample ${report.sample.requests} requests, ${report.sample.spans} spans, ${report.sample.errors} errors, ${report.sample.databaseQueries} database queries`);
54
+ lines.push(`Window ${first === null || last === null
55
+ ? 'no events yet'
56
+ : `${new Date(first).toISOString()} → ${new Date(last).toISOString()}`} ${style.dim(`(retention ${Math.round(report.sample.retentionMs / 1000)}s)`)}`);
57
+ lines.push(`Connection ${report.sample.connected
58
+ ? style.green(`connected (${report.sample.connectedInstances} instance(s))`)
59
+ : style.yellow('no app is currently connected')}`);
60
+ lines.push(`Statuses ${STATUS_ORDER.filter((status) => report.statusCounts[status] > 0)
61
+ .map((status) => `${status} ${report.statusCounts[status]}`)
62
+ .join(', ')}`);
63
+ lines.push(style.dim('Coverage is evidence from the current retention window, not a score.'));
64
+ for (const status of STATUS_ORDER) {
65
+ const items = report.items.filter((item) => item.status === status);
66
+ if (items.length === 0)
67
+ continue;
68
+ lines.push('');
69
+ lines.push(`${style.bold(STATUS_LABELS[status])}`);
70
+ for (const item of items) {
71
+ const evidence = formatEvidence(item, report.generatedAt);
72
+ lines.push(`${marker(status)} ${item.label} ${style.dim(`[${item.category}]`)}${evidence ? style.dim(` — ${evidence}`) : ''}`);
73
+ if (status === 'not-observed' || status === 'unknown' || status === 'unsupported') {
74
+ for (const limitation of item.limitations.slice(0, 2)) {
75
+ lines.push(style.dim(` ${limitation}`));
76
+ }
77
+ }
78
+ }
79
+ }
80
+ if (report.notes.length > 0) {
81
+ lines.push('');
82
+ lines.push(style.bold('Notes'));
83
+ for (const note of report.notes)
84
+ lines.push(`· ${note}`);
85
+ }
86
+ lines.push('');
87
+ lines.push(style.bold('Limitations'));
88
+ for (const limitation of report.limitations)
89
+ lines.push(style.dim(`· ${limitation}`));
90
+ return lines.join('\n');
91
+ }
92
+ export async function runCoverage(options, cwd = process.cwd()) {
93
+ const state = await requireRunningState(cwd);
94
+ let report;
95
+ try {
96
+ report = await collectorJson(state.collectorUrl, '/api/coverage', state.token);
97
+ }
98
+ catch (error) {
99
+ if (!options.json) {
100
+ printBanner(CLI_VERSION);
101
+ console.error(`${style.red('Coverage unavailable')} — ${error instanceof Error ? error.message : String(error)}`);
102
+ }
103
+ return 1;
104
+ }
105
+ if (options.json) {
106
+ console.log(JSON.stringify(report, null, 2));
107
+ }
108
+ else {
109
+ console.log(formatCoverageReport(report));
110
+ }
111
+ return 0;
112
+ }
113
+ export function registerCoverageCommand(program, cwd) {
114
+ program
115
+ .command('coverage')
116
+ .description('Show observed instrumentation coverage for the current sample')
117
+ .option('--json', 'print machine-readable JSON')
118
+ .action(async (options) => {
119
+ const code = await runCoverage(options, cwd);
120
+ if (code !== 0)
121
+ process.exitCode = code;
122
+ });
123
+ }
124
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/commands/coverage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAM3C,MAAM,YAAY,GAAqB;IACrC,UAAU;IACV,QAAQ;IACR,YAAY;IACZ,cAAc;IACd,SAAS;IACT,aAAa;CACd,CAAA;AAED,MAAM,aAAa,GAAmC;IACpD,QAAQ,EAAE,yBAAyB;IACnC,MAAM,EAAE,2BAA2B;IACnC,UAAU,EAAE,8BAA8B;IAC1C,cAAc,EAAE,6BAA6B;IAC7C,OAAO,EAAE,sBAAsB;IAC/B,WAAW,EAAE,eAAe;CAC7B,CAAA;AAED,SAAS,MAAM,CAAC,MAAsB;IACpC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACzB,KAAK,QAAQ,CAAC;QACd,KAAK,YAAY;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACxB,KAAK,cAAc,CAAC;QACpB,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC1B,KAAK,aAAa;YAChB,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACzB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAkB,EAAE,GAAW;IACrD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CACR,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAC3E,CAAA;IACH,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,QAAQ,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;IACvE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAsB;IACzD,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,cAAc,CAAA;IAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAA;IACxC,KAAK,CAAC,IAAI,CACR,GAAG,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAC1G,CAAA;IACD,KAAK,CAAC,IAAI,CACR,eAAe,MAAM,CAAC,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,MAAM,CAAC,eAAe,mBAAmB,CAClK,CAAA;IACD,KAAK,CAAC,IAAI,CACR,eACE,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;QAC7B,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EACxE,IAAI,KAAK,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAChF,CAAA;IACD,KAAK,CAAC,IAAI,CACR,eACE,MAAM,CAAC,MAAM,CAAC,SAAS;QACrB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,MAAM,CAAC,kBAAkB,eAAe,CAAC;QAC5E,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,+BAA+B,CAClD,EAAE,CACH,CAAA;IACD,KAAK,CAAC,IAAI,CACR,eAAe,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC5E,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;SAC3D,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC,CAAA;IAE7F,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;QACnE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAA;QAClD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAA;YACzD,KAAK,CAAC,IAAI,CACR,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CACnH,CAAA;YACD,IAAI,MAAM,KAAK,cAAc,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;gBAClF,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACtD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC,CAAA;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;QAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;IAC1D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACd,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;IACrC,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAA;IACrF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAwB,EACxB,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAEnB,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAA;IAC5C,IAAI,MAAsB,CAAA;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,aAAa,CAC1B,KAAK,CAAC,YAAY,EAClB,eAAe,EACf,KAAK,CAAC,KAAK,CACZ,CAAA;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAClB,WAAW,CAAC,WAAW,CAAC,CAAA;YACxB,OAAO,CAAC,KAAK,CACX,GAAG,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACnG,CAAA;QACH,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAgB,EAAE,GAAW;IACnE,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,QAAQ,EAAE,6BAA6B,CAAC;SAC/C,MAAM,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAC5C,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;IACzC,CAAC,CAAC,CAAA;AACN,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { Command } from 'commander';
2
+ import { type ProjectInfo } from '../project.js';
3
+ export interface DevOptions {
4
+ open?: boolean;
5
+ quiet?: boolean;
6
+ token?: string;
7
+ }
8
+ export declare function buildDevEnvironment(base: NodeJS.ProcessEnv, collectorUrl: string, token: string, projectName: string, nextVersion: string | null, debug?: boolean, instrumentation?: {
9
+ captureFetch: boolean;
10
+ captureErrors: boolean;
11
+ verbose: boolean;
12
+ }): NodeJS.ProcessEnv;
13
+ export declare function nextDevCommand(project: Pick<ProjectInfo, 'packageManager'>, nextArgs: string[]): {
14
+ command: string;
15
+ args: string[];
16
+ };
17
+ export declare function runDev(options: DevOptions, nextArgs: string[], cwd?: string): Promise<number>;
18
+ export declare function registerDevCommand(program: Command, cwd: string): void;
19
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,eAAe,CAAA;AActB,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAiBD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,KAAK,UAAQ,EACb,eAAe,CAAC,EAAE;IAAE,YAAY,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GACpF,MAAM,CAAC,UAAU,CAoBnB;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,EAC5C,QAAQ,EAAE,MAAM,EAAE,GACjB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAOrC;AAaD,wBAAsB,MAAM,CAC1B,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAmLjB;AA4ED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAYtE"}