dsh-context 0.34.0 → 0.35.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/README.md +3 -1
- package/lib/client.js +926 -68
- package/lib/index.js +171 -143
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -99,10 +99,58 @@ window.__ModuleLoader__.load({
|
|
|
99
99
|
"files.empty": "该范围内没有文件读取、写入或搜索操作",
|
|
100
100
|
"files.noMatch": "没有匹配当前过滤条件的文件",
|
|
101
101
|
"files.locate": "在上下文浏览器中查看此次操作",
|
|
102
|
+
"files.hits": "{n} 处命中",
|
|
103
|
+
"files.readTip": "读取第 {a}–{b} 行",
|
|
104
|
+
"files.open": "在系统中打开",
|
|
105
|
+
"files.readEst": "按调用参数 limit 估算的读取行数",
|
|
102
106
|
"files.errs": "{n} 次失败",
|
|
103
107
|
"files.form.image": "图片",
|
|
104
108
|
"files.form.dir": "目录",
|
|
105
109
|
"files.form.text": "文件",
|
|
110
|
+
"files.glyph.root": "工作区根",
|
|
111
|
+
"files.glyph.tests": "测试",
|
|
112
|
+
"files.glyph.docs": "文档目录",
|
|
113
|
+
"files.glyph.deps": "依赖",
|
|
114
|
+
"files.glyph.build": "构建产物",
|
|
115
|
+
"files.glyph.scripts": "脚本",
|
|
116
|
+
"files.glyph.config": "配置",
|
|
117
|
+
"files.glyph.assets": "静态资源",
|
|
118
|
+
"files.glyph.hidden": "元数据目录",
|
|
119
|
+
"files.glyph.lock": "锁文件",
|
|
120
|
+
"files.glyph.docker": "Docker",
|
|
121
|
+
"files.glyph.ignore": "忽略规则",
|
|
122
|
+
"files.glyph.license": "许可证",
|
|
123
|
+
"files.glyph.python": "Python",
|
|
124
|
+
"files.glyph.notebook": "Notebook",
|
|
125
|
+
"files.glyph.shell": "Shell",
|
|
126
|
+
"files.glyph.style": "样式",
|
|
127
|
+
"files.glyph.database": "数据库",
|
|
128
|
+
"files.glyph.data": "数据清单",
|
|
129
|
+
"files.glyph.markdown": "标记文档",
|
|
130
|
+
"files.glyph.log": "日志",
|
|
131
|
+
"files.glyph.sheet": "表格",
|
|
132
|
+
"files.glyph.document": "文档",
|
|
133
|
+
"files.glyph.archive": "压缩包",
|
|
134
|
+
"files.glyph.font": "字体",
|
|
135
|
+
"files.glyph.media": "媒体",
|
|
136
|
+
"files.glyph.lang.ts": "TypeScript",
|
|
137
|
+
"files.glyph.lang.js": "JavaScript",
|
|
138
|
+
"files.glyph.lang.go": "Go",
|
|
139
|
+
"files.glyph.lang.rust": "Rust",
|
|
140
|
+
"files.glyph.lang.java": "Java",
|
|
141
|
+
"files.glyph.lang.kotlin": "Kotlin",
|
|
142
|
+
"files.glyph.lang.ruby": "Ruby",
|
|
143
|
+
"files.glyph.lang.php": "PHP",
|
|
144
|
+
"files.glyph.lang.c": "C",
|
|
145
|
+
"files.glyph.lang.cpp": "C++",
|
|
146
|
+
"files.glyph.lang.csharp": "C#",
|
|
147
|
+
"files.glyph.lang.scala": "Scala",
|
|
148
|
+
"files.glyph.lang.lua": "Lua",
|
|
149
|
+
"files.glyph.lang.dart": "Dart",
|
|
150
|
+
"files.glyph.lang.swift": "Swift",
|
|
151
|
+
"files.glyph.lang.vue": "Vue",
|
|
152
|
+
"files.glyph.lang.svelte": "Svelte",
|
|
153
|
+
"files.glyph.lang.html": "HTML",
|
|
106
154
|
"agents.title": "Agent 网络",
|
|
107
155
|
"agents.sub": "当前 Agent 与子 Agent 的实时上下文 · 点击节点跳转会话",
|
|
108
156
|
"agents.chip.count": "{n} 个 Agent",
|
|
@@ -289,10 +337,58 @@ window.__ModuleLoader__.load({
|
|
|
289
337
|
"files.empty": "No file reads, writes, or searches in this range",
|
|
290
338
|
"files.noMatch": "No files match the current filters",
|
|
291
339
|
"files.locate": "Reveal this operation in the Context Browser",
|
|
340
|
+
"files.hits": "{n} hits",
|
|
341
|
+
"files.readTip": "Read lines {a}–{b}",
|
|
342
|
+
"files.open": "Open on your system",
|
|
343
|
+
"files.readEst": "Lines read, estimated from the limit argument",
|
|
292
344
|
"files.errs": "{n} failed",
|
|
293
345
|
"files.form.image": "Image",
|
|
294
346
|
"files.form.dir": "Directory",
|
|
295
347
|
"files.form.text": "File",
|
|
348
|
+
"files.glyph.root": "Workspace root",
|
|
349
|
+
"files.glyph.tests": "Tests",
|
|
350
|
+
"files.glyph.docs": "Docs",
|
|
351
|
+
"files.glyph.deps": "Dependencies",
|
|
352
|
+
"files.glyph.build": "Build output",
|
|
353
|
+
"files.glyph.scripts": "Scripts",
|
|
354
|
+
"files.glyph.config": "Config",
|
|
355
|
+
"files.glyph.assets": "Assets",
|
|
356
|
+
"files.glyph.hidden": "Metadata directory",
|
|
357
|
+
"files.glyph.lock": "Lockfile",
|
|
358
|
+
"files.glyph.docker": "Docker",
|
|
359
|
+
"files.glyph.ignore": "Ignore rules",
|
|
360
|
+
"files.glyph.license": "License",
|
|
361
|
+
"files.glyph.python": "Python",
|
|
362
|
+
"files.glyph.notebook": "Notebook",
|
|
363
|
+
"files.glyph.shell": "Shell",
|
|
364
|
+
"files.glyph.style": "Styles",
|
|
365
|
+
"files.glyph.database": "Database",
|
|
366
|
+
"files.glyph.data": "Data / manifest",
|
|
367
|
+
"files.glyph.markdown": "Markup document",
|
|
368
|
+
"files.glyph.log": "Log",
|
|
369
|
+
"files.glyph.sheet": "Spreadsheet",
|
|
370
|
+
"files.glyph.document": "Document",
|
|
371
|
+
"files.glyph.archive": "Archive",
|
|
372
|
+
"files.glyph.font": "Font",
|
|
373
|
+
"files.glyph.media": "Media",
|
|
374
|
+
"files.glyph.lang.ts": "TypeScript",
|
|
375
|
+
"files.glyph.lang.js": "JavaScript",
|
|
376
|
+
"files.glyph.lang.go": "Go",
|
|
377
|
+
"files.glyph.lang.rust": "Rust",
|
|
378
|
+
"files.glyph.lang.java": "Java",
|
|
379
|
+
"files.glyph.lang.kotlin": "Kotlin",
|
|
380
|
+
"files.glyph.lang.ruby": "Ruby",
|
|
381
|
+
"files.glyph.lang.php": "PHP",
|
|
382
|
+
"files.glyph.lang.c": "C",
|
|
383
|
+
"files.glyph.lang.cpp": "C++",
|
|
384
|
+
"files.glyph.lang.csharp": "C#",
|
|
385
|
+
"files.glyph.lang.scala": "Scala",
|
|
386
|
+
"files.glyph.lang.lua": "Lua",
|
|
387
|
+
"files.glyph.lang.dart": "Dart",
|
|
388
|
+
"files.glyph.lang.swift": "Swift",
|
|
389
|
+
"files.glyph.lang.vue": "Vue",
|
|
390
|
+
"files.glyph.lang.svelte": "Svelte",
|
|
391
|
+
"files.glyph.lang.html": "HTML",
|
|
296
392
|
"agents.title": "Agent Network",
|
|
297
393
|
"agents.sub": "Live context of this agent and its subagents · click a node to open its session",
|
|
298
394
|
"agents.chip.count": "{n} agents",
|
|
@@ -736,6 +832,51 @@ window.__ModuleLoader__.load({
|
|
|
736
832
|
}
|
|
737
833
|
return headers;
|
|
738
834
|
}
|
|
835
|
+
/**
|
|
836
|
+
* The SESSION's workspace root — the `cwd` its session-list row carries (the
|
|
837
|
+
* host session canon, not the host process's own launch directory) — or
|
|
838
|
+
* undefined when the face is absent, the snapshot is malformed, or the row
|
|
839
|
+
* names no cwd. Every field is re-proved — the no-white-screen guarantee.
|
|
840
|
+
*/
|
|
841
|
+
function workspaceOf(ctx, sessionId) {
|
|
842
|
+
if (typeof sessionId !== "string" || sessionId === "") return void 0;
|
|
843
|
+
try {
|
|
844
|
+
const sessions = ctx.get("sessions");
|
|
845
|
+
const snapshot = typeof sessions?.list?.getSnapshot === "function" ? sessions.list.getSnapshot() : void 0;
|
|
846
|
+
const byId = snapshot !== null && typeof snapshot === "object" ? snapshot.byId : void 0;
|
|
847
|
+
const row = byId !== null && typeof byId === "object" ? byId[sessionId] : void 0;
|
|
848
|
+
const cwd = row !== null && typeof row === "object" ? row.cwd : void 0;
|
|
849
|
+
return typeof cwd === "string" && cwd !== "" ? cwd : void 0;
|
|
850
|
+
} catch {
|
|
851
|
+
return;
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
/** Whether this deployment can hand a path to the user's native desktop (the
|
|
855
|
+
* host description's `canOpenPath`); false when unknown. */
|
|
856
|
+
function canOpenPathsOf(ctx) {
|
|
857
|
+
try {
|
|
858
|
+
const source = ctx.get("connection")?.hostDescription;
|
|
859
|
+
const snapshot = typeof source?.getSnapshot === "function" ? source.getSnapshot() : void 0;
|
|
860
|
+
return (snapshot !== null && typeof snapshot === "object" ? snapshot.canOpenPath : void 0) === true;
|
|
861
|
+
} catch {
|
|
862
|
+
return false;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
/**
|
|
866
|
+
* The system path opener, or undefined when the deployment lacks the RPC.
|
|
867
|
+
* Fire-and-forget: rejections (unknown path, no desktop) swallow — the
|
|
868
|
+
* affordance is best-effort by nature.
|
|
869
|
+
*/
|
|
870
|
+
function openPathVia(ctx) {
|
|
871
|
+
const host = ctx.get("connection")?.api?.host;
|
|
872
|
+
if (host === void 0 || typeof host.openPath !== "function") return void 0;
|
|
873
|
+
const openPath = host.openPath.bind(host);
|
|
874
|
+
return (path) => {
|
|
875
|
+
try {
|
|
876
|
+
openPath({ path }).catch(() => {});
|
|
877
|
+
} catch {}
|
|
878
|
+
};
|
|
879
|
+
}
|
|
739
880
|
//#endregion
|
|
740
881
|
//#region src/client/historyPage.ts
|
|
741
882
|
/** Narrow one served row to a validated durable event envelope, or null. */
|
|
@@ -1823,7 +1964,7 @@ window.__ModuleLoader__.load({
|
|
|
1823
1964
|
onClick: () => {
|
|
1824
1965
|
toggleElem(key);
|
|
1825
1966
|
}
|
|
1826
|
-
}, /* @__PURE__ */ React.createElement("span", { className: "lc-br-chev" + (open ? " lc-br-chev-on" : "") }
|
|
1967
|
+
}, /* @__PURE__ */ React.createElement("span", { className: "lc-br-chev" + (open ? " lc-br-chev-on" : "") }), err ? /* @__PURE__ */ React.createElement("span", {
|
|
1827
1968
|
className: "lc-br-err-dot",
|
|
1828
1969
|
title: t("node.failed")
|
|
1829
1970
|
}) : null, tag !== null ? /* @__PURE__ */ React.createElement("span", { className: "lc-br-tag" }, tag) : null, /* @__PURE__ */ React.createElement("span", { className: "lc-br-preview" }, preview), time !== void 0 ? /* @__PURE__ */ React.createElement("span", { className: "lc-br-time" }, fmtTime(time)) : null, /* @__PURE__ */ React.createElement("span", { className: "lc-br-tokens" }, "≈" + fmt(tokens))), open ? /* @__PURE__ */ React.createElement("div", { className: "lc-br-content" }, body) : null);
|
|
@@ -1954,7 +2095,7 @@ window.__ModuleLoader__.load({
|
|
|
1954
2095
|
onClick: () => {
|
|
1955
2096
|
toggleCat(c.key);
|
|
1956
2097
|
}
|
|
1957
|
-
}, /* @__PURE__ */ React.createElement("span", { className: "lc-br-chev" + (open ? " lc-br-chev-on" : "") }
|
|
2098
|
+
}, /* @__PURE__ */ React.createElement("span", { className: "lc-br-chev" + (open ? " lc-br-chev-on" : "") }), /* @__PURE__ */ React.createElement("i", { style: { background: c.color } }), /* @__PURE__ */ React.createElement("span", { className: "lc-br-cat-label" }, catLabel(c.key)), /* @__PURE__ */ React.createElement("span", { className: "lc-br-count-grp" }, /* @__PURE__ */ React.createElement("span", { className: "lc-br-cat-count" }, t("browser.items", { n: count })), countDelta !== null && countDelta !== 0 ? /* @__PURE__ */ React.createElement("span", { className: "lc-br-delta lc-br-delta-" + (countDelta > 0 ? "up" : "down") }, `${countDelta > 0 ? "+" : ""}${countDelta}`) : null), /* @__PURE__ */ React.createElement("span", { className: "lc-br-tokens-grp" }, tokenDelta !== null && tokenDelta !== 0 ? /* @__PURE__ */ React.createElement("span", { className: "lc-br-tdelta lc-br-tdelta-" + (tokenDelta > 0 ? "up" : "down") }, (tokenDelta > 0 ? "+" : "") + fmt(tokenDelta)) : null, /* @__PURE__ */ React.createElement("span", { className: "lc-br-tokens" }, "≈" + fmt(v))), /* @__PURE__ */ React.createElement("span", { className: "lc-br-pct" }, total > 0 ? `${Math.round(v / total * 100)}%` : "")), open ? /* @__PURE__ */ React.createElement("div", { className: "lc-br-body" }, catBody(c.key)) : null);
|
|
1958
2099
|
})));
|
|
1959
2100
|
};
|
|
1960
2101
|
}
|
|
@@ -2454,6 +2595,17 @@ window.__ModuleLoader__.load({
|
|
|
2454
2595
|
return KIND_BY_TOOL[tool] ?? null;
|
|
2455
2596
|
}
|
|
2456
2597
|
/**
|
|
2598
|
+
* The file purpose of one executed call. Like {@link kindOfTool} except for
|
|
2599
|
+
* the one file tool whose purpose follows its arguments: `str_replace_editor`
|
|
2600
|
+
* reads on `view` and writes on every other command (create / str_replace /
|
|
2601
|
+
* insert — an unknown command writes too; the call failed and the row keeps
|
|
2602
|
+
* its error flag).
|
|
2603
|
+
*/
|
|
2604
|
+
function kindOfCall(tool, args) {
|
|
2605
|
+
if (tool === "str_replace_editor") return args !== null && args.command === "view" ? "read" : "write";
|
|
2606
|
+
return kindOfTool(tool);
|
|
2607
|
+
}
|
|
2608
|
+
/**
|
|
2457
2609
|
* The operation's target path: the path-ish argument of read/write tools;
|
|
2458
2610
|
* for searches the narrowing `path`, else the pattern itself (a pathless
|
|
2459
2611
|
* grep/glob's target IS the pattern — the workspace-wide search text).
|
|
@@ -2483,33 +2635,66 @@ window.__ModuleLoader__.load({
|
|
|
2483
2635
|
for (let i = 0; i < s.length; i++) if (s[i] === "\n") n++;
|
|
2484
2636
|
return s.endsWith("\n") ? n : n + 1;
|
|
2485
2637
|
}
|
|
2638
|
+
/** The added/removed pair of one content-bearing argument set, or zeros. */
|
|
2639
|
+
function pairOf(added, removed) {
|
|
2640
|
+
return {
|
|
2641
|
+
added: typeof added === "string" ? linesOf(added) : 0,
|
|
2642
|
+
removed: typeof removed === "string" ? linesOf(removed) : 0
|
|
2643
|
+
};
|
|
2644
|
+
}
|
|
2486
2645
|
/**
|
|
2487
2646
|
* The signed line footprint of one call: an edit removes its old string and
|
|
2488
2647
|
* adds its new one; a write adds its content (the pre-existing body, if any,
|
|
2489
|
-
* is unknowable from the arguments — the estimate stays honest about that)
|
|
2490
|
-
*
|
|
2648
|
+
* is unknowable from the arguments — the estimate stays honest about that);
|
|
2649
|
+
* `str_replace_editor` splits the same shapes across its commands. Callers
|
|
2650
|
+
* reach here only with parsed args (a null parse yields no path).
|
|
2491
2651
|
*/
|
|
2492
2652
|
function deltaOf(tool, args) {
|
|
2493
|
-
if (tool === "edit")
|
|
2494
|
-
|
|
2495
|
-
|
|
2496
|
-
return
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
};
|
|
2500
|
-
}
|
|
2501
|
-
if (tool === "write") {
|
|
2502
|
-
const content = args.content;
|
|
2503
|
-
return {
|
|
2504
|
-
added: typeof content === "string" ? linesOf(content) : 0,
|
|
2505
|
-
removed: 0
|
|
2506
|
-
};
|
|
2653
|
+
if (tool === "edit") return pairOf(args.new_string, args.old_string);
|
|
2654
|
+
if (tool === "write") return pairOf(args.content, void 0);
|
|
2655
|
+
if (tool === "str_replace_editor") {
|
|
2656
|
+
if (args.command === "str_replace") return pairOf(args.new_str, args.old_str);
|
|
2657
|
+
if (args.command === "insert") return pairOf(args.new_str, void 0);
|
|
2658
|
+
if (args.command === "create") return pairOf(args.file_text, void 0);
|
|
2507
2659
|
}
|
|
2508
2660
|
return {
|
|
2509
2661
|
added: 0,
|
|
2510
2662
|
removed: 0
|
|
2511
2663
|
};
|
|
2512
2664
|
}
|
|
2665
|
+
/** The exact window a read's result meta reports: `offset` plus the retained
|
|
2666
|
+
* `lines` array (the same bounded payload the read card renders from). Null
|
|
2667
|
+
* for a foreign or malformed meta. */
|
|
2668
|
+
function readWindowOf(meta) {
|
|
2669
|
+
if (meta === null || typeof meta !== "object") return null;
|
|
2670
|
+
const m = meta;
|
|
2671
|
+
if (typeof m.path !== "string" || m.path === "") return null;
|
|
2672
|
+
if (typeof m.offset !== "number" || !Number.isFinite(m.offset) || m.offset < 1) return null;
|
|
2673
|
+
if (!Array.isArray(m.lines) || m.lines.length === 0) return null;
|
|
2674
|
+
return {
|
|
2675
|
+
start: m.offset,
|
|
2676
|
+
count: m.lines.length
|
|
2677
|
+
};
|
|
2678
|
+
}
|
|
2679
|
+
/** The limit estimate: the tool reads up to `limit` lines from `offset`;
|
|
2680
|
+
* absent when the call reads unbounded. */
|
|
2681
|
+
function readEstimateOf(args) {
|
|
2682
|
+
const limit = args.limit;
|
|
2683
|
+
return typeof limit === "number" && Number.isFinite(limit) && limit > 0 ? {
|
|
2684
|
+
count: Math.floor(limit),
|
|
2685
|
+
est: true
|
|
2686
|
+
} : void 0;
|
|
2687
|
+
}
|
|
2688
|
+
/** What a read op shows: the exact window off the result meta, else the
|
|
2689
|
+
* limit estimate, else nothing (an unbounded read names no footprint). */
|
|
2690
|
+
function readOf(meta, args) {
|
|
2691
|
+
const win = readWindowOf(meta);
|
|
2692
|
+
if (win !== null) return {
|
|
2693
|
+
start: win.start,
|
|
2694
|
+
count: win.count
|
|
2695
|
+
};
|
|
2696
|
+
return readEstimateOf(args);
|
|
2697
|
+
}
|
|
2513
2698
|
const IMAGE_EXT = /\.(png|jpe?g|gif|webp|svg|bmp|ico|avif)$/i;
|
|
2514
2699
|
/** The file's form — multimodal reads and image extensions scan apart; a trailing slash marks a directory target. */
|
|
2515
2700
|
function formOf(tool, path) {
|
|
@@ -2517,6 +2702,614 @@ window.__ModuleLoader__.load({
|
|
|
2517
2702
|
if (path.endsWith("/")) return "dir";
|
|
2518
2703
|
return "text";
|
|
2519
2704
|
}
|
|
2705
|
+
/** Directory buckets, by last path segment (lowercased, explicit plurals). Checked in order, then hidden dirs, then the plain folder. */
|
|
2706
|
+
const DIR_BUCKETS = [
|
|
2707
|
+
[
|
|
2708
|
+
[
|
|
2709
|
+
"test",
|
|
2710
|
+
"tests",
|
|
2711
|
+
"__tests__",
|
|
2712
|
+
"spec",
|
|
2713
|
+
"specs",
|
|
2714
|
+
"e2e"
|
|
2715
|
+
],
|
|
2716
|
+
"🧪",
|
|
2717
|
+
"files.glyph.tests"
|
|
2718
|
+
],
|
|
2719
|
+
[
|
|
2720
|
+
[
|
|
2721
|
+
"doc",
|
|
2722
|
+
"docs",
|
|
2723
|
+
"documentation"
|
|
2724
|
+
],
|
|
2725
|
+
"📚",
|
|
2726
|
+
"files.glyph.docs"
|
|
2727
|
+
],
|
|
2728
|
+
[
|
|
2729
|
+
[
|
|
2730
|
+
"node_modules",
|
|
2731
|
+
"vendor",
|
|
2732
|
+
"third_party",
|
|
2733
|
+
"third-party",
|
|
2734
|
+
"packages"
|
|
2735
|
+
],
|
|
2736
|
+
"📦",
|
|
2737
|
+
"files.glyph.deps"
|
|
2738
|
+
],
|
|
2739
|
+
[
|
|
2740
|
+
[
|
|
2741
|
+
"dist",
|
|
2742
|
+
"build",
|
|
2743
|
+
"out",
|
|
2744
|
+
"target",
|
|
2745
|
+
"release",
|
|
2746
|
+
"debug",
|
|
2747
|
+
"coverage",
|
|
2748
|
+
"artifacts"
|
|
2749
|
+
],
|
|
2750
|
+
"🏗️",
|
|
2751
|
+
"files.glyph.build"
|
|
2752
|
+
],
|
|
2753
|
+
[
|
|
2754
|
+
[
|
|
2755
|
+
"scripts",
|
|
2756
|
+
"tools",
|
|
2757
|
+
"bin"
|
|
2758
|
+
],
|
|
2759
|
+
"🛠️",
|
|
2760
|
+
"files.glyph.scripts"
|
|
2761
|
+
],
|
|
2762
|
+
[
|
|
2763
|
+
[
|
|
2764
|
+
"config",
|
|
2765
|
+
"configs",
|
|
2766
|
+
"settings",
|
|
2767
|
+
".config"
|
|
2768
|
+
],
|
|
2769
|
+
"⚙️",
|
|
2770
|
+
"files.glyph.config"
|
|
2771
|
+
],
|
|
2772
|
+
[
|
|
2773
|
+
[
|
|
2774
|
+
"assets",
|
|
2775
|
+
"static",
|
|
2776
|
+
"public",
|
|
2777
|
+
"images",
|
|
2778
|
+
"fonts",
|
|
2779
|
+
"icons",
|
|
2780
|
+
"media"
|
|
2781
|
+
],
|
|
2782
|
+
"🎨",
|
|
2783
|
+
"files.glyph.assets"
|
|
2784
|
+
]
|
|
2785
|
+
];
|
|
2786
|
+
/** Lockfile base names that do not end in `.lock`. */
|
|
2787
|
+
const LOCK_NAMES = [
|
|
2788
|
+
"package-lock.json",
|
|
2789
|
+
"pnpm-lock.yaml",
|
|
2790
|
+
"npm-shrinkwrap.json"
|
|
2791
|
+
];
|
|
2792
|
+
const MAKE_NAMES = [
|
|
2793
|
+
"makefile",
|
|
2794
|
+
"justfile",
|
|
2795
|
+
"cmakelists.txt"
|
|
2796
|
+
];
|
|
2797
|
+
/** A test file by name: a standalone or delimited `test`, or an inline `.test.`. */
|
|
2798
|
+
const TEST_NAME = /(^|[^a-z0-9])test([^a-z0-9]|$)|\.test\./;
|
|
2799
|
+
/**
|
|
2800
|
+
* Programming-language files render as letter badges over their language's
|
|
2801
|
+
* color (GitHub Linguist shades). Checked before the emoji buckets, so a
|
|
2802
|
+
* language file never falls through to one.
|
|
2803
|
+
*/
|
|
2804
|
+
const CODE_LANGS = [
|
|
2805
|
+
[
|
|
2806
|
+
["tsx"],
|
|
2807
|
+
"TSX",
|
|
2808
|
+
"#3178c6",
|
|
2809
|
+
"files.glyph.lang.ts"
|
|
2810
|
+
],
|
|
2811
|
+
[
|
|
2812
|
+
["ts"],
|
|
2813
|
+
"TS",
|
|
2814
|
+
"#3178c6",
|
|
2815
|
+
"files.glyph.lang.ts"
|
|
2816
|
+
],
|
|
2817
|
+
[
|
|
2818
|
+
[
|
|
2819
|
+
"js",
|
|
2820
|
+
"jsx",
|
|
2821
|
+
"mjs",
|
|
2822
|
+
"cjs"
|
|
2823
|
+
],
|
|
2824
|
+
"JS",
|
|
2825
|
+
"#f7df1e",
|
|
2826
|
+
"files.glyph.lang.js"
|
|
2827
|
+
],
|
|
2828
|
+
[
|
|
2829
|
+
[
|
|
2830
|
+
"py",
|
|
2831
|
+
"pyi",
|
|
2832
|
+
"pyw"
|
|
2833
|
+
],
|
|
2834
|
+
"PY",
|
|
2835
|
+
"#3572a5",
|
|
2836
|
+
"files.glyph.python"
|
|
2837
|
+
],
|
|
2838
|
+
[
|
|
2839
|
+
["ipynb"],
|
|
2840
|
+
"NB",
|
|
2841
|
+
"#da5b0b",
|
|
2842
|
+
"files.glyph.notebook"
|
|
2843
|
+
],
|
|
2844
|
+
[
|
|
2845
|
+
["go"],
|
|
2846
|
+
"GO",
|
|
2847
|
+
"#00add8",
|
|
2848
|
+
"files.glyph.lang.go"
|
|
2849
|
+
],
|
|
2850
|
+
[
|
|
2851
|
+
["rs"],
|
|
2852
|
+
"RS",
|
|
2853
|
+
"#dea584",
|
|
2854
|
+
"files.glyph.lang.rust"
|
|
2855
|
+
],
|
|
2856
|
+
[
|
|
2857
|
+
["java"],
|
|
2858
|
+
"JV",
|
|
2859
|
+
"#b07219",
|
|
2860
|
+
"files.glyph.lang.java"
|
|
2861
|
+
],
|
|
2862
|
+
[
|
|
2863
|
+
["kt", "kts"],
|
|
2864
|
+
"KT",
|
|
2865
|
+
"#a97bff",
|
|
2866
|
+
"files.glyph.lang.kotlin"
|
|
2867
|
+
],
|
|
2868
|
+
[
|
|
2869
|
+
["rb"],
|
|
2870
|
+
"RB",
|
|
2871
|
+
"#701516",
|
|
2872
|
+
"files.glyph.lang.ruby"
|
|
2873
|
+
],
|
|
2874
|
+
[
|
|
2875
|
+
["php"],
|
|
2876
|
+
"PHP",
|
|
2877
|
+
"#4f5d95",
|
|
2878
|
+
"files.glyph.lang.php"
|
|
2879
|
+
],
|
|
2880
|
+
[
|
|
2881
|
+
["c", "h"],
|
|
2882
|
+
"C",
|
|
2883
|
+
"#555555",
|
|
2884
|
+
"files.glyph.lang.c"
|
|
2885
|
+
],
|
|
2886
|
+
[
|
|
2887
|
+
[
|
|
2888
|
+
"cpp",
|
|
2889
|
+
"cc",
|
|
2890
|
+
"cxx",
|
|
2891
|
+
"hpp"
|
|
2892
|
+
],
|
|
2893
|
+
"C++",
|
|
2894
|
+
"#f34b7d",
|
|
2895
|
+
"files.glyph.lang.cpp"
|
|
2896
|
+
],
|
|
2897
|
+
[
|
|
2898
|
+
["cs"],
|
|
2899
|
+
"C#",
|
|
2900
|
+
"#178600",
|
|
2901
|
+
"files.glyph.lang.csharp"
|
|
2902
|
+
],
|
|
2903
|
+
[
|
|
2904
|
+
["scala"],
|
|
2905
|
+
"SC",
|
|
2906
|
+
"#c22d40",
|
|
2907
|
+
"files.glyph.lang.scala"
|
|
2908
|
+
],
|
|
2909
|
+
[
|
|
2910
|
+
["lua"],
|
|
2911
|
+
"LUA",
|
|
2912
|
+
"#000080",
|
|
2913
|
+
"files.glyph.lang.lua"
|
|
2914
|
+
],
|
|
2915
|
+
[
|
|
2916
|
+
["dart"],
|
|
2917
|
+
"DA",
|
|
2918
|
+
"#00b4ab",
|
|
2919
|
+
"files.glyph.lang.dart"
|
|
2920
|
+
],
|
|
2921
|
+
[
|
|
2922
|
+
["swift"],
|
|
2923
|
+
"SW",
|
|
2924
|
+
"#f05138",
|
|
2925
|
+
"files.glyph.lang.swift"
|
|
2926
|
+
],
|
|
2927
|
+
[
|
|
2928
|
+
["vue"],
|
|
2929
|
+
"VUE",
|
|
2930
|
+
"#41b883",
|
|
2931
|
+
"files.glyph.lang.vue"
|
|
2932
|
+
],
|
|
2933
|
+
[
|
|
2934
|
+
["svelte"],
|
|
2935
|
+
"SV",
|
|
2936
|
+
"#ff3e00",
|
|
2937
|
+
"files.glyph.lang.svelte"
|
|
2938
|
+
],
|
|
2939
|
+
[
|
|
2940
|
+
[
|
|
2941
|
+
"sh",
|
|
2942
|
+
"bash",
|
|
2943
|
+
"zsh",
|
|
2944
|
+
"fish",
|
|
2945
|
+
"ps1"
|
|
2946
|
+
],
|
|
2947
|
+
"SH",
|
|
2948
|
+
"#89e051",
|
|
2949
|
+
"files.glyph.shell"
|
|
2950
|
+
],
|
|
2951
|
+
[
|
|
2952
|
+
[
|
|
2953
|
+
"html",
|
|
2954
|
+
"htm",
|
|
2955
|
+
"xhtml"
|
|
2956
|
+
],
|
|
2957
|
+
"HT",
|
|
2958
|
+
"#e34c26",
|
|
2959
|
+
"files.glyph.lang.html"
|
|
2960
|
+
],
|
|
2961
|
+
[
|
|
2962
|
+
[
|
|
2963
|
+
"css",
|
|
2964
|
+
"scss",
|
|
2965
|
+
"sass",
|
|
2966
|
+
"less",
|
|
2967
|
+
"styl"
|
|
2968
|
+
],
|
|
2969
|
+
"CSS",
|
|
2970
|
+
"#563d7c",
|
|
2971
|
+
"files.glyph.style"
|
|
2972
|
+
],
|
|
2973
|
+
[
|
|
2974
|
+
["sql"],
|
|
2975
|
+
"SQL",
|
|
2976
|
+
"#e38c00",
|
|
2977
|
+
"files.glyph.database"
|
|
2978
|
+
]
|
|
2979
|
+
];
|
|
2980
|
+
/**
|
|
2981
|
+
* Badge text by fill luminance: white on dark shades, near-black on light
|
|
2982
|
+
* ones (the JS yellow, the shell green) — a fixed dark tone, never pure
|
|
2983
|
+
* black, so it sits quietly next to the white badges.
|
|
2984
|
+
*/
|
|
2985
|
+
function badgeTextColor(hex) {
|
|
2986
|
+
const n = parseInt(hex.slice(1), 16);
|
|
2987
|
+
return (.299 * (n >> 16 & 255) + .587 * (n >> 8 & 255) + .114 * (n & 255)) / 255 < .6 ? "#ffffff" : "#1f2328";
|
|
2988
|
+
}
|
|
2989
|
+
/** Extension buckets for non-code files, most specific first. */
|
|
2990
|
+
const EXT_BUCKETS = [
|
|
2991
|
+
[
|
|
2992
|
+
[
|
|
2993
|
+
"yaml",
|
|
2994
|
+
"yml",
|
|
2995
|
+
"toml",
|
|
2996
|
+
"ini",
|
|
2997
|
+
"conf",
|
|
2998
|
+
"cfg",
|
|
2999
|
+
"properties",
|
|
3000
|
+
"env"
|
|
3001
|
+
],
|
|
3002
|
+
"⚙️",
|
|
3003
|
+
"files.glyph.config"
|
|
3004
|
+
],
|
|
3005
|
+
[
|
|
3006
|
+
[
|
|
3007
|
+
"json",
|
|
3008
|
+
"jsonc",
|
|
3009
|
+
"json5",
|
|
3010
|
+
"jsonl",
|
|
3011
|
+
"ndjson",
|
|
3012
|
+
"xml"
|
|
3013
|
+
],
|
|
3014
|
+
"🧾",
|
|
3015
|
+
"files.glyph.data"
|
|
3016
|
+
],
|
|
3017
|
+
[
|
|
3018
|
+
[
|
|
3019
|
+
"md",
|
|
3020
|
+
"mdx",
|
|
3021
|
+
"markdown",
|
|
3022
|
+
"rst",
|
|
3023
|
+
"adoc",
|
|
3024
|
+
"org"
|
|
3025
|
+
],
|
|
3026
|
+
"📝",
|
|
3027
|
+
"files.glyph.markdown"
|
|
3028
|
+
],
|
|
3029
|
+
[
|
|
3030
|
+
["log"],
|
|
3031
|
+
"📜",
|
|
3032
|
+
"files.glyph.log"
|
|
3033
|
+
],
|
|
3034
|
+
[
|
|
3035
|
+
[
|
|
3036
|
+
"csv",
|
|
3037
|
+
"tsv",
|
|
3038
|
+
"xls",
|
|
3039
|
+
"xlsx",
|
|
3040
|
+
"ods"
|
|
3041
|
+
],
|
|
3042
|
+
"📊",
|
|
3043
|
+
"files.glyph.sheet"
|
|
3044
|
+
],
|
|
3045
|
+
[
|
|
3046
|
+
[
|
|
3047
|
+
"pdf",
|
|
3048
|
+
"doc",
|
|
3049
|
+
"docx",
|
|
3050
|
+
"odt",
|
|
3051
|
+
"rtf"
|
|
3052
|
+
],
|
|
3053
|
+
"📕",
|
|
3054
|
+
"files.glyph.document"
|
|
3055
|
+
],
|
|
3056
|
+
[
|
|
3057
|
+
[
|
|
3058
|
+
"zip",
|
|
3059
|
+
"gz",
|
|
3060
|
+
"tgz",
|
|
3061
|
+
"tar",
|
|
3062
|
+
"bz2",
|
|
3063
|
+
"xz",
|
|
3064
|
+
"7z",
|
|
3065
|
+
"rar",
|
|
3066
|
+
"jar"
|
|
3067
|
+
],
|
|
3068
|
+
"🗜️",
|
|
3069
|
+
"files.glyph.archive"
|
|
3070
|
+
],
|
|
3071
|
+
[
|
|
3072
|
+
[
|
|
3073
|
+
"ttf",
|
|
3074
|
+
"otf",
|
|
3075
|
+
"woff",
|
|
3076
|
+
"woff2",
|
|
3077
|
+
"eot"
|
|
3078
|
+
],
|
|
3079
|
+
"🔤",
|
|
3080
|
+
"files.glyph.font"
|
|
3081
|
+
],
|
|
3082
|
+
[
|
|
3083
|
+
[
|
|
3084
|
+
"mp4",
|
|
3085
|
+
"mov",
|
|
3086
|
+
"mkv",
|
|
3087
|
+
"webm",
|
|
3088
|
+
"mp3",
|
|
3089
|
+
"wav",
|
|
3090
|
+
"flac",
|
|
3091
|
+
"ogg"
|
|
3092
|
+
],
|
|
3093
|
+
"🎬",
|
|
3094
|
+
"files.glyph.media"
|
|
3095
|
+
]
|
|
3096
|
+
];
|
|
3097
|
+
function dirGlyph(base) {
|
|
3098
|
+
if (base === "" || base === ".") return {
|
|
3099
|
+
glyph: "🏠",
|
|
3100
|
+
tip: "files.glyph.root"
|
|
3101
|
+
};
|
|
3102
|
+
const name = base.toLowerCase();
|
|
3103
|
+
for (const [names, glyph, tip] of DIR_BUCKETS) if (names.includes(name)) return {
|
|
3104
|
+
glyph,
|
|
3105
|
+
tip
|
|
3106
|
+
};
|
|
3107
|
+
if (name.startsWith(".")) return {
|
|
3108
|
+
glyph: "🗄️",
|
|
3109
|
+
tip: "files.glyph.hidden"
|
|
3110
|
+
};
|
|
3111
|
+
return {
|
|
3112
|
+
glyph: "📁",
|
|
3113
|
+
tip: "files.form.dir"
|
|
3114
|
+
};
|
|
3115
|
+
}
|
|
3116
|
+
function fileGlyph(base) {
|
|
3117
|
+
const name = base.toLowerCase();
|
|
3118
|
+
const dot = name.lastIndexOf(".");
|
|
3119
|
+
const ext = dot > 0 ? name.slice(dot + 1) : "";
|
|
3120
|
+
if (name.endsWith(".lock") || LOCK_NAMES.includes(name)) return {
|
|
3121
|
+
glyph: "🔒",
|
|
3122
|
+
tip: "files.glyph.lock"
|
|
3123
|
+
};
|
|
3124
|
+
if (TEST_NAME.test(name)) return {
|
|
3125
|
+
glyph: "🧪",
|
|
3126
|
+
tip: "files.glyph.tests"
|
|
3127
|
+
};
|
|
3128
|
+
if (name === "dockerfile" || name.startsWith("dockerfile.")) return {
|
|
3129
|
+
glyph: "🐳",
|
|
3130
|
+
tip: "files.glyph.docker"
|
|
3131
|
+
};
|
|
3132
|
+
if (MAKE_NAMES.includes(name)) return {
|
|
3133
|
+
glyph: "🛠️",
|
|
3134
|
+
tip: "files.glyph.scripts"
|
|
3135
|
+
};
|
|
3136
|
+
if (name === ".gitignore" || name === ".gitattributes") return {
|
|
3137
|
+
glyph: "🚫",
|
|
3138
|
+
tip: "files.glyph.ignore"
|
|
3139
|
+
};
|
|
3140
|
+
if (name === "license" || name.startsWith("license.") || name === "copying") return {
|
|
3141
|
+
glyph: "⚖️",
|
|
3142
|
+
tip: "files.glyph.license"
|
|
3143
|
+
};
|
|
3144
|
+
if (name === ".env" || name.startsWith(".env.")) return {
|
|
3145
|
+
glyph: "⚙️",
|
|
3146
|
+
tip: "files.glyph.config"
|
|
3147
|
+
};
|
|
3148
|
+
if (ext !== "") {
|
|
3149
|
+
for (const [exts, label, color, tip] of CODE_LANGS) if (exts.includes(ext)) return {
|
|
3150
|
+
glyph: label,
|
|
3151
|
+
tip,
|
|
3152
|
+
color,
|
|
3153
|
+
text: badgeTextColor(color)
|
|
3154
|
+
};
|
|
3155
|
+
for (const [exts, glyph, tip] of EXT_BUCKETS) if (exts.includes(ext)) return {
|
|
3156
|
+
glyph,
|
|
3157
|
+
tip
|
|
3158
|
+
};
|
|
3159
|
+
}
|
|
3160
|
+
return {
|
|
3161
|
+
glyph: "📄",
|
|
3162
|
+
tip: "files.form.text"
|
|
3163
|
+
};
|
|
3164
|
+
}
|
|
3165
|
+
/** The row icon for one file entry: form first (image/dir), then the file-name tables. */
|
|
3166
|
+
function glyphOf(path, form) {
|
|
3167
|
+
if (form === "image") return {
|
|
3168
|
+
glyph: "🖼",
|
|
3169
|
+
tip: "files.form.image"
|
|
3170
|
+
};
|
|
3171
|
+
const trimmed = path.endsWith("/") ? path.slice(0, -1) : path;
|
|
3172
|
+
const base = trimmed.slice(trimmed.lastIndexOf("/") + 1);
|
|
3173
|
+
return form === "dir" ? dirGlyph(base) : fileGlyph(base);
|
|
3174
|
+
}
|
|
3175
|
+
const DRIVE_PATH = /^[a-zA-Z]:[\\/]/;
|
|
3176
|
+
/**
|
|
3177
|
+
* The absolute form of a real file path: verbatim when already absolute,
|
|
3178
|
+
* resolved against the workspace root when relative, and undefined when a
|
|
3179
|
+
* relative path has no root to resolve against (the system open can't reach
|
|
3180
|
+
* it). Callers keep search-pattern "paths" away from here.
|
|
3181
|
+
*/
|
|
3182
|
+
function absPathOf(path, workspace) {
|
|
3183
|
+
if (path.startsWith("/") || DRIVE_PATH.test(path)) return path;
|
|
3184
|
+
if (workspace === void 0 || workspace === "" || path.startsWith(".")) return void 0;
|
|
3185
|
+
return workspace.replace(/\/+$/, "") + "/" + path.replace(/^\/+/, "");
|
|
3186
|
+
}
|
|
3187
|
+
/**
|
|
3188
|
+
* The row's display form of a path: inside the workspace (or already
|
|
3189
|
+
* workspace-relative) it shortens to a './'-prefixed relative — an absolute
|
|
3190
|
+
* path outside the workspace, a Windows drive path, and an already-'.'
|
|
3191
|
+
* relative keep their verbatim form.
|
|
3192
|
+
*/
|
|
3193
|
+
function displayPathOf(path, workspace) {
|
|
3194
|
+
const root = workspace !== void 0 && workspace.length > 1 ? workspace.replace(/\/+$/, "") : void 0;
|
|
3195
|
+
if (root !== void 0) {
|
|
3196
|
+
if (path === root) return "./";
|
|
3197
|
+
if (path.startsWith(root + "/")) return "./" + path.slice(root.length + 1);
|
|
3198
|
+
}
|
|
3199
|
+
if (path.startsWith("/") || DRIVE_PATH.test(path) || path.startsWith(".")) return path;
|
|
3200
|
+
return "./" + path;
|
|
3201
|
+
}
|
|
3202
|
+
/**
|
|
3203
|
+
* A search op's detail: the pattern, with the include filter appended when
|
|
3204
|
+
* one narrowed the call. A patternless (malformed) search has no detail.
|
|
3205
|
+
*/
|
|
3206
|
+
function searchDetailOf(args) {
|
|
3207
|
+
const pattern = args?.pattern;
|
|
3208
|
+
if (typeof pattern !== "string" || pattern === "") return void 0;
|
|
3209
|
+
const include = args?.include;
|
|
3210
|
+
return typeof include === "string" && include !== "" ? `${pattern} (${include})` : pattern;
|
|
3211
|
+
}
|
|
3212
|
+
/**
|
|
3213
|
+
* The files a search demonstrably reached, read off the result's bounded
|
|
3214
|
+
* presentation meta (grep groups matched lines by file; glob lists paths).
|
|
3215
|
+
* Only the COMPLETE list attributes: a capped search (`truncated`) names a
|
|
3216
|
+
* partial file set, and a malformed meta names none — both fall back to the
|
|
3217
|
+
* call's own target. Each entry carries the reported match count.
|
|
3218
|
+
*/
|
|
3219
|
+
function searchFilesOf(meta) {
|
|
3220
|
+
if (meta === null || typeof meta !== "object") return null;
|
|
3221
|
+
const m = meta;
|
|
3222
|
+
if (m.truncated !== false) return null;
|
|
3223
|
+
const files = [];
|
|
3224
|
+
if (m.shape === "matches" && Array.isArray(m.files)) for (const f of m.files) {
|
|
3225
|
+
if (f === null || typeof f !== "object") continue;
|
|
3226
|
+
const group = f;
|
|
3227
|
+
if (typeof group.path === "string" && group.path !== "" && Array.isArray(group.matches)) files.push({
|
|
3228
|
+
path: group.path,
|
|
3229
|
+
hits: group.matches.length
|
|
3230
|
+
});
|
|
3231
|
+
}
|
|
3232
|
+
else if (m.shape === "paths" && Array.isArray(m.paths)) {
|
|
3233
|
+
for (const p of m.paths) if (typeof p === "string" && p !== "") files.push({
|
|
3234
|
+
path: p,
|
|
3235
|
+
hits: 0
|
|
3236
|
+
});
|
|
3237
|
+
}
|
|
3238
|
+
return files.length > 0 ? files : null;
|
|
3239
|
+
}
|
|
3240
|
+
/**
|
|
3241
|
+
* Narrow one block of a conversation node's `subCalls` tree to a settled
|
|
3242
|
+
* nested call, or null. The join is defensive — a running call has no result
|
|
3243
|
+
* kind yet, and any malformed block is dropped, never thrown. (Null and
|
|
3244
|
+
* non-object blocks never reach here: the folding loop pre-filters them.)
|
|
3245
|
+
*/
|
|
3246
|
+
function subCallOf(block) {
|
|
3247
|
+
const b = block;
|
|
3248
|
+
if (b.kind !== "tool-result") return null;
|
|
3249
|
+
if (b.call === null || typeof b.call !== "object") return null;
|
|
3250
|
+
const call = b.call;
|
|
3251
|
+
if (typeof call.name !== "string" || typeof call.argsRaw !== "string") return null;
|
|
3252
|
+
if (typeof b.seq !== "number" || !Number.isFinite(b.seq)) return null;
|
|
3253
|
+
return {
|
|
3254
|
+
name: call.name,
|
|
3255
|
+
argsRaw: call.argsRaw,
|
|
3256
|
+
seq: b.seq,
|
|
3257
|
+
...typeof b.time === "number" ? { time: b.time } : {},
|
|
3258
|
+
...b.isError === true ? { err: true } : { err: false },
|
|
3259
|
+
...Array.isArray(b.subCalls) ? { subCalls: b.subCalls } : {}
|
|
3260
|
+
};
|
|
3261
|
+
}
|
|
3262
|
+
/** The run_code call's model-authored description — the nested ops' "why". */
|
|
3263
|
+
function programOf(conv) {
|
|
3264
|
+
const description = parseCallArgs(conv?.call?.argsRaw)?.description;
|
|
3265
|
+
return typeof description === "string" && description !== "" ? description : void 0;
|
|
3266
|
+
}
|
|
3267
|
+
/**
|
|
3268
|
+
* Depth guard for nested Code-Mode trees. The SDK bindings exclude `run_code`
|
|
3269
|
+
* itself, so a real tree is one level deep; the cap only bounds defensive
|
|
3270
|
+
* re-entry over a malformed join.
|
|
3271
|
+
*/
|
|
3272
|
+
const SUBCALL_MAX_DEPTH = 8;
|
|
3273
|
+
/**
|
|
3274
|
+
* Fold one nested Code-Mode tree: every settled sub-dispatch whose arguments
|
|
3275
|
+
* resolve to a file target books one op, attributed to the nested tool and
|
|
3276
|
+
* located on the parent run_code result. `seen` holds the already-visited
|
|
3277
|
+
* blocks, so a malformed (cyclic) join cannot loop.
|
|
3278
|
+
*/
|
|
3279
|
+
function foldSubCalls(blocks, parent, program, add, seen, depth) {
|
|
3280
|
+
if (depth > SUBCALL_MAX_DEPTH) return;
|
|
3281
|
+
for (const block of blocks) {
|
|
3282
|
+
if (block === null || typeof block !== "object" || seen.has(block)) continue;
|
|
3283
|
+
seen.add(block);
|
|
3284
|
+
const sub = subCallOf(block);
|
|
3285
|
+
if (sub !== null) {
|
|
3286
|
+
const args = parseCallArgs(sub.argsRaw);
|
|
3287
|
+
const kind = args !== null ? kindOfCall(sub.name, args) : null;
|
|
3288
|
+
const path = kind !== null ? pathOfArgs(sub.name, args) : null;
|
|
3289
|
+
if (args !== null && kind !== null && path !== null) {
|
|
3290
|
+
const { added, removed } = deltaOf(sub.name, args);
|
|
3291
|
+
const narrowed = typeof args.path === "string" && args.path !== "";
|
|
3292
|
+
const detail = kind === "search" && narrowed ? searchDetailOf(args) : void 0;
|
|
3293
|
+
const read = kind === "read" ? readOf(void 0, args) : void 0;
|
|
3294
|
+
add({
|
|
3295
|
+
seq: sub.seq,
|
|
3296
|
+
...parent.gone !== void 0 ? { gone: parent.gone } : {},
|
|
3297
|
+
kind,
|
|
3298
|
+
tool: sub.name,
|
|
3299
|
+
...sub.time !== void 0 ? { time: sub.time } : {},
|
|
3300
|
+
err: sub.err,
|
|
3301
|
+
added,
|
|
3302
|
+
removed,
|
|
3303
|
+
...detail !== void 0 ? { detail } : {},
|
|
3304
|
+
...read !== void 0 ? { read } : {},
|
|
3305
|
+
parent: parent.seq,
|
|
3306
|
+
...program !== void 0 ? { program } : {}
|
|
3307
|
+
}, path, kind === "search" && !narrowed);
|
|
3308
|
+
}
|
|
3309
|
+
if (sub.subCalls !== void 0) foldSubCalls(sub.subCalls, parent, program, add, seen, depth + 1);
|
|
3310
|
+
}
|
|
3311
|
+
}
|
|
3312
|
+
}
|
|
2520
3313
|
/** Fold every served tool-result node into per-file activity. */
|
|
2521
3314
|
function activityOf(nodes, convOf, before) {
|
|
2522
3315
|
const totals = {
|
|
@@ -2540,52 +3333,86 @@ window.__ModuleLoader__.load({
|
|
|
2540
3333
|
removed: 0
|
|
2541
3334
|
};
|
|
2542
3335
|
const byPath = /* @__PURE__ */ new Map();
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
if (kind === null) continue;
|
|
2548
|
-
const tool = n.tool;
|
|
2549
|
-
const conv = convOf(n.seq);
|
|
2550
|
-
const args = parseCallArgs(conv?.call?.argsRaw);
|
|
2551
|
-
const path = pathOfArgs(tool, args);
|
|
2552
|
-
if (path === null || args === null) continue;
|
|
2553
|
-
totals[kind].ops++;
|
|
2554
|
-
const { added, removed } = deltaOf(tool, args);
|
|
2555
|
-
const detail = kind === "search" && typeof args.path === "string" && args.path !== "" && typeof args.pattern === "string" && args.pattern !== "" ? args.pattern : void 0;
|
|
2556
|
-
const op = {
|
|
2557
|
-
seq: n.seq,
|
|
2558
|
-
...n.gone !== void 0 ? { gone: n.gone } : {},
|
|
2559
|
-
kind,
|
|
2560
|
-
tool,
|
|
2561
|
-
...n.time !== void 0 ? { time: n.time } : {},
|
|
2562
|
-
err: n.err === true || conv.isError === true,
|
|
2563
|
-
added,
|
|
2564
|
-
removed,
|
|
2565
|
-
...detail !== void 0 ? { detail } : {}
|
|
2566
|
-
};
|
|
3336
|
+
/** Book one executed op under its file; the totals and the entry move together.
|
|
3337
|
+
* `pattern` marks a pathless search's pattern-as-target row (a display-only flag). */
|
|
3338
|
+
const add = (op, path, pattern = false) => {
|
|
3339
|
+
totals[op.kind].ops++;
|
|
2567
3340
|
let entry = byPath.get(path);
|
|
2568
3341
|
if (entry === void 0) {
|
|
2569
3342
|
entry = {
|
|
2570
3343
|
path,
|
|
2571
|
-
form: formOf(tool, path),
|
|
3344
|
+
form: formOf(op.tool, path),
|
|
2572
3345
|
reads: 0,
|
|
2573
3346
|
writes: 0,
|
|
2574
3347
|
searches: 0,
|
|
2575
3348
|
added: 0,
|
|
2576
3349
|
removed: 0,
|
|
2577
3350
|
errs: 0,
|
|
2578
|
-
ops: []
|
|
3351
|
+
ops: [],
|
|
3352
|
+
...pattern ? { pattern: true } : {}
|
|
2579
3353
|
};
|
|
2580
3354
|
byPath.set(path, entry);
|
|
2581
3355
|
}
|
|
2582
|
-
if (kind === "read") entry.reads++;
|
|
2583
|
-
else if (kind === "write") entry.writes++;
|
|
3356
|
+
if (op.kind === "read") entry.reads++;
|
|
3357
|
+
else if (op.kind === "write") entry.writes++;
|
|
2584
3358
|
else entry.searches++;
|
|
2585
|
-
entry.added += added;
|
|
2586
|
-
entry.removed += removed;
|
|
3359
|
+
entry.added += op.added;
|
|
3360
|
+
entry.removed += op.removed;
|
|
2587
3361
|
if (op.err) entry.errs++;
|
|
2588
3362
|
entry.ops.push(op);
|
|
3363
|
+
};
|
|
3364
|
+
for (const n of nodes) {
|
|
3365
|
+
if (n.cat !== "tool") continue;
|
|
3366
|
+
if (before !== null && n.seq >= before) continue;
|
|
3367
|
+
const tool = n.tool;
|
|
3368
|
+
if (tool === void 0) continue;
|
|
3369
|
+
try {
|
|
3370
|
+
const conv = convOf(n.seq);
|
|
3371
|
+
const staticKind = kindOfTool(tool);
|
|
3372
|
+
const args = staticKind !== null || tool === "str_replace_editor" ? parseCallArgs(conv?.call?.argsRaw) : null;
|
|
3373
|
+
const kind = staticKind ?? kindOfCall(tool, args);
|
|
3374
|
+
if (kind !== null) {
|
|
3375
|
+
const err = n.err === true || conv?.isError === true;
|
|
3376
|
+
const files = kind === "search" ? searchFilesOf(conv?.meta) : null;
|
|
3377
|
+
if (files !== null) {
|
|
3378
|
+
const detail = searchDetailOf(args);
|
|
3379
|
+
for (const f of files) add({
|
|
3380
|
+
seq: n.seq,
|
|
3381
|
+
...n.gone !== void 0 ? { gone: n.gone } : {},
|
|
3382
|
+
kind,
|
|
3383
|
+
tool,
|
|
3384
|
+
...n.time !== void 0 ? { time: n.time } : {},
|
|
3385
|
+
err,
|
|
3386
|
+
added: 0,
|
|
3387
|
+
removed: 0,
|
|
3388
|
+
...detail !== void 0 ? { detail } : {},
|
|
3389
|
+
...f.hits > 0 ? { hits: f.hits } : {}
|
|
3390
|
+
}, f.path);
|
|
3391
|
+
} else if (args !== null) {
|
|
3392
|
+
const path = pathOfArgs(tool, args);
|
|
3393
|
+
if (path !== null) {
|
|
3394
|
+
const { added, removed } = deltaOf(tool, args);
|
|
3395
|
+
const narrowed = typeof args.path === "string" && args.path !== "";
|
|
3396
|
+
const detail = kind === "search" && narrowed ? searchDetailOf(args) : void 0;
|
|
3397
|
+
const read = kind === "read" ? readOf(conv?.meta, args) : void 0;
|
|
3398
|
+
add({
|
|
3399
|
+
seq: n.seq,
|
|
3400
|
+
...n.gone !== void 0 ? { gone: n.gone } : {},
|
|
3401
|
+
kind,
|
|
3402
|
+
tool,
|
|
3403
|
+
...n.time !== void 0 ? { time: n.time } : {},
|
|
3404
|
+
err,
|
|
3405
|
+
added,
|
|
3406
|
+
removed,
|
|
3407
|
+
...detail !== void 0 ? { detail } : {},
|
|
3408
|
+
...read !== void 0 ? { read } : {}
|
|
3409
|
+
}, path, kind === "search" && !narrowed);
|
|
3410
|
+
}
|
|
3411
|
+
}
|
|
3412
|
+
}
|
|
3413
|
+
const subCalls = conv?.subCalls;
|
|
3414
|
+
if (subCalls !== void 0 && subCalls.length > 0) foldSubCalls(subCalls, n, programOf(conv), add, /* @__PURE__ */ new Set(), 1);
|
|
3415
|
+
} catch {}
|
|
2589
3416
|
}
|
|
2590
3417
|
const entries = [...byPath.values()];
|
|
2591
3418
|
for (const e of entries) {
|
|
@@ -3308,9 +4135,6 @@ window.__ModuleLoader__.load({
|
|
|
3308
4135
|
//#region src/client/components/fileCard.tsx
|
|
3309
4136
|
function makeFileCard(kit, settings) {
|
|
3310
4137
|
const { t, fmt, fmtTime } = kit;
|
|
3311
|
-
function formGlyph(form) {
|
|
3312
|
-
return form === "image" ? "🖼" : form === "dir" ? "📁" : "📄";
|
|
3313
|
-
}
|
|
3314
4138
|
function matches(e, f) {
|
|
3315
4139
|
if (f === "all") return true;
|
|
3316
4140
|
if (f === "image") return e.form === "image";
|
|
@@ -3329,8 +4153,9 @@ window.__ModuleLoader__.load({
|
|
|
3329
4153
|
const [query, setQuery] = React.useState("");
|
|
3330
4154
|
const [openPath, setOpenPath] = React.useState(null);
|
|
3331
4155
|
const q = query.trim().toLowerCase();
|
|
4156
|
+
const displayOf = (e) => e.pattern === true ? e.path : displayPathOf(e.path, props.workspace);
|
|
3332
4157
|
const countOf = (e) => filter === "read" ? e.reads : filter === "write" ? e.writes : filter === "search" ? e.searches : e.ops.length;
|
|
3333
|
-
const shown = activity.entries.filter((e) => matches(e, filter) && (q === "" || e.
|
|
4158
|
+
const shown = activity.entries.filter((e) => matches(e, filter) && (q === "" || displayOf(e).toLowerCase().includes(q))).sort((a, b) => sort === "count" ? countOf(b) - countOf(a) || b.ops[0].seq - a.ops[0].seq : sort === "latest" ? b.ops[0].seq - a.ops[0].seq : a.path < b.path ? -1 : 1);
|
|
3334
4159
|
const chips = [
|
|
3335
4160
|
{
|
|
3336
4161
|
key: "all",
|
|
@@ -3358,13 +4183,19 @@ window.__ModuleLoader__.load({
|
|
|
3358
4183
|
ops: activity.totals.image.ops
|
|
3359
4184
|
}
|
|
3360
4185
|
];
|
|
3361
|
-
const opLine = (op) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: "lc-fa-op-
|
|
4186
|
+
const opLine = (op) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("span", { className: "lc-fa-op-tool" }, op.tool), op.read !== void 0 ? /* @__PURE__ */ React.createElement("span", {
|
|
4187
|
+
className: "lc-fa-read",
|
|
4188
|
+
title: "est" in op.read ? t("files.readEst") : t("files.readTip", {
|
|
4189
|
+
a: fmt(op.read.start),
|
|
4190
|
+
b: fmt(op.read.start + op.read.count - 1)
|
|
4191
|
+
})
|
|
4192
|
+
}, ("est" in op.read ? "≈" : ">>") + fmt(op.read.count)) : null, op.detail !== void 0 ? /* @__PURE__ */ React.createElement("span", { className: "lc-fa-op-detail" }, op.detail) : null, op.hits !== void 0 ? /* @__PURE__ */ React.createElement("span", { className: "lc-fa-op-detail" }, t("files.hits", { n: fmt(op.hits) })) : null, op.detail === void 0 && op.hits === void 0 && op.program !== void 0 ? /* @__PURE__ */ React.createElement("span", { className: "lc-fa-op-detail" }, op.program) : null, op.added + op.removed > 0 ? /* @__PURE__ */ React.createElement(DeltaPair, {
|
|
3362
4193
|
added: op.added,
|
|
3363
4194
|
removed: op.removed
|
|
3364
4195
|
}) : null, op.err ? /* @__PURE__ */ React.createElement("span", {
|
|
3365
4196
|
className: "lc-br-err-dot",
|
|
3366
4197
|
title: t("node.failed")
|
|
3367
|
-
}) : null);
|
|
4198
|
+
}) : null, /* @__PURE__ */ React.createElement("span", { className: "lc-fa-op-time" }, op.time !== void 0 ? fmtTime(op.time) : "—"));
|
|
3368
4199
|
return /* @__PURE__ */ React.createElement("div", { className: "lc-card lc-col" }, /* @__PURE__ */ React.createElement("div", { className: "lc-card-title" }, /* @__PURE__ */ React.createElement("span", { className: "lc-card-title-text" }, t("files.title")), /* @__PURE__ */ React.createElement("span", { className: "lc-card-sub" }, props.scope)), activity.entries.length === 0 ? /* @__PURE__ */ React.createElement("div", { className: "lc-empty" }, t("files.empty")) : /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("div", { className: "lc-fa-ctl" }, /* @__PURE__ */ React.createElement("div", { className: "lc-gran" }, chips.map((c) => /* @__PURE__ */ React.createElement("button", {
|
|
3369
4200
|
key: c.key,
|
|
3370
4201
|
type: "button",
|
|
@@ -3406,10 +4237,13 @@ window.__ModuleLoader__.load({
|
|
|
3406
4237
|
}
|
|
3407
4238
|
}, t("files.sort." + k))))), shown.length === 0 ? /* @__PURE__ */ React.createElement("div", { className: "lc-empty" }, t("files.noMatch")) : /* @__PURE__ */ React.createElement("div", { className: "lc-fa-list" }, shown.map((e) => {
|
|
3408
4239
|
const open = openPath === e.path;
|
|
3409
|
-
const
|
|
4240
|
+
const display = displayOf(e);
|
|
4241
|
+
const trimmed = display.endsWith("/") ? display.slice(0, -1) : display;
|
|
3410
4242
|
const slash = trimmed.lastIndexOf("/");
|
|
3411
4243
|
const dir = slash >= 0 ? trimmed.slice(0, slash + 1) : "";
|
|
3412
4244
|
const base = slash >= 0 ? trimmed.slice(slash + 1) : trimmed;
|
|
4245
|
+
const glyph = glyphOf(e.path, e.form);
|
|
4246
|
+
const abs = e.pattern === true ? void 0 : absPathOf(e.path, props.workspace);
|
|
3413
4247
|
return /* @__PURE__ */ React.createElement("div", {
|
|
3414
4248
|
key: e.path,
|
|
3415
4249
|
className: "lc-fa-item" + (open ? " lc-fa-item-on" : "")
|
|
@@ -3420,10 +4254,23 @@ window.__ModuleLoader__.load({
|
|
|
3420
4254
|
onClick: () => {
|
|
3421
4255
|
setOpenPath(open ? null : e.path);
|
|
3422
4256
|
}
|
|
3423
|
-
}, /* @__PURE__ */ React.createElement("span", { className: "lc-br-chev" + (open ? " lc-br-chev-on" : "") }
|
|
4257
|
+
}, /* @__PURE__ */ React.createElement("span", { className: "lc-br-chev" + (open ? " lc-br-chev-on" : "") }), /* @__PURE__ */ React.createElement("span", {
|
|
3424
4258
|
className: "lc-fa-form",
|
|
3425
|
-
title: t(
|
|
3426
|
-
},
|
|
4259
|
+
title: t(glyph.tip)
|
|
4260
|
+
}, glyph.color !== void 0 ? /* @__PURE__ */ React.createElement("span", {
|
|
4261
|
+
className: "lc-fa-lang",
|
|
4262
|
+
style: {
|
|
4263
|
+
background: glyph.color,
|
|
4264
|
+
color: glyph.text
|
|
4265
|
+
}
|
|
4266
|
+
}, glyph.glyph) : glyph.glyph), /* @__PURE__ */ React.createElement("span", { className: "lc-fa-path" }, dir !== "" ? /* @__PURE__ */ React.createElement("em", null, dir) : null, abs !== void 0 && props.onOpen !== void 0 ? /* @__PURE__ */ React.createElement("b", {
|
|
4267
|
+
className: "lc-fa-file",
|
|
4268
|
+
title: t("files.open"),
|
|
4269
|
+
onClick: (ev) => {
|
|
4270
|
+
ev.stopPropagation();
|
|
4271
|
+
props.onOpen?.(abs);
|
|
4272
|
+
}
|
|
4273
|
+
}, base) : /* @__PURE__ */ React.createElement("b", null, base)), e.reads > 0 ? /* @__PURE__ */ React.createElement("span", {
|
|
3427
4274
|
className: "lc-fa-badge lc-fa-b-read",
|
|
3428
4275
|
title: t("files.kind.read")
|
|
3429
4276
|
}, /* @__PURE__ */ React.createElement("i", null), fmt(e.reads)) : null, e.writes > 0 ? /* @__PURE__ */ React.createElement("span", {
|
|
@@ -3438,10 +4285,11 @@ window.__ModuleLoader__.load({
|
|
|
3438
4285
|
}) : null, e.errs > 0 ? /* @__PURE__ */ React.createElement("span", {
|
|
3439
4286
|
className: "lc-br-err-dot",
|
|
3440
4287
|
title: t("files.errs", { n: e.errs })
|
|
3441
|
-
}) : null, e.ops[0].time !== void 0 ? /* @__PURE__ */ React.createElement("span", { className: "lc-fa-time" }, fmtTime(e.ops[0].time)) : null), open ? /* @__PURE__ */ React.createElement("div", { className: "lc-fa-ops" }, e.ops.map((op) => {
|
|
4288
|
+
}) : null, e.ops[0].time !== void 0 ? /* @__PURE__ */ React.createElement("span", { className: "lc-fa-time" }, fmtTime(e.ops[0].time)) : null), open ? /* @__PURE__ */ React.createElement("div", { className: "lc-fa-ops" }, e.ops.map((op, i) => {
|
|
3442
4289
|
const onLocate = props.onLocate;
|
|
4290
|
+
const key = `${op.seq}:${i}`;
|
|
3443
4291
|
return onLocate !== void 0 ? /* @__PURE__ */ React.createElement("button", {
|
|
3444
|
-
key
|
|
4292
|
+
key,
|
|
3445
4293
|
type: "button",
|
|
3446
4294
|
className: "lc-fa-op lc-fa-op-link",
|
|
3447
4295
|
title: t("files.locate"),
|
|
@@ -3449,7 +4297,7 @@ window.__ModuleLoader__.load({
|
|
|
3449
4297
|
onLocate(op);
|
|
3450
4298
|
}
|
|
3451
4299
|
}, opLine(op)) : /* @__PURE__ */ React.createElement("div", {
|
|
3452
|
-
key
|
|
4300
|
+
key,
|
|
3453
4301
|
className: "lc-fa-op"
|
|
3454
4302
|
}, opLine(op));
|
|
3455
4303
|
})) : null);
|
|
@@ -3512,7 +4360,7 @@ window.__ModuleLoader__.load({
|
|
|
3512
4360
|
return function PluginInfo() {
|
|
3513
4361
|
const [latest, setLatest] = React.useState(null);
|
|
3514
4362
|
React.useEffect(() => {
|
|
3515
|
-
if ("0.
|
|
4363
|
+
if ("0.35.0".includes("-dev")) return;
|
|
3516
4364
|
let on = true;
|
|
3517
4365
|
fetchLatestVersion().then((v) => {
|
|
3518
4366
|
if (on && v) setLatest(v);
|
|
@@ -3521,13 +4369,18 @@ window.__ModuleLoader__.load({
|
|
|
3521
4369
|
on = false;
|
|
3522
4370
|
};
|
|
3523
4371
|
}, []);
|
|
3524
|
-
const update = latest !== null && isNewerVersion(latest, "0.
|
|
3525
|
-
const nameValue = ["dsh-context (v0.
|
|
4372
|
+
const update = latest !== null && isNewerVersion(latest, "0.35.0") ? latest : null;
|
|
4373
|
+
const nameValue = ["dsh-context (v0.35.0)"];
|
|
3526
4374
|
if (update) nameValue.push(/* @__PURE__ */ React.createElement("span", {
|
|
3527
4375
|
key: "update",
|
|
3528
4376
|
className: "lc-pi-update"
|
|
3529
4377
|
}, "↑ v" + update));
|
|
3530
|
-
return /* @__PURE__ */ React.createElement("div", { className: "lc-card" }, /* @__PURE__ */ React.createElement("div", { className: "lc-card-title" }, /* @__PURE__ */ React.createElement("span", { className: "lc-card-title-text" }, t("plugin.title")), /* @__PURE__ */ React.createElement("
|
|
4378
|
+
return /* @__PURE__ */ React.createElement("div", { className: "lc-card" }, /* @__PURE__ */ React.createElement("div", { className: "lc-card-title" }, /* @__PURE__ */ React.createElement("span", { className: "lc-card-title-text" }, t("plugin.title")), /* @__PURE__ */ React.createElement("a", {
|
|
4379
|
+
className: "lc-card-sub lc-pi-hint",
|
|
4380
|
+
href: PLUGIN_REPO,
|
|
4381
|
+
target: "_blank",
|
|
4382
|
+
rel: "noreferrer"
|
|
4383
|
+
}, t("plugin.hint"))), /* @__PURE__ */ React.createElement("div", { className: "lc-pi-grid" }, row(t("plugin.name"), nameValue, PLUGIN_REPO + "/releases"), row(t("plugin.github"), PLUGIN_REPO_SHORT, PLUGIN_REPO)));
|
|
3531
4384
|
};
|
|
3532
4385
|
}
|
|
3533
4386
|
//#endregion
|
|
@@ -4352,12 +5205,15 @@ window.__ModuleLoader__.load({
|
|
|
4352
5205
|
convOf,
|
|
4353
5206
|
filesBefore
|
|
4354
5207
|
]);
|
|
5208
|
+
const workspace = typeof ctx.get === "function" ? workspaceOf(ctx, typeof sessionId === "string" ? sessionId : void 0) : void 0;
|
|
5209
|
+
const fileOpener = React.useMemo(() => typeof ctx.get === "function" && canOpenPathsOf(ctx) ? openPathVia(ctx) : void 0, [ctx]);
|
|
4355
5210
|
const locateFileOp = React.useCallback((op) => {
|
|
4356
|
-
const
|
|
5211
|
+
const seq = op.parent ?? op.seq;
|
|
5212
|
+
const step = locateStepOf(requests, seq, op.gone);
|
|
4357
5213
|
if (step === null) return;
|
|
4358
5214
|
setNodeFocus({
|
|
4359
5215
|
step,
|
|
4360
|
-
seq
|
|
5216
|
+
seq,
|
|
4361
5217
|
cat: "tool"
|
|
4362
5218
|
});
|
|
4363
5219
|
}, [requests]);
|
|
@@ -4497,6 +5353,8 @@ window.__ModuleLoader__.load({
|
|
|
4497
5353
|
}, t("kind." + k))))), /* @__PURE__ */ React.createElement(EventList, { events: shownEvents })), /* @__PURE__ */ React.createElement(FileCard, {
|
|
4498
5354
|
activity: fileActivity,
|
|
4499
5355
|
scope: fileScope,
|
|
5356
|
+
workspace,
|
|
5357
|
+
onOpen: fileOpener,
|
|
4500
5358
|
onLocate: locateFileOp
|
|
4501
5359
|
})), /* @__PURE__ */ React.createElement(AgentGraph, {
|
|
4502
5360
|
sessionId: typeof sessionId === "string" ? sessionId : void 0,
|
|
@@ -4526,7 +5384,7 @@ window.__ModuleLoader__.load({
|
|
|
4526
5384
|
}
|
|
4527
5385
|
//#endregion
|
|
4528
5386
|
//#region \0dsh-global-css:/home/runner/work/dsh-context/dsh-context/src/client/styles.css.mjs
|
|
4529
|
-
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{flex-wrap:wrap;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(62px,1fr));gap:6px;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:6px;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);margin-left:auto;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-trend-ctl{align-items:center;gap:6px;margin-left:auto;display:flex}.lc-trend-ctl .lc-gran{margin-left:0}.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-settings-card{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;transition:border-color .16s,background .16s}.lc-settings-card:hover{border-color:var(--dsw-alias-label-dimmed)}.lc-settings-open,.lc-settings-open:hover{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}.lc-settings-head{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.lc-settings-headtext{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.lc-settings-name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}.lc-settings-desc{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}.lc-settings-chevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.lc-settings-open .lc-settings-chevron{transform:rotate(180deg)}.lc-settings-body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding:4px 0 12px}.lc-settings-row{align-items:center;gap:8px;padding:8px 0;display:flex}.lc-settings-label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:14px}.lc-settings-select{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.lc-settings-select:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.lc-settings-select:disabled{opacity:.5;cursor:default}.lc-settings-note{color:var(--dsw-alias-label-tertiary);margin:12px 0 4px;font-size:12px;line-height:1.5}.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{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-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-wrap{flex:1;min-width:0;position:relative}.lc-chart-scroll{scrollbar-gutter:stable;padding-bottom:var(--dsh-scrollbar-width,8px);overflow:auto hidden}.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-grid-zero{border-top-style:solid;border-top-color:#80808080}.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;left:0;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-up,.lc-bar-down{width:100%;display:flex;position:absolute;left:0}.lc-bar-up{flex-direction:column-reverse}.lc-bar-down{flex-direction:column}.lc-bar-up>div,.lc-bar-down>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-turn-label{text-overflow:ellipsis;max-width:100%;display:inline-block;overflow:hidden}.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;align-items:center;gap:6px 8px;margin-bottom:10px;display:flex}.lc-detail-head b{color:var(--dsw-alias-label-primary);font-size:13px}.lc-detail-time{font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto;font-size:12px}.lc-detail-marker{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);border-radius:6px;padding:1px 7px;font-size:11px}.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-metric{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);border-radius:6px;padding:2px 8px;font-size:12px;font-weight:600}.lc-detail-metric-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-detail-metric-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-detail-rows{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:4px 24px;margin-top:10px;display:grid}.lc-brief{flex-direction:column;gap:2px;min-height:76px;margin:-4px 0 10px;display:flex}.lc-brief-row{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;margin-left:-6px;margin-right:-6px;padding:3px 6px;font-family:inherit;font-size:12px;line-height:1.5;transition:background-color .12s;display:flex}.lc-brief-row-link:hover{background:var(--dsw-alias-interactive-bg-hover)}button.lc-brief-row-link{cursor:pointer}.lc-brief-tag{box-sizing:border-box;text-align:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:56px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;position:relative}.lc-brief-tip{z-index:6;white-space:normal;text-align:left;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:240px;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;bottom:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-brief-tag:hover .lc-brief-tip{opacity:1}.lc-brief-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-empty{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary);flex:1;overflow:hidden}.lc-brief-fact{box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);max-width:160px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:0;max-width:260px;color:var(--dsw-alias-label-primary);border-radius:5px;align-items:center;gap:5px;padding:0 7px;font-size:12px;transition:background-color .12s;display:inline-flex;overflow:hidden}.lc-brief-chip-grow{flex:1;max-width:none}.lc-brief-chip-tag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);max-width:120px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-chip-link{cursor:pointer}.lc-brief-chip-link:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-brief-more{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.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;position:relative;overflow:hidden}.lc-bar-fill{border-radius:3px;height:100%;display:block}.lc-bar-zero{border-left:1px solid #80808073;position:absolute;top:0;bottom:0;left:50%}.lc-bar-fill-up,.lc-bar-fill-down{height:100%;display:block;position:absolute;top:0}.lc-bar-fill-up{border-radius:0 3px 3px 0;left:50%}.lc-bar-fill-down{border-radius:3px 0 0 3px;right:50%}.lc-detail-num{text-align:right;font-variant-numeric:tabular-nums;width:52px}.lc-detail-num-up{color:var(--dsw-alias-state-success-primary)}.lc-detail-num-down{color:var(--dsw-alias-state-error-primary)}.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-col-browser{flex-direction:column;display:flex}.lc-col-browser>.lc-card{flex:1}.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-fa-list{flex-direction:column;gap:2px;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-event-icon.lc-event-mode{color:var(--dsw-alias-label-secondary)}.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-kind-mode{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 15%, transparent);color:var(--dsw-alias-label-secondary)}.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-fa-ctl{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}.lc-fa-ctl .lc-gran{margin-left:0}.lc-fa-n{opacity:.75;margin-left:4px;font-weight:700}.lc-fa-search{min-width:80px;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;outline:none;flex:1;padding:3px 8px;font-size:12px}.lc-fa-search:focus{border-color:var(--dsw-alias-label-dimmed)}.lc-fa-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:6px;font-size:12px;display:flex}.lc-fa-meta .lc-fa-sort{flex:none}.lc-fa-meta-delta{position:relative}.lc-fa-meta-tip{z-index:6;white-space:normal;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:260px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;line-height:1.5;transition:opacity .12s;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-fa-meta-delta:hover .lc-fa-meta-tip{opacity:1}.lc-fa-item{border:1px solid #0000;border-radius:8px;transition:background-color .12s,border-color .12s}.lc-fa-item-on{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-border-l1)}.lc-fa-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:7px;align-items:center;gap:7px;padding:6px 8px;font-size:12px;transition:background-color .12s;display:flex}.lc-fa-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-fa-form{text-align:center;opacity:.85;flex:none;width:16px;font-size:11px}.lc-fa-path{word-break:break-all;flex:1;min-width:0}.lc-fa-path em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-fa-badge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 7px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-badge i{background:currentColor;border-radius:50%;width:5px;height:5px;display:inline-block}.lc-fa-b-read{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent)}.lc-fa-b-write{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent)}.lc-fa-b-search{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent)}.lc-fa-chip-read,.lc-fa-chip-read:hover{color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write,.lc-fa-chip-write:hover{color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search,.lc-fa-chip-search:hover{color:var(--dsw-alias-state-warn-primary)}.lc-fa-chip-read.lc-gran-on,.lc-fa-chip-read.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write.lc-gran-on,.lc-fa-chip-write.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search.lc-gran-on,.lc-fa-chip-search.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);color:var(--dsw-alias-state-warn-primary)}.lc-fa-delta{font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;gap:5px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-up{color:var(--dsw-alias-state-success-primary)}.lc-fa-down{color:var(--dsw-alias-state-error-primary)}.lc-fa-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.lc-fa-ops{border-left:2px solid var(--dsw-alias-border-l1);flex-direction:column;gap:1px;margin:0 8px 8px 15px;padding:2px 0 2px 10px;display:flex}.lc-fa-op{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:8px;padding:3px 6px;font-size:11px;transition:background-color .12s;display:flex}.lc-fa-op-link{cursor:pointer}.lc-fa-op-link:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-fa-op-time{width:58px;color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none}.lc-fa-op-tool{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:0 6px;font-size:11px}.lc-fa-op-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:1;overflow:hidden}.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-retry{color:var(--dsw-alias-brand-primary);font:inherit;cursor:pointer;text-underline-offset:2px;background:0 0;border:0;padding:0;font-size:12px;text-decoration:underline}.lc-br-retry:hover{filter:brightness(1.15)}.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-err-dot{background:var(--dsw-alias-state-error-primary);width:6px;height:6px;box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);border-radius:50%;flex:none}.lc-br-tag{min-width:0;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;max-width:220px;padding:0 6px;font-size:11px;overflow:hidden}.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-dim{color:var(--dsw-alias-label-secondary)}.lc-ts-card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;min-width:0;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-card-right{align-items:center;gap:8px;margin-left:auto;display:inline-flex}.lc-ts-card-meta{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;font-weight:400}.lc-ts-call-state{white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:2px 7px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:600;line-height:1;display:inline-flex}.lc-ts-call-state i{background:currentColor;border-radius:50%;flex:none;width:6px;height:6px}.lc-ts-call-ok{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)}.lc-ts-call-err{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.lc-ts-desc-body{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:320px;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:minmax(0,140px) minmax(0,90px) 56px minmax(0,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);overflow-wrap:anywhere;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;gap:2px;margin-left:auto;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-ts-desc-md{color:var(--dsw-alias-label-primary);word-break:break-word;overflow-wrap:anywhere;white-space:pre-line;scrollbar-width:thin;min-width:0;max-height:320px;padding:4px 10px;font-size:12px;line-height:1.55;overflow:hidden auto}.lc-ts-desc-md>div{font-size:13px;line-height:1.55}.lc-ts-desc-md div :is(h1,h2,h3,h4,h5,h6){margin:10px 0 4px;font-size:13px;font-weight:600}.lc-ts-desc-md div p{margin:6px 0}.lc-ts-desc-md div pre{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;margin:6px 0}.lc-ts-desc-md div :not(pre)>code{box-decoration-break:clone;padding:1px 5px;line-height:1.3;font-size:1em!important}.lc-ts-desc-md div table code{font-size:inherit}.lc-att-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding:8px 10px;display:grid}.lc-att-item{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);width:100%;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border-radius:8px;align-items:center;gap:8px;padding:6px;display:flex}.lc-att-item:hover{border-color:var(--dsw-alias-border-l2,var(--dsw-alias-border-l1));background:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-att-thumb{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;flex:none;justify-content:center;align-items:center;width:64px;height:64px;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}.lc-att-lightbox{z-index:1000;place-items:center;padding:40px;display:grid;position:fixed;inset:0}.lc-att-lightbox-mask{background:var(--dsw-alias-bg-mask-1,#00000073);backdrop-filter:var(--dsw-mask-blur,blur(2px));position:absolute;inset:0}.lc-att-lightbox-img{object-fit:contain;background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));max-width:min(100%,1600px);max-height:calc(100vh - 80px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);border-radius:12px;position:relative}.lc-att-lightbox-close{z-index:1;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l1));background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));width:36px;height:36px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:999px;place-items:center;padding:0;display:grid;position:fixed;top:20px;right:20px}[data-conversation-scroll]:has(.lc-root)>[data-composer-seat]:not(:has([data-approval-key],[data-question-key],[data-plan-review-key])){display:none}.lc-agents-chips{flex-wrap:wrap;gap:6px;margin-bottom:10px;display:flex}.lc-agents-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:2px 8px;font-size:11px}.lc-agents-chip-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-stage{margin:0 -4px;padding:0 4px;overflow-x:auto}.lc-agents-svg{max-width:none;margin:0 auto;display:block}.lc-agents-link{stroke-width:1.5px;stroke-opacity:.45}.lc-agents-link-live{stroke-opacity:.85}.lc-agents-flow{stroke-width:2px;stroke-linecap:round;stroke-dasharray:2 7;animation:.9s linear infinite lc-agent-flow}@keyframes lc-agent-flow{to{stroke-dashoffset:-9px}}.lc-agent-node{outline:none}.lc-agent-clickable{cursor:pointer}.lc-agent-halo{fill:#0000;transition:fill .12s}.lc-agent-hover .lc-agent-halo,.lc-agent-node:focus-visible .lc-agent-halo{fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-agent-self .lc-agent-halo{fill:var(--dsw-alias-bg-layer-2)}.lc-agent-running .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);animation:1.8s ease-in-out infinite lc-agent-glow}.lc-agent-done .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 7%, transparent)}@keyframes lc-agent-glow{0%,to{opacity:1}50%{opacity:.4}}.lc-agent-track{fill:var(--dsw-alias-bg-layer-1);stroke:var(--dsw-alias-border-l1);stroke-width:1.5px}.lc-agent-seg{fill:none;stroke-width:9px;transition:stroke-dasharray .3s,stroke-dashoffset .3s}.lc-agent-free{stroke:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agent-pct{fill:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;pointer-events:none;font-size:11px;font-weight:600}.lc-agent-caption{text-align:center;pointer-events:none;width:100%;line-height:1.25}.lc-agent-label{color:var(--dsw-alias-label-primary);overflow-wrap:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;font-size:11px;display:-webkit-box;overflow:hidden}.lc-agent-tokens{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:10px}.lc-agents-solo{padding:4px 0 10px}.lc-agents-inspector{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-wrap:wrap;align-items:baseline;gap:4px 8px;min-width:0;margin-top:10px;padding:7px 10px;font-size:12px;display:flex}.lc-agents-inspector-name{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.lc-agents-badge{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 6px;font-size:10px}.lc-agent-self-badge{vertical-align:1px;margin-left:5px}.lc-agents-badge-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-inspector-stats{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.lc-agents-inspector-open{color:var(--dsw-alias-brand-primary,#3b82f6);flex:none;margin-left:auto}.lc-agents-legend{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:4px 14px;margin-top:8px;font-size:11px;display:flex}.lc-agents-legend-item{align-items:center;gap:5px;display:inline-flex}.lc-agents-legend-item i{border-radius:2px;width:8px;height:8px}.lc-agents-legend-free{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agents-legend-edge{border-top:2px dashed var(--dsw-alias-label-secondary);border-radius:0!important;width:14px!important;height:0!important}";
|
|
5387
|
+
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{flex-wrap:wrap;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(62px,1fr));gap:6px;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:6px;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);margin-left:auto;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-trend-ctl{align-items:center;gap:6px;margin-left:auto;display:flex}.lc-trend-ctl .lc-gran{margin-left:0}.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-settings-card{background:var(--dsw-alias-bg-layer-3);border:1px solid var(--dsw-alias-border-l2);border-radius:12px;transition:border-color .16s,background .16s}.lc-settings-card:hover{border-color:var(--dsw-alias-label-dimmed)}.lc-settings-open,.lc-settings-open:hover{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-label-dimmed)}.lc-settings-head{appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.lc-settings-headtext{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.lc-settings-name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:1.4}.lc-settings-desc{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:1.5}.lc-settings-chevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .16s}.lc-settings-open .lc-settings-chevron{transform:rotate(180deg)}.lc-settings-body{border-top:1px solid var(--dsw-alias-border-l2);margin:0 16px;padding:4px 0 12px}.lc-settings-row{align-items:center;gap:8px;padding:8px 0;display:flex}.lc-settings-label{min-width:0;color:var(--dsw-alias-label-primary);flex:1;font-size:14px}.lc-settings-select{background:var(--dsw-alias-bg-module-platform);height:36px;font:inherit;color:var(--dsw-alias-label-primary);cursor:pointer;border:none;border-radius:18px;align-items:center;gap:12px;padding:0 14px;font-size:14px;line-height:22px;display:inline-flex}.lc-settings-select:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover)}.lc-settings-select:disabled{opacity:.5;cursor:default}.lc-settings-note{color:var(--dsw-alias-label-tertiary);margin:12px 0 4px;font-size:12px;line-height:1.5}.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{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-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-wrap{flex:1;min-width:0;position:relative}.lc-chart-scroll{scrollbar-gutter:stable;padding-bottom:var(--dsh-scrollbar-width,8px);overflow:auto hidden}.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-grid-zero{border-top-style:solid;border-top-color:#80808080}.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;left:0;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-up,.lc-bar-down{width:100%;display:flex;position:absolute;left:0}.lc-bar-up{flex-direction:column-reverse}.lc-bar-down{flex-direction:column}.lc-bar-up>div,.lc-bar-down>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-turn-label{text-overflow:ellipsis;max-width:100%;display:inline-block;overflow:hidden}.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;align-items:center;gap:6px 8px;margin-bottom:10px;display:flex}.lc-detail-head b{color:var(--dsw-alias-label-primary);font-size:13px}.lc-detail-time{font-variant-numeric:tabular-nums;white-space:nowrap;margin-left:auto;font-size:12px}.lc-detail-marker{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 12%, transparent);border-radius:6px;padding:1px 7px;font-size:11px}.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-metric{font-variant-numeric:tabular-nums;white-space:nowrap;color:var(--dsw-alias-label-primary);background:color-mix(in srgb, var(--dsw-alias-label-secondary) 14%, transparent);border-radius:6px;padding:2px 8px;font-size:12px;font-weight:600}.lc-detail-metric-up{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 15%, transparent)}.lc-detail-metric-down{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 15%, transparent)}.lc-detail-rows{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:4px 24px;margin-top:10px;display:grid}.lc-brief{flex-direction:column;gap:2px;min-height:76px;margin:-4px 0 10px;display:flex}.lc-brief-row{min-width:0;color:var(--dsw-alias-label-primary);text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;margin-left:-6px;margin-right:-6px;padding:3px 6px;font-family:inherit;font-size:12px;line-height:1.5;transition:background-color .12s;display:flex}.lc-brief-row-link:hover{background:var(--dsw-alias-interactive-bg-hover)}button.lc-brief-row-link{cursor:pointer}.lc-brief-tag{box-sizing:border-box;text-align:center;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:56px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;position:relative}.lc-brief-tip{z-index:6;white-space:normal;text-align:left;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:240px;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;bottom:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-brief-tag:hover .lc-brief-tip{opacity:1}.lc-brief-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-empty{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary);flex:1;overflow:hidden}.lc-brief-fact{box-sizing:border-box;text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);max-width:160px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);min-width:0;max-width:260px;color:var(--dsw-alias-label-primary);border-radius:5px;align-items:center;gap:5px;padding:0 7px;font-size:12px;transition:background-color .12s;display:inline-flex;overflow:hidden}.lc-brief-chip-grow{flex:1;max-width:none}.lc-brief-chip-tag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);max-width:120px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 6px;font-size:11px;overflow:hidden}.lc-brief-chip-text{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.lc-brief-chip-link{cursor:pointer}.lc-brief-chip-link:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-brief-more{color:var(--dsw-alias-label-secondary);flex:none;font-size:11px}.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;position:relative;overflow:hidden}.lc-bar-fill{border-radius:3px;height:100%;display:block}.lc-bar-zero{border-left:1px solid #80808073;position:absolute;top:0;bottom:0;left:50%}.lc-bar-fill-up,.lc-bar-fill-down{height:100%;display:block;position:absolute;top:0}.lc-bar-fill-up{border-radius:0 3px 3px 0;left:50%}.lc-bar-fill-down{border-radius:3px 0 0 3px;right:50%}.lc-detail-num{text-align:right;font-variant-numeric:tabular-nums;width:52px}.lc-detail-num-up{color:var(--dsw-alias-state-success-primary)}.lc-detail-num-down{color:var(--dsw-alias-state-error-primary)}.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-col-browser{flex-direction:column;display:flex}.lc-col-browser>.lc-card{flex:1}.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-hint{text-decoration:none}.lc-pi-hint:hover{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-fa-list{flex-direction:column;gap:2px;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-event-icon.lc-event-mode{color:var(--dsw-alias-label-secondary)}.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-kind-mode{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 15%, transparent);color:var(--dsw-alias-label-secondary)}.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-fa-ctl{flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px;display:flex}.lc-fa-ctl .lc-gran{margin-left:0}.lc-fa-n{opacity:.75;margin-left:4px;font-weight:700}.lc-fa-search{min-width:80px;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;outline:none;flex:1;padding:3px 8px;font-size:12px}.lc-fa-search:focus{border-color:var(--dsw-alias-label-dimmed)}.lc-fa-meta{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:6px;font-size:12px;display:flex}.lc-fa-meta .lc-fa-sort{flex:none}.lc-fa-meta-delta{position:relative}.lc-fa-meta-tip{z-index:6;white-space:normal;background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);width:max-content;max-width:260px;color:var(--dsw-alias-label-primary);pointer-events:none;opacity:0;border-radius:6px;padding:6px 10px;font-size:12px;line-height:1.5;transition:opacity .12s;position:absolute;top:calc(100% + 6px);left:0;box-shadow:0 2px 8px #0000002e}.lc-fa-meta-delta:hover .lc-fa-meta-tip{opacity:1}.lc-fa-item{border:1px solid #0000;border-radius:8px;transition:background-color .12s,border-color .12s}.lc-fa-item-on{background:var(--dsw-alias-bg-layer-2);border-color:var(--dsw-alias-border-l1)}.lc-fa-row{width:100%;color:var(--dsw-alias-label-primary);font:inherit;cursor:pointer;text-align:left;background:0 0;border:0;border-radius:7px;align-items:center;gap:7px;padding:6px 8px;font-size:12px;transition:background-color .12s;display:flex}.lc-fa-row:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-fa-form{opacity:.85;flex:none;justify-content:center;align-items:center;width:20px;height:14px;font-size:11px;display:flex}.lc-fa-lang{border-radius:4px;justify-content:center;align-items:center;min-width:16px;height:13px;padding:0 2px;font-size:8px;font-weight:700;line-height:1;display:inline-flex}.lc-fa-row .lc-br-chev{margin-right:-2px}.lc-fa-path{word-break:break-all;flex:1;min-width:0}.lc-fa-file{cursor:pointer}.lc-fa-file:hover{text-decoration:underline}.lc-fa-path em{color:var(--dsw-alias-label-secondary);font-style:normal}.lc-fa-badge{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:1px 7px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-badge i{background:currentColor;border-radius:50%;width:5px;height:5px;display:inline-block}.lc-fa-b-read{color:var(--dsw-alias-brand-primary);background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent)}.lc-fa-b-write{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent)}.lc-fa-b-search{color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent)}.lc-fa-chip-read,.lc-fa-chip-read:hover{color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write,.lc-fa-chip-write:hover{color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search,.lc-fa-chip-search:hover{color:var(--dsw-alias-state-warn-primary)}.lc-fa-chip-read.lc-gran-on,.lc-fa-chip-read.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-brand-primary) 14%, transparent);color:var(--dsw-alias-brand-primary)}.lc-fa-chip-write.lc-gran-on,.lc-fa-chip-write.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 14%, transparent);color:var(--dsw-alias-state-success-primary)}.lc-fa-chip-search.lc-gran-on,.lc-fa-chip-search.lc-gran-on:hover{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 14%, transparent);color:var(--dsw-alias-state-warn-primary)}.lc-fa-delta{font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;gap:5px;font-size:11px;font-weight:600;display:inline-flex}.lc-fa-up{color:var(--dsw-alias-state-success-primary)}.lc-fa-down{color:var(--dsw-alias-state-error-primary)}.lc-fa-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;font-size:11px}.lc-fa-ops{border-left:2px solid var(--dsw-alias-border-l1);flex-direction:column;gap:1px;margin:0 8px 8px 15px;padding:2px 0 2px 10px;display:flex}.lc-fa-op{min-width:0;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:8px;padding:3px 6px;font-size:11px;transition:background-color .12s;display:flex}.lc-fa-op-link{cursor:pointer}.lc-fa-op-link:hover{background:var(--dsw-alias-interactive-bg-hover)}.lc-fa-op-time{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;margin-left:auto}.lc-fa-op-tool{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:0 6px;font-size:11px}.lc-fa-op-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-secondary);flex:1;overflow:hidden}.lc-fa-read{color:var(--dsw-alias-brand-primary);font-variant-numeric:tabular-nums;white-space:nowrap;flex:none;font-size:11px;font-weight:600}.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-retry{color:var(--dsw-alias-brand-primary);font:inherit;cursor:pointer;text-underline-offset:2px;background:0 0;border:0;padding:0;font-size:12px;text-decoration:underline}.lc-br-retry:hover{filter:brightness(1.15)}.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;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;justify-content:center;align-items:center;display:flex}.lc-br-chev:before{content:\"\";border-bottom:1px solid;border-right:1px solid;width:5px;height:5px;transition:transform .12s;transform:rotate(-45deg)}.lc-br-chev-on:before{transform:rotate(45deg)}.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-err-dot{background:var(--dsw-alias-state-error-primary);width:6px;height:6px;box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-error-primary) 10%, transparent);border-radius:50%;flex:none}.lc-br-tag{min-width:0;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;max-width:220px;padding:0 6px;font-size:11px;overflow:hidden}.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-dim{color:var(--dsw-alias-label-secondary)}.lc-ts-card{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);border-radius:6px;min-width:0;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-card-right{align-items:center;gap:8px;margin-left:auto;display:inline-flex}.lc-ts-card-meta{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;font-weight:400}.lc-ts-call-state{white-space:nowrap;border-radius:999px;flex:none;align-items:center;gap:4px;padding:2px 7px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;font-weight:600;line-height:1;display:inline-flex}.lc-ts-call-state i{background:currentColor;border-radius:50%;flex:none;width:6px;height:6px}.lc-ts-call-ok{color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent)}.lc-ts-call-err{color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 12%, transparent)}.lc-ts-desc-body{color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word;scrollbar-width:thin;max-height:320px;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:minmax(0,140px) minmax(0,90px) 56px minmax(0,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);overflow-wrap:anywhere;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;gap:2px;margin-left:auto;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-ts-desc-md{color:var(--dsw-alias-label-primary);word-break:break-word;overflow-wrap:anywhere;white-space:pre-line;scrollbar-width:thin;min-width:0;max-height:320px;padding:4px 10px;font-size:12px;line-height:1.55;overflow:hidden auto}.lc-ts-desc-md>div{font-size:13px;line-height:1.55}.lc-ts-desc-md div :is(h1,h2,h3,h4,h5,h6){margin:10px 0 4px;font-size:13px;font-weight:600}.lc-ts-desc-md div p{margin:6px 0}.lc-ts-desc-md div pre{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;margin:6px 0}.lc-ts-desc-md div :not(pre)>code{box-decoration-break:clone;padding:1px 5px;line-height:1.3;font-size:1em!important}.lc-ts-desc-md div table code{font-size:inherit}.lc-att-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding:8px 10px;display:grid}.lc-att-item{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l1);width:100%;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border-radius:8px;align-items:center;gap:8px;padding:6px;display:flex}.lc-att-item:hover{border-color:var(--dsw-alias-border-l2,var(--dsw-alias-border-l1));background:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-att-thumb{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1);border-radius:6px;flex:none;justify-content:center;align-items:center;width:64px;height:64px;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}.lc-att-lightbox{z-index:1000;place-items:center;padding:40px;display:grid;position:fixed;inset:0}.lc-att-lightbox-mask{background:var(--dsw-alias-bg-mask-1,#00000073);backdrop-filter:var(--dsw-mask-blur,blur(2px));position:absolute;inset:0}.lc-att-lightbox-img{object-fit:contain;background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));max-width:min(100%,1600px);max-height:calc(100vh - 80px);box-shadow:var(--dsw-shadow-lv3,0 12px 32px #0006);border-radius:12px;position:relative}.lc-att-lightbox-close{z-index:1;border:1px solid var(--dsw-alias-border-l2-darkmode-thin,var(--dsw-alias-border-l1));background:var(--dsw-specific-input-major,var(--dsw-alias-bg-layer-1));width:36px;height:36px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:999px;place-items:center;padding:0;display:grid;position:fixed;top:20px;right:20px}[data-conversation-scroll]:has(.lc-root)>[data-composer-seat]:not(:has([data-approval-key],[data-question-key],[data-plan-review-key])){display:none}.lc-agents-chips{flex-wrap:wrap;gap:6px;margin-bottom:10px;display:flex}.lc-agents-chip{background:var(--dsw-alias-bg-layer-2);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;border-radius:999px;padding:2px 8px;font-size:11px}.lc-agents-chip-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-stage{margin:0 -4px;padding:0 4px;overflow-x:auto}.lc-agents-svg{max-width:none;margin:0 auto;display:block}.lc-agents-link{stroke-width:1.5px;stroke-opacity:.45}.lc-agents-link-live{stroke-opacity:.85}.lc-agents-flow{stroke-width:2px;stroke-linecap:round;stroke-dasharray:2 7;animation:.9s linear infinite lc-agent-flow}@keyframes lc-agent-flow{to{stroke-dashoffset:-9px}}.lc-agent-node{outline:none}.lc-agent-clickable{cursor:pointer}.lc-agent-halo{fill:#0000;transition:fill .12s}.lc-agent-hover .lc-agent-halo,.lc-agent-node:focus-visible .lc-agent-halo{fill:var(--dsw-alias-interactive-bg-hover,var(--dsw-alias-bg-layer-2))}.lc-agent-self .lc-agent-halo{fill:var(--dsw-alias-bg-layer-2)}.lc-agent-running .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 12%, transparent);animation:1.8s ease-in-out infinite lc-agent-glow}.lc-agent-done .lc-agent-halo{fill:color-mix(in srgb, var(--dsw-alias-state-success-primary) 7%, transparent)}@keyframes lc-agent-glow{0%,to{opacity:1}50%{opacity:.4}}.lc-agent-track{fill:var(--dsw-alias-bg-layer-1);stroke:var(--dsw-alias-border-l1);stroke-width:1.5px}.lc-agent-seg{fill:none;stroke-width:9px;transition:stroke-dasharray .3s,stroke-dashoffset .3s}.lc-agent-free{stroke:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agent-pct{fill:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;pointer-events:none;font-size:11px;font-weight:600}.lc-agent-caption{text-align:center;pointer-events:none;width:100%;line-height:1.25}.lc-agent-label{color:var(--dsw-alias-label-primary);overflow-wrap:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;font-size:11px;display:-webkit-box;overflow:hidden}.lc-agent-tokens{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;font-size:10px}.lc-agents-solo{padding:4px 0 10px}.lc-agents-inspector{border:1px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2);border-radius:8px;flex-wrap:wrap;align-items:baseline;gap:4px 8px;min-width:0;margin-top:10px;padding:7px 10px;font-size:12px;display:flex}.lc-agents-inspector-name{color:var(--dsw-alias-label-primary);overflow-wrap:anywhere}.lc-agents-badge{background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);color:var(--dsw-alias-label-secondary);border-radius:999px;flex:none;padding:1px 6px;font-size:10px}.lc-agent-self-badge{vertical-align:1px;margin-left:5px}.lc-agents-badge-on{color:var(--dsw-alias-state-success-primary);border-color:color-mix(in srgb, var(--dsw-alias-state-success-primary) 40%, transparent)}.lc-agents-inspector-stats{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.lc-agents-inspector-open{color:var(--dsw-alias-brand-primary,#3b82f6);flex:none;margin-left:auto}.lc-agents-legend{color:var(--dsw-alias-label-secondary);flex-wrap:wrap;gap:4px 14px;margin-top:8px;font-size:11px;display:flex}.lc-agents-legend-item{align-items:center;gap:5px;display:inline-flex}.lc-agents-legend-item i{border-radius:2px;width:8px;height:8px}.lc-agents-legend-free{background:color-mix(in srgb, var(--dsw-alias-label-secondary) 18%, transparent)}.lc-agents-legend-edge{border-top:2px dashed var(--dsw-alias-label-secondary);border-radius:0!important;width:14px!important;height:0!important}";
|
|
4530
5388
|
const tagId = "dsh-context/styles.css";
|
|
4531
5389
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
4532
5390
|
const tag = document.createElement("style");
|