@industry-theme/agent-panels 0.2.3 → 0.2.5

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.
@@ -2201,7 +2201,7 @@ const createLucideIcon = (iconName, iconNode) => {
2201
2201
  * This source code is licensed under the ISC license.
2202
2202
  * See the LICENSE file in the root directory of this source tree.
2203
2203
  */
2204
- const __iconNode$o = [
2204
+ const __iconNode$n = [
2205
2205
  ["path", { d: "M12 7v14", key: "1akyts" }],
2206
2206
  [
2207
2207
  "path",
@@ -2211,14 +2211,14 @@ const __iconNode$o = [
2211
2211
  }
2212
2212
  ]
2213
2213
  ];
2214
- const BookOpen = createLucideIcon("book-open", __iconNode$o);
2214
+ const BookOpen = createLucideIcon("book-open", __iconNode$n);
2215
2215
  /**
2216
2216
  * @license lucide-react v0.552.0 - ISC
2217
2217
  *
2218
2218
  * This source code is licensed under the ISC license.
2219
2219
  * See the LICENSE file in the root directory of this source tree.
2220
2220
  */
2221
- const __iconNode$n = [
2221
+ const __iconNode$m = [
2222
2222
  ["path", { d: "M12 8V4H8", key: "hb8ula" }],
2223
2223
  ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
2224
2224
  ["path", { d: "M2 14h2", key: "vft8re" }],
@@ -2226,31 +2226,23 @@ const __iconNode$n = [
2226
2226
  ["path", { d: "M15 13v2", key: "1xurst" }],
2227
2227
  ["path", { d: "M9 13v2", key: "rq6x2g" }]
2228
2228
  ];
2229
- const Bot = createLucideIcon("bot", __iconNode$n);
2229
+ const Bot = createLucideIcon("bot", __iconNode$m);
2230
2230
  /**
2231
2231
  * @license lucide-react v0.552.0 - ISC
2232
2232
  *
2233
2233
  * This source code is licensed under the ISC license.
2234
2234
  * See the LICENSE file in the root directory of this source tree.
2235
2235
  */
2236
- const __iconNode$m = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
2237
- const Check = createLucideIcon("check", __iconNode$m);
2236
+ const __iconNode$l = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
2237
+ const Check = createLucideIcon("check", __iconNode$l);
2238
2238
  /**
2239
2239
  * @license lucide-react v0.552.0 - ISC
2240
2240
  *
2241
2241
  * This source code is licensed under the ISC license.
2242
2242
  * See the LICENSE file in the root directory of this source tree.
2243
2243
  */
2244
- const __iconNode$l = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
2245
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$l);
2246
- /**
2247
- * @license lucide-react v0.552.0 - ISC
2248
- *
2249
- * This source code is licensed under the ISC license.
2250
- * See the LICENSE file in the root directory of this source tree.
2251
- */
2252
- const __iconNode$k = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
2253
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$k);
2244
+ const __iconNode$k = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
2245
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$k);
2254
2246
  /**
2255
2247
  * @license lucide-react v0.552.0 - ISC
2256
2248
  *
@@ -2548,6 +2540,7 @@ const __iconNode = [
2548
2540
  ]
2549
2541
  ];
2550
2542
  const Zap = createLucideIcon("zap", __iconNode);
2543
+ const EMPTY_SKILLS_ARRAY = [];
2551
2544
  const determineSkillSource = (path2) => {
2552
2545
  if (path2.includes(".agent/skills/")) {
2553
2546
  return { source: "project-universal", priority: 1 };
@@ -2656,17 +2649,25 @@ const useSkillsData = ({
2656
2649
  context
2657
2650
  }) => {
2658
2651
  var _a, _b, _c;
2659
- const [skills, setSkills] = useState([]);
2652
+ const [skills, setSkills] = useState(EMPTY_SKILLS_ARRAY);
2660
2653
  const [isLoading, setIsLoading] = useState(true);
2661
2654
  const [error, setError] = useState(null);
2662
2655
  const fileTreeSlice = context.getSlice("fileTree");
2663
2656
  const fileTree = fileTreeSlice == null ? void 0 : fileTreeSlice.data;
2664
2657
  const fileTreeSha = fileTree == null ? void 0 : fileTree.sha;
2665
2658
  const globalSkillsSlice = context.getSlice("globalSkills");
2666
- const globalSkills = ((_a = globalSkillsSlice == null ? void 0 : globalSkillsSlice.data) == null ? void 0 : _a.skills) || [];
2659
+ const globalSkills = ((_a = globalSkillsSlice == null ? void 0 : globalSkillsSlice.data) == null ? void 0 : _a.skills) ?? EMPTY_SKILLS_ARRAY;
2660
+ const globalSkillsCount = globalSkills.length;
2667
2661
  const repoPath = (_b = context.currentScope.repository) == null ? void 0 : _b.path;
2668
2662
  const fileSystem = (_c = context.adapters) == null ? void 0 : _c.fileSystem;
2663
+ const lastLoadedSha = useRef(void 0);
2664
+ const lastGlobalSkillsCount = useRef(0);
2669
2665
  const loadSkills = useCallback(async () => {
2666
+ if (fileTreeSha === lastLoadedSha.current && globalSkillsCount === lastGlobalSkillsCount.current) {
2667
+ console.log("[useSkillsData] Skipping reload - data unchanged (SHA:", fileTreeSha, "globalCount:", globalSkillsCount, ")");
2668
+ return;
2669
+ }
2670
+ console.log("[useSkillsData] Loading skills - SHA changed:", fileTreeSha !== lastLoadedSha.current, "globalCount changed:", globalSkillsCount !== lastGlobalSkillsCount.current);
2670
2671
  setIsLoading(true);
2671
2672
  setError(null);
2672
2673
  try {
@@ -2695,6 +2696,8 @@ const useSkillsData = ({
2695
2696
  const allSkills = [...localSkills, ...globalSkills];
2696
2697
  console.log("[useSkillsData] Total skills:", allSkills.length);
2697
2698
  setSkills(allSkills);
2699
+ lastLoadedSha.current = fileTreeSha;
2700
+ lastGlobalSkillsCount.current = globalSkillsCount;
2698
2701
  } catch (err) {
2699
2702
  const errorMessage = err instanceof Error ? err.message : "Failed to load skills";
2700
2703
  setError(errorMessage);
@@ -2702,8 +2705,10 @@ const useSkillsData = ({
2702
2705
  } finally {
2703
2706
  setIsLoading(false);
2704
2707
  }
2705
- }, [fileTree, fileTreeSha, globalSkills, repoPath, fileSystem]);
2708
+ }, [fileTree, fileTreeSha, globalSkills, globalSkillsCount, repoPath, fileSystem]);
2706
2709
  const refreshSkills = useCallback(async () => {
2710
+ lastLoadedSha.current = void 0;
2711
+ lastGlobalSkillsCount.current = -1;
2707
2712
  await loadSkills();
2708
2713
  }, [loadSkills]);
2709
2714
  useEffect(() => {
@@ -2773,6 +2778,17 @@ const SkillCard = ({
2773
2778
  var _a, _b, _c, _d, _e2, _f, _g, _h;
2774
2779
  const { theme: theme2 } = useTheme();
2775
2780
  const sourceConfig = getSourceConfig(skill.source);
2781
+ const [pathCopied, setPathCopied] = React2__default.useState(false);
2782
+ const handleCopyPath = async (e) => {
2783
+ e.stopPropagation();
2784
+ try {
2785
+ await navigator.clipboard.writeText(skill.path);
2786
+ setPathCopied(true);
2787
+ setTimeout(() => setPathCopied(false), 2e3);
2788
+ } catch (err) {
2789
+ console.error("Failed to copy path:", err);
2790
+ }
2791
+ };
2776
2792
  return /* @__PURE__ */ jsxs(
2777
2793
  "div",
2778
2794
  {
@@ -2804,105 +2820,147 @@ const SkillCard = ({
2804
2820
  }
2805
2821
  },
2806
2822
  children: [
2807
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: "12px" }, children: [
2808
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "10px", flex: 1, minWidth: 0 }, children: [
2823
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "flex-start", justifyContent: "space-between", gap: "12px" }, children: [
2824
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px", flex: 1, minWidth: 0 }, children: [
2809
2825
  /* @__PURE__ */ jsx(
2810
- "div",
2826
+ "h3",
2811
2827
  {
2812
2828
  style: {
2813
- width: "36px",
2814
- height: "36px",
2815
- borderRadius: theme2.radii[1],
2816
- background: `${theme2.colors.primary}20`,
2817
- display: "flex",
2818
- alignItems: "center",
2819
- justifyContent: "center",
2820
- flexShrink: 0
2829
+ margin: 0,
2830
+ fontSize: theme2.fontSizes[2],
2831
+ fontWeight: theme2.fontWeights.semibold,
2832
+ color: theme2.colors.text,
2833
+ overflow: "hidden",
2834
+ textOverflow: "ellipsis",
2835
+ whiteSpace: "nowrap",
2836
+ textTransform: "capitalize"
2821
2837
  },
2822
- children: /* @__PURE__ */ jsx(FileText, { size: 20, color: theme2.colors.primary })
2838
+ children: skill.name
2823
2839
  }
2824
2840
  ),
2825
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", flexDirection: "column", gap: "4px", flex: 1, minWidth: 0 }, children: [
2826
- /* @__PURE__ */ jsx(
2827
- "h3",
2841
+ /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: "4px", alignItems: "center", flexWrap: "wrap" }, children: [
2842
+ /* @__PURE__ */ jsxs(
2843
+ "div",
2828
2844
  {
2829
2845
  style: {
2830
- margin: 0,
2831
- fontSize: theme2.fontSizes[2],
2832
- fontWeight: theme2.fontWeights.semibold,
2833
- color: theme2.colors.text,
2834
- overflow: "hidden",
2835
- textOverflow: "ellipsis",
2836
- whiteSpace: "nowrap",
2837
- textTransform: "capitalize"
2846
+ display: "inline-flex",
2847
+ alignItems: "center",
2848
+ gap: "4px",
2849
+ padding: "2px 6px",
2850
+ borderRadius: theme2.radii[1],
2851
+ backgroundColor: sourceConfig.bgColor,
2852
+ border: `1px solid ${sourceConfig.borderColor}`,
2853
+ fontSize: theme2.fontSizes[0],
2854
+ color: sourceConfig.color,
2855
+ fontWeight: 500,
2856
+ width: "fit-content"
2838
2857
  },
2839
- children: skill.name
2858
+ title: `Source: ${skill.source}`,
2859
+ children: [
2860
+ /* @__PURE__ */ jsx(sourceConfig.icon, { size: 10 }),
2861
+ /* @__PURE__ */ jsx("span", { children: sourceConfig.label })
2862
+ ]
2840
2863
  }
2841
2864
  ),
2842
- /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: "4px", alignItems: "center", flexWrap: "wrap" }, children: [
2843
- /* @__PURE__ */ jsxs(
2844
- "div",
2845
- {
2846
- style: {
2847
- display: "inline-flex",
2848
- alignItems: "center",
2849
- gap: "4px",
2850
- padding: "2px 6px",
2851
- borderRadius: theme2.radii[1],
2852
- backgroundColor: sourceConfig.bgColor,
2853
- border: `1px solid ${sourceConfig.borderColor}`,
2854
- fontSize: theme2.fontSizes[0],
2855
- color: sourceConfig.color,
2856
- fontWeight: 500,
2857
- width: "fit-content"
2858
- },
2859
- title: `Source: ${skill.source}`,
2860
- children: [
2861
- /* @__PURE__ */ jsx(sourceConfig.icon, { size: 10 }),
2862
- /* @__PURE__ */ jsx("span", { children: sourceConfig.label })
2863
- ]
2864
- }
2865
- ),
2866
- ((_a = skill.metadata) == null ? void 0 : _a.owner) && ((_b = skill.metadata) == null ? void 0 : _b.repo) && /* @__PURE__ */ jsxs(
2867
- "div",
2868
- {
2869
- style: {
2870
- display: "inline-flex",
2871
- alignItems: "center",
2872
- gap: "4px",
2873
- padding: "2px 6px",
2874
- borderRadius: theme2.radii[1],
2875
- backgroundColor: `${theme2.colors.textSecondary}15`,
2876
- border: `1px solid ${theme2.colors.textSecondary}30`,
2877
- fontSize: theme2.fontSizes[0],
2878
- color: theme2.colors.textSecondary,
2879
- fontWeight: 500,
2880
- fontFamily: theme2.fonts.monospace,
2881
- width: "fit-content"
2882
- },
2883
- title: `From: ${skill.metadata.installedFrom}
2865
+ ((_a = skill.metadata) == null ? void 0 : _a.owner) && ((_b = skill.metadata) == null ? void 0 : _b.repo) && /* @__PURE__ */ jsxs(
2866
+ "div",
2867
+ {
2868
+ style: {
2869
+ display: "inline-flex",
2870
+ alignItems: "center",
2871
+ gap: "4px",
2872
+ padding: "2px 6px",
2873
+ borderRadius: theme2.radii[1],
2874
+ backgroundColor: `${theme2.colors.textSecondary}15`,
2875
+ border: `1px solid ${theme2.colors.textSecondary}30`,
2876
+ fontSize: theme2.fontSizes[0],
2877
+ color: theme2.colors.textSecondary,
2878
+ fontWeight: 500,
2879
+ fontFamily: theme2.fonts.monospace,
2880
+ width: "fit-content"
2881
+ },
2882
+ title: `From: ${skill.metadata.installedFrom}
2884
2883
  Installed: ${skill.metadata.installedAt ? new Date(skill.metadata.installedAt).toLocaleString() : "Unknown"}`,
2885
- children: [
2886
- /* @__PURE__ */ jsx(Github, { size: 10 }),
2887
- /* @__PURE__ */ jsxs("span", { children: [
2888
- skill.metadata.owner,
2889
- "/",
2890
- skill.metadata.repo
2891
- ] })
2892
- ]
2893
- }
2894
- )
2895
- ] })
2884
+ children: [
2885
+ /* @__PURE__ */ jsx(Github, { size: 10 }),
2886
+ /* @__PURE__ */ jsxs("span", { children: [
2887
+ skill.metadata.owner,
2888
+ "/",
2889
+ skill.metadata.repo
2890
+ ] })
2891
+ ]
2892
+ }
2893
+ )
2896
2894
  ] })
2897
2895
  ] }),
2898
- onClick && /* @__PURE__ */ jsx(
2899
- ChevronRight,
2900
- {
2901
- size: 18,
2902
- color: theme2.colors.textSecondary,
2903
- style: { flexShrink: 0 }
2904
- }
2905
- )
2896
+ (skill.hasScripts || skill.hasReferences || skill.hasAssets) && /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: "6px", flexWrap: "wrap", flexShrink: 0 }, children: [
2897
+ skill.hasScripts && /* @__PURE__ */ jsxs(
2898
+ "div",
2899
+ {
2900
+ style: {
2901
+ display: "flex",
2902
+ alignItems: "center",
2903
+ gap: "4px",
2904
+ padding: "2px 8px",
2905
+ borderRadius: theme2.radii[1],
2906
+ backgroundColor: `${theme2.colors.primary}15`,
2907
+ border: `1px solid ${theme2.colors.primary}30`,
2908
+ fontSize: theme2.fontSizes[0],
2909
+ color: theme2.colors.primary,
2910
+ fontWeight: 500
2911
+ },
2912
+ title: `Scripts: ${(_c = skill.scriptFiles) == null ? void 0 : _c.join(", ")}`,
2913
+ children: [
2914
+ /* @__PURE__ */ jsx(Code, { size: 12 }),
2915
+ /* @__PURE__ */ jsx("span", { children: ((_d = skill.scriptFiles) == null ? void 0 : _d.length) || 0 })
2916
+ ]
2917
+ }
2918
+ ),
2919
+ skill.hasReferences && /* @__PURE__ */ jsxs(
2920
+ "div",
2921
+ {
2922
+ style: {
2923
+ display: "flex",
2924
+ alignItems: "center",
2925
+ gap: "4px",
2926
+ padding: "2px 8px",
2927
+ borderRadius: theme2.radii[1],
2928
+ backgroundColor: `${theme2.colors.secondary}15`,
2929
+ border: `1px solid ${theme2.colors.secondary}30`,
2930
+ fontSize: theme2.fontSizes[0],
2931
+ color: theme2.colors.secondary,
2932
+ fontWeight: 500
2933
+ },
2934
+ title: `References: ${(_e2 = skill.referenceFiles) == null ? void 0 : _e2.join(", ")}`,
2935
+ children: [
2936
+ /* @__PURE__ */ jsx(BookOpen, { size: 12 }),
2937
+ /* @__PURE__ */ jsx("span", { children: ((_f = skill.referenceFiles) == null ? void 0 : _f.length) || 0 })
2938
+ ]
2939
+ }
2940
+ ),
2941
+ skill.hasAssets && /* @__PURE__ */ jsxs(
2942
+ "div",
2943
+ {
2944
+ style: {
2945
+ display: "flex",
2946
+ alignItems: "center",
2947
+ gap: "4px",
2948
+ padding: "2px 8px",
2949
+ borderRadius: theme2.radii[1],
2950
+ backgroundColor: `${theme2.colors.accent}15`,
2951
+ border: `1px solid ${theme2.colors.accent}30`,
2952
+ fontSize: theme2.fontSizes[0],
2953
+ color: theme2.colors.accent,
2954
+ fontWeight: 500
2955
+ },
2956
+ title: `Assets: ${(_g = skill.assetFiles) == null ? void 0 : _g.join(", ")}`,
2957
+ children: [
2958
+ /* @__PURE__ */ jsx(Package, { size: 12 }),
2959
+ /* @__PURE__ */ jsx("span", { children: ((_h = skill.assetFiles) == null ? void 0 : _h.length) || 0 })
2960
+ ]
2961
+ }
2962
+ )
2963
+ ] })
2906
2964
  ] }),
2907
2965
  skill.description && /* @__PURE__ */ jsx(
2908
2966
  "p",
@@ -2962,90 +3020,36 @@ Installed: ${skill.metadata.installedAt ? new Date(skill.metadata.installedAt).t
2962
3020
  },
2963
3021
  index2
2964
3022
  )) }),
2965
- (skill.hasScripts || skill.hasReferences || skill.hasAssets) && /* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: "6px", flexWrap: "wrap" }, children: [
2966
- skill.hasScripts && /* @__PURE__ */ jsxs(
2967
- "div",
2968
- {
2969
- style: {
2970
- display: "flex",
2971
- alignItems: "center",
2972
- gap: "4px",
2973
- padding: "2px 8px",
2974
- borderRadius: theme2.radii[1],
2975
- backgroundColor: `${theme2.colors.primary}15`,
2976
- border: `1px solid ${theme2.colors.primary}30`,
2977
- fontSize: theme2.fontSizes[0],
2978
- color: theme2.colors.primary,
2979
- fontWeight: 500
2980
- },
2981
- title: `Scripts: ${(_c = skill.scriptFiles) == null ? void 0 : _c.join(", ")}`,
2982
- children: [
2983
- /* @__PURE__ */ jsx(Code, { size: 12 }),
2984
- /* @__PURE__ */ jsx("span", { children: ((_d = skill.scriptFiles) == null ? void 0 : _d.length) || 0 })
2985
- ]
2986
- }
2987
- ),
2988
- skill.hasReferences && /* @__PURE__ */ jsxs(
2989
- "div",
2990
- {
2991
- style: {
2992
- display: "flex",
2993
- alignItems: "center",
2994
- gap: "4px",
2995
- padding: "2px 8px",
2996
- borderRadius: theme2.radii[1],
2997
- backgroundColor: `${theme2.colors.secondary}15`,
2998
- border: `1px solid ${theme2.colors.secondary}30`,
2999
- fontSize: theme2.fontSizes[0],
3000
- color: theme2.colors.secondary,
3001
- fontWeight: 500
3002
- },
3003
- title: `References: ${(_e2 = skill.referenceFiles) == null ? void 0 : _e2.join(", ")}`,
3004
- children: [
3005
- /* @__PURE__ */ jsx(BookOpen, { size: 12 }),
3006
- /* @__PURE__ */ jsx("span", { children: ((_f = skill.referenceFiles) == null ? void 0 : _f.length) || 0 })
3007
- ]
3008
- }
3009
- ),
3010
- skill.hasAssets && /* @__PURE__ */ jsxs(
3011
- "div",
3012
- {
3013
- style: {
3014
- display: "flex",
3015
- alignItems: "center",
3016
- gap: "4px",
3017
- padding: "2px 8px",
3018
- borderRadius: theme2.radii[1],
3019
- backgroundColor: `${theme2.colors.accent}15`,
3020
- border: `1px solid ${theme2.colors.accent}30`,
3021
- fontSize: theme2.fontSizes[0],
3022
- color: theme2.colors.accent,
3023
- fontWeight: 500
3024
- },
3025
- title: `Assets: ${(_g = skill.assetFiles) == null ? void 0 : _g.join(", ")}`,
3026
- children: [
3027
- /* @__PURE__ */ jsx(Package, { size: 12 }),
3028
- /* @__PURE__ */ jsx("span", { children: ((_h = skill.assetFiles) == null ? void 0 : _h.length) || 0 })
3029
- ]
3030
- }
3031
- )
3032
- ] }),
3033
3023
  /* @__PURE__ */ jsx(
3034
3024
  "div",
3035
3025
  {
3026
+ onClick: handleCopyPath,
3036
3027
  style: {
3037
3028
  fontSize: theme2.fontSizes[0],
3038
- color: theme2.colors.textMuted,
3029
+ color: pathCopied ? theme2.colors.success : theme2.colors.textMuted,
3039
3030
  fontFamily: theme2.fonts.monospace,
3040
- background: theme2.colors.backgroundSecondary,
3031
+ background: pathCopied ? `${theme2.colors.success}15` : theme2.colors.backgroundSecondary,
3041
3032
  padding: "4px 8px",
3042
3033
  borderRadius: theme2.radii[1],
3043
3034
  overflow: "hidden",
3044
3035
  textOverflow: "ellipsis",
3045
- whiteSpace: "nowrap"
3036
+ whiteSpace: "nowrap",
3037
+ cursor: "pointer",
3038
+ transition: "all 0.2s ease",
3039
+ border: `1px solid ${pathCopied ? theme2.colors.success : "transparent"}`
3040
+ },
3041
+ title: pathCopied ? "Copied!" : "Click to copy path",
3042
+ onMouseEnter: (e) => {
3043
+ if (!pathCopied) {
3044
+ e.currentTarget.style.background = theme2.colors.backgroundTertiary || theme2.colors.border;
3045
+ }
3046
3046
  },
3047
- title: skill.path,
3048
- children: skill.path
3047
+ onMouseLeave: (e) => {
3048
+ if (!pathCopied) {
3049
+ e.currentTarget.style.background = theme2.colors.backgroundSecondary;
3050
+ }
3051
+ },
3052
+ children: pathCopied ? "Copied!" : skill.path
3049
3053
  }
3050
3054
  )
3051
3055
  ]
@@ -47528,6 +47532,57 @@ var Ut;
47528
47532
  }
47529
47533
  return Ut || (Ut = createContext(void 0)), Ut;
47530
47534
  })();
47535
+ var DocumentView = ({
47536
+ content: content2,
47537
+ onCheckboxChange,
47538
+ maxWidth = "900px",
47539
+ slideIdPrefix = "document",
47540
+ enableHtmlPopout = true,
47541
+ enableKeyboardScrolling = true,
47542
+ autoFocusOnVisible = true,
47543
+ onLinkClick,
47544
+ handleRunBashCommand,
47545
+ handlePromptCopy,
47546
+ repositoryInfo,
47547
+ fontSizeScale,
47548
+ theme: theme2,
47549
+ transparentBackground = false,
47550
+ editable = false
47551
+ }) => {
47552
+ const containerRef = useRef(null);
47553
+ const backgroundColor = transparentBackground ? "transparent" : theme2.colors.background;
47554
+ return /* @__PURE__ */ React2__default.createElement("div", {
47555
+ ref: containerRef,
47556
+ style: {
47557
+ height: "100%",
47558
+ overflow: "auto",
47559
+ backgroundColor
47560
+ }
47561
+ }, /* @__PURE__ */ React2__default.createElement("div", {
47562
+ style: {
47563
+ maxWidth: typeof maxWidth === "number" ? `${maxWidth}px` : maxWidth,
47564
+ margin: "0 auto",
47565
+ height: "100%"
47566
+ }
47567
+ }, /* @__PURE__ */ React2__default.createElement(IndustryMarkdownSlide, {
47568
+ content: content2,
47569
+ slideIdPrefix,
47570
+ slideIndex: 0,
47571
+ isVisible: true,
47572
+ theme: theme2,
47573
+ onCheckboxChange,
47574
+ enableHtmlPopout,
47575
+ enableKeyboardScrolling,
47576
+ autoFocusOnVisible,
47577
+ onLinkClick,
47578
+ handleRunBashCommand,
47579
+ fontSizeScale,
47580
+ handlePromptCopy,
47581
+ repositoryInfo,
47582
+ transparentBackground,
47583
+ editable
47584
+ })));
47585
+ };
47531
47586
  var formatRelativeTime = (dateString) => {
47532
47587
  try {
47533
47588
  const date = new Date(dateString);
@@ -48079,6 +48134,7 @@ const SkillDetailPanel = ({
48079
48134
  }
48080
48135
  );
48081
48136
  };
48137
+ const EMPTY_AGENTS_ARRAY = [];
48082
48138
  const determineAgentSource = (path2) => {
48083
48139
  if (path2 === "AGENTS.md") {
48084
48140
  return { source: "project-root", priority: 1 };
@@ -48146,7 +48202,7 @@ const useAgentsData = ({
48146
48202
  context
48147
48203
  }) => {
48148
48204
  var _a, _b, _c;
48149
- const [agents, setAgents] = useState([]);
48205
+ const [agents, setAgents] = useState(EMPTY_AGENTS_ARRAY);
48150
48206
  const [isLoading, setIsLoading] = useState(true);
48151
48207
  const [error, setError] = useState(null);
48152
48208
  const fileTreeSlice = context.getSlice("fileTree");
@@ -48156,13 +48212,21 @@ const useAgentsData = ({
48156
48212
  const globalAgents = useMemo(
48157
48213
  () => {
48158
48214
  var _a2;
48159
- return ((_a2 = globalAgentsSlice == null ? void 0 : globalAgentsSlice.data) == null ? void 0 : _a2.agents) || [];
48215
+ return ((_a2 = globalAgentsSlice == null ? void 0 : globalAgentsSlice.data) == null ? void 0 : _a2.agents) ?? EMPTY_AGENTS_ARRAY;
48160
48216
  },
48161
48217
  [(_a = globalAgentsSlice == null ? void 0 : globalAgentsSlice.data) == null ? void 0 : _a.agents]
48162
48218
  );
48219
+ const globalAgentsCount = globalAgents.length;
48163
48220
  const repoPath = (_b = context.currentScope.repository) == null ? void 0 : _b.path;
48164
48221
  const fileSystem = (_c = context.adapters) == null ? void 0 : _c.fileSystem;
48222
+ const lastLoadedSha = useRef(void 0);
48223
+ const lastGlobalAgentsCount = useRef(0);
48165
48224
  const loadAgents = useCallback(async () => {
48225
+ if (fileTreeSha === lastLoadedSha.current && globalAgentsCount === lastGlobalAgentsCount.current) {
48226
+ console.log("[useAgentsData] Skipping reload - data unchanged (SHA:", fileTreeSha, "globalCount:", globalAgentsCount, ")");
48227
+ return;
48228
+ }
48229
+ console.log("[useAgentsData] Loading agents - SHA changed:", fileTreeSha !== lastLoadedSha.current, "globalCount changed:", globalAgentsCount !== lastGlobalAgentsCount.current);
48166
48230
  setIsLoading(true);
48167
48231
  setError(null);
48168
48232
  try {
@@ -48189,6 +48253,8 @@ const useAgentsData = ({
48189
48253
  const allAgents = [...localAgents, ...globalAgents];
48190
48254
  console.log("[useAgentsData] Total agents:", allAgents.length);
48191
48255
  setAgents(allAgents);
48256
+ lastLoadedSha.current = fileTreeSha;
48257
+ lastGlobalAgentsCount.current = globalAgentsCount;
48192
48258
  } catch (err) {
48193
48259
  const errorMessage = err instanceof Error ? err.message : "Failed to load agents";
48194
48260
  setError(errorMessage);
@@ -48196,8 +48262,10 @@ const useAgentsData = ({
48196
48262
  } finally {
48197
48263
  setIsLoading(false);
48198
48264
  }
48199
- }, [fileTree, fileTreeSha, globalAgents, repoPath, fileSystem]);
48265
+ }, [fileTree, fileTreeSha, globalAgents, globalAgentsCount, repoPath, fileSystem]);
48200
48266
  const refreshAgents = useCallback(async () => {
48267
+ lastLoadedSha.current = void 0;
48268
+ lastGlobalAgentsCount.current = -1;
48201
48269
  await loadAgents();
48202
48270
  }, [loadAgents]);
48203
48271
  useEffect(() => {
@@ -48210,6 +48278,7 @@ const useAgentsData = ({
48210
48278
  refreshAgents
48211
48279
  };
48212
48280
  };
48281
+ const EMPTY_SUBAGENTS_ARRAY = [];
48213
48282
  const determineSubagentSource = (path2) => {
48214
48283
  if (path2.includes(".claude/agents/")) {
48215
48284
  return { source: "project-claude", priority: 1 };
@@ -48284,7 +48353,7 @@ const useSubagentsData = ({
48284
48353
  context
48285
48354
  }) => {
48286
48355
  var _a, _b, _c;
48287
- const [subagents, setSubagents] = useState([]);
48356
+ const [subagents, setSubagents] = useState(EMPTY_SUBAGENTS_ARRAY);
48288
48357
  const [isLoading, setIsLoading] = useState(true);
48289
48358
  const [error, setError] = useState(null);
48290
48359
  const fileTreeSlice = context.getSlice("fileTree");
@@ -48294,13 +48363,21 @@ const useSubagentsData = ({
48294
48363
  const globalSubagents = useMemo(
48295
48364
  () => {
48296
48365
  var _a2;
48297
- return ((_a2 = globalSubagentsSlice == null ? void 0 : globalSubagentsSlice.data) == null ? void 0 : _a2.subagents) || [];
48366
+ return ((_a2 = globalSubagentsSlice == null ? void 0 : globalSubagentsSlice.data) == null ? void 0 : _a2.subagents) ?? EMPTY_SUBAGENTS_ARRAY;
48298
48367
  },
48299
48368
  [(_a = globalSubagentsSlice == null ? void 0 : globalSubagentsSlice.data) == null ? void 0 : _a.subagents]
48300
48369
  );
48370
+ const globalSubagentsCount = globalSubagents.length;
48301
48371
  const repoPath = (_b = context.currentScope.repository) == null ? void 0 : _b.path;
48302
48372
  const fileSystem = (_c = context.adapters) == null ? void 0 : _c.fileSystem;
48373
+ const lastLoadedSha = useRef(void 0);
48374
+ const lastGlobalSubagentsCount = useRef(0);
48303
48375
  const loadSubagents = useCallback(async () => {
48376
+ if (fileTreeSha === lastLoadedSha.current && globalSubagentsCount === lastGlobalSubagentsCount.current) {
48377
+ console.log("[useSubagentsData] Skipping reload - data unchanged (SHA:", fileTreeSha, "globalCount:", globalSubagentsCount, ")");
48378
+ return;
48379
+ }
48380
+ console.log("[useSubagentsData] Loading subagents - SHA changed:", fileTreeSha !== lastLoadedSha.current, "globalCount changed:", globalSubagentsCount !== lastGlobalSubagentsCount.current);
48304
48381
  setIsLoading(true);
48305
48382
  setError(null);
48306
48383
  try {
@@ -48327,6 +48404,8 @@ const useSubagentsData = ({
48327
48404
  const allSubagents = [...localSubagents, ...globalSubagents];
48328
48405
  console.log("[useSubagentsData] Total subagents:", allSubagents.length);
48329
48406
  setSubagents(allSubagents);
48407
+ lastLoadedSha.current = fileTreeSha;
48408
+ lastGlobalSubagentsCount.current = globalSubagentsCount;
48330
48409
  } catch (err) {
48331
48410
  const errorMessage = err instanceof Error ? err.message : "Failed to load subagents";
48332
48411
  setError(errorMessage);
@@ -48334,8 +48413,10 @@ const useSubagentsData = ({
48334
48413
  } finally {
48335
48414
  setIsLoading(false);
48336
48415
  }
48337
- }, [fileTree, fileTreeSha, globalSubagents, repoPath, fileSystem]);
48416
+ }, [fileTree, fileTreeSha, globalSubagents, globalSubagentsCount, repoPath, fileSystem]);
48338
48417
  const refreshSubagents = useCallback(async () => {
48418
+ lastLoadedSha.current = void 0;
48419
+ lastGlobalSubagentsCount.current = -1;
48339
48420
  await loadSubagents();
48340
48421
  }, [loadSubagents]);
48341
48422
  useEffect(() => {
@@ -49300,9 +49381,9 @@ const AgentDetailPanel = ({
49300
49381
  tabIndex: -1,
49301
49382
  style: {
49302
49383
  height: "100%",
49303
- overflow: "auto",
49384
+ display: "flex",
49385
+ flexDirection: "column",
49304
49386
  backgroundColor: theme2.colors.background,
49305
- padding: "clamp(16px, 3vw, 24px)",
49306
49387
  fontFamily: theme2.fonts.body,
49307
49388
  outline: "none"
49308
49389
  },
@@ -49311,9 +49392,11 @@ const AgentDetailPanel = ({
49311
49392
  "div",
49312
49393
  {
49313
49394
  style: {
49314
- marginBottom: "24px",
49395
+ flexShrink: 0,
49396
+ padding: "clamp(16px, 3vw, 24px)",
49315
49397
  paddingBottom: "16px",
49316
- borderBottom: `1px solid ${theme2.colors.border}`
49398
+ borderBottom: `1px solid ${theme2.colors.border}`,
49399
+ backgroundColor: theme2.colors.background
49317
49400
  },
49318
49401
  children: [
49319
49402
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "8px" }, children: [
@@ -49349,9 +49432,12 @@ const AgentDetailPanel = ({
49349
49432
  "div",
49350
49433
  {
49351
49434
  style: {
49435
+ flex: 1,
49436
+ overflow: "auto",
49437
+ padding: "clamp(16px, 3vw, 24px)",
49352
49438
  color: theme2.colors.text
49353
49439
  },
49354
- children: /* @__PURE__ */ jsx(SkillMarkdown, { content: agent.content, theme: theme2 })
49440
+ children: /* @__PURE__ */ jsx(DocumentView, { content: agent.content, theme: theme2 })
49355
49441
  }
49356
49442
  )
49357
49443
  ]
@@ -49368,9 +49454,9 @@ const AgentDetailPanel = ({
49368
49454
  tabIndex: -1,
49369
49455
  style: {
49370
49456
  height: "100%",
49371
- overflow: "auto",
49457
+ display: "flex",
49458
+ flexDirection: "column",
49372
49459
  backgroundColor: theme2.colors.background,
49373
- padding: "clamp(16px, 3vw, 24px)",
49374
49460
  fontFamily: theme2.fonts.body,
49375
49461
  outline: "none"
49376
49462
  },
@@ -49379,9 +49465,11 @@ const AgentDetailPanel = ({
49379
49465
  "div",
49380
49466
  {
49381
49467
  style: {
49382
- marginBottom: "24px",
49468
+ flexShrink: 0,
49469
+ padding: "clamp(16px, 3vw, 24px)",
49383
49470
  paddingBottom: "16px",
49384
- borderBottom: `1px solid ${theme2.colors.border}`
49471
+ borderBottom: `1px solid ${theme2.colors.border}`,
49472
+ backgroundColor: theme2.colors.background
49385
49473
  },
49386
49474
  children: [
49387
49475
  /* @__PURE__ */ jsxs("div", { style: { display: "flex", alignItems: "center", gap: "12px", marginBottom: "8px" }, children: [
@@ -49603,62 +49691,74 @@ const AgentDetailPanel = ({
49603
49691
  ]
49604
49692
  }
49605
49693
  ),
49606
- /* @__PURE__ */ jsxs("div", { style: { marginTop: "32px" }, children: [
49607
- /* @__PURE__ */ jsx(
49608
- "h2",
49609
- {
49610
- style: {
49611
- margin: "0 0 16px 0",
49612
- fontSize: theme2.fontSizes[3],
49613
- color: theme2.colors.text,
49614
- fontWeight: 600
49615
- },
49616
- children: "Prompt"
49617
- }
49618
- ),
49619
- /* @__PURE__ */ jsx(
49620
- "div",
49621
- {
49622
- style: {
49623
- padding: "16px",
49624
- background: theme2.colors.backgroundSecondary,
49625
- border: `1px solid ${theme2.colors.border}`,
49626
- borderRadius: theme2.radii[2],
49627
- color: theme2.colors.text
49628
- },
49629
- children: /* @__PURE__ */ jsx(SkillMarkdown, { content: subagent.prompt, theme: theme2 })
49630
- }
49631
- )
49632
- ] }),
49633
- fm.disallowedTools && /* @__PURE__ */ jsxs("div", { style: { marginTop: "24px" }, children: [
49634
- /* @__PURE__ */ jsx(
49635
- "h3",
49636
- {
49637
- style: {
49638
- margin: "0 0 12px 0",
49639
- fontSize: theme2.fontSizes[2],
49640
- color: theme2.colors.text,
49641
- fontWeight: 600
49642
- },
49643
- children: "Disallowed Tools"
49644
- }
49645
- ),
49646
- /* @__PURE__ */ jsx(
49647
- "div",
49648
- {
49649
- style: {
49650
- padding: "12px",
49651
- background: `${theme2.colors.error}10`,
49652
- border: `1px solid ${theme2.colors.error}40`,
49653
- borderRadius: theme2.radii[2],
49654
- color: theme2.colors.text,
49655
- fontFamily: theme2.fonts.monospace,
49656
- fontSize: theme2.fontSizes[1]
49657
- },
49658
- children: fm.disallowedTools
49659
- }
49660
- )
49661
- ] })
49694
+ /* @__PURE__ */ jsxs(
49695
+ "div",
49696
+ {
49697
+ style: {
49698
+ flex: 1,
49699
+ overflow: "auto",
49700
+ padding: "clamp(16px, 3vw, 24px)"
49701
+ },
49702
+ children: [
49703
+ /* @__PURE__ */ jsxs("div", { children: [
49704
+ /* @__PURE__ */ jsx(
49705
+ "h2",
49706
+ {
49707
+ style: {
49708
+ margin: "0 0 16px 0",
49709
+ fontSize: theme2.fontSizes[3],
49710
+ color: theme2.colors.text,
49711
+ fontWeight: 600
49712
+ },
49713
+ children: "Prompt"
49714
+ }
49715
+ ),
49716
+ /* @__PURE__ */ jsx(
49717
+ "div",
49718
+ {
49719
+ style: {
49720
+ padding: "16px",
49721
+ background: theme2.colors.backgroundSecondary,
49722
+ border: `1px solid ${theme2.colors.border}`,
49723
+ borderRadius: theme2.radii[2],
49724
+ color: theme2.colors.text
49725
+ },
49726
+ children: /* @__PURE__ */ jsx(DocumentView, { content: subagent.prompt, theme: theme2 })
49727
+ }
49728
+ )
49729
+ ] }),
49730
+ fm.disallowedTools && /* @__PURE__ */ jsxs("div", { style: { marginTop: "24px" }, children: [
49731
+ /* @__PURE__ */ jsx(
49732
+ "h3",
49733
+ {
49734
+ style: {
49735
+ margin: "0 0 12px 0",
49736
+ fontSize: theme2.fontSizes[2],
49737
+ color: theme2.colors.text,
49738
+ fontWeight: 600
49739
+ },
49740
+ children: "Disallowed Tools"
49741
+ }
49742
+ ),
49743
+ /* @__PURE__ */ jsx(
49744
+ "div",
49745
+ {
49746
+ style: {
49747
+ padding: "12px",
49748
+ background: `${theme2.colors.error}10`,
49749
+ border: `1px solid ${theme2.colors.error}40`,
49750
+ borderRadius: theme2.radii[2],
49751
+ color: theme2.colors.text,
49752
+ fontFamily: theme2.fonts.monospace,
49753
+ fontSize: theme2.fontSizes[1]
49754
+ },
49755
+ children: fm.disallowedTools
49756
+ }
49757
+ )
49758
+ ] })
49759
+ ]
49760
+ }
49761
+ )
49662
49762
  ]
49663
49763
  }
49664
49764
  );