@ls-stack/agent-eval 0.9.0 → 0.11.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.
- package/dist/{app-hkNNN_jn.mjs → app-DI3IUGb_.mjs} +5 -4
- package/dist/apps/web/dist/assets/index-BZ60j9UY.css +1 -0
- package/dist/apps/web/dist/assets/index-CsSDwFI1.js +113 -0
- package/dist/apps/web/dist/index.html +2 -2
- package/dist/bin.mjs +1 -1
- package/dist/{cli-DrPk66xh.mjs → cli-COzPxKg2.mjs} +8 -3
- package/dist/index.d.mts +304 -25
- package/dist/index.mjs +4 -4
- package/dist/runChild.mjs +1 -1
- package/dist/{runOrchestration-DA4Rh5g0.mjs → runOrchestration-COFhQvTJ.mjs} +257 -24
- package/dist/{runner-DTP5Ui4_.mjs → runner-nQjuRZGC.mjs} +2 -2
- package/dist/{runner-BzT3B9OF.mjs → runner-sMZXoDp3.mjs} +1 -1
- package/dist/src-OZSs693X.mjs +3 -0
- package/package.json +3 -3
- package/dist/apps/web/dist/assets/index-ChgByJbI.css +0 -1
- package/dist/apps/web/dist/assets/index-CmY0_D5Z.js +0 -113
- package/dist/src-CfprG1RW.mjs +0 -3
|
@@ -105,6 +105,8 @@ function setScopeCacheContext(scope, context) {
|
|
|
105
105
|
async function runInEvalScope(caseId, fn, options = {}) {
|
|
106
106
|
const scope = {
|
|
107
107
|
caseId,
|
|
108
|
+
idPrefix: options.idPrefix,
|
|
109
|
+
nextEvalIdCounter: 0,
|
|
108
110
|
input: options.input,
|
|
109
111
|
outputs: {},
|
|
110
112
|
assertionFailures: [],
|
|
@@ -138,6 +140,21 @@ async function runInEvalScope(caseId, fn, options = {}) {
|
|
|
138
140
|
activeEvalScopeCount--;
|
|
139
141
|
}
|
|
140
142
|
}
|
|
143
|
+
/**
|
|
144
|
+
* Return the next deterministic ID for the active eval case execution.
|
|
145
|
+
*
|
|
146
|
+
* The runner derives the ID prefix from the eval file, eval id, and case id,
|
|
147
|
+
* then this helper appends a per-scope sequence number. Calls outside an
|
|
148
|
+
* active eval case scope throw so accidental product-code usage is caught
|
|
149
|
+
* immediately.
|
|
150
|
+
*/
|
|
151
|
+
function nextEvalId() {
|
|
152
|
+
const scope = getCurrentScope();
|
|
153
|
+
if (!scope) throw new Error("nextEvalId() must be called inside an active eval case");
|
|
154
|
+
if (scope.idPrefix === void 0) throw new Error("nextEvalId() requires a runner-provided eval id prefix");
|
|
155
|
+
scope.nextEvalIdCounter++;
|
|
156
|
+
return `${scope.idPrefix}-${scope.nextEvalIdCounter}`;
|
|
157
|
+
}
|
|
141
158
|
function recordOpIfActive(scope, op) {
|
|
142
159
|
if (scope.replayingDepth > 0) return;
|
|
143
160
|
const top = scope.recordingStack.at(-1);
|
|
@@ -3602,8 +3619,12 @@ const llmCallMetricFormatSchema = z.enum([
|
|
|
3602
3619
|
"json",
|
|
3603
3620
|
"boolean"
|
|
3604
3621
|
]);
|
|
3622
|
+
/** Render formats supported by an API-call metric in the UI. */
|
|
3623
|
+
const apiCallMetricFormatSchema = llmCallMetricFormatSchema;
|
|
3605
3624
|
/** Where an LLM-call metric is rendered inside the LLM calls tab. */
|
|
3606
3625
|
const llmCallMetricPlacementSchema = z.enum(["header", "body"]);
|
|
3626
|
+
/** Where an API-call metric is rendered inside the API calls tab. */
|
|
3627
|
+
const apiCallMetricPlacementSchema = llmCallMetricPlacementSchema;
|
|
3607
3628
|
/**
|
|
3608
3629
|
* Schema for a single user-defined metric attached to LLM call rows.
|
|
3609
3630
|
*
|
|
@@ -3633,6 +3654,34 @@ const llmCallMetricSchema = z.object({
|
|
|
3633
3654
|
*/
|
|
3634
3655
|
placements: z.array(llmCallMetricPlacementSchema).nonempty().optional()
|
|
3635
3656
|
});
|
|
3657
|
+
/**
|
|
3658
|
+
* Schema for a single user-defined metric attached to API call rows.
|
|
3659
|
+
*
|
|
3660
|
+
* Each metric reads `path` from the span's `attributes` and renders the value
|
|
3661
|
+
* with the configured `format` and `numberFormat`. `placements` controls
|
|
3662
|
+
* whether the metric appears as a chip on the collapsed row header, as a row
|
|
3663
|
+
* inside the expanded body, or both. Defaults to `['body']` when omitted.
|
|
3664
|
+
*/
|
|
3665
|
+
const apiCallMetricSchema = z.object({
|
|
3666
|
+
/** Display label for the metric row or header chip. */
|
|
3667
|
+
label: z.string().min(1),
|
|
3668
|
+
/**
|
|
3669
|
+
* Optional hover tooltip shown on the metric. Useful when `label` is a
|
|
3670
|
+
* compact abbreviation and the full meaning needs to be surfaced on hover.
|
|
3671
|
+
*/
|
|
3672
|
+
tooltip: z.string().min(1).optional(),
|
|
3673
|
+
/** Dot-path inside `span.attributes` used to read the value. */
|
|
3674
|
+
path: z.string().min(1),
|
|
3675
|
+
/** Render hint applied to the resolved value. Defaults to `'string'`. */
|
|
3676
|
+
format: apiCallMetricFormatSchema.optional(),
|
|
3677
|
+
/** Number presentation options applied when `format: 'number'`. */
|
|
3678
|
+
numberFormat: numberDisplayOptionsSchema.optional(),
|
|
3679
|
+
/**
|
|
3680
|
+
* Where the metric should appear in the API calls tab. Defaults to
|
|
3681
|
+
* `['body']` so metrics surface inside the expanded detail view only.
|
|
3682
|
+
*/
|
|
3683
|
+
placements: z.array(apiCallMetricPlacementSchema).nonempty().optional()
|
|
3684
|
+
});
|
|
3636
3685
|
/** Schema for the global LLM calls config block in `agent-evals.config.ts`. */
|
|
3637
3686
|
const llmCallsConfigSchema = z.object({
|
|
3638
3687
|
/** Span kinds treated as LLM calls. Defaults to `['llm']`. */
|
|
@@ -3671,6 +3720,30 @@ const llmCallsConfigSchema = z.object({
|
|
|
3671
3720
|
/** Custom user-defined metrics surfaced on each LLM call. */
|
|
3672
3721
|
metrics: z.array(llmCallMetricSchema).optional()
|
|
3673
3722
|
});
|
|
3723
|
+
/** Schema for the global API calls config block in `agent-evals.config.ts`. */
|
|
3724
|
+
const apiCallsConfigSchema = z.object({
|
|
3725
|
+
/** Span kinds treated as API calls. Defaults to common API/HTTP kinds. */
|
|
3726
|
+
kinds: z.array(z.string().min(1)).optional(),
|
|
3727
|
+
/**
|
|
3728
|
+
* Attribute paths used to extract structured per-call fields. Each entry is
|
|
3729
|
+
* a dot-path inside `span.attributes`. Missing paths fall back to the
|
|
3730
|
+
* built-in defaults such as `method`, `url`, and `statusCode`.
|
|
3731
|
+
*/
|
|
3732
|
+
attributes: z.object({
|
|
3733
|
+
method: z.string().optional(),
|
|
3734
|
+
url: z.string().optional(),
|
|
3735
|
+
statusCode: z.string().optional(),
|
|
3736
|
+
request: z.string().optional(),
|
|
3737
|
+
response: z.string().optional(),
|
|
3738
|
+
requestBody: z.string().optional(),
|
|
3739
|
+
responseBody: z.string().optional(),
|
|
3740
|
+
headers: z.string().optional(),
|
|
3741
|
+
durationMs: z.string().optional(),
|
|
3742
|
+
error: z.string().optional()
|
|
3743
|
+
}).optional(),
|
|
3744
|
+
/** Custom user-defined metrics surfaced on each API call. */
|
|
3745
|
+
metrics: z.array(apiCallMetricSchema).optional()
|
|
3746
|
+
});
|
|
3674
3747
|
/** Default LLM-calls config the UI uses before the workspace fetch resolves. */
|
|
3675
3748
|
const DEFAULT_LLM_CALLS_CONFIG = {
|
|
3676
3749
|
kinds: ["llm"],
|
|
@@ -3698,6 +3771,28 @@ const DEFAULT_LLM_CALLS_CONFIG = {
|
|
|
3698
3771
|
},
|
|
3699
3772
|
metrics: []
|
|
3700
3773
|
};
|
|
3774
|
+
/** Default API-calls config the UI uses before the workspace fetch resolves. */
|
|
3775
|
+
const DEFAULT_API_CALLS_CONFIG = {
|
|
3776
|
+
kinds: [
|
|
3777
|
+
"api",
|
|
3778
|
+
"http",
|
|
3779
|
+
"http.client",
|
|
3780
|
+
"fetch"
|
|
3781
|
+
],
|
|
3782
|
+
attributes: {
|
|
3783
|
+
method: "method",
|
|
3784
|
+
url: "url",
|
|
3785
|
+
statusCode: "statusCode",
|
|
3786
|
+
request: "request",
|
|
3787
|
+
response: "response",
|
|
3788
|
+
requestBody: "requestBody",
|
|
3789
|
+
responseBody: "responseBody",
|
|
3790
|
+
headers: "headers",
|
|
3791
|
+
durationMs: "durationMs",
|
|
3792
|
+
error: "error"
|
|
3793
|
+
},
|
|
3794
|
+
metrics: []
|
|
3795
|
+
};
|
|
3701
3796
|
/**
|
|
3702
3797
|
* Resolve the user-authored LLM-calls config to a fully-defaulted shape used
|
|
3703
3798
|
* by the UI to derive the LLM calls tab.
|
|
@@ -3725,6 +3820,33 @@ function resolveLlmCallsConfig(input) {
|
|
|
3725
3820
|
}))
|
|
3726
3821
|
};
|
|
3727
3822
|
}
|
|
3823
|
+
/**
|
|
3824
|
+
* Resolve the user-authored API-calls config to a fully-defaulted shape used
|
|
3825
|
+
* by the UI to derive the API calls tab.
|
|
3826
|
+
*
|
|
3827
|
+
* - Missing or empty `kinds` falls back to common API/HTTP span kinds.
|
|
3828
|
+
* - Missing `attributes.<field>` falls back to the corresponding default
|
|
3829
|
+
* attribute path.
|
|
3830
|
+
* - Missing `metrics[].format` defaults to `'string'`.
|
|
3831
|
+
* - Missing `metrics[].placements` defaults to `['body']`.
|
|
3832
|
+
*/
|
|
3833
|
+
function resolveApiCallsConfig(input) {
|
|
3834
|
+
return {
|
|
3835
|
+
kinds: input?.kinds && input.kinds.length > 0 ? [...input.kinds] : [...DEFAULT_API_CALLS_CONFIG.kinds],
|
|
3836
|
+
attributes: {
|
|
3837
|
+
...DEFAULT_API_CALLS_CONFIG.attributes,
|
|
3838
|
+
...input?.attributes
|
|
3839
|
+
},
|
|
3840
|
+
metrics: (input?.metrics ?? []).map((m) => ({
|
|
3841
|
+
label: m.label,
|
|
3842
|
+
tooltip: m.tooltip,
|
|
3843
|
+
path: m.path,
|
|
3844
|
+
format: m.format ?? "string",
|
|
3845
|
+
numberFormat: m.numberFormat,
|
|
3846
|
+
placements: m.placements ? [...m.placements] : ["body"]
|
|
3847
|
+
}))
|
|
3848
|
+
};
|
|
3849
|
+
}
|
|
3728
3850
|
/** Zod schema for validating `agent-evals.config.ts` input. */
|
|
3729
3851
|
const agentEvalsConfigSchema = z.object({
|
|
3730
3852
|
workspaceRoot: z.string().optional(),
|
|
@@ -3735,6 +3857,7 @@ const agentEvalsConfigSchema = z.object({
|
|
|
3735
3857
|
staleAfterDays: z.number().optional(),
|
|
3736
3858
|
traceDisplay: traceDisplayInputConfigSchema.optional(),
|
|
3737
3859
|
llmCalls: llmCallsConfigSchema.optional(),
|
|
3860
|
+
apiCalls: apiCallsConfigSchema.optional(),
|
|
3738
3861
|
cache: z.object({
|
|
3739
3862
|
enabled: z.boolean().optional(),
|
|
3740
3863
|
dir: z.string().optional(),
|
|
@@ -3960,15 +4083,15 @@ function getNestedAttribute(value, path) {
|
|
|
3960
4083
|
}
|
|
3961
4084
|
//#endregion
|
|
3962
4085
|
//#region ../shared/src/utils/extractLlmCalls.ts
|
|
3963
|
-
function readNumber$
|
|
4086
|
+
function readNumber$2(attributes, path) {
|
|
3964
4087
|
const raw = getNestedAttribute(attributes, path);
|
|
3965
4088
|
return typeof raw === "number" && Number.isFinite(raw) ? raw : null;
|
|
3966
4089
|
}
|
|
3967
|
-
function readString$
|
|
4090
|
+
function readString$2(attributes, path) {
|
|
3968
4091
|
const raw = getNestedAttribute(attributes, path);
|
|
3969
4092
|
return typeof raw === "string" && raw.length > 0 ? raw : null;
|
|
3970
4093
|
}
|
|
3971
|
-
function computeLatencyMs(span) {
|
|
4094
|
+
function computeLatencyMs$1(span) {
|
|
3972
4095
|
if (span.endedAt === null) return null;
|
|
3973
4096
|
const started = Date.parse(span.startedAt);
|
|
3974
4097
|
const ended = Date.parse(span.endedAt);
|
|
@@ -3996,13 +4119,13 @@ function readSteps(attributes, path) {
|
|
|
3996
4119
|
stepDetails: null
|
|
3997
4120
|
};
|
|
3998
4121
|
}
|
|
3999
|
-
function collectWarnings(span) {
|
|
4122
|
+
function collectWarnings$1(span) {
|
|
4000
4123
|
const out = [];
|
|
4001
4124
|
if (span.warning) out.push(span.warning);
|
|
4002
4125
|
if (span.warnings) out.push(...span.warnings);
|
|
4003
4126
|
return out;
|
|
4004
4127
|
}
|
|
4005
|
-
function pickError(span) {
|
|
4128
|
+
function pickError$1(span) {
|
|
4006
4129
|
if (span.error) return span.error;
|
|
4007
4130
|
if (span.errors && span.errors.length > 0) return span.errors[0] ?? null;
|
|
4008
4131
|
return null;
|
|
@@ -4030,12 +4153,12 @@ function extractLlmCalls(spans, config) {
|
|
|
4030
4153
|
for (const span of spans) {
|
|
4031
4154
|
if (!kindSet.has(span.kind)) continue;
|
|
4032
4155
|
const attrs = span.attributes;
|
|
4033
|
-
const inputTokens = readNumber$
|
|
4034
|
-
const outputTokens = readNumber$
|
|
4035
|
-
const cachedInputTokens = readNumber$
|
|
4036
|
-
const cacheCreationInputTokens = readNumber$
|
|
4037
|
-
const reasoningTokens = readNumber$
|
|
4038
|
-
const declaredTotalTokens = readNumber$
|
|
4156
|
+
const inputTokens = readNumber$2(attrs, config.attributes.inputTokens);
|
|
4157
|
+
const outputTokens = readNumber$2(attrs, config.attributes.outputTokens);
|
|
4158
|
+
const cachedInputTokens = readNumber$2(attrs, config.attributes.cachedInputTokens);
|
|
4159
|
+
const cacheCreationInputTokens = readNumber$2(attrs, config.attributes.cacheCreationInputTokens);
|
|
4160
|
+
const reasoningTokens = readNumber$2(attrs, config.attributes.reasoningTokens);
|
|
4161
|
+
const declaredTotalTokens = readNumber$2(attrs, config.attributes.totalTokens);
|
|
4039
4162
|
const metrics = [];
|
|
4040
4163
|
for (const metric of config.metrics) {
|
|
4041
4164
|
const rawValue = getNestedAttribute(attrs, metric.path);
|
|
@@ -4054,8 +4177,8 @@ function extractLlmCalls(spans, config) {
|
|
|
4054
4177
|
name: span.name,
|
|
4055
4178
|
kind: span.kind,
|
|
4056
4179
|
status: span.status,
|
|
4057
|
-
model: readString$
|
|
4058
|
-
provider: readString$
|
|
4180
|
+
model: readString$2(attrs, config.attributes.model),
|
|
4181
|
+
provider: readString$2(attrs, config.attributes.provider),
|
|
4059
4182
|
inputTokens,
|
|
4060
4183
|
outputTokens,
|
|
4061
4184
|
cachedInputTokens,
|
|
@@ -4068,20 +4191,105 @@ function extractLlmCalls(spans, config) {
|
|
|
4068
4191
|
cached: cachedInputTokens,
|
|
4069
4192
|
cacheCreation: cacheCreationInputTokens
|
|
4070
4193
|
}),
|
|
4071
|
-
costUsd: readNumber$
|
|
4072
|
-
inputCostUsd: readNumber$
|
|
4073
|
-
outputCostUsd: readNumber$
|
|
4074
|
-
cachedInputCostUsd: readNumber$
|
|
4075
|
-
cacheCreationInputCostUsd: readNumber$
|
|
4076
|
-
reasoningCostUsd: readNumber$
|
|
4194
|
+
costUsd: readNumber$2(attrs, config.attributes.cost),
|
|
4195
|
+
inputCostUsd: readNumber$2(attrs, config.attributes.inputCost),
|
|
4196
|
+
outputCostUsd: readNumber$2(attrs, config.attributes.outputCost),
|
|
4197
|
+
cachedInputCostUsd: readNumber$2(attrs, config.attributes.cachedInputCost),
|
|
4198
|
+
cacheCreationInputCostUsd: readNumber$2(attrs, config.attributes.cacheCreationInputCost),
|
|
4199
|
+
reasoningCostUsd: readNumber$2(attrs, config.attributes.reasoningCost),
|
|
4077
4200
|
...readSteps(attrs, config.attributes.steps),
|
|
4078
|
-
finishReason: readString$
|
|
4079
|
-
latencyMs: computeLatencyMs(span),
|
|
4201
|
+
finishReason: readString$2(attrs, config.attributes.finishReason),
|
|
4202
|
+
latencyMs: computeLatencyMs$1(span),
|
|
4080
4203
|
input: getNestedAttribute(attrs, config.attributes.input),
|
|
4081
4204
|
output: getNestedAttribute(attrs, config.attributes.output),
|
|
4082
4205
|
reasoning: getNestedAttribute(attrs, config.attributes.reasoning),
|
|
4083
4206
|
toolCalls: getNestedAttribute(attrs, config.attributes.toolCalls),
|
|
4084
4207
|
metrics,
|
|
4208
|
+
warnings: collectWarnings$1(span),
|
|
4209
|
+
error: pickError$1(span)
|
|
4210
|
+
});
|
|
4211
|
+
}
|
|
4212
|
+
return result;
|
|
4213
|
+
}
|
|
4214
|
+
//#endregion
|
|
4215
|
+
//#region ../shared/src/utils/extractApiCalls.ts
|
|
4216
|
+
function readNumber$1(attributes, path) {
|
|
4217
|
+
const raw = getNestedAttribute(attributes, path);
|
|
4218
|
+
if (typeof raw === "number" && Number.isFinite(raw)) return raw;
|
|
4219
|
+
if (typeof raw !== "string") return null;
|
|
4220
|
+
const parsed = Number(raw);
|
|
4221
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
4222
|
+
}
|
|
4223
|
+
function readString$1(attributes, path) {
|
|
4224
|
+
const raw = getNestedAttribute(attributes, path);
|
|
4225
|
+
return typeof raw === "string" && raw.length > 0 ? raw : null;
|
|
4226
|
+
}
|
|
4227
|
+
function computeLatencyMs(span) {
|
|
4228
|
+
if (span.endedAt === null) return null;
|
|
4229
|
+
const started = Date.parse(span.startedAt);
|
|
4230
|
+
const ended = Date.parse(span.endedAt);
|
|
4231
|
+
if (!Number.isFinite(started) || !Number.isFinite(ended)) return null;
|
|
4232
|
+
const delta = ended - started;
|
|
4233
|
+
return delta >= 0 ? delta : null;
|
|
4234
|
+
}
|
|
4235
|
+
function collectWarnings(span) {
|
|
4236
|
+
const out = [];
|
|
4237
|
+
if (span.warning) out.push(span.warning);
|
|
4238
|
+
if (span.warnings) out.push(...span.warnings);
|
|
4239
|
+
return out;
|
|
4240
|
+
}
|
|
4241
|
+
function pickError(span) {
|
|
4242
|
+
if (span.error) return span.error;
|
|
4243
|
+
if (span.errors && span.errors.length > 0) return span.errors[0] ?? null;
|
|
4244
|
+
return null;
|
|
4245
|
+
}
|
|
4246
|
+
/**
|
|
4247
|
+
* Filter `spans` down to API calls and project each one to the structured
|
|
4248
|
+
* shape consumed by the API calls tab.
|
|
4249
|
+
*
|
|
4250
|
+
* Spans whose `kind` is not in `config.kinds` are dropped. Structured fields
|
|
4251
|
+
* (`method`, `url`, `statusCode`, etc.) are read via `getNestedAttribute` from
|
|
4252
|
+
* the configured paths. `durationMs` takes precedence for latency, with a
|
|
4253
|
+
* fallback to the span start/end timestamps. User-defined `metrics` whose path
|
|
4254
|
+
* resolves to `undefined` are dropped, but `null`, `0`, and `false` are
|
|
4255
|
+
* preserved as legitimate values worth displaying. Original span order is
|
|
4256
|
+
* preserved so the API calls tab matches the ordering in the Trace tab.
|
|
4257
|
+
*/
|
|
4258
|
+
function extractApiCalls(spans, config) {
|
|
4259
|
+
const kindSet = new Set(config.kinds);
|
|
4260
|
+
const result = [];
|
|
4261
|
+
for (const span of spans) {
|
|
4262
|
+
if (!kindSet.has(span.kind)) continue;
|
|
4263
|
+
const attrs = span.attributes;
|
|
4264
|
+
const metrics = [];
|
|
4265
|
+
for (const metric of config.metrics) {
|
|
4266
|
+
const rawValue = getNestedAttribute(attrs, metric.path);
|
|
4267
|
+
if (rawValue === void 0) continue;
|
|
4268
|
+
metrics.push({
|
|
4269
|
+
label: metric.label,
|
|
4270
|
+
tooltip: metric.tooltip,
|
|
4271
|
+
rawValue,
|
|
4272
|
+
format: metric.format,
|
|
4273
|
+
numberFormat: metric.numberFormat,
|
|
4274
|
+
placements: metric.placements
|
|
4275
|
+
});
|
|
4276
|
+
}
|
|
4277
|
+
result.push({
|
|
4278
|
+
id: span.id,
|
|
4279
|
+
name: span.name,
|
|
4280
|
+
kind: span.kind,
|
|
4281
|
+
status: span.status,
|
|
4282
|
+
method: readString$1(attrs, config.attributes.method),
|
|
4283
|
+
url: readString$1(attrs, config.attributes.url),
|
|
4284
|
+
statusCode: readNumber$1(attrs, config.attributes.statusCode),
|
|
4285
|
+
latencyMs: readNumber$1(attrs, config.attributes.durationMs) ?? computeLatencyMs(span),
|
|
4286
|
+
request: getNestedAttribute(attrs, config.attributes.request),
|
|
4287
|
+
response: getNestedAttribute(attrs, config.attributes.response),
|
|
4288
|
+
requestBody: getNestedAttribute(attrs, config.attributes.requestBody),
|
|
4289
|
+
responseBody: getNestedAttribute(attrs, config.attributes.responseBody),
|
|
4290
|
+
headers: getNestedAttribute(attrs, config.attributes.headers),
|
|
4291
|
+
errorPayload: getNestedAttribute(attrs, config.attributes.error),
|
|
4292
|
+
metrics,
|
|
4085
4293
|
warnings: collectWarnings(span),
|
|
4086
4294
|
error: pickError(span)
|
|
4087
4295
|
});
|
|
@@ -5186,14 +5394,35 @@ function resolveRunnableEvalCases(params) {
|
|
|
5186
5394
|
input: {}
|
|
5187
5395
|
}];
|
|
5188
5396
|
}
|
|
5397
|
+
function toStableIdSegment(value) {
|
|
5398
|
+
const segment = value.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
5399
|
+
return segment.length > 0 ? segment : "id";
|
|
5400
|
+
}
|
|
5401
|
+
function buildScopedEvalIdPrefix(params) {
|
|
5402
|
+
const fileIdentity = relative(params.workspaceRoot, params.evalFilePath).replaceAll("\\", "/");
|
|
5403
|
+
return [
|
|
5404
|
+
toStableIdSegment(params.evalId),
|
|
5405
|
+
toStableIdSegment(fileIdentity),
|
|
5406
|
+
toStableIdSegment(params.caseId)
|
|
5407
|
+
].join("-");
|
|
5408
|
+
}
|
|
5189
5409
|
async function callWithUnknownResult(fn, args) {
|
|
5190
5410
|
return await Reflect.apply(fn, void 0, args);
|
|
5191
5411
|
}
|
|
5192
5412
|
async function runCase(params) {
|
|
5193
|
-
const { evalDef, evalId, evalCase, globalTraceDisplay, trial, startTime, cacheAdapter, cacheMode, codeFingerprint, moduleIsolation, artifactDir, runId } = params;
|
|
5413
|
+
const { evalDef, evalId, evalCase, globalTraceDisplay, trial, startTime, cacheAdapter, cacheMode, codeFingerprint, moduleIsolation, evalFilePath, workspaceRoot, artifactDir, runId } = params;
|
|
5414
|
+
const scopedIdPrefix = buildScopedEvalIdPrefix({
|
|
5415
|
+
evalId,
|
|
5416
|
+
evalFilePath,
|
|
5417
|
+
caseId: evalCase.id,
|
|
5418
|
+
workspaceRoot
|
|
5419
|
+
});
|
|
5194
5420
|
const { scope, error: executeError } = await runInEvalScope(evalCase.id, async () => {
|
|
5195
5421
|
const execute = async () => {
|
|
5196
|
-
await Reflect.apply(evalDef.execute, evalDef, [{
|
|
5422
|
+
await Reflect.apply(evalDef.execute, evalDef, [{
|
|
5423
|
+
input: evalCase.input,
|
|
5424
|
+
setOutput: setEvalOutput
|
|
5425
|
+
}]);
|
|
5197
5426
|
};
|
|
5198
5427
|
if (moduleIsolation === void 0) {
|
|
5199
5428
|
await execute();
|
|
@@ -5202,6 +5431,7 @@ async function runCase(params) {
|
|
|
5202
5431
|
await runWithModuleIsolation(moduleIsolation, execute);
|
|
5203
5432
|
}, {
|
|
5204
5433
|
input: evalCase.input,
|
|
5434
|
+
idPrefix: scopedIdPrefix,
|
|
5205
5435
|
cacheContext: cacheAdapter ? {
|
|
5206
5436
|
adapter: cacheAdapter,
|
|
5207
5437
|
mode: cacheMode,
|
|
@@ -5246,6 +5476,7 @@ async function runCase(params) {
|
|
|
5246
5476
|
return await runWithModuleIsolation(moduleIsolation, computeScore);
|
|
5247
5477
|
}, {
|
|
5248
5478
|
input: evalCase.input,
|
|
5479
|
+
idPrefix: `${scopedIdPrefix}-score-${toStableIdSegment(key)}`,
|
|
5249
5480
|
cacheContext: cacheAdapter ? {
|
|
5250
5481
|
adapter: cacheAdapter,
|
|
5251
5482
|
mode: cacheMode,
|
|
@@ -5573,6 +5804,8 @@ async function executeRun({ runState, request, runDir, config, evals, cacheStore
|
|
|
5573
5804
|
cacheMode,
|
|
5574
5805
|
codeFingerprint,
|
|
5575
5806
|
moduleIsolation,
|
|
5807
|
+
evalFilePath,
|
|
5808
|
+
workspaceRoot,
|
|
5576
5809
|
artifactDir: join(runDir, "artifacts"),
|
|
5577
5810
|
runId: runState.manifest.id
|
|
5578
5811
|
});
|
|
@@ -5714,4 +5947,4 @@ function toLastRunStatus(status) {
|
|
|
5714
5947
|
return status === "pending" ? null : status;
|
|
5715
5948
|
}
|
|
5716
5949
|
//#endregion
|
|
5717
|
-
export {
|
|
5950
|
+
export { evalFreshnessStatusSchema as $, evalAssert as $t, getEvalDisplayStatus as A, traceDisplayInputConfigSchema as At, apiCallMetricPlacementSchema as B, jsonCellSchema as Bt, updateManualScoreRequestSchema as C, spanCacheOptionsSchema as Ct, extractLlmCalls as D, traceAttributeDisplayPlacementSchema as Dt, extractApiCalls as E, traceAttributeDisplayInputSchema as Et, runSummarySchema as F, cellValueSchema as Ft, llmCallMetricSchema as G, buildTraceTree as Gt, apiCallsConfigSchema as H, repoFileRefSchema as Ht, DEFAULT_API_CALLS_CONFIG as I, columnDefSchema as It, resolveLlmCallsConfig as J, evalTracer as Jt, llmCallsConfigSchema as K, captureEvalSpanError as Kt, DEFAULT_LLM_CALLS_CONFIG as L, columnFormatSchema as Lt, deriveStatusFromCaseRows as M, traceSpanKindSchema as Mt, deriveStatusFromChildStatuses as N, traceSpanSchema as Nt, getNestedAttribute as O, traceAttributeDisplaySchema as Ot, runManifestSchema as P, traceSpanWarningSchema as Pt, caseRowSchema as Q, appendToEvalOutput as Qt, agentEvalsConfigSchema as R, columnKindSchema as Rt, createRunRequestSchema as S, serializedCacheSpanSchema as St, extractCacheHits as T, traceAttributeDisplayFormatSchema as Tt, llmCallMetricFormatSchema as U, runArtifactRefSchema as Ut, apiCallMetricSchema as V, numberDisplayOptionsSchema as Vt, llmCallMetricPlacementSchema as W, z$1 as Wt, assertionFailureSchema as X, hashCacheKeySync as Xt, trialSelectionModeSchema as Y, hashCacheKey as Yt, caseDetailSchema as Z, EvalAssertionError as Zt, loadEvalModule as _, cacheModeSchema as _t, loadPersistedRunSnapshot as a, nextEvalId as an, evalChartAggregateSchema as at, normalizeScoreDef as b, cacheRecordingSchema as bt, persistCaseDetail as c, setScopeCacheContext as cn, evalChartColorSchema as ct, recomputePersistedCaseStatus as d, getEvalRegistry as dn, evalChartTooltipExtraSchema as dt, getCurrentScope as en, evalStatAggregateSchema as et, runTouchesEval as f, evalChartTypeSchema as ft, setLatestRunInfoMap as g, cacheListItemSchema as gt, getTargetEvalIds as h, cacheFileSchema as ht, getLatestRunInfos as i, mergeEvalOutput as in, scoreTraceSchema as it, deriveScopedSummaryFromCases as j, traceSpanErrorSchema as jt, getEvalTitle as k, traceDisplayConfigSchema as kt, persistRunState as l, repoFile as ln, evalChartConfigSchema as lt, buildEvalSummary as m, cacheEntrySchema as mt, generateRunId as n, incrementEvalOutput as nn, evalStatsConfigSchema as nt, loadPersistedRunSnapshots as o, runInEvalScope as on, evalChartAxisSchema as ot, resolveArtifactPath as p, evalChartsConfigSchema as pt, resolveApiCallsConfig as q, evalSpan as qt, getLastRunStatuses as r, isInEvalScope as rn, evalSummarySchema as rt, nextShortIdFromSnapshots as s, setEvalOutput as sn, evalChartBuiltinMetricSchema as st, executeRun as t, getEvalCaseInput as tn, evalStatItemSchema as tt, recomputeEvalStatusesInRuns as u, defineEval as un, evalChartMetricSchema as ut, loadConfig as v, cacheOperationTypeSchema as vt, sseEnvelopeSchema as w, traceCacheRefSchema as wt, createFsCacheStore as x, cacheStatusSchema as xt, buildDeclaredColumnDefs as y, cacheRecordingOpSchema as yt, apiCallMetricFormatSchema as z, fileRefSchema as zt };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { n as createRunner } from "./cli-
|
|
2
|
-
import "./src-
|
|
1
|
+
import { n as createRunner } from "./cli-COzPxKg2.mjs";
|
|
2
|
+
import "./src-OZSs693X.mjs";
|
|
3
3
|
//#region ../../apps/server/src/runner.ts
|
|
4
4
|
let runnerInstance = null;
|
|
5
5
|
function getRunnerInstance() {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as initRunner, t as getRunnerInstance } from "./runner-
|
|
1
|
+
import { n as initRunner, t as getRunnerInstance } from "./runner-nQjuRZGC.mjs";
|
|
2
2
|
export { getRunnerInstance, initRunner };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ls-stack/agent-eval",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"agent-evals": "./dist/bin.mjs"
|
|
@@ -58,8 +58,8 @@
|
|
|
58
58
|
"@types/node": "^24.7.2",
|
|
59
59
|
"typescript": "^5.9.2",
|
|
60
60
|
"@agent-evals/runner": "0.0.1",
|
|
61
|
-
"@agent-evals/
|
|
62
|
-
"@agent-evals/
|
|
61
|
+
"@agent-evals/sdk": "0.0.1",
|
|
62
|
+
"@agent-evals/shared": "0.0.1"
|
|
63
63
|
},
|
|
64
64
|
"scripts": {
|
|
65
65
|
"build": "pnpm --filter @agent-evals/web build && tsdown",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@import"https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&family=Geist+Mono:wght@400;500;600&display=swap";.json-view{display:block;color:#4d4d4d;text-align:left;--json-property: #009033;--json-index: #676dff;--json-number: #676dff;--json-string: #b2762e;--json-boolean: #dc155e;--json-null: #dc155e}.json-view .json-view--property{color:var(--json-property)}.json-view .json-view--index{color:var(--json-index)}.json-view .json-view--number{color:var(--json-number)}.json-view .json-view--string{color:var(--json-string)}.json-view .json-view--boolean{color:var(--json-boolean)}.json-view .json-view--null{color:var(--json-null)}.json-view .jv-indent{padding-left:1em}.json-view .jv-chevron{display:inline-block;vertical-align:-20%;cursor:pointer;opacity:.4;width:1em;height:1em}:is(.json-view .jv-chevron:hover,.json-view .jv-size:hover+.jv-chevron){opacity:.8}.json-view .jv-size{cursor:pointer;opacity:.4;font-size:.875em;font-style:italic;margin-left:.5em;vertical-align:-5%;line-height:1}.json-view :is(.json-view--copy,.json-view--edit),.json-view .json-view--link svg{display:none;width:1em;height:1em;margin-left:.25em;cursor:pointer}.json-view .json-view--input{width:120px;margin-left:.25em;border-radius:4px;border:1px solid currentColor;padding:0 4px;font-size:87.5%;line-height:1.25;background:transparent}.json-view .json-view--deleting{outline:1px solid #da0000;background-color:#da000011;text-decoration-line:line-through}:is(.json-view:hover,.json-view--pair:hover)>:is(.json-view--copy,.json-view--edit),:is(.json-view:hover,.json-view--pair:hover)>.json-view--link svg{display:inline-block}.json-view .jv-button{background:transparent;outline:none;border:none;cursor:pointer;color:inherit}.json-view .cursor-pointer{cursor:pointer}.json-view svg{vertical-align:-10%}.jv-size-chevron~svg{vertical-align:-16%}.json-view_a11y{color:#545454;--json-property: #aa5d00;--json-index: #007299;--json-number: #007299;--json-string: #008000;--json-boolean: #d91e18;--json-null: #d91e18}.json-view_github{color:#005cc5;--json-property: #005cc5;--json-index: #005cc5;--json-number: #005cc5;--json-string: #032f62;--json-boolean: #005cc5;--json-null: #005cc5}.json-view_vscode{color:#005cc5;--json-property: #0451a5;--json-index: #0000ff;--json-number: #0000ff;--json-string: #a31515;--json-boolean: #0000ff;--json-null: #0000ff}.json-view_atom{color:#383a42;--json-property: #e45649;--json-index: #986801;--json-number: #986801;--json-string: #50a14f;--json-boolean: #0184bc;--json-null: #0184bc}.json-view_winter-is-coming{color:#0431fa;--json-property: #3a9685;--json-index: #ae408b;--json-number: #ae408b;--json-string: #8123a9;--json-boolean: #0184bc;--json-null: #0184bc}.json-view_vitesse{color:#393a34;--json-property: #998418;--json-index: #2f798a;--json-number: #2f798a;--json-string: #b56959;--json-boolean: #1e754f;--json-null: #ab5959}.vh724ok-1{display:flex;align-items:stretch;justify-content:flex-start;height:100vh;overflow:hidden;background:#fcfcfc}.vh724ok-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;flex:1;min-width:0;overflow-x:hidden;overflow-y:hidden}.vh724ok-2.vwx8nfh{overflow-x:auto}.vh724ok-3{width:100%;height:100%}.vh724ok-3.vwx8nfh{min-width:600px}.v9f9dyw-1{border-left:1px solid #e8e8eb;background:#f7f7f8;display:flex;align-items:center;justify-content:center;color:#6b6e76;font-size:12px;flex-shrink:0}.v9f9dyw-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;position:relative;flex-shrink:0;border-left:1px solid #e8e8eb;background:#f7f7f8;overflow:hidden}.v9f9dyw-3{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px;padding:14px 18px 12px;border-bottom:1px solid #e8e8eb;background:#f7f7f8;flex-shrink:0}.v9f9dyw-4{display:flex;align-items:center;justify-content:space-between;gap:10px}.v9f9dyw-5{display:flex;align-items:center;justify-content:flex-start;gap:2px}.v9f9dyw-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v9f9dyw-7{display:flex;align-items:center;justify-content:flex-start;gap:10px;min-width:0}.v9f9dyw-8{display:flex;align-items:center;justify-content:flex-start;gap:12px;min-width:0}.v9f9dyw-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:17px;color:#0a0b0d;font-weight:600;letter-spacing:-.01em}.v9f9dyw-10{display:flex;align-items:center;justify-content:flex-start;gap:4px;border-bottom:1px solid #e8e8eb;padding:10px 14px 0;flex-shrink:0;overflow-x:auto}.v9f9dyw-11{position:relative;padding:8px 12px;background:transparent;border:none;font-size:12px;font-weight:500;color:#6b6e76;white-space:nowrap;margin-bottom:-1px;border-bottom:1.5px solid transparent}.v9f9dyw-11:hover{color:#0a0b0d}.v9f9dyw-11.v18pp08p{color:#0a0b0d;border-bottom-color:#22d3ee}.v9f9dyw-12{flex:1;overflow:auto;padding:18px 20px}.v9f9dyw-13{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start}.v9f9dyw-14{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;padding:14px 0;border-bottom:1px solid #e8e8eb}.v9f9dyw-14:first-child{padding-top:0}.v9f9dyw-14:last-child{border-bottom:none;padding-bottom:0}.v9f9dyw-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v9f9dyw-16{font-size:13px;color:#0a0b0d}.v9f9dyw-17{color:#dc2626}.v9f9dyw-18{font-weight:600;margin-bottom:8px}.v9f9dyw-19{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;white-space:pre-wrap;opacity:.8;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:10px}.v9f9dyw-20{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:14px}.v9f9dyw-21{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;margin-bottom:8px}.v9f9dyw-22{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:13px;color:#0a0b0d;word-break:break-word}.v9f9dyw-23{color:#dc2626}.v9f9dyw-24{color:#16a34a}.v9f9dyw-25{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:12px}.v9f9dyw-26{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;padding:12px 14px;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md)}.v9f9dyw-27{display:flex;align-items:center;justify-content:space-between;gap:10px}.v9f9dyw-28{font-size:12.5px;font-weight:600;color:#0a0b0d;letter-spacing:-.005em}.v9f9dyw-29{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:13px;font-weight:500;color:#0a0b0d}.v9f9dyw-30{position:relative;height:6px;border-radius:4px;background:#f0f0f2;overflow:hidden}.v9f9dyw-31{position:absolute;left:0;top:0;bottom:0;border-radius:4px;background:#a4a7af}.v9f9dyw-31.vbz8yk8{background:#16a34a}.v9f9dyw-31.v173w9ek{background:#dc2626}.v9f9dyw-32{display:flex;align-items:center;justify-content:flex-start;gap:10px;font-size:11px;color:#6b6e76}.v9f9dyw-33{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:2px 6px;border-radius:var(--radius-sm);background:#f0f0f2;color:#6b6e76;font-size:9.5px;letter-spacing:.04em;line-height:1.2}.v9f9dyw-33.vbz8yk8{background:#16a34a1f;color:#16a34a}.v9f9dyw-33.v173w9ek{background:#dc26261f;color:#dc2626}.v9f9dyw-34{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:18px}.v9f9dyw-35{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px}.v9f9dyw-36{display:flex;align-items:center;justify-content:space-between;gap:10px}.v9f9dyw-37{font-size:12.5px;font-weight:600;color:#0a0b0d}.v9f9dyw-38{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px;list-style:none;padding:0;margin:0}.v9f9dyw-39{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;padding:12px;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md)}.v9f9dyw-40{color:#dc2626;font-size:12.5px;line-height:1.5}.v9f9dyw-41,.v9f9dyw-42{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.v1rexbf3-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden}.v1rexbf3-2{display:flex;align-items:center;justify-content:flex-start;gap:10px;width:100%;background:transparent;border:none;padding:10px 14px;text-align:left;cursor:pointer;color:#0a0b0d}.v1rexbf3-2:hover{background:#f0f0f2}.v1rexbf3-3{display:flex;align-items:center;justify-content:flex-start;color:#6b6e76;flex-shrink:0}.v1rexbf3-4{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:2px 6px;border-radius:var(--radius-sm);background:#16a34a26;color:#16a34a;font-size:9.5px;letter-spacing:.04em;line-height:1.2;flex-shrink:0}.v1rexbf3-5{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12.5px;color:#0a0b0d;word-break:break-word;flex:1 1 auto;min-width:0}.v1rexbf3-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;color:#6b6e76;flex-shrink:0}.v1rexbf3-7{display:flex;align-items:center;justify-content:flex-start;gap:8px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";margin-left:auto;font-size:11px;color:#6b6e76;flex-wrap:wrap;justify-content:flex-end}.v1rexbf3-8{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:12px;padding:12px 14px;border-top:1px solid #e8e8eb}.v1rexbf3-9{display:flex;align-items:center;justify-content:flex-start;gap:12px;flex-wrap:wrap;font-size:11px;color:#6b6e76}.v1rexbf3-10{display:flex;align-items:center;justify-content:flex-start;gap:4px}.v1rexbf3-11{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;font-size:9.5px;color:#a4a7af}.v1rexbf3-12{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;color:#0a0b0d;word-break:break-all}.v1rexbf3-14{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;margin-bottom:8px}.v1rexbf3-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11.5px;color:#6b6e76}.v1rexbf3-16{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11.5px;color:#dc2626}.vqnpbvz-1{position:relative;min-width:0}.vqnpbvz-2{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;line-height:1.6;color:#0a0b0d;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md);padding:12px 14px;overflow:auto;min-width:0}.vqnpbvz-2.vh8ay32{font-size:11px;padding:10px 12px}.vqnpbvz-2.v14y6o4h{max-height:200px}.vqnpbvz-2.valvosx{max-height:320px}.vqnpbvz-2.vzt48hw{max-height:none}.vqnpbvz-2 .json-view{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#0a0b0d;font-size:inherit;line-height:inherit;--json-property: #0e7490;--json-index: #22d3ee;--json-number: #22d3ee;--json-string: #ea580c;--json-boolean: #dc2626;--json-null: #a4a7af}.vqnpbvz-2 .jv-size,.vqnpbvz-2 .jv-chevron{color:#a4a7af}.vqnpbvz-2 .json-view--copy,.vqnpbvz-2 .json-view--edit,.vqnpbvz-2 .json-view--link svg{color:#a4a7af}.vqnpbvz-2 .json-view--input{color:#0a0b0d}.vqnpbvz-3{display:flex;align-items:center;justify-content:flex-start;gap:4px;transition:.12s cubic-bezier(.4,0,.2,1);transition-property:background,color,border-color;position:absolute;bottom:6px;right:6px;font-family:inherit;font-size:10px;letter-spacing:.04em;text-transform:uppercase;font-weight:500;color:#6b6e76;background:#f7f7f8;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:3px 7px;cursor:pointer}.vqnpbvz-3:hover{color:#0a0b0d;background:#ececee;border-color:#d4d4d8}.v1f0s106-1{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;flex:1;height:100%;text-align:center;padding:48px}.v1f0s106-2{width:56px;height:56px;border-radius:var(--radius-md);background:#f7f7f8;border:1px solid #e8e8eb;display:flex;align-items:center;justify-content:center;color:#22d3ee;margin-bottom:4px}.v1f0s106-2>svg{width:24px;height:24px}.v1f0s106-3{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.v1f0s106-4{color:#0a0b0d;font-size:18px;font-weight:600;letter-spacing:-.01em}.v1f0s106-5{color:#6b6e76;font-size:12.5px;max-width:360px;line-height:1.55}.v1460r1i-1{white-space:pre-wrap;margin:0;font-size:13px;line-height:1.55}.v1460r1i-2{color:#0a0b0d;font-size:13px;line-height:1.55}.v1460r1i-2>:first-child{margin-top:0}.v1460r1i-2>:last-child{margin-bottom:0}.v1460r1i-2 p,.v1460r1i-2 ul,.v1460r1i-2 ol,.v1460r1i-2 blockquote,.v1460r1i-2 pre,.v1460r1i-2 table{margin:0 0 10px}.v1460r1i-2 h1,.v1460r1i-2 h2,.v1460r1i-2 h3,.v1460r1i-2 h4,.v1460r1i-2 h5,.v1460r1i-2 h6{margin:0 0 10px;color:#0a0b0d;line-height:1.25}.v1460r1i-2 h1{font-size:18px}.v1460r1i-2 h2{font-size:15px}.v1460r1i-2 h3{font-size:13.5px}.v1460r1i-2 ul,.v1460r1i-2 ol{padding-left:20px}.v1460r1i-2 li+li{margin-top:4px}.v1460r1i-2 code{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:6px;padding:1px 5px}.v1460r1i-2 pre{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;overflow-x:auto;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:12px}.v1460r1i-2 pre code{background:transparent;border:none;padding:0;font-size:inherit}.v1460r1i-2 blockquote{padding-left:12px;border-left:3px solid #e8e8eb;color:#6b6e76}.v1460r1i-2 a{color:#22d3ee;text-decoration:underline;text-underline-offset:2px}.v1460r1i-2 table{width:100%;border-collapse:collapse}.v1460r1i-2 th,.v1460r1i-2 td{border:1px solid #e8e8eb;padding:8px 10px;text-align:left;vertical-align:top}.v1460r1i-2 th{background:#f0f0f2}.v1460r1i-3{max-width:100%;border-radius:var(--radius-md)}.v1460r1i-4{width:100%}.v1460r1i-5{max-width:100%;border-radius:var(--radius-md)}.v1460r1i-6{color:#22d3ee}.v4yt9wa-1{display:flex;align-items:center;justify-content:center;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;width:28px;height:28px;border-radius:var(--radius-sm);border:none;background:transparent;color:#6b6e76;flex-shrink:0}.v4yt9wa-1.van04w6{width:32px;height:32px;border-radius:var(--radius-md)}.v4yt9wa-1:hover:not(:disabled){background:#f0f0f2;color:#0a0b0d}.v4yt9wa-1:disabled{cursor:not-allowed;opacity:.5}.v4yt9wa-1>svg{width:14px;height:14px}.v4yt9wa-1.van04w6>svg{width:16px;height:16px}.v1m277ov-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden}.v1m277ov-2{display:flex;align-items:center;justify-content:flex-start;gap:10px;width:100%;background:transparent;border:none;padding:10px 14px;text-align:left;cursor:pointer;color:#0a0b0d}.v1m277ov-2:hover{background:#f0f0f2}.v1m277ov-3{display:flex;align-items:center;justify-content:flex-start;color:#6b6e76;flex-shrink:0}.v1m277ov-4{font-size:12.5px;font-weight:600;letter-spacing:-.005em;color:#0a0b0d;flex-shrink:0}.v1m277ov-5{display:flex;align-items:center;justify-content:flex-start;gap:8px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";margin-left:auto;font-size:11px;color:#6b6e76;flex-wrap:wrap;justify-content:flex-end}.v1m277ov-6{display:flex;align-items:center;justify-content:flex-start;gap:4px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;color:#6b6e76}.v1m277ov-7{color:#a4a7af;font-size:9.5px;letter-spacing:.04em;text-transform:uppercase}.v1m277ov-8{color:#d4d4d8}.v1m277ov-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:inline-flex;align-items:center;font-size:10.5px;font-weight:500;letter-spacing:.01em;padding:2px 7px;border-radius:20px;color:#0e7490;background:#22d3ee1a}.v1m277ov-10{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:inline-flex;align-items:center;font-size:10.5px;letter-spacing:.01em;padding:2px 7px;border-radius:20px;color:#6b6e76;background:#f0f0f2}.v1m277ov-11{margin-right:4px;color:#a4a7af}.v1m277ov-12{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:12px;padding:12px 14px;border-top:1px solid #e8e8eb}.v1m277ov-13{display:flex;align-items:center;justify-content:flex-start;gap:10px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";flex-wrap:wrap;font-size:11px;color:#6b6e76}.v1m277ov-14{display:flex;align-items:center;justify-content:flex-start;gap:12px;font-size:12px}.v1m277ov-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;min-width:110px}.v1m277ov-16{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#0a0b0d;word-break:break-word}.v1m277ov-17{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden}.v1m277ov-18{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;display:grid;grid-template-columns:1fr auto auto;gap:16px;padding:8px 12px;background:#f0f0f2;color:#6b6e76;font-size:9.5px;letter-spacing:.04em}.v1m277ov-19{display:grid;grid-template-columns:1fr auto auto;gap:16px;padding:8px 12px;align-items:baseline;border-top:1px solid #e8e8eb;font-size:12px}.v1m277ov-20{color:#0a0b0d}.v1m277ov-21{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#0a0b0d;text-align:right;min-width:56px}.v1m277ov-22{background:#f0f0f2;font-weight:600}.v1m277ov-23{text-align:right}.v1m277ov-24{color:#6b6e76}.v1m277ov-26{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;margin-bottom:8px}.v1m277ov-27{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.v1m277ov-28{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.v1m277ov-29{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;border:1px solid #e8e8eb;border-radius:var(--radius-sm);background:#f0f0f2;padding:8px 10px}.v1m277ov-30{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;font-size:9.5px}.v1m277ov-31{color:#dc2626}.v1m277ov-32{font-weight:600;margin-bottom:8px}.v1m277ov-33{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;white-space:pre-wrap;opacity:.8;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:10px}.v1m277ov-34{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;color:#ea580c;font-size:12px}.v1m277ov-35{font-weight:600}.vno9i23-1{display:flex;align-items:center;justify-content:flex-start;gap:6px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:inline-flex;font-size:11px;font-weight:500;letter-spacing:.01em;padding:3px 8px;border-radius:20px;color:#6b6e76;background:#f0f0f2}.vno9i23-1.v1bls63k{color:#16a34a;background:#16a34a1a}.vno9i23-1.v1843cka{color:#dc2626;background:#dc26261a}.vno9i23-1.v1w33htl{color:#0e7490;background:#22d3ee1f}.vno9i23-1.v1o7znqr{color:#ea580c;background:#ea580c1a}.vno9i23-1.v1ptx2rj{color:#6b6e76;background:#e4e4e7}.vno9i23-1.vwlrmf0{color:#ea580c;background:#ea580c24}.vno9i23-1.v1mlprpv{color:#0e7490;background:#22d3ee1a}.vno9i23-2{width:5px;height:5px;border-radius:5px;flex-shrink:0;background:#a4a7af;@keyframes pulseDot{0%,to{opacity:1}50%{opacity:.4}}}.vno9i23-2.v1bls63k{background:#16a34a}.vno9i23-2.v1843cka{background:#dc2626}.vno9i23-2.v1w33htl{background:#22d3ee;animation:pulseDot 1.6s ease-in-out infinite}.vno9i23-2.v1o7znqr{background:#ea580c}.vno9i23-2.v1ptx2rj{background:#d4d4d8}.vno9i23-2.vwlrmf0{background:#ea580c}.vno9i23-2.v1mlprpv{background:#22d3ee}.v1fkevfp-1{background:#000;color:#fff;font-size:12px;line-height:1.4;padding:4px 8px;border-radius:4px;box-shadow:0 2px 8px #0006;pointer-events:none;z-index:10000;max-width:300px;white-space:pre-line;overflow-wrap:break-word}.vpbub9f-1{position:absolute;top:0;bottom:0;width:7px;right:-3px;cursor:col-resize;z-index:5;-webkit-user-select:none;user-select:none;touch-action:none}.vpbub9f-1.v1xij6d4{right:auto;left:-3px}.vpbub9f-1:after{content:"";position:absolute;top:0;bottom:0;left:3px;width:1px;background:transparent;transition:background .15s ease}.vpbub9f-1:hover:after,.vpbub9f-1.veyzh35:after{background:#22d3ee}.vxv787s-1{display:flex;gap:12px;height:100%;align-items:stretch;position:relative;min-width:0}.vxv787s-2{display:flex;flex-direction:column;flex:1;min-width:0;border:1px solid #e8e8eb;border-radius:var(--radius-md);background:#fcfcfc;overflow:hidden}.vxv787s-3{flex:1 1 0;min-width:300px;max-width:460px;overflow:auto;border:1px solid #e8e8eb;border-radius:var(--radius-md);background:#fcfcfc;padding:14px 16px}.vxv787s-4{position:absolute;inset:0 0 0 auto;width:min(420px,85%);display:flex;flex-direction:column;background:#f7f7f8;border:1px solid #d4d4d8;border-radius:var(--radius-md);box-shadow:-10px 0 28px #0a0b0d24;z-index:2}.vxv787s-5{display:flex;align-items:center;justify-content:space-between;padding:6px 8px 6px 12px;border-bottom:1px solid #e8e8eb;flex-shrink:0}.vxv787s-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:#6b6e76}.vxv787s-7{overflow:auto;padding:14px 16px}.vxv787s-8{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;background:none;border:none;padding:4px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;color:#6b6e76;cursor:pointer}.vxv787s-8:hover{background:#f0f0f2;color:#0a0b0d}.vxv787s-8>svg{width:14px;height:14px}.vxv787s-9{flex:1;overflow:auto;min-width:0}.vxv787s-10{display:flex;flex-direction:column;min-width:560px;padding-right:14px}.vxv787s-10.v1qsea3x{min-width:0;padding-right:0}.vxv787s-11{display:grid;grid-template-columns:minmax(200px,40%) 1fr;flex-shrink:0;border-bottom:1px solid #e8e8eb;background:#f7f7f8;height:24px;position:sticky;top:0;z-index:1}.vxv787s-11.v1qsea3x{grid-template-columns:1fr}.vxv787s-12{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:0 6px 0 10px;height:100%}.vxv787s-13{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;background:none;border:none;padding:3px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center;color:#6b6e76;cursor:pointer;flex-shrink:0}.vxv787s-13:hover{background:#f0f0f2;color:#0a0b0d}.vxv787s-13>svg{width:14px;height:14px}.vxv787s-14{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;color:#a4a7af}.vxv787s-15{position:relative;padding-right:12px}.vxv787s-16{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";position:absolute;top:50%;transform:translate(-50%,-50%);font-size:9.5px;font-variant-numeric:tabular-nums;color:#a4a7af;white-space:nowrap}.vxv787s-17{padding:4px 0}.vxv787s-18{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;display:grid;grid-template-columns:minmax(200px,40%) 1fr;align-items:stretch;cursor:pointer;font-size:11.5px;min-height:26px;border-left:2px solid transparent;color:#6b6e76}.vxv787s-18.v1qsea3x{grid-template-columns:1fr}.vxv787s-18:hover{background:#f7f7f8;color:#0a0b0d}.vxv787s-18.vkduw8x{background:#f0f0f2;color:#0a0b0d;border-left-color:#22d3ee}.vxv787s-19{display:flex;align-items:center;justify-content:flex-start;gap:7px;min-width:0;padding-right:10px}.vxv787s-20{position:relative;height:26px;padding-right:12px;background-image:linear-gradient(to right,transparent calc(25% - 1px),#e8e8ebb3 calc(25% - 1px),#e8e8ebb3 25%,transparent 25%),linear-gradient(to right,transparent calc(50% - 1px),#e8e8ebb3 calc(50% - 1px),#e8e8ebb3 50%,transparent 50%),linear-gradient(to right,transparent calc(75% - 1px),#e8e8ebb3 calc(75% - 1px),#e8e8ebb3 75%,transparent 75%)}.vxv787s-21{position:absolute;top:7px;height:12px;min-width:2px;border-radius:3px;background:var(--trace-kind-bar-bg, #d4d4d8);border:1px solid transparent}.vxv787s-21.v1z0zxx1{background:repeating-linear-gradient(45deg,var(--trace-kind-running-strong, #22d3ee66) 0,var(--trace-kind-running-strong, #22d3ee66) 6px,var(--trace-kind-running-soft, #22d3ee26) 6px,var(--trace-kind-running-soft, #22d3ee26) 12px)}.vxv787s-21.v12vnxco{border-color:#dc2626}.vxv787s-22{position:absolute;top:50%;width:10px;height:10px;border-radius:2px;background:var(--trace-kind-bar-bg, #d4d4d8);box-shadow:0 0 0 2px #fcfcfc;transform:translate(-50%,-50%) rotate(45deg);pointer-events:none}.vxv787s-23{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";position:absolute;top:5px;font-size:9.5px;font-variant-numeric:tabular-nums;color:#6b6e76;white-space:nowrap;pointer-events:none}.vxv787s-23.inside{color:#fff;font-weight:500;letter-spacing:.02em;background:#0003;padding:0 5px;line-height:12px;top:7px;height:12px;margin-right:-4px;border-radius:3px}.vxv787s-24{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform;background:none;border:none;padding:0;display:inline-flex;width:14px;height:14px;align-items:center;justify-content:center;color:#a4a7af;flex-shrink:0;cursor:pointer}.vxv787s-24>svg{width:12px;height:12px}.vxv787s-24.v1sa0q0h>svg{transform:rotate(90deg)}.vxv787s-25{width:14px;flex-shrink:0}.vxv787s-26{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";padding:2px 6px;border-radius:4px;font-size:9.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--trace-kind-badge-text, #6b6e76);background:var(--trace-kind-badge-bg, #f0f0f2);flex-shrink:0}.vxv787s-27{font-weight:500;font-size:11.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}.vxv787s-28{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";padding:1px 5px;border-radius:3px;font-size:9.5px;font-weight:500;letter-spacing:.04em;text-transform:uppercase;flex-shrink:0;background:#d4d4d8;color:#6b6e76}.vxv787s-28.vquhj6c{background:#16a34a26;color:#16a34a}.vxv787s-28.v1bt5ce3{background:#ea580c26;color:#ea580c}.vxv787s-28.vgubnqx{background:#22d3ee26;color:#22d3ee}.vxv787s-28.vk5fxpe{background:#d4d4d8;color:#6b6e76}.vxv787s-29{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#dc2626;font-size:10px;flex-shrink:0}.vxv787s-30{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";color:#ea580c;font-size:10px;flex-shrink:0}.vxv787s-31{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:9.5px;letter-spacing:.04em;flex-shrink:0;color:#a4a7af}.vxv787s-32{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;color:#6b6e76;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto;min-width:0}.vxv787s-32:before{content:"→";color:#a4a7af;margin-right:4px}.vxv787s-33{padding:16px;color:#6b6e76;font-size:12px;text-align:center}.vn93px5-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:14px;font-size:12px}.vn93px5-2{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:13px;font-weight:600;letter-spacing:-.005em;color:#0a0b0d}.vn93px5-3{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.vn93px5-4{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 10px;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-sm)}.vn93px5-5{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vn93px5-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11.5px;color:#0a0b0d;text-align:right;max-width:60%;word-break:break-all}.vn93px5-7{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.vn93px5-8{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vn93px5-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:11px;line-height:1.55;white-space:pre-wrap;word-break:break-word;color:#6b6e76;background:#f7f7f8;border:1px solid #e8e8eb;padding:10px 12px;border-radius:var(--radius-sm);max-height:200px;overflow:auto}.vmrx93z-1{--vmrx93z-2: #dc2626;--vmrx93z-3: #dc26260f;--vmrx93z-4: #dc262638;display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;min-width:0;color:var(--vmrx93z-2);background:var(--vmrx93z-3);border:1px solid var(--vmrx93z-4);border-radius:var(--radius-sm);padding:10px 12px;overflow-wrap:anywhere}.vmrx93z-1.vc8cpou{--vmrx93z-2: #ea580c;--vmrx93z-3: #ea580c14;--vmrx93z-4: #ea580c3d}.vmrx93z-5{font-weight:600;min-width:0;overflow-wrap:anywhere}.vmrx93z-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;color:#dc2626b8;min-width:0;overflow-wrap:anywhere}.vmrx93z-6.vc8cpou{color:#ea580cc2}.vmrx93z-7{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:var(--vmrx93z-2)}.vmrx93z-8{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:4px;min-width:0}.vmrx93z-8+.vmrx93z-8{border-top:1px solid #dc26262e;padding-top:8px}.vmrx93z-8.vc8cpou+.vmrx93z-8.vc8cpou{border-top-color:#ea580c33}.vmrx93z-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;max-width:100%;white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere;opacity:.8;margin:0}.vmrx93z-10{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px}.vmrx93z-11{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vmn9mpb-1{height:100%;overflow:auto}.vmn9mpb-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;padding:22px 32px 18px;border-bottom:1px solid #e8e8eb;background:#fcfcfc;position:sticky;top:0;z-index:3}.vmn9mpb-3{display:flex;align-items:center;justify-content:space-between;gap:14px}.vmn9mpb-4{display:flex;align-items:center;justify-content:flex-start;gap:12px}.vmn9mpb-5{display:flex;align-items:center;justify-content:flex-start;gap:6px;flex-wrap:wrap}.vmn9mpb-6{display:flex;align-items:center;justify-content:flex-start;gap:5px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:3px 9px;border-radius:999px;background:#f0f0f2;color:#6b6e76;font-size:9.5px;line-height:1;letter-spacing:.04em}.vmn9mpb-7{font-size:11px;font-weight:600;color:#0a0b0d;letter-spacing:-.01em}.vmn9mpb-8{display:flex;align-items:center;justify-content:flex-start;gap:5px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color;appearance:none;padding:3px 9px;border-radius:999px;font-size:9.5px;line-height:1;letter-spacing:.04em;text-transform:uppercase;font-weight:500;color:#6b6e76;background:#f0f0f2;border:1px solid transparent;cursor:pointer}.vmn9mpb-8:hover{background:#ececee;color:#0a0b0d}.vmn9mpb-8.v124n73o{color:#fcfcfc;background:#0a0b0d;border-color:#0a0b0d}.vmn9mpb-8.v18aowuu:not(.v124n73o){color:#16a34a;background:#16a34a14;border-color:#16a34a2e}.vmn9mpb-8.vind66p:not(.v124n73o){color:#dc2626;background:#dc262614;border-color:#dc26262e}.vmn9mpb-8.v11id82e:not(.v124n73o){color:#0e7490;background:#22d3ee1a;border-color:#22d3ee38}.vmn9mpb-8.v1i2guj2:not(.v124n73o){color:#ea580c;background:#ea580c14;border-color:#ea580c2e}.vmn9mpb-8.v12gavlj:not(.v124n73o){color:#6b6e76;background:#e4e4e7;border-color:#e8e8eb}.vmn9mpb-8.v9duj39:not(.v124n73o){color:#ea580c;background:#ea580c1a;border-color:#ea580c38}.vmn9mpb-8.vjtgbed:not(.v124n73o){color:#0e7490;background:#22d3ee17;border-color:#22d3ee33}.vmn9mpb-8.vt17xas:not(.v124n73o){color:#6b6e76;background:#f0f0f2;border-color:#e8e8eb}.vmn9mpb-9{font-size:11px;font-weight:600;letter-spacing:-.01em}.vmn9mpb-10{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:20px;padding:24px 32px 40px}.v1yv3uow-1{display:flex;align-items:center;justify-content:flex-start;gap:7px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color,box-shadow;display:inline-flex;height:32px;padding:0 14px;border-radius:var(--radius-md);border:1px solid transparent;font-size:12.5px;font-weight:500;letter-spacing:-.005em;line-height:1;white-space:nowrap;-webkit-user-select:none;user-select:none}.v1yv3uow-1:disabled{cursor:not-allowed;opacity:.5}.v1yv3uow-1>svg{width:13px;height:13px;flex-shrink:0}.v1yv3uow-1.v1d37md8{background:#22d3ee;color:#0a0b0d;font-weight:600;box-shadow:0 0 0 1px #22d3ee4d,0 6px 20px -6px #22d3ee73}.v1yv3uow-1.v1d37md8:hover:not(:disabled){background:#06b6d4;box-shadow:0 0 0 1px #22d3ee73,0 8px 22px -4px #22d3ee99}.v1yv3uow-1.v1d37md8:active:not(:disabled){background:#0e7490}.v1yv3uow-1.v1kpy128{background:#f0f0f2;color:#0a0b0d;border-color:#d4d4d8}.v1yv3uow-1.v1kpy128:hover:not(:disabled){background:#ececee;border-color:#22d3ee73}.v1yv3uow-1.vhmrut{background:transparent;color:#6b6e76}.v1yv3uow-1.vhmrut:hover:not(:disabled){background:#f0f0f2;color:#0a0b0d}.v1yv3uow-1.vs705h9{background:transparent;color:#dc2626;border-color:#dc262666}.v1yv3uow-1.vs705h9:hover:not(:disabled){background:#dc262614;border-color:#dc2626}.v1d1autj-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;background:transparent}.v1d1autj-1.vra3f9d{border:1px solid #e8e8eb;border-radius:var(--radius-lg);overflow:hidden;background:#fcfcfc}.v1d1autj-1.v1ofnfk9{height:100%;overflow:hidden}.v1d1autj-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;padding:22px 32px;border-bottom:1px solid #e8e8eb;background:#fcfcfc}.v1d1autj-2.v16nf7cu{position:sticky;top:0;z-index:3}.v1d1autj-2.vp8tseb{cursor:pointer;padding:16px 24px}.v1d1autj-3{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%}.v1d1autj-4{margin-bottom:14px}.v1d1autj-5{display:flex;align-items:center;justify-content:flex-start;gap:12px;min-width:0;flex:1}.v1d1autj-6{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px;min-width:0;flex:1}.v1d1autj-7{display:flex;align-items:center;justify-content:flex-start;gap:12px;min-width:0}.v1d1autj-8{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:600;color:#0a0b0d;letter-spacing:-.02em;margin:0}.v1d1autj-8.v8omtap{font-size:30px;font-weight:600;letter-spacing:-.025em;line-height:1.1}.v1d1autj-9{font-size:12.5px;color:#6b6e76;max-width:720px;line-height:1.5}.v1d1autj-10{display:inline-flex}.v1d1autj-11{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;color:#6b6e76}.v1d1autj-12{display:flex;align-items:center;justify-content:flex-start;gap:8px;flex-shrink:0}.v1d1autj-13{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform;display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;color:#a4a7af;transform:rotate(-90deg)}.v1d1autj-13.v12vk5oa{transform:rotate(0)}.v1d1autj-13>svg{width:14px;height:14px}.v1d1autj-14{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start}.v1d1autj-14.v1dyggfg{flex:1;min-height:0;overflow:hidden}.v1d1autj-15{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:1px;background:#e8e8eb;border-bottom:1px solid #e8e8eb}.v1d1autj-16{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;padding:12px 16px 13px;background:#fcfcfc}.v1d1autj-17{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;font-size:9px;color:#6b6e76}.v1d1autj-18{font-variant-numeric:tabular-nums;font-size:20px;font-weight:500;color:#0a0b0d;letter-spacing:-.02em;line-height:1.1}.v1d1autj-18.vsjzv4v{color:#0e7490}.v1d1autj-19{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;padding:20px 32px 24px}.v1d1autj-19:not(:last-child){border-bottom:1px solid #e8e8eb}.v1d1autj-19.v1i7hsdh{flex:1;min-height:0}.v1d1autj-20{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}.v1d1autj-20.vskhn2m{margin-bottom:0}.v1d1autj-21{display:flex;align-items:center;justify-content:flex-start;gap:8px;background:none;border:none;padding:0;margin:0;cursor:pointer;color:inherit;font:inherit;text-align:left}.v1d1autj-22{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform;display:inline-flex;width:16px;height:16px;align-items:center;justify-content:center;color:#a4a7af;transform:rotate(-90deg)}.v1d1autj-22.v12vk5oa{transform:rotate(0)}.v1d1autj-22>svg{width:14px;height:14px}.v1d1autj-23{font-size:13.5px;font-weight:600;color:#0a0b0d;letter-spacing:-.01em}.v1d1autj-24{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10.5px;color:#6b6e76}.v1d1autj-25{display:flex;align-items:center;justify-content:flex-start;gap:4px}.vzvspbh-1{height:150px;padding:10px 14px 8px;border:1px solid #e8e8eb;border-radius:var(--radius-lg);background:#fcfcfc}.vzvspbh-2{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76;padding:0 2px 4px}.vzvspbh-3{display:flex;flex-direction:column;gap:4px}.vzvspbh-3+.vzvspbh-3{margin-top:16px}.vzvspbh-4{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";padding:10px 12px;font-size:11px;line-height:1.5;color:#0a0b0d;min-width:160px}.vzvspbh-5{display:flex;justify-content:space-between;gap:14px}.vzvspbh-5+.vzvspbh-5{margin-top:4px}.vzvspbh-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vzvspbh-7{color:#0e7490}.v1v3ddx1-1{padding:30px 24px;border:1px dashed #e8e8eb;border-radius:var(--radius-lg);text-align:center;color:#6b6e76;font-size:12.5px}.v1v3ddx1-2{border:1px solid #e8e8eb;border-radius:var(--radius-lg);background:#fcfcfc;overflow:auto}.v1v3ddx1-2.v72uwfi{flex:1;min-height:0}.v1v3ddx1-3{width:max-content;min-width:100%;border-collapse:collapse;font-size:12px;table-layout:auto}.v1v3ddx1-4{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;position:sticky;top:0;z-index:1;padding:10px 16px;background:#f7f7f8;box-shadow:inset 0 -1px #e8e8eb;color:#6b6e76;text-align:left;white-space:nowrap}.v1v3ddx1-4.v10rcuqw{text-align:right}.v1v3ddx1-4.vl7rjcc{padding-left:36px}.v1v3ddx1-5{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background;cursor:pointer;border-top:1px solid #e8e8eb;border-left:3px solid transparent;background:#f7f7f8}.v1v3ddx1-5:first-child{border-top:none}.v1v3ddx1-5:hover{background:#f0f0f2}.v1v3ddx1-5.v9wbf1x{background:#22d3ee0f}.v1v3ddx1-5.v9wbf1x:hover{background:#22d3ee1a}.v1v3ddx1-5.v1wi22g7{border-left-color:#22d3ee}.v1v3ddx1-6{padding:12px 16px;vertical-align:middle;white-space:nowrap;color:#0a0b0d;font-size:12px}.v1v3ddx1-6.v10rcuqw{text-align:right}.v1v3ddx1-6.vh68gi{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:11.5px;color:#6b6e76}.v1v3ddx1-7{display:flex;align-items:center;justify-content:flex-start;gap:8px}.v1v3ddx1-8{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:color;display:inline-flex;align-items:center;justify-content:center;padding:2px;background:transparent;border:none;cursor:pointer;color:#6b6e76}.v1v3ddx1-8:hover{color:#0a0b0d}.v1v3ddx1-9{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:3px 6px;border-radius:var(--radius-sm);background:#22d3ee1f;color:#0e7490;font-size:10px;letter-spacing:.04em;line-height:1}.v1v3ddx1-10{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";padding:3px 6px;border-radius:var(--radius-sm);background:#f0f0f2;color:#6b6e76;font-size:10.5px;line-height:1}.v1v3ddx1-11{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;letter-spacing:.1em;text-transform:uppercase;font-weight:500;padding:3px 6px;border-radius:var(--radius-sm);background:#f0f0f2;color:#6b6e76;font-size:10px;letter-spacing:.04em;line-height:1}.v1v3ddx1-12{font-size:12.5px;font-weight:500;color:#0a0b0d;letter-spacing:-.005em}.v1v3ddx1-12.v9wbf1x{color:#0e7490}.v1v3ddx1-13{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background;cursor:pointer;border-top:1px solid #e8e8eb;border-left:3px solid transparent}.v1v3ddx1-13:hover{background:#f7f7f8}.v1v3ddx1-13.v1wi22g7{border-left-color:#22d3ee}.v1v3ddx1-14{padding:10px 16px;vertical-align:middle;white-space:nowrap;color:#0a0b0d;font-size:12px}.v1v3ddx1-14.v10rcuqw{text-align:right}.v1v3ddx1-14.vh68gi{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:11.5px;color:#6b6e76}.v1v3ddx1-14.vl7rjcc{padding-left:36px}.v1v3ddx1-15{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;color:#0a0b0d;max-width:260px}.v1v3ddx1-16{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;max-width:320px}.v1v3ddx1-17{color:#a4a7af}.v1v3ddx1-18{border-top:1px solid #e8e8eb}.v1v3ddx1-19{padding:18px;text-align:center;font-size:12px;color:#6b6e76}.v6nngvf-1{color:#a4a7af}.v6nngvf-2{display:inline-block;width:40px;height:3px;border-radius:4px;background:#f0f0f2;position:relative;overflow:hidden;margin-right:8px;vertical-align:middle}.v6nngvf-3{position:absolute;left:0;top:0;bottom:0;border-radius:4px;background:#a4a7af}.v6nngvf-3.vj3xmch{background:#16a34a}.v6nngvf-3.v1b0sr1n{background:#ea580c}.v6nngvf-3.v3vjwcw{background:#dc2626}.v6nngvf-4{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:12px;color:#0a0b0d;font-weight:500}.v6nngvf-5{display:flex;align-items:center;justify-content:flex-start;display:inline-flex}.v6nngvf-6{display:flex;align-items:center;justify-content:flex-start;gap:5px;display:inline-flex;justify-content:center;min-width:54px;padding:3px 7px;border-radius:var(--radius-sm);color:#6b6e76;background:#f0f0f2;font-size:11px;font-weight:600}.v6nngvf-6.vj3xmch{color:#16a34a;background:#16a34a1a}.v6nngvf-6.v3vjwcw{color:#dc2626;background:#dc26261a}.v6nngvf-7{display:flex;align-items:center;justify-content:flex-start;gap:1px;display:inline-flex;color:#a4a7af}.v6nngvf-7>svg{width:13px;height:13px}.v6nngvf-7>.filled{color:#ea580c;fill:currentColor}.v6nngvf-8{display:flex;align-items:center;justify-content:flex-end;gap:4px}.v6nngvf-9{display:flex;align-items:center;justify-content:flex-start;gap:4px;justify-content:center;height:24px;min-width:28px;padding:0 7px;border:1px solid #d4d4d8;border-radius:var(--radius-sm);background:#fcfcfc;color:#6b6e76;font-size:11px;font-weight:600}.v6nngvf-9>svg{width:12px;height:12px}.v6nngvf-9:hover:not(:disabled){border-color:#22d3ee80;background:#f0f0f2;color:#0a0b0d}.v6nngvf-9:disabled{opacity:.6}.v6nngvf-9.vrka86m{color:#16a34a;border-color:#16a34a80;background:#16a34a1a}.v6nngvf-9.v14fx5bw{color:#dc2626;border-color:#dc262680;background:#dc26261a}.v6nngvf-10{display:flex;align-items:center;justify-content:center;width:20px;height:24px;padding:0;border:none;border-radius:var(--radius-sm);background:transparent;color:#a4a7af}.v6nngvf-10>svg{width:14px;height:14px}.v6nngvf-10:hover:not(:disabled),.v6nngvf-10.v3c191l{color:#ea580c}.v6nngvf-10.v3c191l>svg{fill:currentColor}.v6nngvf-10:disabled{opacity:.6}.v1it1iyw-1{position:relative;display:inline-flex}.v1it1iyw-2{display:flex;align-items:center;justify-content:center;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color,border-color;appearance:none;padding:0;width:32px;height:32px;border-radius:var(--radius-md);border:1px solid #e8e8eb;background:#fcfcfc;color:#6b6e76;line-height:0;box-shadow:0 1px 2px #00000014}.v1it1iyw-2:hover:not(:disabled){background:#f0f0f2;color:#0a0b0d;border-color:#d4d4d8}.v1it1iyw-2:disabled{cursor:not-allowed;opacity:.5}.v1it1iyw-2>svg{width:16px;height:16px}.v1it1iyw-3{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;position:absolute;top:calc(100% + 6px);right:0;min-width:210px;background:#f7f7f8;border:1px solid #d4d4d8;box-shadow:0 14px 30px -12px #22d3ee40;z-index:40;padding:6px 0}.v1it1iyw-4{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:2px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;text-align:left;background:transparent;border:0;padding:8px 14px;color:#0a0b0d;cursor:pointer}.v1it1iyw-4:hover{background:#ececee}.v1it1iyw-4.vp2z70{color:#dc2626}.v1it1iyw-4.vp2z70:hover{background:#dc26261a}.v1it1iyw-5{font-size:12px;font-weight:600;letter-spacing:.02em}.v1it1iyw-6{font-size:11px;color:#6b6e76}.v1it1iyw-7{height:1px;background:#e8e8eb;margin:4px 0}.v1gbsfzf-1{position:relative;display:inline-flex}.v1gbsfzf-2{display:flex;align-items:center;justify-content:flex-start}.v1gbsfzf-3{display:flex;align-items:center;justify-content:flex-start;gap:8px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color,box-shadow;display:inline-flex;height:28px;padding:0 14px;border-radius:0;border:1px solid transparent;font-size:11px;font-weight:600;line-height:1;white-space:nowrap;-webkit-user-select:none;user-select:none;text-transform:uppercase;letter-spacing:.14em;background:#22d3ee;color:#0a0b0d;box-shadow:0 0 0 1px #0e7490,0 6px 16px -8px #22d3ee8c}.v1gbsfzf-3>svg{width:13px;height:13px;flex-shrink:0}.v1gbsfzf-3:hover:not(:disabled){background:#06b6d4}.v1gbsfzf-3:active:not(:disabled){background:#0e7490}.v1gbsfzf-3:disabled{cursor:not-allowed;opacity:.4}.v1gbsfzf-4{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color;display:inline-flex;align-items:center;justify-content:center;height:28px;width:26px;margin-left:1px;border-radius:0;border:1px solid transparent;background:#22d3ee;color:#0a0b0d;box-shadow:0 0 0 1px #0e7490}.v1gbsfzf-4>svg{width:13px;height:13px;transition:transform .18s ease}.v1gbsfzf-4.v9mb724>svg{transform:rotate(180deg)}.v1gbsfzf-4:hover:not(:disabled){background:#06b6d4}.v1gbsfzf-4:disabled{cursor:not-allowed;opacity:.4}.v1gbsfzf-5{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;position:absolute;top:calc(100% + 6px);right:0;min-width:220px;background:#f7f7f8;border:1px solid #d4d4d8;box-shadow:0 14px 30px -12px #22d3ee59;z-index:40;padding:6px 0}.v1gbsfzf-6{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:2px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;text-align:left;background:transparent;border:0;padding:8px 14px;color:#0a0b0d;cursor:pointer}.v1gbsfzf-6:hover{background:#ececee}.v1gbsfzf-6.v1g7o2ge{color:#dc2626}.v1gbsfzf-6.v1g7o2ge:hover{background:#dc26261a}.v1gbsfzf-7{font-size:12px;font-weight:600;letter-spacing:.02em}.v1gbsfzf-8{font-size:11px;color:#6b6e76}.v1gbsfzf-9{height:1px;background:#e8e8eb;margin:4px 0}.v1eplm6x-1{display:flex;align-items:center;justify-content:flex-start;gap:8px;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:13px;color:#6b6e76}.v1eplm6x-2{color:#a4a7af;margin:0 6px}.v1eplm6x-3{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:color;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";appearance:none;background:transparent;border:none;padding:0;color:#6b6e76;cursor:pointer}.v1eplm6x-3:hover,.v1eplm6x-4{color:#0a0b0d}.vgxz95z-1{border-left:1px solid #e8e8eb;background:#f7f7f8;display:flex;align-items:center;justify-content:center;color:#6b6e76;font-size:12px;flex-shrink:0}.vgxz95z-2{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;position:relative;flex-shrink:0;border-left:1px solid #e8e8eb;background:#f7f7f8;overflow:hidden}.vgxz95z-3{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px;padding:14px 18px 12px;border-bottom:1px solid #e8e8eb;background:#f7f7f8;flex-shrink:0}.vgxz95z-4{display:flex;align-items:center;justify-content:space-between;gap:10px}.vgxz95z-5{display:flex;align-items:center;justify-content:flex-start;gap:6px}.vgxz95z-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vgxz95z-7{display:flex;align-items:center;justify-content:flex-start;gap:10px;min-width:0}.vgxz95z-8{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:9.5px;font-weight:600;padding:3px 8px;border-radius:4px;color:#0a0b0d;background:#22d3ee}.vgxz95z-9{font-size:15px;font-weight:600;color:#0a0b0d;letter-spacing:-.01em;font-variant-numeric:tabular-nums}.vgxz95z-10{flex:1;overflow:auto;padding:16px;display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:18px}.vgxz95z-11{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:8px}.vgxz95z-12{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vgxz95z-13{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}.vgxz95z-14{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:6px;padding:12px 14px;background:#fcfcfc;border:1px solid #e8e8eb;border-radius:var(--radius-md)}.vgxz95z-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;color:#6b6e76}.vgxz95z-16{font-variant-numeric:tabular-nums;font-size:18px;font-weight:500;color:#0a0b0d;letter-spacing:-.02em}.vgxz95z-16.v15guhoh{color:#0e7490}.vgxz95z-16.v1amf7no{color:#dc2626}.vgxz95z-17{display:grid;grid-template-columns:110px 1fr;gap:6px 12px;margin:0}.vgxz95z-18{font-size:12px;color:#6b6e76}.vgxz95z-19{margin:0;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:11.5px;color:#0a0b0d;word-break:break-all}.vgxz95z-20{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;border:1px solid #e8e8eb;border-radius:var(--radius-md);overflow:hidden;background:#fcfcfc}.vgxz95z-21{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background;display:flex;align-items:center;justify-content:flex-start;gap:10px;width:100%;padding:10px 12px;background:transparent;border:none;border-top:1px solid #e8e8eb;cursor:pointer;text-align:left}.vgxz95z-21:first-child{border-top:none}.vgxz95z-21:hover{background:#f0f0f2}.vgxz95z-22{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:2px;flex:1;min-width:0}.vgxz95z-23{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:12px;color:#0a0b0d}.vgxz95z-24{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10.5px;color:#6b6e76}.vgxz95z-25{display:flex;align-items:center;justify-content:flex-start;gap:10px;flex-shrink:0}.vgxz95z-26{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-variant-numeric:tabular-nums;font-size:11px;color:#6b6e76;min-width:44px;text-align:right}.vgxz95z-27{padding:18px 14px;text-align:center;font-size:11.5px;color:#6b6e76;border:1px dashed #e8e8eb;border-radius:var(--radius-md)}.v11wyrim-1{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;flex-shrink:0;border-right:1px solid #e8e8eb;background:#f7f7f8;overflow:hidden;position:relative}.v11wyrim-2{display:flex;align-items:center;justify-content:flex-start;gap:10px;padding:14px 16px;border-bottom:1px solid #e8e8eb}.v11wyrim-3{width:26px;height:26px;background:linear-gradient(135deg,#22d3ee,#0e7490);border-radius:7px;display:grid;place-items:center;color:#0a0b0d;font-weight:700;font-size:12.5px;letter-spacing:-.02em;box-shadow:0 0 20px #22d3ee33}.v11wyrim-4{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:1px;flex:1;min-width:0}.v11wyrim-5{font-size:13px;font-weight:600;letter-spacing:-.01em;color:#0a0b0d}.v11wyrim-6{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;color:#6b6e76;font-variant-numeric:tabular-nums}.v11wyrim-7{display:flex;align-items:center;justify-content:flex-start;gap:6px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color;margin:10px 12px 0;padding:0 8px;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);color:#6b6e76}.v11wyrim-7:focus-within{border-color:#22d3ee;background:#fcfcfc;color:#0a0b0d}.v11wyrim-7>svg{width:12px;height:12px;flex-shrink:0}.v11wyrim-8{flex:1;appearance:none;background:transparent;border:none;outline:none;padding:6px 0;font-size:12.5px;color:#0a0b0d;min-width:0}.v11wyrim-8::placeholder{color:#a4a7af}.v11wyrim-9{display:flex;align-items:center;justify-content:center;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;width:18px;height:18px;background:transparent;border:none;border-radius:var(--radius-sm);padding:0;color:#a4a7af;cursor:pointer;flex-shrink:0}.v11wyrim-9:hover{background:#ececee;color:#0a0b0d}.v11wyrim-9>svg{width:12px;height:12px}.v11wyrim-10{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 16px 6px}.v11wyrim-11{display:flex;align-items:center;justify-content:flex-start;gap:6px;flex-wrap:wrap;padding:10px 12px 0}.v11wyrim-12{display:flex;align-items:center;justify-content:flex-start;gap:5px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,border-color,color;appearance:none;border:1px solid #e8e8eb;border-radius:999px;background:#f0f0f2;color:#6b6e76;padding:4px 8px;font-size:10px;line-height:1;font-weight:500;text-transform:uppercase;cursor:pointer}.v11wyrim-12:hover{background:#ececee;color:#0a0b0d}.v11wyrim-12.v6lqv3n{background:#0a0b0d;border-color:#0a0b0d;color:#fcfcfc}.v11wyrim-12.v19qld18:not(.v6lqv3n){color:#16a34a;background:#16a34a14;border-color:#16a34a2e}.v11wyrim-12.v1cg0dpp:not(.v6lqv3n){color:#dc2626;background:#dc262614;border-color:#dc26262e}.v11wyrim-12.v87wrzh:not(.v6lqv3n){color:#0e7490;background:#22d3ee1a;border-color:#22d3ee38}.v11wyrim-12.vs27jp:not(.v6lqv3n){color:#ea580c;background:#ea580c14;border-color:#ea580c2e}.v11wyrim-12.vyxbtsk:not(.v6lqv3n){background:#e4e4e7}.v11wyrim-12.vfa0aud:not(.v6lqv3n){color:#ea580c;background:#ea580c1a;border-color:#ea580c38}.v11wyrim-12.vrfu41b:not(.v6lqv3n){color:#0e7490;background:#22d3ee17;border-color:#22d3ee33}.v11wyrim-12.v177364w:not(.v6lqv3n){color:#6b6e76;background:#f0f0f2;border-color:#e8e8eb}.v11wyrim-13{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;font-weight:650;font-variant-numeric:tabular-nums}.v11wyrim-14{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;font-weight:500;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:color;appearance:none;background:transparent;border:none;padding:0;color:#6b6e76;cursor:pointer}.v11wyrim-14:hover,.v11wyrim-14.v6lqv3n{color:#0a0b0d}.v11wyrim-15{display:flex;align-items:center;justify-content:flex-start;gap:4px}.v11wyrim-16{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-size:10px;color:#a4a7af;font-variant-numeric:tabular-nums}.v11wyrim-17{display:flex;align-items:center;justify-content:center;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;width:22px;height:22px;background:transparent;border:none;border-radius:var(--radius-sm);padding:0;color:#a4a7af;cursor:pointer}.v11wyrim-17:hover{background:#f0f0f2;color:#0a0b0d}.v11wyrim-17:disabled{opacity:.4;cursor:default}.v11wyrim-17>svg{width:14px;height:14px}.v11wyrim-18{flex:1;overflow:auto;padding-bottom:10px}.vwomtc5-1{padding:2px 0 10px}.vwomtc5-2{padding:20px;display:flex;flex-direction:column;align-items:flex-start;justify-content:flex-start;gap:10px}.vwomtc5-3{color:#6b6e76;font-size:11.5px;font-weight:600;letter-spacing:-.005em}.vwomtc5-4{color:#6b6e76;font-size:12px;line-height:1.5;white-space:pre-wrap}.vwomtc5-5{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";display:block;width:100%;overflow:auto;color:#0a0b0d;background:#f0f0f2;border:1px solid #e8e8eb;border-radius:var(--radius-sm);padding:10px 12px}.vwomtc5-6{display:flex;align-items:center;justify-content:flex-start;gap:8px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;position:relative;width:calc(100% - 16px);margin:1px 8px;background:transparent;border:none;border-radius:var(--radius-sm);text-align:left;color:#6b6e76;font-size:12.5px;line-height:20px;min-height:30px;padding-top:5px;padding-bottom:5px;padding-right:10px;overflow:hidden}.vwomtc5-6.depth0{padding-left:10px}.vwomtc5-6.depth1{padding-left:24px}.vwomtc5-6.depth2{padding-left:38px}.vwomtc5-6.depth3{padding-left:52px}.vwomtc5-6.active{background:#f0f0f2;color:#0a0b0d}.vwomtc5-6.active:before{content:"";position:absolute;left:-8px;top:6px;bottom:6px;width:2px;background:#22d3ee;border-radius:2px}.vwomtc5-7{display:flex;align-items:center;justify-content:flex-start;gap:8px;transition:.24s cubic-bezier(.4,0,.2,1);transition-property:background,color;position:relative;width:calc(100% - 16px);margin:1px 8px;background:transparent;border:none;border-radius:var(--radius-sm);text-align:left;color:#6b6e76;font-size:12.5px;line-height:20px;min-height:30px;padding-top:5px;padding-bottom:5px;padding-right:10px;overflow:hidden;cursor:pointer}.vwomtc5-7.vhb7hne{padding-left:10px}.vwomtc5-7.v1dycipb{padding-left:24px}.vwomtc5-7.v1qfp5hv{padding-left:38px}.vwomtc5-7.v5btrph{padding-left:52px}.vwomtc5-7.viu82ah{background:#f0f0f2;color:#0a0b0d}.vwomtc5-7.viu82ah:before{content:"";position:absolute;left:-8px;top:6px;bottom:6px;width:2px;background:#22d3ee;border-radius:2px}.vwomtc5-7:not(.viu82ah):hover{background:#fcfcfc;color:#0a0b0d}.vwomtc5-8{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform,background,color;display:inline-flex;width:18px;height:18px;align-items:center;justify-content:center;background:transparent;border:none;border-radius:var(--radius-sm);padding:0;color:#a4a7af;opacity:.8;flex-shrink:0;cursor:pointer}.vwomtc5-8:hover{background:#f0f0f2;color:#0a0b0d;opacity:1}.vwomtc5-8>svg{transition:.24s cubic-bezier(.4,0,.2,1);transition-property:transform;width:12px;height:12px}.vwomtc5-8.vk7wfis>svg{transform:rotate(90deg)}.vwomtc5-9{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;font-weight:600;font-size:12.5px;color:#0a0b0d}.vwomtc5-10{color:#a4a7af;font-weight:400}.vwomtc5-11{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;font-weight:500;font-size:12.5px}.vwomtc5-12{color:#a4a7af;font-weight:400}.vwomtc5-13{color:#a4a7af;font-weight:400;margin:0 4px}.vwomtc5-14{display:flex;align-items:center;justify-content:flex-start;gap:6px;flex-shrink:0}.vwomtc5-15{font-family:Geist Mono,JetBrains Mono,SF Mono,ui-monospace,monospace;font-feature-settings:"tnum","zero";font-size:10px;color:#a4a7af;font-variant-numeric:tabular-nums;flex-shrink:0}.v15ec1hr-1{height:100%;overflow:hidden;background:transparent}:root{color-scheme:light;--radius-sm: 6px;--radius-md: 8px;--radius-lg: 12px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html,body{height:100%;font-family:Geist,-apple-system,BlinkMacSystemFont,Inter,Segoe UI,system-ui,sans-serif;font-feature-settings:"ss01","ss03","cv11";background:#fcfcfc;color:#0a0b0d;font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;letter-spacing:-.005em}#root{height:100%}::selection{background:#22d3ee4d;color:#0a0b0d}button{cursor:pointer;font-family:inherit;font-size:inherit;color:inherit;letter-spacing:inherit}input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}a{color:#0e7490;text-decoration:none}a:hover{color:#22d3ee;text-decoration:underline;text-underline-offset:3px}
|