@godv61/dsh-task-engine 0.30.2 → 0.30.3

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
@@ -4379,7 +4379,22 @@ var sonarAnalyzerStatusSchema = external_exports.object({ profiles: external_exp
4379
4379
  language: external_exports.string(),
4380
4380
  active_rules: external_exports.number(),
4381
4381
  analyzer: external_exports.string()
4382
- })) });
4382
+ })), analyzed_languages: external_exports.array(external_exports.string()), other_profile_count: external_exports.number(), updated_at: external_exports.string().optional() });
4383
+ var sonarRuleUpdateInfoSchema = external_exports.object({ updated_at: external_exports.string().optional() });
4384
+ var sonarRuleRequestSchema = external_exports.object({ path: external_exports.string(), language: external_exports.string().optional() });
4385
+ var sonarRuleViewSchema = external_exports.object({
4386
+ profiles: external_exports.array(external_exports.object({
4387
+ key: external_exports.string(),
4388
+ name: external_exports.string(),
4389
+ language: external_exports.string(),
4390
+ active_rules: external_exports.number(),
4391
+ analyzed: external_exports.boolean()
4392
+ })),
4393
+ analyzed_languages: external_exports.array(external_exports.string()),
4394
+ selected_language: external_exports.string(),
4395
+ rule_total: external_exports.number(),
4396
+ rules: external_exports.array(external_exports.object({ key: external_exports.string(), name: external_exports.string(), language: external_exports.string(), severity: external_exports.string() }))
4397
+ });
4383
4398
  var projectSkillProfileRequestSchema = external_exports.object({ path: external_exports.string(), name: external_exports.string() });
4384
4399
  var projectSkillProfileWriteRequestSchema = projectSkillProfileRequestSchema.extend({
4385
4400
  profile: skillProfileSchema,
@@ -4460,6 +4475,25 @@ var TYPERT_REMOTE = {
4460
4475
  }],
4461
4476
  result: { mode: "strict", typeSymbol: `${PACKAGE}/types#SonarTokenInfo`, create: () => sonarTokenInfoSchema, schema: sonarTokenInfoSchema }
4462
4477
  },
4478
+ {
4479
+ id: `${PACKAGE}#task-engine/describeSonarRuleUpdate`,
4480
+ service: "taskEngineController",
4481
+ namespace: "task-engine",
4482
+ method: "describeSonarRuleUpdate",
4483
+ invocation: { kind: "direct" },
4484
+ parameters: [{
4485
+ name: "path",
4486
+ wire: "path",
4487
+ source: "json",
4488
+ codec: { mode: "strict", typeSymbol: "string", create: () => external_exports.string(), schema: external_exports.string() }
4489
+ }],
4490
+ result: {
4491
+ mode: "strict",
4492
+ typeSymbol: `${PACKAGE}/types#SonarRuleUpdateInfo`,
4493
+ create: () => sonarRuleUpdateInfoSchema,
4494
+ schema: sonarRuleUpdateInfoSchema
4495
+ }
4496
+ },
4463
4497
  {
4464
4498
  id: `${PACKAGE}#task-engine/prepareSonarAnalyzer`,
4465
4499
  service: "taskEngineController",
@@ -4479,6 +4513,44 @@ var TYPERT_REMOTE = {
4479
4513
  schema: sonarAnalyzerStatusSchema
4480
4514
  }
4481
4515
  },
4516
+ {
4517
+ id: `${PACKAGE}#task-engine/updateSonarRules`,
4518
+ service: "taskEngineController",
4519
+ namespace: "task-engine",
4520
+ method: "updateSonarRules",
4521
+ invocation: { kind: "direct" },
4522
+ parameters: [{
4523
+ name: "path",
4524
+ wire: "path",
4525
+ source: "json",
4526
+ codec: { mode: "strict", typeSymbol: "string", create: () => external_exports.string(), schema: external_exports.string() }
4527
+ }],
4528
+ result: {
4529
+ mode: "strict",
4530
+ typeSymbol: `${PACKAGE}/types#SonarAnalyzerStatus`,
4531
+ create: () => sonarAnalyzerStatusSchema,
4532
+ schema: sonarAnalyzerStatusSchema
4533
+ }
4534
+ },
4535
+ {
4536
+ id: `${PACKAGE}#task-engine/readSonarProjectRules`,
4537
+ service: "taskEngineController",
4538
+ namespace: "task-engine",
4539
+ method: "readSonarProjectRules",
4540
+ invocation: { kind: "direct" },
4541
+ parameters: [{
4542
+ name: "request",
4543
+ wire: "request",
4544
+ source: "json",
4545
+ codec: { mode: "strict", typeSymbol: `${PACKAGE}/types#SonarRuleRequest`, create: () => sonarRuleRequestSchema, schema: sonarRuleRequestSchema }
4546
+ }],
4547
+ result: {
4548
+ mode: "strict",
4549
+ typeSymbol: `${PACKAGE}/types#SonarRuleView`,
4550
+ create: () => sonarRuleViewSchema,
4551
+ schema: sonarRuleViewSchema
4552
+ }
4553
+ },
4482
4554
  {
4483
4555
  id: `${PACKAGE}#task-engine/readProjectSkillProfile`,
4484
4556
  service: "taskEngineController",
@@ -4842,8 +4914,8 @@ var TYPERT_REMOTE = {
4842
4914
  var remote_default = TYPERT_REMOTE;
4843
4915
 
4844
4916
  // src/client/Workbench.tsx
4845
- var import_react9 = require("react");
4846
- var import_dsh_client_ui_primitives6 = require("@deepseek-ai/dsh-client-ui-primitives");
4917
+ var import_react10 = require("react");
4918
+ var import_dsh_client_ui_primitives7 = require("@deepseek-ai/dsh-client-ui-primitives");
4847
4919
 
4848
4920
  // src/client/icons.ts
4849
4921
  var primitives = __toESM(require("@deepseek-ai/dsh-client-ui-primitives"), 1);
@@ -5110,8 +5182,8 @@ var styles = {
5110
5182
  };
5111
5183
 
5112
5184
  // src/client/AdaptivePanel.tsx
5113
- var import_react3 = require("react");
5114
- var import_dsh_client_ui_primitives2 = require("@deepseek-ai/dsh-client-ui-primitives");
5185
+ var import_react4 = require("react");
5186
+ var import_dsh_client_ui_primitives3 = require("@deepseek-ai/dsh-client-ui-primitives");
5115
5187
 
5116
5188
  // src/adaptive.ts
5117
5189
  var META_STAGES = {
@@ -5429,6 +5501,210 @@ function SkillRuleDialog({ skill, profile, rules, description, saveLabel, onSave
5429
5501
  );
5430
5502
  }
5431
5503
 
5504
+ // src/client/SonarRuleViewer.tsx
5505
+ var import_react3 = require("react");
5506
+ var import_dsh_client_ui_primitives2 = require("@deepseek-ai/dsh-client-ui-primitives");
5507
+ var muted = { fontSize: 12, color: "var(--dsw-alias-label-secondary)" };
5508
+ var outline = {
5509
+ border: "1px solid var(--dsw-alias-border-l2)",
5510
+ borderRadius: 7,
5511
+ background: "var(--dsw-alias-bg-layer-1)",
5512
+ color: "var(--dsw-alias-label-primary)"
5513
+ };
5514
+ function SonarRuleViewer({ workspace, host, remote, onClose }) {
5515
+ const [view, setView] = (0, import_react3.useState)(null);
5516
+ const [busy, setBusy] = (0, import_react3.useState)(true);
5517
+ const [error, setError] = (0, import_react3.useState)("");
5518
+ const [search, setSearch] = (0, import_react3.useState)("");
5519
+ const [showOther, setShowOther] = (0, import_react3.useState)(false);
5520
+ (0, import_react3.useEffect)(() => {
5521
+ let active = true;
5522
+ void remote.readSonarProjectRules({ path: workspace }).then((result) => {
5523
+ if (!active) return;
5524
+ setBusy(false);
5525
+ if (result.ok) setView(result.value);
5526
+ else setError(describeError(result.error));
5527
+ }, (failure) => {
5528
+ if (active) {
5529
+ setBusy(false);
5530
+ setError(describeError(failure));
5531
+ }
5532
+ });
5533
+ return () => {
5534
+ active = false;
5535
+ };
5536
+ }, [remote, workspace]);
5537
+ const selectLanguage = (language) => {
5538
+ if (busy || language === view?.selected_language) return;
5539
+ setBusy(true);
5540
+ setError("");
5541
+ setSearch("");
5542
+ void remote.readSonarProjectRules({ path: workspace, language }).then((result) => {
5543
+ setBusy(false);
5544
+ if (result.ok) setView(result.value);
5545
+ else setError(describeError(result.error));
5546
+ }, (failure) => {
5547
+ setBusy(false);
5548
+ setError(describeError(failure));
5549
+ });
5550
+ };
5551
+ const refreshRules = () => {
5552
+ if (busy) return;
5553
+ setBusy(true);
5554
+ setError("");
5555
+ void remote.readSonarProjectRules({ path: workspace, language: view?.selected_language || void 0 }).then((result) => {
5556
+ setBusy(false);
5557
+ if (result.ok) setView(result.value);
5558
+ else setError(describeError(result.error));
5559
+ }, (failure) => {
5560
+ setBusy(false);
5561
+ setError(describeError(failure));
5562
+ });
5563
+ };
5564
+ const hasAnalyzedProfiles = view?.profiles.some((profile2) => profile2.analyzed) ?? false;
5565
+ const profiles = view?.profiles.filter((profile2) => showOther || !hasAnalyzedProfiles || profile2.analyzed) ?? [];
5566
+ const query = search.trim().toLowerCase();
5567
+ const rules = view?.rules.filter((rule) => !query || `${rule.key} ${rule.name} ${rule.severity}`.toLowerCase().includes(query)) ?? [];
5568
+ const profile = view?.profiles.find((item) => item.language === view.selected_language);
5569
+ const profileUrl = profile ? `${host.replace(/\/$/u, "")}/profiles/show?name=${encodeURIComponent(profile.name)}&language=${encodeURIComponent(profile.language.toLowerCase())}` : "";
5570
+ return (0, import_react3.createElement)(
5571
+ "div",
5572
+ { role: "presentation", style: {
5573
+ position: "fixed",
5574
+ inset: 0,
5575
+ zIndex: 1e3,
5576
+ background: "rgba(0,0,0,.35)"
5577
+ }, onClick: onClose },
5578
+ (0, import_react3.createElement)(
5579
+ "section",
5580
+ {
5581
+ role: "dialog",
5582
+ "aria-modal": true,
5583
+ "aria-label": "\u67E5\u770B\u5F53\u524D\u9879\u76EE SonarQube \u89C4\u5219",
5584
+ onClick: (event) => event.stopPropagation(),
5585
+ style: {
5586
+ position: "absolute",
5587
+ right: 0,
5588
+ top: 0,
5589
+ bottom: 0,
5590
+ width: "min(760px, 96vw)",
5591
+ padding: 20,
5592
+ boxSizing: "border-box",
5593
+ background: "var(--dsw-alias-bg-layer-1)",
5594
+ color: "var(--dsw-alias-label-primary)",
5595
+ display: "flex",
5596
+ flexDirection: "column",
5597
+ gap: 12,
5598
+ boxShadow: "-8px 0 30px rgba(0,0,0,.14)"
5599
+ }
5600
+ },
5601
+ (0, import_react3.createElement)(
5602
+ "div",
5603
+ { style: { display: "flex", justifyContent: "space-between", alignItems: "center" } },
5604
+ (0, import_react3.createElement)("strong", null, "\u5F53\u524D\u9879\u76EE\u7684 SonarQube \u89C4\u5219"),
5605
+ (0, import_react3.createElement)(
5606
+ "div",
5607
+ { style: { display: "flex", gap: 8 } },
5608
+ (0, import_react3.createElement)(
5609
+ import_dsh_client_ui_primitives2.Button,
5610
+ { variant: "outline", size: "sm", disabled: busy, onClick: refreshRules },
5611
+ busy ? "\u8BFB\u53D6\u4E2D\u2026" : "\u5237\u65B0\u670D\u52A1\u5668\u6E05\u5355"
5612
+ ),
5613
+ (0, import_react3.createElement)(import_dsh_client_ui_primitives2.Button, { variant: "outline", size: "sm", onClick: onClose }, "\u5173\u95ED")
5614
+ )
5615
+ ),
5616
+ (0, import_react3.createElement)(
5617
+ "p",
5618
+ { style: { ...muted, margin: 0 } },
5619
+ "\u8FD9\u91CC\u5B9E\u65F6\u8BFB\u53D6\u5F53\u524D\u9879\u76EE Quality Profile \u4E2D\u542F\u7528\u7684\u89C4\u5219\uFF1B\u5237\u65B0\u6E05\u5355\u53EA\u66F4\u65B0\u9875\u9762\u663E\u793A\u3002\u672C\u5730\u5206\u6790\u5668\u4F7F\u7528\u65B0\u89C4\u5219\u8BF7\u8FD4\u56DE\u914D\u7F6E\u9875\u70B9\u51FB\u201C\u66F4\u65B0\u5F53\u524D\u9879\u76EE\u89C4\u5219\u201D\u3002Quality Gate \u662F\u626B\u63CF\u7ED3\u679C\u7684\u901A\u8FC7\u6761\u4EF6\u3002"
5620
+ ),
5621
+ error ? (0, import_react3.createElement)("div", { role: "alert", style: { color: "var(--dsw-alias-danger, #b42318)" } }, error) : null,
5622
+ busy && !view ? (0, import_react3.createElement)("div", { style: muted }, "\u6B63\u5728\u8BFB\u53D6\u5F53\u524D\u9879\u76EE\u7684\u8D28\u91CF\u914D\u7F6E\u548C\u89C4\u5219\u2026") : null,
5623
+ view ? (0, import_react3.createElement)(
5624
+ "div",
5625
+ { style: { display: "flex", flexDirection: "column", gap: 12, minHeight: 0, flex: 1 } },
5626
+ (0, import_react3.createElement)("div", { style: muted }, hasAnalyzedProfiles ? `\u6700\u8FD1\u4E00\u6B21\u670D\u52A1\u7AEF\u5206\u6790\u6D89\u53CA\uFF1A${view.analyzed_languages.join("\u3001")}\u3002\u9ED8\u8BA4\u53EA\u663E\u793A\u8FD9\u4E9B\u8BED\u8A00\u3002` : "\u670D\u52A1\u5668\u5C1A\u672A\u8FD4\u56DE\u53EF\u5339\u914D\u7684\u5DF2\u5206\u6790\u8BED\u8A00\uFF0C\u663E\u793A\u6240\u6709\u751F\u6548\u7684\u8BED\u8A00\u914D\u7F6E\u3002"),
5627
+ hasAnalyzedProfiles && view.profiles.some((item) => !item.analyzed) ? (0, import_react3.createElement)(
5628
+ "label",
5629
+ { style: muted },
5630
+ (0, import_react3.createElement)("input", {
5631
+ type: "checkbox",
5632
+ checked: showOther,
5633
+ onChange: (event) => setShowOther(event.target.checked)
5634
+ }),
5635
+ ` \u663E\u793A\u5176\u5B83\u8BED\u8A00\u914D\u7F6E\uFF08${view.profiles.filter((item) => !item.analyzed).length}\uFF09`
5636
+ ) : null,
5637
+ (0, import_react3.createElement)(
5638
+ "div",
5639
+ { style: { display: "flex", flexWrap: "wrap", gap: 6, maxHeight: 110, overflowY: "auto" } },
5640
+ ...profiles.map((item) => (0, import_react3.createElement)(
5641
+ "button",
5642
+ {
5643
+ key: item.key,
5644
+ type: "button",
5645
+ disabled: busy,
5646
+ onClick: () => selectLanguage(item.language),
5647
+ style: {
5648
+ ...outline,
5649
+ cursor: "pointer",
5650
+ padding: "5px 9px",
5651
+ fontWeight: item.language === view.selected_language ? 700 : 400,
5652
+ borderColor: item.language === view.selected_language ? "var(--dsw-alias-label-primary)" : void 0
5653
+ }
5654
+ },
5655
+ `${item.language} \xB7 ${item.active_rules}`
5656
+ ))
5657
+ ),
5658
+ profile ? (0, import_react3.createElement)(
5659
+ "div",
5660
+ { style: {
5661
+ ...outline,
5662
+ padding: 10,
5663
+ display: "flex",
5664
+ flexWrap: "wrap",
5665
+ gap: 8,
5666
+ justifyContent: "space-between",
5667
+ alignItems: "center"
5668
+ } },
5669
+ (0, import_react3.createElement)("span", null, `${profile.language} / ${profile.name}\uFF1A\u670D\u52A1\u5668\u542F\u7528 ${profile.active_rules} \u6761\uFF0C\u5DF2\u8BFB\u53D6 ${view.rule_total} \u6761`),
5670
+ (0, import_react3.createElement)("a", { href: profileUrl, target: "_blank", rel: "noopener noreferrer" }, "\u5728 SonarQube \u67E5\u770B\u914D\u7F6E")
5671
+ ) : null,
5672
+ profile && view.rule_total !== profile.active_rules ? (0, import_react3.createElement)("div", { role: "alert" }, "\u670D\u52A1\u7AEF\u914D\u7F6E\u7EDF\u8BA1\u4E0E\u89C4\u5219\u5217\u8868\u6570\u91CF\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u5237\u65B0\u540E\u6838\u5BF9\u3002") : null,
5673
+ (0, import_react3.createElement)("input", {
5674
+ type: "search",
5675
+ "aria-label": "\u641C\u7D22 SonarQube \u89C4\u5219\u7F16\u53F7\u6216\u540D\u79F0",
5676
+ placeholder: "\u641C\u7D22\u89C4\u5219\u7F16\u53F7\u3001\u540D\u79F0\u6216\u4E25\u91CD\u6027",
5677
+ value: search,
5678
+ onChange: (event) => setSearch(event.target.value),
5679
+ style: { ...outline, padding: "8px 10px", width: "100%", boxSizing: "border-box" }
5680
+ }),
5681
+ (0, import_react3.createElement)("div", { style: muted }, busy ? "\u6B63\u5728\u5207\u6362\u8BED\u8A00\u2026" : `\u663E\u793A ${rules.length} / ${view.rule_total} \u6761\u89C4\u5219`),
5682
+ (0, import_react3.createElement)(
5683
+ "div",
5684
+ { style: { flex: 1, minHeight: 0, overflowY: "auto", display: "flex", flexDirection: "column", gap: 6 } },
5685
+ ...rules.map((rule) => (0, import_react3.createElement)(
5686
+ "a",
5687
+ {
5688
+ key: rule.key,
5689
+ href: `${host.replace(/\/$/u, "")}/coding_rules?selected=${encodeURIComponent(rule.key)}`,
5690
+ target: "_blank",
5691
+ rel: "noopener noreferrer",
5692
+ style: { ...outline, padding: "9px 11px", textDecoration: "none" }
5693
+ },
5694
+ (0, import_react3.createElement)("strong", null, rule.name),
5695
+ (0, import_react3.createElement)("div", { style: muted }, `${rule.key} \xB7 ${rule.severity}`)
5696
+ ))
5697
+ ),
5698
+ (0, import_react3.createElement)(
5699
+ "p",
5700
+ { style: { ...muted, margin: 0 } },
5701
+ "\u672C\u5730\u5206\u6790\u5668\u72B6\u6001\u6309\u8BED\u8A00\u5224\u65AD\uFF1B\u5373\u4F7F\u663E\u793A SYNCED\uFF0C\u4E5F\u4E0D\u4FDD\u8BC1\u8FD9\u91CC\u6BCF\u6761\u670D\u52A1\u7AEF\u89C4\u5219\u90FD\u80FD\u5728\u63D0\u4EA4\u524D\u672C\u5730\u6267\u884C\u3002"
5702
+ )
5703
+ ) : null
5704
+ )
5705
+ );
5706
+ }
5707
+
5432
5708
  // src/client/AdaptivePanel.tsx
5433
5709
  var card = {
5434
5710
  border: "1px solid var(--dsw-alias-border-l2)",
@@ -5454,33 +5730,42 @@ function effectiveSource(entries, name) {
5454
5730
  return entries.filter((entry) => entry.name === name).sort((a, b) => SOURCE_ORDER.indexOf(a.source) - SOURCE_ORDER.indexOf(b.source))[0]?.sourceLabel ?? "\u7F3A\u5931";
5455
5731
  }
5456
5732
  function AdaptivePanel({ workspace, remote, onOpenInit }) {
5457
- const [view, setView] = (0, import_react3.useState)(null);
5458
- const [draft, setDraft] = (0, import_react3.useState)({});
5459
- const [skills, setSkills] = (0, import_react3.useState)([]);
5460
- const [rules, setRules] = (0, import_react3.useState)([]);
5461
- const [selected, setSelected] = (0, import_react3.useState)(null);
5462
- const [activeMeta, setActiveMeta] = (0, import_react3.useState)("requirements-analysis");
5463
- const [metaQuery, setMetaQuery] = (0, import_react3.useState)("");
5464
- const [skillQuery, setSkillQuery] = (0, import_react3.useState)("");
5465
- const [loading, setLoading] = (0, import_react3.useState)(true);
5466
- const [saving, setSaving] = (0, import_react3.useState)(false);
5467
- const [dirty, setDirty] = (0, import_react3.useState)(false);
5468
- const [message, setMessage] = (0, import_react3.useState)("");
5469
- const [sonarToken, setSonarToken] = (0, import_react3.useState)("");
5470
- const [tokenInfo, setTokenInfo] = (0, import_react3.useState)(null);
5471
- const [tokenBusy, setTokenBusy] = (0, import_react3.useState)(false);
5472
- const [analyzerBusy, setAnalyzerBusy] = (0, import_react3.useState)(false);
5473
- const [analyzerProfiles, setAnalyzerProfiles] = (0, import_react3.useState)(null);
5474
- const refresh = (0, import_react3.useCallback)(() => {
5733
+ const [view, setView] = (0, import_react4.useState)(null);
5734
+ const [draft, setDraft] = (0, import_react4.useState)({});
5735
+ const [skills, setSkills] = (0, import_react4.useState)([]);
5736
+ const [rules, setRules] = (0, import_react4.useState)([]);
5737
+ const [selected, setSelected] = (0, import_react4.useState)(null);
5738
+ const [activeMeta, setActiveMeta] = (0, import_react4.useState)("requirements-analysis");
5739
+ const [metaQuery, setMetaQuery] = (0, import_react4.useState)("");
5740
+ const [skillQuery, setSkillQuery] = (0, import_react4.useState)("");
5741
+ const [loading, setLoading] = (0, import_react4.useState)(true);
5742
+ const [saving, setSaving] = (0, import_react4.useState)(false);
5743
+ const [dirty, setDirty] = (0, import_react4.useState)(false);
5744
+ const [message, setMessage] = (0, import_react4.useState)("");
5745
+ const [sonarToken, setSonarToken] = (0, import_react4.useState)("");
5746
+ const [tokenInfo, setTokenInfo] = (0, import_react4.useState)(null);
5747
+ const [tokenBusy, setTokenBusy] = (0, import_react4.useState)(false);
5748
+ const [analyzerOperation, setAnalyzerOperation] = (0, import_react4.useState)("");
5749
+ const [analyzerProfiles, setAnalyzerProfiles] = (0, import_react4.useState)(null);
5750
+ const [analyzerOtherCount, setAnalyzerOtherCount] = (0, import_react4.useState)(0);
5751
+ const [analyzerUpdatedAt, setAnalyzerUpdatedAt] = (0, import_react4.useState)("");
5752
+ const [ruleViewerOpen, setRuleViewerOpen] = (0, import_react4.useState)(false);
5753
+ const refresh = (0, import_react4.useCallback)(() => {
5475
5754
  setLoading(true);
5476
5755
  setMessage("");
5477
5756
  setSonarToken("");
5478
5757
  setTokenInfo(null);
5479
5758
  setAnalyzerProfiles(null);
5759
+ setAnalyzerOtherCount(0);
5760
+ setAnalyzerUpdatedAt("");
5480
5761
  void remote.describeSonarToken(workspace).then((result) => {
5481
5762
  if (result.ok) setTokenInfo(result.value);
5482
5763
  }, () => {
5483
5764
  });
5765
+ void remote.describeSonarRuleUpdate(workspace).then((result) => {
5766
+ if (result.ok) setAnalyzerUpdatedAt(result.value.updated_at ?? "");
5767
+ }, () => {
5768
+ });
5484
5769
  void Promise.all([remote.readAdaptive(workspace), remote.listSkills(workspace), remote.listRules(workspace)]).then(([config, catalog, ruleCatalog]) => {
5485
5770
  setLoading(false);
5486
5771
  if (!config.ok) {
@@ -5505,7 +5790,7 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5505
5790
  setMessage("\u8BFB\u53D6\u5931\u8D25\uFF1A" + describeError(error));
5506
5791
  });
5507
5792
  }, [remote, workspace]);
5508
- (0, import_react3.useEffect)(() => {
5793
+ (0, import_react4.useEffect)(() => {
5509
5794
  refresh();
5510
5795
  }, [refresh]);
5511
5796
  const update = (config) => {
@@ -5670,22 +5955,46 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5670
5955
  setMessage("\u8BF7\u5148\u4FDD\u5B58 SonarQube \u5BA1\u6838\u914D\u7F6E\uFF0C\u518D\u68C0\u67E5\u672C\u5730\u5206\u6790\u5668\u3002");
5671
5956
  return;
5672
5957
  }
5673
- setAnalyzerBusy(true);
5958
+ setAnalyzerOperation("prepare");
5674
5959
  setAnalyzerProfiles(null);
5675
5960
  setMessage("\u6B63\u5728\u5B89\u88C5\u6216\u68C0\u67E5\u672C\u5730\u5206\u6790\u5668\uFF0C\u5E76\u8FDE\u63A5\u5F53\u524D\u9879\u76EE\u7684 SonarQube\uFF1B\u9996\u6B21\u4E0B\u8F7D\u53EF\u80FD\u9700\u8981\u8F83\u957F\u65F6\u95F4\u3002");
5676
5961
  void remote.prepareSonarAnalyzer(workspace).then((result) => {
5677
- setAnalyzerBusy(false);
5962
+ setAnalyzerOperation("");
5678
5963
  if (!result.ok) {
5679
5964
  setMessage("\u672C\u5730\u5206\u6790\u5668\u68C0\u67E5\u5931\u8D25\uFF1A" + describeError(result.error));
5680
5965
  return;
5681
5966
  }
5682
5967
  setAnalyzerProfiles(result.value.profiles);
5683
- setMessage("\u5DF2\u8FDE\u63A5 SonarQube\uFF1B\u8BF7\u67E5\u770B\u4E0B\u65B9\u5404\u8BED\u8A00\u7684\u672C\u5730\u5206\u6790\u5668\u72B6\u6001\u3002");
5968
+ setAnalyzerOtherCount(result.value.other_profile_count);
5969
+ setAnalyzerUpdatedAt(result.value.updated_at ?? "");
5970
+ setMessage("\u5DF2\u8FDE\u63A5 SonarQube\uFF1B\u4E0B\u65B9\u4F18\u5148\u663E\u793A\u672C\u9879\u76EE\u6700\u8FD1\u4E00\u6B21\u5206\u6790\u6D89\u53CA\u7684\u8BED\u8A00\u3002");
5684
5971
  }, (error) => {
5685
- setAnalyzerBusy(false);
5972
+ setAnalyzerOperation("");
5686
5973
  setMessage("\u672C\u5730\u5206\u6790\u5668\u68C0\u67E5\u5931\u8D25\uFF1A" + describeError(error));
5687
5974
  });
5688
5975
  };
5976
+ const updateRules = () => {
5977
+ if (dirty) {
5978
+ setMessage("\u8BF7\u5148\u4FDD\u5B58 SonarQube \u5BA1\u6838\u914D\u7F6E\uFF0C\u518D\u66F4\u65B0\u89C4\u5219\u3002");
5979
+ return;
5980
+ }
5981
+ setAnalyzerOperation("update");
5982
+ setMessage("\u6B63\u5728\u4ECE\u5F53\u524D SonarQube \u9879\u76EE\u91CD\u65B0\u540C\u6B65\u89C4\u5219\uFF1B\u5B8C\u6210\u540E\u540E\u7EED\u5BA1\u6838\u4F1A\u4F7F\u7528\u65B0\u914D\u7F6E\u3002");
5983
+ void remote.updateSonarRules(workspace).then((result) => {
5984
+ setAnalyzerOperation("");
5985
+ if (!result.ok) {
5986
+ setMessage("\u66F4\u65B0\u89C4\u5219\u5931\u8D25\uFF1A" + describeError(result.error));
5987
+ return;
5988
+ }
5989
+ setAnalyzerProfiles(result.value.profiles);
5990
+ setAnalyzerOtherCount(result.value.other_profile_count);
5991
+ setAnalyzerUpdatedAt(result.value.updated_at ?? "");
5992
+ setMessage("\u5F53\u524D\u9879\u76EE\u7684\u672C\u5730\u89C4\u5219\u5DF2\u66F4\u65B0\uFF1B\u540E\u7EED\u4EE3\u7801\u5BA1\u6838\u5C06\u4F7F\u7528\u8FD9\u6B21\u540C\u6B65\u7684\u914D\u7F6E\u3002");
5993
+ }, (error) => {
5994
+ setAnalyzerOperation("");
5995
+ setMessage("\u66F4\u65B0\u89C4\u5219\u5931\u8D25\uFF1A" + describeError(error));
5996
+ });
5997
+ };
5689
5998
  const candidates = [...new Set(skills.map((skill) => skill.name))].filter((name) => name !== "eng-delivery" && !(name in META_STAGES)).sort();
5690
5999
  const stageQuery = metaQuery.trim().toLowerCase();
5691
6000
  const visibleStages = Object.entries(META_STAGES).filter(([id, stage]) => !stageQuery || `${id} ${stage} ${(draft.meta_bindings?.[id] ?? []).join(" ")}`.toLowerCase().includes(stageQuery));
@@ -5694,34 +6003,34 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5694
6003
  const candidateQuery = skillQuery.trim().toLowerCase();
5695
6004
  const matchingCandidates = candidates.filter((name) => !mounted.includes(name) && (!candidateQuery || name.toLowerCase().includes(candidateQuery) || skills.some((skill) => skill.name === name && `${skill.description} ${skill.sourceLabel}`.toLowerCase().includes(candidateQuery))));
5696
6005
  const sonar = draft.sonar ?? {};
5697
- return (0, import_react3.createElement)(
6006
+ return (0, import_react4.createElement)(
5698
6007
  "div",
5699
6008
  { style: { ...styles.section, display: "flex", flexDirection: "column", gap: 16 } },
5700
- (0, import_react3.createElement)(
6009
+ (0, import_react4.createElement)(
5701
6010
  "div",
5702
6011
  { style: row },
5703
- (0, import_react3.createElement)(import_dsh_client_ui_primitives2.Button, { variant: "outline", size: "sm", onClick: onOpenInit }, "\u521D\u59CB\u5316\u9879\u76EE Skill / Rule"),
5704
- (0, import_react3.createElement)("span", { style: label }, "\u626B\u63CF\u9879\u76EE\u540E\u5148\u9884\u89C8\uFF0C\u786E\u8BA4\u540E\u5199\u5165\u3002")
6012
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, { variant: "outline", size: "sm", onClick: onOpenInit }, "\u521D\u59CB\u5316\u9879\u76EE Skill / Rule"),
6013
+ (0, import_react4.createElement)("span", { style: label }, "\u626B\u63CF\u9879\u76EE\u540E\u5148\u9884\u89C8\uFF0C\u786E\u8BA4\u540E\u5199\u5165\u3002")
5705
6014
  ),
5706
- (0, import_react3.createElement)(
6015
+ (0, import_react4.createElement)(
5707
6016
  "details",
5708
6017
  { style: card },
5709
- (0, import_react3.createElement)("summary", { style: { cursor: "pointer", fontWeight: 600 } }, "\u6309\u9700\u6C42\u9009\u62E9\u6D41\u7A0B \xB7 \u67E5\u770B\u56DB\u6863\u9636\u6BB5"),
5710
- (0, import_react3.createElement)("span", { style: label }, "\u6BCF\u4E2A\u4EFB\u52A1\u5355\u72EC\u9009\u62E9\u590D\u6742\u5EA6\u5E76\u51BB\u7ED3\u9636\u6BB5\u548C\u6280\u80FD\uFF1B\u4E0D\u540C\u4F1A\u8BDD\u53EF\u8D70\u4E0D\u540C\u6D41\u7A0B\u3002"),
5711
- (0, import_react3.createElement)("div", { style: grid }, ...(view?.grades ?? []).map((grade) => (0, import_react3.createElement)(
6018
+ (0, import_react4.createElement)("summary", { style: { cursor: "pointer", fontWeight: 600 } }, "\u6309\u9700\u6C42\u9009\u62E9\u6D41\u7A0B \xB7 \u67E5\u770B\u56DB\u6863\u9636\u6BB5"),
6019
+ (0, import_react4.createElement)("span", { style: label }, "\u6BCF\u4E2A\u4EFB\u52A1\u5355\u72EC\u9009\u62E9\u590D\u6742\u5EA6\u5E76\u51BB\u7ED3\u9636\u6BB5\u548C\u6280\u80FD\uFF1B\u4E0D\u540C\u4F1A\u8BDD\u53EF\u8D70\u4E0D\u540C\u6D41\u7A0B\u3002"),
6020
+ (0, import_react4.createElement)("div", { style: grid }, ...(view?.grades ?? []).map((grade) => (0, import_react4.createElement)(
5712
6021
  "div",
5713
6022
  { key: grade.id, style: { ...card, gap: 5 } },
5714
- (0, import_react3.createElement)("strong", null, `${grade.label} \xB7 ${grade.id}`),
5715
- (0, import_react3.createElement)("span", { style: label }, grade.guidance),
5716
- (0, import_react3.createElement)("span", { style: { fontSize: 12 } }, grade.stages.join(" \u2192 "))
6023
+ (0, import_react4.createElement)("strong", null, `${grade.label} \xB7 ${grade.id}`),
6024
+ (0, import_react4.createElement)("span", { style: label }, grade.guidance),
6025
+ (0, import_react4.createElement)("span", { style: { fontSize: 12 } }, grade.stages.join(" \u2192 "))
5717
6026
  )))
5718
6027
  ),
5719
- (0, import_react3.createElement)(
6028
+ (0, import_react4.createElement)(
5720
6029
  "div",
5721
6030
  { style: card },
5722
- (0, import_react3.createElement)("strong", null, "\u5143\u6280\u80FD\u4E0E\u9879\u76EE\u6280\u80FD"),
5723
- (0, import_react3.createElement)("span", { style: label }, "\u6BCF\u4E2A\u5143\u6280\u80FD\u59CB\u7EC8\u52A0\u8F7D\u540C\u540D\u6838\u5FC3 Skill\uFF1B\u540C\u540D\u9879\u76EE Skill \u8986\u76D6\u7528\u6237\u4E0E\u5185\u7F6E\u7248\u672C\u3002\u9644\u52A0\u6280\u80FD\u6309\u540D\u79F0\u6302\u8F7D\uFF0C\u5B9E\u9645\u6765\u6E90\u5728\u4EFB\u52A1\u521B\u5EFA\u65F6\u89E3\u6790\u3002Rule \u4FDD\u5B58\u5728\u5BF9\u5E94 Skill \u7684 profile.json\u3002"),
5724
- (0, import_react3.createElement)("input", {
6031
+ (0, import_react4.createElement)("strong", null, "\u5143\u6280\u80FD\u4E0E\u9879\u76EE\u6280\u80FD"),
6032
+ (0, import_react4.createElement)("span", { style: label }, "\u6BCF\u4E2A\u5143\u6280\u80FD\u59CB\u7EC8\u52A0\u8F7D\u540C\u540D\u6838\u5FC3 Skill\uFF1B\u540C\u540D\u9879\u76EE Skill \u8986\u76D6\u7528\u6237\u4E0E\u5185\u7F6E\u7248\u672C\u3002\u9644\u52A0\u6280\u80FD\u6309\u540D\u79F0\u6302\u8F7D\uFF0C\u5B9E\u9645\u6765\u6E90\u5728\u4EFB\u52A1\u521B\u5EFA\u65F6\u89E3\u6790\u3002Rule \u4FDD\u5B58\u5728\u5BF9\u5E94 Skill \u7684 profile.json\u3002"),
6033
+ (0, import_react4.createElement)("input", {
5725
6034
  className: "te-input",
5726
6035
  type: "search",
5727
6036
  "aria-label": "\u641C\u7D22\u5143\u6280\u80FD\u6216\u5DF2\u6302\u8F7D\u6280\u80FD",
@@ -5729,13 +6038,13 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5729
6038
  value: metaQuery,
5730
6039
  onChange: (event) => setMetaQuery(event.target.value)
5731
6040
  }),
5732
- (0, import_react3.createElement)(
6041
+ (0, import_react4.createElement)(
5733
6042
  "div",
5734
6043
  { className: "te-meta-layout" },
5735
- (0, import_react3.createElement)(
6044
+ (0, import_react4.createElement)(
5736
6045
  "nav",
5737
6046
  { className: "te-meta-nav", "aria-label": "\u5143\u6280\u80FD\u9636\u6BB5" },
5738
- ...visibleStages.map(([id, stage]) => (0, import_react3.createElement)(
6047
+ ...visibleStages.map(([id, stage]) => (0, import_react4.createElement)(
5739
6048
  "button",
5740
6049
  {
5741
6050
  key: id,
@@ -5747,45 +6056,45 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5747
6056
  }
5748
6057
  },
5749
6058
  stage,
5750
- (0, import_react3.createElement)("small", null, `\u5DF2\u6302\u8F7D ${(draft.meta_bindings?.[id] ?? []).length} \u4E2A Skill`)
6059
+ (0, import_react4.createElement)("small", null, `\u5DF2\u6302\u8F7D ${(draft.meta_bindings?.[id] ?? []).length} \u4E2A Skill`)
5751
6060
  )),
5752
- visibleStages.length === 0 ? (0, import_react3.createElement)("span", { style: label }, "\u6CA1\u6709\u5339\u914D\u7684\u9636\u6BB5\u3002") : null
6061
+ visibleStages.length === 0 ? (0, import_react4.createElement)("span", { style: label }, "\u6CA1\u6709\u5339\u914D\u7684\u9636\u6BB5\u3002") : null
5753
6062
  ),
5754
- visibleMeta ? (0, import_react3.createElement)(
6063
+ visibleMeta ? (0, import_react4.createElement)(
5755
6064
  "div",
5756
6065
  { className: "te-meta-detail" },
5757
- (0, import_react3.createElement)(
6066
+ (0, import_react4.createElement)(
5758
6067
  "div",
5759
6068
  null,
5760
- (0, import_react3.createElement)("strong", null, META_STAGES[visibleMeta]),
5761
- (0, import_react3.createElement)("div", { style: label }, "\u6838\u5FC3 Skill \u4E0E\u9644\u52A0 Skill \u7684 Rule \u5206\u522B\u4FDD\u5B58\u5728\u5404\u81EA\u7684\u914D\u7F6E\u4E2D\u3002")
6069
+ (0, import_react4.createElement)("strong", null, META_STAGES[visibleMeta]),
6070
+ (0, import_react4.createElement)("div", { style: label }, "\u6838\u5FC3 Skill \u4E0E\u9644\u52A0 Skill \u7684 Rule \u5206\u522B\u4FDD\u5B58\u5728\u5404\u81EA\u7684\u914D\u7F6E\u4E2D\u3002")
5762
6071
  ),
5763
- (0, import_react3.createElement)(
6072
+ (0, import_react4.createElement)(
5764
6073
  "div",
5765
6074
  { className: "te-meta-skill-row" },
5766
- (0, import_react3.createElement)(
6075
+ (0, import_react4.createElement)(
5767
6076
  "span",
5768
6077
  null,
5769
- (0, import_react3.createElement)("strong", null, visibleMeta),
5770
- (0, import_react3.createElement)("small", { style: { ...label, display: "block" } }, `\u6838\u5FC3 \xB7 ${effectiveSource(skills, visibleMeta)}`)
6078
+ (0, import_react4.createElement)("strong", null, visibleMeta),
6079
+ (0, import_react4.createElement)("small", { style: { ...label, display: "block" } }, `\u6838\u5FC3 \xB7 ${effectiveSource(skills, visibleMeta)}`)
5771
6080
  ),
5772
- (0, import_react3.createElement)(import_dsh_client_ui_primitives2.Button, { variant: "outline", size: "sm", onClick: () => openRules(visibleMeta) }, "\u914D\u7F6E Rule")
6081
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, { variant: "outline", size: "sm", onClick: () => openRules(visibleMeta) }, "\u914D\u7F6E Rule")
5773
6082
  ),
5774
- (0, import_react3.createElement)("strong", { style: { fontSize: 13 } }, `\u9644\u52A0 Skill \xB7 ${mounted.length}`),
5775
- ...mounted.map((name) => (0, import_react3.createElement)(
6083
+ (0, import_react4.createElement)("strong", { style: { fontSize: 13 } }, `\u9644\u52A0 Skill \xB7 ${mounted.length}`),
6084
+ ...mounted.map((name) => (0, import_react4.createElement)(
5776
6085
  "div",
5777
6086
  { key: name, className: "te-meta-skill-row" },
5778
- (0, import_react3.createElement)(
6087
+ (0, import_react4.createElement)(
5779
6088
  "span",
5780
6089
  null,
5781
- (0, import_react3.createElement)("strong", null, name),
5782
- (0, import_react3.createElement)("small", { style: { ...label, display: "block" } }, effectiveSource(skills, name))
6090
+ (0, import_react4.createElement)("strong", null, name),
6091
+ (0, import_react4.createElement)("small", { style: { ...label, display: "block" } }, effectiveSource(skills, name))
5783
6092
  ),
5784
- (0, import_react3.createElement)(
6093
+ (0, import_react4.createElement)(
5785
6094
  "div",
5786
6095
  { className: "te-meta-skill-actions" },
5787
- (0, import_react3.createElement)(import_dsh_client_ui_primitives2.Button, { variant: "outline", size: "sm", onClick: () => openRules(name) }, "\u914D\u7F6E Rule"),
5788
- (0, import_react3.createElement)("button", {
6096
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, { variant: "outline", size: "sm", onClick: () => openRules(name) }, "\u914D\u7F6E Rule"),
6097
+ (0, import_react4.createElement)("button", {
5789
6098
  type: "button",
5790
6099
  className: "te-transfer-remove",
5791
6100
  "aria-label": `\u4ECE${META_STAGES[visibleMeta]}\u79FB\u9664 ${name}`,
@@ -5793,12 +6102,12 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5793
6102
  }, "\xD7")
5794
6103
  )
5795
6104
  )),
5796
- mounted.length === 0 ? (0, import_react3.createElement)("span", { style: label }, "\u5C1A\u672A\u6302\u8F7D\u9644\u52A0 Skill\u3002") : null,
5797
- (0, import_react3.createElement)(
6105
+ mounted.length === 0 ? (0, import_react4.createElement)("span", { style: label }, "\u5C1A\u672A\u6302\u8F7D\u9644\u52A0 Skill\u3002") : null,
6106
+ (0, import_react4.createElement)(
5798
6107
  "div",
5799
6108
  { style: { display: "flex", flexDirection: "column", gap: 7 } },
5800
- (0, import_react3.createElement)("strong", { style: { fontSize: 13 } }, "\u6302\u8F7D\u9644\u52A0 Skill"),
5801
- (0, import_react3.createElement)("input", {
6109
+ (0, import_react4.createElement)("strong", { style: { fontSize: 13 } }, "\u6302\u8F7D\u9644\u52A0 Skill"),
6110
+ (0, import_react4.createElement)("input", {
5802
6111
  className: "te-input",
5803
6112
  type: "search",
5804
6113
  "aria-label": "\u641C\u7D22\u53EF\u6302\u8F7D\u6280\u80FD",
@@ -5806,38 +6115,38 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5806
6115
  value: skillQuery,
5807
6116
  onChange: (event) => setSkillQuery(event.target.value)
5808
6117
  }),
5809
- (0, import_react3.createElement)("span", { style: label }, `\u53EF\u9009 ${matchingCandidates.length} \u4E2A${matchingCandidates.length > 12 ? "\uFF0C\u5148\u663E\u793A\u524D 12 \u4E2A\uFF1B\u53EF\u7EE7\u7EED\u8F93\u5165\u7F29\u5C0F\u8303\u56F4" : ""}`),
5810
- (0, import_react3.createElement)(
6118
+ (0, import_react4.createElement)("span", { style: label }, `\u53EF\u9009 ${matchingCandidates.length} \u4E2A${matchingCandidates.length > 12 ? "\uFF0C\u5148\u663E\u793A\u524D 12 \u4E2A\uFF1B\u53EF\u7EE7\u7EED\u8F93\u5165\u7F29\u5C0F\u8303\u56F4" : ""}`),
6119
+ (0, import_react4.createElement)(
5811
6120
  "div",
5812
6121
  { className: "te-meta-candidates" },
5813
- ...matchingCandidates.slice(0, 12).map((name) => (0, import_react3.createElement)(
6122
+ ...matchingCandidates.slice(0, 12).map((name) => (0, import_react4.createElement)(
5814
6123
  "div",
5815
6124
  { key: name, className: "te-meta-candidate" },
5816
- (0, import_react3.createElement)(
6125
+ (0, import_react4.createElement)(
5817
6126
  "span",
5818
6127
  null,
5819
- (0, import_react3.createElement)("strong", null, name),
5820
- (0, import_react3.createElement)("small", null, effectiveSource(skills, name))
6128
+ (0, import_react4.createElement)("strong", null, name),
6129
+ (0, import_react4.createElement)("small", null, effectiveSource(skills, name))
5821
6130
  ),
5822
- (0, import_react3.createElement)(import_dsh_client_ui_primitives2.Button, { variant: "outline", size: "sm", onClick: () => addSkill(visibleMeta, name) }, "\u6302\u8F7D")
6131
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, { variant: "outline", size: "sm", onClick: () => addSkill(visibleMeta, name) }, "\u6302\u8F7D")
5823
6132
  )),
5824
- matchingCandidates.length === 0 ? (0, import_react3.createElement)("span", { style: label }, "\u6CA1\u6709\u5339\u914D\u7684 Skill\u3002") : null
6133
+ matchingCandidates.length === 0 ? (0, import_react4.createElement)("span", { style: label }, "\u6CA1\u6709\u5339\u914D\u7684 Skill\u3002") : null
5825
6134
  )
5826
6135
  )
5827
6136
  ) : null
5828
6137
  )
5829
6138
  ),
5830
- (0, import_react3.createElement)(
6139
+ (0, import_react4.createElement)(
5831
6140
  "div",
5832
6141
  { style: card },
5833
- (0, import_react3.createElement)(
6142
+ (0, import_react4.createElement)(
5834
6143
  "div",
5835
6144
  { style: row },
5836
- (0, import_react3.createElement)("strong", null, "SonarQube \u5BA1\u6838"),
5837
- (0, import_react3.createElement)(
6145
+ (0, import_react4.createElement)("strong", null, "SonarQube \u5BA1\u6838"),
6146
+ (0, import_react4.createElement)(
5838
6147
  "label",
5839
6148
  { style: row },
5840
- (0, import_react3.createElement)("input", {
6149
+ (0, import_react4.createElement)("input", {
5841
6150
  type: "checkbox",
5842
6151
  checked: sonar.enabled === true,
5843
6152
  onChange: (event) => updateSonar({ enabled: event.target.checked })
@@ -5845,49 +6154,49 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5845
6154
  "\u542F\u7528\uFF08\u4EC5\u4EE3\u7801\u5BA1\u6838\u9636\u6BB5\uFF09"
5846
6155
  )
5847
6156
  ),
5848
- (0, import_react3.createElement)("span", { style: label }, "\u6D4B\u8BD5\u901A\u8FC7\u540E\uFF0C\u4EE3\u7801\u5BA1\u6838\u5143\u6280\u80FD\u4F1A\u68C0\u67E5\u63D0\u4EA4\u524D\u7684\u65B0\u589E\u4EE3\u7801\u3002\u9996\u6B21\u5BA1\u6838\u81EA\u52A8\u51C6\u5907\u672C\u5730\u5206\u6790\u7EC4\u4EF6\uFF0C\u5E76\u4ECE SonarQube \u540C\u6B65\u5F53\u524D\u9879\u76EE\u7684\u89C4\u5219\u3002Token \u6309\u9879\u76EE\u4FDD\u5B58\u5728\u672C\u673A DSH \u51ED\u636E\u5B58\u50A8\u3002"),
5849
- sonar.enabled === true && sonar.source && sonar.source !== "ide-local" ? (0, import_react3.createElement)(
6157
+ (0, import_react4.createElement)("span", { style: label }, "\u6D4B\u8BD5\u901A\u8FC7\u540E\uFF0C\u4EE3\u7801\u5BA1\u6838\u5143\u6280\u80FD\u4F1A\u68C0\u67E5\u63D0\u4EA4\u524D\u7684\u65B0\u589E\u4EE3\u7801\u3002\u9996\u6B21\u5BA1\u6838\u81EA\u52A8\u51C6\u5907\u672C\u5730\u5206\u6790\u7EC4\u4EF6\uFF0C\u5E76\u4ECE SonarQube \u540C\u6B65\u5F53\u524D\u9879\u76EE\u7684\u89C4\u5219\u3002Token \u6309\u9879\u76EE\u4FDD\u5B58\u5728\u672C\u673A DSH \u51ED\u636E\u5B58\u50A8\u3002"),
6158
+ sonar.enabled === true && sonar.source && sonar.source !== "ide-local" ? (0, import_react4.createElement)(
5850
6159
  "span",
5851
6160
  { style: label },
5852
6161
  "\u6B64\u9879\u76EE\u4ECD\u662F\u65E7\u5BA1\u6838\u6A21\u5F0F\uFF1B\u4FDD\u5B58\u914D\u7F6E\u540E\uFF0C\u65B0\u4EFB\u52A1\u5C06\u4F7F\u7528\u63D0\u4EA4\u524D\u672C\u5730\u5BA1\u6838\u3002\u5DF2\u6709\u4EFB\u52A1\u6309\u521B\u5EFA\u65F6\u7684\u914D\u7F6E\u7EE7\u7EED\u3002"
5853
6162
  ) : null,
5854
- sonar.enabled === true ? (0, import_react3.createElement)(
6163
+ sonar.enabled === true ? (0, import_react4.createElement)(
5855
6164
  "div",
5856
6165
  { style: grid },
5857
- ...[["host_url", "\u670D\u52A1\u5730\u5740", "https://sonar.example"], ["project_key", "\u9879\u76EE Key", "my-project"]].map(([key, title, placeholder]) => (0, import_react3.createElement)(
6166
+ ...[["host_url", "\u670D\u52A1\u5730\u5740", "https://sonar.example"], ["project_key", "\u9879\u76EE Key", "my-project"]].map(([key, title, placeholder]) => (0, import_react4.createElement)(
5858
6167
  "label",
5859
6168
  { key, style: { display: "flex", flexDirection: "column", gap: 4 } },
5860
- (0, import_react3.createElement)("span", { style: label }, title),
5861
- (0, import_react3.createElement)("input", {
6169
+ (0, import_react4.createElement)("span", { style: label }, title),
6170
+ (0, import_react4.createElement)("input", {
5862
6171
  style: input,
5863
6172
  value: sonar[key] ?? "",
5864
6173
  placeholder,
5865
6174
  onChange: (event) => updateSonar({ [key]: event.target.value })
5866
6175
  })
5867
6176
  )),
5868
- (0, import_react3.createElement)(
6177
+ (0, import_react4.createElement)(
5869
6178
  "details",
5870
6179
  { style: { gridColumn: "1 / -1" } },
5871
- (0, import_react3.createElement)("summary", null, "\u9AD8\u7EA7\u8BBE\u7F6E\uFF1A\u65B0\u589E\u4EE3\u7801\u53C2\u8003\u7248\u672C\u4E0E\u5BA1\u6838\u8303\u56F4"),
5872
- (0, import_react3.createElement)(
6180
+ (0, import_react4.createElement)("summary", null, "\u9AD8\u7EA7\u8BBE\u7F6E\uFF1A\u65B0\u589E\u4EE3\u7801\u53C2\u8003\u7248\u672C\u4E0E\u5BA1\u6838\u8303\u56F4"),
6181
+ (0, import_react4.createElement)(
5873
6182
  "div",
5874
6183
  { style: { ...grid, marginTop: 8 } },
5875
- (0, import_react3.createElement)(
6184
+ (0, import_react4.createElement)(
5876
6185
  "label",
5877
6186
  { style: { display: "flex", flexDirection: "column", gap: 4 } },
5878
- (0, import_react3.createElement)("span", { style: label }, "Git \u53C2\u8003\u7248\u672C\uFF08\u9ED8\u8BA4 HEAD\uFF0C\u5373\u672A\u63D0\u4EA4\u53D8\u66F4\uFF09"),
5879
- (0, import_react3.createElement)("input", {
6187
+ (0, import_react4.createElement)("span", { style: label }, "Git \u53C2\u8003\u7248\u672C\uFF08\u9ED8\u8BA4 HEAD\uFF0C\u5373\u672A\u63D0\u4EA4\u53D8\u66F4\uFF09"),
6188
+ (0, import_react4.createElement)("input", {
5880
6189
  style: input,
5881
6190
  value: sonar.reference_branch ?? "HEAD",
5882
6191
  placeholder: "HEAD",
5883
6192
  onChange: (event) => updateSonar({ reference_branch: event.target.value })
5884
6193
  })
5885
6194
  ),
5886
- (0, import_react3.createElement)(
6195
+ (0, import_react4.createElement)(
5887
6196
  "label",
5888
6197
  { style: { display: "flex", flexDirection: "column", gap: 4 } },
5889
- (0, import_react3.createElement)("span", { style: label }, "\u5BA1\u6838\u8DEF\u5F84\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF1B\u7559\u7A7A\u4E3A\u672C\u6B21\u4EFB\u52A1\u7684\u5168\u90E8\u4EE3\u7801\uFF09"),
5890
- (0, import_react3.createElement)("textarea", {
6198
+ (0, import_react4.createElement)("span", { style: label }, "\u5BA1\u6838\u8DEF\u5F84\uFF08\u6BCF\u884C\u4E00\u4E2A\uFF1B\u7559\u7A7A\u4E3A\u672C\u6B21\u4EFB\u52A1\u7684\u5168\u90E8\u4EE3\u7801\uFF09"),
6199
+ (0, import_react4.createElement)("textarea", {
5891
6200
  style: { ...input, minHeight: 76 },
5892
6201
  value: (sonar.include_paths ?? []).join("\n"),
5893
6202
  onChange: (event) => updateSonar({
@@ -5897,37 +6206,59 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5897
6206
  )
5898
6207
  )
5899
6208
  ),
5900
- (0, import_react3.createElement)(
6209
+ (0, import_react4.createElement)(
5901
6210
  "span",
5902
6211
  { style: { ...label, gridColumn: "1 / -1" } },
5903
6212
  "\u65E0\u9700\u5B89\u88C5 IDEA\u3001Maven \u6216 SonarScanner\u3002\u9996\u6B21\u5BA1\u6838\u4F1A\u4E0B\u8F7D\u5B98\u65B9\u672C\u5730\u5206\u6790\u540E\u53F0\uFF1B\u8BED\u8A00\u5206\u6790\u5668\u7531\u540E\u53F0\u4ECE SonarQube \u540C\u6B65\u3002\u90E8\u5206\u670D\u52A1\u7AEF\u89C4\u5219\u65E0\u6CD5\u5728\u672C\u5730\u6267\u884C\uFF0C\u672C\u5730\u901A\u8FC7\u4E0D\u7B49\u4E8E\u670D\u52A1\u7AEF\u8D28\u91CF\u95E8\u7981\u901A\u8FC7\u3002"
5904
6213
  ),
5905
- (0, import_react3.createElement)(
6214
+ (0, import_react4.createElement)(
5906
6215
  "div",
5907
6216
  { style: { ...row, gridColumn: "1 / -1" } },
5908
- (0, import_react3.createElement)(import_dsh_client_ui_primitives2.Button, {
6217
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
5909
6218
  variant: "outline",
5910
6219
  size: "sm",
5911
- disabled: analyzerBusy || saving || dirty,
6220
+ disabled: !!analyzerOperation || saving || dirty,
5912
6221
  onClick: prepareAnalyzer
5913
- }, analyzerBusy ? "\u5B89\u88C5\u4E0E\u68C0\u67E5\u4E2D\u2026" : "\u5B89\u88C5\u6216\u68C0\u67E5\u672C\u5730\u5206\u6790\u5668"),
5914
- (0, import_react3.createElement)("span", { style: label }, "\u5148\u4FDD\u5B58\u670D\u52A1\u5730\u5740\u3001\u9879\u76EE Key \u548C Token\uFF1B\u68C0\u67E5\u4E0D\u4F1A\u5BA1\u6838\u6216\u4E0A\u4F20\u9879\u76EE\u4EE3\u7801\u3002")
6222
+ }, analyzerOperation === "prepare" ? "\u5B89\u88C5\u4E0E\u68C0\u67E5\u4E2D\u2026" : "\u5B89\u88C5\u6216\u68C0\u67E5\u672C\u5730\u5206\u6790\u5668"),
6223
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6224
+ variant: "outline",
6225
+ size: "sm",
6226
+ disabled: !!analyzerOperation || saving || dirty,
6227
+ onClick: updateRules
6228
+ }, analyzerOperation === "update" ? "\u89C4\u5219\u66F4\u65B0\u4E2D\u2026" : "\u66F4\u65B0\u5F53\u524D\u9879\u76EE\u89C4\u5219"),
6229
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6230
+ variant: "outline",
6231
+ size: "sm",
6232
+ disabled: saving || dirty,
6233
+ onClick: () => setRuleViewerOpen(true)
6234
+ }, "\u67E5\u770B\u5F53\u524D\u9879\u76EE\u89C4\u5219"),
6235
+ (0, import_react4.createElement)("span", { style: label }, "\u5148\u4FDD\u5B58\u670D\u52A1\u5730\u5740\u3001\u9879\u76EE Key \u548C Token\uFF1B\u68C0\u67E5\u4E0D\u4F1A\u5BA1\u6838\u6216\u4E0A\u4F20\u9879\u76EE\u4EE3\u7801\u3002")
5915
6236
  ),
5916
- analyzerProfiles ? (0, import_react3.createElement)(
6237
+ analyzerUpdatedAt && !dirty ? (0, import_react4.createElement)(
6238
+ "span",
6239
+ { style: { ...label, gridColumn: "1 / -1" } },
6240
+ `\u4E0A\u6B21\u624B\u52A8\u66F4\u65B0\uFF1A${new Date(analyzerUpdatedAt).toLocaleString()}`
6241
+ ) : null,
6242
+ analyzerProfiles ? (0, import_react4.createElement)(
5917
6243
  "div",
5918
6244
  { style: { ...label, gridColumn: "1 / -1" } },
5919
- analyzerProfiles.length ? analyzerProfiles.map((profile) => (0, import_react3.createElement)(
6245
+ analyzerProfiles.length ? analyzerProfiles.map((profile) => (0, import_react4.createElement)(
5920
6246
  "div",
5921
6247
  { key: profile.language },
5922
6248
  `${profile.language}\uFF1A\u670D\u52A1\u7AEF ${profile.active_rules} \u6761\u89C4\u5219\uFF1B\u672C\u5730\u5206\u6790\u5668 ${profile.analyzer}`
5923
6249
  )) : "\u9879\u76EE\u6CA1\u6709\u8FD4\u56DE\u5DF2\u542F\u7528\u89C4\u5219\u7684\u8BED\u8A00\u3002",
5924
- (0, import_react3.createElement)("div", null, "\u5DF2\u540C\u6B65\u8868\u793A\u8BE5\u8BED\u8A00\u5206\u6790\u5668\u53EF\u7528\uFF0C\u4E0D\u4EE3\u8868\u670D\u52A1\u7AEF\u5168\u90E8\u89C4\u5219\u90FD\u80FD\u5728\u672C\u5730\u6267\u884C\u3002")
6250
+ analyzerOtherCount ? (0, import_react4.createElement)(
6251
+ "div",
6252
+ null,
6253
+ `\u5176\u5B83 ${analyzerOtherCount} \u4E2A\u8BED\u8A00\u914D\u7F6E\u5DF2\u6536\u8D77\uFF1B\u53EF\u5728\u201C\u67E5\u770B\u5F53\u524D\u9879\u76EE\u89C4\u5219\u201D\u4E2D\u663E\u793A\u3002`
6254
+ ) : null,
6255
+ (0, import_react4.createElement)("div", null, "\u5DF2\u540C\u6B65\u8868\u793A\u8BE5\u8BED\u8A00\u5206\u6790\u5668\u53EF\u7528\uFF0C\u4E0D\u4EE3\u8868\u670D\u52A1\u7AEF\u5168\u90E8\u89C4\u5219\u90FD\u80FD\u5728\u672C\u5730\u6267\u884C\u3002")
5925
6256
  ) : null,
5926
- (0, import_react3.createElement)(
6257
+ (0, import_react4.createElement)(
5927
6258
  "div",
5928
6259
  { style: { display: "flex", flexDirection: "column", gap: 5 } },
5929
- (0, import_react3.createElement)("span", { style: label }, `\u5F53\u524D\u9879\u76EE Token\uFF1A${tokenInfo === null ? "\u72B6\u6001\u4E0D\u53EF\u7528" : tokenInfo.configured ? "\u5DF2\u914D\u7F6E" : "\u672A\u914D\u7F6E"}`),
5930
- (0, import_react3.createElement)("input", {
6260
+ (0, import_react4.createElement)("span", { style: label }, `\u5F53\u524D\u9879\u76EE Token\uFF1A${tokenInfo === null ? "\u72B6\u6001\u4E0D\u53EF\u7528" : tokenInfo.configured ? "\u5DF2\u914D\u7F6E" : "\u672A\u914D\u7F6E"}`),
6261
+ (0, import_react4.createElement)("input", {
5931
6262
  type: "password",
5932
6263
  autoComplete: "new-password",
5933
6264
  style: input,
@@ -5935,16 +6266,16 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5935
6266
  placeholder: "\u8F93\u5165\u7528\u6237\u4EE4\u724C\uFF08\u4FDD\u5B58\u540E\u4E0D\u56DE\u663E\uFF09",
5936
6267
  onChange: (event) => setSonarToken(event.target.value)
5937
6268
  }),
5938
- (0, import_react3.createElement)(
6269
+ (0, import_react4.createElement)(
5939
6270
  "div",
5940
6271
  { style: row },
5941
- (0, import_react3.createElement)(import_dsh_client_ui_primitives2.Button, {
6272
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
5942
6273
  variant: "outline",
5943
6274
  size: "sm",
5944
6275
  disabled: tokenBusy || !sonarToken.trim() || tokenInfo?.writable === false,
5945
6276
  onClick: saveToken
5946
6277
  }, tokenBusy ? "\u5904\u7406\u4E2D\u2026" : "\u4FDD\u5B58 Token"),
5947
- tokenInfo?.configured ? (0, import_react3.createElement)(import_dsh_client_ui_primitives2.Button, {
6278
+ tokenInfo?.configured ? (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
5948
6279
  variant: "outline",
5949
6280
  size: "sm",
5950
6281
  disabled: tokenBusy || tokenInfo.writable === false,
@@ -5954,20 +6285,21 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5954
6285
  )
5955
6286
  ) : null
5956
6287
  ),
5957
- (0, import_react3.createElement)(
6288
+ (0, import_react4.createElement)(
5958
6289
  "div",
5959
6290
  { className: "te-adaptive-savebar" },
5960
- (0, import_react3.createElement)(import_dsh_client_ui_primitives2.Button, { variant: "outline", size: "sm", disabled: loading || saving, onClick: refresh }, "\u5237\u65B0"),
5961
- (0, import_react3.createElement)(
5962
- import_dsh_client_ui_primitives2.Button,
6291
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, { variant: "outline", size: "sm", disabled: loading || saving, onClick: refresh }, "\u5237\u65B0"),
6292
+ (0, import_react4.createElement)(
6293
+ import_dsh_client_ui_primitives3.Button,
5963
6294
  { variant: "primary", size: "sm", disabled: loading || saving || !dirty, onClick: save },
5964
6295
  saving ? "\u4FDD\u5B58\u4E2D\u2026" : "\u4FDD\u5B58\u81EA\u9002\u5E94\u914D\u7F6E"
5965
6296
  ),
5966
- (0, import_react3.createElement)("span", { style: label }, dirty ? "\u6709\u672A\u4FDD\u5B58\u7684\u9879\u76EE\u914D\u7F6E" : "\u9879\u76EE\u914D\u7F6E\u5DF2\u4FDD\u5B58"),
5967
- message ? (0, import_react3.createElement)("span", { role: "status", style: { ...label, flexBasis: "100%" } }, message) : null
6297
+ (0, import_react4.createElement)("span", { style: label }, dirty ? "\u6709\u672A\u4FDD\u5B58\u7684\u9879\u76EE\u914D\u7F6E" : "\u9879\u76EE\u914D\u7F6E\u5DF2\u4FDD\u5B58"),
6298
+ message ? (0, import_react4.createElement)("span", { role: "status", style: { ...label, flexBasis: "100%" } }, message) : null
5968
6299
  ),
5969
- view?.problems.length ? (0, import_react3.createElement)("p", { role: "alert", style: styles.status }, view.problems.join("\uFF1B")) : null,
5970
- selected ? (0, import_react3.createElement)(SkillRuleDialog, {
6300
+ view?.problems.length ? (0, import_react4.createElement)("p", { role: "alert", style: styles.status }, view.problems.join("\uFF1B")) : null,
6301
+ ruleViewerOpen && sonar.enabled === true && sonar.host_url ? (0, import_react4.createElement)(SonarRuleViewer, { workspace, host: sonar.host_url, remote, onClose: () => setRuleViewerOpen(false) }) : null,
6302
+ selected ? (0, import_react4.createElement)(SkillRuleDialog, {
5971
6303
  key: `${selected.skill.source}:${selected.skill.name}`,
5972
6304
  skill: selected.skill,
5973
6305
  profile: selected.profile,
@@ -5981,8 +6313,8 @@ function AdaptivePanel({ workspace, remote, onOpenInit }) {
5981
6313
  }
5982
6314
 
5983
6315
  // src/client/InitPanel.tsx
5984
- var import_react4 = require("react");
5985
- var import_dsh_client_ui_primitives3 = require("@deepseek-ai/dsh-client-ui-primitives");
6316
+ var import_react5 = require("react");
6317
+ var import_dsh_client_ui_primitives4 = require("@deepseek-ai/dsh-client-ui-primitives");
5986
6318
  var MD_LABELS = { code: { copyLabel: "\u590D\u5236", copiedLabel: "\u5DF2\u590D\u5236" }, footnotes: "\u811A\u6CE8" };
5987
6319
  var INIT_TIMEOUT_S = 150;
5988
6320
  var card2 = {
@@ -5994,18 +6326,18 @@ var card2 = {
5994
6326
  padding: "12px 14px"
5995
6327
  };
5996
6328
  function InitPanel({ workspace, remote }) {
5997
- const [view, setView] = (0, import_react4.useState)(null);
5998
- const [generating, setGenerating] = (0, import_react4.useState)(false);
5999
- const [elapsed, setElapsed] = (0, import_react4.useState)(0);
6000
- const [draft, setDraft] = (0, import_react4.useState)(null);
6001
- const [editing, setEditing] = (0, import_react4.useState)(false);
6002
- const [body2, setBody] = (0, import_react4.useState)("");
6003
- const [msg, setMsg] = (0, import_react4.useState)("");
6004
- const [projectInitMsg, setProjectInitMsg] = (0, import_react4.useState)("");
6005
- const [projectBusy, setProjectBusy] = (0, import_react4.useState)(false);
6006
- const [projectDraft, setProjectDraft] = (0, import_react4.useState)(null);
6007
- const [projectResources, setProjectResources] = (0, import_react4.useState)([]);
6008
- (0, import_react4.useEffect)(() => {
6329
+ const [view, setView] = (0, import_react5.useState)(null);
6330
+ const [generating, setGenerating] = (0, import_react5.useState)(false);
6331
+ const [elapsed, setElapsed] = (0, import_react5.useState)(0);
6332
+ const [draft, setDraft] = (0, import_react5.useState)(null);
6333
+ const [editing, setEditing] = (0, import_react5.useState)(false);
6334
+ const [body2, setBody] = (0, import_react5.useState)("");
6335
+ const [msg, setMsg] = (0, import_react5.useState)("");
6336
+ const [projectInitMsg, setProjectInitMsg] = (0, import_react5.useState)("");
6337
+ const [projectBusy, setProjectBusy] = (0, import_react5.useState)(false);
6338
+ const [projectDraft, setProjectDraft] = (0, import_react5.useState)(null);
6339
+ const [projectResources, setProjectResources] = (0, import_react5.useState)([]);
6340
+ (0, import_react5.useEffect)(() => {
6009
6341
  if (!generating && !projectBusy) {
6010
6342
  setElapsed(0);
6011
6343
  return;
@@ -6019,7 +6351,7 @@ function InitPanel({ workspace, remote }) {
6019
6351
  clearInterval(timer);
6020
6352
  };
6021
6353
  }, [generating, projectBusy]);
6022
- (0, import_react4.useEffect)(() => {
6354
+ (0, import_react5.useEffect)(() => {
6023
6355
  setProjectDraft(null);
6024
6356
  setProjectResources([]);
6025
6357
  setProjectInitMsg("");
@@ -6085,13 +6417,13 @@ function InitPanel({ workspace, remote }) {
6085
6417
  setProjectBusy(false);
6086
6418
  }
6087
6419
  };
6088
- const refresh = (0, import_react4.useCallback)(() => {
6420
+ const refresh = (0, import_react5.useCallback)(() => {
6089
6421
  void remote.readInit(workspace).then((r) => {
6090
6422
  if (r.ok) setView(r.value);
6091
6423
  }, () => {
6092
6424
  });
6093
6425
  }, [remote, workspace]);
6094
- (0, import_react4.useEffect)(() => {
6426
+ (0, import_react5.useEffect)(() => {
6095
6427
  refresh();
6096
6428
  }, [refresh]);
6097
6429
  const generate = async () => {
@@ -6134,27 +6466,27 @@ function InitPanel({ workspace, remote }) {
6134
6466
  setMsg("");
6135
6467
  };
6136
6468
  const exists = view?.exists === true;
6137
- return (0, import_react4.createElement)(
6469
+ return (0, import_react5.createElement)(
6138
6470
  "div",
6139
6471
  { style: styles.section },
6140
- (0, import_react4.createElement)(
6472
+ (0, import_react5.createElement)(
6141
6473
  "div",
6142
6474
  { style: card2 },
6143
- (0, import_react4.createElement)("h2", { style: { margin: 0, fontSize: 17 } }, "\u9879\u76EE Skill / Rule \u521D\u59CB\u5316"),
6144
- (0, import_react4.createElement)(
6475
+ (0, import_react5.createElement)("h2", { style: { margin: 0, fontSize: 17 } }, "\u9879\u76EE Skill / Rule \u521D\u59CB\u5316"),
6476
+ (0, import_react5.createElement)(
6145
6477
  "p",
6146
6478
  { style: styles.muted },
6147
6479
  "\u5728\u6B64\u626B\u63CF\u4ED3\u5E93\u5E76\u751F\u6210\u9879\u76EE Skill / Rule \u63D0\u6848\u3002\u9879\u76EE\u5730\u56FE\u8986\u76D6\u6574\u4E2A\u4ED3\u5E93\uFF0C\u5F53\u524D\u9700\u6C42\u7684\u4E13\u5C5E\u4FE1\u606F\u5E94\u5199\u5165\u4EFB\u52A1\u4EA7\u7269\u3002\u9010\u9879\u5BA1\u9605\u540E\u786E\u8BA4\u5199\u5165\uFF1B\u5DF2\u6709\u540C\u540D\u8D44\u6E90\u4E0D\u4F1A\u88AB\u8986\u76D6\u3002"
6148
6480
  ),
6149
- (0, import_react4.createElement)(
6481
+ (0, import_react5.createElement)(
6150
6482
  "p",
6151
6483
  { style: styles.muted },
6152
6484
  "\u56E2\u961F\u5171\u4EAB\u65F6\uFF0C\u8BF7\u5C06\u751F\u6210\u7684 .dsh/skills\u3001.dsh/rules \u548C .dsh/meta.json \u7EB3\u5165 Git\uFF1B\u5BA1\u6838\u62A5\u544A\u53EF\u4FDD\u7559\u5728\u672C\u5730\u3002"
6153
6485
  ),
6154
- (0, import_react4.createElement)(
6486
+ (0, import_react5.createElement)(
6155
6487
  "div",
6156
6488
  { style: styles.row },
6157
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6489
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, {
6158
6490
  variant: "primary",
6159
6491
  size: "md",
6160
6492
  disabled: projectBusy,
@@ -6162,24 +6494,24 @@ function InitPanel({ workspace, remote }) {
6162
6494
  void generateProject();
6163
6495
  }
6164
6496
  }, projectBusy ? "\u626B\u63CF\u4E0E\u751F\u6210\u4E2D\u2026" : "\u626B\u63CF\u5E76\u751F\u6210\u63D0\u6848"),
6165
- projectBusy ? (0, import_react4.createElement)("span", { style: styles.status }, `\u5DF2\u8017\u65F6 ${elapsed} \u79D2`) : null
6497
+ projectBusy ? (0, import_react5.createElement)("span", { style: styles.status }, `\u5DF2\u8017\u65F6 ${elapsed} \u79D2`) : null
6166
6498
  ),
6167
- projectResources.length > 0 ? (0, import_react4.createElement)(
6499
+ projectResources.length > 0 ? (0, import_react5.createElement)(
6168
6500
  "div",
6169
6501
  { style: styles.section },
6170
- (0, import_react4.createElement)(
6502
+ (0, import_react5.createElement)(
6171
6503
  "p",
6172
6504
  { style: styles.muted },
6173
6505
  `\u9879\u76EE\uFF1A${workspace}\u3002\u63D0\u6848\u5305\u542B ${projectResources.length} \u4E2A Skill / Rule\uFF1B\u9879\u76EE\u5730\u56FE\u9700\u8986\u76D6\uFF1A${projectDraft?.project_map_coverage.join("\u3001") ?? "\u68C0\u67E5\u4FEE\u6539\u540E\u663E\u793A"}\u3002`
6174
6506
  ),
6175
- ...projectResources.map((resource, index) => (0, import_react4.createElement)(
6507
+ ...projectResources.map((resource, index) => (0, import_react5.createElement)(
6176
6508
  "div",
6177
6509
  { key: `${resource.kind}-${resource.name}`, style: card2 },
6178
- (0, import_react4.createElement)(
6510
+ (0, import_react5.createElement)(
6179
6511
  "div",
6180
6512
  { style: styles.row },
6181
- (0, import_react4.createElement)("strong", null, `${resource.kind === "skill" ? "Skill" : "Rule"} \xB7 ${resource.name}`),
6182
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6513
+ (0, import_react5.createElement)("strong", null, `${resource.kind === "skill" ? "Skill" : "Rule"} \xB7 ${resource.name}`),
6514
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, {
6183
6515
  variant: "ghost",
6184
6516
  size: "sm",
6185
6517
  disabled: projectBusy,
@@ -6190,24 +6522,24 @@ function InitPanel({ workspace, remote }) {
6190
6522
  }
6191
6523
  }, "\u79FB\u9664\u5EFA\u8BAE")
6192
6524
  ),
6193
- resource.kind === "skill" ? (0, import_react4.createElement)(
6525
+ resource.kind === "skill" ? (0, import_react5.createElement)(
6194
6526
  "div",
6195
6527
  { style: styles.section },
6196
- (0, import_react4.createElement)("label", null, "\u7B80\u4ECB", (0, import_react4.createElement)("input", {
6528
+ (0, import_react5.createElement)("label", null, "\u7B80\u4ECB", (0, import_react5.createElement)("input", {
6197
6529
  style: styles.input,
6198
6530
  value: resource.description ?? "",
6199
6531
  onChange: (event) => {
6200
6532
  updateProjectResource(index, { description: event.target.value });
6201
6533
  }
6202
6534
  })),
6203
- (0, import_react4.createElement)("label", null, "\u6302\u8F7D\u5143\u6280\u80FD\uFF08\u9017\u53F7\u5206\u9694\uFF09", (0, import_react4.createElement)("input", {
6535
+ (0, import_react5.createElement)("label", null, "\u6302\u8F7D\u5143\u6280\u80FD\uFF08\u9017\u53F7\u5206\u9694\uFF09", (0, import_react5.createElement)("input", {
6204
6536
  style: styles.input,
6205
6537
  value: (resource.meta_skills ?? []).join(", "),
6206
6538
  onChange: (event) => {
6207
6539
  updateProjectResource(index, { meta_skills: event.target.value.split(",").map((item) => item.trim()).filter(Boolean) });
6208
6540
  }
6209
6541
  })),
6210
- (0, import_react4.createElement)("label", null, "\u5173\u8054 Rule\uFF08\u9017\u53F7\u5206\u9694\uFF09", (0, import_react4.createElement)("input", {
6542
+ (0, import_react5.createElement)("label", null, "\u5173\u8054 Rule\uFF08\u9017\u53F7\u5206\u9694\uFF09", (0, import_react5.createElement)("input", {
6211
6543
  style: styles.input,
6212
6544
  value: (resource.rules ?? []).join(", "),
6213
6545
  onChange: (event) => {
@@ -6215,7 +6547,7 @@ function InitPanel({ workspace, remote }) {
6215
6547
  }
6216
6548
  }))
6217
6549
  ) : null,
6218
- (0, import_react4.createElement)("label", null, "\u5185\u5BB9", (0, import_react4.createElement)("textarea", {
6550
+ (0, import_react5.createElement)("label", null, "\u5185\u5BB9", (0, import_react5.createElement)("textarea", {
6219
6551
  style: { ...styles.textarea, minHeight: 180 },
6220
6552
  value: resource.content,
6221
6553
  onChange: (event) => {
@@ -6223,10 +6555,10 @@ function InitPanel({ workspace, remote }) {
6223
6555
  }
6224
6556
  }))
6225
6557
  )),
6226
- (0, import_react4.createElement)(
6558
+ (0, import_react5.createElement)(
6227
6559
  "div",
6228
6560
  { style: styles.row },
6229
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6561
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, {
6230
6562
  variant: "outline",
6231
6563
  size: "md",
6232
6564
  disabled: projectBusy,
@@ -6234,7 +6566,7 @@ function InitPanel({ workspace, remote }) {
6234
6566
  void checkProject();
6235
6567
  }
6236
6568
  }, "\u68C0\u67E5\u4FEE\u6539"),
6237
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6569
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, {
6238
6570
  variant: "primary",
6239
6571
  size: "md",
6240
6572
  disabled: projectBusy || projectDraft === null,
@@ -6243,47 +6575,47 @@ function InitPanel({ workspace, remote }) {
6243
6575
  }
6244
6576
  }, "\u786E\u8BA4\u5199\u5165\u9879\u76EE")
6245
6577
  ),
6246
- projectDraft !== null ? (0, import_react4.createElement)("p", { style: styles.muted }, `\u5C06\u521B\u5EFA\uFF1A${projectDraft.files_to_create.join("\u3001")}\uFF0C\u5E76\u66F4\u65B0 .dsh/meta.json`) : null
6578
+ projectDraft !== null ? (0, import_react5.createElement)("p", { style: styles.muted }, `\u5C06\u521B\u5EFA\uFF1A${projectDraft.files_to_create.join("\u3001")}\uFF0C\u5E76\u66F4\u65B0 .dsh/meta.json`) : null
6247
6579
  ) : null,
6248
- projectInitMsg ? (0, import_react4.createElement)("p", { role: "status", style: styles.status }, projectInitMsg) : null
6580
+ projectInitMsg ? (0, import_react5.createElement)("p", { role: "status", style: styles.status }, projectInitMsg) : null
6249
6581
  ),
6250
- (0, import_react4.createElement)(
6582
+ (0, import_react5.createElement)(
6251
6583
  "div",
6252
6584
  { style: card2 },
6253
- (0, import_react4.createElement)("h2", { style: { margin: 0, fontSize: 17 } }, "AGENTS.md \u521D\u59CB\u5316"),
6254
- (0, import_react4.createElement)(
6585
+ (0, import_react5.createElement)("h2", { style: { margin: 0, fontSize: 17 } }, "AGENTS.md \u521D\u59CB\u5316"),
6586
+ (0, import_react5.createElement)(
6255
6587
  "div",
6256
6588
  { style: { display: "flex", alignItems: "center", gap: 8, flexWrap: "wrap" } },
6257
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.StateDot, { state: exists ? "done" : "ongoing" }),
6258
- (0, import_react4.createElement)("span", { style: styles.bindingLabel }, exists ? `AGENTS.md \u5DF2\u5B58\u5728 \xB7 ${view.lines} \u884C\uFF08\u4E0A\u9650 200\uFF09` : "AGENTS.md \u672A\u521B\u5EFA"),
6259
- view?.path !== void 0 ? (0, import_react4.createElement)("span", { style: styles.sourceBadge }, `\u5DF2\u5B9A\u4F4D\u5230 ${view.path}`) : null
6589
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.StateDot, { state: exists ? "done" : "ongoing" }),
6590
+ (0, import_react5.createElement)("span", { style: styles.bindingLabel }, exists ? `AGENTS.md \u5DF2\u5B58\u5728 \xB7 ${view.lines} \u884C\uFF08\u4E0A\u9650 200\uFF09` : "AGENTS.md \u672A\u521B\u5EFA"),
6591
+ view?.path !== void 0 ? (0, import_react5.createElement)("span", { style: styles.sourceBadge }, `\u5DF2\u5B9A\u4F4D\u5230 ${view.path}`) : null
6260
6592
  ),
6261
- (0, import_react4.createElement)(
6593
+ (0, import_react5.createElement)(
6262
6594
  "p",
6263
6595
  { style: styles.muted },
6264
6596
  "\u9879\u76EE\u6839 AGENTS.md \u4F1A\u88AB DSH \u81EA\u52A8\u6CE8\u5165\u5230\u6BCF\u4E2A\u4F1A\u8BDD\u3002\u521D\u59CB\u5316\u4E00\u6B21\uFF0C\u4E4B\u540E\u6BCF\u6B21\u4EFB\u52A1\u5F00\u5DE5 AI \u90FD\u81EA\u5E26\u8FD9\u4EFD\u9879\u76EE\u8BA4\u77E5\uFF08\u9879\u76EE\u662F\u4EC0\u4E48 \u2192 \u600E\u4E48\u8DD1 \u2192 \u7ED3\u6784 \u2192 \u7EA6\u5B9A \u2192 \u5751\uFF09\u3002"
6265
6597
  ),
6266
- exists && !editing && draft === null ? (0, import_react4.createElement)(
6598
+ exists && !editing && draft === null ? (0, import_react5.createElement)(
6267
6599
  "div",
6268
6600
  { style: styles.mdPreview },
6269
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.MarkdownText, { text: view.content, labels: MD_LABELS })
6601
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.MarkdownText, { text: view.content, labels: MD_LABELS })
6270
6602
  ) : null,
6271
- draft !== null ? (0, import_react4.createElement)(
6603
+ draft !== null ? (0, import_react5.createElement)(
6272
6604
  "div",
6273
6605
  { style: styles.section },
6274
- (0, import_react4.createElement)(
6606
+ (0, import_react5.createElement)(
6275
6607
  "div",
6276
6608
  { style: styles.sourceRow },
6277
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.StateDot, { state: "ongoing", size: 8 }),
6278
- (0, import_react4.createElement)("span", { style: styles.sourceBadge }, `AI \u8349\u7A3F \xB7 ${draft.lines} \u884C \xB7 \u5C1A\u672A\u5199\u5165`)
6609
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.StateDot, { state: "ongoing", size: 8 }),
6610
+ (0, import_react5.createElement)("span", { style: styles.sourceBadge }, `AI \u8349\u7A3F \xB7 ${draft.lines} \u884C \xB7 \u5C1A\u672A\u5199\u5165`)
6279
6611
  ),
6280
- (0, import_react4.createElement)(
6612
+ (0, import_react5.createElement)(
6281
6613
  "div",
6282
6614
  { style: styles.mdPreview },
6283
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.MarkdownText, { text: draft.content, labels: MD_LABELS })
6615
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.MarkdownText, { text: draft.content, labels: MD_LABELS })
6284
6616
  )
6285
6617
  ) : null,
6286
- editing ? (0, import_react4.createElement)("textarea", {
6618
+ editing ? (0, import_react5.createElement)("textarea", {
6287
6619
  style: { ...styles.textarea, minHeight: 300 },
6288
6620
  placeholder: "AGENTS.md \u6B63\u6587\uFF08Markdown\uFF0C\u2264200 \u884C\uFF09",
6289
6621
  value: body2,
@@ -6291,16 +6623,16 @@ function InitPanel({ workspace, remote }) {
6291
6623
  setBody(ev.target.value);
6292
6624
  }
6293
6625
  }) : null,
6294
- generating ? (0, import_react4.createElement)(
6626
+ generating ? (0, import_react5.createElement)(
6295
6627
  "p",
6296
6628
  { style: styles.status },
6297
6629
  `AI \u6B63\u5728\u626B\u63CF\u9879\u76EE\u5E76\u751F\u6210\u8349\u7A3F\u2026 \u5DF2\u8017\u65F6 ${elapsed} \u79D2\uFF08\u6700\u957F ${INIT_TIMEOUT_S} \u79D2\uFF09\uFF0C\u8BF7\u7A0D\u5019`
6298
6630
  ) : null,
6299
- msg !== "" ? (0, import_react4.createElement)("p", { style: styles.status }, msg) : null,
6300
- draft !== null ? (0, import_react4.createElement)(
6631
+ msg !== "" ? (0, import_react5.createElement)("p", { style: styles.status }, msg) : null,
6632
+ draft !== null ? (0, import_react5.createElement)(
6301
6633
  "div",
6302
6634
  { style: styles.row },
6303
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6635
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, {
6304
6636
  variant: "primary",
6305
6637
  size: "md",
6306
6638
  disabled: draft.lines > 200,
@@ -6309,14 +6641,14 @@ function InitPanel({ workspace, remote }) {
6309
6641
  void write(draft.content, exists);
6310
6642
  }
6311
6643
  }, exists ? "\u4FDD\u5B58\u5E76\u8986\u76D6" : "\u4FDD\u5B58"),
6312
- draft.lines > 200 ? (0, import_react4.createElement)("span", { style: styles.sourceBadge }, `\u8349\u7A3F ${draft.lines} \u884C\u8D85\u9650\uFF0C\u8BF7\u70B9\u300C\u653E\u5F03\u300D\u540E\u91CD\u8BD5`) : null,
6313
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, { variant: "ghost", size: "md", onClick: () => {
6644
+ draft.lines > 200 ? (0, import_react5.createElement)("span", { style: styles.sourceBadge }, `\u8349\u7A3F ${draft.lines} \u884C\u8D85\u9650\uFF0C\u8BF7\u70B9\u300C\u653E\u5F03\u300D\u540E\u91CD\u8BD5`) : null,
6645
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "ghost", size: "md", onClick: () => {
6314
6646
  setDraft(null);
6315
6647
  } }, "\u653E\u5F03")
6316
- ) : editing ? (0, import_react4.createElement)(
6648
+ ) : editing ? (0, import_react5.createElement)(
6317
6649
  "div",
6318
6650
  { style: styles.row },
6319
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6651
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, {
6320
6652
  variant: "primary",
6321
6653
  size: "md",
6322
6654
  disabled: body2.trim() === "",
@@ -6325,13 +6657,13 @@ function InitPanel({ workspace, remote }) {
6325
6657
  void write(body2, exists);
6326
6658
  }
6327
6659
  }, exists ? "\u4FDD\u5B58\u5E76\u8986\u76D6" : "\u4FDD\u5B58"),
6328
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, { variant: "ghost", size: "md", onClick: () => {
6660
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "ghost", size: "md", onClick: () => {
6329
6661
  setEditing(false);
6330
6662
  } }, "\u53D6\u6D88")
6331
- ) : (0, import_react4.createElement)(
6663
+ ) : (0, import_react5.createElement)(
6332
6664
  "div",
6333
6665
  { style: styles.row },
6334
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6666
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, {
6335
6667
  variant: "primary",
6336
6668
  size: "md",
6337
6669
  disabled: generating,
@@ -6340,18 +6672,18 @@ function InitPanel({ workspace, remote }) {
6340
6672
  void generate();
6341
6673
  }
6342
6674
  }, exists ? "\u91CD\u65B0\u751F\u6210 AGENTS.md" : "\u751F\u6210 AGENTS.md"),
6343
- exists ? (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, { variant: "outline", size: "md", onClick: startEdit }, "\u624B\u52A8\u7F16\u8F91") : null
6675
+ exists ? (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", size: "md", onClick: startEdit }, "\u624B\u52A8\u7F16\u8F91") : null
6344
6676
  )
6345
6677
  )
6346
6678
  );
6347
6679
  }
6348
6680
 
6349
6681
  // src/client/SkillManager.tsx
6350
- var import_react6 = require("react");
6682
+ var import_react7 = require("react");
6351
6683
 
6352
6684
  // src/client/ResourceManager.tsx
6353
- var import_react5 = require("react");
6354
- var import_dsh_client_ui_primitives4 = require("@deepseek-ai/dsh-client-ui-primitives");
6685
+ var import_react6 = require("react");
6686
+ var import_dsh_client_ui_primitives5 = require("@deepseek-ai/dsh-client-ui-primitives");
6355
6687
  var labels = { code: { copyLabel: "\u590D\u5236", copiedLabel: "\u5DF2\u590D\u5236" }, footnotes: "\u811A\u6CE8" };
6356
6688
  var levelOf = (row2) => row2.source === "bundled" ? "bundled" : row2.source.startsWith("user") ? "user" : "project";
6357
6689
  var sourceText = (source) => source === "bundled" ? "\u5185\u7F6E" : source === "codex-project" ? "\u9879\u76EE \xB7 Codex" : source.startsWith("user") ? "\u4E2A\u4EBA" : "\u9879\u76EE";
@@ -6359,36 +6691,36 @@ var sizeText = (bytes) => bytes < 1024 ? `${bytes} B` : bytes < 1024 * 1024 ? `$
6359
6691
  var fail = (r) => describeError(r.error ?? "\u64CD\u4F5C\u5931\u8D25");
6360
6692
  function ResourceManager({ workspace, remote, kind, onConfigureSkill }) {
6361
6693
  const noun = kind === "skill" ? "\u6280\u80FD" : "\u89C4\u5219";
6362
- const [rows, setRows] = (0, import_react5.useState)([]);
6363
- const [query, setQuery] = (0, import_react5.useState)("");
6364
- const [filter, setFilter] = (0, import_react5.useState)("all");
6365
- const [notice, setNotice] = (0, import_react5.useState)("");
6366
- const [error, setError] = (0, import_react5.useState)("");
6367
- const [loading, setLoading] = (0, import_react5.useState)(true);
6368
- const [revision, refresh] = (0, import_react5.useState)(0);
6369
- const [busy, setBusy] = (0, import_react5.useState)(false);
6370
- const [roots, setRoots] = (0, import_react5.useState)(null);
6371
- const [importing, setImporting] = (0, import_react5.useState)(false);
6372
- const [request, setRequest] = (0, import_react5.useState)(null);
6373
- const [preview, setPreview] = (0, import_react5.useState)(null);
6374
- const [level, setLevel] = (0, import_react5.useState)("project");
6375
- const [manual, setManual] = (0, import_react5.useState)(false);
6376
- const [sourceDir, setSourceDir] = (0, import_react5.useState)("");
6377
- const [dirs, setDirs] = (0, import_react5.useState)([]);
6378
- const [browsePath, setBrowsePath] = (0, import_react5.useState)("");
6379
- const [editing, setEditing] = (0, import_react5.useState)(null);
6380
- const [viewing, setViewing] = (0, import_react5.useState)(false);
6381
- const [name, setName] = (0, import_react5.useState)("");
6382
- const [description, setDescription] = (0, import_react5.useState)("");
6383
- const [whenToUse, setWhenToUse] = (0, import_react5.useState)("");
6384
- const [body2, setBody] = (0, import_react5.useState)("");
6385
- const [templateSource, setTemplateSource] = (0, import_react5.useState)(null);
6386
- const [deleting, setDeleting] = (0, import_react5.useState)(null);
6387
- const input2 = (0, import_react5.useRef)(null);
6388
- const fileEpoch = (0, import_react5.useRef)(0);
6389
- const browseEpoch = (0, import_react5.useRef)(0);
6694
+ const [rows, setRows] = (0, import_react6.useState)([]);
6695
+ const [query, setQuery] = (0, import_react6.useState)("");
6696
+ const [filter, setFilter] = (0, import_react6.useState)("all");
6697
+ const [notice, setNotice] = (0, import_react6.useState)("");
6698
+ const [error, setError] = (0, import_react6.useState)("");
6699
+ const [loading, setLoading] = (0, import_react6.useState)(true);
6700
+ const [revision, refresh] = (0, import_react6.useState)(0);
6701
+ const [busy, setBusy] = (0, import_react6.useState)(false);
6702
+ const [roots, setRoots] = (0, import_react6.useState)(null);
6703
+ const [importing, setImporting] = (0, import_react6.useState)(false);
6704
+ const [request, setRequest] = (0, import_react6.useState)(null);
6705
+ const [preview, setPreview] = (0, import_react6.useState)(null);
6706
+ const [level, setLevel] = (0, import_react6.useState)("project");
6707
+ const [manual, setManual] = (0, import_react6.useState)(false);
6708
+ const [sourceDir, setSourceDir] = (0, import_react6.useState)("");
6709
+ const [dirs, setDirs] = (0, import_react6.useState)([]);
6710
+ const [browsePath, setBrowsePath] = (0, import_react6.useState)("");
6711
+ const [editing, setEditing] = (0, import_react6.useState)(null);
6712
+ const [viewing, setViewing] = (0, import_react6.useState)(false);
6713
+ const [name, setName] = (0, import_react6.useState)("");
6714
+ const [description, setDescription] = (0, import_react6.useState)("");
6715
+ const [whenToUse, setWhenToUse] = (0, import_react6.useState)("");
6716
+ const [body2, setBody] = (0, import_react6.useState)("");
6717
+ const [templateSource, setTemplateSource] = (0, import_react6.useState)(null);
6718
+ const [deleting, setDeleting] = (0, import_react6.useState)(null);
6719
+ const input2 = (0, import_react6.useRef)(null);
6720
+ const fileEpoch = (0, import_react6.useRef)(0);
6721
+ const browseEpoch = (0, import_react6.useRef)(0);
6390
6722
  const readonly = editing !== null && editing !== "new" && (levelOf(editing) === "bundled" || editing.source === "codex-project");
6391
- (0, import_react5.useEffect)(() => {
6723
+ (0, import_react6.useEffect)(() => {
6392
6724
  let active = true;
6393
6725
  setLoading(true);
6394
6726
  setRows([]);
@@ -6415,7 +6747,7 @@ function ResourceManager({ workspace, remote, kind, onConfigureSkill }) {
6415
6747
  fileEpoch.current++;
6416
6748
  };
6417
6749
  }, [workspace, remote, kind, revision]);
6418
- (0, import_react5.useEffect)(() => {
6750
+ (0, import_react6.useEffect)(() => {
6419
6751
  let active = true;
6420
6752
  setPreview(null);
6421
6753
  if (!request) return;
@@ -6619,93 +6951,93 @@ function ResourceManager({ workspace, remote, kind, onConfigureSkill }) {
6619
6951
  setBusy(false);
6620
6952
  }
6621
6953
  };
6622
- const status = () => error ? (0, import_react5.createElement)("div", { className: "te-alert", role: "alert" }, error) : null;
6623
- const targets = () => (0, import_react5.createElement)(
6954
+ const status = () => error ? (0, import_react6.createElement)("div", { className: "te-alert", role: "alert" }, error) : null;
6955
+ const targets = () => (0, import_react6.createElement)(
6624
6956
  "div",
6625
6957
  { className: "te-targets" },
6626
- ...["project", "user"].map((lvl) => (0, import_react5.createElement)(
6958
+ ...["project", "user"].map((lvl) => (0, import_react6.createElement)(
6627
6959
  "button",
6628
6960
  { type: "button", key: lvl, className: `te-target ${level === lvl ? "selected" : ""}`, "aria-pressed": level === lvl, disabled: busy || editing !== null && editing !== "new", onClick: () => {
6629
6961
  setPreview(null);
6630
6962
  setLevel(lvl);
6631
6963
  } },
6632
- (0, import_react5.createElement)("strong", null, lvl === "project" ? "\u9879\u76EE\u5171\u4EAB" : "\u4E2A\u4EBA\u5168\u5C40"),
6633
- (0, import_react5.createElement)("small", null, lvl === "project" ? "\u4EC5\u5F53\u524D\u5DE5\u4F5C\u533A\u4F7F\u7528" : "\u6B64\u4E3B\u673A\u4E0A\u7684\u6240\u6709\u9879\u76EE\u53EF\u7528")
6964
+ (0, import_react6.createElement)("strong", null, lvl === "project" ? "\u9879\u76EE\u5171\u4EAB" : "\u4E2A\u4EBA\u5168\u5C40"),
6965
+ (0, import_react6.createElement)("small", null, lvl === "project" ? "\u4EC5\u5F53\u524D\u5DE5\u4F5C\u533A\u4F7F\u7528" : "\u6B64\u4E3B\u673A\u4E0A\u7684\u6240\u6709\u9879\u76EE\u53EF\u7528")
6634
6966
  )),
6635
- (0, import_react5.createElement)("code", { className: "te-path" }, roots?.[level] ?? (level === "project" ? `${workspace}/.dsh/${kind}s` : `DSH_HOME/${kind}s`))
6967
+ (0, import_react6.createElement)("code", { className: "te-path" }, roots?.[level] ?? (level === "project" ? `${workspace}/.dsh/${kind}s` : `DSH_HOME/${kind}s`))
6636
6968
  );
6637
6969
  const visible = rows.filter((r) => `${r.name} ${r.description ?? ""}`.toLowerCase().includes(query.toLowerCase()) && (filter === "all" || levelOf(r) === filter));
6638
- return (0, import_react5.createElement)(
6970
+ return (0, import_react6.createElement)(
6639
6971
  "section",
6640
6972
  { className: "te-resource" },
6641
- (0, import_react5.createElement)("input", { type: "file", ref: input2, hidden: true, "aria-label": kind === "skill" ? "\u9009\u62E9\u6280\u80FD\u6587\u4EF6\u5939" : "\u9009\u62E9\u89C4\u5219\u6587\u4EF6", ...kind === "skill" ? { webkitdirectory: "", multiple: true } : { accept: ".md,text/markdown" }, onChange: (e) => {
6973
+ (0, import_react6.createElement)("input", { type: "file", ref: input2, hidden: true, "aria-label": kind === "skill" ? "\u9009\u62E9\u6280\u80FD\u6587\u4EF6\u5939" : "\u9009\u62E9\u89C4\u5219\u6587\u4EF6", ...kind === "skill" ? { webkitdirectory: "", multiple: true } : { accept: ".md,text/markdown" }, onChange: (e) => {
6642
6974
  void selected(Array.from(e.target.files ?? []));
6643
6975
  } }),
6644
- (0, import_react5.createElement)("div", { className: "te-section-heading" }, (0, import_react5.createElement)("div", null, (0, import_react5.createElement)("h2", null, `${noun}\u5E93`), (0, import_react5.createElement)("p", null, kind === "skill" ? "\u628A\u53EF\u590D\u7528\u7684\u5DE5\u4F5C\u65B9\u6CD5\u5E26\u5165\u9879\u76EE\u3002" : "\u4E3A\u9879\u76EE\u660E\u786E\u7EA6\u5B9A\uFF0C\u8BA9\u6BCF\u6B21\u4EA4\u4ED8\u4FDD\u6301\u4E00\u81F4\u3002")), (0, import_react5.createElement)("div", { className: "te-actions" }, (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", onClick: () => {
6976
+ (0, import_react6.createElement)("div", { className: "te-section-heading" }, (0, import_react6.createElement)("div", null, (0, import_react6.createElement)("h2", null, `${noun}\u5E93`), (0, import_react6.createElement)("p", null, kind === "skill" ? "\u628A\u53EF\u590D\u7528\u7684\u5DE5\u4F5C\u65B9\u6CD5\u5E26\u5165\u9879\u76EE\u3002" : "\u4E3A\u9879\u76EE\u660E\u786E\u7EA6\u5B9A\uFF0C\u8BA9\u6BCF\u6B21\u4EA4\u4ED8\u4FDD\u6301\u4E00\u81F4\u3002")), (0, import_react6.createElement)("div", { className: "te-actions" }, (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "outline", onClick: () => {
6645
6977
  void edit("new");
6646
- } }, `\u65B0\u5EFA${noun}`), (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "primary", onClick: choose }, `\u5B89\u88C5${noun}`))),
6647
- (0, import_react5.createElement)("div", { className: "te-toolbar" }, (0, import_react5.createElement)("input", { className: "te-input", placeholder: `\u641C\u7D22${noun}\u540D\u79F0${kind === "skill" ? "\u6216\u63CF\u8FF0" : ""}`, value: query, onChange: (e) => setQuery(e.target.value) }), (0, import_react5.createElement)("select", { className: "te-input", "aria-label": "\u7B5B\u9009\u6765\u6E90", value: filter, onChange: (e) => setFilter(e.target.value) }, (0, import_react5.createElement)("option", { value: "all" }, `\u5168\u90E8\u6765\u6E90 \xB7 ${rows.length}`), (0, import_react5.createElement)("option", { value: "project" }, "\u9879\u76EE"), (0, import_react5.createElement)("option", { value: "user" }, "\u4E2A\u4EBA")), (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "ghost", onClick: () => refresh((n) => n + 1), disabled: loading }, "\u5237\u65B0")),
6648
- notice ? (0, import_react5.createElement)("div", { className: "te-success", role: "status" }, notice) : null,
6978
+ } }, `\u65B0\u5EFA${noun}`), (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "primary", onClick: choose }, `\u5B89\u88C5${noun}`))),
6979
+ (0, import_react6.createElement)("div", { className: "te-toolbar" }, (0, import_react6.createElement)("input", { className: "te-input", placeholder: `\u641C\u7D22${noun}\u540D\u79F0${kind === "skill" ? "\u6216\u63CF\u8FF0" : ""}`, value: query, onChange: (e) => setQuery(e.target.value) }), (0, import_react6.createElement)("select", { className: "te-input", "aria-label": "\u7B5B\u9009\u6765\u6E90", value: filter, onChange: (e) => setFilter(e.target.value) }, (0, import_react6.createElement)("option", { value: "all" }, `\u5168\u90E8\u6765\u6E90 \xB7 ${rows.length}`), (0, import_react6.createElement)("option", { value: "project" }, "\u9879\u76EE"), (0, import_react6.createElement)("option", { value: "user" }, "\u4E2A\u4EBA")), (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "ghost", onClick: () => refresh((n) => n + 1), disabled: loading }, "\u5237\u65B0")),
6980
+ notice ? (0, import_react6.createElement)("div", { className: "te-success", role: "status" }, notice) : null,
6649
6981
  !importing && !editing && !deleting ? status() : null,
6650
- loading ? (0, import_react5.createElement)("div", { className: "te-empty", role: "status" }, "\u6B63\u5728\u52A0\u8F7D\u2026") : visible.length === 0 ? (0, import_react5.createElement)("div", { className: "te-empty" }, (0, import_react5.createElement)("h3", null, query || filter !== "all" ? "\u6CA1\u6709\u5339\u914D\u7684\u7ED3\u679C" : `\u8FD8\u6CA1\u6709${noun}`), (0, import_react5.createElement)("p", null, "\u8C03\u6574\u7B5B\u9009\uFF0C\u6216\u4F7F\u7528\u53F3\u4E0A\u89D2\u6309\u94AE\u6DFB\u52A0\u3002")) : (0, import_react5.createElement)("div", { className: "te-resource-grid" }, ...visible.map((row2) => (0, import_react5.createElement)(
6982
+ loading ? (0, import_react6.createElement)("div", { className: "te-empty", role: "status" }, "\u6B63\u5728\u52A0\u8F7D\u2026") : visible.length === 0 ? (0, import_react6.createElement)("div", { className: "te-empty" }, (0, import_react6.createElement)("h3", null, query || filter !== "all" ? "\u6CA1\u6709\u5339\u914D\u7684\u7ED3\u679C" : `\u8FD8\u6CA1\u6709${noun}`), (0, import_react6.createElement)("p", null, "\u8C03\u6574\u7B5B\u9009\uFF0C\u6216\u4F7F\u7528\u53F3\u4E0A\u89D2\u6309\u94AE\u6DFB\u52A0\u3002")) : (0, import_react6.createElement)("div", { className: "te-resource-grid" }, ...visible.map((row2) => (0, import_react6.createElement)(
6651
6983
  "article",
6652
6984
  { className: "te-resource-card", key: row2.source + "/" + row2.name },
6653
- (0, import_react5.createElement)("div", { className: "te-card-top" }, (0, import_react5.createElement)("span", { className: "te-resource-icon", "aria-hidden": true }, kind === "skill" ? "\u25C7" : "\u2261"), (0, import_react5.createElement)("span", { className: "te-badge" }, sourceText(row2.source))),
6654
- (0, import_react5.createElement)("h3", null, row2.name),
6655
- (0, import_react5.createElement)("p", null, row2.description || "\u9879\u76EE\u7EA6\u5B9A\u4E0E\u6267\u884C\u89C4\u5219"),
6656
- (0, import_react5.createElement)("div", { className: "te-actions" }, kind === "skill" && onConfigureSkill ? (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "primary", size: "sm", onClick: () => onConfigureSkill({ source: row2.source === "codex-project" ? "codex-project" : levelOf(row2), name: row2.name }) }, "\u914D\u7F6E\u89C4\u5219") : null, (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", size: "sm", onClick: () => {
6985
+ (0, import_react6.createElement)("div", { className: "te-card-top" }, (0, import_react6.createElement)("span", { className: "te-resource-icon", "aria-hidden": true }, kind === "skill" ? "\u25C7" : "\u2261"), (0, import_react6.createElement)("span", { className: "te-badge" }, sourceText(row2.source))),
6986
+ (0, import_react6.createElement)("h3", null, row2.name),
6987
+ (0, import_react6.createElement)("p", null, row2.description || "\u9879\u76EE\u7EA6\u5B9A\u4E0E\u6267\u884C\u89C4\u5219"),
6988
+ (0, import_react6.createElement)("div", { className: "te-actions" }, kind === "skill" && onConfigureSkill ? (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "primary", size: "sm", onClick: () => onConfigureSkill({ source: row2.source === "codex-project" ? "codex-project" : levelOf(row2), name: row2.name }) }, "\u914D\u7F6E\u89C4\u5219") : null, (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "outline", size: "sm", onClick: () => {
6657
6989
  void edit(row2, true);
6658
- } }, "\u67E5\u770B"), levelOf(row2) === "bundled" ? (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "ghost", size: "sm", disabled: busy, onClick: () => {
6990
+ } }, "\u67E5\u770B"), levelOf(row2) === "bundled" ? (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "ghost", size: "sm", disabled: busy, onClick: () => {
6659
6991
  void copyTemplate(row2);
6660
- } }, "\u4EE5\u6B64\u4E3A\u6A21\u677F\u65B0\u5EFA") : row2.source !== "codex-project" ? (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "ghost", size: "sm", onClick: () => {
6992
+ } }, "\u4EE5\u6B64\u4E3A\u6A21\u677F\u65B0\u5EFA") : row2.source !== "codex-project" ? (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "ghost", size: "sm", onClick: () => {
6661
6993
  void edit(row2);
6662
- } }, "\u7F16\u8F91") : null, levelOf(row2) !== "bundled" && row2.source !== "codex-project" ? (0, import_react5.createElement)("button", { className: "te-delete", onClick: () => {
6994
+ } }, "\u7F16\u8F91") : null, levelOf(row2) !== "bundled" && row2.source !== "codex-project" ? (0, import_react6.createElement)("button", { className: "te-delete", onClick: () => {
6663
6995
  setDeleting(row2);
6664
6996
  setError("");
6665
6997
  } }, "\u5220\u9664") : null)
6666
6998
  ))),
6667
- kind === "skill" ? (0, import_react5.createElement)("button", { className: "te-link", onClick: () => {
6999
+ kind === "skill" ? (0, import_react6.createElement)("button", { className: "te-link", onClick: () => {
6668
7000
  setImporting(true);
6669
7001
  setManual(true);
6670
7002
  setError("");
6671
7003
  } }, "\u9AD8\u7EA7\uFF1A\u4ECE Harness \u4E3B\u673A\u8DEF\u5F84\u5B89\u88C5") : null,
6672
- importing ? (0, import_react5.createElement)(
7004
+ importing ? (0, import_react6.createElement)(
6673
7005
  ResourceModal,
6674
- { title: `\u5B89\u88C5${noun}`, description: "\u5148\u68C0\u67E5\u5185\u5BB9\u548C\u5B89\u88C5\u4F4D\u7F6E\uFF0C\u786E\u8BA4\u540E\u624D\u4F1A\u5199\u5165\u3002", onClose: close, footer: (0, import_react5.createElement)("div", { className: "te-actions" }, (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "ghost", disabled: busy, onClick: close }, "\u53D6\u6D88"), (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "primary", disabled: busy || !preview || preview.conflict, onClick: () => {
7006
+ { title: `\u5B89\u88C5${noun}`, description: "\u5148\u68C0\u67E5\u5185\u5BB9\u548C\u5B89\u88C5\u4F4D\u7F6E\uFF0C\u786E\u8BA4\u540E\u624D\u4F1A\u5199\u5165\u3002", onClose: close, footer: (0, import_react6.createElement)("div", { className: "te-actions" }, (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "ghost", disabled: busy, onClick: close }, "\u53D6\u6D88"), (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "primary", disabled: busy || !preview || preview.conflict, onClick: () => {
6675
7007
  void install();
6676
7008
  } }, busy ? "\u5904\u7406\u4E2D\u2026" : "\u786E\u8BA4\u5B89\u88C5")) },
6677
7009
  targets(),
6678
- (0, import_react5.createElement)("div", { className: "te-actions" }, (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", disabled: busy, onClick: choose }, "\u91CD\u65B0\u9009\u62E9"), kind === "skill" ? (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "ghost", disabled: busy, onClick: () => setManual(!manual) }, manual ? "\u6536\u8D77\u9AD8\u7EA7\u65B9\u5F0F" : "\u4E3B\u673A\u8DEF\u5F84") : null),
6679
- manual ? (0, import_react5.createElement)("div", { className: "te-advanced" }, (0, import_react5.createElement)("p", null, "\u6B64\u8DEF\u5F84\u4F4D\u4E8E Harness \u4E3B\u673A\uFF1B\u6D4F\u89C8\u5668\u9009\u62E9\u5668\u8BFB\u53D6\u7684\u662F\u4F60\u5F53\u524D\u7535\u8111\u3002"), (0, import_react5.createElement)("div", { className: "te-toolbar" }, (0, import_react5.createElement)("input", { className: "te-input", "aria-label": "\u4E3B\u673A\u6280\u80FD\u76EE\u5F55", value: sourceDir, onChange: (e) => {
7010
+ (0, import_react6.createElement)("div", { className: "te-actions" }, (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "outline", disabled: busy, onClick: choose }, "\u91CD\u65B0\u9009\u62E9"), kind === "skill" ? (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "ghost", disabled: busy, onClick: () => setManual(!manual) }, manual ? "\u6536\u8D77\u9AD8\u7EA7\u65B9\u5F0F" : "\u4E3B\u673A\u8DEF\u5F84") : null),
7011
+ manual ? (0, import_react6.createElement)("div", { className: "te-advanced" }, (0, import_react6.createElement)("p", null, "\u6B64\u8DEF\u5F84\u4F4D\u4E8E Harness \u4E3B\u673A\uFF1B\u6D4F\u89C8\u5668\u9009\u62E9\u5668\u8BFB\u53D6\u7684\u662F\u4F60\u5F53\u524D\u7535\u8111\u3002"), (0, import_react6.createElement)("div", { className: "te-toolbar" }, (0, import_react6.createElement)("input", { className: "te-input", "aria-label": "\u4E3B\u673A\u6280\u80FD\u76EE\u5F55", value: sourceDir, onChange: (e) => {
6680
7012
  setSourceDir(e.target.value);
6681
7013
  setRequest(null);
6682
- } }), (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", onClick: () => {
7014
+ } }), (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "outline", onClick: () => {
6683
7015
  void browse(sourceDir);
6684
- } }, "\u6D4F\u89C8"), (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", disabled: busy || !sourceDir.trim(), onClick: () => setRequest({ kind, level, path: workspace, files: [], sourceDir }) }, "\u9884\u89C8\u76EE\u5F55")), (0, import_react5.createElement)("div", { className: "te-dir-list" }, browsePath ? (0, import_react5.createElement)("button", { onClick: () => {
7016
+ } }, "\u6D4F\u89C8"), (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "outline", disabled: busy || !sourceDir.trim(), onClick: () => setRequest({ kind, level, path: workspace, files: [], sourceDir }) }, "\u9884\u89C8\u76EE\u5F55")), (0, import_react6.createElement)("div", { className: "te-dir-list" }, browsePath ? (0, import_react6.createElement)("button", { onClick: () => {
6685
7017
  void browse(browsePath.replace(/[\\/][^\\/]+[\\/]?$/u, "") || "/");
6686
- } }, "\u2191 \u4E0A\u7EA7\u76EE\u5F55") : null, ...dirs.map((d) => (0, import_react5.createElement)("button", { key: d.name, onClick: () => {
7018
+ } }, "\u2191 \u4E0A\u7EA7\u76EE\u5F55") : null, ...dirs.map((d) => (0, import_react6.createElement)("button", { key: d.name, onClick: () => {
6687
7019
  setRequest(null);
6688
7020
  void browse(browsePath.replace(/[\\/]+$/u, "") + "/" + d.name);
6689
7021
  } }, d.name + (d.hasSkill ? " \xB7 SKILL.md" : ""))))) : null,
6690
- busy ? (0, import_react5.createElement)("p", { role: "status" }, "\u6B63\u5728\u6821\u9A8C\u6587\u4EF6\uFF0C\u8BF7\u7A0D\u5019\u2026") : null,
7022
+ busy ? (0, import_react6.createElement)("p", { role: "status" }, "\u6B63\u5728\u6821\u9A8C\u6587\u4EF6\uFF0C\u8BF7\u7A0D\u5019\u2026") : null,
6691
7023
  status(),
6692
- preview ? (0, import_react5.createElement)("div", { className: "te-preview" }, (0, import_react5.createElement)("h3", null, preview.name), (0, import_react5.createElement)("p", null, preview.description), (0, import_react5.createElement)("div", { className: "te-actions" }, (0, import_react5.createElement)("span", { className: "te-badge" }, `${preview.files} \u4E2A\u6587\u4EF6`), (0, import_react5.createElement)("span", { className: "te-badge" }, sizeText(preview.bytes))), (0, import_react5.createElement)("code", { className: "te-path" }, preview.target), preview.conflict ? (0, import_react5.createElement)("div", { className: "te-alert", role: "alert" }, "\u5DF2\u6709\u540C\u540D\u8D44\u6E90\u3002\u8BF7\u53D6\u6D88\u5E76\u68C0\u67E5\u73B0\u6709\u5185\u5BB9\uFF0C\u5B89\u88C5\u4E0D\u4F1A\u8986\u76D6\u5B83\u3002") : null, (0, import_react5.createElement)("div", { className: "te-markdown" }, (0, import_react5.createElement)(import_dsh_client_ui_primitives4.MarkdownText, { text: preview.content, labels }))) : null
7024
+ preview ? (0, import_react6.createElement)("div", { className: "te-preview" }, (0, import_react6.createElement)("h3", null, preview.name), (0, import_react6.createElement)("p", null, preview.description), (0, import_react6.createElement)("div", { className: "te-actions" }, (0, import_react6.createElement)("span", { className: "te-badge" }, `${preview.files} \u4E2A\u6587\u4EF6`), (0, import_react6.createElement)("span", { className: "te-badge" }, sizeText(preview.bytes))), (0, import_react6.createElement)("code", { className: "te-path" }, preview.target), preview.conflict ? (0, import_react6.createElement)("div", { className: "te-alert", role: "alert" }, "\u5DF2\u6709\u540C\u540D\u8D44\u6E90\u3002\u8BF7\u53D6\u6D88\u5E76\u68C0\u67E5\u73B0\u6709\u5185\u5BB9\uFF0C\u5B89\u88C5\u4E0D\u4F1A\u8986\u76D6\u5B83\u3002") : null, (0, import_react6.createElement)("div", { className: "te-markdown" }, (0, import_react6.createElement)(import_dsh_client_ui_primitives5.MarkdownText, { text: preview.content, labels }))) : null
6693
7025
  ) : null,
6694
- editing ? (0, import_react5.createElement)(
7026
+ editing ? (0, import_react6.createElement)(
6695
7027
  ResourceModal,
6696
- { title: editing === "new" ? `\u65B0\u5EFA${noun}` : `${viewing ? "\u67E5\u770B" : "\u7F16\u8F91"}${noun} \xB7 ${name}`, onClose: close, footer: (0, import_react5.createElement)("div", { className: "te-actions" }, (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "ghost", disabled: busy, onClick: close }, "\u5173\u95ED"), editing !== "new" && levelOf(editing) === "bundled" ? (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", disabled: busy, onClick: () => {
7028
+ { title: editing === "new" ? `\u65B0\u5EFA${noun}` : `${viewing ? "\u67E5\u770B" : "\u7F16\u8F91"}${noun} \xB7 ${name}`, onClose: close, footer: (0, import_react6.createElement)("div", { className: "te-actions" }, (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "ghost", disabled: busy, onClick: close }, "\u5173\u95ED"), editing !== "new" && levelOf(editing) === "bundled" ? (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "outline", disabled: busy, onClick: () => {
6697
7029
  void copyTemplate(editing);
6698
- } }, "\u4EE5\u6B64\u4E3A\u6A21\u677F\u65B0\u5EFA") : null, !readonly ? (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", disabled: busy, onClick: () => setViewing(!viewing) }, viewing ? "\u7F16\u8F91\u5185\u5BB9" : "\u9884\u89C8") : null, !readonly ? (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "primary", disabled: busy || !name.trim() || !body2.trim() || kind === "skill" && !description.trim(), onClick: () => {
7030
+ } }, "\u4EE5\u6B64\u4E3A\u6A21\u677F\u65B0\u5EFA") : null, !readonly ? (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "outline", disabled: busy, onClick: () => setViewing(!viewing) }, viewing ? "\u7F16\u8F91\u5185\u5BB9" : "\u9884\u89C8") : null, !readonly ? (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "primary", disabled: busy || !name.trim() || !body2.trim() || kind === "skill" && !description.trim(), onClick: () => {
6699
7031
  void save();
6700
7032
  } }, busy ? "\u5904\u7406\u4E2D\u2026" : "\u4FDD\u5B58") : null) },
6701
- !readonly ? targets() : (0, import_react5.createElement)("p", { className: "te-badge" }, editing.source === "codex-project" ? "Codex \u9879\u76EE\u6280\u80FD \xB7 \u6B63\u6587\u8BF7\u5728\u539F\u76EE\u5F55\u7F16\u8F91" : "\u5185\u7F6E\u6837\u672C \xB7 \u53EA\u8BFB"),
6702
- templateSource ? (0, import_react5.createElement)("p", null, `\u4EE5\u300C${templateSource.name}\u300D\u4E3A\u6A21\u677F\u590D\u5236\u6B63\u6587\u3002\u65B0\u8D44\u6E90\u7684\u5B8C\u6210\u51ED\u8BC1\u3001\u89C4\u5219\u548C\u9636\u6BB5\u7ED1\u5B9A\u9700\u5355\u72EC\u914D\u7F6E\uFF0C\u4FDD\u5B58\u672C\u8EAB\u4E0D\u4F1A\u542F\u7528\u5B83\u3002`) : null,
7033
+ !readonly ? targets() : (0, import_react6.createElement)("p", { className: "te-badge" }, editing.source === "codex-project" ? "Codex \u9879\u76EE\u6280\u80FD \xB7 \u6B63\u6587\u8BF7\u5728\u539F\u76EE\u5F55\u7F16\u8F91" : "\u5185\u7F6E\u6837\u672C \xB7 \u53EA\u8BFB"),
7034
+ templateSource ? (0, import_react6.createElement)("p", null, `\u4EE5\u300C${templateSource.name}\u300D\u4E3A\u6A21\u677F\u590D\u5236\u6B63\u6587\u3002\u65B0\u8D44\u6E90\u7684\u5B8C\u6210\u51ED\u8BC1\u3001\u89C4\u5219\u548C\u9636\u6BB5\u7ED1\u5B9A\u9700\u5355\u72EC\u914D\u7F6E\uFF0C\u4FDD\u5B58\u672C\u8EAB\u4E0D\u4F1A\u542F\u7528\u5B83\u3002`) : null,
6703
7035
  status(),
6704
- viewing ? (0, import_react5.createElement)("div", { className: "te-markdown" }, (0, import_react5.createElement)(import_dsh_client_ui_primitives4.MarkdownText, { text: body2, labels })) : (0, import_react5.createElement)("div", { className: "te-form" }, (0, import_react5.createElement)("label", null, "\u540D\u79F0", (0, import_react5.createElement)("input", { className: "te-input", value: name, disabled: editing !== "new" || busy, onChange: (e) => setName(e.target.value), placeholder: "\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26" })), kind === "skill" ? (0, import_react5.createElement)("label", null, "\u63CF\u8FF0", (0, import_react5.createElement)("input", { className: "te-input", value: description, disabled: busy, onChange: (e) => setDescription(e.target.value) })) : null, kind === "skill" ? (0, import_react5.createElement)("label", null, "\u4F7F\u7528\u65F6\u673A\uFF08\u53EF\u9009\uFF09", (0, import_react5.createElement)("input", { className: "te-input", value: whenToUse, disabled: busy, onChange: (e) => setWhenToUse(e.target.value) })) : null, (0, import_react5.createElement)("label", null, "Markdown \u6B63\u6587", (0, import_react5.createElement)("textarea", { className: "te-input te-editor", value: body2, disabled: busy, onChange: (e) => setBody(e.target.value) })))
7036
+ viewing ? (0, import_react6.createElement)("div", { className: "te-markdown" }, (0, import_react6.createElement)(import_dsh_client_ui_primitives5.MarkdownText, { text: body2, labels })) : (0, import_react6.createElement)("div", { className: "te-form" }, (0, import_react6.createElement)("label", null, "\u540D\u79F0", (0, import_react6.createElement)("input", { className: "te-input", value: name, disabled: editing !== "new" || busy, onChange: (e) => setName(e.target.value), placeholder: "\u5C0F\u5199\u5B57\u6BCD\u3001\u6570\u5B57\u548C\u8FDE\u5B57\u7B26" })), kind === "skill" ? (0, import_react6.createElement)("label", null, "\u63CF\u8FF0", (0, import_react6.createElement)("input", { className: "te-input", value: description, disabled: busy, onChange: (e) => setDescription(e.target.value) })) : null, kind === "skill" ? (0, import_react6.createElement)("label", null, "\u4F7F\u7528\u65F6\u673A\uFF08\u53EF\u9009\uFF09", (0, import_react6.createElement)("input", { className: "te-input", value: whenToUse, disabled: busy, onChange: (e) => setWhenToUse(e.target.value) })) : null, (0, import_react6.createElement)("label", null, "Markdown \u6B63\u6587", (0, import_react6.createElement)("textarea", { className: "te-input te-editor", value: body2, disabled: busy, onChange: (e) => setBody(e.target.value) })))
6705
7037
  ) : null,
6706
- deleting ? (0, import_react5.createElement)(ResourceModal, { title: `\u5220\u9664${noun}\u300C${deleting.name}\u300D\uFF1F`, description: levelOf(deleting) === "user" ? "\u8FD9\u662F\u4E2A\u4EBA\u5168\u5C40\u8D44\u6E90\uFF0C\u5220\u9664\u4F1A\u5F71\u54CD\u6B64\u4E3B\u673A\u4E0A\u7684\u6240\u6709\u9879\u76EE\u3002" : "\u5220\u9664\u5C06\u5F71\u54CD\u5F53\u524D\u9879\u76EE\u3002", onClose: close, footer: (0, import_react5.createElement)("div", { className: "te-actions" }, (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", disabled: busy, onClick: close }, "\u4FDD\u7559"), (0, import_react5.createElement)("button", { className: "te-danger-button", disabled: busy, onClick: () => {
7038
+ deleting ? (0, import_react6.createElement)(ResourceModal, { title: `\u5220\u9664${noun}\u300C${deleting.name}\u300D\uFF1F`, description: levelOf(deleting) === "user" ? "\u8FD9\u662F\u4E2A\u4EBA\u5168\u5C40\u8D44\u6E90\uFF0C\u5220\u9664\u4F1A\u5F71\u54CD\u6B64\u4E3B\u673A\u4E0A\u7684\u6240\u6709\u9879\u76EE\u3002" : "\u5220\u9664\u5C06\u5F71\u54CD\u5F53\u524D\u9879\u76EE\u3002", onClose: close, footer: (0, import_react6.createElement)("div", { className: "te-actions" }, (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "outline", disabled: busy, onClick: close }, "\u4FDD\u7559"), (0, import_react6.createElement)("button", { className: "te-danger-button", disabled: busy, onClick: () => {
6707
7039
  void remove();
6708
- } }, busy ? "\u5220\u9664\u4E2D\u2026" : "\u786E\u8BA4\u6C38\u4E45\u5220\u9664")) }, (0, import_react5.createElement)("code", { className: "te-path" }, `${roots?.[levelOf(deleting) === "user" ? "user" : "project"] ?? "\u8D44\u6E90\u76EE\u5F55"}/${deleting.name}${kind === "rule" ? ".md" : ""}`), (0, import_react5.createElement)("p", null, "\u6B64\u64CD\u4F5C\u4E0D\u4F1A\u8FDB\u5165\u56DE\u6536\u7AD9\uFF0C\u8BF7\u786E\u8BA4\u5DF2\u6709\u5907\u4EFD\u3002"), status()) : null
7040
+ } }, busy ? "\u5220\u9664\u4E2D\u2026" : "\u786E\u8BA4\u6C38\u4E45\u5220\u9664")) }, (0, import_react6.createElement)("code", { className: "te-path" }, `${roots?.[levelOf(deleting) === "user" ? "user" : "project"] ?? "\u8D44\u6E90\u76EE\u5F55"}/${deleting.name}${kind === "rule" ? ".md" : ""}`), (0, import_react6.createElement)("p", null, "\u6B64\u64CD\u4F5C\u4E0D\u4F1A\u8FDB\u5165\u56DE\u6536\u7AD9\uFF0C\u8BF7\u786E\u8BA4\u5DF2\u6709\u5907\u4EFD\u3002"), status()) : null
6709
7041
  );
6710
7042
  }
6711
7043
 
@@ -6937,11 +7269,11 @@ function resolveFlow(flow, project) {
6937
7269
  // src/client/SkillManager.tsx
6938
7270
  var import_jsx_runtime2 = require("react/jsx-runtime");
6939
7271
  function SkillManager({ workspace, remote }) {
6940
- const [config, setConfig] = (0, import_react6.useState)(null);
6941
- const [rules, setRules] = (0, import_react6.useState)([]);
6942
- const [selected, setSelected] = (0, import_react6.useState)(null);
6943
- const [message, setMessage] = (0, import_react6.useState)("");
6944
- (0, import_react6.useEffect)(() => {
7272
+ const [config, setConfig] = (0, import_react7.useState)(null);
7273
+ const [rules, setRules] = (0, import_react7.useState)([]);
7274
+ const [selected, setSelected] = (0, import_react7.useState)(null);
7275
+ const [message, setMessage] = (0, import_react7.useState)("");
7276
+ (0, import_react7.useEffect)(() => {
6945
7277
  let active = true;
6946
7278
  void Promise.all([remote.read(workspace), remote.listRules(workspace)]).then(([saved, availableRules]) => {
6947
7279
  if (!active) return;
@@ -7006,14 +7338,14 @@ function SkillManager({ workspace, remote }) {
7006
7338
  }
7007
7339
 
7008
7340
  // src/client/RuleManager.tsx
7009
- var import_react7 = require("react");
7341
+ var import_react8 = require("react");
7010
7342
  function RuleManager(props) {
7011
- return (0, import_react7.createElement)(ResourceManager, { ...props, key: props.workspace, kind: "rule" });
7343
+ return (0, import_react8.createElement)(ResourceManager, { ...props, key: props.workspace, kind: "rule" });
7012
7344
  }
7013
7345
 
7014
7346
  // src/client/TaskLedger.tsx
7015
- var import_react8 = require("react");
7016
- var import_dsh_client_ui_primitives5 = require("@deepseek-ai/dsh-client-ui-primitives");
7347
+ var import_react9 = require("react");
7348
+ var import_dsh_client_ui_primitives6 = require("@deepseek-ai/dsh-client-ui-primitives");
7017
7349
  var card3 = {
7018
7350
  display: "flex",
7019
7351
  flexDirection: "column",
@@ -7051,10 +7383,10 @@ var badge = {
7051
7383
  color: "var(--dsw-alias-label-secondary)"
7052
7384
  };
7053
7385
  function verdictDot(outcome) {
7054
- return (0, import_react8.createElement)(import_dsh_client_ui_primitives5.StateDot, { state: outcome === "pass" ? "done" : "error" });
7386
+ return (0, import_react9.createElement)(import_dsh_client_ui_primitives6.StateDot, { state: outcome === "pass" ? "done" : "error" });
7055
7387
  }
7056
7388
  function itemStatusDot(status) {
7057
- return (0, import_react8.createElement)(import_dsh_client_ui_primitives5.StateDot, { state: status === "done" ? "done" : "ongoing" });
7389
+ return (0, import_react9.createElement)(import_dsh_client_ui_primitives6.StateDot, { state: status === "done" ? "done" : "ongoing" });
7058
7390
  }
7059
7391
  function timeText(at) {
7060
7392
  return at.slice(0, 19).replace("T", " ");
@@ -7062,94 +7394,94 @@ function timeText(at) {
7062
7394
  function itemAudit(item) {
7063
7395
  const lines = [];
7064
7396
  if (item.dispatch !== void 0) {
7065
- lines.push((0, import_react8.createElement)(
7397
+ lines.push((0, import_react9.createElement)(
7066
7398
  "div",
7067
7399
  { key: "dispatch", style: metaLine },
7068
- (0, import_react8.createElement)("span", { style: badge }, "\u5DF2\u5F00\u59CB"),
7069
- (0, import_react8.createElement)("span", null, item.dispatch.description === "" ? "\uFF08\u65E0\u63CF\u8FF0\uFF09" : item.dispatch.description),
7070
- (0, import_react8.createElement)("span", { style: badge }, timeText(item.dispatch.at))
7400
+ (0, import_react9.createElement)("span", { style: badge }, "\u5DF2\u5F00\u59CB"),
7401
+ (0, import_react9.createElement)("span", null, item.dispatch.description === "" ? "\uFF08\u65E0\u63CF\u8FF0\uFF09" : item.dispatch.description),
7402
+ (0, import_react9.createElement)("span", { style: badge }, timeText(item.dispatch.at))
7071
7403
  ));
7072
7404
  }
7073
7405
  if (item.review !== void 0) {
7074
7406
  const spec = item.review.spec;
7075
7407
  const quality = item.review.quality;
7076
- lines.push((0, import_react8.createElement)(
7408
+ lines.push((0, import_react9.createElement)(
7077
7409
  "div",
7078
7410
  { key: "review", style: metaLine },
7079
7411
  verdictDot(spec.outcome),
7080
- (0, import_react8.createElement)("span", null, `\u89C4\u683C\u7B26\u5408 ${spec.outcome === "pass" ? "\u901A\u8FC7" : "\u4E0D\u901A\u8FC7"}`),
7081
- (0, import_react8.createElement)("span", null, "\xB7"),
7412
+ (0, import_react9.createElement)("span", null, `\u89C4\u683C\u7B26\u5408 ${spec.outcome === "pass" ? "\u901A\u8FC7" : "\u4E0D\u901A\u8FC7"}`),
7413
+ (0, import_react9.createElement)("span", null, "\xB7"),
7082
7414
  verdictDot(quality.outcome),
7083
- (0, import_react8.createElement)("span", null, `\u4EE3\u7801\u8D28\u91CF ${quality.outcome === "pass" ? "\u901A\u8FC7" : "\u4E0D\u901A\u8FC7"}`)
7415
+ (0, import_react9.createElement)("span", null, `\u4EE3\u7801\u8D28\u91CF ${quality.outcome === "pass" ? "\u901A\u8FC7" : "\u4E0D\u901A\u8FC7"}`)
7084
7416
  ));
7085
7417
  const failNotes = [spec, quality].flatMap((stage) => stage.outcome === "fail" ? stage.notes ?? [] : []);
7086
7418
  if (failNotes.length > 0) {
7087
- lines.push((0, import_react8.createElement)(
7419
+ lines.push((0, import_react9.createElement)(
7088
7420
  "div",
7089
7421
  { key: "notes", style: metaLine },
7090
- ...failNotes.map((note) => (0, import_react8.createElement)("span", { key: note, style: badge }, note))
7422
+ ...failNotes.map((note) => (0, import_react9.createElement)("span", { key: note, style: badge }, note))
7091
7423
  ));
7092
7424
  }
7093
7425
  }
7094
7426
  if (lines.length === 0) {
7095
7427
  const status = item.status === "done" ? "\u5DF2\u6807\u8BB0\u5B8C\u6210\uFF0C\u7F3A\u5C11\u5B9E\u65BD\u9879\u5BA1\u67E5\u8BB0\u5F55" : item.status === "doing" ? "\u5B9E\u65BD\u4E2D\uFF0C\u5F85\u5BA1\u67E5" : "\u5F85\u5F00\u59CB";
7096
- lines.push((0, import_react8.createElement)("div", { key: "none", style: metaLine }, (0, import_react8.createElement)("span", { style: badge }, status)));
7428
+ lines.push((0, import_react9.createElement)("div", { key: "none", style: metaLine }, (0, import_react9.createElement)("span", { style: badge }, status)));
7097
7429
  }
7098
- return (0, import_react8.createElement)("div", { style: { display: "flex", flexDirection: "column", gap: 4 } }, ...lines);
7430
+ return (0, import_react9.createElement)("div", { style: { display: "flex", flexDirection: "column", gap: 4 } }, ...lines);
7099
7431
  }
7100
7432
  function sonarAudit(task) {
7101
7433
  if (!task.sonar) return null;
7102
7434
  const audit = task.sonar.audit;
7103
- if (!audit) return (0, import_react8.createElement)("div", { style: metaLine }, "SonarQube \u5DF2\u542F\u7528\uFF0C\u5C1A\u672A\u8FD0\u884C\u4EE3\u7801\u5BA1\u6838\u3002");
7435
+ if (!audit) return (0, import_react9.createElement)("div", { style: metaLine }, "SonarQube \u5DF2\u542F\u7528\uFF0C\u5C1A\u672A\u8FD0\u884C\u4EE3\u7801\u5BA1\u6838\u3002");
7104
7436
  const source = { "ide-local": "\u672C\u5730\u89C4\u5219\u5BA1\u6838", local: "\u672C\u673A\u4E0A\u4F20\u626B\u63CF", ci: "CI \u626B\u63CF" }[task.sonar.source] ?? task.sonar.source;
7105
7437
  const reviewGate = audit.review_gate ?? audit.gate;
7106
7438
  const outcome = reviewGate === "OK" ? "\u901A\u8FC7" : "\u672A\u901A\u8FC7";
7107
7439
  const unresolved = audit.unresolved_count ?? audit.blocking_count;
7108
- return (0, import_react8.createElement)(
7440
+ return (0, import_react9.createElement)(
7109
7441
  "details",
7110
7442
  { style: { borderTop: "1px solid var(--dsw-alias-border-l2)", paddingTop: 8 } },
7111
- (0, import_react8.createElement)(
7443
+ (0, import_react9.createElement)(
7112
7444
  "summary",
7113
7445
  { style: { cursor: "pointer", fontSize: 13 } },
7114
7446
  `\u6700\u8FD1\u4E00\u6B21 SonarQube \u5BA1\u6838\uFF1A${outcome} \xB7 \u672A\u89E3\u51B3 ${unresolved} \u6761 \xB7 \u539F\u59CB\u547D\u4E2D ${audit.blocking_count} \u6761 \xB7 ${timeText(audit.checked_at)}`
7115
7447
  ),
7116
- (0, import_react8.createElement)(
7448
+ (0, import_react9.createElement)(
7117
7449
  "p",
7118
7450
  { style: metaLine },
7119
7451
  `\u6765\u6E90\uFF1A${source}\uFF1B\u5206\u6790\u76EE\u6807\uFF1A${audit.target}\uFF1B\u539F\u59CB\u7ED3\u679C\uFF1A${audit.gate}\u3002\u8FD9\u662F\u8BE5\u6B21\u5BA1\u6838\u8BB0\u5F55\uFF1B\u4EE3\u7801\u6216\u89C4\u5219\u53D8\u66F4\u540E\u9700\u91CD\u65B0\u6D4B\u8BD5\u5E76\u5BA1\u6838\u3002`
7120
7452
  ),
7121
- audit.report_path ? (0, import_react8.createElement)("p", { style: metaLine }, `\u5BA1\u6838\u6587\u4EF6\uFF1A${audit.report_path}`) : null,
7122
- audit.scanned_files?.length ? (0, import_react8.createElement)(
7453
+ audit.report_path ? (0, import_react9.createElement)("p", { style: metaLine }, `\u5BA1\u6838\u6587\u4EF6\uFF1A${audit.report_path}`) : null,
7454
+ audit.scanned_files?.length ? (0, import_react9.createElement)(
7123
7455
  "details",
7124
7456
  null,
7125
- (0, import_react8.createElement)("summary", { style: { cursor: "pointer", fontSize: 12 } }, `\u672C\u6B21\u5206\u6790\u6587\u4EF6\uFF08${audit.scanned_files.length}\uFF09`),
7126
- ...audit.scanned_files.map((file) => (0, import_react8.createElement)("div", { key: file, style: metaLine }, file))
7457
+ (0, import_react9.createElement)("summary", { style: { cursor: "pointer", fontSize: 12 } }, `\u672C\u6B21\u5206\u6790\u6587\u4EF6\uFF08${audit.scanned_files.length}\uFF09`),
7458
+ ...audit.scanned_files.map((file) => (0, import_react9.createElement)("div", { key: file, style: metaLine }, file))
7127
7459
  ) : null,
7128
- audit.profile_coverage?.length ? (0, import_react8.createElement)(
7460
+ audit.profile_coverage?.length ? (0, import_react9.createElement)(
7129
7461
  "details",
7130
7462
  null,
7131
- (0, import_react8.createElement)("summary", { style: { cursor: "pointer", fontSize: 12 } }, "\u9879\u76EE\u89C4\u5219\u4E0E\u672C\u5730\u5206\u6790\u5668"),
7132
- ...audit.profile_coverage.map((profile) => (0, import_react8.createElement)(
7463
+ (0, import_react9.createElement)("summary", { style: { cursor: "pointer", fontSize: 12 } }, "\u9879\u76EE\u89C4\u5219\u4E0E\u672C\u5730\u5206\u6790\u5668"),
7464
+ ...audit.profile_coverage.map((profile) => (0, import_react9.createElement)(
7133
7465
  "div",
7134
7466
  { key: profile.language, style: metaLine },
7135
7467
  `${profile.language}\uFF1A\u670D\u52A1\u7AEF\u542F\u7528 ${profile.active_rules} \u6761\u89C4\u5219\uFF1B\u672C\u5730\u5206\u6790\u5668 ${profile.analyzer}`
7136
7468
  )),
7137
- (0, import_react8.createElement)("div", { style: metaLine }, "\u6B64\u5904\u663E\u793A\u8BED\u8A00\u5206\u6790\u5668\u72B6\u6001\uFF0C\u4E0D\u80FD\u8BC1\u660E\u6BCF\u6761\u670D\u52A1\u7AEF\u89C4\u5219\u90FD\u53EF\u5728\u672C\u5730\u6267\u884C\u3002")
7469
+ (0, import_react9.createElement)("div", { style: metaLine }, "\u6B64\u5904\u663E\u793A\u8BED\u8A00\u5206\u6790\u5668\u72B6\u6001\uFF0C\u4E0D\u80FD\u8BC1\u660E\u6BCF\u6761\u670D\u52A1\u7AEF\u89C4\u5219\u90FD\u53EF\u5728\u672C\u5730\u6267\u884C\u3002")
7138
7470
  ) : null,
7139
- ...audit.uncovered_files.map((file) => (0, import_react8.createElement)(
7471
+ ...audit.uncovered_files.map((file) => (0, import_react9.createElement)(
7140
7472
  "div",
7141
7473
  { key: `uncovered-${file}`, style: metaLine },
7142
7474
  `\u672A\u8986\u76D6\uFF1A${file}`
7143
7475
  )),
7144
- ...(audit.dispositions ?? []).map((entry) => (0, import_react8.createElement)(
7476
+ ...(audit.dispositions ?? []).map((entry) => (0, import_react9.createElement)(
7145
7477
  "div",
7146
7478
  { key: `disposition-${entry.issue_key}`, style: metaLine },
7147
7479
  `\u4EBA\u5DE5\u786E\u8BA4\u8BEF\u62A5\uFF1A${entry.issue_key} \xB7 ${entry.reason} \xB7 ${entry.approved_at}`
7148
7480
  )),
7149
- audit.findings.length === 0 ? (0, import_react8.createElement)("p", { style: metaLine }, "\u6CA1\u6709\u65B0\u589E\u4EE3\u7801\u95EE\u9898\u3002") : (0, import_react8.createElement)(
7481
+ audit.findings.length === 0 ? (0, import_react9.createElement)("p", { style: metaLine }, "\u6CA1\u6709\u65B0\u589E\u4EE3\u7801\u95EE\u9898\u3002") : (0, import_react9.createElement)(
7150
7482
  "div",
7151
7483
  { style: { display: "flex", flexDirection: "column", gap: 6 } },
7152
- ...audit.findings.map((finding) => (0, import_react8.createElement)(
7484
+ ...audit.findings.map((finding) => (0, import_react9.createElement)(
7153
7485
  "div",
7154
7486
  { key: finding.key, style: {
7155
7487
  ...itemRow,
@@ -7157,26 +7489,26 @@ function sonarAudit(task) {
7157
7489
  fontSize: 12,
7158
7490
  overflowWrap: "anywhere"
7159
7491
  } },
7160
- (0, import_react8.createElement)(
7492
+ (0, import_react9.createElement)(
7161
7493
  "div",
7162
7494
  { style: headerRow },
7163
- (0, import_react8.createElement)("strong", null, finding.severity),
7164
- (0, import_react8.createElement)("code", null, finding.rule),
7165
- (0, import_react8.createElement)("span", null, `${finding.file}${finding.line === void 0 ? "" : `:${finding.line}`}`)
7495
+ (0, import_react9.createElement)("strong", null, finding.severity),
7496
+ (0, import_react9.createElement)("code", null, finding.rule),
7497
+ (0, import_react9.createElement)("span", null, `${finding.file}${finding.line === void 0 ? "" : `:${finding.line}`}`)
7166
7498
  ),
7167
- (0, import_react8.createElement)("span", null, finding.message)
7499
+ (0, import_react9.createElement)("span", null, finding.message)
7168
7500
  ))
7169
7501
  )
7170
7502
  );
7171
7503
  }
7172
7504
  function TaskLedger({ workspace, remote }) {
7173
- const [tasks, setTasks] = (0, import_react8.useState)([]);
7174
- const [error, setError] = (0, import_react8.useState)("");
7175
- const [loading, setLoading] = (0, import_react8.useState)(true);
7176
- const [query, setQuery] = (0, import_react8.useState)("");
7177
- const [risk, setRisk] = (0, import_react8.useState)("all");
7178
- const [stage, setStage] = (0, import_react8.useState)("all");
7179
- const refresh = (0, import_react8.useCallback)(() => {
7505
+ const [tasks, setTasks] = (0, import_react9.useState)([]);
7506
+ const [error, setError] = (0, import_react9.useState)("");
7507
+ const [loading, setLoading] = (0, import_react9.useState)(true);
7508
+ const [query, setQuery] = (0, import_react9.useState)("");
7509
+ const [risk, setRisk] = (0, import_react9.useState)("all");
7510
+ const [stage, setStage] = (0, import_react9.useState)("all");
7511
+ const refresh = (0, import_react9.useCallback)(() => {
7180
7512
  if (workspace === "") return;
7181
7513
  setError("");
7182
7514
  setLoading(true);
@@ -7195,59 +7527,59 @@ function TaskLedger({ workspace, remote }) {
7195
7527
  if (timer !== void 0) clearTimeout(timer);
7196
7528
  });
7197
7529
  }, [remote, workspace]);
7198
- (0, import_react8.useEffect)(() => {
7530
+ (0, import_react9.useEffect)(() => {
7199
7531
  refresh();
7200
7532
  }, [refresh]);
7201
7533
  const visible = tasks.filter((task) => `${task.task_id} ${task.title} ${task.branch}`.toLowerCase().includes(query.toLowerCase()) && (risk === "all" || task.risk_level === risk) && (stage === "all" || task.stage === stage));
7202
- return (0, import_react8.createElement)(
7534
+ return (0, import_react9.createElement)(
7203
7535
  "div",
7204
7536
  { style: styles.section },
7205
- (0, import_react8.createElement)(
7537
+ (0, import_react9.createElement)(
7206
7538
  "div",
7207
7539
  { className: "te-toolbar" },
7208
- (0, import_react8.createElement)("input", { className: "te-input", placeholder: "\u641C\u7D22\u4EFB\u52A1\u3001\u6807\u9898\u6216\u5206\u652F", value: query, onChange: (e) => setQuery(e.target.value) }),
7209
- (0, import_react8.createElement)("select", { className: "te-input", "aria-label": "\u98CE\u9669\u7B5B\u9009", value: risk, onChange: (e) => setRisk(e.target.value) }, (0, import_react8.createElement)("option", { value: "all" }, "\u5168\u90E8\u98CE\u9669"), (0, import_react8.createElement)("option", { value: "standard" }, "\u6807\u51C6"), (0, import_react8.createElement)("option", { value: "high_risk" }, "\u9AD8\u98CE\u9669")),
7210
- (0, import_react8.createElement)("select", { className: "te-input", "aria-label": "\u9636\u6BB5\u7B5B\u9009", value: stage, onChange: (e) => setStage(e.target.value) }, (0, import_react8.createElement)("option", { value: "all" }, "\u5168\u90E8\u9636\u6BB5"), ...Array.from(new Set(tasks.map((t) => t.stage))).map((value) => (0, import_react8.createElement)("option", { key: value, value }, value)))
7540
+ (0, import_react9.createElement)("input", { className: "te-input", placeholder: "\u641C\u7D22\u4EFB\u52A1\u3001\u6807\u9898\u6216\u5206\u652F", value: query, onChange: (e) => setQuery(e.target.value) }),
7541
+ (0, import_react9.createElement)("select", { className: "te-input", "aria-label": "\u98CE\u9669\u7B5B\u9009", value: risk, onChange: (e) => setRisk(e.target.value) }, (0, import_react9.createElement)("option", { value: "all" }, "\u5168\u90E8\u98CE\u9669"), (0, import_react9.createElement)("option", { value: "standard" }, "\u6807\u51C6"), (0, import_react9.createElement)("option", { value: "high_risk" }, "\u9AD8\u98CE\u9669")),
7542
+ (0, import_react9.createElement)("select", { className: "te-input", "aria-label": "\u9636\u6BB5\u7B5B\u9009", value: stage, onChange: (e) => setStage(e.target.value) }, (0, import_react9.createElement)("option", { value: "all" }, "\u5168\u90E8\u9636\u6BB5"), ...Array.from(new Set(tasks.map((t) => t.stage))).map((value) => (0, import_react9.createElement)("option", { key: value, value }, value)))
7211
7543
  ),
7212
- (0, import_react8.createElement)(
7544
+ (0, import_react9.createElement)(
7213
7545
  "div",
7214
7546
  { style: headerRow },
7215
- (0, import_react8.createElement)("span", { style: styles.bindingLabel }, "\u4EFB\u52A1\u53F0\u8D26"),
7216
- (0, import_react8.createElement)("span", { style: styles.sourceBadge }, "\u53EA\u8BFB \xB7 \u6765\u81EA .dsh/task-*.json"),
7217
- (0, import_react8.createElement)(import_dsh_client_ui_primitives5.Button, { variant: "outline", size: "sm", disabled: loading, onClick: refresh }, loading ? "\u8BFB\u53D6\u4E2D\u2026" : "\u5237\u65B0")
7547
+ (0, import_react9.createElement)("span", { style: styles.bindingLabel }, "\u4EFB\u52A1\u53F0\u8D26"),
7548
+ (0, import_react9.createElement)("span", { style: styles.sourceBadge }, "\u53EA\u8BFB \xB7 \u6765\u81EA .dsh/task-*.json"),
7549
+ (0, import_react9.createElement)(import_dsh_client_ui_primitives6.Button, { variant: "outline", size: "sm", disabled: loading, onClick: refresh }, loading ? "\u8BFB\u53D6\u4E2D\u2026" : "\u5237\u65B0")
7218
7550
  ),
7219
- loading ? (0, import_react8.createElement)("p", { role: "status" }, "\u6B63\u5728\u8BFB\u53D6\u4EFB\u52A1\u2026") : error !== "" ? (0, import_react8.createElement)("p", { style: styles.status }, error) : tasks.length === 0 ? (0, import_react8.createElement)("p", { style: styles.muted }, "\u5F53\u524D\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u4EFB\u52A1\uFF1A\u5F00\u5DE5\u540E\uFF08dev_task create\uFF09\u4F1A\u5728\u8FD9\u91CC\u5217\u51FA\u5B9E\u65BD\u4E0E\u5BA1\u67E5\u8BB0\u5F55\u3002") : visible.length === 0 ? (0, import_react8.createElement)("div", { className: "te-empty" }, "\u6CA1\u6709\u5339\u914D\u7684\u4EFB\u52A1\uFF0C\u8BF7\u8C03\u6574\u7B5B\u9009\u3002") : (0, import_react8.createElement)(
7551
+ loading ? (0, import_react9.createElement)("p", { role: "status" }, "\u6B63\u5728\u8BFB\u53D6\u4EFB\u52A1\u2026") : error !== "" ? (0, import_react9.createElement)("p", { style: styles.status }, error) : tasks.length === 0 ? (0, import_react9.createElement)("p", { style: styles.muted }, "\u5F53\u524D\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u4EFB\u52A1\uFF1A\u5F00\u5DE5\u540E\uFF08dev_task create\uFF09\u4F1A\u5728\u8FD9\u91CC\u5217\u51FA\u5B9E\u65BD\u4E0E\u5BA1\u67E5\u8BB0\u5F55\u3002") : visible.length === 0 ? (0, import_react9.createElement)("div", { className: "te-empty" }, "\u6CA1\u6709\u5339\u914D\u7684\u4EFB\u52A1\uFF0C\u8BF7\u8C03\u6574\u7B5B\u9009\u3002") : (0, import_react9.createElement)(
7220
7552
  "div",
7221
7553
  { style: { display: "flex", flexDirection: "column", gap: 12 } },
7222
- ...visible.map((task) => (0, import_react8.createElement)(
7554
+ ...visible.map((task) => (0, import_react9.createElement)(
7223
7555
  "div",
7224
7556
  { key: task.task_id, style: card3 },
7225
- (0, import_react8.createElement)(
7557
+ (0, import_react9.createElement)(
7226
7558
  "div",
7227
7559
  { style: headerRow },
7228
- (0, import_react8.createElement)("span", { style: { fontSize: 14, fontWeight: 600, color: "var(--dsw-alias-label-primary)" } }, task.task_id),
7229
- (0, import_react8.createElement)("span", { style: { fontSize: 13, color: "var(--dsw-alias-label-primary)" } }, task.title),
7230
- (0, import_react8.createElement)("span", { style: badge }, task.stage),
7231
- task.complexity ? (0, import_react8.createElement)("span", { style: badge }, `\u590D\u6742\u5EA6\uFF1A${{ low: "\u4F4E", medium: "\u4E2D", high: "\u9AD8", ultra: "\u8D85\u9AD8" }[task.complexity] ?? task.complexity}`) : null,
7232
- (0, import_react8.createElement)("span", { style: badge }, task.branch),
7233
- (0, import_react8.createElement)("span", { className: "te-badge", style: task.risk_level === "high_risk" ? { color: "var(--dsw-alias-state-error-primary)" } : {} }, task.risk_level === "high_risk" ? "\u9AD8\u98CE\u9669" : "\u6807\u51C6"),
7234
- (0, import_react8.createElement)("span", { className: "te-badge" }, task.verification_passed ? "\u9A8C\u8BC1\u901A\u8FC7" : "\u5F85\u9A8C\u8BC1"),
7235
- (0, import_react8.createElement)("span", { className: "te-badge" }, `\u5BA1\u6838\uFF1A${task.review_outcome ?? "pending"}`),
7236
- task.updated_at ? (0, import_react8.createElement)("span", { style: metaLine }, "\u66F4\u65B0\u4E8E " + timeText(task.updated_at)) : null
7560
+ (0, import_react9.createElement)("span", { style: { fontSize: 14, fontWeight: 600, color: "var(--dsw-alias-label-primary)" } }, task.task_id),
7561
+ (0, import_react9.createElement)("span", { style: { fontSize: 13, color: "var(--dsw-alias-label-primary)" } }, task.title),
7562
+ (0, import_react9.createElement)("span", { style: badge }, task.stage),
7563
+ task.complexity ? (0, import_react9.createElement)("span", { style: badge }, `\u590D\u6742\u5EA6\uFF1A${{ low: "\u4F4E", medium: "\u4E2D", high: "\u9AD8", ultra: "\u8D85\u9AD8" }[task.complexity] ?? task.complexity}`) : null,
7564
+ (0, import_react9.createElement)("span", { style: badge }, task.branch),
7565
+ (0, import_react9.createElement)("span", { className: "te-badge", style: task.risk_level === "high_risk" ? { color: "var(--dsw-alias-state-error-primary)" } : {} }, task.risk_level === "high_risk" ? "\u9AD8\u98CE\u9669" : "\u6807\u51C6"),
7566
+ (0, import_react9.createElement)("span", { className: "te-badge" }, task.verification_passed ? "\u9A8C\u8BC1\u901A\u8FC7" : "\u5F85\u9A8C\u8BC1"),
7567
+ (0, import_react9.createElement)("span", { className: "te-badge" }, `\u5BA1\u6838\uFF1A${task.review_outcome ?? "pending"}`),
7568
+ task.updated_at ? (0, import_react9.createElement)("span", { style: metaLine }, "\u66F4\u65B0\u4E8E " + timeText(task.updated_at)) : null
7237
7569
  ),
7238
7570
  sonarAudit(task),
7239
- (0, import_react8.createElement)(
7571
+ (0, import_react9.createElement)(
7240
7572
  "div",
7241
7573
  { style: { display: "flex", flexDirection: "column" } },
7242
- ...task.items.map((item) => (0, import_react8.createElement)(
7574
+ ...task.items.map((item) => (0, import_react9.createElement)(
7243
7575
  "div",
7244
7576
  { key: item.id, style: itemRow },
7245
- (0, import_react8.createElement)(
7577
+ (0, import_react9.createElement)(
7246
7578
  "div",
7247
7579
  { style: headerRow },
7248
7580
  itemStatusDot(item.status),
7249
- (0, import_react8.createElement)("span", { style: { fontSize: 13, color: "var(--dsw-alias-label-primary)" } }, item.id),
7250
- (0, import_react8.createElement)("span", { style: { fontSize: 12, color: "var(--dsw-alias-label-secondary)" } }, item.title)
7581
+ (0, import_react9.createElement)("span", { style: { fontSize: 13, color: "var(--dsw-alias-label-primary)" } }, item.id),
7582
+ (0, import_react9.createElement)("span", { style: { fontSize: 12, color: "var(--dsw-alias-label-secondary)" } }, item.title)
7251
7583
  ),
7252
7584
  itemAudit(item)
7253
7585
  ))
@@ -7321,29 +7653,29 @@ var TABS = [
7321
7653
  function Workbench({ useStore, actions, useWorkspaces, remote }) {
7322
7654
  const open = useStore((s) => s.open);
7323
7655
  const workspaces = useWorkspaces((s) => s.items);
7324
- const [tab, setTab] = (0, import_react9.useState)("adaptive");
7325
- const [workspace, setWorkspace] = (0, import_react9.useState)("");
7656
+ const [tab, setTab] = (0, import_react10.useState)("adaptive");
7657
+ const [workspace, setWorkspace] = (0, import_react10.useState)("");
7326
7658
  if (!open) return null;
7327
7659
  const current = workspaces.some((w) => w.path === workspace) ? workspace : workspaces[0]?.path ?? "";
7328
- return (0, import_react9.createElement)(
7660
+ return (0, import_react10.createElement)(
7329
7661
  "div",
7330
7662
  { style: overlay, className: "te-workbench" },
7331
- (0, import_react9.createElement)("style", null, workbenchTheme),
7332
- (0, import_react9.createElement)(
7663
+ (0, import_react10.createElement)("style", null, workbenchTheme),
7664
+ (0, import_react10.createElement)(
7333
7665
  "div",
7334
7666
  { style: header },
7335
- (0, import_react9.createElement)(
7667
+ (0, import_react10.createElement)(
7336
7668
  "div",
7337
7669
  { style: headerBrand },
7338
- (0, import_react9.createElement)(IconSettings, { size: 18 }),
7339
- (0, import_react9.createElement)(
7670
+ (0, import_react10.createElement)(IconSettings, { size: 18 }),
7671
+ (0, import_react10.createElement)(
7340
7672
  "div",
7341
7673
  { style: headerText },
7342
- (0, import_react9.createElement)("span", { style: headerTitle }, "\u5DE5\u7A0B\u4EFB\u52A1"),
7343
- (0, import_react9.createElement)("p", { style: headerSub }, "\u6309\u9700\u6C42\u590D\u6742\u5EA6\u9009\u62E9\u4EFB\u52A1\u6D41\u7A0B \xB7 \u5143\u6280\u80FD\u6302\u8F7D\u9879\u76EE Skill \u4E0E Rule")
7674
+ (0, import_react10.createElement)("span", { style: headerTitle }, "\u5DE5\u7A0B\u4EFB\u52A1"),
7675
+ (0, import_react10.createElement)("p", { style: headerSub }, "\u6309\u9700\u6C42\u590D\u6742\u5EA6\u9009\u62E9\u4EFB\u52A1\u6D41\u7A0B \xB7 \u5143\u6280\u80FD\u6302\u8F7D\u9879\u76EE Skill \u4E0E Rule")
7344
7676
  )
7345
7677
  ),
7346
- (0, import_react9.createElement)(
7678
+ (0, import_react10.createElement)(
7347
7679
  "button",
7348
7680
  {
7349
7681
  type: "button",
@@ -7359,43 +7691,43 @@ function Workbench({ useStore, actions, useWorkspaces, remote }) {
7359
7691
  event.currentTarget.style.background = "transparent";
7360
7692
  }
7361
7693
  },
7362
- (0, import_react9.createElement)(IconClose, { size: 16 })
7694
+ (0, import_react10.createElement)(IconClose, { size: 16 })
7363
7695
  )
7364
7696
  ),
7365
- (0, import_react9.createElement)(
7697
+ (0, import_react10.createElement)(
7366
7698
  "div",
7367
7699
  { style: tabbar },
7368
- ...TABS.map((t) => (0, import_react9.createElement)(import_dsh_client_ui_primitives6.Pill, { key: t.id, active: tab === t.id, onClick: () => {
7700
+ ...TABS.map((t) => (0, import_react10.createElement)(import_dsh_client_ui_primitives7.Pill, { key: t.id, active: tab === t.id, onClick: () => {
7369
7701
  setTab(t.id);
7370
7702
  } }, t.label)),
7371
- workspaces.length > 0 ? (0, import_react9.createElement)("select", {
7703
+ workspaces.length > 0 ? (0, import_react10.createElement)("select", {
7372
7704
  style: selectStyle,
7373
7705
  "aria-label": "\u5F53\u524D\u5DE5\u4F5C\u533A",
7374
7706
  value: current,
7375
7707
  onChange: (ev) => {
7376
7708
  setWorkspace(ev.target.value);
7377
7709
  }
7378
- }, ...workspaces.map((w) => (0, import_react9.createElement)("option", { key: w.path, value: w.path }, w.title || w.path))) : null
7710
+ }, ...workspaces.map((w) => (0, import_react10.createElement)("option", { key: w.path, value: w.path }, w.title || w.path))) : null
7379
7711
  ),
7380
- (0, import_react9.createElement)(
7712
+ (0, import_react10.createElement)(
7381
7713
  "div",
7382
7714
  { style: body },
7383
- (0, import_react9.createElement)(
7715
+ (0, import_react10.createElement)(
7384
7716
  "div",
7385
7717
  { className: "te-content", key: current },
7386
- (0, import_react9.createElement)("p", { style: { ...styles.hint, marginBottom: 10 }, title: current }, "\u5DE5\u4F5C\u533A \xB7 " + current),
7387
- current === "" ? (0, import_react9.createElement)("p", { style: styles.muted }, "\u5F53\u524D\u6CA1\u6709\u5DE5\u4F5C\u533A\uFF1A\u8BF7\u5148\u5728\u4FA7\u680F\u521B\u5EFA\u4E00\u4E2A\u5DE5\u4F5C\u533A\u3002") : tab === "init" ? (0, import_react9.createElement)(InitPanel, { workspace: current, remote }) : tab === "adaptive" ? (0, import_react9.createElement)(AdaptivePanel, { workspace: current, remote, onOpenInit: () => setTab("init") }) : tab === "tasks" ? (0, import_react9.createElement)(TaskLedger, { workspace: current, remote }) : tab === "skills" ? (0, import_react9.createElement)(SkillManager, { workspace: current, remote }) : (0, import_react9.createElement)(RuleManager, { workspace: current, remote })
7718
+ (0, import_react10.createElement)("p", { style: { ...styles.hint, marginBottom: 10 }, title: current }, "\u5DE5\u4F5C\u533A \xB7 " + current),
7719
+ current === "" ? (0, import_react10.createElement)("p", { style: styles.muted }, "\u5F53\u524D\u6CA1\u6709\u5DE5\u4F5C\u533A\uFF1A\u8BF7\u5148\u5728\u4FA7\u680F\u521B\u5EFA\u4E00\u4E2A\u5DE5\u4F5C\u533A\u3002") : tab === "init" ? (0, import_react10.createElement)(InitPanel, { workspace: current, remote }) : tab === "adaptive" ? (0, import_react10.createElement)(AdaptivePanel, { workspace: current, remote, onOpenInit: () => setTab("init") }) : tab === "tasks" ? (0, import_react10.createElement)(TaskLedger, { workspace: current, remote }) : tab === "skills" ? (0, import_react10.createElement)(SkillManager, { workspace: current, remote }) : (0, import_react10.createElement)(RuleManager, { workspace: current, remote })
7388
7720
  )
7389
7721
  )
7390
7722
  );
7391
7723
  }
7392
7724
 
7393
7725
  // src/client/TriggerButton.tsx
7394
- var import_react10 = require("react");
7726
+ var import_react11 = require("react");
7395
7727
  var hover = "var(--dsw-alias-bg-layer-2)";
7396
7728
  var label2 = "var(--dsw-alias-label-primary)";
7397
7729
  function TriggerButton({ wide, actions }) {
7398
- return (0, import_react10.createElement)(
7730
+ return (0, import_react11.createElement)(
7399
7731
  "button",
7400
7732
  {
7401
7733
  type: "button",
@@ -7435,8 +7767,8 @@ function TriggerButton({ wide, actions }) {
7435
7767
  transition: "background 120ms ease"
7436
7768
  }
7437
7769
  },
7438
- (0, import_react10.createElement)(IconSettings, { size: wide ? 16 : 18 }),
7439
- wide ? (0, import_react10.createElement)("span", { style: { fontSize: 14, lineHeight: "22px" } }, "\u5DE5\u7A0B\u6D41\u7A0B") : null
7770
+ (0, import_react11.createElement)(IconSettings, { size: wide ? 16 : 18 }),
7771
+ wide ? (0, import_react11.createElement)("span", { style: { fontSize: 14, lineHeight: "22px" } }, "\u5DE5\u7A0B\u6D41\u7A0B") : null
7440
7772
  );
7441
7773
  }
7442
7774