@industry-theme/file-city-panel 0.2.20 → 0.2.22

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.
@@ -106,7 +106,7 @@ const createLucideIcon = (iconName, iconNode) => {
106
106
  * This source code is licensed under the ISC license.
107
107
  * See the LICENSE file in the root directory of this source tree.
108
108
  */
109
- const __iconNode$5 = [
109
+ const __iconNode$b = [
110
110
  [
111
111
  "path",
112
112
  {
@@ -115,14 +115,14 @@ const __iconNode$5 = [
115
115
  }
116
116
  ]
117
117
  ];
118
- const Activity = createLucideIcon("activity", __iconNode$5);
118
+ const Activity = createLucideIcon("activity", __iconNode$b);
119
119
  /**
120
120
  * @license lucide-react v0.552.0 - ISC
121
121
  *
122
122
  * This source code is licensed under the ISC license.
123
123
  * See the LICENSE file in the root directory of this source tree.
124
124
  */
125
- const __iconNode$4 = [
125
+ const __iconNode$a = [
126
126
  ["path", { d: "M10 12h4", key: "a56b0p" }],
127
127
  ["path", { d: "M10 8h4", key: "1sr2af" }],
128
128
  ["path", { d: "M14 21v-3a2 2 0 0 0-4 0v3", key: "1rgiei" }],
@@ -135,27 +135,105 @@ const __iconNode$4 = [
135
135
  ],
136
136
  ["path", { d: "M6 21V5a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v16", key: "16ra0t" }]
137
137
  ];
138
- const Building2 = createLucideIcon("building-2", __iconNode$4);
138
+ const Building2 = createLucideIcon("building-2", __iconNode$a);
139
139
  /**
140
140
  * @license lucide-react v0.552.0 - ISC
141
141
  *
142
142
  * This source code is licensed under the ISC license.
143
143
  * See the LICENSE file in the root directory of this source tree.
144
144
  */
145
- const __iconNode$3 = [
145
+ const __iconNode$9 = [
146
146
  ["path", { d: "M3 3v16a2 2 0 0 0 2 2h16", key: "c24i48" }],
147
147
  ["path", { d: "M18 17V9", key: "2bz60n" }],
148
148
  ["path", { d: "M13 17V5", key: "1frdt8" }],
149
149
  ["path", { d: "M8 17v-3", key: "17ska0" }]
150
150
  ];
151
- const ChartColumn = createLucideIcon("chart-column", __iconNode$3);
151
+ const ChartColumn = createLucideIcon("chart-column", __iconNode$9);
152
152
  /**
153
153
  * @license lucide-react v0.552.0 - ISC
154
154
  *
155
155
  * This source code is licensed under the ISC license.
156
156
  * See the LICENSE file in the root directory of this source tree.
157
157
  */
158
- const __iconNode$2 = [
158
+ const __iconNode$8 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
159
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$8);
160
+ /**
161
+ * @license lucide-react v0.552.0 - ISC
162
+ *
163
+ * This source code is licensed under the ISC license.
164
+ * See the LICENSE file in the root directory of this source tree.
165
+ */
166
+ const __iconNode$7 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
167
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$7);
168
+ /**
169
+ * @license lucide-react v0.552.0 - ISC
170
+ *
171
+ * This source code is licensed under the ISC license.
172
+ * See the LICENSE file in the root directory of this source tree.
173
+ */
174
+ const __iconNode$6 = [
175
+ [
176
+ "path",
177
+ {
178
+ d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49",
179
+ key: "ct8e1f"
180
+ }
181
+ ],
182
+ ["path", { d: "M14.084 14.158a3 3 0 0 1-4.242-4.242", key: "151rxh" }],
183
+ [
184
+ "path",
185
+ {
186
+ d: "M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143",
187
+ key: "13bj9a"
188
+ }
189
+ ],
190
+ ["path", { d: "m2 2 20 20", key: "1ooewy" }]
191
+ ];
192
+ const EyeOff = createLucideIcon("eye-off", __iconNode$6);
193
+ /**
194
+ * @license lucide-react v0.552.0 - ISC
195
+ *
196
+ * This source code is licensed under the ISC license.
197
+ * See the LICENSE file in the root directory of this source tree.
198
+ */
199
+ const __iconNode$5 = [
200
+ [
201
+ "path",
202
+ {
203
+ d: "M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0",
204
+ key: "1nclc0"
205
+ }
206
+ ],
207
+ ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
208
+ ];
209
+ const Eye = createLucideIcon("eye", __iconNode$5);
210
+ /**
211
+ * @license lucide-react v0.552.0 - ISC
212
+ *
213
+ * This source code is licensed under the ISC license.
214
+ * See the LICENSE file in the root directory of this source tree.
215
+ */
216
+ const __iconNode$4 = [
217
+ [
218
+ "path",
219
+ {
220
+ d: "M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z",
221
+ key: "1oefj6"
222
+ }
223
+ ],
224
+ ["path", { d: "M14 2v5a1 1 0 0 0 1 1h5", key: "wfsgrz" }],
225
+ ["path", { d: "M10 9H8", key: "b1mrlr" }],
226
+ ["path", { d: "M16 13H8", key: "t4e002" }],
227
+ ["path", { d: "M16 17H8", key: "z1uh3a" }]
228
+ ];
229
+ const FileText = createLucideIcon("file-text", __iconNode$4);
230
+ /**
231
+ * @license lucide-react v0.552.0 - ISC
232
+ *
233
+ * This source code is licensed under the ISC license.
234
+ * See the LICENSE file in the root directory of this source tree.
235
+ */
236
+ const __iconNode$3 = [
159
237
  [
160
238
  "path",
161
239
  {
@@ -165,14 +243,14 @@ const __iconNode$2 = [
165
243
  ],
166
244
  ["path", { d: "M14 2v5a1 1 0 0 0 1 1h5", key: "wfsgrz" }]
167
245
  ];
168
- const File = createLucideIcon("file", __iconNode$2);
246
+ const File = createLucideIcon("file", __iconNode$3);
169
247
  /**
170
248
  * @license lucide-react v0.552.0 - ISC
171
249
  *
172
250
  * This source code is licensed under the ISC license.
173
251
  * See the LICENSE file in the root directory of this source tree.
174
252
  */
175
- const __iconNode$1 = [
253
+ const __iconNode$2 = [
176
254
  [
177
255
  "path",
178
256
  {
@@ -181,7 +259,20 @@ const __iconNode$1 = [
181
259
  }
182
260
  ]
183
261
  ];
184
- const Folder = createLucideIcon("folder", __iconNode$1);
262
+ const Folder = createLucideIcon("folder", __iconNode$2);
263
+ /**
264
+ * @license lucide-react v0.552.0 - ISC
265
+ *
266
+ * This source code is licensed under the ISC license.
267
+ * See the LICENSE file in the root directory of this source tree.
268
+ */
269
+ const __iconNode$1 = [
270
+ ["line", { x1: "6", x2: "6", y1: "3", y2: "15", key: "17qcm7" }],
271
+ ["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
272
+ ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
273
+ ["path", { d: "M18 9a9 9 0 0 1-9 9", key: "n2h4wq" }]
274
+ ];
275
+ const GitBranch = createLucideIcon("git-branch", __iconNode$1);
185
276
  /**
186
277
  * @license lucide-react v0.552.0 - ISC
187
278
  *
@@ -2605,29 +2696,632 @@ const Legend = ({
2605
2696
  children: fileType.name
2606
2697
  }
2607
2698
  ),
2608
- /* @__PURE__ */ jsx(
2699
+ /* @__PURE__ */ jsx(
2700
+ "span",
2701
+ {
2702
+ style: {
2703
+ fontSize: theme2.fontSizes[0],
2704
+ fontFamily: theme2.fonts.body,
2705
+ color: theme2.colors.textSecondary,
2706
+ flexShrink: 0
2707
+ },
2708
+ children: fileType.count
2709
+ }
2710
+ )
2711
+ ]
2712
+ },
2713
+ fileType.id
2714
+ ))
2715
+ }
2716
+ )
2717
+ ] })
2718
+ ]
2719
+ }
2720
+ );
2721
+ };
2722
+ const AgentActivityView = ({
2723
+ layers,
2724
+ onLayerClick,
2725
+ onClearAll,
2726
+ showHeader = true
2727
+ }) => {
2728
+ const { theme: theme2 } = useTheme();
2729
+ const [expandedLayers, setExpandedLayers] = React.useState(/* @__PURE__ */ new Set());
2730
+ const toggleExpanded = (id2) => {
2731
+ setExpandedLayers((prev) => {
2732
+ const next = new Set(prev);
2733
+ if (next.has(id2)) {
2734
+ next.delete(id2);
2735
+ } else {
2736
+ next.add(id2);
2737
+ }
2738
+ return next;
2739
+ });
2740
+ };
2741
+ const formatTimestamp = (timestamp) => {
2742
+ const date = new Date(timestamp);
2743
+ return date.toLocaleTimeString(void 0, {
2744
+ hour: "2-digit",
2745
+ minute: "2-digit",
2746
+ second: "2-digit"
2747
+ });
2748
+ };
2749
+ const getFileName = (path) => {
2750
+ const parts = path.split("/");
2751
+ return parts[parts.length - 1];
2752
+ };
2753
+ const getDirectory = (path) => {
2754
+ const parts = path.split("/");
2755
+ if (parts.length <= 1) return "";
2756
+ return parts.slice(0, -1).join("/");
2757
+ };
2758
+ if (layers.length === 0) {
2759
+ return /* @__PURE__ */ jsxs(
2760
+ "div",
2761
+ {
2762
+ style: {
2763
+ display: "flex",
2764
+ flexDirection: "column",
2765
+ flex: 1,
2766
+ backgroundColor: theme2.colors.background,
2767
+ ...showHeader && {
2768
+ border: `1px solid ${theme2.colors.border}`,
2769
+ borderRadius: "6px"
2770
+ },
2771
+ overflow: "hidden"
2772
+ },
2773
+ children: [
2774
+ showHeader && /* @__PURE__ */ jsx(
2775
+ "div",
2776
+ {
2777
+ style: {
2778
+ display: "flex",
2779
+ alignItems: "center",
2780
+ justifyContent: "space-between",
2781
+ padding: "12px 16px",
2782
+ backgroundColor: theme2.colors.backgroundLight,
2783
+ borderBottom: `1px solid ${theme2.colors.border}`
2784
+ },
2785
+ children: /* @__PURE__ */ jsxs(
2786
+ "div",
2787
+ {
2788
+ style: {
2789
+ display: "flex",
2790
+ alignItems: "center",
2791
+ gap: "8px",
2792
+ color: theme2.colors.primary,
2793
+ fontFamily: theme2.fonts.body,
2794
+ fontWeight: 600,
2795
+ fontSize: theme2.fontSizes[1]
2796
+ },
2797
+ children: [
2798
+ /* @__PURE__ */ jsx(Activity, { size: 16 }),
2799
+ "Agent Activity"
2800
+ ]
2801
+ }
2802
+ )
2803
+ }
2804
+ ),
2805
+ /* @__PURE__ */ jsxs(
2806
+ "div",
2807
+ {
2808
+ style: {
2809
+ display: "flex",
2810
+ flexDirection: "column",
2811
+ alignItems: "center",
2812
+ justifyContent: "center",
2813
+ flex: 1,
2814
+ padding: "32px 16px",
2815
+ color: theme2.colors.textSecondary,
2816
+ fontFamily: theme2.fonts.body,
2817
+ fontSize: theme2.fontSizes[0]
2818
+ },
2819
+ children: [
2820
+ /* @__PURE__ */ jsx(Activity, { size: 32, style: { opacity: 0.3, marginBottom: "8px" } }),
2821
+ /* @__PURE__ */ jsx("span", { children: "No agent activity yet" })
2822
+ ]
2823
+ }
2824
+ )
2825
+ ]
2826
+ }
2827
+ );
2828
+ }
2829
+ return /* @__PURE__ */ jsxs(
2830
+ "div",
2831
+ {
2832
+ style: {
2833
+ display: "flex",
2834
+ flexDirection: "column",
2835
+ flex: 1,
2836
+ backgroundColor: theme2.colors.background,
2837
+ ...showHeader && {
2838
+ border: `1px solid ${theme2.colors.border}`,
2839
+ borderRadius: "6px"
2840
+ },
2841
+ overflow: "hidden"
2842
+ },
2843
+ children: [
2844
+ showHeader && /* @__PURE__ */ jsxs(
2845
+ "div",
2846
+ {
2847
+ style: {
2848
+ display: "flex",
2849
+ alignItems: "center",
2850
+ justifyContent: "space-between",
2851
+ padding: "12px 16px",
2852
+ backgroundColor: theme2.colors.backgroundLight,
2853
+ borderBottom: `1px solid ${theme2.colors.border}`,
2854
+ flexShrink: 0
2855
+ },
2856
+ children: [
2857
+ /* @__PURE__ */ jsxs(
2858
+ "div",
2859
+ {
2860
+ style: {
2861
+ display: "flex",
2862
+ alignItems: "center",
2863
+ gap: "8px",
2864
+ color: theme2.colors.primary,
2865
+ fontFamily: theme2.fonts.body,
2866
+ fontWeight: 600,
2867
+ fontSize: theme2.fontSizes[1]
2868
+ },
2869
+ children: [
2870
+ /* @__PURE__ */ jsx(Activity, { size: 16 }),
2871
+ "Agent Activity",
2872
+ /* @__PURE__ */ jsx(
2873
+ "span",
2874
+ {
2875
+ style: {
2876
+ backgroundColor: theme2.colors.primary,
2877
+ color: theme2.colors.background,
2878
+ padding: "2px 8px",
2879
+ borderRadius: "10px",
2880
+ fontSize: theme2.fontSizes[0],
2881
+ fontWeight: 500
2882
+ },
2883
+ children: layers.length
2884
+ }
2885
+ )
2886
+ ]
2887
+ }
2888
+ ),
2889
+ onClearAll && /* @__PURE__ */ jsxs(
2890
+ "button",
2891
+ {
2892
+ onClick: onClearAll,
2893
+ style: {
2894
+ display: "flex",
2895
+ alignItems: "center",
2896
+ gap: "4px",
2897
+ padding: "4px 10px",
2898
+ fontSize: theme2.fontSizes[0],
2899
+ fontFamily: theme2.fonts.body,
2900
+ color: theme2.colors.textSecondary,
2901
+ backgroundColor: "transparent",
2902
+ border: `1px solid ${theme2.colors.border}`,
2903
+ borderRadius: "4px",
2904
+ cursor: "pointer",
2905
+ transition: "all 0.15s ease"
2906
+ },
2907
+ title: "Clear all agent activity",
2908
+ children: [
2909
+ /* @__PURE__ */ jsx(X, { size: 12 }),
2910
+ "Clear All"
2911
+ ]
2912
+ }
2913
+ )
2914
+ ]
2915
+ }
2916
+ ),
2917
+ /* @__PURE__ */ jsx(
2918
+ "div",
2919
+ {
2920
+ style: {
2921
+ display: "flex",
2922
+ flexDirection: "column",
2923
+ flex: 1,
2924
+ overflowY: "auto"
2925
+ },
2926
+ children: [...layers].sort((a, b) => (b.timestamp ?? 0) - (a.timestamp ?? 0)).map((layer, index) => {
2927
+ const isExpanded = expandedLayers.has(layer.id);
2928
+ const fileCount = layer.items.length;
2929
+ return /* @__PURE__ */ jsxs(
2930
+ "div",
2931
+ {
2932
+ style: {
2933
+ borderBottom: index < layers.length - 1 ? `1px solid ${theme2.colors.border}` : "none"
2934
+ },
2935
+ children: [
2936
+ /* @__PURE__ */ jsxs(
2937
+ "div",
2938
+ {
2939
+ onClick: () => toggleExpanded(layer.id),
2940
+ style: {
2941
+ display: "flex",
2942
+ alignItems: "center",
2943
+ gap: "12px",
2944
+ padding: "12px 16px",
2945
+ backgroundColor: layer.enabled ? "transparent" : `${theme2.colors.backgroundLight}`,
2946
+ opacity: layer.enabled ? 1 : 0.6,
2947
+ cursor: "pointer",
2948
+ transition: "all 0.15s ease"
2949
+ },
2950
+ children: [
2951
+ /* @__PURE__ */ jsx(
2952
+ "div",
2953
+ {
2954
+ style: {
2955
+ display: "flex",
2956
+ alignItems: "center",
2957
+ justifyContent: "center",
2958
+ width: "20px",
2959
+ height: "20px",
2960
+ color: theme2.colors.textSecondary,
2961
+ flexShrink: 0
2962
+ },
2963
+ children: isExpanded ? /* @__PURE__ */ jsx(ChevronDown, { size: 16 }) : /* @__PURE__ */ jsx(ChevronRight, { size: 16 })
2964
+ }
2965
+ ),
2966
+ /* @__PURE__ */ jsx(
2967
+ "div",
2968
+ {
2969
+ style: {
2970
+ width: "16px",
2971
+ height: "16px",
2972
+ backgroundColor: layer.color,
2973
+ borderRadius: "4px",
2974
+ flexShrink: 0,
2975
+ boxShadow: `0 0 8px ${layer.color}60`
2976
+ }
2977
+ }
2978
+ ),
2979
+ /* @__PURE__ */ jsxs(
2980
+ "div",
2981
+ {
2982
+ style: {
2983
+ display: "flex",
2984
+ flexDirection: "column",
2985
+ gap: "2px",
2986
+ flex: 1,
2987
+ minWidth: 0
2988
+ },
2989
+ children: [
2990
+ /* @__PURE__ */ jsx(
2991
+ "div",
2992
+ {
2993
+ style: {
2994
+ display: "flex",
2995
+ alignItems: "center",
2996
+ gap: "8px"
2997
+ },
2998
+ children: /* @__PURE__ */ jsx(
2999
+ "span",
3000
+ {
3001
+ style: {
3002
+ fontFamily: theme2.fonts.body,
3003
+ fontSize: theme2.fontSizes[1],
3004
+ fontWeight: 500,
3005
+ color: theme2.colors.text,
3006
+ overflow: "hidden",
3007
+ textOverflow: "ellipsis",
3008
+ whiteSpace: "nowrap"
3009
+ },
3010
+ children: layer.name
3011
+ }
3012
+ )
3013
+ }
3014
+ ),
3015
+ /* @__PURE__ */ jsxs(
3016
+ "div",
3017
+ {
3018
+ style: {
3019
+ display: "flex",
3020
+ alignItems: "center",
3021
+ gap: "12px",
3022
+ fontFamily: theme2.fonts.body,
3023
+ fontSize: theme2.fontSizes[0],
3024
+ color: theme2.colors.textSecondary
3025
+ },
3026
+ children: [
3027
+ /* @__PURE__ */ jsxs("span", { children: [
3028
+ fileCount,
3029
+ " ",
3030
+ fileCount === 1 ? "file" : "files"
3031
+ ] }),
3032
+ layer.timestamp && /* @__PURE__ */ jsx("span", { children: formatTimestamp(layer.timestamp) })
3033
+ ]
3034
+ }
3035
+ )
3036
+ ]
3037
+ }
3038
+ ),
3039
+ /* @__PURE__ */ jsx(
3040
+ "button",
3041
+ {
3042
+ onClick: (e) => {
3043
+ e.stopPropagation();
3044
+ onLayerClick == null ? void 0 : onLayerClick(layer.id);
3045
+ },
3046
+ style: {
3047
+ display: "flex",
3048
+ alignItems: "center",
3049
+ justifyContent: "center",
3050
+ width: "32px",
3051
+ height: "32px",
3052
+ padding: 0,
3053
+ backgroundColor: "transparent",
3054
+ border: `1px solid ${theme2.colors.border}`,
3055
+ borderRadius: "4px",
3056
+ cursor: onLayerClick ? "pointer" : "default",
3057
+ color: layer.enabled ? theme2.colors.primary : theme2.colors.textSecondary,
3058
+ flexShrink: 0,
3059
+ transition: "all 0.15s ease"
3060
+ },
3061
+ title: layer.enabled ? "Hide layer" : "Show layer",
3062
+ children: layer.enabled ? /* @__PURE__ */ jsx(Eye, { size: 16 }) : /* @__PURE__ */ jsx(EyeOff, { size: 16 })
3063
+ }
3064
+ )
3065
+ ]
3066
+ }
3067
+ ),
3068
+ isExpanded && /* @__PURE__ */ jsx(
3069
+ "div",
3070
+ {
3071
+ style: {
3072
+ backgroundColor: theme2.colors.backgroundLight,
3073
+ borderTop: `1px solid ${theme2.colors.border}`
3074
+ },
3075
+ children: layer.items.map((item, itemIndex) => /* @__PURE__ */ jsxs(
3076
+ "div",
3077
+ {
3078
+ style: {
3079
+ display: "flex",
3080
+ alignItems: "center",
3081
+ gap: "8px",
3082
+ padding: "8px 16px 8px 48px",
3083
+ borderBottom: itemIndex < layer.items.length - 1 ? `1px solid ${theme2.colors.border}40` : "none"
3084
+ },
3085
+ children: [
3086
+ /* @__PURE__ */ jsx(
3087
+ FileText,
3088
+ {
3089
+ size: 14,
3090
+ style: {
3091
+ color: layer.color,
3092
+ flexShrink: 0
3093
+ }
3094
+ }
3095
+ ),
3096
+ /* @__PURE__ */ jsxs(
3097
+ "div",
3098
+ {
3099
+ style: {
3100
+ display: "flex",
3101
+ flexDirection: "column",
3102
+ gap: "1px",
3103
+ minWidth: 0,
3104
+ flex: 1
3105
+ },
3106
+ children: [
3107
+ /* @__PURE__ */ jsx(
3108
+ "span",
3109
+ {
3110
+ style: {
3111
+ fontFamily: theme2.fonts.body,
3112
+ fontSize: theme2.fontSizes[0],
3113
+ color: theme2.colors.text,
3114
+ overflow: "hidden",
3115
+ textOverflow: "ellipsis",
3116
+ whiteSpace: "nowrap"
3117
+ },
3118
+ children: getFileName(item.path)
3119
+ }
3120
+ ),
3121
+ getDirectory(item.path) && /* @__PURE__ */ jsx(
3122
+ "span",
3123
+ {
3124
+ style: {
3125
+ fontFamily: theme2.fonts.body,
3126
+ fontSize: "10px",
3127
+ color: theme2.colors.textSecondary,
3128
+ overflow: "hidden",
3129
+ textOverflow: "ellipsis",
3130
+ whiteSpace: "nowrap"
3131
+ },
3132
+ children: getDirectory(item.path)
3133
+ }
3134
+ )
3135
+ ]
3136
+ }
3137
+ ),
3138
+ /* @__PURE__ */ jsx(
3139
+ "span",
3140
+ {
3141
+ style: {
3142
+ fontFamily: theme2.fonts.body,
3143
+ fontSize: "10px",
3144
+ color: theme2.colors.textSecondary,
3145
+ backgroundColor: `${layer.color}20`,
3146
+ padding: "2px 6px",
3147
+ borderRadius: "3px",
3148
+ textTransform: "uppercase",
3149
+ flexShrink: 0
3150
+ },
3151
+ children: item.renderStrategy
3152
+ }
3153
+ )
3154
+ ]
3155
+ },
3156
+ item.path
3157
+ ))
3158
+ }
3159
+ )
3160
+ ]
3161
+ },
3162
+ layer.id
3163
+ );
3164
+ })
3165
+ }
3166
+ )
3167
+ ]
3168
+ }
3169
+ );
3170
+ };
3171
+ const LegendTabs = ({
3172
+ tabs,
3173
+ defaultTab,
3174
+ onTabChange
3175
+ }) => {
3176
+ var _a;
3177
+ const { theme: theme2 } = useTheme();
3178
+ const [activeTab, setActiveTab] = React.useState(
3179
+ defaultTab || ((_a = tabs[0]) == null ? void 0 : _a.id) || "agent"
3180
+ );
3181
+ React.useEffect(() => {
3182
+ if (tabs.length > 0 && !tabs.find((t) => t.id === activeTab)) {
3183
+ setActiveTab(tabs[0].id);
3184
+ }
3185
+ }, [tabs, activeTab]);
3186
+ const handleTabClick = (tabId) => {
3187
+ setActiveTab(tabId);
3188
+ onTabChange == null ? void 0 : onTabChange(tabId);
3189
+ };
3190
+ if (tabs.length === 0) {
3191
+ return /* @__PURE__ */ jsx(
3192
+ "div",
3193
+ {
3194
+ style: {
3195
+ display: "flex",
3196
+ alignItems: "center",
3197
+ justifyContent: "center",
3198
+ flex: 1,
3199
+ padding: "24px 16px",
3200
+ color: theme2.colors.textSecondary,
3201
+ fontFamily: theme2.fonts.body,
3202
+ fontSize: theme2.fontSizes[0],
3203
+ fontStyle: "italic"
3204
+ },
3205
+ children: "No data available"
3206
+ }
3207
+ );
3208
+ }
3209
+ if (tabs.length === 1) {
3210
+ return /* @__PURE__ */ jsx("div", { style: { display: "flex", flexDirection: "column", flex: 1, minHeight: 0 }, children: tabs[0].content });
3211
+ }
3212
+ const activeTabData = tabs.find((t) => t.id === activeTab);
3213
+ return /* @__PURE__ */ jsxs(
3214
+ "div",
3215
+ {
3216
+ style: {
3217
+ display: "flex",
3218
+ flexDirection: "column",
3219
+ flex: 1,
3220
+ minHeight: 0,
3221
+ overflow: "hidden"
3222
+ },
3223
+ children: [
3224
+ /* @__PURE__ */ jsx(
3225
+ "div",
3226
+ {
3227
+ style: {
3228
+ display: "flex",
3229
+ flexShrink: 0
3230
+ },
3231
+ children: tabs.map((tab, index) => {
3232
+ const isActive = tab.id === activeTab;
3233
+ return /* @__PURE__ */ jsxs(
3234
+ "button",
3235
+ {
3236
+ onClick: () => handleTabClick(tab.id),
3237
+ style: {
3238
+ display: "flex",
3239
+ alignItems: "center",
3240
+ justifyContent: "center",
3241
+ gap: "6px",
3242
+ flex: 1,
3243
+ padding: "10px 12px",
3244
+ backgroundColor: theme2.colors.background,
3245
+ border: `1px solid ${theme2.colors.border}`,
3246
+ borderBottom: isActive ? `1px solid ${theme2.colors.background}` : `1px solid ${theme2.colors.border}`,
3247
+ borderLeft: index === 0 ? `1px solid ${theme2.colors.border}` : "none",
3248
+ marginBottom: "-1px",
3249
+ cursor: "pointer",
3250
+ fontFamily: theme2.fonts.body,
3251
+ fontSize: theme2.fontSizes[0],
3252
+ fontWeight: isActive ? 600 : 400,
3253
+ color: isActive ? theme2.colors.text : theme2.colors.textSecondary,
3254
+ opacity: isActive ? 1 : 0.9,
3255
+ transition: "all 0.15s ease"
3256
+ },
3257
+ children: [
3258
+ /* @__PURE__ */ jsx(
3259
+ "span",
3260
+ {
3261
+ style: {
3262
+ display: "flex",
3263
+ alignItems: "center",
3264
+ color: isActive ? theme2.colors.primary : theme2.colors.textSecondary
3265
+ },
3266
+ children: tab.icon
3267
+ }
3268
+ ),
3269
+ /* @__PURE__ */ jsx("span", { children: tab.label }),
3270
+ tab.count !== void 0 && tab.count > 0 && /* @__PURE__ */ jsx(
2609
3271
  "span",
2610
3272
  {
2611
3273
  style: {
2612
- fontSize: theme2.fontSizes[0],
2613
- fontFamily: theme2.fonts.body,
2614
- color: theme2.colors.textSecondary,
2615
- flexShrink: 0
3274
+ backgroundColor: isActive ? theme2.colors.primary : theme2.colors.border,
3275
+ color: isActive ? theme2.colors.background : theme2.colors.textSecondary,
3276
+ padding: "1px 6px",
3277
+ borderRadius: "8px",
3278
+ fontSize: "10px",
3279
+ fontWeight: 500,
3280
+ minWidth: "18px",
3281
+ textAlign: "center"
2616
3282
  },
2617
- children: fileType.count
3283
+ children: tab.count
2618
3284
  }
2619
3285
  )
2620
3286
  ]
2621
3287
  },
2622
- fileType.id
2623
- ))
2624
- }
2625
- )
2626
- ] })
3288
+ tab.id
3289
+ );
3290
+ })
3291
+ }
3292
+ ),
3293
+ /* @__PURE__ */ jsx(
3294
+ "div",
3295
+ {
3296
+ style: {
3297
+ display: "flex",
3298
+ flexDirection: "column",
3299
+ flex: 1,
3300
+ minHeight: 0,
3301
+ overflow: "auto",
3302
+ borderTop: `1px solid ${theme2.colors.border}`
3303
+ },
3304
+ children: activeTabData == null ? void 0 : activeTabData.content
3305
+ }
3306
+ )
2627
3307
  ]
2628
3308
  }
2629
3309
  );
2630
3310
  };
3311
+ const createAgentTab = (content, count2) => ({
3312
+ id: "agent",
3313
+ label: "Agent",
3314
+ icon: /* @__PURE__ */ jsx(Activity, { size: 14 }),
3315
+ count: count2,
3316
+ content
3317
+ });
3318
+ const createGitTab = (content, count2) => ({
3319
+ id: "git",
3320
+ label: "Git",
3321
+ icon: /* @__PURE__ */ jsx(GitBranch, { size: 14 }),
3322
+ count: count2,
3323
+ content
3324
+ });
2631
3325
  function getDefaultExportFromCjs(x) {
2632
3326
  return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
2633
3327
  }
@@ -14258,9 +14952,11 @@ const COLOR_MODES = [
14258
14952
  { id: "fileTypes", name: "File Types", description: "Color by file extension" },
14259
14953
  { id: "git", name: "Git Status", description: "Color by git changes" },
14260
14954
  { id: "coverage", name: "Test Coverage", description: "Color by test coverage %" },
14261
- { id: "eslint", name: "Linting", description: "Color by ESLint issues" },
14955
+ { id: "eslint", name: "Linting (ESLint)", description: "Color by ESLint issues" },
14956
+ { id: "biome-lint", name: "Linting (Biome)", description: "Color by Biome lint issues" },
14262
14957
  { id: "typescript", name: "Type Safety", description: "Color by TypeScript errors" },
14263
- { id: "prettier", name: "Formatting", description: "Color by Prettier issues" },
14958
+ { id: "prettier", name: "Formatting (Prettier)", description: "Color by Prettier issues" },
14959
+ { id: "biome-format", name: "Formatting (Biome)", description: "Color by Biome format issues" },
14264
14960
  { id: "knip", name: "Dead Code", description: "Color by unused exports" },
14265
14961
  { id: "alexandria", name: "Documentation", description: "Color by doc coverage" }
14266
14962
  ];
@@ -14270,9 +14966,11 @@ const DEFAULT_COLOR_MODES = [
14270
14966
  ];
14271
14967
  const QUALITY_COLOR_MODES = [
14272
14968
  { id: "coverage", name: "Test Coverage", description: "Color by test coverage %" },
14273
- { id: "eslint", name: "Linting", description: "Color by ESLint issues" },
14969
+ { id: "eslint", name: "Linting (ESLint)", description: "Color by ESLint issues" },
14970
+ { id: "biome-lint", name: "Linting (Biome)", description: "Color by Biome lint issues" },
14274
14971
  { id: "typescript", name: "Type Safety", description: "Color by TypeScript errors" },
14275
- { id: "prettier", name: "Formatting", description: "Color by Prettier issues" },
14972
+ { id: "prettier", name: "Formatting (Prettier)", description: "Color by Prettier issues" },
14973
+ { id: "biome-format", name: "Formatting (Biome)", description: "Color by Biome format issues" },
14276
14974
  { id: "knip", name: "Dead Code", description: "Color by unused exports" },
14277
14975
  { id: "alexandria", name: "Documentation", description: "Color by doc coverage" }
14278
14976
  ];
@@ -14458,6 +15156,116 @@ function createEslintHighlightLayers(buildings, eslintMetrics) {
14458
15156
  }
14459
15157
  return layers;
14460
15158
  }
15159
+ function createBiomeLintHighlightLayers(buildings, biomeLintMetrics) {
15160
+ const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
15161
+ const metricsByPath = new Map(biomeLintMetrics.map((m) => [normalizePath(m.file), m]));
15162
+ const layerGroups = {
15163
+ clean: [],
15164
+ // 0 issues - green
15165
+ minor: [],
15166
+ // 1-3 issues - orange
15167
+ moderate: [],
15168
+ // 4-10 issues - orange-red
15169
+ significant: [],
15170
+ // 11-25 issues - red
15171
+ severe: [],
15172
+ // 26+ issues - dark red
15173
+ noData: []
15174
+ // No metric data
15175
+ };
15176
+ for (const [path, building] of buildingsByPath) {
15177
+ const normalizedPath = normalizePath(path);
15178
+ const metric = metricsByPath.get(normalizedPath);
15179
+ if (!metric) {
15180
+ layerGroups.noData.push({
15181
+ path: building.path,
15182
+ type: "file",
15183
+ renderStrategy: "fill"
15184
+ });
15185
+ } else {
15186
+ const issues = metric.issueCount;
15187
+ let bucket;
15188
+ if (issues === 0) bucket = "clean";
15189
+ else if (issues <= 3) bucket = "minor";
15190
+ else if (issues <= 10) bucket = "moderate";
15191
+ else if (issues <= 25) bucket = "significant";
15192
+ else bucket = "severe";
15193
+ layerGroups[bucket].push({
15194
+ path: building.path,
15195
+ type: "file",
15196
+ renderStrategy: "fill"
15197
+ });
15198
+ }
15199
+ }
15200
+ const layers = [];
15201
+ if (layerGroups.clean.length > 0) {
15202
+ layers.push({
15203
+ id: "biome-lint-clean",
15204
+ name: "0 issues",
15205
+ enabled: true,
15206
+ color: "#22c55e",
15207
+ // green - only for no lint issues
15208
+ priority: 50,
15209
+ items: layerGroups.clean
15210
+ });
15211
+ }
15212
+ if (layerGroups.minor.length > 0) {
15213
+ layers.push({
15214
+ id: "biome-lint-minor",
15215
+ name: "1-3 issues",
15216
+ enabled: true,
15217
+ color: "#f97316",
15218
+ // orange
15219
+ priority: 50,
15220
+ items: layerGroups.minor
15221
+ });
15222
+ }
15223
+ if (layerGroups.moderate.length > 0) {
15224
+ layers.push({
15225
+ id: "biome-lint-moderate",
15226
+ name: "4-10 issues",
15227
+ enabled: true,
15228
+ color: "#ea580c",
15229
+ // orange-600 (darker orange)
15230
+ priority: 50,
15231
+ items: layerGroups.moderate
15232
+ });
15233
+ }
15234
+ if (layerGroups.significant.length > 0) {
15235
+ layers.push({
15236
+ id: "biome-lint-significant",
15237
+ name: "11-25 issues",
15238
+ enabled: true,
15239
+ color: "#ef4444",
15240
+ // red
15241
+ priority: 50,
15242
+ items: layerGroups.significant
15243
+ });
15244
+ }
15245
+ if (layerGroups.severe.length > 0) {
15246
+ layers.push({
15247
+ id: "biome-lint-severe",
15248
+ name: "26+ issues",
15249
+ enabled: true,
15250
+ color: "#991b1b",
15251
+ // dark red
15252
+ priority: 50,
15253
+ items: layerGroups.severe
15254
+ });
15255
+ }
15256
+ if (layerGroups.noData.length > 0) {
15257
+ layers.push({
15258
+ id: "biome-lint-nodata",
15259
+ name: "No data",
15260
+ enabled: true,
15261
+ color: "#6b7280",
15262
+ // gray
15263
+ priority: 40,
15264
+ items: layerGroups.noData
15265
+ });
15266
+ }
15267
+ return layers;
15268
+ }
14461
15269
  function createTypescriptHighlightLayers(buildings, typescriptMetrics) {
14462
15270
  const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
14463
15271
  const metricsByPath = new Map(typescriptMetrics.map((m) => [normalizePath(m.file), m]));
@@ -14678,6 +15486,116 @@ function createPrettierHighlightLayers(buildings, prettierMetrics) {
14678
15486
  }
14679
15487
  return layers;
14680
15488
  }
15489
+ function createBiomeFormatHighlightLayers(buildings, biomeFormatMetrics) {
15490
+ const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
15491
+ const metricsByPath = new Map(biomeFormatMetrics.map((m) => [normalizePath(m.file), m]));
15492
+ const layerGroups = {
15493
+ clean: [],
15494
+ // 0 issues - green
15495
+ minor: [],
15496
+ // 1-3 issues - orange
15497
+ moderate: [],
15498
+ // 4-10 issues - orange-red
15499
+ significant: [],
15500
+ // 11-25 issues - red
15501
+ severe: [],
15502
+ // 26+ issues - dark red
15503
+ noData: []
15504
+ // No metric data
15505
+ };
15506
+ for (const [path, building] of buildingsByPath) {
15507
+ const normalizedPath = normalizePath(path);
15508
+ const metric = metricsByPath.get(normalizedPath);
15509
+ if (!metric) {
15510
+ layerGroups.noData.push({
15511
+ path: building.path,
15512
+ type: "file",
15513
+ renderStrategy: "fill"
15514
+ });
15515
+ } else {
15516
+ const issues = metric.issueCount;
15517
+ let bucket;
15518
+ if (issues === 0) bucket = "clean";
15519
+ else if (issues <= 3) bucket = "minor";
15520
+ else if (issues <= 10) bucket = "moderate";
15521
+ else if (issues <= 25) bucket = "significant";
15522
+ else bucket = "severe";
15523
+ layerGroups[bucket].push({
15524
+ path: building.path,
15525
+ type: "file",
15526
+ renderStrategy: "fill"
15527
+ });
15528
+ }
15529
+ }
15530
+ const layers = [];
15531
+ if (layerGroups.clean.length > 0) {
15532
+ layers.push({
15533
+ id: "biome-format-clean",
15534
+ name: "0 issues",
15535
+ enabled: true,
15536
+ color: "#22c55e",
15537
+ // green - only for perfect formatting
15538
+ priority: 50,
15539
+ items: layerGroups.clean
15540
+ });
15541
+ }
15542
+ if (layerGroups.minor.length > 0) {
15543
+ layers.push({
15544
+ id: "biome-format-minor",
15545
+ name: "1-3 issues",
15546
+ enabled: true,
15547
+ color: "#f97316",
15548
+ // orange
15549
+ priority: 50,
15550
+ items: layerGroups.minor
15551
+ });
15552
+ }
15553
+ if (layerGroups.moderate.length > 0) {
15554
+ layers.push({
15555
+ id: "biome-format-moderate",
15556
+ name: "4-10 issues",
15557
+ enabled: true,
15558
+ color: "#ea580c",
15559
+ // orange-600 (darker orange)
15560
+ priority: 50,
15561
+ items: layerGroups.moderate
15562
+ });
15563
+ }
15564
+ if (layerGroups.significant.length > 0) {
15565
+ layers.push({
15566
+ id: "biome-format-significant",
15567
+ name: "11-25 issues",
15568
+ enabled: true,
15569
+ color: "#ef4444",
15570
+ // red
15571
+ priority: 50,
15572
+ items: layerGroups.significant
15573
+ });
15574
+ }
15575
+ if (layerGroups.severe.length > 0) {
15576
+ layers.push({
15577
+ id: "biome-format-severe",
15578
+ name: "26+ issues",
15579
+ enabled: true,
15580
+ color: "#991b1b",
15581
+ // dark red
15582
+ priority: 50,
15583
+ items: layerGroups.severe
15584
+ });
15585
+ }
15586
+ if (layerGroups.noData.length > 0) {
15587
+ layers.push({
15588
+ id: "biome-format-nodata",
15589
+ name: "No data",
15590
+ enabled: true,
15591
+ color: "#6b7280",
15592
+ // gray
15593
+ priority: 40,
15594
+ items: layerGroups.noData
15595
+ });
15596
+ }
15597
+ return layers;
15598
+ }
14681
15599
  function createKnipHighlightLayers(buildings, knipMetrics) {
14682
15600
  const buildingsByPath = new Map(buildings.map((b) => [b.path, b]));
14683
15601
  const metricsByPath = new Map(knipMetrics.map((m) => [normalizePath(m.file), m]));
@@ -14859,7 +15777,7 @@ function createAlexandriaHighlightLayers(buildings, alexandriaMetrics) {
14859
15777
  return layers;
14860
15778
  }
14861
15779
  function getLayersForColorMode(mode, buildings, qualityData, fileColorLayers, gitLayers) {
14862
- var _a, _b, _c, _d, _e;
15780
+ var _a, _b, _c, _d, _e, _f, _g;
14863
15781
  switch (mode) {
14864
15782
  case "fileTypes":
14865
15783
  return fileColorLayers;
@@ -14875,23 +15793,33 @@ function getLayersForColorMode(mode, buildings, qualityData, fileColorLayers, gi
14875
15793
  return createEslintHighlightLayers(buildings, qualityData.fileMetrics.eslint);
14876
15794
  }
14877
15795
  return [];
15796
+ case "biome-lint":
15797
+ if ((_b = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _b["biome-lint"]) {
15798
+ return createBiomeLintHighlightLayers(buildings, qualityData.fileMetrics["biome-lint"]);
15799
+ }
15800
+ return [];
14878
15801
  case "typescript":
14879
- if ((_b = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _b.typescript) {
15802
+ if ((_c = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _c.typescript) {
14880
15803
  return createTypescriptHighlightLayers(buildings, qualityData.fileMetrics.typescript);
14881
15804
  }
14882
15805
  return [];
14883
15806
  case "prettier":
14884
- if ((_c = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _c.prettier) {
15807
+ if ((_d = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _d.prettier) {
14885
15808
  return createPrettierHighlightLayers(buildings, qualityData.fileMetrics.prettier);
14886
15809
  }
14887
15810
  return [];
15811
+ case "biome-format":
15812
+ if ((_e = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _e["biome-format"]) {
15813
+ return createBiomeFormatHighlightLayers(buildings, qualityData.fileMetrics["biome-format"]);
15814
+ }
15815
+ return [];
14888
15816
  case "knip":
14889
- if ((_d = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _d.knip) {
15817
+ if ((_f = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _f.knip) {
14890
15818
  return createKnipHighlightLayers(buildings, qualityData.fileMetrics.knip);
14891
15819
  }
14892
15820
  return [];
14893
15821
  case "alexandria":
14894
- if ((_e = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _e.alexandria) {
15822
+ if ((_g = qualityData == null ? void 0 : qualityData.fileMetrics) == null ? void 0 : _g.alexandria) {
14895
15823
  return createAlexandriaHighlightLayers(buildings, qualityData.fileMetrics.alexandria);
14896
15824
  }
14897
15825
  return [];
@@ -14999,7 +15927,7 @@ const CodeCityPanelContent = ({
14999
15927
  return COLOR_MODES.find((m) => m.id === colorMode) || COLOR_MODES[0];
15000
15928
  }, [colorMode]);
15001
15929
  const hoveredFileMetric = useMemo(() => {
15002
- var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2;
15930
+ var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2, _k2, _l2, _m, _n, _o, _p;
15003
15931
  if (!((_a2 = hoverInfo == null ? void 0 : hoverInfo.hoveredBuilding) == null ? void 0 : _a2.path)) return null;
15004
15932
  const filePath = hoverInfo.hoveredBuilding.path;
15005
15933
  if (!qualityData) return null;
@@ -15021,8 +15949,18 @@ const CodeCityPanelContent = ({
15021
15949
  }
15022
15950
  return { type: "eslint", value: null, label: "No lint data" };
15023
15951
  }
15952
+ case "biome-lint": {
15953
+ const metric = (_f2 = (_e2 = qualityData.fileMetrics) == null ? void 0 : _e2["biome-lint"]) == null ? void 0 : _f2.find((m) => m.file === filePath);
15954
+ if (metric) {
15955
+ const parts = [];
15956
+ if (metric.errorCount > 0) parts.push(`${metric.errorCount} error${metric.errorCount > 1 ? "s" : ""}`);
15957
+ if (metric.warningCount > 0) parts.push(`${metric.warningCount} warning${metric.warningCount > 1 ? "s" : ""}`);
15958
+ return { type: "biome-lint", value: metric, label: parts.length > 0 ? parts.join(", ") : "No issues" };
15959
+ }
15960
+ return { type: "biome-lint", value: null, label: "No lint data" };
15961
+ }
15024
15962
  case "typescript": {
15025
- const metric = (_f2 = (_e2 = qualityData.fileMetrics) == null ? void 0 : _e2.typescript) == null ? void 0 : _f2.find((m) => m.file === filePath);
15963
+ const metric = (_h2 = (_g2 = qualityData.fileMetrics) == null ? void 0 : _g2.typescript) == null ? void 0 : _h2.find((m) => m.file === filePath);
15026
15964
  if (metric) {
15027
15965
  const errors = metric.errorCount;
15028
15966
  return { type: "typescript", value: metric, label: errors > 0 ? `${errors} type error${errors > 1 ? "s" : ""}` : "No type errors" };
@@ -15030,15 +15968,23 @@ const CodeCityPanelContent = ({
15030
15968
  return { type: "typescript", value: null, label: "No type data" };
15031
15969
  }
15032
15970
  case "prettier": {
15033
- const metric = (_h2 = (_g2 = qualityData.fileMetrics) == null ? void 0 : _g2.prettier) == null ? void 0 : _h2.find((m) => m.file === filePath);
15971
+ const metric = (_j2 = (_i2 = qualityData.fileMetrics) == null ? void 0 : _i2.prettier) == null ? void 0 : _j2.find((m) => m.file === filePath);
15034
15972
  if (metric) {
15035
15973
  const issues = metric.issueCount;
15036
15974
  return { type: "prettier", value: metric, label: issues > 0 ? `${issues} formatting issue${issues > 1 ? "s" : ""}` : "Properly formatted" };
15037
15975
  }
15038
15976
  return { type: "prettier", value: null, label: "No format data" };
15039
15977
  }
15978
+ case "biome-format": {
15979
+ const metric = (_l2 = (_k2 = qualityData.fileMetrics) == null ? void 0 : _k2["biome-format"]) == null ? void 0 : _l2.find((m) => m.file === filePath);
15980
+ if (metric) {
15981
+ const issues = metric.issueCount;
15982
+ return { type: "biome-format", value: metric, label: issues > 0 ? `${issues} formatting issue${issues > 1 ? "s" : ""}` : "Properly formatted" };
15983
+ }
15984
+ return { type: "biome-format", value: null, label: "No format data" };
15985
+ }
15040
15986
  case "knip": {
15041
- const metric = (_j2 = (_i2 = qualityData.fileMetrics) == null ? void 0 : _i2.knip) == null ? void 0 : _j2.find((m) => m.file === filePath);
15987
+ const metric = (_n = (_m = qualityData.fileMetrics) == null ? void 0 : _m.knip) == null ? void 0 : _n.find((m) => m.file === filePath);
15042
15988
  if (metric) {
15043
15989
  const issues = metric.issueCount;
15044
15990
  return { type: "knip", value: metric, label: issues > 0 ? `${issues} unused export${issues > 1 ? "s" : ""}` : "No dead code" };
@@ -15046,7 +15992,7 @@ const CodeCityPanelContent = ({
15046
15992
  return { type: "knip", value: null, label: "No dead code data" };
15047
15993
  }
15048
15994
  case "alexandria": {
15049
- const metric = (_l2 = (_k2 = qualityData.fileMetrics) == null ? void 0 : _k2.alexandria) == null ? void 0 : _l2.find((m) => m.file === filePath);
15995
+ const metric = (_p = (_o = qualityData.fileMetrics) == null ? void 0 : _o.alexandria) == null ? void 0 : _p.find((m) => m.file === filePath);
15050
15996
  if (metric) {
15051
15997
  const issues = metric.issueCount;
15052
15998
  return { type: "alexandria", value: metric, label: issues > 0 ? `${issues} doc issue${issues > 1 ? "s" : ""}` : "Well documented" };
@@ -15254,16 +16200,36 @@ const CodeCityPanelContent = ({
15254
16200
  enabled: layer.enabled
15255
16201
  }));
15256
16202
  }, [highlightLayers]);
16203
+ const agentActivityLayers = useMemo(() => {
16204
+ const agentLayers = highlightLayers.filter(
16205
+ (layer) => layer.id.startsWith("event-highlight")
16206
+ );
16207
+ return agentLayers.map((layer) => ({
16208
+ id: layer.id,
16209
+ name: layer.name,
16210
+ color: layer.color,
16211
+ enabled: layer.enabled,
16212
+ items: layer.items.map((item) => ({
16213
+ path: item.path,
16214
+ type: item.type,
16215
+ renderStrategy: item.renderStrategy || "fill"
16216
+ })),
16217
+ timestamp: layer.timestamp
16218
+ }));
16219
+ }, [highlightLayers]);
16220
+ const hasAgentActivity = agentActivityLayers.length > 0;
15257
16221
  const legendQualityMetrics = useMemo(() => {
15258
- const qualityModeIds = ["coverage", "eslint", "typescript", "prettier", "knip", "alexandria"];
16222
+ const qualityModeIds = ["coverage", "eslint", "biome-lint", "typescript", "prettier", "biome-format", "knip", "alexandria"];
15259
16223
  if (!qualityModeIds.includes(colorMode)) {
15260
16224
  return [];
15261
16225
  }
15262
16226
  const qualityLayerPrefixes = {
15263
16227
  coverage: "coverage-",
15264
16228
  eslint: "eslint-",
16229
+ "biome-lint": "biome-lint-",
15265
16230
  typescript: "typescript-",
15266
16231
  prettier: "prettier-",
16232
+ "biome-format": "biome-format-",
15267
16233
  knip: "knip-",
15268
16234
  alexandria: "alexandria-"
15269
16235
  };
@@ -15329,7 +16295,7 @@ const CodeCityPanelContent = ({
15329
16295
  }, []);
15330
16296
  const toggleQualityMetric = useCallback((id2) => {
15331
16297
  setHighlightLayers((prev) => {
15332
- const qualityPrefixes = ["coverage-", "eslint-", "typescript-", "prettier-", "knip-", "alexandria-"];
16298
+ const qualityPrefixes = ["coverage-", "eslint-", "biome-lint-", "typescript-", "prettier-", "biome-format-", "knip-", "alexandria-"];
15333
16299
  const isQualityLayer = (layerId) => qualityPrefixes.some((p) => layerId.startsWith(p));
15334
16300
  const qualityLayers2 = prev.filter((l) => isQualityLayer(l.id));
15335
16301
  const clickedLayer = qualityLayers2.find((l) => l.id === id2);
@@ -15787,7 +16753,40 @@ const CodeCityPanelContent = ({
15787
16753
  ]
15788
16754
  }
15789
16755
  ),
15790
- /* @__PURE__ */ jsx(
16756
+ hasAgentActivity ? /* @__PURE__ */ jsx(
16757
+ LegendTabs,
16758
+ {
16759
+ tabs: [
16760
+ createAgentTab(
16761
+ /* @__PURE__ */ jsx(
16762
+ AgentActivityView,
16763
+ {
16764
+ layers: agentActivityLayers,
16765
+ onLayerClick: toggleAgentLayer,
16766
+ onClearAll: clearAgentLayers,
16767
+ showHeader: false
16768
+ }
16769
+ ),
16770
+ agentActivityLayers.length
16771
+ ),
16772
+ ...legendGitStatus.length > 0 ? [
16773
+ createGitTab(
16774
+ /* @__PURE__ */ jsx(
16775
+ Legend,
16776
+ {
16777
+ fileTypes: [],
16778
+ gitStatus: legendGitStatus,
16779
+ onGitStatusClick: toggleGitStatus,
16780
+ position: layout.legendPosition
16781
+ }
16782
+ ),
16783
+ legendGitStatus.reduce((sum, s) => sum + s.count, 0)
16784
+ )
16785
+ ] : []
16786
+ ],
16787
+ defaultTab: "agent"
16788
+ }
16789
+ ) : /* @__PURE__ */ jsx(
15791
16790
  Legend,
15792
16791
  {
15793
16792
  fileTypes: legendFileTypes,