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/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" : "") }, "▸"), err ? /* @__PURE__ */ React.createElement("span", {
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" : "") }, "▸"), /* @__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);
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
- * Callers reach here only with parsed args (a null parse yields no path).
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
- const oldS = args.old_string;
2495
- const newS = args.new_string;
2496
- return {
2497
- added: typeof newS === "string" ? linesOf(newS) : 0,
2498
- removed: typeof oldS === "string" ? linesOf(oldS) : 0
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
- for (const n of nodes) {
2544
- if (n.cat !== "tool") continue;
2545
- if (before !== null && n.seq >= before) continue;
2546
- const kind = kindOfTool(n.tool);
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.path.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);
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-time" }, op.time !== void 0 ? fmtTime(op.time) : "—"), /* @__PURE__ */ React.createElement("span", { className: "lc-fa-op-tool" }, op.tool), op.detail !== void 0 ? /* @__PURE__ */ React.createElement("span", { className: "lc-fa-op-detail" }, op.detail) : null, op.added + op.removed > 0 ? /* @__PURE__ */ React.createElement(DeltaPair, {
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 trimmed = e.path.endsWith("/") ? e.path.slice(0, -1) : e.path;
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" : "") }, "▸"), /* @__PURE__ */ React.createElement("span", {
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("files.form." + e.form)
3426
- }, formGlyph(e.form)), /* @__PURE__ */ React.createElement("span", { className: "lc-fa-path" }, dir !== "" ? /* @__PURE__ */ React.createElement("em", null, dir) : null, /* @__PURE__ */ React.createElement("b", null, base)), e.reads > 0 ? /* @__PURE__ */ React.createElement("span", {
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: op.seq,
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: op.seq,
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.34.0".includes("-dev")) return;
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.34.0") ? latest : null;
3525
- const nameValue = ["dsh-context (v0.34.0)"];
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("span", { className: "lc-card-sub" }, 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)));
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 step = locateStepOf(requests, op.seq, op.gone);
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: op.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");