dsh-context 0.23.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/lib/client.js +261 -30
- package/lib/client.js.map +1 -1
- package/lib/index.js +145 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -53,6 +53,8 @@ Turns, steps, how many injections, compactions, and prunes have happened.
|
|
|
53
53
|
|
|
54
54
|
A six-color stacked bar scaled against the model's full context window (the gray track is your remaining headroom): system prompt, tool schemas, your messages, injected context, assistant replies, and tool results — plus the top-5 most expensive tool schemas. When a conversation starts degrading, this is where you find out *which part ate the budget*.
|
|
55
55
|
|
|
56
|
+
The headline occupancy and the composition counts read the **same official token-meter projections the chat composer's context ring reads** (`contextPressure` / `contextBreakdown`), so the legend's `≈` figures and proportions match the ring's click-open panel exactly; the message bucket is subdivided into the four surface categories by the fold's per-category ratios.
|
|
57
|
+
|
|
56
58
|
### 📈 History — watch the window grow (and get compacted)
|
|
57
59
|
|
|
58
60
|
One stacked bar per model request, finer than per-message. Toggle between **Turn** and **Step** granularity, scroll sideways through the session, hover any bar for a quick tooltip, and click to pin the full breakdown — including provider-reported actual prompt/output tokens next to the estimate. **Hovering a bar also drives the Context browser beside it** — the browser previews that step's assembled context in real time as you scrub across the history. **✂ marks where compaction or pruning happened** — watch the bars drop:
|
|
@@ -88,7 +90,7 @@ Six collapsible category sections (system prompt, tool schemas, user messages, i
|
|
|
88
90
|
|
|
89
91
|
### 🖼 Multimodal — image attachments in full view (DeepSeek Harness 0.1.1+)
|
|
90
92
|
|
|
91
|
-
Fully adapted to DeepSeek Harness 0.1.1's multimodal pipeline and the vision capability of **DeepSeek-V4-Flash-Vision-Exp**. A user message carrying images expands into a card layout — prose in the text card (with the usual raw/Markdown toggle), each image attachment as a thumbnail card with its name, normalized dimensions (plus the pre-normalization size when 0.1.1's image pipeline downscaled it) and
|
|
93
|
+
Fully adapted to DeepSeek Harness 0.1.1's multimodal pipeline and the vision capability of **DeepSeek-V4-Flash-Vision-Exp**. A user message carrying images expands into a card layout — prose in the text card (with the usual raw/Markdown toggle), each image attachment as a thumbnail card in an equal-width two-column grid with its name, normalized dimensions (plus the pre-normalization size when 0.1.1's image pipeline downscaled it), stored size, and **estimated token cost** — priced by DeepSeek's official image-size→token conversion (the docs' image token calculator; 117–384 tokens per image under the provider's per-image cap), the same estimate the message/token breakdowns carry — and anything unrecognized as raw content:
|
|
92
94
|
|
|
93
95
|

|
|
94
96
|
|
package/lib/client.js
CHANGED
|
@@ -118,7 +118,10 @@ window.__ModuleLoader__.load({
|
|
|
118
118
|
"attach.open": "查看原图",
|
|
119
119
|
"attach.loading": "…",
|
|
120
120
|
"attach.loadFailed": "加载失败 · 点击重试",
|
|
121
|
-
"attach.
|
|
121
|
+
"attach.raw": "原图",
|
|
122
|
+
"attach.sent": "发送",
|
|
123
|
+
"attach.token": "Token",
|
|
124
|
+
"attach.tokensTip": "按 DeepSeek 官方图片尺寸换算(单图上限 384 tokens)估算的 token 消耗"
|
|
122
125
|
};
|
|
123
126
|
const DICT_EN = {
|
|
124
127
|
"tab": "Context",
|
|
@@ -233,7 +236,10 @@ window.__ModuleLoader__.load({
|
|
|
233
236
|
"attach.open": "Open full image",
|
|
234
237
|
"attach.loading": "…",
|
|
235
238
|
"attach.loadFailed": "Load failed · click to retry",
|
|
236
|
-
"attach.
|
|
239
|
+
"attach.raw": "Raw",
|
|
240
|
+
"attach.sent": "Sent",
|
|
241
|
+
"attach.token": "Token",
|
|
242
|
+
"attach.tokensTip": "Estimated token cost via DeepSeek's official image-size conversion (384-token cap per image)"
|
|
237
243
|
};
|
|
238
244
|
//#endregion
|
|
239
245
|
//#region src/client/modalStore.ts
|
|
@@ -350,6 +356,12 @@ window.__ModuleLoader__.load({
|
|
|
350
356
|
color: "#14b8a6"
|
|
351
357
|
}
|
|
352
358
|
];
|
|
359
|
+
const MESSAGE_CATS = [
|
|
360
|
+
"user",
|
|
361
|
+
"inject",
|
|
362
|
+
"assistant",
|
|
363
|
+
"tool"
|
|
364
|
+
];
|
|
353
365
|
function partsOf(breakdown) {
|
|
354
366
|
return CATS.map((c) => {
|
|
355
367
|
return {
|
|
@@ -360,25 +372,70 @@ window.__ModuleLoader__.load({
|
|
|
360
372
|
});
|
|
361
373
|
}
|
|
362
374
|
/**
|
|
375
|
+
* Build the pie-consistent raw parts: system/tools/messages take the
|
|
376
|
+
* OFFICIAL `contextBreakdown` figures when delivered (the exact counts the
|
|
377
|
+
* chat ring's panel shows), with the message bucket subdivided into the
|
|
378
|
+
* four surface categories by the fold's per-category ratios (rounding
|
|
379
|
+
* residue lands on the largest category, so the four always sum exactly to
|
|
380
|
+
* the official message figure). Absent the projection, the fold's own sums
|
|
381
|
+
* serve — the same fixed estimator, so identical on image-free sessions.
|
|
382
|
+
*/
|
|
383
|
+
function officialParts(current, breakdown) {
|
|
384
|
+
const foldSurface = current.user + current.inject + current.assistant + current.tool;
|
|
385
|
+
const system = breakdown?.systemTokens ?? current.system;
|
|
386
|
+
const tools = breakdown?.toolsTokens ?? current.tools;
|
|
387
|
+
const messages = breakdown?.messageTokens ?? foldSurface;
|
|
388
|
+
const shares = {
|
|
389
|
+
system,
|
|
390
|
+
tools
|
|
391
|
+
};
|
|
392
|
+
if (foldSurface > 0) {
|
|
393
|
+
let assigned = 0;
|
|
394
|
+
let largest = "user";
|
|
395
|
+
for (const cat of MESSAGE_CATS) {
|
|
396
|
+
const count = Math.round(messages * (current[cat] / foldSurface));
|
|
397
|
+
shares[cat] = count;
|
|
398
|
+
assigned += count;
|
|
399
|
+
if (current[cat] > current[largest]) largest = cat;
|
|
400
|
+
}
|
|
401
|
+
shares[largest] = Math.max(0, shares[largest] + messages - assigned);
|
|
402
|
+
} else for (const cat of MESSAGE_CATS) shares[cat] = 0;
|
|
403
|
+
return CATS.map((c) => ({
|
|
404
|
+
key: c.key,
|
|
405
|
+
color: c.color,
|
|
406
|
+
value: shares[c.key] ?? 0
|
|
407
|
+
}));
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
363
410
|
* Reproportion heuristic parts so they sum to a provider-anchored target —
|
|
364
411
|
* the same trick the official ContextMeter uses: the heuristic breakdown
|
|
365
|
-
* supplies the composition RATIOS, the provider sample the total.
|
|
366
|
-
*
|
|
412
|
+
* supplies the composition RATIOS, the provider sample the total. The
|
|
413
|
+
* anchored figure rides `value` (bar widths); the heuristic count stays on
|
|
414
|
+
* `raw` for the legend and tooltips. Returns the parts unchanged when no
|
|
415
|
+
* anchor applies.
|
|
367
416
|
*/
|
|
368
417
|
function anchoredParts(parts, target) {
|
|
369
|
-
|
|
418
|
+
const sourced = parts.map((p) => ({
|
|
419
|
+
...p,
|
|
420
|
+
raw: p.raw ?? p.value
|
|
421
|
+
}));
|
|
422
|
+
if (target === null || target <= 0) return sourced;
|
|
370
423
|
let total = 0;
|
|
371
|
-
for (const p of
|
|
372
|
-
if (total <= 0
|
|
424
|
+
for (const p of sourced) total += p.raw;
|
|
425
|
+
if (total <= 0) return sourced;
|
|
426
|
+
if (total === target) return sourced.map((p) => ({
|
|
427
|
+
...p,
|
|
428
|
+
value: p.raw
|
|
429
|
+
}));
|
|
373
430
|
const scale = target / total;
|
|
374
|
-
return
|
|
431
|
+
return sourced.map((p) => ({
|
|
375
432
|
...p,
|
|
376
|
-
value: Math.round(p.
|
|
433
|
+
value: Math.round(p.raw * scale)
|
|
377
434
|
}));
|
|
378
435
|
}
|
|
379
436
|
//#endregion
|
|
380
437
|
//#region src/client/headline.ts
|
|
381
|
-
function headlineOf(data, pressure = null) {
|
|
438
|
+
function headlineOf(data, pressure = null, breakdown = null) {
|
|
382
439
|
const current = data.current;
|
|
383
440
|
const projected = pressure !== null && typeof pressure.projectedTokens === "number" ? pressure.projectedTokens : void 0;
|
|
384
441
|
const requests = data.requests;
|
|
@@ -391,7 +448,7 @@ window.__ModuleLoader__.load({
|
|
|
391
448
|
tokens,
|
|
392
449
|
window,
|
|
393
450
|
pct: window !== void 0 && window > 0 ? Math.min(100, Math.round(tokens / window * 100)) : null,
|
|
394
|
-
parts: anchoredParts(
|
|
451
|
+
parts: anchoredParts(officialParts(current, breakdown), occupancyTokens !== null && tokens > 0 ? tokens : null)
|
|
395
452
|
};
|
|
396
453
|
}
|
|
397
454
|
//#endregion
|
|
@@ -483,6 +540,26 @@ window.__ModuleLoader__.load({
|
|
|
483
540
|
}
|
|
484
541
|
/**
|
|
485
542
|
* Narrow a delivered projection value to the official token-meter
|
|
543
|
+
* `contextBreakdown` projection (the heuristic composition rows of the chat
|
|
544
|
+
* ring's panel). Every figure must be a finite number — a partial/corrupt
|
|
545
|
+
* value degrades to null so the composition card falls back to the fold's
|
|
546
|
+
* own sums instead of mixing sources.
|
|
547
|
+
*/
|
|
548
|
+
function contextBreakdownOf(value) {
|
|
549
|
+
const data = asRecord(value);
|
|
550
|
+
if (data === null) return null;
|
|
551
|
+
const { systemTokens, toolsTokens, messageTokens } = data;
|
|
552
|
+
if (typeof systemTokens !== "number" || !Number.isFinite(systemTokens)) return null;
|
|
553
|
+
if (typeof toolsTokens !== "number" || !Number.isFinite(toolsTokens)) return null;
|
|
554
|
+
if (typeof messageTokens !== "number" || !Number.isFinite(messageTokens)) return null;
|
|
555
|
+
return {
|
|
556
|
+
systemTokens,
|
|
557
|
+
toolsTokens,
|
|
558
|
+
messageTokens
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Narrow a delivered projection value to the official token-meter
|
|
486
563
|
* `tokenUsage` projection (durable cumulative provider usage). Absent key or
|
|
487
564
|
* value = the meter's projection is not composed (or no request has reported
|
|
488
565
|
* usage yet) — callers drop the cache-hit cell to a dash.
|
|
@@ -613,6 +690,136 @@ window.__ModuleLoader__.load({
|
|
|
613
690
|
return d.toLocaleTimeString("en-GB", { hour12: false });
|
|
614
691
|
}
|
|
615
692
|
//#endregion
|
|
693
|
+
//#region src/shared/imageTokens.ts
|
|
694
|
+
/**
|
|
695
|
+
* Per-image token estimate for DeepSeek's vision model — a faithful port of
|
|
696
|
+
* the official "图片 Token 计算器" (Image Token Calculator) shipped on the
|
|
697
|
+
* DeepSeek API docs (https://api-docs.deepseek.com/zh-cn/quick_start/token_usage),
|
|
698
|
+
* which implements the provider's own image→token conversion:
|
|
699
|
+
*
|
|
700
|
+
* - every image is aspect-preserved rescaled before entering the model:
|
|
701
|
+
* below ~384×384 total pixels it is enlarged, above it is shrunk;
|
|
702
|
+
* - tokens follow the patch grid (patch 14px, downsample 3), so every
|
|
703
|
+
* image costs at least 117 and at most ~384 tokens (the documented cap).
|
|
704
|
+
*
|
|
705
|
+
* Verified against the docs calculator itself: 2048×1365→313, 800×600→341,
|
|
706
|
+
* 2048×2048→349, 512×512→201, 100×100→117, 1920×1080→369, 400×900→249.
|
|
707
|
+
* The DSH request pipeline's own 640k-pixel pre-resize does not change the
|
|
708
|
+
* result (the provider formula rescales to the same patch grid), so the
|
|
709
|
+
* durable attachment dimensions can be fed in directly.
|
|
710
|
+
*
|
|
711
|
+
* Pure math shared by the Host fold (message pricing) and the Client
|
|
712
|
+
* (attachment card token badges) — no dependencies, never mutates.
|
|
713
|
+
*/
|
|
714
|
+
const PATCH_SIZE = 14;
|
|
715
|
+
const DOWNSAMPLE_RATIO = 3;
|
|
716
|
+
const MAX_WH_RATIO = 8;
|
|
717
|
+
/** ~384×384 total pixels: smaller images are enlarged before patching. */
|
|
718
|
+
const MIN_PIXELS = 147456;
|
|
719
|
+
const floorDiv = (a, b) => Math.floor(a / b);
|
|
720
|
+
const ceilDiv = (a, b) => Math.floor((a + b - 1) / b);
|
|
721
|
+
/** Token count of one patch grid (rows×cols) under the v4 layout rule. */
|
|
722
|
+
function gridTokens(rows, cols) {
|
|
723
|
+
let n = rows * (cols + 1) + 2;
|
|
724
|
+
if (rows % 2 === 1) n += cols + 1;
|
|
725
|
+
n += ceilDiv(rows, 2) * (cols + 1) % 2 * 2;
|
|
726
|
+
return n;
|
|
727
|
+
}
|
|
728
|
+
/** Solve the largest in-grid resize whose token count fits `budget`. */
|
|
729
|
+
function solveResizeRatio(height, width, budget) {
|
|
730
|
+
const ratio = height / width;
|
|
731
|
+
const gridW = Math.sqrt((budget - 2) / ratio + .25) - .5;
|
|
732
|
+
const gridH = gridW * ratio;
|
|
733
|
+
const unit = 42;
|
|
734
|
+
let bestHeight;
|
|
735
|
+
let bestWidth;
|
|
736
|
+
if (gridW < 1) {
|
|
737
|
+
let rows = floorDiv(budget - 2, 2);
|
|
738
|
+
if (rows % 2 === 1) rows -= 1;
|
|
739
|
+
bestWidth = unit;
|
|
740
|
+
bestHeight = rows * unit;
|
|
741
|
+
} else if (gridH < 2) {
|
|
742
|
+
const cols = floorDiv(budget - 2, 2) - 1;
|
|
743
|
+
if (cols <= 1) throw new Error("image tokens: budget too small to solve");
|
|
744
|
+
bestHeight = 84;
|
|
745
|
+
bestWidth = cols * unit;
|
|
746
|
+
} else {
|
|
747
|
+
const cols = Math.trunc(gridW);
|
|
748
|
+
let rows = Math.trunc(gridH);
|
|
749
|
+
if (rows % 2 === 1) rows -= 1;
|
|
750
|
+
const scale = Math.min(cols * unit / width, rows * unit / height);
|
|
751
|
+
bestWidth = Math.trunc(width * scale / PATCH_SIZE) * PATCH_SIZE;
|
|
752
|
+
bestHeight = Math.trunc(height * scale / PATCH_SIZE) * PATCH_SIZE;
|
|
753
|
+
}
|
|
754
|
+
const nLlmH = ceilDiv(floorDiv(bestHeight, PATCH_SIZE), DOWNSAMPLE_RATIO);
|
|
755
|
+
const nLlmW = ceilDiv(floorDiv(bestWidth, PATCH_SIZE), DOWNSAMPLE_RATIO);
|
|
756
|
+
return {
|
|
757
|
+
nLlmH,
|
|
758
|
+
nLlmW,
|
|
759
|
+
bestHeight,
|
|
760
|
+
bestWidth,
|
|
761
|
+
numTokens: gridTokens(nLlmH, nLlmW)
|
|
762
|
+
};
|
|
763
|
+
}
|
|
764
|
+
/** Resize so the patch grid fits the cap, then re-add the pad reserve. */
|
|
765
|
+
function safeResize(height, width, paddedHeight, paddedWidth) {
|
|
766
|
+
const nLlmH = ceilDiv(floorDiv(paddedHeight, PATCH_SIZE), DOWNSAMPLE_RATIO);
|
|
767
|
+
const nLlmW = ceilDiv(floorDiv(paddedWidth, PATCH_SIZE), DOWNSAMPLE_RATIO);
|
|
768
|
+
const pad = 3;
|
|
769
|
+
const budget = 381;
|
|
770
|
+
let result = {
|
|
771
|
+
nLlmH,
|
|
772
|
+
nLlmW,
|
|
773
|
+
bestHeight: paddedHeight,
|
|
774
|
+
bestWidth: paddedWidth,
|
|
775
|
+
numTokens: gridTokens(nLlmH, nLlmW)
|
|
776
|
+
};
|
|
777
|
+
if (result.numTokens > budget) {
|
|
778
|
+
result = solveResizeRatio(height, width, budget);
|
|
779
|
+
let nextBudget = budget;
|
|
780
|
+
while (result.numTokens > budget) {
|
|
781
|
+
nextBudget -= 1;
|
|
782
|
+
result = solveResizeRatio(height, width, nextBudget);
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
result.numTokens += pad;
|
|
786
|
+
return result;
|
|
787
|
+
}
|
|
788
|
+
function calcResizeInner(width, height) {
|
|
789
|
+
let w = width;
|
|
790
|
+
let h = height;
|
|
791
|
+
if (w > h * MAX_WH_RATIO) w = h * MAX_WH_RATIO;
|
|
792
|
+
const pixels = w * h;
|
|
793
|
+
if (pixels < MIN_PIXELS && pixels > 0) {
|
|
794
|
+
const scale = Math.sqrt(MIN_PIXELS / pixels);
|
|
795
|
+
w = Math.trunc(w * scale);
|
|
796
|
+
h = Math.trunc(h * scale);
|
|
797
|
+
}
|
|
798
|
+
const paddedWidth = ceilDiv(w, PATCH_SIZE) * PATCH_SIZE;
|
|
799
|
+
const paddedHeight = ceilDiv(h, PATCH_SIZE) * PATCH_SIZE;
|
|
800
|
+
return safeResize(h, w, paddedHeight, paddedWidth);
|
|
801
|
+
}
|
|
802
|
+
/**
|
|
803
|
+
* Estimate the tokens one image consumes in a DeepSeek vision request, from
|
|
804
|
+
* its pixel dimensions. Returns null for non-positive/non-finite dimensions
|
|
805
|
+
* or when the official iteration fails to converge — callers fall back to
|
|
806
|
+
* the generic structural price.
|
|
807
|
+
*/
|
|
808
|
+
function estimateImageTokens(width, height) {
|
|
809
|
+
if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return null;
|
|
810
|
+
try {
|
|
811
|
+
let result = calcResizeInner(width, height);
|
|
812
|
+
for (let i = 1; i < 10; i++) {
|
|
813
|
+
const next = calcResizeInner(result.bestWidth, result.bestHeight);
|
|
814
|
+
if (next.nLlmH === result.nLlmH && next.nLlmW === result.nLlmW && next.bestHeight === result.bestHeight && next.bestWidth === result.bestWidth && next.numTokens === result.numTokens) return result.numTokens;
|
|
815
|
+
result = next;
|
|
816
|
+
}
|
|
817
|
+
return null;
|
|
818
|
+
} catch {
|
|
819
|
+
return null;
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
//#endregion
|
|
616
823
|
//#region src/client/components/images.tsx
|
|
617
824
|
/**
|
|
618
825
|
* Narrow an unknown content block to a durable image reference. Accepts both
|
|
@@ -647,11 +854,13 @@ window.__ModuleLoader__.load({
|
|
|
647
854
|
/**
|
|
648
855
|
* One attachment card: a 64px cover tile (click opens the full image in a
|
|
649
856
|
* new tab; load failures retry on click) beside a metadata column — display
|
|
650
|
-
* name,
|
|
651
|
-
* records
|
|
857
|
+
* name, then one labeled row per known fact: Raw (the pre-normalization
|
|
858
|
+
* raster dsh 0.1.1 records when normalization reduced the image), Sent (the
|
|
859
|
+
* normalized raster the model receives, with its stored byte size), and the
|
|
860
|
+
* estimated provider-billed tokens. Unknown facts leave no row behind.
|
|
652
861
|
*/
|
|
653
862
|
function makeImageCard(kit) {
|
|
654
|
-
const { t } = kit;
|
|
863
|
+
const { t, fmt } = kit;
|
|
655
864
|
return function ImageCard(props) {
|
|
656
865
|
const { attachment, load } = props;
|
|
657
866
|
const [src, setSrc] = React.useState(null);
|
|
@@ -676,12 +885,24 @@ window.__ModuleLoader__.load({
|
|
|
676
885
|
attempt
|
|
677
886
|
]);
|
|
678
887
|
const name = attachment.name ?? t("attach.image");
|
|
679
|
-
const
|
|
680
|
-
const
|
|
681
|
-
const
|
|
682
|
-
if (
|
|
683
|
-
|
|
684
|
-
|
|
888
|
+
const dimsOf = (w, h) => w !== void 0 && h !== void 0 ? `${w}×${h}` : null;
|
|
889
|
+
const rows = [];
|
|
890
|
+
const raw = attachment.originalDimensions !== void 0 ? dimsOf(attachment.originalDimensions.width, attachment.originalDimensions.height) : null;
|
|
891
|
+
if (raw !== null) rows.push({
|
|
892
|
+
label: t("attach.raw"),
|
|
893
|
+
value: raw
|
|
894
|
+
});
|
|
895
|
+
const sent = dimsOf(attachment.width, attachment.height);
|
|
896
|
+
if (sent !== null) rows.push({
|
|
897
|
+
label: t("attach.sent"),
|
|
898
|
+
value: attachment.bytes !== void 0 ? `${sent} · ${fmtBytes(attachment.bytes)}` : sent
|
|
899
|
+
});
|
|
900
|
+
const tokens = attachment.width !== void 0 && attachment.height !== void 0 ? estimateImageTokens(attachment.width, attachment.height) : null;
|
|
901
|
+
if (tokens !== null) rows.push({
|
|
902
|
+
label: t("attach.token"),
|
|
903
|
+
value: `≈${fmt(tokens)}`,
|
|
904
|
+
tip: t("attach.tokensTip")
|
|
905
|
+
});
|
|
685
906
|
const open = () => {
|
|
686
907
|
if (src === null) return;
|
|
687
908
|
try {
|
|
@@ -701,7 +922,11 @@ window.__ModuleLoader__.load({
|
|
|
701
922
|
}) : /* @__PURE__ */ React.createElement("span", { className: error ? "lc-att-err" : "lc-att-ph" }, error ? "⚠" : load === void 0 ? "🖼" : t("attach.loading"))), /* @__PURE__ */ React.createElement("div", { className: "lc-att-meta" }, /* @__PURE__ */ React.createElement("span", {
|
|
702
923
|
className: "lc-att-name",
|
|
703
924
|
title: name
|
|
704
|
-
}, name),
|
|
925
|
+
}, name), rows.map((r) => /* @__PURE__ */ React.createElement("span", {
|
|
926
|
+
key: r.label,
|
|
927
|
+
className: "lc-att-row",
|
|
928
|
+
title: r.tip
|
|
929
|
+
}, /* @__PURE__ */ React.createElement("b", { className: "lc-att-row-label" }, r.label), r.value))));
|
|
705
930
|
};
|
|
706
931
|
}
|
|
707
932
|
//#endregion
|
|
@@ -1364,11 +1589,14 @@ window.__ModuleLoader__.load({
|
|
|
1364
1589
|
};
|
|
1365
1590
|
} else {
|
|
1366
1591
|
let acc = 0;
|
|
1592
|
+
let rawTotal = 0;
|
|
1593
|
+
for (const p of props.parts) rawTotal += p.raw ?? p.value;
|
|
1367
1594
|
for (const p of props.parts) {
|
|
1368
1595
|
const pct = scale > 0 ? p.value / scale * 100 : 0;
|
|
1369
1596
|
if (p.key === props.hoverKey && p.value > 0) {
|
|
1597
|
+
const count = p.raw ?? p.value;
|
|
1370
1598
|
tip = {
|
|
1371
|
-
text: `${catLabel(p.key)} ≈${fmt(
|
|
1599
|
+
text: `${catLabel(p.key)} ≈${fmt(count)} (${rawTotal > 0 ? Math.round(count / rawTotal * 100) : 0}%) ` + t("overview.ofUsed"),
|
|
1372
1600
|
leftPct: Math.max(12, Math.min(acc + pct / 2, 88))
|
|
1373
1601
|
};
|
|
1374
1602
|
break;
|
|
@@ -1431,8 +1659,9 @@ window.__ModuleLoader__.load({
|
|
|
1431
1659
|
const { t, fmt, catLabel } = kit;
|
|
1432
1660
|
return function Legend(props) {
|
|
1433
1661
|
let total = 0;
|
|
1434
|
-
for (const p of props.parts) total += p.value;
|
|
1662
|
+
for (const p of props.parts) total += p.raw ?? p.value;
|
|
1435
1663
|
return /* @__PURE__ */ React.createElement("div", { className: "lc-legend" }, props.parts.map((p) => {
|
|
1664
|
+
const count = p.raw ?? p.value;
|
|
1436
1665
|
const on = props.hoverKey !== void 0 && props.hoverKey === p.key;
|
|
1437
1666
|
return /* @__PURE__ */ React.createElement("span", {
|
|
1438
1667
|
key: p.key,
|
|
@@ -1444,7 +1673,7 @@ window.__ModuleLoader__.load({
|
|
|
1444
1673
|
onMouseLeave: () => {
|
|
1445
1674
|
if (props.onHoverKey !== void 0) props.onHoverKey(null);
|
|
1446
1675
|
}
|
|
1447
|
-
}, /* @__PURE__ */ React.createElement("i", { style: { background: p.color } }), /* @__PURE__ */ React.createElement("span", { className: "lc-chip-label" }, catLabel(p.key)), /* @__PURE__ */ React.createElement("span", { className: "lc-chip-nums" }, "≈" + fmt(
|
|
1676
|
+
}, /* @__PURE__ */ React.createElement("i", { style: { background: p.color } }), /* @__PURE__ */ React.createElement("span", { className: "lc-chip-label" }, catLabel(p.key)), /* @__PURE__ */ React.createElement("span", { className: "lc-chip-nums" }, "≈" + fmt(count), total > 0 ? /* @__PURE__ */ React.createElement("em", null, `${Math.round(count / total * 100)}%`) : null));
|
|
1448
1677
|
}));
|
|
1449
1678
|
};
|
|
1450
1679
|
}
|
|
@@ -1529,6 +1758,7 @@ window.__ModuleLoader__.load({
|
|
|
1529
1758
|
const open = typeof props.useContextModal === "function" ? props.useContextModal((s) => s) : false;
|
|
1530
1759
|
const data = typeof props.useProjection === "function" ? timelineOf(props.useProjection("contextTimeline")) : null;
|
|
1531
1760
|
const pressure = typeof props.useProjection === "function" ? contextPressureOf(props.useProjection("contextPressure")) : null;
|
|
1761
|
+
const breakdown = typeof props.useProjection === "function" ? contextBreakdownOf(props.useProjection("contextBreakdown")) : null;
|
|
1532
1762
|
const headers = typeof props.useProjection === "function" ? headersOf(props.useProjection("contextHeaders")) : null;
|
|
1533
1763
|
const [hoverCat, setHoverCat] = React.useState(null);
|
|
1534
1764
|
const [toolFocus, setToolFocus] = React.useState(null);
|
|
@@ -1556,7 +1786,7 @@ window.__ModuleLoader__.load({
|
|
|
1556
1786
|
};
|
|
1557
1787
|
}, [open, close]);
|
|
1558
1788
|
if (!open) return null;
|
|
1559
|
-
const head = data !== null ? headlineOf(data, pressure) : null;
|
|
1789
|
+
const head = data !== null ? headlineOf(data, pressure, breakdown) : null;
|
|
1560
1790
|
const subtitle = data !== null ? (data.model ? data.model : "") + (data.provider ? " · " + data.provider : "") : "";
|
|
1561
1791
|
return /* @__PURE__ */ React.createElement("div", {
|
|
1562
1792
|
className: "lc-modal-backdrop",
|
|
@@ -1737,7 +1967,7 @@ window.__ModuleLoader__.load({
|
|
|
1737
1967
|
return function PluginInfo() {
|
|
1738
1968
|
const [latest, setLatest] = React.useState(null);
|
|
1739
1969
|
React.useEffect(() => {
|
|
1740
|
-
if ("0.
|
|
1970
|
+
if ("0.24.1".includes("-dev")) return;
|
|
1741
1971
|
let on = true;
|
|
1742
1972
|
fetchLatestVersion().then((v) => {
|
|
1743
1973
|
if (on && v) setLatest(v);
|
|
@@ -1746,8 +1976,8 @@ window.__ModuleLoader__.load({
|
|
|
1746
1976
|
on = false;
|
|
1747
1977
|
};
|
|
1748
1978
|
}, []);
|
|
1749
|
-
const update = latest !== null && isNewerVersion(latest, "0.
|
|
1750
|
-
const nameValue = ["dsh-context (v0.
|
|
1979
|
+
const update = latest !== null && isNewerVersion(latest, "0.24.1") ? latest : null;
|
|
1980
|
+
const nameValue = ["dsh-context (v0.24.1)"];
|
|
1751
1981
|
if (update) nameValue.push(/* @__PURE__ */ React.createElement("span", {
|
|
1752
1982
|
key: "update",
|
|
1753
1983
|
className: "lc-pi-update"
|
|
@@ -2186,6 +2416,7 @@ window.__ModuleLoader__.load({
|
|
|
2186
2416
|
const data = typeof props.useProjection === "function" ? timelineOf(props.useProjection("contextTimeline")) : null;
|
|
2187
2417
|
const pressure = typeof props.useProjection === "function" ? contextPressureOf(props.useProjection("contextPressure")) : null;
|
|
2188
2418
|
const usage = typeof props.useProjection === "function" ? tokenUsageOf(props.useProjection("tokenUsage")) : null;
|
|
2419
|
+
const breakdown = typeof props.useProjection === "function" ? contextBreakdownOf(props.useProjection("contextBreakdown")) : null;
|
|
2189
2420
|
const headers = typeof props.useProjection === "function" ? headersOf(props.useProjection("contextHeaders")) : null;
|
|
2190
2421
|
const [selectedSeq, setSelectedSeq] = React.useState(null);
|
|
2191
2422
|
const [hoveredSeq, setHoveredSeq] = React.useState(null);
|
|
@@ -2268,7 +2499,7 @@ window.__ModuleLoader__.load({
|
|
|
2268
2499
|
break;
|
|
2269
2500
|
}
|
|
2270
2501
|
}
|
|
2271
|
-
const head = headlineOf(data, pressure);
|
|
2502
|
+
const head = headlineOf(data, pressure, breakdown);
|
|
2272
2503
|
const localeSvc = ctx.get("locale");
|
|
2273
2504
|
const activeLocale = localeSvc !== void 0 && typeof localeSvc.getLocale === "function" ? localeSvc.getLocale().active : "en";
|
|
2274
2505
|
return /* @__PURE__ */ React.createElement("div", {
|
|
@@ -2361,7 +2592,7 @@ window.__ModuleLoader__.load({
|
|
|
2361
2592
|
}
|
|
2362
2593
|
//#endregion
|
|
2363
2594
|
//#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles.css.mjs
|
|
2364
|
-
const css = ".lc-root{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);padding:16px 20px 32px;font-size:13px;overflow-y:auto}.lc-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;margin-bottom:14px;padding:14px 16px}.lc-card-title{align-items:baseline;gap:8px;margin-bottom:10px;font-weight:600;display:flex}.lc-card-title-text{white-space:nowrap;flex:none}.lc-stats{grid-template-columns:repeat(auto-fit,minmax(92px,1fr));gap:8px;display:grid}.lc-stat{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex-direction:column;gap:2px;min-width:0;padding:8px 10px;display:flex}.lc-stat-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;font-weight:600;overflow:hidden}.lc-stat-value{color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;text-align:center;font-size:14px;font-weight:600;overflow:hidden}.lc-stat-sub{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;overflow:hidden}.lc-stat-tipped{position:relative}.lc-stat-q{text-align:center;width:11px;height:11px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);cursor:help;border-radius:50%;margin-left:4px;font-size:9px;font-style:normal;font-weight:700;line-height:11px;display:inline-block}.lc-stat-tipped:hover .lc-stat-q{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-primary)}.lc-stat-tip{z-index:6;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:280px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;font-weight:400;line-height:1.5;transition:opacity .12s;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-stat-tipped:hover .lc-stat-tip{opacity:1}.lc-stat-tip-prices{border-top:1px dashed var(--dsw-alias-border-l1);margin-top:5px;padding-top:5px;display:block}.lc-stat-tip-head{font-weight:600;display:block}.lc-stat-tip-row{margin-top:2px;display:block}.lc-stat-tip-model{color:var(--dsw-alias-label-primary)}.lc-card-sub{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:400}.lc-gran,.lc-kinds{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;gap:2px;margin-left:auto;padding:1px;display:flex}.lc-gran-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-gran-btn:hover{color:var(--dsw-alias-label-primary)}.lc-gran-on,.lc-gran-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-overview-num{align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.lc-overview-num>b{font-size:20px}.lc-overview-num span{color:var(--dsw-alias-label-secondary)}.lc-overview-pct{margin-left:auto;font-size:11px}.lc-overview-pct b{color:var(--dsw-alias-label-primary);margin-right:4px;font-size:20px}.lc-stacked-wrap{width:100%;position:relative}.lc-stacked{background:#8080802e;border-radius:5px;width:100%;display:flex;position:relative;overflow:hidden}.lc-occupied-box{border:2px solid var(--dsw-alias-label-tertiary);box-sizing:border-box;pointer-events:none;opacity:0;box-shadow:0 0 0 1px var(--dsw-alias-bg-layer-2);border-radius:5px;transition:opacity .12s;position:absolute;top:0;bottom:0;left:0}.lc-occupied-box-on{opacity:1}.lc-bar-tip{z-index:5;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:3px 8px;font-size:12px;transition:opacity .12s;position:absolute;bottom:calc(100% + 6px);transform:translate(-50%);box-shadow:0 2px 8px #0000002e}.lc-bar-tip-on{opacity:1}.lc-stacked>div{height:100%}.lc-stacked-seg{transition:filter .12s,opacity .12s}.lc-stacked-free{box-sizing:border-box;transition:box-shadow .12s,opacity .12s}.lc-stacked-seg-on{filter:brightness(1.18)}.lc-reserve{z-index:1;pointer-events:auto;cursor:help;background:repeating-linear-gradient(45deg, color-mix(in srgb, var(--dsw-alias-state-warn-primary) 24%, transparent) 0 5px, transparent 5px 10px);position:absolute;top:0;bottom:0}.lc-stacked-free-on{border:2px dashed var(--dsw-alias-label-secondary);border-radius:3px}.lc-stacked-dim .lc-stacked-seg{opacity:.35}.lc-stacked-dim .lc-stacked-seg-on{opacity:1}.lc-stacked-dim .lc-stacked-free{opacity:.35}.lc-stacked-dim .lc-stacked-free-on{opacity:1}.lc-legend{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:6px 14px;margin-top:10px;display:grid}.lc-chip{min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:5px;padding:1px 6px;transition:background-color .12s;display:flex}.lc-chip-label{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:600;overflow:hidden}.lc-chip-nums{white-space:nowrap;flex:none;align-items:baseline;gap:6px;margin-left:auto;display:inline-flex}.lc-chip i,.lc-detail-row i,.lc-node i{border-radius:2px;width:8px;height:8px;display:inline-block}.lc-chip i{transition:box-shadow .12s}.lc-chip em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-chip-on{background:var(--dsw-alias-interactive-bg-hover);font-weight:600}.lc-chip-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-tools{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:6px;margin-top:10px;display:flex}.lc-tools-label,.lc-tools-more{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;padding:0;font-family:inherit;font-size:12px}.lc-tools-label:hover,.lc-tools-more:hover{text-decoration:underline}.lc-tool-chip{background:var(--dsw-alias-bg-layer-2);font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:0;border-radius:4px;padding:1px 7px;font-size:12px}.lc-tool-chip:hover{text-decoration:underline}.lc-chartrow{align-items:stretch;gap:6px;display:flex}.lc-axis{box-sizing:border-box;width:40px;height:150px;color:var(--dsw-alias-label-secondary);padding-top:18px;font-size:11px;position:relative}.lc-axis span{line-height:1;position:absolute;right:0}.lc-axis-top{top:13px}.lc-axis-mid{top:69px}.lc-axis-bot{top:125px}.lc-chart-scroll{scrollbar-width:thin;flex:1;min-width:0;padding-bottom:8px;position:relative;overflow:auto hidden}.lc-chart-fade{pointer-events:none;z-index:2;width:26px;position:absolute;top:0;bottom:0}.lc-chart-fade-l{background:linear-gradient(to right, var(--dsw-alias-bg-layer-1), transparent);left:0}.lc-chart-fade-r{background:linear-gradient(to left, var(--dsw-alias-bg-layer-1), transparent);right:0}.lc-chart{box-sizing:border-box;align-items:flex-end;gap:2px;width:max-content;min-width:100%;height:130px;padding-top:18px;display:flex;position:relative}.lc-grid{border-top:1px dashed var(--dsw-alias-border-l1);pointer-events:none;position:absolute;left:0;right:0}.lc-grid-top{top:18px}.lc-grid-mid{top:74px}.lc-bar{cursor:pointer;border-radius:2px;flex:none;align-items:flex-end;width:14px;height:100%;transition:opacity .12s,background-color .12s;display:flex;position:relative}.lc-chart-dim .lc-bar{opacity:.35}.lc-chart-dim .lc-bar-in-turn{opacity:1}.lc-chart-dim .lc-turn{opacity:.35}.lc-chart-dim .lc-turn-on{opacity:1}.lc-chart-tip{z-index:5;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);pointer-events:none;border-radius:6px;padding:3px 8px;font-size:12px;position:absolute;top:0;transform:translate(-50%);box-shadow:0 2px 8px #0000002e}.lc-bar:hover{background:var(--dsw-alias-bg-layer-2)}.lc-bar-hovered{outline:1px dashed var(--dsw-alias-brand-primary);outline-offset:1px}.lc-bar-selected{outline:2px solid var(--dsw-alias-label-primary);outline-offset:1px}.lc-bar-in-turn{background:#80808024}.lc-bar-stack{flex-direction:column-reverse;width:100%;display:flex}.lc-bar-stack>div{width:100%}.lc-bar-marker{color:var(--dsw-alias-state-warn-primary);font-size:11px;position:absolute;top:-16px;left:50%;transform:translate(-50%)}.lc-turns{gap:2px;width:max-content;min-width:100%;margin-top:4px;display:flex}.lc-turn{box-sizing:border-box;text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;border-radius:3px;flex:none;height:14px;font-size:10px;font-weight:600;line-height:14px;transition:filter .12s,opacity .12s;overflow:hidden}.lc-turn-on{filter:brightness(1.35);color:var(--dsw-alias-label-primary)}.lc-detail{border-top:1px solid var(--dsw-alias-border-l1);margin-top:12px;padding-top:12px}.lc-detail-head{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:6px 16px;margin-bottom:8px;display:flex}.lc-detail-head b{color:var(--dsw-alias-label-primary)}.lc-detail-marker{color:var(--dsw-alias-state-warn-primary);background:var(--dsw-alias-bg-layer-2);border-radius:6px;padding:1px 7px;font-size:11px}.lc-detail-head .lc-actual{color:var(--dsw-alias-state-success-primary)}.lc-detail-tag{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:0 6px;font-size:11px}.lc-detail-rows{grid-template-columns:1fr 1fr;gap:4px 24px;margin-top:10px;display:grid}.lc-detail-row{align-items:center;gap:8px;display:flex}.lc-detail-label{white-space:nowrap;min-width:70px;color:var(--dsw-alias-label-secondary)}.lc-bar-track{background:#8080802e;border-radius:3px;flex:1;height:5px;display:block;overflow:hidden}.lc-bar-fill{border-radius:3px;height:100%;display:block}.lc-detail-num{text-align:right;width:44px}.lc-detail-pct{text-align:right;width:34px;color:var(--dsw-alias-label-secondary)}.lc-cols{flex-wrap:wrap;gap:14px;margin-bottom:14px;display:flex}.lc-col{flex:1;min-width:280px}.lc-cols>.lc-card,.lc-col>.lc-card:last-child{margin-bottom:0}.lc-head>.lc-card:first-child{flex:7 1 0;min-width:360px}.lc-head>.lc-card:last-child{flex:3 1 0;min-width:220px}.lc-pi-grid{grid-template-columns:1fr;gap:8px;display:grid}.lc-pi-row{min-width:0;color:inherit;flex-direction:row;justify-content:space-between;align-items:baseline;gap:12px;text-decoration:none;display:flex}.lc-pi-row:hover .lc-pi-value{text-decoration:underline}.lc-pi-update{color:var(--dsw-alias-state-warn-primary);white-space:nowrap;margin-left:6px;font-size:11px}.lc-pi-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;flex:none;font-size:11px;font-weight:600;overflow:hidden}.lc-pi-value{min-width:0;color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;text-align:right;font-size:13px;font-weight:600;overflow:hidden}.lc-events,.lc-nodes{flex-direction:column;gap:2px;max-height:320px;display:flex;overflow-y:auto}.lc-event{align-items:center;gap:8px;padding:3px 0;display:flex}.lc-event-icon{text-align:center;width:18px;color:var(--dsw-alias-state-warn-primary)}.lc-event-icon.lc-event-inject{color:#a855f7}.lc-event-icon.lc-event-model{color:var(--dsw-alias-brand-primary)}.lc-kind{white-space:nowrap;border-radius:4px;flex:none;padding:1px 6px;font-size:10px;font-weight:600}.lc-kind-inject{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-kind-compaction{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent);color:var(--dsw-alias-state-error-primary)}.lc-kind-prune{color:#8b5cf6;background:#8b5cf626}.lc-kind-model{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 15%, transparent);color:var(--dsw-alias-brand-primary)}.lc-event-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.lc-event-at{color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;font-size:11px}.lc-event-tokens{color:var(--dsw-alias-state-success-primary);white-space:nowrap;font-weight:600}.lc-event-tokens.lc-up{color:var(--dsw-alias-state-warn-primary)}.lc-event-time{color:var(--dsw-alias-label-secondary);font-size:12px}.lc-node{align-items:center;gap:8px;padding:3px 0;display:flex}.lc-node-preview{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);flex:1;overflow:hidden}.lc-node-time{color:var(--dsw-alias-label-secondary);text-align:right;min-width:54px;font-size:12px}.lc-node-tokens{color:var(--dsw-alias-label-secondary)}.lc-nodes-more{color:var(--dsw-alias-label-secondary);padding:3px 0}.lc-empty{color:var(--dsw-alias-label-secondary);text-align:center;padding:18px 0}.lc-error{flex-direction:column;align-items:center;gap:8px;padding:40px 16px;display:flex}.lc-error-msg{color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);overflow-wrap:anywhere;border-radius:6px;max-width:100%;padding:4px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.lc-error-retry{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:6px;padding:4px 14px;font-size:12px}.lc-error-retry:hover{border-color:var(--dsw-alias-label-primary)}.lc-foot{color:var(--dsw-alias-label-secondary);margin-top:4px;font-size:12px}.lc-modal-backdrop{z-index:200;background:#00000073;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.lc-modal-card{box-sizing:border-box;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);width:min(720px,100vw - 48px);max-height:min(82vh,760px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);color:var(--dsw-alias-label-primary);border-radius:12px;padding:16px 18px 18px;font-size:13px;overflow-y:auto}.lc-modal-head{align-items:baseline;gap:8px;margin-bottom:12px;display:flex}.lc-modal-title{font-size:14px;font-weight:600}.lc-modal-close{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;margin-left:auto;padding:2px 6px;font-family:inherit;font-size:18px;line-height:1}.lc-modal-close:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.lc-br-hint{color:var(--dsw-alias-label-secondary);white-space:nowrap;margin-left:auto;font-size:11px;font-weight:400}.lc-br-pick{font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;max-width:240px;padding:3px 6px;font-size:12px}.lc-br-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:6px 16px;margin-bottom:8px;display:flex}.lc-br-meta b{color:var(--dsw-alias-label-primary)}.lc-br-meta .lc-actual{color:var(--dsw-alias-state-success-primary)}.lc-br-note{color:var(--dsw-alias-label-secondary);margin-top:8px;font-size:12px}.lc-br-cats{flex-direction:column;gap:4px;margin-top:10px;display:flex}.lc-br-cat{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;overflow:hidden}.lc-br-cat-empty{opacity:.55}.lc-br-cat-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:8px;padding:7px 10px;transition:background-color .12s;display:flex}.lc-br-cat-row:hover,.lc-br-cat-on{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-cat-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-br-cat-row i{border-radius:2px;flex:none;width:8px;height:8px;transition:box-shadow .12s;display:inline-block}.lc-br-cat-label{font-weight:600}.lc-br-cat-count{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:12px}.lc-br-count-grp{flex:1;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-chev{width:12px;color:var(--dsw-alias-label-secondary);flex:none;transition:transform .12s}.lc-br-chev-on{transform:rotate(90deg)}.lc-br-tokens{color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-delta,.lc-br-tdelta{white-space:nowrap;border-radius:4px;flex:none;padding:0 5px;font-size:11px;font-weight:600}.lc-br-delta-up,.lc-br-tdelta-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-br-delta-down,.lc-br-tdelta-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-br-tokens-grp{flex:none;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-pct{text-align:right;width:36px;color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-body{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;gap:2px;padding:4px 6px;display:flex}.lc-br-elem{border-radius:6px}.lc-br-elem-on{background:var(--dsw-alias-interactive-bg-active)}.lc-br-elem-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:5px 6px;font-size:12px;transition:background-color .12s;display:flex}.lc-br-elem-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-tag{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;flex:none;max-width:220px;padding:0 6px;font-size:11px;overflow:hidden}.lc-br-tag-inv{color:var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-label-primary);border-color:#0000;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.lc-br-preview{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-br-time{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-br-content{flex-direction:column;gap:6px;padding:2px 6px 8px 26px;display:flex}.lc-br-pre{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;border-radius:6px;max-height:320px;margin:0;padding:8px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-br-dim{color:var(--dsw-alias-label-secondary)}.lc-br-blk{flex-direction:column;gap:4px;display:flex}.lc-br-blk-label{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600}.lc-ts-card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;overflow:hidden}.lc-ts-card-head{color:var(--dsw-alias-label-secondary);border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:8px;padding:6px 10px;font-size:11px;font-weight:600;display:flex}.lc-ts-card-head b{color:var(--dsw-alias-label-primary)}.lc-ts-call-name{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}.lc-ts-card-count{margin-left:auto}.lc-ts-desc-body{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:160px;margin:0;padding:8px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-param-row{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:140px 90px 56px 1fr;align-items:baseline;gap:2px 10px;padding:6px 10px;font-size:12px;display:grid}.lc-ts-param-row:first-of-type{border-top:0}.lc-ts-param-name{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.lc-ts-param-type{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.lc-ts-param-req{color:var(--dsw-alias-state-warn-primary);font-size:11px;font-weight:600}.lc-ts-param-req-off{color:var(--dsw-alias-label-secondary);font-size:11px}.lc-ts-param-desc{color:var(--dsw-alias-label-secondary);grid-column:1/-1;line-height:1.5}.lc-ts-params-empty{color:var(--dsw-alias-label-secondary);padding:8px 10px;font-size:12px}.lc-ts-arg-row{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:minmax(0,96px) 1fr;align-items:start;column-gap:12px;padding:6px 10px;font-size:12px;display:grid}.lc-ts-arg-row:first-of-type{border-top:0}.lc-ts-arg-row .lc-ts-param-name{text-overflow:unset;white-space:normal;overflow-wrap:anywhere;overflow:visible}.lc-ts-arg-val{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:200px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-json{flex-direction:column;gap:4px;display:flex}.lc-ts-json-toggle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-self:flex-start;padding:0;font-size:11px}.lc-ts-json-toggle:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.lc-rich-seg{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;align-self:flex-end;gap:2px;padding:1px;display:flex}.lc-rich-seg-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-rich-seg-btn:hover{color:var(--dsw-alias-label-primary)}.lc-rich-seg-on,.lc-rich-seg-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-rich-seg-head{align-self:auto;margin-left:auto}.lc-br-md{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);word-break:break-word;scrollbar-width:thin;border-radius:6px;max-height:320px;padding:4px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-desc-md{color:var(--dsw-alias-label-primary);word-break:break-word;scrollbar-width:thin;max-height:160px;padding:4px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-br-md>div,.lc-ts-desc-md>div{font-size:13px;line-height:1.55}.lc-br-md div :is(h1,h2,h3,h4,h5,h6),.lc-ts-desc-md div :is(h1,h2,h3,h4,h5,h6){margin:10px 0 4px;font-size:13px;font-weight:600}.lc-br-md div p,.lc-ts-desc-md div p,.lc-br-md div pre,.lc-ts-desc-md div pre{margin:6px 0}.lc-br-md div :not(pre)>code,.lc-ts-desc-md div :not(pre)>code{box-decoration-break:clone;padding:1px 5px;line-height:1.3;font-size:1em!important}.lc-br-md div table code,.lc-ts-desc-md div table code{font-size:inherit}.lc-br-rich-inline{flex-direction:column;gap:6px;display:flex}.lc-ts-card .lc-br-pre{margin:8px 10px}.lc-att-grid{flex-wrap:wrap;gap:10px;padding:8px 10px;display:flex}.lc-att-item{align-items:center;gap:8px;min-width:0;display:flex}.lc-att-thumb{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);cursor:pointer;width:64px;height:64px;font:inherit;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;display:flex;overflow:hidden}.lc-att-thumb img{object-fit:cover;width:100%;height:100%;display:block}.lc-att-ph,.lc-att-err{color:var(--dsw-alias-label-secondary);text-align:center;padding:2px;font-size:10px}.lc-att-meta{flex-direction:column;gap:2px;min-width:0;display:flex}.lc-att-name{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;max-width:200px;font-size:12px;overflow:hidden}.lc-att-dims{color:var(--dsw-alias-label-secondary);font-size:11px}";
|
|
2595
|
+
const css = ".lc-root{box-sizing:border-box;height:100%;color:var(--dsw-alias-label-primary);padding:16px 20px 32px;font-size:13px;overflow-y:auto}.lc-card{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);border-radius:10px;margin-bottom:14px;padding:14px 16px}.lc-card-title{align-items:baseline;gap:8px;margin-bottom:10px;font-weight:600;display:flex}.lc-card-title-text{white-space:nowrap;flex:none}.lc-stats{grid-template-columns:repeat(auto-fit,minmax(92px,1fr));gap:8px;display:grid}.lc-stat{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:8px;flex-direction:column;gap:2px;min-width:0;padding:8px 10px;display:flex}.lc-stat-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;font-weight:600;overflow:hidden}.lc-stat-value{color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;text-align:center;font-size:14px;font-weight:600;overflow:hidden}.lc-stat-sub{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;font-size:11px;overflow:hidden}.lc-stat-tipped{position:relative}.lc-stat-q{text-align:center;width:11px;height:11px;color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);cursor:help;border-radius:50%;margin-left:4px;font-size:9px;font-style:normal;font-weight:700;line-height:11px;display:inline-block}.lc-stat-tipped:hover .lc-stat-q{color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-primary)}.lc-stat-tip{z-index:6;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:280px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;font-weight:400;line-height:1.5;transition:opacity .12s;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-stat-tipped:hover .lc-stat-tip{opacity:1}.lc-stat-tip-prices{border-top:1px dashed var(--dsw-alias-border-l1);margin-top:5px;padding-top:5px;display:block}.lc-stat-tip-head{font-weight:600;display:block}.lc-stat-tip-row{margin-top:2px;display:block}.lc-stat-tip-model{color:var(--dsw-alias-label-primary)}.lc-card-sub{color:var(--dsw-alias-label-secondary);font-size:12px;font-weight:400}.lc-gran,.lc-kinds{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;gap:2px;margin-left:auto;padding:1px;display:flex}.lc-gran-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-gran-btn:hover{color:var(--dsw-alias-label-primary)}.lc-gran-on,.lc-gran-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-overview-num{align-items:baseline;gap:6px;margin-bottom:8px;display:flex}.lc-overview-num>b{font-size:20px}.lc-overview-num span{color:var(--dsw-alias-label-secondary)}.lc-overview-pct{margin-left:auto;font-size:11px}.lc-overview-pct b{color:var(--dsw-alias-label-primary);margin-right:4px;font-size:20px}.lc-stacked-wrap{width:100%;position:relative}.lc-stacked{background:#8080802e;border-radius:5px;width:100%;display:flex;position:relative;overflow:hidden}.lc-occupied-box{border:2px solid var(--dsw-alias-label-tertiary);box-sizing:border-box;pointer-events:none;opacity:0;box-shadow:0 0 0 1px var(--dsw-alias-bg-layer-2);border-radius:5px;transition:opacity .12s;position:absolute;top:0;bottom:0;left:0}.lc-occupied-box-on{opacity:1}.lc-bar-tip{z-index:5;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:3px 8px;font-size:12px;transition:opacity .12s;position:absolute;bottom:calc(100% + 6px);transform:translate(-50%);box-shadow:0 2px 8px #0000002e}.lc-bar-tip-on{opacity:1}.lc-stacked>div{height:100%}.lc-stacked-seg{transition:filter .12s,opacity .12s}.lc-stacked-free{box-sizing:border-box;transition:box-shadow .12s,opacity .12s}.lc-stacked-seg-on{filter:brightness(1.18)}.lc-reserve{z-index:1;pointer-events:auto;cursor:help;background:repeating-linear-gradient(45deg, color-mix(in srgb, var(--dsw-alias-state-warn-primary) 24%, transparent) 0 5px, transparent 5px 10px);position:absolute;top:0;bottom:0}.lc-stacked-free-on{border:2px dashed var(--dsw-alias-label-secondary);border-radius:3px}.lc-stacked-dim .lc-stacked-seg{opacity:.35}.lc-stacked-dim .lc-stacked-seg-on{opacity:1}.lc-stacked-dim .lc-stacked-free{opacity:.35}.lc-stacked-dim .lc-stacked-free-on{opacity:1}.lc-legend{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:6px 14px;margin-top:10px;display:grid}.lc-chip{min-width:0;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;align-items:center;gap:5px;padding:1px 6px;transition:background-color .12s;display:flex}.lc-chip-label{white-space:nowrap;text-overflow:ellipsis;min-width:0;font-weight:600;overflow:hidden}.lc-chip-nums{white-space:nowrap;flex:none;align-items:baseline;gap:6px;margin-left:auto;display:inline-flex}.lc-chip i,.lc-detail-row i,.lc-node i{border-radius:2px;width:8px;height:8px;display:inline-block}.lc-chip i{transition:box-shadow .12s}.lc-chip em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-chip-on{background:var(--dsw-alias-interactive-bg-hover);font-weight:600}.lc-chip-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-tools{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:6px;margin-top:10px;display:flex}.lc-tools-label,.lc-tools-more{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;padding:0;font-family:inherit;font-size:12px}.lc-tools-label:hover,.lc-tools-more:hover{text-decoration:underline}.lc-tool-chip{background:var(--dsw-alias-bg-layer-2);font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:0;border-radius:4px;padding:1px 7px;font-size:12px}.lc-tool-chip:hover{text-decoration:underline}.lc-chartrow{align-items:stretch;gap:6px;display:flex}.lc-axis{box-sizing:border-box;width:40px;height:150px;color:var(--dsw-alias-label-secondary);padding-top:18px;font-size:11px;position:relative}.lc-axis span{line-height:1;position:absolute;right:0}.lc-axis-top{top:13px}.lc-axis-mid{top:69px}.lc-axis-bot{top:125px}.lc-chart-scroll{scrollbar-width:thin;flex:1;min-width:0;padding-bottom:8px;position:relative;overflow:auto hidden}.lc-chart-fade{pointer-events:none;z-index:2;width:26px;position:absolute;top:0;bottom:0}.lc-chart-fade-l{background:linear-gradient(to right, var(--dsw-alias-bg-layer-1), transparent);left:0}.lc-chart-fade-r{background:linear-gradient(to left, var(--dsw-alias-bg-layer-1), transparent);right:0}.lc-chart{box-sizing:border-box;align-items:flex-end;gap:2px;width:max-content;min-width:100%;height:130px;padding-top:18px;display:flex;position:relative}.lc-grid{border-top:1px dashed var(--dsw-alias-border-l1);pointer-events:none;position:absolute;left:0;right:0}.lc-grid-top{top:18px}.lc-grid-mid{top:74px}.lc-bar{cursor:pointer;border-radius:2px;flex:none;align-items:flex-end;width:14px;height:100%;transition:opacity .12s,background-color .12s;display:flex;position:relative}.lc-chart-dim .lc-bar{opacity:.35}.lc-chart-dim .lc-bar-in-turn{opacity:1}.lc-chart-dim .lc-turn{opacity:.35}.lc-chart-dim .lc-turn-on{opacity:1}.lc-chart-tip{z-index:5;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);pointer-events:none;border-radius:6px;padding:3px 8px;font-size:12px;position:absolute;top:0;transform:translate(-50%);box-shadow:0 2px 8px #0000002e}.lc-bar:hover{background:var(--dsw-alias-bg-layer-2)}.lc-bar-hovered{outline:1px dashed var(--dsw-alias-brand-primary);outline-offset:1px}.lc-bar-selected{outline:2px solid var(--dsw-alias-label-primary);outline-offset:1px}.lc-bar-in-turn{background:#80808024}.lc-bar-stack{flex-direction:column-reverse;width:100%;display:flex}.lc-bar-stack>div{width:100%}.lc-bar-marker{color:var(--dsw-alias-state-warn-primary);font-size:11px;position:absolute;top:-16px;left:50%;transform:translate(-50%)}.lc-turns{gap:2px;width:max-content;min-width:100%;margin-top:4px;display:flex}.lc-turn{box-sizing:border-box;text-align:center;color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;border-radius:3px;flex:none;height:14px;font-size:10px;font-weight:600;line-height:14px;transition:filter .12s,opacity .12s;overflow:hidden}.lc-turn-on{filter:brightness(1.35);color:var(--dsw-alias-label-primary)}.lc-detail{border-top:1px solid var(--dsw-alias-border-l1);margin-top:12px;padding-top:12px}.lc-detail-head{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:6px 16px;margin-bottom:8px;display:flex}.lc-detail-head b{color:var(--dsw-alias-label-primary)}.lc-detail-marker{color:var(--dsw-alias-state-warn-primary);background:var(--dsw-alias-bg-layer-2);border-radius:6px;padding:1px 7px;font-size:11px}.lc-detail-head .lc-actual{color:var(--dsw-alias-state-success-primary)}.lc-detail-tag{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:4px;padding:0 6px;font-size:11px}.lc-detail-rows{grid-template-columns:1fr 1fr;gap:4px 24px;margin-top:10px;display:grid}.lc-detail-row{align-items:center;gap:8px;display:flex}.lc-detail-label{white-space:nowrap;min-width:70px;color:var(--dsw-alias-label-secondary)}.lc-bar-track{background:#8080802e;border-radius:3px;flex:1;height:5px;display:block;overflow:hidden}.lc-bar-fill{border-radius:3px;height:100%;display:block}.lc-detail-num{text-align:right;width:44px}.lc-detail-pct{text-align:right;width:34px;color:var(--dsw-alias-label-secondary)}.lc-cols{flex-wrap:wrap;gap:14px;margin-bottom:14px;display:flex}.lc-col{flex:1;min-width:280px}.lc-cols>.lc-card,.lc-col>.lc-card:last-child{margin-bottom:0}.lc-head>.lc-card:first-child{flex:7 1 0;min-width:360px}.lc-head>.lc-card:last-child{flex:3 1 0;min-width:220px}.lc-pi-grid{grid-template-columns:1fr;gap:8px;display:grid}.lc-pi-row{min-width:0;color:inherit;flex-direction:row;justify-content:space-between;align-items:baseline;gap:12px;text-decoration:none;display:flex}.lc-pi-row:hover .lc-pi-value{text-decoration:underline}.lc-pi-update{color:var(--dsw-alias-state-warn-primary);white-space:nowrap;margin-left:6px;font-size:11px}.lc-pi-label{color:var(--dsw-alias-label-secondary);white-space:nowrap;text-overflow:ellipsis;flex:none;font-size:11px;font-weight:600;overflow:hidden}.lc-pi-value{min-width:0;color:var(--dsw-alias-label-primary);white-space:nowrap;text-overflow:ellipsis;text-align:right;font-size:13px;font-weight:600;overflow:hidden}.lc-events,.lc-nodes{flex-direction:column;gap:2px;max-height:320px;display:flex;overflow-y:auto}.lc-event{align-items:center;gap:8px;padding:3px 0;display:flex}.lc-event-icon{text-align:center;width:18px;color:var(--dsw-alias-state-warn-primary)}.lc-event-icon.lc-event-inject{color:#a855f7}.lc-event-icon.lc-event-model{color:var(--dsw-alias-brand-primary)}.lc-kind{white-space:nowrap;border-radius:4px;flex:none;padding:1px 6px;font-size:10px;font-weight:600}.lc-kind-inject{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-kind-compaction{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent);color:var(--dsw-alias-state-error-primary)}.lc-kind-prune{color:#8b5cf6;background:#8b5cf626}.lc-kind-model{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 15%, transparent);color:var(--dsw-alias-brand-primary)}.lc-event-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.lc-event-at{color:var(--dsw-alias-label-secondary);white-space:nowrap;flex:none;font-size:11px}.lc-event-tokens{color:var(--dsw-alias-state-success-primary);white-space:nowrap;font-weight:600}.lc-event-tokens.lc-up{color:var(--dsw-alias-state-warn-primary)}.lc-event-time{color:var(--dsw-alias-label-secondary);font-size:12px}.lc-node{align-items:center;gap:8px;padding:3px 0;display:flex}.lc-node-preview{text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-label-primary);flex:1;overflow:hidden}.lc-node-time{color:var(--dsw-alias-label-secondary);text-align:right;min-width:54px;font-size:12px}.lc-node-tokens{color:var(--dsw-alias-label-secondary)}.lc-nodes-more{color:var(--dsw-alias-label-secondary);padding:3px 0}.lc-empty{color:var(--dsw-alias-label-secondary);text-align:center;padding:18px 0}.lc-error{flex-direction:column;align-items:center;gap:8px;padding:40px 16px;display:flex}.lc-error-msg{color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);overflow-wrap:anywhere;border-radius:6px;max-width:100%;padding:4px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.lc-error-retry{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;border-radius:6px;padding:4px 14px;font-size:12px}.lc-error-retry:hover{border-color:var(--dsw-alias-label-primary)}.lc-foot{color:var(--dsw-alias-label-secondary);margin-top:4px;font-size:12px}.lc-modal-backdrop{z-index:200;background:#00000073;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.lc-modal-card{box-sizing:border-box;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);width:min(720px,100vw - 48px);max-height:min(82vh,760px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);color:var(--dsw-alias-label-primary);border-radius:12px;padding:16px 18px 18px;font-size:13px;overflow-y:auto}.lc-modal-head{align-items:baseline;gap:8px;margin-bottom:12px;display:flex}.lc-modal-title{font-size:14px;font-weight:600}.lc-modal-close{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:6px;margin-left:auto;padding:2px 6px;font-family:inherit;font-size:18px;line-height:1}.lc-modal-close:hover{color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2)}.lc-br-hint{color:var(--dsw-alias-label-secondary);white-space:nowrap;margin-left:auto;font-size:11px;font-weight:400}.lc-br-pick{font:inherit;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;max-width:240px;padding:3px 6px;font-size:12px}.lc-br-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:6px 16px;margin-bottom:8px;display:flex}.lc-br-meta b{color:var(--dsw-alias-label-primary)}.lc-br-meta .lc-actual{color:var(--dsw-alias-state-success-primary)}.lc-br-note{color:var(--dsw-alias-label-secondary);margin-top:8px;font-size:12px}.lc-br-cats{flex-direction:column;gap:4px;margin-top:10px;display:flex}.lc-br-cat{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;overflow:hidden}.lc-br-cat-empty{opacity:.55}.lc-br-cat-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:8px;padding:7px 10px;transition:background-color .12s;display:flex}.lc-br-cat-row:hover,.lc-br-cat-on{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-cat-on i{box-shadow:0 0 0 1px var(--dsw-alias-brand-primary)}.lc-br-cat-row i{border-radius:2px;flex:none;width:8px;height:8px;transition:box-shadow .12s;display:inline-block}.lc-br-cat-label{font-weight:600}.lc-br-cat-count{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:12px}.lc-br-count-grp{flex:1;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-chev{width:12px;color:var(--dsw-alias-label-secondary);flex:none;transition:transform .12s}.lc-br-chev-on{transform:rotate(90deg)}.lc-br-tokens{color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-delta,.lc-br-tdelta{white-space:nowrap;border-radius:4px;flex:none;padding:0 5px;font-size:11px;font-weight:600}.lc-br-delta-up,.lc-br-tdelta-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-br-delta-down,.lc-br-tdelta-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-br-tokens-grp{flex:none;align-items:center;gap:4px;min-width:0;display:inline-flex}.lc-br-pct{text-align:right;width:36px;color:var(--dsw-alias-label-secondary);flex:none;font-size:12px}.lc-br-body{border-top:1px solid var(--dsw-alias-border-l1);flex-direction:column;gap:2px;padding:4px 6px;display:flex}.lc-br-elem{border-radius:6px}.lc-br-elem-on{background:var(--dsw-alias-interactive-bg-active)}.lc-br-elem-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:5px 6px;font-size:12px;transition:background-color .12s;display:flex}.lc-br-elem-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-br-tag{color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;flex:none;max-width:220px;padding:0 6px;font-size:11px;overflow:hidden}.lc-br-tag-inv{color:var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-label-primary);border-color:#0000;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.lc-br-preview{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-br-time{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.lc-br-content{flex-direction:column;gap:6px;padding:2px 6px 8px 26px;display:flex}.lc-br-pre{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;border-radius:6px;max-height:320px;margin:0;padding:8px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-br-dim{color:var(--dsw-alias-label-secondary)}.lc-br-blk{flex-direction:column;gap:4px;display:flex}.lc-br-blk-label{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600}.lc-ts-card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;overflow:hidden}.lc-ts-card-head{color:var(--dsw-alias-label-secondary);border-bottom:1px solid var(--dsw-alias-border-l1);align-items:center;gap:8px;padding:6px 10px;font-size:11px;font-weight:600;display:flex}.lc-ts-card-head b{color:var(--dsw-alias-label-primary)}.lc-ts-call-name{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px}.lc-ts-card-count{margin-left:auto}.lc-ts-desc-body{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:160px;margin:0;padding:8px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-param-row{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:140px 90px 56px 1fr;align-items:baseline;gap:2px 10px;padding:6px 10px;font-size:12px;display:grid}.lc-ts-param-row:first-of-type{border-top:0}.lc-ts-param-name{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.lc-ts-param-type{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;overflow:hidden}.lc-ts-param-req{color:var(--dsw-alias-state-warn-primary);font-size:11px;font-weight:600}.lc-ts-param-req-off{color:var(--dsw-alias-label-secondary);font-size:11px}.lc-ts-param-desc{color:var(--dsw-alias-label-secondary);grid-column:1/-1;line-height:1.5}.lc-ts-params-empty{color:var(--dsw-alias-label-secondary);padding:8px 10px;font-size:12px}.lc-ts-arg-row{border-top:1px solid var(--dsw-alias-border-l1);grid-template-columns:minmax(0,96px) 1fr;align-items:start;column-gap:12px;padding:6px 10px;font-size:12px;display:grid}.lc-ts-arg-row:first-of-type{border-top:0}.lc-ts-arg-row .lc-ts-param-name{text-overflow:unset;white-space:normal;overflow-wrap:anywhere;overflow:visible}.lc-ts-arg-val{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:200px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-json{flex-direction:column;gap:4px;display:flex}.lc-ts-json-toggle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-self:flex-start;padding:0;font-size:11px}.lc-ts-json-toggle:hover{color:var(--dsw-alias-label-primary);text-decoration:underline}.lc-rich-seg{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;align-self:flex-end;gap:2px;padding:1px;display:flex}.lc-rich-seg-btn{color:var(--dsw-alias-label-secondary);cursor:pointer;background:0 0;border:0;border-radius:5px;padding:3px 8px;font-family:inherit;font-size:11px;line-height:1}.lc-rich-seg-btn:hover{color:var(--dsw-alias-label-primary)}.lc-rich-seg-on,.lc-rich-seg-on:hover{background:var(--dsw-alias-button-primary-fill);color:var(--dsw-alias-label-primary-foreground)}.lc-rich-seg-head{align-self:auto;margin-left:auto}.lc-br-md{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-primary);word-break:break-word;scrollbar-width:thin;border-radius:6px;max-height:320px;padding:4px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-ts-desc-md{color:var(--dsw-alias-label-primary);word-break:break-word;scrollbar-width:thin;max-height:160px;padding:4px 10px;font-size:12px;line-height:1.55;overflow-y:auto}.lc-br-md>div,.lc-ts-desc-md>div{font-size:13px;line-height:1.55}.lc-br-md div :is(h1,h2,h3,h4,h5,h6),.lc-ts-desc-md div :is(h1,h2,h3,h4,h5,h6){margin:10px 0 4px;font-size:13px;font-weight:600}.lc-br-md div p,.lc-ts-desc-md div p,.lc-br-md div pre,.lc-ts-desc-md div pre{margin:6px 0}.lc-br-md div :not(pre)>code,.lc-ts-desc-md div :not(pre)>code{box-decoration-break:clone;padding:1px 5px;line-height:1.3;font-size:1em!important}.lc-br-md div table code,.lc-ts-desc-md div table code{font-size:inherit}.lc-br-rich-inline{flex-direction:column;gap:6px;display:flex}.lc-ts-card .lc-br-pre{margin:8px 10px}.lc-att-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding:8px 10px;display:grid}.lc-att-item{align-items:center;gap:8px;min-width:0;display:flex}.lc-att-thumb{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);cursor:pointer;width:64px;height:64px;font:inherit;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;display:flex;overflow:hidden}.lc-att-thumb img{object-fit:cover;width:100%;height:100%;display:block}.lc-att-ph,.lc-att-err{color:var(--dsw-alias-label-secondary);text-align:center;padding:2px;font-size:10px}.lc-att-meta{flex-direction:column;gap:2px;min-width:0;display:flex}.lc-att-name{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere;word-break:break-word;font-size:12px;line-height:1.3}.lc-att-row{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:11px}.lc-att-row-label{min-width:3.2em;font-weight:400;display:inline-block}";
|
|
2365
2596
|
const tagId = "dsh-context/styles.css";
|
|
2366
2597
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
2367
2598
|
const tag = document.createElement("style");
|