dsh-skills-manager 0.1.4 → 0.1.6

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
@@ -135,26 +135,26 @@ const createLucideIcon = (iconName, iconNode) => {
135
135
 
136
136
  //#endregion
137
137
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/wrench.mjs
138
- const __iconNode$11 = [["path", {
138
+ const __iconNode$15 = [["path", {
139
139
  d: "M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",
140
140
  key: "1ngwbx"
141
141
  }]];
142
- const Wrench = createLucideIcon("wrench", __iconNode$11);
142
+ const Wrench = createLucideIcon("wrench", __iconNode$15);
143
143
 
144
144
  //#endregion
145
145
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/plus.mjs
146
- const __iconNode$10 = [["path", {
146
+ const __iconNode$14 = [["path", {
147
147
  d: "M5 12h14",
148
148
  key: "1ays0h"
149
149
  }], ["path", {
150
150
  d: "M12 5v14",
151
151
  key: "s699le"
152
152
  }]];
153
- const Plus = createLucideIcon("plus", __iconNode$10);
153
+ const Plus = createLucideIcon("plus", __iconNode$14);
154
154
 
155
155
  //#endregion
156
156
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/refresh-cw.mjs
157
- const __iconNode$9 = [
157
+ const __iconNode$13 = [
158
158
  ["path", {
159
159
  d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",
160
160
  key: "v9h5vc"
@@ -172,11 +172,11 @@ const __iconNode$9 = [
172
172
  key: "1cv678"
173
173
  }]
174
174
  ];
175
- const RefreshCw = createLucideIcon("refresh-cw", __iconNode$9);
175
+ const RefreshCw = createLucideIcon("refresh-cw", __iconNode$13);
176
176
 
177
177
  //#endregion
178
178
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/search.mjs
179
- const __iconNode$8 = [["path", {
179
+ const __iconNode$12 = [["path", {
180
180
  d: "m21 21-4.34-4.34",
181
181
  key: "14j7rj"
182
182
  }], ["circle", {
@@ -185,22 +185,22 @@ const __iconNode$8 = [["path", {
185
185
  r: "8",
186
186
  key: "4ej97u"
187
187
  }]];
188
- const Search = createLucideIcon("search", __iconNode$8);
188
+ const Search = createLucideIcon("search", __iconNode$12);
189
189
 
190
190
  //#endregion
191
191
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/x.mjs
192
- const __iconNode$7 = [["path", {
192
+ const __iconNode$11 = [["path", {
193
193
  d: "M18 6 6 18",
194
194
  key: "1bl5f8"
195
195
  }], ["path", {
196
196
  d: "m6 6 12 12",
197
197
  key: "d8bk6v"
198
198
  }]];
199
- const X = createLucideIcon("x", __iconNode$7);
199
+ const X = createLucideIcon("x", __iconNode$11);
200
200
 
201
201
  //#endregion
202
202
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash-2.mjs
203
- const __iconNode$6 = [
203
+ const __iconNode$10 = [
204
204
  ["path", {
205
205
  d: "M10 11v6",
206
206
  key: "nco0om"
@@ -222,11 +222,11 @@ const __iconNode$6 = [
222
222
  key: "e791ji"
223
223
  }]
224
224
  ];
225
- const Trash2 = createLucideIcon("trash-2", __iconNode$6);
225
+ const Trash2 = createLucideIcon("trash-2", __iconNode$10);
226
226
 
227
227
  //#endregion
228
228
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/globe.mjs
229
- const __iconNode$5 = [
229
+ const __iconNode$9 = [
230
230
  ["circle", {
231
231
  cx: "12",
232
232
  cy: "12",
@@ -242,11 +242,11 @@ const __iconNode$5 = [
242
242
  key: "9i4pu4"
243
243
  }]
244
244
  ];
245
- const Globe = createLucideIcon("globe", __iconNode$5);
245
+ const Globe = createLucideIcon("globe", __iconNode$9);
246
246
 
247
247
  //#endregion
248
248
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/folder-git.mjs
249
- const __iconNode$4 = [
249
+ const __iconNode$8 = [
250
250
  ["circle", {
251
251
  cx: "12",
252
252
  cy: "13",
@@ -266,11 +266,11 @@ const __iconNode$4 = [
266
266
  key: "1pygq7"
267
267
  }]
268
268
  ];
269
- const FolderGit = createLucideIcon("folder-git", __iconNode$4);
269
+ const FolderGit = createLucideIcon("folder-git", __iconNode$8);
270
270
 
271
271
  //#endregion
272
272
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/git-branch.mjs
273
- const __iconNode$3 = [
273
+ const __iconNode$7 = [
274
274
  ["path", {
275
275
  d: "M15 6a9 9 0 0 0-9 9V3",
276
276
  key: "1cii5b"
@@ -288,11 +288,11 @@ const __iconNode$3 = [
288
288
  key: "fqmcym"
289
289
  }]
290
290
  ];
291
- const GitBranch = createLucideIcon("git-branch", __iconNode$3);
291
+ const GitBranch = createLucideIcon("git-branch", __iconNode$7);
292
292
 
293
293
  //#endregion
294
294
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/package-open.mjs
295
- const __iconNode$2 = [
295
+ const __iconNode$6 = [
296
296
  ["path", {
297
297
  d: "M12 22v-9",
298
298
  key: "x3hkom"
@@ -310,19 +310,19 @@ const __iconNode$2 = [
310
310
  key: "12ttoo"
311
311
  }]
312
312
  ];
313
- const PackageOpen = createLucideIcon("package-open", __iconNode$2);
313
+ const PackageOpen = createLucideIcon("package-open", __iconNode$6);
314
314
 
315
315
  //#endregion
316
316
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/puzzle.mjs
317
- const __iconNode$1 = [["path", {
317
+ const __iconNode$5 = [["path", {
318
318
  d: "M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z",
319
319
  key: "w46dr5"
320
320
  }]];
321
- const Puzzle = createLucideIcon("puzzle", __iconNode$1);
321
+ const Puzzle = createLucideIcon("puzzle", __iconNode$5);
322
322
 
323
323
  //#endregion
324
324
  //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/circle-alert.mjs
325
- const __iconNode = [
325
+ const __iconNode$4 = [
326
326
  ["circle", {
327
327
  cx: "12",
328
328
  cy: "12",
@@ -344,27 +344,75 @@ const __iconNode = [
344
344
  key: "4dfq90"
345
345
  }]
346
346
  ];
347
- const CircleAlert = createLucideIcon("circle-alert", __iconNode);
347
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$4);
348
+
349
+ //#endregion
350
+ //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/list.mjs
351
+ const __iconNode$3 = [
352
+ ["path", {
353
+ d: "M3 5h.01",
354
+ key: "18ugdj"
355
+ }],
356
+ ["path", {
357
+ d: "M3 12h.01",
358
+ key: "nlz23k"
359
+ }],
360
+ ["path", {
361
+ d: "M3 19h.01",
362
+ key: "noohij"
363
+ }],
364
+ ["path", {
365
+ d: "M8 5h13",
366
+ key: "1pao27"
367
+ }],
368
+ ["path", {
369
+ d: "M8 12h13",
370
+ key: "1za7za"
371
+ }],
372
+ ["path", {
373
+ d: "M8 19h13",
374
+ key: "m83p4d"
375
+ }]
376
+ ];
377
+ const List = createLucideIcon("list", __iconNode$3);
378
+
379
+ //#endregion
380
+ //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/folder.mjs
381
+ const __iconNode$2 = [["path", {
382
+ d: "M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z",
383
+ key: "1kt360"
384
+ }]];
385
+ const Folder = createLucideIcon("folder", __iconNode$2);
386
+
387
+ //#endregion
388
+ //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-down.mjs
389
+ const __iconNode$1 = [["path", {
390
+ d: "m6 9 6 6 6-6",
391
+ key: "qrunsl"
392
+ }]];
393
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$1);
394
+
395
+ //#endregion
396
+ //#region node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-right.mjs
397
+ const __iconNode = [["path", {
398
+ d: "m9 18 6-6-6-6",
399
+ key: "mthhwq"
400
+ }]];
401
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode);
348
402
 
349
403
  //#endregion
350
404
  //#region lib/types/client/popover.js
351
- function projectPopoverEnabledCount(entries) {
352
- return entries.filter((entry) => entry.effectiveEnabled).length;
353
- }
354
- function projectPopoverRow(entry, busy = false) {
355
- return {
356
- checked: entry.effectiveEnabled,
357
- disabled: busy || entry.globalEnabled,
358
- badge: entry.globalEnabled ? "全局" : null,
359
- checkboxTitle: entry.globalEnabled ? "全局已启用,请到 Skill 管理关闭" : "项目启用"
360
- };
361
- }
405
+ const projectPopoverEnabledCount = (entries) => entries.filter((entry) => entry.effectiveEnabled).length;
406
+ const projectPopoverRow = (entry, busy = false) => ({
407
+ checked: entry.effectiveEnabled,
408
+ disabled: busy || entry.globalEnabled,
409
+ badge: entry.globalEnabled ? "全局" : null,
410
+ checkboxTitle: entry.globalEnabled ? "全局已启用,请到 Skill 管理关闭" : "项目启用"
411
+ });
362
412
 
363
413
  //#endregion
364
414
  //#region lib/types/client/session.js
365
- function projectRootForSession(state, sessionId) {
366
- return state.byId[sessionId]?.cwd;
367
- }
415
+ const projectRootForSession = (state, sessionId) => state.byId[sessionId]?.cwd;
368
416
 
369
417
  //#endregion
370
418
  //#region lib/types/client/index.js
@@ -527,6 +575,8 @@ function SkillManagerSection(props) {
527
575
  const [error, setError] = (0, react.useState)(null);
528
576
  const [repositoryOpen, setRepositoryOpen] = (0, react.useState)(false);
529
577
  const [repository, setRepository] = (0, react.useState)("");
578
+ const [view, setView] = (0, react.useState)("flat");
579
+ const [collapsed, setCollapsed] = (0, react.useState)({});
530
580
  (0, react.useEffect)(() => {
531
581
  ensureKeyframes();
532
582
  }, []);
@@ -564,6 +614,7 @@ function SkillManagerSection(props) {
564
614
  }, []);
565
615
  const normalizedQuery = query.trim().toLocaleLowerCase();
566
616
  const filtered = (catalog?.entries ?? []).filter((entry) => normalizedQuery.length === 0 || `${entry.name} ${entry.description}`.toLocaleLowerCase().includes(normalizedQuery));
617
+ const groups = groupBySource(filtered);
567
618
  const importSkill = async () => {
568
619
  const path = await pickDirectory();
569
620
  if (path) await run(() => mutate("install", {
@@ -593,6 +644,30 @@ function SkillManagerSection(props) {
593
644
  }));
594
645
  };
595
646
  const selectedWorkspace = workspaces.items.find((item) => item.path === projectRoot);
647
+ const rowProps = (entry) => ({
648
+ key: entry.name,
649
+ entry,
650
+ projectLabel: selectedWorkspace?.title ?? "当前项目",
651
+ projectAvailable: projectRoot !== void 0,
652
+ busy,
653
+ onGlobalChange: (enabled) => void run(() => mutate("set-enabled", {
654
+ name: entry.name,
655
+ scope: "global",
656
+ projectRoot,
657
+ enabled
658
+ })),
659
+ onProjectChange: (enabled) => void run(() => mutate("set-enabled", {
660
+ name: entry.name,
661
+ scope: "project",
662
+ projectRoot,
663
+ enabled
664
+ })),
665
+ onUpdate: () => void updateSkill(entry),
666
+ onRemove: () => void run(() => mutate("remove", {
667
+ name: entry.name,
668
+ projectRoot
669
+ }))
670
+ });
596
671
  return (0, react.createElement)("div", {
597
672
  style: panelStyle,
598
673
  "aria-busy": busy
@@ -739,7 +814,49 @@ function SkillManagerSection(props) {
739
814
  }, (0, react.createElement)("option", { value: "__global__" }, "只看全局"), ...workspaces.items.map((workspace) => (0, react.createElement)("option", {
740
815
  key: workspace.workspaceId,
741
816
  value: workspace.path
742
- }, workspace.title))))), error ? (0, react.createElement)("div", {
817
+ }, workspace.title)))), (0, react.createElement)("div", {
818
+ role: "group",
819
+ "aria-label": "视图切换",
820
+ style: {
821
+ display: "flex",
822
+ flex: "0 0 auto",
823
+ border: `1px solid ${tokens.border}`,
824
+ borderRadius: 8,
825
+ overflow: "hidden"
826
+ }
827
+ }, (0, react.createElement)("button", {
828
+ type: "button",
829
+ onClick: () => setView("flat"),
830
+ "aria-pressed": view === "flat",
831
+ title: "平铺列表",
832
+ style: {
833
+ ...iconButtonStyle,
834
+ width: 32,
835
+ height: 32,
836
+ borderRadius: 0,
837
+ color: view === "flat" ? tokens.accent : tokens.secondary,
838
+ background: view === "flat" ? "rgba(99, 102, 241, .12)" : "transparent"
839
+ }
840
+ }, (0, react.createElement)(List, {
841
+ size: 15,
842
+ "aria-hidden": true
843
+ })), (0, react.createElement)("button", {
844
+ type: "button",
845
+ onClick: () => setView("grouped"),
846
+ "aria-pressed": view === "grouped",
847
+ title: "按来源仓库分组",
848
+ style: {
849
+ ...iconButtonStyle,
850
+ width: 32,
851
+ height: 32,
852
+ borderRadius: 0,
853
+ color: view === "grouped" ? tokens.accent : tokens.secondary,
854
+ background: view === "grouped" ? "rgba(99, 102, 241, .12)" : "transparent"
855
+ }
856
+ }, (0, react.createElement)(Folder, {
857
+ size: 15,
858
+ "aria-hidden": true
859
+ })))), error ? (0, react.createElement)("div", {
743
860
  role: "alert",
744
861
  style: {
745
862
  display: "flex",
@@ -770,30 +887,89 @@ function SkillManagerSection(props) {
770
887
  textAlign: "center",
771
888
  fontSize: 13,
772
889
  color: tokens.secondary
773
- } }, "正在读取…") : filtered.length === 0 ? (0, react.createElement)(EmptyState, { hasAny: (catalog.entries.length ?? 0) > 0 }) : filtered.map((entry) => (0, react.createElement)(SkillRow, {
774
- key: entry.name,
775
- entry,
776
- projectLabel: selectedWorkspace?.title ?? "当前项目",
777
- projectAvailable: projectRoot !== void 0,
778
- busy,
779
- onGlobalChange: (enabled) => void run(() => mutate("set-enabled", {
780
- name: entry.name,
781
- scope: "global",
782
- projectRoot,
783
- enabled
784
- })),
785
- onProjectChange: (enabled) => void run(() => mutate("set-enabled", {
786
- name: entry.name,
787
- scope: "project",
788
- projectRoot,
789
- enabled
890
+ } }, "正在读取…") : filtered.length === 0 ? (0, react.createElement)(EmptyState, { hasAny: (catalog.entries.length ?? 0) > 0 }) : view === "flat" ? filtered.map((entry) => (0, react.createElement)(SkillRow, rowProps(entry))) : groups.map((group) => (0, react.createElement)("div", {
891
+ key: group.key,
892
+ style: {
893
+ display: "grid",
894
+ gap: 8
895
+ }
896
+ }, (0, react.createElement)("button", {
897
+ type: "button",
898
+ onClick: () => setCollapsed((prev) => ({
899
+ ...prev,
900
+ [group.key]: !prev[group.key]
790
901
  })),
791
- onUpdate: () => void updateSkill(entry),
792
- onRemove: () => void run(() => mutate("remove", {
793
- name: entry.name,
794
- projectRoot
795
- }))
796
- }))));
902
+ "aria-expanded": !collapsed[group.key],
903
+ style: {
904
+ display: "flex",
905
+ alignItems: "center",
906
+ gap: 8,
907
+ padding: "6px 4px",
908
+ border: "none",
909
+ background: "transparent",
910
+ color: "inherit",
911
+ cursor: "pointer",
912
+ fontSize: 13,
913
+ fontWeight: 600,
914
+ textAlign: "left"
915
+ }
916
+ }, collapsed[group.key] ? (0, react.createElement)(ChevronRight, {
917
+ size: 14,
918
+ "aria-hidden": true,
919
+ style: {
920
+ color: tokens.secondary,
921
+ flex: "0 0 auto"
922
+ }
923
+ }) : (0, react.createElement)(ChevronDown, {
924
+ size: 14,
925
+ "aria-hidden": true,
926
+ style: {
927
+ color: tokens.secondary,
928
+ flex: "0 0 auto"
929
+ }
930
+ }), (0, react.createElement)(GitBranch, {
931
+ size: 13,
932
+ "aria-hidden": true,
933
+ style: {
934
+ color: tokens.secondary,
935
+ flex: "0 0 auto"
936
+ }
937
+ }), (0, react.createElement)("span", {
938
+ title: group.key === "__local__" ? void 0 : group.key,
939
+ style: {
940
+ ...monoStyle,
941
+ minWidth: 0,
942
+ overflow: "hidden",
943
+ textOverflow: "ellipsis",
944
+ whiteSpace: "nowrap"
945
+ }
946
+ }, group.label), (0, react.createElement)("span", { style: {
947
+ color: tokens.secondary,
948
+ fontWeight: 400,
949
+ flex: "0 0 auto"
950
+ } }, `${group.entries.length} 个`)), collapsed[group.key] ? null : group.entries.map((entry) => (0, react.createElement)(SkillRow, rowProps(entry)))))));
951
+ }
952
+ function groupBySource(entries) {
953
+ const groups = /* @__PURE__ */ new Map();
954
+ for (const entry of entries) {
955
+ const key = entry.sourceType === "git" && entry.sourceUrl ? entry.sourceUrl : "__local__";
956
+ const label = key === "__local__" ? "本机导入" : shortRepoLabel(key);
957
+ const group = groups.get(key) ?? {
958
+ label,
959
+ entries: []
960
+ };
961
+ group.entries.push(entry);
962
+ groups.set(key, group);
963
+ }
964
+ return [...groups.entries()].map(([key, group]) => ({
965
+ key,
966
+ label: group.label,
967
+ entries: group.entries
968
+ })).sort((a, b) => a.key === "__local__" ? 1 : b.key === "__local__" ? -1 : a.label.localeCompare(b.label));
969
+ }
970
+ function shortRepoLabel(url) {
971
+ const match = /^(?:https?:\/\/|git@|ssh:\/\/git@)?([^/:]+)[:/]([^/]+\/[^/]+?)(?:\.git)?\/?$/.exec(url);
972
+ return match ? `${match[2]} (${match[1]})` : url;
797
973
  }
798
974
  function EmptyState(props) {
799
975
  return (0, react.createElement)("div", { style: {
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","AlertCircle","Icon"],"sources":["../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/context.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/wrench.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/plus.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/refresh-cw.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/search.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/x.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash-2.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/globe.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/folder-git.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/git-branch.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/package-open.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/puzzle.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/circle-alert.mjs","types/client/popover.js","types/client/session.js","types/client/index.js"],"sourcesContent":["/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\",\n key: \"1ngwbx\"\n }\n ]\n];\nconst Wrench = createLucideIcon(\"wrench\", __iconNode);\n\nexport { __iconNode, Wrench as default };\n//# sourceMappingURL=wrench.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n];\nconst Globe = createLucideIcon(\"globe\", __iconNode);\n\nexport { __iconNode, Globe as default };\n//# sourceMappingURL=globe.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"2\", key: \"1c1ljs\" }],\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ],\n [\"path\", { d: \"M14 13h3\", key: \"1dgedf\" }],\n [\"path\", { d: \"M7 13h3\", key: \"1pygq7\" }]\n];\nconst FolderGit = createLucideIcon(\"folder-git\", __iconNode);\n\nexport { __iconNode, FolderGit as default };\n//# sourceMappingURL=folder-git.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 6a9 9 0 0 0-9 9V3\", key: \"1cii5b\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }]\n];\nconst GitBranch = createLucideIcon(\"git-branch\", __iconNode);\n\nexport { __iconNode, GitBranch as default };\n//# sourceMappingURL=git-branch.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 22v-9\", key: \"x3hkom\" }],\n [\n \"path\",\n {\n d: \"M15.17 2.21a1.67 1.67 0 0 1 1.63 0L21 4.57a1.93 1.93 0 0 1 0 3.36L8.82 14.79a1.655 1.655 0 0 1-1.64 0L3 12.43a1.93 1.93 0 0 1 0-3.36z\",\n key: \"2ntwy6\"\n }\n ],\n [\n \"path\",\n {\n d: \"M20 13v3.87a2.06 2.06 0 0 1-1.11 1.83l-6 3.08a1.93 1.93 0 0 1-1.78 0l-6-3.08A2.06 2.06 0 0 1 4 16.87V13\",\n key: \"1pmm1c\"\n }\n ],\n [\n \"path\",\n {\n d: \"M21 12.43a1.93 1.93 0 0 0 0-3.36L8.83 2.2a1.64 1.64 0 0 0-1.63 0L3 4.57a1.93 1.93 0 0 0 0 3.36l12.18 6.86a1.636 1.636 0 0 0 1.63 0z\",\n key: \"12ttoo\"\n }\n ]\n];\nconst PackageOpen = createLucideIcon(\"package-open\", __iconNode);\n\nexport { __iconNode, PackageOpen as default };\n//# sourceMappingURL=package-open.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z\",\n key: \"w46dr5\"\n }\n ]\n];\nconst Puzzle = createLucideIcon(\"puzzle\", __iconNode);\n\nexport { __iconNode, Puzzle as default };\n//# sourceMappingURL=puzzle.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.mjs.map\n","export function projectPopoverEnabledCount(entries) {\n return entries.filter(entry => entry.effectiveEnabled).length;\n}\nexport function projectPopoverRow(entry, busy = false) {\n return {\n checked: entry.effectiveEnabled,\n disabled: busy || entry.globalEnabled,\n badge: entry.globalEnabled ? '全局' : null,\n checkboxTitle: entry.globalEnabled ? '全局已启用,请到 Skill 管理关闭' : '项目启用',\n };\n}\n","export function projectRootForSession(state, sessionId) {\n return state.byId[sessionId]?.cwd;\n}\n","import { createElement as h, useCallback, useEffect, useRef, useState } from 'react';\nimport Wrench from 'lucide-react/dist/esm/icons/wrench.mjs';\nimport Plus from 'lucide-react/dist/esm/icons/plus.mjs';\nimport RefreshCw from 'lucide-react/dist/esm/icons/refresh-cw.mjs';\nimport Search from 'lucide-react/dist/esm/icons/search.mjs';\nimport X from 'lucide-react/dist/esm/icons/x.mjs';\nimport Trash2 from 'lucide-react/dist/esm/icons/trash-2.mjs';\nimport Globe from 'lucide-react/dist/esm/icons/globe.mjs';\nimport FolderGit from 'lucide-react/dist/esm/icons/folder-git.mjs';\nimport GitBranch from 'lucide-react/dist/esm/icons/git-branch.mjs';\nimport PackageOpen from 'lucide-react/dist/esm/icons/package-open.mjs';\nimport Puzzle from 'lucide-react/dist/esm/icons/puzzle.mjs';\nimport AlertCircle from 'lucide-react/dist/esm/icons/alert-circle.mjs';\nimport { projectPopoverEnabledCount, projectPopoverRow } from './popover.js';\nimport { projectRootForSession } from './session.js';\nexport const inject = ['connection', 'slots', 'workspaces'];\nconst ICON_SPIN = ['dsh-skill-manager-spin', 'to { transform: rotate(360deg); }'];\nfunction ensureKeyframes() {\n if (typeof document === 'undefined')\n return;\n if (document.getElementById(ICON_SPIN[0]))\n return;\n const style = document.createElement('style');\n style.id = ICON_SPIN[0];\n style.textContent = `\n @keyframes ${ICON_SPIN[0]} { ${ICON_SPIN[1]} }\n .dsh-skill-manager-row:hover {\n border-color: ${tokens.borderStrong} !important;\n background: ${tokens.surfaceHover} !important;\n }\n @container (max-width: 360px) {\n .dsh-skill-manager-row { grid-template-columns: minmax(0, 1fr) !important; }\n .dsh-skill-manager-row-icon { display: none !important; }\n .dsh-skill-manager-row-actions { grid-column: 1 !important; justify-content: flex-start !important; }\n }\n `;\n document.head.appendChild(style);\n}\nconst spinnerStyle = { animation: `${ICON_SPIN[0]} 1s linear infinite`, flex: '0 0 auto' };\nconst monoStyle = { fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace' };\nconst tokens = {\n border: 'var(--border-subtle, rgba(148, 163, 184, .22))',\n borderStrong: 'var(--border-strong, rgba(148, 163, 184, .38))',\n accent: 'var(--fg-accent, #6366f1)',\n success: 'var(--fg-success, #16a34a)',\n danger: 'var(--fg-danger, #dc2626)',\n secondary: 'var(--fg-secondary, #64748b)',\n surfaceHover: 'var(--bg-hover, rgba(148, 163, 184, .08))',\n};\nconst panelStyle = { containerType: 'inline-size', display: 'grid', gap: 18, width: '100%', minWidth: 0, maxWidth: 760, padding: '6px 0 36px' };\nfunction buttonStyle(tone, disabled) {\n const base = {\n display: 'inline-flex', alignItems: 'center', gap: 6, minHeight: 32, padding: '0 12px',\n borderRadius: 8, border: `1px solid transparent`, fontSize: 13, fontWeight: 500,\n cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.55 : 1, whiteSpace: 'nowrap',\n transition: 'background .15s ease, border-color .15s ease',\n };\n if (tone === 'primary')\n return { ...base, background: tokens.accent, color: 'var(--fg-on-accent, #fff)', border: 'none' };\n return { ...base, background: 'transparent', color: 'inherit', border: `1px solid ${tokens.border}` };\n}\nconst iconButtonStyle = {\n display: 'grid', placeItems: 'center', width: 28, height: 28, padding: 0,\n border: 'none', borderRadius: 7, background: 'transparent', color: tokens.secondary, cursor: 'pointer',\n};\nconst inputStyle = {\n width: '100%', minHeight: 34, padding: '0 10px 0 30px', borderRadius: 8,\n border: `1px solid ${tokens.border}`, background: 'var(--bg-primary, transparent)', color: 'inherit',\n fontSize: 13, outline: 'none', boxSizing: 'border-box',\n};\nconst selectStyle = {\n minHeight: 34, maxWidth: 300, padding: '0 8px', borderRadius: 8,\n border: `1px solid ${tokens.border}`, background: 'var(--bg-primary, transparent)', color: 'inherit', fontSize: 13,\n};\nconst checkboxStyle = { width: 16, height: 16, margin: 0, accentColor: tokens.accent, flex: '0 0 auto' };\nexport function apply(ctx) {\n const connection = ctx.connection;\n const request = async (endpoint, payload = {}) => {\n const result = await connection.rpc.call('/skill-manager', endpoint, payload);\n if (!result.ok)\n throw new Error(result.error.message);\n return result.value;\n };\n const list = (projectRoot) => request('list', projectRoot ? { projectRoot } : {});\n const mutate = request;\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'skills',\n order: 35,\n label: 'Skill 管理',\n inject: () => ({ list, mutate, pickDirectory: () => ctx.workspaces.pickDirectory(), loopback: connection.isLoopback }),\n }, SkillManagerSection));\n ctx.slots.inject('conversation.input.left', () => ctx.slots.register({\n name: 'conversation.input.left',\n id: 'skill-manager',\n order: 10,\n inject: () => ({ list, mutate }),\n }, ComposerSkillButton));\n}\nfunction SkillManagerSection(props) {\n const { list, mutate, pickDirectory, loopback, useWorkspaces } = props;\n const workspaces = useWorkspaces(state => state);\n const [projectRoot, setProjectRoot] = useState(undefined);\n const [catalog, setCatalog] = useState(null);\n const [query, setQuery] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(null);\n const [repositoryOpen, setRepositoryOpen] = useState(false);\n const [repository, setRepository] = useState('');\n useEffect(() => { ensureKeyframes(); }, []);\n // 追踪用户是否主动选过「只看全局」,避免 useEffect 把它重置回第一个工作区\n const userChoseGlobal = useRef(false);\n useEffect(() => {\n // 仅当用户未主动选择「只看全局」时,才自动选中第一个工作区\n if (projectRoot === undefined && !userChoseGlobal.current && workspaces.items.length > 0)\n setProjectRoot(workspaces.items[0].path);\n // 当前选中的工作区被移除时,回退到第一个工作区\n if (projectRoot !== undefined && !workspaces.items.some(item => item.path === projectRoot))\n setProjectRoot(workspaces.items[0]?.path);\n }, [projectRoot, workspaces.items]);\n const refresh = useCallback(async () => {\n setBusy(true);\n setError(null);\n try {\n setCatalog(await list(projectRoot));\n }\n catch (reason) {\n setError(messageOf(reason));\n }\n finally {\n setBusy(false);\n }\n }, [list, projectRoot]);\n useEffect(() => { void refresh(); }, [refresh]);\n const run = useCallback(async (action) => {\n setBusy(true);\n setError(null);\n try {\n setCatalog(await action());\n return true;\n }\n catch (reason) {\n setError(messageOf(reason));\n return false;\n }\n finally {\n setBusy(false);\n }\n }, []);\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const filtered = (catalog?.entries ?? []).filter(entry => normalizedQuery.length === 0 || `${entry.name} ${entry.description}`.toLocaleLowerCase().includes(normalizedQuery));\n const importSkill = async () => {\n const path = await pickDirectory();\n if (path)\n await run(() => mutate('install', { path, projectRoot }));\n };\n const importRepository = async (event) => {\n event.preventDefault();\n const source = repository.trim();\n if (!source)\n return;\n if (await run(() => mutate('install-remote', { repository: source, projectRoot }))) {\n setRepository('');\n setRepositoryOpen(false);\n }\n };\n const updateSkill = async (entry) => {\n const path = entry.updateSupported ? undefined : await pickDirectory() ?? undefined;\n if (!entry.updateSupported && !path)\n return;\n await run(() => mutate('update', { name: entry.name, path, projectRoot }));\n };\n const selectedWorkspace = workspaces.items.find(item => item.path === projectRoot);\n return h('div', { style: panelStyle, 'aria-busy': busy }, h('header', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 16, flexWrap: 'wrap' } }, h('div', { style: { display: 'flex', alignItems: 'center', gap: 10, minWidth: 0 } }, h(Puzzle, { size: 20, 'aria-hidden': true }), h('h2', { style: { margin: 0, fontSize: 18, fontWeight: 600 } }, 'Skill 管理'), busy ? h(RefreshCw, { size: 14, 'aria-hidden': true, style: spinnerStyle }) : null), h('div', { style: { display: 'flex', gap: 8, flexWrap: 'wrap' } }, h('button', { type: 'button', style: buttonStyle('ghost', busy || !loopback), onClick: () => setRepositoryOpen(value => !value), disabled: busy || !loopback, title: loopback ? '从 Git 仓库导入 skill' : '仅在本机连接时可导入' }, h(GitBranch, { size: 14, 'aria-hidden': true }), '仓库'), h('button', { type: 'button', style: buttonStyle('primary', busy || !loopback), onClick: importSkill, disabled: busy || !loopback, title: loopback ? '从本机目录导入 skill' : '仅在本机连接时可导入' }, h(Plus, { size: 14, 'aria-hidden': true }), '本机'))), h('p', { style: { margin: '-8px 0 0', fontSize: 13, color: tokens.secondary, lineHeight: 1.5 } }, '从本机目录或 Git 仓库导入 skill,并按「全局」或「项目」范围启用。'), repositoryOpen ? h('form', { onSubmit: importRepository, style: { display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' } }, h('input', {\n type: 'text',\n value: repository,\n onChange: (event) => setRepository(event.currentTarget.value),\n placeholder: 'owner/repo 或 Git URL',\n 'aria-label': 'Git 仓库地址',\n autoFocus: true,\n disabled: busy,\n style: { ...inputStyle, flex: '1 1 260px', minWidth: 0, paddingLeft: 10 },\n }), h('button', { type: 'submit', style: buttonStyle('primary', busy || !repository.trim()), disabled: busy || !repository.trim() }, h(GitBranch, { size: 14, 'aria-hidden': true }), '导入'), h('button', { type: 'button', style: iconButtonStyle, onClick: () => setRepositoryOpen(false), disabled: busy, title: '关闭仓库导入', 'aria-label': '关闭仓库导入' }, h(X, { size: 15, 'aria-hidden': true }))) : null, h('div', { style: { display: 'flex', gap: 10, flexWrap: 'wrap', alignItems: 'center' } }, h('div', { style: { position: 'relative', flex: '1 1 220px', display: 'flex', alignItems: 'center' } }, h(Search, { size: 14, 'aria-hidden': true, style: { position: 'absolute', left: 9, color: tokens.secondary, pointerEvents: 'none' } }), h('input', { type: 'search', value: query, placeholder: '搜索 skill…', 'aria-label': '搜索 skill', onChange: (event) => setQuery(event.currentTarget.value), style: inputStyle })), h('label', { style: { display: 'flex', flex: '1 1 220px', minWidth: 0, alignItems: 'center', gap: 8, fontSize: 13, color: tokens.secondary } }, h('span', { style: { flex: '0 0 auto' } }, '项目范围'), h('select', { value: projectRoot ?? '__global__', onChange: (event) => { const value = event.currentTarget.value; if (value === '__global__') {\n userChoseGlobal.current = true;\n setProjectRoot(undefined);\n }\n else {\n userChoseGlobal.current = false;\n setProjectRoot(value);\n } }, style: { ...selectStyle, flex: '1 1 auto', minWidth: 0, maxWidth: 'none' } }, h('option', { value: '__global__' }, '只看全局'), ...workspaces.items.map(workspace => h('option', { key: workspace.workspaceId, value: workspace.path }, workspace.title))))), error ? h('div', { role: 'alert', style: { display: 'flex', gap: 8, alignItems: 'center', margin: 0, padding: '9px 12px', borderRadius: 8, fontSize: 13, color: tokens.danger, background: 'rgba(220, 38, 38, .08)', border: '1px solid rgba(220, 38, 38, .28)' } }, h(AlertCircle, { size: 15, 'aria-hidden': true }), error) : null, h('section', { style: { display: 'grid', width: '100%', minWidth: 0, gap: 8 }, 'aria-label': '已安装 skill' }, catalog === null\n ? h('p', { style: { margin: 0, padding: '24px 0', textAlign: 'center', fontSize: 13, color: tokens.secondary } }, '正在读取…')\n : filtered.length === 0\n ? h(EmptyState, { hasAny: (catalog.entries.length ?? 0) > 0 })\n : filtered.map(entry => h(SkillRow, {\n key: entry.name,\n entry,\n projectLabel: selectedWorkspace?.title ?? '当前项目',\n projectAvailable: projectRoot !== undefined,\n busy,\n onGlobalChange: enabled => void run(() => mutate('set-enabled', { name: entry.name, scope: 'global', projectRoot, enabled })),\n onProjectChange: enabled => void run(() => mutate('set-enabled', { name: entry.name, scope: 'project', projectRoot, enabled })),\n onUpdate: () => void updateSkill(entry),\n onRemove: () => void run(() => mutate('remove', { name: entry.name, projectRoot })),\n }))));\n}\nfunction EmptyState(props) {\n return h('div', { style: { display: 'grid', justifyItems: 'center', gap: 8, padding: '36px 16px', borderRadius: 10, border: `1px dashed ${tokens.borderStrong}`, color: tokens.secondary, textAlign: 'center' } }, h(PackageOpen, { size: 26, 'aria-hidden': true }), h('p', { style: { margin: 0, fontSize: 13, lineHeight: 1.5 } }, props.hasAny ? '没有匹配的 skill,试试调整搜索词。' : '还没有导入任何 skill。点击右上角「导入」,从本机目录开始。'));\n}\nfunction ComposerSkillButton(props) {\n const { session, useSessions, list, mutate } = props;\n const projectRoot = useSessions(state => projectRootForSession(state, session.sessionId));\n const [open, setOpen] = useState(false);\n const containerRef = useRef(null);\n useEffect(() => {\n if (!open)\n return;\n const onPointerDown = (event) => {\n if (containerRef.current && event.target instanceof Node && !containerRef.current.contains(event.target))\n setOpen(false);\n };\n const onKeyDown = (event) => { if (event.key === 'Escape')\n setOpen(false); };\n document.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n return h('div', { ref: containerRef, style: { position: 'relative', display: 'inline-flex', marginLeft: -25 } }, h('button', {\n type: 'button',\n title: projectRoot ? '配置当前项目的 Skill' : '当前会话没有工作区',\n 'aria-label': '配置当前项目的 Skill',\n 'aria-expanded': open,\n disabled: !projectRoot,\n onClick: () => setOpen(value => !value),\n style: {\n display: 'grid',\n placeItems: 'center',\n flex: '0 0 auto',\n width: 28,\n height: 28,\n padding: 0,\n border: 'none',\n borderRadius: 999,\n background: open ? 'var(--dsw-alias-bg-active, rgba(255, 255, 255, .16))' : 'var(--dsw-specific-selector, rgba(255, 255, 255, .08))',\n color: 'var(--dsw-alias-label-primary, inherit)',\n cursor: projectRoot ? 'pointer' : 'default',\n opacity: projectRoot ? 1 : 0.5,\n },\n }, h(Wrench, { size: 16, 'aria-hidden': true })), open && projectRoot ? h(ProjectSkillPopover, { projectRoot, list, mutate, onClose: () => setOpen(false) }) : null);\n}\nfunction ProjectSkillPopover(props) {\n const { projectRoot, list, mutate, onClose } = props;\n const theme = currentThemeColors();\n const [catalog, setCatalog] = useState(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(null);\n useEffect(() => { ensureKeyframes(); }, []);\n const refresh = useCallback(async () => {\n setBusy(true);\n setError(null);\n try {\n setCatalog(await list(projectRoot));\n }\n catch (reason) {\n setError(messageOf(reason));\n }\n finally {\n setBusy(false);\n }\n }, [list, projectRoot]);\n useEffect(() => { void refresh(); }, [refresh]);\n const toggle = async (entry, enabled) => {\n setBusy(true);\n setError(null);\n try {\n setCatalog(await mutate('set-enabled', { name: entry.name, scope: 'project', projectRoot, enabled }));\n }\n catch (reason) {\n setError(messageOf(reason));\n }\n finally {\n setBusy(false);\n }\n };\n const enabledCount = projectPopoverEnabledCount(catalog?.entries ?? []);\n return h('section', { style: { position: 'absolute', zIndex: 50, left: 0, bottom: 40, width: 320, display: 'grid', gap: 6, padding: 12, border: `1px solid ${tokens.borderStrong}`, borderRadius: 12, background: theme.background, color: theme.color, boxShadow: '0 16px 40px rgba(0, 0, 0, .4)' }, 'aria-label': '当前项目 Skill' }, h('header', { style: { display: 'flex', justifyContent: 'space-between', gap: 8, alignItems: 'center', paddingBottom: 4 } }, h('div', { style: { display: 'flex', alignItems: 'center', gap: 7, minWidth: 0 } }, h(FolderGit, { size: 14, 'aria-hidden': true, style: { color: tokens.secondary, flex: '0 0 auto' } }), h('strong', { style: { fontSize: 13, fontWeight: 600 } }, '项目 Skill'), h('span', { style: { fontSize: 12, color: tokens.secondary } }, `${enabledCount}/${catalog?.entries.length ?? 0} 已启用`)), h('button', { type: 'button', onClick: onClose, style: iconButtonStyle, 'aria-label': '关闭项目 Skill', title: '关闭' }, h(X, { size: 14, 'aria-hidden': true }))), error ? h('div', { role: 'alert', style: { display: 'flex', gap: 6, alignItems: 'center', margin: 0, padding: '7px 9px', borderRadius: 7, fontSize: 12, color: tokens.danger, background: 'rgba(220, 38, 38, .08)' } }, h(AlertCircle, { size: 13, 'aria-hidden': true }), error) : null, h('div', { style: { display: 'grid', gap: 1, maxHeight: 280, overflowY: 'auto', margin: '0 -4px', padding: '0 4px' } }, catalog === null\n ? h('p', { style: { margin: 0, padding: '18px 0', textAlign: 'center', fontSize: 12, color: tokens.secondary } }, '正在读取…')\n : catalog.entries.length === 0\n ? h('p', { style: { margin: 0, padding: '18px 0', textAlign: 'center', fontSize: 12, color: tokens.secondary } }, '未导入 skill。请到「设置 → Skill 管理」导入。')\n : catalog.entries.map(entry => {\n const row = projectPopoverRow(entry, busy);\n return h('label', { key: entry.name, style: { display: 'grid', gridTemplateColumns: '14px minmax(0, 1fr) 30px', gap: 8, alignItems: 'center', padding: '7px 6px', borderRadius: 7, fontSize: 13, cursor: row.disabled ? 'default' : 'pointer' }, title: entry.description || entry.name }, h(Puzzle, { size: 13, 'aria-hidden': true, style: { color: entry.effectiveEnabled ? tokens.accent : tokens.secondary } }), h('div', { style: { display: 'flex', alignItems: 'center', gap: 6, minWidth: 0 } }, h('span', { style: { minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, entry.name), row.badge ? h(StatusBadge, { active: true, icon: Globe, label: row.badge }) : null), h('input', { type: 'checkbox', checked: row.checked, disabled: row.disabled, onChange: (event) => void toggle(entry, event.currentTarget.checked), 'aria-label': `${entry.name} 项目开关`, title: row.checkboxTitle, style: checkboxStyle }));\n })), busy ? h('div', { style: { display: 'flex', justifyContent: 'flex-end', paddingTop: 2 } }, h(RefreshCw, { size: 12, 'aria-hidden': true, style: spinnerStyle })) : null);\n}\nfunction SkillRow(props) {\n const { entry, projectLabel, projectAvailable, busy, onGlobalChange, onProjectChange, onUpdate, onRemove } = props;\n return h('article', {\n className: 'dsh-skill-manager-row',\n style: {\n display: 'grid', gridTemplateColumns: '32px minmax(0, 1fr)', gap: 12, alignItems: 'center',\n width: '100%', minWidth: 0, maxWidth: '100%', overflow: 'hidden', boxSizing: 'border-box',\n padding: '12px 14px', borderRadius: 10, border: `1px solid ${tokens.border}`,\n background: 'transparent', transition: 'border-color .15s ease, background .15s ease',\n },\n }, h('div', { className: 'dsh-skill-manager-row-icon', style: { display: 'grid', placeItems: 'center', width: 32, height: 32, borderRadius: 8, color: entry.effectiveEnabled ? tokens.accent : tokens.secondary, background: entry.effectiveEnabled ? 'rgba(99, 102, 241, .1)' : 'rgba(148, 163, 184, .1)' } }, h(Puzzle, { size: 16, 'aria-hidden': true })), h('div', { style: { minWidth: 0, display: 'grid', gap: 4 } }, h('div', { style: { display: 'flex', alignItems: 'center', gap: 8, minWidth: 0, flexWrap: 'wrap' } }, h('strong', { style: { ...monoStyle, fontSize: 13, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, entry.name), h(SourceBadge, { entry }), h(StatusBadge, { active: entry.globalEnabled, icon: Globe, label: '全局' }), projectAvailable ? h(StatusBadge, { active: entry.projectEnabled, icon: FolderGit, label: projectLabel }) : null), entry.description ? h('p', { style: { margin: 0, color: tokens.secondary, lineHeight: 1.45, fontSize: 12.5, display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden' } }, entry.description) : null), h('div', { className: 'dsh-skill-manager-row-actions', style: { gridColumn: '1 / -1', display: 'flex', width: '100%', minWidth: 0, justifyContent: 'flex-end', alignItems: 'center', gap: 10, flexWrap: 'wrap' } }, h('input', { type: 'checkbox', checked: entry.globalEnabled, disabled: busy, onChange: (event) => onGlobalChange(event.currentTarget.checked), 'aria-label': `${entry.name} 全局开关`, title: '全局启用', style: checkboxStyle }), projectAvailable ? h('input', { type: 'checkbox', checked: entry.projectEnabled, disabled: busy, onChange: (event) => onProjectChange(event.currentTarget.checked), 'aria-label': `${entry.name} 项目开关`, title: `${projectLabel} 启用`, style: checkboxStyle }) : null, h('button', { type: 'button', style: { ...iconButtonStyle, color: tokens.secondary }, disabled: busy, onClick: onUpdate, title: entry.updateSupported ? (entry.sourceType === 'git' ? '从远程仓库更新' : '从原始目录更新') : '选择来源目录并更新', 'aria-label': `更新 ${entry.name}` }, h(RefreshCw, { size: 15, 'aria-hidden': true })), h('button', { type: 'button', style: { ...iconButtonStyle, color: tokens.danger }, disabled: busy, onClick: onRemove, title: '从库中移除', 'aria-label': `移除 ${entry.name}` }, h(Trash2, { size: 15, 'aria-hidden': true }))));\n}\nfunction SourceBadge(props) {\n const remote = props.entry.sourceType === 'git';\n const local = props.entry.sourceType === 'local';\n const Icon = remote ? GitBranch : local ? FolderGit : AlertCircle;\n const label = remote ? 'Git' : local ? '本机' : '未知';\n const title = remote ? props.entry.sourceUrl : local ? props.entry.sourcePath : '来源未知,更新时需选择本机来源目录';\n return h('span', {\n title,\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 4, flex: '0 1 auto', maxWidth: '100%', overflow: 'hidden',\n padding: '2px 6px', borderRadius: 999, fontSize: 11, lineHeight: '16px', whiteSpace: 'nowrap',\n color: tokens.secondary, background: 'rgba(148, 163, 184, .09)',\n },\n }, h(Icon, { size: 11, 'aria-hidden': true }), label);\n}\nfunction StatusBadge(props) {\n const Icon = props.icon;\n return h('span', {\n title: props.active ? `${props.label}已启用` : `${props.label}未启用`,\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 4, flex: '0 1 auto', maxWidth: '100%', overflow: 'hidden',\n padding: '2px 6px', borderRadius: 999, fontSize: 11, lineHeight: '16px', whiteSpace: 'nowrap',\n color: props.active ? tokens.success : tokens.secondary,\n background: props.active ? 'rgba(22, 163, 74, .1)' : 'rgba(148, 163, 184, .09)',\n border: `1px solid ${props.active ? 'rgba(22, 163, 74, .3)' : 'transparent'}`,\n },\n }, h(Icon, { size: 11, 'aria-hidden': true }), props.active ? `${props.label}开` : `${props.label}关`);\n}\nfunction currentThemeColors() {\n if (typeof document === 'undefined')\n return { background: '#151517', color: '#f9fafb' };\n const style = getComputedStyle(document.body);\n return {\n background: style.backgroundColor || '#151517',\n color: style.color || '#f9fafb',\n };\n}\nfunction messageOf(reason) {\n return reason instanceof Error ? reason.message : String(reason);\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","__iconNode","AlertCircle","Icon"],"sources":["../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/mergeClasses.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/toPascalCase.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/defaultAttributes.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/context.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/Icon.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/createLucideIcon.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/wrench.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/plus.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/refresh-cw.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/search.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/x.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/trash-2.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/globe.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/folder-git.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/git-branch.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/package-open.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/puzzle.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/circle-alert.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/list.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/folder.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-down.mjs","../node_modules/.pnpm/lucide-react@1.31.0_react@18.3.1/node_modules/lucide-react/dist/esm/icons/chevron-right.mjs","types/client/popover.js","types/client/session.js","types/client/index.js"],"sourcesContent":["/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && className.trim() !== \"\" && array.indexOf(className) === index;\n}).join(\" \").trim();\n\nexport { mergeClasses };\n//# sourceMappingURL=mergeClasses.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n\nexport { toKebabCase };\n//# sourceMappingURL=toKebabCase.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toCamelCase = (string) => string.replace(\n /^([A-Z])|[\\s-_]+(\\w)/g,\n (match, p1, p2) => p2 ? p2.toUpperCase() : p1.toLowerCase()\n);\n\nexport { toCamelCase };\n//# sourceMappingURL=toCamelCase.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { toCamelCase } from './toCamelCase.mjs';\n\nconst toPascalCase = (string) => {\n const camelCase = toCamelCase(string);\n return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n};\n\nexport { toPascalCase };\n//# sourceMappingURL=toPascalCase.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst hasA11yProp = (props) => {\n for (const prop in props) {\n if (prop.startsWith(\"aria-\") || prop === \"role\" || prop === \"title\") {\n return true;\n }\n }\n return false;\n};\n\nexport { hasA11yProp };\n//# sourceMappingURL=hasA11yProp.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { createContext, useContext, useMemo, createElement } from 'react';\n\nconst LucideContext = createContext({});\nfunction LucideProvider({\n children,\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n}) {\n const value = useMemo(\n () => ({\n size,\n color,\n strokeWidth,\n absoluteStrokeWidth,\n className\n }),\n [size, color, strokeWidth, absoluteStrokeWidth, className]\n );\n return createElement(LucideContext.Provider, { value }, children);\n}\nconst useLucideContext = () => useContext(LucideContext);\n\nexport { LucideProvider, useLucideContext };\n//# sourceMappingURL=context.mjs.map\n","\"use strict\";\n\"use client\";\n/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.mjs';\nimport { hasA11yProp } from './shared/src/utils/hasA11yProp.mjs';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { useLucideContext } from './context.mjs';\n\nconst Icon = forwardRef(\n ({ color, size, strokeWidth, absoluteStrokeWidth, className = \"\", children, iconNode, ...rest }, ref) => {\n const {\n size: contextSize = 24,\n strokeWidth: contextStrokeWidth = 2,\n absoluteStrokeWidth: contextAbsoluteStrokeWidth = false,\n color: contextColor = \"currentColor\",\n className: contextClass = \"\"\n } = useLucideContext() ?? {};\n const calculatedStrokeWidth = absoluteStrokeWidth ?? contextAbsoluteStrokeWidth ? Number(strokeWidth ?? contextStrokeWidth) * 24 / Number(size ?? contextSize) : strokeWidth ?? contextStrokeWidth;\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size ?? contextSize ?? defaultAttributes.width,\n height: size ?? contextSize ?? defaultAttributes.height,\n stroke: color ?? contextColor,\n strokeWidth: calculatedStrokeWidth,\n className: mergeClasses(\"lucide\", contextClass, className),\n ...!children && !hasA11yProp(rest) && { \"aria-hidden\": \"true\" },\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses } from './shared/src/utils/mergeClasses.mjs';\nimport { toKebabCase } from './shared/src/utils/toKebabCase.mjs';\nimport { toPascalCase } from './shared/src/utils/toPascalCase.mjs';\nimport Icon from './Icon.mjs';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(\n `lucide-${toKebabCase(toPascalCase(iconName))}`,\n `lucide-${iconName}`,\n className\n ),\n ...props\n })\n );\n Component.displayName = toPascalCase(iconName);\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z\",\n key: \"1ngwbx\"\n }\n ]\n];\nconst Wrench = createLucideIcon(\"wrench\", __iconNode);\n\nexport { __iconNode, Wrench as default };\n//# sourceMappingURL=wrench.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n];\nconst Plus = createLucideIcon(\"plus\", __iconNode);\n\nexport { __iconNode, Plus as default };\n//# sourceMappingURL=plus.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n];\nconst RefreshCw = createLucideIcon(\"refresh-cw\", __iconNode);\n\nexport { __iconNode, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"m21 21-4.34-4.34\", key: \"14j7rj\" }],\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }]\n];\nconst Search = createLucideIcon(\"search\", __iconNode);\n\nexport { __iconNode, Search as default };\n//# sourceMappingURL=search.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n];\nconst X = createLucideIcon(\"x\", __iconNode);\n\nexport { __iconNode, X as default };\n//# sourceMappingURL=x.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M10 11v6\", key: \"nco0om\" }],\n [\"path\", { d: \"M14 11v6\", key: \"outv1u\" }],\n [\"path\", { d: \"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\", key: \"miytrc\" }],\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\", key: \"e791ji\" }]\n];\nconst Trash2 = createLucideIcon(\"trash-2\", __iconNode);\n\nexport { __iconNode, Trash2 as default };\n//# sourceMappingURL=trash-2.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\", key: \"13o1zl\" }],\n [\"path\", { d: \"M2 12h20\", key: \"9i4pu4\" }]\n];\nconst Globe = createLucideIcon(\"globe\", __iconNode);\n\nexport { __iconNode, Globe as default };\n//# sourceMappingURL=globe.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"2\", key: \"1c1ljs\" }],\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ],\n [\"path\", { d: \"M14 13h3\", key: \"1dgedf\" }],\n [\"path\", { d: \"M7 13h3\", key: \"1pygq7\" }]\n];\nconst FolderGit = createLucideIcon(\"folder-git\", __iconNode);\n\nexport { __iconNode, FolderGit as default };\n//# sourceMappingURL=folder-git.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M15 6a9 9 0 0 0-9 9V3\", key: \"1cii5b\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }]\n];\nconst GitBranch = createLucideIcon(\"git-branch\", __iconNode);\n\nexport { __iconNode, GitBranch as default };\n//# sourceMappingURL=git-branch.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M12 22v-9\", key: \"x3hkom\" }],\n [\n \"path\",\n {\n d: \"M15.17 2.21a1.67 1.67 0 0 1 1.63 0L21 4.57a1.93 1.93 0 0 1 0 3.36L8.82 14.79a1.655 1.655 0 0 1-1.64 0L3 12.43a1.93 1.93 0 0 1 0-3.36z\",\n key: \"2ntwy6\"\n }\n ],\n [\n \"path\",\n {\n d: \"M20 13v3.87a2.06 2.06 0 0 1-1.11 1.83l-6 3.08a1.93 1.93 0 0 1-1.78 0l-6-3.08A2.06 2.06 0 0 1 4 16.87V13\",\n key: \"1pmm1c\"\n }\n ],\n [\n \"path\",\n {\n d: \"M21 12.43a1.93 1.93 0 0 0 0-3.36L8.83 2.2a1.64 1.64 0 0 0-1.63 0L3 4.57a1.93 1.93 0 0 0 0 3.36l12.18 6.86a1.636 1.636 0 0 0 1.63 0z\",\n key: \"12ttoo\"\n }\n ]\n];\nconst PackageOpen = createLucideIcon(\"package-open\", __iconNode);\n\nexport { __iconNode, PackageOpen as default };\n//# sourceMappingURL=package-open.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z\",\n key: \"w46dr5\"\n }\n ]\n];\nconst Puzzle = createLucideIcon(\"puzzle\", __iconNode);\n\nexport { __iconNode, Puzzle as default };\n//# sourceMappingURL=puzzle.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n];\nconst CircleAlert = createLucideIcon(\"circle-alert\", __iconNode);\n\nexport { __iconNode, CircleAlert as default };\n//# sourceMappingURL=circle-alert.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\"path\", { d: \"M3 5h.01\", key: \"18ugdj\" }],\n [\"path\", { d: \"M3 12h.01\", key: \"nlz23k\" }],\n [\"path\", { d: \"M3 19h.01\", key: \"noohij\" }],\n [\"path\", { d: \"M8 5h13\", key: \"1pao27\" }],\n [\"path\", { d: \"M8 12h13\", key: \"1za7za\" }],\n [\"path\", { d: \"M8 19h13\", key: \"m83p4d\" }]\n];\nconst List = createLucideIcon(\"list\", __iconNode);\n\nexport { __iconNode, List as default };\n//# sourceMappingURL=list.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\",\n key: \"1kt360\"\n }\n ]\n];\nconst Folder = createLucideIcon(\"folder\", __iconNode);\n\nexport { __iconNode, Folder as default };\n//# sourceMappingURL=folder.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]];\nconst ChevronDown = createLucideIcon(\"chevron-down\", __iconNode);\n\nexport { __iconNode, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n","/**\n * @license lucide-react v1.31.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconNode = [[\"path\", { d: \"m9 18 6-6-6-6\", key: \"mthhwq\" }]];\nconst ChevronRight = createLucideIcon(\"chevron-right\", __iconNode);\n\nexport { __iconNode, ChevronRight as default };\n//# sourceMappingURL=chevron-right.mjs.map\n","export const projectPopoverEnabledCount = (entries) => entries.filter(entry => entry.effectiveEnabled).length;\nexport const projectPopoverRow = (entry, busy = false) => ({\n checked: entry.effectiveEnabled,\n disabled: busy || entry.globalEnabled,\n badge: entry.globalEnabled ? '全局' : null,\n checkboxTitle: entry.globalEnabled ? '全局已启用,请到 Skill 管理关闭' : '项目启用',\n});\n","export const projectRootForSession = (state, sessionId) => state.byId[sessionId]?.cwd;\n","import { createElement as h, useCallback, useEffect, useRef, useState } from 'react';\nimport Wrench from 'lucide-react/dist/esm/icons/wrench.mjs';\nimport Plus from 'lucide-react/dist/esm/icons/plus.mjs';\nimport RefreshCw from 'lucide-react/dist/esm/icons/refresh-cw.mjs';\nimport Search from 'lucide-react/dist/esm/icons/search.mjs';\nimport X from 'lucide-react/dist/esm/icons/x.mjs';\nimport Trash2 from 'lucide-react/dist/esm/icons/trash-2.mjs';\nimport Globe from 'lucide-react/dist/esm/icons/globe.mjs';\nimport FolderGit from 'lucide-react/dist/esm/icons/folder-git.mjs';\nimport GitBranch from 'lucide-react/dist/esm/icons/git-branch.mjs';\nimport PackageOpen from 'lucide-react/dist/esm/icons/package-open.mjs';\nimport Puzzle from 'lucide-react/dist/esm/icons/puzzle.mjs';\nimport AlertCircle from 'lucide-react/dist/esm/icons/alert-circle.mjs';\nimport List from 'lucide-react/dist/esm/icons/list.mjs';\nimport Folder from 'lucide-react/dist/esm/icons/folder.mjs';\nimport ChevronDown from 'lucide-react/dist/esm/icons/chevron-down.mjs';\nimport ChevronRight from 'lucide-react/dist/esm/icons/chevron-right.mjs';\nimport { projectPopoverEnabledCount, projectPopoverRow } from './popover.js';\nimport { projectRootForSession } from './session.js';\nexport const inject = ['connection', 'slots', 'workspaces'];\nconst ICON_SPIN = ['dsh-skill-manager-spin', 'to { transform: rotate(360deg); }'];\nfunction ensureKeyframes() {\n if (typeof document === 'undefined')\n return;\n if (document.getElementById(ICON_SPIN[0]))\n return;\n const style = document.createElement('style');\n style.id = ICON_SPIN[0];\n style.textContent = `\n @keyframes ${ICON_SPIN[0]} { ${ICON_SPIN[1]} }\n .dsh-skill-manager-row:hover {\n border-color: ${tokens.borderStrong} !important;\n background: ${tokens.surfaceHover} !important;\n }\n @container (max-width: 360px) {\n .dsh-skill-manager-row { grid-template-columns: minmax(0, 1fr) !important; }\n .dsh-skill-manager-row-icon { display: none !important; }\n .dsh-skill-manager-row-actions { grid-column: 1 !important; justify-content: flex-start !important; }\n }\n `;\n document.head.appendChild(style);\n}\nconst spinnerStyle = { animation: `${ICON_SPIN[0]} 1s linear infinite`, flex: '0 0 auto' };\nconst monoStyle = { fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace' };\nconst tokens = {\n border: 'var(--border-subtle, rgba(148, 163, 184, .22))',\n borderStrong: 'var(--border-strong, rgba(148, 163, 184, .38))',\n accent: 'var(--fg-accent, #6366f1)',\n success: 'var(--fg-success, #16a34a)',\n danger: 'var(--fg-danger, #dc2626)',\n secondary: 'var(--fg-secondary, #64748b)',\n surfaceHover: 'var(--bg-hover, rgba(148, 163, 184, .08))',\n};\nconst panelStyle = { containerType: 'inline-size', display: 'grid', gap: 18, width: '100%', minWidth: 0, maxWidth: 760, padding: '6px 0 36px' };\nfunction buttonStyle(tone, disabled) {\n const base = {\n display: 'inline-flex', alignItems: 'center', gap: 6, minHeight: 32, padding: '0 12px',\n borderRadius: 8, border: `1px solid transparent`, fontSize: 13, fontWeight: 500,\n cursor: disabled ? 'default' : 'pointer', opacity: disabled ? 0.55 : 1, whiteSpace: 'nowrap',\n transition: 'background .15s ease, border-color .15s ease',\n };\n if (tone === 'primary')\n return { ...base, background: tokens.accent, color: 'var(--fg-on-accent, #fff)', border: 'none' };\n return { ...base, background: 'transparent', color: 'inherit', border: `1px solid ${tokens.border}` };\n}\nconst iconButtonStyle = {\n display: 'grid', placeItems: 'center', width: 28, height: 28, padding: 0,\n border: 'none', borderRadius: 7, background: 'transparent', color: tokens.secondary, cursor: 'pointer',\n};\nconst inputStyle = {\n width: '100%', minHeight: 34, padding: '0 10px 0 30px', borderRadius: 8,\n border: `1px solid ${tokens.border}`, background: 'var(--bg-primary, transparent)', color: 'inherit',\n fontSize: 13, outline: 'none', boxSizing: 'border-box',\n};\nconst selectStyle = {\n minHeight: 34, maxWidth: 300, padding: '0 8px', borderRadius: 8,\n border: `1px solid ${tokens.border}`, background: 'var(--bg-primary, transparent)', color: 'inherit', fontSize: 13,\n};\nconst checkboxStyle = { width: 16, height: 16, margin: 0, accentColor: tokens.accent, flex: '0 0 auto' };\nexport function apply(ctx) {\n const connection = ctx.connection;\n const request = async (endpoint, payload = {}) => {\n const result = await connection.rpc.call('/skill-manager', endpoint, payload);\n if (!result.ok)\n throw new Error(result.error.message);\n return result.value;\n };\n const list = (projectRoot) => request('list', projectRoot ? { projectRoot } : {});\n const mutate = request;\n ctx.slots.inject('settings.section', () => ctx.slots.register({\n name: 'settings.section',\n id: 'skills',\n order: 35,\n label: 'Skill 管理',\n inject: () => ({ list, mutate, pickDirectory: () => ctx.workspaces.pickDirectory(), loopback: connection.isLoopback }),\n }, SkillManagerSection));\n ctx.slots.inject('conversation.input.left', () => ctx.slots.register({\n name: 'conversation.input.left',\n id: 'skill-manager',\n order: 10,\n inject: () => ({ list, mutate }),\n }, ComposerSkillButton));\n}\nfunction SkillManagerSection(props) {\n const { list, mutate, pickDirectory, loopback, useWorkspaces } = props;\n const workspaces = useWorkspaces(state => state);\n const [projectRoot, setProjectRoot] = useState(undefined);\n const [catalog, setCatalog] = useState(null);\n const [query, setQuery] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(null);\n const [repositoryOpen, setRepositoryOpen] = useState(false);\n const [repository, setRepository] = useState('');\n const [view, setView] = useState('flat');\n const [collapsed, setCollapsed] = useState({});\n useEffect(() => { ensureKeyframes(); }, []);\n // 追踪用户是否主动选过「只看全局」,避免 useEffect 把它重置回第一个工作区\n const userChoseGlobal = useRef(false);\n useEffect(() => {\n // 仅当用户未主动选择「只看全局」时,才自动选中第一个工作区\n if (projectRoot === undefined && !userChoseGlobal.current && workspaces.items.length > 0)\n setProjectRoot(workspaces.items[0].path);\n // 当前选中的工作区被移除时,回退到第一个工作区\n if (projectRoot !== undefined && !workspaces.items.some(item => item.path === projectRoot))\n setProjectRoot(workspaces.items[0]?.path);\n }, [projectRoot, workspaces.items]);\n const refresh = useCallback(async () => {\n setBusy(true);\n setError(null);\n try {\n setCatalog(await list(projectRoot));\n }\n catch (reason) {\n setError(messageOf(reason));\n }\n finally {\n setBusy(false);\n }\n }, [list, projectRoot]);\n useEffect(() => { void refresh(); }, [refresh]);\n const run = useCallback(async (action) => {\n setBusy(true);\n setError(null);\n try {\n setCatalog(await action());\n return true;\n }\n catch (reason) {\n setError(messageOf(reason));\n return false;\n }\n finally {\n setBusy(false);\n }\n }, []);\n const normalizedQuery = query.trim().toLocaleLowerCase();\n const filtered = (catalog?.entries ?? []).filter(entry => normalizedQuery.length === 0 || `${entry.name} ${entry.description}`.toLocaleLowerCase().includes(normalizedQuery));\n const groups = groupBySource(filtered);\n const importSkill = async () => {\n const path = await pickDirectory();\n if (path)\n await run(() => mutate('install', { path, projectRoot }));\n };\n const importRepository = async (event) => {\n event.preventDefault();\n const source = repository.trim();\n if (!source)\n return;\n if (await run(() => mutate('install-remote', { repository: source, projectRoot }))) {\n setRepository('');\n setRepositoryOpen(false);\n }\n };\n const updateSkill = async (entry) => {\n const path = entry.updateSupported ? undefined : await pickDirectory() ?? undefined;\n if (!entry.updateSupported && !path)\n return;\n await run(() => mutate('update', { name: entry.name, path, projectRoot }));\n };\n const selectedWorkspace = workspaces.items.find(item => item.path === projectRoot);\n const rowProps = (entry) => ({\n key: entry.name,\n entry,\n projectLabel: selectedWorkspace?.title ?? '当前项目',\n projectAvailable: projectRoot !== undefined,\n busy,\n onGlobalChange: (enabled) => void run(() => mutate('set-enabled', { name: entry.name, scope: 'global', projectRoot, enabled })),\n onProjectChange: (enabled) => void run(() => mutate('set-enabled', { name: entry.name, scope: 'project', projectRoot, enabled })),\n onUpdate: () => void updateSkill(entry),\n onRemove: () => void run(() => mutate('remove', { name: entry.name, projectRoot })),\n });\n return h('div', { style: panelStyle, 'aria-busy': busy }, h('header', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 16, flexWrap: 'wrap' } }, h('div', { style: { display: 'flex', alignItems: 'center', gap: 10, minWidth: 0 } }, h(Puzzle, { size: 20, 'aria-hidden': true }), h('h2', { style: { margin: 0, fontSize: 18, fontWeight: 600 } }, 'Skill 管理'), busy ? h(RefreshCw, { size: 14, 'aria-hidden': true, style: spinnerStyle }) : null), h('div', { style: { display: 'flex', gap: 8, flexWrap: 'wrap' } }, h('button', { type: 'button', style: buttonStyle('ghost', busy || !loopback), onClick: () => setRepositoryOpen(value => !value), disabled: busy || !loopback, title: loopback ? '从 Git 仓库导入 skill' : '仅在本机连接时可导入' }, h(GitBranch, { size: 14, 'aria-hidden': true }), '仓库'), h('button', { type: 'button', style: buttonStyle('primary', busy || !loopback), onClick: importSkill, disabled: busy || !loopback, title: loopback ? '从本机目录导入 skill' : '仅在本机连接时可导入' }, h(Plus, { size: 14, 'aria-hidden': true }), '本机'))), h('p', { style: { margin: '-8px 0 0', fontSize: 13, color: tokens.secondary, lineHeight: 1.5 } }, '从本机目录或 Git 仓库导入 skill,并按「全局」或「项目」范围启用。'), repositoryOpen ? h('form', { onSubmit: importRepository, style: { display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' } }, h('input', {\n type: 'text',\n value: repository,\n onChange: (event) => setRepository(event.currentTarget.value),\n placeholder: 'owner/repo 或 Git URL',\n 'aria-label': 'Git 仓库地址',\n autoFocus: true,\n disabled: busy,\n style: { ...inputStyle, flex: '1 1 260px', minWidth: 0, paddingLeft: 10 },\n }), h('button', { type: 'submit', style: buttonStyle('primary', busy || !repository.trim()), disabled: busy || !repository.trim() }, h(GitBranch, { size: 14, 'aria-hidden': true }), '导入'), h('button', { type: 'button', style: iconButtonStyle, onClick: () => setRepositoryOpen(false), disabled: busy, title: '关闭仓库导入', 'aria-label': '关闭仓库导入' }, h(X, { size: 15, 'aria-hidden': true }))) : null, h('div', { style: { display: 'flex', gap: 10, flexWrap: 'wrap', alignItems: 'center' } }, h('div', { style: { position: 'relative', flex: '1 1 220px', display: 'flex', alignItems: 'center' } }, h(Search, { size: 14, 'aria-hidden': true, style: { position: 'absolute', left: 9, color: tokens.secondary, pointerEvents: 'none' } }), h('input', { type: 'search', value: query, placeholder: '搜索 skill…', 'aria-label': '搜索 skill', onChange: (event) => setQuery(event.currentTarget.value), style: inputStyle })), h('label', { style: { display: 'flex', flex: '1 1 220px', minWidth: 0, alignItems: 'center', gap: 8, fontSize: 13, color: tokens.secondary } }, h('span', { style: { flex: '0 0 auto' } }, '项目范围'), h('select', { value: projectRoot ?? '__global__', onChange: (event) => { const value = event.currentTarget.value; if (value === '__global__') {\n userChoseGlobal.current = true;\n setProjectRoot(undefined);\n }\n else {\n userChoseGlobal.current = false;\n setProjectRoot(value);\n } }, style: { ...selectStyle, flex: '1 1 auto', minWidth: 0, maxWidth: 'none' } }, h('option', { value: '__global__' }, '只看全局'), ...workspaces.items.map(workspace => h('option', { key: workspace.workspaceId, value: workspace.path }, workspace.title)))), h('div', { role: 'group', 'aria-label': '视图切换', style: { display: 'flex', flex: '0 0 auto', border: `1px solid ${tokens.border}`, borderRadius: 8, overflow: 'hidden' } }, h('button', { type: 'button', onClick: () => setView('flat'), 'aria-pressed': view === 'flat', title: '平铺列表', style: { ...iconButtonStyle, width: 32, height: 32, borderRadius: 0, color: view === 'flat' ? tokens.accent : tokens.secondary, background: view === 'flat' ? 'rgba(99, 102, 241, .12)' : 'transparent' } }, h(List, { size: 15, 'aria-hidden': true })), h('button', { type: 'button', onClick: () => setView('grouped'), 'aria-pressed': view === 'grouped', title: '按来源仓库分组', style: { ...iconButtonStyle, width: 32, height: 32, borderRadius: 0, color: view === 'grouped' ? tokens.accent : tokens.secondary, background: view === 'grouped' ? 'rgba(99, 102, 241, .12)' : 'transparent' } }, h(Folder, { size: 15, 'aria-hidden': true })))), error ? h('div', { role: 'alert', style: { display: 'flex', gap: 8, alignItems: 'center', margin: 0, padding: '9px 12px', borderRadius: 8, fontSize: 13, color: tokens.danger, background: 'rgba(220, 38, 38, .08)', border: '1px solid rgba(220, 38, 38, .28)' } }, h(AlertCircle, { size: 15, 'aria-hidden': true }), error) : null, h('section', { style: { display: 'grid', width: '100%', minWidth: 0, gap: 8 }, 'aria-label': '已安装 skill' }, catalog === null\n ? h('p', { style: { margin: 0, padding: '24px 0', textAlign: 'center', fontSize: 13, color: tokens.secondary } }, '正在读取…')\n : filtered.length === 0\n ? h(EmptyState, { hasAny: (catalog.entries.length ?? 0) > 0 })\n : view === 'flat'\n ? filtered.map(entry => h(SkillRow, rowProps(entry)))\n : groups.map(group => h('div', { key: group.key, style: { display: 'grid', gap: 8 } }, h('button', {\n type: 'button',\n onClick: () => setCollapsed(prev => ({ ...prev, [group.key]: !prev[group.key] })),\n 'aria-expanded': !collapsed[group.key],\n style: { display: 'flex', alignItems: 'center', gap: 8, padding: '6px 4px', border: 'none', background: 'transparent', color: 'inherit', cursor: 'pointer', fontSize: 13, fontWeight: 600, textAlign: 'left' },\n }, collapsed[group.key] ? h(ChevronRight, { size: 14, 'aria-hidden': true, style: { color: tokens.secondary, flex: '0 0 auto' } }) : h(ChevronDown, { size: 14, 'aria-hidden': true, style: { color: tokens.secondary, flex: '0 0 auto' } }), h(GitBranch, { size: 13, 'aria-hidden': true, style: { color: tokens.secondary, flex: '0 0 auto' } }), h('span', { title: group.key === '__local__' ? undefined : group.key, style: { ...monoStyle, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, group.label), h('span', { style: { color: tokens.secondary, fontWeight: 400, flex: '0 0 auto' } }, `${group.entries.length} 个`)), collapsed[group.key] ? null : group.entries.map(entry => h(SkillRow, rowProps(entry)))))));\n}\nfunction groupBySource(entries) {\n const groups = new Map();\n for (const entry of entries) {\n const key = entry.sourceType === 'git' && entry.sourceUrl ? entry.sourceUrl : '__local__';\n const label = key === '__local__' ? '本机导入' : shortRepoLabel(key);\n const group = groups.get(key) ?? { label, entries: [] };\n group.entries.push(entry);\n groups.set(key, group);\n }\n return [...groups.entries()]\n .map(([key, group]) => ({ key, label: group.label, entries: group.entries }))\n .sort((a, b) => (a.key === '__local__' ? 1 : b.key === '__local__' ? -1 : a.label.localeCompare(b.label)));\n}\nfunction shortRepoLabel(url) {\n const match = /^(?:https?:\\/\\/|git@|ssh:\\/\\/git@)?([^/:]+)[:/]([^/]+\\/[^/]+?)(?:\\.git)?\\/?$/.exec(url);\n return match ? `${match[2]} (${match[1]})` : url;\n}\nfunction EmptyState(props) {\n return h('div', { style: { display: 'grid', justifyItems: 'center', gap: 8, padding: '36px 16px', borderRadius: 10, border: `1px dashed ${tokens.borderStrong}`, color: tokens.secondary, textAlign: 'center' } }, h(PackageOpen, { size: 26, 'aria-hidden': true }), h('p', { style: { margin: 0, fontSize: 13, lineHeight: 1.5 } }, props.hasAny ? '没有匹配的 skill,试试调整搜索词。' : '还没有导入任何 skill。点击右上角「导入」,从本机目录开始。'));\n}\nfunction ComposerSkillButton(props) {\n const { session, useSessions, list, mutate } = props;\n const projectRoot = useSessions(state => projectRootForSession(state, session.sessionId));\n const [open, setOpen] = useState(false);\n const containerRef = useRef(null);\n useEffect(() => {\n if (!open)\n return;\n const onPointerDown = (event) => {\n if (containerRef.current && event.target instanceof Node && !containerRef.current.contains(event.target))\n setOpen(false);\n };\n const onKeyDown = (event) => { if (event.key === 'Escape')\n setOpen(false); };\n document.addEventListener('pointerdown', onPointerDown);\n document.addEventListener('keydown', onKeyDown);\n return () => {\n document.removeEventListener('pointerdown', onPointerDown);\n document.removeEventListener('keydown', onKeyDown);\n };\n }, [open]);\n return h('div', { ref: containerRef, style: { position: 'relative', display: 'inline-flex', marginLeft: -25 } }, h('button', {\n type: 'button',\n title: projectRoot ? '配置当前项目的 Skill' : '当前会话没有工作区',\n 'aria-label': '配置当前项目的 Skill',\n 'aria-expanded': open,\n disabled: !projectRoot,\n onClick: () => setOpen(value => !value),\n style: {\n display: 'grid',\n placeItems: 'center',\n flex: '0 0 auto',\n width: 28,\n height: 28,\n padding: 0,\n border: 'none',\n borderRadius: 999,\n background: open ? 'var(--dsw-alias-bg-active, rgba(255, 255, 255, .16))' : 'var(--dsw-specific-selector, rgba(255, 255, 255, .08))',\n color: 'var(--dsw-alias-label-primary, inherit)',\n cursor: projectRoot ? 'pointer' : 'default',\n opacity: projectRoot ? 1 : 0.5,\n },\n }, h(Wrench, { size: 16, 'aria-hidden': true })), open && projectRoot ? h(ProjectSkillPopover, { projectRoot, list, mutate, onClose: () => setOpen(false) }) : null);\n}\nfunction ProjectSkillPopover(props) {\n const { projectRoot, list, mutate, onClose } = props;\n const theme = currentThemeColors();\n const [catalog, setCatalog] = useState(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(null);\n useEffect(() => { ensureKeyframes(); }, []);\n const refresh = useCallback(async () => {\n setBusy(true);\n setError(null);\n try {\n setCatalog(await list(projectRoot));\n }\n catch (reason) {\n setError(messageOf(reason));\n }\n finally {\n setBusy(false);\n }\n }, [list, projectRoot]);\n useEffect(() => { void refresh(); }, [refresh]);\n const toggle = async (entry, enabled) => {\n setBusy(true);\n setError(null);\n try {\n setCatalog(await mutate('set-enabled', { name: entry.name, scope: 'project', projectRoot, enabled }));\n }\n catch (reason) {\n setError(messageOf(reason));\n }\n finally {\n setBusy(false);\n }\n };\n const enabledCount = projectPopoverEnabledCount(catalog?.entries ?? []);\n return h('section', { style: { position: 'absolute', zIndex: 50, left: 0, bottom: 40, width: 320, display: 'grid', gap: 6, padding: 12, border: `1px solid ${tokens.borderStrong}`, borderRadius: 12, background: theme.background, color: theme.color, boxShadow: '0 16px 40px rgba(0, 0, 0, .4)' }, 'aria-label': '当前项目 Skill' }, h('header', { style: { display: 'flex', justifyContent: 'space-between', gap: 8, alignItems: 'center', paddingBottom: 4 } }, h('div', { style: { display: 'flex', alignItems: 'center', gap: 7, minWidth: 0 } }, h(FolderGit, { size: 14, 'aria-hidden': true, style: { color: tokens.secondary, flex: '0 0 auto' } }), h('strong', { style: { fontSize: 13, fontWeight: 600 } }, '项目 Skill'), h('span', { style: { fontSize: 12, color: tokens.secondary } }, `${enabledCount}/${catalog?.entries.length ?? 0} 已启用`)), h('button', { type: 'button', onClick: onClose, style: iconButtonStyle, 'aria-label': '关闭项目 Skill', title: '关闭' }, h(X, { size: 14, 'aria-hidden': true }))), error ? h('div', { role: 'alert', style: { display: 'flex', gap: 6, alignItems: 'center', margin: 0, padding: '7px 9px', borderRadius: 7, fontSize: 12, color: tokens.danger, background: 'rgba(220, 38, 38, .08)' } }, h(AlertCircle, { size: 13, 'aria-hidden': true }), error) : null, h('div', { style: { display: 'grid', gap: 1, maxHeight: 280, overflowY: 'auto', margin: '0 -4px', padding: '0 4px' } }, catalog === null\n ? h('p', { style: { margin: 0, padding: '18px 0', textAlign: 'center', fontSize: 12, color: tokens.secondary } }, '正在读取…')\n : catalog.entries.length === 0\n ? h('p', { style: { margin: 0, padding: '18px 0', textAlign: 'center', fontSize: 12, color: tokens.secondary } }, '未导入 skill。请到「设置 → Skill 管理」导入。')\n : catalog.entries.map(entry => {\n const row = projectPopoverRow(entry, busy);\n return h('label', { key: entry.name, style: { display: 'grid', gridTemplateColumns: '14px minmax(0, 1fr) 30px', gap: 8, alignItems: 'center', padding: '7px 6px', borderRadius: 7, fontSize: 13, cursor: row.disabled ? 'default' : 'pointer' }, title: entry.description || entry.name }, h(Puzzle, { size: 13, 'aria-hidden': true, style: { color: entry.effectiveEnabled ? tokens.accent : tokens.secondary } }), h('div', { style: { display: 'flex', alignItems: 'center', gap: 6, minWidth: 0 } }, h('span', { style: { minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, entry.name), row.badge ? h(StatusBadge, { active: true, icon: Globe, label: row.badge }) : null), h('input', { type: 'checkbox', checked: row.checked, disabled: row.disabled, onChange: (event) => void toggle(entry, event.currentTarget.checked), 'aria-label': `${entry.name} 项目开关`, title: row.checkboxTitle, style: checkboxStyle }));\n })), busy ? h('div', { style: { display: 'flex', justifyContent: 'flex-end', paddingTop: 2 } }, h(RefreshCw, { size: 12, 'aria-hidden': true, style: spinnerStyle })) : null);\n}\nfunction SkillRow(props) {\n const { entry, projectLabel, projectAvailable, busy, onGlobalChange, onProjectChange, onUpdate, onRemove } = props;\n return h('article', {\n className: 'dsh-skill-manager-row',\n style: {\n display: 'grid', gridTemplateColumns: '32px minmax(0, 1fr)', gap: 12, alignItems: 'center',\n width: '100%', minWidth: 0, maxWidth: '100%', overflow: 'hidden', boxSizing: 'border-box',\n padding: '12px 14px', borderRadius: 10, border: `1px solid ${tokens.border}`,\n background: 'transparent', transition: 'border-color .15s ease, background .15s ease',\n },\n }, h('div', { className: 'dsh-skill-manager-row-icon', style: { display: 'grid', placeItems: 'center', width: 32, height: 32, borderRadius: 8, color: entry.effectiveEnabled ? tokens.accent : tokens.secondary, background: entry.effectiveEnabled ? 'rgba(99, 102, 241, .1)' : 'rgba(148, 163, 184, .1)' } }, h(Puzzle, { size: 16, 'aria-hidden': true })), h('div', { style: { minWidth: 0, display: 'grid', gap: 4 } }, h('div', { style: { display: 'flex', alignItems: 'center', gap: 8, minWidth: 0, flexWrap: 'wrap' } }, h('strong', { style: { ...monoStyle, fontSize: 13, fontWeight: 600, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, entry.name), h(SourceBadge, { entry }), h(StatusBadge, { active: entry.globalEnabled, icon: Globe, label: '全局' }), projectAvailable ? h(StatusBadge, { active: entry.projectEnabled, icon: FolderGit, label: projectLabel }) : null), entry.description ? h('p', { style: { margin: 0, color: tokens.secondary, lineHeight: 1.45, fontSize: 12.5, display: '-webkit-box', WebkitLineClamp: 2, WebkitBoxOrient: 'vertical', overflow: 'hidden' } }, entry.description) : null), h('div', { className: 'dsh-skill-manager-row-actions', style: { gridColumn: '1 / -1', display: 'flex', width: '100%', minWidth: 0, justifyContent: 'flex-end', alignItems: 'center', gap: 10, flexWrap: 'wrap' } }, h('input', { type: 'checkbox', checked: entry.globalEnabled, disabled: busy, onChange: (event) => onGlobalChange(event.currentTarget.checked), 'aria-label': `${entry.name} 全局开关`, title: '全局启用', style: checkboxStyle }), projectAvailable ? h('input', { type: 'checkbox', checked: entry.projectEnabled, disabled: busy, onChange: (event) => onProjectChange(event.currentTarget.checked), 'aria-label': `${entry.name} 项目开关`, title: `${projectLabel} 启用`, style: checkboxStyle }) : null, h('button', { type: 'button', style: { ...iconButtonStyle, color: tokens.secondary }, disabled: busy, onClick: onUpdate, title: entry.updateSupported ? (entry.sourceType === 'git' ? '从远程仓库更新' : '从原始目录更新') : '选择来源目录并更新', 'aria-label': `更新 ${entry.name}` }, h(RefreshCw, { size: 15, 'aria-hidden': true })), h('button', { type: 'button', style: { ...iconButtonStyle, color: tokens.danger }, disabled: busy, onClick: onRemove, title: '从库中移除', 'aria-label': `移除 ${entry.name}` }, h(Trash2, { size: 15, 'aria-hidden': true }))));\n}\nfunction SourceBadge(props) {\n const remote = props.entry.sourceType === 'git';\n const local = props.entry.sourceType === 'local';\n const Icon = remote ? GitBranch : local ? FolderGit : AlertCircle;\n const label = remote ? 'Git' : local ? '本机' : '未知';\n const title = remote ? props.entry.sourceUrl : local ? props.entry.sourcePath : '来源未知,更新时需选择本机来源目录';\n return h('span', {\n title,\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 4, flex: '0 1 auto', maxWidth: '100%', overflow: 'hidden',\n padding: '2px 6px', borderRadius: 999, fontSize: 11, lineHeight: '16px', whiteSpace: 'nowrap',\n color: tokens.secondary, background: 'rgba(148, 163, 184, .09)',\n },\n }, h(Icon, { size: 11, 'aria-hidden': true }), label);\n}\nfunction StatusBadge(props) {\n const Icon = props.icon;\n return h('span', {\n title: props.active ? `${props.label}已启用` : `${props.label}未启用`,\n style: {\n display: 'inline-flex', alignItems: 'center', gap: 4, flex: '0 1 auto', maxWidth: '100%', overflow: 'hidden',\n padding: '2px 6px', borderRadius: 999, fontSize: 11, lineHeight: '16px', whiteSpace: 'nowrap',\n color: props.active ? tokens.success : tokens.secondary,\n background: props.active ? 'rgba(22, 163, 74, .1)' : 'rgba(148, 163, 184, .09)',\n border: `1px solid ${props.active ? 'rgba(22, 163, 74, .3)' : 'transparent'}`,\n },\n }, h(Icon, { size: 11, 'aria-hidden': true }), props.active ? `${props.label}开` : `${props.label}关`);\n}\nfunction currentThemeColors() {\n if (typeof document === 'undefined')\n return { background: '#151517', color: '#f9fafb' };\n const style = getComputedStyle(document.body);\n return {\n background: style.backgroundColor || '#151517',\n color: style.color || '#f9fafb',\n };\n}\nfunction messageOf(reason) {\n return reason instanceof Error ? reason.message : String(reason);\n}\n"],"x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24],"mappings":"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"}
@@ -11,6 +11,10 @@ import GitBranch from 'lucide-react/dist/esm/icons/git-branch.mjs';
11
11
  import PackageOpen from 'lucide-react/dist/esm/icons/package-open.mjs';
12
12
  import Puzzle from 'lucide-react/dist/esm/icons/puzzle.mjs';
13
13
  import AlertCircle from 'lucide-react/dist/esm/icons/alert-circle.mjs';
14
+ import List from 'lucide-react/dist/esm/icons/list.mjs';
15
+ import Folder from 'lucide-react/dist/esm/icons/folder.mjs';
16
+ import ChevronDown from 'lucide-react/dist/esm/icons/chevron-down.mjs';
17
+ import ChevronRight from 'lucide-react/dist/esm/icons/chevron-right.mjs';
14
18
  import { projectPopoverEnabledCount, projectPopoverRow } from './popover.js';
15
19
  import { projectRootForSession } from './session.js';
16
20
  export const inject = ['connection', 'slots', 'workspaces'];
@@ -107,6 +111,8 @@ function SkillManagerSection(props) {
107
111
  const [error, setError] = useState(null);
108
112
  const [repositoryOpen, setRepositoryOpen] = useState(false);
109
113
  const [repository, setRepository] = useState('');
114
+ const [view, setView] = useState('flat');
115
+ const [collapsed, setCollapsed] = useState({});
110
116
  useEffect(() => { ensureKeyframes(); }, []);
111
117
  // 追踪用户是否主动选过「只看全局」,避免 useEffect 把它重置回第一个工作区
112
118
  const userChoseGlobal = useRef(false);
@@ -149,6 +155,7 @@ function SkillManagerSection(props) {
149
155
  }, []);
150
156
  const normalizedQuery = query.trim().toLocaleLowerCase();
151
157
  const filtered = (catalog?.entries ?? []).filter(entry => normalizedQuery.length === 0 || `${entry.name} ${entry.description}`.toLocaleLowerCase().includes(normalizedQuery));
158
+ const groups = groupBySource(filtered);
152
159
  const importSkill = async () => {
153
160
  const path = await pickDirectory();
154
161
  if (path)
@@ -171,6 +178,17 @@ function SkillManagerSection(props) {
171
178
  await run(() => mutate('update', { name: entry.name, path, projectRoot }));
172
179
  };
173
180
  const selectedWorkspace = workspaces.items.find(item => item.path === projectRoot);
181
+ const rowProps = (entry) => ({
182
+ key: entry.name,
183
+ entry,
184
+ projectLabel: selectedWorkspace?.title ?? '当前项目',
185
+ projectAvailable: projectRoot !== undefined,
186
+ busy,
187
+ onGlobalChange: (enabled) => void run(() => mutate('set-enabled', { name: entry.name, scope: 'global', projectRoot, enabled })),
188
+ onProjectChange: (enabled) => void run(() => mutate('set-enabled', { name: entry.name, scope: 'project', projectRoot, enabled })),
189
+ onUpdate: () => void updateSkill(entry),
190
+ onRemove: () => void run(() => mutate('remove', { name: entry.name, projectRoot })),
191
+ });
174
192
  return h('div', { style: panelStyle, 'aria-busy': busy }, h('header', { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', gap: 16, flexWrap: 'wrap' } }, h('div', { style: { display: 'flex', alignItems: 'center', gap: 10, minWidth: 0 } }, h(Puzzle, { size: 20, 'aria-hidden': true }), h('h2', { style: { margin: 0, fontSize: 18, fontWeight: 600 } }, 'Skill 管理'), busy ? h(RefreshCw, { size: 14, 'aria-hidden': true, style: spinnerStyle }) : null), h('div', { style: { display: 'flex', gap: 8, flexWrap: 'wrap' } }, h('button', { type: 'button', style: buttonStyle('ghost', busy || !loopback), onClick: () => setRepositoryOpen(value => !value), disabled: busy || !loopback, title: loopback ? '从 Git 仓库导入 skill' : '仅在本机连接时可导入' }, h(GitBranch, { size: 14, 'aria-hidden': true }), '仓库'), h('button', { type: 'button', style: buttonStyle('primary', busy || !loopback), onClick: importSkill, disabled: busy || !loopback, title: loopback ? '从本机目录导入 skill' : '仅在本机连接时可导入' }, h(Plus, { size: 14, 'aria-hidden': true }), '本机'))), h('p', { style: { margin: '-8px 0 0', fontSize: 13, color: tokens.secondary, lineHeight: 1.5 } }, '从本机目录或 Git 仓库导入 skill,并按「全局」或「项目」范围启用。'), repositoryOpen ? h('form', { onSubmit: importRepository, style: { display: 'flex', flexWrap: 'wrap', gap: 8, alignItems: 'center' } }, h('input', {
175
193
  type: 'text',
176
194
  value: repository,
@@ -187,21 +205,35 @@ function SkillManagerSection(props) {
187
205
  else {
188
206
  userChoseGlobal.current = false;
189
207
  setProjectRoot(value);
190
- } }, style: { ...selectStyle, flex: '1 1 auto', minWidth: 0, maxWidth: 'none' } }, h('option', { value: '__global__' }, '只看全局'), ...workspaces.items.map(workspace => h('option', { key: workspace.workspaceId, value: workspace.path }, workspace.title))))), error ? h('div', { role: 'alert', style: { display: 'flex', gap: 8, alignItems: 'center', margin: 0, padding: '9px 12px', borderRadius: 8, fontSize: 13, color: tokens.danger, background: 'rgba(220, 38, 38, .08)', border: '1px solid rgba(220, 38, 38, .28)' } }, h(AlertCircle, { size: 15, 'aria-hidden': true }), error) : null, h('section', { style: { display: 'grid', width: '100%', minWidth: 0, gap: 8 }, 'aria-label': '已安装 skill' }, catalog === null
208
+ } }, style: { ...selectStyle, flex: '1 1 auto', minWidth: 0, maxWidth: 'none' } }, h('option', { value: '__global__' }, '只看全局'), ...workspaces.items.map(workspace => h('option', { key: workspace.workspaceId, value: workspace.path }, workspace.title)))), h('div', { role: 'group', 'aria-label': '视图切换', style: { display: 'flex', flex: '0 0 auto', border: `1px solid ${tokens.border}`, borderRadius: 8, overflow: 'hidden' } }, h('button', { type: 'button', onClick: () => setView('flat'), 'aria-pressed': view === 'flat', title: '平铺列表', style: { ...iconButtonStyle, width: 32, height: 32, borderRadius: 0, color: view === 'flat' ? tokens.accent : tokens.secondary, background: view === 'flat' ? 'rgba(99, 102, 241, .12)' : 'transparent' } }, h(List, { size: 15, 'aria-hidden': true })), h('button', { type: 'button', onClick: () => setView('grouped'), 'aria-pressed': view === 'grouped', title: '按来源仓库分组', style: { ...iconButtonStyle, width: 32, height: 32, borderRadius: 0, color: view === 'grouped' ? tokens.accent : tokens.secondary, background: view === 'grouped' ? 'rgba(99, 102, 241, .12)' : 'transparent' } }, h(Folder, { size: 15, 'aria-hidden': true })))), error ? h('div', { role: 'alert', style: { display: 'flex', gap: 8, alignItems: 'center', margin: 0, padding: '9px 12px', borderRadius: 8, fontSize: 13, color: tokens.danger, background: 'rgba(220, 38, 38, .08)', border: '1px solid rgba(220, 38, 38, .28)' } }, h(AlertCircle, { size: 15, 'aria-hidden': true }), error) : null, h('section', { style: { display: 'grid', width: '100%', minWidth: 0, gap: 8 }, 'aria-label': '已安装 skill' }, catalog === null
191
209
  ? h('p', { style: { margin: 0, padding: '24px 0', textAlign: 'center', fontSize: 13, color: tokens.secondary } }, '正在读取…')
192
210
  : filtered.length === 0
193
211
  ? h(EmptyState, { hasAny: (catalog.entries.length ?? 0) > 0 })
194
- : filtered.map(entry => h(SkillRow, {
195
- key: entry.name,
196
- entry,
197
- projectLabel: selectedWorkspace?.title ?? '当前项目',
198
- projectAvailable: projectRoot !== undefined,
199
- busy,
200
- onGlobalChange: enabled => void run(() => mutate('set-enabled', { name: entry.name, scope: 'global', projectRoot, enabled })),
201
- onProjectChange: enabled => void run(() => mutate('set-enabled', { name: entry.name, scope: 'project', projectRoot, enabled })),
202
- onUpdate: () => void updateSkill(entry),
203
- onRemove: () => void run(() => mutate('remove', { name: entry.name, projectRoot })),
204
- }))));
212
+ : view === 'flat'
213
+ ? filtered.map(entry => h(SkillRow, rowProps(entry)))
214
+ : groups.map(group => h('div', { key: group.key, style: { display: 'grid', gap: 8 } }, h('button', {
215
+ type: 'button',
216
+ onClick: () => setCollapsed(prev => ({ ...prev, [group.key]: !prev[group.key] })),
217
+ 'aria-expanded': !collapsed[group.key],
218
+ style: { display: 'flex', alignItems: 'center', gap: 8, padding: '6px 4px', border: 'none', background: 'transparent', color: 'inherit', cursor: 'pointer', fontSize: 13, fontWeight: 600, textAlign: 'left' },
219
+ }, collapsed[group.key] ? h(ChevronRight, { size: 14, 'aria-hidden': true, style: { color: tokens.secondary, flex: '0 0 auto' } }) : h(ChevronDown, { size: 14, 'aria-hidden': true, style: { color: tokens.secondary, flex: '0 0 auto' } }), h(GitBranch, { size: 13, 'aria-hidden': true, style: { color: tokens.secondary, flex: '0 0 auto' } }), h('span', { title: group.key === '__local__' ? undefined : group.key, style: { ...monoStyle, minWidth: 0, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' } }, group.label), h('span', { style: { color: tokens.secondary, fontWeight: 400, flex: '0 0 auto' } }, `${group.entries.length} 个`)), collapsed[group.key] ? null : group.entries.map(entry => h(SkillRow, rowProps(entry)))))));
220
+ }
221
+ function groupBySource(entries) {
222
+ const groups = new Map();
223
+ for (const entry of entries) {
224
+ const key = entry.sourceType === 'git' && entry.sourceUrl ? entry.sourceUrl : '__local__';
225
+ const label = key === '__local__' ? '本机导入' : shortRepoLabel(key);
226
+ const group = groups.get(key) ?? { label, entries: [] };
227
+ group.entries.push(entry);
228
+ groups.set(key, group);
229
+ }
230
+ return [...groups.entries()]
231
+ .map(([key, group]) => ({ key, label: group.label, entries: group.entries }))
232
+ .sort((a, b) => (a.key === '__local__' ? 1 : b.key === '__local__' ? -1 : a.label.localeCompare(b.label)));
233
+ }
234
+ function shortRepoLabel(url) {
235
+ const match = /^(?:https?:\/\/|git@|ssh:\/\/git@)?([^/:]+)[:/]([^/]+\/[^/]+?)(?:\.git)?\/?$/.exec(url);
236
+ return match ? `${match[2]} (${match[1]})` : url;
205
237
  }
206
238
  function EmptyState(props) {
207
239
  return h('div', { style: { display: 'grid', justifyItems: 'center', gap: 8, padding: '36px 16px', borderRadius: 10, border: `1px dashed ${tokens.borderStrong}`, color: tokens.secondary, textAlign: 'center' } }, h(PackageOpen, { size: 26, 'aria-hidden': true }), h('p', { style: { margin: 0, fontSize: 13, lineHeight: 1.5 } }, props.hasAny ? '没有匹配的 skill,试试调整搜索词。' : '还没有导入任何 skill。点击右上角「导入」,从本机目录开始。'));
@@ -1,9 +1,8 @@
1
1
  import type { SkillCatalogEntry } from '../types.js';
2
- export interface ProjectPopoverRowView {
3
- readonly checked: boolean;
4
- readonly disabled: boolean;
5
- readonly badge: '全局' | null;
6
- readonly checkboxTitle: string;
7
- }
8
- export declare function projectPopoverEnabledCount(entries: readonly Pick<SkillCatalogEntry, 'effectiveEnabled'>[]): number;
9
- export declare function projectPopoverRow(entry: Pick<SkillCatalogEntry, 'globalEnabled' | 'effectiveEnabled'>, busy?: boolean): ProjectPopoverRowView;
2
+ export declare const projectPopoverEnabledCount: (entries: readonly Pick<SkillCatalogEntry, "effectiveEnabled">[]) => number;
3
+ export declare const projectPopoverRow: (entry: Pick<SkillCatalogEntry, "globalEnabled" | "effectiveEnabled">, busy?: boolean) => {
4
+ checked: boolean;
5
+ disabled: boolean;
6
+ badge: string | null;
7
+ checkboxTitle: string;
8
+ };
@@ -1,11 +1,7 @@
1
- export function projectPopoverEnabledCount(entries) {
2
- return entries.filter(entry => entry.effectiveEnabled).length;
3
- }
4
- export function projectPopoverRow(entry, busy = false) {
5
- return {
6
- checked: entry.effectiveEnabled,
7
- disabled: busy || entry.globalEnabled,
8
- badge: entry.globalEnabled ? '全局' : null,
9
- checkboxTitle: entry.globalEnabled ? '全局已启用,请到 Skill 管理关闭' : '项目启用',
10
- };
11
- }
1
+ export const projectPopoverEnabledCount = (entries) => entries.filter(entry => entry.effectiveEnabled).length;
2
+ export const projectPopoverRow = (entry, busy = false) => ({
3
+ checked: entry.effectiveEnabled,
4
+ disabled: busy || entry.globalEnabled,
5
+ badge: entry.globalEnabled ? '全局' : null,
6
+ checkboxTitle: entry.globalEnabled ? '全局已启用,请到 Skill 管理关闭' : '项目启用',
7
+ });
@@ -1,2 +1,2 @@
1
1
  import type { SessionId, SessionListState } from '@deepseek-ai/dsh-client-runtime/client';
2
- export declare function projectRootForSession(state: SessionListState, sessionId: SessionId): string | undefined;
2
+ export declare const projectRootForSession: (state: SessionListState, sessionId: SessionId) => string | undefined;
@@ -1,3 +1 @@
1
- export function projectRootForSession(state, sessionId) {
2
- return state.byId[sessionId]?.cwd;
3
- }
1
+ export const projectRootForSession = (state, sessionId) => state.byId[sessionId]?.cwd;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-skills-manager",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "A DeepSeek Harness plugin for installing and managing skills by global or workspace scope.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -66,7 +66,6 @@
66
66
  "react": "^18.2.0"
67
67
  },
68
68
  "dependencies": {
69
- "lucide-react": "^1.31.0",
70
69
  "skills": "^1.5.22"
71
70
  },
72
71
  "devDependencies": {
@@ -82,6 +81,7 @@
82
81
  "@deepseek-ai/schemastery": "^3.18.1",
83
82
  "@types/node": "^22.0.0",
84
83
  "@types/react": "~18.3.1",
84
+ "lucide-react": "^1.31.0",
85
85
  "react": "^18.2.0",
86
86
  "tsdown": "^0.15.0",
87
87
  "typescript": "^5.9.0"